EA_PACK_OBJECT(3EXACCT)    Extended Accounting File Access Library Functions
NAME
       ea_pack_object, ea_unpack_object, ea_get_creator, ea_get_hostname,
       ea_next_object, ea_previous_object, ea_get_object, ea_write_object,
       ea_copy_object, ea_copy_object_tree, ea_get_object_tree - construct,
       read, and write extended accounting records
SYNOPSIS
       cc [ 
flag... ] 
file... 
-lexacct [ 
library... ]
       #include <exacct.h>       
size_t ea_pack_object(
ea_object_t *obj, 
void *buf,            
size_t bufsize);       
ea_object_type_t ea_unpack_object(
ea_object_t **objp, 
int flag,            
void *buf, 
size_t bufsize);       
const char *ea_get_creator(
ea_file_t *ef);       
const char *ea_get_hostname(
ea_file_t *ef);       
ea_object_type_t ea_next_object(
ea_file_t *ef, 
ea_object_t *obj);       
ea_object_type_t ea_previous_object(
ea_file_t *ef,            
ea_object_t *obj);       
ea_object_type_t ea_get_object(
ea_file_t *ef, 
ea_object_t *obj);       
int ea_write_object(
ea_file_t *ef, 
ea_object_t *obj);       
ea_object_type_t *ea_copy_object(
const ea_object_t *src);       
ea_object_type_t *ea_copy_object_tree(
const ea_object_t *src);       
ea_object_type_t *ea_get_object_tree(
ea_file_t *ef,            
uint32_tnobj);
DESCRIPTION
       The 
ea_pack_object() function converts 
exacct objects from their in-
       memory representation to their file representation. It is passed an
       object pointer that points to the top of an 
exacct object hierarchy
       representing one or more 
exacct records. It returns the size of the
       buffer required to contain the packed buffer representing the object
       hierarchy. To obtain the correct size of the required buffer, the 
buf       and 
bufsize parameters can be set to 
NULL and 0 respectively, and the
       required buffer size will be returned. The resulting packed record
       can be passed to 
putacct(2) or to 
ea_set_item(3EXACCT) when
       constructing an object of type 
EXT_EXACCT_OBJECT.
       The 
ea_unpack_object() function reverses the packing process
       performed by 
ea_pack_object(). A packed buffer passed to       
ea_unpack_object() is unpacked into the original hierarchy of
       objects.  If the unpack operation fails (for example, due to a
       corrupted or incomplete buffer), it returns 
EO_ERROR; otherwise, the
       object type of the first object in the hierarchy is returned.  If       
ea_unpack_object() is invoked with 
flag equal to 
EUP_ALLOC, it
       allocates memory for the variable-length data in the included
       objects.  Otherwise, with 
flag equal to 
EUP_NOALLOC, it sets the
       variable length data pointers within the unpacked object structures
       to point within the buffer indicated by 
buf. In both cases,       
ea_unpack_object() allocates all the necessary 
exacct objects to
       represent the unpacked record. The resulting object hierarchy can be
       freed using 
ea_free_object(3EXACCT) with the same 
flag value.
       The 
ea_get_creator() function returns a pointer to a string
       representing the recorded creator of the 
exacct file. The       
ea_get_hostname() function returns a pointer to a string representing
       the recorded hostname on which the 
exacct file was created.  These
       functions will return 
NULL if their respective field was not recorded
       in the exacct file header.
       The 
ea_next_object() function reads the basic fields (
eo_catalog and       
eo_type) into the 
ea_object_t indicated by 
obj from the 
exacct file
       referred to by 
ef and rewinds to the head of the record.  If the read
       object is corrupted, 
ea_next_object() returns 
EO_ERROR and records
       the extended accounting error code, accessible with       
ea_error(3EXACCT). If end-of-file is reached, 
EO_ERROR is returned
       and the extended accounting error code is set to 
EXR_EOF.
       The 
ea_previous_object() function skips back one object in the file
       and reads its basic fields (
eo_catalog and 
eo_type) into the
       indicated 
ea_object_t.  If the read object is corrupted,       
ea_previous_object() returns 
EO_ERROR and records the extended
       accounting error code, accessible with 
ea_error(3EXACCT). If end-of-
       file is reached, 
EO_ERROR is returned and the extended accounting
       error code is set to 
EXR_EOF.
       The 
ea_get_object() function reads the value fields into the       
ea_object_t indicated by 
obj, allocating memory as necessary, and
       advances to the head of the next record. Once a record group object
       is retrieved using 
ea_get_object(), subsequent calls to       
ea_get_object() and 
ea_next_object() will track through the objects
       within the record group, and on reaching the end of the group, will
       return the next object at the same level as the group from the file.
       If the read object is corrupted, 
ea_get_object() returns 
EO_ERROR and
       records the extended accounting error code, accessible with       
ea_error(3EXACCT). If end-of-file is reached, 
EO_ERROR is returned
       and the extended accounting error code is set to 
EXR_EOF.
       The 
ea_write_object() function appends the given object to the open       
exacct file indicated by 
ef and returns 0. If the write fails,       
ea_write_object() returns -1 and sets the extended accounting error
       code to indicate the error, accessible with 
ea_error(3EXACCT).
       The 
