[lfs-patches] r3064 - trunk/systemd

krejzi at higgs.linuxfromscratch.org krejzi at higgs.linuxfromscratch.org
Fri Nov 28 06:38:27 PST 2014


Author: krejzi
Date: Fri Nov 28 06:38:27 2014
New Revision: 3064

Log:
Added systemd patch.

Added:
   trunk/systemd/systemd-217-upstream_fixes-1.patch

Added: trunk/systemd/systemd-217-upstream_fixes-1.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/systemd/systemd-217-upstream_fixes-1.patch	Fri Nov 28 06:38:27 2014	(r3064)
@@ -0,0 +1,807 @@
+Submitted By:            Armin K. <krejzi at email dot com>
+Date:                    2014-11-28
+Initial Package Version: 217
+Upstream Status:         Fixed
+Origin:                  Upstream
+Description:             Various post release fixes from the v217-stable repository.
+
+--- a/hwdb/20-bluetooth-vendor-product.hwdb	2014-10-07 15:59:01.416605635 +0200
++++ b/hwdb/20-bluetooth-vendor-product.hwdb	2014-11-28 14:56:53.857865437 +0100
+@@ -1166,3 +1166,60 @@
+ 
+ bluetooth:v0182*
+  ID_VENDOR_FROM_DATABASE=HOP Ubiquitous
++
++bluetooth:v0183*
++ ID_VENDOR_FROM_DATABASE=To Be Assigned
++
++bluetooth:v0184*
++ ID_VENDOR_FROM_DATABASE=Nectar
++
++bluetooth:v0185*
++ ID_VENDOR_FROM_DATABASE=bel'apps LLC
++
++bluetooth:v0186*
++ ID_VENDOR_FROM_DATABASE=CORE Lighting Ltd
++
++bluetooth:v0187*
++ ID_VENDOR_FROM_DATABASE=Seraphim Sense Ltd
++
++bluetooth:v0188*
++ ID_VENDOR_FROM_DATABASE=Unico RBC
++
++bluetooth:v0189*
++ ID_VENDOR_FROM_DATABASE=Physical Enterprises Inc.
++
++bluetooth:v018A*
++ ID_VENDOR_FROM_DATABASE=Able Trend Technology Limited
++
++bluetooth:v018B*
++ ID_VENDOR_FROM_DATABASE=Konica Minolta, Inc.
++
++bluetooth:v018C*
++ ID_VENDOR_FROM_DATABASE=Wilo SE
++
++bluetooth:v018D*
++ ID_VENDOR_FROM_DATABASE=Extron Design Services
++
++bluetooth:v018E*
++ ID_VENDOR_FROM_DATABASE=Fitbit, Inc.
++
++bluetooth:v018F*
++ ID_VENDOR_FROM_DATABASE=Fireflies Systems
++
++bluetooth:v0190*
++ ID_VENDOR_FROM_DATABASE=Intelletto Technologies Inc.
++
++bluetooth:v0191*
++ ID_VENDOR_FROM_DATABASE=FDK CORPORATION
++
++bluetooth:v0192*
++ ID_VENDOR_FROM_DATABASE=Cloudleaf, Inc
++
++bluetooth:v0193*
++ ID_VENDOR_FROM_DATABASE=Maveric Automation LLC
++
++bluetooth:v0194*
++ ID_VENDOR_FROM_DATABASE=Acoustic Stream Corporation
++
++bluetooth:v0195*
++ ID_VENDOR_FROM_DATABASE=Zuli
+--- a/hwdb/60-keyboard.hwdb	2014-10-22 17:11:04.000077227 +0200
++++ b/hwdb/60-keyboard.hwdb	2014-11-28 14:56:53.851865373 +0100
+@@ -230,6 +230,11 @@
+ keyboard:dmi:bvn*:bvr*:bd*:svnDell*:pnInspiron*1210:pvr*
+  KEYBOARD_KEY_84=wlan
+ 
++# Dell Inspiron 1520
++keyboard:dmi:bvn*:bvr*:bd*:svnDell*:pnInspiron*1520:pvr*
++ KEYBOARD_KEY_85=unknown  # Brightness Down, also emitted by acpi-video, ignore
++ KEYBOARD_KEY_86=unknown  # Brightness Up, also emitted by acpi-video, ignore
++
+ # Latitude XT2
+ keyboard:dmi:bvn*:bvr*:bd*:svnDell*:pnLatitude*XT2:pvr*
+  KEYBOARD_KEY_9b=up                                     # tablet rocker up
+--- a/src/core/machine-id-setup.c	2014-08-21 17:24:21.130557087 +0200
++++ b/src/core/machine-id-setup.c	2014-11-28 14:56:53.861865480 +0100
+@@ -162,7 +162,7 @@
+ int machine_id_setup(const char *root) {
+         const char *etc_machine_id, *run_machine_id;
+         _cleanup_close_ int fd = -1;
+-        bool writable = false;
++        bool writable = true;
+         struct stat st;
+         char id[34]; /* 32 + \n + \0 */
+         int r;
+@@ -186,12 +186,19 @@
+ 
+                 mkdir_parents(etc_machine_id, 0755);
+                 fd = open(etc_machine_id, O_RDWR|O_CREAT|O_CLOEXEC|O_NOCTTY, 0444);
+-                if (fd >= 0)
+-                        writable = true;
+-                else {
++                if (fd < 0) {
++                        int old_errno = errno;
++
+                         fd = open(etc_machine_id, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+                         if (fd < 0) {
+-                                log_error("Cannot open %s: %m", etc_machine_id);
++                                if (old_errno == EROFS && errno == ENOENT)
++                                        log_error("System cannot boot: Missing /etc/machine-id and /etc is mounted read-only.\n"
++                                                  "Booting up is supported only when:\n"
++                                                  "1) /etc/machine-id exists and is populated.\n"
++                                                  "2) /etc/machine-id exists and is empty.\n"
++                                                  "3) /etc/machine-id is missing and /etc is writable.\n");
++                                else
++                                        log_error("Cannot open %s: %m", etc_machine_id);
+                                 return -errno;
+                         }
+ 
+--- a/src/core/manager.c	2014-10-28 17:25:51.560723266 +0100
++++ b/src/core/manager.c	2014-11-28 14:56:53.874865620 +0100
+@@ -662,9 +662,11 @@
+                         return -errno;
+                 }
+ 
+-                if (m->running_as == SYSTEMD_SYSTEM)
++                if (m->running_as == SYSTEMD_SYSTEM) {
+                         m->notify_socket = strdup("/run/systemd/notify");
+-                else {
++                        if (!m->notify_socket)
++                                return log_oom();
++                } else {
+                         const char *e;
+ 
+                         e = getenv("XDG_RUNTIME_DIR");
+@@ -674,9 +676,11 @@
+                         }
+ 
+                         m->notify_socket = strappend(e, "/systemd/notify");
++                        if (!m->notify_socket)
++                                return log_oom();
++
++                        mkdir_parents_label(m->notify_socket, 0755);
+                 }
+-                if (!m->notify_socket)
+-                        return log_oom();
+ 
+                 strncpy(sa.un.sun_path, m->notify_socket, sizeof(sa.un.sun_path)-1);
+                 r = bind(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path));
+@@ -2584,45 +2588,13 @@
+         return unit_inactive_or_pending(u);
+ }
+ 
+-void manager_check_finished(Manager *m) {
++static void manager_notify_finished(Manager *m) {
+         char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
+         usec_t firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec;
+-        Unit *u = NULL;
+-        Iterator i;
+-
+-        assert(m);
+-
+-        if (m->n_running_jobs == 0)
+-                m->jobs_in_progress_event_source = sd_event_source_unref(m->jobs_in_progress_event_source);
+-
+-        if (hashmap_size(m->jobs) > 0) {
+-
+-                if (m->jobs_in_progress_event_source)
+-                        sd_event_source_set_time(m->jobs_in_progress_event_source, now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC);
+-
+-                return;
+-        }
+-
+-        manager_flip_auto_status(m, false);
+-
+-        /* Notify Type=idle units that we are done now */
+-        m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
+-        manager_close_idle_pipe(m);
+-
+-        /* Turn off confirm spawn now */
+-        m->confirm_spawn = false;
+ 
+-        /* No need to update ask password status when we're going non-interactive */
+-        manager_close_ask_password(m);
+-
+-        /* This is no longer the first boot */
+-        manager_set_first_boot(m, false);
+-
+-        if (dual_timestamp_is_set(&m->finish_timestamp))
++        if (m->test_run)
+                 return;
+ 
+-        dual_timestamp_get(&m->finish_timestamp);
+-
+         if (m->running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0) {
+ 
+                 /* Note that m->kernel_usec.monotonic is always at 0,
+@@ -2677,10 +2649,6 @@
+                            NULL);
+         }
+ 
+-        SET_FOREACH(u, m->startup_units, i)
+-                if (u->cgroup_path)
+-                        cgroup_context_apply(unit_get_cgroup_context(u), unit_get_cgroup_mask(u), u->cgroup_path, manager_state(m));
+-
+         bus_manager_send_finished(m, firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec);
+ 
+         sd_notifyf(false,
+@@ -2689,6 +2657,50 @@
+                    format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC));
+ }
+ 
++void manager_check_finished(Manager *m) {
++        Unit *u = NULL;
++        Iterator i;
++
++        assert(m);
++
++        if (m->n_running_jobs == 0)
++                m->jobs_in_progress_event_source = sd_event_source_unref(m->jobs_in_progress_event_source);
++
++        if (hashmap_size(m->jobs) > 0) {
++
++                if (m->jobs_in_progress_event_source)
++                        sd_event_source_set_time(m->jobs_in_progress_event_source, now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC);
++
++                return;
++        }
++
++        manager_flip_auto_status(m, false);
++
++        /* Notify Type=idle units that we are done now */
++        m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
++        manager_close_idle_pipe(m);
++
++        /* Turn off confirm spawn now */
++        m->confirm_spawn = false;
++
++        /* No need to update ask password status when we're going non-interactive */
++        manager_close_ask_password(m);
++
++        /* This is no longer the first boot */
++        manager_set_first_boot(m, false);
++
++        if (dual_timestamp_is_set(&m->finish_timestamp))
++                return;
++
++        dual_timestamp_get(&m->finish_timestamp);
++
++        manager_notify_finished(m);
++
++        SET_FOREACH(u, m->startup_units, i)
++                if (u->cgroup_path)
++                        cgroup_context_apply(unit_get_cgroup_context(u), unit_get_cgroup_mask(u), u->cgroup_path, manager_state(m));
++}
++
+ static int create_generator_dir(Manager *m, char **generator, const char *name) {
+         char *p;
+         int r;
+--- a/src/core/timer.c	2014-10-07 15:59:01.449587235 +0200
++++ b/src/core/timer.c	2014-11-28 14:56:53.877865652 +0100
+@@ -521,6 +521,7 @@
+ 
+ static int timer_start(Unit *u) {
+         Timer *t = TIMER(u);
++        TimerValue *v;
+ 
+         assert(t);
+         assert(t->state == TIMER_DEAD || t->state == TIMER_FAILED);
+@@ -530,6 +531,11 @@
+ 
+         t->last_trigger = DUAL_TIMESTAMP_NULL;
+ 
++        /* Reenable all timers that depend on unit activation time */
++        LIST_FOREACH(value, v, t->values)
++                if (v->base == TIMER_ACTIVE)
++                        v->disabled = false;
++
+         if (t->stamp_path) {
+                 struct stat st;
+ 
+--- a/src/core/transaction.c	2014-10-07 15:59:01.449587235 +0200
++++ b/src/core/transaction.c	2014-11-28 14:56:53.865865523 +0100
+@@ -377,9 +377,9 @@
+                 for (k = from; k; k = ((k->generation == generation && k->marker != k) ? k->marker : NULL)) {
+ 
+                         /* logging for j not k here here to provide consistent narrative */
+-                        log_info_unit(j->unit->id,
+-                                      "Found dependency on %s/%s",
+-                                      k->unit->id, job_type_to_string(k->type));
++                        log_warning_unit(j->unit->id,
++                                         "Found dependency on %s/%s",
++                                         k->unit->id, job_type_to_string(k->type));
+ 
+                         if (!delete && hashmap_get(tr->jobs, k->unit) &&
+                             !unit_matters_to_anchor(k->unit, k)) {
+--- a/src/journal/journald-server.c	2014-10-27 12:48:29.292966277 +0100
++++ b/src/journal/journald-server.c	2014-11-28 14:56:53.869865566 +0100
+@@ -1655,6 +1655,7 @@
+         free(s->buffer);
+         free(s->tty_path);
+         free(s->cgroup_root);
++        free(s->hostname_field);
+ 
+         if (s->mmap)
+                 mmap_cache_unref(s->mmap);
+--- a/src/journal/journal-vacuum.c	2014-07-29 19:51:00.720285727 +0200
++++ b/src/journal/journal-vacuum.c	2014-11-28 14:56:53.869865566 +0100
+@@ -275,7 +275,11 @@
+ 
+                 patch_realtime(directory, p, &st, &realtime);
+ 
+-                GREEDY_REALLOC(list, n_allocated, n_list + 1);
++                if (!GREEDY_REALLOC(list, n_allocated, n_list + 1)) {
++                        free(p);
++                        r = -ENOMEM;
++                        goto finish;
++                }
+ 
+                 list[n_list].filename = p;
+                 list[n_list].usage = 512UL * (uint64_t) st.st_blocks;
+--- a/src/libsystemd/sd-bus/bus-match.c	2014-10-07 15:59:01.463579428 +0200
++++ b/src/libsystemd/sd-bus/bus-match.c	2014-11-28 14:56:53.845865308 +0100
+@@ -537,7 +537,7 @@
+         else if (BUS_MATCH_CAN_HASH(t))
+                 n = hashmap_get(c->compare.children, value_str);
+         else {
+-                for (n = c->child; !value_node_same(n, t, value_u8, value_str); n = n->next)
++                for (n = c->child; n && !value_node_same(n, t, value_u8, value_str); n = n->next)
+                         ;
+         }
+ 
+--- a/src/libsystemd-network/sd-dhcp6-client.c	2014-10-13 17:19:31.020675595 +0200
++++ b/src/libsystemd-network/sd-dhcp6-client.c	2014-11-28 14:56:53.859865459 +0100
+@@ -200,19 +200,19 @@
+ 
+         switch (type) {
+         case DHCP6_DUID_LLT:
+-                if (duid_len <= sizeof(client->duid.llt))
++                if (duid_len <= sizeof(client->duid.llt) - 2)
+                         return -EINVAL;
+                 break;
+         case DHCP6_DUID_EN:
+-                if (duid_len != sizeof(client->duid.en))
++                if (duid_len != sizeof(client->duid.en) - 2)
+                         return -EINVAL;
+                 break;
+         case DHCP6_DUID_LL:
+-                if (duid_len <= sizeof(client->duid.ll))
++                if (duid_len <= sizeof(client->duid.ll) - 2)
+                         return -EINVAL;
+                 break;
+         case DHCP6_DUID_UUID:
+-                if (duid_len != sizeof(client->duid.uuid))
++                if (duid_len != sizeof(client->duid.uuid) - 2)
+                         return -EINVAL;
+                 break;
+         default:
+@@ -222,7 +222,7 @@
+ 
+         client->duid.raw.type = htobe16(type);
+         memcpy(&client->duid.raw.data, duid, duid_len);
+-        client->duid_len = duid_len;
++        client->duid_len = duid_len + 2;  /* +2 for sizeof(type) */
+ 
+         return 0;
+ }
+--- a/src/libsystemd-network/sd-dhcp-client.c	2014-10-13 17:19:31.019675598 +0200
++++ b/src/libsystemd-network/sd-dhcp-client.c	2014-11-28 14:56:53.852865383 +0100
+@@ -1269,6 +1269,9 @@
+                 if (r >= 0) {
+                         client->timeout_resend =
+                                 sd_event_source_unref(client->timeout_resend);
++                        client->receive_message =
++                                sd_event_source_unref(client->receive_message);
++                        client->fd = asynchronous_close(client->fd);
+ 
+                         if (IN_SET(client->state, DHCP_STATE_REQUESTING,
+                                    DHCP_STATE_REBOOTING))
+--- a/src/libudev/libudev.c	2014-03-18 18:05:49.964378252 +0100
++++ b/src/libudev/libudev.c	2014-11-28 14:56:53.864865512 +0100
+@@ -119,7 +119,7 @@
+ {
+         struct udev *udev;
+         const char *env;
+-        FILE *f;
++        _cleanup_fclose_ FILE *f = NULL;
+ 
+         udev = new0(struct udev, 1);
+         if (udev == NULL)
+@@ -132,7 +132,7 @@
+         f = fopen("/etc/udev/udev.conf", "re");
+         if (f != NULL) {
+                 char line[UTIL_LINE_SIZE];
+-                int line_nr = 0;
++                unsigned line_nr = 0;
+ 
+                 while (fgets(line, sizeof(line), f)) {
+                         size_t len;
+@@ -153,7 +153,7 @@
+                         /* split key/value */
+                         val = strchr(key, '=');
+                         if (val == NULL) {
+-                                udev_err(udev, "missing <key>=<value> in /etc/udev/udev.conf[%i]; skip line\n", line_nr);
++                                udev_err(udev, "/etc/udev/udev.conf:%u: missing assignment,  skipping line.\n", line_nr);
+                                 continue;
+                         }
+                         val[0] = '\0';
+@@ -185,7 +185,7 @@
+                         /* unquote */
+                         if (val[0] == '"' || val[0] == '\'') {
+                                 if (val[len-1] != val[0]) {
+-                                        udev_err(udev, "inconsistent quoting in /etc/udev/udev.conf[%i]; skip line\n", line_nr);
++                                        udev_err(udev, "/etc/udev/udev.conf:%u: inconsistent quoting, skipping line.\n", line_nr);
+                                         continue;
+                                 }
+                                 val[len-1] = '\0';
+@@ -193,17 +193,29 @@
+                         }
+ 
+                         if (streq(key, "udev_log")) {
+-                                udev_set_log_priority(udev, util_log_priority(val));
++                                int prio;
++
++                                prio = util_log_priority(val);
++                                if (prio < 0)
++                                        udev_err(udev, "/etc/udev/udev.conf:%u: invalid logging level '%s', ignoring.\n", line_nr, val);
++                                else
++                                        udev_set_log_priority(udev, prio);
+                                 continue;
+                         }
+                 }
+-                fclose(f);
+         }
+ 
+         /* environment overrides config */
+         env = secure_getenv("UDEV_LOG");
+-        if (env != NULL)
+-                udev_set_log_priority(udev, util_log_priority(env));
++        if (env != NULL) {
++                int prio;
++
++                prio = util_log_priority(env);
++                if (prio < 0)
++                        udev_err(udev, "$UDEV_LOG specifies invalid logging level '%s', ignoring.\n", env);
++                else
++                        udev_set_log_priority(udev, prio);
++        }
+ 
+         return udev;
+ }
+--- a/src/libudev/libudev-util.c	2014-10-07 15:59:01.469576083 +0200
++++ b/src/libudev/libudev-util.c	2014-11-28 14:56:53.858865448 +0100
+@@ -159,9 +159,13 @@
+         char *endptr;
+         int prio;
+ 
+-        prio = strtol(priority, &endptr, 10);
+-        if (endptr[0] == '\0' || isspace(endptr[0]))
+-                return prio;
++        prio = strtoul(priority, &endptr, 10);
++        if (endptr[0] == '\0' || isspace(endptr[0])) {
++                if (prio >= 0 && prio <= 7)
++                        return prio;
++                else
++                        return -ERANGE;
++        }
+ 
+         return log_level_from_string(priority);
+ }
+--- a/src/nspawn/nspawn.c	2014-10-27 12:48:29.295966274 +0100
++++ b/src/nspawn/nspawn.c	2014-11-28 14:56:53.856865426 +0100
+@@ -758,7 +758,7 @@
+                  * and char devices. */
+                 if (S_ISDIR(source_st.st_mode)) {
+                         r = mkdir_label(where, 0755);
+-                        if (r < 0) {
++                        if (r < 0 && errno != EEXIST) {
+                                 log_error("Failed to create mount point %s: %s", where, strerror(-r));
+ 
+                                 return r;
+@@ -2931,33 +2931,30 @@
+         }
+ 
+         switch (status.si_code) {
++
+         case CLD_EXITED:
+                 r = status.si_status;
+                 if (r == 0) {
+                         if (!arg_quiet)
+-                                log_debug("Container %s exited successfully.",
+-                                          arg_machine);
++                                log_debug("Container %s exited successfully.", arg_machine);
+ 
+                         *container = CONTAINER_TERMINATED;
+-                } else {
+-                        log_error("Container %s failed with error code %i.",
+-                                  arg_machine, status.si_status);
+-                }
++                } else
++                        log_error("Container %s failed with error code %i.", arg_machine, status.si_status);
++
+                 break;
+ 
+         case CLD_KILLED:
+                 if (status.si_status == SIGINT) {
+                         if (!arg_quiet)
+-                                log_info("Container %s has been shut down.",
+-                                         arg_machine);
++                                log_info("Container %s has been shut down.", arg_machine);
+ 
+                         *container = CONTAINER_TERMINATED;
+                         r = 0;
+                         break;
+                 } else if (status.si_status == SIGHUP) {
+                         if (!arg_quiet)
+-                                log_info("Container %s is being rebooted.",
+-                                         arg_machine);
++                                log_info("Container %s is being rebooted.", arg_machine);
+ 
+                         *container = CONTAINER_REBOOTED;
+                         r = 0;
+@@ -2966,15 +2963,13 @@
+                 /* CLD_KILLED fallthrough */
+ 
+         case CLD_DUMPED:
+-                log_error("Container %s terminated by signal %s.",
+-                          arg_machine, signal_to_string(status.si_status));
+-                r = -1;
++                log_error("Container %s terminated by signal %s.", arg_machine, signal_to_string(status.si_status));
++                r = -EIO;
+                 break;
+ 
+         default:
+-                log_error("Container %s failed due to unknown reason.",
+-                          arg_machine);
+-                r = -1;
++                log_error("Container %s failed due to unknown reason.", arg_machine);
++                r = -EIO;
+                 break;
+         }
+ 
+--- a/src/shared/copy.h	2014-07-03 17:08:58.551812677 +0200
++++ b/src/shared/copy.h	2014-11-28 14:56:53.853865394 +0100
+@@ -21,6 +21,9 @@
+   along with systemd; If not, see <http://www.gnu.org/licenses/>.
+ ***/
+ 
++#include <stdbool.h>
++#include <sys/types.h>
++
+ int copy_file(const char *from, const char *to, int flags, mode_t mode);
+ int copy_tree(const char *from, const char *to, bool merge);
+ int copy_bytes(int fdf, int fdt, off_t max_bytes);
+--- a/src/shared/install.c	2014-10-27 12:48:29.296966273 +0100
++++ b/src/shared/install.c	2014-11-28 14:56:53.854865405 +0100
+@@ -1620,12 +1620,10 @@
+         STRV_FOREACH(i, files) {
+                 UnitFileState state;
+ 
++                /* We only want to know if this unit is masked, so we ignore
++                 * errors from unit_file_get_state, deferring other checks.
++                 * This allows templated units to be enabled on the fly. */
+                 state = unit_file_get_state(scope, root_dir, *i);
+-                if (state < 0) {
+-                        log_error("Failed to get unit file state for %s: %s", *i, strerror(-state));
+-                        return state;
+-                }
+-
+                 if (state == UNIT_FILE_MASKED || state == UNIT_FILE_MASKED_RUNTIME) {
+                         log_error("Failed to enable unit: Unit %s is masked", *i);
+                         return -ENOTSUP;
+--- a/src/shared/locale-util.h	2014-10-07 15:59:01.479570507 +0200
++++ b/src/shared/locale-util.h	2014-11-28 14:56:53.853865394 +0100
+@@ -21,6 +21,10 @@
+   along with systemd; If not, see <http://www.gnu.org/licenses/>.
+ ***/
+ 
++#include <stdbool.h>
++
++#include "macro.h"
++
+ typedef enum LocaleVariable {
+         /* We don't list LC_ALL here on purpose. People should be
+          * using LANG instead. */
+--- a/src/shared/logs-show.c	2014-10-22 23:22:47.769220675 +0200
++++ b/src/shared/logs-show.c	2014-11-28 14:56:53.871865587 +0100
+@@ -365,7 +365,7 @@
+                 fprintf(f, " %.*s", (int) comm_len, comm);
+                 n += comm_len + 1;
+         } else
+-                fputc(' ', f);
++                fputs(" unknown", f);
+ 
+         if (pid && shall_print(pid, pid_len, flags)) {
+                 fprintf(f, "[%.*s]", (int) pid_len, pid);
+--- a/src/systemctl/systemctl.c	2014-10-17 13:49:08.074598460 +0200
++++ b/src/systemctl/systemctl.c	2014-11-28 14:56:53.876865641 +0100
+@@ -301,21 +301,37 @@
+ }
+ 
+ static bool output_show_unit(const UnitInfo *u, char **patterns) {
+-        const char *dot;
+-
+         if (!strv_isempty(patterns)) {
+                 char **pattern;
+ 
+                 STRV_FOREACH(pattern, patterns)
+                         if (fnmatch(*pattern, u->id, FNM_NOESCAPE) == 0)
+-                                return true;
++                                goto next;
+                 return false;
+         }
+ 
+-        return (!arg_types || ((dot = strrchr(u->id, '.')) &&
+-                               strv_find(arg_types, dot+1))) &&
+-                (arg_all || !(streq(u->active_state, "inactive")
+-                              || u->following[0]) || u->job_id > 0);
++next:
++        if (arg_types) {
++                const char *dot;
++
++                dot = strrchr(u->id, '.');
++                if (!dot)
++                        return false;
++
++                if (!strv_find(arg_types, dot+1))
++                        return false;
++        }
++
++        if (arg_all)
++                return true;
++
++        if (u->job_id > 0)
++                return true;
++
++        if (streq(u->active_state, "inactive") || u->following[0])
++                return false;
++
++        return true;
+ }
+ 
+ static int output_units_list(const UnitInfo *unit_infos, unsigned c) {
+@@ -1231,18 +1247,33 @@
+ }
+ 
+ static bool output_show_unit_file(const UnitFileList *u, char **patterns) {
+-        const char *dot;
+-
+         if (!strv_isempty(patterns)) {
+                 char **pattern;
+ 
+                 STRV_FOREACH(pattern, patterns)
+                         if (fnmatch(*pattern, basename(u->path), FNM_NOESCAPE) == 0)
+-                                return true;
++                                goto next;
+                 return false;
+         }
+ 
+-        return !arg_types || ((dot = strrchr(u->path, '.')) && strv_find(arg_types, dot+1));
++next:
++        if (!strv_isempty(arg_types)) {
++                const char *dot;
++
++                dot = strrchr(u->path, '.');
++                if (!dot)
++                        return false;
++
++                if (!strv_find(arg_types, dot+1))
++                        return false;
++        }
++
++        if (!strv_isempty(arg_states)) {
++                if (!strv_find(arg_states, unit_file_state_to_string(u->state)))
++                        return false;
++        }
++
++        return true;
+ }
+ 
+ static void output_unit_file_list(const UnitFileList *units, unsigned c) {
+@@ -6917,8 +6948,13 @@
+ 
+ static int halt_now(enum action a) {
+ 
+-/* Make sure C-A-D is handled by the kernel from this
+-         * point on... */
++        /* The kernel will automaticall flush ATA disks and suchlike
++         * on reboot(), but the file systems need to be synce'd
++         * explicitly in advance. */
++        sync();
++
++        /* Make sure C-A-D is handled by the kernel from this point
++         * on... */
+         reboot(RB_ENABLE_CAD);
+ 
+         switch (a) {
+--- a/src/udev/udevd.c	2014-10-23 17:13:15.784717951 +0200
++++ b/src/udev/udevd.c	2014-11-28 14:56:53.873865609 +0100
+@@ -967,7 +967,7 @@
+                 return;
+ 
+         FOREACH_WORD_QUOTED(word, l, line, state) {
+-                char *s, *opt;
++                char *s, *opt, *value;
+ 
+                 s = strndup(word, l);
+                 if (!s)
+@@ -979,24 +979,24 @@
+                 else
+                         opt = s;
+ 
+-                if (startswith(opt, "udev.log-priority=")) {
++                if ((value = startswith(opt, "udev.log-priority="))) {
+                         int prio;
+ 
+-                        prio = util_log_priority(opt + 18);
++                        prio = util_log_priority(value);
+                         log_set_max_level(prio);
+                         udev_set_log_priority(udev, prio);
+-                } else if (startswith(opt, "udev.children-max=")) {
+-                        r = safe_atoi(opt + 18, &arg_children_max);
++                } else if ((value = startswith(opt, "udev.children-max="))) {
++                        r = safe_atoi(value, &arg_children_max);
+                         if (r < 0)
+-                                log_warning("Invalid udev.children-max ignored: %s", opt + 18);
+-                } else if (startswith(opt, "udev.exec-delay=")) {
+-                        r = safe_atoi(opt + 16, &arg_exec_delay);
++                                log_warning("Invalid udev.children-max ignored: %s", value);
++                } else if ((value = startswith(opt, "udev.exec-delay="))) {
++                        r = safe_atoi(value, &arg_exec_delay);
+                         if (r < 0)
+-                                log_warning("Invalid udev.exec-delay ignored: %s", opt + 16);
+-                } else if (startswith(opt, "udev.event-timeout=")) {
+-                        r = safe_atou64(opt + 16, &arg_event_timeout_usec);
++                                log_warning("Invalid udev.exec-delay ignored: %s", value);
++                } else if ((value = startswith(opt, "udev.event-timeout="))) {
++                        r = safe_atou64(value, &arg_event_timeout_usec);
+                         if (r < 0) {
+-                                log_warning("Invalid udev.event-timeout ignored: %s", opt + 16);
++                                log_warning("Invalid udev.event-timeout ignored: %s", value);
+                                 break;
+                         }
+                         arg_event_timeout_usec *= USEC_PER_SEC;
+--- a/units/basic.target	2014-10-28 02:19:55.429947979 +0100
++++ b/units/basic.target	2014-11-28 14:56:53.875865630 +0100
+@@ -8,8 +8,8 @@
+ [Unit]
+ Description=Basic System
+ Documentation=man:systemd.special(7)
++
+ Requires=sysinit.target
++After=sysinit.target
+ Wants=sockets.target timers.target paths.target slices.target
+-After=sysinit.target sockets.target timers.target paths.target slices.target
+-JobTimeoutSec=15min
+-JobTimeoutAction=poweroff-force
++After=sockets.target paths.target slices.target
+--- a/units/poweroff.target	2014-10-28 02:19:55.429947979 +0100
++++ b/units/poweroff.target	2014-11-28 14:56:53.875865630 +0100
+@@ -12,8 +12,6 @@
+ Requires=systemd-poweroff.service
+ After=systemd-poweroff.service
+ AllowIsolate=yes
+-JobTimeoutSec=30min
+-JobTimeoutAction=poweroff-force
+ 
+ [Install]
+ Alias=ctrl-alt-del.target
+--- a/units/reboot.target	2014-10-28 02:19:55.429947979 +0100
++++ b/units/reboot.target	2014-11-28 14:56:53.875865630 +0100
+@@ -12,8 +12,6 @@
+ Requires=systemd-reboot.service
+ After=systemd-reboot.service
+ AllowIsolate=yes
+-JobTimeoutSec=30min
+-JobTimeoutAction=reboot-force
+ 
+ [Install]
+ Alias=ctrl-alt-del.target
+--- a/units/systemd-journal-flush.service.in	2014-10-23 00:39:42.449739860 +0200
++++ b/units/systemd-journal-flush.service.in	2014-11-28 14:58:53.776225146 +0100
+@@ -6,12 +6,13 @@
+ #  (at your option) any later version.
+ 
+ [Unit]
+-Description=Trigger Flushing of Journal to Persistent Storage
++Description=Flush Journal to Persistent Storage
+ Documentation=man:systemd-journald.service(8) man:journald.conf(5)
+ DefaultDependencies=no
+ Requires=systemd-journald.service
+-After=systemd-journald.service local-fs.target remote-fs.target
++After=systemd-journald.service
+ Before=systemd-user-sessions.service systemd-tmpfiles-setup.service
++RequiresMountsFor=/var/log/journal
+ 
+ [Service]
+ ExecStart=@rootbindir@/journalctl --flush
+--- a/units/timers.target	2013-08-13 22:02:52.832756455 +0200
++++ b/units/timers.target	2014-11-28 14:56:53.867865544 +0100
+@@ -8,3 +8,6 @@
+ [Unit]
+ Description=Timers
+ Documentation=man:systemd.special(7)
++
++DefaultDependencies=no
++Conflicts=shutdown.target


More information about the patches mailing list