void internal_service_free(entity_t *s) { entity_t *inst; pgroup_t *pg; void *cookie; if (s->sc_u.sc_service.sc_restarter != NULL) internal_instance_free(s->sc_u.sc_service.sc_restarter); if (s->sc_u.sc_service.sc_global != NULL) internal_instance_free(s->sc_u.sc_service.sc_global); cookie = NULL; while ((pg = uu_list_teardown(s->sc_pgroups, &cookie)) != NULL) internal_pgroup_free(pg); cookie = NULL; while ((pg = uu_list_teardown(s->sc_dependents, &cookie)) != NULL) internal_pgroup_free(pg); cookie = NULL; while ((inst = uu_list_teardown(s->sc_u.sc_service.sc_service_instances, &cookie)) != NULL) internal_instance_free(inst); uu_free((void *)s->sc_fmri); free(s); }
void internal_instance_free(entity_t *i) { pgroup_t *pg; void *cookie = NULL; while ((pg = uu_list_teardown(i->sc_pgroups, &cookie)) != NULL) internal_pgroup_free(pg); cookie = NULL; while ((pg = uu_list_teardown(i->sc_dependents, &cookie)) != NULL) internal_pgroup_free(pg); free(i); }
void internal_instance_free(entity_t *i) { pgroup_t *pg; void *cookie = NULL; entity_t *rs; rs = i->sc_u.sc_instance.sc_instance_restarter; if (rs != NULL) internal_instance_free(rs); while ((pg = uu_list_teardown(i->sc_pgroups, &cookie)) != NULL) internal_pgroup_free(pg); cookie = NULL; while ((pg = uu_list_teardown(i->sc_dependents, &cookie)) != NULL) internal_pgroup_free(pg); uu_free((void *)i->sc_fmri); free(i); }
/* * Returns * 0 - success * ECANCELED - pg was deleted * ECONNABORTED - repository disconnected * ENOMEM - out of memory */ int load_pg_attrs(const scf_propertygroup_t *pg, pgroup_t **ipgp) { pgroup_t *ipg; ipg = internal_pgroup_new(); if (scf_pg_get_flags(pg, &ipg->sc_pgroup_flags) != 0) { switch (scf_error()) { case SCF_ERROR_DELETED: internal_pgroup_free(ipg); return (ECANCELED); case SCF_ERROR_CONNECTION_BROKEN: internal_pgroup_free(ipg); return (ECONNABORTED); case SCF_ERROR_NOT_SET: case SCF_ERROR_NOT_BOUND: default: bad_error("scf_pg_get_name", scf_error()); } } if (scf_pg_get_name(pg, loadbuf, loadbuf_sz) < 0) { switch (scf_error()) { case SCF_ERROR_DELETED: internal_pgroup_free(ipg); return (ECANCELED); case SCF_ERROR_CONNECTION_BROKEN: internal_pgroup_free(ipg); return (ECONNABORTED); case SCF_ERROR_NOT_SET: case SCF_ERROR_NOT_BOUND: default: bad_error("scf_pg_get_name", scf_error()); } } ipg->sc_pgroup_name = strdup(loadbuf); if (ipg->sc_pgroup_name == NULL) { internal_pgroup_free(ipg); return (ENOMEM); } if (scf_pg_get_type(pg, loadbuf, loadbuf_sz) < 0) { switch (scf_error()) { case SCF_ERROR_DELETED: free((char *)ipg->sc_pgroup_name); internal_pgroup_free(ipg); return (ECANCELED); case SCF_ERROR_CONNECTION_BROKEN: free((char *)ipg->sc_pgroup_name); internal_pgroup_free(ipg); return (ECONNABORTED); case SCF_ERROR_NOT_SET: case SCF_ERROR_NOT_BOUND: default: bad_error("scf_pg_get_name", scf_error()); } } ipg->sc_pgroup_type = strdup(loadbuf); if (ipg->sc_pgroup_type == NULL) { free((char *)ipg->sc_pgroup_name); internal_pgroup_free(ipg); return (ENOMEM); } *ipgp = ipg; return (0); }
/* * Load a property group into a pgroup_t. Returns * 0 - success * ECANCELED - pg was deleted * ECONNABORTED - repository disconnected * EBADF - pg is corrupt (error printed if fmri is given) * ENOMEM - out of memory * EACCES - permission denied when reading property */ int load_pg(const scf_propertygroup_t *pg, pgroup_t **ipgp, const char *fmri, const char *snapname) { pgroup_t *ipg; int r; if (scf_iter_pg_properties(load_propiter, pg) != 0) { switch (scf_error()) { case SCF_ERROR_DELETED: return (ECANCELED); case SCF_ERROR_CONNECTION_BROKEN: return (ECONNABORTED); case SCF_ERROR_HANDLE_MISMATCH: case SCF_ERROR_NOT_SET: case SCF_ERROR_NOT_BOUND: default: bad_error("scf_iter_pg_properties", scf_error()); } } r = load_pg_attrs(pg, &ipg); switch (r) { case 0: break; case ECANCELED: case ECONNABORTED: case ENOMEM: return (r); default: bad_error("load_pg_attrs", r); } for (;;) { property_t *iprop; r = scf_iter_next_property(load_propiter, load_prop); if (r == 0) break; if (r != 1) { switch (scf_error()) { case SCF_ERROR_DELETED: r = ECANCELED; goto out; case SCF_ERROR_CONNECTION_BROKEN: r = ECONNABORTED; goto out; case SCF_ERROR_HANDLE_MISMATCH: case SCF_ERROR_NOT_BOUND: case SCF_ERROR_NOT_SET: case SCF_ERROR_INVALID_ARGUMENT: default: bad_error("scf_iter_next_property", scf_error()); } } r = load_property(load_prop, &iprop); switch (r) { case 0: break; case ECANCELED: case ECONNABORTED: case ENOMEM: case EACCES: goto out; default: bad_error("load_property", r); } r = internal_attach_property(ipg, iprop); if (r != 0) { if (fmri != NULL) { if (snapname == NULL) warn(gettext("Property group \"%s\" of " "%s has multiple definitions of " "property \"%s\".\n"), ipg->sc_pgroup_name, fmri, iprop->sc_property_name); else warn(gettext("Property group \"%s\" of " "the \"%s\" snapshot of %s has " "multiple definitions of property " "\"%s\".\n"), ipg->sc_pgroup_name, snapname, fmri, iprop->sc_property_name); } r = EBADF; goto out; } } *ipgp = ipg; return (0); out: internal_pgroup_free(ipg); return (r); }