diff options
Diffstat (limited to 'doc/new_chapters/confspace.t')
-rw-r--r-- | doc/new_chapters/confspace.t | 1351 |
1 files changed, 1351 insertions, 0 deletions
diff --git a/doc/new_chapters/confspace.t b/doc/new_chapters/confspace.t new file mode 100644 index 0000000000..fd5660a018 --- /dev/null +++ b/doc/new_chapters/confspace.t @@ -0,0 +1,1351 @@ +@c +@c COPYRIGHT (c) 1988-2002. +@c On-Line Applications Research Corporation (OAR). +@c All rights reserved. +@c +@c $Id$ +@c + +@chapter Configuration Space Manager + +@section Introduction + +The configuration space manager provides a portable +interface for manipulating configuration data. +The capabilities in this manager were defined in the POSIX +1003.1h/D3 proposed standard titled @b{Services for Reliable, +Available, and Serviceable Systems}. + +The directives provided by the configuration space manager are: + +@itemize @bullet +@item @code{cfg_mount} - Mount a Configuration Space +@item @code{cfg_unmount} - Unmount a Configuration Space +@item @code{cfg_mknod} - Create a Configuration Node +@item @code{cfg_get} - Get Configuration Node Value +@item @code{cfg_set} - Set Configuration Node Value +@item @code{cfg_link} - Create a Configuration Link +@item @code{cfg_unlink} - Remove a Configuration Link +@item @code{cfg_open} - Open a Configuration Space +@item @code{cfg_read} - Read a Configuration Space +@item @code{cfg_children} - Get Node Entries +@item @code{cfg_mark} - Set Configuration Space Option +@item @code{cfg_readdir} - Reads a directory +@item @code{cfg_umask} - Sets a file creation mask +@item @code{cfg_chmod} - Changes file mode +@item @code{cfg_chown} - Changes the owner and/or group of a file +@end itemize + +@section Background + +@subsection Configuration Nodes + +@subsection Configuration Space + +@subsection Format of a Configuration Space File + +@section Operations + +@subsection Mount and Unmounting + +@subsection Creating a Configuration Node + +@subsection Removing a Configuration Node + +@subsection Manipulating a Configuration Node + +@subsection Traversing a Configuration Space + +@section Directives + +This section details the configuration space manager's directives. +A subsection is dedicated to each of this manager's directives +and describes the calling sequence, related constants, usage, +and status codes. + +@page +@subsection cfg_mount - Mount a Configuration Space + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <cfg.h> + +int cfg_mount( + const char *file, + const char *cfgpath, + log_facility_t notification, +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_mount()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item EPERM +The caller does not have the appropriate privilege. + +@item EACCES +Search permission is denied for a component of the path prefix. + +@item EEXIST +The file specified by the @code{file} argument does not exist + +@item ENAMETOOLONG +A component of a pathname exceeded @code{NAME_MAX} characters, +or an entire path name exceed @code{PATH_MAX} characters while +@code{_POSIX_NO_TRUNC} is in effect. + +@item ENOENT +A component of @code{cfgpath} does not exist. + +@item ENOTDIR +A component of the @code{file} path prefix is not a directory. + +@item EBUSY +The configuration space defined by @code{file} is already mounted. + +@item EINVAL +The notification argument specifies an invalid log facility. + +@end table + +@subheading DESCRIPTION: + +The @code{cfg_mount()} function maps a configuration space defined +by the file identified by the the @code{file} argument. The +distinguished node of the mapped configuration space is +mounted in the active space at the point identified by the +@code{cfgpath} configuration pathname. + +The @code{notification} argument specifies how changes to the +mapped configuration space are communicated to the application. +If the @code{notification} argument is NULL, no notification will be +be performed for the mapped configuration space. If the Event +Logging option is defined, the notification argument defines the +facility to which changes in the mapped configuration space are +logged. Otherwise, the @code{notification} argument specifies +an implementation defined method of notifying the application +of changes to the mapped configuration space. + +@subheading NOTES: + +The @code{_POSIX_CFG} feature flag is defined to indicate +this service is available. + +@page +@subsection cfg_unmount - Unmount a Configuration Space + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <cfg.h> + +int cfg_unmount( + const char *cfgpath +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_umount()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item EPERM +The caller does not have the appropriate privileges. + +@item EACCES +Search permission is denied for a component of the path prefix. + +@item ENOENT +A component of @code{cfgpath} does not exist. + +@item ENAMETOOLONG +A component of a pathname exceeded @code{NAME_MAX} characters, +or an entire path name exceed @code{PATH_MAX} characters while +@code{_POSIX_NO_TRUNC} is in effect. + +@item EINVAL +The requested node is not the distinguished node of a mounted +configuration space. + +@item EBUSY +One or more processes has an open configuration traversal +stream for the configuration space whose distinguished node is +referenced by the cfgpath argument. + +@item ELOOP +A node appears more than once in the path specified by the +@code{cfgpath} argument + +@item ELOOP +More than @code{SYMLOOP_MAX} symbolic links were encountered during +resolution of the cfgpath argument + +@end table + +@subheading DESCRIPTION: + +The @code{cfg_umount()} function unmaps the configuration space whose +distinguished node is mapped in the active space at the location defined +by @code{cfgpath} configuration pathname. All system resources +allocated for this configuration space should be deallocated. + +@subheading NOTES: + +The @code{_POSIX_CFG} feature flag is defined to indicate +this service is available. + +@page +@subsection cfg_mknod - Create a Configuration Node + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <cfg.h> + +int cfg_mknod( + const char *cfgpath, + mode_t mode, + cfg_type_t type +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_mknod()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item ENAMETOOLONG +A component of a pathname exceeded @code{NAME_MAX} characters, +or an entire path name exceed @code{PATH_MAX} characters while +@code{_POSIX_NO_TRUNC} is in effect. + +@item ENOENT +A component of the path prefix does not exist. + +@item EACCES +Search permission is denied for a component of the path prefix. + + +@item EPERM +The calling process does not have the appropriate privilege. + +@item EEXIST +The named node exists. + +@item EINVAL +The value of @code{mode} is invalid. + +@item EINVAL +The value of @code{type} is invalid. + +@item ELOOP +A node appears more than once in the path specified by the +@code{cfg_path} argument + +@item ELOOP +More than @code{SYMLOOP_MAX} symbolic links were encountered during +resolution of the @code{cfgpath} argument. + +@item EROFS +The named @code{node} resides on a read-only configuration space. + +@end table + +@subheading DESCRIPTION: + +The @code{cfg_mknod()} function creates a new node in the configuration +space which contains the pathname prefix of @code{cfgpath}. The node +name is defined by the pathname suffix of @code{cfgpath}. The node +permissions are specified by the value of @code{mode}. The node type +is specified by the value of @code{type}. + +@subheading NOTES: + +The @code{_POSIX_CFG} feature flag is defined to indicate +this service is available. + +@page +@subsection cfg_get - Get Configuration Node Value + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <cfg.h> + +int cfg_get( + const char *cfgpath + cfg_value_t *value +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_get()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item ENAMETOOLONG +A component of a pathname exceeded @code{NAME_MAX} characters, +or an entire path name exceed @code{PATH_MAX} characters while +@code{_POSIX_NO_TRUNC} is in effect. + +@item ENOENT +A component of @code{cfgpath} does not exist. + +@item EACCES +Search permission is denied for a component of the path prefix. + +@item EPERM +The calling process does not have the appropriate privileges. + +@item ELOOP +A node appears more than once in the path specified by the +@code{cfgpath} argument + +@item ELOOP +More than @code{SYMLOOP_MAX} symbolic links were encountered during +resolution of the @code{cfgpath} argument. + +@end table + +@subheading DESCRIPTION: + +The @code{cfg_get()} function stores the value attribute of the +configuration node identified by @code{cfgpath}, into the buffer +described by the @code{value} pointer. + +@subheading NOTES: + +The @code{_POSIX_CFG} feature flag is defined to indicate +this service is available. + +@page +@subsection cfg_set - Set Configuration Node Value + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <cfg.h> + +int cfg_set( + const char *cfgpath + cfg_value_t *value +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_set()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item ENAMETOOLONG +A component of a pathname exceeded @code{NAME_MAX} characters, +or an entire path name exceed @code{PATH_MAX} characters while +@code{_POSIX_NO_TRUNC} is in effect. + +@item ENOENT +A component of @code{cfgpath} does not exist + +@item EACCES +Search permission is denied for a component of the path prefix. + +@item EPERM +The calling process does not have the appropriate privilege. + +@item ELOOP +A node appears more than once in the path specified by the +@code{cfgpath} argument. + +@item ELOOP +More than @code{SYMLOOP_MAX} symbolic links were encountered during +resolution of the cfgpath argument. + +@end table + +@subheading DESCRIPTION: + +The @code{cfg_set()} function stores the value specified by the +@code{value} argument in the configuration node defined by the +@code{cfgpath} argument. + +@subheading NOTES: + +The @code{_POSIX_CFG} feature flag is defined to indicate +this service is available. + +@page +@subsection cfg_link - Create a Configuration Link + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <cfg.h> + +int cfg_link( + const char *src + const char *dest +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_link()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item ENAMETOOLONG +A component of a pathname exceeded @code{NAME_MAX} characters, +or an entire path name exceed @code{PATH_MAX} characters while +@code{_POSIX_NO_TRUNC} is in effect. + +@item ENOENT +A component of either path prefix does not exist. + +@item EACCES +A component of either path prefix denies search permission. + +@item EACCES +The requested link requires writing in a node with a mode that +denies write permission. + +@item ENOENT +The node named by @code{src} does not exist. + +@item EEXIST +The node named by @code{dest} does exist. + +@item EPERM +The calling process does not have the appropriate privilege to +modify the node indicated by the @code{src} argument. + +@item EXDEV +The link named by @code{dest} and the node named by @code{src} are from different +configuration spaces. + +@item ENOSPC +The node in which the entry for the new link is being placed +cannot be extended because there is no space left on the +configuration space containing the node. + +@item EIO +An I/O error occurred while reading from or writing to the +configuration space to make the link entry. + +@item EROFS +The requested link requires writing in a node on a read-only +configuration space. + +@end table + +@subheading DESCRIPTION: + +The @code{src} and @code{dest} arguments point to pathnames which +name existing nodes. The @code{cfg_link()} function atomically creates +a link between specified nodes, and increment by one the link count +of the node specified by the @code{src} argument. + +If the @code{cfg_link()} function fails, no link is created, and the +link count of the node remains unchanged by this function call. + + +@subheading NOTES: + +The @code{_POSIX_CFG} feature flag is defined to indicate +this service is available. + +@page +@subsection cfg_unlink - Remove a Configuration Link + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <cfg.h> + +int cfg_unlink( + const char *cfgpath +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_unlink()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item ENAMETOOLONG +A component of a pathname exceeded @code{NAME_MAX} characters, +or an entire path name exceed @code{PATH_MAX} characters. + +@item EACCES +Search permission is denied on the node containing the link to +be removed. + +@item EACCES +Write permission is denied on the node containing the link to +be removed. + +@item ENOENT +A component of @code{cfgpath} does not exist. + +@item EPERM +The calling process does not have the appropriate privilege to +modify the node indicated by the path prefix of the @code{cfgpath} +argument. + +@item EBUSY +The node to be unlinked is the distinguished node of a mounted +configuration space. + +@item EIO +An I/O error occurred while deleting the link entry or deallocating +the node. + +@item EROFS +The named node resides in a read-only configuration space. + +@item ELOOP +A node appears more than once in the path specified by the +@code{cfgpath} argument. + +@item ELOOP +More than @code{SYMLOOP_MAX} symbolic links were encountered during +resolution of the cfgpath argument. + +@end table + +@subheading DESCRIPTION: + +The @code{cfg_unlink()} function removes the link between the node +specified by the @code{cfgpath} path prefix and the parent node +specified by @code{cfgpath}, and decrements the link count +of the @code{cfgpath} node. + +When the link count of the node becomes zero, the space occupied +by the node is freed and the node is no longer be accessible. + +@subheading NOTES: + +The @code{_POSIX_CFG} feature flag is defined to indicate +this service is available. + +@page +@subsection cfg_open - Open a Configuration Space + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <cfg.h> + +int cfg_open( + const char *pathnames[], + int options, + int (*compar)(const CFGENT **f1, const CFGENT **f2), + CFG **cfgstream +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_open()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item EACCES +Search permission is denied for any component of a pathname. + +@item ELOOP +A loop exists in symbolic links encountered during resolution +of a pathname. + +@item ENAMETOOLONG +The length of a pathname exceeds @code{PATH_MAX}, or a pathname +component is longer than @code{NAME_MAX} while @code{_POSIX_NO_TRUNC} + +@item ENOENT +The pathname argument is an empty string or the named node +does not exist. + +@item EINVAL +Either both or neither of @code{CFG_LOGICAL} and @code{CFG_PHYSICAL} are +specified by the @code{options} argument + +@item ENOMEM +Not enough memory is available to create the necessary structures. + +@item ELOOP +More than @code{SYMLOOP_MAX} symbolic links were encountered during +resolution of the @code{pathnames} argument. + +@item ENAMETOOLONG +As a result of encountering a symbolic link in resolution of the +pathname specified by the @code{pathnames} argument, the length of +the substituted pathname string exceeded @code{PATH_MAX}. + +@end table + +@subheading DESCRIPTION: + +The @code{cfg_open()} function opens a configuration traversal stream +rooted in the configuration nodes name by the @code{pathnames} argument. +It stores a pointer to a CFG object that represents that stream at +the location identified the @code{cfgstream} pointer. The @code{pathnames} +argument is an array of character pointers to NULL-terminated strings. +The last member of this array is a NULL pointer. + +The value of @code{options} is the bitwise inclusive OR of values from the +following lists. Applications supply exactly one of the first two values +below in @code{options}. + +@table @b + +@item CFG_LOGICAL +When symbolic links referencing existing nodes are +encountered during the traversal, the @code{cfg_info} +field of the returned CFGENT structure describes the +target node pointed to by the link instead of the +link itself, unless the target node does not exist. +If the target node has children, the pre-order return, +followed by the return of structures referencing all of +its descendants, followed by a post-order return, is done. + +@item CFG_PHYSICAL +When symbolic links are encountered during the traversal, +the @code{cfg_info} field is used to describe the symbolic +link. + +@end table + + +Any combination of the remaining flags can be specified in the value of +@code{options} + +@table @b + +@item CFG_COMFOLLOW +When symbolic links referencing existing nodes are +specified in the @code{pathnames} argument, the +@code{cfg_info} field of the returned CFGENT structure +describes the target node pointed to by the link +instead of the link itself, unless the target node does +not exist. If the target node has children, the +pre-order return, followed by the return of structures +referencing all its descendants, followed by a post-order +return, is done. + +@item CFG_XDEV +The configuration space functions do not return a +CFGENT structure for any node in a different configuration +space than the configuration space of the nodes identified +by the CFGENT structures for the @code{pathnames} argument. + +@end table + +The @code{cfg_open()} argument @code{compar} is either a NULL or point +to a function that is called with two pointers to pointers to CFGENT +structures that returns less than, equal to , or greater than zero if +the node referenced by the first argument is considered to be respectively +less than, equal to, or greater than the node referenced by the second. +The CFGENT structure fields provided to the comparison routine is as +described with the exception that the contents of the @code{cfg_path} and +@code{cfg_pathlen} fields are unspecified. + +This comparison routine is used to determine the order in which nodes in +directories encountered during the traversal are returned, and the order +of traversal when more than one node is specified in the @code{pathnames} +argument to @code{cfg_open()}. If a comparison routine is specified, the +order of traversal is from the least to the greatest. If the @code{compar} +argument is NULL, the order of traversal shall is listed in the +@code{pathnames} argument. + +@subheading NOTES: + +The @code{_POSIX_CFG} feature flag is defined to indicate +this service is available. + +@page +@subsection cfg_read - Read a Configuration Space + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <cfg.h> + +int cfg_read( + CFG *cfgp, + CFGENT **node +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_read()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item EACCES +Search permission is denied for any component of a pathname. + +@item EBADF +The @code{cfgp} argument does not refer to an open configuration +space. + +@item ELOOP +A loop exists in symbolic links encountered during resolution +of a pathname. + +@item ENOENT +A named @code{node} does not exist. + +@item ENOMEM +Not enough memory is available to create the necessary structures. + +@item ELOOP +More than @code{SYMLOOP_MAX} symbolic links were encountered during +resolution of the cfgpath argument. + +@item ENAMETOOLONG +As a result of encountering a symbolic link in resolution of the +pathname specified by the pathnames argument, the length of the +substituted pathname string exceeded @code{PATH_MATH}. + +@end table + +@subheading DESCRIPTION: + +The @code{cfg_read()} function returns a pointer to a CFGENT structure +representing a node in the configuration space to which @code{cfgp} +refers. The returned pointer is stored at the location indicated +by the @code{node} argument. + +The child nodes of each node in the configuration tree is returned +by @code{cfg_read()}. If a comparison routine was specified to the +@code{cfg_open()} function, the order of return of the child nodes is +as specified by the @code{compar} routine, from least to greatest. +Otherwise, the order of return is unspecified. + +Structures referencing nodes with children is returned by the +function @code{cfg_read()} at least twice [unless the application +specifies otherwise with @code{cfg_mark()}]-once immediately before +the structures representing their descendants, are returned +(pre-order), and once immediately after structures representing all +of their descendants, if any, are returned (post-order). The +CFGENT structure returned in post-order (with the exception of the +@code{cfg_info} field) is identical to that returned in pre-order. +Structures referencing nodes of other types is returned at least +once. + +The fields of the CFGENT structure contains the following +information: + +@table @b + +@item cfg_parent +A pointer to the structure returned by the +@code{cfg_read()} function for the node that contains +the entry for the current node. A @code{cfg_parent} +structure is provided for the node(s) specified by +the @code{pathnames} argument to the @code{cfg_open()} +function, but the contents of other than its +@code{cfg_number}, @code{cfg_pointer}, @code{cfg_parent}, +and @code{cfg_parent}, and @code{cfg_level} fields are +unspecified. Its @code{cfg_link} field is unspecified. + +@item cfg_link +Upon return from the @code{cfg_children()} function, the +@code{cfg_link} field points to the next CFGENT structure +in a NULL-terminated linked list of CFGENT structures. +Otherwise, the content of the @code{cfg_link} field is +unspecified. + +@item cfg_cycle +If the structure being returned by @code{cfg_read()} +represents a node that appears in the @code{cfg_parent} +linked list tree, the @code{cfg_cycle} field shall point +to the structure representing that entry from the +@code{cfg_parent} linked list. Otherwise the content of +the @code{cfg_cycle} field is unspecified. + +@item cfg_number +The @code{cfg_number} field is provided for use by the +application program. It is initialized to zero for +each new node returned by the @code{cfg_read()} function, +but is not further modified by the configuration space +routines. + +@item cfg_pointer +The @code{cfg_pointer} field is provided for use by the +application program. It is initialized to NULL for +each new node returned by the @code{cfg_read()} function, +but is not further modified by the configuration +space routines. + +@item cfg_path +A pathname for the node including and relative to the +argument supplied to the @code{cfg_open()} routine for this +configuration space. This pathname may be longer than +@code{PATH_MAX} bytes. This pathname is NULL-terminated. + +@item cfg_name +The nodename of the node. + +@item cfg_pathlen +The length of the string pointed at by the @code{cfg_path} +field when returned by @code{cfg_read()}. + +@item cfg_namelen +The length of the string pointed at by the @code{cfg_name} +field. + +@item cfg_level +The depth of the current entry in the configuration space. +The @code{cfg_level} field of the @code{cfg_parent} +structure for each of the node(s) specified in the +@code{pathnames} argument to the @code{cfg_open()} function +is set to 0, and this number is incremented for each +node level descendant. + +@item cfg_info +This field contains one of the values listed below. If +an object can have more than one info value, the first +appropriate value listed below is returned. + +@table @b + +@item CFG_D +The structure represents a node with children in +pre-order. + +@item CFG_DC +The structure represents a node that is a parent +of the node most recently returned by @code{cfg_read()}. +The @code{cfg_cycle} field references the structure +previously returned by @code{cfg_read} that is the +same as the returned structure. + +@item CFG_DEFAULT +The structure represents a node that is not +represented by one of the other node types + +@item CFG_DNR +The structure represents a node, not of type symlink, +that is unreadable. The variable @code{cfg_errno} +is set to the appropriate value. + +@item CFG_DP +The structure represents a node with children in +post-order. This value occurs only if CFG_D +has previously been returned for this entry. + +@item CFG_ERR +The structure represents a node for which an error has +occurred. The variable @code{cfg_errno} is set to the +appropriate value. + +@item CFG_F +The structure represents a node without children. + +@item CFG_SL +The structure represents a node of type symbolic link. + +@item CFG_SLNONET +The structure represents a node of type symbolic link +with a target node for which node characteristic +information cannot be obtained. + +@end table + +@end table + +Structures returned by @code{cfg_read()} with a @code{cfg_info} field equal +to CFG_D is accessible until a subsequent call, on the same +configuration traversal stream, to @code{cfg_close()}, or to @code{cfg_read()} +after they have been returned by the @code{cfg_read} function in +post-order. Structures returned by @code{cfg_read()} with an +@code{cfg_info} field not equal to CFG_D is accessible until a subsequent +call, on the same configuration traversal stream, to @code{cfg_close()} +or @code{cfg_read()}. + +The content of the @code{cfg_path} field is specified only for the +structure most recently returned by @code{cfg_read()}. + +The specified fields in structures in the list representing nodes for +which structures have previously been returned by @code{cfg_children()}, +is identical to those returned by @code{cfg_children()}, except that +the contents of the @code{cfg_path} and @code{cfg_pathlen} fields are +unspecified. + +@subheading NOTES: + +The @code{_POSIX_CFG} feature flag is defined to indicate +this service is available. + +@page +@subsection cfg_children - Get Node Entries + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <cfg.h> + +int cfg_children( + CFG *cfgp, + int options, + CFGENT **children +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_children()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item EACCES +Search permission is denied for any component of a pathname + +@item EBADF +The @code{cfgp} argument does not refer to an open configuration space. + +@item ELOOP +A loop exists in symbolic links encountered during resolution of +a pathname. + +@item ENAMETOOLONG +The length of a pathname exceeds @code{PATH_MAX}, or a pathname +component is longer than @code{NAME_MAX} while @code{_POSIX_NO_TRUNC} is +in effect. + +@item EINVAL +The specified value of the @code{options} argument is invalid. + +@item ENOENT +The named node does not exist. + +@item ENOMEM +Not enough memory is available to create the necessary structures. + +@end table + +@subheading DESCRIPTION: + +The first @code{cfg_children()} call after a @code{cfg_read()} returns +information about the first node without children under the node +returned by @code{cfg_read()}. Subsequent calls to @code{cfg_children()} +without the intervening @code{cfg_read()} shall return information +about the remaining nodes without children under that same node. + +If @code{cfg_read()} has not yet been called for the configuration +traversal stream represented by @code{cfgp}, @code{cfg_children()} +returns a pointer to the first entry in a list of the nodes +represented by the @code{pathnames} argument to @code{cfg_open()}. + +In either case, the list is NULL-terminated, ordered by the +user-specified comparison function, if any, and linked through the +@code{cfg_link} field. + +@subheading NOTES: + +The @code{_POSIX_CFG} feature flag is defined to indicate +this service is available. + +@page +@subsection cfg_mark - Set Configuration Space Options + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <cfg.h> + +int cfg_mark( + CFG *cfgp, + CFGENT *f, + int options +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_mark()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item EINVAL +The specified combination of the @code{cfgp} and @code{f} arguments is not +supported by the implementation. + +@item EINVAL +The specified value of the @code{options} argument is invalid. + +@end table + +@subheading DESCRIPTION: + +The @code{cfg_mark()} function modifies the subsequent behavior of +the @code{cfg} functions with regard to the node referenced by the structure +pointed to by the argument @code{f} or the configuration space referenced +by the structure pointed to by the argument @code{cfgp}. + +Exactly one of the @code{f} argument and the @code{cfgp} argument is NULL. + +The value of the @code{options} argument is exactly one of the flags +specified in the following list: + +@table @b + +@item CFG_AGAIN +If the @code{cfgp} argument is non-NULL, or the @code{f} +argument is NULL, or the structure referenced by @code{f} +is not the one most recently returned by @code{cfg_read()}, +@code{cfg_mark()} returns an error. Otherwise, the next +call to the @code{cfg_read()} function returns the structure +referenced by @code{f} with the @code{cfg_info} field +reinitialized. Subsequent behavior of the @code{cfg} +functions are based on the reinitialized value of +@code{cfg_info}. + +@item CFG_SKIP +If the @code{cfgp} argument is non-NULL, or the @code{f} +argument is NULL, or the structure referenced by @code{f} +is not one of those specified as accessible, or the structure +referenced by @code{f} is not for a node of type pre-order +node, @code{cfg_mark()} returns an error. Otherwise, no +more structures for the node referenced by @code{f} or its +descendants are returned by the @code{cfg_read()} function. + +@item CFG_FOLLOW +If the @code{cfgp} argument is non-NULL, or the @code{f} +argument is NULL, or the structure referenced by @code{f} +is not one of those specified as accessible, or the structure +referenced by @code{f} is not for a node of type symbolic link, +@code{cfg_mark()} returns an error. Otherwise, the next +call to the @code{cfg_read()} function returns the structure +referenced by @code{f} with the @code{cfg_info} field reset +to reflect the target of the symbolic link instead of the +symbolic link itself. If the target of the link is node with +children, the pre-order return, followed by the return of +structures referencing all of its descendants, followed by a +post-order return, shall be done. + +@end table + +If the target of the symbolic link does not exist, the fields +of the structure by @code{cfg_read()} shall be unmodified, except +that the @code{cfg_info} field shall be reset to @code{CFG_SLNONE}. + +@subheading NOTES: + +The @code{_POSIX_CFG} feature flag is defined to indicate +this service is available. + +@page +@subsection cfg_close - Close a Configuration Space + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <cfg.h> + +int cfg_close( + CFG *cfgp +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_close()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item EBADF +The @code{cfgp} argument does not refer to an open configuration space +traversal stream. + +@end table + +@subheading DESCRIPTION: + +The @code{cfg_close()} function closes a configuration space transversal +stream represented by the CFG structure pointed at by the @code{cfgp} +argument. All system resources allocated for this configuration space +traversal stream should be deallocated. Upon return, the value of +@code{cfgp} need not point to an accessible object of type CFG. + +@subheading NOTES: + +The @code{_POSIX_CFG} feature flag is defined to indicate +this service is available. + +@page +@subsection cfg_readdir - Reads a directory + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <sys/types.h> +#include <dirent.h> + +struct dirent *cfg_readdir( + DIR *dirp +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +@table @b +@item EBADF +Invalid file descriptor + +@end table + +@subheading DESCRIPTION: + +The @code{cfg_readdir()} function returns a pointer to a structure @code{dirent} +representing the next directory entry from the directory stream pointed to +by @code{dirp}. On end-of-file, NULL is returned. + +The @code{cfg_readdir()} function may (or may not) return entries for . or .. Your +program should tolerate reading dot and dot-dot but not require them. + +The data pointed to be @code{cfg_readdir()} may be overwritten by another call to +@code{readdir()} for the same directory stream. It will not be overwritten by +a call for another directory. + +@subheading NOTES: + +If @code{ptr} is not a pointer returned by @code{malloc()}, @code{calloc()}, or +@code{realloc()} or has been deallocated with @code{free()} or @code{realloc()}, +the results are not portable and are probably disastrous. + +This function is not defined in the POSIX specification. It is an extension +provided by this implementation. + +@page +@subsection cfg_umask - Sets a file creation mask. + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <sys/types.h> +#include <sys/stat.h> + +mode_t cfg_umask( + mode_t cmask +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +@subheading DESCRIPTION: + +The @code{cfg_umask()} function sets the process node creation mask to @code{cmask}. +The file creation mask is used during @code{open()}, @code{creat()}, @code{mkdir()}, +@code{mkfifo()} calls to turn off permission bits in the @code{mode} argument. +Bit positions that are set in @code{cmask} are cleared in the mode of the +created file. + +The file creation mask is inherited across @code{fork()} and @code{exec()} calls. +This makes it possible to alter the default permission bits of created files. + +@subheading NOTES: None + +The @code{cmask} argument should have only permission bits set. All other +bits should be zero. + +@page +@subsection cfg_chmod - Changes file mode. + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <sys/types.h> +#include <sys/stat.h> + +int cfg_chmod( + const char *path, + mode_t mode +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_chmod()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item EACCES +Search permission is denied for a directory in a file's path prefix +@item ENAMETOOLONG +Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is in +effect. +@item ENOENT +A file or directory does not exist. +@item ENOTDIR +A component of the specified pathname was not a directory when a directory +was expected. +@item EPERM +Operation is not permitted. Process does not have the appropriate priviledges +or permissions to perform the requested operations. +@item EROFS +Read-only file system. + +@end table + +@subheading DESCRIPTION: + +Set the file permission bits, the set user ID bit, and the set group ID bit +for the file named by @code{path} to @code{mode}. If the effective user ID +does not match the owner of the node and the calling process does not have +the appropriate privileges, @code{cfg_chmod()} returns -1 and sets @code{errno} to +@code{EPERM}. + +@subheading NOTES: + +@page +@subsection cfg_chown - Changes the owner and/or group of a file. + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +#include <sys/types.h> +#include <unistd.h> + +int cfg_chown( + const char *path, + uid_t owner, + gid_t group +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +A successful call to @code{cfg_chown()} returns a value of zero +and an unsuccessful call returns the @code{errno}. + +@table @b +@item EACCES +Search permission is denied for a directory in a file's path prefix +@item EINVAL +Invalid argument +@item ENAMETOOLONG +Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is in +effect. +@item ENOENT +A file or directory does not exist. +@item ENOTDIR +A component of the specified pathname was not a directory when a directory +was expected. +@item EPERM +Operation is not permitted. Process does not have the appropriate priviledges +or permissions to perform the requested operations. +@item EROFS +Read-only file system. + +@end table + +@subheading DESCRIPTION: + +The user ID and group ID of the file named by @code{path} are set to +@code{owner} and @code{path}, respectively. + +For regular files, the set group ID (S_ISGID) and set user ID (S_ISUID) +bits are cleared. + +Some systems consider it a security violation to allow the owner of a file to +be changed, If users are billed for disk space usage, loaning a file to +another user could result in incorrect billing. The @code{cfg_chown()} function +may be restricted to privileged users for some or all files. The group ID can +still be changed to one of the supplementary group IDs. + +@subheading NOTES: + +This function may be restricted for some file. The @code{pathconf} function +can be used to test the _PC_CHOWN_RESTRICTED flag. + + |