Dr. Werner Fink 2014-11-13 13:01:19 +00:00 committed by Git OBS Bridge
parent 28c71e0caf
commit 0a63793d21
9 changed files with 239 additions and 509 deletions

View File

@ -1,497 +1,16 @@
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 | 11 + systemd-209/src/core/shutdown.c | 4 ++++
src/core/hdflush.c | 365 ++++++++++++++++++++++++++++++++++++++++++++++ systemd-209/src/systemctl/systemctl.c | 22 +++++++++++++++-------
src/core/hdflush.h | 25 +++ 2 files changed, 19 insertions(+), 7 deletions(-)
src/core/shutdown.c | 12 +
src/systemctl/systemctl.c | 25 ++-
5 files changed, 429 insertions(+), 9 deletions(-)
--- systemd-209/Makefile.am
+++ systemd-209/Makefile.am 2014-01-28 11:06:56.000000000 +0000
@@ -1004,7 +1004,9 @@ libsystemd_core_la_SOURCES = \
src/core/audit-fd.c \
src/core/audit-fd.h \
src/core/async.c \
- src/core/async.h
+ src/core/async.h \
+ src/core/hdflush.c \
+ src/core/hdflush.h
if HAVE_KMOD
libsystemd_core_la_SOURCES += \
@@ -1522,6 +1524,8 @@ systemd_shutdown_SOURCES = \
src/core/shutdown.c \
src/core/mount-setup.c \
src/core/mount-setup.h \
+ src/core/hdflush.c \
+ src/core/hdflush.h \
src/core/killall.h \
src/core/killall.c
@@ -1818,7 +1822,9 @@ systemd_cgroups_agent_LDADD = \
# ------------------------------------------------------------------------------
systemctl_SOURCES = \
- src/systemctl/systemctl.c
+ src/systemctl/systemctl.c \
+ src/core/hdflush.c \
+ src/core/hdflush.h
systemctl_LDADD = \
libsystemd-units.la \
@@ -1826,6 +1832,7 @@ systemctl_LDADD = \
libsystemd-internal.la \
libsystemd-logs.la \
libsystemd-journal-internal.la \
+ libudev-internal.la \
libsystemd-shared.la
# ------------------------------------------------------------------------------
--- systemd-209/src/core/hdflush.c
+++ systemd-209/src/core/hdflush.c 2014-01-28 10:58:56.000000000 +0000
@@ -0,0 +1,367 @@
+/*-*- 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 <http://www.gnu.org/licenses/>.
+***/
+
+/*
+ * 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 <libudev.h>
+#include <limits.h>
+#ifdef LIST_DEBUG
+# include <stdio.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include <sys/ioctl.h>
+#include <linux/hdreg.h>
+#include <linux/fs.h>
+#ifdef WORDS_BIGENDIAN
+# include <byteswap.h>
+#endif
+
+#include "hdflush.h"
+
+/* Used in flush_cache_ext(), compare with <linux/hdreg.h> */
+#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-209/src/core/hdflush.h
+++ systemd-209/src/core/hdflush.h 2014-01-28 11:00:08.000000000 +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 <http://www.gnu.org/licenses/>.
+***/
+
+void hdflush(void);
+void hddown(void);
--- systemd-209/src/core/shutdown.c --- systemd-209/src/core/shutdown.c
+++ systemd-209/src/core/shutdown.c 2014-02-28 11:17:22.000000000 +0000 +++ systemd-209/src/core/shutdown.c 2014-02-28 11:17:22.000000000 +0000
@@ -40,6 +40,7 @@ @@ -449,6 +449,10 @@ int main(int argc, char *argv[]) {
#include "missing.h"
#include "log.h"
#include "fileio.h"
+#include "hdflush.h"
#include "umount.h"
#include "util.h"
#include "mkdir.h"
@@ -225,7 +226,8 @@ int main(int argc, char *argv[]) {
_cleanup_free_ char *cgroup = NULL;
char *arguments[3];
unsigned retries;
- int cmd, r;
+ unsigned cmd;
+ int r;
log_parse_environment();
r = parse_argv(argc, argv);
@@ -388,8 +390,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();
+ }
switch (cmd) {
@@ -449,6 +456,10 @@ int main(int argc, char *argv[]) {
} }
reboot(cmd); reboot(cmd);
+ +
+ if (cmd == RB_POWER_OFF) + if (cmd == (int)RB_POWER_OFF)
+ reboot(RB_HALT_SYSTEM); + reboot(RB_HALT_SYSTEM);
+ +
if (errno == EPERM && in_container) { if (errno == EPERM && in_container) {
@ -499,15 +18,7 @@ systemctl command as well as for the systemd-shutdown utility.
* CAP_SYS_BOOT just exit, this will kill our * CAP_SYS_BOOT just exit, this will kill our
--- systemd-209/src/systemctl/systemctl.c --- systemd-209/src/systemctl/systemctl.c
+++ systemd-209/src/systemctl/systemctl.c 2014-02-28 11:19:35.000000000 +0000 +++ systemd-209/src/systemctl/systemctl.c 2014-02-28 11:19:35.000000000 +0000
@@ -67,6 +67,7 @@ @@ -93,6 +93,7 @@ static bool arg_no_pager = false;
#include "logs-show.h"
#include "socket-util.h"
#include "fileio.h"
+#include "hdflush.h"
#include "env-util.h"
#include "bus-util.h"
#include "bus-message.h"
@@ -93,6 +94,7 @@ static bool arg_no_pager = false;
static bool arg_no_wtmp = false; static bool arg_no_wtmp = false;
static bool arg_no_wall = false; static bool arg_no_wall = false;
static bool arg_no_reload = false; static bool arg_no_reload = false;
@ -515,7 +26,7 @@ systemctl command as well as for the systemd-shutdown utility.
static bool arg_show_types = false; static bool arg_show_types = false;
static bool arg_ignore_inhibitors = false; static bool arg_ignore_inhibitors = false;
static bool arg_dry = false; static bool arg_dry = false;
@@ -5566,6 +5568,7 @@ static int halt_parse_argv(int argc, cha @@ -5578,6 +5579,7 @@ static int halt_parse_argv(int argc, cha
{ "reboot", no_argument, NULL, ARG_REBOOT }, { "reboot", no_argument, NULL, ARG_REBOOT },
{ "force", no_argument, NULL, 'f' }, { "force", no_argument, NULL, 'f' },
{ "wtmp-only", no_argument, NULL, 'w' }, { "wtmp-only", no_argument, NULL, 'w' },
@ -523,7 +34,7 @@ systemctl command as well as for the systemd-shutdown utility.
{ "no-wtmp", no_argument, NULL, 'd' }, { "no-wtmp", no_argument, NULL, 'd' },
{ "no-wall", no_argument, NULL, ARG_NO_WALL }, { "no-wall", no_argument, NULL, ARG_NO_WALL },
{} {}
@@ -5617,10 +5620,13 @@ static int halt_parse_argv(int argc, cha @@ -5629,10 +5631,13 @@ static int halt_parse_argv(int argc, cha
case 'i': case 'i':
case 'h': case 'h':
@ -538,25 +49,25 @@ systemctl command as well as for the systemd-shutdown utility.
case '?': case '?':
return -EINVAL; return -EINVAL;
@@ -6266,16 +6272,24 @@ static int halt_now(enum action a) { @@ -6274,20 +6279,23 @@ done:
static int halt_now(enum action a) {
-/* Make sure C-A-D is handled by the kernel from this
+ if (!arg_no_sync)
+ sync();
+
+ /* Make sure C-A-D is handled by the kernel from this
* point on... */ * point on... */
reboot(RB_ENABLE_CAD); reboot(RB_ENABLE_CAD);
- switch (a) { switch (a) {
+ if (!arg_no_sync)
+ sync();
- case ACTION_HALT: - case ACTION_HALT:
- log_info("Halting."); - log_info("Halting.");
- reboot(RB_HALT_SYSTEM); - reboot(RB_HALT_SYSTEM);
- return -errno; - return -errno;
+ if (a == ACTION_POWEROFF || a == ACTION_HALT) -
+ hddown();
+ else
+ hdflush();
+
+ switch (a) {
case ACTION_POWEROFF: case ACTION_POWEROFF:
log_info("Powering off."); log_info("Powering off.");
reboot(RB_POWER_OFF); reboot(RB_POWER_OFF);

View File

@ -0,0 +1,60 @@
From f6ba8671d83f9fce9a00045d8fa399a1c07ba7fc Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 5 Nov 2014 08:30:52 -0500
Subject: [PATCH] login: rerun vconsole-setup when switching from vgacon to
fbcon
The initialization performed by systemd-vconsole-setup is reset
when changing console drivers (say from vgacon to fbcon), so we
need to run it in that case.
See
http://lists.freedesktop.org/archives/systemd-devel/2014-October/023919.html
http://lists.freedesktop.org/archives/systemd-devel/2014-October/024423.html
http://lists.freedesktop.org/archives/systemd-devel/2014-November/024881.html
This commit adds a udev rule to make systemd-vconsole-setup get run when
the fbcon device becomes available.
(david: moved into new file 90-vconsole.rules instead of 71-seats.rules;
build-failures are on me, not on Ray)
---
Makefile.am | 3 +++
src/vconsole/90-vconsole.rules | 11 +++++++++++
2 files changed, 14 insertions(+)
create mode 100644 src/vconsole/90-vconsole.rules
diff --git Makefile.am Makefile.am
index 3686103..f614b86 100644
--- Makefile.am
+++ Makefile.am
@@ -4439,6 +4439,9 @@ rootlibexec_PROGRAMS += \
nodist_systemunit_DATA += \
units/systemd-vconsole-setup.service
+dist_udevrules_DATA += \
+ src/vconsole/90-vconsole.rules
+
SYSINIT_TARGET_WANTS += \
systemd-vconsole-setup.service
endif
diff --git src/vconsole/90-vconsole.rules src/vconsole/90-vconsole.rules
new file mode 100644
index 0000000..bf6a9ef
--- /dev/null
+++ src/vconsole/90-vconsole.rules
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# 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.
+
+# Kernel resets vconsole state when changing console drivers so run
+# systemd-vconsole-setup when fbcon loads
+
+ACTION=="add", SUBSYSTEM=="graphics", KERNEL=="fbcon", RUN+="/usr/lib/systemd/systemd-vconsole-setup"
--
1.7.9.2

View File

@ -0,0 +1,70 @@
Based on 4b5d8d0f22ae61ceb45a25391354ba53b43ee992 Mon Sep 17 00:00:00 2001
From: Michal Schmidt <mschmidt@redhat.com>
Date: Thu, 6 Nov 2014 22:24:13 +0100
Subject: [PATCH] shutdown: fix arguments to /run/initramfs/shutdown
Our initrd interface specifies that the verb is in argv[1].
This is where systemd passes it to systemd-shutdown, but getopt
permutes argv[]. This confuses dracut's shutdown script:
Shutdown called with argument '--log-level'. Rebooting!
getopt can be convinced to not permute argv[] by having '-' as the first
character of optstring. Let's use it. This requires changing the way
non-option arguments (in our case, the verb) are processed.
This fixes a bug where the system would reboot instead of powering off.
---
src/core/shutdown.c | 24 +++++++++++-------------
1 file changed, 11 insertions(+), 13 deletions(-)
--- src/core/shutdown.c
+++ src/core/shutdown.c 2014-11-10 14:14:20.869519112 +0000
@@ -75,9 +75,9 @@ static int parse_argv(int argc, char *ar
assert(argc >= 1);
assert(argv);
- opterr = 0;
-
- while ((c = getopt_long(argc, argv, ":", options, NULL)) >= 0)
+ /* "-" prevents getopt from permuting argv[] and moving the verb away
+ * from argv[1]. Our interface to initrd promises it'll be there. */
+ while ((c = getopt_long(argc, argv, "-", options, NULL)) >= 0)
switch (c) {
case ARG_LOG_LEVEL:
@@ -115,27 +115,25 @@ static int parse_argv(int argc, char *ar
break;
- case '?':
- log_error("Unknown option %s.", argv[optind-1]);
- return -EINVAL;
+ case '\001':
+ if (!arg_verb)
+ arg_verb = optarg;
+ else
+ log_error("Excess arguments, ignoring");
+ break;
- case ':':
- log_error("Missing argument to %s.", argv[optind-1]);
+ case '?':
return -EINVAL;
default:
assert_not_reached("Unhandled option code.");
}
- if (optind >= argc) {
+ if (!arg_verb) {
log_error("Verb argument missing.");
return -EINVAL;
}
- arg_verb = argv[optind];
-
- if (optind + 1 < argc)
- log_error("Excess arguments, ignoring");
return 0;
}

View File

@ -0,0 +1,29 @@
Based on 144b3d9e093dd9310cd9590bec039dc43a7e2ad6 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 7 Nov 2014 16:34:00 +0100
Subject: [PATCH] utf8: when looking at the next unichar, honour the size
parameter, in utf8_is_printable_newline()
---
src/shared/utf8.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
--- src/shared/utf8.c
+++ src/shared/utf8.c 2014-11-10 14:20:28.094539264 +0000
@@ -143,9 +143,14 @@ bool utf8_is_printable_newline(const cha
for (p = (const uint8_t*) str; length;) {
int encoded_len = utf8_encoded_valid_unichar((const char *)p);
- int val = utf8_encoded_to_unichar((const char*)p);
+ int val;
- if (encoded_len < 0 || val < 0 || is_unicode_control(val) ||
+ if (encoded_len < 0 ||
+ (size_t) encoded_len > length)
+ return false;
+
+ val = utf8_encoded_to_unichar((const char*)p);
+ if (val < 0 || is_unicode_control(val) ||
(!newline && val == '\n'))
return false;

View File

@ -44,7 +44,7 @@ Index: systemd-210/src/fstab-generator/fstab-generator.c
+ } + }
+ +
+ if (strcmp((what + 12), name) == 0) { + if (strcmp((what + 12), name) == 0) {
+ if (strstr(options, "noauto")) + if (options && strstr(options, "noauto"))
+ return 0; + return 0;
+ +
+ return 1; + return 1;

View File

@ -1,3 +1,11 @@
-------------------------------------------------------------------
Thu Nov 13 12:59:05 UTC 2014 - werner@suse.de
- Change patch 0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch
to skip hdflush as well as hddown but only use halt as fallback
for poweroff as well as synch in systemctl before any reboot command
(compare with commit 4a3ad39957399c4a30fc472a804e72907ecaa4f9)
------------------------------------------------------------------- -------------------------------------------------------------------
Thu Nov 13 09:54:35 UTC 2014 - rmilasan@suse.com Thu Nov 13 09:54:35 UTC 2014 - rmilasan@suse.com
@ -5,12 +13,25 @@ Thu Nov 13 09:54:35 UTC 2014 - rmilasan@suse.com
'rotational' equals 0, usually SSDs (bnc#904517). 'rotational' equals 0, usually SSDs (bnc#904517).
Add 1095-set-ssd-disk-to-use-deadline-scheduler.patch Add 1095-set-ssd-disk-to-use-deadline-scheduler.patch
-------------------------------------------------------------------
Thu Nov 13 07:50:49 UTC 2014 - thomas.blume@suse.com
- fix systemd-fstab-generator crypttab parsing (bnc#903963)
------------------------------------------------------------------- -------------------------------------------------------------------
Tue Nov 11 19:10:35 UTC 2014 - gber@opensuse.org Tue Nov 11 19:10:35 UTC 2014 - gber@opensuse.org
- Add pm-utils-hooks-compat.sh in order to run pm-utils sleep hooks - Add pm-utils-hooks-compat.sh in order to run pm-utils sleep hooks
from systemd (boo#904828) from systemd (boo#904828)
-------------------------------------------------------------------
Mon Nov 10 14:23:00 UTC 2014 - werner@suse.de
- Add upstream patches
0001-login-rerun-vconsole-setup-when-switching-from-vgaco.patch
0002-shutdown-fix-arguments-to-run-initramfs-shutdown.patch
0003-utf8-when-looking-at-the-next-unichar-honour-the-siz.patch
------------------------------------------------------------------- -------------------------------------------------------------------
Mon Nov 10 12:39:35 UTC 2014 - werner@suse.de Mon Nov 10 12:39:35 UTC 2014 - werner@suse.de

View File

@ -1029,6 +1029,12 @@ Patch498: 0008-journald-fix-memory-leak-on-error-path.patch
Patch499: 0009-units-make-systemd-journald.service-Type-notify.patch Patch499: 0009-units-make-systemd-journald.service-Type-notify.patch
# PATCH-FIX-UPSTREAM added at 2014/11/07 # PATCH-FIX-UPSTREAM added at 2014/11/07
Patch500: 0010-hwdb-Update-database-of-Bluetooth-company-identifier.patch Patch500: 0010-hwdb-Update-database-of-Bluetooth-company-identifier.patch
# PATCH-FIX-UPSTREAM added at 2014/11/10
Patch501: 0001-login-rerun-vconsole-setup-when-switching-from-vgaco.patch
# PATCH-FIX-UPSTREAM added at 2014/11/10
Patch502: 0002-shutdown-fix-arguments-to-run-initramfs-shutdown.patch
# PATCH-FIX-UPSTREAM added at 2014/11/10
Patch503: 0003-utf8-when-looking-at-the-next-unichar-honour-the-siz.patch
# UDEV PATCHES # UDEV PATCHES
# ============ # ============
@ -1888,6 +1894,9 @@ cp %{SOURCE7} m4/
%patch498 -p0 %patch498 -p0
%patch499 -p0 %patch499 -p0
%patch500 -p0 %patch500 -p0
%patch501 -p0
%patch502 -p0
%patch503 -p0
# udev patches # udev patches
%patch1001 -p1 %patch1001 -p1

View File

@ -1,3 +1,11 @@
-------------------------------------------------------------------
Thu Nov 13 12:59:05 UTC 2014 - werner@suse.de
- Change patch 0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch
to skip hdflush as well as hddown but only use halt as fallback
for poweroff as well as synch in systemctl before any reboot command
(compare with commit 4a3ad39957399c4a30fc472a804e72907ecaa4f9)
------------------------------------------------------------------- -------------------------------------------------------------------
Thu Nov 13 09:54:35 UTC 2014 - rmilasan@suse.com Thu Nov 13 09:54:35 UTC 2014 - rmilasan@suse.com
@ -5,12 +13,25 @@ Thu Nov 13 09:54:35 UTC 2014 - rmilasan@suse.com
'rotational' equals 0, usually SSDs (bnc#904517). 'rotational' equals 0, usually SSDs (bnc#904517).
Add 1095-set-ssd-disk-to-use-deadline-scheduler.patch Add 1095-set-ssd-disk-to-use-deadline-scheduler.patch
-------------------------------------------------------------------
Thu Nov 13 07:50:49 UTC 2014 - thomas.blume@suse.com
- fix systemd-fstab-generator crypttab parsing (bnc#903963)
------------------------------------------------------------------- -------------------------------------------------------------------
Tue Nov 11 19:10:35 UTC 2014 - gber@opensuse.org Tue Nov 11 19:10:35 UTC 2014 - gber@opensuse.org
- Add pm-utils-hooks-compat.sh in order to run pm-utils sleep hooks - Add pm-utils-hooks-compat.sh in order to run pm-utils sleep hooks
from systemd (boo#904828) from systemd (boo#904828)
-------------------------------------------------------------------
Mon Nov 10 14:23:00 UTC 2014 - werner@suse.de
- Add upstream patches
0001-login-rerun-vconsole-setup-when-switching-from-vgaco.patch
0002-shutdown-fix-arguments-to-run-initramfs-shutdown.patch
0003-utf8-when-looking-at-the-next-unichar-honour-the-siz.patch
------------------------------------------------------------------- -------------------------------------------------------------------
Mon Nov 10 12:39:35 UTC 2014 - werner@suse.de Mon Nov 10 12:39:35 UTC 2014 - werner@suse.de

View File

@ -1024,6 +1024,12 @@ Patch498: 0008-journald-fix-memory-leak-on-error-path.patch
Patch499: 0009-units-make-systemd-journald.service-Type-notify.patch Patch499: 0009-units-make-systemd-journald.service-Type-notify.patch
# PATCH-FIX-UPSTREAM added at 2014/11/07 # PATCH-FIX-UPSTREAM added at 2014/11/07
Patch500: 0010-hwdb-Update-database-of-Bluetooth-company-identifier.patch Patch500: 0010-hwdb-Update-database-of-Bluetooth-company-identifier.patch
# PATCH-FIX-UPSTREAM added at 2014/11/10
Patch501: 0001-login-rerun-vconsole-setup-when-switching-from-vgaco.patch
# PATCH-FIX-UPSTREAM added at 2014/11/10
Patch502: 0002-shutdown-fix-arguments-to-run-initramfs-shutdown.patch
# PATCH-FIX-UPSTREAM added at 2014/11/10
Patch503: 0003-utf8-when-looking-at-the-next-unichar-honour-the-siz.patch
# UDEV PATCHES # UDEV PATCHES
# ============ # ============
@ -1883,6 +1889,9 @@ cp %{SOURCE7} m4/
%patch498 -p0 %patch498 -p0
%patch499 -p0 %patch499 -p0
%patch500 -p0 %patch500 -p0
%patch501 -p0
%patch502 -p0
%patch503 -p0
# udev patches # udev patches
%patch1001 -p1 %patch1001 -p1