]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
image-policy: introduce parse_image_policy_argument() helper
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 12 Apr 2023 13:38:01 +0000 (22:38 +0900)
committerLennart Poettering <lennart@poettering.net>
Thu, 13 Apr 2023 09:17:28 +0000 (11:17 +0200)
Addresses
https://github.com/systemd/systemd/pull/25608/commits/84be0c710d9d562f6d2cf986cc2a8ff4c98a138b#r1060130312,
https://github.com/systemd/systemd/pull/25608/commits/84be0c710d9d562f6d2cf986cc2a8ff4c98a138b#r1067927293, and
https://github.com/systemd/systemd/pull/25608/commits/84be0c710d9d562f6d2cf986cc2a8ff4c98a138b#r1067926416.

Follow-up for 84be0c710d9d562f6d2cf986cc2a8ff4c98a138b.

20 files changed:
src/analyze/analyze.c
src/boot/bootctl.c
src/core/load-fragment-gperf.gperf.in
src/core/load-fragment.c
src/core/load-fragment.h
src/coredump/coredumpctl.c
src/dissect/dissect.c
src/firstboot/firstboot.c
src/gpt-auto-generator/gpt-auto-generator.c
src/journal/journalctl.c
src/machine-id-setup/machine-id-setup-main.c
src/nspawn/nspawn.c
src/partition/repart.c
src/shared/image-policy.c
src/shared/image-policy.h
src/sysext/sysext.c
src/systemctl/systemctl.c
src/sysupdate/sysupdate.c
src/sysusers/sysusers.c
src/tmpfiles/tmpfiles.c

index ddc71b98b073ad9d6ac472f2d97d7ed914e84150..09a38e7930ee07d39c6b21a937e97348e72c4d5c 100644 (file)
@@ -292,6 +292,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_REQUIRE,
                 ARG_ROOT,
                 ARG_IMAGE,
+                ARG_IMAGE_POLICY,
                 ARG_SYSTEM,
                 ARG_USER,
                 ARG_GLOBAL,
@@ -311,7 +312,6 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_PROFILE,
                 ARG_TABLE,
                 ARG_NO_LEGEND,
-                ARG_IMAGE_POLICY,
         };
 
         static const struct option options[] = {
@@ -322,6 +322,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "require",          no_argument,       NULL, ARG_REQUIRE          },
                 { "root",             required_argument, NULL, ARG_ROOT             },
                 { "image",            required_argument, NULL, ARG_IMAGE            },
+                { "image-policy",     required_argument, NULL, ARG_IMAGE_POLICY     },
                 { "recursive-errors", required_argument, NULL, ARG_RECURSIVE_ERRORS },
                 { "offline",          required_argument, NULL, ARG_OFFLINE          },
                 { "threshold",        required_argument, NULL, ARG_THRESHOLD        },
@@ -344,7 +345,6 @@ static int parse_argv(int argc, char *argv[]) {
                 { "profile",          required_argument, NULL, ARG_PROFILE          },
                 { "table",            optional_argument, NULL, ARG_TABLE            },
                 { "no-legend",        optional_argument, NULL, ARG_NO_LEGEND        },
-                { "image-policy",     required_argument, NULL, ARG_IMAGE_POLICY     },
                 {}
         };
 
@@ -390,6 +390,12 @@ static int parse_argv(int argc, char *argv[]) {
                                 return r;
                         break;
 
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
+                        if (r < 0)
+                                return r;
+                        break;
+
                 case ARG_SYSTEM:
                         arg_runtime_scope = RUNTIME_SCOPE_SYSTEM;
                         break;
@@ -528,18 +534,6 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_legend = false;
                         break;
 
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
-                        break;
-                }
-
                 case '?':
                         return -EINVAL;
 
index b9d034d55033ede10ed9ca67a200f1a06365a42e..0480e320c0f5408f6a891cf27cf66a7e189064bc 100644 (file)
@@ -211,6 +211,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_BOOT_PATH,
                 ARG_ROOT,
                 ARG_IMAGE,