ea_copy_object() function copies an 
ea_object_t. If the source
       object is part of a chain, only the current object is copied. If the
       source object is a group, only the group object is copied without its
       list of members and the 
eg_nobjs and 
eg_objs fields are set to 0 and       
NULL, respectively. Use 
ea_copy_tree() to copy recursively a group or
       a list of items.
       The 
ea_copy_object_tree() function recursively copies an 
ea_object_t.
       All elements in the 
eo_next list are copied, and any group objects
       are recursively copied. The returned object can be completely freed
       with 
ea_free_object(3EXACCT) by specifying the 
EUP_ALLOC flag.
       The 
ea_get_object_tree() function reads in 
nobj top-level objects
       from the file, returning the same data structure that would have
       originally been passed to 
ea_write_object(). On encountering a group
       object, the 
ea_get_object() function reads only the group header part
       of the group, whereas 
ea_get_object_tree() reads the group and all
       its member items, recursing into sub-records if necessary. The
       returned object data structure can be completely freed with       
ea_free_object() by specifying the 
EUP_ALLOC flag.
RETURN VALUES
       The 
ea_pack_object() function returns the number of bytes required to
       hold the 
exacct object being operated upon. If the returned size
       exceeds 
bufsize, the pack operation does not complete and the
       function returns (
size_t) -1 and sets the extended accounting error
       code to indicate the error.
       The 
ea_get_object() function returns the 
ea_object_type of the object
       if the object was retrieved successfully. Otherwise, it returns       
EO_ERROR and sets the extended accounting error code to indicate the
       error.
       The 
ea_next_object() function returns the 
ea_object_type of the next       
exacct object in the file.  It returns 
EO_ERROR if the 
exacct file is
       corrupted sets the extended accounting error code to indicate the
       error.
       The 
ea_unpack_object() function returns the 
ea_object_type of the
       first 
exacct object unpacked from the buffer. It returns 
EO_ERROR if
       the exacct file is corrupted, and sets the extended accounting error
       code to indicate the error.
       The 
ea_write_object() function returns 0 on success. Otherwise it
       returns -1 and sets the extended accounting error code to indicate
       the error.
       The 
ea_copy_object() and 
ea_copy_object_tree() functions return the
       copied object on success. Otherwise they return 
NULL and set the
       extended accounting error code to indicate the error.
       The 
ea_get_object_tree() function returns the list of objects read
       from the file on success. Otherwise it returns 
NULL and sets the
       extended accounting error code to indicate the error.
       The extended account error code can be retrieved using       
ea_error(3EXACCT).
ERRORS
       These functions may fail if:       
EXR_SYSCALL_FAIL           A system call invoked by the function failed. The 
errno variable
           contains the error value set by the underlying call. On memory
           allocation failure, 
errno will be set to 
ENOMEM.       
EXR_CORRUPT_FILE           The file referred to by 
name is not a valid 
exacct file, or is
           unparsable, and therefore appears corrupted. This error is also
           used by 
ea_unpack_buffer() to indicate a corrupted buffer.       
EXR_EOF           The end of the file has been reached.  In the case of           
ea_previous_record(), the previous record could not be reached,
           either because the head of the file was encountered or because
           the previous record could not be skipped over.
USAGE
       The 
exacct file format can be used to represent data other than that
       in the extended accounting format.  By using a unique creator type in
       the file header, application writers can develop their own format
       suited to the needs of their application.
EXAMPLES
       Example 1: Open and close exacct file.
       The following example opens the extended accounting data file for
       processes.  The 
exacct file is then closed.
         #include <stdio.h>
         #include <exacct.h>
         ea_file_t ef;
         ea_object_t *obj;
         ...
         ea_open(&ef, "foo", O_RDONLY, ...);
         while ((obj = ea_get_object_tree(&ef, 1)) != NULL) {
             if (obj->eo_type == EO_ITEM) {
                 /* handle item */
             } else {
                 /* handle group */
             }
             ea_free_object(obj, EUP_ALLOC);
         }
         if (ea_error() != EXR_EOF) {
             /* handle error */
         }
         ea_close(&ef);
       Example 2: Construct an exacct file consisting of a single object
       containing the current process ID.
         #include <sys/types.h>
         #include <unistd.h>
         #include <exacct.h>
         ...
         ea_file_t ef;
         ea_object_t obj;
         pid_t my_pid;
         ea_open(&ef, "foo", O_CREAT | O_WRONLY, ...);
         my_pid = getpid();
         ea_set_item(&obj, EXT_UINT32 | EXC_DEFAULT | EXT_PROC_PID, &my_pid, 0);
         (void) ea_write_object(&ef, &obj);
         ea_close(&ef);
         ...
ATTRIBUTES
       See 
attributes(7) for descriptions of the following attributes:
       +--------------------+-----------------+
       |  ATTRIBUTE TYPE    | ATTRIBUTE VALUE |
       +--------------------+-----------------+
       |Interface Stability | Committed       |
       +--------------------+-----------------+
       |MT-Level            | MT-Safe         |
       +--------------------+-----------------+
SEE ALSO
       read(2), 
ea_error(3EXACCT), 
ea_open(3EXACCT), 
ea_set_item(3EXACCT),       
libexacct(3LIB), 
attributes(7)                               October 4, 2007       EA_PACK_OBJECT(3EXACCT)