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)