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; }
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; }
static int foreachAugeasNode(augeas *handle, const char *treePath, ForeachAugNodeClb callback, void *callbackData) { char *matchPath; asprintf (&matchPath, "%s/*", treePath); /* must be non NULL for aug_match to return matches */ char **matches = (char **) 1; int numMatches = aug_match (handle, matchPath, &matches); free (matchPath); if (numMatches < 0) return numMatches; int i; int result = 0; for (i = 0; i < numMatches; i++) { /* retrieve the value from augeas */ char *curPath = matches[i]; result = (*callback) (handle, curPath, callbackData); /* handle the subtree */ result = foreachAugeasNode (handle, curPath, callback, callbackData); if (result < 0) break; free (curPath); } for (; i < numMatches; i++) { free (matches[i]); } free (matches); return result; }