From 79153f2d6a9980aafdf2a45324a91f4241ceb1b4 Mon Sep 17 00:00:00 2001 From: Kevin Mihelich Date: Tue, 23 Jun 2015 02:00:02 +0000 Subject: [PATCH] core/systemd to 221-1 --- ...n-jobs-or-touch-other-units-during-c.patch | 376 -------- ...e-removed-devices-to-state-tentative.patch | 34 - .../0001-core-rework-device-state-logic.patch | 910 ------------------ ...eserializing-match-same-files-reache.patch | 135 --- ...ected-to-pipes-for-stdin-stdout-pass.patch | 293 ------ ...iles-Fix-handling-of-duplicate-lines.patch | 34 - ...avoid-creating-duplicate-acl-entries.patch | 129 --- ...dependencies-between-mount-and-devic.patch | 31 - ...refix-for-the-container-bus-on-dbus1.patch | 28 - ...5235934fabe5a3e6a9d47f4812f81034c427.patch | 282 ------ core/systemd/PKGBUILD | 93 +- core/systemd/arch.conf | 7 + core/systemd/initcpio-install-systemd | 1 + core/systemd/loader.conf | 1 + core/systemd/splash-arch.bmp | Bin 0 -> 378226 bytes 15 files changed, 47 insertions(+), 2307 deletions(-) delete mode 100644 core/systemd/0001-core-do-not-spawn-jobs-or-touch-other-units-during-c.patch delete mode 100644 core/systemd/0001-core-don-t-change-removed-devices-to-state-tentative.patch delete mode 100644 core/systemd/0001-core-rework-device-state-logic.patch delete mode 100644 core/systemd/0001-core-shared-in-deserializing-match-same-files-reache.patch delete mode 100644 core/systemd/0001-nspawn-when-connected-to-pipes-for-stdin-stdout-pass.patch delete mode 100644 core/systemd/0001-tmpfiles-Fix-handling-of-duplicate-lines.patch delete mode 100644 core/systemd/0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch delete mode 100644 core/systemd/0001-unit-use-weaker-dependencies-between-mount-and-devic.patch delete mode 100644 core/systemd/0001-use-x-machine-unix-prefix-for-the-container-bus-on-dbus1.patch delete mode 100644 core/systemd/5bac5235934fabe5a3e6a9d47f4812f81034c427.patch create mode 100644 core/systemd/arch.conf create mode 100644 core/systemd/loader.conf create mode 100755 core/systemd/splash-arch.bmp diff --git a/core/systemd/0001-core-do-not-spawn-jobs-or-touch-other-units-during-c.patch b/core/systemd/0001-core-do-not-spawn-jobs-or-touch-other-units-during-c.patch deleted file mode 100644 index f1d7c0461..000000000 --- a/core/systemd/0001-core-do-not-spawn-jobs-or-touch-other-units-during-c.patch +++ /dev/null @@ -1,376 +0,0 @@ -From 6e392c9c45643d106673c6643ac8bf4e65da13c1 Mon Sep 17 00:00:00 2001 -From: Ivan Shapovalov -Date: Sat, 7 Mar 2015 08:44:52 -0500 -Subject: [PATCH] core: do not spawn jobs or touch other units during - coldplugging - -Because the order of coldplugging is not defined, we can reference a -not-yet-coldplugged unit and read its state while it has not yet been -set to a meaningful value. - -This way, already active units may get started again. - -We fix this by deferring such actions until all units have been at -least somehow coldplugged. - -Fixes https://bugs.freedesktop.org/show_bug.cgi?id=88401 ---- - src/core/automount.c | 2 +- - src/core/busname.c | 2 +- - src/core/device.c | 2 +- - src/core/manager.c | 35 +++++++++++++++++++++++++++++++++-- - src/core/mount.c | 2 +- - src/core/path.c | 14 ++++++++++---- - src/core/scope.c | 2 +- - src/core/service.c | 2 +- - src/core/slice.c | 2 +- - src/core/snapshot.c | 2 +- - src/core/socket.c | 2 +- - src/core/swap.c | 2 +- - src/core/target.c | 2 +- - src/core/timer.c | 14 ++++++++++---- - src/core/unit.c | 25 ++++++++++++++++--------- - src/core/unit.h | 12 +++++++++--- - 16 files changed, 89 insertions(+), 33 deletions(-) - -diff --git a/src/core/automount.c b/src/core/automount.c -index 4a509ef..0539fbb 100644 ---- a/src/core/automount.c -+++ b/src/core/automount.c -@@ -233,7 +233,7 @@ static void automount_set_state(Automount *a, AutomountState state) { - unit_notify(UNIT(a), state_translation_table[old_state], state_translation_table[state], true); - } - --static int automount_coldplug(Unit *u) { -+static int automount_coldplug(Unit *u, Hashmap *deferred_work) { - Automount *a = AUTOMOUNT(u); - int r; - -diff --git a/src/core/busname.c b/src/core/busname.c -index 1d77292..43d7607 100644 ---- a/src/core/busname.c -+++ b/src/core/busname.c -@@ -335,7 +335,7 @@ static void busname_set_state(BusName *n, BusNameState state) { - unit_notify(UNIT(n), state_translation_table[old_state], state_translation_table[state], true); - } - --static int busname_coldplug(Unit *u) { -+static int busname_coldplug(Unit *u, Hashmap *deferred_work) { - BusName *n = BUSNAME(u); - int r; - -diff --git a/src/core/device.c b/src/core/device.c -index eb976b8..6b489a4 100644 ---- a/src/core/device.c -+++ b/src/core/device.c -@@ -140,7 +140,7 @@ static void device_set_state(Device *d, DeviceState state) { - unit_notify(UNIT(d), state_translation_table[old_state], state_translation_table[state], true); - } - --static int device_coldplug(Unit *u) { -+static int device_coldplug(Unit *u, Hashmap *deferred_work) { - Device *d = DEVICE(u); - - assert(d); -diff --git a/src/core/manager.c b/src/core/manager.c -index 7a6d519..3e87aa9 100644 ---- a/src/core/manager.c -+++ b/src/core/manager.c -@@ -975,7 +975,28 @@ static int manager_coldplug(Manager *m) { - Unit *u; - char *k; - -- assert(m); -+ /* -+ * Some unit types tend to spawn jobs or check other units' state -+ * during coldplug. This is wrong because it is undefined whether the -+ * units in question have been already coldplugged (i. e. their state -+ * restored). This way, we can easily re-start an already started unit -+ * or otherwise make a wrong decision based on the unit's state. -+ * -+ * Solve this by providing a way for coldplug functions to defer -+ * such actions until after all units have been coldplugged. -+ * -+ * We store Unit* -> int(*)(Unit*). -+ * -+ * https://bugs.freedesktop.org/show_bug.cgi?id=88401 -+ */ -+ _cleanup_hashmap_free_ Hashmap *deferred_work = NULL; -+ int(*proc)(Unit*); -+ -+ assert(m); -+ -+ deferred_work = hashmap_new(&trivial_hash_ops); -+ if (!deferred_work) -+ return -ENOMEM; - - /* Then, let's set up their initial state. */ - HASHMAP_FOREACH_KEY(u, k, m->units, i) { -@@ -985,7 +1006,17 @@ static int manager_coldplug(Manager *m) { - if (u->id != k) - continue; - -- q = unit_coldplug(u); -+ q = unit_coldplug(u, deferred_work); -+ if (q < 0) -+ r = q; -+ } -+ -+ /* After coldplugging and setting up initial state of the units, -+ * let's perform operations which spawn jobs or query units' state. */ -+ HASHMAP_FOREACH_KEY(proc, u, deferred_work, i) { -+ int q; -+ -+ q = proc(u); - if (q < 0) - r = q; - } -diff --git a/src/core/mount.c b/src/core/mount.c -index 5ee679d..1251c94 100644 ---- a/src/core/mount.c -+++ b/src/core/mount.c -@@ -612,7 +612,7 @@ static void mount_set_state(Mount *m, MountState state) { - m->reload_result = MOUNT_SUCCESS; - } - --static int mount_coldplug(Unit *u) { -+static int mount_coldplug(Unit *u, Hashmap *deferred_work) { - Mount *m = MOUNT(u); - MountState new_state = MOUNT_DEAD; - int r; -diff --git a/src/core/path.c b/src/core/path.c -index fbb695d..6be9ac8 100644 ---- a/src/core/path.c -+++ b/src/core/path.c -@@ -438,7 +438,12 @@ static void path_set_state(Path *p, PathState state) { - - static void path_enter_waiting(Path *p, bool initial, bool recheck); - --static int path_coldplug(Unit *u) { -+static int path_enter_waiting_coldplug(Unit *u) { -+ path_enter_waiting(PATH(u), true, true); -+ return 0; -+} -+ -+static int path_coldplug(Unit *u, Hashmap *deferred_work) { - Path *p = PATH(u); - - assert(p); -@@ -447,9 +452,10 @@ static int path_coldplug(Unit *u) { - if (p->deserialized_state != p->state) { - - if (p->deserialized_state == PATH_WAITING || -- p->deserialized_state == PATH_RUNNING) -- path_enter_waiting(p, true, true); -- else -+ p->deserialized_state == PATH_RUNNING) { -+ hashmap_put(deferred_work, u, &path_enter_waiting_coldplug); -+ path_set_state(p, PATH_WAITING); -+ } else - path_set_state(p, p->deserialized_state); - } - -diff --git a/src/core/scope.c b/src/core/scope.c -index 1c3c6bb..8b2bb29 100644 ---- a/src/core/scope.c -+++ b/src/core/scope.c -@@ -171,7 +171,7 @@ static int scope_load(Unit *u) { - return scope_verify(s); - } - --static int scope_coldplug(Unit *u) { -+static int scope_coldplug(Unit *u, Hashmap *deferred_work) { - Scope *s = SCOPE(u); - int r; - -diff --git a/src/core/service.c b/src/core/service.c -index a89ff3f..cc4ea19 100644 ---- a/src/core/service.c -+++ b/src/core/service.c -@@ -878,7 +878,7 @@ static void service_set_state(Service *s, ServiceState state) { - s->reload_result = SERVICE_SUCCESS; - } - --static int service_coldplug(Unit *u) { -+static int service_coldplug(Unit *u, Hashmap *deferred_work) { - Service *s = SERVICE(u); - int r; - -diff --git a/src/core/slice.c b/src/core/slice.c -index 0bebdbc..0285c49 100644 ---- a/src/core/slice.c -+++ b/src/core/slice.c -@@ -150,7 +150,7 @@ static int slice_load(Unit *u) { - return slice_verify(s); - } - --static int slice_coldplug(Unit *u) { -+static int slice_coldplug(Unit *u, Hashmap *deferred_work) { - Slice *t = SLICE(u); - - assert(t); -diff --git a/src/core/snapshot.c b/src/core/snapshot.c -index b70c3be..b1d8448 100644 ---- a/src/core/snapshot.c -+++ b/src/core/snapshot.c -@@ -75,7 +75,7 @@ static int snapshot_load(Unit *u) { - return 0; - } - --static int snapshot_coldplug(Unit *u) { -+static int snapshot_coldplug(Unit *u, Hashmap *deferred_work) { - Snapshot *s = SNAPSHOT(u); - - assert(s); -diff --git a/src/core/socket.c b/src/core/socket.c -index 9606ac2..f67370b 100644 ---- a/src/core/socket.c -+++ b/src/core/socket.c -@@ -1322,7 +1322,7 @@ static void socket_set_state(Socket *s, SocketState state) { - unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], true); - } - --static int socket_coldplug(Unit *u) { -+static int socket_coldplug(Unit *u, Hashmap *deferred_work) { - Socket *s = SOCKET(u); - int r; - -diff --git a/src/core/swap.c b/src/core/swap.c -index 4dd6be8..bb1398f 100644 ---- a/src/core/swap.c -+++ b/src/core/swap.c -@@ -506,7 +506,7 @@ static void swap_set_state(Swap *s, SwapState state) { - job_add_to_run_queue(UNIT(other)->job); - } - --static int swap_coldplug(Unit *u) { -+static int swap_coldplug(Unit *u, Hashmap *deferred_work) { - Swap *s = SWAP(u); - SwapState new_state = SWAP_DEAD; - int r; -diff --git a/src/core/target.c b/src/core/target.c -index 8817ef2..5f64402 100644 ---- a/src/core/target.c -+++ b/src/core/target.c -@@ -103,7 +103,7 @@ static int target_load(Unit *u) { - return 0; - } - --static int target_coldplug(Unit *u) { -+static int target_coldplug(Unit *u, Hashmap *deferred_work) { - Target *t = TARGET(u); - - assert(t); -diff --git a/src/core/timer.c b/src/core/timer.c -index 9405501..79a7540 100644 ---- a/src/core/timer.c -+++ b/src/core/timer.c -@@ -267,7 +267,12 @@ static void timer_set_state(Timer *t, TimerState state) { - - static void timer_enter_waiting(Timer *t, bool initial); - --static int timer_coldplug(Unit *u) { -+static int timer_enter_waiting_coldplug(Unit *u) { -+ timer_enter_waiting(TIMER(u), false); -+ return 0; -+} -+ -+static int timer_coldplug(Unit *u, Hashmap *deferred_work) { - Timer *t = TIMER(u); - - assert(t); -@@ -275,9 +280,10 @@ static int timer_coldplug(Unit *u) { - - if (t->deserialized_state != t->state) { - -- if (t->deserialized_state == TIMER_WAITING) -- timer_enter_waiting(t, false); -- else -+ if (t->deserialized_state == TIMER_WAITING) { -+ hashmap_put(deferred_work, u, &timer_enter_waiting_coldplug); -+ timer_set_state(t, TIMER_WAITING); -+ } else - timer_set_state(t, t->deserialized_state); - } - -diff --git a/src/core/unit.c b/src/core/unit.c -index b639d68..ec4fa82 100644 ---- a/src/core/unit.c -+++ b/src/core/unit.c -@@ -2856,27 +2856,34 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) { - return 0; - } - --int unit_coldplug(Unit *u) { -+static int unit_add_deserialized_job_coldplug(Unit *u) { -+ int r; -+ -+ r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL); -+ if (r < 0) -+ return r; -+ -+ u->deserialized_job = _JOB_TYPE_INVALID; -+ -+ return 0; -+} -+ -+int unit_coldplug(Unit *u, Hashmap *deferred_work) { - int r; - - assert(u); - - if (UNIT_VTABLE(u)->coldplug) -- if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0) -+ if ((r = UNIT_VTABLE(u)->coldplug(u, deferred_work)) < 0) - return r; - - if (u->job) { - r = job_coldplug(u->job); - if (r < 0) - return r; -- } else if (u->deserialized_job >= 0) { -+ } else if (u->deserialized_job >= 0) - /* legacy */ -- r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL); -- if (r < 0) -- return r; -- -- u->deserialized_job = _JOB_TYPE_INVALID; -- } -+ hashmap_put(deferred_work, u, &unit_add_deserialized_job_coldplug); - - return 0; - } -diff --git a/src/core/unit.h b/src/core/unit.h -index ac5647a..11242c2 100644 ---- a/src/core/unit.h -+++ b/src/core/unit.h -@@ -301,8 +301,14 @@ struct UnitVTable { - int (*load)(Unit *u); - - /* If a lot of units got created via enumerate(), this is -- * where to actually set the state and call unit_notify(). */ -- int (*coldplug)(Unit *u); -+ * where to actually set the state and call unit_notify(). -+ * -+ * This must not reference other units (maybe implicitly through spawning -+ * jobs), because it is possible that they are not yet coldplugged. -+ * Such actions must be deferred until the end of coldplug bу adding -+ * a "Unit* -> int(*)(Unit*)" entry into the hashmap. -+ */ -+ int (*coldplug)(Unit *u, Hashmap *deferred_work); - - void (*dump)(Unit *u, FILE *f, const char *prefix); - -@@ -538,7 +544,7 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds); - - int unit_add_node_link(Unit *u, const char *what, bool wants); - --int unit_coldplug(Unit *u); -+int unit_coldplug(Unit *u, Hashmap *deferred_work); - - void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) _printf_(3, 0); - --- -2.3.2 - diff --git a/core/systemd/0001-core-don-t-change-removed-devices-to-state-tentative.patch b/core/systemd/0001-core-don-t-change-removed-devices-to-state-tentative.patch deleted file mode 100644 index b9022c456..000000000 --- a/core/systemd/0001-core-don-t-change-removed-devices-to-state-tentative.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 496068a8288084ab3ecf8b179a8403ecff1a6be8 Mon Sep 17 00:00:00 2001 -From: Martin Pitt -Date: Fri, 13 Mar 2015 08:35:59 +0100 -Subject: [PATCH] core: don't change removed devices to state "tentative" - -Commit 628c89c introduced the "tentative" device state, which caused -devices to go from "plugged" to "tentative" on a remove uevent. This -breaks the cleanup of stale mounts (see commit 3b48ce4), as that only -applies to "dead" devices. - -The "tentative" state only really makes sense on adding a device when -we don't know where it was coming from (i. e. not from udev). But when -we get a device removal from udev we definitively know that it's gone, -so change the device state back to "dead" as before 628c89c. ---- - src/core/device.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/core/device.c b/src/core/device.c -index 4bfd71f..b5d9d82 100644 ---- a/src/core/device.c -+++ b/src/core/device.c -@@ -419,7 +419,7 @@ static void device_update_found_one(Device *d, bool add, DeviceFound found, bool - if (now) { - if (d->found & DEVICE_FOUND_UDEV) - device_set_state(d, DEVICE_PLUGGED); -- else if (d->found != DEVICE_NOT_FOUND) -+ else if (add && d->found != DEVICE_NOT_FOUND) - device_set_state(d, DEVICE_TENTATIVE); - else - device_set_state(d, DEVICE_DEAD); --- -2.3.5 - diff --git a/core/systemd/0001-core-rework-device-state-logic.patch b/core/systemd/0001-core-rework-device-state-logic.patch deleted file mode 100644 index 290a72320..000000000 --- a/core/systemd/0001-core-rework-device-state-logic.patch +++ /dev/null @@ -1,910 +0,0 @@ -From 628c89cc68ab96fce2de7ebba5933725d147aecc Mon Sep 17 00:00:00 2001 -From: Lennart Poettering -Date: Fri, 27 Feb 2015 21:55:08 +0100 -Subject: [PATCH] core: rework device state logic - -This change introduces a new state "tentative" for device units. Device -units are considered "plugged" when udev announced them, "dead" when -they are not available in the kernel, and "tentative" when they are -referenced in /proc/self/mountinfo or /proc/swaps but not (yet) -announced via udev. - -This should fix a race when device nodes (like loop devices) are created -and immediately mounted. Previously, systemd might end up seeing the -mount unit before the device, and would thus pull down the mount because -its BindTo dependency on the device would not be fulfilled. ---- - src/core/device.c | 368 +++++++++++++++++++++++++++++++++--------------------- - src/core/device.h | 14 ++- - src/core/mount.c | 46 ++++--- - src/core/swap.c | 32 +++-- - src/core/swap.h | 4 +- - src/core/unit.c | 1 - - 6 files changed, 285 insertions(+), 180 deletions(-) - -diff --git a/src/core/device.c b/src/core/device.c -index 2d983cc..e41ed41 100644 ---- a/src/core/device.c -+++ b/src/core/device.c -@@ -34,7 +34,8 @@ - - static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = { - [DEVICE_DEAD] = UNIT_INACTIVE, -- [DEVICE_PLUGGED] = UNIT_ACTIVE -+ [DEVICE_TENTATIVE] = UNIT_ACTIVATING, -+ [DEVICE_PLUGGED] = UNIT_ACTIVE, - }; - - static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata); -@@ -63,6 +64,41 @@ static void device_unset_sysfs(Device *d) { - d->sysfs = NULL; - } - -+static int device_set_sysfs(Device *d, const char *sysfs) { -+ Device *first; -+ char *copy; -+ int r; -+ -+ assert(d); -+ -+ if (streq_ptr(d->sysfs, sysfs)) -+ return 0; -+ -+ r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &string_hash_ops); -+ if (r < 0) -+ return r; -+ -+ copy = strdup(sysfs); -+ if (!copy) -+ return -ENOMEM; -+ -+ device_unset_sysfs(d); -+ -+ first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs); -+ LIST_PREPEND(same_sysfs, first, d); -+ -+ r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first); -+ if (r < 0) { -+ LIST_REMOVE(same_sysfs, first, d); -+ free(copy); -+ return r; -+ } -+ -+ d->sysfs = copy; -+ -+ return 0; -+} -+ - static void device_init(Unit *u) { - Device *d = DEVICE(u); - -@@ -110,8 +146,13 @@ static int device_coldplug(Unit *u) { - assert(d); - assert(d->state == DEVICE_DEAD); - -- if (d->sysfs) -+ if (d->found & DEVICE_FOUND_UDEV) -+ /* If udev says the device is around, it's around */ - device_set_state(d, DEVICE_PLUGGED); -+ else if (d->found != DEVICE_NOT_FOUND) -+ /* If a device is found in /proc/self/mountinfo or -+ * /proc/swaps, it's "tentatively" around. */ -+ device_set_state(d, DEVICE_TENTATIVE); - - return 0; - } -@@ -140,49 +181,9 @@ _pure_ static const char *device_sub_state_to_string(Unit *u) { - return device_state_to_string(DEVICE(u)->state); - } - --static int device_add_escaped_name(Unit *u, const char *dn) { -- _cleanup_free_ char *e = NULL; -- int r; -- -- assert(u); -- assert(dn); -- assert(dn[0] == '/'); -- -- e = unit_name_from_path(dn, ".device"); -- if (!e) -- return -ENOMEM; -- -- r = unit_add_name(u, e); -- if (r < 0 && r != -EEXIST) -- return r; -- -- return 0; --} -- --static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) { -- _cleanup_free_ char *e = NULL; -- Unit *u; -- -- assert(m); -- assert(dn); -- assert(dn[0] == '/'); -- assert(_u); -- -- e = unit_name_from_path(dn, ".device"); -- if (!e) -- return -ENOMEM; -- -- u = manager_get_unit(m, e); -- if (u) { -- *_u = u; -- return 1; -- } -- -- return 0; --} -- --static int device_make_description(Unit *u, struct udev_device *dev, const char *path) { -+static int device_update_description(Unit *u, struct udev_device *dev, const char *path) { - const char *model; -+ int r; - - assert(u); - assert(dev); -@@ -207,13 +208,16 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char - - j = strjoin(model, " ", label, NULL); - if (j) -- return unit_set_description(u, j); -- } -+ r = unit_set_description(u, j); -+ } else -+ r = unit_set_description(u, model); -+ } else -+ r = unit_set_description(u, path); - -- return unit_set_description(u, model); -- } -+ if (r < 0) -+ log_unit_error_errno(u->id, r, "Failed to set device description: %m"); - -- return unit_set_description(u, path); -+ return r; - } - - static int device_add_udev_wants(Unit *u, struct udev_device *dev) { -@@ -240,20 +244,20 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) { - - n = unit_name_mangle(e, MANGLE_NOGLOB); - if (!n) -- return -ENOMEM; -+ return log_oom(); - - r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true); - if (r < 0) -- return r; -+ return log_unit_error_errno(u->id, r, "Failed to add wants dependency: %m"); - } - if (!isempty(state)) -- log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", -- property, strna(udev_device_get_syspath(dev))); -+ log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev))); - - return 0; - } - --static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) { -+static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) { -+ _cleanup_free_ char *e = NULL; - const char *sysfs; - Unit *u = NULL; - bool delete; -@@ -267,12 +271,18 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p - if (!sysfs) - return 0; - -- r = device_find_escape_name(m, path, &u); -- if (r < 0) -- return r; -+ e = unit_name_from_path(path, ".device"); -+ if (!e) -+ return log_oom(); -+ -+ u = manager_get_unit(m, e); - -- if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs)) -+ if (u && -+ DEVICE(u)->sysfs && -+ !path_equal(DEVICE(u)->sysfs, sysfs)) { -+ log_unit_error(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs); - return -EEXIST; -+ } - - if (!u) { - delete = true; -@@ -281,7 +291,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p - if (!u) - return log_oom(); - -- r = device_add_escaped_name(u, path); -+ r = unit_add_name(u, e); - if (r < 0) - goto fail; - -@@ -293,37 +303,16 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p - * actually been seen yet ->sysfs will not be - * initialized. Hence initialize it if necessary. */ - -- if (!DEVICE(u)->sysfs) { -- Device *first; -- -- DEVICE(u)->sysfs = strdup(sysfs); -- if (!DEVICE(u)->sysfs) { -- r = -ENOMEM; -- goto fail; -- } -- -- r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops); -- if (r < 0) -- goto fail; -- -- first = hashmap_get(m->devices_by_sysfs, sysfs); -- LIST_PREPEND(same_sysfs, first, DEVICE(u)); -- -- r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first); -- if (r < 0) -- goto fail; -- } -- -- device_make_description(u, dev, path); -+ r = device_set_sysfs(DEVICE(u), sysfs); -+ if (r < 0) -+ goto fail; - -- if (main) { -- /* The additional systemd udev properties we only -- * interpret for the main object */ -+ (void) device_update_description(u, dev, path); - -- r = device_add_udev_wants(u, dev); -- if (r < 0) -- goto fail; -- } -+ /* The additional systemd udev properties we only interpret -+ * for the main object */ -+ if (main) -+ (void) device_add_udev_wants(u, dev); - - /* Note that this won't dispatch the load queue, the caller - * has to do that if needed and appropriate */ -@@ -332,7 +321,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p - return 0; - - fail: -- log_warning_errno(r, "Failed to load device unit: %m"); -+ log_unit_warning_errno(u->id, r, "Failed to set up device unit: %m"); - - if (delete && u) - unit_free(u); -@@ -340,7 +329,7 @@ fail: - return r; - } - --static int device_process_new_device(Manager *m, struct udev_device *dev) { -+static int device_process_new(Manager *m, struct udev_device *dev) { - const char *sysfs, *dn, *alias; - struct udev_list_entry *item = NULL, *first = NULL; - int r; -@@ -352,14 +341,14 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) { - return 0; - - /* Add the main unit named after the sysfs path */ -- r = device_update_unit(m, dev, sysfs, true); -+ r = device_setup_unit(m, dev, sysfs, true); - if (r < 0) - return r; - - /* Add an additional unit for the device node */ - dn = udev_device_get_devnode(dev); - if (dn) -- device_update_unit(m, dev, dn, false); -+ (void) device_setup_unit(m, dev, dn, false); - - /* Add additional units for all symlinks */ - first = udev_device_get_devlinks_list_entry(dev); -@@ -386,7 +375,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) { - st.st_rdev != udev_device_get_devnum(dev)) - continue; - -- device_update_unit(m, dev, p, false); -+ (void) device_setup_unit(m, dev, p, false); - } - - /* Add additional units for all explicitly configured -@@ -403,7 +392,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) { - e[l] = 0; - - if (path_is_absolute(e)) -- device_update_unit(m, dev, e, false); -+ (void) device_setup_unit(m, dev, e, false); - else - log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e); - } -@@ -414,39 +403,62 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) { - return 0; - } - --static void device_set_path_plugged(Manager *m, struct udev_device *dev) { -- const char *sysfs; -+static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) { -+ DeviceFound n; -+ -+ assert(d); -+ -+ n = add ? (d->found | found) : (d->found & ~found); -+ if (n == d->found) -+ return; -+ -+ d->found = n; -+ -+ if (now) { -+ if (d->found & DEVICE_FOUND_UDEV) -+ device_set_state(d, DEVICE_PLUGGED); -+ else if (d->found != DEVICE_NOT_FOUND) -+ device_set_state(d, DEVICE_TENTATIVE); -+ else -+ device_set_state(d, DEVICE_DEAD); -+ } -+} -+ -+static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) { - Device *d, *l; - - assert(m); -- assert(dev); -+ assert(sysfs); - -- sysfs = udev_device_get_syspath(dev); -- if (!sysfs) -- return; -+ if (found == DEVICE_NOT_FOUND) -+ return 0; - - l = hashmap_get(m->devices_by_sysfs, sysfs); - LIST_FOREACH(same_sysfs, d, l) -- device_set_state(d, DEVICE_PLUGGED); -+ device_update_found_one(d, add, found, now); -+ -+ return 0; - } - --static int device_process_removed_device(Manager *m, struct udev_device *dev) { -- const char *sysfs; -- Device *d; -+static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) { -+ _cleanup_free_ char *e = NULL; -+ Unit *u; - - assert(m); -- assert(dev); -+ assert(path); - -- sysfs = udev_device_get_syspath(dev); -- if (!sysfs) -- return -ENOMEM; -+ if (found == DEVICE_NOT_FOUND) -+ return 0; - -- /* Remove all units of this sysfs path */ -- while ((d = hashmap_get(m->devices_by_sysfs, sysfs))) { -- device_unset_sysfs(d); -- device_set_state(d, DEVICE_DEAD); -- } -+ e = unit_name_from_path(path, ".device"); -+ if (!e) -+ return log_oom(); - -+ u = manager_get_unit(m, e); -+ if (!u) -+ return 0; -+ -+ device_update_found_one(DEVICE(u), add, found, now); - return 0; - } - -@@ -462,22 +474,6 @@ static bool device_is_ready(struct udev_device *dev) { - return parse_boolean(ready) != 0; - } - --static int device_process_new_path(Manager *m, const char *path) { -- _cleanup_udev_device_unref_ struct udev_device *dev = NULL; -- -- assert(m); -- assert(path); -- -- dev = udev_device_new_from_syspath(m->udev, path); -- if (!dev) -- return log_oom(); -- -- if (!device_is_ready(dev)) -- return 0; -- -- return device_process_new_device(m, dev); --} -- - static Unit *device_following(Unit *u) { - Device *d = DEVICE(u); - Device *other, *first = NULL; -@@ -604,12 +600,31 @@ static int device_enumerate(Manager *m) { - goto fail; - - first = udev_enumerate_get_list_entry(e); -- udev_list_entry_foreach(item, first) -- device_process_new_path(m, udev_list_entry_get_name(item)); -+ udev_list_entry_foreach(item, first) { -+ _cleanup_udev_device_unref_ struct udev_device *dev = NULL; -+ const char *sysfs; -+ -+ sysfs = udev_list_entry_get_name(item); -+ -+ dev = udev_device_new_from_syspath(m->udev, sysfs); -+ if (!dev) { -+ log_oom(); -+ continue; -+ } -+ -+ if (!device_is_ready(dev)) -+ continue; -+ -+ (void) device_process_new(m, dev); -+ -+ device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false); -+ } - - return 0; - - fail: -+ log_error_errno(r, "Failed to enumerate devices: %m"); -+ - device_shutdown(m); - return r; - } -@@ -617,7 +632,7 @@ fail: - static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) { - _cleanup_udev_device_unref_ struct udev_device *dev = NULL; - Manager *m = userdata; -- const char *action; -+ const char *action, *sysfs; - int r; - - assert(m); -@@ -639,33 +654,47 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, - if (!dev) - return 0; - -+ sysfs = udev_device_get_syspath(dev); -+ if (!sysfs) { -+ log_error("Failed to get udev sys path."); -+ return 0; -+ } -+ - action = udev_device_get_action(dev); - if (!action) { - log_error("Failed to get udev action string."); - return 0; - } - -- if (streq(action, "remove") || !device_is_ready(dev)) { -- r = device_process_removed_device(m, dev); -- if (r < 0) -- log_error_errno(r, "Failed to process device remove event: %m"); -- -- r = swap_process_removed_device(m, dev); -+ if (streq(action, "remove")) { -+ r = swap_process_device_remove(m, dev); - if (r < 0) - log_error_errno(r, "Failed to process swap device remove event: %m"); - -- } else { -- r = device_process_new_device(m, dev); -- if (r < 0) -- log_error_errno(r, "Failed to process device new event: %m"); -+ /* If we get notified that a device was removed by -+ * udev, then it's completely gone, hence unset all -+ * found bits */ -+ device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true); - -- r = swap_process_new_device(m, dev); -+ } else if (device_is_ready(dev)) { -+ -+ (void) device_process_new(m, dev); -+ -+ r = swap_process_device_new(m, dev); - if (r < 0) - log_error_errno(r, "Failed to process swap device new event: %m"); - - manager_dispatch_load_queue(m); - -- device_set_path_plugged(m, dev); -+ /* The device is found now, set the udev found bit */ -+ device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true); -+ -+ } else { -+ /* The device is nominally around, but not ready for -+ * us. Hence unset the udev bit, but leave the rest -+ * around. */ -+ -+ device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true); - } - - return 0; -@@ -684,9 +713,58 @@ static bool device_supported(Manager *m) { - return read_only <= 0; - } - -+int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) { -+ _cleanup_udev_device_unref_ struct udev_device *dev = NULL; -+ struct stat st; -+ -+ assert(m); -+ assert(node); -+ -+ /* This is called whenever we find a device referenced in -+ * /proc/swaps or /proc/self/mounts. Such a device might be -+ * mounted/enabled at a time where udev has not finished -+ * probing it yet, and we thus haven't learned about it -+ * yet. In this case we will set the device unit to -+ * "tentative" state. */ -+ -+ if (add) { -+ if (!path_startswith(node, "/dev")) -+ return 0; -+ -+ if (stat(node, &st) < 0) { -+ if (errno == ENOENT) -+ return 0; -+ -+ return log_error_errno(errno, "Failed to stat device node file %s: %m", node); -+ } -+ -+ if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode)) -+ return 0; -+ -+ dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev); -+ if (!dev) { -+ if (errno == ENOENT) -+ return 0; -+ -+ return log_oom(); -+ } -+ -+ /* If the device is known in the kernel and newly -+ * appeared, then we'll create a device unit for it, -+ * under the name referenced in /proc/swaps or -+ * /proc/self/mountinfo. */ -+ -+ (void) device_setup_unit(m, dev, node, false); -+ } -+ -+ /* Update the device unit's state, should it exist */ -+ return device_update_found_by_name(m, node, add, found, now); -+} -+ - static const char* const device_state_table[_DEVICE_STATE_MAX] = { - [DEVICE_DEAD] = "dead", -- [DEVICE_PLUGGED] = "plugged" -+ [DEVICE_TENTATIVE] = "tentative", -+ [DEVICE_PLUGGED] = "plugged", - }; - - DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState); -diff --git a/src/core/device.h b/src/core/device.h -index 9065085..9f46e08 100644 ---- a/src/core/device.h -+++ b/src/core/device.h -@@ -28,20 +28,28 @@ typedef struct Device Device; - * simplifies the state engine greatly */ - typedef enum DeviceState { - DEVICE_DEAD, -- DEVICE_PLUGGED, -+ DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */ -+ DEVICE_PLUGGED, /* announced by udev */ - _DEVICE_STATE_MAX, - _DEVICE_STATE_INVALID = -1 - } DeviceState; - -+typedef enum DeviceFound { -+ DEVICE_NOT_FOUND = 0, -+ DEVICE_FOUND_UDEV = 1, -+ DEVICE_FOUND_MOUNT = 2, -+ DEVICE_FOUND_SWAP = 4, -+} DeviceFound; -+ - struct Device { - Unit meta; - - char *sysfs; -+ DeviceFound found; - - /* In order to be able to distinguish dependencies on - different device nodes we might end up creating multiple - devices for the same sysfs path. We chain them up here. */ -- - LIST_FIELDS(struct Device, same_sysfs); - - DeviceState state; -@@ -51,3 +59,5 @@ extern const UnitVTable device_vtable; - - const char* device_state_to_string(DeviceState i) _const_; - DeviceState device_state_from_string(const char *s) _pure_; -+ -+int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now); -diff --git a/src/core/mount.c b/src/core/mount.c -index 40037e7..8e4a376 100644 ---- a/src/core/mount.c -+++ b/src/core/mount.c -@@ -1386,7 +1386,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user - return 0; - } - --static int mount_add_one( -+static int mount_setup_unit( - Manager *m, - const char *what, - const char *where, -@@ -1429,7 +1429,7 @@ static int mount_add_one( - - u = unit_new(m, sizeof(Mount)); - if (!u) -- return -ENOMEM; -+ return log_oom(); - - r = unit_add_name(u, e); - if (r < 0) -@@ -1542,6 +1542,8 @@ static int mount_add_one( - return 0; - - fail: -+ log_warning_errno(r, "Failed to set up mount unit: %m"); -+ - if (delete && u) - unit_free(u); - -@@ -1549,33 +1551,36 @@ fail: - } - - static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { -- _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL; -- _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL; -- struct libmnt_fs *fs; -+ _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL; -+ _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL; - int r = 0; - - assert(m); - -- tb = mnt_new_table(); -- itr = mnt_new_iter(MNT_ITER_FORWARD); -- if (!tb || !itr) -+ t = mnt_new_table(); -+ if (!t) - return log_oom(); - -- r = mnt_table_parse_mtab(tb, NULL); -+ i = mnt_new_iter(MNT_ITER_FORWARD); -+ if (!i) -+ return log_oom(); -+ -+ r = mnt_table_parse_mtab(t, NULL); - if (r < 0) -- return r; -+ return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m"); - - r = 0; - for (;;) { - const char *device, *path, *options, *fstype; - _cleanup_free_ const char *d = NULL, *p = NULL; -+ struct libmnt_fs *fs; - int k; - -- k = mnt_table_next_fs(tb, itr, &fs); -+ k = mnt_table_next_fs(t, i, &fs); - if (k == 1) - break; -- else if (k < 0) -- return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m"); -+ if (k < 0) -+ return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m"); - - device = mnt_fs_get_source(fs); - path = mnt_fs_get_target(fs); -@@ -1583,11 +1588,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { - fstype = mnt_fs_get_fstype(fs); - - d = cunescape(device); -+ if (!d) -+ return log_oom(); -+ - p = cunescape(path); -- if (!d || !p) -+ if (!p) - return log_oom(); - -- k = mount_add_one(m, d, p, options, fstype, set_flags); -+ (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags); -+ -+ k = mount_setup_unit(m, d, p, options, fstype, set_flags); - if (r == 0 && k < 0) - r = k; - } -@@ -1731,8 +1741,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, - - r = mount_load_proc_self_mountinfo(m, true); - if (r < 0) { -- log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m"); -- - /* Reset flags, just in case, for later calls */ - LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) { - Mount *mount = MOUNT(u); -@@ -1765,6 +1773,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, - break; - } - -+ if (mount->parameters_proc_self_mountinfo.what) -+ (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true); -+ -+ - } else if (mount->just_mounted || mount->just_changed) { - - /* New or changed mount entry */ -diff --git a/src/core/swap.c b/src/core/swap.c -index f73a8e6..de3a5d8 100644 ---- a/src/core/swap.c -+++ b/src/core/swap.c -@@ -331,7 +331,7 @@ static int swap_load(Unit *u) { - return swap_verify(s); - } - --static int swap_add_one( -+static int swap_setup_unit( - Manager *m, - const char *what, - const char *what_proc_swaps, -@@ -356,8 +356,10 @@ static int swap_add_one( - - if (u && - SWAP(u)->from_proc_swaps && -- !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) -+ !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) { -+ log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps); - return -EEXIST; -+ } - - if (!u) { - delete = true; -@@ -372,7 +374,7 @@ static int swap_add_one( - - SWAP(u)->what = strdup(what); - if (!SWAP(u)->what) { -- r = log_oom(); -+ r = -ENOMEM; - goto fail; - } - -@@ -400,7 +402,6 @@ static int swap_add_one( - p->priority = priority; - - unit_add_to_dbus_queue(u); -- - return 0; - - fail: -@@ -412,7 +413,7 @@ fail: - return r; - } - --static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) { -+static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) { - _cleanup_udev_device_unref_ struct udev_device *d = NULL; - struct udev_list_entry *item = NULL, *first = NULL; - const char *dn; -@@ -421,7 +422,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool - - assert(m); - -- r = swap_add_one(m, device, device, prio, set_flags); -+ r = swap_setup_unit(m, device, device, prio, set_flags); - if (r < 0) - return r; - -@@ -437,7 +438,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool - /* Add the main device node */ - dn = udev_device_get_devnode(d); - if (dn && !streq(dn, device)) -- swap_add_one(m, dn, device, prio, set_flags); -+ swap_setup_unit(m, dn, device, prio, set_flags); - - /* Add additional units for all symlinks */ - first = udev_device_get_devlinks_list_entry(d); -@@ -458,7 +459,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool - st.st_rdev != udev_device_get_devnum(d)) - continue; - -- swap_add_one(m, p, device, prio, set_flags); -+ swap_setup_unit(m, p, device, prio, set_flags); - } - - return r; -@@ -1084,15 +1085,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) { - if (k == EOF) - break; - -- log_warning("Failed to parse /proc/swaps:%u", i); -+ log_warning("Failed to parse /proc/swaps:%u.", i); - continue; - } - - d = cunescape(dev); - if (!d) -- return -ENOMEM; -+ return log_oom(); -+ -+ device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags); - -- k = swap_process_new_swap(m, d, prio, set_flags); -+ k = swap_process_new(m, d, prio, set_flags); - if (k < 0) - r = k; - } -@@ -1144,6 +1147,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v - break; - } - -+ if (swap->what) -+ device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true); -+ - } else if (swap->just_activated) { - - /* New swap entry */ -@@ -1291,7 +1297,7 @@ fail: - return r; - } - --int swap_process_new_device(Manager *m, struct udev_device *dev) { -+int swap_process_device_new(Manager *m, struct udev_device *dev) { - struct udev_list_entry *item = NULL, *first = NULL; - _cleanup_free_ char *e = NULL; - const char *dn; -@@ -1334,7 +1340,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) { - return r; - } - --int swap_process_removed_device(Manager *m, struct udev_device *dev) { -+int swap_process_device_remove(Manager *m, struct udev_device *dev) { - const char *dn; - int r = 0; - Swap *s; -diff --git a/src/core/swap.h b/src/core/swap.h -index c36c6f2..5de8c20 100644 ---- a/src/core/swap.h -+++ b/src/core/swap.h -@@ -115,8 +115,8 @@ struct Swap { - - extern const UnitVTable swap_vtable; - --int swap_process_new_device(Manager *m, struct udev_device *dev); --int swap_process_removed_device(Manager *m, struct udev_device *dev); -+int swap_process_device_new(Manager *m, struct udev_device *dev); -+int swap_process_device_remove(Manager *m, struct udev_device *dev); - - const char* swap_state_to_string(SwapState i) _const_; - SwapState swap_state_from_string(const char *s) _pure_; -diff --git a/src/core/unit.c b/src/core/unit.c -index 63ccd67..7cd7043 100644 ---- a/src/core/unit.c -+++ b/src/core/unit.c -@@ -2834,7 +2834,6 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) { - return -ENOMEM; - - r = manager_load_unit(u->manager, e, NULL, NULL, &device); -- - if (r < 0) - return r; - --- -2.3.5 - diff --git a/core/systemd/0001-core-shared-in-deserializing-match-same-files-reache.patch b/core/systemd/0001-core-shared-in-deserializing-match-same-files-reache.patch deleted file mode 100644 index d2785d322..000000000 --- a/core/systemd/0001-core-shared-in-deserializing-match-same-files-reache.patch +++ /dev/null @@ -1,135 +0,0 @@ -From c78e47a61fa8d9a21fece01c83e4c26ce0938d27 Mon Sep 17 00:00:00 2001 -From: Michal Schmidt -Date: Thu, 19 Feb 2015 23:12:38 +0100 -Subject: [PATCH] core, shared: in deserializing, match same files reached via - different paths - -When dbus.socket is updated like this: --ListenStream=/var/run/dbus/system_bus_socket -+ListenStream=/run/dbus/system_bus_socket -... and daemon-reload is performed, bad things happen. -During deserialization systemd does not recognize that the two paths -refer to the same named socket and replaces the socket file with a new -one. As a result, applications hang when they try talking to dbus. - -Fix this by finding a match not only when the path names are equal, but -also when they point to the same inode. -In socket_address_equal() it is necessary to move the address size -comparison into the abstract sockets branch. For path name sockets the -comparison must not be done and for other families it is redundant -(their sizes are constant and checked by socket_address_verify()). - -FIFOs and special files can also have multiple pathnames, so compare the -inodes for them as well. Note that previously the pathname checks used -streq_ptr(), but the paths cannot be NULL. - -Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1186018 ---- - src/core/socket.c | 6 +++--- - src/shared/path-util.c | 4 ++++ - src/shared/path-util.h | 1 + - src/shared/socket-util.c | 10 ++++------ - 4 files changed, 12 insertions(+), 9 deletions(-) - -diff --git a/src/core/socket.c b/src/core/socket.c -index 48c43a2..88aae48 100644 ---- a/src/core/socket.c -+++ b/src/core/socket.c -@@ -2100,7 +2100,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, - - LIST_FOREACH(port, p, s->ports) - if (p->type == SOCKET_FIFO && -- streq_ptr(p->path, value+skip)) -+ path_equal_or_files_same(p->path, value+skip)) - break; - - if (p) { -@@ -2119,7 +2119,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, - - LIST_FOREACH(port, p, s->ports) - if (p->type == SOCKET_SPECIAL && -- streq_ptr(p->path, value+skip)) -+ path_equal_or_files_same(p->path, value+skip)) - break; - - if (p) { -@@ -2138,7 +2138,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, - - LIST_FOREACH(port, p, s->ports) - if (p->type == SOCKET_MQUEUE && -- streq_ptr(p->path, value+skip)) -+ streq(p->path, value+skip)) - break; - - if (p) { -diff --git a/src/shared/path-util.c b/src/shared/path-util.c -index b9db7f1..70bc1ca 100644 ---- a/src/shared/path-util.c -+++ b/src/shared/path-util.c -@@ -436,6 +436,10 @@ bool path_equal(const char *a, const char *b) { - } - } - -+bool path_equal_or_files_same(const char *a, const char *b) { -+ return path_equal(a, b) || files_same(a, b) > 0; -+} -+ - char* path_join(const char *root, const char *path, const char *rest) { - assert(path); - -diff --git a/src/shared/path-util.h b/src/shared/path-util.h -index bd0d324..bcf116e 100644 ---- a/src/shared/path-util.h -+++ b/src/shared/path-util.h -@@ -45,6 +45,7 @@ int path_make_relative(const char *from_dir, const char *to_path, char **_r); - char* path_kill_slashes(char *path); - char* path_startswith(const char *path, const char *prefix) _pure_; - bool path_equal(const char *a, const char *b) _pure_; -+bool path_equal_or_files_same(const char *a, const char *b); - char* path_join(const char *root, const char *path, const char *rest); - - char** path_strv_make_absolute_cwd(char **l); -diff --git a/src/shared/socket-util.c b/src/shared/socket-util.c -index c6f6487..c278d6f 100644 ---- a/src/shared/socket-util.c -+++ b/src/shared/socket-util.c -@@ -325,9 +325,6 @@ bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) { - if (a->type != b->type) - return false; - -- if (a->size != b->size) -- return false; -- - if (socket_address_family(a) != socket_address_family(b)) - return false; - -@@ -352,14 +349,16 @@ bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) { - break; - - case AF_UNIX: -- - if ((a->sockaddr.un.sun_path[0] == 0) != (b->sockaddr.un.sun_path[0] == 0)) - return false; - - if (a->sockaddr.un.sun_path[0]) { -- if (!strneq(a->sockaddr.un.sun_path, b->sockaddr.un.sun_path, sizeof(a->sockaddr.un.sun_path))) -+ if (!path_equal_or_files_same(a->sockaddr.un.sun_path, b->sockaddr.un.sun_path)) - return false; - } else { -+ if (a->size != b->size) -+ return false; -+ - if (memcmp(a->sockaddr.un.sun_path, b->sockaddr.un.sun_path, a->size) != 0) - return false; - } -@@ -367,7 +366,6 @@ bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) { - break; - - case AF_NETLINK: -- - if (a->protocol != b->protocol) - return false; - --- -2.3.2 - diff --git a/core/systemd/0001-nspawn-when-connected-to-pipes-for-stdin-stdout-pass.patch b/core/systemd/0001-nspawn-when-connected-to-pipes-for-stdin-stdout-pass.patch deleted file mode 100644 index 3e3c9e4c4..000000000 --- a/core/systemd/0001-nspawn-when-connected-to-pipes-for-stdin-stdout-pass.patch +++ /dev/null @@ -1,293 +0,0 @@ -From 9c857b9d160c10b4454fc9f83442c1878343422f Mon Sep 17 00:00:00 2001 -From: Lennart Poettering -Date: Wed, 18 Feb 2015 23:32:55 +0100 -Subject: [PATCH] nspawn: when connected to pipes for stdin/stdout, pass them - as-is to PID 1 - -Previously we always invoked the container PID 1 on /dev/console of the -container. With this change we do so only if nspawn was invoked -interactively (i.e. its stdin/stdout was connected to a TTY). In all other -cases we directly pass through the fds unmodified. - -This has the benefit that nspawn can be added into shell pipelines. - -https://bugs.freedesktop.org/show_bug.cgi?id=87732 ---- - src/machine/machinectl.c | 2 +- - src/nspawn/nspawn.c | 48 +++++++++++++++++-------------- - src/run/run.c | 2 +- - src/shared/ptyfwd.c | 75 ++++++++++++++++++++++++++++-------------------- - src/shared/ptyfwd.h | 2 +- - 5 files changed, 74 insertions(+), 55 deletions(-) - -diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c -index 053c8fb..55cd854 100644 ---- a/src/machine/machinectl.c -+++ b/src/machine/machinectl.c -@@ -1150,7 +1150,7 @@ static int login_machine(int argc, char *argv[], void *userdata) { - sd_event_add_signal(event, NULL, SIGINT, NULL, NULL); - sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL); - -- r = pty_forward_new(event, master, true, &forward); -+ r = pty_forward_new(event, master, true, false, &forward); - if (r < 0) - return log_error_errno(r, "Failed to create PTY forwarder: %m"); - -diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c -index 232629d..c84ed11 100644 ---- a/src/nspawn/nspawn.c -+++ b/src/nspawn/nspawn.c -@@ -3606,6 +3606,7 @@ int main(int argc, char *argv[]) { - int ret = EXIT_SUCCESS; - union in_addr_union exposed = {}; - _cleanup_release_lock_file_ LockFile tree_global_lock = LOCK_FILE_INIT, tree_local_lock = LOCK_FILE_INIT; -+ bool interactive; - - log_parse_environment(); - log_open(); -@@ -3779,6 +3780,8 @@ int main(int argc, char *argv[]) { - goto finish; - } - -+ interactive = isatty(STDIN_FILENO) > 0 && isatty(STDOUT_FILENO) > 0; -+ - master = posix_openpt(O_RDWR|O_NOCTTY|O_CLOEXEC|O_NDELAY); - if (master < 0) { - r = log_error_errno(errno, "Failed to acquire pseudo tty: %m"); -@@ -3791,15 +3794,15 @@ int main(int argc, char *argv[]) { - goto finish; - } - -- if (!arg_quiet) -- log_info("Spawning container %s on %s.\nPress ^] three times within 1s to kill container.", -- arg_machine, arg_image ?: arg_directory); -- - if (unlockpt(master) < 0) { - r = log_error_errno(errno, "Failed to unlock tty: %m"); - goto finish; - } - -+ if (!arg_quiet) -+ log_info("Spawning container %s on %s.\nPress ^] three times within 1s to kill container.", -+ arg_machine, arg_image ?: arg_directory); -+ - assert_se(sigemptyset(&mask) == 0); - sigset_add_many(&mask, SIGCHLD, SIGWINCH, SIGTERM, SIGINT, -1); - assert_se(sigprocmask(SIG_BLOCK, &mask, NULL) == 0); -@@ -3885,9 +3888,6 @@ int main(int argc, char *argv[]) { - - master = safe_close(master); - -- close_nointr(STDIN_FILENO); -- close_nointr(STDOUT_FILENO); -- close_nointr(STDERR_FILENO); - - kmsg_socket_pair[0] = safe_close(kmsg_socket_pair[0]); - rtnl_socket_pair[0] = safe_close(rtnl_socket_pair[0]); -@@ -3895,21 +3895,27 @@ int main(int argc, char *argv[]) { - reset_all_signal_handlers(); - reset_signal_mask(); - -- r = open_terminal(console, O_RDWR); -- if (r != STDIN_FILENO) { -- if (r >= 0) { -- safe_close(r); -- r = -EINVAL; -- } -+ if (interactive) { -+ close_nointr(STDIN_FILENO); -+ close_nointr(STDOUT_FILENO); -+ close_nointr(STDERR_FILENO); - -- log_error_errno(r, "Failed to open console: %m"); -- _exit(EXIT_FAILURE); -- } -+ r = open_terminal(console, O_RDWR); -+ if (r != STDIN_FILENO) { -+ if (r >= 0) { -+ safe_close(r); -+ r = -EINVAL; -+ } - -- if (dup2(STDIN_FILENO, STDOUT_FILENO) != STDOUT_FILENO || -- dup2(STDIN_FILENO, STDERR_FILENO) != STDERR_FILENO) { -- log_error_errno(errno, "Failed to duplicate console: %m"); -- _exit(EXIT_FAILURE); -+ log_error_errno(r, "Failed to open console: %m"); -+ _exit(EXIT_FAILURE); -+ } -+ -+ if (dup2(STDIN_FILENO, STDOUT_FILENO) != STDOUT_FILENO || -+ dup2(STDIN_FILENO, STDERR_FILENO) != STDERR_FILENO) { -+ log_error_errno(errno, "Failed to duplicate console: %m"); -+ _exit(EXIT_FAILURE); -+ } - } - - if (setsid() < 0) { -@@ -4252,7 +4258,7 @@ int main(int argc, char *argv[]) { - - rtnl_socket_pair[0] = safe_close(rtnl_socket_pair[0]); - -- r = pty_forward_new(event, master, true, &forward); -+ r = pty_forward_new(event, master, true, !interactive, &forward); - if (r < 0) { - log_error_errno(r, "Failed to create PTY forwarder: %m"); - goto finish; -diff --git a/src/run/run.c b/src/run/run.c -index 32191a6..3ded2c7 100644 ---- a/src/run/run.c -+++ b/src/run/run.c -@@ -776,7 +776,7 @@ static int start_transient_service( - if (!arg_quiet) - log_info("Running as unit %s.\nPress ^] three times within 1s to disconnect TTY.", service); - -- r = pty_forward_new(event, master, false, &forward); -+ r = pty_forward_new(event, master, false, false, &forward); - if (r < 0) - return log_error_errno(r, "Failed to create PTY forwarder: %m"); - -diff --git a/src/shared/ptyfwd.c b/src/shared/ptyfwd.c -index 31274a1..164c9b6 100644 ---- a/src/shared/ptyfwd.c -+++ b/src/shared/ptyfwd.c -@@ -42,6 +42,8 @@ struct PTYForward { - struct termios saved_stdin_attr; - struct termios saved_stdout_attr; - -+ bool read_only:1; -+ - bool saved_stdin:1; - bool saved_stdout:1; - -@@ -298,7 +300,13 @@ static int on_sigwinch_event(sd_event_source *e, const struct signalfd_siginfo * - return 0; - } - --int pty_forward_new(sd_event *event, int master, bool ignore_vhangup, PTYForward **ret) { -+int pty_forward_new( -+ sd_event *event, -+ int master, -+ bool ignore_vhangup, -+ bool read_only, -+ PTYForward **ret) { -+ - _cleanup_(pty_forward_freep) PTYForward *f = NULL; - struct winsize ws; - int r; -@@ -307,6 +315,7 @@ int pty_forward_new(sd_event *event, int master, bool ignore_vhangup, PTYForward - if (!f) - return -ENOMEM; - -+ f->read_only = read_only; - f->ignore_vhangup = ignore_vhangup; - - if (event) -@@ -317,13 +326,15 @@ int pty_forward_new(sd_event *event, int master, bool ignore_vhangup, PTYForward - return r; - } - -- r = fd_nonblock(STDIN_FILENO, true); -- if (r < 0) -- return r; -+ if (!read_only) { -+ r = fd_nonblock(STDIN_FILENO, true); -+ if (r < 0) -+ return r; - -- r = fd_nonblock(STDOUT_FILENO, true); -- if (r < 0) -- return r; -+ r = fd_nonblock(STDOUT_FILENO, true); -+ if (r < 0) -+ return r; -+ } - - r = fd_nonblock(master, true); - if (r < 0) -@@ -334,36 +345,34 @@ int pty_forward_new(sd_event *event, int master, bool ignore_vhangup, PTYForward - if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) >= 0) - (void)ioctl(master, TIOCSWINSZ, &ws); - -- if (tcgetattr(STDIN_FILENO, &f->saved_stdin_attr) >= 0) { -- struct termios raw_stdin_attr; -- -- f->saved_stdin = true; -+ if (!read_only) { -+ if (tcgetattr(STDIN_FILENO, &f->saved_stdin_attr) >= 0) { -+ struct termios raw_stdin_attr; - -- raw_stdin_attr = f->saved_stdin_attr; -- cfmakeraw(&raw_stdin_attr); -- raw_stdin_attr.c_oflag = f->saved_stdin_attr.c_oflag; -- tcsetattr(STDIN_FILENO, TCSANOW, &raw_stdin_attr); -- } -+ f->saved_stdin = true; - -- if (tcgetattr(STDOUT_FILENO, &f->saved_stdout_attr) >= 0) { -- struct termios raw_stdout_attr; -+ raw_stdin_attr = f->saved_stdin_attr; -+ cfmakeraw(&raw_stdin_attr); -+ raw_stdin_attr.c_oflag = f->saved_stdin_attr.c_oflag; -+ tcsetattr(STDIN_FILENO, TCSANOW, &raw_stdin_attr); -+ } - -- f->saved_stdout = true; -+ if (tcgetattr(STDOUT_FILENO, &f->saved_stdout_attr) >= 0) { -+ struct termios raw_stdout_attr; - -- raw_stdout_attr = f->saved_stdout_attr; -- cfmakeraw(&raw_stdout_attr); -- raw_stdout_attr.c_iflag = f->saved_stdout_attr.c_iflag; -- raw_stdout_attr.c_lflag = f->saved_stdout_attr.c_lflag; -- tcsetattr(STDOUT_FILENO, TCSANOW, &raw_stdout_attr); -- } -+ f->saved_stdout = true; - -- r = sd_event_add_io(f->event, &f->master_event_source, master, EPOLLIN|EPOLLOUT|EPOLLET, on_master_event, f); -- if (r < 0) -- return r; -+ raw_stdout_attr = f->saved_stdout_attr; -+ cfmakeraw(&raw_stdout_attr); -+ raw_stdout_attr.c_iflag = f->saved_stdout_attr.c_iflag; -+ raw_stdout_attr.c_lflag = f->saved_stdout_attr.c_lflag; -+ tcsetattr(STDOUT_FILENO, TCSANOW, &raw_stdout_attr); -+ } - -- r = sd_event_add_io(f->event, &f->stdin_event_source, STDIN_FILENO, EPOLLIN|EPOLLET, on_stdin_event, f); -- if (r < 0 && r != -EPERM) -- return r; -+ r = sd_event_add_io(f->event, &f->stdin_event_source, STDIN_FILENO, EPOLLIN|EPOLLET, on_stdin_event, f); -+ if (r < 0 && r != -EPERM) -+ return r; -+ } - - r = sd_event_add_io(f->event, &f->stdout_event_source, STDOUT_FILENO, EPOLLOUT|EPOLLET, on_stdout_event, f); - if (r == -EPERM) -@@ -372,6 +381,10 @@ int pty_forward_new(sd_event *event, int master, bool ignore_vhangup, PTYForward - else if (r < 0) - return r; - -+ r = sd_event_add_io(f->event, &f->master_event_source, master, EPOLLIN|EPOLLOUT|EPOLLET, on_master_event, f); -+ if (r < 0) -+ return r; -+ - r = sd_event_add_signal(f->event, &f->sigwinch_event_source, SIGWINCH, on_sigwinch_event, f); - if (r < 0) - return r; -diff --git a/src/shared/ptyfwd.h b/src/shared/ptyfwd.h -index d3e229b..6208a54 100644 ---- a/src/shared/ptyfwd.h -+++ b/src/shared/ptyfwd.h -@@ -30,7 +30,7 @@ - - typedef struct PTYForward PTYForward; - --int pty_forward_new(sd_event *event, int master, bool ignore_vhangup, PTYForward **f); -+int pty_forward_new(sd_event *event, int master, bool ignore_vhangup, bool read_only, PTYForward **f); - PTYForward *pty_forward_free(PTYForward *f); - - int pty_forward_get_last_char(PTYForward *f, char *ch); --- -2.3.2 - diff --git a/core/systemd/0001-tmpfiles-Fix-handling-of-duplicate-lines.patch b/core/systemd/0001-tmpfiles-Fix-handling-of-duplicate-lines.patch deleted file mode 100644 index fdf73f755..000000000 --- a/core/systemd/0001-tmpfiles-Fix-handling-of-duplicate-lines.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 6487ada88d63e4998113f4c57fa10b7c865f8026 Mon Sep 17 00:00:00 2001 -From: Martin Pitt -Date: Thu, 5 Mar 2015 14:58:56 +0100 -Subject: [PATCH] tmpfiles: Fix handling of duplicate lines - -Commit 3f93da987 accidentally dropped the "return 0" after detection of a -duplicate line. Put it back, to get back the documented and intended "first -match wins" behaviour. - -https://launchpad.net/bugs/1428540 ---- - src/tmpfiles/tmpfiles.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c -index 917bb3c..652fe5f 100644 ---- a/src/tmpfiles/tmpfiles.c -+++ b/src/tmpfiles/tmpfiles.c -@@ -1746,9 +1746,11 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { - unsigned n; - - for (n = 0; n < existing->count; n++) { -- if (!item_compatible(existing->items + n, &i)) -+ if (!item_compatible(existing->items + n, &i)) { - log_warning("[%s:%u] Duplicate line for path \"%s\", ignoring.", - fname, line, i.path); -+ return 0; -+ } - } - } else { - existing = new0(ItemArray, 1); --- -2.3.2 - diff --git a/core/systemd/0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch b/core/systemd/0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch deleted file mode 100644 index b9af3e7ce..000000000 --- a/core/systemd/0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch +++ /dev/null @@ -1,129 +0,0 @@ -From 1c73f3bc29111a00738569c9d40a989b161a0624 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= -Date: Mon, 23 Feb 2015 23:19:54 -0500 -Subject: [PATCH] tmpfiles: avoid creating duplicate acl entries - -https://bugs.freedesktop.org/show_bug.cgi?id=89202 -https://bugs.debian.org/778656 - -Status quo ante can be restored with: - getfacl -p /var/log/journal/`cat /etc/machine-id`|grep -v '^#'|sort -u|sudo setfacl --set-file=- /var/log/journal/`cat /etc/machine-id` ---- - src/shared/acl-util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++-- - src/shared/acl-util.h | 4 +++ - 2 files changed, 81 insertions(+), 2 deletions(-) - -diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c -index 34707e6..36dc824 100644 ---- a/src/shared/acl-util.c -+++ b/src/shared/acl-util.c -@@ -281,6 +281,77 @@ int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask) - return 0; - } - -+static int acl_entry_equal(acl_entry_t a, acl_entry_t b) { -+ acl_tag_t tag_a, tag_b; -+ -+ if (acl_get_tag_type(a, &tag_a) < 0) -+ return -errno; -+ -+ if (acl_get_tag_type(b, &tag_b) < 0) -+ return -errno; -+ -+ if (tag_a != tag_b) -+ return false; -+ -+ switch (tag_a) { -+ case ACL_USER_OBJ: -+ case ACL_GROUP_OBJ: -+ case ACL_MASK: -+ case ACL_OTHER: -+ /* can have only one of those */ -+ return true; -+ case ACL_USER: { -+ _cleanup_(acl_free_uid_tpp) uid_t *uid_a, *uid_b; -+ -+ uid_a = acl_get_qualifier(a); -+ if (!uid_a) -+ return -errno; -+ -+ uid_b = acl_get_qualifier(b); -+ if (!uid_b) -+ return -errno; -+ -+ return *uid_a == *uid_b; -+ } -+ case ACL_GROUP: { -+ _cleanup_(acl_free_gid_tpp) gid_t *gid_a, *gid_b; -+ -+ gid_a = acl_get_qualifier(a); -+ if (!gid_a) -+ return -errno; -+ -+ gid_b = acl_get_qualifier(b); -+ if (!gid_b) -+ return -errno; -+ -+ return *gid_a == *gid_b; -+ } -+ default: -+ assert_not_reached("Unknown acl tag type"); -+ } -+} -+ -+static int find_acl_entry(acl_t acl, acl_entry_t entry, acl_entry_t *out) { -+ acl_entry_t i; -+ int r; -+ -+ for (r = acl_get_entry(acl, ACL_FIRST_ENTRY, &i); -+ r > 0; -+ r = acl_get_entry(acl, ACL_NEXT_ENTRY, &i)) { -+ -+ r = acl_entry_equal(i, entry); -+ if (r < 0) -+ return r; -+ if (r > 0) { -+ *out = i; -+ return 1; -+ } -+ } -+ if (r < 0) -+ return -errno; -+ return 0; -+} -+ - int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) { - _cleanup_(acl_freep) acl_t old; - acl_entry_t i; -@@ -296,8 +367,12 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) { - - acl_entry_t j; - -- if (acl_create_entry(&old, &j) < 0) -- return -errno; -+ r = find_acl_entry(old, i, &j); -+ if (r < 0) -+ return r; -+ if (r == 0) -+ if (acl_create_entry(&old, &j) < 0) -+ return -errno; - - if (acl_copy_entry(j, i) < 0) - return -errno; -diff --git a/src/shared/acl-util.h b/src/shared/acl-util.h -index 90e88ff..fdb9006 100644 ---- a/src/shared/acl-util.h -+++ b/src/shared/acl-util.h -@@ -41,5 +41,9 @@ int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl); - DEFINE_TRIVIAL_CLEANUP_FUNC(acl_t, acl_free); - #define acl_free_charp acl_free - DEFINE_TRIVIAL_CLEANUP_FUNC(char*, acl_free_charp); -+#define acl_free_uid_tp acl_free -+DEFINE_TRIVIAL_CLEANUP_FUNC(uid_t*, acl_free_uid_tp); -+#define acl_free_gid_tp acl_free -+DEFINE_TRIVIAL_CLEANUP_FUNC(gid_t*, acl_free_gid_tp); - - #endif --- -2.3.2 - diff --git a/core/systemd/0001-unit-use-weaker-dependencies-between-mount-and-devic.patch b/core/systemd/0001-unit-use-weaker-dependencies-between-mount-and-devic.patch deleted file mode 100644 index 1f6f88271..000000000 --- a/core/systemd/0001-unit-use-weaker-dependencies-between-mount-and-devic.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 5bd4b173605142c7be493aa4d958ebaef21f421d Mon Sep 17 00:00:00 2001 -From: Lennart Poettering -Date: Wed, 25 Feb 2015 22:05:14 +0100 -Subject: [PATCH] unit: use weaker dependencies between mount and device units - in --user mode - -When running in user mode unmounting of mount units when a device -vanishes is unlikely to work, and even if it would work is already done -by PID 1 anyway. HEnce, when creating implicit dependencies between -mount units and their backing devices, created a Wants= type dependency -in --user mode, but leave a BindsTo= dependency in --system mode. ---- - src/core/unit.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/core/unit.c b/src/core/unit.c -index ad5348b..875befa 100644 ---- a/src/core/unit.c -+++ b/src/core/unit.c -@@ -2839,7 +2839,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) { - if (r < 0) - return r; - -- r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true); -+ r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true); - if (r < 0) - return r; - --- -2.3.5 - diff --git a/core/systemd/0001-use-x-machine-unix-prefix-for-the-container-bus-on-dbus1.patch b/core/systemd/0001-use-x-machine-unix-prefix-for-the-container-bus-on-dbus1.patch deleted file mode 100644 index 0c685f6e0..000000000 --- a/core/systemd/0001-use-x-machine-unix-prefix-for-the-container-bus-on-dbus1.patch +++ /dev/null @@ -1,28 +0,0 @@ -From f2273101c21bc59a390379e182e53cd4f07a7e71 Mon Sep 17 00:00:00 2001 -From: Benjamin Franzke -Date: Thu, 19 Feb 2015 20:47:28 +0100 -Subject: machined: use x-machine-unix prefix for the container bus on dbus1 - -This fixes "machinectl login" on systems configured with --disable-kdbus. - -The error was: -machinectl login foo -Failed to get machine PTY: Input/output error - -diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c -index 15c9159..9e78a67 100644 ---- a/src/machine/machine-dbus.c -+++ b/src/machine/machine-dbus.c -@@ -511,7 +511,7 @@ int bus_machine_method_open_login(sd_bus *bus, sd_bus_message *message, void *us - #ifdef ENABLE_KDBUS - asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT ";x-machine-unix:pid=" PID_FMT, m->leader, m->leader); - #else -- asprintf(&container_bus->address, "x-machine-kernel:pid=" PID_FMT, m->leader); -+ asprintf(&container_bus->address, "x-machine-unix:pid=" PID_FMT, m->leader); - #endif - if (!container_bus->address) - return log_oom(); --- -cgit v0.10.2 - - diff --git a/core/systemd/5bac5235934fabe5a3e6a9d47f4812f81034c427.patch b/core/systemd/5bac5235934fabe5a3e6a9d47f4812f81034c427.patch deleted file mode 100644 index 6b015e8f2..000000000 --- a/core/systemd/5bac5235934fabe5a3e6a9d47f4812f81034c427.patch +++ /dev/null @@ -1,282 +0,0 @@ -From 5bac5235934fabe5a3e6a9d47f4812f81034c427 Mon Sep 17 00:00:00 2001 -From: Tom Gundersen -Date: Thu, 22 Jan 2015 00:53:16 +0100 -Subject: sd-dhcp-client: use RFC4361-complient ClientID by default - -In addition to the benefits listed in the RFC, this allows DHCP to work also in -case several interfaces share the same MAC address on the same link (IPVLAN). - -Note that this will make the ClientID (so probably the assigned IP address) -change on upgrades. If it is desired to avoid that we would have to remember and -write back the ID (which the library supports, but networkd currently does not). - -diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c -index 65e888a..5f90617 100644 ---- a/src/libsystemd-network/sd-dhcp-client.c -+++ b/src/libsystemd-network/sd-dhcp-client.c -@@ -36,9 +36,10 @@ - #include "dhcp-protocol.h" - #include "dhcp-internal.h" - #include "dhcp-lease-internal.h" -+#include "dhcp-identifier.h" - #include "sd-dhcp-client.h" - --#define MAX_CLIENT_ID_LEN 64 /* Arbitrary limit */ -+#define MAX_CLIENT_ID_LEN (sizeof(uint32_t) + MAX_DUID_LEN) /* Arbitrary limit */ - #define MAX_MAC_ADDR_LEN INFINIBAND_ALEN - - struct sd_dhcp_client { -@@ -60,29 +61,31 @@ struct sd_dhcp_client { - uint8_t mac_addr[MAX_MAC_ADDR_LEN]; - size_t mac_addr_len; - uint16_t arp_type; -- union { -- struct { -- uint8_t type; /* 0: Generic (non-LL) (RFC 2132) */ -- uint8_t data[MAX_CLIENT_ID_LEN]; -- } _packed_ gen; -- struct { -- uint8_t type; /* 1: Ethernet Link-Layer (RFC 2132) */ -- uint8_t haddr[ETH_ALEN]; -- } _packed_ eth; -- struct { -- uint8_t type; /* 2 - 254: ARP/Link-Layer (RFC 2132) */ -- uint8_t haddr[0]; -- } _packed_ ll; -- struct { -- uint8_t type; /* 255: Node-specific (RFC 4361) */ -- uint8_t iaid[4]; -- uint8_t duid[MAX_CLIENT_ID_LEN - 4]; -- } _packed_ ns; -- struct { -- uint8_t type; -- uint8_t data[MAX_CLIENT_ID_LEN]; -- } _packed_ raw; -- } client_id; -+ struct { -+ uint8_t type; -+ union { -+ struct { -+ /* 0: Generic (non-LL) (RFC 2132) */ -+ uint8_t data[MAX_CLIENT_ID_LEN]; -+ } _packed_ gen; -+ struct { -+ /* 1: Ethernet Link-Layer (RFC 2132) */ -+ uint8_t haddr[ETH_ALEN]; -+ } _packed_ eth; -+ struct { -+ /* 2 - 254: ARP/Link-Layer (RFC 2132) */ -+ uint8_t haddr[0]; -+ } _packed_ ll; -+ struct { -+ /* 255: Node-specific (RFC 4361) */ -+ uint32_t iaid; -+ struct duid duid; -+ } _packed_ ns; -+ struct { -+ uint8_t data[MAX_CLIENT_ID_LEN]; -+ } _packed_ raw; -+ }; -+ } _packed_ client_id; - size_t client_id_len; - char *hostname; - char *vendor_class_identifier; -@@ -239,10 +242,9 @@ int sd_dhcp_client_get_client_id(sd_dhcp_client *client, uint8_t *type, - *data = NULL; - *data_len = 0; - if (client->client_id_len) { -- *type = client->client_id.raw.type; -+ *type = client->client_id.type; - *data = client->client_id.raw.data; -- *data_len = client->client_id_len - -- sizeof (client->client_id.raw.type); -+ *data_len = client->client_id_len - sizeof(client->client_id.type); - } - - return 0; -@@ -270,8 +272,8 @@ int sd_dhcp_client_set_client_id(sd_dhcp_client *client, uint8_t type, - break; - } - -- if (client->client_id_len == data_len + sizeof (client->client_id.raw.type) && -- client->client_id.raw.type == type && -+ if (client->client_id_len == data_len + sizeof(client->client_id.type) && -+ client->client_id.type == type && - memcmp(&client->client_id.raw.data, data, data_len) == 0) - return 0; - -@@ -282,9 +284,9 @@ int sd_dhcp_client_set_client_id(sd_dhcp_client *client, uint8_t type, - client_stop(client, DHCP_EVENT_STOP); - } - -- client->client_id.raw.type = type; -+ client->client_id.type = type; - memcpy(&client->client_id.raw.data, data, data_len); -- client->client_id_len = data_len + sizeof (client->client_id.raw.type); -+ client->client_id_len = data_len + sizeof (client->client_id.type); - - if (need_restart && client->state != DHCP_STATE_STOPPED) - sd_dhcp_client_start(client); -@@ -461,12 +463,21 @@ static int client_message_init(sd_dhcp_client *client, DHCPPacket **ret, - if (client->arp_type == ARPHRD_ETHER) - memcpy(&packet->dhcp.chaddr, &client->mac_addr, ETH_ALEN); - -- /* If no client identifier exists, construct one from an ethernet -- address if present */ -- if (client->client_id_len == 0 && client->arp_type == ARPHRD_ETHER) { -- client->client_id.eth.type = ARPHRD_ETHER; -- memcpy(&client->client_id.eth.haddr, &client->mac_addr, ETH_ALEN); -- client->client_id_len = sizeof (client->client_id.eth); -+ /* If no client identifier exists, construct an RFC 4361-compliant one */ -+ if (client->client_id_len == 0) { -+ size_t duid_len; -+ -+ client->client_id.type = 255; -+ -+ r = dhcp_identifier_set_iaid(client->index, client->mac_addr, client->mac_addr_len, &client->client_id.ns.iaid); -+ if (r < 0) -+ return r; -+ -+ r = dhcp_identifier_set_duid_en(&client->client_id.ns.duid, &duid_len); -+ if (r < 0) -+ return r; -+ -+ client->client_id_len = sizeof(client->client_id.type) + sizeof(client->client_id.ns.iaid) + duid_len; - } - - /* Some DHCP servers will refuse to issue an DHCP lease if the Client -@@ -475,7 +486,7 @@ static int client_message_init(sd_dhcp_client *client, DHCPPacket **ret, - r = dhcp_option_append(&packet->dhcp, optlen, &optoffset, 0, - DHCP_OPTION_CLIENT_IDENTIFIER, - client->client_id_len, -- &client->client_id.raw); -+ &client->client_id); - if (r < 0) - return r; - } -@@ -1031,7 +1042,7 @@ static int client_handle_offer(sd_dhcp_client *client, DHCPMessage *offer, - - if (client->client_id_len) { - r = dhcp_lease_set_client_id(lease, -- (uint8_t *) &client->client_id.raw, -+ (uint8_t *) &client->client_id, - client->client_id_len); - if (r < 0) - return r; -@@ -1098,7 +1109,7 @@ static int client_handle_ack(sd_dhcp_client *client, DHCPMessage *ack, - - if (client->client_id_len) { - r = dhcp_lease_set_client_id(lease, -- (uint8_t *) &client->client_id.raw, -+ (uint8_t *) &client->client_id, - client->client_id_len); - if (r < 0) - return r; -diff --git a/src/libsystemd-network/test-dhcp-client.c b/src/libsystemd-network/test-dhcp-client.c -index 0515440..a3d69f3 100644 ---- a/src/libsystemd-network/test-dhcp-client.c -+++ b/src/libsystemd-network/test-dhcp-client.c -@@ -32,17 +32,16 @@ - #include "sd-event.h" - #include "event-util.h" - -+#include "dhcp-identifier.h" - #include "dhcp-protocol.h" - #include "dhcp-internal.h" - #include "sd-dhcp-client.h" - --static struct ether_addr mac_addr = { -- .ether_addr_octet = {'A', 'B', 'C', '1', '2', '3'} --}; -+static uint8_t mac_addr[] = {'A', 'B', 'C', '1', '2', '3'}; - - typedef int (*test_callback_recv_t)(size_t size, DHCPMessage *dhcp); - --static bool verbose = false; -+static bool verbose = true; - static int test_fd[2]; - static test_callback_recv_t callback_recv; - static be32_t xid; -@@ -136,10 +135,22 @@ static int check_options(uint8_t code, uint8_t len, const uint8_t *option, - { - switch(code) { - case DHCP_OPTION_CLIENT_IDENTIFIER: -- assert_se(len == 7); -- assert_se(option[0] == 0x01); -- assert_se(memcmp(&option[1], &mac_addr, ETH_ALEN) == 0); -+ { -+ uint32_t iaid; -+ struct duid duid; -+ size_t duid_len; -+ -+ assert_se(dhcp_identifier_set_duid_en(&duid, &duid_len) >= 0); -+ assert_se(dhcp_identifier_set_iaid(42, mac_addr, ETH_ALEN, &iaid) >= 0); -+ -+ assert_se(len == sizeof(uint8_t) + sizeof(uint32_t) + duid_len); -+ assert_se(len == 19); -+ assert_se(option[0] == 0xff); -+ -+ assert_se(memcmp(&option[1], &iaid, sizeof(iaid)) == 0); -+ assert_se(memcmp(&option[5], &duid, duid_len) == 0); - break; -+ } - - default: - break; -@@ -185,8 +196,7 @@ int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link, - assert_se(ip_check == 0xffff); - - assert_se(discover->dhcp.xid); -- assert_se(memcmp(discover->dhcp.chaddr, -- &mac_addr.ether_addr_octet, 6) == 0); -+ assert_se(memcmp(discover->dhcp.chaddr, &mac_addr, ETH_ALEN) == 0); - - size = len - sizeof(struct iphdr) - sizeof(struct udphdr); - -@@ -246,10 +256,7 @@ static void test_discover_message(sd_event *e) - assert_se(r >= 0); - - assert_se(sd_dhcp_client_set_index(client, 42) >= 0); -- assert_se(sd_dhcp_client_set_mac(client, -- (const uint8_t *) &mac_addr, -- sizeof (mac_addr), -- ARPHRD_ETHER) >= 0); -+ assert_se(sd_dhcp_client_set_mac(client, mac_addr, ETH_ALEN, ARPHRD_ETHER) >= 0); - - assert_se(sd_dhcp_client_set_request_option(client, 248) >= 0); - -@@ -404,8 +411,7 @@ static int test_addr_acq_recv_request(size_t size, DHCPMessage *request) { - - memcpy(&test_addr_acq_ack[26], &udp_check, sizeof(udp_check)); - memcpy(&test_addr_acq_ack[32], &xid, sizeof(xid)); -- memcpy(&test_addr_acq_ack[56], &mac_addr.ether_addr_octet, -- ETHER_ADDR_LEN); -+ memcpy(&test_addr_acq_ack[56], &mac_addr, ETHER_ADDR_LEN); - - callback_recv = NULL; - -@@ -436,8 +442,7 @@ static int test_addr_acq_recv_discover(size_t size, DHCPMessage *discover) { - - memcpy(&test_addr_acq_offer[26], &udp_check, sizeof(udp_check)); - memcpy(&test_addr_acq_offer[32], &xid, sizeof(xid)); -- memcpy(&test_addr_acq_offer[56], &mac_addr.ether_addr_octet, -- ETHER_ADDR_LEN); -+ memcpy(&test_addr_acq_offer[56], &mac_addr, ETHER_ADDR_LEN); - - callback_recv = test_addr_acq_recv_request; - -@@ -467,10 +472,7 @@ static void test_addr_acq(sd_event *e) { - assert_se(r >= 0); - - assert_se(sd_dhcp_client_set_index(client, 42) >= 0); -- assert_se(sd_dhcp_client_set_mac(client, -- (const uint8_t *) &mac_addr, -- sizeof (mac_addr), -- ARPHRD_ETHER) >= 0); -+ assert_se(sd_dhcp_client_set_mac(client, mac_addr, ETH_ALEN, ARPHRD_ETHER) >= 0); - - assert_se(sd_dhcp_client_set_callback(client, test_addr_acq_acquired, e) - >= 0); --- -cgit v0.10.2 - diff --git a/core/systemd/PKGBUILD b/core/systemd/PKGBUILD index cab626d7c..ab5c6fafb 100644 --- a/core/systemd/PKGBUILD +++ b/core/systemd/PKGBUILD @@ -3,82 +3,64 @@ # ALARM: Kevin Mihelich # - disable optimization, currently breaks many things -# - v5: revert 5bac523 until the issue with it can be figured out +# - removed makedepend on gnu-efi-libs, --enable-gnuefi configure option pkgbase=systemd pkgname=('systemd' 'libsystemd' 'systemd-sysvcompat') -pkgver=219 -pkgrel=6 +pkgver=221 +pkgrel=1 arch=('i686' 'x86_64') url="http://www.freedesktop.org/wiki/Software/systemd" -makedepends=('acl' 'cryptsetup' 'docbook-xsl' 'gobject-introspection' 'gperf' - 'gtk-doc' 'intltool' 'iptables' 'kmod' 'libcap' 'libidn' 'libgcrypt' - 'libmicrohttpd' 'libxslt' 'util-linux' 'linux-api-headers' 'lz4' 'pam' - 'python' 'python-lxml' 'quota-tools' 'shadow' 'xz') +makedepends=('acl' 'cryptsetup' 'docbook-xsl' 'gperf' 'lz4' 'xz' 'pam' + 'intltool' 'iptables' 'kmod' 'libcap' 'libidn' 'libgcrypt' + 'libmicrohttpd' 'libxslt' 'util-linux' 'linux-api-headers' + 'python' 'python-lxml' 'quota-tools' 'shadow' 'git') options=('strip' 'debug') -source=("http://www.freedesktop.org/software/$pkgname/$pkgname-$pkgver.tar.xz" +source=("git://github.com/systemd/systemd.git#tag=v$pkgver" 'initcpio-hook-udev' 'initcpio-install-systemd' 'initcpio-install-udev' - '0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch' - '0001-nspawn-when-connected-to-pipes-for-stdin-stdout-pass.patch' - '0001-core-shared-in-deserializing-match-same-files-reache.patch' - '0001-tmpfiles-Fix-handling-of-duplicate-lines.patch' - '0001-core-do-not-spawn-jobs-or-touch-other-units-during-c.patch' - '0001-use-x-machine-unix-prefix-for-the-container-bus-on-dbus1.patch' - '0001-unit-use-weaker-dependencies-between-mount-and-devic.patch' - '0001-core-rework-device-state-logic.patch' - '0001-core-don-t-change-removed-devices-to-state-tentative.patch' - '5bac5235934fabe5a3e6a9d47f4812f81034c427.patch') -md5sums=('e0d6c9a4b4f69f66932d2230298c9a34' + 'arch.conf' + 'loader.conf' + 'splash-arch.bmp') +md5sums=('SKIP' '90ea67a7bb237502094914622a39e281' - '58af51bd4c0464f195b3433b4e17cf6c' + '8516a7bd65157d0115c113118c10c3f3' 'bde43090d4ac0ef048e3eaee8202a407' - '7cdefc73bf61934c353e4450e280e551' - 'cb8550749cd52b5902ed6fdf0eb465ec' - '9d46aebfc04cc849fd4295f449b239a2' - 'c4c9c0f0a06314450563ed571962881e' - '6b9d611dffd92c94641360c3ef2659c1' - '3a0fc672b34ced18ca1364edf8644165' - 'cd2719e8e93ad662c00bf9f195fdce66' - '12e01f00c91e54680098a799517698f2' - 'd0aa4e5ec598063eab2e79fb95bceece' - 'a168ea8a805ee16c1dd1cfe6f5893558') + '20ead378f5d6df4b2a3e670301510a7d' + 'ddaef54f68f6c86c6c07835fc668f62a' + '1e2f9a8b0fa32022bf0a8f39123e5f4e') prepare() { - cd "$pkgname-$pkgver" + cd "$pkgname" - patch -Np1 <../0001-tmpfiles-avoid-creating-duplicate-acl-entries.patch - patch -Np1 <../0001-nspawn-when-connected-to-pipes-for-stdin-stdout-pass.patch - patch -Np1 <../0001-core-shared-in-deserializing-match-same-files-reache.patch - patch -Np1 <../0001-tmpfiles-Fix-handling-of-duplicate-lines.patch - patch -Np1 <../0001-core-do-not-spawn-jobs-or-touch-other-units-during-c.patch - patch -Np1 <../0001-use-x-machine-unix-prefix-for-the-container-bus-on-dbus1.patch - patch -Np1 <../0001-unit-use-weaker-dependencies-between-mount-and-devic.patch - patch -Np1 <../0001-core-rework-device-state-logic.patch - patch -Np1 <../0001-core-don-t-change-removed-devices-to-state-tentative.patch - [[ $CARCH == "arm" ]] && patch -Rp1 -i ../5bac5235934fabe5a3e6a9d47f4812f81034c427.patch || true + # pam_systemd: Properly check kdbus availability + # https://github.com/systemd/systemd/commit/c5d452bb228e + git cherry-pick -n c5d452bb228e + + # udevd: suppress warning if we don't find cgroup + # https://github.com/systemd/systemd/commit/11b9fb15be96 + git cherry-pick -n 11b9fb15be96 + + ./autogen.sh } build() { - cd "$pkgname-$pkgver" + cd "$pkgname" + + local timeservers=({0..3}.arch.pool.ntp.org) CFLAGS=`echo $CFLAGS | sed -e 's/-O2/-O0/'` && CXXFLAGS="$CFLAGS" unset CPPFLAGS - local timeservers=({0..3}.arch.pool.ntp.org) - ./configure \ --libexecdir=/usr/lib \ --localstatedir=/var \ --sysconfdir=/etc \ - --enable-introspection \ - --enable-gtk-doc \ --enable-lz4 \ --enable-compat-libs \ --disable-audit \ --disable-ima \ - --disable-kdbus \ --with-sysvinit-path= \ --with-sysvrcnd-path= \ --with-ntp-servers="${timeservers[*]}" @@ -88,7 +70,7 @@ build() { package_systemd() { pkgdesc="system and service manager" - license=('GPL2' 'LGPL2.1' 'MIT') + license=('GPL2' 'LGPL2.1') depends=('acl' 'bash' 'dbus' 'glib2' 'iptables' 'kbd' 'kmod' 'hwids' 'libcap' 'libgcrypt' 'libsystemd' 'libidn' 'lz4' 'pam' 'libseccomp' 'util-linux' 'xz') @@ -123,7 +105,7 @@ package_systemd() { etc/udev/udev.conf) install="systemd.install" - make -C "$pkgname-$pkgver" DESTDIR="$pkgdir" install + make -C "$pkgname" DESTDIR="$pkgdir" install # don't write units to /etc by default. some of these will be re-enabled on # post_install. @@ -133,7 +115,7 @@ package_systemd() { rm -r "$pkgdir/usr/lib/rpm" # add back tmpfiles.d/legacy.conf - install -m644 "systemd-$pkgver/tmpfiles.d/legacy.conf" "$pkgdir/usr/lib/tmpfiles.d" + install -m644 "$pkgname/tmpfiles.d/legacy.conf" "$pkgdir/usr/lib/tmpfiles.d" # Replace dialout/tape/cdrom group in rules with uucp/storage/optical group sed -i 's#GROUP="dialout"#GROUP="uucp"#g; @@ -171,18 +153,19 @@ package_systemd() { rm -rf "$srcdir/_libsystemd" install -dm755 "$srcdir"/_libsystemd/usr/lib cd "$srcdir"/_libsystemd - mv "$pkgdir"/usr/lib/lib{systemd,{g,}udev}*.so* usr/lib + mv "$pkgdir"/usr/lib/lib{systemd,udev}*.so* usr/lib - # include MIT license, since it's technically custom - install -Dm644 "$srcdir/$pkgname-$pkgver/LICENSE.MIT" \ - "$pkgdir/usr/share/licenses/systemd/LICENSE.MIT" + # add example bootctl configuration + install -Dm644 "$srcdir/arch.conf" "$pkgdir"/usr/share/systemd/bootctl/arch.conf + install -Dm644 "$srcdir/loader.conf" "$pkgdir"/usr/share/systemd/bootctl/loader.conf + install -Dm644 "$srcdir/splash-arch.bmp" "$pkgdir"/usr/share/systemd/bootctl/splash-arch.bmp } package_libsystemd() { pkgdesc="systemd client libraries" depends=('glib2' 'glibc' 'libgcrypt' 'lz4' 'xz') license=('GPL2') - provides=('libgudev-1.0.so' 'libsystemd.so' 'libsystemd-daemon.so' 'libsystemd-id128.so' + provides=('libsystemd.so' 'libsystemd-daemon.so' 'libsystemd-id128.so' 'libsystemd-journal.so' 'libsystemd-login.so' 'libudev.so') mv "$srcdir/_libsystemd"/* "$pkgdir" diff --git a/core/systemd/arch.conf b/core/systemd/arch.conf new file mode 100644 index 000000000..250b7785e --- /dev/null +++ b/core/systemd/arch.conf @@ -0,0 +1,7 @@ +## This is just an example config file. +## Please edit the paths and kernel parameters according to your system. + +title Arch Linux +linux /vmlinuz-linux +initrd /initramfs-linux.img +options root=PARTUUID=XXXX rootfstype=XXXX add_efi_memmap diff --git a/core/systemd/initcpio-install-systemd b/core/systemd/initcpio-install-systemd index 25e628305..acd8a226d 100644 --- a/core/systemd/initcpio-install-systemd +++ b/core/systemd/initcpio-install-systemd @@ -34,6 +34,7 @@ add_udev_rule() { strip_quotes 'value' # just take the first word as the binary name binary=${value%% *} + [[ ${binary:0:1} == '$' ]] && continue if [[ ${binary:0:1} != '/' ]]; then binary=$(PATH=/usr/lib/udev:/lib/udev type -P "$binary") fi diff --git a/core/systemd/loader.conf b/core/systemd/loader.conf new file mode 100644 index 000000000..1f7cd7ef4 --- /dev/null +++ b/core/systemd/loader.conf @@ -0,0 +1 @@ +default arch diff --git a/core/systemd/splash-arch.bmp b/core/systemd/splash-arch.bmp new file mode 100755 index 0000000000000000000000000000000000000000..f083d4bbf5acb0e3904511da832c2b700e8e946c GIT binary patch literal 378226 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 RsUreJfCvx)BGBCk{67aehJpY9 literal 0 HcmV?d00001