+                ARG_IMAGE_POLICY,
                 ARG_INSTALL_SOURCE,
                 ARG_VERSION,
                 ARG_NO_VARIABLES,
@@ -222,7 +223,6 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_ARCH_ALL,
                 ARG_EFI_BOOT_OPTION_DESCRIPTION,
                 ARG_DRY_RUN,
-                ARG_IMAGE_POLICY,
         };
 
         static const struct option options[] = {
@@ -233,6 +233,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "boot-path",                   required_argument, NULL, ARG_BOOT_PATH                   },
                 { "root",                        required_argument, NULL, ARG_ROOT                        },
                 { "image",                       required_argument, NULL, ARG_IMAGE                       },
+                { "image-policy",                required_argument, NULL, ARG_IMAGE_POLICY                },
                 { "install-source",              required_argument, NULL, ARG_INSTALL_SOURCE              },
                 { "print-esp-path",              no_argument,       NULL, 'p'                             },
                 { "print-path",                  no_argument,       NULL, 'p'                             }, /* Compatibility alias */
@@ -249,7 +250,6 @@ static int parse_argv(int argc, char *argv[]) {
                 { "all-architectures",           no_argument,       NULL, ARG_ARCH_ALL                    },
                 { "efi-boot-option-description", required_argument, NULL, ARG_EFI_BOOT_OPTION_DESCRIPTION },
                 { "dry-run",                     no_argument,       NULL, ARG_DRY_RUN                     },
-                { "image-policy",                required_argument, NULL, ARG_IMAGE_POLICY                },
                 {}
         };
 
@@ -292,6 +292,12 @@ static int parse_argv(int argc, char *argv[]) {
                                 return r;
                         break;
 
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
+                        if (r < 0)
+                                return r;
+                        break;
+
                 case ARG_INSTALL_SOURCE:
                         if (streq(optarg, "auto"))
                                 arg_install_source = ARG_INSTALL_SOURCE_AUTO;
@@ -382,18 +388,6 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_dry_run = true;
                         break;
 
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
-                        break;
-                }
-
                 case '?':
                         return -EINVAL;
 
index ce0e2f0c5c241f21e9d83652935c7335e51db9d7..8a2823b075a0ebbc6e68b29c7ea9af61219ec175 100644 (file)
@@ -263,6 +263,7 @@ _Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"")
 #include <stddef.h>
 #include "all-units.h"
 #include "conf-parser.h"
+#include "image-policy.h"
 #include "in-addr-prefix-util.h"
 #include "load-fragment.h"
 %}
index cf0096263afcde231035aeb46ccb85428de6fce1..581a051d460dd08857a748233872da7584028349 100644 (file)
@@ -1705,45 +1705,6 @@ int config_parse_root_image_options(
         return 0;
 }
 
