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/common | |
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/common')
-rw-r--r-- | usr/src/lib/libscf/common/mapfile-vers | 1 | ||||
-rw-r--r-- | usr/src/lib/libscf/common/midlevel.c | 117 |
2 files changed, 117 insertions, 1 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); +} |