]> Kevux Git Server - fll/commitdiff
Progress: implement modes operation with todo for recursion and fix documentation
authorKevin Day <thekevinday@gmail.com>
Fri, 14 Aug 2020 02:23:34 +0000 (21:23 -0500)
committerKevin Day <thekevinday@gmail.com>
Fri, 14 Aug 2020 02:26:04 +0000 (21:26 -0500)
Recursion will be written at a later date.
Just copy over the mode operation code just like it is done with owners (vs owner) and groups (vs group).

Fix a copy & paste mistake where I forgot to change the wording in the mode documentation.

level_3/fake/c/private-make.c
level_3/fake/specifications/fakefile.txt

index 1d1f515ae86ff4bd5610a459658088fd5ffd8d2d..24111bf3ac11559be1659ab3a0e9f7447764b315 100644 (file)
@@ -1556,7 +1556,40 @@ extern "C" {
     }
 
     if (operation == fake_make_operation_type_modes) {
-      // @todo
+      f_file_mode mode_rule = 0;
+      uint8_t replace = 0;
+
+      *status = fake_make_get_id_mode(data, arguments.array[0], &mode_rule, &replace);
+      if (F_status_is_error(*status)) return;
+
+      mode_t mode = 0;
+
+      struct stat stat_file;
+
+      for (f_array_length i = 1; i < arguments.used; i++) {
+        // @todo recursive.
+        mode = 0;
+        memset(&stat_file, 0, sizeof(struct stat));
+
+        *status = f_file_stat(arguments.array[i].string, F_true, &stat_file);
+        if (F_status_is_error(*status)) {
+          fake_print_error_file(data, *status, "f_file_stat", arguments.array[i].string, "change mode of", F_true, F_true);
+          break;
+        }
+
+        *status = f_file_mode_determine(stat_file.st_mode, mode_rule, replace, f_macro_file_type_is_directory(stat_file.st_mode), &mode);
+        if (F_status_is_error(*status)) {
+          fake_print_error_file(data, *status, "f_file_mode_determine", arguments.array[i].string, "change mode of", F_true, F_true);
+          break;
+        }
+
+        *status = f_file_mode_set(arguments.array[i].string, mode);
+        if (F_status_is_error(*status)) {
+          fake_print_error_file(data, *status, "f_file_mode_set", arguments.array[i].string, "change mode of", F_true, F_true);
+          break;
+        }
+      } // for
+
       return;
     }
 
index d1c95e04b0ba1eaa6b1ae07d65134c740c05ca17..ad01f9ad9881940249721d8562f1d8bbf960cd17 100644 (file)
@@ -54,8 +54,8 @@ Fakefile Specification:
   - groups: Two or more Content. First Content is group name or number, remaining Content are paths to files.
   - if: One or more Content. First Content is the condition, remaining Content are specific to the condition.
   - link: Two Content. First Content is the link target file and second Content is the pointer file (the link).
-  - mode: Two or more Content. First Content is group name or number, remaining Content are paths to files.
-  - modes: Two or more Content. First Content is group name or number, remaining Content are paths to files.
+  - mode: Two or more Content. First Content is the mode, remaining Content are paths to files.
+  - modes: Two or more Content. First Content is the mode, remaining Content are paths to files.
   - operate: One Content. First Content is the name of a valid Section Object, except for the reserved Section Objects.
   - owner: Two or more Content. First Content is group name or number, remaining Content are paths to files.
   - owners: Two or more Content. First Content is group name or number, remaining Content are paths to files.