1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
5 #include "analyze-condition.h"
7 #include "conf-parser.h"
8 #include "load-fragment.h"
11 static int parse_condition(Unit
*u
, const char *line
) {
15 for (ConditionType t
= 0; t
< _CONDITION_TYPE_MAX
; t
++) {
16 ConfigParserCallback callback
;
20 name
= condition_type_to_string(t
);
21 p
= startswith(line
, name
);
23 target
= &u
->conditions
;
25 name
= assert_type_to_string(t
);
26 p
= startswith(line
, name
);
33 p
+= strspn(p
, WHITESPACE
);
39 p
+= strspn(p
, WHITESPACE
);
41 if (condition_takes_path(t
))
42 callback
= config_parse_unit_condition_path
;
44 callback
= config_parse_unit_condition_string
;
46 return callback(NULL
, "(cmdline)", 0, NULL
, 0, name
, t
, p
, target
, u
);
49 return log_error_errno(SYNTHETIC_ERRNO(EINVAL
), "Cannot parse \"%s\".", line
);
53 static int log_helper(void *userdata
, int level
, int error
, const char *file
, int line
, const char *func
, const char *format
, ...) {
60 /* "upgrade" debug messages */
61 level
= MIN(LOG_INFO
, level
);
64 r
= log_object_internalv(level
, error
, file
, line
, func
,
75 int verify_conditions(char **lines
, UnitFileScope scope
) {
76 _cleanup_(manager_freep
) Manager
*m
= NULL
;
81 r
= manager_new(scope
, MANAGER_TEST_RUN_MINIMAL
, &m
);
83 return log_error_errno(r
, "Failed to initialize manager: %m");
85 log_debug("Starting manager...");
86 r
= manager_startup(m
, /* serialization= */ NULL
, /* fds= */ NULL
, /* root= */ NULL
);
90 r
= unit_new_for_name(m
, sizeof(Service
), "test.service", &u
);
92 return log_error_errno(r
, "Failed to create test.service: %m");
94 STRV_FOREACH(line
, lines
) {
95 r
= parse_condition(u
, *line
);
100 r
= condition_test_list(u
->asserts
, environ
, assert_type_to_string
, log_helper
, u
);
102 log_notice("Asserts %s.", r
> 0 ? "succeeded" : "failed");
104 q
= condition_test_list(u
->conditions
, environ
, condition_type_to_string
, log_helper
, u
);
106 log_notice("Conditions %s.", q
> 0 ? "succeeded" : "failed");
108 return r
> 0 && q
> 0 ? 0 : -EIO
;