tmpfiles: define main through macro
This commit is contained in:
parent
71a0be76cd
commit
87938c3bea
|
@ -39,6 +39,7 @@
|
|||
#include "label.h"
|
||||
#include "log.h"
|
||||
#include "macro.h"
|
||||
#include "main-func.h"
|
||||
#include "missing.h"
|
||||
#include "mkdir.h"
|
||||
#include "mountpoint-util.h"
|
||||
|
@ -172,6 +173,13 @@ static char *arg_replace = NULL;
|
|||
static OrderedHashmap *items = NULL, *globs = NULL;
|
||||
static Set *unix_sockets = NULL;
|
||||
|
||||
STATIC_DESTRUCTOR_REGISTER(items, ordered_hashmap_freep);
|
||||
STATIC_DESTRUCTOR_REGISTER(globs, ordered_hashmap_freep);
|
||||
STATIC_DESTRUCTOR_REGISTER(unix_sockets, set_free_freep);
|
||||
STATIC_DESTRUCTOR_REGISTER(arg_include_prefixes, freep);
|
||||
STATIC_DESTRUCTOR_REGISTER(arg_exclude_prefixes, freep);
|
||||
STATIC_DESTRUCTOR_REGISTER(arg_root, freep);
|
||||
|
||||
static int specifier_machine_id_safe(char specifier, void *data, void *userdata, char **ret);
|
||||
static int specifier_directory(char specifier, void *data, void *userdata, char **ret);
|
||||
|
||||
|
@ -2318,18 +2326,18 @@ static void item_free_contents(Item *i) {
|
|||
#endif
|
||||
}
|
||||
|
||||
static void item_array_free(ItemArray *a) {
|
||||
static ItemArray* item_array_free(ItemArray *a) {
|
||||
size_t n;
|
||||
|
||||
if (!a)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
for (n = 0; n < a->n_items; n++)
|
||||
item_free_contents(a->items + n);
|
||||
|
||||
set_free(a->children);
|
||||
free(a->items);
|
||||
free(a);
|
||||
return mfree(a);
|
||||
}
|
||||
|
||||
static int item_compare(const Item *a, const Item *b) {
|
||||
|
@ -3149,9 +3157,11 @@ static int link_parent(ItemArray *a) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(item_array_hash_ops, char, string_hash_func, string_compare_func,
|
||||
ItemArray, item_array_free);
|
||||
|
||||
static int run(int argc, char *argv[]) {
|
||||
_cleanup_strv_free_ char **config_dirs = NULL;
|
||||
int r, k, r_process = 0;
|
||||
bool invalid_config = false;
|
||||
Iterator iterator;
|
||||
ItemArray *a;
|
||||
|
@ -3160,25 +3170,22 @@ int main(int argc, char *argv[]) {
|
|||
PHASE_CREATE,
|
||||
_PHASE_MAX
|
||||
} phase;
|
||||
int r, k;
|
||||
|
||||
r = parse_argv(argc, argv);
|
||||
if (r <= 0)
|
||||
goto finish;
|
||||
return r;
|
||||
|
||||
log_setup_service();
|
||||
|
||||
if (arg_user) {
|
||||
r = user_config_paths(&config_dirs);
|
||||
if (r < 0) {
|
||||
log_error_errno(r, "Failed to initialize configuration directory list: %m");
|
||||
goto finish;
|
||||
}
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to initialize configuration directory list: %m");
|
||||
} else {
|
||||
config_dirs = strv_split_nulstr(CONF_PATHS_NULSTR("tmpfiles.d"));
|
||||
if (!config_dirs) {
|
||||
r = log_oom();
|
||||
goto finish;
|
||||
}
|
||||
if (!config_dirs)
|
||||
return log_oom();
|
||||
}
|
||||
|
||||
if (DEBUG_LOGGING) {
|
||||
|
@ -3192,21 +3199,17 @@ int main(int argc, char *argv[]) {
|
|||
if (arg_cat_config) {
|
||||
(void) pager_open(arg_pager_flags);
|
||||
|
||||
r = cat_config(config_dirs, argv + optind);
|
||||
goto finish;
|
||||
return cat_config(config_dirs, argv + optind);
|
||||
}
|
||||
|
||||
umask(0022);
|
||||
|
||||
mac_selinux_init();
|
||||
|
||||
items = ordered_hashmap_new(&string_hash_ops);
|
||||
globs = ordered_hashmap_new(&string_hash_ops);
|
||||
|
||||
if (!items || !globs) {
|
||||
r = log_oom();
|
||||
goto finish;
|
||||
}
|
||||
items = ordered_hashmap_new(&item_array_hash_ops);
|
||||
globs = ordered_hashmap_new(&item_array_hash_ops);
|
||||
if (!items || !globs)
|
||||
return log_oom();
|
||||
|
||||
/* If command line arguments are specified along with --replace, read all
|
||||
* configuration files and insert the positional arguments at the specified
|
||||
|
@ -3219,18 +3222,18 @@ int main(int argc, char *argv[]) {
|
|||
else
|
||||
r = parse_arguments(config_dirs, argv + optind, &invalid_config);
|
||||
if (r < 0)
|
||||
goto finish;
|
||||
return r;
|
||||
|
||||
/* Let's now link up all child/parent relationships */
|
||||
ORDERED_HASHMAP_FOREACH(a, items, iterator) {
|
||||
r = link_parent(a);
|
||||
if (r < 0)
|
||||
goto finish;
|
||||
return r;
|
||||
}
|
||||
ORDERED_HASHMAP_FOREACH(a, globs, iterator) {
|
||||
r = link_parent(a);
|
||||
if (r < 0)
|
||||
goto finish;
|
||||
return r;
|
||||
}
|
||||
|
||||
/* If multiple operations are requested, let's first run the remove/clean operations, and only then the create
|
||||
|
@ -3251,38 +3254,25 @@ int main(int argc, char *argv[]) {
|
|||
/* The non-globbing ones usually create things, hence we apply them first */
|
||||
ORDERED_HASHMAP_FOREACH(a, items, iterator) {
|
||||
k = process_item_array(a, op);
|
||||
if (k < 0 && r_process == 0)
|
||||
r_process = k;
|
||||
if (k < 0 && r >= 0)
|
||||
r = k;
|
||||
}
|
||||
|
||||
/* The globbing ones usually alter things, hence we apply them second. */
|
||||
ORDERED_HASHMAP_FOREACH(a, globs, iterator) {
|
||||
k = process_item_array(a, op);
|
||||
if (k < 0 && r_process == 0)
|
||||
r_process = k;
|
||||
if (k < 0 && r >= 0)
|
||||
r = k;
|
||||
}
|
||||
}
|
||||
|
||||
finish:
|
||||
pager_close();
|
||||
|
||||
ordered_hashmap_free_with_destructor(items, item_array_free);
|
||||
ordered_hashmap_free_with_destructor(globs, item_array_free);
|
||||
|
||||
free(arg_include_prefixes);
|
||||
free(arg_exclude_prefixes);
|
||||
free(arg_root);
|
||||
|
||||
set_free_free(unix_sockets);
|
||||
|
||||
mac_selinux_finish();
|
||||
|
||||
if (r < 0 || ERRNO_IS_RESOURCE(-r_process))
|
||||
return EXIT_FAILURE;
|
||||
else if (invalid_config)
|
||||
if (ERRNO_IS_RESOURCE(-r))
|
||||
return r;
|
||||
if (invalid_config)
|
||||
return EX_DATAERR;
|
||||
else if (r_process < 0)
|
||||
if (r < 0)
|
||||
return EX_CANTCREAT;
|
||||
else
|
||||
return EXIT_SUCCESS;
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run);
|
||||
|
|
Loading…
Reference in a new issue