static void new_property(targ_scf_t *h, tgt_node_t *n) { scf_transaction_entry_t *e = NULL; scf_value_t *v = NULL; scf_type_t type; assert(n != NULL); e = scf_entry_create(h->t_handle); v = scf_value_create(h->t_handle); if (strcmp(n->x_value, "true") == 0 || strcmp(n->x_value, "false") == 0) { type = SCF_TYPE_BOOLEAN; } else if (strcmp(n->x_name, "main") == 0 || strcmp(n->x_name, "radius") == 0) { type = SCF_TYPE_ASTRING; } else if (strncmp(n->x_name, "I_", 2) == 0) { type = SCF_TYPE_ASTRING; } else if (strcmp(n->x_name, XML_ELEMENT_VERS) == 0) { type = SCF_TYPE_ASTRING; } else if (isnumber(n->x_value)) { type = SCF_TYPE_COUNT; } else { type = SCF_TYPE_ASTRING; } scf_transaction_property_new(h->t_trans, e, n->x_name, type); scf_value_set_from_string(v, type, n->x_value); scf_entry_add_value(e, v); }
static int add_new_property(scf_handle_t *handle, const char *prop_name, scf_type_t type, const char *val, scf_transaction_t *tx) { scf_value_t *value = NULL; scf_transaction_entry_t *entry = NULL; int status = FAILURE; entry = scf_entry_create(handle); if (entry == NULL) { KSSL_DEBUG("scf_entry_create failed: %s\n", scf_strerror(scf_error())); goto out; } KSSL_DEBUG("scf_entry_create succeeded\n"); value = scf_value_create(handle); if (value == NULL) { goto out; } KSSL_DEBUG("scf_value_create succeeded\n"); if (scf_transaction_property_new(tx, entry, prop_name, type) != 0) { goto out; } KSSL_DEBUG("scf_transaction_property_new succeeded\n"); if (scf_value_set_from_string(value, type, val) != 0) { goto out; } KSSL_DEBUG("scf_value_set_from_string \'%s\' succeeded\n", val); if (scf_entry_add_value(entry, value) != 0) { KSSL_DEBUG( "scf_entry_add_value failed: %s\n", scf_strerror(scf_error())); goto out; } KSSL_DEBUG("scf_entry_add_value succeeded\n"); status = SUCCESS; out: if (status != SUCCESS) (void) fprintf(stderr, gettext( "Unexpected fatal libscf error: %s. Exiting.\n"), scf_strerror(scf_error())); return (status); }
conerr_t smfu_set_property(char *fmri, char *pgname, char *propname, char *value) { conerr_t err = ce_ok; scf_handle_t *scfhandle = handle_create(); scf_service_t *service = scf_service_create(scfhandle); scf_instance_t *instance = scf_instance_create(scfhandle); scf_propertygroup_t *pg = scf_pg_create(scfhandle); scf_property_t *prop = scf_property_create(scfhandle); scf_value_t *val = scf_value_create(scfhandle); scf_transaction_t *tx = scf_transaction_create(scfhandle); scf_transaction_entry_t *ent = scf_entry_create(scfhandle); scf_type_t type; if (scfhandle == NULL || service == NULL || instance == NULL || pg == NULL || prop == NULL || tx == NULL || ent == NULL || val == NULL) { err = ce_nomem; goto out; } if (scf_handle_decode_fmri(scfhandle, fmri, NULL, service, instance, NULL, NULL, 0) != SCF_SUCCESS) { rad_log(RL_ERROR, "couldn't decode '%s': %s\n", fmri, scf_strerror(scf_error())); err = maperr(scf_error()); goto out; } if (scf_instance_get_pg(instance, pgname, pg) != 0 || scf_pg_get_property(pg, propname, prop) != 0 || scf_property_type(prop, &type) != 0) { rad_log(RL_ERROR, "couldn't get property: '%s/%s/%s': %s\n", fmri, pgname, propname, scf_strerror(scf_error())); err = maperr(scf_error()); goto out; } top: if (scf_transaction_start(tx, pg) == -1 || scf_transaction_property_change(tx, ent, propname, type) != 0 || scf_value_set_from_string(val, type, value) != 0 || scf_entry_add_value(ent, val) != 0) { rad_log(RL_ERROR, "couldn't set property: '%s/%s/%s': %s\n", fmri, pgname, propname, scf_strerror(scf_error())); err = maperr(scf_error()); goto out; } switch (scf_transaction_commit(tx)) { /* success */ case 1: if (smf_refresh_instance(fmri) != 0) { err = maperr(scf_error()); goto out; } break; /* retry */ case 0: if (scf_pg_update(pg) != 0) { err = maperr(scf_error()); goto out; } scf_transaction_reset(tx); goto top; default: err = maperr(scf_error()); goto out; } out: scf_entry_destroy(ent); scf_transaction_destroy(tx); scf_value_destroy(val); scf_property_destroy(prop); scf_pg_destroy(pg); scf_instance_destroy(instance); scf_service_destroy(service); scf_handle_destroy(scfhandle); return (err); }