-int config_parse_image_policy(
-                const char *unit,
-                const char *filename,
-                unsigned line,
-                const char *section,
-                unsigned section_line,
-                const char *lvalue,
-                int ltype,
-                const char *rvalue,
-                void *data,
-                void *userdata) {
-
-        _cleanup_(image_policy_freep) ImagePolicy *np = NULL;
-        ImagePolicy **p = ASSERT_PTR(data);
-        int r;
-
-        assert(rvalue);
-
-        if (isempty(rvalue)) {
-                *p = image_policy_free(*p);
-                return 0;
-        }
-
-        r = image_policy_from_string(rvalue, &np);
-        if (r == -ENOTUNIQ)
-                return log_syntax(unit, LOG_ERR, filename, line, r, "Duplicate rule in image policy, refusing: %s", rvalue);
-        if (r == -EBADSLT)
-                return log_syntax(unit, LOG_ERR, filename, line, r, "Unknown partition type in image policy, refusing: %s", rvalue);
-        if (r == -EBADRQC)
-                return log_syntax(unit, LOG_ERR, filename, line, r, "Unknown partition policy flag in image policy, refusing: %s", rvalue);
-        if (r < 0)
-                return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse image policy, refusing: %s", rvalue);
-
-        image_policy_free(*p);
-        *p = TAKE_PTR(np);
-
-        return 0;
-}
-
 int config_parse_exec_root_hash(
                 const char *unit,
                 const char *filename,
index 98adf5ae056e57877df51686937043fea60f2e48..a38d697338adfc48f5a43f357a3f1807ff1ef0d7 100644 (file)
@@ -52,7 +52,6 @@ CONFIG_PARSER_PROTOTYPE(config_parse_exec_cpu_affinity);
 CONFIG_PARSER_PROTOTYPE(config_parse_exec_mount_apivfs);
 CONFIG_PARSER_PROTOTYPE(config_parse_exec_secure_bits);
 CONFIG_PARSER_PROTOTYPE(config_parse_root_image_options);
-CONFIG_PARSER_PROTOTYPE(config_parse_image_policy);
 CONFIG_PARSER_PROTOTYPE(config_parse_exec_root_hash);
 CONFIG_PARSER_PROTOTYPE(config_parse_exec_root_hash_sig);
 CONFIG_PARSER_PROTOTYPE(config_parse_capability_set);
index 076b35f0987760612c87fd4c6c4950f779f53a01..bc52cc0b06335cadb2156b61a747c3469903ed02 100644 (file)
@@ -222,8 +222,8 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_FILE,
                 ARG_ROOT,
                 ARG_IMAGE,
-                ARG_ALL,
                 ARG_IMAGE_POLICY,
+                ARG_ALL,
         };
 
         int c, r;
@@ -246,8 +246,8 @@ static int parse_argv(int argc, char *argv[]) {
                 { "json",               required_argument, NULL, ARG_JSON         },
                 { "root",               required_argument, NULL, ARG_ROOT         },
                 { "image",              required_argument, NULL, ARG_IMAGE        },
-                { "all",                no_argument,       NULL, ARG_ALL          },
                 { "image-policy",       required_argument, NULL, ARG_IMAGE_POLICY },
+                { "all",                no_argument,       NULL, ARG_ALL          },
                 {}
         };
 
@@ -349,6 +349,12 @@ static int parse_argv(int argc, char *argv[]) {
                                 return r;
                         break;
 
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
+                        if (r < 0)
+                                return r;
+                        break;
+
                 case 'r':
                         arg_reverse = true;
                         break;
@@ -368,18 +374,6 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_all = true;
                         break;
 
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
-                        break;
-                }
-
                 case '?':
                         return -EINVAL;
 
index b53c2cc3571cef6fb2f564e8045a091603eeeda1..ab9d796cf4b4fe805f4f8c29932041f1d7977d38 100644 (file)
@@ -466,17 +466,11 @@ static int parse_argv(int argc, char *argv[]) {
                                 return r;
                         break;
 
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
                         if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
+                                return r;
                         break;
-                }
 
                 case ARG_VALIDATE:
                         arg_action = ACTION_VALIDATE;
index 7cd13a51e904daae34fc70337d54af98681dfb45..71b1e25c9daa0e36002b6ade33f1bf3864dae516 100644 (file)
@@ -1208,6 +1208,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_VERSION = 0x100,
                 ARG_ROOT,
                 ARG_IMAGE,
+                ARG_IMAGE_POLICY,
                 ARG_LOCALE,
                 ARG_LOCALE_MESSAGES,
                 ARG_KEYMAP,
@@ -1237,7 +1238,6 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_DELETE_ROOT_PASSWORD,
                 ARG_WELCOME,
                 ARG_RESET,
-                ARG_IMAGE_POLICY,
         };
 
         static const struct option options[] = {
@@ -1245,6 +1245,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "version",                 no_argument,       NULL, ARG_VERSION                 },
                 { "root",                    required_argument, NULL, ARG_ROOT                    },
                 { "image",                   required_argument, NULL, ARG_IMAGE                   },
