/** * Gets statistics regarding a policy's attributes. * If this function is given a name, it will attempt to * get statistics about a particular attribute; otherwise * the function gets statistics about all of the policy's * attributes. * * @param name Reference to an attribute's name; if NULL, * all object classes will be considered * @param policydb Reference to a policy * * @return 0 on success, < 0 on error. */ static PyObject* get_attribs(const char *name, const apol_policy_t * policydb) { PyObject *obj; apol_attr_query_t *attr_query = NULL; apol_vector_t *v = NULL; const qpol_type_t *type_datum = NULL; size_t n_attrs, i; int error = 0; int rt = 0; PyObject *list = PyList_New(0); if (!list) goto err; /* we are only getting information about 1 attribute */ if (name != NULL) { attr_query = apol_attr_query_create(); if (!attr_query) goto err; if (apol_attr_query_set_attr(policydb, attr_query, name)) goto err; if (apol_attr_get_by_query(policydb, attr_query, &v)) goto err; apol_attr_query_destroy(&attr_query); if (apol_vector_get_size(v) == 0) { apol_vector_destroy(&v); errno = EINVAL; goto err; } type_datum = apol_vector_get_element(v, (size_t) 0); obj = get_attr(type_datum, policydb); rt = py_append_obj(list, obj); Py_DECREF(obj); if (rt) goto err; } else { attr_query = apol_attr_query_create(); if (!attr_query) goto err; if (apol_attr_get_by_query(policydb, attr_query, &v)) goto err; apol_attr_query_destroy(&attr_query); n_attrs = apol_vector_get_size(v); for (i = 0; i < n_attrs; i++) { /* get qpol_type_t* item from vector */ type_datum = (qpol_type_t *) apol_vector_get_element(v, (size_t) i); if (!type_datum) goto err; obj = get_attr(type_datum, policydb); rt = py_append_obj(list, obj); Py_DECREF(obj); if (rt) goto err; } } apol_vector_destroy(&v); goto cleanup; err: error = errno; PyErr_SetString(PyExc_RuntimeError,strerror(errno)); py_decref(list); list = NULL; cleanup: apol_attr_query_destroy(&attr_query); apol_vector_destroy(&v); errno = error; return list; }
return -1; } fn_struct->fn = find_domains_get_list; apol_vector_append(mod->functions, fn_struct); return 0; } int find_domains_init(sechk_module_t * mod, apol_policy_t * policy, void *arg __attribute__ ((unused))) { sechk_name_value_t *opt = NULL; find_domains_data_t *datum = NULL; size_t i, j; qpol_type_t *attr = NULL; apol_vector_t *attr_vector = NULL; apol_attr_query_t *attr_query = apol_attr_query_create(); qpol_policy_t *q = apol_policy_get_qpol(policy); if (!mod || !policy) { ERR(policy, "%s", "Invalid parameters"); errno = EINVAL; return -1; } if (strcmp(mod_name, mod->name)) { ERR(policy, "Wrong module (%s)", mod->name); errno = EINVAL; return -1; } datum = find_domains_data_new(); if (!datum) {