changeset 274:a866b0475791

GNU file utilities
author Jim Meyering <jim@meyering.net>
date Fri, 04 Nov 1994 16:42:25 +0000
parents 41b545f881b3
children 971c9d3e51a6
files lib/Makefile.in lib/euidaccess.c lib/filemode.c lib/makepath.c lib/makepath.h
diffstat 5 files changed, 91 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/lib/Makefile.in	Thu Nov 03 05:25:21 1994 +0000
+++ b/lib/Makefile.in	Fri Nov 04 16:42:25 1994 +0000
@@ -48,7 +48,7 @@
 @LIBOBJS@ @ALLOCA@
 
 DISTFILES = Makefile.in backupfile.h getopt.h long-options.h modechange.h \
-fnmatch.h fsusage.h mountlist.h obstack.h pathmax.h \
+fnmatch.h fsusage.h makepath.h mountlist.h obstack.h pathmax.h \
 safe-xstat.cin safe-xstat.hin getdate.c posixtm.c $(SOURCES)
 
 all: libfu.a
@@ -152,6 +152,7 @@
 mountlist.o: mountlist.h
 xgetcwd.o: pathmax.h
 euidaccess.o fsusage.o isdir.o makepath.o mkdir.o rename.o: safe-stat.h
+makepath.o: makepath.h
 
 # Tell versions [3.59,3.63) of GNU make not to export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
--- a/lib/euidaccess.c	Thu Nov 03 05:25:21 1994 +0000
+++ b/lib/euidaccess.c	Fri Nov 04 16:42:25 1994 +0000
@@ -24,6 +24,18 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 
+#ifdef S_IEXEC
+#ifndef S_IXUSR
+#define S_IXUSR S_IEXEC
+#endif
+#ifndef S_IXGRP
+#define S_IXGRP (S_IEXEC >> 3)
+#endif
+#ifndef S_IXOTH
+#define S_IXOTH (S_IEXEC >> 6)
+#endif
+#endif /* S_IEXEC */
+
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
--- a/lib/filemode.c	Thu Nov 03 05:25:21 1994 +0000
+++ b/lib/filemode.c	Fri Nov 04 16:42:25 1994 +0000
@@ -22,10 +22,28 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 
-#ifndef S_IREAD
-#define S_IREAD S_IRUSR
-#define S_IWRITE S_IWUSR
-#define S_IEXEC S_IXUSR
+#if !S_IRUSR
+# if S_IREAD
+#  define S_IRUSR S_IREAD
+# else
+#  define S_IRUSR 00400
+#endif
+#endif
+
+#if !S_IWUSR
+# if S_IWRITE
+#  define S_IWUSR S_IWRITE
+# else
+#  define S_IWUSR 00200
+# endif
+#endif
+
+#if !S_IXUSR
+# if S_IEXEC
+#  define S_IXUSR S_IEXEC
+# else
+#  define S_IXUSR 00100
+# endif
 #endif
 
 #ifdef STAT_MACROS_BROKEN
@@ -191,9 +209,9 @@
      unsigned short bits;
      char *chars;
 {
-  chars[0] = (bits & S_IREAD) ? 'r' : '-';
-  chars[1] = (bits & S_IWRITE) ? 'w' : '-';
-  chars[2] = (bits & S_IEXEC) ? 'x' : '-';
+  chars[0] = (bits & S_IRUSR) ? 'r' : '-';
+  chars[1] = (bits & S_IWUSR) ? 'w' : '-';
+  chars[2] = (bits & S_IXUSR) ? 'x' : '-';
 }
 
 /* Set the 's' and 't' flags in file attributes string CHARS,
--- a/lib/makepath.c	Thu Nov 03 05:25:21 1994 +0000
+++ b/lib/makepath.c	Fri Nov 04 16:42:25 1994 +0000
@@ -77,39 +77,46 @@
 typedef int gid_t;
 #endif
 
+#include "makepath.h"
 #include "safe-stat.h"
 void error ();
 
 /* Ensure that the directory ARGPATH exists.
    Remove any trailing slashes from ARGPATH before calling this function.
 
-   Make any leading directories that don't already exist, with
+   Create any leading directories that don't already exist, with
    permissions PARENT_MODE.
    If the last element of ARGPATH does not exist, create it as
    a new directory with permissions MODE.
-   If OWNER and GROUP are non-negative, make them the UID and GID of
-   created directories.
+   If OWNER and GROUP are non-negative, use them to set the UID and GID of
+   any created directories.
    If VERBOSE_FMT_STRING is nonzero, use it as a printf format
    string for printing a message after successfully making a directory,
    with the name of the directory that was just made as an argument.
+   If PRESERVE_EXISTING is non-zero and ARGPATH is an existing directory,
+   then do not attempt to set its permissions and ownership.
 
    Return 0 if ARGPATH exists as a directory with the proper
    ownership and permissions when done, otherwise 1.  */
 
 int