+                { "image-policy",            required_argument, NULL, ARG_IMAGE_POLICY            },
                 { "locale",                  required_argument, NULL, ARG_LOCALE                  },
                 { "locale-messages",         required_argument, NULL, ARG_LOCALE_MESSAGES         },
                 { "keymap",                  required_argument, NULL, ARG_KEYMAP                  },
@@ -1274,7 +1275,6 @@ static int parse_argv(int argc, char *argv[]) {
                 { "delete-root-password",    no_argument,       NULL, ARG_DELETE_ROOT_PASSWORD    },
                 { "welcome",                 required_argument, NULL, ARG_WELCOME                 },
                 { "reset",                   no_argument,       NULL, ARG_RESET                   },
-                { "image-policy",            required_argument, NULL, ARG_IMAGE_POLICY            },
                 {}
         };
 
@@ -1305,6 +1305,12 @@ static int parse_argv(int argc, char *argv[]) {
                                 return r;
                         break;
 
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
+                        if (r < 0)
+                                return r;
+                        break;
+
                 case ARG_LOCALE:
                         r = free_and_strdup(&arg_locale, optarg);
                         if (r < 0)
@@ -1481,17 +1487,6 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_reset = true;
                         break;
 
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
-                        break;
-                }
                 case '?':
                         return -EINVAL;
 
index 09c63a31b2f77eb805ad1daba8eb12a21b510925..33c215bcb576c1b2b4e5c6a3689f5e97479cd402 100644 (file)
@@ -888,20 +888,8 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
                 arg_root_rw = true;
         else if (proc_cmdline_key_streq(key, "ro") && !value)
                 arg_root_rw = false;
-        else if (proc_cmdline_key_streq(key, "systemd.image_policy")) {
-                _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                if (proc_cmdline_value_missing(key, value))
-                        return 0;
-
-                r = image_policy_from_string(value, &p);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to parse image policy: %s", value);
-
-                image_policy_free(arg_image_policy);
-                arg_image_policy = TAKE_PTR(p);
-                return 0;
-        }
+        else if (proc_cmdline_key_streq(key, "systemd.image_policy"))
+                return parse_image_policy_argument(optarg, &arg_image_policy);
 
         return 0;
 }
index abacbb03066f82fe864c2cd15e134f2ad54f63be..5c07caa8f35077b6993569d7eae6a8db67e37a8f 100644 (file)
@@ -418,6 +418,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_SYSTEM,
                 ARG_ROOT,
                 ARG_IMAGE,
+                ARG_IMAGE_POLICY,
                 ARG_HEADER,
                 ARG_FACILITY,
                 ARG_SETUP_KEYS,
@@ -447,7 +448,6 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_NO_HOSTNAME,
                 ARG_OUTPUT_FIELDS,
                 ARG_NAMESPACE,
-                ARG_IMAGE_POLICY,
         };
 
         static const struct option options[] = {
@@ -476,6 +476,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "file",                 required_argument, NULL, ARG_FILE                 },
                 { "root",                 required_argument, NULL, ARG_ROOT                 },
                 { "image",                required_argument, NULL, ARG_IMAGE                },
+                { "image-policy",         required_argument, NULL, ARG_IMAGE_POLICY         },
                 { "header",               no_argument,       NULL, ARG_HEADER               },
                 { "identifier",           required_argument, NULL, 't'                      },
                 { "priority",             required_argument, NULL, 'p'                      },
@@ -515,7 +516,6 @@ static int parse_argv(int argc, char *argv[]) {
                 { "no-hostname",          no_argument,       NULL, ARG_NO_HOSTNAME          },
                 { "output-fields",        required_argument, NULL, ARG_OUTPUT_FIELDS        },
                 { "namespace",            required_argument, NULL, ARG_NAMESPACE            },
-                { "image-policy",         required_argument, NULL, ARG_IMAGE_POLICY         },
                 {}
         };
 
