diff --git a/0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch b/0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch new file mode 100644 index 00000000..2d48b38a --- /dev/null +++ b/0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch @@ -0,0 +1,537 @@ +This seems to be a SUSE specific patch. Here we add the check for unmaintained +disk like devices to be able to flush and maybe shut them down. Also we add the +missing sync() system call for the direct halt/reboot systemctl command. Then we +use the system halt as gfallback if poweroff fails for both the direct poweroff +systemctl command as well as for the systemd-shutdown utility. + +--- + Makefile.am | 2 + Makefile.in | 7 + src/core/shutdown.c | 8 - + src/shared/hdflush.c | 365 ++++++++++++++++++++++++++++++++++++++++++++++ + src/shared/hdflush.h | 25 +++ + src/systemctl/systemctl.c | 17 +- + 6 files changed, 416 insertions(+), 8 deletions(-) + +--- systemd-208/Makefile.am ++++ systemd-208/Makefile.am 2014-01-28 11:06:55.638238060 +0000 +@@ -680,6 +680,8 @@ libsystemd_shared_la_SOURCES = \ + src/shared/strbuf.h \ + src/shared/strxcpyx.c \ + src/shared/strxcpyx.h \ ++ src/shared/hdflush.c \ ++ src/shared/hdflush.h \ + src/shared/conf-parser.c \ + src/shared/conf-parser.h \ + src/shared/log.c \ +--- systemd-208/Makefile.in ++++ systemd-208/Makefile.in 2014-01-28 11:06:33.942246196 +0000 +@@ -1509,7 +1509,7 @@ am_libsystemd_shared_la_OBJECTS = src/sh + src/shared/hashmap.lo src/shared/set.lo src/shared/fdset.lo \ + src/shared/prioq.lo src/shared/sleep-config.lo \ + src/shared/strv.lo src/shared/env-util.lo src/shared/strbuf.lo \ +- src/shared/strxcpyx.lo src/shared/conf-parser.lo \ ++ src/shared/strxcpyx.lo src/shared/hdflush.lo src/shared/conf-parser.lo \ + src/shared/log.lo src/shared/ratelimit.lo \ + src/shared/exit-status.lo src/shared/utf8.lo \ + src/shared/pager.lo src/shared/socket-util.lo \ +@@ -4137,6 +4137,8 @@ libsystemd_shared_la_SOURCES = \ + src/shared/strbuf.h \ + src/shared/strxcpyx.c \ + src/shared/strxcpyx.h \ ++ src/shared/hdflush.c \ ++ src/shared/hdflush.h \ + src/shared/conf-parser.c \ + src/shared/conf-parser.h \ + src/shared/log.c \ +@@ -7073,6 +7075,8 @@ src/shared/strbuf.lo: src/shared/$(am__d + src/shared/$(DEPDIR)/$(am__dirstamp) + src/shared/strxcpyx.lo: src/shared/$(am__dirstamp) \ + src/shared/$(DEPDIR)/$(am__dirstamp) ++src/shared/hdflush.lo: src/shared/$(am__dirstamp) \ ++ src/shared/$(DEPDIR)/$(am__dirstamp) + src/shared/conf-parser.lo: src/shared/$(am__dirstamp) \ + src/shared/$(DEPDIR)/$(am__dirstamp) + src/shared/log.lo: src/shared/$(am__dirstamp) \ +@@ -9236,6 +9240,7 @@ distclean-compile: + @AMDEP_TRUE@@am__include@ @am__quote@src/shared/$(DEPDIR)/strbuf.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/shared/$(DEPDIR)/strv.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/shared/$(DEPDIR)/strxcpyx.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@src/shared/$(DEPDIR)/hdflush.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/shared/$(DEPDIR)/time-dst.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/shared/$(DEPDIR)/time-util.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@src/shared/$(DEPDIR)/unit-name.Plo@am__quote@ +--- systemd-208/src/shared/hdflush.c ++++ systemd-208/src/shared/hdflush.c 2014-01-28 10:58:56.490735704 +0000 +@@ -0,0 +1,365 @@ ++/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ ++ ++/*** ++ This file is part of systemd. ++ ++ Copyright 2014 Werner Fink ++ ++ systemd is free software; you can redistribute it and/or modify it ++ under the terms of the GNU Lesser General Public License as published by ++ the Free Software Foundation; either version 2.1 of the License, or ++ (at your option) any later version. ++ ++ systemd is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public License ++ along with systemd; If not, see . ++***/ ++ ++/* ++ * Find all disks on the system, list out IDE, unmanaged ATA disks, and ++ * USB sticks flush the cache of those and optional shut them down. ++ */ ++ ++#include ++#include ++#ifdef LIST_DEBUG ++# include ++#endif ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#ifdef WORDS_BIGENDIAN ++# include ++#endif ++ ++/* Used in flush_cache_ext(), compare with */ ++#define IDBYTES 512 ++#define MASK_EXT 0xE000 /* Bit 15 shall be zero, bit 14 shall be one, bit 13 flush cache ext */ ++#define TEST_EXT 0x6000 ++ ++/* Maybe set in list_disks() and used in do_standby_disk() */ ++#define DISK_IS_IDE 0x00000001 ++#define DISK_IS_SATA 0x00000002 ++#define DISK_EXTFLUSH 0x00000004 ++#define DISK_REMOVABLE 0x00000008 ++#define DISK_MANAGED 0x00000010 ++#define DISK_FLUSHONLY 0x00000020 ++ ++struct sysfs { ++ struct udev *udev; ++ struct udev_enumerate *num; ++ struct udev_list_entry *item; ++ char *devnode; ++ size_t size; ++}; ++ ++static int flush_cache_ext(const struct sysfs *sysfs); ++ ++static struct sysfs * open_sysfs(void) ++{ ++ static struct sysfs sysfs; ++ sysfs.udev = udev_new(); ++ if (!sysfs.udev) ++ goto err; ++ sysfs.num = udev_enumerate_new(sysfs.udev); ++ if (!sysfs.num) ++ goto err; ++ if (udev_enumerate_add_match_subsystem(sysfs.num, "block") < 0) ++ goto err; ++ if (udev_enumerate_add_match_sysname(sysfs.num, "sd?") < 0) ++ goto err; ++ if (udev_enumerate_add_match_sysname(sysfs.num, "hd?") < 0) ++ goto err; ++ if (udev_enumerate_scan_devices(sysfs.num) < 0) ++ goto err; ++ sysfs.item = udev_enumerate_get_list_entry(sysfs.num); ++ sysfs.devnode = NULL; ++ sysfs.size = 0; ++ return &sysfs; ++err: ++ if (sysfs.num) ++ udev_unref(sysfs.udev); ++ if (sysfs.udev) ++ udev_unref(sysfs.udev); ++ return NULL; ++} ++ ++static void close_sysfs(struct sysfs *sysfs) ++{ ++ if (sysfs->num) ++ udev_enumerate_unref(sysfs->num); ++ if (sysfs->udev) ++ udev_unref(sysfs->udev); ++ if (sysfs->devnode) ++ free(sysfs->devnode); ++ sysfs->devnode = NULL; ++} ++ ++ ++static char *list_disks(struct sysfs *sysfs, unsigned int* flags) ++{ ++ struct udev_device *device, *parent; ++ struct udev_list_entry *item; ++ const char *devnode; ++ char path[PATH_MAX]; ++ ++ device = NULL; ++next: ++ if (device) ++ udev_device_unref(device); ++ if (sysfs->devnode) ++ free(sysfs->devnode); ++ sysfs->devnode = NULL; ++ sysfs->size = 0; ++ *flags = 0; ++ ++ if (!sysfs->item) ++ goto empty; ++ item = sysfs->item; ++ sysfs->item = udev_list_entry_get_next(sysfs->item); ++ ++ if (!(device = udev_device_new_from_syspath(sysfs->udev, udev_list_entry_get_name(item)))) ++ goto out; ++ if (!(devnode = udev_device_get_devnode(device))) ++ goto out; ++ if (!(sysfs->devnode = strdup(devnode))) ++ goto out; ++ ++ path[0] = '\0'; ++ parent = udev_device_get_parent(device); ++ if (parent) { ++ const char *sysname, *devpath; ++ struct udev_device *disk; ++ const char *value; ++ int ret; ++ ++ sysname = udev_device_get_sysname(parent); ++ devpath = udev_device_get_devpath(parent); ++ ++ strcpy(path, "/sys"); ++ strcat(path, devpath); ++ strcat(path, "/scsi_disk/"); ++ strcat(path, sysname); ++ ++ disk = udev_device_new_from_syspath(sysfs->udev, path); ++ if (disk) { ++ value = udev_device_get_sysattr_value(disk, "manage_start_stop"); ++ udev_device_unref(disk); ++ ++ if (value && *value != '0') { ++ *flags = DISK_MANAGED; ++#ifndef LIST_DEBUG ++ goto next; /* Device managed by the kernel */ ++#endif ++ } ++ } ++ ++ value = udev_device_get_sysattr_value(device, "size"); ++ if (value && *value) ++ sysfs->size = (size_t)atoll(value); ++ ++ value = udev_device_get_sysattr_value(device, "removable"); ++ if (value && *value != '0') { ++ *flags |= DISK_REMOVABLE; ++ ++ if ((ret = flush_cache_ext(sysfs))) { ++ if (ret < 0) ++ goto next; ++ *flags |= DISK_EXTFLUSH; ++ } ++ goto out; /* Removable disk like USB stick */ ++ } ++ ++ value = udev_device_get_sysname(device); ++ if (value && *value == 'h') { ++ *flags |= DISK_IS_IDE; ++ ++ if ((ret = flush_cache_ext(sysfs))) { ++ if (ret < 0) ++ goto next; ++ *flags |= DISK_EXTFLUSH; ++ } ++ goto out; /* IDE disk found */ ++ } ++ ++ value = udev_device_get_sysattr_value(parent, "vendor"); ++ if (value && strncmp(value, "ATA", 3) == 0) { ++ *flags |= (DISK_IS_IDE|DISK_IS_SATA); ++ ++ if ((ret = flush_cache_ext(sysfs))) { ++ if (ret < 0) ++ goto next; ++ *flags |= DISK_EXTFLUSH; ++ } ++ goto out; /* SATA disk to shutdown */ ++ } ++ goto next; ++ } ++out: ++ udev_device_unref(device); ++empty: ++ return sysfs->devnode; ++} ++#ifndef LIST_DEBUG ++/* ++ * Check IDE/(S)ATA hard disk identity for ++ * the FLUSH CACHE EXT bit set. ++ */ ++static int flush_cache_ext(const struct sysfs *sysfs) ++{ ++#ifndef WIN_IDENTIFY ++#define WIN_IDENTIFY 0xEC ++#endif ++ unsigned char args[4+IDBYTES]; ++ unsigned short *id = (unsigned short*)(&args[4]); ++ int fd = -1, ret = 0; ++ ++ if (sysfs->size < (1<<28)) ++ goto out; /* small disk */ ++ ++ if ((fd = open(sysfs->devnode, O_RDONLY|O_NONBLOCK|O_CLOEXEC)) < 0) ++ goto out; ++ ++ memset(&args[0], 0, sizeof(args)); ++ args[0] = WIN_IDENTIFY; ++ args[3] = 1; ++ if (ioctl(fd, HDIO_DRIVE_CMD, &args)) ++ goto out; ++#ifdef WORDS_BIGENDIAN ++# if 0 ++ { ++ const unsigned short *end = id + IDBYTES/2; ++ const unsigned short *from = id; ++ unsigned short *to = id; ++ ++ while (from < end) ++ *to++ = bswap_16(*from++); ++ } ++# else ++ id[83] = bswap_16(id[83]); ++# endif ++#endif ++ if ((id[83] & MASK_EXT) == TEST_EXT) ++ ret = 1; ++out: ++ if (fd >= 0) ++ close(fd); ++ return ret; ++} ++ ++/* ++ * Put an IDE/SCSI/SATA disk in standby mode. ++ * Code stolen from hdparm.c ++ */ ++static int do_standby_disk(struct sysfs *sysfs, unsigned int flags) ++{ ++#ifndef WIN_STANDBYNOW1 ++#define WIN_STANDBYNOW1 0xE0 ++#endif ++#ifndef WIN_STANDBYNOW2 ++#define WIN_STANDBYNOW2 0x94 ++#endif ++#ifndef WIN_FLUSH_CACHE_EXT ++#define WIN_FLUSH_CACHE_EXT 0xEA ++#endif ++#ifndef WIN_FLUSH_CACHE ++#define WIN_FLUSH_CACHE 0xE7 ++#endif ++ unsigned char flush1[4] = {WIN_FLUSH_CACHE_EXT,0,0,0}; ++ unsigned char flush2[4] = {WIN_FLUSH_CACHE,0,0,0}; ++ unsigned char stdby1[4] = {WIN_STANDBYNOW1,0,0,0}; ++ unsigned char stdby2[4] = {WIN_STANDBYNOW2,0,0,0}; ++ int fd, ret; ++ ++ if ((fd = open(sysfs->devnode, O_RDWR|O_NONBLOCK|O_CLOEXEC)) < 0) ++ return -1; ++ ++ switch (flags & DISK_EXTFLUSH) { ++ case DISK_EXTFLUSH: ++ if ((ret = ioctl(fd, HDIO_DRIVE_CMD, &flush1)) == 0) ++ break; ++ /* Extend flush rejected, try standard flush */ ++ default: ++ ret = ioctl(fd, HDIO_DRIVE_CMD, &flush2) && ++ ioctl(fd, BLKFLSBUF); ++ break; ++ } ++ ++ if ((flags & DISK_FLUSHONLY) == 0x0) { ++ ret = ioctl(fd, HDIO_DRIVE_CMD, &stdby1) && ++ ioctl(fd, HDIO_DRIVE_CMD, &stdby2); ++ } ++ ++ close(fd); ++ ++ if (ret) ++ return -1; ++ return 0; ++} ++#endif ++#ifdef LIST_DEBUG ++int main() ++{ ++ char *disk; ++ unsigned int flags; ++ struct sysfs *sysfs = open_sysfs(); ++ if (!sysfs) ++ goto err; ++ while ((disk = list_disks(sysfs, &flags))) ++ fprintf(stdout, "%s\n", sysfs->devnode); ++ close_sysfs(sysfs); ++err: ++ return 0; ++} ++#else ++/* ++ * List all disks and put them in standby mode. ++ * This has the side-effect of flushing the writecache, ++ * which is exactly what we want on poweroff. ++ */ ++void hddown(void) ++{ ++ struct sysfs *sysfs; ++ unsigned int flags; ++ char *disk; ++ ++ if (!(sysfs = open_sysfs())) ++ return; ++ ++ while ((disk = list_disks(sysfs, &flags))) ++ do_standby_disk(sysfs, flags); ++ ++ close_sysfs(sysfs); ++} ++ ++/* ++ * List all disks and cause them to flush their buffers. ++ */ ++void hdflush(void) ++{ ++ struct sysfs *sysfs; ++ unsigned int flags; ++ char *disk; ++ ++ if (!(sysfs = open_sysfs())) ++ return; ++ ++ while ((disk = list_disks(sysfs, &flags))) ++ do_standby_disk(sysfs, (flags|DISK_FLUSHONLY)); ++ ++ close_sysfs(sysfs); ++} ++#endif +--- systemd-208/src/shared/hdflush.h ++++ systemd-208/src/shared/hdflush.h 2014-01-28 11:00:08.286235696 +0000 +@@ -0,0 +1,25 @@ ++/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ ++ ++#pragma once ++ ++/*** ++ This file is part of systemd. ++ ++ Copyright 2014 Werner Fink ++ ++ systemd is free software; you can redistribute it and/or modify it ++ under the terms of the GNU Lesser General Public License as published by ++ the Free Software Foundation; either version 2.1 of the License, or ++ (at your option) any later version. ++ ++ systemd is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public License ++ along with systemd; If not, see . ++***/ ++ ++void hdflush(void); ++void hddown(void); +--- systemd-208/src/core/shutdown.c ++++ systemd-208/src/core/shutdown.c 2014-01-28 11:14:15.722235591 +0000 +@@ -40,6 +40,7 @@ + #include "missing.h" + #include "log.h" + #include "fileio.h" ++#include "hdflush.h" + #include "umount.h" + #include "util.h" + #include "mkdir.h" +@@ -302,8 +303,13 @@ int main(int argc, char *argv[]) { + * on reboot(), but the file systems need to be synce'd + * explicitly in advance. So let's do this here, but not + * needlessly slow down containers. */ +- if (!in_container) ++ if (!in_container) { + sync(); ++ if (cmd == RB_POWER_OFF || cmd == RB_HALT_SYSTEM) ++ hddown(); ++ else ++ hdflush(); ++ } + + if (cmd == LINUX_REBOOT_CMD_KEXEC) { + +--- systemd-208/src/systemctl/systemctl.c ++++ systemd-208/src/systemctl/systemctl.c 2014-01-28 11:31:27.150735613 +0000 +@@ -87,6 +87,7 @@ static bool arg_no_pager = false; + static bool arg_no_wtmp = false; + static bool arg_no_wall = false; + static bool arg_no_reload = false; ++static bool arg_no_sync = false; + static bool arg_show_types = false; + static bool arg_ignore_inhibitors = false; + static bool arg_dry = false; +@@ -5272,6 +5273,7 @@ static int halt_parse_argv(int argc, cha + { "reboot", no_argument, NULL, ARG_REBOOT }, + { "force", no_argument, NULL, 'f' }, + { "wtmp-only", no_argument, NULL, 'w' }, ++ { "no-sync", no_argument, NULL, 'n' }, + { "no-wtmp", no_argument, NULL, 'd' }, + { "no-wall", no_argument, NULL, ARG_NO_WALL }, + { NULL, 0, NULL, 0 } +@@ -5324,10 +5326,13 @@ static int halt_parse_argv(int argc, cha + + case 'i': + case 'h': +- case 'n': + /* Compatibility nops */ + break; + ++ case 'n': ++ arg_no_sync = true; ++ break; ++ + case '?': + return -EINVAL; + +@@ -5981,14 +5986,14 @@ static int halt_now(enum action a) { + + switch (a) { + +- case ACTION_HALT: +- log_info("Halting."); +- reboot(RB_HALT_SYSTEM); +- return -errno; +- + case ACTION_POWEROFF: + log_info("Powering off."); + reboot(RB_POWER_OFF); ++ /* Fall through */ ++ ++ case ACTION_HALT: ++ log_info("Halting."); ++ reboot(RB_HALT_SYSTEM); + return -errno; + + case ACTION_REBOOT: diff --git a/0001-core-introduce-new-KillMode-mixed-which-sends-SIGTER.patch b/0001-core-introduce-new-KillMode-mixed-which-sends-SIGTER.patch new file mode 100644 index 00000000..37291988 --- /dev/null +++ b/0001-core-introduce-new-KillMode-mixed-which-sends-SIGTER.patch @@ -0,0 +1,225 @@ +From 6fa7e1a944a2dbb89e794ad0f9da5d0fda5dc4a9 Mon Sep 17 00:00:00 2001 +From: Lennart Poettering +Date: Wed, 29 Jan 2014 13:38:55 +0100 +Subject: [PATCH 1/3] core: introduce new KillMode=mixed which sends SIGTERM + only to the main process, but SIGKILL to all daemon processes + +This should fix some race with terminating systemd --user, where the +system systemd instance might race against the user systemd instance +when sending SIGTERM. +--- + man/systemd.kill.xml | 77 +++++++++++++++++++++++++++++++++----------------- + src/core/kill.c | 1 + + src/core/kill.h | 1 + + src/core/unit.c | 3 +- + units/user@.service.in | 1 + + 5 files changed, 56 insertions(+), 27 deletions(-) + +diff --git a/man/systemd.kill.xml b/man/systemd.kill.xml +index 1b10fba..a4009aa 100644 +--- a/man/systemd.kill.xml ++++ b/man/systemd.kill.xml +@@ -44,39 +44,44 @@ + + + systemd.kill +- Kill environment configuration ++ Process killing procedure ++ configuration + + + + service.service, + socket.socket, + mount.mount, +- swap.swap ++ swap.swap, ++ scope.scope + + + + Description + + Unit configuration files for services, sockets, +- mount points and swap devices share a subset of +- configuration options which define the process killing +- parameters of spawned processes. ++ mount points, swap devices and scopes share a subset ++ of configuration options which define the ++ killing procedure of processes belonging to the unit. + + This man page lists the configuration options +- shared by these four unit types. See ++ shared by these five unit types. See + systemd.unit5 +- for the common options of all unit configuration +- files, and ++ for the common options shared by all unit ++ configuration files, and + systemd.service5, + systemd.socket5, +- systemd.swap5 +- and ++ systemd.swap5, + systemd.mount5 +- for more information on the specific unit +- configuration files. The execution specific ++ and ++ systemd.scope5 ++ for more information on the configuration file options ++ specific to each unit type. ++ ++ The kill procedure + configuration options are configured in the [Service], +- [Socket], [Mount], or [Swap] section, depending on the unit +- type. ++ [Socket], [Mount] or [Swap] section, depending on the ++ unit type. + + + +@@ -87,32 +92,40 @@ + + KillMode= + Specifies how +- processes of this service shall be ++ processes of this unit shall be + killed. One of + , + , ++ , + . + + If set to + , all + remaining processes in the control +- group of this unit will be terminated +- on unit stop (for services: after the ++ group of this unit will be killed on ++ unit stop (for services: after the + stop command is executed, as + configured with + ExecStop=). If set + to , only the + main process itself is killed. If set +- to , no process is ++ to the ++ SIGTERM signal ++ (see below) is sent to the main ++ process while the subsequent ++ SIGKILL signal ++ (see below) is sent to all remaining ++ processes of the unit's control ++ group. If set to ++ , no process is + killed. In this case only the stop +- command will be executed on unit +- stop, but no process be killed ++ command will be executed on unit stop, ++ but no process be killed + otherwise. Processes remaining alive + after stop are left in their control + group and the control group continues + to exist after stop unless it is +- empty. Defaults to +- . ++ empty. + + Processes will first be + terminated via +@@ -133,14 +146,24 @@ + option). See + kill2 + for more +- information. ++ information. ++ ++ Defaults to ++ . + + + + KillSignal= + Specifies which signal +- to use when killing a +- service. Defaults to SIGTERM. ++ to use when killing a service. This ++ controls the signal that is sent as ++ first step of shutting down a unit ++ (see above), and is usually followed ++ by SIGKILL (see ++ above and below). For a list of valid ++ signals, see ++ signal7. Defaults ++ to SIGTERM. + + + +@@ -184,7 +207,9 @@ + systemd.swap5, + systemd.mount5, + systemd.exec5, +- systemd.directives7 ++ systemd.directives7, ++ kill2, ++ signal7 + + + +diff --git a/src/core/kill.c b/src/core/kill.c +index ea947c2..4271346 100644 +--- a/src/core/kill.c ++++ b/src/core/kill.c +@@ -52,6 +52,7 @@ void kill_context_dump(KillContext *c, FILE *f, const char *prefix) { + static const char* const kill_mode_table[_KILL_MODE_MAX] = { + [KILL_CONTROL_GROUP] = "control-group", + [KILL_PROCESS] = "process", ++ [KILL_MIXED] = "mixed", + [KILL_NONE] = "none" + }; + +diff --git a/src/core/kill.h b/src/core/kill.h +index 41773f0..d5f125f 100644 +--- a/src/core/kill.h ++++ b/src/core/kill.h +@@ -32,6 +32,7 @@ typedef enum KillMode { + /* The kill mode is a property of a unit. */ + KILL_CONTROL_GROUP = 0, + KILL_PROCESS, ++ KILL_MIXED, + KILL_NONE, + _KILL_MODE_MAX, + _KILL_MODE_INVALID = -1 +diff --git a/src/core/unit.c b/src/core/unit.c +index 4b97710..0b10e57 100644 +--- a/src/core/unit.c ++++ b/src/core/unit.c +@@ -3007,7 +3007,7 @@ int unit_kill_context( + } + } + +- if (c->kill_mode == KILL_CONTROL_GROUP && u->cgroup_path) { ++ if ((c->kill_mode == KILL_CONTROL_GROUP || (c->kill_mode == KILL_MIXED && sigkill)) && u->cgroup_path) { + _cleanup_set_free_ Set *pid_set = NULL; + + /* Exclude the main/control pids from being killed via the cgroup */ +@@ -3021,6 +3021,7 @@ int unit_kill_context( + log_warning_unit(u->id, "Failed to kill control group: %s", strerror(-r)); + } else if (r > 0) { + wait_for_exit = true; ++ + if (c->send_sighup) { + set_free(pid_set); + +diff --git a/units/user@.service.in b/units/user@.service.in +index 3718a57..3bb8696 100644 +--- a/units/user@.service.in ++++ b/units/user@.service.in +@@ -17,3 +17,4 @@ Environment=SHELL=%s + ExecStart=-@rootlibexecdir@/systemd --user + Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%I/dbus/user_bus_socket + Slice=user-%i.slice ++KillMode=mixed +-- +1.8.4 + diff --git a/0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch b/0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch new file mode 100644 index 00000000..40479ead --- /dev/null +++ b/0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch @@ -0,0 +1,329 @@ +From d420282b28f50720e233ccb1c02547c562195653 Mon Sep 17 00:00:00 2001 +From: Lennart Poettering +Date: Tue, 26 Nov 2013 01:39:53 +0100 +Subject: [PATCH] core: replace OnFailureIsolate= setting by a more generic + OnFailureJobMode= setting and make use of it where applicable + +--- + man/systemd.unit.xml | 40 +++++++++++++++++++++++++---------- + src/core/dbus-unit.c | 3 ++- + src/core/job.h | 3 +-- + src/core/load-fragment-gperf.gperf.m4 | 3 ++- + src/core/load-fragment.c | 31 +++++++++++++++++++++++++++ + src/core/load-fragment.h | 2 ++ + src/core/unit.c | 11 +++++----- + src/core/unit.h | 4 ++-- + units/initrd-cleanup.service.in | 1 + + units/initrd-fs.target | 2 +- + units/initrd-parse-etc.service.in | 1 + + units/initrd-root-fs.target | 2 +- + units/initrd-switch-root.service.in | 1 + + units/initrd.target | 2 +- + units/local-fs.target | 2 +- + 15 files changed, 82 insertions(+), 26 deletions(-) + +Index: systemd-208/man/systemd.unit.xml +=================================================================== +--- systemd-208.orig/man/systemd.unit.xml ++++ systemd-208/man/systemd.unit.xml +@@ -669,19 +669,37 @@ + + + +- OnFailureIsolate= ++ OnFailureJobMode= + +- Takes a boolean +- argument. If , the +- unit listed in ++ Takes a value of ++ fail, ++ replace, ++ replace-irreversibly ++ or ++ isolate. Defaults ++ to ++ replace. Specifies ++ how the units listed in + OnFailure= will be +- enqueued in isolation mode, i.e. all +- units that are not its dependency will +- be stopped. If this is set, only a ++ enqueued. If set to ++ fail and ++ contradicting jobs are already queued, ++ cause the activation to fail. If set ++ to replace and ++ contradicting jobs area already ++ queued, replace ++ those. replace-irreversibly ++ is similar to ++ replace, however, ++ creates jobs that cannot be reversed ++ unless they finished or are explicitly ++ canceled. isolate ++ may be used to terminate all other ++ units but the specified one. If ++ this is set to ++ isolate, only a + single unit may be listed in +- OnFailure=. Defaults +- to +- . ++ OnFailure=.. + + + +Index: systemd-208/src/core/dbus-unit.c +=================================================================== +--- systemd-208.orig/src/core/dbus-unit.c ++++ systemd-208/src/core/dbus-unit.c +@@ -133,6 +133,7 @@ static int bus_unit_append_description(D + } + + static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_unit_append_load_state, unit_load_state, UnitLoadState); ++static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_unit_append_job_mode, job_mode, JobMode); + + static int bus_unit_append_active_state(DBusMessageIter *i, const char *property, void *data) { + Unit *u = data; +@@ -1079,7 +1080,7 @@ const BusProperty bus_unit_properties[] + { "RefuseManualStop", bus_property_append_bool, "b", offsetof(Unit, refuse_manual_stop) }, + { "AllowIsolate", bus_property_append_bool, "b", offsetof(Unit, allow_isolate) }, + { "DefaultDependencies", bus_property_append_bool, "b", offsetof(Unit, default_dependencies) }, +- { "OnFailureIsolate", bus_property_append_bool, "b", offsetof(Unit, on_failure_isolate) }, ++ { "OnFailureJobMode", bus_unit_append_job_mode, "s", offsetof(Unit, on_failure_job_mode) }, + { "IgnoreOnIsolate", bus_property_append_bool, "b", offsetof(Unit, ignore_on_isolate) }, + { "IgnoreOnSnapshot", bus_property_append_bool, "b", offsetof(Unit, ignore_on_snapshot) }, + { "NeedDaemonReload", bus_unit_append_need_daemon_reload, "b", 0 }, +Index: systemd-208/src/core/job.h +=================================================================== +--- systemd-208.orig/src/core/job.h ++++ systemd-208/src/core/job.h +@@ -83,7 +83,7 @@ enum JobState { + enum JobMode { + JOB_FAIL, /* Fail if a conflicting job is already queued */ + JOB_REPLACE, /* Replace an existing conflicting job */ +- JOB_REPLACE_IRREVERSIBLY, /* Like JOB_REPLACE + produce irreversible jobs */ ++ JOB_REPLACE_IRREVERSIBLY,/* Like JOB_REPLACE + produce irreversible jobs */ + JOB_ISOLATE, /* Start a unit, and stop all others */ + JOB_IGNORE_DEPENDENCIES, /* Ignore both requirement and ordering dependencies */ + JOB_IGNORE_REQUIREMENTS, /* Ignore requirement dependencies */ +Index: systemd-208/src/core/load-fragment-gperf.gperf.m4 +=================================================================== +--- systemd-208.orig/src/core/load-fragment-gperf.gperf.m4 ++++ systemd-208/src/core/load-fragment-gperf.gperf.m4 +@@ -122,7 +122,8 @@ Unit.RefuseManualStart, config_ + Unit.RefuseManualStop, config_parse_bool, 0, offsetof(Unit, refuse_manual_stop) + Unit.AllowIsolate, config_parse_bool, 0, offsetof(Unit, allow_isolate) + Unit.DefaultDependencies, config_parse_bool, 0, offsetof(Unit, default_dependencies) +-Unit.OnFailureIsolate, config_parse_bool, 0, offsetof(Unit, on_failure_isolate) ++Unit.OnFailureJobMode, config_parse_job_mode, 0, offsetof(Unit, on_failure_job_mode) ++Unit.OnFailureIsolate, config_parse_job_mode_isolate, 0, offsetof(Unit, on_failure_job_mode) + Unit.IgnoreOnIsolate, config_parse_bool, 0, offsetof(Unit, ignore_on_isolate) + Unit.IgnoreOnSnapshot, config_parse_bool, 0, offsetof(Unit, ignore_on_snapshot) + Unit.JobTimeoutSec, config_parse_sec, 0, offsetof(Unit, job_timeout) +Index: systemd-208/src/core/load-fragment.c +=================================================================== +--- systemd-208.orig/src/core/load-fragment.c ++++ systemd-208/src/core/load-fragment.c +@@ -2314,6 +2314,36 @@ int config_parse_blockio_bandwidth( + return 0; + } + ++DEFINE_CONFIG_PARSE_ENUM(config_parse_job_mode, job_mode, JobMode, "Failed to parse job mode"); ++ ++int config_parse_job_mode_isolate( ++ const char *unit, ++ const char *filename, ++ unsigned line, ++ const char *section, ++ const char *lvalue, ++ int ltype, ++ const char *rvalue, ++ void *data, ++ void *userdata) { ++ ++ JobMode *m = data; ++ int r; ++ ++ assert(filename); ++ assert(lvalue); ++ assert(rvalue); ++ ++ r = parse_boolean(rvalue); ++ if (r < 0) { ++ log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Failed to parse boolean, ignoring: %s", rvalue); ++ return 0; ++ } ++ ++ *m = r ? JOB_ISOLATE : JOB_REPLACE; ++ return 0; ++} ++ + #define FOLLOW_MAX 8 + + static int open_follow(char **filename, FILE **_f, Set *names, char **_final) { +Index: systemd-208/src/core/load-fragment.h +=================================================================== +--- systemd-208.orig/src/core/load-fragment.h ++++ systemd-208/src/core/load-fragment.h +@@ -83,6 +83,8 @@ int config_parse_device_allow(const char + int config_parse_blockio_weight(const char *unit, const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); + int config_parse_blockio_device_weight(const char *unit, const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); + int config_parse_blockio_bandwidth(const char *unit, const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); ++int config_parse_job_mode(const char *unit, const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); ++int config_parse_job_mode_isolate(const char *unit, const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); + + /* gperf prototypes */ + const struct ConfigPerfItem* load_fragment_gperf_lookup(const char *key, unsigned length); +Index: systemd-208/src/core/unit.c +=================================================================== +--- systemd-208.orig/src/core/unit.c ++++ systemd-208/src/core/unit.c +@@ -85,6 +85,7 @@ Unit *unit_new(Manager *m, size_t size) + u->deserialized_job = _JOB_TYPE_INVALID; + u->default_dependencies = true; + u->unit_file_state = _UNIT_FILE_STATE_INVALID; ++ u->on_failure_job_mode = JOB_REPLACE; + + return u; + } +@@ -807,14 +808,14 @@ void unit_dump(Unit *u, FILE *f, const c + "%s\tRefuseManualStart: %s\n" + "%s\tRefuseManualStop: %s\n" + "%s\tDefaultDependencies: %s\n" +- "%s\tOnFailureIsolate: %s\n" ++ "%s\tOnFailureJobMode: %s\n" + "%s\tIgnoreOnIsolate: %s\n" + "%s\tIgnoreOnSnapshot: %s\n", + prefix, yes_no(u->stop_when_unneeded), + prefix, yes_no(u->refuse_manual_start), + prefix, yes_no(u->refuse_manual_stop), + prefix, yes_no(u->default_dependencies), +- prefix, yes_no(u->on_failure_isolate), ++ prefix, job_mode_to_string(u->on_failure_job_mode), + prefix, yes_no(u->ignore_on_isolate), + prefix, yes_no(u->ignore_on_snapshot)); + +@@ -985,11 +986,11 @@ int unit_load(Unit *u) { + if (r < 0) + goto fail; + +- if (u->on_failure_isolate && ++ if (u->on_failure_job_mode == JOB_ISOLATE && + set_size(u->dependencies[UNIT_ON_FAILURE]) > 1) { + + log_error_unit(u->id, +- "More than one OnFailure= dependencies specified for %s but OnFailureIsolate= enabled. Refusing.", u->id); ++ "More than one OnFailure= dependencies specified for %s but OnFailureJobMode=isolate set. Refusing.", u->id); + + r = -EINVAL; + goto fail; +@@ -1394,7 +1395,7 @@ void unit_start_on_failure(Unit *u) { + SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) { + int r; + +- r = manager_add_job(u->manager, JOB_START, other, u->on_failure_isolate ? JOB_ISOLATE : JOB_REPLACE, true, NULL, NULL); ++ r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, true, NULL, NULL); + if (r < 0) + log_error_unit(u->id, "Failed to enqueue OnFailure= job: %s", strerror(-r)); + } +Index: systemd-208/src/core/unit.h +=================================================================== +--- systemd-208.orig/src/core/unit.h ++++ systemd-208/src/core/unit.h +@@ -228,8 +228,8 @@ struct Unit { + /* Allow isolation requests */ + bool allow_isolate; + +- /* Isolate OnFailure unit */ +- bool on_failure_isolate; ++ /* How to start OnFailure units */ ++ JobMode on_failure_job_mode; + + /* Ignore this unit when isolating */ + bool ignore_on_isolate; +Index: systemd-208/units/initrd-cleanup.service.in +=================================================================== +--- systemd-208.orig/units/initrd-cleanup.service.in ++++ systemd-208/units/initrd-cleanup.service.in +@@ -10,6 +10,7 @@ Description=Cleaning Up and Shutting Dow + DefaultDependencies=no + ConditionPathExists=/etc/initrd-release + OnFailure=emergency.target ++OnFailureJobMode=replace-irreversibly + After=initrd-root-fs.target initrd-fs.target initrd.target + + [Service] +Index: systemd-208/units/initrd-fs.target +=================================================================== +--- systemd-208.orig/units/initrd-fs.target ++++ systemd-208/units/initrd-fs.target +@@ -9,7 +9,7 @@ + Description=Initrd File Systems + Documentation=man:systemd.special(7) + OnFailure=emergency.target +-OnFailureIsolate=yes ++OnFailureJobMode=replace-irreversibly + ConditionPathExists=/etc/initrd-release + After=initrd-parse-etc.service + DefaultDependencies=no +Index: systemd-208/units/initrd-parse-etc.service.in +=================================================================== +--- systemd-208.orig/units/initrd-parse-etc.service.in ++++ systemd-208/units/initrd-parse-etc.service.in +@@ -11,6 +11,7 @@ DefaultDependencies=no + Requires=initrd-root-fs.target + After=initrd-root-fs.target + OnFailure=emergency.target ++OnFailureJobMode=replace-irreversibly + ConditionPathExists=/etc/initrd-release + + [Service] +Index: systemd-208/units/initrd-root-fs.target +=================================================================== +--- systemd-208.orig/units/initrd-root-fs.target ++++ systemd-208/units/initrd-root-fs.target +@@ -10,6 +10,6 @@ Description=Initrd Root File System + Documentation=man:systemd.special(7) + ConditionPathExists=/etc/initrd-release + OnFailure=emergency.target +-OnFailureIsolate=yes ++OnFailureJobMode=replace-irreversibly + DefaultDependencies=no + Conflicts=shutdown.target +Index: systemd-208/units/initrd-switch-root.service.in +=================================================================== +--- systemd-208.orig/units/initrd-switch-root.service.in ++++ systemd-208/units/initrd-switch-root.service.in +@@ -10,6 +10,7 @@ Description=Switch Root + DefaultDependencies=no + ConditionPathExists=/etc/initrd-release + OnFailure=emergency.target ++OnFailureJobMode=replace-irreversibly + AllowIsolate=yes + + [Service] +Index: systemd-208/units/initrd.target +=================================================================== +--- systemd-208.orig/units/initrd.target ++++ systemd-208/units/initrd.target +@@ -9,7 +9,7 @@ + Description=Initrd Default Target + Documentation=man:systemd.special(7) + OnFailure=emergency.target +-OnFailureIsolate=yes ++OnFailureJobMode=replace-irreversibly + ConditionPathExists=/etc/initrd-release + Requires=basic.target + Wants=initrd-root-fs.target initrd-fs.target initrd-parse-etc.service +Index: systemd-208/units/local-fs.target +=================================================================== +--- systemd-208.orig/units/local-fs.target ++++ systemd-208/units/local-fs.target +@@ -12,4 +12,4 @@ After=local-fs-pre.target + DefaultDependencies=no + Conflicts=shutdown.target + OnFailure=emergency.target +-OnFailureIsolate=no ++OnFailureJobMode=replace-irreversibly diff --git a/0001-upstream-systemctl-halt-reboot-error-handling.patch b/0001-upstream-systemctl-halt-reboot-error-handling.patch new file mode 100644 index 00000000..110b866b --- /dev/null +++ b/0001-upstream-systemctl-halt-reboot-error-handling.patch @@ -0,0 +1,85 @@ +--- systemd-208/src/core/shutdown.c ++++ systemd-208/src/core/shutdown.c 2014-01-27 11:31:38.486235816 +0000 +@@ -329,6 +329,9 @@ int main(int argc, char *argv[]) { + + reboot(cmd); + ++ if (cmd == RB_POWER_OFF) ++ reboot(RB_HALT_SYSTEM); ++ + if (errno == EPERM && in_container) { + /* If we are in a container, and we lacked + * CAP_SYS_BOOT just exit, this will kill our + +--- systemd-208/src/systemctl/systemctl.c ++++ systemd-208/src/systemctl/systemctl.c 2014-01-27 11:05:18.298236035 +0000 +@@ -138,7 +138,7 @@ static bool arg_plain = false; + static bool private_bus = false; + + static int daemon_reload(DBusConnection *bus, char **args); +-static void halt_now(enum action a); ++static int halt_now(enum action a); + + static void pager_open_if_enabled(void) { + +@@ -2227,7 +2227,7 @@ static int start_special(DBusConnection + (a == ACTION_HALT || + a == ACTION_POWEROFF || + a == ACTION_REBOOT)) +- halt_now(a); ++ return halt_now(a); + + if (arg_force >= 1 && + (a == ACTION_HALT || +@@ -5973,7 +5973,7 @@ done: + return 0; + } + +-static _noreturn_ void halt_now(enum action a) { ++static int halt_now(enum action a) { + + /* Make sure C-A-D is handled by the kernel from this + * point on... */ +@@ -5984,23 +5984,22 @@ static _noreturn_ void halt_now(enum act + case ACTION_HALT: + log_info("Halting."); + reboot(RB_HALT_SYSTEM); +- break; ++ return -errno; + + case ACTION_POWEROFF: + log_info("Powering off."); + reboot(RB_POWER_OFF); +- break; ++ return -errno; + + case ACTION_REBOOT: + log_info("Rebooting."); + reboot(RB_AUTOBOOT); +- break; ++ return -errno; + + default: +- assert_not_reached("Unknown halt action."); ++ assert_not_reached("Unknown action."); ++ return -ENOSYS; + } +- +- assert_not_reached("Uh? This shouldn't happen."); + } + + static int halt_main(DBusConnection *bus) { +@@ -6069,9 +6068,10 @@ static int halt_main(DBusConnection *bus + if (arg_dry) + return 0; + +- halt_now(arg_action); +- /* We should never reach this. */ +- return -ENOSYS; ++ r = halt_now(arg_action); ++ log_error("Failed to reboot: %s", strerror(-r)); ++ ++ return r; + } + + static int runlevel_main(void) { diff --git a/0002-service-allow-KillMode-mixed-in-conjunction-with-PAM.patch b/0002-service-allow-KillMode-mixed-in-conjunction-with-PAM.patch new file mode 100644 index 00000000..76624f92 --- /dev/null +++ b/0002-service-allow-KillMode-mixed-in-conjunction-with-PAM.patch @@ -0,0 +1,62 @@ +From 95d57e7b631a2d78b9b5d841125194052895470f Mon Sep 17 00:00:00 2001 +From: Lennart Poettering +Date: Wed, 29 Jan 2014 13:49:54 +0100 +Subject: [PATCH 2/3] service: allow KillMode=mixed in conjunction with + PAMName= + +--- + src/core/service.c | 20 +++++++------------- + 1 file changed, 7 insertions(+), 13 deletions(-) + +diff --git a/src/core/service.c b/src/core/service.c +index 6792024..e7f03e1 100644 +--- a/src/core/service.c ++++ b/src/core/service.c +@@ -1105,37 +1105,31 @@ static int service_verify(Service *s) { + return 0; + + if (!s->exec_command[SERVICE_EXEC_START]) { +- log_error_unit(UNIT(s)->id, +- "%s lacks ExecStart setting. Refusing.", UNIT(s)->id); ++ log_error_unit(UNIT(s)->id, "%s lacks ExecStart setting. Refusing.", UNIT(s)->id); + return -EINVAL; + } + + if (s->type != SERVICE_ONESHOT && + s->exec_command[SERVICE_EXEC_START]->command_next) { +- log_error_unit(UNIT(s)->id, +- "%s has more than one ExecStart setting, which is only allowed for Type=oneshot services. Refusing.", UNIT(s)->id); ++ log_error_unit(UNIT(s)->id, "%s has more than one ExecStart setting, which is only allowed for Type=oneshot services. Refusing.", UNIT(s)->id); + return -EINVAL; + } + + if (s->type == SERVICE_ONESHOT && s->restart != SERVICE_RESTART_NO) { +- log_error_unit(UNIT(s)->id, +- "%s has Restart setting other than no, which isn't allowed for Type=oneshot services. Refusing.", UNIT(s)->id); ++ log_error_unit(UNIT(s)->id, "%s has Restart setting other than no, which isn't allowed for Type=oneshot services. Refusing.", UNIT(s)->id); + return -EINVAL; + } + + if (s->type == SERVICE_DBUS && !s->bus_name) { +- log_error_unit(UNIT(s)->id, +- "%s is of type D-Bus but no D-Bus service name has been specified. Refusing.", UNIT(s)->id); ++ log_error_unit(UNIT(s)->id, "%s is of type D-Bus but no D-Bus service name has been specified. Refusing.", UNIT(s)->id); + return -EINVAL; + } + + if (s->bus_name && s->type != SERVICE_DBUS) +- log_warning_unit(UNIT(s)->id, +- "%s has a D-Bus service name specified, but is not of type dbus. Ignoring.", UNIT(s)->id); ++ log_warning_unit(UNIT(s)->id, "%s has a D-Bus service name specified, but is not of type dbus. Ignoring.", UNIT(s)->id); + +- if (s->exec_context.pam_name && s->kill_context.kill_mode != KILL_CONTROL_GROUP) { +- log_error_unit(UNIT(s)->id, +- "%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(s)->id); ++ if (s->exec_context.pam_name && !(s->kill_context.kill_mode == KILL_CONTROL_GROUP || s->kill_context.kill_mode == KILL_MIXED)) { ++ log_error_unit(UNIT(s)->id, "%s has PAM enabled. Kill mode must be set to 'control-group' or 'mixed'. Refusing.", UNIT(s)->id); + return -EINVAL; + } + +-- +1.8.4 + diff --git a/0003-core-make-sure-to-always-go-through-both-SIGTERM-and.patch b/0003-core-make-sure-to-always-go-through-both-SIGTERM-and.patch new file mode 100644 index 00000000..e6423f54 --- /dev/null +++ b/0003-core-make-sure-to-always-go-through-both-SIGTERM-and.patch @@ -0,0 +1,128 @@ +From b2ffdc8da536cd88a305f97517f356e2c5383a52 Mon Sep 17 00:00:00 2001 +From: Lennart Poettering +Date: Wed, 29 Jan 2014 14:58:04 +0100 +Subject: [PATCH 3/3] core: make sure to always go through both SIGTERM and + SIGKILL states of units + +Given that we now have KillMode=mixed where SIGTERM might kill a smaller +set than SIGKILL we need to make sure to always go explicitly throught +the SIGKILL state to get the right end result. +--- + src/core/mount.c | 8 +++++++- + src/core/scope.c | 4 +++- + src/core/service.c | 10 +++++++--- + src/core/socket.c | 6 +++++- + src/core/swap.c | 6 +++++- + 5 files changed, 27 insertions(+), 7 deletions(-) + +diff --git a/src/core/mount.c b/src/core/mount.c +index 3d46557..e418d09 100644 +--- a/src/core/mount.c ++++ b/src/core/mount.c +@@ -854,8 +854,14 @@ static void mount_enter_signal(Mount *m, MountState state, MountResult f) { + goto fail; + + mount_set_state(m, state); +- } else if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL) ++ } else if (state == MOUNT_REMOUNTING_SIGTERM) ++ mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_SUCCESS); ++ else if (state == MOUNT_REMOUNTING_SIGKILL) + mount_enter_mounted(m, MOUNT_SUCCESS); ++ else if (state == MOUNT_MOUNTING_SIGTERM) ++ mount_enter_signal(m, MOUNT_MOUNTING_SIGKILL, MOUNT_SUCCESS); ++ else if (state == MOUNT_UNMOUNTING_SIGTERM) ++ mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_SUCCESS); + else + mount_enter_dead(m, MOUNT_SUCCESS); + +diff --git a/src/core/scope.c b/src/core/scope.c +index 50e5dba..3a5c95e 100644 +--- a/src/core/scope.c ++++ b/src/core/scope.c +@@ -221,7 +221,9 @@ static void scope_enter_signal(Scope *s, ScopeState state, ScopeResult f) { + } + + scope_set_state(s, state); +- } else ++ } else if (state == SCOPE_STOP_SIGTERM) ++ scope_enter_signal(s, SCOPE_STOP_SIGKILL, SCOPE_SUCCESS); ++ else + scope_enter_dead(s, SCOPE_SUCCESS); + + return; +diff --git a/src/core/service.c b/src/core/service.c +index e7f03e1..4b481c2 100644 +--- a/src/core/service.c ++++ b/src/core/service.c +@@ -1964,10 +1964,9 @@ static void service_enter_stop_post(Service *s, ServiceResult f) { + if (r < 0) + goto fail; + +- + service_set_state(s, SERVICE_STOP_POST); + } else +- service_enter_dead(s, SERVICE_SUCCESS, true); ++ service_enter_signal(s, SERVICE_FINAL_SIGTERM, SERVICE_SUCCESS); + + return; + +@@ -1993,6 +1992,7 @@ static void service_enter_signal(Service *s, ServiceState state, ServiceResult f + s->main_pid, + s->control_pid, + s->main_pid_alien); ++ + if (r < 0) + goto fail; + +@@ -2005,8 +2005,12 @@ static void service_enter_signal(Service *s, ServiceState state, ServiceResult f + } + + service_set_state(s, state); +- } else if (state == SERVICE_STOP_SIGTERM || state == SERVICE_STOP_SIGKILL) ++ } else if (state == SERVICE_STOP_SIGTERM) ++ service_enter_signal(s, SERVICE_STOP_SIGKILL, SERVICE_SUCCESS); ++ else if (state == SERVICE_STOP_SIGKILL) + service_enter_stop_post(s, SERVICE_SUCCESS); ++ else if (state == SERVICE_FINAL_SIGTERM) ++ service_enter_signal(s, SERVICE_FINAL_SIGKILL, SERVICE_SUCCESS); + else + service_enter_dead(s, SERVICE_SUCCESS, true); + +diff --git a/src/core/socket.c b/src/core/socket.c +index 6c0ac1a..831876f 100644 +--- a/src/core/socket.c ++++ b/src/core/socket.c +@@ -1298,8 +1298,12 @@ static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) { + goto fail; + + socket_set_state(s, state); +- } else if (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_STOP_PRE_SIGKILL) ++ } else if (state == SOCKET_STOP_PRE_SIGTERM) ++ socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_SUCCESS); ++ else if (state == SOCKET_STOP_PRE_SIGKILL) + socket_enter_stop_post(s, SOCKET_SUCCESS); ++ else if (state == SOCKET_FINAL_SIGTERM) ++ socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_SUCCESS); + else + socket_enter_dead(s, SOCKET_SUCCESS); + +diff --git a/src/core/swap.c b/src/core/swap.c +index a68ab7c..8886fe8 100644 +--- a/src/core/swap.c ++++ b/src/core/swap.c +@@ -655,7 +655,11 @@ static void swap_enter_signal(Swap *s, SwapState state, SwapResult f) { + goto fail; + + swap_set_state(s, state); +- } else ++ } else if (state == SWAP_ACTIVATING_SIGTERM) ++ swap_enter_signal(s, SWAP_ACTIVATING_SIGKILL, SWAP_SUCCESS); ++ else if (state == SWAP_DEACTIVATING_SIGTERM) ++ swap_enter_signal(s, SWAP_DEACTIVATING_SIGKILL, SWAP_SUCCESS); ++ else + swap_enter_dead(s, SWAP_SUCCESS); + + return; +-- +1.8.4 + diff --git a/1016-support-powerfail-with-powerstatus.patch b/1016-support-powerfail-with-powerstatus.patch new file mode 100644 index 00000000..c59f6828 --- /dev/null +++ b/1016-support-powerfail-with-powerstatus.patch @@ -0,0 +1,90 @@ +--- systemd-208/units/sigpwr.target ++++ systemd-208/units/sigpwr.target 2014-01-14 15:53:32.878735762 +0000 +@@ -8,3 +8,5 @@ + [Unit] + Description=Power Failure + Documentation=man:systemd.special(7) ++BindsTo=powerfail.service ++DefaultDependencies=no ++RefuseManualStart=yes +--- systemd-208/units/powerfail.service ++++ systemd-208/units/powerfail.service 2014-01-14 16:11:41.802235712 +0000 +@@ -0,0 +1,21 @@ ++# This file is part of systemd. ++# ++# Copyright (c) 2014 SUSE LINUX Products GmbH, Germany. ++# Author: Werner Fink ++# Please send feedback to http://www.suse.de/feedback ++# ++# Description: ++# ++# Used to start the systemd-powerfail.service ++# ++ ++[Unit] ++Description=powerfail handling ++BindsTo=sigpwr.target ++DefaultDependencies=no ++RefuseManualStart=yes ++ ++[Service] ++Type=oneshot ++ExecStart=/usr/lib/systemd/systemd-powerfail ++RemainAfterExit=false +--- systemd-208/man/systemd-powerfail.service.8 ++++ systemd-208/man/systemd-powerfail.service.8 2014-01-14 18:22:21.286735810 +0000 +@@ -0,0 +1,54 @@ ++'\" t ++.TH "SYSTEMD\-POWERFAIL\&.SERVICE" "8" "" "systemd 208" "systemd-powerfail.service" ++.\" ----------------------------------------------------------------- ++.\" * Define some portability stuff ++.\" ----------------------------------------------------------------- ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.\" http://bugs.debian.org/507673 ++.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.ie \n(.g .ds Aq \(aq ++.el .ds Aq ' ++.\" ----------------------------------------------------------------- ++.\" * set default formatting ++.\" ----------------------------------------------------------------- ++.\" disable hyphenation ++.nh ++.\" disable justification (adjust text to left margin only) ++.ad l ++.\" ----------------------------------------------------------------- ++.\" * MAIN CONTENT STARTS HERE * ++.\" ----------------------------------------------------------------- ++.SH "NAME" ++systemd-powerfail.service, systemd-powerfail \- Power Fail signal handling ++.SH "SYNOPSIS" ++.PP ++systemd\-powerfail\&.service ++.PP ++/usr/lib/systemd/systemd\-powerfail ++.SH "DESCRIPTION" ++.PP ++systemd\-powerfail ++is a system service that is used to evaulate the content of ++\fI/var/run/powerstatus\fR. Based on the content of this ++file: ++.IP F(AIL) ++Power is failing, UPS is providing the power. The ++systemd\-powerfail ++is now doing a timed shutdown. ++.IP O(K) ++The power has been restored, and pending shutdown ++will be cancled. ++.IP L(OW) ++The power is failing and the UPS has a low battery. ++The ++systemd\-powerfail ++is doing an immediate shutdown. ++.PP ++If \fI/var/run/powerstatus\fR doesn't exist or contains anything else then the letters ++F, O or L, systemd\-powerfail will behave as if it has read the letter F. ++.PP ++.SH "SEE ALSO" ++.PP ++\fBshutdown\fR(8), ++\fBpowerd\fR(8) diff --git a/1017-skip-native-unit-handling-if-sysv-already-handled.patch b/1017-skip-native-unit-handling-if-sysv-already-handled.patch new file mode 100644 index 00000000..9390c42a --- /dev/null +++ b/1017-skip-native-unit-handling-if-sysv-already-handled.patch @@ -0,0 +1,20 @@ +For bnc#818044 +Based on http://cgit.freedesktop.org/systemd/systemd/patch/?id=67d6621059085963a2a908a3ea99ced3b0ca789e +--- + systemctl.c | 5 +++++ + 1 file changed, 5 insertions(+) + +--- systemd-208/src/systemctl/systemctl.c ++++ systemd-208/src/systemctl/systemctl.c 2014-01-21 13:00:52.910736187 +0000 +@@ -4453,6 +4453,11 @@ static int enable_unit(DBusConnection *b + if (r < 0) + return r; + ++ /* If the operation was fully executed by the SysV compat, ++ * let's finish early */ ++ if (strv_isempty(mangled_names)) ++ return 0; ++ + if (!bus || avoid_bus()) { + if (streq(verb, "enable")) { + r = unit_file_enable(arg_scope, arg_runtime, arg_root, mangled_names, arg_force, &changes, &n_changes); diff --git a/1018-Make-LSB-Skripts-know-about-Required-and-Should.patch b/1018-Make-LSB-Skripts-know-about-Required-and-Should.patch new file mode 100644 index 00000000..81a26925 --- /dev/null +++ b/1018-Make-LSB-Skripts-know-about-Required-and-Should.patch @@ -0,0 +1,51 @@ +--- systemd-208/src/core/service.c ++++ systemd-208/src/core/service.c 2014-01-17 12:15:52.527311588 +0000 +@@ -380,6 +380,8 @@ static int sysv_translate_facility(const + "remote_fs", SPECIAL_REMOTE_FS_TARGET, + "syslog", NULL, + "time", SPECIAL_TIME_SYNC_TARGET, ++ "all", SPECIAL_DEFAULT_TARGET, ++ "null", NULL, + }; + + unsigned i; +@@ -389,7 +391,7 @@ static int sysv_translate_facility(const + assert(name); + assert(_r); + +- n = *name == '$' ? name + 1 : name; ++ n = (*name == '$' || *name == '+') ? name + 1 : name; + + for (i = 0; i < ELEMENTSOF(table); i += 2) { + +@@ -816,10 +818,13 @@ static int service_load_sysv_path(Servic + startswith_no_case(t, "Should-Start:") || + startswith_no_case(t, "X-Start-Before:") || + startswith_no_case(t, "X-Start-After:")) { ++ UnitDependency d, e; + char *i, *w; + size_t z; + + state = LSB; ++ d = startswith_no_case(t, "X-Start-Before:") ? UNIT_BEFORE : UNIT_AFTER; ++ e = startswith_no_case(t, "Required-Start:") ? UNIT_REQUIRES_OVERRIDABLE : UNIT_WANTS; + + FOREACH_WORD_QUOTED(w, z, strchr(t, ':')+1, i) { + char *n, *m; +@@ -838,12 +843,15 @@ static int service_load_sysv_path(Servic + continue; + } + ++ if (*n == '+') ++ e = UNIT_WANTS; ++ + free(n); + + if (r == 0) + continue; + +- r = unit_add_dependency_by_name(u, startswith_no_case(t, "X-Start-Before:") ? UNIT_BEFORE : UNIT_AFTER, m, NULL, true); ++ r = unit_add_two_dependencies_by_name(u, d, e, m, NULL, true); + + if (r < 0) + log_error_unit(u->id, "[%s:%u] Failed to add dependency on %s, ignoring: %s", diff --git a/1019-make-completion-smart-to-be-able-to-redirect.patch b/1019-make-completion-smart-to-be-able-to-redirect.patch new file mode 100644 index 00000000..d1425d83 --- /dev/null +++ b/1019-make-completion-smart-to-be-able-to-redirect.patch @@ -0,0 +1,236 @@ +--- systemd-208/shell-completion/bash/hostnamectl ++++ systemd-208/shell-completion/bash/hostnamectl 2014-01-17 14:27:16.183272019 +0000 +@@ -30,6 +30,10 @@ _hostnamectl() { + local OPTS='-h --help --version --transient --static --pretty + --no-ask-password -H --host' + ++ if __contains_word ">" ${COMP_WORDS[*]:0:COMP_CWORD}; then ++ return 0 ++ fi ++ + if [[ $cur = -* ]]; then + COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") ) + return 0 +@@ -58,4 +62,4 @@ _hostnamectl() { + return 0 + } + +-complete -F _hostnamectl hostnamectl ++complete -o default -o bashdefault -F _hostnamectl hostnamectl +--- systemd-208/shell-completion/bash/journalctl ++++ systemd-208/shell-completion/bash/journalctl 2014-01-17 14:34:30.338737694 +0000 +@@ -49,6 +49,10 @@ _journalctl() { + --verify-key' + ) + ++ if __contains_word ">" ${COMP_WORDS[*]:0:COMP_CWORD}; then ++ return 0 ++ fi ++ + if __contains_word "$prev" ${OPTS[ARG]} ${OPTS[ARGUNKNOWN]}; then + case $prev in + --boot|--this-boot|-b) +@@ -107,4 +111,4 @@ _journalctl() { + fi + } + +-complete -F _journalctl journalctl ++complete -o default -o bashdefault -F _journalctl journalctl +--- systemd-208/shell-completion/bash/kernel-install ++++ systemd-208/shell-completion/bash/kernel-install 2014-01-17 14:34:41.982255874 +0000 +@@ -18,11 +18,22 @@ + # You should have received a copy of the GNU Lesser General Public License + # along with systemd; If not, see . + ++__contains_word () { ++ local w word=$1; shift ++ for w in "$@"; do ++ [[ $w = "$word" ]] && return ++ done ++} ++ + _kernel_install() { + local comps + local MACHINE_ID + local cur=${COMP_WORDS[COMP_CWORD]} + ++ if __contains_word ">" ${COMP_WORDS[*]:0:COMP_CWORD}; then ++ return 0 ++ fi ++ + case $COMP_CWORD in + 1) + comps="add remove" +@@ -47,4 +58,4 @@ _kernel_install() { + return 0 + } + +-complete -F _kernel_install kernel-install ++complete -o default -o bashdefault -F _kernel_install kernel-install +--- systemd-208/shell-completion/bash/localectl ++++ systemd-208/shell-completion/bash/localectl 2014-01-17 14:34:52.546235747 +0000 +@@ -30,6 +30,10 @@ _localectl() { + local OPTS='-h --help --version --no-convert --no-pager --no-ask-password + -H --host' + ++ if __contains_word ">" ${COMP_WORDS[*]:0:COMP_CWORD}; then ++ return 0 ++ fi ++ + if __contains_word "$prev" $OPTS; then + case $prev in + --host|-H) +@@ -73,4 +77,4 @@ _localectl() { + return 0 + } + +-complete -F _localectl localectl ++complete -o default -o bashdefault -F _localectl localectl +--- systemd-208/shell-completion/bash/loginctl ++++ systemd-208/shell-completion/bash/loginctl 2014-01-17 14:35:03.386245699 +0000 +@@ -37,6 +37,10 @@ _loginctl () { + [ARG]='--host -H --kill-who --property -p --signal -s' + ) + ++ if __contains_word ">" ${COMP_WORDS[*]:0:COMP_CWORD}; then ++ return 0 ++ fi ++ + if __contains_word "$prev" ${OPTS[ARG]}; then + case $prev in + --signal|-s) +@@ -106,4 +110,4 @@ _loginctl () { + return 0 + } + +-complete -F _loginctl loginctl ++complete -o default -o bashdefault -F _loginctl loginctl +--- systemd-208/shell-completion/bash/systemctl ++++ systemd-208/shell-completion/bash/systemctl 2014-01-17 14:35:26.506235666 +0000 +@@ -77,6 +77,10 @@ _systemctl () { + [ARG]='--host -H --kill-mode --kill-who --property -p --signal -s --type -t --state --root' + ) + ++ if __contains_word ">" ${COMP_WORDS[*]:0:COMP_CWORD}; then ++ return 0 ++ fi ++ + if __contains_word "--user" ${COMP_WORDS[*]}; then + mode=--user + else +@@ -226,4 +230,4 @@ _systemctl () { + return 0 + } + +-complete -F _systemctl systemctl ++complete -o default -o bashdefault -F _systemctl systemctl +--- systemd-208/shell-completion/bash/systemd-analyze ++++ systemd-208/shell-completion/bash/systemd-analyze 2014-01-17 14:35:38.366736021 +0000 +@@ -37,6 +37,10 @@ _systemd_analyze() { + [LOG_LEVEL]='set-log-level' + ) + ++ if __contains_word ">" ${COMP_WORDS[*]:0:COMP_CWORD}; then ++ return 0 ++ fi ++ + _init_completion || return + + for ((i=0; $i <= $COMP_CWORD; i++)); do +@@ -83,4 +87,4 @@ _systemd_analyze() { + return 0 + } + +-complete -F _systemd_analyze systemd-analyze ++complete -o default -o bashdefault -F _systemd_analyze systemd-analyze +--- systemd-208/shell-completion/bash/systemd-coredumpctl ++++ systemd-208/shell-completion/bash/systemd-coredumpctl 2014-01-17 14:35:46.434235632 +0000 +@@ -44,6 +44,10 @@ _coredumpctl() { + [DUMP]='dump gdb' + ) + ++ if __contains_word ">" ${COMP_WORDS[*]:0:COMP_CWORD}; then ++ return 0 ++ fi ++ + if __contains_word "$prev" '--output -o'; then + comps=$( compgen -A file -- "$cur" ) + compopt -o filenames +@@ -82,4 +86,4 @@ _coredumpctl() { + return 0 + } + +-complete -F _coredumpctl systemd-coredumpctl ++complete -o default -o bashdefault -F _coredumpctl systemd-coredumpctl +--- systemd-208/shell-completion/bash/systemd-run ++++ systemd-208/shell-completion/bash/systemd-run 2014-01-17 14:35:55.938236298 +0000 +@@ -17,6 +17,13 @@ + # You should have received a copy of the GNU Lesser General Public License + # along with systemd; If not, see . + ++__contains_word () { ++ local w word=$1; shift ++ for w in "$@"; do ++ [[ $w = "$word" ]] && return ++ done ++} ++ + __systemctl() { + local mode=$1; shift 1 + systemctl $mode --full --no-legend "$@" +@@ -31,6 +38,11 @@ _systemd_run() { + + local mode=--system + local i ++ ++ if __contains_word ">" ${COMP_WORDS[*]:0:COMP_CWORD}; then ++ return 0 ++ fi ++ + for (( i=1; i <= COMP_CWORD; i++ )); do + if [[ ${COMP_WORDS[i]} != -* ]]; then + local root_command=${COMP_WORDS[i]} +@@ -60,4 +72,4 @@ _systemd_run() { + return 0 + } + +-complete -F _systemd_run systemd-run ++complete -o default -o bashdefault -F _systemd_run systemd-run +--- systemd-208/shell-completion/bash/timedatectl ++++ systemd-208/shell-completion/bash/timedatectl 2014-01-17 14:36:06.182735466 +0000 +@@ -30,6 +30,10 @@ _timedatectl() { + local OPTS='-h --help --version --adjust-system-clock --no-pager + --no-ask-password -H --host' + ++ if __contains_word ">" ${COMP_WORDS[*]:0:COMP_CWORD}; then ++ return 0 ++ fi ++ + if __contains_word "$prev" $OPTS; then + case $prev in + --host|-H) +@@ -73,4 +77,4 @@ _timedatectl() { + return 0 + } + +-complete -F _timedatectl timedatectl ++complete -o default -o bashdefault -F _timedatectl timedatectl +--- systemd-208/shell-completion/bash/udevadm ++++ systemd-208/shell-completion/bash/udevadm 2014-01-17 14:36:16.406236120 +0000 +@@ -36,6 +36,10 @@ _udevadm() { + + local verbs=(info trigger settle control monitor hwdb test-builtin test) + ++ if __contains_word ">" ${COMP_WORDS[*]:0:COMP_CWORD}; then ++ return 0 ++ fi ++ + for ((i=0; i <= COMP_CWORD; i++)); do + if __contains_word "${COMP_WORDS[i]}" "${verbs[@]}" && + ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then +@@ -94,4 +98,4 @@ _udevadm() { + return 0 + } + +-complete -F _udevadm udevadm ++complete -o default -o bashdefault -F _udevadm udevadm diff --git a/analyze-fix-crash-in-command-line-parsing.patch b/analyze-fix-crash-in-command-line-parsing.patch new file mode 100644 index 00000000..f76266ec --- /dev/null +++ b/analyze-fix-crash-in-command-line-parsing.patch @@ -0,0 +1,35 @@ +From da6de8a55784115451582051c8da620056994a05 Mon Sep 17 00:00:00 2001 +From: Frederic Crozat +Date: Mon, 20 Jan 2014 11:05:22 +0100 +Subject: [PATCH] analyze: fix crash in command line parsing + +Ensure DBusError is set before it can possibly be freed on return. +Fix crash when calling set-log-level without any parameter. + +Fix https://bugzilla.novell.com/show_bug.cgi?id=859365 +--- + src/analyze/systemd-analyze.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/analyze/systemd-analyze.c b/src/analyze/systemd-analyze.c +index 27d063c..cdfae93 100644 +--- a/src/analyze/systemd-analyze.c ++++ b/src/analyze/systemd-analyze.c +@@ -1226,13 +1226,13 @@ static int set_log_level(DBusConnection *bus, char **args) { + assert(bus); + assert(args); + ++ dbus_error_init(&error); + if (strv_length(args) != 1) { + log_error("This command expects one argument only."); + return -E2BIG; + } + + value = args[0]; +- dbus_error_init(&error); + + m = dbus_message_new_method_call("org.freedesktop.systemd1", + "/org/freedesktop/systemd1", +-- +1.8.4 + diff --git a/macros.systemd b/macros.systemd index dc70ceb7..1a003957 100644 --- a/macros.systemd +++ b/macros.systemd @@ -46,6 +46,13 @@ if [ $FIRST_ARG -eq 1 ]; then \ touch "/var/lib/systemd/migrated/$sysv_service" || : \ done \ else \ + if [ $FIRST_ARG -gt 1 ]; then \ + for service in %{?*} ; do \ + if [ ! -e "/usr/lib/systemd/system/$service" ]; then \ + touch "/run/rpm-%{name}-update-$service-new-in-upgrade" \ + fi \ + done \ + fi \ for service in %{?*} ; do \ sysv_service=${service%.*} \ if [ ! -e "/var/lib/systemd/migrated/$sysv_service" ]; then \ @@ -74,6 +81,13 @@ if [ -n "$services_to_migrate" ]; then \ /usr/sbin/systemd-sysv-convert --apply $services_to_migrate >/dev/null 2>&1 || : \ elif [ $FIRST_ARG -eq 1 ]; then \ /usr/bin/systemctl preset %{?*} >/dev/null 2>&1 || : \ +elif [ $FIRST_ARG -gt 1 ]; then \ + for service in %{?*} ; do \ + if [ -e "/run/rpm-%{name}-update-$service-new-in-upgrade" ]; then \ + rm -f "/run/rpm-%{name}-update-$service-new-in-upgrade" \ + /usr/bin/systemctl preset "$service" >/dev/null 2>&1 || : \ + fi \ + done \ fi \ %{nil} diff --git a/make-emergency.service-conflict-with-syslog.socket.patch b/make-emergency.service-conflict-with-syslog.socket.patch new file mode 100644 index 00000000..63e513cc --- /dev/null +++ b/make-emergency.service-conflict-with-syslog.socket.patch @@ -0,0 +1,22 @@ +If after emergency service had been started there is incoming +traffic on syslog.socket emergency.service gets killed due to +implicit dependencies on basic.target => sysinit.target which in +turn conflict with emergency.target. + +As a workaround explicitly stop syslog.socket when entering +emergency.service. + +Reference: bnc#852232 +Index: systemd-208/units/emergency.service.in +=================================================================== +--- systemd-208/units/emergency.service.in ++++ systemd-208/units/emergency.service.in +@@ -9,7 +9,7 @@ + Description=Emergency Shell + Documentation=man:sulogin(8) + DefaultDependencies=no +-Conflicts=shutdown.target ++Conflicts=shutdown.target syslog.socket + Before=shutdown.target + + [Service] diff --git a/systemd-mini.changes b/systemd-mini.changes index ba215dd6..39675682 100644 --- a/systemd-mini.changes +++ b/systemd-mini.changes @@ -1,3 +1,138 @@ +------------------------------------------------------------------- +Thu Jan 30 08:29:00 UTC 2014 - werner@suse.de + +- Change patch 0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch + to skip already by the kernel managed devices + +------------------------------------------------------------------- +Wed Jan 29 18:03:39 UTC 2014 - arvidjaar@gmail.com + +- fix timeout stopping user@.service (bnc#841544) + * 0001-core-introduce-new-KillMode-mixed-which-sends-SIGTER.patch + * 0002-service-allow-KillMode-mixed-in-conjunction-with-PAM.patch + * 0003-core-make-sure-to-always-go-through-both-SIGTERM-and.patch + +------------------------------------------------------------------- +Tue Jan 28 12:44:07 UTC 2014 - werner@suse.de + +- Add patch 0001-upstream-systemctl-halt-reboot-error-handling.patch + to be able to detect if the sysctl reboot() returns. +- Add patch 0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch + A check for unmaintained disk like devices is added to be able to + flush and maybe shut them down. Also the missing sync() system + call is added for the direct halt/reboot systemctl command. Then + the system halt is used as fallback if poweroff fails for both + the direct poweroff systemctl command as well as for the + systemd-shutdown utility. + +------------------------------------------------------------------- +Thu Jan 23 13:24:53 UTC 2014 - werner@suse.de + +- Make systemd-mini build + +------------------------------------------------------------------- +Thu Jan 23 13:18:39 UTC 2014 - werner@suse.de + +- Make requires bash-completion a recommends + +------------------------------------------------------------------- +Tue Jan 21 13:05:59 UTC 2014 - werner@suse.de + +- Add patch 1017-skip-native-unit-handling-if-sysv-already-handled.patch + to avoid that enabled boot scripts will be handled as unit files + by systemctl status command (bnc#818044) + +------------------------------------------------------------------- +Tue Jan 21 12:51:20 UTC 2014 - werner@suse.de + +- Drop patch 1017-enforce-sufficient-shutdown-warnings.patch + as the original code behaves exactly as the shutdown code of + the old SysVinit (bnc#750845) +- Rename support-powerfail-with-powerstatus.patch to + 1016-support-powerfail-with-powerstatus.patch + +------------------------------------------------------------------- +Mon Jan 20 10:18:20 UTC 2014 - fcrozat@suse.com + +- Add analyze-fix-crash-in-command-line-parsing.patch: fix crash in + systemd-analyze (bnc#859365) + +------------------------------------------------------------------- +Fri Jan 17 16:09:24 UTC 2014 - werner@suse.de + +- Add patch + 1019-make-completion-smart-to-be-able-to-redirect.patch + to make redirections work with the bash command completions for + for systemd command tools (bnc#856858, bnc#859072) + +------------------------------------------------------------------- +Fri Jan 17 12:24:13 UTC 2014 - werner@suse.de + +- Add patch + 1018-Make-LSB-Skripts-know-about-Required-and-Should.patch + to support the "+" to tag wanted dependencies as well as make + sure that required dependencies are handles as required ones. + This should fix bnc#858864 and bnc#857204. + +------------------------------------------------------------------- +Thu Jan 16 16:08:00 UTC 2014 - lnussel@suse.de + +- apply preset also to service files that are new in upgrade + +------------------------------------------------------------------- +Wed Jan 15 14:11:02 UTC 2014 - werner@suse.de + +- Change support-powerfail-with-powerstatus.patch to use BindsTo + instead of BindTo + +------------------------------------------------------------------- +Wed Jan 15 12:34:53 UTC 2014 - werner@suse.de + +- Add patch 1017-enforce-sufficient-shutdown-warnings.patch + Warn once per hour in the last 3 hours, then all 30 minutes in last + hour, all 15 minutes in the last 45 minutes, all 10 minutes in the + last 15 minutes, and then all minute in the last 10 minutes (bnc#750845) + +------------------------------------------------------------------- +Tue Jan 14 18:28:09 UTC 2014 - werner@suse.de + +- Add patch support-powerfail-with-powerstatus.patch and source + file systemd-powerfail to implement SIGPWR support with evaluation + of the file /var/run/powerstatus (bnc#737690) + +------------------------------------------------------------------- +Fri Dec 20 12:06:18 UTC 2013 - werner@suse.de + +- Adapt patch + 1011-check-4-valid-kmsg-device.patch + to fit current upstream version maybe related to bnc#854884 +- Change patch + 1012-pam_systemd_do_override_XDG_RUNTIME_DIR_of_the_original_user.patch + to check if XDG_RUNTIME_DIR is set before the call of pam_putenv() + may fix bnc#855160 + +------------------------------------------------------------------- +Fri Dec 20 09:40:01 UTC 2013 - lbsousajr@gmail.com + +- Disable multi-seat-x build, since package xorg-x11-server + currently in Factory no longer needs it. + +------------------------------------------------------------------- +Wed Dec 18 18:56:01 UTC 2013 - hrvoje.senjan@gmail.com + +- Added 0001-logind-garbage-collect-stale-users.patch: Don't stop a + running user manager from garbage-collecting the user. Original + behavior caused bnc#849870 + +------------------------------------------------------------------- +Mon Dec 16 11:08:33 UTC 2013 - lbsousajr@gmail.com + +- Add build-sys-make-multi-seat-x-optional.patch + * See: http://cgit.freedesktop.org/systemd/systemd/commit/?id=bd441fa27a22b7c6e11d9330560e0622fb69f297 + * Now systemd-multi-seat-x build can be disabled with configure option + --disable-multi-seat-x. It should be done when xorg-x11-server + no longer needs it (work in progress). + ------------------------------------------------------------------- Mon Dec 16 09:43:29 UTC 2013 - fcrozat@suse.com @@ -16,6 +151,19 @@ Fri Dec 6 13:30:19 UTC 2013 - werner@suse.de the systemd-journald (bnc#838475) - Let us build require the package config for libpcre (bnc#853293) +------------------------------------------------------------------- +Sat Nov 30 08:16:02 UTC 2013 - arvidjaar@gmail.com + +- Add patch + 0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch + Make sure emergency shell is not killed by attempt to start another unit + (bnc#852021). Backported from d420282b28f50720e233ccb1c02547c562195653. +- Add patch + make-emergency.service-conflict-with-syslog.socket.patch + Previous patch did not fix problem if syslog connection request came + after emergency shell was already started. So forcibly stop syslog.socket + when starting emergency.service. (bnc#852232) + ------------------------------------------------------------------- Thu Nov 28 10:25:58 UTC 2013 - lbsousajr@gmail.com diff --git a/systemd-mini.spec b/systemd-mini.spec index cdf81be0..33ae73a6 100644 --- a/systemd-mini.spec +++ b/systemd-mini.spec @@ -1,7 +1,7 @@ # # spec file for package systemd-mini # -# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -23,6 +23,11 @@ %define udevpkgname udev-mini %define udev_major 1 +%if 0%{?sles_version} == 0 +%global with_bash_completion 1 +%endif +%bcond_with bash_completion + Name: systemd-mini Url: http://www.freedesktop.org/wiki/Software/systemd Version: 208 @@ -89,6 +94,9 @@ Conflicts: kiwi # the buildignore is important for bootstrapping #!BuildIgnore: udev Requires: %{udevpkgname} >= 172 +%if %{with bash_completion} +Recommends: bash-completion +%endif Requires: dbus-1 >= 1.4.0 Requires: kbd Requires: kmod >= 14 @@ -117,6 +125,7 @@ Source8: systemd-journald.init Source9: nss-myhostname-config Source10: macros.systemd.upstream Source11: after-local.service +Source12: systemd-powerfail Source1060: boot.udev Source1061: write_dev_root_rule @@ -246,6 +255,22 @@ Patch79: 0001-analyze-set-white-background.patch Patch80: 0001-analyze-set-text-on-side-with-most-space.patch # PATCH-FIX-UPSTREAM 0001-logind-garbage-collect-stale-users.patch -- Don't stop a running user manager from garbage-collecting the user. Patch81: 0001-logind-garbage-collect-stale-users.patch +# PATCH-FIX-UPSTREAM analyze-fix-crash-in-command-line-parsing.patch fcrozat@suse.com bnc#859365 -- Fix crash in systemd-analyze +Patch82: analyze-fix-crash-in-command-line-parsing.patch +# PATCH-FIX-UPSTREAM 0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch -- Prevent accidental kill of emergency shell (bnc#852021) +Patch83: 0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch +# PATCH-FIX-OPENSUSE make-emergency.service-conflict-with-syslog.socket.patch (bnc#852232) +Patch84: make-emergency.service-conflict-with-syslog.socket.patch +# PATCH-FIX-UPSTREAM 0001-upstream-systemctl-halt-reboot-error-handling.patch +Patch85: 0001-upstream-systemctl-halt-reboot-error-handling.patch +# PATCH-FIX-SUSE 0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch +Patch86: 0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch +# PATCH-FIX-UPSTREAM 0001-core-introduce-new-KillMode-mixed-which-sends-SIGTER.patch -- Allow sending SIGTERM to main PID only (bnc#841544) +Patch87: 0001-core-introduce-new-KillMode-mixed-which-sends-SIGTER.patch +# PATCH-FIX-UPSTREAM 0002-service-allow-KillMode-mixed-in-conjunction-with-PAM.patch -- Allow using it with PAM enabled services (bnc#841544) +Patch88: 0002-service-allow-KillMode-mixed-in-conjunction-with-PAM.patch +# PATCH-FIX-UPSTREAM 0003-core-make-sure-to-always-go-through-both-SIGTERM-and.patch -- Make sure final SIGKILL actually kills everything (bnc#841544) +Patch89: 0003-core-make-sure-to-always-go-through-both-SIGTERM-and.patch # udev patches # PATCH-FIX-OPENSUSE 1001-re-enable-by_path-links-for-ata-devices.patch @@ -276,6 +301,14 @@ Patch1013: U_logind_revert_lazy_session_activation_on_non_vt_seats.patch Patch1014: 1014-journald-with-journaling-FS.patch # PATCH-FIX-UPSTREAM build-sys-make-multi-seat-x-optional.patch Patch1015: build-sys-make-multi-seat-x-optional.patch +# PATCH-FIX-SUSE 1016-support-powerfail-with-powerstatus.patch +Patch1016: 1016-support-powerfail-with-powerstatus.patch +# PATCH-FIX-UPSTREAM 1017-skip-native-unit-handling-if-sysv-already-handled.patch +Patch1017: 1017-skip-native-unit-handling-if-sysv-already-handled.patch +# PATCH-FIX-SUSE 1018-Make-LSB-Skripts-know-about-Required-and-Should.patch +Patch1018: 1018-Make-LSB-Skripts-know-about-Required-and-Should.patch +# PATCH-FIX-SUSE 1019-make-completion-smart-to-be-able-to-redirect.patch +Patch1019: 1019-make-completion-smart-to-be-able-to-redirect.patch %description Systemd is a system and service manager, compatible with SysV and LSB @@ -539,6 +572,14 @@ cp %{SOURCE7} m4/ %patch79 -p1 %patch80 -p1 %patch81 -p1 +%patch82 -p1 +%patch83 -p1 +%patch84 -p1 +%patch85 -p1 +%patch86 -p1 +%patch87 -p1 +%patch88 -p1 +%patch89 -p1 # udev patches %patch1001 -p1 @@ -558,6 +599,10 @@ cp %{SOURCE7} m4/ %patch1013 -p1 %patch1014 -p1 %patch1015 -p1 +%patch1016 -p1 +%patch1017 -p1 +%patch1018 -p1 +%patch1019 -p1 # ensure generate files are removed rm -f units/emergency.service @@ -735,6 +780,23 @@ EOF install -m 644 %{S:11} %{buildroot}/%{_prefix}/lib/systemd/system/ ln -s ../after-local.service %{buildroot}/%{_prefix}/lib/systemd/system/multi-user.target.wants/ +# support for SIGPWR handling with /var/run/powerstatus of e.g. powerd +install -m 755 %{S:12} %{buildroot}/%{_prefix}/lib/systemd/ +install -m 644 units/powerfail.service %{buildroot}/%{_prefix}/lib/systemd/system/ +%if ! 0%{?bootstrap} +install -m 644 man/systemd-powerfail.service.8 %{buildroot}/%{_mandir}/man8/ +%endif + +# clean out some completions which requires bash-completion package +%if %{without bash_completion} +for c in %{buildroot}/%{_datadir}/bash-completion/completions/* +do + test -e "$c" || continue + grep -q _init_completion "$c" || continue + rm -vf "$c" +done +%endif + %fdupes -s %{buildroot}%{_mandir} # packaged in systemd-rpm-macros diff --git a/systemd-powerfail b/systemd-powerfail new file mode 100644 index 00000000..797fb7d2 --- /dev/null +++ b/systemd-powerfail @@ -0,0 +1,28 @@ +#!/bin/bash +# +# /usr/lib/systemd/systemd-powerfail +# +# Copyright (c) 2014 SUSE LINUX Products GmbH, Germany. +# Author: Werner Fink +# Please send feedback to http://www.suse.de/feedback +# +# Description: +# +# Used to evaluate the status of /var/run/powerstatus +# + +trap "echo" SIGINT SIGSEGV SIGTERM + + POWERFAIL='THE POWER IS FAILED! SYSTEM GOING DOWN! PLEASE LOG OFF NOW!' +POWERFAILNOW='THE POWER IS FAILED! LOW BATTERY - EMERGENCY SYSTEM SHUTDOWN!' + POWERISBACK='THE POWER IS BACK' + +typeset pwrstat=0 +test -s /var/run/powerstatus && read pwrstat < /var/run/powerstatus +rm -f /var/run/powerstatus + +case "$pwrstat" in +O*) exec /sbin/shutdown -c +0 "$POWERISBACK" ;; +L*) exec /sbin/shutdown -P +0 "$POWERFAILNOW" ;; +*) exec /sbin/shutdown -P +2 "$POWERFAIL" ;; +esac diff --git a/systemd-rpm-macros.spec b/systemd-rpm-macros.spec index 4c7b714f..c8e0234c 100644 --- a/systemd-rpm-macros.spec +++ b/systemd-rpm-macros.spec @@ -1,7 +1,7 @@ # # spec file for package systemd-rpm-macros # -# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed diff --git a/systemd.changes b/systemd.changes index a9766b37..39675682 100644 --- a/systemd.changes +++ b/systemd.changes @@ -1,3 +1,105 @@ +------------------------------------------------------------------- +Thu Jan 30 08:29:00 UTC 2014 - werner@suse.de + +- Change patch 0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch + to skip already by the kernel managed devices + +------------------------------------------------------------------- +Wed Jan 29 18:03:39 UTC 2014 - arvidjaar@gmail.com + +- fix timeout stopping user@.service (bnc#841544) + * 0001-core-introduce-new-KillMode-mixed-which-sends-SIGTER.patch + * 0002-service-allow-KillMode-mixed-in-conjunction-with-PAM.patch + * 0003-core-make-sure-to-always-go-through-both-SIGTERM-and.patch + +------------------------------------------------------------------- +Tue Jan 28 12:44:07 UTC 2014 - werner@suse.de + +- Add patch 0001-upstream-systemctl-halt-reboot-error-handling.patch + to be able to detect if the sysctl reboot() returns. +- Add patch 0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch + A check for unmaintained disk like devices is added to be able to + flush and maybe shut them down. Also the missing sync() system + call is added for the direct halt/reboot systemctl command. Then + the system halt is used as fallback if poweroff fails for both + the direct poweroff systemctl command as well as for the + systemd-shutdown utility. + +------------------------------------------------------------------- +Thu Jan 23 13:24:53 UTC 2014 - werner@suse.de + +- Make systemd-mini build + +------------------------------------------------------------------- +Thu Jan 23 13:18:39 UTC 2014 - werner@suse.de + +- Make requires bash-completion a recommends + +------------------------------------------------------------------- +Tue Jan 21 13:05:59 UTC 2014 - werner@suse.de + +- Add patch 1017-skip-native-unit-handling-if-sysv-already-handled.patch + to avoid that enabled boot scripts will be handled as unit files + by systemctl status command (bnc#818044) + +------------------------------------------------------------------- +Tue Jan 21 12:51:20 UTC 2014 - werner@suse.de + +- Drop patch 1017-enforce-sufficient-shutdown-warnings.patch + as the original code behaves exactly as the shutdown code of + the old SysVinit (bnc#750845) +- Rename support-powerfail-with-powerstatus.patch to + 1016-support-powerfail-with-powerstatus.patch + +------------------------------------------------------------------- +Mon Jan 20 10:18:20 UTC 2014 - fcrozat@suse.com + +- Add analyze-fix-crash-in-command-line-parsing.patch: fix crash in + systemd-analyze (bnc#859365) + +------------------------------------------------------------------- +Fri Jan 17 16:09:24 UTC 2014 - werner@suse.de + +- Add patch + 1019-make-completion-smart-to-be-able-to-redirect.patch + to make redirections work with the bash command completions for + for systemd command tools (bnc#856858, bnc#859072) + +------------------------------------------------------------------- +Fri Jan 17 12:24:13 UTC 2014 - werner@suse.de + +- Add patch + 1018-Make-LSB-Skripts-know-about-Required-and-Should.patch + to support the "+" to tag wanted dependencies as well as make + sure that required dependencies are handles as required ones. + This should fix bnc#858864 and bnc#857204. + +------------------------------------------------------------------- +Thu Jan 16 16:08:00 UTC 2014 - lnussel@suse.de + +- apply preset also to service files that are new in upgrade + +------------------------------------------------------------------- +Wed Jan 15 14:11:02 UTC 2014 - werner@suse.de + +- Change support-powerfail-with-powerstatus.patch to use BindsTo + instead of BindTo + +------------------------------------------------------------------- +Wed Jan 15 12:34:53 UTC 2014 - werner@suse.de + +- Add patch 1017-enforce-sufficient-shutdown-warnings.patch + Warn once per hour in the last 3 hours, then all 30 minutes in last + hour, all 15 minutes in the last 45 minutes, all 10 minutes in the + last 15 minutes, and then all minute in the last 10 minutes (bnc#750845) + +------------------------------------------------------------------- +Tue Jan 14 18:28:09 UTC 2014 - werner@suse.de + +- Add patch support-powerfail-with-powerstatus.patch and source + file systemd-powerfail to implement SIGPWR support with evaluation + of the file /var/run/powerstatus (bnc#737690) + ------------------------------------------------------------------- Fri Dec 20 12:06:18 UTC 2013 - werner@suse.de @@ -49,6 +151,19 @@ Fri Dec 6 13:30:19 UTC 2013 - werner@suse.de the systemd-journald (bnc#838475) - Let us build require the package config for libpcre (bnc#853293) +------------------------------------------------------------------- +Sat Nov 30 08:16:02 UTC 2013 - arvidjaar@gmail.com + +- Add patch + 0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch + Make sure emergency shell is not killed by attempt to start another unit + (bnc#852021). Backported from d420282b28f50720e233ccb1c02547c562195653. +- Add patch + make-emergency.service-conflict-with-syslog.socket.patch + Previous patch did not fix problem if syslog connection request came + after emergency shell was already started. So forcibly stop syslog.socket + when starting emergency.service. (bnc#852232) + ------------------------------------------------------------------- Thu Nov 28 10:25:58 UTC 2013 - lbsousajr@gmail.com diff --git a/systemd.spec b/systemd.spec index c66ec723..07823db2 100644 --- a/systemd.spec +++ b/systemd.spec @@ -1,7 +1,7 @@ # # spec file for package systemd # -# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -21,6 +21,11 @@ %define udevpkgname udev %define udev_major 1 +%if 0%{?sles_version} == 0 +%global with_bash_completion 1 +%endif +%bcond_with bash_completion + Name: systemd Url: http://www.freedesktop.org/wiki/Software/systemd Version: 208 @@ -84,6 +89,9 @@ Conflicts: kiwi # the buildignore is important for bootstrapping #!BuildIgnore: udev Requires: %{udevpkgname} >= 172 +%if %{with bash_completion} +Recommends: bash-completion +%endif Requires: dbus-1 >= 1.4.0 Requires: kbd Requires: kmod >= 14 @@ -112,6 +120,7 @@ Source8: systemd-journald.init Source9: nss-myhostname-config Source10: macros.systemd.upstream Source11: after-local.service +Source12: systemd-powerfail Source1060: boot.udev Source1061: write_dev_root_rule @@ -241,6 +250,22 @@ Patch79: 0001-analyze-set-white-background.patch Patch80: 0001-analyze-set-text-on-side-with-most-space.patch # PATCH-FIX-UPSTREAM 0001-logind-garbage-collect-stale-users.patch -- Don't stop a running user manager from garbage-collecting the user. Patch81: 0001-logind-garbage-collect-stale-users.patch +# PATCH-FIX-UPSTREAM analyze-fix-crash-in-command-line-parsing.patch fcrozat@suse.com bnc#859365 -- Fix crash in systemd-analyze +Patch82: analyze-fix-crash-in-command-line-parsing.patch +# PATCH-FIX-UPSTREAM 0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch -- Prevent accidental kill of emergency shell (bnc#852021) +Patch83: 0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch +# PATCH-FIX-OPENSUSE make-emergency.service-conflict-with-syslog.socket.patch (bnc#852232) +Patch84: make-emergency.service-conflict-with-syslog.socket.patch +# PATCH-FIX-UPSTREAM 0001-upstream-systemctl-halt-reboot-error-handling.patch +Patch85: 0001-upstream-systemctl-halt-reboot-error-handling.patch +# PATCH-FIX-SUSE 0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch +Patch86: 0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch +# PATCH-FIX-UPSTREAM 0001-core-introduce-new-KillMode-mixed-which-sends-SIGTER.patch -- Allow sending SIGTERM to main PID only (bnc#841544) +Patch87: 0001-core-introduce-new-KillMode-mixed-which-sends-SIGTER.patch +# PATCH-FIX-UPSTREAM 0002-service-allow-KillMode-mixed-in-conjunction-with-PAM.patch -- Allow using it with PAM enabled services (bnc#841544) +Patch88: 0002-service-allow-KillMode-mixed-in-conjunction-with-PAM.patch +# PATCH-FIX-UPSTREAM 0003-core-make-sure-to-always-go-through-both-SIGTERM-and.patch -- Make sure final SIGKILL actually kills everything (bnc#841544) +Patch89: 0003-core-make-sure-to-always-go-through-both-SIGTERM-and.patch # udev patches # PATCH-FIX-OPENSUSE 1001-re-enable-by_path-links-for-ata-devices.patch @@ -271,6 +296,14 @@ Patch1013: U_logind_revert_lazy_session_activation_on_non_vt_seats.patch Patch1014: 1014-journald-with-journaling-FS.patch # PATCH-FIX-UPSTREAM build-sys-make-multi-seat-x-optional.patch Patch1015: build-sys-make-multi-seat-x-optional.patch +# PATCH-FIX-SUSE 1016-support-powerfail-with-powerstatus.patch +Patch1016: 1016-support-powerfail-with-powerstatus.patch +# PATCH-FIX-UPSTREAM 1017-skip-native-unit-handling-if-sysv-already-handled.patch +Patch1017: 1017-skip-native-unit-handling-if-sysv-already-handled.patch +# PATCH-FIX-SUSE 1018-Make-LSB-Skripts-know-about-Required-and-Should.patch +Patch1018: 1018-Make-LSB-Skripts-know-about-Required-and-Should.patch +# PATCH-FIX-SUSE 1019-make-completion-smart-to-be-able-to-redirect.patch +Patch1019: 1019-make-completion-smart-to-be-able-to-redirect.patch %description Systemd is a system and service manager, compatible with SysV and LSB @@ -534,6 +567,14 @@ cp %{SOURCE7} m4/ %patch79 -p1 %patch80 -p1 %patch81 -p1 +%patch82 -p1 +%patch83 -p1 +%patch84 -p1 +%patch85 -p1 +%patch86 -p1 +%patch87 -p1 +%patch88 -p1 +%patch89 -p1 # udev patches %patch1001 -p1 @@ -553,6 +594,10 @@ cp %{SOURCE7} m4/ %patch1013 -p1 %patch1014 -p1 %patch1015 -p1 +%patch1016 -p1 +%patch1017 -p1 +%patch1018 -p1 +%patch1019 -p1 # ensure generate files are removed rm -f units/emergency.service @@ -730,6 +775,23 @@ EOF install -m 644 %{S:11} %{buildroot}/%{_prefix}/lib/systemd/system/ ln -s ../after-local.service %{buildroot}/%{_prefix}/lib/systemd/system/multi-user.target.wants/ +# support for SIGPWR handling with /var/run/powerstatus of e.g. powerd +install -m 755 %{S:12} %{buildroot}/%{_prefix}/lib/systemd/ +install -m 644 units/powerfail.service %{buildroot}/%{_prefix}/lib/systemd/system/ +%if ! 0%{?bootstrap} +install -m 644 man/systemd-powerfail.service.8 %{buildroot}/%{_mandir}/man8/ +%endif + +# clean out some completions which requires bash-completion package +%if %{without bash_completion} +for c in %{buildroot}/%{_datadir}/bash-completion/completions/* +do + test -e "$c" || continue + grep -q _init_completion "$c" || continue + rm -vf "$c" +done +%endif + %fdupes -s %{buildroot}%{_mandir} # packaged in systemd-rpm-macros