[augeas-devel] augeas: master - * src/augeas.c: create various /augeas nodes when they go missing
David Lutterkort
lutter at fedoraproject.org
Fri Mar 20 18:10:14 UTC 2009
Gitweb: http://git.fedorahosted.org/git/augeas.git?p=augeas.git;a=commitdiff;h=2ec6ba63fe018cafb90f9ac0fe9209fdfad2f123
Commit: 2ec6ba63fe018cafb90f9ac0fe9209fdfad2f123
Parent: 9da198dc2cc2e34929bed67b41aec20054e1a934
Author: David Lutterkort <lutter at redhat.com>
AuthorDate: Thu Mar 19 20:35:46 2009 -0700
Committer: David Lutterkort <lutter at redhat.com>
CommitterDate: Thu Mar 19 20:35:46 2009 -0700
* src/augeas.c: create various /augeas nodes when they go missing
---
src/augeas.c | 76 ++++++++++++++++++++++++++++++++-------------------------
1 files changed, 43 insertions(+), 33 deletions(-)
diff --git a/src/augeas.c b/src/augeas.c
index a6ac078..6d55d80 100644
--- a/src/augeas.c
+++ b/src/augeas.c
@@ -60,6 +60,34 @@ static void tree_clean(struct tree *tree) {
tree->dirty = 0;
}
+static struct tree *tree_child(struct tree *tree, const char *label) {
+ if (tree == NULL)
+ return NULL;
+
+ list_for_each(child, tree->children) {
+ if (streqv(label, child->label))
+ return child;
+ }
+ return NULL;
+}
+
+/* Get first existing child or create one */
+static struct tree *tree_child_cr(struct tree *tree, const char *label) {
+ static struct tree *child = NULL;
+
+ if (tree == NULL)
+ return NULL;
+
+ child = tree_child(tree, label);
+ if (child == NULL) {
+ char *l = strdup(label);
+ if (l == NULL)
+ return NULL;
+ child = tree_append(tree, l, NULL);
+ }
+ return child;
+}
+
/* Parse a path expression. Report errors in /augeas/pathx/error */
static struct pathx *parse_user_pathx(const struct augeas *aug,
const char *path) {
@@ -94,17 +122,6 @@ static struct pathx *parse_user_pathx(const struct augeas *aug,
return NULL;
}
-static struct tree *tree_child(struct tree *tree, const char *label) {
- if (tree == NULL)
- return NULL;
-
- list_for_each(child, tree->children) {
- if (streqv(label, child->label))
- return child;
- }
- return NULL;
-}
-
static const char *init_root(const char *root0) {
char *root;
@@ -136,20 +153,16 @@ struct tree *tree_append(struct tree *parent,
static struct tree *tree_from_transform(struct augeas *aug,
const char *modname,
struct transform *xfm) {
- struct tree *meta = tree_child(aug->origin, "augeas");
+ struct tree *meta = tree_child_cr(aug->origin, "augeas");
struct tree *load = NULL, *txfm = NULL;
char *m = NULL, *q = NULL;
if (meta == NULL)
goto error;
- load = tree_child(meta, "load");
- if (load == NULL) {
- char *l = strdup("load");
- load = tree_append(meta, l, NULL);
- if (load == NULL)
+ load = tree_child_cr(meta, "load");
+ if (load == NULL)
goto error;
- }
if (modname != NULL) {
m = strdup(modname);
if (m == NULL)
@@ -285,13 +298,13 @@ static void tree_unlink_children(struct tree *tree) {
}
int aug_load(struct augeas *aug) {
- struct tree *meta = tree_child(aug->origin, "augeas");
- struct tree *meta_files = tree_child(meta, "files");
- struct tree *files = tree_child(aug->origin, "files");
- struct tree *load = tree_child(meta, "load");
+ struct tree *meta = tree_child_cr(aug->origin, "augeas");
+ struct tree *meta_files = tree_child_cr(meta, "files");
+ struct tree *files = tree_child_cr(aug->origin, "files");
+ struct tree *load = tree_child_cr(meta, "load");
if (load == NULL)
- return 0;
+ return -1;
tree_unlink_children(meta_files);
tree_unlink_children(files);
@@ -646,8 +659,8 @@ int aug_match(const struct augeas *aug, const char *pathin, char ***matches) {
static int tree_save(struct augeas *aug, struct tree *tree,
const char *path) {
int result = 0;
- struct tree *meta = tree_child(aug->origin, "augeas");
- struct tree *load = tree_child(meta, "load");
+ struct tree *meta = tree_child_cr(aug->origin, "augeas");
+ struct tree *load = tree_child_cr(meta, "load");
// FIXME: We need to detect subtrees that aren't saved by anything
@@ -752,20 +765,17 @@ static int unlink_removed_files(struct augeas *aug,
int aug_save(struct augeas *aug) {
int ret = 0;
- struct tree *meta = tree_child(aug->origin, "augeas");
- struct tree *meta_files = tree_child(meta, "files");
- struct tree *files = tree_child(aug->origin, "files");
- struct tree *load = tree_child(meta, "load");
+ struct tree *meta = tree_child_cr(aug->origin, "augeas");
+ struct tree *meta_files = tree_child_cr(meta, "files");
+ struct tree *files = tree_child_cr(aug->origin, "files");
+ struct tree *load = tree_child_cr(meta, "load");
if (update_save_flags(aug) < 0)
return -1;
- if (files == NULL)
+ if (files == NULL || meta == NULL || load == NULL)
return -1;
- if (meta == NULL || load == NULL)
- return 0;
-
aug_rm(aug, AUGEAS_EVENTS_SAVED);
list_for_each(xfm, load->children)
More information about the augeas-devel
mailing list