*** empty log message ***
[gnulib.git] / lib / makepath.c
index ea1b407..3729b1a 100644 (file)
@@ -114,13 +114,9 @@ extern int errno;
 # define _(Text) Text
 #endif
 
-#ifdef __MSDOS__
-typedef int uid_t;
-typedef int gid_t;
-#endif
-
 #include "save-cwd.h"
 #include "error.h"
+#include "quote.h"
 
 void strip_trailing_slashes ();
 
@@ -152,10 +148,10 @@ void strip_trailing_slashes ();
    function creates DIR and to zero otherwise.  Give a diagnostic and
    return non-zero if DIR cannot be created or cannot be determined to
    exist already.  Use DIRPATH in any diagnostic, not DIR.
-   Note that if DIR already exists, this function will return zero
-   (indicating success) and will set *CREATED_DIR_P to zero.  */
+   Note that if DIR already exists, this function returns zero
+   (indicating success) and sets *CREATED_DIR_P to zero.  */
 
-static int
+int
 make_dir (const char *dir, const char *dirpath, mode_t mode, int *created_dir_p)
 {
   int fail = 0;
@@ -178,12 +174,13 @@ make_dir (const char *dir, const char *dirpath, mode_t mode, int *created_dir_p)
 
       if (stat (dir, &stats))
        {
-         error (0, saved_errno, _("cannot create directory `%s'"), dirpath);
+         error (0, saved_errno, _("cannot create directory %s"),
+                quote (dirpath));
          fail = 1;
        }
       else if (!S_ISDIR (stats.st_mode))
        {
-         error (0, 0, _("`%s' exists but is not a directory"), dirpath);
+         error (0, 0, _("%s exists but is not a directory"), quote (dirpath));
          fail = 1;
        }
       else
@@ -312,7 +309,7 @@ make_path (const char *argpath,
          if (newly_created_dir)
            {
              if (verbose_fmt_string)
-               error (0, 0, verbose_fmt_string, dirpath);
+               error (0, 0, verbose_fmt_string, quote (dirpath));
 
              if ((owner != (uid_t) -1 || group != (gid_t) -1)
                  && chown (basename_dir, owner, group)
@@ -321,7 +318,8 @@ make_path (const char *argpath,
 #endif
                  )
                {
-                 error (0, errno, "%s", dirpath);
+                 error (0, errno, _("cannot change owner and/or group of %s"),
+                        quote (dirpath));
                  CLEANUP;
                  return 1;
                }
@@ -342,7 +340,8 @@ make_path (const char *argpath,
             stat and mkdir process O(n^2) file name components.  */
          if (do_chdir && chdir (basename_dir) < 0)
            {
-             error (0, errno, _("cannot chdir to directory, %s"), dirpath);
+             error (0, errno, _("cannot chdir to directory, %s"),
+                    quote (dirpath));
              CLEANUP;
              return 1;
            }
@@ -371,7 +370,7 @@ make_path (const char *argpath,
       umask (oldmask);
 
       if (verbose_fmt_string != NULL)
-       error (0, 0, verbose_fmt_string, dirpath);
+       error (0, 0, verbose_fmt_string, quote (dirpath));
 
       if (owner != (uid_t) -1 || group != (gid_t) -1)
        {
@@ -381,7 +380,8 @@ make_path (const char *argpath,
 #endif
              )
            {
-             error (0, errno, _("cannot chown %s"), dirpath);
+             error (0, errno, _("cannot change owner and/or group of %s"),
+                    quote (dirpath));
              retval = 1;
            }
        }
@@ -389,11 +389,12 @@ make_path (const char *argpath,
       /* The above chown may have turned off some permission bits in MODE.
         Another reason we may have to use chmod here is that mkdir(2) is
         required to honor only the file permission bits.  In particular,
-        it may not have honored the `special' bits.  */
+        it need not honor the `special' bits, so if MODE includes any
+        special bits, set them here.  */
       if ((mode & ~S_IRWXUGO)
          && chmod (basename_dir, mode))
        {
-         error (0, errno, _("cannot chmod %s"), dirpath);
+         error (0, errno, _("cannot change permissions of %s"), quote (dirpath));
          retval = 1;
        }
 
@@ -407,7 +408,8 @@ make_path (const char *argpath,
          *(p->dirname_end) = '\0';
          if (chmod (dirpath, parent_mode))
            {
-             error (0, errno, "%s", dirpath);
+             error (0, errno, "cannot change permissions of %s",
+                    quote (dirpath));
              retval = 1;
            }
        }
@@ -420,7 +422,7 @@ make_path (const char *argpath,
 
       if (!S_ISDIR (stats.st_mode))
        {
-         error (0, 0, _("`%s' exists but is not a directory"), dirpath);
+         error (0, 0, _("%s exists but is not a directory"), quote (dirpath));
          return 1;
        }
 
@@ -439,12 +441,14 @@ make_path (const char *argpath,
 #endif
              )
            {
-             error (0, errno, "%s", dirpath);
+             error (0, errno, _("cannot change owner and/or group of %s"),
+                    quote (dirpath));
              retval = 1;
            }
          if (chmod (dirpath, mode))
            {
-             error (0, errno, "%s", dirpath);
+             error (0, errno, _("cannot change permissions of %s"),
+                                quote (dirpath));
              retval = 1;
            }
        }