static void _npf_ruleset_transform1(prop_array_t rlset, prop_array_t rules) { prop_object_iterator_t it; prop_dictionary_t rldict; prop_array_t subrlset; it = prop_array_iterator(rules); while ((rldict = prop_object_iterator_next(it)) != NULL) { unsigned idx; /* Add rules to the array (reference is retained). */ prop_array_add(rlset, rldict); subrlset = prop_dictionary_get(rldict, "subrules"); if (subrlset) { /* Process subrules recursively. */ _npf_ruleset_transform1(rlset, subrlset); /* Add the skip-to position. */ idx = prop_array_count(rlset); prop_dictionary_set_uint32(rldict, "skip-to", idx); prop_dictionary_remove(rldict, "subrules"); } } prop_object_iterator_release(it); }
int quota_handle_cmd(struct mount *mp, struct lwp *l, prop_dictionary_t cmddict) { int error = 0; const char *cmd, *type; prop_array_t datas; int q2type; if (!prop_dictionary_get_cstring_nocopy(cmddict, "command", &cmd)) return EINVAL; if (!prop_dictionary_get_cstring_nocopy(cmddict, "type", &type)) return EINVAL; if (!strcmp(type, QUOTADICT_CLASS_USER)) { q2type = USRQUOTA; } else if (!strcmp(type, QUOTADICT_CLASS_GROUP)) { q2type = GRPQUOTA; } else return EOPNOTSUPP; datas = prop_dictionary_get(cmddict, "data"); if (datas == NULL || prop_object_type(datas) != PROP_TYPE_ARRAY) return EINVAL; prop_object_retain(datas); prop_dictionary_remove(cmddict, "data"); /* prepare for return */ if (strcmp(cmd, "get version") == 0) { error = quota_handle_cmd_get_version(mp, l, cmddict, datas); goto end; } if (strcmp(cmd, "quotaon") == 0) { error = quota_handle_cmd_quotaon(mp, l, cmddict, q2type, datas); goto end; } if (strcmp(cmd, "quotaoff") == 0) { error = quota_handle_cmd_quotaoff(mp, l, cmddict, q2type, datas); goto end; } if (strcmp(cmd, "get") == 0) { error = quota_handle_cmd_get(mp, l, cmddict, q2type, datas); goto end; } if (strcmp(cmd, "set") == 0) { error = quota_handle_cmd_set(mp, l, cmddict, q2type, datas); goto end; } if (strcmp(cmd, "getall") == 0) { error = quota_handle_cmd_getall(mp, l, cmddict, q2type, datas); goto end; } if (strcmp(cmd, "clear") == 0) { error = quota_handle_cmd_clear(mp, l, cmddict, q2type, datas); goto end; } error = EOPNOTSUPP; end: error = (prop_dictionary_set_int8(cmddict, "return", error) ? 0 : ENOMEM); prop_object_release(datas); return error; }
void udev_read_event(int fd) { struct pdev_array_entry *pae; prop_dictionary_t dict, evdict, devdict; prop_number_t pn; prop_string_t ps; prop_object_t po; prop_array_t pa; char *xml; int n, idx, evtype; size_t sz; sz = 4096 * 1024; xml = malloc(sz); /* 4 MB */ again: if ((n = read(fd, xml, sz)) <= 0) { if (errno == ENOMEM) { sz <<= 2; if ((xml = realloc(xml, sz)) == NULL) { syslog(LOG_ERR, "could not realloc xml memory"); return; } goto again; } free(xml); return; } dict = prop_dictionary_internalize(xml); free(xml); if (dict == NULL) { syslog(LOG_ERR, "internalization of xml failed"); return; } pn = prop_dictionary_get(dict, "evtype"); if (pn == NULL) { syslog(LOG_ERR, "read_event: no key evtype"); goto out; } evtype = prop_number_integer_value(pn); evdict = prop_dictionary_get(dict, "evdict"); if (evdict == NULL) { syslog(LOG_ERR, "read_event: no key evdict"); goto out; } switch (evtype) { case UDEV_EVENT_ATTACH: monitor_queue_event(dict); pae = pdev_array_entry_get_last(); pa = prop_array_copy(pae->pdev_array); pdev_array_entry_unref(pae); if (pa == NULL) goto out; prop_array_add(pa, evdict); pdev_array_entry_insert(pa); break; case UDEV_EVENT_DETACH: monitor_queue_event(dict); if ((devdict = find_dev_dict(-1, evdict, &idx)) == NULL) goto out; pae = pdev_array_entry_get_last(); pa = prop_array_copy(pae->pdev_array); pdev_array_entry_unref(pae); if (pa == NULL) goto out; prop_array_remove(pa, idx); pdev_array_entry_insert(pa); break; case UDEV_EV_KEY_UPDATE: if ((devdict = find_dev_dict(-1, evdict, NULL)) == NULL) goto out; if ((ps = prop_dictionary_get(evdict, "key")) == NULL) goto out; if ((po = prop_dictionary_get(evdict, "value")) == NULL) goto out; /* prop_object_retain(po); */ /* not necessary afaik */ prop_dictionary_set(devdict, prop_string_cstring_nocopy(ps), po); break; case UDEV_EV_KEY_REMOVE: if ((devdict = find_dev_dict(-1, evdict, NULL)) == NULL) goto out; if ((ps = prop_dictionary_get(evdict, "key")) == NULL) goto out; prop_dictionary_remove(devdict, prop_string_cstring_nocopy(ps)); break; default: syslog(LOG_ERR, "read_event: unknown evtype %d", evtype); } out: prop_object_release(dict); return; }