String-Valued Parameters
========================
POSIX.2 defines a way to get string-valued parameters from the
operating system with the function `confstr':
- Function: size_t confstr (int PARAMETER, char *BUF, size_t LEN)
This function reads the value of a string-valued system parameter,
storing the string into LEN bytes of memory space starting at BUF.
The PARAMETER argument should be one of the `_CS_' symbols listed
below.
The normal return value from `confstr' is the length of the string
value that you asked for. If you supply a null pointer for BUF,
then `confstr' does not try to store the string; it just returns
its length. A value of `0' indicates an error.
If the string you asked for is too long for the buffer (that is,
longer than `LEN - 1'), then `confstr' stores just that much
(leaving room for the terminating null character). You can tell
that this has happened because `confstr' returns a value greater
than or equal to LEN.
The following `errno' error conditions are defined for this
function:
`EINVAL'
The value of the PARAMETER is invalid.
Currently there is just one parameter you can read with `confstr':
`_CS_PATH'
This parameter's value is the recommended default path for
searching for executable files. This is the path that a user has
by default just after logging in.
`_CS_LFS_CFLAGS'
The returned string specifies which additional flags must be given
to the C compiler if a source is compiled using the
`_LARGEFILE_SOURCE' feature select macro; Note:Feature Test
Macros.
`_CS_LFS_LDFLAGS'
The returned string specifies which additional flags must be given
to the linker if a source is compiled using the
`_LARGEFILE_SOURCE' feature select macro; Note:Feature Test
Macros.
`_CS_LFS_LIBS'
The returned string specifies which additional libraries must be
linked to the application if a source is compiled using the
`_LARGEFILE_SOURCE' feature select macro; Note:Feature Test
Macros.
`_CS_LFS_LINTFLAGS'
The returned string specifies which additional flags must be given
to the lint tool if a source is compiled using the
`_LARGEFILE_SOURCE' feature select macro; Note:Feature Test
Macros.
`_CS_LFS64_CFLAGS'
The returned string specifies which additional flags must be given
to the C compiler if a source is compiled using the
`_LARGEFILE64_SOURCE' feature select macro; Note:Feature Test
Macros.
`_CS_LFS64_LDFLAGS'
The returned string specifies which additional flags must be given
to the linker if a source is compiled using the
`_LARGEFILE64_SOURCE' feature select macro; Note:Feature Test
Macros.
`_CS_LFS64_LIBS'
The returned string specifies which additional libraries must be
linked to the application if a source is compiled using the
`_LARGEFILE64_SOURCE' feature select macro; Note:Feature Test
Macros.
`_CS_LFS64_LINTFLAGS'
The returned string specifies which additional flags must be given
to the lint tool if a source is compiled using the
`_LARGEFILE64_SOURCE' feature select macro; Note:Feature Test
Macros.
The way to use `confstr' without any arbitrary limit on string size
is to call it twice: first call it to get the length, allocate the
buffer accordingly, and then call `confstr' again to fill the buffer,
like this:
char *
get_default_path (void)
{
size_t len = confstr (_CS_PATH, NULL, 0);
char *buffer = (char *) xmalloc (len);
if (confstr (_CS_PATH, buf, len + 1) == 0)
{
free (buffer);
return NULL;
}
return buffer;
}