Hello community, here is the log from the commit of package systemd for openSUSE:Factory checked in at 2013-02-17 17:13:58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/systemd (Old) and /work/SRC/openSUSE:Factory/.systemd.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "systemd", Maintainer is "" Changes: -------- --- /work/SRC/openSUSE:Factory/systemd/systemd-mini.changes 2013-02-15 18:51:53.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.systemd.new/systemd-mini.changes 2013-02-17 17:14:00.000000000 +0100 @@ -1,0 +2,12 @@ +Fri Feb 15 16:04:39 UTC 2013 - [email protected] + +- Add early-sync-shutdown.patch: start sync just when + shutdown.target is beginning +- Update parse-multiline-env-file.patch to better handle continuing + lines. +- Add handle-HOSTNAME.patch: handle /etc/HOSTNAME (bnc#803653). +- Add systemctl-print-wall-on-if-successful.patch: only print on + wall if successful. +- Add improve-bash-completion.patch: improve bash completion. + +------------------------------------------------------------------- systemd.changes: same change New: ---- early-sync-shutdown.patch handle-HOSTNAME.patch improve-bash-completion.patch systemctl-print-wall-on-if-successful.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ systemd-mini.spec ++++++ --- /var/tmp/diff_new_pack.vNccW8/_old 2013-02-17 17:14:02.000000000 +0100 +++ /var/tmp/diff_new_pack.vNccW8/_new 2013-02-17 17:14:02.000000000 +0100 @@ -266,6 +266,14 @@ Patch126: cryptsetup-accept-read-only.patch # PATCH-FIX-OPENSUSE disable-nss-myhostname-warning-bnc-783841.diff [email protected] -- disable nss-myhostname warning (bnc#783841) Patch127: disable-nss-myhostname-warning-bnc-783841.diff +# PATCH-FIX-UPSTREAM early-sync-shutdown.patch [email protected] -- Start sync on shutdown early +Patch128: early-sync-shutdown.patch +# PATCH-FIX-OPENSUSE handle-HOSTNAME.patch [email protected] -- handle /etc/HOSTNAME (bnc#803653) +Patch129: handle-HOSTNAME.patch +# PATCH-FIX-UPSTREAM systemctl-print-wall-on-if-successful.patch [email protected] -- Only print on wall if successful +Patch130: systemctl-print-wall-on-if-successful.patch +# PATCH-FIX-UPSTREAM improve-bash-completion.patch [email protected] -- improve bash completion +Patch131: improve-bash-completion.patch # udev patches # PATCH-FIX-OPENSUSE 1001-Reinstate-TIMEOUT-handling.patch @@ -497,7 +505,6 @@ %patch1021 -p1 %patch1022 -p1 %patch1023 -p1 -%patch1024 -p1 #systemd %patch1 -p1 @@ -589,6 +596,10 @@ %patch125 -p1 %patch126 -p1 %patch127 -p1 +%patch128 -p1 +%patch129 -p1 +%patch130 -p1 +%patch131 -p1 %build autoreconf -fiv ++++++ systemd.spec ++++++ --- /var/tmp/diff_new_pack.vNccW8/_old 2013-02-17 17:14:02.000000000 +0100 +++ /var/tmp/diff_new_pack.vNccW8/_new 2013-02-17 17:14:02.000000000 +0100 @@ -261,6 +261,14 @@ Patch126: cryptsetup-accept-read-only.patch # PATCH-FIX-OPENSUSE disable-nss-myhostname-warning-bnc-783841.diff [email protected] -- disable nss-myhostname warning (bnc#783841) Patch127: disable-nss-myhostname-warning-bnc-783841.diff +# PATCH-FIX-UPSTREAM early-sync-shutdown.patch [email protected] -- Start sync on shutdown early +Patch128: early-sync-shutdown.patch +# PATCH-FIX-OPENSUSE handle-HOSTNAME.patch [email protected] -- handle /etc/HOSTNAME (bnc#803653) +Patch129: handle-HOSTNAME.patch +# PATCH-FIX-UPSTREAM systemctl-print-wall-on-if-successful.patch [email protected] -- Only print on wall if successful +Patch130: systemctl-print-wall-on-if-successful.patch +# PATCH-FIX-UPSTREAM improve-bash-completion.patch [email protected] -- improve bash completion +Patch131: improve-bash-completion.patch # udev patches # PATCH-FIX-OPENSUSE 1001-Reinstate-TIMEOUT-handling.patch @@ -583,6 +591,10 @@ %patch125 -p1 %patch126 -p1 %patch127 -p1 +%patch128 -p1 +%patch129 -p1 +%patch130 -p1 +%patch131 -p1 %build autoreconf -fiv ++++++ early-sync-shutdown.patch ++++++ >From c65eb8365344eeb72ee2c0b333ab54d925263b3f Mon Sep 17 00:00:00 2001 From: Lennart Poettering <[email protected]> Date: Fri, 25 Jan 2013 22:33:33 +0100 Subject: [PATCH] shutdown: issue a sync() as soon as shutdown.target is queued --- Makefile.am | 7 ++++-- src/core/job.c | 26 ++++++++++++++++++++ src/core/job.h | 2 ++ src/core/sync.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/core/sync.h | 24 +++++++++++++++++++ src/core/transaction.c | 1 + 6 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 src/core/sync.c create mode 100644 src/core/sync.h Index: systemd-195/Makefile.am =================================================================== --- systemd-195.orig/Makefile.am +++ systemd-195/Makefile.am @@ -1038,7 +1038,9 @@ libsystemd_core_la_SOURCES = \ src/core/syscall-list.c \ src/core/syscall-list.h \ src/core/audit-fd.c \ - src/core/audit-fd.h + src/core/audit-fd.h \ + src/core/sync.c \ + src/core/sync.h nodist_libsystemd_core_la_SOURCES = \ src/core/load-fragment-gperf.c \ @@ -1052,7 +1054,8 @@ libsystemd_core_la_CFLAGS = \ $(LIBWRAP_CFLAGS) \ $(PAM_CFLAGS) \ $(AUDIT_CFLAGS) \ - $(KMOD_CFLAGS) + $(KMOD_CFLAGS) \ + -pthread libsystemd_core_la_LIBADD = \ libsystemd-capability.la \ Index: systemd-195/src/core/job.c =================================================================== --- systemd-195.orig/src/core/job.c +++ systemd-195/src/core/job.c @@ -34,6 +34,9 @@ #include "load-dropin.h" #include "log.h" #include "dbus-job.h" +#include "special.h" +#include "sync.h" +#include "virt.h" JobBusClient* job_bus_client_new(DBusConnection *connection, const char *name) { JobBusClient *cl; @@ -1045,6 +1048,29 @@ int job_coldplug(Job *j) { return 0; } +void job_shutdown_magic(Job *j) { + assert(j); + + /* The shutdown target gets some special treatment here: we + * tell the kernel to begin with flushing its disk caches, to + * optimize shutdown time a bit. Ideally we wouldn't hardcode + * this magic into PID 1. However all other processes aren't + * options either since they'd exit much sooner than PID 1 and + * asynchronous sync() would cause their exit to be + * delayed. */ + + if (!unit_has_name(j->unit, SPECIAL_SHUTDOWN_TARGET)) + return; + + if (j->type != JOB_START) + return; + + if (detect_container(NULL) > 0) + return; + + asynchronous_sync(); +} + static const char* const job_state_table[_JOB_STATE_MAX] = { [JOB_WAITING] = "waiting", [JOB_RUNNING] = "running" Index: systemd-195/src/core/job.h =================================================================== --- systemd-195.orig/src/core/job.h +++ systemd-195/src/core/job.h @@ -217,6 +217,8 @@ int job_finish_and_invalidate(Job *j, Jo char *job_dbus_path(Job *j); +void job_shutdown_magic(Job *j); + const char* job_type_to_string(JobType t); JobType job_type_from_string(const char *s); Index: systemd-195/src/core/sync.c =================================================================== --- /dev/null +++ systemd-195/src/core/sync.c @@ -0,0 +1,65 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +/*** + This file is part of systemd. + + Copyright 2013 Lennart Poettering + + 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/>. +***/ + +#include <pthread.h> +#include <unistd.h> + +#include "sync.h" + +static void *sync_thread(void *p) { + sync(); + return NULL; +} + +int asynchronous_sync(void) { + pthread_attr_t a; + pthread_t t; + int r; + + /* It kinda sucks that we have to resort to threads to + * implement an asynchronous sync(), but well, such is + * life. + * + * Note that issuing this command right before exiting a + * process will cause the process to wait for the sync() to + * complete. This function hence is nicely asynchronous really + * only in long running processes. */ + + r = pthread_attr_init(&a); + if (r != 0) + return -r; + + r = pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED); + if (r != 0) { + r = -r; + goto finish; + } + + r = pthread_create(&t, &a, sync_thread, NULL); + if (r != 0) { + r = -r; + goto finish; + } + +finish: + pthread_attr_destroy(&a); + return r; +} Index: systemd-195/src/core/sync.h =================================================================== --- /dev/null +++ systemd-195/src/core/sync.h @@ -0,0 +1,24 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +#pragma once + +/*** + This file is part of systemd. + + Copyright 2013 Lennart Poettering + + 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/>. +***/ + +int asynchronous_sync(void); Index: systemd-195/src/core/transaction.c =================================================================== --- systemd-195.orig/src/core/transaction.c +++ systemd-195/src/core/transaction.c @@ -592,6 +592,7 @@ static int transaction_apply(Transaction job_add_to_run_queue(j); job_add_to_dbus_queue(j); job_start_timer(j); + job_shutdown_magic(j); } return 0; ++++++ handle-HOSTNAME.patch ++++++ Index: systemd-195/src/hostname/hostnamed.c =================================================================== --- systemd-195.orig/src/hostname/hostnamed.c +++ systemd-195/src/hostname/hostnamed.c @@ -118,6 +118,10 @@ static int read_data(void) { if (r < 0 && r != -ENOENT) return r; + r = read_one_line_file("/etc/HOSTNAME", &data[PROP_STATIC_HOSTNAME]); + if (r < 0 && r != -ENOENT) + return r; + return 0; } @@ -203,6 +207,7 @@ static int write_data_hostname(void) { static int write_data_static_hostname(void) { + int r; if (isempty(data[PROP_STATIC_HOSTNAME])) { if (unlink("/etc/hostname") < 0) @@ -211,7 +216,11 @@ static int write_data_static_hostname(vo return 0; } - return write_one_line_file_atomic("/etc/hostname", data[PROP_STATIC_HOSTNAME]); + r = write_one_line_file_atomic("/etc/hostname", data[PROP_STATIC_HOSTNAME]); + if (!r) { + r = symlink_atomic("/etc/hostname", "/etc/HOSTNAME"); + } + return r; } static int write_data_other(void) { ++++++ improve-bash-completion.patch ++++++ Index: systemd-195/bash-completion/systemd-bash-completion.sh =================================================================== --- systemd-195.orig/bash-completion/systemd-bash-completion.sh +++ systemd-195/bash-completion/systemd-bash-completion.sh @@ -114,15 +114,15 @@ _systemctl () { [SNAPSHOTS]='delete' [ENVS]='set-environment unset-environment' [STANDALONE]='daemon-reexec daemon-reload default dot dump - emergency exit halt kexec list-jobs list-units - list-unit-files poweroff reboot rescue show-environment' + emergency exit halt hibernate kexec list-jobs list-units + list-unit-files poweroff reboot rescue show-environment suspend' [NAME]='snapshot load' [FILE]='link' ) for ((i=0; $i <= $COMP_CWORD; i++)); do if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} && - ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG}]}; then + ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then verb=${COMP_WORDS[i]} break fi @@ -245,7 +245,7 @@ _loginctl () { for ((i=0; $i <= $COMP_CWORD; i++)); do if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} && - ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG}]}; then + ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then verb=${COMP_WORDS[i]} break fi @@ -280,10 +280,21 @@ _loginctl () { } complete -F _loginctl loginctl +__journal_fields=(MESSAGE{,_ID} PRIORITY CODE_{FILE,LINE,FUNC} + ERRNO SYSLOG_{FACILITY,IDENTIFIER,PID} + _{P,U,G}ID _COMM _EXE _CMDLINE + _AUDIT_{SESSION,LOGINUID} + _SYSTEMD_{CGROUP,SESSION,UNIT,OWNER_UID} + _SELINUX_CONTEXT _SOURCE_REALTIME_TIMESTAMP + _{BOOT,MACHINE}_ID _HOSTNAME _TRANSPORT + _KERNEL_{DEVICE,SUBSYSTEM} + _UDEV_{SYSNAME,DEVNODE,DEVLINK} + __CURSOR __{REALTIME,MONOTONIC}_TIMESTAMP) + _journalctl() { local field_vals= cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} local -A OPTS=( - [STANDALONE]='-a --all -b --this-boot -f --follow --header + [STANDALONE]='-a --all -b --this-boot --disk-usage -f --follow --header -h --help -l --local --new-id128 -m --merge --no-pager --no-tail -q --quiet --setup-keys --this-boot --verify --version' @@ -291,17 +302,6 @@ _journalctl() { [ARGUNKNOWN]='-c --cursor --interval -n --lines -p --priority --since --until --verify-key' ) - local journal_fields=(MESSAGE{,_ID} PRIORITY CODE_{FILE,LINE,FUNC} - ERRNO SYSLOG_{FACILITY,IDENTIFIER,PID} - _{P,U,G}ID _COMM _EXE _CMDLINE - _AUDIT_{SESSION,LOGINUID} - _SYSTEMD_{CGROUP,SESSION,UNIT,OWNER_UID} - _SELINUX_CONTEXT _SOURCE_REALTIME_TIMESTAMP - _{BOOT,MACHINE}_ID _HOSTNAME _TRANSPORT - _KERNEL_{DEVICE,SUBSYSTEM} - _UDEV_{SYSNAME,DEVNODE,DEVLINK} - __CURSOR __{REALTIME,MONOTONIC}_TIMESTAMP) - if __contains_word "$prev" ${OPTS[ARG]} ${OPTS[ARGUNKNOWN]}; then case $prev in @@ -313,7 +313,7 @@ _journalctl() { comps='short short-monotonic verbose export json cat' ;; --field|-F) - comps=${journal_fields[*]} + comps=${__journal_fields[*]} ;; --unit|-u) comps=$(journalctl -F '_SYSTEMD_UNIT') @@ -337,7 +337,7 @@ _journalctl() { COMPREPLY=( $(compgen -W '${field_vals[*]}' -- "$cur") ) else compopt -o nospace - COMPREPLY=( $(compgen -W '${journal_fields[*]}' -S= -- "$cur") ) + COMPREPLY=( $(compgen -W '${__journal_fields[*]}' -S= -- "$cur") ) fi } complete -F _journalctl journalctl @@ -476,3 +476,81 @@ _hostnamectl() { return 0 } complete -F _hostnamectl hostnamectl + +__get_all_sysdevs() { + local -a devs=(/sys/bus/*/devices/*/ /sys/class/*/*/) + printf '%s\n' "${devs[@]%/}" +} + +_udevadm() { + local i verb comps + local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} + local OPTS='-h --help --version --debug' + + local -A VERBS=( + [INFO]='info' + [TRIGGER]='trigger' + [SETTLE]='settle' + [CONTROL]='control' + [MONITOR]='monitor' + [HWDB]='hwdb' + [TESTBUILTIN]='test-builtin' + [TEST]='test' + ) + + for ((i=0; $i <= $COMP_CWORD; i++)); do + if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} && + ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then + verb=${COMP_WORDS[i]} + break + fi + done + + if [[ -z $verb && $cur = -* ]]; then + COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") ) + return 0 + fi + + if [[ -z $verb ]]; then + comps=${VERBS[*]} + + elif __contains_word "$verb" ${VERBS[INFO]}; then + if [[ $cur = -* ]]; then + comps='--help --query= --path= --name= --root --attribute-walk --export-db --cleanup-db' + else + comps=$( __get_all_sysdevs ) + fi + + elif __contains_word "$verb" ${VERBS[TRIGGER]}; then + comps='--help --verbose --dry-run --type= --action= --subsystem-match= + --subsystem-nomatch= --attr-match= --attr-nomatch= --property-match= + --tag-match= --sysname-match= --parent-match=' + + elif __contains_word "$verb" ${VERBS[SETTLE]}; then + comps='--help --timeout= --seq-start= --seq-end= --exit-if-exists= --quiet' + + elif __contains_word "$verb" ${VERBS[CONTROL]}; then + comps='--help --exit --log-priority= --stop-exec-queue --start-exec-queue + --reload --property= --children-max= --timeout=' + + elif __contains_word "$verb" ${VERBS[MONITOR]}; then + comps='--help --kernel --udev --property --subsystem-match= --tag-match=' + + elif __contains_word "$verb" ${VERBS[HWDB]}; then + comps='--help --update --test=' + + elif __contains_word "$verb" ${VERBS[TEST]}; then + if [[ $cur = -* ]]; then + comps='--help --action=' + else + comps=$( __get_all_sysdevs ) + fi + + elif __contains_word "$verb" ${VERBS[TESTBUILTIN]}; then + comps='blkid btrfs firmware hwdb input_id kmod net_id path_id usb_id uaccess' + fi + + COMPREPLY=( $(compgen -W '$comps' -- "$cur") ) + return 0 +} +complete -F _udevadm udevadm ++++++ parse-multiline-env-file.patch ++++++ --- /var/tmp/diff_new_pack.vNccW8/_old 2013-02-17 17:14:02.000000000 +0100 +++ /var/tmp/diff_new_pack.vNccW8/_new 2013-02-17 17:14:02.000000000 +0100 @@ -41,7 +41,7 @@ =================================================================== --- systemd-195.orig/src/shared/util.c +++ systemd-195/src/shared/util.c -@@ -876,69 +876,89 @@ fail: +@@ -876,69 +876,88 @@ fail: return r; } @@ -52,99 +52,103 @@ - FILE *f; - char **m = NULL; - int r; -+int load_env_file(const char *fname, -+ char ***rl) { ++int load_env_file(const char *fname, char ***rl) { + -+ FILE _cleanup_fclose_ *f; -+ char *b; -+ char _cleanup_free_ *c = NULL; -+ char _cleanup_strv_free_ **m = NULL; ++ _cleanup_fclose_ FILE *f; ++ _cleanup_strv_free_ char **m = NULL; ++ _cleanup_free_ char *c = NULL; assert(fname); assert(rl); - if (!(f = fopen(fname, "re"))) ++ /* This reads an environment file, but will not complain about ++ * any invalid assignments, that needs to be done by the ++ * caller */ ++ + f = fopen(fname, "re"); + if (!f) return -errno; while (!feof(f)) { - char l[LINE_MAX], *p, *u; -+ char l[LINE_MAX], *p, *u, *cs; - char **t; +- char **t; ++ char l[LINE_MAX], *p, *cs, *b; if (!fgets(l, sizeof(l), f)) { - if (feof(f)) -+ if (!feof(f)) +- break; ++ if (ferror(f)) + return -errno; -+ else if (!c) - break; -+ } ++ ++ /* The previous line was a continuation line? ++ * Let's process it now, before we leave the ++ * loop */ ++ if (c) ++ goto process; - r = -errno; - goto finish; -+ cs = endswith(l, "\\\n"); -+ if (cs) { -+ *cs = '\0'; -+ b = strappend(c, l); -+ if (!b) -+ return log_oom(); -+ -+ free(c); -+ c = b; -+ *l = '\0'; -+ continue; ++ break; } - p = strstrip(l); -+ if (c) { ++ /* Is this a continuation line? If so, just append ++ * this to c, and go to next line right-away */ ++ cs = endswith(l, "\\\n"); ++ if (cs) { ++ *cs = '\0'; + b = strappend(c, l); + if (!b) -+ return log_oom(); ++ return -ENOMEM; - if (!*p) -- continue; + free(c); + c = b; + continue; + } -+ -+ p = strstrip(c ? c : l); - if (strchr(COMMENTS, *p)) -+ if (!*p) { -+ free(c); -+ c = NULL; - continue; -+ } +- continue; ++ /* If the previous line was a continuation line, ++ * append the current line to it */ ++ if (c) { ++ b = strappend(c, l); ++ if (!b) ++ return -ENOMEM; - if (!(u = normalize_env_assignment(p))) { - r = log_oom(); - goto finish; -+ if (strchr(COMMENTS, *p)) { + free(c); -+ c = NULL; -+ continue; ++ c = b; } -+ u = normalize_env_assignment(p); -+ if (!u) -+ return log_oom(); -+ -+ free(c); -+ c = NULL; -+ - t = strv_append(m, u); - free(u); +- t = strv_append(m, u); +- free(u); ++ process: ++ p = strstrip(c ? c : l); - if (!t) { - r = log_oom(); - goto finish; -- } -+ if (!t) -+ return log_oom(); ++ if (*p && !strchr(COMMENTS, *p)) { ++ _cleanup_free_ char *u; ++ int k; ++ ++ u = normalize_env_assignment(p); ++ if (!u) ++ return -ENOMEM; ++ ++ k = strv_extend(&m, u); ++ if (k < 0) ++ return -ENOMEM; + } - strv_free(m); - m = t; +- strv_free(m); +- m = t; ++ free(c); ++ c = NULL; } - r = 0; @@ -163,3 +167,52 @@ } int write_env_file(const char *fname, char **l) { +Index: systemd-195/src/shared/strv.c +=================================================================== +--- systemd-195.orig/src/shared/strv.c ++++ systemd-195/src/shared/strv.c +@@ -370,6 +370,32 @@ fail: + return NULL; + } + ++int strv_extend(char ***l, const char *value) { ++ char **c; ++ char *v; ++ unsigned n; ++ ++ if (!value) ++ return 0; ++ ++ v = strdup(value); ++ if (!v) ++ return -ENOMEM; ++ ++ n = strv_length(*l); ++ c = realloc(*l, sizeof(char*) * (n + 2)); ++ if (!c) { ++ free(v); ++ return -ENOMEM; ++ } ++ ++ c[n] = v; ++ c[n+1] = NULL; ++ ++ *l = c; ++ return 0; ++} ++ + char **strv_uniq(char **l) { + char **i; + +Index: systemd-195/src/shared/strv.h +=================================================================== +--- systemd-195.orig/src/shared/strv.h ++++ systemd-195/src/shared/strv.h +@@ -37,6 +37,7 @@ unsigned strv_length(char **l); + char **strv_merge(char **a, char **b); + char **strv_merge_concat(char **a, char **b, const char *suffix); + char **strv_append(char **l, const char *s); ++int strv_extend(char ***l, const char *value); + + char **strv_remove(char **l, const char *s); + char **strv_remove_prefix(char **l, const char *s); ++++++ systemctl-print-wall-on-if-successful.patch ++++++ >From f6bb13ab8db51aaedc825fec2f0458b60309b27a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <[email protected]> Date: Thu, 14 Feb 2013 14:08:09 -0500 Subject: [PATCH] systemctl: print wall message only if successful systemctl would write to the wall even if unsuccessful. https://bugs.freedesktop.org/show_bug.cgi?id=60393 --- src/systemctl/systemctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: systemd-195/src/systemctl/systemctl.c =================================================================== --- systemd-195.orig/src/systemctl/systemctl.c +++ systemd-195/src/systemctl/systemctl.c @@ -1825,7 +1825,7 @@ static int start_special(DBusConnection } r = start_unit(bus, args); - if (r >= 0) + if (r == EXIT_SUCCESS) warn_wall(a); return r; -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
