log_info("Applying preset policy.");
r = unit_file_preset_all(RUNTIME_SCOPE_SYSTEM, /* file_flags= */ 0,
/* root_dir= */ NULL, mode, &changes, &n_changes);
- install_changes_dump(r, "preset", changes, n_changes, /* quiet= */ false);
- if (r < 0)
- log_full_errno(r == -EEXIST ? LOG_NOTICE : LOG_WARNING, r,
- "Failed to populate /etc with preset unit settings, ignoring: %m");
- else
+ r = install_changes_dump(r, "preset all", changes, n_changes, /* quiet= */ false);
+ if (r >= 0)
log_info("Populated /etc with preset unit settings.");
}
return 0;
}
-void install_changes_dump(
+int install_changes_dump(
int error,
const char *verb,
const InstallChange *changes,
assert(verb || error >= 0);
assert(changes || n_changes == 0);
+ /* An error is returned if 'error' contains an error or if any of the changes failed. */
+
FOREACH_ARRAY(i, changes, n_changes)
if (i->type >= 0) {
if (!quiet)
r = install_change_dump_error(i, &err_message, /* ret_bus_error= */ NULL);
if (r == -ENOMEM)
- return (void) log_oom();
+ return log_oom();
if (r < 0)
- log_error_errno(r, "Failed to %s unit %s: %m", verb, i->path);
+ RET_GATHER(error,
+ log_error_errno(r, "Failed to %s unit %s: %m", verb, i->path));
else
- log_error_errno(i->type, "Failed to %s unit: %s", verb, err_message);
+ RET_GATHER(error,
+ log_error_errno(i->type, "Failed to %s unit: %s", verb, err_message));
err_logged = true;
}
if (error < 0 && !err_logged)
- log_error_errno(error, "Failed to %s unit: %m.", verb);
+ log_error_errno(error, "Failed to %s units: %m.", verb);
+
+ return error;
}
/**
STRV_FOREACH(name, names) {
r = preset_prepare_one(scope, &plus, &minus, &lp, *name, &presets, changes, n_changes);
- if (r < 0)
+ if (r < 0 && !ERRNO_IS_NEG_UNIT_ISSUE(r))
return r;
}
void install_changes_free(InstallChange *changes, size_t n_changes);
int install_change_dump_error(const InstallChange *change, char **ret_errmsg, const char **ret_bus_error);
-void install_changes_dump(
+int install_changes_dump(
int error,
const char *verb,
const InstallChange *changes,
CLEANUP_ARRAY(changes, n_changes, install_changes_free);
r = unit_file_add_dependency(arg_runtime_scope, unit_file_flags_from_args(), arg_root, names, target, dep, &changes, &n_changes);
- install_changes_dump(r, "add dependency on", changes, n_changes, arg_quiet);
+ r = install_changes_dump(r, "add dependency on", changes, n_changes, arg_quiet);
if (r < 0)
return r;
} else {
else
assert_not_reached();
- install_changes_dump(r, verb, changes, n_changes, arg_quiet);
+ r = install_changes_dump(r, verb, changes, n_changes, arg_quiet);
if (r < 0)
return r;
}
CLEANUP_ARRAY(changes, n_changes, install_changes_free);
r = unit_file_preset_all(arg_runtime_scope, unit_file_flags_from_args(), arg_root, arg_preset_mode, &changes, &n_changes);
- install_changes_dump(r, "preset", changes, n_changes, arg_quiet);
+ /* We do not treat propagate failure of individual units here. */
+ (void) install_changes_dump(r, "preset all", changes, n_changes, arg_quiet);
if (r < 0)
return r;
} else {
CLEANUP_ARRAY(changes, n_changes, install_changes_free);
r = unit_file_set_default(arg_runtime_scope, UNIT_FILE_FORCE, arg_root, unit, &changes, &n_changes);
- install_changes_dump(r, "set default", changes, n_changes, arg_quiet);
+ r = install_changes_dump(r, "set default", changes, n_changes, arg_quiet);
if (r < 0)
return r;
} else {