if (size != 0)
assert_se(fwrite(data, size, 1, f) == 1);
assert_se(fclose(f) == 0);
- rules = udev_rules_new(RESOLVE_NAME_EARLY);
- assert_se(cleanup_fake_filesystems(runtime_dir) >= 0);
+ assert_se(udev_rules_new(&rules, RESOLVE_NAME_EARLY) == 0);
+ assert_se(cleanup_fake_filesystems(runtime_dir) >= 0);
return 0;
}
return 0;
}
-struct udev_rules *udev_rules_new(ResolveNameTiming resolve_name_timing) {
- struct udev_rules *rules;
- struct token end_token;
- char **files, **f;
+int udev_rules_new(struct udev_rules **ret_rules, ResolveNameTiming resolve_name_timing) {
+ _cleanup_(udev_rules_freep) struct udev_rules *rules = NULL;
+ _cleanup_strv_free_ char **files = NULL;
+ char **f;
int r;
assert(resolve_name_timing >= 0 && resolve_name_timing < _RESOLVE_NAME_TIMING_MAX);
rules = new(struct udev_rules, 1);
if (!rules)
- return NULL;
+ return -ENOMEM;
*rules = (struct udev_rules) {
.resolve_name_timing = resolve_name_timing,
/* init token array and string buffer */
rules->tokens = malloc_multiply(PREALLOC_TOKEN, sizeof(struct token));
if (!rules->tokens)
- return udev_rules_free(rules);
+ return -ENOMEM;
rules->token_max = PREALLOC_TOKEN;
rules->strbuf = strbuf_new();
if (!rules->strbuf)
- return udev_rules_free(rules);
+ return -ENOMEM;
udev_rules_check_timestamp(rules);
r = conf_files_list_strv(&files, ".rules", NULL, 0, rules_dirs);
- if (r < 0) {
- log_error_errno(r, "Failed to enumerate rules files: %m");
- return udev_rules_free(rules);
- }
+ if (r < 0)
+ return log_error_errno(r, "Failed to enumerate rules files: %m");
/*
* The offset value in the rules strct is limited; add all
STRV_FOREACH(f, files)
parse_file(rules, *f);
- strv_free(files);
-
- memzero(&end_token, sizeof(struct token));
- end_token.type = TK_END;
+ struct token end_token = { .type = TK_END };
add_token(rules, &end_token);
log_debug("Rules contain %zu bytes tokens (%u * %zu bytes), %zu bytes strings",
rules->token_max * sizeof(struct token), rules->token_max, sizeof(struct token), rules->strbuf->len);
rules->gids_max = 0;
dump_rules(rules);
- return rules;
+ *ret_rules = TAKE_PTR(rules);
+ return 0;
}
struct udev_rules *udev_rules_free(struct udev_rules *rules) {
/* udev-rules.c */
struct udev_rules;
-struct udev_rules *udev_rules_new(ResolveNameTiming resolve_name_timing);
+int udev_rules_new(struct udev_rules **ret_rules, ResolveNameTiming resolve_name_timing);
struct udev_rules *udev_rules_free(struct udev_rules *rules);
+
bool udev_rules_check_timestamp(struct udev_rules *rules);
int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event,
usec_t timeout_usec,
udev_builtin_init();
if (!manager->rules) {
- manager->rules = udev_rules_new(arg_resolve_name_timing);
- if (!manager->rules)
+ r = udev_rules_new(&manager->rules, arg_resolve_name_timing);
+ if (r < 0) {
+ log_warning_errno(r, "Failed to read udev rules: %m");
return;
+ }
}
LIST_FOREACH(event, event, manager->events) {
udev_builtin_init();
- manager->rules = udev_rules_new(arg_resolve_name_timing);
+ r = udev_rules_new(&manager->rules, arg_resolve_name_timing);
if (!manager->rules)
- return log_error_errno(SYNTHETIC_ERRNO(ENOMEM), "Failed to read udev rules");
+ return log_error_errno(r, "Failed to read udev rules: %m");
manager->ctrl = udev_ctrl_new_from_fd(fd_ctrl);
if (!manager->ctrl)