(re_match_2_internal): Declare buf_ch unsigned int.
[gnulib.git] / lib / modechange.c
index f870577..b1af8e5 100644 (file)
@@ -1,5 +1,5 @@
 /* modechange.c -- file mode manipulation
-   Copyright (C) 1989, 1990 Free Software Foundation, Inc.
+   Copyright (C) 1989, 1990, 1997 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
    changing the mode of many files, this probably results in a
    performance gain. */
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
+#if HAVE_CONFIG_H
+# include <config.h>
 #endif
 
 #include <sys/types.h>
 #include <sys/stat.h>
 #include "modechange.h"
 
-#ifdef STDC_HEADERS
-#include <stdlib.h>
+#if STDC_HEADERS
+# include <stdlib.h>
 #else
 char *malloc ();
 #endif
 
 #ifndef NULL
-#define NULL 0
+# define NULL 0
 #endif
 
-#ifdef STAT_MACROS_BROKEN
-#undef S_ISDIR
-#endif /* STAT_MACROS_BROKEN.  */
+#if STAT_MACROS_BROKEN
+# undef S_ISDIR
+#endif
 
 #if !defined(S_ISDIR) && defined(S_IFDIR)
-#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
 #endif
 
 /* Return newly allocated memory to hold one element of type TYPE. */
@@ -236,6 +236,33 @@ invalid:
   return MODE_INVALID;
 }
 
+/* Return a file mode change operation that sets permissions to match those
+   of REF_FILE.  Return MODE_BAD_REFERENCE if REF_FILE can't be accessed.  */
+
+struct mode_change *
+mode_create_from_ref (ref_file)
+     const char *ref_file;
+{
+  struct mode_change *change;  /* the only change element */
+  struct stat ref_stats;
+
+  if (stat (ref_file, &ref_stats))
+    return MODE_BAD_REFERENCE;
+
+  change = talloc (struct mode_change);
+
+  if (change == NULL)
+    return MODE_MEMORY_EXHAUSTED;
+
+  change->op = '=';
+  change->flags = 0;
+  change->affected = 07777;
+  change->value = ref_stats.st_mode;
+  change->next = NULL;
+
+  return change;
+}
+
 /* Return file mode OLDMODE, adjusted as indicated by the list of change
    operations CHANGES.  If OLDMODE is a directory, the type `X'
    change affects it even if no execute bits were set in OLDMODE.