X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Faugeas.c;h=a9ad91ff2768cf4552885e7d355b0fe1810a819e;hp=79d41a46bcdc2b38fd39525f6886cb197c6eb419;hb=dc706a639eec16084c0618baf7bfde00c6565f63;hpb=78029b529ad98769685d607230b70f71832d5906 diff --git a/daemon/augeas.c b/daemon/augeas.c index 79d41a4..a9ad91f 100644 --- a/daemon/augeas.c +++ b/daemon/augeas.c @@ -29,6 +29,7 @@ #include "daemon.h" #include "actions.h" +#include "optgroups.h" #ifdef HAVE_AUGEAS /* The Augeas handle. We maintain a single handle per daemon, which @@ -36,7 +37,6 @@ * considerably. */ static augeas *aug = NULL; -#endif #define NEED_AUG(errcode) \ do { \ @@ -47,16 +47,26 @@ static augeas *aug = NULL; } \ while (0) +int +optgroup_augeas_available (void) +{ + return 1; +} +#else /* !HAVE_AUGEAS */ +int +optgroup_augeas_available (void) +{ + return 0; +} +#endif + /* We need to rewrite the root path so it is based at /sysroot. */ int -do_aug_init (char *root, int flags) +do_aug_init (const char *root, int flags) { #ifdef HAVE_AUGEAS char *buf; - NEED_ROOT (-1); - ABS_PATH (root, -1); - if (aug) { aug_close (aug); aug = NULL; @@ -78,8 +88,7 @@ do_aug_init (char *root, int flags) return 0; #else - reply_with_error ("%s is not available", __func__); - return -1; + NOT_AVAILABLE (-1); #endif } @@ -94,13 +103,12 @@ do_aug_close (void) return 0; #else - reply_with_error ("%s is not available", __func__); - return -1; + NOT_AVAILABLE (-1); #endif } int -do_aug_defvar (char *name, char *expr) +do_aug_defvar (const char *name, const char *expr) { #ifdef HAVE_AUG_DEFVAR int r; @@ -114,13 +122,12 @@ do_aug_defvar (char *name, char *expr) } return r; #else - reply_with_error ("%s is not available", __func__); - return -1; + NOT_AVAILABLE (-1); #endif } guestfs_int_int_bool * -do_aug_defnode (char *name, char *expr, char *val) +do_aug_defnode (const char *name, const char *expr, const char *val) { #ifdef HAVE_AUG_DEFNODE static guestfs_int_int_bool r; @@ -136,13 +143,12 @@ do_aug_defnode (char *name, char *expr, char *val) r.b = created; return &r; #else - reply_with_error ("%s is not available", __func__); - return NULL; + NOT_AVAILABLE (NULL); #endif } char * -do_aug_get (char *path) +do_aug_get (const char *path) { #ifdef HAVE_AUGEAS const char *value = NULL; @@ -179,13 +185,12 @@ do_aug_get (char *path) return v; /* Caller frees. */ #else - reply_with_error ("%s is not available", __func__); - return NULL; + NOT_AVAILABLE (NULL); #endif } int -do_aug_set (char *path, char *val) +do_aug_set (const char *path, const char *val) { #ifdef HAVE_AUGEAS int r; @@ -200,13 +205,32 @@ do_aug_set (char *path, char *val) return 0; #else - reply_with_error ("%s is not available", __func__); - return -1; + NOT_AVAILABLE (-1); +#endif +} + +int +do_aug_clear (const char *path) +{ +#ifdef HAVE_AUGEAS + int r; + + NEED_AUG (-1); + + r = aug_set (aug, path, NULL); + if (r == -1) { + reply_with_error ("Augeas clear failed"); + return -1; + } + + return 0; +#else + NOT_AVAILABLE (-1); #endif } int -do_aug_insert (char *path, char *label, int before) +do_aug_insert (const char *path, const char *label, int before) { #ifdef HAVE_AUGEAS int r; @@ -221,13 +245,12 @@ do_aug_insert (char *path, char *label, int before) return 0; #else - reply_with_error ("%s is not available", __func__); - return -1; + NOT_AVAILABLE (-1); #endif } int -do_aug_rm (char *path) +do_aug_rm (const char *path) { #ifdef HAVE_AUGEAS int r; @@ -242,13 +265,12 @@ do_aug_rm (char *path) return r; #else - reply_with_error ("%s is not available", __func__); - return -1; + NOT_AVAILABLE (-1); #endif } int -do_aug_mv (char *src, char *dest) +do_aug_mv (const char *src, const char *dest) { #ifdef HAVE_AUGEAS int r; @@ -263,13 +285,12 @@ do_aug_mv (char *src, char *dest) return 0; #else - reply_with_error ("%s is not available", __func__); - return -1; + NOT_AVAILABLE (-1); #endif } char ** -do_aug_match (char *path) +do_aug_match (const char *path) { #ifdef HAVE_AUGEAS char **matches = NULL; @@ -298,8 +319,7 @@ do_aug_match (char *path) return matches; /* Caller frees. */ #else - reply_with_error ("%s is not available", __func__); - return NULL; + NOT_AVAILABLE (NULL); #endif } @@ -316,8 +336,7 @@ do_aug_save (void) return 0; #else - reply_with_error ("%s is not available", __func__); - return -1; + NOT_AVAILABLE (-1); #endif } @@ -334,14 +353,13 @@ do_aug_load (void) return 0; #else - reply_with_error ("%s is not available", __func__); - return -1; + NOT_AVAILABLE (-1); #endif } /* Simpler version of aug-match, which also sorts the output. */ char ** -do_aug_ls (char *path) +do_aug_ls (const char *path) { #ifdef HAVE_AUGEAS char **matches; @@ -350,7 +368,9 @@ do_aug_ls (char *path) NEED_AUG (NULL); - ABS_PATH (path, NULL); + /* Note that path might also be a previously defined variable + * (defined with aug_defvar). See RHBZ#580016. + */ len = strlen (path); @@ -360,9 +380,8 @@ do_aug_ls (char *path) return NULL; } - if (len == 1) - /* we know path must be "/" because of ABS_PATH above */ - matches = do_aug_match ("/"); + if (STREQ (path, "/")) + matches = do_aug_match ("/*"); else { len += 3; /* / * + terminating \0 */ buf = malloc (len); @@ -379,10 +398,9 @@ do_aug_ls (char *path) if (matches == NULL) return NULL; /* do_aug_match has already sent the error */ - sort_strings (matches, count_strings (matches)); + sort_strings (matches, count_strings ((void *) matches)); return matches; /* Caller frees. */ #else - reply_with_error ("%s is not available", __func__); - return NULL; + NOT_AVAILABLE (NULL); #endif }