@@ -735,6 +735,12 @@ static int parse_argv(int argc, char *argv[]) {
                                 return r;
                         break;
 
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
+                        if (r < 0)
+                                return r;
+                        break;
+
                 case 'c':
                         arg_cursor = optarg;
                         break;
@@ -1038,17 +1044,6 @@ static int parse_argv(int argc, char *argv[]) {
 
                         break;
                 }
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
-                        break;
-                }
                 case '?':
                         return -EINVAL;
 
index c5b22d5d768aaedde72c5117b372ec486d334035..17012e20ac1f52e0a8ff65a626ea86bbf4390f19 100644 (file)
@@ -60,9 +60,9 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_VERSION = 0x100,
                 ARG_ROOT,
                 ARG_IMAGE,
+                ARG_IMAGE_POLICY,
                 ARG_COMMIT,
                 ARG_PRINT,
-                ARG_IMAGE_POLICY,
         };
 
         static const struct option options[] = {
@@ -70,9 +70,9 @@ static int parse_argv(int argc, char *argv[]) {
                 { "version",      no_argument,       NULL, ARG_VERSION      },
                 { "root",         required_argument, NULL, ARG_ROOT         },
                 { "image",        required_argument, NULL, ARG_IMAGE        },
+                { "image-policy", required_argument, NULL, ARG_IMAGE_POLICY },
                 { "commit",       no_argument,       NULL, ARG_COMMIT       },
                 { "print",        no_argument,       NULL, ARG_PRINT        },
-                { "image-policy", required_argument, NULL, ARG_IMAGE_POLICY },
                 {}
         };
 
@@ -103,6 +103,12 @@ static int parse_argv(int argc, char *argv[]) {
                                 return r;
                         break;
 
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
+                        if (r < 0)
+                                return r;
+                        break;
+
                 case ARG_COMMIT:
                         arg_commit = true;
                         break;
@@ -111,17 +117,6 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_print = true;
                         break;
 
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
-                        break;
-                }
                 case '?':
                         return -EINVAL;
 
index ff6a4375732e7c7f3650221c45306d82a84e0707..bb3a04c9e4a9d8928bcc69e12bb22f14521f1874 100644 (file)
@@ -1681,17 +1681,11 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_settings_mask |= SETTING_SUPPRESS_SYNC;
                         break;
 
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
                         if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
+                                return r;
                         break;
-                }
 
                 case '?':
                         return -EINVAL;
index 0da07ee12293b9af7e7e34e64039591e6b0bffce..3a4808d6a4a09d0c95daceb0d10eb9f99a2929d2 100644 (file)
@@ -5725,6 +5725,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_CAN_FACTORY_RESET,
                 ARG_ROOT,
                 ARG_IMAGE,
+                ARG_IMAGE_POLICY,
                 ARG_SEED,
                 ARG_PRETTY,
                 ARG_DEFINITIONS,
@@ -5743,7 +5744,6 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_DEFER_PARTITIONS,
                 ARG_SECTOR_SIZE,
                 ARG_SKIP_PARTITIONS,
-                ARG_IMAGE_POLICY,
         };
 
         static const struct option options[] = {
@@ -5758,6 +5758,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "can-factory-reset",    no_argument,       NULL, ARG_CAN_FACTORY_RESET    },
                 { "root",                 required_argument, NULL, ARG_ROOT                 },
                 { "image",                required_argument, NULL, ARG_IMAGE                },
+                { "image-policy",         required_argument, NULL, ARG_IMAGE_POLICY         },
                 { "seed",                 required_argument, NULL, ARG_SEED                 },
                 { "pretty",               required_argument, NULL, ARG_PRETTY               },
                 { "definitions",          required_argument, NULL, ARG_DEFINITIONS          },
@@ -5775,7 +5776,6 @@ static int parse_argv(int argc, char *argv[]) {
                 { "exclude-partitions",   required_argument, NULL, ARG_EXCLUDE_PARTITIONS   },
                 { "defer-partitions",     required_argument, NULL, ARG_DEFER_PARTITIONS     },
                 { "sector-size",          required_argument, NULL, ARG_SECTOR_SIZE          },
-                { "image-policy",         required_argument, NULL, ARG_IMAGE_POLICY         },
                 {}
         };
 
