(oatoi): declare arg to be const
[gnulib.git] / lib / makepath.c
index ff499ca..99119a2 100644 (file)
@@ -1,5 +1,5 @@
 /* makepath.c -- Ensure that a directory path exists.
-   Copyright (C) 1990, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1990, 1997, 1998 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -217,6 +217,14 @@ make_path (const char *argpath,
          if (!do_chdir)
            basename_dir = dirpath;
 
+         /* The mkdir and stat calls below appear to be reversed.
+            They are not.  It is important to call mkdir first and then to
+            call stat (to distinguish the three cases) only if mkdir fails.
+            The alternative to this approach is to `stat' each directory,
+            then to call mkdir if it doesn't exist.  But if some other process
+            were to create the directory between the stat & mkdir, the mkdir
+            would fail with EEXIST.  */
+
          *slash = '\0';
          if (mkdir (basename_dir, tmp_mode))
            {
@@ -239,29 +247,31 @@ make_path (const char *argpath,
                }
            }
 
-         if (newly_created_dir && verbose_fmt_string != NULL)
-           fprintf (stderr, verbose_fmt_string, dirpath);
+         if (newly_created_dir)
+           {
+             if (verbose_fmt_string)
+               fprintf (stderr, verbose_fmt_string, dirpath);
 
-         if (newly_created_dir
-             && (owner != (uid_t) -1 || group != (gid_t) -1)
-             && chown (basename_dir, owner, group)
+             if ((owner != (uid_t) -1 || group != (gid_t) -1)
+                 && chown (basename_dir, owner, group)
 #if defined(AFS) && defined (EPERM)
-             && errno != EPERM
+                 && errno != EPERM
 #endif
-             )
-           {
-             error (0, errno, "%s", dirpath);
-             CLEANUP;
-             return 1;
-           }
+                 )
+               {
+                 error (0, errno, "%s", dirpath);
+                 CLEANUP;
+                 return 1;
+               }
 
-         if (re_protect)
-           {
-             struct ptr_list *new = (struct ptr_list *)
-               alloca (sizeof (struct ptr_list));
-             new->dirname_end = slash;
-             new->next = leading_dirs;
-             leading_dirs = new;
+             if (re_protect)
+               {
+                 struct ptr_list *new = (struct ptr_list *)
+                   alloca (sizeof (struct ptr_list));
+                 new->dirname_end = slash;
+                 new->next = leading_dirs;
+                 leading_dirs = new;
+               }
            }
 
          /* If we were able to save the initial working directory,