diff options
author | Richard Jones <rjones@redhat.com> | 2010-04-17 14:25:55 +0100 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2010-04-17 15:22:29 +0100 |
commit | 5922d7084d6b43f0a1a15b664c7082dfeaf584d0 (patch) | |
tree | 465894bcdc5286627c25df62adcbd75a10125e96 /daemon/daemon.h | |
parent | 68467cb1c2f8b1cc7844ed6512b7f76ef2aba1d1 (diff) | |
download | libguestfs-5922d7084d6b43f0a1a15b664c7082dfeaf584d0.tar.gz libguestfs-5922d7084d6b43f0a1a15b664c7082dfeaf584d0.tar.xz libguestfs-5922d7084d6b43f0a1a15b664c7082dfeaf584d0.zip |
Fix upload losing synchronization if root not mounted (RHBZ#576879).
Modify the generator so that it can correctly handle early
cancellation for Pathname|Device|.. parameters. This fixes
the upload command, but consequently we need to fix the
parameters for tar_in and t?z_in commands. This should also
mean that 'win:' can now be used as the second argument of
tar_in and t?z_in commands in guestfish, whereas previously
this wouldn't have worked.
Adds a regression test for the original problem.
Diffstat (limited to 'daemon/daemon.h')
-rw-r--r-- | daemon/daemon.h | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/daemon/daemon.h b/daemon/daemon.h index ebbeaa2e..81a9f366 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -68,7 +68,7 @@ extern char **split_lines (char *str); extern void trim (char *str); -extern int device_name_translation (char *device, const char *func); +extern int device_name_translation (char *device); extern int prog_exists (const char *prog); @@ -155,9 +155,10 @@ extern void reply (xdrproc_t xdrp, char *ret); /* Helper for functions that need a root filesystem mounted. * NB. Cannot be used for FileIn functions. */ -#define NEED_ROOT(fail_stmt) \ +#define NEED_ROOT(cancel_stmt,fail_stmt) \ do { \ if (!root_mounted) { \ + cancel_stmt; \ reply_with_error ("%s: you must call 'mount' first to mount the root filesystem", __func__); \ fail_stmt; \ } \ @@ -167,9 +168,10 @@ extern void reply (xdrproc_t xdrp, char *ret); /* Helper for functions that need an argument ("path") that is absolute. * NB. Cannot be used for FileIn functions. */ -#define ABS_PATH(path,fail_stmt) \ +#define ABS_PATH(path,cancel_stmt,fail_stmt) \ do { \ if ((path)[0] != '/') { \ + cancel_stmt; \ reply_with_error ("%s: path must start with a / character", __func__); \ fail_stmt; \ } \ @@ -182,14 +184,20 @@ extern void reply (xdrproc_t xdrp, char *ret); * * NB. Cannot be used for FileIn functions. */ -#define RESOLVE_DEVICE(path,fail_stmt) \ +#define RESOLVE_DEVICE(path,cancel_stmt,fail_stmt) \ do { \ if (STRNEQLEN ((path), "/dev/", 5)) { \ + cancel_stmt; \ reply_with_error ("%s: %s: expecting a device name", __func__, (path)); \ fail_stmt; \ } \ - if (device_name_translation ((path), __func__) == -1) \ + if (device_name_translation ((path)) == -1) { \ + int err = errno; \ + cancel_stmt; \ + errno = err; \ + reply_with_perror ("%s: %s", __func__, path); \ fail_stmt; \ + } \ } while (0) /* Helper for functions which need either an absolute path in the @@ -202,13 +210,13 @@ extern void reply (xdrproc_t xdrp, char *ret); * because we intend in future to make device parameters a distinct * type from filenames. */ -#define REQUIRE_ROOT_OR_RESOLVE_DEVICE(path,fail_stmt) \ +#define REQUIRE_ROOT_OR_RESOLVE_DEVICE(path,cancel_stmt,fail_stmt) \ do { \ if (STREQLEN ((path), "/dev/", 5)) \ - RESOLVE_DEVICE ((path), fail_stmt); \ + RESOLVE_DEVICE ((path), cancel_stmt, fail_stmt); \ else { \ - NEED_ROOT (fail_stmt); \ - ABS_PATH ((path),fail_stmt); \ + NEED_ROOT (cancel_stmt, fail_stmt); \ + ABS_PATH ((path), cancel_stmt, fail_stmt); \ } \ } while (0) |