summaryrefslogtreecommitdiff
path: root/usr/src/man/man3c/fmemopen.3c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/man/man3c/fmemopen.3c')
-rw-r--r--usr/src/man/man3c/fmemopen.3c222
1 files changed, 222 insertions, 0 deletions
diff --git a/usr/src/man/man3c/fmemopen.3c b/usr/src/man/man3c/fmemopen.3c
new file mode 100644
index 0000000000..20145e5617
--- /dev/null
+++ b/usr/src/man/man3c/fmemopen.3c
@@ -0,0 +1,222 @@
+.\"
+.\" This file and its contents are supplied under the terms of the
+.\" Common Development and Distribution License ("CDDL"), version 1.0.
+.\" You may only use this file in accordance with the terms of version
+.\" 1.0 of the CDDL.
+.\"
+.\" A full copy of the text of the CDDL should have accompanied this
+.\" source. A copy of the CDDL is also available via the Internet at
+.\" http://www.illumos.org/license/CDDL.
+.\"
+.\"
+.\" Copyright 2020 Robert Mustacchi
+.\"
+.Dd March 25, 2020
+.Dt FMEMOPEN 3C
+.Os
+.Sh NAME
+.Nm fmemopen
+.Nd open a memory stream
+.Sh SYNOPSIS
+.In stdio.h
+.Ft "FILE *"
+.Fo fmemopen
+.Fa "void *restrict buf"
+.Fa "size_t size"
+.Fa "const char *restrict mode"
+.Fc
+.Sh DESCRIPTION
+The
+.Fn fmemopen
+function provides a means of associating a file stream with a
+corresponding memory buffer of a fixed size.
+The resulting stream can then be used just like any other stream, and
+when done should be released by calling the
+.Xr fclose 3C
+function.
+.Pp
+The stream can either dynamically allocate memory or it can use an
+existing memory buffer.
+If
+.Fa buf
+is
+.Dv NULL ,
+then a buffer
+.Fa size
+bytes long will be allocated for the stream and initialized to zero.
+This buffer will be allocated as though a call to
+.Xr malloc 3C
+and will be freed when
+.Xr fclose 3C
+is called.
+When using this mode, the stream must be created for update
+.Po
+indicated by a
+.Sq +
+character in the
+.Fa mode
+argument
+.Pc .
+Otherwise, it is assumed that
+.Fa buf
+is at least
+.Fa size
+bytes long.
+.Pp
+The
+.Fa mode
+argument determines whether the stream is opened for read, write, or
+append.
+The
+.Fa mode
+argument accepts all the same values as
+.Xr fopen 3C .
+.Pp
+The resulting stream behaves in a similar way to a stream backed by a
+file.
+The stream can be read and written to.
+The stream is seekeable and can either be byte or wide-character
+oriented.
+A NUL byte has no special meaning when reading.
+.Pp
+The stream logically tracks three different values:
+.Bl -enum -offset indent
+.It
+The current position in the stream.
+.It
+The current size of the stream.
+.It
+The maximum size of the stream.
+.El
+.Pp
+The current position is where reads or writes take place.
+When the stream is opened for read or write
+.Pq r, r+, w, w+
+then the initial position is set to zero.
+If the stream is opened for update
+.Pq a, a+
+then the initial position is set to the first NUL byte in the buffer.
+.Pp
+The current size of the stream represents the length of the stream.
+Like a file, this starts at a specific size and then can grow over time.
+Unlike a file, where the maximum size is determined by the file system,
+the maximum size here is determined at the creation of the stream.
+.Pp
+This size is used when using
+.Dv SEEK_END
+as an argument to functions like
+.Xr fseek 3C .
+Reads cannot advance beyond the current size of the stream and
+attempting to read beyond it is considered hitting the end-of-file.
+Writes beyond the end of the current size will cause the current size to
+increase, though it cannot increase beyond the maximum size.
+.Pp
+The initial size of the stream varies.
+It is set depending on the mode and works as follows:
+.Bl -tag -width Sy -offset indent
+.It Sy r, r+
+The size is set to the
+.Fa size
+argument.
+.It Sy w, w+
+The initial size is set to zero.
+.It Sy a, a+
+The initial size is set according to the following rules:
+.Bl -enum
+.It
+If
+.Fa buf
+is a
+.Dv NULL
+pointer, the current size is set to zero.
+.It
+If a NUL byte is found in the first
+.Fa size
+bytes of
+.Fa buf ,
+then the current size is set to the first NUL byte.
+.It
+The position is set to the
+.Fa size
+argument
+.Pq the maximum size
+if no NUL byte was found in
+.Fa buf .
+.El
+.El
+.Pp
+The maximum size of the stream is determined by the
+.Fa size
+argument.
+Writes beyond this size are dropped.
+Attempts to seek beyond the maximum size will result in an error.
+.Pp
+If the stream was open for writing or update, when the stream is flushed
+or closed, a NUL byte will be written to terminate the stream based on
+the current position and size of the stream.
+If the stream was open for update, if the stream is flushed or closed
+and the last write changed the current buffer size, a NUL byte will be
+written if there is still space for it within the buffer.
+.Pp
+By default, all streams are buffered.
+This means that writes beyond the size of the memory buffer could fail,
+but not be seen until the stream is flushed or closed.
+To detect errors right away, one can explicitly disable buffering with
+the
+.Xr setvbuf 3C
+function or perform explicit buffer flushes with the
+.Xr fflush 3C
+function.
+.Sh RETURN VALUES
+Upon successful completion, the
+.Fn fmemopen
+function returns a pointer to a stream.
+Otherwise,
+.Dv NULL
+is returned and
+.Dv errno
+is set to indicate the error.
+.Sh ERRORS
+The
+.Fn fmemopen
+function will fail if:
+.Bl -tag -width Er
+.It Er EINVAL
+The value of
+.Fa mode
+is invalid.
+.Pp
+The
+.Fa size
+argument was zero.
+.Pp
+The
+.Fa buf
+argument is
+.Dv NULL
+and the
+.Fa mode
+argument does not contain a
+.Sq +
+character.
+.It Er EMFILE
+.Brq FOPEN_MAX
+streams are currently open in the calling process.
+.Pp
+.Brq STREAM_MAX
+streams are currently open in the calling process.
+.It Er ENOMEM
+The system was unable to allocate memory for the stream or its backing
+buffer.
+.El
+.Sh MT-LEVEL
+.Sy MT-Safe
+.Sh INTERFACE STABILITY
+.Sy Committed
+.Sh SEE ALSO
+.Xr fclose 3C ,
+.Xr fflush 3C ,
+.Xr fopen 3C ,
+.Xr fseek 3C ,
+.Xr malloc 3C ,
+.Xr open_memstream 3C