diff options
author | Richard Jones <rjones@redhat.com> | 2009-04-30 18:57:07 +0100 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2009-04-30 18:57:07 +0100 |
commit | 0703248d233744047515418893dac05ce013a642 (patch) | |
tree | ead0b718136e64b179b9d46f3fc314cdd49f2149 /daemon | |
parent | c69c3695303d5a660ad093a076c2e364ae6061de (diff) | |
download | libguestfs-0703248d233744047515418893dac05ce013a642.tar.gz libguestfs-0703248d233744047515418893dac05ce013a642.tar.xz libguestfs-0703248d233744047515418893dac05ce013a642.zip |
Add generated code for 'fsck' command.
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/actions.h | 1 | ||||
-rw-r--r-- | daemon/daemon.h | 3 | ||||
-rw-r--r-- | daemon/guestfsd.c | 65 | ||||
-rw-r--r-- | daemon/stubs.c | 31 |
4 files changed, 96 insertions, 4 deletions
diff --git a/daemon/actions.h b/daemon/actions.h index 373e513f..74555862 100644 --- a/daemon/actions.h +++ b/daemon/actions.h @@ -104,3 +104,4 @@ extern int do_set_e2label (const char *device, const char *label); extern char *do_get_e2label (const char *device); extern int do_set_e2uuid (const char *device, const char *uuid); extern char *do_get_e2uuid (const char *device); +extern int do_fsck (const char *fstype, const char *device); diff --git a/daemon/daemon.h b/daemon/daemon.h index 3f51056a..001c7038 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -41,8 +41,11 @@ extern void free_strings (char **argv); extern void free_stringslen (char **argv, int len); extern int command (char **stdoutput, char **stderror, const char *name, ...); +extern int commandr (char **stdoutput, char **stderror, const char *name, ...); extern int commandv (char **stdoutput, char **stderror, char * const* const argv); +extern int commandrv (char **stdoutput, char **stderror, + char * const* const argv); extern int shell_quote (char *out, int len, const char *in); diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index ba4035ea..99055a92 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -378,9 +378,69 @@ command (char **stdoutput, char **stderror, const char *name, ...) return r; } +/* Same as 'command', but we allow the status code from the + * subcommand to be non-zero, and return that status code. + * We still return -1 if there was some other error. + */ +int +commandr (char **stdoutput, char **stderror, const char *name, ...) +{ + va_list args; + char **argv, **p; + char *s; + int i, r; + + /* Collect the command line arguments into an array. */ + i = 2; + argv = malloc (sizeof (char *) * i); + if (argv == NULL) { + perror ("malloc"); + return -1; + } + argv[0] = (char *) name; + argv[1] = NULL; + + va_start (args, name); + + while ((s = va_arg (args, char *)) != NULL) { + p = realloc (argv, sizeof (char *) * (++i)); + if (p == NULL) { + perror ("realloc"); + free (argv); + va_end (args); + return -1; + } + argv = p; + argv[i-2] = s; + argv[i-1] = NULL; + } + + va_end (args); + + r = commandrv (stdoutput, stderror, argv); + + /* NB: Mustn't free the strings which are on the stack. */ + free (argv); + + return r; +} + +/* Same as 'command', but passing an argv. */ int commandv (char **stdoutput, char **stderror, char * const* const argv) { + int r; + + r = commandrv (stdoutput, stderror, argv); + if (r == 0) + return 0; + else + return -1; +} + +int +commandrv (char **stdoutput, char **stderror, char * const* const argv) +{ int so_size = 0, se_size = 0; int so_fd[2], se_fd[2]; int pid, r, quit, i; @@ -524,10 +584,7 @@ commandv (char **stdoutput, char **stderror, char * const* const argv) waitpid (pid, &r, 0); if (WIFEXITED (r)) { - if (WEXITSTATUS (r) == 0) - return 0; - else - return -1; + return WEXITSTATUS (r); } else return -1; } diff --git a/daemon/stubs.c b/daemon/stubs.c index 019e4fb2..9e0ce559 100644 --- a/daemon/stubs.c +++ b/daemon/stubs.c @@ -2075,6 +2075,34 @@ done: xdr_free ((xdrproc_t) xdr_guestfs_get_e2uuid_args, (char *) &args); } +static void fsck_stub (XDR *xdr_in) +{ + int r; + struct guestfs_fsck_args args; + const char *fstype; + const char *device; + + memset (&args, 0, sizeof args); + + if (!xdr_guestfs_fsck_args (xdr_in, &args)) { + reply_with_error ("%s: daemon failed to decode procedure arguments", "fsck"); + return; + } + fstype = args.fstype; + device = args.device; + + r = do_fsck (fstype, device); + if (r == -1) + /* do_fsck has already called reply_with_error */ + goto done; + + struct guestfs_fsck_ret ret; + ret.status = r; + reply ((xdrproc_t) &xdr_guestfs_fsck_ret, (char *) &ret); +done: + xdr_free ((xdrproc_t) xdr_guestfs_fsck_args, (char *) &args); +} + void dispatch_incoming_message (XDR *xdr_in) { switch (proc_nr) { @@ -2327,6 +2355,9 @@ void dispatch_incoming_message (XDR *xdr_in) case GUESTFS_PROC_GET_E2UUID: get_e2uuid_stub (xdr_in); break; + case GUESTFS_PROC_FSCK: + fsck_stub (xdr_in); + break; default: reply_with_error ("dispatch_incoming_message: unknown procedure number %d", proc_nr); } |