@@ -5858,6 +5858,12 @@ static int parse_argv(int argc, char *argv[]) {
                                 return r;
                         break;
 
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
+                        if (r < 0)
+                                return r;
+                        break;
+
                 case ARG_SEED:
                         if (isempty(optarg)) {
                                 arg_seed = SD_ID128_NULL;
@@ -6070,18 +6076,6 @@ static int parse_argv(int argc, char *argv[]) {
 
                         break;
 
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
-                        break;
-                }
-
                 case '?':
                         return -EINVAL;
 
index 8e27021b6661df0fe12a67f0b72466443fa4b11e..3c1f924a871ec1cd354319b66e5904428e672dae 100644 (file)
@@ -601,6 +601,69 @@ int image_policy_equivalent(const ImagePolicy *a, const ImagePolicy *b) {
         return true;
 }
 
+int config_parse_image_policy(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        _cleanup_(image_policy_freep) ImagePolicy *np = NULL;
+        ImagePolicy **p = ASSERT_PTR(data);
+        int r;
+
+        assert(rvalue);
+
+        if (isempty(rvalue)) {
+                *p = image_policy_free(*p);
+                return 0;
+        }
+
+        r = image_policy_from_string(rvalue, &np);
+        if (r == -ENOTUNIQ)
+                return log_syntax(unit, LOG_ERR, filename, line, r, "Duplicate rule in image policy, refusing: %s", rvalue);
+        if (r == -EBADSLT)
+                return log_syntax(unit, LOG_ERR, filename, line, r, "Unknown partition type in image policy, refusing: %s", rvalue);
+        if (r == -EBADRQC)
+                return log_syntax(unit, LOG_ERR, filename, line, r, "Unknown partition policy flag in image policy, refusing: %s", rvalue);
+        if (r < 0)
+                return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse image policy, refusing: %s", rvalue);
+
+        return free_and_replace_full(*p, np, image_policy_free);
+}
+
+int parse_image_policy_argument(const char *s, ImagePolicy **policy) {
+        _cleanup_(image_policy_freep) ImagePolicy *np = NULL;
+        int r;
+
+        assert(s);
+        assert(policy);
+
+        /*
+         * This function is intended to be used in command line parsers.
+         *
+         * NOTE THAT THIS WILL FREE THE PREVIOUS ARGUMENT POINTER ON SUCCESS!
+         * Hence, do not pass in uninitialized pointers.
+         */
+
+        r = image_policy_from_string(s, &np);
+        if (r == -ENOTUNIQ)
+                return log_error_errno(r, "Duplicate rule in image policy: %s", s);
+        if (r == -EBADSLT)
+                return log_error_errno(r, "Unknown partition type in image policy: %s", s);
+        if (r == -EBADRQC)
+                return log_error_errno(r, "Unknown partition policy flag in image policy: %s", s);
+        if (r < 0)
+                return log_error_errno(r, "Failed to parse image policy: %s", s);
+
+        return free_and_replace_full(*policy, np, image_policy_free);
+}
+
 const ImagePolicy image_policy_allow = {
         /* Allow policy */
         .n_policies = 0,
index 848b24c147f01f55a7693270ae8d31faef638fa3..1b3d068c721a01c8db64e1d45ccd94db2caf1235 100644 (file)
@@ -3,6 +3,7 @@
 
 typedef struct ImagePolicy ImagePolicy;
 
+#include "conf-parser.h"
 #include "dissect-image.h"
 #include "errno-list.h"
 
@@ -96,3 +97,6 @@ static inline ImagePolicy* image_policy_free(ImagePolicy *p) {
 }
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(ImagePolicy*, image_policy_free);
+
+CONFIG_PARSER_PROTOTYPE(config_parse_image_policy);
+int parse_image_policy_argument(const char *s, ImagePolicy **policy);
index df4092fea9f60f425d52b553e19c933046c1b4bd..e23785cc56b83856f7ffc32916a412fa6c12e494 100644 (file)
@@ -1023,17 +1023,12 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_force = true;
                         break;
 
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
                         if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
+                                return r;
                         break;
-                }
+
                 case '?':
                         return -EINVAL;
 
index 21e09536a6b112f46daf3cb47c9056a7c41b1881..201d64a1f999d43c57c417a5857fccff5422742e 100644 (file)
@@ -428,6 +428,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
                 ARG_NO_WALL,
                 ARG_ROOT,
                 ARG_IMAGE,
+                ARG_IMAGE_POLICY,
                 ARG_NO_RELOAD,
                 ARG_KILL_WHOM,
                 ARG_KILL_VALUE,
@@ -454,7 +455,6 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
                 ARG_NO_WARN,
                 ARG_DROP_IN,
                 ARG_WHEN,
-                ARG_IMAGE_POLICY,
         };
 
         static const struct option options[] = {
@@ -490,6 +490,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
                 { "no-warn",             no_argument,       NULL, ARG_NO_WARN             },
                 { "root",                required_argument, NULL, ARG_ROOT                },
                 { "image",               required_argument, NULL, ARG_IMAGE               },
+                { "image-policy",        required_argument, NULL, ARG_IMAGE_POLICY        },
                 { "force",               no_argument,       NULL, 'f'                     },
                 { "no-reload",           no_argument,       NULL, ARG_NO_RELOAD           },
                 { "kill-whom",           required_argument, NULL, ARG_KILL_WHOM           },
@@ -520,7 +521,6 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
                 { "marked",              no_argument,       NULL, ARG_MARKED              },
                 { "drop-in",             required_argument, NULL, ARG_DROP_IN             },
                 { "when",                required_argument, NULL, ARG_WHEN                },
-                { "image-policy",        required_argument, NULL, ARG_IMAGE_POLICY        },
                 {}
         };
 
@@ -706,6 +706,12 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
                                 return r;
                         break;
 
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
+                        if (r < 0)
+                                return r;
+                        break;
+
                 case 'l':
                         arg_full = true;
                         break;
@@ -1010,18 +1016,6 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
 
                         break;
 
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
-                        break;
-                }
-
                 case '.':
                         /* Output an error mimicking getopt, and print a hint afterwards */
                         log_error("%s: invalid option -- '.'", program_invocation_name);
