summaryrefslogtreecommitdiffstats
path: root/doc/new_chapters/eventlog.t
diff options
context:
space:
mode:
Diffstat (limited to 'doc/new_chapters/eventlog.t')
-rw-r--r--doc/new_chapters/eventlog.t1265
1 files changed, 1265 insertions, 0 deletions
diff --git a/doc/new_chapters/eventlog.t b/doc/new_chapters/eventlog.t
new file mode 100644
index 0000000000..f502d81ed2
--- /dev/null
+++ b/doc/new_chapters/eventlog.t
@@ -0,0 +1,1265 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Event Logging Manager
+
+@section Introduction
+
+The event logging manager provides a portable method for logging
+system and application events and subsequent processing of those
+events. 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 event logging manager are:
+
+@itemize @bullet
+@item @code{log_create} - Create a log file
+@item @code{log_sys_create} - Create a system log file
+@item @code{log_write} - Write to the system Log
+@item @code{log_write_any} - Write to any log file
+@item @code{log_write_entry} - Write entry to any log file
+@item @code{log_open} - Open a log file
+@item @code{log_read} - Read from a log file
+@item @code{log_notify} - Notify Process of writes to the system log
+@item @code{log_close} - Close log descriptor
+@item @code{log_seek} - Reposition log file offset
+@item @code{log_severity_before} - Compare event record severities
+@item @code{log_facilityemptyset} - Manipulate log facility sets
+@item @code{log_facilityfillset} - Manipulate log facility sets
+@item @code{log_facilityaddset} - Manipulate log facility sets
+@item @code{log_facilitydelset} - Manipulate log facility sets
+@item @code{log_facilityismember} - Manipulate log facility sets
+@item @code{log_facilityisvalid} - Manipulate log facility sets
+@end itemize
+
+@section Background
+
+@subsection Log Files and Events
+
+The operating system uses a special log file named @code{syslog}.
+This log file is called the system log and is automatically created and
+tracked by the operating system. The system log is written with
+the @code{log_write()} function. An alternative log file may be written
+using the @code{log_write_any()} function. It is possible to use @code{log_read()}
+to query the system log and and write the records to a non-system log file
+using @code{log_write_entry()} to produce a filtered version of the
+system log. For example you could produce a log of all disk controller
+faults that have occurred.
+
+A non-system log may be a special log file created by an application to
+describe application faults, or a subset of the system log created
+by the application.
+
+
+
+@subsection Facilities
+
+A facility is an identification code for a subsystem, device, or
+other object about which information is being written to
+a log file.
+
+A facility set is a collection of facilities.
+
+@subsection Severity
+
+Severity is a rating of the error that is being logged.
+
+@subsection Queries
+
+
+The facility identifier and the event severity are the basis for
+subsequent log query. A log query is used as a filter to
+obtain a subset of a given log file. The log file may be configured
+to send out an event.
+
+@section Operations
+
+@subsection Creating and Writing a non-System Log
+
+The following code fragment create a non-System log file at /temp/.
+A real filename previously read entry and buffer @code{log_buf} of size
+@code{readsize} are written into the log. See the discussion on opening
+and reading a log for how the entry is created.
+
+@example
+#include <evlog.h>
+ :
+ logd_t *outlog = NULL;
+ char *path = "/temp/";
+
+ log_create( outlog, path );
+ :
+ log_write_entry( outlog, &entry, log_buf, readsize );
+
+@end example
+
+@subsection Reading a Log
+
+Discuss opening and reading from a log.
+
+@example
+ build a query
+ log_open
+ log_read loop
+@end example
+
+@section Directives
+
+This section details the event logging 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 log_write - Write to the system Log
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_write(
+ const log_facility_t facility,
+ const int event_id,
+ const log_severity_t severity,
+ const void *buf,
+ const size_t len
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_write()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item E2BIG
+This error indicates an inconsistency in the implementation.
+Report this as a bug.
+
+@item EINVAL
+The @code{facility} argument is not a valid log facility.
+
+@item EINVAL
+The @code{severity} argument exceeds @code{LOG_SEVERITY_MAX}.
+
+@item EINVAL
+The @code{len} argument exceeds @code{LOG_MAXIUM_BUFFER_SIZE}.
+
+@item EINVAL
+The @code{len} argument was non-zero and @code{buf} is @code{NULL}.
+
+@item ENOSPC
+The device which contains the log file has run out of space.
+
+@item EIO
+An I/O error occurred in writing to the log file.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_write} function writes an event record to the
+system log file. The event record written consists of the
+event attributes specified by the @code{facility}, @code{event_id},
+and @code{severity} arguments as well as the data identified by the
+@code{buf} and @code{len} arguments. The fields of the event record
+structure to be written are filled in as follows:
+
+@table @b
+@item log_recid
+This is set to a monotonically increasing log record id
+maintained by the system for this individual log file.
+
+@item log_size
+This is set to the value of the @code{len} argument.
+
+@item log_event_id
+This is set to the value of the @code{event_id} argument.
+
+@item log_facility
+This is set to the value of the @code{facility} argument.
+
+@item log_severity
+This is set to the value of the @code{severity} argument.
+
+@item log_uid
+This is set to the value returned by @code{geteuid()}.
+
+@item log_gid
+This is set to the value returned by @code{getegid()}.
+
+@item log_pid
+This is set to the value returned by @code{getpid()}.
+
+@item log_pgrp
+This is set to the value returned by @code{getpgrp()}.
+
+@item log_time
+This is set to the value returned by @code{clock_gettime()} for the
+@code{CLOCK_REALTIME clock} source.
+
+@end table
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+This implementation can not return the @code{EPERM} error.
+
+@page
+@subsection log_write_any - Write to the any log file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_write_any(
+ const logd_t logdes,
+ const log_facility_t facility,
+ const int event_id,
+ const log_severity_t severity,
+ const void *buf,
+ const size_t len
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_write_any()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item E2BIG
+This error indicates an inconsistency in the implementation.
+Report this as a bug.
+
+@item EBADF
+The @code{logdes} argument is not a valid log descriptor.
+
+@item EINVAL
+The @code{facility} argument is not a valid log facility.
+
+@item EINVAL
+The @code{severity} argument exceeds @code{LOG_SEVERITY_MAX}.
+
+@item EINVAL
+The @code{len} argument exceeds @code{LOG_MAXIMUM_BUFFER_SIZE}.
+
+@item EINVAL
+The @code{len} argument was non-zero and @code{buf} is @code{NULL}.
+
+@item ENOSPC
+The device which contains the log file has run out of space.
+
+@item EIO
+An I/O error occurred in writing to the log file.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_write_any()} function writes an event record to the log file
+specified by @code{logdes}. The event record written consists of the
+event attributes specified by the @code{facility}, @code{event_id},
+and @code{severity} arguments as well as the data identified by the
+@code{buf} and @code{len} arguments. The fields of the event record
+structure to be written are filled in as follows:
+
+@table @b
+@item log_recid
+This is set to a monotonically increasing log record id
+maintained by the system for this individual log file.
+
+@item log_size
+This is set to the value of the @code{len} argument.
+
+@item log_event_id
+This is set to the value of the @code{event_id} argument.
+
+@item log_facility
+This is set to the value of the @code{facility} argument.
+
+@item log_severity
+This is set to the value of the @code{severity} argument.
+
+@item log_uid
+This is set to the value returned by @code{geteuid()}.
+
+@item log_gid
+This is set to the value returned by @code{getegid()}.
+
+@item log_pid
+This is set to the value returned by @code{getpid()}.
+
+@item log_pgrp
+This is set to the value returned by @code{getpgrp()}.
+
+@item log_time
+This is set to the value returned by @code{clock_gettime()} for the
+@code{CLOCK_REALTIME} clock source.
+
+@end table
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+This implementation can not return the @code{EPERM} error.
+
+This function is not defined in the POSIX specification. It is
+an extension provided by this implementation.
+
+@page
+@subsection log_write_entry - Write entry to any log file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_write_entry(
+ const logd_t logdes,
+ struct log_entry *entry,
+ const void *buf,
+ const size_t len
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_write_entry()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item E2BIG
+This error indicates an inconsistency in the implementation.
+Report this as a bug.
+
+@item EBADF
+The @code{logdes} argument is not a valid log descriptor.
+
+@item EFAULT
+The @code{entry} argument is not a valid pointer to a log entry.
+
+@item EINVAL
+The @code{facility} field in @code{entry} is not a valid log facility.
+
+@item EINVAL
+The @code{severity} field in @code{entry} exceeds @code{LOG_SEVERITY_MAX}.
+
+@item EINVAL
+The @code{len} argument exceeds @code{LOG_MAXIMUM_BUFFER_SIZE}.
+
+@item EINVAL
+The @code{len} argument was non-zero and @code{buf} is NULL.
+
+@item ENOSPC
+The device which contains the log file has run out of space.
+
+@item EIO
+An I/O error occurred in writing to the log file.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_write_entry()} function writes an event record
+specified by the @code{entry}, @code{buf}, and @code{len} arguments.
+Most of the fields of the event record pointed to by @code{entry}
+are left intact. The following fields are filled in as follows:
+
+@table @b
+@item log_recid
+This is set to a monotonically increasing log record id
+maintained by the system for this individual log file.
+
+@item log_size
+This is set to the value of the @code{len} argument.
+
+@end table
+
+This allows existing log entries from one log file to be written to
+another log file without destroying the logged information.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+This implementation can not return the @code{EPERM} error.
+
+This function is not defined in the POSIX specification. It is
+an extension provided by this implementation.
+
+@page
+@subsection log_open - Open a log file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_open(
+ logd_t *logdes,
+ const char *path,
+ const log_query_t *query
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_open()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EACCES
+Search permission is denied on a component of the @code{path} prefix,
+or the log file exists and read permission is denied.
+
+@item EINTR
+A signal interrupted the call to @code{log_open()}.
+
+@item EINVAL
+The log_severity field of the query argument exceeds
+@code{LOG_SEVERITY_MAX}.
+
+@item EINVAL
+The @code{path} argument referred to a file that was not a log file.
+
+@item EMFILE
+Too many log file descriptors are currently in use by this
+process.
+
+@item ENAMETOOLONG
+The length of the path string exceeds @code{PATH_MAX}, or a pathname
+component is longer than @code{NAME_MAX} while @code{_POSIX_NO_TRUNC} is
+in effect.
+
+@item ENFILE
+Too many files are currently open in the system.
+
+@item ENOENT
+The file specified by the @code{path} argument does not exist.
+
+@item ENOTDIR
+A component of the @code{path} prefix is not a directory.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_open()} function establishes the connection between a
+log file and a log file descriptor. It creates an open log file
+descriptor that refers to this query stream on the specified log file
+The log file descriptor is used by the other log functions to refer
+to that log query stream. The @code{path} argument points to a
+pathname for a log file. A @code{path} argument of @code{NULL} specifies
+the current system log file.
+
+The @code{query} argument is not @code{NULL}, then it points to a log query
+specification that is used to filter the records in the log file on
+subsequent @code{log_read()} operations. This restricts the set of
+event records read using the returned log file descriptor to those
+which match the query. A query match occurs for a given record when
+that record's facility is a member of the query's facility set and
+the record's severity is greater than or equal to the severity specified
+in the query.
+
+If the value of the @code{query} argument is @code{NULL}, no query filter
+shall be applied.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+POSIX specifies that @code{EINVAL} will be returned if the
+@code{log_facilities} field of the @code{query} argument is not
+a valid facility set. In this implementation, this condition
+can never occur.
+
+Many error codes that POSIX specifies to be returned by @code{log_open()}
+should actually be detected by @code{open()} and passed back by the
+@code{log_open()} implementation. In this implementation, @code{EACCESS},
+@code{EMFILE}, @code{ENAMETOOLONG}, @code{ENFILE}, @code{ENOENT},
+and @code{ENOTDIR} are detected in this manner.
+
+@page
+@subsection log_read - Read from a log file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_read(
+ const logd_t logdes,
+ struct log_entry *entry,
+ void *log_buf,
+ const size_t log_len,
+ const size_t *log_sizeread
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_read()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item E2BIG
+This error indicates an inconsistency in the implementation.
+Report this as a bug.
+
+@item EBADF
+The @code{logdes} argument is not a valid log file descriptor.
+
+@item EFAULT
+The @code{entry} argument is not a valid pointer to a log entry structure.
+
+@item EFAULT
+The @code{log_sizeread} argument is not a valid pointer to a size_t.
+
+@item EBUSY
+No data available. There are no unread event records remaining
+in this log file.
+
+@item EINTR
+A signal interrupted the call to @code{log_read()}.
+
+@item EIO
+An I/O error occurred in reading from the event log.
+
+@item EINVAL
+The matching event record has data associated with it and
+@code{log_buf} was not a valid pointer.
+
+@item EINVAL
+The matching event record has data associated with it which is
+longer than @code{log_len}.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_read()} function reads the @code{log_entry}
+structure and up to @code{log_len} bytes of data from the next
+event record of the log file associated with the open log file
+descriptor @code{logdes}. The event record read is placed
+into the @code{log_entry} structure pointed to by
+@code{entry} and any data into the buffer pointed to by @code{log_buf}.
+The log record ID of the returned event record is be stored in the
+@code{log_recid} member of the @code{log_entry} structure for the event
+record.
+
+If the query attribute of the open log file description associated with
+the @code{logdes} is set, the event record read will match that query.
+
+If the @code{log_read()} is successful the call stores the actual length
+of the data associated with the event record into the location specified by
+@code{log_sizeread}. This number will be less than or equal to
+@code{log_len}.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+When @code{EINVAL} is returned, then no data is returned although the
+event record is returned. This is an extension to the POSIX specification.
+
+The POSIX specification specifically allows @code{log_read()} to write
+greater than @code{log_len} bytes into @code{log_buf}. This is highly
+undesirable and this implementation will NOT do this.
+
+@page
+@subsection log_notify - Notify Process of writes to the system log.
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_notify(
+ const logd_t logdes,
+ const struct sigevent *notification
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_notify()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EBADF
+The logdes argument is not a valid log file descriptor.
+
+@item EINVAL
+The notification argument specifies an invalid signal.
+
+@item EINVAL
+The process has requested a notify on a log that will not be
+written to.
+
+@item ENOSYS
+The function @code{log_notify()} is not supported by this implementation.
+
+@end table
+
+@subheading DESCRIPTION:
+
+If the argument @code{notification} is not @code{NULL} this function registers
+the calling process to be notified of event records received by the system
+log, which match the query parameters associated with the open log descriptor
+specified by @code{logdes}. The notification specified by the
+@code{notification} argument shall be sent to the process when an event
+record received by the system log is matched by the query attribute of the
+open log file description associated with the @code{logdes} log file
+descriptor. If the calling process has already registered a notification
+for the @code{logdes} log file descriptor, the new notification shall
+replace the existing notification registration.
+
+If the @code{notification} argument is @code{NULL} and the calling process is
+currently registered to be notified for the @code{logdes} log file
+descriptor, the existing registration shall be removed.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection log_close - Close log descriptor
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_close(
+ const logd_t logdes
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_close()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EBADF
+The logdes argument is not a valid log file descriptor.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_close()} function deallocates the open log file descriptor
+indicated by @code{log_des}.
+
+When all log file descriptors associated with an open log file description
+have been closed, the open log file description is freed.
+
+If the link count of the log file is zero, when all log file descriptors
+have been closed, the space occupied by the log file is freed and the
+log file shall no longer be accessible.
+
+If the process has successfully registered a notification request for the
+log file descriptor, the registration is removed.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection log_seek - Reposition log file offset
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_seek(
+ const logd_t logdes,
+ log_recid_t log_recid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_seek()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EBADF
+The @code{logdes} argument is not a valid log file descriptor.
+@item EINVAL
+The @code{log_recid} argument is not a valid record id.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_seek()} function sets the log file offset of the open
+log description associated with the @code{logdes} log file descriptor
+to the event record in the log file identified by @code{log_recid}.
+The @code{log_recid} argument is either the record id of a valid event
+record or one of the following values, as defined in the header file
+@code{<evlog.h>:}
+
+@table @b
+@item LOG_SEEK_START
+Set log file position to point at the first event
+record in the log file.
+
+@item LOG_SEEK_END
+Set log file position to point after the last event
+record in the log file.
+
+@end table
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+This implementation can not return EINTR.
+
+This implementation can not return EINVAL to indicate that
+the @code{log_recid} argument is not a valid record id.
+
+@page
+@subsection log_severity_before - Compare event record severities
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_severity_before(
+ log_severity_t s1,
+ log_severity_t s2
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item 0
+The severity of @code{s1} is less than that of @code{s2}.
+
+@item 1
+The severity of @code{s1} is greater than or equal that of @code{s2}.
+
+@item EINVAL
+The value of either s1 or s2 exceeds @code{LOG_SEVERITY_MAX}.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_severity_before()} function compares the severity order
+of the @code{s1} and @code{s2} arguments. If @code{s1} is of
+severity greater than or equal to that of @code{s2}, then this
+function returns 1. Otherwise, it returns 0.
+
+If either @code{s1} or @code{s2} specify invalid severity values, the
+return value of @code{log_severity_before()} is unspecified.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+The POSIX specification of the return value for this function is ambiguous.
+If EINVAL is equal to 1 in an implementation, then the application
+can not distinguish between greater than and an error condition.
+
+@page
+@subsection log_facilityemptyset - Manipulate log facility sets
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_facilityemptyset(
+ log_facility_set_t *set
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_facilityemptyset()} returns a value of zero
+and a unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EFAULT
+The @code{set} argument is an invalid pointer.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_facilityemptyset()} function initializes the facility
+set pointed to by the argument @code{set}, such that all facilities
+are excluded.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+Applications shall call either @code{log_facilityemptyset()} or
+@code{log_facilityfillset()} at least once for each object of type
+@code{log_facilityset_t} prior to any other use of that object. If
+such an object is not initialized in this way, but is nonetheless
+supplied as an argument to any of the @code{log_facilityaddset()},
+@code{logfacilitydelset()}, @code{log_facilityismember()} or
+@code{log_open()} functions, the results are undefined.
+
+@page
+@subsection log_facilityfillset - Manipulate log facility sets
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_facilityfillset(
+ log_facility_set_t *set
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_facilityfillset()} returns a value of zero
+and a unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EFAULT
+The @code{set} argument is an invalid pointer.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_facilityfillset()} function initializes the facility
+set pointed to by the argument @code{set}, such that all facilities
+are included.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+Applications shall call either @code{log_facilityemptyset()} or
+@code{log_facilityfillset()} at least once for each object of type
+@code{log_facilityset_t} prior to any other use of that object. If
+such an object is not initialized in this way, but is nonetheless
+supplied as an argument to any of the @code{log_facilityaddset()},
+@code{logfacilitydelset()}, @code{log_facilityismember()} or
+@code{log_open()} functions, the results are undefined.
+
+@page
+@subsection log_facilityaddset - Manipulate log facility sets
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_facilityaddset(
+ log_facility_set_t *set,
+ log_facility_t facilityno
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_facilityaddset()} returns a value of zero
+and a unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EFAULT
+The @code{set} argument is an invalid pointer.
+
+@item EINVAL
+The @code{facilityno} argument is not a valid facility.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_facilityaddset()} function adds the individual
+facility specified by the value of the argument @code{facilityno}
+to the facility set pointed to by the argument @code{set}.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+Applications shall call either @code{log_facilityemptyset()} or
+@code{log_facilityfillset()} at least once for each object of type
+@code{log_facilityset_t} prior to any other use of that object. If
+such an object is not initialized in this way, but is nonetheless
+supplied as an argument to any of the @code{log_facilityaddset()},
+@code{logfacilitydelset()}, @code{log_facilityismember()} or
+@code{log_open()} functions, the results are undefined.
+
+@page
+@subsection log_facilitydelset - Manipulate log facility sets
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_facilitydelset(
+ log_facility_set_t *set,
+ log_facility_t facilityno
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_facilitydelset()} returns a value of zero
+and a unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EFAULT
+The @code{set} argument is an invalid pointer.
+
+@item EINVAL
+The @code{facilityno} argument is not a valid facility.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_facilitydelset()} function deletes the individual
+facility specified by the value of the argument @code{facilityno}
+from the facility set pointed to by the argument @code{set}.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+Applications shall call either @code{log_facilityemptyset()} or
+@code{log_facilityfillset()} at least once for each object of type
+@code{log_facilityset_t} prior to any other use of that object. If
+such an object is not initialized in this way, but is nonetheless
+supplied as an argument to any of the @code{log_facilityaddset()},
+@code{logfacilitydelset()}, @code{log_facilityismember()} or
+@code{log_open()} functions, the results are undefined.
+
+@page
+@subsection log_facilityismember - Manipulate log facility sets
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_facilityismember(
+ const log_facility_set_t *set,
+ log_facility_t facilityno,
+ const int *member
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_facilityismember()} returns a value
+of zero and a unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EFAULT
+The @code{set} or @code{member} argument is an invalid pointer.
+
+@item EINVAL
+The @code{facilityno} argument is not a valid facility.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_facilityismember()} function tests whether the facility
+specified by the value of the argument @code{facilityno} is a member
+of the set pointed to by the argument @code{set}. Upon successful
+completion, the @code{log_facilityismember()} function either returns
+a value of one to the location specified by @code{member} if the
+specified facility is a member of the specified set or value of
+zero to the location specified by @code{member} if the specified
+facility is not a member of the specified set.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+Applications shall call either @code{log_facilityemptyset()} or
+@code{log_facilityfillset()} at least once for each object of type
+@code{log_facilityset_t} prior to any other use of that object. If
+such an object is not initialized in this way, but is nonetheless
+supplied as an argument to any of the @code{log_facilityaddset()},
+@code{logfacilitydelset()}, @code{log_facilityismember()} or
+@code{log_open()} functions, the results are undefined.
+
+@page
+@subsection log_facilityisvalid - Manipulate log facility sets
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_facilityisvalid(
+ log_facility_t facilityno
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A return value of zero indicates that the @code{facilityno} is valid and
+a return value other than zero represents an @code{errno}.
+
+@table @b
+@item EFAULT
+The @code{set} or @code{member} argument is an invalid pointer.
+
+@item EINVAL
+The @code{facilityno} argument is not a valid facility.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_facilityisvalid()} function tests whether the facility
+specified by the value of the argument @code{facilityno} is a valid
+facility number. Upon successful completion, the
+the @code{log_facilityisvalid()} function either returns a value of
+0 if the specified facility is a valid facility or value of EINVAL
+if the specified facility is not a valid facility.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+Applications shall call either @code{log_facilityemptyset()} or
+@code{log_facilityfillset()} at least once for each object of type
+@code{log_facilityset_t} prior to any other use of that object. If
+such an object is not initialized in this way, but is nonetheless
+supplied as an argument to any of the @code{log_facilityaddset()},
+@code{logfacilitydelset()}, @code{log_facilityismember()} or
+@code{log_open()} functions, the results are undefined.
+
+@page
+@subsection log_create - Creates a log file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_create(
+ logd_t *ld,
+ const char *path,
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_create()} returns a value
+of zero and a unsuccessful call returns the @code{errno}.
+
+@table @b
+
+@item EEXIST
+The @code{path} already exists and O_CREAT and O_EXCL were used.
+
+@item EISDIR
+The @code{path} refers to a directory and the access requested involved
+writing.
+
+@item ETXTBSY
+The @code{path} refers to an executable image which is currently being
+executed and write access was requested.
+
+@item EFAULT
+The @code{path} points outside your accessible address space.
+
+@item EACCES
+The requested access to the file is not allowed, or one of the
+directories in @code{path} did not allow search (execute) permission.
+
+@item ENAMETOOLONG
+The @code{path} was too long.
+
+@item ENOENT
+A directory component in @code{path} does not exist or is a dangling symbolic
+link.
+
+@item ENOTDIR
+A component used as a directory in @code{path} is not, in fact, a directory.
+
+@item EMFILE
+The process already has the maximum number of files open.
+
+@item ENFILE
+The limit on the total number of files open on the system has been reached.
+
+@item ENOMEM
+Insufficient kernel memory was available.
+
+@item EROFS
+The @code{path} refers to a file on a read-only filesystem and write access
+was requested.
+
+@item ELOOP
+The @code{path} contains a reference to a circular symbolic link, ie a
+symbolic link whose expansion contains a reference to itself.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function attempts to create a file associated with the @code{logdes}
+argument in the directory provided by the argument @code{path}.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection log_sys_create - Creates a system log file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_sys_create();
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_sys_create()} returns a value
+of zero and a unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EEXIST
+The directory path to the system log already exist.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function will create a predefined system log directory path and
+system log file if they do not already exist.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.