diff options
| author | Truong Nguyen <Truong.Q.Nguyen@Sun.COM> | 2009-02-14 00:35:26 -0800 |
|---|---|---|
| committer | Truong Nguyen <Truong.Q.Nguyen@Sun.COM> | 2009-02-14 00:35:26 -0800 |
| commit | eb1a34638eba7c5add1421327f3eb225a8ea7518 (patch) | |
| tree | 8248473bb88d0ad643e80e3c976123d722e5f944 /usr/src/lib/libscf | |
| parent | f5c9e9f9ca94d949afcf832822366734d6daf6ea (diff) | |
| download | illumos-joyent-eb1a34638eba7c5add1421327f3eb225a8ea7518.tar.gz | |
6761070 PSARC 2008/580 Solaris host-based firewall
6236609 svc.startd resets auxiliary state on svcadm mark maintenance
6762307 SMF - expressing a service's maintenance state by request of another service
Diffstat (limited to 'usr/src/lib/libscf')
| -rw-r--r-- | usr/src/lib/libscf/common/mapfile-vers | 1 | ||||
| -rw-r--r-- | usr/src/lib/libscf/common/midlevel.c | 117 | ||||
| -rw-r--r-- | usr/src/lib/libscf/inc/libscf.h | 4 | ||||
| -rw-r--r-- | usr/src/lib/libscf/inc/libscf_priv.h | 9 |
4 files changed, 128 insertions, 3 deletions
diff --git a/usr/src/lib/libscf/common/mapfile-vers b/usr/src/lib/libscf/common/mapfile-vers index 2859459644..e7517768b1 100644 --- a/usr/src/lib/libscf/common/mapfile-vers +++ b/usr/src/lib/libscf/common/mapfile-vers @@ -312,6 +312,7 @@ SUNWprivate_1.1 { scf_read_propvec; scf_write_propvec; scf_clean_propvec; + scf_instance_delete_prop; local: *; }; diff --git a/usr/src/lib/libscf/common/midlevel.c b/usr/src/lib/libscf/common/midlevel.c index f6ad278eda..a27854e82b 100644 --- a/usr/src/lib/libscf/common/midlevel.c +++ b/usr/src/lib/libscf/common/midlevel.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -2872,3 +2872,118 @@ out: return (SCF_SUCCESS); } + +/* + * Returns + * 0 - success + * ECONNABORTED - repository connection broken + * ECANCELED - inst was deleted + * EPERM + * EACCES + * EROFS + * ENOMEM + */ +int +scf_instance_delete_prop(scf_instance_t *inst, const char *pgname, + const char *pname) +{ + scf_handle_t *h; + scf_propertygroup_t *pg; + scf_transaction_t *tx; + scf_transaction_entry_t *e; + int error = 0, ret = 1, r; + + h = scf_instance_handle(inst); + + if ((pg = scf_pg_create(h)) == NULL) { + return (ENOMEM); + } + + if (scf_instance_get_pg(inst, pgname, pg) != 0) { + error = scf_error(); + scf_pg_destroy(pg); + switch (error) { + case SCF_ERROR_NOT_FOUND: + return (SCF_SUCCESS); + + case SCF_ERROR_DELETED: + return (ECANCELED); + + case SCF_ERROR_CONNECTION_BROKEN: + default: + return (ECONNABORTED); + + case SCF_ERROR_NOT_SET: + bad_error("scf_instance_get_pg", scf_error()); + } + } + + tx = scf_transaction_create(h); + e = scf_entry_create(h); + if (tx == NULL || e == NULL) { + ret = ENOMEM; + goto out; + } + + for (;;) { + if (scf_transaction_start(tx, pg) != 0) { + goto scferror; + } + + if (scf_transaction_property_delete(tx, e, pname) != 0) { + goto scferror; + } + + if ((r = scf_transaction_commit(tx)) == 1) { + ret = 0; + goto out; + } + + if (r == -1) { + goto scferror; + } + + scf_transaction_reset(tx); + if (scf_pg_update(pg) == -1) { + goto scferror; + } + } + +scferror: + switch (scf_error()) { + case SCF_ERROR_DELETED: + case SCF_ERROR_NOT_FOUND: + ret = 0; + break; + + case SCF_ERROR_PERMISSION_DENIED: + ret = EPERM; + break; + + case SCF_ERROR_BACKEND_ACCESS: + ret = EACCES; + break; + + case SCF_ERROR_BACKEND_READONLY: + ret = EROFS; + break; + + case SCF_ERROR_CONNECTION_BROKEN: + default: + ret = ECONNABORTED; + break; + + case SCF_ERROR_HANDLE_MISMATCH: + case SCF_ERROR_INVALID_ARGUMENT: + case SCF_ERROR_NOT_BOUND: + case SCF_ERROR_NOT_SET: + bad_error("scf_instance_delete_prop", scf_error()); + } + +out: + scf_transaction_destroy(tx); + scf_entry_destroy(e); + scf_pg_destroy(pg); + + return (ret); +} diff --git a/usr/src/lib/libscf/inc/libscf.h b/usr/src/lib/libscf/inc/libscf.h index eb303f04df..f3864f03f4 100644 --- a/usr/src/lib/libscf/inc/libscf.h +++ b/usr/src/lib/libscf/inc/libscf.h @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -280,6 +280,8 @@ typedef struct scf_tmpl_error scf_tmpl_error_t; * Standard property names */ #define SCF_PROPERTY_AUX_STATE ((const char *)"auxiliary_state") +#define SCF_PROPERTY_AUX_FMRI ((const char *)"auxiliary_fmri") +#define SCF_PROPERTY_AUX_TTY ((const char *)"auxiliary_tty") #define SCF_PROPERTY_CONTRACT ((const char *)"contract") #define SCF_PROPERTY_COREFILE_PATTERN ((const char *)"corefile_pattern") #define SCF_PROPERTY_DEGRADED ((const char *)"degraded") diff --git a/usr/src/lib/libscf/inc/libscf_priv.h b/usr/src/lib/libscf/inc/libscf_priv.h index 559f647a8e..cfc965e084 100644 --- a/usr/src/lib/libscf/inc/libscf_priv.h +++ b/usr/src/lib/libscf/inc/libscf_priv.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -519,6 +519,13 @@ char *_scf_read_tmpl_prop_type_as_string(const scf_prop_tmpl_t *); */ char *_scf_read_single_astring_from_pg(scf_propertygroup_t *, const char *); +/* + * scf_instance_delete_prop() + * Given instance, property group, and property, delete the property. + */ +int +scf_instance_delete_prop(scf_instance_t *, const char *, const char *); + #ifdef __cplusplus } #endif |
