[Libguestfs] [PATCH 3/5] daemon error handling: recursive_mkdir shouldn't need to set errno.
Richard W.M. Jones
rjones at redhat.com
Mon Nov 30 14:47:38 UTC 2009
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages. http://et.redhat.com/~rjones/libguestfs/
See what it can do: http://et.redhat.com/~rjones/libguestfs/recipes.html
-------------- next part --------------
>From 34826b845d931a27d707c6fef60b6c921f6f6bed Mon Sep 17 00:00:00 2001
From: Richard Jones <rjones at redhat.com>
Date: Fri, 27 Nov 2009 14:14:21 +0000
Subject: [PATCH 3/5] daemon error handling: recursive_mkdir shouldn't need to set errno.
---
daemon/dir.c | 16 +++++++++++-----
1 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/daemon/dir.c b/daemon/dir.c
index a5076b1..300bb4c 100644
--- a/daemon/dir.c
+++ b/daemon/dir.c
@@ -116,6 +116,11 @@ do_mkdir_mode (const char *path, int mode)
return 0;
}
+/* Returns:
+ * 0 if everything was OK,
+ * -1 for a general error (sets errno),
+ * -2 if an existing path element was not a directory.
+ */
static int
recursive_mkdir (const char *path)
{
@@ -130,10 +135,7 @@ recursive_mkdir (const char *path)
if (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)) {
- errno = ENOTDIR;
- return -1;
- }
+ if (!S_ISDIR (buf.st_mode)) return -2;
return 0; /* OK - directory exists here already. */
}
@@ -153,7 +155,7 @@ recursive_mkdir (const char *path)
r = recursive_mkdir (ppath);
free (ppath);
- if (r == -1) return -1;
+ if (r != 0) return r;
goto again;
} else /* Failed for some other reason, so return error. */
@@ -175,6 +177,10 @@ do_mkdir_p (const char *path)
reply_with_perror ("mkdir -p: %s", path);
return -1;
}
+ if (r == -2) {
+ reply_with_error ("mkdir -p: %s: a path element was not a directory", path);
+ return -1;
+ }
return 0;
}
--
1.6.5.2
More information about the Libguestfs
mailing list