X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Faugeas.c;h=79d41a46bcdc2b38fd39525f6886cb197c6eb419;hp=2b273875a233cf55dcd99d47b74edf39e8255cfe;hb=e15ff2113f5b2a7e0aa138c47c14e93268d25aed;hpb=e7eca50046e9a69dac27c0bee832af0a3014e02c diff --git a/daemon/augeas.c b/daemon/augeas.c index 2b27387..79d41a4 100644 --- a/daemon/augeas.c +++ b/daemon/augeas.c @@ -1,5 +1,5 @@ /* libguestfs - the guestfsd daemon - * Copyright (C) 2009 Red Hat Inc. + * Copyright (C) 2009 Red Hat Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,16 +22,21 @@ #include #include #include + +#ifdef HAVE_AUGEAS #include +#endif #include "daemon.h" #include "actions.h" +#ifdef HAVE_AUGEAS /* The Augeas handle. We maintain a single handle per daemon, which * is all that is necessary and reduces the complexity of the API * considerably. */ static augeas *aug = NULL; +#endif #define NEED_AUG(errcode) \ do { \ @@ -44,10 +49,10 @@ static augeas *aug = NULL; /* We need to rewrite the root path so it is based at /sysroot. */ int -do_aug_init (const char *root, int flags) +do_aug_init (char *root, int flags) { +#ifdef HAVE_AUGEAS char *buf; - int len; NEED_ROOT (-1); ABS_PATH (root, -1); @@ -57,13 +62,11 @@ do_aug_init (const char *root, int flags) aug = NULL; } - len = strlen (root) + 8; - buf = malloc (len); + buf = sysroot_path (root); if (!buf) { reply_with_perror ("malloc"); return -1; } - snprintf (buf, len, "/sysroot%s", root); aug = aug_init (buf, NULL, flags); free (buf); @@ -74,22 +77,32 @@ do_aug_init (const char *root, int flags) } return 0; +#else + reply_with_error ("%s is not available", __func__); + return -1; +#endif } int do_aug_close (void) { +#ifdef HAVE_AUGEAS NEED_AUG(-1); aug_close (aug); aug = NULL; return 0; +#else + reply_with_error ("%s is not available", __func__); + return -1; +#endif } int -do_aug_defvar (const char *name, const char *expr) +do_aug_defvar (char *name, char *expr) { +#ifdef HAVE_AUG_DEFVAR int r; NEED_AUG (-1); @@ -100,28 +113,38 @@ do_aug_defvar (const char *name, const char *expr) return -1; } return r; +#else + reply_with_error ("%s is not available", __func__); + return -1; +#endif } -guestfs_aug_defnode_ret * -do_aug_defnode (const char *name, const char *expr, const char *val) +guestfs_int_int_bool * +do_aug_defnode (char *name, char *expr, char *val) { - static guestfs_aug_defnode_ret r; +#ifdef HAVE_AUG_DEFNODE + static guestfs_int_int_bool r; int created; NEED_AUG (NULL); - r.nrnodes = aug_defnode (aug, name, expr, val, &created); - if (r.nrnodes == -1) { + r.i = aug_defnode (aug, name, expr, val, &created); + if (r.i == -1) { reply_with_error ("Augeas defnode failed"); return NULL; } - r.created = created; + r.b = created; return &r; +#else + reply_with_error ("%s is not available", __func__); + return NULL; +#endif } char * -do_aug_get (const char *path) +do_aug_get (char *path) { +#ifdef HAVE_AUGEAS const char *value = NULL; char *v; int r; @@ -155,11 +178,16 @@ do_aug_get (const char *path) } return v; /* Caller frees. */ +#else + reply_with_error ("%s is not available", __func__); + return NULL; +#endif } int -do_aug_set (const char *path, const char *val) +do_aug_set (char *path, char *val) { +#ifdef HAVE_AUGEAS int r; NEED_AUG (-1); @@ -171,11 +199,16 @@ do_aug_set (const char *path, const char *val) } return 0; +#else + reply_with_error ("%s is not available", __func__); + return -1; +#endif } int -do_aug_insert (const char *path, const char *label, int before) +do_aug_insert (char *path, char *label, int before) { +#ifdef HAVE_AUGEAS int r; NEED_AUG (-1); @@ -187,11 +220,16 @@ do_aug_insert (const char *path, const char *label, int before) } return 0; +#else + reply_with_error ("%s is not available", __func__); + return -1; +#endif } int -do_aug_rm (const char *path) +do_aug_rm (char *path) { +#ifdef HAVE_AUGEAS int r; NEED_AUG (-1); @@ -203,11 +241,16 @@ do_aug_rm (const char *path) } return r; +#else + reply_with_error ("%s is not available", __func__); + return -1; +#endif } int -do_aug_mv (const char *src, const char *dest) +do_aug_mv (char *src, char *dest) { +#ifdef HAVE_AUGEAS int r; NEED_AUG (-1); @@ -219,11 +262,16 @@ do_aug_mv (const char *src, const char *dest) } return 0; +#else + reply_with_error ("%s is not available", __func__); + return -1; +#endif } char ** -do_aug_match (const char *path) +do_aug_match (char *path) { +#ifdef HAVE_AUGEAS char **matches = NULL; void *vp; int r; @@ -249,11 +297,16 @@ do_aug_match (const char *path) matches[r] = NULL; return matches; /* Caller frees. */ +#else + reply_with_error ("%s is not available", __func__); + return NULL; +#endif } int do_aug_save (void) { +#ifdef HAVE_AUGEAS NEED_AUG (-1); if (aug_save (aug) == -1) { @@ -262,11 +315,16 @@ do_aug_save (void) } return 0; +#else + reply_with_error ("%s is not available", __func__); + return -1; +#endif } int do_aug_load (void) { +#ifdef HAVE_AUG_LOAD NEED_AUG (-1); if (aug_load (aug) == -1) { @@ -275,4 +333,56 @@ do_aug_load (void) } return 0; +#else + reply_with_error ("%s is not available", __func__); + return -1; +#endif +} + +/* Simpler version of aug-match, which also sorts the output. */ +char ** +do_aug_ls (char *path) +{ +#ifdef HAVE_AUGEAS + 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. */ +#else + reply_with_error ("%s is not available", __func__); + return NULL; +#endif }