From 2089f7a21a307402c3efa43e5d10ee8d5ff554fb Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Sat, 10 Aug 2013 12:39:40 +0100 Subject: [PATCH] daemon: ldm: Don't return an error if /dev/mapper doesn't exist. --- daemon/daemon.h | 2 ++ daemon/guestfsd.c | 14 ++++++++++++-- daemon/ldm.c | 23 +++++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/daemon/daemon.h b/daemon/daemon.h index 273c8353a..b3ee98461 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -105,6 +105,8 @@ extern char *join_strings (const char *separator, char *const *argv); extern char **split_lines (char *str); +extern char **empty_list (void); + #define command(out,err,name,...) commandf((out),(err),0,(name),__VA_ARGS__) #define commandr(out,err,name,...) commandrf((out),(err),0,(name),__VA_ARGS__) #define commandv(out,err,argv) commandvf((out),(err),0,(argv)) diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index 19f2c57f2..f1ed658b4 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -1019,7 +1019,7 @@ split_lines (char *str) char *p, *pend; if (STREQ (str, "")) - goto empty_list; + return empty_list (); p = str; while (p) { @@ -1040,13 +1040,23 @@ split_lines (char *str) p = pend; } - empty_list: if (end_stringsbuf (&lines) == -1) return NULL; return lines.argv; } +char ** +empty_list (void) +{ + DECLARE_STRINGSBUF (ret); + + if (end_stringsbuf (&ret) == -1) + return NULL; + + return ret.argv; +} + /* Skip leading and trailing whitespace, updating the original string * in-place. */ diff --git a/daemon/ldm.c b/daemon/ldm.c index b7ef30118..aed8a0df9 100644 --- a/daemon/ldm.c +++ b/daemon/ldm.c @@ -20,6 +20,9 @@ #include #include +#include +#include +#include #include #if HAVE_YAJL @@ -91,6 +94,16 @@ get_devices (const char *pattern) char ** do_list_ldm_volumes (void) { + struct stat buf; + + /* If /dev/mapper doesn't exist at all, don't give an error. */ + if (stat ("/dev/mapper", &buf) == -1) { + if (errno == ENOENT) + return empty_list (); + reply_with_perror ("/dev/mapper"); + return NULL; + } + return get_devices ("/dev/mapper/ldm_vol_*"); } @@ -98,6 +111,16 @@ do_list_ldm_volumes (void) char ** do_list_ldm_partitions (void) { + struct stat buf; + + /* If /dev/mapper doesn't exist at all, don't give an error. */ + if (stat ("/dev/mapper", &buf) == -1) { + if (errno == ENOENT) + return empty_list (); + reply_with_perror ("/dev/mapper"); + return NULL; + } + return get_devices ("/dev/mapper/ldm_part_*"); }