SCF_TRANSACTION_CREATE(3SCF)
Service Configuration Facility Library Functions
NAME
scf_transaction_create, scf_transaction_handle,
scf_transaction_reset, scf_transaction_reset_all,
scf_transaction_destroy, scf_transaction_destroy_children,
scf_transaction_start, scf_transaction_property_delete,
scf_transaction_property_new, scf_transaction_property_change,
scf_transaction_property_change_type, scf_transaction_commit - create
and manipulate transaction in the Service Configuration Facility
SYNOPSIS
cc [
flag... ]
file...
-lscf [
library... ]
#include <libscf.h>
scf_transaction_t *scf_transaction_create(
scf_handle_t *handle);
scf_handle_t *scf_transaction_handle(
scf_transaction_t *tran);
void scf_transaction_reset(
scf_transaction_t *tran);
void scf_transaction_reset_all(
scf_transaction_t *tran);
void scf_transaction_destroy(
scf_transaction_t *tran);
void scf_transaction_destroy_children(
scf_transaction_t *tran);
int scf_transaction_start(
scf_transaction_t *tran,
scf_propertygroup_t *pg);
int scf_transaction_property_delete(
scf_transaction_t *tran,
scf_transaction_entry_t *entry,
const char *prop_name);
int scf_transaction_property_new(
scf_transaction_t *tran,
scf_transaction_entry_t *entry,
const char *prop_name,
scf_type_t type);
int scf_transaction_property_change(
scf_transaction_t *tran,
scf_transaction_entry_t *entry,
const char *prop_name,
scf_type_t type);
int scf_transaction_property_change_type(
scf_transaction_t *tran,
scf_transaction_entry_t *entry,
const char *prop_name,
scf_type_t type);
int scf_transaction_commit(
scf_transaction_t *tran);
DESCRIPTION
Transactions are the mechanism for changing property groups. They act
atomically, whereby either all of the updates occur or none of them
do. An
scf_transaction_t is always in one of the following states:
reset The initial state. A successful return of
scf_transaction_start() moves the transaction to the
started state.
started The transaction has started. The
scf_transaction_property_delete(),
scf_transaction_property_new(),
scf_transaction_property_change(), and
scf_transaction_property_change_type() functions can be
used to set up changes to properties. The
scf_transaction_reset() and
scf_transaction_reset_all() functions return the transaction to the reset state.
committed A call to
scf_transaction_commit() (whether or not it is
successful) moves the transaction to the committed
state. Modifying, resetting, or destroying the entries
and values associated with a transaction will move it to
the invalid state.
invalid The
scf_transaction_reset() and
scf_transaction_reset_all() functions return the
transaction to the reset state.
The
scf_transaction_create() function allocates and initializes an
scf_transaction_t bound to
handle. The
scf_transaction_destroy() function resets, destroys, and frees
tran. If there are any entries
associated with the transaction,
scf_transaction_destroy() also
effects a call to
scf_transaction_reset(). The
scf_transaction_destroy_children() function resets, destroys, and
frees all entries and values associated the transaction.
The
scf_transaction_handle() function gets the handle to which
tran is bound.
The
scf_transaction_start() function sets up the transaction to
modify the property group to which
pg is set. The time reference used
by
pg becomes the basis of the transaction. The transaction fails if
the property group has been modified since the last update of
pg at
the time when
scf_transaction_commit() is called.
The
scf_transaction_property_delete(),
scf_transaction_property_new(),
scf_transaction_property_change(),
and
scf_transaction_property_change_type() functions add a new
transaction entry to the transaction. Each property the transaction
affects must have a unique
scf_transaction_entry_t. Each
scf_transaction_entry_t can be associated with only a single
transaction at a time. These functions all fail if the transaction is
not in the started state,
prop_name is not a valid property name, or
entry is already associated with a transaction. These functions
affect commit and failure as follows:
scf_transaction_property_delete() This function deletes the property
prop_name in the property
group. It fails if
prop_name does not name a property in the
property group.
scf_transaction_property_new() This function adds a new property prop_name to the property group
with a value list of type
type. It fails if
prop_name names an
existing property in the property group.
scf_transaction_property_change() This function changes the value list for an existing property
prop_name in the property group. It fails if
prop_name does not
name an existing property in the property group or names an
existing property with a different type.
scf_transaction_property_change_type() This function changes the value list and type for an existing
property
prop_name in the property group. It fails if
prop_name does not name an existing property in the property group.
If the function call is successful,
entry remains active in the
transaction until
scf_transaction_destroy(),
scf_transaction_reset(),
or
scf_transaction_reset_all() is called. The
scf_entry_add_value(3SCF) manual page provides information for
setting up the value list for entries that are not associated with
scf_transaction_property_delete(). Resetting or destroying an entry
or value active in a transaction will move it into the invalid state.
The
scf_transaction_commit() function attempts to commit
tran.
The
scf_transaction_reset() function returns the transaction to the
reset state and releases all of the transaction entries that were
added.
The
scf_transaction_reset_all() function returns the transaction to
the reset state, releases all of the transaction entries, and calls
scf_value_reset(3SCF) on all values associated with the entries.
RETURN VALUES
Upon successful completion,
scf_transaction_create() returns a new
scf_transaction_t. Otherwise, it returns
NULL.
Upon successful completion,
scf_transaction_handle() returns the
handle associated with the transaction. Otherwise, it returns
NULL.
Upon successful completion,
scf_transaction_start(),
scf_transaction_property_delete(),
scf_transaction_property_new(),
scf_transaction_property_change(), and
scf_transaction_property_change_type() return 0. Otherwise, they
return -1.
The
scf_transaction_commit() function returns 1 upon successful
commit, 0 if the property group set in
scf_transaction_start() is not
the most recent, and -1 on failure.
ERRORS
The
scf_transaction_create() function will fail if:
SCF_ERROR_INVALID_ARGUMENT The value of the
handle argument is
NULL.
SCF_ERROR_NO_MEMORY There is not enough memory to allocate
an
scf_transaction_t.
SCF_ERROR_NO_RESOURCES The server does not have adequate
resources for a new transaction handle.
The
scf_transaction_handle() function will fail if:
SCF_ERROR_HANDLE_DESTROYED The handle associated with
tran has
been destroyed.
The
scf_transaction_start() function will fail if:
SCF_ERROR_BACKEND_ACCESS The repository backend refused the modification.
SCF_ERROR_BACKEND_READONLY The repository backend refused modification because it is read-
only.
SCF_ERROR_CONNECTION_BROKEN The connection to the repository was lost.
SCF_ERROR_DELETED The property group has been deleted.
SCF_ERROR_HANDLE_MISMATCH The transaction and property group are not derived from the same
handle.
SCF_ERROR_IN_USE The transaction is not in the
reset state. The
scf_transaction_reset() and
scf_transaction_reset_all() functions
can be used to return the transaction to the
reset state.
SCF_ERROR_NO_RESOURCES The server does not have the resources to complete the request.
SCF_ERROR_NOT_BOUND The handle was never bound or has been unbound.
SCF_ERROR_NOT_SET The property group specified by
pg is not set.
SCF_ERROR_PERMISSION_DENIED The user does not have sufficient privileges to modify the
property group.
The
scf_transaction_property_delete(),
scf_transaction_property_new(),
scf_transaction_property_change(),
and
scf_transaction_property_change_type() functions will fail if:
SCF_ERROR_BACKEND_ACCESS The storage mechanism that the repository server
(
svc.configd(8)) chose for the operation denied access.
SCF_ERROR_CONNECTION_BROKEN The connection to the repository was lost.
SCF_ERROR_DELETED The property group the transaction is changing has been deleted.
SCF_ERROR_HANDLE_MISMATCH The transaction and entry are not derived from the same handle.
SCF_ERROR_IN_USE The property already has an entry in the transaction.
SCF_ERROR_INTERNAL An internal error occurred.
SCF_ERROR_INVALID_ARGUMENT The
prop_name argument is not a valid property name.
SCF_ERROR_NO_RESOURCES The server does not have the resources to complete the request.
SCF_ERROR_NOT_BOUND The handle is not bound.
SCF_ERROR_NOT_SET The transaction has not been started.
SCF_ERROR_TYPE_MISMATCH The
tran argument is not of a type compatible with
type.
The
scf_transaction_property_delete(),
scf_transaction_property_change(), and
scf_transaction_property_change_type() functions will fail if:
SCF_ERROR_EXISTS The object already exists.
SCF_ERROR_NOT_FOUND The property group does not contain a property
named
prop_name.
The
scf_transaction_property_new() ,
scf_transaction_property_change(), and
scf_transaction_property_change_type() functions will fail if:
SCF_ERROR_INVALID_ARGUMENT The
prop_name argument is not not a
valid property name, or the
type argument is an invalid type.
The
scf_transaction_property_new() function will fail if:
SCF_ERROR_EXISTS The property group already contains a property
named
prop_name.
SCF_ERROR_NOT_FOUND Nothing of that name was found.
The
scf_transaction_property_change() function will fail if:
SCF_ERROR_TYPE_MISMATCH The property
prop_name is not of type
type.
The
scf_transaction_commit() function will fail if:
SCF_ERROR_BACKEND_READONLY The repository backend is read-only.
SCF_ERROR_BACKEND_ACCESS The repository backend refused the modification.
SCF_ERROR_NOT_BOUND The handle is not bound.
SCF_ERROR_CONNECTION_BROKEN The connection to the repository was lost.
SCF_ERROR_INVALID_ARGUMENT The transaction is in an invalid state.
SCF_ERROR_DELETED The property group the transaction is acting on has been deleted.
SCF_ERROR_NOT_SET The transaction has not been started.
SCF_ERROR_PERMISSION_DENIED The user does not have sufficient privileges to modify the
property group.
SCF_ERROR_NO_RESOURCES The server does not have sufficient resources to commit the
transaction.
The
scf_error(3SCF) function can be used to retrieve the error value.
EXAMPLES
Example 1: Set an existing boolean value to true.
tx = scf_transaction_create(handle);
e1 = scf_entry_create(handle);
v1 = scf_value_create(handle);
do {
if (scf_pg_update(pg) == -1)
goto fail;
if (scf_transaction_start(tx, pg) == -1)
goto fail;
/* set up transaction entries */
if (scf_transaction_property_change(tx, e1, "property",
SCF_TYPE_BOOLEAN) == -1) {
scf_transaction_reset(tx);
goto fail;
}
scf_value_set_boolean(v1, 1);
scf_entry_add_value(e1, v1);
result = scf_transaction_commit(tx);
scf_transaction_reset(tx);
} while (result == 0);
if (result < 0)
goto fail;
/* success */
cleanup:
scf_transaction_destroy(tx);
scf_entry_destroy(e1);
scf_value_destroy(v1);
ATTRIBUTES
See
attributes(7) for descriptions of the following attributes:
+--------------------+-----------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-----------------+
|Interface Stability | Committed |
+--------------------+-----------------+
|MT-Level | Safe |
+--------------------+-----------------+
SEE ALSO
libscf(3LIB),
scf_error(3SCF),
scf_pg_create(3SCF),
scf_value_reset(3SCF),
attributes(7) August 28, 2007 SCF_TRANSACTION_CREATE(3SCF)