Previous: Utility Minimums, Up: System Configuration
POSIX.2 defines a way to get string-valued parameters from the operating
system with the function confstr:
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
confstris the length of the string value that you asked for. If you supply a null pointer for buf, thenconfstrdoes not try to store the string; it just returns its length. A value of0indicates an error.If the string you asked for is too long for the buffer (that is, longer than len
- 1), thenconfstrstores just that much (leaving room for the terminating null character). You can tell that this has happened becauseconfstrreturns a value greater than or equal to len.The following
errnoerror 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_CS_LFS_CFLAGS_LARGEFILE_SOURCE feature select macro; see Feature Test Macros.
_CS_LFS_LDFLAGS_LARGEFILE_SOURCE feature select macro; see Feature Test Macros.
_CS_LFS_LIBS_LARGEFILE_SOURCE feature select macro; see Feature Test Macros.
_CS_LFS_LINTFLAGS_LARGEFILE_SOURCE feature select macro; see Feature Test Macros.
_CS_LFS64_CFLAGS_LARGEFILE64_SOURCE feature select macro; see Feature Test Macros.
_CS_LFS64_LDFLAGS_LARGEFILE64_SOURCE feature select macro; see Feature Test Macros.
_CS_LFS64_LIBS_LARGEFILE64_SOURCE feature select macro; see Feature Test Macros.
_CS_LFS64_LINTFLAGS_LARGEFILE64_SOURCE feature select macro; see 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;
}