index f62e1930562ce4b9893213812d661d20e6fc8e0d..29cd552ea884e776ad8029cb795585a809cc0522 100644 (file)
@@ -1241,9 +1241,9 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_JSON,
                 ARG_ROOT,
                 ARG_IMAGE,
+                ARG_IMAGE_POLICY,
                 ARG_REBOOT,
                 ARG_VERIFY,
-                ARG_IMAGE_POLICY,
         };
 
         static const struct option options[] = {
@@ -1257,10 +1257,10 @@ static int parse_argv(int argc, char *argv[]) {
                 { "json",              required_argument, NULL, ARG_JSON              },
                 { "root",              required_argument, NULL, ARG_ROOT              },
                 { "image",             required_argument, NULL, ARG_IMAGE             },
+                { "image-policy",      required_argument, NULL, ARG_IMAGE_POLICY      },
                 { "reboot",            no_argument,       NULL, ARG_REBOOT            },
                 { "component",         required_argument, NULL, 'C'                   },
                 { "verify",            required_argument, NULL, ARG_VERIFY            },
-                { "image-policy",      required_argument, NULL, ARG_IMAGE_POLICY      },
                 {}
         };
 
@@ -1325,6 +1325,12 @@ static int parse_argv(int argc, char *argv[]) {
                                 return r;
                         break;
 
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
+                        if (r < 0)
+                                return r;
+                        break;
+
                 case ARG_REBOOT:
                         arg_reboot = true;
                         break;
@@ -1358,17 +1364,6 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
                 }
 
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
-                        break;
-                }
                 case '?':
                         return -EINVAL;
 
