static int saveTree (augeas * augeasHandle, KeySet * ks, const char * lensPath, Key * parentKey) { int ret = 0; size_t prefixSize = keyGetNameSize (parentKey) - 1; size_t arraySize = ksGetSize (ks); Key ** keyArray = calloc (ksGetSize (ks), sizeof (Key *)); ret = elektraKsToMemArray (ks, keyArray); if (ret < 0) goto memoryerror; qsort (keyArray, arraySize, sizeof (Key *), keyCmpOrderWrapper); /* convert the Elektra KeySet to an Augeas tree */ for (size_t i = 0; i < arraySize; i++) { Key * key = keyArray[i]; char * nodeName; ret = asprintf (&nodeName, AUGEAS_TREE_ROOT "%s", (keyName (key) + prefixSize)); if (ret < 0) goto memoryerror; aug_set (augeasHandle, nodeName, keyString (key)); elektraFree (nodeName); } elektraFree (keyArray); /* remove keys not present in the KeySet */ struct OrphanSearch * data = elektraMalloc (sizeof (struct OrphanSearch)); if (!data) return -1; data->ks = ks; data->parentKey = parentKey; ret = foreachAugeasNode (augeasHandle, AUGEAS_TREE_ROOT, &removeOrphan, data); elektraFree (data); /* build the tree */ ret = aug_text_retrieve (augeasHandle, lensPath, AUGEAS_CONTENT_ROOT, AUGEAS_TREE_ROOT, AUGEAS_OUTPUT_ROOT); if (ret < 0) { /* report the augeas specific error */ ELEKTRA_SET_ERROR (85, parentKey, getAugeasError (augeasHandle)); } return ret; memoryerror: elektraFree (keyArray); ELEKTRA_SET_ERROR (87, parentKey, "Unable to allocate memory while saving the augeas tree"); return -1; }
/* * call-seq: * text_retrieve(LENS, NODE_IN, PATH, NODE_OUT) -> boolean * * Transform the tree at PATH into a string using lens LENS and store it in * the node NODE_OUT, assuming the tree was initially generated using the * value of node NODE_IN. PATH, NODE_IN, and NODE_OUT are path expressions. */ VALUE augeas_text_retrieve(VALUE s, VALUE lens, VALUE node_in, VALUE path, VALUE node_out) { augeas *aug = aug_handle(s); const char *clens = StringValueCStr(lens); const char *cnode_in = StringValueCStr(node_in); const char *cpath = StringValueCStr(path); const char *cnode_out = StringValueCStr(node_out); int r = aug_text_retrieve(aug, clens, cnode_in, cpath, cnode_out); return (r < 0) ? Qfalse : Qtrue; }
static int saveTree(augeas* augeasHandle, KeySet* ks, const char* lensPath, Key *parentKey) { int ret = 0; size_t prefixSize = keyGetNameSize (parentKey) - 1; size_t arraySize = ksGetSize (ks); Key **keyArray = calloc (ksGetSize(ks), sizeof (Key *)); ret = elektraKsToMemArray (ks, keyArray); if (ret < 0) { free (keyArray); return -1; } qsort (keyArray, arraySize, sizeof(Key *), keyCmpOrderWrapper); /* convert the Elektra KeySet to an Augeas tree */ for (size_t i = 0; i < arraySize; i++) { Key *key = keyArray[i]; char *nodeName; asprintf (&nodeName, AUGEAS_TREE_ROOT "%s", (keyName (key) + prefixSize)); aug_set (augeasHandle, nodeName, keyString (key)); free (nodeName); } free (keyArray); /* remove keys not present in the KeySet */ struct OrphanSearch *data = malloc (sizeof(struct OrphanSearch)); if (!data) return -1; data->ks = ks; data->parentKey = parentKey; foreachAugeasNode (augeasHandle, AUGEAS_TREE_ROOT, &removeOrphan, data); free (data); /* build the tree */ ret = aug_text_retrieve (augeasHandle, lensPath, AUGEAS_CONTENT_ROOT, AUGEAS_TREE_ROOT, AUGEAS_OUTPUT_ROOT); return ret; }