+/* 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 (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 = CHMOD_MODE_BITS;
+ change->value = ref_stats.st_mode;
+ change->next = NULL;
+
+ return change;
+}
+