#include <stdio.h>
#include "alloc-util.h"
+#include "bitfield.h"
#include "conf-files.h"
#include "env-file.h"
#include "env-util.h"
return r;
}
-int exec_command_flags_from_strv(char **ex_opts, ExecCommandFlags *flags) {
- ExecCommandFlags ex_flag, ret_flags = 0;
+int exec_command_flags_from_strv(char * const *ex_opts, ExecCommandFlags *ret) {
+ ExecCommandFlags flags = 0;
- assert(flags);
+ assert(ret);
STRV_FOREACH(opt, ex_opts) {
- ex_flag = exec_command_flags_from_string(*opt);
- if (ex_flag < 0)
- return ex_flag;
- ret_flags |= ex_flag;
+ ExecCommandFlags fl = exec_command_flags_from_string(*opt);
+ if (fl < 0)
+ return fl;
+
+ flags |= fl;
}
- *flags = ret_flags;
+ *ret = flags;
return 0;
}
-int exec_command_flags_to_strv(ExecCommandFlags flags, char ***ex_opts) {
- _cleanup_strv_free_ char **ret_opts = NULL;
- ExecCommandFlags it = flags;
- const char *str;
+int exec_command_flags_to_strv(ExecCommandFlags flags, char ***ret) {
+ _cleanup_strv_free_ char **opts = NULL;
int r;
- assert(ex_opts);
-
- if (flags < 0)
- return flags;
+ assert(flags >= 0);
+ assert(ret);
- for (unsigned i = 0; it != 0; it &= ~(1 << i), i++)
- if (FLAGS_SET(flags, (1 << i))) {
- str = exec_command_flags_to_string(1 << i);
- if (!str)
- return -EINVAL;
+ BIT_FOREACH(i, flags) {
+ const char *s = exec_command_flags_to_string(1 << i);
+ if (!s)
+ return -EINVAL;
- r = strv_extend(&ret_opts, str);
- if (r < 0)
- return r;
- }
+ r = strv_extend(&opts, s);
+ if (r < 0)
+ return r;
+ }
- *ex_opts = TAKE_PTR(ret_opts);
+ *ret = TAKE_PTR(opts);
return 0;
}
char *envp[],
ExecDirFlags flags);
-int exec_command_flags_from_strv(char **ex_opts, ExecCommandFlags *flags);
-int exec_command_flags_to_strv(ExecCommandFlags flags, char ***ex_opts);
+int exec_command_flags_from_strv(char * const *ex_opts, ExecCommandFlags *ret);
+int exec_command_flags_to_strv(ExecCommandFlags flags, char ***ret);
extern const gather_stdout_callback_t gather_environment[_STDOUT_CONSUME_MAX];
}
TEST(exec_command_flags_to_strv) {
- _cleanup_strv_free_ char **opts = NULL, **empty_opts = NULL, **invalid_opts = NULL;
- ExecCommandFlags flags = 0;
- int r;
-
- flags |= (EXEC_COMMAND_AMBIENT_MAGIC|EXEC_COMMAND_NO_ENV_EXPAND|EXEC_COMMAND_IGNORE_FAILURE);
-
- r = exec_command_flags_to_strv(flags, &opts);
+ _cleanup_strv_free_ char **opts = NULL;
- assert_se(r == 0);
+ ASSERT_OK(exec_command_flags_to_strv(EXEC_COMMAND_AMBIENT_MAGIC|EXEC_COMMAND_NO_ENV_EXPAND|EXEC_COMMAND_IGNORE_FAILURE, &opts));
assert_se(strv_equal(opts, STRV_MAKE("ignore-failure", "ambient", "no-env-expand")));
- r = exec_command_flags_to_strv(0, &empty_opts);
-
- assert_se(r == 0);
- assert_se(strv_equal(empty_opts, STRV_MAKE_EMPTY));
+ opts = strv_free(opts);
- flags = _EXEC_COMMAND_FLAGS_INVALID;
+ ASSERT_OK(exec_command_flags_to_strv(0, &opts));
+ assert_se(strv_isempty(opts));
- r = exec_command_flags_to_strv(flags, &invalid_opts);
+ opts = strv_free(opts);
- assert_se(r == -EINVAL);
+ ASSERT_ERROR(exec_command_flags_to_strv(1U << 20, &opts), EINVAL);
}
DEFINE_TEST_MAIN(LOG_DEBUG);