int classad_get_attribute_names(classad_context cad, char ***results) { if (cad == NULL) return C_CLASSAD_INVALID_CONTEXT; if (results == NULL) return C_CLASSAD_INVALID_ARG; ClassAd *ad = (ClassAd *)cad; int n_results = 0; ClassAd::const_iterator it; for (it = ad->begin(); it != ad->end(); ++it) { n_results++; char **new_results; new_results = (char **)realloc(*results, (n_results+1)*sizeof(char *)); if (new_results == NULL) { return C_CLASSAD_OUT_OF_MEMORY; } (*results) = new_results; (*results)[n_results] = NULL; (*results)[n_results-1] = strdup(it->first.c_str()); if (((*results)[n_results-1]) == NULL) { return C_CLASSAD_OUT_OF_MEMORY; } } return C_CLASSAD_NO_ERROR; }
bool cp_supports_policy(ClassAd& resource, bool strict) { // currently, only p-slots can support a functional consumption policy if (strict) { bool part = false; if (!resource.LookupBool(ATTR_SLOT_PARTITIONABLE, part)) part = false; if (!part) return false; } // must support MachineResources attribute string mrv; if (!resource.LookupString(ATTR_MACHINE_RESOURCES, mrv)) return false; // must define ConsumptionXxx for all resources Xxx (including extensible resources) StringList alist(mrv.c_str()); alist.rewind(); while (char* asset = alist.next()) { if (MATCH == strcasecmp(asset, "swap")) continue; string ca; formatstr(ca, "%s%s", ATTR_CONSUMPTION_PREFIX, asset); ClassAd::iterator f(resource.find(ca)); if (f == resource.end()) return false; } return true; }