X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=daemon%2Faugeas.c;h=3595f8dd38c0a4d7777ab054160d4512b060c09c;hb=2a42bec2c5ee521f29179a5aab713f5a9ca2c3b8;hp=2b273875a233cf55dcd99d47b74edf39e8255cfe;hpb=e7eca50046e9a69dac27c0bee832af0a3014e02c;p=libguestfs.git diff --git a/daemon/augeas.c b/daemon/augeas.c index 2b27387..3595f8d 100644 --- a/daemon/augeas.c +++ b/daemon/augeas.c @@ -57,7 +57,7 @@ do_aug_init (const char *root, int flags) aug = NULL; } - len = strlen (root) + 8; + len = strlen (root) + 9; buf = malloc (len); if (!buf) { reply_with_perror ("malloc"); @@ -90,6 +90,7 @@ do_aug_close (void) int do_aug_defvar (const char *name, const char *expr) { +#ifdef HAVE_AUG_DEFVAR int r; NEED_AUG (-1); @@ -100,11 +101,16 @@ do_aug_defvar (const char *name, const char *expr) return -1; } return r; +#else + reply_with_error ("aug_defvar is not available"); + return -1; +#endif } guestfs_aug_defnode_ret * do_aug_defnode (const char *name, const char *expr, const char *val) { +#ifdef HAVE_AUG_DEFNODE static guestfs_aug_defnode_ret r; int created; @@ -117,6 +123,10 @@ do_aug_defnode (const char *name, const char *expr, const char *val) } r.created = created; return &r; +#else + reply_with_error ("aug_defvar is not available"); + return NULL; +#endif } char * @@ -267,6 +277,7 @@ do_aug_save (void) int do_aug_load (void) { +#ifdef HAVE_AUG_LOAD NEED_AUG (-1); if (aug_load (aug) == -1) { @@ -275,4 +286,51 @@ do_aug_load (void) } return 0; +#else + reply_with_error ("aug_load is not available"); + return -1; +#endif +} + +/* Simpler version of aug-match, which also sorts the output. */ +char ** +do_aug_ls (const char *path) +{ + char **matches; + char *buf; + int len; + + NEED_AUG (NULL); + + ABS_PATH (path, NULL); + + len = strlen (path); + + if (len > 1 && + (path[len-1] == '/' || path[len-1] == ']' || path[len-1] == '*')) { + reply_with_error ("don't use aug-ls with a path that ends with / ] *"); + return NULL; + } + + if (len == 1) + /* we know path must be "/" because of ABS_PATH above */ + matches = do_aug_match ("/"); + else { + len += 3; /* / * + terminating \0 */ + buf = malloc (len); + if (buf == NULL) { + reply_with_perror ("malloc"); + return NULL; + } + + snprintf (buf, len, "%s/*", path); + matches = do_aug_match (buf); + free (buf); + } + + if (matches == NULL) + return NULL; /* do_aug_match has already sent the error */ + + sort_strings (matches, count_strings (matches)); + return matches; /* Caller frees. */ }