[distcc] A patch to introduce recursive mkdir and more

Martin Pool mbp at sourcefrog.net
Thu Sep 11 03:55:45 GMT 2003


On 11 Sep 2003 Martin Pool <mbp at sourcefrog.net> wrote:

> On 10 Sep 2003 Lisa Seelye <lisa at gentoo.org> wrote:
> 
> > Since I forgot to cc the list last week, here goes:
> 
> Sorry I didn't get to it.
> 
> > Attached is a patch to address some problems I have had locally; it
> > does two things:
> > 
> > First: It allows for a "mkdir -p" like dcc_mkdir() to create
> > directories recursivly.

Common subdirectories: cvs/src/CVS and cvs-diff/src/CVS
diff -uN cvs/src/tempfile.c cvs-diff/src/tempfile.c
--- cvs/src/tempfile.c	2003-08-30 13:13:09.000000000 -0400
+++ cvs-diff/src/tempfile.c	2003-09-04 16:12:50.000000000 -0400
@@ -105,15 +105,27 @@
 /**
  * Create the directory @p path.  If it already exists as a directory
  * we succeed.
+ * Recursive mkdir is from the Gal project's e_mkdir_hier() function.
  **/
 int dcc_mkdir(const char *path)
 {
-    if ((mkdir(path, 0755) == -1) && (errno != EEXIST)) {
-        rs_log_error("mkdir %s failed: %s", path, strerror(errno));
-        return EXIT_IO_ERROR;
-    }
+	char *copy, *p;
 
-    return 0;
+	p = copy = strdup(path);
+	do {
+		p = strchr (p + 1, '/');
+		if (p)
+			*p = '\0';
+		if (access (copy, F_OK) == -1) {
+			if (mkdir (copy, 0755) == -1) {
+				rs_log_error("mkdir %s failed: %s", path, strerror(errno));
+				return EXIT_IO_ERROR;
+			}
+		}
+		if (p)
+			*p = '/';
+	} while (p);
+	return 0;
 }

The access() is a bit redundant.  I would probably try just doing the
mkdir(), and ignoring EEXIST, as in the previous code.  This is a good
Unix idiom (imho) for "make sure this is a directory".

In fact I think your version has the problem that if the name exists
but is not a directory, it will succeed when it should have failed.

Also you should free(copy) when you're done.

-- 
Martin 



More information about the distcc mailing list