assert(u->load_state == UNIT_STUB);
/* Load a .automount file */
- r = unit_load_fragment_and_dropin(u);
+ r = unit_load_fragment_and_dropin(u, true);
if (r < 0)
return r;
static int device_load(Unit *u) {
int r;
- r = unit_load_fragment_and_dropin_optional(u);
+ r = unit_load_fragment_and_dropin(u, false);
if (r < 0)
return r;
r = mount_load_root_mount(u);
- if (m->from_proc_self_mountinfo || u->perpetual)
- q = unit_load_fragment_and_dropin_optional(u);
- else
- q = unit_load_fragment_and_dropin(u);
+ bool fragment_optional = m->from_proc_self_mountinfo || u->perpetual;
+ q = unit_load_fragment_and_dropin(u, !fragment_optional);
/* Add in some extras. Note we do this in all cases (even if we failed to load the unit) when announced by the
* kernel, because we need some things to be set up no matter what when the kernel establishes a mount and thus
assert(u);
assert(u->load_state == UNIT_STUB);
- r = unit_load_fragment_and_dropin(u);
+ r = unit_load_fragment_and_dropin(u, true);
if (r < 0)
return r;
r = scope_load_init_scope(u);
if (r < 0)
return r;
- r = unit_load_fragment_and_dropin_optional(u);
+
+ r = unit_load_fragment_and_dropin(u, false);
if (r < 0)
return r;
if (r < 0)
return r;
- r = unit_load_fragment_and_dropin_optional(u);
+ r = unit_load_fragment_and_dropin(u, false);
if (r < 0)
return r;
if (r < 0)
return r;
- r = unit_load_fragment_and_dropin(u);
+ r = unit_load_fragment_and_dropin(u, true);
if (r < 0)
return r;
assert(u->load_state == UNIT_STUB);
/* Load a .swap file */
- if (SWAP(u)->from_proc_swaps)
- r = unit_load_fragment_and_dropin_optional(u);
- else
- r = unit_load_fragment_and_dropin(u);
+ bool fragment_optional = s->from_proc_swaps;
+ r = unit_load_fragment_and_dropin(u, !fragment_optional);
/* Add in some extras, and do so either when we successfully loaded something or when /proc/swaps is already
* active. */
assert(t);
- r = unit_load_fragment_and_dropin(u);
+ r = unit_load_fragment_and_dropin(u, true);
if (r < 0)
return r;
assert(u);
assert(u->load_state == UNIT_STUB);
- r = unit_load_fragment_and_dropin(u);
+ r = unit_load_fragment_and_dropin(u, true);
if (r < 0)
return r;
}
/* Common implementation for multiple backends */
-int unit_load_fragment_and_dropin(Unit *u) {
+int unit_load_fragment_and_dropin(Unit *u, bool fragment_required) {
int r;
assert(u);
if (r < 0)
return r;
- if (u->load_state == UNIT_STUB)
- return -ENOENT;
+ if (u->load_state == UNIT_STUB) {
+ if (fragment_required)
+ return -ENOENT;
+
+ u->load_state = UNIT_LOADED;
+ }
/* Load drop-in directory data. If u is an alias, we might be reloading the
* target unit needlessly. But we cannot be sure which drops-ins have already
return unit_load_dropin(unit_follow_merge(u));
}
-/* Common implementation for multiple backends */
-int unit_load_fragment_and_dropin_optional(Unit *u) {
- int r;
-
- assert(u);
-
- /* Same as unit_load_fragment_and_dropin(), but whether
- * something can be loaded or not doesn't matter. */
-
- /* Load a .service/.socket/.slice/… file */
- r = unit_load_fragment(u);
- if (r < 0)
- return r;
-
- if (u->load_state == UNIT_STUB)
- u->load_state = UNIT_LOADED;
-
- /* Load drop-in directory data */
- return unit_load_dropin(unit_follow_merge(u));
-}
-
void unit_add_to_target_deps_queue(Unit *u) {
Manager *m = u->manager;
Unit *unit_follow_merge(Unit *u) _pure_;
-int unit_load_fragment_and_dropin(Unit *u);
-int unit_load_fragment_and_dropin_optional(Unit *u);
+int unit_load_fragment_and_dropin(Unit *u, bool fragment_required);
int unit_load(Unit *unit);
int unit_set_slice(Unit *u, Unit *slice);