From 588b92a7d26f20146a29306a583c41b3c46bcaf8 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 22 May 2015 15:34:08 +0200 Subject: [PATCH] systemd: Update to 220 --- nixos/modules/system/boot/systemd.nix | 2 - pkgs/os-specific/linux/systemd/default.nix | 16 +- pkgs/os-specific/linux/systemd/fixes.patch | 783 ++------------------- 3 files changed, 47 insertions(+), 754 deletions(-) diff --git a/nixos/modules/system/boot/systemd.nix b/nixos/modules/system/boot/systemd.nix index afb5a9b78d8a..052267e7ad5e 100644 --- a/nixos/modules/system/boot/systemd.nix +++ b/nixos/modules/system/boot/systemd.nix @@ -110,8 +110,6 @@ let "systemd-hibernate.service" "systemd-suspend.service" "systemd-hybrid-sleep.service" - "systemd-shutdownd.socket" - "systemd-shutdownd.service" # Reboot stuff. "reboot.target" diff --git a/pkgs/os-specific/linux/systemd/default.nix b/pkgs/os-specific/linux/systemd/default.nix index 4b793c29c550..da3f65e3623f 100644 --- a/pkgs/os-specific/linux/systemd/default.nix +++ b/pkgs/os-specific/linux/systemd/default.nix @@ -10,24 +10,24 @@ assert stdenv.isLinux; assert pythonSupport -> pythonPackages != null; stdenv.mkDerivation rec { - version = "219"; + version = "220"; name = "systemd-${version}"; src = fetchurl { url = "http://www.freedesktop.org/software/systemd/${name}.tar.xz"; - sha256 = "1ngj0d2wg6r58m4zycd2w0zkmkz71abbv0dl1h6h8z73ahs12msw"; + sha256 = "0ck38kmhscbd7w0n1rbvw7drc9zpj5a77h02fljyf7i28265hn9n"; }; patches = [ # These are all changes between upstream and - # https://github.com/edolstra/systemd/tree/nixos-v219. + # https://github.com/edolstra/systemd/tree/nixos-v220. ./fixes.patch ]; buildInputs = - [ pkgconfig intltool gperf libcap kmod xz pam acl + [ linuxHeaders pkgconfig intltool gperf libcap kmod xz pam acl /* cryptsetup */ libuuid m4 glib libxslt libgcrypt - libmicrohttpd linuxHeaders kexectools + libmicrohttpd kexectools ] ++ stdenv.lib.optionals pythonSupport [pythonPackages.python pythonPackages.lxml]; configureFlags = @@ -85,11 +85,9 @@ stdenv.mkDerivation rec { substituteInPlace src/journal/catalog.c \ --replace /usr/lib/systemd/catalog/ $out/lib/systemd/catalog/ - ''; - # This is needed because systemd uses the gold linker, which doesn't - # yet have the wrapper script to add rpath flags automatically. - NIX_LDFLAGS = "-rpath ${pam}/lib -rpath ${libcap}/lib -rpath ${acl}/lib -rpath ${stdenv.cc.cc}/lib"; + rm src/journal/audit_type-to-name.h src/udev/keyboard-keys-from-name.gperf + ''; PYTHON_BINARY = "${coreutils}/bin/env python"; # don't want a build time dependency on Python diff --git a/pkgs/os-specific/linux/systemd/fixes.patch b/pkgs/os-specific/linux/systemd/fixes.patch index 1492051d3912..b05e0bae8de5 100644 --- a/pkgs/os-specific/linux/systemd/fixes.patch +++ b/pkgs/os-specific/linux/systemd/fixes.patch @@ -1,134 +1,23 @@ -diff --git a/hwdb/60-keyboard.hwdb b/hwdb/60-keyboard.hwdb -index 1b7d871..9f99ca8 100644 ---- a/hwdb/60-keyboard.hwdb -+++ b/hwdb/60-keyboard.hwdb -@@ -259,7 +259,7 @@ keyboard:dmi:bvn*:bvr*:bd*:svnDell*:pnXPS*:pvr* - # Dell XPS12 9Q33 - keyboard:dmi:bvn*:bvr*:bd*:svnDell*:pnXPS12-9Q33*:pvr* - KEYBOARD_KEY_88=wlan -- KEYBOARD_KEY_65=switchvideomode # Screen Rotate -+ KEYBOARD_KEY_65=direction # Screen Rotate - - # Dell Latitude microphone mute - keyboard:name:Dell WMI hotkeys:dmi:bvn*:bvr*:bd*:svnDell*:pnLatitude* -@@ -586,7 +586,6 @@ keyboard:dmi:bvn*:bvr*:bd*:svnLENOVO*:pnS10-*:pvr* - KEYBOARD_KEY_f3=f21 - - # Thinkpad X200_Tablet --keyboard:dmi:bvn*:bvr*:bd*:svnLENOVO*:pnThinkPad*X2*Tablet*:pvr* - keyboard:dmi:bvn*:bvr*:bd*:svnLENOVO*:pn*:pvrThinkPad*X2*Tablet* - KEYBOARD_KEY_5d=menu - KEYBOARD_KEY_63=fn -@@ -596,7 +595,7 @@ keyboard:dmi:bvn*:bvr*:bd*:svnLENOVO*:pn*:pvrThinkPad*X2*Tablet* - KEYBOARD_KEY_6c=direction # rotate screen - - # ThinkPad X6 Tablet --keyboard:dmi:bvn*:bvr*:bd*:svnLENOVO*:pnThinkPad*X6*:pvr* -+keyboard:dmi:bvn*:bvr*:bd*:svnLENOVO*:pn*:pvrThinkPad*X6*Tablet* - KEYBOARD_KEY_6c=direction # rotate - KEYBOARD_KEY_68=leftmeta # toolbox - KEYBOARD_KEY_6b=esc # escape -@@ -1010,6 +1009,12 @@ keyboard:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*7[34]0U3E*:pvr* - KEYBOARD_KEY_b3=!prog3 # Fn+F11 fan/cooling mode changer - KEYBOARD_KEY_d5=!wlan # Fn+F12 wlan/airplane switch - -+# ATIV Book 6 / 8 -+evdev:atkbd:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*[68][78]0Z*:pvr* -+ KEYBOARD_KEY_ce=!prog1 # Fn+F1 launch settings -+ KEYBOARD_KEY_96=!kbdillumup # Fn+F10 keyboard backlight up -+ KEYBOARD_KEY_97=!kbdillumdown # Fn+F9 keyboard backlight down -+ - # SQ1US - keyboard:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pnSQ1US:pvr* - KEYBOARD_KEY_d4=menu -diff --git a/rules/42-usb-hid-pm.rules b/rules/42-usb-hid-pm.rules -index 4c300da..3721219 100644 ---- a/rules/42-usb-hid-pm.rules -+++ b/rules/42-usb-hid-pm.rules -@@ -28,9 +28,9 @@ ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="14dd", ATTR{idProduct}=="0002" - - # USB HID devices that are internal to the machine should also be safe to autosuspend - --ACTION=="add", SUBSYSTEM=="usb", SUBSYSTEMS=="usb", ATTRS{removable}=="removable", GOTO="usb_hid_pm_end" --ACTION=="add", SUBSYSTEM=="usb", SUBSYSTEMS=="usb", ATTRS{removable}=="unknown", GOTO="usb_hid_pm_end" -+ACTION=="add", SUBSYSTEM=="usb", SUBSYSTEMS=="usb", ATTR{../removable}=="removable", GOTO="usb_hid_pm_end" -+ACTION=="add", SUBSYSTEM=="usb", SUBSYSTEMS=="usb", ATTR{../removable}=="unknown", GOTO="usb_hid_pm_end" - --ACTION=="add", SUBSYSTEM=="usb", ATTR{bInterfaceClass}=="03", ATTRS{removable}=="fixed", TEST=="../power/control", ATTR{../power/control}="auto" -+ACTION=="add", SUBSYSTEM=="usb", ATTR{bInterfaceClass}=="03", ATTR{../removable}=="fixed", TEST=="../power/control", ATTR{../power/control}="auto" - - LABEL="usb_hid_pm_end" diff --git a/rules/99-systemd.rules.in b/rules/99-systemd.rules.in -index b66d727..bb14135 100644 +index 10b90b8..db63c11 100644 --- a/rules/99-systemd.rules.in +++ b/rules/99-systemd.rules.in -@@ -14,10 +14,6 @@ KERNEL=="vport*", TAG+="systemd" - SUBSYSTEM=="block", KERNEL!="ram*", TAG+="systemd" - SUBSYSTEM=="block", KERNEL!="ram*", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", ENV{SYSTEMD_READY}="0" +@@ -13,10 +13,6 @@ KERNEL=="vport*", TAG+="systemd" + SUBSYSTEM=="block", TAG+="systemd" + SUBSYSTEM=="block", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", ENV{SYSTEMD_READY}="0" -# Ignore encrypted devices with no identified superblock on it, since -# we are probably still calling mke2fs or mkswap on it. --SUBSYSTEM=="block", KERNEL!="ram*", ENV{DM_UUID}=="CRYPT-*", ENV{ID_PART_TABLE_TYPE}=="", ENV{ID_FS_USAGE}=="", ENV{SYSTEMD_READY}="0" +-SUBSYSTEM=="block", ENV{DM_UUID}=="CRYPT-*", ENV{ID_PART_TABLE_TYPE}=="", ENV{ID_FS_USAGE}=="", ENV{SYSTEMD_READY}="0" - # Ignore raid devices that are not yet assembled and started SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", KERNEL=="md*", TEST!="md/array_state", ENV{SYSTEMD_READY}="0" SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", KERNEL=="md*", ATTR{md/array_state}=="|clear|inactive", ENV{SYSTEMD_READY}="0" -diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c -index 3c7ad40..f951c37 100644 ---- a/src/cgtop/cgtop.c -+++ b/src/cgtop/cgtop.c -@@ -447,7 +447,7 @@ static int display(Hashmap *a) { - Group *g; - Group **array; - signed path_columns; -- unsigned rows, n = 0, j, maxtcpu = 0, maxtpath = 0; -+ unsigned rows, n = 0, j, maxtcpu = 0, maxtpath = 3; /* 3 for ellipsize() to work properly */ - char buffer[MAX3(21, FORMAT_BYTES_MAX, FORMAT_TIMESPAN_MAX)]; - - assert(a); -diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c -index 90bf563..c614f77 100644 ---- a/src/core/load-fragment.c -+++ b/src/core/load-fragment.c -@@ -1213,17 +1213,15 @@ int config_parse_exec_mount_flags(const char *unit, - flags = MS_SHARED; - else if (streq(t, "slave")) - flags = MS_SLAVE; -- else if (streq(word, "private")) -+ else if (streq(t, "private")) - flags = MS_PRIVATE; - else { -- log_syntax(unit, LOG_ERR, filename, line, EINVAL, -- "Failed to parse mount flag %s, ignoring: %s", t, rvalue); -+ log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Failed to parse mount flag %s, ignoring: %s", t, rvalue); - return 0; - } - } - if (!isempty(state)) -- log_syntax(unit, LOG_ERR, filename, line, EINVAL, -- "Trailing garbage, ignoring."); -+ log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Trailing garbage, ignoring."); - - c->mount_flags = flags; - return 0; -diff --git a/src/core/manager.c b/src/core/manager.c -index 4775219..bc9b7ec 100644 ---- a/src/core/manager.c -+++ b/src/core/manager.c -@@ -961,7 +961,7 @@ int manager_enumerate(Manager *m) { - int q; - - if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) { -- log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c)); -+ log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c)); - continue; - } - diff --git a/src/core/mount.c b/src/core/mount.c -index f3977e6..52aa30a 100644 +index ba1dcf1..b700ce7 100644 --- a/src/core/mount.c +++ b/src/core/mount.c -@@ -357,7 +357,9 @@ static bool should_umount(Mount *m) { +@@ -367,7 +367,9 @@ static bool should_umount(Mount *m) { MountParameters *p; if (path_equal(m->where, "/") || @@ -139,7 +28,7 @@ index f3977e6..52aa30a 100644 return false; p = get_mount_parameters(m); -@@ -385,6 +387,8 @@ static int mount_add_default_dependencies(Mount *m) { +@@ -395,6 +397,8 @@ static int mount_add_default_dependencies(Mount *m) { * virtual, and hence not worth the effort. */ if (path_equal(m->where, "/") || path_equal(m->where, "/usr") || @@ -149,10 +38,10 @@ index f3977e6..52aa30a 100644 path_startswith(m->where, "/sys") || path_startswith(m->where, "/dev")) diff --git a/src/core/systemd.pc.in b/src/core/systemd.pc.in -index d5b86bf..9c66e7b 100644 +index ac52b30..d2e28f4 100644 --- a/src/core/systemd.pc.in +++ b/src/core/systemd.pc.in -@@ -14,8 +14,8 @@ systemduserunitdir=@userunitdir@ +@@ -13,8 +13,8 @@ systemduserunitdir=@userunitdir@ systemduserpresetdir=@userpresetdir@ systemdsystemconfdir=@pkgsysconfdir@/system systemduserconfdir=@pkgsysconfdir@/user @@ -164,10 +53,10 @@ index d5b86bf..9c66e7b 100644 systemdusergeneratordir=@usergeneratordir@ systemdsleepdir=@systemsleepdir@ diff --git a/src/core/umount.c b/src/core/umount.c -index dd7df19..5bc0b12 100644 +index bee267a..dc88e17 100644 --- a/src/core/umount.c +++ b/src/core/umount.c -@@ -391,6 +391,8 @@ static int mount_points_list_umount(MountPoint **head, bool *changed, bool log_e +@@ -392,6 +392,8 @@ static int mount_points_list_umount(MountPoint **head, bool *changed, bool log_e * anyway, since we are running from it. They have * already been remounted ro. */ if (path_equal(m->path, "/") @@ -177,280 +66,37 @@ index dd7df19..5bc0b12 100644 || path_equal(m->path, "/usr") #endif diff --git a/src/core/unit.c b/src/core/unit.c -index ee8e607..2d87702 100644 +index e380276..a875df7 100644 --- a/src/core/unit.c +++ b/src/core/unit.c -@@ -1648,12 +1648,15 @@ static void unit_check_binds_to(Unit *u) { - continue; - - stop = true; -+ break; +@@ -1676,7 +1676,8 @@ static void unit_check_binds_to(Unit *u) { } - if (!stop) - return; - -- log_unit_info(u->id, "Unit %s is bound to inactive unit. Stopping, too.", u->id); -+ assert(other); + assert(other); +- log_unit_info(u, "Unit is bound to inactive unit %s. Stopping, too.", other->id); + if (u->type != UNIT_MOUNT || detect_container(NULL) <= 0) -+ log_unit_info(u->id, "Unit %s is bound to inactive unit %s. Stopping, too.", u->id, other->id); ++ log_unit_info(u, "Unit is bound to inactive unit %s. Stopping, too.", other->id); /* A unit we need to run is gone. Sniff. Let's stop this. */ - manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL); + r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL); diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c -index 78ceeb6..9400496 100644 +index 9bbe9ff..d8a2889 100644 --- a/src/fsck/fsck.c +++ b/src/fsck/fsck.c -@@ -318,8 +318,7 @@ int main(int argc, char *argv[]) { - return EXIT_FAILURE; - } +@@ -412,7 +412,7 @@ int main(int argc, char *argv[]) { + } else + dash_c[0] = 0; -- cmdline[i++] = "/sbin/fsck"; -- cmdline[i++] = arg_repair; -+ cmdline[i++] = "/run/current-system/sw/sbin/fsck"; - cmdline[i++] = "-T"; +- cmdline[i++] = "/sbin/fsck"; ++ cmdline[i++] = "/run/current-system/sw/sbin/fsck"; + cmdline[i++] = arg_repair; + cmdline[i++] = "-T"; - /* -diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c -index d9dea8d..afded7e 100644 ---- a/src/journal-remote/journal-remote-parse.c -+++ b/src/journal-remote/journal-remote-parse.c -@@ -344,22 +344,25 @@ int process_data(RemoteSource *source) { - LLLLLLLL0011223344...\n - */ - sep = memchr(line, '=', n); -- if (sep) -+ if (sep) { - /* chomp newline */ - n--; -- else -+ -+ r = iovw_put(&source->iovw, line, n); -+ if (r < 0) -+ return r; -+ } else { - /* replace \n with = */ - line[n-1] = '='; -- log_trace("Received: %.*s", (int) n, line); - -- r = iovw_put(&source->iovw, line, n); -- if (r < 0) { -- log_error("Failed to put line in iovect"); -- return r; -+ source->field_len = n; -+ source->state = STATE_DATA_START; -+ -+ /* we cannot put the field in iovec until we have all data */ - } - -- if (!sep) -- source->state = STATE_DATA_START; -+ log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary"); -+ - return 0; /* continue */ - } - -@@ -382,6 +385,7 @@ int process_data(RemoteSource *source) { - - case STATE_DATA: { - void *data; -+ char *field; - - assert(source->data_size > 0); - -@@ -396,11 +400,12 @@ int process_data(RemoteSource *source) { - - assert(data); - -- r = iovw_put(&source->iovw, data, source->data_size); -- if (r < 0) { -- log_error("failed to put binary buffer in iovect"); -+ field = (char*) data - sizeof(uint64_t) - source->field_len; -+ memmove(field + sizeof(uint64_t), field, source->field_len); -+ -+ r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size); -+ if (r < 0) - return r; -- } - - source->state = STATE_DATA_FINISH; - -diff --git a/src/journal-remote/journal-remote-parse.h b/src/journal-remote/journal-remote-parse.h -index 8499f4e..22db550 100644 ---- a/src/journal-remote/journal-remote-parse.h -+++ b/src/journal-remote/journal-remote-parse.h -@@ -42,7 +42,9 @@ typedef struct RemoteSource { - size_t offset; /* offset to the beginning of live data in the buffer */ - size_t scanned; /* number of bytes since the beginning of data without a newline */ - size_t filled; /* total number of bytes in the buffer */ -- size_t data_size; /* size of the binary data chunk being processed */ -+ -+ size_t field_len; /* used for binary fields: the field name length */ -+ size_t data_size; /* and the size of the binary data chunk being processed */ - - struct iovec_wrapper iovw; - -diff --git a/src/journal-remote/microhttpd-util.c b/src/journal-remote/microhttpd-util.c -index 34d9337..a95fff1 100644 ---- a/src/journal-remote/microhttpd-util.c -+++ b/src/journal-remote/microhttpd-util.c -@@ -179,6 +179,7 @@ static int verify_cert_authorized(gnutls_session_t session) { - return log_error_errno(r, "gnutls_certificate_verification_status_print failed: %m"); - - log_info("Certificate status: %s", out.data); -+ gnutls_free(out.data); - - return status == 0 ? 0 : -EPERM; - } -@@ -238,10 +239,14 @@ static int get_auth_dn(gnutls_x509_crt_t client_cert, char **buf) { - return 0; - } - -+static inline void gnutls_x509_crt_deinitp(gnutls_x509_crt_t *p) { -+ gnutls_x509_crt_deinit(*p); -+} -+ - int check_permissions(struct MHD_Connection *connection, int *code, char **hostname) { - const union MHD_ConnectionInfo *ci; - gnutls_session_t session; -- gnutls_x509_crt_t client_cert; -+ _cleanup_(gnutls_x509_crt_deinitp) gnutls_x509_crt_t client_cert = NULL; - _cleanup_free_ char *buf = NULL; - int r; - -diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c -index 2845e05..9c9838f 100644 ---- a/src/journal/journal-file.c -+++ b/src/journal/journal-file.c -@@ -2611,8 +2611,8 @@ int journal_file_open( - * shouldn't be too bad, given that we do our own - * checksumming). */ - r = chattr_fd(f->fd, true, FS_NOCOW_FL); -- if (r < 0) -- log_warning_errno(errno, "Failed to set file attributes: %m"); -+ if (r < 0 && r != -ENOTTY) -+ log_warning_errno(r, "Failed to set file attributes: %m"); - - /* Let's attach the creation time to the journal file, - * so that the vacuuming code knows the age of this -@@ -2653,10 +2653,8 @@ int journal_file_open( - } - - r = mmap_cache_get(f->mmap, f->fd, f->prot, CONTEXT_HEADER, true, 0, PAGE_ALIGN(sizeof(Header)), &f->last_stat, &h); -- if (r < 0) { -- r = -errno; -+ if (r < 0) - goto fail; -- } - - f->header = h; - -diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c -index 2959303..c8402a2 100644 ---- a/src/libsystemd/sd-bus/bus-message.c -+++ b/src/libsystemd/sd-bus/bus-message.c -@@ -441,7 +441,7 @@ int bus_message_from_header( - size_t extra, - sd_bus_message **ret) { - -- sd_bus_message *m; -+ _cleanup_free_ sd_bus_message *m = NULL; - struct bus_header *h; - size_t a, label_sz; - -@@ -460,15 +460,13 @@ int bus_message_from_header( - return -EBADMSG; - - h = header; -- if (h->version != 1 && -- h->version != 2) -+ if (!IN_SET(h->version, 1, 2)) - return -EBADMSG; - - if (h->type == _SD_BUS_MESSAGE_TYPE_INVALID) - return -EBADMSG; - -- if (h->endian != BUS_LITTLE_ENDIAN && -- h->endian != BUS_BIG_ENDIAN) -+ if (!IN_SET(h->endian, BUS_LITTLE_ENDIAN, BUS_BIG_ENDIAN)) - return -EBADMSG; - - /* Note that we are happy with unknown flags in the flags header! */ -@@ -557,6 +555,7 @@ int bus_message_from_header( - - m->bus = sd_bus_ref(bus); - *ret = m; -+ m = NULL; - - return 0; - } -diff --git a/src/libudev/libudev-monitor.c b/src/libudev/libudev-monitor.c -index 3f1fee7..d0486e3 100644 ---- a/src/libudev/libudev-monitor.c -+++ b/src/libudev/libudev-monitor.c -@@ -749,12 +749,20 @@ int udev_monitor_send_device(struct udev_monitor *udev_monitor, - * If we send to a multicast group, we will get - * ECONNREFUSED, which is expected. - */ -- if (destination != NULL) -+ if (destination) - smsg.msg_name = &destination->snl; - else - smsg.msg_name = &udev_monitor->snl_destination; - smsg.msg_namelen = sizeof(struct sockaddr_nl); - count = sendmsg(udev_monitor->sock, &smsg, 0); -+ if (count < 0) { -+ if (!destination && errno == ECONNREFUSED) { -+ log_debug("passed unknown number of bytes to netlink monitor %p", udev_monitor); -+ return 0; -+ } else -+ return -errno; -+ } -+ - log_debug("passed %zi bytes to netlink monitor %p", count, udev_monitor); - return count; - } diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c -index fb67251..5c15398 100644 +index 5009363..72c6887 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c -@@ -827,10 +827,7 @@ static int mount_all(const char *dest) { - int r = 0; - - for (k = 0; k < ELEMENTSOF(mount_table); k++) { -- _cleanup_free_ char *where = NULL; --#ifdef HAVE_SELINUX -- _cleanup_free_ char *options = NULL; --#endif -+ _cleanup_free_ char *where = NULL, *options = NULL; - const char *o; - int t; - -@@ -3627,7 +3624,7 @@ int main(int argc, char *argv[]) { - } - - if (arg_ephemeral) { -- char *np; -+ _cleanup_free_ char *np = NULL; - - /* If the specified path is a mount point we - * generate the new snapshot immediately -@@ -3657,13 +3654,13 @@ int main(int argc, char *argv[]) { - - r = btrfs_subvol_snapshot(arg_directory, np, arg_read_only, true); - if (r < 0) { -- free(np); - log_error_errno(r, "Failed to create snapshot %s from %s: %m", np, arg_directory); - goto finish; - } - - free(arg_directory); - arg_directory = np; -+ np = NULL; - - remove_subvol = true; - -@@ -3700,6 +3697,7 @@ int main(int argc, char *argv[]) { +@@ -4589,6 +4589,7 @@ int main(int argc, char *argv[]) { goto finish; } } else { @@ -458,7 +104,7 @@ index fb67251..5c15398 100644 const char *p; p = strjoina(arg_directory, -@@ -3709,6 +3707,7 @@ int main(int argc, char *argv[]) { +@@ -4598,6 +4599,7 @@ int main(int argc, char *argv[]) { r = -EINVAL; goto finish; } @@ -466,135 +112,11 @@ index fb67251..5c15398 100644 } } else { -diff --git a/src/shared/acl-util.c b/src/shared/acl-util.c -index a4ff1ab..cbe09d7 100644 ---- a/src/shared/acl-util.c -+++ b/src/shared/acl-util.c -@@ -282,6 +282,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; -@@ -297,8 +368,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 -diff --git a/src/shared/barrier.c b/src/shared/barrier.c -index f65363a..b7dca75 100644 ---- a/src/shared/barrier.c -+++ b/src/shared/barrier.c -@@ -178,7 +178,7 @@ void barrier_set_role(Barrier *b, unsigned int role) { - assert(b); - assert(role == BARRIER_PARENT || role == BARRIER_CHILD); - /* make sure this is only called once */ -- assert(b->pipe[1] >= 0 && b->pipe[1] >= 0); -+ assert(b->pipe[0] >= 0 && b->pipe[1] >= 0); - - if (role == BARRIER_PARENT) - b->pipe[1] = safe_close(b->pipe[1]); diff --git a/src/shared/path-lookup.c b/src/shared/path-lookup.c -index 291a2f4..468fb07 100644 +index f6a1271..9bec8e9 100644 --- a/src/shared/path-lookup.c +++ b/src/shared/path-lookup.c -@@ -113,17 +113,14 @@ static char** user_dirs( +@@ -111,17 +111,14 @@ static char** user_dirs( const char * const config_unit_paths[] = { USER_CONFIG_UNIT_PATH, "/etc/systemd/user", @@ -613,7 +135,7 @@ index 291a2f4..468fb07 100644 NULL }; -@@ -290,13 +287,11 @@ int lookup_paths_init( +@@ -288,13 +285,11 @@ int lookup_paths_init( STRV_IFNOTNULL(generator_early), USER_CONFIG_UNIT_PATH, "/etc/systemd/user", @@ -629,7 +151,7 @@ index 291a2f4..468fb07 100644 STRV_IFNOTNULL(generator_late), NULL); } else -@@ -306,14 +301,11 @@ int lookup_paths_init( +@@ -304,14 +299,11 @@ int lookup_paths_init( STRV_IFNOTNULL(generator_early), SYSTEM_CONFIG_UNIT_PATH, "/etc/systemd/system", @@ -646,82 +168,8 @@ index 291a2f4..468fb07 100644 STRV_IFNOTNULL(generator_late), NULL); -diff --git a/src/shared/path-util.c b/src/shared/path-util.c -index b9db7f1..5b7fed5 100644 ---- a/src/shared/path-util.c -+++ b/src/shared/path-util.c -@@ -456,9 +456,9 @@ int path_is_mount_point(const char *t, bool allow_symlink) { - - union file_handle_union h = FILE_HANDLE_INIT; - int mount_id = -1, mount_id_parent = -1; -- _cleanup_free_ char *parent = NULL; - struct stat a, b; - int r; -+ _cleanup_close_ int fd = -1; - bool nosupp = false; - - /* We are not actually interested in the file handles, but -@@ -468,7 +468,15 @@ int path_is_mount_point(const char *t, bool allow_symlink) { - if (path_equal(t, "/")) - return 1; - -- r = name_to_handle_at(AT_FDCWD, t, &h.handle, &mount_id, allow_symlink ? AT_SYMLINK_FOLLOW : 0); -+ fd = openat(AT_FDCWD, t, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|(allow_symlink ? 0 : O_PATH)); -+ if (fd < 0) { -+ if (errno == ENOENT) -+ return 0; -+ -+ return -errno; -+ } -+ -+ r = name_to_handle_at(fd, "", &h.handle, &mount_id, AT_EMPTY_PATH); - if (r < 0) { - if (errno == ENOSYS) - /* This kernel does not support name_to_handle_at() -@@ -485,12 +493,9 @@ int path_is_mount_point(const char *t, bool allow_symlink) { - return -errno; - } - -- r = path_get_parent(t, &parent); -- if (r < 0) -- return r; - - h.handle.handle_bytes = MAX_HANDLE_SZ; -- r = name_to_handle_at(AT_FDCWD, parent, &h.handle, &mount_id_parent, AT_SYMLINK_FOLLOW); -+ r = name_to_handle_at(fd, "..", &h.handle, &mount_id_parent, 0); - if (r < 0) - if (errno == EOPNOTSUPP) - if (nosupp) -@@ -509,10 +514,7 @@ int path_is_mount_point(const char *t, bool allow_symlink) { - return mount_id != mount_id_parent; - - fallback: -- if (allow_symlink) -- r = stat(t, &a); -- else -- r = lstat(t, &a); -+ r = fstatat(fd, "", &a, AT_EMPTY_PATH); - - if (r < 0) { - if (errno == ENOENT) -@@ -521,14 +523,8 @@ fallback: - return -errno; - } - -- free(parent); -- parent = NULL; -- -- r = path_get_parent(t, &parent); -- if (r < 0) -- return r; - -- r = stat(parent, &b); -+ r = fstatat(fd, "..", &b, 0); - if (r < 0) - return -errno; - diff --git a/src/shared/path-util.h b/src/shared/path-util.h -index bd0d324..be74c46 100644 +index 4f45cfd..e015606 100644 --- a/src/shared/path-util.h +++ b/src/shared/path-util.h @@ -26,7 +26,7 @@ @@ -733,162 +181,11 @@ index bd0d324..be74c46 100644 #define DEFAULT_PATH_SPLIT_USR DEFAULT_PATH_NORMAL ":/sbin:/bin" #ifdef HAVE_SPLIT_USR -diff --git a/src/shared/selinux-util.c b/src/shared/selinux-util.c -index a2233e0..a46ddf8 100644 ---- a/src/shared/selinux-util.c -+++ b/src/shared/selinux-util.c -@@ -117,6 +117,7 @@ void mac_selinux_finish(void) { - return; - - selabel_close(label_hnd); -+ label_hnd = NULL; - #endif - } - -diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c -index 21cb898..51d79b8 100644 ---- a/src/systemctl/systemctl.c -+++ b/src/systemctl/systemctl.c -@@ -2881,6 +2881,9 @@ static int check_inhibitors(sd_bus *bus, enum action a) { - if (!sv) - return log_oom(); - -+ if ((pid_t) pid < 0) -+ return log_error_errno(ERANGE, "Bad PID %"PRIu32": %m", pid); -+ - if (!strv_contains(sv, - a == ACTION_HALT || - a == ACTION_POWEROFF || -@@ -2892,7 +2895,7 @@ static int check_inhibitors(sd_bus *bus, enum action a) { - user = uid_to_name(uid); - - log_warning("Operation inhibited by \"%s\" (PID "PID_FMT" \"%s\", user %s), reason is \"%s\".", -- who, pid, strna(comm), strna(user), why); -+ who, (pid_t) pid, strna(comm), strna(user), why); - - c++; - } -diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c -index 6e39b44..71c5cba 100644 ---- a/src/sysv-generator/sysv-generator.c -+++ b/src/sysv-generator/sysv-generator.c -@@ -166,7 +166,7 @@ static int generate_unit_file(SysvStub *s) { - /* We might already have a symlink with the same name from a Provides:, - * or from backup files like /etc/init.d/foo.bak. Real scripts always win, - * so remove an existing link */ -- if (is_symlink(unit)) { -+ if (is_symlink(unit) > 0) { - log_warning("Overwriting existing symlink %s with real service", unit); - (void) unlink(unit); - } -diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c -index 4d89886..1cf46bb 100644 ---- a/src/timedate/timedatectl.c -+++ b/src/timedate/timedatectl.c -@@ -109,14 +109,21 @@ static void print_status_info(const StatusInfo *i) { - - /* Enforce the values of /etc/localtime */ - if (getenv("TZ")) { -- fprintf(stderr, "Warning: Ignoring the TZ variable. Reading the system's time zone setting only.\n\n"); -+ fprintf(stderr, "Warning: Ignoring the TZ variable.\n\n"); - unsetenv("TZ"); - } - -+ r = setenv("TZ", i->timezone, false); -+ if (r < 0) { -+ log_error_errno(errno, "Failed to set TZ environment variable: %m"); -+ exit(EXIT_FAILURE); -+ } -+ tzset(); -+ - if (i->time != 0) { - sec = (time_t) (i->time / USEC_PER_SEC); - have_time = true; -- } else if (arg_transport == BUS_TRANSPORT_LOCAL) { -+ } else if (IN_SET(arg_transport, BUS_TRANSPORT_REMOTE, BUS_TRANSPORT_MACHINE)) { - sec = time(NULL); - have_time = true; - } else -diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c -index c948d4d..7c5772c 100644 ---- a/src/tmpfiles/tmpfiles.c -+++ b/src/tmpfiles/tmpfiles.c -@@ -689,7 +689,7 @@ static int get_acls_from_arg(Item *item) { - * afterwards, so the mask can be added now if necessary. */ - r = parse_acl(item->argument, &item->acl_access, &item->acl_default, !item->force); - if (r < 0) -- log_warning_errno(errno, "Failed to parse ACL \"%s\": %m. Ignoring", -+ log_warning_errno(r, "Failed to parse ACL \"%s\": %m. Ignoring", - item->argument); - #else - log_warning_errno(ENOSYS, "ACLs are not supported. Ignoring"); -@@ -1205,8 +1205,6 @@ static int create_item(Item *i) { - break; - } - -- log_debug("%s created successfully.", i->path); -- - return 0; - } - -diff --git a/src/udev/udevadm-settle.c b/src/udev/udevadm-settle.c -index fff5de7..e60c462 100644 ---- a/src/udev/udevadm-settle.c -+++ b/src/udev/udevadm-settle.c -@@ -56,6 +56,7 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) { - { "quiet", no_argument, NULL, 'q' }, /* removed */ - {} - }; -+ usec_t deadline; - const char *exists = NULL; - unsigned int timeout = 120; - struct pollfd pfd[1] = { {.fd = -1}, }; -@@ -105,6 +106,8 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) { - return EXIT_FAILURE; - } - -+ deadline = now(CLOCK_MONOTONIC) + timeout * USEC_PER_SEC; -+ - /* guarantee that the udev daemon isn't pre-processing */ - if (getuid() == 0) { - struct udev_ctrl *uctrl; -@@ -146,6 +149,9 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) { - break; - } - -+ if (timeout > 0 && now(CLOCK_MONOTONIC) >= deadline) -+ break; -+ - /* wake up when queue is empty */ - if (poll(pfd, 1, MSEC_PER_SEC) > 0 && pfd[0].revents & POLLIN) - udev_queue_flush(queue); -diff --git a/src/vconsole/90-vconsole.rules.in b/src/vconsole/90-vconsole.rules.in -index 0620096..35b9ad5 100644 ---- a/src/vconsole/90-vconsole.rules.in -+++ b/src/vconsole/90-vconsole.rules.in -@@ -5,7 +5,6 @@ - # the Free Software Foundation; either version 2.1 of the License, or - # (at your option) any later version. - --# Kernel resets vconsole state when changing console drivers so run --# systemd-vconsole-setup when fbcon loads -- --ACTION=="add", SUBSYSTEM=="graphics", KERNEL=="fbcon", RUN+="@rootlibexecdir@/systemd-vconsole-setup" -+# Each vtcon keeps its own state of fonts. -+# -+ACTION=="add", SUBSYSTEM=="vtconsole", KERNEL=="vtcon*", RUN+="@rootlibexecdir@/systemd-vconsole-setup" diff --git a/units/console-getty.service.m4.in b/units/console-getty.service.m4.in -index 8ac51a4..972b86a 100644 +index 413d940..972b86a 100644 --- a/units/console-getty.service.m4.in +++ b/units/console-getty.service.m4.in -@@ -9,13 +9,13 @@ - Description=Console Getty - Documentation=man:agetty(8) - After=systemd-user-sessions.service plymouth-quit-wait.service -+ConditionPathExists=/dev/console - m4_ifdef(`HAVE_SYSV_COMPAT', - After=rc-local.service - )m4_dnl +@@ -16,7 +16,6 @@ After=rc-local.service Before=getty.target [Service] @@ -909,7 +206,7 @@ index e126f3a..925af72 100644 Restart=always RestartSec=0 diff --git a/units/emergency.service.in b/units/emergency.service.in -index 2695d7b..a8b7a2e 100644 +index 52b9b1c..a3efec2 100644 --- a/units/emergency.service.in +++ b/units/emergency.service.in @@ -16,7 +16,6 @@ Before=shutdown.target @@ -918,7 +215,7 @@ index 2695d7b..a8b7a2e 100644 WorkingDirectory=/root -ExecStartPre=-/bin/plymouth quit ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\ntry again to boot into default mode.' - ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default" + ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --job-mode=fail --no-block default" Type=idle diff --git a/units/getty@.service.m4 b/units/getty@.service.m4 index 46164ab..f194a31 100644 @@ -952,7 +249,7 @@ index 0934a87..7e30c9e 100644 [Service] Type=oneshot diff --git a/units/rescue.service.in b/units/rescue.service.in -index de73fee..25617ba 100644 +index 432e4f3..66bdf87 100644 --- a/units/rescue.service.in +++ b/units/rescue.service.in @@ -16,7 +16,6 @@ Before=shutdown.target @@ -961,7 +258,7 @@ index de73fee..25617ba 100644 WorkingDirectory=/root -ExecStartPre=-/bin/plymouth quit ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.' - ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --fail --no-block default" + ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --job-mode=fail --no-block default" Type=idle diff --git a/units/serial-getty@.service.m4 b/units/serial-getty@.service.m4 index 4522d0d..96daa5c 100644