summaryrefslogtreecommitdiffstats
path: root/daemon/daemon.h
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2010-04-17 14:25:55 +0100
committerRichard Jones <rjones@redhat.com>2010-04-17 15:22:29 +0100
commit5922d7084d6b43f0a1a15b664c7082dfeaf584d0 (patch)
tree465894bcdc5286627c25df62adcbd75a10125e96 /daemon/daemon.h
parent68467cb1c2f8b1cc7844ed6512b7f76ef2aba1d1 (diff)
downloadlibguestfs-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.h26
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)