>From f982a590ba92d706425be1bdd40eefb6a61c5b29 Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Fri, 27 Nov 2009 13:53:31 +0000 Subject: [PATCH 2/9] daemon error handling: Remove direct access to errno. --- daemon/dir.c | 4 ++-- daemon/glob.c | 6 ++++-- daemon/guestfsd.c | 2 +- daemon/inotify.c | 2 +- daemon/realpath.c | 7 +++---- daemon/tar.c | 46 ++++++++++++++++++++-------------------------- daemon/upload.c | 18 ++++++++---------- 7 files changed, 39 insertions(+), 46 deletions(-) diff --git a/daemon/dir.c b/daemon/dir.c index a5076b1..ecb9c79 100644 --- a/daemon/dir.c +++ b/daemon/dir.c @@ -127,7 +127,7 @@ recursive_mkdir (const char *path) again: r = mkdir (path, 0777); if (r == -1) { - if (errno == EEXIST) { /* Something exists here, might not be a dir. */ + if (get_errno() == EEXIST) { /* Something exists here, might not be a dir. */ r = lstat (path, &buf); if (r == -1) return -1; if (!S_ISDIR (buf.st_mode)) { @@ -137,7 +137,7 @@ recursive_mkdir (const char *path) return 0; /* OK - directory exists here already. */ } - if (!loop && errno == ENOENT) { + if (!loop && get_errno() == ENOENT) { loop = 1; /* Stops it looping forever. */ /* If we're at the root, and we failed, just give up. */ diff --git a/daemon/glob.c b/daemon/glob.c index 4fe76f3..a330534 100644 --- a/daemon/glob.c +++ b/daemon/glob.c @@ -45,8 +45,10 @@ do_glob_expand (const char *pattern) } if (r != 0) { - if (errno != 0) - reply_with_perror ("glob: %s", pattern); + errtype err = get_error (); + + if (err) + reply_with_perror_with_err (err, "glob: %s", pattern); else reply_with_error ("glob failed: %s", pattern); return NULL; diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index bb972f2..c3af8c5 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -1021,7 +1021,7 @@ device_name_translation (char *device, const char *func) return 0; } - if (errno != ENXIO && errno != ENOENT) { + if (get_errno() != ENXIO && get_errno() != ENOENT) { error: reply_with_perror ("%s: %s", func, device); return -1; diff --git a/daemon/inotify.c b/daemon/inotify.c index 24ce76e..749b8b7 100644 --- a/daemon/inotify.c +++ b/daemon/inotify.c @@ -224,7 +224,7 @@ do_inotify_read (void) r = read (inotify_fd, inotify_buf + inotify_posn, sizeof (inotify_buf) - inotify_posn); if (r == -1) { - if (errno == EWOULDBLOCK || errno == EAGAIN) /* End of list. */ + if (get_errno() == EWOULDBLOCK || get_errno() == EAGAIN) /* End of list. */ break; reply_with_perror ("read"); goto error; diff --git a/daemon/realpath.c b/daemon/realpath.c index e6c81ef..f49e0c5 100644 --- a/daemon/realpath.c +++ b/daemon/realpath.c @@ -165,14 +165,13 @@ do_case_sensitive_path (const char *path) /* Is it a directory? Try going into it. */ fd2 = openat (fd_cwd, d->d_name, O_RDONLY | O_DIRECTORY); - int err = errno; + int err = get_error (); close (fd_cwd); fd_cwd = fd2; - errno = err; if (fd_cwd == -1) { /* ENOTDIR is OK provided we've reached the end of the path. */ - if (errno != ENOTDIR) { - reply_with_perror ("openat: %s", d->d_name); + if (get_errno() != ENOTDIR) { + reply_with_perror_with_err (err, "openat: %s", d->d_name); goto error; } diff --git a/daemon/tar.c b/daemon/tar.c index c3bdcf7..56d291d 100644 --- a/daemon/tar.c +++ b/daemon/tar.c @@ -38,7 +38,8 @@ fwrite_cb (void *fp_ptr, const void *buf, int len) int do_tar_in (const char *dir) { - int err, r; + errtype err; + int r; FILE *fp; char *cmd; @@ -50,10 +51,9 @@ do_tar_in (const char *dir) /* "tar -C /sysroot%s -xf -" but we have to quote the dir. */ if (asprintf_nowarn (&cmd, "tar -C %R -xf -", dir) == -1) { - err = errno; + err = get_error (); cancel_receive (); - errno = err; - reply_with_perror ("asprintf"); + reply_with_perror_with_err (err, "asprintf"); return -1; } @@ -62,10 +62,9 @@ do_tar_in (const char *dir) fp = popen (cmd, "w"); if (fp == NULL) { - err = errno; + err = get_error (); cancel_receive (); - errno = err; - reply_with_perror ("%s", cmd); + reply_with_perror_with_err (err, "%s", cmd); free (cmd); return -1; } @@ -73,10 +72,9 @@ do_tar_in (const char *dir) r = receive_file (fwrite_cb, &fp); if (r == -1) { /* write error */ - err = errno; + err = get_error (); cancel_receive (); - errno = err; - reply_with_perror ("write: %s", dir); + reply_with_perror_with_err (err, "write: %s", dir); pclose (fp); return -1; } @@ -87,10 +85,9 @@ do_tar_in (const char *dir) } if (pclose (fp) != 0) { - err = errno; + err = get_error (); cancel_receive (); - errno = err; - reply_with_perror ("pclose: %s", dir); + reply_with_perror_with_err (err, "pclose: %s", dir); return -1; } @@ -159,7 +156,8 @@ do_tar_out (const char *dir) int do_tgz_in (const char *dir) { - int err, r; + errtype err; + int r; FILE *fp; char *cmd; @@ -171,10 +169,9 @@ do_tgz_in (const char *dir) /* "tar -C /sysroot%s -zxf -" but we have to quote the dir. */ if (asprintf_nowarn (&cmd, "tar -C %R -zxf -", dir) == -1) { - err = errno; + err = get_error (); cancel_receive (); - errno = err; - reply_with_perror ("asprintf"); + reply_with_perror_with_err (err, "asprintf"); return -1; } @@ -183,10 +180,9 @@ do_tgz_in (const char *dir) fp = popen (cmd, "w"); if (fp == NULL) { - err = errno; + err = get_error (); cancel_receive (); - errno = err; - reply_with_perror ("%s", cmd); + reply_with_perror_with_err (err, "%s", cmd); free (cmd); return -1; } @@ -194,10 +190,9 @@ do_tgz_in (const char *dir) r = receive_file (fwrite_cb, &fp); if (r == -1) { /* write error */ - err = errno; + err = get_error (); cancel_receive (); - errno = err; - reply_with_perror ("write: %s", dir); + reply_with_perror_with_err (err, "write: %s", dir); pclose (fp); return -1; } @@ -208,10 +203,9 @@ do_tgz_in (const char *dir) } if (pclose (fp) != 0) { - err = errno; + err = get_error (); cancel_receive (); - errno = err; - reply_with_perror ("pclose: %s", dir); + reply_with_perror_with_err (err, "pclose: %s", dir); return -1; } diff --git a/daemon/upload.c b/daemon/upload.c index fdb8654..04aa21d 100644 --- a/daemon/upload.c +++ b/daemon/upload.c @@ -38,7 +38,8 @@ write_cb (void *fd_ptr, const void *buf, int len) int do_upload (const char *filename) { - int err, fd, r, is_dev; + errtype err; + int fd, r, is_dev; is_dev = STRPREFIX (filename, "/dev/"); if (!is_dev) { @@ -53,19 +54,17 @@ do_upload (const char *filename) fd = open (filename, O_WRONLY|O_CREAT|O_TRUNC|O_NOCTTY, 0666); if (!is_dev) CHROOT_OUT; if (fd == -1) { - err = errno; + err = get_error (); cancel_receive (); - errno = err; - reply_with_perror ("%s", filename); + reply_with_perror_with_err (err, "%s", filename); return -1; } r = receive_file (write_cb, &fd); if (r == -1) { /* write error */ - err = errno; + err = get_error (); cancel_receive (); - errno = err; - reply_with_perror ("write: %s", filename); + reply_with_perror_with_err (err, "write: %s", filename); close (fd); return -1; } @@ -76,10 +75,9 @@ do_upload (const char *filename) } if (close (fd) == -1) { - err = errno; + err = get_error (); cancel_receive (); - errno = err; - reply_with_perror ("close: %s", filename); + reply_with_perror_with_err (err, "close: %s", filename); return -1; } -- 1.6.5.2