index a2d62121e0b7289e6d7577ce6ca14e8547ae9803..58246b5d852381c0d53584ac327bb2eec823a062 100644 (file)
@@ -1985,11 +1985,11 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_CAT_CONFIG,
                 ARG_ROOT,
                 ARG_IMAGE,
+                ARG_IMAGE_POLICY,
                 ARG_REPLACE,
                 ARG_DRY_RUN,
                 ARG_INLINE,
                 ARG_NO_PAGER,
-                ARG_IMAGE_POLICY,
         };
 
         static const struct option options[] = {
@@ -1998,11 +1998,11 @@ static int parse_argv(int argc, char *argv[]) {
                 { "cat-config",   no_argument,       NULL, ARG_CAT_CONFIG   },
                 { "root",         required_argument, NULL, ARG_ROOT         },
                 { "image",        required_argument, NULL, ARG_IMAGE        },
+                { "image-policy", required_argument, NULL, ARG_IMAGE_POLICY },
                 { "replace",      required_argument, NULL, ARG_REPLACE      },
                 { "dry-run",      no_argument,       NULL, ARG_DRY_RUN      },
                 { "inline",       no_argument,       NULL, ARG_INLINE       },
                 { "no-pager",     no_argument,       NULL, ARG_NO_PAGER     },
-                { "image-policy", required_argument, NULL, ARG_IMAGE_POLICY },
                 {}
         };
 
@@ -2042,6 +2042,12 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 #endif
 
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
+                        if (r < 0)
+                                return r;
+                        break;
+
                 case ARG_REPLACE:
                         if (!path_is_absolute(optarg) ||
                             !endswith(optarg, ".conf"))
@@ -2063,17 +2069,6 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_pager_flags |= PAGER_DISABLE;
                         break;
 
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
-                        break;
-                }
                 case '?':
                         return -EINVAL;
 
index fdabd7d2c56597b9e1a07acaec7154e9ea6854e9..3adafcae83f9fd152a619f80a29fff86e7402149 100644 (file)
@@ -3727,9 +3727,9 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_EXCLUDE_PREFIX,
                 ARG_ROOT,
                 ARG_IMAGE,
+                ARG_IMAGE_POLICY,
                 ARG_REPLACE,
                 ARG_NO_PAGER,
-                ARG_IMAGE_POLICY,
         };
 
         static const struct option options[] = {
@@ -3745,9 +3745,9 @@ static int parse_argv(int argc, char *argv[]) {
                 { "exclude-prefix", required_argument,   NULL, ARG_EXCLUDE_PREFIX },
                 { "root",           required_argument,   NULL, ARG_ROOT           },
                 { "image",          required_argument,   NULL, ARG_IMAGE          },
+                { "image-policy",   required_argument,   NULL, ARG_IMAGE_POLICY   },
                 { "replace",        required_argument,   NULL, ARG_REPLACE        },
                 { "no-pager",       no_argument,         NULL, ARG_NO_PAGER       },
-                { "image-policy",   required_argument,   NULL, ARG_IMAGE_POLICY   },
                 {}
         };
 
@@ -3825,6 +3825,12 @@ static int parse_argv(int argc, char *argv[]) {
 
                         break;
 
+                case ARG_IMAGE_POLICY:
+                        r = parse_image_policy_argument(optarg, &arg_image_policy);
+                        if (r < 0)
+                                return r;
+                        break;
+
                 case ARG_REPLACE:
                         if (!path_is_absolute(optarg) ||
                             !endswith(optarg, ".conf"))
@@ -3838,17 +3844,6 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_pager_flags |= PAGER_DISABLE;
                         break;
 
-                case ARG_IMAGE_POLICY: {
-                        _cleanup_(image_policy_freep) ImagePolicy *p = NULL;
-
-                        r = image_policy_from_string(optarg, &p);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse image policy: %s", optarg);
-
-                        image_policy_free(arg_image_policy);
-                        arg_image_policy = TAKE_PTR(p);
-                        break;
-                }
                 case '?':
                         return -EINVAL;