-make_path (argpath, mode, parent_mode, owner, group, verbose_fmt_string)
-     char *argpath;
+make_path (argpath, mode, parent_mode, owner, group, preserve_existing,
+	   verbose_fmt_string)
+     const char *argpath;
      int mode;
      int parent_mode;
      uid_t owner;
      gid_t group;
-     char *verbose_fmt_string;
+     int preserve_existing;
+     const char *verbose_fmt_string;
 {
   char *dirpath;		/* A copy we can scribble NULs on.  */
   struct stat stats;
   int retval = 0;
   int oldmask = umask (0);
 
+  /* FIXME: move this alloca and strcpy into the if-block.
+     Set dirpath to argpath in the else-block.  */
   dirpath = (char *) alloca (strlen (argpath) + 1);
   strcpy (dirpath, argpath);
 
@@ -151,7 +158,7 @@
 	    {
 	      if (mkdir (dirpath, tmp_mode))
 		{
-		  error (0, errno, "cannot make directory `%s'", dirpath);
+		  error (0, errno, "cannot create directory `%s'", dirpath);
 		  umask (oldmask);
 		  return 1;
 		}
@@ -196,14 +203,14 @@
 	}
 
       /* We're done making leading directories.
-	 Make the final component of the path.  */
+	 Create the final component of the path.  */
 
       /* The path could end in "/." or contain "/..", so test
 	 if we really have to create the directory.  */
 
       if (SAFE_STAT (dirpath, &stats) && mkdir (dirpath, mode))
 	{
-	  error (0, errno, "cannot make directory `%s'", dirpath);
+	  error (0, errno, "cannot create directory `%s'", dirpath);
 	  umask (oldmask);
 	  return 1;
 	}
@@ -253,26 +260,29 @@
 	  return 1;
 	}
 
-      /* chown must precede chmod because on some systems,
-	 chown clears the set[ug]id bits for non-superusers,
-	 resulting in incorrect permissions.
-	 On System V, users can give away files with chown and then not
-	 be able to chmod them.  So don't give files away.  */
+      if (!preserve_existing)
+	{
+	  /* chown must precede chmod because on some systems,
+	     chown clears the set[ug]id bits for non-superusers,
+	     resulting in incorrect permissions.
+	     On System V, users can give away files with chown and then not
+	     be able to chmod them.  So don't give files away.  */
 
-      if (owner != (uid_t) -1 && group != (gid_t) -1
-	  && chown (dirpath, owner, group)
+	  if (owner != (uid_t) -1 && group != (gid_t) -1
+	      && chown (dirpath, owner, group)
 #ifdef AFS
-	  && errno != EPERM
+	      && errno != EPERM
 #endif
-	  )
-	{
-	  error (0, errno, "%s", dirpath);
-	  retval = 1;
-	}
-      if (chmod (dirpath, mode))
-	{
-	  error (0, errno, "%s", dirpath);
-	  retval = 1;
+	      )
+	    {
+	      error (0, errno, "%s", dirpath);
+	      retval = 1;
+	    }
+	  if (chmod (dirpath, mode))
+	    {
+	      error (0, errno, "%s", dirpath);
+	      retval = 1;
+	    }
 	}
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/makepath.h	Fri Nov 04 16:42:25 1994 +0000
@@ -0,0 +1,16 @@
+#ifndef __P
+#if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
+#define __P(args) args
+#else
+#define __P(args) ()
+#endif /* GCC.  */
+#endif /* Not __P.  */
+
+int
+  make_path __P ((const char *_argpath,
+		  int _mode,
+		  int _parent_mode,
+		  uid_t _owner,
+		  gid_t _group,
+		  int _preserve_existing,
+		  const char *_verbose_fmt_string));