Accepting request 221246 from Base:System
- Make systemd rpm macros package a separate to avoid rebuild of the full package tree if systemd package change OBS-URL: https://build.opensuse.org/request/show/221246 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/systemd-rpm-macros?expand=0&rev=4
This commit is contained in:
parent
12dd43bb94
commit
f1dbc7e965
@ -1,35 +0,0 @@
|
||||
From a0551d26ab5c6e0d5089b42a6319baef0e28ad92 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
||||
Date: Mon, 14 Oct 2013 19:15:24 -0400
|
||||
Subject: [PATCH] Fix bad assert in show_pid_array
|
||||
|
||||
This function should get the same treatment as other qsort uses
|
||||
did in 7ff7394 "Never call qsort on potentially NULL arrays".
|
||||
|
||||
Reported-by: Oleksii Shevchuk <alxchk@gmail.com>
|
||||
---
|
||||
src/shared/cgroup-show.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
Index: systemd-208/src/shared/cgroup-show.c
|
||||
===================================================================
|
||||
--- systemd-208.orig/src/shared/cgroup-show.c
|
||||
+++ systemd-208/src/shared/cgroup-show.c
|
||||
@@ -44,8 +44,6 @@ static void show_pid_array(int pids[], u
|
||||
unsigned i, m, pid_width;
|
||||
pid_t biggest = 0;
|
||||
|
||||
- assert(n_pids > 0);
|
||||
-
|
||||
/* Filter duplicates */
|
||||
m = 0;
|
||||
for (i = 0; i < n_pids; i++) {
|
||||
@@ -65,7 +63,7 @@ static void show_pid_array(int pids[], u
|
||||
pid_width = DECIMAL_STR_WIDTH(biggest);
|
||||
|
||||
/* And sort */
|
||||
- qsort(pids, n_pids, sizeof(pid_t), compare);
|
||||
+ qsort_safe(pids, n_pids, sizeof(pid_t), compare);
|
||||
|
||||
if(flags & OUTPUT_FULL_WIDTH)
|
||||
n_columns = 0;
|
@ -1,385 +0,0 @@
|
||||
From 7ff7394d9e4e9189c30fd018235e6b1728c6f2d0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
||||
Date: Fri, 11 Oct 2013 19:33:13 -0400
|
||||
Subject: [PATCH] Never call qsort on potentially NULL arrays
|
||||
|
||||
This extends 62678ded 'efi: never call qsort on potentially
|
||||
NULL arrays' to all other places where qsort is used and it
|
||||
is not obvious that the count is non-zero.
|
||||
---
|
||||
src/analyze/systemd-analyze.c | 2 +-
|
||||
src/cgtop/cgtop.c | 2 +-
|
||||
src/core/namespace.c | 38 ++++++++++++++++++++------------------
|
||||
src/journal/catalog.c | 2 +-
|
||||
src/journal/journal-file.c | 2 +-
|
||||
src/journal/journal-vacuum.c | 3 +--
|
||||
src/journal/journalctl.c | 2 +-
|
||||
src/libsystemd-bus/bus-match.c | 2 +-
|
||||
src/libudev/libudev-enumerate.c | 2 +-
|
||||
src/nss-myhostname/netlink.c | 3 ++-
|
||||
src/readahead/readahead-collect.c | 39 ++++++++++++++++++++++-----------------
|
||||
src/shared/cgroup-show.c | 2 ++
|
||||
src/shared/conf-files.c | 2 +-
|
||||
src/shared/efivars.c | 3 +--
|
||||
src/shared/fileio.c | 1 +
|
||||
src/shared/util.h | 12 ++++++++++++
|
||||
src/systemctl/systemctl.c | 10 +++++-----
|
||||
17 files changed, 74 insertions(+), 53 deletions(-)
|
||||
|
||||
diff --git a/src/analyze/systemd-analyze.c b/src/analyze/systemd-analyze.c
|
||||
index 27d063c..a4f15eb 100644
|
||||
--- a/src/analyze/systemd-analyze.c
|
||||
+++ b/src/analyze/systemd-analyze.c
|
||||
@@ -768,7 +768,7 @@ static int list_dependencies_one(DBusConnection *bus, const char *name, unsigned
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
- qsort(deps, strv_length(deps), sizeof (char*), list_dependencies_compare);
|
||||
+ qsort_safe(deps, strv_length(deps), sizeof (char*), list_dependencies_compare);
|
||||
|
||||
r = acquire_boot_times(bus, &boot);
|
||||
if (r < 0)
|
||||
diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c
|
||||
index cacf705..293a211 100644
|
||||
--- a/src/cgtop/cgtop.c
|
||||
+++ b/src/cgtop/cgtop.c
|
||||
@@ -461,7 +461,7 @@ static int display(Hashmap *a) {
|
||||
if (g->n_tasks_valid || g->cpu_valid || g->memory_valid || g->io_valid)
|
||||
array[n++] = g;
|
||||
|
||||
- qsort(array, n, sizeof(Group*), group_compare);
|
||||
+ qsort_safe(array, n, sizeof(Group*), group_compare);
|
||||
|
||||
/* Find the longest names in one run */
|
||||
for (j = 0; j < n; j++) {
|
||||
diff --git a/src/core/namespace.c b/src/core/namespace.c
|
||||
index 16b132b..936f368 100644
|
||||
--- a/src/core/namespace.c
|
||||
+++ b/src/core/namespace.c
|
||||
@@ -222,7 +222,7 @@ int setup_namespace(char** read_write_dirs,
|
||||
strv_length(read_only_dirs) +
|
||||
strv_length(inaccessible_dirs) +
|
||||
(private_tmp ? 2 : 0);
|
||||
- BindMount *m, *mounts;
|
||||
+ BindMount *m, *mounts = NULL;
|
||||
int r = 0;
|
||||
|
||||
if (!mount_flags)
|
||||
@@ -231,27 +231,29 @@ int setup_namespace(char** read_write_dirs,
|
||||
if (unshare(CLONE_NEWNS) < 0)
|
||||
return -errno;
|
||||
|
||||
- m = mounts = (BindMount *) alloca(n * sizeof(BindMount));
|
||||
- if ((r = append_mounts(&m, read_write_dirs, READWRITE)) < 0 ||
|
||||
- (r = append_mounts(&m, read_only_dirs, READONLY)) < 0 ||
|
||||
- (r = append_mounts(&m, inaccessible_dirs, INACCESSIBLE)) < 0)
|
||||
- return r;
|
||||
+ if (n) {
|
||||
+ m = mounts = (BindMount *) alloca(n * sizeof(BindMount));
|
||||
+ if ((r = append_mounts(&m, read_write_dirs, READWRITE)) < 0 ||
|
||||
+ (r = append_mounts(&m, read_only_dirs, READONLY)) < 0 ||
|
||||
+ (r = append_mounts(&m, inaccessible_dirs, INACCESSIBLE)) < 0)
|
||||
+ return r;
|
||||
+
|
||||
+ if (private_tmp) {
|
||||
+ m->path = "/tmp";
|
||||
+ m->mode = PRIVATE_TMP;
|
||||
+ m++;
|
||||
+
|
||||
+ m->path = "/var/tmp";
|
||||
+ m->mode = PRIVATE_VAR_TMP;
|
||||
+ m++;
|
||||
+ }
|
||||
|
||||
- if (private_tmp) {
|
||||
- m->path = "/tmp";
|
||||
- m->mode = PRIVATE_TMP;
|
||||
- m++;
|
||||
+ assert(mounts + n == m);
|
||||
|
||||
- m->path = "/var/tmp";
|
||||
- m->mode = PRIVATE_VAR_TMP;
|
||||
- m++;
|
||||
+ qsort(mounts, n, sizeof(BindMount), mount_path_compare);
|
||||
+ drop_duplicates(mounts, &n);
|
||||
}
|
||||
|
||||
- assert(mounts + n == m);
|
||||
-
|
||||
- qsort(mounts, n, sizeof(BindMount), mount_path_compare);
|
||||
- drop_duplicates(mounts, &n);
|
||||
-
|
||||
/* Remount / as SLAVE so that nothing now mounted in the namespace
|
||||
shows up in the parent */
|
||||
if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL) < 0)
|
||||
diff --git a/src/journal/catalog.c b/src/journal/catalog.c
|
||||
index 7738d24..90ca008 100644
|
||||
--- a/src/journal/catalog.c
|
||||
+++ b/src/journal/catalog.c
|
||||
@@ -399,7 +399,7 @@ int catalog_update(const char* database, const char* root, const char* const* di
|
||||
}
|
||||
|
||||
assert(n == hashmap_size(h));
|
||||
- qsort(items, n, sizeof(CatalogItem), catalog_compare_func);
|
||||
+ qsort_safe(items, n, sizeof(CatalogItem), catalog_compare_func);
|
||||
|
||||
r = write_catalog(database, h, sb, items, n);
|
||||
if (r < 0)
|
||||
diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
|
||||
index 78b937b..901e71b 100644
|
||||
--- a/src/journal/journal-file.c
|
||||
+++ b/src/journal/journal-file.c
|
||||
@@ -1344,7 +1344,7 @@ int journal_file_append_entry(JournalFile *f, const dual_timestamp *ts, const st
|
||||
|
||||
/* Order by the position on disk, in order to improve seek
|
||||
* times for rotating media. */
|
||||
- qsort(items, n_iovec, sizeof(EntryItem), entry_item_cmp);
|
||||
+ qsort_safe(items, n_iovec, sizeof(EntryItem), entry_item_cmp);
|
||||
|
||||
r = journal_file_append_entry_internal(f, ts, xor_hash, items, n_iovec, seqnum, ret, offset);
|
||||
|
||||
diff --git a/src/journal/journal-vacuum.c b/src/journal/journal-vacuum.c
|
||||
index 8d5effb..d4a1c6c 100644
|
||||
--- a/src/journal/journal-vacuum.c
|
||||
+++ b/src/journal/journal-vacuum.c
|
||||
@@ -299,8 +299,7 @@ int journal_directory_vacuum(
|
||||
n_list ++;
|
||||
}
|
||||
|
||||
- if (n_list > 0)
|
||||
- qsort(list, n_list, sizeof(struct vacuum_info), vacuum_compare);
|
||||
+ qsort_safe(list, n_list, sizeof(struct vacuum_info), vacuum_compare);
|
||||
|
||||
for (i = 0; i < n_list; i++) {
|
||||
struct statvfs ss;
|
||||
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
|
||||
index 2f8be1b..275458c 100644
|
||||
--- a/src/journal/journalctl.c
|
||||
+++ b/src/journal/journalctl.c
|
||||
@@ -761,7 +761,7 @@ static int get_relative_boot_id(sd_journal *j, sd_id128_t *boot_id, int relative
|
||||
sd_journal_flush_matches(j);
|
||||
}
|
||||
|
||||
- qsort(all_ids, count, sizeof(boot_id_t), boot_id_cmp);
|
||||
+ qsort_safe(all_ids, count, sizeof(boot_id_t), boot_id_cmp);
|
||||
|
||||
if (sd_id128_equal(*boot_id, SD_ID128_NULL)) {
|
||||
if (relative > (int) count || relative <= -(int)count)
|
||||
diff --git a/src/libsystemd-bus/bus-match.c b/src/libsystemd-bus/bus-match.c
|
||||
index 1411167..916682a 100644
|
||||
--- a/src/libsystemd-bus/bus-match.c
|
||||
+++ b/src/libsystemd-bus/bus-match.c
|
||||
@@ -768,7 +768,7 @@ int bus_match_parse(
|
||||
}
|
||||
|
||||
/* Order the whole thing, so that we always generate the same tree */
|
||||
- qsort(components, n_components, sizeof(struct bus_match_component), match_component_compare);
|
||||
+ qsort_safe(components, n_components, sizeof(struct bus_match_component), match_component_compare);
|
||||
|
||||
/* Check for duplicates */
|
||||
for (i = 0; i+1 < n_components; i++)
|
||||
diff --git a/src/libudev/libudev-enumerate.c b/src/libudev/libudev-enumerate.c
|
||||
index 8146f27..e71d766 100644
|
||||
--- a/src/libudev/libudev-enumerate.c
|
||||
+++ b/src/libudev/libudev-enumerate.c
|
||||
@@ -276,7 +276,7 @@ _public_ struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enume
|
||||
size_t move_later_prefix = 0;
|
||||
|
||||
udev_list_cleanup(&udev_enumerate->devices_list);
|
||||
- qsort(udev_enumerate->devices, udev_enumerate->devices_cur, sizeof(struct syspath), syspath_cmp);
|
||||
+ qsort_safe(udev_enumerate->devices, udev_enumerate->devices_cur, sizeof(struct syspath), syspath_cmp);
|
||||
|
||||
max = udev_enumerate->devices_cur;
|
||||
for (i = 0; i < max; i++) {
|
||||
diff --git a/src/nss-myhostname/netlink.c b/src/nss-myhostname/netlink.c
|
||||
index b1ef912..47a41f5 100644
|
||||
--- a/src/nss-myhostname/netlink.c
|
||||
+++ b/src/nss-myhostname/netlink.c
|
||||
@@ -197,7 +197,8 @@ finish:
|
||||
return r;
|
||||
}
|
||||
|
||||
- qsort(list, n_list, sizeof(struct address), address_compare);
|
||||
+ if (n_list)
|
||||
+ qsort(list, n_list, sizeof(struct address), address_compare);
|
||||
|
||||
*_list = list;
|
||||
*_n_list = n_list;
|
||||
diff --git a/src/readahead/readahead-collect.c b/src/readahead/readahead-collect.c
|
||||
index 32888ad..6b74866 100644
|
||||
--- a/src/readahead/readahead-collect.c
|
||||
+++ b/src/readahead/readahead-collect.c
|
||||
@@ -536,8 +536,7 @@ done:
|
||||
HASHMAP_FOREACH_KEY(q, p, files, i)
|
||||
pack_file(pack, p, on_btrfs);
|
||||
} else {
|
||||
- struct item *ordered, *j;
|
||||
- unsigned k, n;
|
||||
+ unsigned n;
|
||||
|
||||
/* On rotating media, order things by the block
|
||||
* numbers */
|
||||
@@ -545,25 +544,31 @@ done:
|
||||
log_debug("Ordering...");
|
||||
|
||||
n = hashmap_size(files);
|
||||
- if (!(ordered = new(struct item, n))) {
|
||||
- r = log_oom();
|
||||
- goto finish;
|
||||
- }
|
||||
-
|
||||
- j = ordered;
|
||||
- HASHMAP_FOREACH_KEY(q, p, files, i) {
|
||||
- memcpy(j, q, sizeof(struct item));
|
||||
- j++;
|
||||
- }
|
||||
+ if (n) {
|
||||
+ _cleanup_free_ struct item *ordered;
|
||||
+ struct item *j;
|
||||
+ unsigned k;
|
||||
+
|
||||
+ ordered = new(struct item, n);
|
||||
+ if (!ordered) {
|
||||
+ r = log_oom();
|
||||
+ goto finish;
|
||||
+ }
|
||||
|
||||
- assert(ordered + n == j);
|
||||
+ j = ordered;
|
||||
+ HASHMAP_FOREACH_KEY(q, p, files, i) {
|
||||
+ memcpy(j, q, sizeof(struct item));
|
||||
+ j++;
|
||||
+ }
|
||||
|
||||
- qsort(ordered, n, sizeof(struct item), qsort_compare);
|
||||
+ assert(ordered + n == j);
|
||||
|
||||
- for (k = 0; k < n; k++)
|
||||
- pack_file(pack, ordered[k].path, on_btrfs);
|
||||
+ qsort(ordered, n, sizeof(struct item), qsort_compare);
|
||||
|
||||
- free(ordered);
|
||||
+ for (k = 0; k < n; k++)
|
||||
+ pack_file(pack, ordered[k].path, on_btrfs);
|
||||
+ } else
|
||||
+ log_warning("No pack files");
|
||||
}
|
||||
|
||||
log_debug("Finalizing...");
|
||||
diff --git a/src/shared/cgroup-show.c b/src/shared/cgroup-show.c
|
||||
index e971f36..cc44ab4 100644
|
||||
--- a/src/shared/cgroup-show.c
|
||||
+++ b/src/shared/cgroup-show.c
|
||||
@@ -44,6 +44,8 @@ static void show_pid_array(int pids[], unsigned n_pids, const char *prefix, unsi
|
||||
unsigned i, m, pid_width;
|
||||
pid_t biggest = 0;
|
||||
|
||||
+ assert(n_pids > 0);
|
||||
+
|
||||
/* Filter duplicates */
|
||||
m = 0;
|
||||
for (i = 0; i < n_pids; i++) {
|
||||
diff --git a/src/shared/conf-files.c b/src/shared/conf-files.c
|
||||
index 6d99739..ed4070c 100644
|
||||
--- a/src/shared/conf-files.c
|
||||
+++ b/src/shared/conf-files.c
|
||||
@@ -127,7 +127,7 @@ static int conf_files_list_strv_internal(char ***strv, const char *suffix, const
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
- qsort(files, hashmap_size(fh), sizeof(char *), base_cmp);
|
||||
+ qsort_safe(files, hashmap_size(fh), sizeof(char *), base_cmp);
|
||||
*strv = files;
|
||||
|
||||
hashmap_free(fh);
|
||||
diff --git a/src/shared/efivars.c b/src/shared/efivars.c
|
||||
index c015b16..f3eb6a6 100644
|
||||
--- a/src/shared/efivars.c
|
||||
+++ b/src/shared/efivars.c
|
||||
@@ -384,8 +384,7 @@ int efi_get_boot_options(uint16_t **options) {
|
||||
list[count ++] = id;
|
||||
}
|
||||
|
||||
- if (list)
|
||||
- qsort(list, count, sizeof(uint16_t), cmp_uint16);
|
||||
+ qsort_safe(list, count, sizeof(uint16_t), cmp_uint16);
|
||||
|
||||
*options = list;
|
||||
return count;
|
||||
diff --git a/src/shared/fileio.c b/src/shared/fileio.c
|
||||
index 603a1c7..733b320 100644
|
||||
--- a/src/shared/fileio.c
|
||||
+++ b/src/shared/fileio.c
|
||||
@@ -662,6 +662,7 @@ int get_status_field(const char *filename, const char *pattern, char **field) {
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
+ assert(pattern);
|
||||
assert(field);
|
||||
|
||||
r = read_full_file(filename, &status, NULL);
|
||||
diff --git a/src/shared/util.h b/src/shared/util.h
|
||||
index 26af5b3..09e556d 100644
|
||||
--- a/src/shared/util.h
|
||||
+++ b/src/shared/util.h
|
||||
@@ -772,3 +772,15 @@ bool id128_is_valid(const char *s) _pure_;
|
||||
void parse_user_at_host(char *arg, char **user, char **host);
|
||||
|
||||
int split_pair(const char *s, const char *sep, char **l, char **r);
|
||||
+
|
||||
+/**
|
||||
+ * Normal qsort requires base to be nonnull. Here were require
|
||||
+ * that only if nmemb > 0.
|
||||
+ */
|
||||
+static inline void qsort_safe(void *base, size_t nmemb, size_t size,
|
||||
+ int (*compar)(const void *, const void *)) {
|
||||
+ if (nmemb) {
|
||||
+ assert(base);
|
||||
+ qsort(base, nmemb, size, compar);
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
|
||||
index d75281f..036828b 100644
|
||||
--- a/src/systemctl/systemctl.c
|
||||
+++ b/src/systemctl/systemctl.c
|
||||
@@ -471,7 +471,7 @@ static int list_units(DBusConnection *bus, char **args) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
- qsort(unit_infos, c, sizeof(struct unit_info), compare_unit_info);
|
||||
+ qsort_safe(unit_infos, c, sizeof(struct unit_info), compare_unit_info);
|
||||
|
||||
output_units_list(unit_infos, c);
|
||||
|
||||
@@ -733,8 +733,8 @@ static int list_sockets(DBusConnection *bus, char **args) {
|
||||
listen = triggered = NULL; /* avoid cleanup */
|
||||
}
|
||||
|
||||
- qsort(socket_infos, cs, sizeof(struct socket_info),
|
||||
- (__compar_fn_t) socket_info_compare);
|
||||
+ qsort_safe(socket_infos, cs, sizeof(struct socket_info),
|
||||
+ (__compar_fn_t) socket_info_compare);
|
||||
|
||||
output_sockets_list(socket_infos, cs);
|
||||
|
||||
@@ -1108,7 +1108,7 @@ static int list_dependencies_one(DBusConnection *bus, const char *name, int leve
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
- qsort(deps, strv_length(deps), sizeof (char*), list_dependencies_compare);
|
||||
+ qsort_safe(deps, strv_length(deps), sizeof (char*), list_dependencies_compare);
|
||||
|
||||
STRV_FOREACH(c, deps) {
|
||||
if (strv_contains(u, *c)) {
|
||||
@@ -3532,7 +3532,7 @@ static int show_all(const char* verb,
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
- qsort(unit_infos, c, sizeof(struct unit_info), compare_unit_info);
|
||||
+ qsort_safe(unit_infos, c, sizeof(struct unit_info), compare_unit_info);
|
||||
|
||||
for (u = unit_infos; u < unit_infos + c; u++) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,123 +0,0 @@
|
||||
---
|
||||
rules/99-systemd.rules.in | 2 -
|
||||
src/getty-generator/getty-generator.c | 2 -
|
||||
src/shared/util.c | 62 ++++++++++++++++++++++++++++++++--
|
||||
3 files changed, 61 insertions(+), 5 deletions(-)
|
||||
|
||||
--- systemd-208/rules/99-systemd.rules.in
|
||||
+++ systemd-208/rules/99-systemd.rules.in 2014-02-05 10:34:17.346235540 +0000
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
ACTION=="remove", GOTO="systemd_end"
|
||||
|
||||
-SUBSYSTEM=="tty", KERNEL=="tty[a-zA-Z]*|hvc*|xvc*|hvsi*", TAG+="systemd"
|
||||
+SUBSYSTEM=="tty", KERNEL=="tty[a-zA-Z]*|hvc*|xvc*|hvsi*|ttysclp*|sclp_line*|3270/tty*", TAG+="systemd"
|
||||
|
||||
KERNEL=="vport*", TAG+="systemd"
|
||||
|
||||
--- systemd-208/src/shared/util.c
|
||||
+++ systemd-208/src/shared/util.c 2014-01-31 11:54:07.222235280 +0000
|
||||
@@ -2967,6 +2967,7 @@ int status_vprintf(const char *status, b
|
||||
struct iovec iovec[6] = {};
|
||||
int n = 0;
|
||||
static bool prev_ephemeral;
|
||||
+ static int cached_on_tty = -1;
|
||||
|
||||
assert(format);
|
||||
|
||||
@@ -2980,6 +2981,51 @@ int status_vprintf(const char *status, b
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
+ if (_unlikely_(cached_on_tty < 0)) {
|
||||
+ cached_on_tty = isatty(fd) > 0;
|
||||
+ if (cached_on_tty) {
|
||||
+ const char *e = getenv("TERM");
|
||||
+ if (e && (strcmp(e, "dumb") == 0 || strcmp(e, "ibm327x") == 0)) {
|
||||
+ char *mode = NULL;
|
||||
+ int r = parse_env_file("/proc/cmdline", WHITESPACE, "conmode", &mode, NULL);
|
||||
+ if (r < 0 || !mode || !streq(mode, "3270"))
|
||||
+ cached_on_tty = 0;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (status && !cached_on_tty) {
|
||||
+ const char *esc, *ptr;
|
||||
+ esc = strchr(status, 0x1B);
|
||||
+ if (esc && (ptr = strpbrk(esc, "SOFDTI*"))) {
|
||||
+ switch(*ptr) {
|
||||
+ case 'S':
|
||||
+ status = " SKIP ";
|
||||
+ break;
|
||||
+ case 'O':
|
||||
+ status = " OK ";
|
||||
+ break;
|
||||
+ case 'F':
|
||||
+ status = "FAILED";
|
||||
+ break;
|
||||
+ case 'D':
|
||||
+ status = "DEPEND";
|
||||
+ break;
|
||||
+ case 'T':
|
||||
+ status = " TIME ";
|
||||
+ break;
|
||||
+ case 'I':
|
||||
+ status = " INFO ";
|
||||
+ break;
|
||||
+ case '*':
|
||||
+ status = " BUSY ";
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (ellipse) {
|
||||
char *e;
|
||||
size_t emax, sl;
|
||||
@@ -3002,8 +3048,12 @@ int status_vprintf(const char *status, b
|
||||
}
|
||||
}
|
||||
|
||||
- if (prev_ephemeral)
|
||||
- IOVEC_SET_STRING(iovec[n++], "\r" ANSI_ERASE_TO_END_OF_LINE);
|
||||
+ if (prev_ephemeral) {
|
||||
+ if (cached_on_tty)
|
||||
+ IOVEC_SET_STRING(iovec[n++], "\r" ANSI_ERASE_TO_END_OF_LINE);
|
||||
+ else
|
||||
+ IOVEC_SET_STRING(iovec[n++], "\r");
|
||||
+ }
|
||||
prev_ephemeral = ephemeral;
|
||||
|
||||
if (status) {
|
||||
@@ -3267,8 +3317,14 @@ void columns_lines_cache_reset(int signu
|
||||
bool on_tty(void) {
|
||||
static int cached_on_tty = -1;
|
||||
|
||||
- if (_unlikely_(cached_on_tty < 0))
|
||||
+ if (_unlikely_(cached_on_tty < 0)) {
|
||||
cached_on_tty = isatty(STDOUT_FILENO) > 0;
|
||||
+ if (cached_on_tty) {
|
||||
+ const char *e = getenv("TERM");
|
||||
+ if (e && (strcmp(e, "dumb") == 0))
|
||||
+ cached_on_tty = 0;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
return cached_on_tty;
|
||||
}
|
||||
--- systemd-208/src/getty-generator/getty-generator.c
|
||||
+++ systemd-208/src/getty-generator/getty-generator.c 2014-02-05 10:41:29.502245927 +0000
|
||||
@@ -149,9 +149,9 @@ int main(int argc, char *argv[]) {
|
||||
* only for non-VC terminals. */
|
||||
|
||||
k = add_serial_getty(tty);
|
||||
+ free(tty);
|
||||
|
||||
if (k < 0) {
|
||||
- free(tty);
|
||||
free(active);
|
||||
r = EXIT_FAILURE;
|
||||
goto finish;
|
@ -1,25 +0,0 @@
|
||||
From 7e326fb5b2c1a839bbe7f879c7efa2af2ed33420 Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Nykryn <lnykryn@redhat.com>
|
||||
Date: Wed, 2 Oct 2013 13:39:49 +0200
|
||||
Subject: [PATCH 01/15] acpi-fptd: fix memory leak in acpi_get_boot_usec
|
||||
|
||||
---
|
||||
src/shared/acpi-fpdt.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/shared/acpi-fpdt.c b/src/shared/acpi-fpdt.c
|
||||
index b094f34..a7c83ed 100644
|
||||
--- a/src/shared/acpi-fpdt.c
|
||||
+++ b/src/shared/acpi-fpdt.c
|
||||
@@ -81,7 +81,7 @@ struct acpi_fpdt_boot {
|
||||
};
|
||||
|
||||
int acpi_get_boot_usec(usec_t *loader_start, usec_t *loader_exit) {
|
||||
- char *buf;
|
||||
+ _cleanup_free_ char *buf;
|
||||
struct acpi_table_header *tbl;
|
||||
size_t l;
|
||||
struct acpi_fpdt_header *rec;
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,537 +0,0 @@
|
||||
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 <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
|
||||
+
|
||||
+/* 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-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 <http://www.gnu.org/licenses/>.
|
||||
+***/
|
||||
+
|
||||
+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:
|
@ -1,90 +0,0 @@
|
||||
From 95168f7d55181475946ad93db30255c4d709df03 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
|
||||
Date: Fri, 01 Nov 2013 21:57:47 +0000
|
||||
Subject: analyze: plot: place the text on the side with most space
|
||||
|
||||
Set the width of the svg to always fit the longest string
|
||||
while taking its starting position into consideration.
|
||||
|
||||
Place the text on the right while the starting point is
|
||||
in the first half of the screen. After that we put it on
|
||||
the left to save the svg from being wider that it has to.
|
||||
---
|
||||
diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c
|
||||
index 6bfe13d..8730723 100644
|
||||
--- a/src/analyze/systemd-analyze.c
|
||||
+++ b/src/analyze/systemd-analyze.c
|
||||
@@ -509,7 +509,7 @@ static int analyze_plot(sd_bus *bus) {
|
||||
m++;
|
||||
|
||||
for (u = times; u < times + n; u++) {
|
||||
- double len;
|
||||
+ double text_start, text_width;
|
||||
|
||||
if (u->ixt < boot->userspace_time ||
|
||||
u->ixt > boot->finish_time) {
|
||||
@@ -517,10 +517,14 @@ static int analyze_plot(sd_bus *bus) {
|
||||
u->name = NULL;
|
||||
continue;
|
||||
}
|
||||
- len = ((boot->firmware_time + u->ixt) * SCALE_X)
|
||||
- + (10.0 * strlen(u->name));
|
||||
- if (len > width)
|
||||
- width = len;
|
||||
+
|
||||
+ /* If the text cannot fit on the left side then
|
||||
+ * increase the svg width so it fits on the right.
|
||||
+ * TODO: calculate the text width more accurately */
|
||||
+ text_width = 8.0 * strlen(u->name);
|
||||
+ text_start = (boot->firmware_time + u->ixt) * SCALE_X;
|
||||
+ if (text_width > text_start && text_width + text_start > width)
|
||||
+ width = text_width + text_start;
|
||||
|
||||
if (u->iet > u->ixt && u->iet <= boot->finish_time
|
||||
&& u->aet == 0 && u->axt == 0)
|
||||
@@ -608,7 +612,7 @@ static int analyze_plot(sd_bus *bus) {
|
||||
svg_bar("active", boot->userspace_time, boot->finish_time, y);
|
||||
svg_bar("generators", boot->generators_start_time, boot->generators_finish_time, y);
|
||||
svg_bar("unitsload", boot->unitsload_start_time, boot->unitsload_finish_time, y);
|
||||
- svg_text("left", boot->userspace_time, y, "systemd");
|
||||
+ svg_text(true, boot->userspace_time, y, "systemd");
|
||||
y++;
|
||||
|
||||
for (u = times; u < times + n; u++) {
|
||||
@@ -622,7 +626,8 @@ static int analyze_plot(sd_bus *bus) {
|
||||
svg_bar("active", u->aet, u->axt, y);
|
||||
svg_bar("deactivating", u->axt, u->iet, y);
|
||||
|
||||
- b = u->ixt * SCALE_X > width * 2 / 3;
|
||||
+ /* place the text on the left if we have passed the half of the svg width */
|
||||
+ b = u->ixt * SCALE_X < width / 2;
|
||||
if (u->time)
|
||||
svg_text(b, u->ixt, y, "%s (%s)",
|
||||
u->name, format_timespan(ts, sizeof(ts), u->time, USEC_PER_MSEC));
|
||||
@@ -634,19 +639,19 @@ static int analyze_plot(sd_bus *bus) {
|
||||
/* Legend */
|
||||
y++;
|
||||
svg_bar("activating", 0, 300000, y);
|
||||
- svg_text("right", 400000, y, "Activating");
|
||||
+ svg_text(true, 400000, y, "Activating");
|
||||
y++;
|
||||
svg_bar("active", 0, 300000, y);
|
||||
- svg_text("right", 400000, y, "Active");
|
||||
+ svg_text(true, 400000, y, "Active");
|
||||
y++;
|
||||
svg_bar("deactivating", 0, 300000, y);
|
||||
- svg_text("right", 400000, y, "Deactivating");
|
||||
+ svg_text(true, 400000, y, "Deactivating");
|
||||
y++;
|
||||
svg_bar("generators", 0, 300000, y);
|
||||
- svg_text("right", 400000, y, "Generators");
|
||||
+ svg_text(true, 400000, y, "Generators");
|
||||
y++;
|
||||
svg_bar("unitsload", 0, 300000, y);
|
||||
- svg_text("right", 400000, y, "Loading unit files");
|
||||
+ svg_text(true, 400000, y, "Loading unit files");
|
||||
y++;
|
||||
|
||||
svg("</g>\n\n");
|
||||
--
|
||||
cgit v0.9.0.2-2-gbebe
|
@ -1,32 +0,0 @@
|
||||
From 418e37506e6a419a808a82081ca1616caa03a206 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Hindoe Paaboel Andersen <phomes@gmail.com>
|
||||
Date: Mon, 21 Oct 2013 19:29:23 +0000
|
||||
Subject: analyze: set white backgound
|
||||
|
||||
In programs like eog and gimp the transparant background did not
|
||||
look very good.
|
||||
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=70720
|
||||
---
|
||||
diff --git a/src/analyze/systemd-analyze.c b/src/analyze/systemd-analyze.c
|
||||
index 26769d6..0cc4de7 100644
|
||||
--- a/src/analyze/systemd-analyze.c
|
||||
+++ b/src/analyze/systemd-analyze.c
|
||||
@@ -507,6 +507,7 @@ static int analyze_plot(DBusConnection *bus) {
|
||||
/* style sheet */
|
||||
svg("<defs>\n <style type=\"text/css\">\n <![CDATA[\n"
|
||||
" rect { stroke-width: 1; stroke-opacity: 0; }\n"
|
||||
+ " rect.background { fill: rgb(255,255,255); }\n"
|
||||
" rect.activating { fill: rgb(255,0,0); fill-opacity: 0.7; }\n"
|
||||
" rect.active { fill: rgb(200,150,150); fill-opacity: 0.7; }\n"
|
||||
" rect.deactivating { fill: rgb(150,100,100); fill-opacity: 0.7; }\n"
|
||||
@@ -528,6 +529,7 @@ static int analyze_plot(DBusConnection *bus) {
|
||||
" text.sec { font-size: 10px; }\n"
|
||||
" ]]>\n </style>\n</defs>\n\n");
|
||||
|
||||
+ svg("<rect class=\"background\" width=\"100%%\" height=\"100%%\" />\n");
|
||||
svg("<text x=\"20\" y=\"50\">%s</text>", pretty_times);
|
||||
svg("<text x=\"20\" y=\"30\">%s %s (%s %s) %s</text>",
|
||||
isempty(osname) ? "Linux" : osname,
|
||||
--
|
||||
cgit v0.9.0.2-2-gbebe
|
@ -1,225 +0,0 @@
|
||||
From 6fa7e1a944a2dbb89e794ad0f9da5d0fda5dc4a9 Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
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 @@
|
||||
|
||||
<refnamediv>
|
||||
<refname>systemd.kill</refname>
|
||||
- <refpurpose>Kill environment configuration</refpurpose>
|
||||
+ <refpurpose>Process killing procedure
|
||||
+ configuration</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
<para><filename><replaceable>service</replaceable>.service</filename>,
|
||||
<filename><replaceable>socket</replaceable>.socket</filename>,
|
||||
<filename><replaceable>mount</replaceable>.mount</filename>,
|
||||
- <filename><replaceable>swap</replaceable>.swap</filename></para>
|
||||
+ <filename><replaceable>swap</replaceable>.swap</filename>,
|
||||
+ <filename><replaceable>scope</replaceable>.scope</filename></para>
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>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.</para>
|
||||
+ mount points, swap devices and scopes share a subset
|
||||
+ of configuration options which define the
|
||||
+ killing procedure of processes belonging to the unit.</para>
|
||||
|
||||
<para>This man page lists the configuration options
|
||||
- shared by these four unit types. See
|
||||
+ shared by these five unit types. See
|
||||
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||
- for the common options of all unit configuration
|
||||
- files, and
|
||||
+ for the common options shared by all unit
|
||||
+ configuration files, and
|
||||
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||
<citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||
- <citerefentry><refentrytitle>systemd.swap</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||
- and
|
||||
+ <citerefentry><refentrytitle>systemd.swap</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||
<citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||
- for more information on the specific unit
|
||||
- configuration files. The execution specific
|
||||
+ and
|
||||
+ <citerefentry><refentrytitle>systemd.scope</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||
+ for more information on the configuration file options
|
||||
+ specific to each unit type.</para>
|
||||
+
|
||||
+ <para>The kill procedure
|
||||
configuration options are configured in the [Service],
|
||||
- [Socket], [Mount], or [Swap] section, depending on the unit
|
||||
- type.</para>
|
||||
+ [Socket], [Mount] or [Swap] section, depending on the
|
||||
+ unit type.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
@@ -87,32 +92,40 @@
|
||||
<varlistentry>
|
||||
<term><varname>KillMode=</varname></term>
|
||||
<listitem><para>Specifies how
|
||||
- processes of this service shall be
|
||||
+ processes of this unit shall be
|
||||
killed. One of
|
||||
<option>control-group</option>,
|
||||
<option>process</option>,
|
||||
+ <option>mixed</option>,
|
||||
<option>none</option>.</para>
|
||||
|
||||
<para>If set to
|
||||
<option>control-group</option>, 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
|
||||
<varname>ExecStop=</varname>). If set
|
||||
to <option>process</option>, only the
|
||||
main process itself is killed. If set
|
||||
- to <option>none</option>, no process is
|
||||
+ to <option>mixed</option> the
|
||||
+ <constant>SIGTERM</constant> signal
|
||||
+ (see below) is sent to the main
|
||||
+ process while the subsequent
|
||||
+ <constant>SIGKILL</constant> signal
|
||||
+ (see below) is sent to all remaining
|
||||
+ processes of the unit's control
|
||||
+ group. If set to
|
||||
+ <option>none</option>, 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
|
||||
- <option>control-group</option>.</para>
|
||||
+ empty.</para>
|
||||
|
||||
<para>Processes will first be
|
||||
terminated via
|
||||
@@ -133,14 +146,24 @@
|
||||
option). See
|
||||
<citerefentry><refentrytitle>kill</refentrytitle><manvolnum>2</manvolnum></citerefentry>
|
||||
for more
|
||||
- information.</para></listitem>
|
||||
+ information.</para>
|
||||
+
|
||||
+ <para>Defaults to
|
||||
+ <option>control-group</option>.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>KillSignal=</varname></term>
|
||||
<listitem><para>Specifies which signal
|
||||
- to use when killing a
|
||||
- service. Defaults to <constant>SIGTERM</constant>.
|
||||
+ 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 <constant>SIGKILL</constant> (see
|
||||
+ above and below). For a list of valid
|
||||
+ signals, see
|
||||
+ <citerefentry><refentrytitle>signal</refentrytitle><manvolnum>7</manvolnum></citerefentry>. Defaults
|
||||
+ to <constant>SIGTERM</constant>.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
@@ -184,7 +207,9 @@
|
||||
<citerefentry><refentrytitle>systemd.swap</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||
<citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||
- <citerefentry><refentrytitle>systemd.directives</refentrytitle><manvolnum>7</manvolnum></citerefentry>
|
||||
+ <citerefentry><refentrytitle>systemd.directives</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
|
||||
+ <citerefentry><refentrytitle>kill</refentrytitle><manvolnum>2</manvolnum></citerefentry>,
|
||||
+ <citerefentry><refentrytitle>signal</refentrytitle><manvolnum>7</manvolnum></citerefentry>
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
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
|
||||
|
@ -1,329 +0,0 @@
|
||||
From d420282b28f50720e233ccb1c02547c562195653 Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
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 @@
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
- <term><varname>OnFailureIsolate=</varname></term>
|
||||
+ <term><varname>OnFailureJobMode=</varname></term>
|
||||
|
||||
- <listitem><para>Takes a boolean
|
||||
- argument. If <option>true</option>, the
|
||||
- unit listed in
|
||||
+ <listitem><para>Takes a value of
|
||||
+ <literal>fail</literal>,
|
||||
+ <literal>replace</literal>,
|
||||
+ <literal>replace-irreversibly</literal>
|
||||
+ or
|
||||
+ <literal>isolate</literal>. Defaults
|
||||
+ to
|
||||
+ <literal>replace</literal>. Specifies
|
||||
+ how the units listed in
|
||||
<varname>OnFailure=</varname> 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
|
||||
+ <literal>fail</literal> and
|
||||
+ contradicting jobs are already queued,
|
||||
+ cause the activation to fail. If set
|
||||
+ to <literal>replace</literal> and
|
||||
+ contradicting jobs area already
|
||||
+ queued, replace
|
||||
+ those. <literal>replace-irreversibly</literal>
|
||||
+ is similar to
|
||||
+ <literal>replace</literal>, however,
|
||||
+ creates jobs that cannot be reversed
|
||||
+ unless they finished or are explicitly
|
||||
+ canceled. <literal>isolate</literal>
|
||||
+ may be used to terminate all other
|
||||
+ units but the specified one. If
|
||||
+ this is set to
|
||||
+ <literal>isolate</literal>, only a
|
||||
single unit may be listed in
|
||||
- <varname>OnFailure=</varname>. Defaults
|
||||
- to
|
||||
- <option>false</option>.</para></listitem>
|
||||
+ <varname>OnFailure=</varname>..</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
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
|
@ -1,40 +0,0 @@
|
||||
From 8d1a28020409ee4afea6ef8c1c4d3522a209284e Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Wed, 9 Oct 2013 00:13:55 +0200
|
||||
Subject: [PATCH] core: unify the way we denote serialization attributes
|
||||
|
||||
---
|
||||
src/core/service.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/core/service.c b/src/core/service.c
|
||||
index 98b1599..96ed2d3 100644
|
||||
--- a/src/core/service.c
|
||||
+++ b/src/core/service.c
|
||||
@@ -2652,7 +2652,7 @@ static int service_serialize(Unit *u, FILE *f, FDSet *fds) {
|
||||
unit_serialize_item(u, f, "var-tmp-dir", s->exec_context.var_tmp_dir);
|
||||
|
||||
if (s->forbid_restart)
|
||||
- unit_serialize_item(u, f, "forbid_restart", yes_no(s->forbid_restart));
|
||||
+ unit_serialize_item(u, f, "forbid-restart", yes_no(s->forbid_restart));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2790,12 +2790,12 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
|
||||
return log_oom();
|
||||
|
||||
s->exec_context.var_tmp_dir = t;
|
||||
- } else if (streq(key, "forbid_restart")) {
|
||||
+ } else if (streq(key, "forbid-restart")) {
|
||||
int b;
|
||||
|
||||
b = parse_boolean(value);
|
||||
if (b < 0)
|
||||
- log_debug_unit(u->id, "Failed to parse forbid_restart value %s", value);
|
||||
+ log_debug_unit(u->id, "Failed to parse forbid-restart value %s", value);
|
||||
else
|
||||
s->forbid_restart = b;
|
||||
} else
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,71 +0,0 @@
|
||||
From 74dcc2df7b2a340c3e1fe9e61e5c8deb324c83d7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
||||
Date: Fri, 11 Oct 2013 19:33:20 -0400
|
||||
Subject: [PATCH] dbus-common: avoid leak in error path
|
||||
|
||||
src/shared/dbus-common.c:968:33: warning: Potential leak of memory pointed to by 'l'
|
||||
return -EINVAL;
|
||||
^~~~~~
|
||||
---
|
||||
src/shared/dbus-common.c | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/src/shared/dbus-common.c b/src/shared/dbus-common.c
|
||||
index c727cae..3ba2d87 100644
|
||||
--- a/src/shared/dbus-common.c
|
||||
+++ b/src/shared/dbus-common.c
|
||||
@@ -934,7 +934,7 @@ int bus_parse_strv_iter(DBusMessageIter *iter, char ***_l) {
|
||||
int bus_parse_strv_pairs_iter(DBusMessageIter *iter, char ***_l) {
|
||||
DBusMessageIter sub, sub2;
|
||||
unsigned n = 0, i = 0;
|
||||
- char **l;
|
||||
+ _cleanup_strv_free_ char **l = NULL;
|
||||
|
||||
assert(iter);
|
||||
assert(_l);
|
||||
@@ -953,6 +953,7 @@ int bus_parse_strv_pairs_iter(DBusMessageIter *iter, char ***_l) {
|
||||
l = new(char*, n*2+1);
|
||||
if (!l)
|
||||
return -ENOMEM;
|
||||
+ l[0] = NULL; /* make sure that l is properly terminated at all times */
|
||||
|
||||
dbus_message_iter_recurse(iter, &sub);
|
||||
|
||||
@@ -968,26 +969,25 @@ int bus_parse_strv_pairs_iter(DBusMessageIter *iter, char ***_l) {
|
||||
return -EINVAL;
|
||||
|
||||
l[i] = strdup(a);
|
||||
- if (!l[i]) {
|
||||
- strv_free(l);
|
||||
+ if (!l[i])
|
||||
return -ENOMEM;
|
||||
- }
|
||||
+ i++;
|
||||
|
||||
- l[++i] = strdup(b);
|
||||
- if (!l[i]) {
|
||||
- strv_free(l);
|
||||
+ l[i] = strdup(b);
|
||||
+ if (!l[i])
|
||||
return -ENOMEM;
|
||||
- }
|
||||
-
|
||||
i++;
|
||||
+
|
||||
dbus_message_iter_next(&sub);
|
||||
}
|
||||
|
||||
assert(i == n*2);
|
||||
l[i] = NULL;
|
||||
|
||||
- if (_l)
|
||||
+ if (_l) {
|
||||
*_l = l;
|
||||
+ l = NULL; /* avoid freeing */
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,33 +0,0 @@
|
||||
From 6c7980093c4e39d07bf06484f96f489e236c7c29 Mon Sep 17 00:00:00 2001
|
||||
From: Kay Sievers <kay@vrfy.org>
|
||||
Date: Thu, 10 Oct 2013 01:38:11 +0200
|
||||
Subject: [PATCH] do not accept "garbage" from acpi firmware performance data
|
||||
(FPDT)
|
||||
|
||||
00000000 46 42 50 54 38 00 00 00 02 00 30 02 00 00 00 00 |FBPT8.....0.....|
|
||||
00000010 23 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |#E..............|
|
||||
00000020 f5 6a 51 00 00 00 00 00 00 00 00 00 00 00 00 00 |.jQ.............|
|
||||
00000030 00 00 00 00 00 00 00 00 70 74 61 6c 58 00 00 00 |........ptalX...|
|
||||
---
|
||||
src/shared/acpi-fpdt.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/src/shared/acpi-fpdt.c b/src/shared/acpi-fpdt.c
|
||||
index af58c7c..75648b4 100644
|
||||
--- a/src/shared/acpi-fpdt.c
|
||||
+++ b/src/shared/acpi-fpdt.c
|
||||
@@ -146,6 +146,11 @@ int acpi_get_boot_usec(usec_t *loader_start, usec_t *loader_exit) {
|
||||
if (brec.type != ACPI_FPDT_BOOT_REC)
|
||||
return -EINVAL;
|
||||
|
||||
+ if (brec.startup_start == 0 || brec.exit_services_exit < brec.startup_start)
|
||||
+ return -EINVAL;
|
||||
+ if (brec.exit_services_exit > NSEC_PER_HOUR)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
if (loader_start)
|
||||
*loader_start = brec.startup_start / 1000;
|
||||
if (loader_exit)
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,29 +0,0 @@
|
||||
From 6891529fe1176c046ece579807ff48e3191692f3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
||||
Date: Fri, 11 Oct 2013 19:33:36 -0400
|
||||
Subject: [PATCH] drop-ins: check return value
|
||||
|
||||
If the function failed, nothing serious would happen
|
||||
because unlink would probably return EFAULT, but this
|
||||
would obscure the real error and is a bit sloppy.
|
||||
---
|
||||
src/core/unit.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/src/core/unit.c b/src/core/unit.c
|
||||
index 4b97710..1db7d06 100644
|
||||
--- a/src/core/unit.c
|
||||
+++ b/src/core/unit.c
|
||||
@@ -2908,6 +2908,9 @@ int unit_remove_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name) {
|
||||
return 0;
|
||||
|
||||
r = drop_in_file(u, mode, name, &p, &q);
|
||||
+ if (r < 0)
|
||||
+ return r;
|
||||
+
|
||||
if (unlink(q) < 0)
|
||||
r = errno == ENOENT ? 0 : -errno;
|
||||
else
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,40 +0,0 @@
|
||||
From 9a5cb1371b6d8b0a04bd08665bcf9b06cb40c64c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
||||
Date: Thu, 3 Oct 2013 22:13:01 -0400
|
||||
Subject: [PATCH] gpt-auto-generator: exit immediately if in container
|
||||
|
||||
Otherwise we get an ugly warning when running systemd in
|
||||
a container.
|
||||
---
|
||||
src/gpt-auto-generator/gpt-auto-generator.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c
|
||||
index ca54925..d2b4213 100644
|
||||
--- a/src/gpt-auto-generator/gpt-auto-generator.c
|
||||
+++ b/src/gpt-auto-generator/gpt-auto-generator.c
|
||||
@@ -38,6 +38,7 @@
|
||||
#include "libudev.h"
|
||||
#include "special.h"
|
||||
#include "unit-name.h"
|
||||
+#include "virt.h"
|
||||
|
||||
/* TODO:
|
||||
*
|
||||
@@ -481,6 +482,13 @@ int main(int argc, char *argv[]) {
|
||||
umask(0022);
|
||||
|
||||
if (in_initrd()) {
|
||||
+ log_debug("In initrd, exiting.");
|
||||
+ r = 0;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ if (detect_container(NULL) > 0) {
|
||||
+ log_debug("In a container, exiting.");
|
||||
r = 0;
|
||||
goto finish;
|
||||
}
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,25 +0,0 @@
|
||||
From 2ee0591d12b9e725c4585502285fd91cde682d9b Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Wed, 9 Oct 2013 04:03:45 +0200
|
||||
Subject: [PATCH] journald: fix minor memory leak
|
||||
|
||||
---
|
||||
src/journal/journal-vacuum.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/journal/journal-vacuum.c b/src/journal/journal-vacuum.c
|
||||
index c73ad8f..8d5effb 100644
|
||||
--- a/src/journal/journal-vacuum.c
|
||||
+++ b/src/journal/journal-vacuum.c
|
||||
@@ -278,6 +278,8 @@ int journal_directory_vacuum(
|
||||
} else if (errno != ENOENT)
|
||||
log_warning("Failed to delete %s/%s: %m", directory, p);
|
||||
|
||||
+ free(p);
|
||||
+
|
||||
continue;
|
||||
}
|
||||
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,39 +0,0 @@
|
||||
From 2b98f75a63e6022bf74a7d678c47faa5208c794f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
||||
Date: Wed, 9 Oct 2013 22:13:13 -0400
|
||||
Subject: [PATCH] journald: remove rotated file from hashmap when rotation
|
||||
fails
|
||||
|
||||
Before, when the user journal file was rotated, journal_file_rotate
|
||||
could close the old file and fail to open the new file. In that
|
||||
case, we would leave the old (deallocated) file in the hashmap.
|
||||
On subsequent accesses, we could retrieve this stale entry, leading
|
||||
to a segfault.
|
||||
|
||||
When journal_file_rotate fails with the file pointer set to 0,
|
||||
old file is certainly gone, and cannot be used anymore.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=890463
|
||||
---
|
||||
src/journal/journald-server.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c
|
||||
index 4f47eb1..e03e413 100644
|
||||
--- a/src/journal/journald-server.c
|
||||
+++ b/src/journal/journald-server.c
|
||||
@@ -321,8 +321,10 @@ void server_rotate(Server *s) {
|
||||
if (r < 0)
|
||||
if (f)
|
||||
log_error("Failed to rotate %s: %s", f->path, strerror(-r));
|
||||
- else
|
||||
+ else {
|
||||
log_error("Failed to create user journal: %s", strerror(-r));
|
||||
+ hashmap_remove(s->user_journals, k);
|
||||
+ }
|
||||
else {
|
||||
hashmap_replace(s->user_journals, k, f);
|
||||
server_fix_perms(s, f, PTR_TO_UINT32(k));
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,27 +0,0 @@
|
||||
From 3f4fee033bf0f623de74f3e8a14c42b8ff81c36e Mon Sep 17 00:00:00 2001
|
||||
From: David Herrmann <dh.herrmann@gmail.com>
|
||||
Date: Thu, 10 Oct 2013 13:09:37 +0200
|
||||
Subject: [PATCH] login: fix invalid free() in sd_session_get_vt()
|
||||
|
||||
We need to clear variables markes as _cleanup_free_. Otherwise, our
|
||||
error-paths might corrupt random memory.
|
||||
---
|
||||
src/login/sd-login.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/login/sd-login.c b/src/login/sd-login.c
|
||||
index 71d8c29..6c27dfe 100644
|
||||
--- a/src/login/sd-login.c
|
||||
+++ b/src/login/sd-login.c
|
||||
@@ -350,7 +350,7 @@ _public_ int sd_session_get_tty(const char *session, char **tty) {
|
||||
}
|
||||
|
||||
_public_ int sd_session_get_vt(const char *session, unsigned *vtnr) {
|
||||
- _cleanup_free_ char *vtnr_string;
|
||||
+ _cleanup_free_ char *vtnr_string = NULL;
|
||||
unsigned u;
|
||||
int r;
|
||||
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,27 +0,0 @@
|
||||
From 0581dac2c146cef0f55841a4c136dc48409c8eaa Mon Sep 17 00:00:00 2001
|
||||
From: David Herrmann <dh.herrmann@gmail.com>
|
||||
Date: Thu, 10 Oct 2013 13:11:27 +0200
|
||||
Subject: [PATCH] login: make sd_session_get_vt() actually work
|
||||
|
||||
We use VTNR, not VTNr as key. Until now sd_session_get_vt() just returns
|
||||
an error.
|
||||
---
|
||||
src/login/sd-login.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/login/sd-login.c b/src/login/sd-login.c
|
||||
index 6c27dfe..7e25041 100644
|
||||
--- a/src/login/sd-login.c
|
||||
+++ b/src/login/sd-login.c
|
||||
@@ -354,7 +354,7 @@ _public_ int sd_session_get_vt(const char *session, unsigned *vtnr) {
|
||||
unsigned u;
|
||||
int r;
|
||||
|
||||
- r = session_get_string(session, "VTNr", &vtnr_string);
|
||||
+ r = session_get_string(session, "VTNR", &vtnr_string);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,25 +0,0 @@
|
||||
From 660ea9620f7b8f99d08a2770d4e81acfd8aea02e Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Fri, 4 Oct 2013 21:16:40 +0200
|
||||
Subject: [PATCH] logind: fix bus introspection data for TakeControl()
|
||||
|
||||
---
|
||||
src/login/logind-session-dbus.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c
|
||||
index 5f6bafb..be4e01c 100644
|
||||
--- a/src/login/logind-session-dbus.c
|
||||
+++ b/src/login/logind-session-dbus.c
|
||||
@@ -41,7 +41,7 @@
|
||||
" <arg name=\"who\" type=\"s\"/>\n" \
|
||||
" <arg name=\"signal\" type=\"s\"/>\n" \
|
||||
" </method>\n" \
|
||||
- " <method name=\"TakeControl\"/>\n" \
|
||||
+ " <method name=\"TakeControl\">\n" \
|
||||
" <arg name=\"force\" type=\"b\"/>\n" \
|
||||
" </method>\n" \
|
||||
" <method name=\"ReleaseControl\"/>\n" \
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,28 +0,0 @@
|
||||
From 63966da86d8e71b1f3f2b57d5448770d526421f9 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Bächler <thomas@archlinux.org>
|
||||
Date: Sun, 15 Dec 2013 11:06:37 +0000
|
||||
Subject: login: Don't stop a running user manager from garbage-collecting the user.
|
||||
|
||||
With the current logic, a user will never be garbage-collected, since its
|
||||
manager will always be around. Change the logic such that a user is
|
||||
garbage-collected when it has no sessions and linger is disabled.
|
||||
---
|
||||
diff --git a/src/login/logind-user.c b/src/login/logind-user.c
|
||||
index 6ba8d98..441e086 100644
|
||||
--- a/src/login/logind-user.c
|
||||
+++ b/src/login/logind-user.c
|
||||
@@ -629,12 +629,6 @@ int user_check_gc(User *u, bool drop_not
|
||||
if (u->slice_job || u->service_job)
|
||||
return 1;
|
||||
|
||||
- if (u->slice && manager_unit_is_active(u->manager, u->slice) != 0)
|
||||
- return 1;
|
||||
-
|
||||
- if (u->service && manager_unit_is_active(u->manager, u->service) != 0)
|
||||
- return 1;
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
cgit v0.9.0.2-2-gbebe
|
@ -1,45 +0,0 @@
|
||||
From a316932f5a627c1ef78f568fd5dfa579f12e76b2 Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Fri, 4 Oct 2013 17:01:37 +0200
|
||||
Subject: [PATCH] manager: when verifying whether clients may change
|
||||
environment using selinux check for "reload" rather "reboot"
|
||||
|
||||
This appears to be a copy/paste error.
|
||||
---
|
||||
src/core/dbus-manager.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c
|
||||
index 676a07f..8f4d017 100644
|
||||
--- a/src/core/dbus-manager.c
|
||||
+++ b/src/core/dbus-manager.c
|
||||
@@ -1397,7 +1397,7 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
char **e = NULL;
|
||||
|
||||
- SELINUX_ACCESS_CHECK(connection, message, "reboot");
|
||||
+ SELINUX_ACCESS_CHECK(connection, message, "reload");
|
||||
|
||||
r = bus_parse_strv(message, &l);
|
||||
if (r == -ENOMEM)
|
||||
@@ -1424,7 +1424,7 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
char **e = NULL;
|
||||
|
||||
- SELINUX_ACCESS_CHECK(connection, message, "reboot");
|
||||
+ SELINUX_ACCESS_CHECK(connection, message, "reload");
|
||||
|
||||
r = bus_parse_strv(message, &l);
|
||||
if (r == -ENOMEM)
|
||||
@@ -1452,7 +1452,7 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
|
||||
char **f = NULL;
|
||||
DBusMessageIter iter;
|
||||
|
||||
- SELINUX_ACCESS_CHECK(connection, message, "reboot");
|
||||
+ SELINUX_ACCESS_CHECK(connection, message, "reload");
|
||||
|
||||
if (!dbus_message_iter_init(message, &iter))
|
||||
goto oom;
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,29 +0,0 @@
|
||||
From 9c03872bc8fb2a381eafe7301ef9811b641686dd Mon Sep 17 00:00:00 2001
|
||||
From: Dave Reisner <dreisner@archlinux.org>
|
||||
Date: Fri, 4 Oct 2013 18:22:40 -0400
|
||||
Subject: [PATCH] mount: check for NULL before reading pm->what
|
||||
|
||||
Since a57f7e2c828b85, a mount unit with garbage in it would cause
|
||||
systemd to crash on loading it.
|
||||
|
||||
ref: https://bugs.freedesktop.org/show_bug.cgi?id=70148
|
||||
---
|
||||
src/core/mount.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/core/mount.c b/src/core/mount.c
|
||||
index 93bfa99..db055f0 100644
|
||||
--- a/src/core/mount.c
|
||||
+++ b/src/core/mount.c
|
||||
@@ -182,7 +182,7 @@ static int mount_add_mount_links(Mount *m) {
|
||||
* for the source path (if this is a bind mount) to be
|
||||
* available. */
|
||||
pm = get_mount_parameters_fragment(m);
|
||||
- if (pm && path_is_absolute(pm->what)) {
|
||||
+ if (pm && pm->what && path_is_absolute(pm->what)) {
|
||||
r = unit_require_mounts_for(UNIT(m), pm->what);
|
||||
if (r < 0)
|
||||
return r;
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,28 +0,0 @@
|
||||
From a8ccacf5344c4434b1d5ff3837307acb8fcf93d2 Mon Sep 17 00:00:00 2001
|
||||
From: Bastien Nocera <hadess@hadess.net>
|
||||
Date: Mon, 14 Oct 2013 08:15:51 +0200
|
||||
Subject: [PATCH] shared/util: Fix glob_extend() argument
|
||||
|
||||
glob_extend() would completely fail to work, or return incorrect
|
||||
data if it wasn't being passed the current getopt "optarg" variable
|
||||
as it used the global variable, instead of the passed parameters.
|
||||
---
|
||||
src/shared/util.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/shared/util.c b/src/shared/util.c
|
||||
index 54dbace..1822770 100644
|
||||
--- a/src/shared/util.c
|
||||
+++ b/src/shared/util.c
|
||||
@@ -4461,7 +4461,7 @@ int glob_extend(char ***strv, const char *path) {
|
||||
char **p;
|
||||
|
||||
errno = 0;
|
||||
- k = glob(optarg, GLOB_NOSORT|GLOB_BRACE, NULL, &g);
|
||||
+ k = glob(path, GLOB_NOSORT|GLOB_BRACE, NULL, &g);
|
||||
|
||||
if (k == GLOB_NOMATCH)
|
||||
return -ENOENT;
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,50 +0,0 @@
|
||||
From 1d5989fd803d2019de0f6aaaf3cfb1cb2bbc3cdb Mon Sep 17 00:00:00 2001
|
||||
From: Dave Reisner <dreisner@archlinux.org>
|
||||
Date: Sun, 6 Oct 2013 18:26:23 -0400
|
||||
Subject: [PATCH] shared/util: fix off-by-one error in tag_to_udev_node
|
||||
|
||||
Triggered false negatives when encoding a string which needed every
|
||||
character to be escaped, e.g. "LABEL=/".
|
||||
---
|
||||
src/shared/util.c | 2 +-
|
||||
src/test/test-device-nodes.c | 4 +++-
|
||||
2 files changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/shared/util.c b/src/shared/util.c
|
||||
index 82f4221..31cea79 100644
|
||||
--- a/src/shared/util.c
|
||||
+++ b/src/shared/util.c
|
||||
@@ -3527,7 +3527,7 @@ static char *tag_to_udev_node(const char *tagvalue, const char *by) {
|
||||
if (u == NULL)
|
||||
return NULL;
|
||||
|
||||
- enc_len = strlen(u) * 4;
|
||||
+ enc_len = strlen(u) * 4 + 1;
|
||||
t = new(char, enc_len);
|
||||
if (t == NULL)
|
||||
return NULL;
|
||||
diff --git a/src/test/test-device-nodes.c b/src/test/test-device-nodes.c
|
||||
index 2f3dedb..59ba4be 100644
|
||||
--- a/src/test/test-device-nodes.c
|
||||
+++ b/src/test/test-device-nodes.c
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
/* helpers for test_encode_devnode_name */
|
||||
static char *do_encode_string(const char *in) {
|
||||
- size_t out_len = strlen(in) * 4;
|
||||
+ size_t out_len = strlen(in) * 4 + 1;
|
||||
char *out = malloc(out_len);
|
||||
|
||||
assert_se(out);
|
||||
@@ -46,6 +46,8 @@ static void test_encode_devnode_name(void) {
|
||||
assert_se(expect_encoded_as("pinkiepie", "pinkiepie"));
|
||||
assert_se(expect_encoded_as("valíd\\ųtf8", "valíd\\x5cųtf8"));
|
||||
assert_se(expect_encoded_as("s/ash/ng", "s\\x2fash\\x2fng"));
|
||||
+ assert_se(expect_encoded_as("/", "\\x2f"));
|
||||
+ assert_se(expect_encoded_as("!", "\\x21"));
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,41 +0,0 @@
|
||||
From 77009452cfd25208509b14ea985e81fdf9f7d40e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
||||
Date: Thu, 3 Oct 2013 22:15:08 -0400
|
||||
Subject: [PATCH] systemd: order remote mounts from mountinfo before
|
||||
remote-fs.target
|
||||
|
||||
Usually the network is stopped before filesystems are umounted.
|
||||
Ordering network filesystems before remote-fs.target means that their
|
||||
unmounting will be performed earlier, and can terminate sucessfully.
|
||||
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=70002
|
||||
---
|
||||
src/core/mount.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/core/mount.c b/src/core/mount.c
|
||||
index 3d46557..93bfa99 100644
|
||||
--- a/src/core/mount.c
|
||||
+++ b/src/core/mount.c
|
||||
@@ -1440,6 +1440,9 @@ static int mount_add_one(
|
||||
|
||||
u = manager_get_unit(m, e);
|
||||
if (!u) {
|
||||
+ const char* const target =
|
||||
+ fstype_is_network(fstype) ? SPECIAL_REMOTE_FS_TARGET : SPECIAL_LOCAL_FS_TARGET;
|
||||
+
|
||||
delete = true;
|
||||
|
||||
u = unit_new(m, sizeof(Mount));
|
||||
@@ -1466,7 +1469,7 @@ static int mount_add_one(
|
||||
goto fail;
|
||||
}
|
||||
|
||||
- r = unit_add_dependency_by_name(u, UNIT_BEFORE, SPECIAL_LOCAL_FS_TARGET, NULL, true);
|
||||
+ r = unit_add_dependency_by_name(u, UNIT_BEFORE, target, NULL, true);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,51 +0,0 @@
|
||||
From 6aca9a587d4ad40b1c044f99e3714022201b9fd4 Mon Sep 17 00:00:00 2001
|
||||
From: Sylvia Else <sylviabz1@cryogenic.net>
|
||||
Date: Sun, 6 Oct 2013 23:06:35 -0400
|
||||
Subject: [PATCH] systemd: serialize/deserialize forbid_restart value
|
||||
|
||||
The Service type's forbid_restart field was not preserved by
|
||||
serialization/deserialization, so the fact that the service should not
|
||||
be restarted after stopping was lost.
|
||||
|
||||
If a systemctl stop foo command has been given, but the foo service
|
||||
has not yet stopped, and then the systemctl --system daemon-reload was
|
||||
given, then when the foo service eventually stopped, systemd would
|
||||
restart it.
|
||||
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=69800
|
||||
---
|
||||
src/core/service.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/src/core/service.c b/src/core/service.c
|
||||
index 6792024..98b1599 100644
|
||||
--- a/src/core/service.c
|
||||
+++ b/src/core/service.c
|
||||
@@ -2651,6 +2651,9 @@ static int service_serialize(Unit *u, FILE *f, FDSet *fds) {
|
||||
if (s->exec_context.var_tmp_dir)
|
||||
unit_serialize_item(u, f, "var-tmp-dir", s->exec_context.var_tmp_dir);
|
||||
|
||||
+ if (s->forbid_restart)
|
||||
+ unit_serialize_item(u, f, "forbid_restart", yes_no(s->forbid_restart));
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2787,6 +2790,14 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
|
||||
return log_oom();
|
||||
|
||||
s->exec_context.var_tmp_dir = t;
|
||||
+ } else if (streq(key, "forbid_restart")) {
|
||||
+ int b;
|
||||
+
|
||||
+ b = parse_boolean(value);
|
||||
+ if (b < 0)
|
||||
+ log_debug_unit(u->id, "Failed to parse forbid_restart value %s", value);
|
||||
+ else
|
||||
+ s->forbid_restart = b;
|
||||
} else
|
||||
log_debug_unit(u->id, "Unknown serialization key '%s'", key);
|
||||
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,85 +0,0 @@
|
||||
--- 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) {
|
@ -1,55 +0,0 @@
|
||||
From 6c8c92fef72cf6a7ef7109a424ef82dbdc4f6952 Mon Sep 17 00:00:00 2001
|
||||
From: Dave Reisner <dreisner@archlinux.org>
|
||||
Date: Wed, 2 Oct 2013 07:46:24 -0400
|
||||
Subject: [PATCH 02/15] fix lingering references to
|
||||
/var/lib/{backlight,random-seed}
|
||||
|
||||
This should have been part of ef5bfcf668e6029faa78534dfe.
|
||||
---
|
||||
man/systemd-backlight@.service.xml | 2 +-
|
||||
man/systemd-random-seed.service.xml | 2 +-
|
||||
units/systemd-backlight@.service.in | 2 +-
|
||||
3 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/man/systemd-backlight@.service.xml b/man/systemd-backlight@.service.xml
|
||||
index 2b73625..4318964 100644
|
||||
--- a/man/systemd-backlight@.service.xml
|
||||
+++ b/man/systemd-backlight@.service.xml
|
||||
@@ -58,7 +58,7 @@
|
||||
is a service that restores the display backlight
|
||||
brightness at early-boot and saves it at shutdown. On
|
||||
disk, the backlight brightness is stored in
|
||||
- <filename>/var/lib/backlight/</filename>. Note that by
|
||||
+ <filename>/var/lib/systemd/backlight/</filename>. Note that by
|
||||
default, only firmware backlight devices are
|
||||
saved/restored.</para>
|
||||
</refsect1>
|
||||
diff --git a/man/systemd-random-seed.service.xml b/man/systemd-random-seed.service.xml
|
||||
index 8cd14b7..e5cd037 100644
|
||||
--- a/man/systemd-random-seed.service.xml
|
||||
+++ b/man/systemd-random-seed.service.xml
|
||||
@@ -61,7 +61,7 @@
|
||||
for details. Saving/restoring the random seed across
|
||||
boots increases the amount of available entropy early
|
||||
at boot. On disk the random seed is stored in
|
||||
- <filename>/var/lib/random-seed</filename>.</para>
|
||||
+ <filename>/var/lib/systemd/random-seed</filename>.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
diff --git a/units/systemd-backlight@.service.in b/units/systemd-backlight@.service.in
|
||||
index b0e75db..5caa5d5 100644
|
||||
--- a/units/systemd-backlight@.service.in
|
||||
+++ b/units/systemd-backlight@.service.in
|
||||
@@ -9,7 +9,7 @@
|
||||
Description=Load/Save Screen Backlight Brightness of %I
|
||||
Documentation=man:systemd-backlight@.service(8)
|
||||
DefaultDependencies=no
|
||||
-RequiresMountsFor=/var/lib/backlight
|
||||
+RequiresMountsFor=/var/lib/systemd/backlight
|
||||
Conflicts=shutdown.target
|
||||
After=systemd-readahead-collect.service systemd-readahead-replay.service systemd-remount-fs.service
|
||||
Before=sysinit.target shutdown.target
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,62 +0,0 @@
|
||||
From 95d57e7b631a2d78b9b5d841125194052895470f Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
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
|
||||
|
@ -1,25 +0,0 @@
|
||||
From 2c64a8d0caf84254e38f2e76528f2034d37da520 Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Wed, 2 Oct 2013 14:03:56 +0200
|
||||
Subject: [PATCH 03/15] acpi: make sure we never free an uninitialized pointer
|
||||
|
||||
---
|
||||
src/shared/acpi-fpdt.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/shared/acpi-fpdt.c b/src/shared/acpi-fpdt.c
|
||||
index a7c83ed..af58c7c 100644
|
||||
--- a/src/shared/acpi-fpdt.c
|
||||
+++ b/src/shared/acpi-fpdt.c
|
||||
@@ -81,7 +81,7 @@ struct acpi_fpdt_boot {
|
||||
};
|
||||
|
||||
int acpi_get_boot_usec(usec_t *loader_start, usec_t *loader_exit) {
|
||||
- _cleanup_free_ char *buf;
|
||||
+ _cleanup_free_ char *buf = NULL;
|
||||
struct acpi_table_header *tbl;
|
||||
size_t l;
|
||||
struct acpi_fpdt_header *rec;
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,128 +0,0 @@
|
||||
From b2ffdc8da536cd88a305f97517f356e2c5383a52 Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
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
|
||||
|
@ -1,134 +0,0 @@
|
||||
From cbb13b2a538ece1c7ec3b210e2b36b47df2a13ea Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=A1clav=20Pavl=C3=ADn?= <vpavlin@redhat.com>
|
||||
Date: Wed, 2 Oct 2013 16:42:42 +0200
|
||||
Subject: [PATCH 04/15] systemctl: fix name mangling for sysv units
|
||||
|
||||
---
|
||||
src/systemctl/systemctl.c | 45 ++++++++++++++++++---------------------------
|
||||
1 file changed, 18 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
|
||||
index bb7ada9..d75281f 100644
|
||||
--- a/src/systemctl/systemctl.c
|
||||
+++ b/src/systemctl/systemctl.c
|
||||
@@ -4218,11 +4218,10 @@ static int set_environment(DBusConnection *bus, char **args) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int enable_sysv_units(char **args) {
|
||||
+static int enable_sysv_units(const char *verb, char **args) {
|
||||
int r = 0;
|
||||
|
||||
#if defined(HAVE_SYSV_COMPAT) && defined(HAVE_CHKCONFIG)
|
||||
- const char *verb = args[0];
|
||||
unsigned f = 1, t = 1;
|
||||
LookupPaths paths = {};
|
||||
|
||||
@@ -4242,7 +4241,7 @@ static int enable_sysv_units(char **args) {
|
||||
return r;
|
||||
|
||||
r = 0;
|
||||
- for (f = 1; args[f]; f++) {
|
||||
+ for (f = 0; args[f]; f++) {
|
||||
const char *name;
|
||||
_cleanup_free_ char *p = NULL, *q = NULL;
|
||||
bool found_native = false, found_sysv;
|
||||
@@ -4365,7 +4364,7 @@ finish:
|
||||
lookup_paths_free(&paths);
|
||||
|
||||
/* Drop all SysV units */
|
||||
- for (f = 1, t = 1; args[f]; f++) {
|
||||
+ for (f = 0, t = 0; args[f]; f++) {
|
||||
|
||||
if (isempty(args[f]))
|
||||
continue;
|
||||
@@ -4423,16 +4422,16 @@ static int enable_unit(DBusConnection *bus, char **args) {
|
||||
|
||||
dbus_error_init(&error);
|
||||
|
||||
- r = enable_sysv_units(args);
|
||||
- if (r < 0)
|
||||
- return r;
|
||||
-
|
||||
if (!args[1])
|
||||
return 0;
|
||||
|
||||
r = mangle_names(args+1, &mangled_names);
|
||||
if (r < 0)
|
||||
- goto finish;
|
||||
+ return r;
|
||||
+
|
||||
+ r = enable_sysv_units(verb, mangled_names);
|
||||
+ if (r < 0)
|
||||
+ return r;
|
||||
|
||||
if (!bus || avoid_bus()) {
|
||||
if (streq(verb, "enable")) {
|
||||
@@ -4624,11 +4623,15 @@ static int unit_is_enabled(DBusConnection *bus, char **args) {
|
||||
_cleanup_dbus_message_unref_ DBusMessage *reply = NULL;
|
||||
bool enabled;
|
||||
char **name;
|
||||
- char *n;
|
||||
+ _cleanup_strv_free_ char **mangled_names = NULL;
|
||||
|
||||
dbus_error_init(&error);
|
||||
|
||||
- r = enable_sysv_units(args);
|
||||
+ r = mangle_names(args+1, &mangled_names);
|
||||
+ if (r < 0)
|
||||
+ return r;
|
||||
+
|
||||
+ r = enable_sysv_units(args[0], mangled_names);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@@ -4636,16 +4639,10 @@ static int unit_is_enabled(DBusConnection *bus, char **args) {
|
||||
|
||||
if (!bus || avoid_bus()) {
|
||||
|
||||
- STRV_FOREACH(name, args+1) {
|
||||
+ STRV_FOREACH(name, mangled_names) {
|
||||
UnitFileState state;
|
||||
|
||||
- n = unit_name_mangle(*name);
|
||||
- if (!n)
|
||||
- return log_oom();
|
||||
-
|
||||
- state = unit_file_get_state(arg_scope, arg_root, n);
|
||||
-
|
||||
- free(n);
|
||||
+ state = unit_file_get_state(arg_scope, arg_root, *name);
|
||||
|
||||
if (state < 0)
|
||||
return state;
|
||||
@@ -4660,13 +4657,9 @@ static int unit_is_enabled(DBusConnection *bus, char **args) {
|
||||
}
|
||||
|
||||
} else {
|
||||
- STRV_FOREACH(name, args+1) {
|
||||
+ STRV_FOREACH(name, mangled_names) {
|
||||
const char *s;
|
||||
|
||||
- n = unit_name_mangle(*name);
|
||||
- if (!n)
|
||||
- return log_oom();
|
||||
-
|
||||
r = bus_method_call_with_reply (
|
||||
bus,
|
||||
"org.freedesktop.systemd1",
|
||||
@@ -4675,11 +4668,9 @@ static int unit_is_enabled(DBusConnection *bus, char **args) {
|
||||
"GetUnitFileState",
|
||||
&reply,
|
||||
NULL,
|
||||
- DBUS_TYPE_STRING, &n,
|
||||
+ DBUS_TYPE_STRING, name,
|
||||
DBUS_TYPE_INVALID);
|
||||
|
||||
- free(n);
|
||||
-
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,48 +0,0 @@
|
||||
From 4b93637fd7dddb0a1518f35171998b2c7cd5c5bd Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Wed, 2 Oct 2013 19:36:28 +0200
|
||||
Subject: [PATCH 05/15] cryptsetup: fix OOM handling when parsing mount options
|
||||
|
||||
---
|
||||
src/cryptsetup/cryptsetup.c | 11 ++++++-----
|
||||
1 file changed, 6 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/src/cryptsetup/cryptsetup.c b/src/cryptsetup/cryptsetup.c
|
||||
index 22b5eea..769c3e4 100644
|
||||
--- a/src/cryptsetup/cryptsetup.c
|
||||
+++ b/src/cryptsetup/cryptsetup.c
|
||||
@@ -74,7 +74,7 @@ static int parse_one_option(const char *option) {
|
||||
|
||||
t = strdup(option+7);
|
||||
if (!t)
|
||||
- return -ENOMEM;
|
||||
+ return log_oom();
|
||||
|
||||
free(opt_cipher);
|
||||
opt_cipher = t;
|
||||
@@ -89,9 +89,10 @@ static int parse_one_option(const char *option) {
|
||||
} else if (startswith(option, "tcrypt-keyfile=")) {
|
||||
|
||||
opt_type = CRYPT_TCRYPT;
|
||||
- if (path_is_absolute(option+15))
|
||||
- opt_tcrypt_keyfiles = strv_append(opt_tcrypt_keyfiles, strdup(option+15));
|
||||
- else
|
||||
+ if (path_is_absolute(option+15)) {
|
||||
+ if (strv_extend(&opt_tcrypt_keyfiles, option + 15) < 0)
|
||||
+ return log_oom();
|
||||
+ } else
|
||||
log_error("Key file path '%s' is not absolute. Ignoring.", option+15);
|
||||
|
||||
} else if (startswith(option, "keyfile-size=")) {
|
||||
@@ -113,7 +114,7 @@ static int parse_one_option(const char *option) {
|
||||
|
||||
t = strdup(option+5);
|
||||
if (!t)
|
||||
- return -ENOMEM;
|
||||
+ return log_oom();
|
||||
|
||||
free(opt_hash);
|
||||
opt_hash = t;
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,25 +0,0 @@
|
||||
From 8c92d4bbc7a538ada11d7e85016cce141beb0e6c Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Wed, 2 Oct 2013 19:36:43 +0200
|
||||
Subject: [PATCH 06/15] journald: add missing error check
|
||||
|
||||
---
|
||||
src/journal/journal-file.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
|
||||
index 1236403..81c344f 100644
|
||||
--- a/src/journal/journal-file.c
|
||||
+++ b/src/journal/journal-file.c
|
||||
@@ -907,6 +907,8 @@ static int journal_file_append_field(
|
||||
|
||||
osize = offsetof(Object, field.payload) + size;
|
||||
r = journal_file_append_object(f, OBJECT_FIELD, osize, &o, &p);
|
||||
+ if (r < 0)
|
||||
+ return r;
|
||||
|
||||
o->field.hash = htole64(hash);
|
||||
memcpy(o->field.payload, field, size);
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,34 +0,0 @@
|
||||
From f5f6e41a9ee008e1632f79ab3fa20beef7c2b613 Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Wed, 2 Oct 2013 19:37:11 +0200
|
||||
Subject: [PATCH 07/15] bus: fix potentially uninitialized memory access
|
||||
|
||||
---
|
||||
src/libsystemd-bus/bus-internal.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/libsystemd-bus/bus-internal.c b/src/libsystemd-bus/bus-internal.c
|
||||
index 0e66f3d..cac948e 100644
|
||||
--- a/src/libsystemd-bus/bus-internal.c
|
||||
+++ b/src/libsystemd-bus/bus-internal.c
|
||||
@@ -63,7 +63,7 @@ bool object_path_is_valid(const char *p) {
|
||||
|
||||
bool interface_name_is_valid(const char *p) {
|
||||
const char *q;
|
||||
- bool dot, found_dot;
|
||||
+ bool dot, found_dot = false;
|
||||
|
||||
if (isempty(p))
|
||||
return false;
|
||||
@@ -103,7 +103,7 @@ bool interface_name_is_valid(const char *p) {
|
||||
|
||||
bool service_name_is_valid(const char *p) {
|
||||
const char *q;
|
||||
- bool dot, found_dot, unique;
|
||||
+ bool dot, found_dot = false, unique;
|
||||
|
||||
if (isempty(p))
|
||||
return false;
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,30 +0,0 @@
|
||||
From 2e8d788c2f90d062f208f8c57a97e7b33cb29f7d Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Wed, 2 Oct 2013 19:37:30 +0200
|
||||
Subject: [PATCH 08/15] dbus: fix return value of dispatch_rqueue()
|
||||
|
||||
---
|
||||
src/libsystemd-bus/sd-bus.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/libsystemd-bus/sd-bus.c b/src/libsystemd-bus/sd-bus.c
|
||||
index 3f766fb..db0880f 100644
|
||||
--- a/src/libsystemd-bus/sd-bus.c
|
||||
+++ b/src/libsystemd-bus/sd-bus.c
|
||||
@@ -1215,11 +1215,11 @@ static int dispatch_rqueue(sd_bus *bus, sd_bus_message **m) {
|
||||
if (r == 0)
|
||||
return ret;
|
||||
|
||||
- r = 1;
|
||||
+ ret = 1;
|
||||
} while (!z);
|
||||
|
||||
*m = z;
|
||||
- return 1;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *serial) {
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,27 +0,0 @@
|
||||
From b857193b1def5172e3641ca1d5bc9e08ae81aac4 Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Wed, 2 Oct 2013 19:37:44 +0200
|
||||
Subject: [PATCH 09/15] modules-load: fix error handling
|
||||
|
||||
---
|
||||
src/modules-load/modules-load.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/modules-load/modules-load.c b/src/modules-load/modules-load.c
|
||||
index 7b19ee0..49ee420 100644
|
||||
--- a/src/modules-load/modules-load.c
|
||||
+++ b/src/modules-load/modules-load.c
|
||||
@@ -302,8 +302,8 @@ int main(int argc, char *argv[]) {
|
||||
|
||||
STRV_FOREACH(i, arg_proc_cmdline_modules) {
|
||||
k = load_module(ctx, *i);
|
||||
- if (k < 0)
|
||||
- r = EXIT_FAILURE;
|
||||
+ if (k < 0 && r == 0)
|
||||
+ r = k;
|
||||
}
|
||||
|
||||
r = conf_files_list_nulstr(&files, ".conf", NULL, conf_file_dirs);
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,26 +0,0 @@
|
||||
From 62678deda2dcd43954bf02f783da01e48c7f8fce Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Wed, 2 Oct 2013 19:38:09 +0200
|
||||
Subject: [PATCH 10/15] efi: never call qsort on potentially NULL arrays
|
||||
|
||||
---
|
||||
src/shared/efivars.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/shared/efivars.c b/src/shared/efivars.c
|
||||
index 1d5b6f9..c015b16 100644
|
||||
--- a/src/shared/efivars.c
|
||||
+++ b/src/shared/efivars.c
|
||||
@@ -384,7 +384,8 @@ int efi_get_boot_options(uint16_t **options) {
|
||||
list[count ++] = id;
|
||||
}
|
||||
|
||||
- qsort(list, count, sizeof(uint16_t), cmp_uint16);
|
||||
+ if (list)
|
||||
+ qsort(list, count, sizeof(uint16_t), cmp_uint16);
|
||||
|
||||
*options = list;
|
||||
return count;
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,27 +0,0 @@
|
||||
From 5b4fb02d890d5c9777e9a6e798e0b8922a8a9fd8 Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Wed, 2 Oct 2013 19:38:28 +0200
|
||||
Subject: [PATCH 11/15] strv: don't access potentially NULL string arrays
|
||||
|
||||
---
|
||||
src/shared/env-util.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/shared/env-util.c b/src/shared/env-util.c
|
||||
index 5e29629..7976881 100644
|
||||
--- a/src/shared/env-util.c
|
||||
+++ b/src/shared/env-util.c
|
||||
@@ -405,7 +405,9 @@ char **strv_env_clean_log(char **e, const char *message) {
|
||||
e[k++] = *p;
|
||||
}
|
||||
|
||||
- e[k] = NULL;
|
||||
+ if (e)
|
||||
+ e[k] = NULL;
|
||||
+
|
||||
return e;
|
||||
}
|
||||
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,26 +0,0 @@
|
||||
From 69c2b6be8fc607412a13cd0ea03a629b4965c816 Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Wed, 2 Oct 2013 19:38:52 +0200
|
||||
Subject: [PATCH 12/15] mkdir: pass a proper function pointer to
|
||||
mkdir_safe_internal
|
||||
|
||||
---
|
||||
src/shared/mkdir.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/shared/mkdir.c b/src/shared/mkdir.c
|
||||
index b7e5c6e..43c6ea6 100644
|
||||
--- a/src/shared/mkdir.c
|
||||
+++ b/src/shared/mkdir.c
|
||||
@@ -53,7 +53,7 @@ int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, mkd
|
||||
}
|
||||
|
||||
int mkdir_safe(const char *path, mode_t mode, uid_t uid, gid_t gid) {
|
||||
- return mkdir_safe_internal(path, mode, uid, gid, false);
|
||||
+ return mkdir_safe_internal(path, mode, uid, gid, mkdir);
|
||||
}
|
||||
|
||||
static int is_dir(const char* path) {
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,26 +0,0 @@
|
||||
From 7074fecf6747c9a6ad872cc87701481e8bece8b0 Mon Sep 17 00:00:00 2001
|
||||
From: Dave Reisner <dreisner@archlinux.org>
|
||||
Date: Wed, 2 Oct 2013 15:35:16 -0400
|
||||
Subject: [PATCH 14/15] tmpfiles.d: include setgid perms for /run/log/journal
|
||||
|
||||
4608af4333d0f7f5 set permissions for journal storage on persistent disk
|
||||
but not the volatile storage.
|
||||
|
||||
ref: https://bugs.archlinux.org/task/37170
|
||||
---
|
||||
tmpfiles.d/systemd.conf | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/tmpfiles.d/systemd.conf b/tmpfiles.d/systemd.conf
|
||||
index b630440..a05c657 100644
|
||||
--- a/tmpfiles.d/systemd.conf
|
||||
+++ b/tmpfiles.d/systemd.conf
|
||||
@@ -26,3 +26,5 @@ F /run/nologin 0644 - - - "System is booting up. See pam_nologin(8)"
|
||||
|
||||
m /var/log/journal 2755 root systemd-journal - -
|
||||
m /var/log/journal/%m 2755 root systemd-journal - -
|
||||
+m /run/log/journal 2755 root systemd-journal - -
|
||||
+m /run/log/journal/%m 2755 root systemd-journal - -
|
||||
--
|
||||
1.8.4
|
||||
|
@ -1,118 +0,0 @@
|
||||
From: Robert Milasan <rmilasan@suse.com>
|
||||
Date: Thu, 12 Jul 2012 15:56:34 +0000
|
||||
Subject: re-enable by_path links for ata devices
|
||||
|
||||
Fix by-path links for ATA transport (bnc#770910)
|
||||
---
|
||||
src/udev/udev-builtin-path_id.c | 92 +++++++++++++++++++++++++++++++++++------
|
||||
1 file changed, 80 insertions(+), 12 deletions(-)
|
||||
|
||||
--- systemd-206.orig/src/udev/udev-builtin-path_id.c
|
||||
+++ systemd-206/src/udev/udev-builtin-path_id.c
|
||||
@@ -338,6 +338,85 @@ static struct udev_device *handle_scsi_h
|
||||
return parent;
|
||||
}
|
||||
|
||||
+static struct udev_device *handle_ata(struct udev_device *parent, char **path)
|
||||
+{
|
||||
+ struct udev_device *hostdev;
|
||||
+ int host, bus, target, lun;
|
||||
+ const char *name;
|
||||
+ char *base;
|
||||
+ char *pos;
|
||||
+ DIR *dir;
|
||||
+ struct dirent *dent;
|
||||
+ int basenum, len;
|
||||
+
|
||||
+ hostdev = udev_device_get_parent_with_subsystem_devtype(parent, "scsi", "scsi_host");
|
||||
+ if (hostdev == NULL)
|
||||
+ return NULL;
|
||||
+
|
||||
+ name = udev_device_get_sysname(parent);
|
||||
+ if (sscanf(name, "%d:%d:%d:%d", &host, &bus, &target, &lun) != 4)
|
||||
+ return NULL;
|
||||
+
|
||||
+ /* rebase ata offset to get the local relative number */
|
||||
+ basenum = -1;
|
||||
+ base = strdup(udev_device_get_syspath(hostdev));
|
||||
+ if (base == NULL)
|
||||
+ return NULL;
|
||||
+ pos = strrchr(base, '/');
|
||||
+ if (pos == NULL) {
|
||||
+ parent = NULL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ pos[0] = '\0';
|
||||
+ len = strlen(base) - 5;
|
||||
+ if (len <= 0) {
|
||||
+ parent = NULL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ base[len] = '\0';
|
||||
+ dir = opendir(base);
|
||||
+ if (dir == NULL) {
|
||||
+ parent = NULL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
|
||||
+ char *rest;
|
||||
+ int i;
|
||||
+
|
||||
+ if (dent->d_name[0] == '.')
|
||||
+ continue;
|
||||
+ if (dent->d_type != DT_DIR && dent->d_type != DT_LNK)
|
||||
+ continue;
|
||||
+ if (strncmp(dent->d_name, "ata", 3) != 0)
|
||||
+ continue;
|
||||
+ i = strtoul(&dent->d_name[3], &rest, 10);
|
||||
+
|
||||
+ /* ata devices start with 1, so decrease by 1 if i is bigger then 0 */
|
||||
+ if (i > 0)
|
||||
+ i--;
|
||||
+ if (rest[0] != '\0')
|
||||
+ continue;
|
||||
+ /*
|
||||
+ * find the smallest number; the host really needs to export its
|
||||
+ * own instance number per parent device; relying on the global host
|
||||
+ * enumeration and plainly rebasing the numbers sounds unreliable
|
||||
+ */
|
||||
+ if (basenum == -1 || i < basenum)
|
||||
+ basenum = i;
|
||||
+ }
|
||||
+ closedir(dir);
|
||||
+ if (basenum == -1) {
|
||||
+ parent = NULL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ host -= basenum;
|
||||
+
|
||||
+ path_prepend(path, "scsi-%u:%u:%u:%u", host, bus, target, lun);
|
||||
+out:
|
||||
+ free(base);
|
||||
+ return hostdev;
|
||||
+}
|
||||
+
|
||||
static struct udev_device *handle_scsi(struct udev_device *parent, char **path)
|
||||
{
|
||||
const char *devtype;
|
||||
@@ -374,19 +453,8 @@ static struct udev_device *handle_scsi(s
|
||||
goto out;
|
||||
}
|
||||
|
||||
- /*
|
||||
- * We do not support the ATA transport class, it uses global counters
|
||||
- * to name the ata devices which numbers spread across multiple
|
||||
- * controllers.
|
||||
- *
|
||||
- * The real link numbers are not exported. Also, possible chains of ports
|
||||
- * behind port multipliers cannot be composed that way.
|
||||
- *
|
||||
- * Until all that is solved at the kernel level, there are no by-path/
|
||||
- * links for ATA devices.
|
||||
- */
|
||||
if (strstr(name, "/ata") != NULL) {
|
||||
- parent = NULL;
|
||||
+ parent = handle_ata(parent, path);
|
||||
goto out;
|
||||
}
|
||||
|
@ -1,22 +0,0 @@
|
||||
From: Robert Milasan <rmilasan@suse.com>
|
||||
Date: Wed, 27 Jun 2012 08:55:59 +0000
|
||||
Subject: rules create by id scsi links for ATA devices
|
||||
|
||||
Re-enable creation of by-id scsi links for ATA devices. (bnc#769002)
|
||||
---
|
||||
rules/60-persistent-storage.rules | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- systemd-206.orig/rules/60-persistent-storage.rules
|
||||
+++ systemd-206/rules/60-persistent-storage.rules
|
||||
@@ -42,6 +42,10 @@ KERNEL=="cciss*", ENV{DEVTYPE}=="disk",
|
||||
KERNEL=="sd*|sr*|cciss*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
|
||||
KERNEL=="sd*|cciss*", ENV{DEVTYPE}=="partition", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}-part%n"
|
||||
|
||||
+# scsi compat links for ATA devices
|
||||
+KERNEL=="sd*[!0-9]", ENV{ID_BUS}=="ata", PROGRAM="scsi_id --whitelisted --replace-whitespace -p0x80 -d $devnode", RESULT=="?*", ENV{ID_SCSI_COMPAT}="$result", SYMLINK+="disk/by-id/scsi-$env{ID_SCSI_COMPAT}"
|
||||
+KERNEL=="sd*[0-9]", ENV{ID_SCSI_COMPAT}=="?*", SYMLINK+="disk/by-id/scsi-$env{ID_SCSI_COMPAT}-part%n"
|
||||
+
|
||||
# firewire
|
||||
KERNEL=="sd*[!0-9]|sr*", ATTRS{ieee1394_id}=="?*", SYMLINK+="disk/by-id/ieee1394-$attr{ieee1394_id}"
|
||||
KERNEL=="sd*[0-9]", ATTRS{ieee1394_id}=="?*", SYMLINK+="disk/by-id/ieee1394-$attr{ieee1394_id}-part%n"
|
@ -1,20 +0,0 @@
|
||||
From: Robert Milasan <rmilasan@suse.com>
|
||||
Date: Mon, 6 Aug 2012 13:35:34 +0000
|
||||
Subject: udev netlink null rules
|
||||
|
||||
udevd race for netlink events (bnc#774646)
|
||||
---
|
||||
src/udev/udevd.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- systemd-206.orig/src/udev/udevd.c
|
||||
+++ systemd-206/src/udev/udevd.c
|
||||
@@ -1337,6 +1337,8 @@ int main(int argc, char *argv[])
|
||||
dev = udev_monitor_receive_device(monitor);
|
||||
if (dev != NULL) {
|
||||
udev_device_set_usec_initialized(dev, now(CLOCK_MONOTONIC));
|
||||
+ if (rules == NULL)
|
||||
+ rules = udev_rules_new(udev, resolve_names);
|
||||
if (event_queue_insert(dev) < 0)
|
||||
udev_device_unref(dev);
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
From: Robert Milasan <rmilasan@suse.com>
|
||||
Date: Tue, 12 Feb 2013 09:16:23 +0000
|
||||
Subject: create default links for primary cd_dvd drive
|
||||
|
||||
cdrom_id: created links for the default cd/dvd drive (bnc#783054).
|
||||
---
|
||||
rules/60-cdrom_id.rules | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
--- systemd-206.orig/rules/60-cdrom_id.rules
|
||||
+++ systemd-206/rules/60-cdrom_id.rules
|
||||
@@ -15,6 +15,9 @@ ENV{DISK_EJECT_REQUEST}=="?*", RUN+="cdr
|
||||
# enable the receiving of media eject button events
|
||||
IMPORT{program}="cdrom_id --lock-media $devnode"
|
||||
|
||||
-KERNEL=="sr0", SYMLINK+="cdrom", OPTIONS+="link_priority=-100"
|
||||
+KERNEL=="sr0", ENV{ID_CDROM}=="1", SYMLINK+="cdrom", OPTIONS+="link_priority=-100"
|
||||
+KERNEL=="sr0", ENV{ID_CDROM_CD_RW}=="1", SYMLINK+="cdrw", OPTIONS+="link_priority=-100"
|
||||
+KERNEL=="sr0", ENV{ID_CDROM_DVD}=="1", SYMLINK+="dvd", OPTIONS+="link_priority=-100"
|
||||
+KERNEL=="sr0", ENV{ID_CDROM_DVD_RW}=="1", SYMLINK+="dvdrw", OPTIONS+="link_priority=-100"
|
||||
|
||||
LABEL="cdrom_end"
|
@ -1,75 +0,0 @@
|
||||
From: Robert Milasan <rmilasan@suse.com>
|
||||
Date: Thu, 28 Mar 2013 09:24:43 +0000
|
||||
Subject: udev always rename network
|
||||
|
||||
udev: ensure that the network interfaces are renamed even if they exist
|
||||
(bnc#809843).
|
||||
---
|
||||
src/udev/udev-event.c | 46 +++++++++++++++++++++++++++++++++++++++++++---
|
||||
1 file changed, 43 insertions(+), 3 deletions(-)
|
||||
|
||||
--- systemd-206.orig/src/udev/udev-event.c
|
||||
+++ systemd-206/src/udev/udev-event.c
|
||||
@@ -750,6 +750,7 @@ static int rename_netif(struct udev_even
|
||||
struct udev_device *dev = event->dev;
|
||||
int sk;
|
||||
struct ifreq ifr;
|
||||
+ int loop;
|
||||
int err;
|
||||
|
||||
log_debug("changing net interface name from '%s' to '%s'\n",
|
||||
@@ -766,12 +767,51 @@ static int rename_netif(struct udev_even
|
||||
strscpy(ifr.ifr_name, IFNAMSIZ, udev_device_get_sysname(dev));
|
||||
strscpy(ifr.ifr_newname, IFNAMSIZ, event->name);
|
||||
err = ioctl(sk, SIOCSIFNAME, &ifr);
|
||||
- if (err >= 0) {
|
||||
+ if (err == 0) {
|
||||
print_kmsg("renamed network interface %s to %s\n", ifr.ifr_name, ifr.ifr_newname);
|
||||
- } else {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ /* keep trying if the destination interface name already exists */
|
||||
+ err = -errno;
|
||||
+ if (err != -EEXIST) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ /* free our own name, another process may wait for us */
|
||||
+ snprintf(ifr.ifr_newname, IFNAMSIZ, "rename%u", udev_device_get_ifindex(dev));
|
||||
+ err = ioctl(sk, SIOCSIFNAME, &ifr);
|
||||
+ if (err < 0) {
|
||||
err = -errno;
|
||||
- log_error("error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname);
|
||||
+ goto out;
|
||||
}
|
||||
+
|
||||
+ /* log temporary name */
|
||||
+ print_kmsg("renamed network interface %s to %s\n", ifr.ifr_name, ifr.ifr_newname);
|
||||
+
|
||||
+ /* wait a maximum of 90 seconds for our target to become available */
|
||||
+ strscpy(ifr.ifr_name, IFNAMSIZ, ifr.ifr_newname);
|
||||
+ strscpy(ifr.ifr_newname, IFNAMSIZ, event->name);
|
||||
+ loop = 90 * 20;
|
||||
+ while (loop--) {
|
||||
+ const struct timespec duration = { 0, 1000 * 1000 * 1000 / 20 };
|
||||
+
|
||||
+ log_debug("wait for netif '%s' to become free, loop=%i\n", event->name, (90 * 20) - loop);
|
||||
+ nanosleep(&duration, NULL);
|
||||
+
|
||||
+ err = ioctl(sk, SIOCSIFNAME, &ifr);
|
||||
+ if (err == 0) {
|
||||
+ print_kmsg("renamed network interface %s to %s\n", ifr.ifr_name, ifr.ifr_newname);
|
||||
+ break;
|
||||
+ }
|
||||
+ err = -errno;
|
||||
+ if (err != -EEXIST)
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ if (err < 0)
|
||||
+ log_error("error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname);
|
||||
close(sk);
|
||||
return err;
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
--- /dev/null
|
||||
+++ systemd-206/rules/80-hotplug-cpu-mem.rules
|
||||
@@ -0,0 +1,9 @@
|
||||
+# do not edit this file, it will be overwritten on update
|
||||
+
|
||||
+# Hotplug physical CPU
|
||||
+SUBSYSTEM=="cpu", ACTION=="add", TEST=="online", ATTR{online}=="0", \
|
||||
+ ATTR{online}="1"
|
||||
+
|
||||
+# Hotplug physical memory
|
||||
+SUBSYSTEM=="memory", ACTION=="add", TEST=="state", ATTR{state}=="offline", \
|
||||
+ ATTR{state}="online"
|
||||
--- systemd-206.orig/Makefile.am
|
||||
+++ systemd-206/Makefile.am
|
||||
@@ -2480,6 +2480,10 @@ dist_udevrules_DATA += \
|
||||
rules/73-seat-numlock.rules
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
+dist_udevrules_DATA += \
|
||||
+ rules/80-hotplug-cpu-mem.rules
|
||||
+
|
||||
+# ------------------------------------------------------------------------------
|
||||
if ENABLE_GUDEV
|
||||
if ENABLE_GTK_DOC
|
||||
SUBDIRS += \
|
@ -1,25 +0,0 @@
|
||||
--- systemd-206.orig/Makefile.am
|
||||
+++ systemd-206/Makefile.am
|
||||
@@ -2484,6 +2484,10 @@ dist_udevrules_DATA += \
|
||||
rules/80-hotplug-cpu-mem.rules
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
+dist_udevrules_DATA += \
|
||||
+ rules/61-msft.rules
|
||||
+
|
||||
+# ------------------------------------------------------------------------------
|
||||
if ENABLE_GUDEV
|
||||
if ENABLE_GTK_DOC
|
||||
SUBDIRS += \
|
||||
--- /dev/null
|
||||
+++ systemd-206/rules/61-msft.rules
|
||||
@@ -0,0 +1,9 @@
|
||||
+# MSFT compability rules
|
||||
+ACTION!="add|change", GOTO="msft_end"
|
||||
+
|
||||
+ENV{DEVTYPE}=="partition", IMPORT{parent}="SCSI_IDENT_*"
|
||||
+KERNEL=="sd*[!0-9]|sr*", ENV{SCSI_IDENT_LUN_T10}!="?*", IMPORT{program}="/usr/bin/sg_inq -p di --export $tempnode"
|
||||
+KERNEL=="sd*|sr*", ENV{DEVTYPE}=="disk", ENV{SCSI_IDENT_LUN_T10}=="?*", SYMLINK+="disk/by-id/scsi-1$env{SCSI_IDENT_LUN_T10}"
|
||||
+KERNEL=="sd*", ENV{DEVTYPE}=="partition", ENV{SCSI_IDENT_LUN_T10}=="?*", SYMLINK+="disk/by-id/scsi-1$env{SCSI_IDENT_LUN_T10}-part%n"
|
||||
+
|
||||
+LABEL="msft_end"
|
@ -1,10 +0,0 @@
|
||||
--- systemd-208/man/custom-man.xsl
|
||||
+++ systemd-208/man/custom-man.xsl 2013-10-21 09:23:31.030735259 +0000
|
||||
@@ -61,4 +61,7 @@
|
||||
<xsl:text>"</xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
+<xsl:param name="man.output.in.separate.dir" select="1"></xsl:param>
|
||||
+<xsl:param name="man.output.base.dir"></xsl:param>
|
||||
+
|
||||
</xsl:stylesheet>
|
@ -1,13 +0,0 @@
|
||||
|
|
||||
| Belongs to bnc#849071 that is do not install console-shell.service
|
||||
| in any system target as this will cause automatic poweroff at boot.
|
||||
|
|
||||
--- systemd-208/units/console-shell.service.m4.in
|
||||
+++ systemd-208/units/console-shell.service.m4.in 2013-11-06 09:35:37.958693570 +0000
|
||||
@@ -26,6 +26,3 @@ StandardError=inherit
|
||||
KillMode=process
|
||||
IgnoreSIGPIPE=no
|
||||
SendSIGHUP=yes
|
||||
-
|
||||
-[Install]
|
||||
-WantedBy=getty.target
|
@ -1,62 +0,0 @@
|
||||
From: Werner Fink <werner@suse.de>
|
||||
Date: Thu, 21 Nov 2013 11:50:32 +0000
|
||||
Subject: [PATCH] Avoid busy systemd-journald
|
||||
|
||||
Avoid a busy systemd-journald due polling a broken /dec/kmsg in lxc
|
||||
environments.
|
||||
|
||||
---
|
||||
journald-kmsg.c | 18 +++++++++++++++---
|
||||
1 file changed, 15 insertions(+), 3 deletions(-)
|
||||
|
||||
Index: systemd-208/src/journal/journald-kmsg.c
|
||||
===================================================================
|
||||
--- systemd-208/src/journal/journald-kmsg.c
|
||||
+++ systemd-208/src/journal/journald-kmsg.c 2013-12-20 11:34:39.762236175 +0000
|
||||
@@ -377,15 +377,18 @@ int server_flush_dev_kmsg(Server *s) {
|
||||
|
||||
int server_open_dev_kmsg(Server *s) {
|
||||
struct epoll_event ev;
|
||||
+ int r;
|
||||
|
||||
assert(s);
|
||||
|
||||
s->dev_kmsg_fd = open("/dev/kmsg", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
|
||||
if (s->dev_kmsg_fd < 0) {
|
||||
- log_warning("Failed to open /dev/kmsg, ignoring: %m");
|
||||
+ log_full(errno == ENOENT ? LOG_DEBUG : LOG_WARNING,
|
||||
+ "Failed to open /dev/kmsg, ignoring: %m");
|
||||
return 0;
|
||||
}
|
||||
|
||||
+ r = 0;
|
||||
zero(ev);
|
||||
ev.events = EPOLLIN;
|
||||
ev.data.fd = s->dev_kmsg_fd;
|
||||
@@ -394,15 +397,24 @@ int server_open_dev_kmsg(Server *s) {
|
||||
/* This will fail with EPERM on older kernels where
|
||||
* /dev/kmsg is not readable. */
|
||||
if (errno == EPERM)
|
||||
- return 0;
|
||||
+ goto fail;
|
||||
|
||||
log_error("Failed to add /dev/kmsg fd to epoll object: %m");
|
||||
- return -errno;
|
||||
+ r = -errno;
|
||||
+ goto fail;
|
||||
}
|
||||
|
||||
s->dev_kmsg_readable = true;
|
||||
|
||||
return 0;
|
||||
+
|
||||
+fail:
|
||||
+ if (s->dev_kmsg_fd >= 0) {
|
||||
+ close_nointr_nofail(s->dev_kmsg_fd);
|
||||
+ s->dev_kmsg_fd = -1;
|
||||
+ }
|
||||
+
|
||||
+ return r;
|
||||
}
|
||||
|
||||
int server_open_kernel_seqnum(Server *s) {
|
@ -1,168 +0,0 @@
|
||||
Based on upstream baae0358f349870544884e405e82e4be7d8add9f
|
||||
| From: Lennart Poettering <lennart@poettering.net>
|
||||
| Date: Tue, 26 Nov 2013 04:05:00 +0000
|
||||
| Subject: pam_systemd: do not set XDG_RUNTIME_DIR if the session's original user is not the same as the newly logged in one
|
||||
| It's better not to set any XDG_RUNTIME_DIR at all rather than one of a
|
||||
| different user. So let's do this.
|
||||
--- systemd-208/src/login/logind-dbus.c
|
||||
+++ systemd-208/src/login/logind-dbus.c 2013-11-26 13:37:05.730735774 +0000
|
||||
@@ -523,6 +523,7 @@ static int bus_manager_create_session(Ma
|
||||
DBUS_TYPE_OBJECT_PATH, &path,
|
||||
DBUS_TYPE_STRING, &session->user->runtime_path,
|
||||
DBUS_TYPE_UNIX_FD, &fifo_fd,
|
||||
+ DBUS_TYPE_UINT32, &session->user->uid,
|
||||
DBUS_TYPE_STRING, &cseat,
|
||||
DBUS_TYPE_UINT32, &vtnr,
|
||||
DBUS_TYPE_BOOLEAN, &exists,
|
||||
--- systemd-208/src/login/logind-session-dbus.c
|
||||
+++ systemd-208/src/login/logind-session-dbus.c 2013-11-26 13:36:07.478236401 +0000
|
||||
@@ -755,6 +755,7 @@ int session_send_create_reply(Session *s
|
||||
DBUS_TYPE_OBJECT_PATH, &path,
|
||||
DBUS_TYPE_STRING, &s->user->runtime_path,
|
||||
DBUS_TYPE_UNIX_FD, &fifo_fd,
|
||||
+ DBUS_TYPE_UINT32, &s->user->uid,
|
||||
DBUS_TYPE_STRING, &cseat,
|
||||
DBUS_TYPE_UINT32, &vtnr,
|
||||
DBUS_TYPE_BOOLEAN, &exists,
|
||||
--- systemd-208/src/login/pam-module.c
|
||||
+++ systemd-208/src/login/pam-module.c 2013-11-26 14:32:20.194235777 +0000
|
||||
@@ -93,24 +93,18 @@ static int get_user_data(
|
||||
assert(ret_username);
|
||||
assert(ret_pw);
|
||||
|
||||
- r = audit_loginuid_from_pid(0, &uid);
|
||||
- if (r >= 0)
|
||||
- pw = pam_modutil_getpwuid(handle, uid);
|
||||
- else {
|
||||
- r = pam_get_user(handle, &username, NULL);
|
||||
- if (r != PAM_SUCCESS) {
|
||||
- pam_syslog(handle, LOG_ERR, "Failed to get user name.");
|
||||
- return r;
|
||||
- }
|
||||
-
|
||||
- if (isempty(username)) {
|
||||
- pam_syslog(handle, LOG_ERR, "User name not valid.");
|
||||
- return PAM_AUTH_ERR;
|
||||
- }
|
||||
+ r = pam_get_user(handle, &username, NULL);
|
||||
+ if (r != PAM_SUCCESS) {
|
||||
+ pam_syslog(handle, LOG_ERR, "Failed to get user name.");
|
||||
+ return r;
|
||||
+ }
|
||||
|
||||
- pw = pam_modutil_getpwnam(handle, username);
|
||||
+ if (isempty(username)) {
|
||||
+ pam_syslog(handle, LOG_ERR, "User name not valid.");
|
||||
+ return PAM_AUTH_ERR;
|
||||
}
|
||||
|
||||
+ pw = pam_modutil_getpwnam(handle, username);
|
||||
if (!pw) {
|
||||
pam_syslog(handle, LOG_ERR, "Failed to get user data.");
|
||||
return PAM_USER_UNKNOWN;
|
||||
@@ -123,16 +117,14 @@ static int get_user_data(
|
||||
}
|
||||
|
||||
static int get_seat_from_display(const char *display, const char **seat, uint32_t *vtnr) {
|
||||
- _cleanup_free_ char *p = NULL;
|
||||
- int r;
|
||||
- _cleanup_close_ int fd = -1;
|
||||
union sockaddr_union sa = {
|
||||
.un.sun_family = AF_UNIX,
|
||||
};
|
||||
+ _cleanup_free_ char *p = NULL, *tty = NULL;
|
||||
+ _cleanup_close_ int fd = -1;
|
||||
struct ucred ucred;
|
||||
socklen_t l;
|
||||
- _cleanup_free_ char *tty = NULL;
|
||||
- int v;
|
||||
+ int v, r;
|
||||
|
||||
assert(display);
|
||||
assert(vtnr);
|
||||
@@ -194,13 +186,12 @@ _public_ PAM_EXTERN int pam_sm_open_sess
|
||||
dbus_bool_t remote, existing;
|
||||
int r;
|
||||
uint32_t vtnr = 0;
|
||||
+ uid_t original_uid;
|
||||
|
||||
assert(handle);
|
||||
|
||||
dbus_error_init(&error);
|
||||
|
||||
- /* pam_syslog(handle, LOG_INFO, "pam-systemd initializing"); */
|
||||
-
|
||||
/* Make this a NOP on non-logind systems */
|
||||
if (!logind_running())
|
||||
return PAM_SUCCESS;
|
||||
@@ -213,6 +204,9 @@ _public_ PAM_EXTERN int pam_sm_open_sess
|
||||
goto finish;
|
||||
}
|
||||
|
||||
+ if (debug)
|
||||
+ pam_syslog(handle, LOG_INFO, "pam-systemd initializing");
|
||||
+
|
||||
r = get_user_data(handle, &username, &pw);
|
||||
if (r != PAM_SUCCESS)
|
||||
goto finish;
|
||||
@@ -374,7 +368,11 @@ _public_ PAM_EXTERN int pam_sm_open_sess
|
||||
if (debug)
|
||||
pam_syslog(handle, LOG_DEBUG, "Asking logind to create session: "
|
||||
"uid=%u pid=%u service=%s type=%s class=%s seat=%s vtnr=%u tty=%s display=%s remote=%s remote_user=%s remote_host=%s",
|
||||
- uid, pid, service, type, class, seat, vtnr, tty, display, yes_no(remote), remote_user, remote_host);
|
||||
+ pw->pw_uid, pid,
|
||||
+ strempty(service),
|
||||
+ type, class,
|
||||
+ seat, vtnr, tty, display,
|
||||
+ yes_no(remote), remote_user, remote_host);
|
||||
|
||||
reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
|
||||
if (!reply) {
|
||||
@@ -388,6 +386,7 @@ _public_ PAM_EXTERN int pam_sm_open_sess
|
||||
DBUS_TYPE_OBJECT_PATH, &object_path,
|
||||
DBUS_TYPE_STRING, &runtime_path,
|
||||
DBUS_TYPE_UNIX_FD, &session_fd,
|
||||
+ DBUS_TYPE_UINT32, &original_uid,
|
||||
DBUS_TYPE_STRING, &seat,
|
||||
DBUS_TYPE_UINT32, &vtnr,
|
||||
DBUS_TYPE_BOOLEAN, &existing,
|
||||
@@ -399,8 +398,8 @@ _public_ PAM_EXTERN int pam_sm_open_sess
|
||||
|
||||
if (debug)
|
||||
pam_syslog(handle, LOG_DEBUG, "Reply from logind: "
|
||||
- "id=%s object_path=%s runtime_path=%s session_fd=%d seat=%s vtnr=%u",
|
||||
- id, object_path, runtime_path, session_fd, seat, vtnr);
|
||||
+ "id=%s object_path=%s runtime_path=%s session_fd=%d seat=%s vtnr=%u original_uid=%u",
|
||||
+ id, object_path, runtime_path, session_fd, seat, vtnr, original_uid);
|
||||
|
||||
r = pam_misc_setenv(handle, "XDG_SESSION_ID", id, 0);
|
||||
if (r != PAM_SUCCESS) {
|
||||
@@ -408,10 +407,24 @@ _public_ PAM_EXTERN int pam_sm_open_sess
|
||||
goto finish;
|
||||
}
|
||||
|
||||
- r = pam_misc_setenv(handle, "XDG_RUNTIME_DIR", runtime_path, 0);
|
||||
- if (r != PAM_SUCCESS) {
|
||||
- pam_syslog(handle, LOG_ERR, "Failed to set runtime dir.");
|
||||
- goto finish;
|
||||
+ if (original_uid == pw->pw_uid) {
|
||||
+ /* Don't set $XDG_RUNTIME_DIR if the user we now
|
||||
+ * authenticated for does not match the original user
|
||||
+ * of the session. We do this in order not to result
|
||||
+ * in privileged apps clobbering the runtime directory
|
||||
+ * unnecessarily. */
|
||||
+
|
||||
+ r = pam_misc_setenv(handle, "XDG_RUNTIME_DIR", runtime_path, 0);
|
||||
+ if (r != PAM_SUCCESS) {
|
||||
+ pam_syslog(handle, LOG_ERR, "Failed to set runtime dir.");
|
||||
+ goto finish;
|
||||
+ }
|
||||
+ } else if (getenv("XDG_RUNTIME_DIR")) {
|
||||
+ r = pam_putenv(handle, "XDG_RUNTIME_DIR");
|
||||
+ if (r != PAM_SUCCESS && r != PAM_BAD_ITEM) {
|
||||
+ pam_syslog(handle, LOG_ERR, "Failed to unset runtime dir.");
|
||||
+ }
|
||||
+ (void) unsetenv("XDG_RUNTIME_DIR");
|
||||
}
|
||||
|
||||
if (!isempty(seat)) {
|
@ -1,52 +0,0 @@
|
||||
--- systemd-208/src/journal/journald-server.c
|
||||
+++ systemd-208/src/journal/journald-server.c 2013-12-10 16:31:50.770235717 +0000
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include <sys/signalfd.h>
|
||||
#include <sys/ioctl.h>
|
||||
+#include <linux/fs.h>
|
||||
#include <linux/sockios.h>
|
||||
#include <sys/statvfs.h>
|
||||
#include <sys/mman.h>
|
||||
@@ -878,7 +879,7 @@ finish:
|
||||
|
||||
|
||||
static int system_journal_open(Server *s) {
|
||||
- int r;
|
||||
+ int r, fd;
|
||||
char *fn;
|
||||
sd_id128_t machine;
|
||||
char ids[33];
|
||||
@@ -905,7 +906,31 @@ static int system_journal_open(Server *s
|
||||
(void) mkdir("/var/log/journal/", 0755);
|
||||
|
||||
fn = strappenda("/var/log/journal/", ids);
|
||||
- (void) mkdir(fn, 0755);
|
||||
+ (void)mkdir(fn, 0755);
|
||||
+
|
||||
+ /*
|
||||
+ * On journaling and/or compressing file systems avoid doubling the
|
||||
+ * efforts for the system, that is set NOCOW and NOCOMP inode flags.
|
||||
+ * Check for every single flag as otherwise some of the file systems
|
||||
+ * may return EOPNOTSUPP on one unkown flag (like BtrFS does).
|
||||
+ */
|
||||
+ if ((fd = open(fn, O_DIRECTORY)) >= 0) {
|
||||
+ long flags;
|
||||
+ if (ioctl(fd, FS_IOC_GETFLAGS, &flags) == 0) {
|
||||
+ int old = flags;
|
||||
+ if (!(flags&FS_NOATIME_FL) && ioctl(fd, FS_IOC_SETFLAGS, flags|FS_NOATIME_FL) == 0)
|
||||
+ flags |= FS_NOATIME_FL;
|
||||
+ if (!(flags&FS_NOCOW_FL) && ioctl(fd, FS_IOC_SETFLAGS, flags|FS_NOCOW_FL) == 0)
|
||||
+ flags |= FS_NOCOW_FL;
|
||||
+ if (!(flags&FS_NOCOMP_FL) && s->compress) {
|
||||
+ flags &= ~FS_COMPR_FL;
|
||||
+ flags |= FS_NOCOMP_FL;
|
||||
+ }
|
||||
+ if (old != flags)
|
||||
+ ioctl(fd, FS_IOC_SETFLAGS, flags);
|
||||
+ }
|
||||
+ close(fd);
|
||||
+ }
|
||||
|
||||
fn = strappenda(fn, "/system.journal");
|
||||
r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, s->compress, s->seal, &s->system_metrics, s->mmap, NULL, &s->system_journal);
|
@ -1,90 +0,0 @@
|
||||
--- 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)
|
@ -1,20 +0,0 @@
|
||||
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);
|
@ -1,51 +0,0 @@
|
||||
--- 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",
|
@ -1,236 +0,0 @@
|
||||
--- 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
+__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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
+__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
|
@ -1,37 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Wed, 7 Dec 2011 15:15:07 +0000
|
||||
Subject: Fix /run/lock directories permissions to follow openSUSE policy
|
||||
|
||||
disable /var/lock/{subsys,lockdev} and change default permissions on
|
||||
/var/lock (bnc#733523).
|
||||
---
|
||||
tmpfiles.d/legacy.conf | 7 ++++---
|
||||
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
--- systemd-206_git201308300826.orig/tmpfiles.d/legacy.conf
|
||||
+++ systemd-206_git201308300826/tmpfiles.d/legacy.conf
|
||||
@@ -10,12 +10,13 @@
|
||||
# These files are considered legacy and are unnecessary on legacy-free
|
||||
# systems.
|
||||
|
||||
-d /run/lock 0755 root root -
|
||||
+# changed for openSUSE : only /run/lock should be available
|
||||
+d /run/lock 0775 root lock -
|
||||
|
||||
# /run/lock/subsys is used for serializing SysV service execution, and
|
||||
# hence without use on SysV-less systems.
|
||||
|
||||
-d /run/lock/subsys 0755 root root -
|
||||
+#d /run/lock/subsys 0755 root root -
|
||||
|
||||
# /run/lock/lockdev is used to serialize access to tty devices via
|
||||
# LCK..xxx style lock files, For more information see:
|
||||
@@ -23,7 +24,7 @@ d /run/lock/subsys 0755 root root -
|
||||
# On modern systems a BSD file lock is a better choice if
|
||||
# serialization is needed on those devices.
|
||||
|
||||
-d /run/lock/lockdev 0775 root lock -
|
||||
+#d /run/lock/lockdev 0775 root lock -
|
||||
|
||||
# /forcefsck, /fastboot and /forcequotecheck are deprecated in favor of the
|
||||
# kernel command line options 'fsck.mode=force', 'fsck.mode=skip' and
|
@ -1,94 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Tue, 19 Feb 2013 11:20:31 +0100
|
||||
Subject: Forward suspend / hibernate calls to pm-utils
|
||||
|
||||
forward suspend/hibernation calls to pm-utils, if installed (bnc#790157)
|
||||
---
|
||||
src/sleep/sleep.c | 26 ++++++++++++++++++++++----
|
||||
1 file changed, 22 insertions(+), 4 deletions(-)
|
||||
|
||||
--- systemd-206.orig/src/sleep/sleep.c
|
||||
+++ systemd-206/src/sleep/sleep.c
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
+#include <stdlib.h>
|
||||
|
||||
#include "systemd/sd-id128.h"
|
||||
#include "systemd/sd-messages.h"
|
||||
@@ -35,6 +36,8 @@
|
||||
#include "sleep-config.h"
|
||||
|
||||
static char* arg_verb = NULL;
|
||||
+static bool delegate_to_pmutils = false;
|
||||
+static const char *pmtools;
|
||||
|
||||
static int write_mode(char **modes) {
|
||||
int r = 0;
|
||||
@@ -50,9 +53,6 @@ static int write_mode(char **modes) {
|
||||
r = k;
|
||||
}
|
||||
|
||||
- if (r < 0)
|
||||
- log_error("Failed to write mode to /sys/power/disk: %s",
|
||||
- strerror(-r));
|
||||
|
||||
return r;
|
||||
}
|
||||
@@ -90,6 +90,8 @@ static int execute(char **modes, char **
|
||||
FILE *f;
|
||||
const char* note = strappenda("SLEEP=", arg_verb);
|
||||
|
||||
+ if (!delegate_to_pmutils) {
|
||||
+
|
||||
/* This file is opened first, so that if we hit an error,
|
||||
* we can abort before modyfing any state. */
|
||||
f = fopen("/sys/power/state", "we");
|
||||
@@ -102,6 +104,7 @@ static int execute(char **modes, char **
|
||||
r = write_mode(modes);
|
||||
if (r < 0)
|
||||
return r;
|
||||
+ }
|
||||
|
||||
arguments[0] = NULL;
|
||||
arguments[1] = (char*) "pre";
|
||||
@@ -114,8 +117,10 @@ static int execute(char **modes, char **
|
||||
"MESSAGE=Suspending system...",
|
||||
note,
|
||||
NULL);
|
||||
-
|
||||
+ if (!delegate_to_pmutils)
|
||||
r = write_state(f, states);
|
||||
+ else
|
||||
+ r = -system(pmtools);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@@ -158,6 +163,7 @@ static int parse_argv(int argc, char *ar
|
||||
};
|
||||
|
||||
int c;
|
||||
+ struct stat buf;
|
||||
|
||||
assert(argc >= 0);
|
||||
assert(argv);
|
||||
@@ -196,6 +202,18 @@ static int parse_argv(int argc, char *ar
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+ if (streq(arg_verb, "suspend")) {
|
||||
+ pmtools = "/usr/sbin/pm-suspend";
|
||||
+ }
|
||||
+ else if (streq(arg_verb, "hibernate") || streq(arg_verb, "hybrid-sleep")) {
|
||||
+ if (streq(arg_verb, "hibernate"))
|
||||
+ pmtools = "/usr/sbin/pm-hibernate";
|
||||
+ else
|
||||
+ pmtools = "/usr/sbin/pm-suspend-hybrid";
|
||||
+ }
|
||||
+
|
||||
+ delegate_to_pmutils = (stat(pmtools, &buf) >= 0 && S_ISREG(buf.st_mode) && (buf.st_mode & 0111));
|
||||
+
|
||||
return 1 /* work to do */;
|
||||
}
|
||||
|
@ -1,140 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Fri, 12 Apr 2013 16:56:26 +0200
|
||||
Subject: Revert "service: drop support for SysV scripts for the early boot"
|
||||
|
||||
This reverts commit 3cdebc217c42c8529086f2965319b6a48eaaeabe.
|
||||
|
||||
Conflicts:
|
||||
src/core/service.c
|
||||
---
|
||||
src/core/service.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++-----
|
||||
1 file changed, 46 insertions(+), 5 deletions(-)
|
||||
|
||||
Index: systemd-208/src/core/service.c
|
||||
===================================================================
|
||||
--- systemd-208.orig/src/core/service.c
|
||||
+++ systemd-208/src/core/service.c
|
||||
@@ -51,7 +51,8 @@
|
||||
|
||||
typedef enum RunlevelType {
|
||||
RUNLEVEL_UP,
|
||||
- RUNLEVEL_DOWN
|
||||
+ RUNLEVEL_DOWN,
|
||||
+ RUNLEVEL_SYSINIT
|
||||
} RunlevelType;
|
||||
|
||||
static const struct {
|
||||
@@ -66,6 +67,16 @@ static const struct {
|
||||
{ "rc4.d", SPECIAL_RUNLEVEL4_TARGET, RUNLEVEL_UP },
|
||||
{ "rc5.d", SPECIAL_RUNLEVEL5_TARGET, RUNLEVEL_UP },
|
||||
|
||||
+#ifdef HAVE_SYSV_COMPAT
|
||||
+ /* SUSE style boot.d */
|
||||
+ { "boot.d", SPECIAL_SYSINIT_TARGET, RUNLEVEL_SYSINIT },
|
||||
+#endif
|
||||
+
|
||||
+#if defined(TARGET_DEBIAN) || defined(TARGET_UBUNTU) || defined(TARGET_ANGSTROM)
|
||||
+ /* Debian style rcS.d */
|
||||
+ { "rcS.d", SPECIAL_SYSINIT_TARGET, RUNLEVEL_SYSINIT },
|
||||
+#endif
|
||||
+
|
||||
/* Standard SysV runlevels for shutdown */
|
||||
{ "rc0.d", SPECIAL_POWEROFF_TARGET, RUNLEVEL_DOWN },
|
||||
{ "rc6.d", SPECIAL_REBOOT_TARGET, RUNLEVEL_DOWN }
|
||||
@@ -74,10 +85,12 @@ static const struct {
|
||||
directories in this order, and we want to make sure that
|
||||
sysv_start_priority is known when we first load the
|
||||
unit. And that value we only know from S links. Hence
|
||||
- UP must be read before DOWN */
|
||||
+ UP/SYSINIT must be read before DOWN */
|
||||
};
|
||||
|
||||
#define RUNLEVELS_UP "12345"
|
||||
+/* #define RUNLEVELS_DOWN "06" */
|
||||
+#define RUNLEVELS_BOOT "bBsS"
|
||||
#endif
|
||||
|
||||
static const UnitActiveState state_translation_table[_SERVICE_STATE_MAX] = {
|
||||
@@ -340,6 +353,9 @@ static char *sysv_translate_name(const c
|
||||
if (endswith(name, ".sh"))
|
||||
/* Drop .sh suffix */
|
||||
strcpy(stpcpy(r, name) - 3, ".service");
|
||||
+ if (startswith(name, "boot."))
|
||||
+ /* Drop SuSE-style boot. prefix */
|
||||
+ strcpy(stpcpy(r, name + 5), ".service");
|
||||
else
|
||||
/* Normal init script name */
|
||||
strcpy(stpcpy(r, name), ".service");
|
||||
@@ -942,6 +958,13 @@ static int service_load_sysv_path(Servic
|
||||
|
||||
if ((r = sysv_exec_commands(s, supports_reload)) < 0)
|
||||
goto finish;
|
||||
+ if (s->sysv_runlevels &&
|
||||
+ chars_intersect(RUNLEVELS_BOOT, s->sysv_runlevels) &&
|
||||
+ chars_intersect(RUNLEVELS_UP, s->sysv_runlevels)) {
|
||||
+ /* Service has both boot and "up" runlevels
|
||||
+ configured. Kill the "up" ones. */
|
||||
+ delete_chars(s->sysv_runlevels, RUNLEVELS_UP);
|
||||
+ }
|
||||
|
||||
if (s->sysv_runlevels && !chars_intersect(RUNLEVELS_UP, s->sysv_runlevels)) {
|
||||
/* If there a runlevels configured for this service
|
||||
@@ -1023,6 +1046,9 @@ static int service_load_sysv_name(Servic
|
||||
if (endswith(name, ".sh.service"))
|
||||
return -ENOENT;
|
||||
|
||||
+ if (startswith(name, "boot."))
|
||||
+ return -ENOENT;
|
||||
+
|
||||
STRV_FOREACH(p, UNIT(s)->manager->lookup_paths.sysvinit_path) {
|
||||
char *path;
|
||||
int r;
|
||||
@@ -1043,6 +1069,18 @@ static int service_load_sysv_name(Servic
|
||||
}
|
||||
free(path);
|
||||
|
||||
+ if (r >= 0 && UNIT(s)->load_state == UNIT_STUB) {
|
||||
+ /* Try SUSE style boot.* init scripts */
|
||||
+
|
||||
+ path = strjoin(*p, "/boot.", name, NULL);
|
||||
+ if (!path)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ /* Drop .service suffix */
|
||||
+ path[strlen(path)-8] = 0;
|
||||
+ r = service_load_sysv_path(s, path);
|
||||
+ free(path);
|
||||
+ }
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@@ -3574,7 +3612,7 @@ static int service_enumerate(Manager *m)
|
||||
|
||||
if (de->d_name[0] == 'S') {
|
||||
|
||||
- if (rcnd_table[i].type == RUNLEVEL_UP) {
|
||||
+ if (rcnd_table[i].type == RUNLEVEL_UP || rcnd_table[i].type == RUNLEVEL_SYSINIT) {
|
||||
SERVICE(service)->sysv_start_priority_from_rcnd =
|
||||
MAX(a*10 + b, SERVICE(service)->sysv_start_priority_from_rcnd);
|
||||
|
||||
@@ -3591,7 +3629,8 @@ static int service_enumerate(Manager *m)
|
||||
goto finish;
|
||||
|
||||
} else if (de->d_name[0] == 'K' &&
|
||||
- (rcnd_table[i].type == RUNLEVEL_DOWN)) {
|
||||
+ (rcnd_table[i].type == RUNLEVEL_DOWN ||
|
||||
+ rcnd_table[i].type == RUNLEVEL_SYSINIT)) {
|
||||
|
||||
r = set_ensure_allocated(&shutdown_services,
|
||||
trivial_hash_func, trivial_compare_func);
|
||||
@@ -3631,7 +3670,9 @@ static int service_enumerate(Manager *m)
|
||||
* runlevels we assume the stop jobs will be implicitly added
|
||||
* by the core logic. Also, we don't really distinguish here
|
||||
* between the runlevels 0 and 6 and just add them to the
|
||||
- * special shutdown target. */
|
||||
+ * special shutdown target. On SUSE the boot.d/ runlevel is
|
||||
+ * also used for shutdown, so we add links for that too to the
|
||||
+ * shutdown target.*/
|
||||
SET_FOREACH(service, shutdown_services, j) {
|
||||
service = unit_follow_merge(service);
|
||||
|
@ -1,26 +0,0 @@
|
||||
From 3fdb2494c1e24c0a020f5b54022d2c751fd26f50 Mon Sep 17 00:00:00 2001
|
||||
From: David Herrmann <dh.herrmann@gmail.com>
|
||||
Date: Thu, 28 Nov 2013 09:52:18 +0000
|
||||
Subject: login: revert lazy session-activation on non-VT seats
|
||||
|
||||
Existing applications like gdm already depend on new sessions to get
|
||||
immediately activated on seats without VTs. Fixes a bug reported as:
|
||||
[systemd-devel] systemd 208:trouble with inactive user sessions at non-seat0 seats
|
||||
|
||||
This patch restores the original behavior. We either need to add a new
|
||||
flag for session-creation or some other heuristic to avoid activating new
|
||||
sessions in the future.
|
||||
---
|
||||
--- a/src/login/logind-seat.c 2013-11-28 11:30:49.624623090 -0200
|
||||
+++ b/src/login/logind-seat.c 2013-11-28 11:31:46.668792391 -0200
|
||||
@@ -420,8 +420,8 @@
|
||||
seat_send_changed(s, "Sessions\0");
|
||||
|
||||
/* On seats with VTs, the VT logic defines which session is active. On
|
||||
- * seats without VTs, we automatically activate the first session. */
|
||||
- if (!seat_has_vts(s) && !s->active)
|
||||
+ * seats without VTs, we automatically activate new sessions. */
|
||||
+ if (!seat_has_vts(s))
|
||||
seat_set_active(s, session);
|
||||
|
||||
return 0;
|
@ -1,18 +0,0 @@
|
||||
# This file is part of systemd.
|
||||
#
|
||||
# systemd is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
[Unit]
|
||||
Description=/etc/init.d/after.local Compatibility
|
||||
ConditionFileIsExecutable=/etc/init.d/after.local
|
||||
After=getty.target
|
||||
|
||||
[Service]
|
||||
Type=idle
|
||||
ExecStart=/etc/init.d/after.local
|
||||
TimeoutSec=0
|
||||
RemainAfterExit=yes
|
||||
SysVStartPriority=99
|
@ -1,41 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Thu, 10 Jan 2013 15:43:25 +0000
|
||||
Subject: allow multiple sulogin to be started
|
||||
|
||||
allows multiple sulogin instance (bnc#793182).
|
||||
---
|
||||
units/getty@.service.m4 | 1 +
|
||||
units/rescue.target | 1 +
|
||||
units/serial-getty@.service.m4 | 1 +
|
||||
3 files changed, 3 insertions(+)
|
||||
|
||||
--- systemd-206.orig/units/getty@.service.m4
|
||||
+++ systemd-206/units/getty@.service.m4
|
||||
@@ -9,6 +9,7 @@
|
||||
Description=Getty on %I
|
||||
Documentation=man:agetty(8) man:systemd-getty-generator(8)
|
||||
Documentation=http://0pointer.de/blog/projects/serial-console.html
|
||||
+Conflicts=rescue.service
|
||||
After=systemd-user-sessions.service plymouth-quit-wait.service
|
||||
m4_ifdef(`HAVE_SYSV_COMPAT',
|
||||
After=rc-local.service
|
||||
--- systemd-206.orig/units/rescue.target
|
||||
+++ systemd-206/units/rescue.target
|
||||
@@ -10,6 +10,7 @@ Description=Rescue Mode
|
||||
Documentation=man:systemd.special(7)
|
||||
Requires=sysinit.target rescue.service
|
||||
After=sysinit.target rescue.service
|
||||
+Conflicts=getty.target
|
||||
AllowIsolate=yes
|
||||
|
||||
[Install]
|
||||
--- systemd-206.orig/units/serial-getty@.service.m4
|
||||
+++ systemd-206/units/serial-getty@.service.m4
|
||||
@@ -10,6 +10,7 @@ Description=Serial Getty on %I
|
||||
Documentation=man:agetty(8) man:systemd-getty-generator(8)
|
||||
Documentation=http://0pointer.de/blog/projects/serial-console.html
|
||||
BindsTo=dev-%i.device
|
||||
+Conflicts=rescue.service
|
||||
After=dev-%i.device systemd-user-sessions.service plymouth-quit-wait.service
|
||||
m4_ifdef(`HAVE_SYSV_COMPAT',
|
||||
After=rc-local.service
|
@ -1,35 +0,0 @@
|
||||
From da6de8a55784115451582051c8da620056994a05 Mon Sep 17 00:00:00 2001
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
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
|
||||
|
@ -1,37 +0,0 @@
|
||||
From: Ludwig Nussel <ludwig.nussel@suse.de>
|
||||
Date: Mon, 8 Apr 2013 14:51:47 +0200
|
||||
Subject: apply ACL for nvidia device nodes
|
||||
|
||||
set ACL on nvidia devices (bnc#808319).
|
||||
---
|
||||
src/login/logind-acl.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
|
||||
Index: systemd-208/src/login/logind-acl.c
|
||||
===================================================================
|
||||
--- systemd-208.orig/src/login/logind-acl.c
|
||||
+++ systemd-208/src/login/logind-acl.c
|
||||
@@ -287,6 +287,22 @@ int devnode_acl_all(struct udev *udev,
|
||||
r = devnode_acl(n, flush, del, old_uid, add, new_uid);
|
||||
}
|
||||
|
||||
+ /* only apply ACL on nvidia* if /dev/nvidiactl exists */
|
||||
+ if (devnode_acl("/dev/nvidiactl", flush, del, old_uid, add, new_uid) >= 0) {
|
||||
+ int i;
|
||||
+ char *devname;
|
||||
+
|
||||
+ for (i = 0; i <= 256 ; i++) {
|
||||
+ if (asprintf(&devname, "/dev/nvidia%d", i) < 0)
|
||||
+ break;
|
||||
+ if (devnode_acl(devname, flush, del, old_uid, add, new_uid) < 0) {
|
||||
+ free(devname);
|
||||
+ break;
|
||||
+ }
|
||||
+ free(devname);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
finish:
|
||||
udev_enumerate_unref(e);
|
||||
set_free_free(nodes);
|
@ -1,24 +0,0 @@
|
||||
From: Ludwig Nussel <ludwig.nussel@suse.de>
|
||||
Date: Mon, 26 Nov 2012 09:49:42 +0100
|
||||
Subject: avoid assertion if invalid address familily is passed to
|
||||
gethostbyaddr_r (bnc#791101)
|
||||
|
||||
---
|
||||
src/nss-myhostname/nss-myhostname.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
--- systemd-206_git201308300826.orig/src/nss-myhostname/nss-myhostname.c
|
||||
+++ systemd-206_git201308300826/src/nss-myhostname/nss-myhostname.c
|
||||
@@ -442,6 +442,12 @@ enum nss_status _nss_myhostname_gethostb
|
||||
uint32_t local_address_ipv4 = LOCALADDRESS_IPV4;
|
||||
const char *canonical = NULL, *additional = NULL;
|
||||
|
||||
+ if (af != AF_INET && af != AF_INET6) {
|
||||
+ *errnop = EAFNOSUPPORT;
|
||||
+ *h_errnop = NO_DATA;
|
||||
+ return NSS_STATUS_UNAVAIL;
|
||||
+ }
|
||||
+
|
||||
if (len != PROTO_ADDRESS_SIZE(af)) {
|
||||
*errnop = EINVAL;
|
||||
*h_errnop = NO_RECOVERY;
|
@ -1,7 +0,0 @@
|
||||
systemd
|
||||
supplements "packageand(systemd:pam-<targettype>)"
|
||||
-/lib/systemd/system/
|
||||
libudev0
|
||||
libgudev-1_0-0
|
||||
libudev1
|
||||
nss-myhostname
|
74
boot.udev
74
boot.udev
@ -1,74 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
### BEGIN INIT INFO
|
||||
# Provides: boot.udev
|
||||
# Required-Start:
|
||||
# Required-Stop:
|
||||
# Should-Start:
|
||||
# Should-Stop:
|
||||
# Default-Start: B
|
||||
# Default-Stop:
|
||||
# Short-Description: manage /dev and kernel device-events
|
||||
# Description: udevd daemon to manage /dev and kernel device events
|
||||
### END INIT INFO
|
||||
|
||||
. /etc/rc.status
|
||||
|
||||
PATH="/sbin:/bin:/usr/sbin:/usr/bin"
|
||||
DAEMON="@@SYSTEMD@@/systemd-udevd"
|
||||
UDEVADM="@@BINDIR@@/udevadm"
|
||||
WRITERULE="@@PREFIX@@/write_dev_root_rule"
|
||||
udev_timeout=180
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
# create /dev/root symlink with dynamic rule
|
||||
if [ -x ${WRITERULE} ]; then
|
||||
${WRITERULE} >/dev/null 2>&1 || true
|
||||
fi
|
||||
|
||||
# start udevd
|
||||
echo -n "Starting udevd: "
|
||||
${DAEMON} --daemon
|
||||
if [ $? -ne 0 ]; then
|
||||
rc_status -v
|
||||
rc_exit
|
||||
fi
|
||||
rc_status -v
|
||||
|
||||
# trigger events for all devices
|
||||
echo -n "Loading drivers, configuring devices: "
|
||||
${UDEVADM} trigger --type=subsystems --action=add
|
||||
${UDEVADM} trigger --type=devices --action=add
|
||||
|
||||
# wait for events to finish
|
||||
${UDEVADM} settle --timeout=$udev_timeout
|
||||
rc_status -v
|
||||
;;
|
||||
stop)
|
||||
echo -n "Stopping udevd: "
|
||||
killproc ${DAEMON}
|
||||
rc_status -v
|
||||
;;
|
||||
restart)
|
||||
echo -n "Restarting udevd: "
|
||||
killproc ${DAEMON}
|
||||
${DAEMON} --daemon
|
||||
rc_status -v
|
||||
;;
|
||||
status)
|
||||
echo -n "Checking for udevd: "
|
||||
checkproc ${DAEMON}
|
||||
rc_status -v
|
||||
;;
|
||||
reload|force-reload)
|
||||
echo -n "Reloading udevd: "
|
||||
killproc -G -HUP ${DAEMON}
|
||||
rc_status -v
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 {start|stop|restart|status|reload|force-reload}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
rc_exit
|
@ -1,60 +0,0 @@
|
||||
From bd441fa27a22b7c6e11d9330560e0622fb69f297 Mon Sep 17 00:00:00 2001
|
||||
From: Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
|
||||
Date: Thu, 28 Nov 2013 17:07:29 +0000
|
||||
Subject: build-sys: make multi-seat-x optional
|
||||
|
||||
At some point it should become disabled by default.
|
||||
|
||||
http://lists.freedesktop.org/archives/systemd-devel/2013-November/014869.html
|
||||
---
|
||||
diff --git a/Makefile.am b/Makefile.am
|
||||
index 90874df..3598edd 100644
|
||||
--- a/Makefile.am
|
||||
+++ b/Makefile.am
|
||||
@@ -4141,6 +4141,8 @@ MULTI_USER_TARGET_WANTS += \
|
||||
SYSTEM_UNIT_ALIASES += \
|
||||
systemd-logind.service dbus-org.freedesktop.login1.service
|
||||
|
||||
+if ENABLE_MULTI_SEAT_X
|
||||
+
|
||||
systemd_multi_seat_x_SOURCES = \
|
||||
src/login/multi-seat-x.c
|
||||
|
||||
@@ -4151,6 +4153,8 @@ systemd_multi_seat_x_LDADD = \
|
||||
rootlibexec_PROGRAMS += \
|
||||
systemd-multi-seat-x
|
||||
|
||||
+endif
|
||||
+
|
||||
dist_udevrules_DATA += \
|
||||
src/login/70-uaccess.rules \
|
||||
src/login/70-power-switch.rules
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index f1b00c5..ab24266 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -794,6 +794,14 @@ fi
|
||||
AM_CONDITIONAL(ENABLE_EFI, [test "x$have_efi" = "xyes"])
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
+have_multi_seat_x=no
|
||||
+AC_ARG_ENABLE(multi_seat_x, AS_HELP_STRING([--disable-multi-seat-x], [do not build multi-seat-x]))
|
||||
+if test "x$enable_multi_seat_x" != "xno"; then
|
||||
+ have_multi_seat_x=yes
|
||||
+fi
|
||||
+AM_CONDITIONAL(ENABLE_MULTI_SEAT_X, [test "$have_multi_seat_x" = "yes"])
|
||||
+
|
||||
+# ------------------------------------------------------------------------------
|
||||
AC_ARG_WITH(rc-local-script-path-start,
|
||||
AS_HELP_STRING([--with-rc-local-script-path-start=PATH],
|
||||
[Path to /etc/rc.local]),
|
||||
@@ -1077,6 +1085,7 @@ AC_MSG_RESULT([
|
||||
nss-myhostname: ${have_myhostname}
|
||||
gudev: ${enable_gudev}
|
||||
gintrospection: ${enable_introspection}
|
||||
+ multi-seat-x: ${have_multi_seat_x}
|
||||
Python: ${have_python}
|
||||
Python Headers: ${have_python_devel}
|
||||
man pages: ${have_manpages}
|
||||
--
|
||||
cgit v0.9.0.2-2-gbebe
|
@ -1,34 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Wed, 9 Nov 2011 11:10:49 +0100
|
||||
Subject: delay fsck / cryptsetup after md / dmraid are started
|
||||
|
||||
---
|
||||
src/cryptsetup/cryptsetup-generator.c | 1 +
|
||||
units/systemd-fsck@.service.in | 2 +-
|
||||
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
Index: systemd-208/src/cryptsetup/cryptsetup-generator.c
|
||||
===================================================================
|
||||
--- systemd-208.orig/src/cryptsetup/cryptsetup-generator.c
|
||||
+++ systemd-208/src/cryptsetup/cryptsetup-generator.c
|
||||
@@ -119,6 +119,7 @@ static int create_disk(
|
||||
"DefaultDependencies=no\n"
|
||||
"BindsTo=dev-mapper-%i.device\n"
|
||||
"IgnoreOnIsolate=true\n"
|
||||
+ "After=md.service dmraid.service\n"
|
||||
"After=systemd-readahead-collect.service systemd-readahead-replay.service\n",
|
||||
f);
|
||||
|
||||
Index: systemd-208/units/systemd-fsck@.service.in
|
||||
===================================================================
|
||||
--- systemd-208.orig/units/systemd-fsck@.service.in
|
||||
+++ systemd-208/units/systemd-fsck@.service.in
|
||||
@@ -10,7 +10,7 @@ Description=File System Check on %f
|
||||
Documentation=man:systemd-fsck@.service(8)
|
||||
DefaultDependencies=no
|
||||
BindsTo=%i.device
|
||||
-After=systemd-readahead-collect.service systemd-readahead-replay.service %i.device
|
||||
+After=systemd-readahead-collect.service systemd-readahead-replay.service %i.device md.service dmraid.service
|
||||
Before=shutdown.target
|
||||
|
||||
[Service]
|
@ -1,18 +0,0 @@
|
||||
From: Ludwig Nussel <ludwig.nussel@suse.de>
|
||||
Date: Tue, 12 Feb 2013 17:24:35 +0100
|
||||
Subject: disable nss-myhostname warning (bnc#783841)
|
||||
|
||||
---
|
||||
src/hostname/hostnamed.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- systemd-206.orig/src/hostname/hostnamed.c
|
||||
+++ systemd-206/src/hostname/hostnamed.c
|
||||
@@ -134,6 +134,7 @@ static int read_data(void) {
|
||||
|
||||
static bool check_nss(void) {
|
||||
void *dl;
|
||||
+ return true;
|
||||
|
||||
dl = dlopen("libnss_myhostname.so.2", RTLD_LAZY);
|
||||
if (dl) {
|
@ -1,17 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Thu, 9 Feb 2012 16:19:38 +0000
|
||||
Subject: ensure DM and dmraid are started before local-fs-pre-target
|
||||
|
||||
ensure md / dmraid is started before mounting partitions,
|
||||
if fsck was disabled for them (bnc#733283).
|
||||
---
|
||||
units/local-fs-pre.target | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- systemd-206_git201308300826.orig/units/local-fs-pre.target
|
||||
+++ systemd-206_git201308300826/units/local-fs-pre.target
|
||||
@@ -9,3 +9,4 @@
|
||||
Description=Local File Systems (Pre)
|
||||
Documentation=man:systemd.special(7)
|
||||
RefuseManualStart=yes
|
||||
+After=md.service dmraid.service
|
@ -1,20 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Wed, 24 Aug 2011 13:02:12 +0000
|
||||
Subject: ensure ask-password-wall starts after getty@tty1
|
||||
|
||||
ensure passphrase is handled before starting getty on tty1.
|
||||
---
|
||||
units/systemd-ask-password-wall.service.in | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- systemd-206_git201308300826.orig/units/systemd-ask-password-wall.service.in
|
||||
+++ systemd-206_git201308300826/units/systemd-ask-password-wall.service.in
|
||||
@@ -8,7 +8,7 @@
|
||||
[Unit]
|
||||
Description=Forward Password Requests to Wall
|
||||
Documentation=man:systemd-ask-password-console.service(8)
|
||||
-After=systemd-user-sessions.service
|
||||
+After=systemd-user-sessions.service getty@tty1.service
|
||||
|
||||
[Service]
|
||||
ExecStartPre=-@SYSTEMCTL@ stop systemd-ask-password-console.path systemd-ask-password-console.service systemd-ask-password-plymouth.path systemd-ask-password-plymouth.service
|
@ -1,32 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Tue, 28 May 2013 15:17:35 +0200
|
||||
Subject: ensure shortname is set as hostname (bnc#820213)
|
||||
|
||||
strip hostname so the domain part isn't set as part of the hostname
|
||||
---
|
||||
src/core/hostname-setup.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
--- systemd-206.orig/src/core/hostname-setup.c
|
||||
+++ systemd-206/src/core/hostname-setup.c
|
||||
@@ -32,7 +32,7 @@
|
||||
#include "fileio.h"
|
||||
|
||||
static int read_and_strip_hostname(const char *path, char **hn) {
|
||||
- char *s;
|
||||
+ char *s, *domain;
|
||||
int r;
|
||||
|
||||
assert(path);
|
||||
@@ -49,6 +49,11 @@ static int read_and_strip_hostname(const
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
+ /* strip any leftover of a domain name */
|
||||
+ if (domain = strchr(s, '.')) {
|
||||
+ *domain = NULL;
|
||||
+ }
|
||||
+
|
||||
*hn = s;
|
||||
return 0;
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Mon, 9 Jan 2012 17:01:22 +0000
|
||||
Subject: ensure sysctl are applied after modules are loaded
|
||||
|
||||
(bnc#725412)
|
||||
---
|
||||
units/systemd-sysctl.service.in | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- systemd-206_git201308300826.orig/units/systemd-sysctl.service.in
|
||||
+++ systemd-206_git201308300826/units/systemd-sysctl.service.in
|
||||
@@ -11,6 +11,7 @@ Documentation=man:systemd-sysctl.service
|
||||
DefaultDependencies=no
|
||||
Conflicts=shutdown.target
|
||||
After=systemd-readahead-collect.service systemd-readahead-replay.service
|
||||
+After=systemd-modules-load.service
|
||||
Before=sysinit.target shutdown.target
|
||||
ConditionPathIsReadWrite=/proc/sys/
|
||||
ConditionDirectoryNotEmpty=|/lib/sysctl.d
|
@ -1,20 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Tue, 20 Nov 2012 09:36:43 +0000
|
||||
Subject: fix owner of /var/log/btmp
|
||||
|
||||
ensure btmp is owned only by root (bnc#777405).
|
||||
---
|
||||
tmpfiles.d/systemd.conf | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- systemd-206_git201308300826.orig/tmpfiles.d/systemd.conf
|
||||
+++ systemd-206_git201308300826/tmpfiles.d/systemd.conf
|
||||
@@ -11,7 +11,7 @@ d /run/user 0755 root root ~10d
|
||||
F /run/utmp 0664 root utmp -
|
||||
|
||||
f /var/log/wtmp 0664 root utmp -
|
||||
-f /var/log/btmp 0600 root utmp -
|
||||
+f /var/log/btmp 0600 root root -
|
||||
|
||||
d /var/cache/man - - - 30d
|
||||
|
@ -1,40 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Thu, 23 Aug 2012 11:08:25 +0200
|
||||
Subject: fix support for boot prefixed initscript (bnc#746506)
|
||||
|
||||
---
|
||||
src/systemctl/systemctl.c | 22 +++++++++++++++++++++-
|
||||
1 file changed, 21 insertions(+), 1 deletion(-)
|
||||
|
||||
--- systemd-206_git201308300826.orig/src/systemctl/systemctl.c
|
||||
+++ systemd-206_git201308300826/src/systemctl/systemctl.c
|
||||
@@ -4169,8 +4169,28 @@ static int enable_sysv_units(char **args
|
||||
p[strlen(p) - sizeof(".service") + 1] = 0;
|
||||
found_sysv = access(p, F_OK) >= 0;
|
||||
|
||||
- if (!found_sysv)
|
||||
+ if (!found_sysv) {
|
||||
+#ifdef HAVE_SYSV_COMPAT
|
||||
+ free(p);
|
||||
+ p = NULL;
|
||||
+ if (!isempty(arg_root))
|
||||
+ asprintf(&p, "%s/" SYSTEM_SYSVINIT_PATH "/boot.%s", arg_root, name);
|
||||
+ else
|
||||
+ asprintf(&p, SYSTEM_SYSVINIT_PATH "/boot.%s", name);
|
||||
+ if (!p) {
|
||||
+ r = log_oom();
|
||||
+ goto finish;
|
||||
+ }
|
||||
+ p[strlen(p) - sizeof(".service") + 1] = 0;
|
||||
+ found_sysv = access(p, F_OK) >= 0;
|
||||
+
|
||||
+ if (!found_sysv) {
|
||||
+ continue;
|
||||
+ }
|
||||
+#else
|
||||
continue;
|
||||
+#endif
|
||||
+ }
|
||||
|
||||
/* Mark this entry, so that we don't try enabling it as native unit */
|
||||
args[f] = (char*) "";
|
@ -1,42 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Tue, 22 Jan 2013 17:02:04 +0000
|
||||
Subject: handle SYSTEMCTL_OPTIONS environment variable
|
||||
|
||||
(bnc#798620)
|
||||
---
|
||||
src/systemctl/systemctl.c | 22 ++++++++++++++++++++++
|
||||
1 file changed, 22 insertions(+)
|
||||
|
||||
Index: systemd-208/src/systemctl/systemctl.c
|
||||
===================================================================
|
||||
--- systemd-208.orig/src/systemctl/systemctl.c
|
||||
+++ systemd-208/src/systemctl/systemctl.c
|
||||
@@ -6115,6 +6115,28 @@ int main(int argc, char*argv[]) {
|
||||
* ellipsized. */
|
||||
original_stdout_is_tty = isatty(STDOUT_FILENO);
|
||||
|
||||
+ if (secure_getenv("SYSTEMCTL_OPTIONS") &&
|
||||
+ (!program_invocation_short_name ||
|
||||
+ (program_invocation_short_name && strstr(program_invocation_short_name, "systemctl")))) {
|
||||
+ char **parsed_systemctl_options = strv_split_quoted(getenv("SYSTEMCTL_OPTIONS"));
|
||||
+
|
||||
+ if (*parsed_systemctl_options && **parsed_systemctl_options) {
|
||||
+ char **k,**a;
|
||||
+ char **new_argv = new(char*, strv_length(argv) + strv_length(parsed_systemctl_options) + 1);
|
||||
+ new_argv[0] = strdup(argv[0]);
|
||||
+ for (k = new_argv+1, a = parsed_systemctl_options; *a; k++, a++) {
|
||||
+ *k = strdup(*a);
|
||||
+ }
|
||||
+ for (a = argv+1; *a; k++, a++) {
|
||||
+ *k = strdup(*a);
|
||||
+ }
|
||||
+ *k = NULL;
|
||||
+ argv = new_argv;
|
||||
+ argc = strv_length(new_argv);
|
||||
+ strv_free (parsed_systemctl_options);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
r = parse_argv(argc, argv);
|
||||
if (r < 0)
|
||||
goto finish;
|
@ -1,231 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Fri, 19 Aug 2011 15:29:49 +0000
|
||||
Subject: handle disable_caplock and compose_table and kbd_rate
|
||||
|
||||
(bnc#746595)
|
||||
---
|
||||
src/vconsole/vconsole-setup.c | 156 +++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 153 insertions(+), 3 deletions(-)
|
||||
|
||||
--- systemd-206_git201308300826.orig/src/vconsole/vconsole-setup.c
|
||||
+++ systemd-206_git201308300826/src/vconsole/vconsole-setup.c
|
||||
@@ -40,6 +40,7 @@
|
||||
#include "macro.h"
|
||||
#include "virt.h"
|
||||
#include "fileio.h"
|
||||
+#include "strv.h"
|
||||
|
||||
static bool is_vconsole(int fd) {
|
||||
unsigned char data[1];
|
||||
@@ -99,8 +100,8 @@ static int enable_utf8(int fd) {
|
||||
return r;
|
||||
}
|
||||
|
||||
-static int keymap_load(const char *vc, const char *map, const char *map_toggle, bool utf8, pid_t *_pid) {
|
||||
- const char *args[8];
|
||||
+static int keymap_load(const char *vc, const char *map, const char *map_toggle, bool utf8, bool disable_capslock, pid_t *_pid) {
|
||||
+ const char *args[9];
|
||||
int i = 0;
|
||||
pid_t pid;
|
||||
|
||||
@@ -119,6 +120,8 @@ static int keymap_load(const char *vc, c
|
||||
args[i++] = map;
|
||||
if (map_toggle)
|
||||
args[i++] = map_toggle;
|
||||
+ if (disable_capslock)
|
||||
+ args[i++] = "disable.capslock";
|
||||
args[i++] = NULL;
|
||||
|
||||
pid = fork();
|
||||
@@ -212,6 +215,101 @@ static void font_copy_to_all_vcs(int fd)
|
||||
}
|
||||
}
|
||||
|
||||
+#ifdef HAVE_SYSV_COMPAT
|
||||
+static int load_compose_table(const char *vc, const char *compose_table, pid_t *_pid) {
|
||||
+ const char *args[1024];
|
||||
+ int i = 0, j = 0;
|
||||
+ pid_t pid;
|
||||
+ char **strv_compose_table = NULL;
|
||||
+ char *to_free[1024];
|
||||
+
|
||||
+ if (isempty(compose_table)) {
|
||||
+ /* An empty map means no compose table*/
|
||||
+ *_pid = 0;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ args[i++] = KBD_LOADKEYS;
|
||||
+ args[i++] = "-q";
|
||||
+ args[i++] = "-C";
|
||||
+ args[i++] = vc;
|
||||
+
|
||||
+ strv_compose_table = strv_split(compose_table, WHITESPACE);
|
||||
+ if (strv_compose_table) {
|
||||
+ bool compose_loaded = false;
|
||||
+ bool compose_clear = false;
|
||||
+ char **name;
|
||||
+ char *arg;
|
||||
+
|
||||
+ STRV_FOREACH (name, strv_compose_table) {
|
||||
+ if (streq(*name,"-c") || streq(*name,"clear")) {
|
||||
+ compose_clear = true;
|
||||
+ continue;
|
||||
+ }
|
||||
+ if (!compose_loaded) {
|
||||
+ if (compose_clear)
|
||||
+ args[i++] = "-c";
|
||||
+ }
|
||||
+ asprintf(&arg, "compose.%s",*name);
|
||||
+ compose_loaded = true;
|
||||
+ args[i++] = to_free[j++] = arg;
|
||||
+
|
||||
+ }
|
||||
+ strv_free(strv_compose_table);
|
||||
+ }
|
||||
+ args[i++] = NULL;
|
||||
+
|
||||
+ if ((pid = fork()) < 0) {
|
||||
+ log_error("Failed to fork: %m");
|
||||
+ return -errno;
|
||||
+ } else if (pid == 0) {
|
||||
+ execv(args[0], (char **) args);
|
||||
+ _exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+
|
||||
+ *_pid = pid;
|
||||
+
|
||||
+ for (i=0 ; i < j ; i++)
|
||||
+ free (to_free[i]);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+static int set_kbd_rate(const char *vc, const char *kbd_rate, const char *kbd_delay, pid_t *_pid) {
|
||||
+ const char *args[7];
|
||||
+ int i = 0;
|
||||
+ pid_t pid;
|
||||
+
|
||||
+ if (isempty(kbd_rate) && isempty(kbd_delay)) {
|
||||
+ *_pid = 0;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ args[i++] = "/bin/kbdrate";
|
||||
+ if (!isempty(kbd_rate)) {
|
||||
+ args[i++] = "-r";
|
||||
+ args[i++] = kbd_rate;
|
||||
+ }
|
||||
+ if (!isempty(kbd_delay)) {
|
||||
+ args[i++] = "-d";
|
||||
+ args[i++] = kbd_delay;
|
||||
+ }
|
||||
+ args[i++] = "-s";
|
||||
+ args[i++] = NULL;
|
||||
+
|
||||
+ if ((pid = fork()) < 0) {
|
||||
+ log_error("Failed to fork: %m");
|
||||
+ return -errno;
|
||||
+ } else if (pid == 0) {
|
||||
+ execv(args[0], (char **) args);
|
||||
+ _exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+
|
||||
+ *_pid = pid;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int main(int argc, char **argv) {
|
||||
const char *vc;
|
||||
char *vc_keymap = NULL;
|
||||
@@ -219,8 +317,16 @@ int main(int argc, char **argv) {
|
||||
char *vc_font = NULL;
|
||||
char *vc_font_map = NULL;
|
||||
char *vc_font_unimap = NULL;
|
||||
+#ifdef HAVE_SYSV_COMPAT
|
||||
+ char *vc_kbd_delay = NULL;
|
||||
+ char *vc_kbd_rate = NULL;
|
||||
+ char *vc_kbd_disable_caps_lock = NULL;
|
||||
+ char *vc_compose_table = NULL;
|
||||
+ pid_t kbd_rate_pid = 0, compose_table_pid = 0;
|
||||
+#endif
|
||||
int fd = -1;
|
||||
bool utf8;
|
||||
+ bool disable_capslock = false;
|
||||
pid_t font_pid = 0, keymap_pid = 0;
|
||||
bool font_copy = false;
|
||||
int r = EXIT_FAILURE;
|
||||
@@ -276,13 +382,43 @@ int main(int argc, char **argv) {
|
||||
log_warning("Failed to read /proc/cmdline: %s", strerror(-r));
|
||||
}
|
||||
|
||||
+ if (r <= 0) {
|
||||
+#ifdef HAVE_SYSV_COMPAT
|
||||
+ r = parse_env_file("/etc/sysconfig/keyboard", NEWLINE,
|
||||
+ "KEYTABLE", &vc_keymap,
|
||||
+ "KBD_DELAY", &vc_kbd_delay,
|
||||
+ "KBD_RATE", &vc_kbd_rate,
|
||||
+ "KBD_DISABLE_CAPS_LOCK", &vc_kbd_disable_caps_lock,
|
||||
+ "COMPOSETABLE", &vc_compose_table,
|
||||
+ NULL);
|
||||
+ if (r < 0 && r != -ENOENT)
|
||||
+ log_warning("Failed to read /etc/sysconfig/keyboard: %s", strerror(-r));
|
||||
+
|
||||
+ r = parse_env_file("/etc/sysconfig/console", NEWLINE,
|
||||
+ "CONSOLE_FONT", &vc_font,
|
||||
+ "CONSOLE_SCREENMAP", &vc_font_map,
|
||||
+ "CONSOLE_UNICODEMAP", &vc_font_unimap,
|
||||
+ NULL);
|
||||
+ if (r < 0 && r != -ENOENT)
|
||||
+ log_warning("Failed to read /etc/sysconfig/console: %s", strerror(-r));
|
||||
+
|
||||
+ disable_capslock = vc_kbd_disable_caps_lock && strcasecmp(vc_kbd_disable_caps_lock, "YES") == 0;
|
||||
+
|
||||
+#endif
|
||||
+ }
|
||||
+
|
||||
if (utf8)
|
||||
enable_utf8(fd);
|
||||
else
|
||||
disable_utf8(fd);
|
||||
|
||||
r = EXIT_FAILURE;
|
||||
- if (keymap_load(vc, vc_keymap, vc_keymap_toggle, utf8, &keymap_pid) >= 0 &&
|
||||
+
|
||||
+ if (keymap_load(vc, vc_keymap, vc_keymap_toggle, utf8, disable_capslock, &keymap_pid) >= 0 &&
|
||||
+#ifdef HAVE_SYSV_COMPAT
|
||||
+ load_compose_table(vc, vc_compose_table, &compose_table_pid) >= 0 &&
|
||||
+ set_kbd_rate(vc, vc_kbd_rate, vc_kbd_delay, &kbd_rate_pid) >= 0 &&
|
||||
+#endif
|
||||
font_load(vc, vc_font, vc_font_map, vc_font_unimap, &font_pid) >= 0)
|
||||
r = EXIT_SUCCESS;
|
||||
|
||||
@@ -290,6 +426,14 @@ finish:
|
||||
if (keymap_pid > 0)
|
||||
wait_for_terminate_and_warn(KBD_LOADKEYS, keymap_pid);
|
||||
|
||||
+#ifdef HAVE_SYSV_COMPAT
|
||||
+ if (compose_table_pid > 0)
|
||||
+ wait_for_terminate_and_warn(KBD_LOADKEYS, compose_table_pid);
|
||||
+
|
||||
+ if (kbd_rate_pid > 0)
|
||||
+ wait_for_terminate_and_warn("/bin/kbdrate", kbd_rate_pid);
|
||||
+#endif
|
||||
+
|
||||
if (font_pid > 0) {
|
||||
wait_for_terminate_and_warn(KBD_SETFONT, font_pid);
|
||||
if (font_copy)
|
||||
@@ -300,6 +444,12 @@ finish:
|
||||
free(vc_font);
|
||||
free(vc_font_map);
|
||||
free(vc_font_unimap);
|
||||
+#ifdef HAVE_SYSV_COMPAT
|
||||
+ free(vc_kbd_delay);
|
||||
+ free(vc_kbd_rate);
|
||||
+ free(vc_kbd_disable_caps_lock);
|
||||
+ free(vc_compose_table);
|
||||
+#endif
|
||||
|
||||
if (fd >= 0)
|
||||
close_nointr_nofail(fd);
|
@ -1,77 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Fri, 15 Feb 2013 16:04:39 +0000
|
||||
Subject: handle /etc/HOSTNAME
|
||||
|
||||
(bnc#803653)
|
||||
---
|
||||
src/core/hostname-setup.c | 22 +++++++++++++++++-----
|
||||
src/hostname/hostnamed.c | 12 +++++++++++-
|
||||
2 files changed, 28 insertions(+), 6 deletions(-)
|
||||
|
||||
--- systemd-206.orig/src/core/hostname-setup.c
|
||||
+++ systemd-206/src/core/hostname-setup.c
|
||||
@@ -61,12 +61,24 @@ int hostname_setup(void) {
|
||||
|
||||
r = read_and_strip_hostname("/etc/hostname", &b);
|
||||
if (r < 0) {
|
||||
- if (r == -ENOENT)
|
||||
- enoent = true;
|
||||
- else
|
||||
- log_warning("Failed to read configured hostname: %s", strerror(-r));
|
||||
+ if (r == -ENOENT) {
|
||||
+ /* use SUSE fallback */
|
||||
+ r = read_and_strip_hostname("/etc/HOSTNAME", &b);
|
||||
+ if (r < 0) {
|
||||
+ if (r == -ENOENT)
|
||||
+ enoent = true;
|
||||
+ else
|
||||
+ log_warning("Failed to read configured hostname: %s", strerror(-r));
|
||||
+ hn = NULL;
|
||||
+ }
|
||||
+ else
|
||||
+ hn = b;
|
||||
|
||||
- hn = NULL;
|
||||
+ }
|
||||
+ else {
|
||||
+ log_warning("Failed to read configured hostname: %s", strerror(-r));
|
||||
+ hn = NULL;
|
||||
+ }
|
||||
} else
|
||||
hn = b;
|
||||
|
||||
--- systemd-206.orig/src/hostname/hostnamed.c
|
||||
+++ systemd-206/src/hostname/hostnamed.c
|
||||
@@ -129,6 +129,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;
|
||||
}
|
||||
|
||||
@@ -283,6 +287,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)
|
||||
@@ -290,7 +295,12 @@ static int write_data_static_hostname(vo
|
||||
|
||||
return 0;
|
||||
}
|
||||
- return write_string_file_atomic_label("/etc/hostname", data[PROP_STATIC_HOSTNAME]);
|
||||
+
|
||||
+ r = write_string_file_atomic_label("/etc/hostname", data[PROP_STATIC_HOSTNAME]);
|
||||
+ if (!r) {
|
||||
+ r = symlink_atomic("/etc/hostname", "/etc/HOSTNAME");
|
||||
+ }
|
||||
+ return r;
|
||||
}
|
||||
|
||||
static int write_data_other(void) {
|
@ -1,181 +0,0 @@
|
||||
Set NumLock according to /etc/sysconfig/keyboard.
|
||||
|
||||
https://bugzilla.novell.com/show_bug.cgi?id=746595
|
||||
|
||||
Authors:
|
||||
Stanislav Brabec <sbrabec@suse.cz>
|
||||
Cristian Rodríguez <crrodriguez@opensuse.org>
|
||||
|
||||
--- systemd-206_git201308300826.orig/src/vconsole/vconsole-setup.c
|
||||
+++ systemd-206_git201308300826/src/vconsole/vconsole-setup.c
|
||||
@@ -42,6 +42,10 @@
|
||||
#include "fileio.h"
|
||||
#include "strv.h"
|
||||
|
||||
+#define BIOS_DATA_AREA 0x400
|
||||
+#define BDA_KEYBOARD_STATUS_FLAGS_4 0x97
|
||||
+#define BDA_KSF4_NUMLOCK_MASK 0x02
|
||||
+
|
||||
static bool is_vconsole(int fd) {
|
||||
unsigned char data[1];
|
||||
|
||||
@@ -321,12 +325,14 @@ int main(int argc, char **argv) {
|
||||
char *vc_kbd_delay = NULL;
|
||||
char *vc_kbd_rate = NULL;
|
||||
char *vc_kbd_disable_caps_lock = NULL;
|
||||
+ char *vc_kbd_numlock = NULL;
|
||||
char *vc_compose_table = NULL;
|
||||
pid_t kbd_rate_pid = 0, compose_table_pid = 0;
|
||||
#endif
|
||||
int fd = -1;
|
||||
bool utf8;
|
||||
bool disable_capslock = false;
|
||||
+ bool numlock = false;
|
||||
pid_t font_pid = 0, keymap_pid = 0;
|
||||
bool font_copy = false;
|
||||
int r = EXIT_FAILURE;
|
||||
@@ -389,6 +395,7 @@ int main(int argc, char **argv) {
|
||||
"KBD_DELAY", &vc_kbd_delay,
|
||||
"KBD_RATE", &vc_kbd_rate,
|
||||
"KBD_DISABLE_CAPS_LOCK", &vc_kbd_disable_caps_lock,
|
||||
+ "KBD_NUMLOCK", &vc_kbd_numlock,
|
||||
"COMPOSETABLE", &vc_compose_table,
|
||||
NULL);
|
||||
if (r < 0 && r != -ENOENT)
|
||||
@@ -403,6 +410,36 @@ int main(int argc, char **argv) {
|
||||
log_warning("Failed to read /etc/sysconfig/console: %s", strerror(-r));
|
||||
|
||||
disable_capslock = vc_kbd_disable_caps_lock && strcasecmp(vc_kbd_disable_caps_lock, "YES") == 0;
|
||||
+#if defined(__i386__) || defined(__x86_64__)
|
||||
+ if (vc_kbd_numlock && strcaseeq(vc_kbd_numlock, "bios")) {
|
||||
+ int _cleanup_close_ fdmem;
|
||||
+ char c;
|
||||
+
|
||||
+ fdmem = open ("/dev/mem", O_RDONLY);
|
||||
+
|
||||
+ if(fdmem < 0) {
|
||||
+ r = EXIT_FAILURE;
|
||||
+ log_error("Failed to open /dev/mem: %m");
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ if(lseek(fdmem, BIOS_DATA_AREA + BDA_KEYBOARD_STATUS_FLAGS_4, SEEK_SET) == (off_t) -1) {
|
||||
+ r = EXIT_FAILURE;
|
||||
+ log_error("Failed to seek /dev/mem: %m");
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ if(read (fdmem, &c, sizeof(char)) == -1) {
|
||||
+ r = EXIT_FAILURE;
|
||||
+ log_error("Failed to read /dev/mem: %m");
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ if (c & BDA_KSF4_NUMLOCK_MASK)
|
||||
+ numlock = true;
|
||||
+ } else
|
||||
+#endif
|
||||
+ numlock = vc_kbd_numlock && strcaseeq(vc_kbd_numlock, "yes");
|
||||
|
||||
#endif
|
||||
}
|
||||
@@ -425,6 +462,10 @@ int main(int argc, char **argv) {
|
||||
finish:
|
||||
if (keymap_pid > 0)
|
||||
wait_for_terminate_and_warn(KBD_LOADKEYS, keymap_pid);
|
||||
+ if (numlock)
|
||||
+ touch("/run/numlock-on");
|
||||
+ else
|
||||
+ unlink("/run/numlock-on");
|
||||
|
||||
#ifdef HAVE_SYSV_COMPAT
|
||||
if (compose_table_pid > 0)
|
||||
@@ -444,6 +485,7 @@ finish:
|
||||
free(vc_font);
|
||||
free(vc_font_map);
|
||||
free(vc_font_unimap);
|
||||
+ free(vc_kbd_numlock);
|
||||
#ifdef HAVE_SYSV_COMPAT
|
||||
free(vc_kbd_delay);
|
||||
free(vc_kbd_rate);
|
||||
--- systemd-206_git201308300826.orig/Makefile.am
|
||||
+++ systemd-206_git201308300826/Makefile.am
|
||||
@@ -2488,6 +2488,19 @@ dist_udevrules_DATA += \
|
||||
rules/61-accelerometer.rules
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
+numlock_on_SOURCES = \
|
||||
+ src/login/numlock-on.c
|
||||
+
|
||||
+numlock_on_CFLAGS = \
|
||||
+ $(AM_CFLAGS)
|
||||
+
|
||||
+udevlibexec_PROGRAMS += \
|
||||
+ numlock-on
|
||||
+
|
||||
+dist_udevrules_DATA += \
|
||||
+ rules/73-seat-numlock.rules
|
||||
+
|
||||
+# ------------------------------------------------------------------------------
|
||||
if ENABLE_GUDEV
|
||||
if ENABLE_GTK_DOC
|
||||
SUBDIRS += \
|
||||
--- /dev/null
|
||||
+++ systemd-206_git201308300826/rules/73-seat-numlock.rules
|
||||
@@ -0,0 +1,8 @@
|
||||
+# This file is part of SUSE customization of systemd.
|
||||
+#
|
||||
+# systemd is free software; you can redistribute it and/or modify it
|
||||
+# under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 2 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+
|
||||
+SUBSYSTEM=="tty", ACTION=="add", KERNEL=="tty[0-9]|tty1[0-2]", TEST=="/run/numlock-on", RUN+="numlock-on $env{DEVNAME}"
|
||||
--- /dev/null
|
||||
+++ systemd-206_git201308300826/src/login/numlock-on.c
|
||||
@@ -0,0 +1,34 @@
|
||||
+/*
|
||||
+ * numlock-on.c: Turn numlock-on
|
||||
+ *
|
||||
+ * This file may be freely copied under the terms of the GNU General
|
||||
+ * Public License (GPL), version 2, or at your option any later
|
||||
+ * version.
|
||||
+
|
||||
+ * Copyright (C) 2013 Stanislav Brabec, SUSE
|
||||
+ *
|
||||
+ * based on setleds.c, which is
|
||||
+ * Copyright (C) 1994-1999 Andries E. Brouwer
|
||||
+ */
|
||||
+
|
||||
+#include <stdio.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <sys/ioctl.h>
|
||||
+#include <linux/kd.h>
|
||||
+
|
||||
+int
|
||||
+main(int argc, char **argv) {
|
||||
+ char flags;
|
||||
+
|
||||
+ if (ioctl(0, KDGKBLED, &flags)) {
|
||||
+ perror("KDGKBLED");
|
||||
+ exit(1);
|
||||
+ }
|
||||
+
|
||||
+ if (ioctl(0, KDSKBLED, flags | LED_NUM | (LED_NUM << 4))) {
|
||||
+ perror("KDSKBLED");
|
||||
+ exit(1);
|
||||
+ }
|
||||
+
|
||||
+ exit(0);
|
||||
+}
|
||||
--- systemd-206_git201308300826.orig/units/systemd-vconsole-setup.service.in
|
||||
+++ systemd-206_git201308300826/units/systemd-vconsole-setup.service.in
|
||||
@@ -11,7 +11,7 @@ Documentation=man:systemd-vconsole-setup
|
||||
DefaultDependencies=no
|
||||
Conflicts=shutdown.target
|
||||
After=systemd-readahead-collect.service systemd-readahead-replay.service
|
||||
-Before=sysinit.target shutdown.target
|
||||
+Before=sysinit.target shutdown.target systemd-udev-trigger.service
|
||||
ConditionPathExists=/dev/tty0
|
||||
|
||||
[Service]
|
@ -1,53 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Tue, 4 Dec 2012 16:51:32 +0000
|
||||
Subject: handle root_uses_lang value in /etc/sysconfig/language
|
||||
|
||||
handle ROOT_USES_LANG=ctype (bnc#792182).
|
||||
---
|
||||
src/core/locale-setup.c | 27 +++++++++++++++++++++++++++
|
||||
1 file changed, 27 insertions(+)
|
||||
|
||||
Index: systemd-208/src/core/locale-setup.c
|
||||
===================================================================
|
||||
--- systemd-208.orig/src/core/locale-setup.c
|
||||
+++ systemd-208/src/core/locale-setup.c
|
||||
@@ -73,6 +73,11 @@ int locale_setup(char ***environment) {
|
||||
char **add;
|
||||
char *variables[_VARIABLE_MAX] = {};
|
||||
int r = 0, i;
|
||||
+#ifdef HAVE_SYSV_COMPAT
|
||||
+ char _cleanup_free_ *root_uses_lang;
|
||||
+
|
||||
+ zero(root_uses_lang);
|
||||
+#endif
|
||||
|
||||
if (detect_container(NULL) <= 0) {
|
||||
r = parse_env_file("/proc/cmdline", WHITESPACE,
|
||||
@@ -119,6 +124,27 @@ int locale_setup(char ***environment) {
|
||||
if (r < 0 && r != -ENOENT)
|
||||
log_warning("Failed to read /etc/locale.conf: %s", strerror(-r));
|
||||
}
|
||||
+#ifdef HAVE_SYSV_COMPAT
|
||||
+ if (r <= 0 &&
|
||||
+ (r = parse_env_file("/etc/sysconfig/language", NEWLINE,
|
||||
+ "ROOT_USES_LANG", &root_uses_lang,
|
||||
+ "RC_LANG", &variables[VARIABLE_LANG],
|
||||
+ NULL)) < 0) {
|
||||
+ if (r != -ENOENT)
|
||||
+ log_warning("Failed to read /etc/sysconfig/language: %s", strerror(-r));
|
||||
+
|
||||
+ } else {
|
||||
+ if (!root_uses_lang || (root_uses_lang && !strcaseeq(root_uses_lang,"yes"))) {
|
||||
+ if (root_uses_lang && strcaseeq(root_uses_lang,"ctype"))
|
||||
+ variables[VARIABLE_LC_CTYPE]=variables[VARIABLE_LANG];
|
||||
+ else
|
||||
+ free(variables[VARIABLE_LANG]);
|
||||
+
|
||||
+ variables[VARIABLE_LANG]=strdup("POSIX");
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+#endif
|
||||
|
||||
add = NULL;
|
||||
for (i = 0; i < _VARIABLE_MAX; i++) {
|
@ -1,392 +0,0 @@
|
||||
From a8cbe79c77836cc2466e3534157864abc98ef3ef Mon Sep 17 00:00:00 2001
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Fri, 28 Jun 2013 17:54:41 +0200
|
||||
Subject: [PATCH] insserv.conf generator
|
||||
|
||||
parse /etc/insserv.conf.dd content and /etc/insserv.conf and generate
|
||||
systemd unit drop-in files to add dependencies
|
||||
---
|
||||
Makefile.am | 9 +
|
||||
src/insserv-generator/Makefile | 28 +++
|
||||
src/insserv-generator/insserv-generator.c | 309 ++++++++++++++++++++++++++++++
|
||||
3 files changed, 346 insertions(+)
|
||||
create mode 100644 src/insserv-generator/Makefile
|
||||
create mode 100644 src/insserv-generator/insserv-generator.c
|
||||
|
||||
Index: systemd-208/Makefile.am
|
||||
===================================================================
|
||||
--- systemd-208.orig/Makefile.am
|
||||
+++ systemd-208/Makefile.am
|
||||
@@ -322,6 +322,7 @@ rootlibexec_PROGRAMS = \
|
||||
systemd-sleep
|
||||
|
||||
systemgenerator_PROGRAMS = \
|
||||
+ systemd-insserv-generator \
|
||||
systemd-getty-generator \
|
||||
systemd-fstab-generator \
|
||||
systemd-system-update-generator
|
||||
@@ -1682,6 +1683,14 @@ systemd_delta_LDADD = \
|
||||
libsystemd-shared.la
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
+systemd_insserv_generator_SOURCES = \
|
||||
+ src/insserv-generator/insserv-generator.c
|
||||
+
|
||||
+systemd_insserv_generator_LDADD = \
|
||||
+ libsystemd-label.la \
|
||||
+ libsystemd-shared.la
|
||||
+
|
||||
+# ------------------------------------------------------------------------------
|
||||
systemd_getty_generator_SOURCES = \
|
||||
src/getty-generator/getty-generator.c
|
||||
|
||||
Index: systemd-208/src/insserv-generator/Makefile
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ systemd-208/src/insserv-generator/Makefile
|
||||
@@ -0,0 +1,28 @@
|
||||
+# This file is part of systemd.
|
||||
+#
|
||||
+# Copyright 2010 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/>.
|
||||
+
|
||||
+# This file is a dirty trick to simplify compilation from within
|
||||
+# emacs. This file is not intended to be distributed. So, don't touch
|
||||
+# it, even better ignore it!
|
||||
+
|
||||
+all:
|
||||
+ $(MAKE) -C ..
|
||||
+
|
||||
+clean:
|
||||
+ $(MAKE) -C .. clean
|
||||
+
|
||||
+.PHONY: all clean
|
||||
Index: systemd-208/src/insserv-generator/insserv-generator.c
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ systemd-208/src/insserv-generator/insserv-generator.c
|
||||
@@ -0,0 +1,312 @@
|
||||
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||
+
|
||||
+/***
|
||||
+ This file is part of systemd.
|
||||
+
|
||||
+ Copyright 2012 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 <stdio.h>
|
||||
+#include <errno.h>
|
||||
+#include <string.h>
|
||||
+#include <sys/stat.h>
|
||||
+
|
||||
+#include "mkdir.h"
|
||||
+#include "log.h"
|
||||
+#include "fileio.h"
|
||||
+#include "unit-name.h"
|
||||
+#include "special.h"
|
||||
+#include "path-util.h"
|
||||
+#include "util.h"
|
||||
+#include "strv.h"
|
||||
+
|
||||
+static const char *arg_dest = "/tmp";
|
||||
+
|
||||
+static char *sysv_translate_name(const char *name) {
|
||||
+ char *r;
|
||||
+
|
||||
+ r = new(char, strlen(name) + sizeof(".service"));
|
||||
+ if (!r)
|
||||
+ return NULL;
|
||||
+
|
||||
+ if (endswith(name, ".sh"))
|
||||
+ /* Drop .sh suffix */
|
||||
+ strcpy(stpcpy(r, name) - 3, ".service");
|
||||
+ if (startswith(name, "boot."))
|
||||
+ /* Drop SuSE-style boot. prefix */
|
||||
+ strcpy(stpcpy(r, name + 5), ".service");
|
||||
+ else
|
||||
+ /* Normal init script name */
|
||||
+ strcpy(stpcpy(r, name), ".service");
|
||||
+
|
||||
+ return r;
|
||||
+}
|
||||
+
|
||||
+static int sysv_translate_facility(const char *name, const char *filename, char **_r) {
|
||||
+
|
||||
+ /* We silently ignore the $ prefix here. According to the LSB
|
||||
+ * spec it simply indicates whether something is a
|
||||
+ * standardized name or a distribution-specific one. Since we
|
||||
+ * just follow what already exists and do not introduce new
|
||||
+ * uses or names we don't care who introduced a new name. */
|
||||
+
|
||||
+ static const char * const table[] = {
|
||||
+ /* LSB defined facilities */
|
||||
+ "local_fs", NULL,
|
||||
+ "network", SPECIAL_NETWORK_TARGET,
|
||||
+ "named", SPECIAL_NSS_LOOKUP_TARGET,
|
||||
+ "portmap", SPECIAL_RPCBIND_TARGET,
|
||||
+ "remote_fs", SPECIAL_REMOTE_FS_TARGET,
|
||||
+ "syslog", NULL,
|
||||
+ "time", SPECIAL_TIME_SYNC_TARGET,
|
||||
+ };
|
||||
+
|
||||
+ unsigned i;
|
||||
+ char *r;
|
||||
+ const char *n;
|
||||
+
|
||||
+ assert(name);
|
||||
+ assert(_r);
|
||||
+
|
||||
+ n = *name == '$' ? name + 1 : name;
|
||||
+
|
||||
+ for (i = 0; i < ELEMENTSOF(table); i += 2) {
|
||||
+
|
||||
+ if (!streq(table[i], n))
|
||||
+ continue;
|
||||
+
|
||||
+ if (!table[i+1])
|
||||
+ return 0;
|
||||
+
|
||||
+ r = strdup(table[i+1]);
|
||||
+ if (!r)
|
||||
+ return log_oom();
|
||||
+
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ /* If we don't know this name, fallback heuristics to figure
|
||||
+ * out whether something is a target or a service alias. */
|
||||
+
|
||||
+ if (*name == '$') {
|
||||
+ if (!unit_prefix_is_valid(n))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ /* Facilities starting with $ are most likely targets */
|
||||
+ r = unit_name_build(n, NULL, ".target");
|
||||
+ } else if (filename && streq(name, filename))
|
||||
+ /* Names equaling the file name of the services are redundant */
|
||||
+ return 0;
|
||||
+ else
|
||||
+ /* Everything else we assume to be normal service names */
|
||||
+ r = sysv_translate_name(n);
|
||||
+
|
||||
+ if (!r)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+finish:
|
||||
+ *_r = r;
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+
|
||||
+static int parse_insserv_conf(const char* filename) {
|
||||
+ _cleanup_fclose_ FILE *f = NULL;
|
||||
+ int r;
|
||||
+
|
||||
+ if (!(f = fopen(filename, "re"))) {
|
||||
+ log_debug("Failed to open file %s", filename);
|
||||
+ r = errno == ENOENT ? 0 : -errno;
|
||||
+ return r;
|
||||
+ }
|
||||
+
|
||||
+ while (!feof(f)) {
|
||||
+ char l[LINE_MAX], *t;
|
||||
+ _cleanup_strv_free_ char **parsed = NULL;
|
||||
+
|
||||
+ if (!fgets(l, sizeof(l), f)) {
|
||||
+ if (feof(f))
|
||||
+ break;
|
||||
+
|
||||
+ r = -errno;
|
||||
+ log_error("Failed to read configuration file '%s': %s", filename, strerror(-r));
|
||||
+ return -r;
|
||||
+ }
|
||||
+
|
||||
+ t = strstrip(l);
|
||||
+ if (*t != '$' && *t != '<')
|
||||
+ continue;
|
||||
+
|
||||
+ parsed = strv_split(t,WHITESPACE);
|
||||
+ /* we ignore <interactive>, not used, equivalent to X-Interactive */
|
||||
+ if (parsed && !startswith_no_case (parsed[0], "<interactive>")) {
|
||||
+ _cleanup_free_ char *facility = NULL;
|
||||
+ if (sysv_translate_facility(parsed[0], NULL, &facility) < 0 || !facility)
|
||||
+ continue;
|
||||
+ if (streq(facility, SPECIAL_REMOTE_FS_TARGET)) {
|
||||
+ _cleanup_free_ char *unit = NULL;
|
||||
+ /* insert also a Wants dependency from remote-fs-pre on remote-fs */
|
||||
+ unit = strjoin(arg_dest, "/remote-fs.target.d/50-",path_get_file_name(filename),".conf", NULL);
|
||||
+ if (!unit)
|
||||
+ return log_oom();
|
||||
+
|
||||
+ mkdir_parents_label(unit, 0755);
|
||||
+
|
||||
+ r = write_string_file(unit,
|
||||
+ "# Automatically generated by systemd-insserv-generator\n\n"
|
||||
+ "[Unit]\n"
|
||||
+ "Wants=remote-fs-pre.target\n");
|
||||
+ if (r)
|
||||
+ return r;
|
||||
+ free (facility);
|
||||
+ facility=strdup(SPECIAL_REMOTE_FS_PRE_TARGET);
|
||||
+ }
|
||||
+ if (facility && endswith(facility, ".target")) {
|
||||
+ char *name, **j;
|
||||
+ FILE *file = NULL;
|
||||
+
|
||||
+ STRV_FOREACH (j, parsed+1) {
|
||||
+ _cleanup_free_ char *unit = NULL;
|
||||
+ _cleanup_free_ char *dep = NULL;
|
||||
+
|
||||
+ if (*j[0] == '+')
|
||||
+ name = *j+1;
|
||||
+ else
|
||||
+ name = *j;
|
||||
+ if (streq(name, "boot.localfs") ||
|
||||
+ streq(name, "boot.crypto"))
|
||||
+ continue;
|
||||
+ if ((sysv_translate_facility(name, NULL, &dep) < 0) || !dep)
|
||||
+ continue;
|
||||
+
|
||||
+ unit = strjoin(arg_dest, "/", dep, ".d/50-",path_get_file_name(filename),"-",parsed[0],".conf", NULL);
|
||||
+ if (!unit)
|
||||
+ return log_oom();
|
||||
+
|
||||
+ mkdir_parents_label(unit, 0755);
|
||||
+
|
||||
+ file = fopen(unit, "wxe");
|
||||
+ if (!file) {
|
||||
+ if (errno == EEXIST)
|
||||
+ log_error("Failed to create drop-in file %s", unit);
|
||||
+ else
|
||||
+ log_error("Failed to create drop-in file %s: %m", unit);
|
||||
+ return -errno;
|
||||
+ }
|
||||
+
|
||||
+ fprintf(file,
|
||||
+ "# Automatically generated by systemd-insserv-generator\n\n"
|
||||
+ "[Unit]\n"
|
||||
+ "Wants=%s\n"
|
||||
+ "Before=%s\n",
|
||||
+ facility, facility);
|
||||
+
|
||||
+ fflush(file);
|
||||
+ if (ferror(file)) {
|
||||
+ log_error("Failed to write unit file %s: %m", unit);
|
||||
+ return -errno;
|
||||
+ }
|
||||
+ fclose(file);
|
||||
+
|
||||
+ if (*j[0] != '+') {
|
||||
+ free (unit);
|
||||
+ unit = strjoin(arg_dest, "/", facility, ".d/50-hard-dependency-",path_get_file_name(filename),"-",parsed[0],".conf", NULL);
|
||||
+ if (!unit)
|
||||
+ return log_oom();
|
||||
+
|
||||
+ mkdir_parents_label(unit, 0755);
|
||||
+
|
||||
+ file = fopen(unit, "wxe");
|
||||
+ if (!file) {
|
||||
+ if (errno == EEXIST)
|
||||
+ log_error("Failed to create drop-in file %s, as it already exists", unit);
|
||||
+ else
|
||||
+ log_error("Failed to create drop-in file %s: %m", unit);
|
||||
+ return -errno;
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ fprintf(file,
|
||||
+ "# Automatically generated by systemd-insserv-generator\n\n"
|
||||
+ "[Unit]\n"
|
||||
+ "SourcePath=%s\n"
|
||||
+ "Requires=%s\n",
|
||||
+ filename, dep);
|
||||
+ fflush(file);
|
||||
+ if (ferror(file)) {
|
||||
+ log_error("Failed to write unit file %s: %m", unit);
|
||||
+ return -errno;
|
||||
+ }
|
||||
+ fclose(file);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ return r;
|
||||
+}
|
||||
+
|
||||
+static int parse_insserv(void) {
|
||||
+ DIR *d = NULL;
|
||||
+ struct dirent *de;
|
||||
+ int r = 0;
|
||||
+
|
||||
+ if (!(d = opendir("/etc/insserv.conf.d/"))) {
|
||||
+ if (errno != ENOENT) {
|
||||
+ log_debug("opendir() failed on /etc/insserv.conf.d/ %s", strerror(errno));
|
||||
+ }
|
||||
+ } else {
|
||||
+
|
||||
+ while ((de = readdir(d))) {
|
||||
+ char *path = NULL;
|
||||
+ if (ignore_file(de->d_name))
|
||||
+ continue;
|
||||
+
|
||||
+ path = strjoin("/etc/insserv.conf.d/", de->d_name, NULL);
|
||||
+ parse_insserv_conf(path);
|
||||
+ free(path);
|
||||
+ }
|
||||
+ closedir (d);
|
||||
+ }
|
||||
+
|
||||
+ r = parse_insserv_conf("/etc/insserv.conf");
|
||||
+
|
||||
+ return r;
|
||||
+}
|
||||
+
|
||||
+int main(int argc, char *argv[]) {
|
||||
+ int r = 0;
|
||||
+
|
||||
+ if (argc > 1 && argc != 4) {
|
||||
+ log_error("This program takes three or no arguments.");
|
||||
+ return EXIT_FAILURE;
|
||||
+ }
|
||||
+
|
||||
+ if (argc > 1)
|
||||
+ arg_dest = argv[1];
|
||||
+
|
||||
+ log_set_target(LOG_TARGET_SAFE);
|
||||
+ log_parse_environment();
|
||||
+ log_open();
|
||||
+
|
||||
+ umask(0022);
|
||||
+
|
||||
+ r = parse_insserv();
|
||||
+
|
||||
+ return (r < 0) ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||
+}
|
123
libgcrypt.m4
123
libgcrypt.m4
@ -1,123 +0,0 @@
|
||||
dnl Autoconf macros for libgcrypt
|
||||
dnl Copyright (C) 2002, 2004 Free Software Foundation, Inc.
|
||||
dnl
|
||||
dnl This file is free software; as a special exception the author gives
|
||||
dnl unlimited permission to copy and/or distribute it, with or without
|
||||
dnl modifications, as long as this notice is preserved.
|
||||
dnl
|
||||
dnl This file is distributed in the hope that it will be useful, but
|
||||
dnl WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||
dnl implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
|
||||
dnl AM_PATH_LIBGCRYPT([MINIMUM-VERSION,
|
||||
dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
|
||||
dnl Test for libgcrypt and define LIBGCRYPT_CFLAGS and LIBGCRYPT_LIBS.
|
||||
dnl MINIMUN-VERSION is a string with the version number optionalliy prefixed
|
||||
dnl with the API version to also check the API compatibility. Example:
|
||||
dnl a MINIMUN-VERSION of 1:1.2.5 won't pass the test unless the installed
|
||||
dnl version of libgcrypt is at least 1.2.5 *and* the API number is 1. Using
|
||||
dnl this features allows to prevent build against newer versions of libgcrypt
|
||||
dnl with a changed API.
|
||||
dnl
|
||||
AC_DEFUN([AM_PATH_LIBGCRYPT],
|
||||
[ AC_ARG_WITH(libgcrypt-prefix,
|
||||
AC_HELP_STRING([--with-libgcrypt-prefix=PFX],
|
||||
[prefix where LIBGCRYPT is installed (optional)]),
|
||||
libgcrypt_config_prefix="$withval", libgcrypt_config_prefix="")
|
||||
if test x$libgcrypt_config_prefix != x ; then
|
||||
if test x${LIBGCRYPT_CONFIG+set} != xset ; then
|
||||
LIBGCRYPT_CONFIG=$libgcrypt_config_prefix/bin/libgcrypt-config
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_PATH_TOOL(LIBGCRYPT_CONFIG, libgcrypt-config, no)
|
||||
tmp=ifelse([$1], ,1:1.2.0,$1)
|
||||
if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
|
||||
req_libgcrypt_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'`
|
||||
min_libgcrypt_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
|
||||
else
|
||||
req_libgcrypt_api=0
|
||||
min_libgcrypt_version="$tmp"
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING(for LIBGCRYPT - version >= $min_libgcrypt_version)
|
||||
ok=no
|
||||
if test "$LIBGCRYPT_CONFIG" != "no" ; then
|
||||
req_major=`echo $min_libgcrypt_version | \
|
||||
sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
|
||||
req_minor=`echo $min_libgcrypt_version | \
|
||||
sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
|
||||
req_micro=`echo $min_libgcrypt_version | \
|
||||
sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
|
||||
libgcrypt_config_version=`$LIBGCRYPT_CONFIG --version`
|
||||
major=`echo $libgcrypt_config_version | \
|
||||
sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
|
||||
minor=`echo $libgcrypt_config_version | \
|
||||
sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
|
||||
micro=`echo $libgcrypt_config_version | \
|
||||
sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'`
|
||||
if test "$major" -gt "$req_major"; then
|
||||
ok=yes
|
||||
else
|
||||
if test "$major" -eq "$req_major"; then
|
||||
if test "$minor" -gt "$req_minor"; then
|
||||
ok=yes
|
||||
else
|
||||
if test "$minor" -eq "$req_minor"; then
|
||||
if test "$micro" -ge "$req_micro"; then
|
||||
ok=yes
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if test $ok = yes; then
|
||||
AC_MSG_RESULT([yes ($libgcrypt_config_version)])
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
if test $ok = yes; then
|
||||
# If we have a recent libgcrypt, we should also check that the
|
||||
# API is compatible
|
||||
if test "$req_libgcrypt_api" -gt 0 ; then
|
||||
tmp=`$LIBGCRYPT_CONFIG --api-version 2>/dev/null || echo 0`
|
||||
if test "$tmp" -gt 0 ; then
|
||||
AC_MSG_CHECKING([LIBGCRYPT API version])
|
||||
if test "$req_libgcrypt_api" -eq "$tmp" ; then
|
||||
AC_MSG_RESULT([okay])
|
||||
else
|
||||
ok=no
|
||||
AC_MSG_RESULT([does not match. want=$req_libgcrypt_api got=$tmp])
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if test $ok = yes; then
|
||||
LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags`
|
||||
LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs`
|
||||
ifelse([$2], , :, [$2])
|
||||
if test x"$host" != x ; then
|
||||
libgcrypt_config_host=`$LIBGCRYPT_CONFIG --host 2>/dev/null || echo none`
|
||||
if test x"$libgcrypt_config_host" != xnone ; then
|
||||
if test x"$libgcrypt_config_host" != x"$host" ; then
|
||||
AC_MSG_WARN([[
|
||||
***
|
||||
*** The config script $LIBGCRYPT_CONFIG was
|
||||
*** built for $libgcrypt_config_host and thus may not match the
|
||||
*** used host $host.
|
||||
*** You may want to use the configure option --with-libgcrypt-prefix
|
||||
*** to specify a matching config script.
|
||||
***]])
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
else
|
||||
LIBGCRYPT_CFLAGS=""
|
||||
LIBGCRYPT_LIBS=""
|
||||
ifelse([$3], , :, [$3])
|
||||
fi
|
||||
AC_SUBST(LIBGCRYPT_CFLAGS)
|
||||
AC_SUBST(LIBGCRYPT_LIBS)
|
||||
])
|
@ -1,8 +0,0 @@
|
||||
[Unit]
|
||||
Description=Shadow /etc/init.d/boot.localfs
|
||||
DefaultDependencies=no
|
||||
After=local-fs.target
|
||||
|
||||
[Service]
|
||||
RemainAfterExit=true
|
||||
ExecStart=/bin/true
|
@ -1,78 +0,0 @@
|
||||
# -*- Mode: makefile; indent-tabs-mode: t -*- */
|
||||
#
|
||||
# This file is part of systemd.
|
||||
#
|
||||
# Copyright 2012 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/>.
|
||||
|
||||
# RPM macros for packages installing systemd unit files
|
||||
|
||||
%_unitdir @systemunitdir@
|
||||
%_userunitdir @userunitdir@
|
||||
%_presetdir @systempresetdir@
|
||||
%_udevhwdbdir @udevhwdbdir@
|
||||
%_udevrulesdir @udevrulesdir@
|
||||
%_journalcatalogdir @catalogdir@
|
||||
%_tmpfilesdir @tmpfilesdir@
|
||||
%_sysctldir @sysctldir@
|
||||
|
||||
%systemd_requires \
|
||||
Requires(post): systemd \
|
||||
Requires(preun): systemd \
|
||||
Requires(postun): systemd \
|
||||
%{nil}
|
||||
|
||||
%systemd_post() \
|
||||
if [ $1 -eq 1 ] ; then \
|
||||
# Initial installation \
|
||||
@rootbindir@/systemctl preset %{?*} >/dev/null 2>&1 || : \
|
||||
fi \
|
||||
%{nil}
|
||||
|
||||
%systemd_preun() \
|
||||
if [ $1 -eq 0 ] ; then \
|
||||
# Package removal, not upgrade \
|
||||
@rootbindir@/systemctl --no-reload disable %{?*} > /dev/null 2>&1 || : \
|
||||
@rootbindir@/systemctl stop %{?*} > /dev/null 2>&1 || : \
|
||||
fi \
|
||||
%{nil}
|
||||
|
||||
%systemd_postun() \
|
||||
@rootbindir@/systemctl daemon-reload >/dev/null 2>&1 || : \
|
||||
%{nil}
|
||||
|
||||
%systemd_postun_with_restart() \
|
||||
@rootbindir@/systemctl daemon-reload >/dev/null 2>&1 || : \
|
||||
if [ $1 -ge 1 ] ; then \
|
||||
# Package upgrade, not uninstall \
|
||||
@rootbindir@/systemctl try-restart %{?*} >/dev/null 2>&1 || : \
|
||||
fi \
|
||||
%{nil}
|
||||
|
||||
%udev_hwdb_update() \
|
||||
@rootbindir@/udevadm hwdb --update >/dev/null 2>&1 || : \
|
||||
%{nil}
|
||||
|
||||
%udev_rules_update() \
|
||||
@rootbindir@/udevadm control --reload >/dev/null 2>&1 || : \
|
||||
%{nil}
|
||||
|
||||
%journal_catalog_update() \
|
||||
@rootbindir@/journalctl --update-catalog >/dev/null 2>&1 || : \
|
||||
%{nil}
|
||||
|
||||
%tmpfiles_create() \
|
||||
@rootbindir@/systemd-tmpfiles --create %{?*} >/dev/null 2>&1 || : \
|
||||
%{nil}
|
@ -1,22 +0,0 @@
|
||||
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]
|
@ -1,62 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Wed, 12 Oct 2011 15:18:29 +0200
|
||||
Subject: module-load: handle SUSE /etc/sysconfig/kernel module list
|
||||
|
||||
---
|
||||
src/modules-load/modules-load.c | 27 ++++++++++++++++++++++++++-
|
||||
units/systemd-modules-load.service.in | 1 +
|
||||
2 files changed, 27 insertions(+), 1 deletion(-)
|
||||
|
||||
--- systemd-206_git201308300826.orig/src/modules-load/modules-load.c
|
||||
+++ systemd-206_git201308300826/src/modules-load/modules-load.c
|
||||
@@ -262,6 +262,9 @@ static int parse_argv(int argc, char *ar
|
||||
int main(int argc, char *argv[]) {
|
||||
int r, k;
|
||||
struct kmod_ctx *ctx;
|
||||
+#ifdef HAVE_SYSV_COMPAT
|
||||
+ _cleanup_free_ char *modules_on_boot = NULL;
|
||||
+#endif
|
||||
|
||||
r = parse_argv(argc, argv);
|
||||
if (r <= 0)
|
||||
@@ -318,7 +321,29 @@ int main(int argc, char *argv[]) {
|
||||
r = k;
|
||||
}
|
||||
}
|
||||
-
|
||||
+#ifdef HAVE_SYSV_COMPAT
|
||||
+ log_debug("apply: /etc/sysconfig/kernel MODULES_LOADED_ON_BOOT");
|
||||
+ if ((r = parse_env_file("/etc/sysconfig/kernel", NEWLINE,
|
||||
+ "MODULES_LOADED_ON_BOOT", &modules_on_boot,
|
||||
+ NULL)) < 0) {
|
||||
+ if (r != -ENOENT)
|
||||
+ log_warning("Failed to read /etc/sysconfig/kernel: %s", strerror(-r));
|
||||
+ } else
|
||||
+ r = EXIT_SUCCESS;
|
||||
+ if (modules_on_boot) {
|
||||
+ char **modules = strv_split(modules_on_boot,WHITESPACE);
|
||||
+ char **module;
|
||||
+
|
||||
+ if (modules) {
|
||||
+ STRV_FOREACH(module, modules) {
|
||||
+ k = load_module(ctx, *module);
|
||||
+ if (k < 0)
|
||||
+ r = EXIT_FAILURE;
|
||||
+ }
|
||||
+ }
|
||||
+ strv_free(modules);
|
||||
+ }
|
||||
+#endif
|
||||
finish:
|
||||
kmod_unref(ctx);
|
||||
strv_free(arg_proc_cmdline_modules);
|
||||
--- systemd-206_git201308300826.orig/units/systemd-modules-load.service.in
|
||||
+++ systemd-206_git201308300826/units/systemd-modules-load.service.in
|
||||
@@ -13,6 +13,7 @@ Conflicts=shutdown.target
|
||||
After=systemd-readahead-collect.service systemd-readahead-replay.service
|
||||
Before=sysinit.target shutdown.target
|
||||
ConditionCapability=CAP_SYS_MODULE
|
||||
+ConditionPathExists=|/etc/sysconfig/kernel
|
||||
ConditionDirectoryNotEmpty=|/lib/modules-load.d
|
||||
ConditionDirectoryNotEmpty=|/usr/lib/modules-load.d
|
||||
ConditionDirectoryNotEmpty=|/usr/local/lib/modules-load.d
|
@ -1,31 +0,0 @@
|
||||
#!/bin/bash
|
||||
# sed calls copied from fedora package
|
||||
set -e
|
||||
|
||||
case "$1" in
|
||||
--help)
|
||||
echo "$0 [--enable|--disable]"
|
||||
exit 0
|
||||
;;
|
||||
--enable)
|
||||
sed -i.bak -e '
|
||||
/^hosts:/ !b
|
||||
/\<myhostname\>/ b
|
||||
s/[[:blank:]]*$/ myhostname/
|
||||
' /etc/nsswitch.conf
|
||||
;;
|
||||
--disable)
|
||||
sed -i.bak -e '
|
||||
/^hosts:/ !b
|
||||
s/[[:blank:]]\+myhostname\>//
|
||||
' /etc/nsswitch.conf
|
||||
;;
|
||||
"")
|
||||
if grep -q "^hosts:.*\<myhostname\>" /etc/nsswitch.conf; then
|
||||
echo "enabled"
|
||||
else
|
||||
echo "disabled"
|
||||
fi
|
||||
;;
|
||||
*) echo "invalid argument $1"; exit 1 ;;
|
||||
esac
|
@ -1,102 +0,0 @@
|
||||
From: Ludwig Nussel <ludwig.nussel@suse.de>
|
||||
Date: Fri, 20 May 2011 15:38:46 +0200
|
||||
Subject: optionally warn if nss-myhostname is called
|
||||
|
||||
---
|
||||
configure.ac | 11 +++++++++++
|
||||
src/nss-myhostname/nss-myhostname.c | 32 ++++++++++++++++++++++++++++++++
|
||||
2 files changed, 43 insertions(+)
|
||||
|
||||
--- systemd-206_git201308300826.orig/configure.ac
|
||||
+++ systemd-206_git201308300826/configure.ac
|
||||
@@ -817,6 +817,17 @@ if test "x$enable_myhostname" != "xno";
|
||||
fi
|
||||
AM_CONDITIONAL(HAVE_MYHOSTNAME, [test "$have_myhostname" = "yes"])
|
||||
|
||||
+if test "x$have_myhostname" != "xno"; then
|
||||
+ AC_MSG_CHECKING([log warning messages for nss-myhostname])
|
||||
+ AC_ARG_WITH(nss-my-hostname-warning, AS_HELP_STRING([--with-nss-my-hostname-warning], [log warning to syslog when nss-myhostname is called (default=no)]),[],[with_nss_my_hostname_warning=no])
|
||||
+ AC_MSG_RESULT([$with_nss_my_hostname_warning])
|
||||
+
|
||||
+ if test x$with_nss_my_hostname_warning != xno; then
|
||||
+ AC_CHECK_HEADERS([syslog.h])
|
||||
+ AC_DEFINE([LOG_NSS_MY_HOSTNAME_WARNING],[1],[whether to log warning message for nss-myhostname])
|
||||
+ fi
|
||||
+fi
|
||||
+
|
||||
# ------------------------------------------------------------------------------
|
||||
AC_ARG_WITH(firmware-path,
|
||||
AS_HELP_STRING([--with-firmware-path=DIR[[[:DIR[...]]]]],
|
||||
--- systemd-206_git201308300826.orig/src/nss-myhostname/nss-myhostname.c
|
||||
+++ systemd-206_git201308300826/src/nss-myhostname/nss-myhostname.c
|
||||
@@ -29,6 +29,9 @@
|
||||
#include <net/if.h>
|
||||
#include <stdlib.h>
|
||||
#include <arpa/inet.h>
|
||||
+#ifdef LOG_NSS_MY_HOSTNAME_WARNING
|
||||
+#include <syslog.h>
|
||||
+#endif
|
||||
|
||||
#include "ifconf.h"
|
||||
#include "macro.h"
|
||||
@@ -47,6 +50,10 @@
|
||||
#define LOCALADDRESS_IPV6 &in6addr_loopback
|
||||
#define LOOPBACK_INTERFACE "lo"
|
||||
|
||||
+#ifdef LOG_NSS_MY_HOSTNAME_WARNING
|
||||
+static void warn(const char* hn);
|
||||
+#endif
|
||||
+
|
||||
enum nss_status _nss_myhostname_gethostbyname4_r(
|
||||
const char *name,
|
||||
struct gaih_addrtuple **pat,
|
||||
@@ -129,6 +136,9 @@ enum nss_status _nss_myhostname_gethostb
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
|
||||
+#ifdef LOG_NSS_MY_HOSTNAME_WARNING
|
||||
+ warn(hn);
|
||||
+#endif
|
||||
/* If this fails, n_addresses is 0. Which is fine */
|
||||
ifconf_acquire_addresses(&addresses, &n_addresses);
|
||||
|
||||
@@ -382,6 +392,9 @@ enum nss_status _nss_myhostname_gethostb
|
||||
local_address_ipv4 = LOCALADDRESS_IPV4;
|
||||
}
|
||||
|
||||
+#ifdef LOG_NSS_MY_HOSTNAME_WARNING
|
||||
+ warn(hn);
|
||||
+#endif
|
||||
return fill_in_hostent(
|
||||
canonical, additional,
|
||||
af,
|
||||
@@ -509,6 +522,9 @@ found:
|
||||
canonical = hn;
|
||||
}
|
||||
|
||||
+#ifdef LOG_NSS_MY_HOSTNAME_WARNING
|
||||
+ warn(hn);
|
||||
+#endif
|
||||
return fill_in_hostent(
|
||||
canonical, additional,
|
||||
af,
|
||||
@@ -537,3 +553,19 @@ enum nss_status _nss_myhostname_gethostb
|
||||
errnop, h_errnop,
|
||||
NULL);
|
||||
}
|
||||
+
|
||||
+#ifdef LOG_NSS_MY_HOSTNAME_WARNING
|
||||
+static void warn(const char* hn) {
|
||||
+ if (strstr(program_invocation_short_name, "nscd")) {
|
||||
+ syslog(LOG_WARNING,
|
||||
+ "Some application tried to resolve hostname \"%s\" which is not in DNS. Stop nscd to find out which one.\n",
|
||||
+ hn);
|
||||
+ } else {
|
||||
+ syslog(LOG_WARNING,
|
||||
+ "%s(%u) tried to resolve hostname \"%s\" which is not in DNS. This might be the reason for the delays you experience.\n",
|
||||
+ program_invocation_short_name,
|
||||
+ getpid(),
|
||||
+ hn);
|
||||
+ }
|
||||
+}
|
||||
+#endif
|
@ -1,35 +0,0 @@
|
||||
--- systemd-208/units/console-shell.service.m4.in
|
||||
+++ systemd-208/units/console-shell.service.m4.in 2014-02-05 11:28:31.446735287 +0000
|
||||
@@ -17,6 +17,8 @@ Before=getty.target
|
||||
[Service]
|
||||
Environment=HOME=/root
|
||||
WorkingDirectory=/root
|
||||
+ExecStartPre=-/usr/bin/plymouth quit
|
||||
+ExecStartPre=-/usr/bin/plymouth --wait
|
||||
ExecStart=-/usr/sbin/sulogin
|
||||
ExecStopPost=-@SYSTEMCTL@ poweroff
|
||||
Type=idle
|
||||
--- systemd-208/units/rescue.service.m4.in
|
||||
+++ systemd-208/units/rescue.service.m4.in 2014-02-05 11:28:45.214235524 +0000
|
||||
@@ -16,7 +16,8 @@ Before=shutdown.target
|
||||
[Service]
|
||||
Environment=HOME=/root
|
||||
WorkingDirectory=/root
|
||||
-ExecStartPre=-/bin/plymouth quit
|
||||
+ExecStartPre=-/usr/bin/plymouth quit
|
||||
+ExecStartPre=-/usr/bin/plymouth --wait
|
||||
ExecStartPre=-/bin/echo -e 'Welcome to rescue mode! Type "systemctl default" or ^D to enter default mode.\\nType "journalctl -xb" to view system logs. Type "systemctl reboot" to reboot.'
|
||||
ExecStart=-/usr/sbin/sulogin
|
||||
ExecStopPost=-@SYSTEMCTL@ --fail --no-block default
|
||||
--- systemd-208/units/emergency.service.in
|
||||
+++ systemd-208/units/emergency.service.in 2014-02-05 11:28:51.782235282 +0000
|
||||
@@ -15,7 +15,8 @@ Before=shutdown.target
|
||||
[Service]
|
||||
Environment=HOME=/root
|
||||
WorkingDirectory=/root
|
||||
-ExecStartPre=-/bin/plymouth quit
|
||||
+ExecStartPre=-/usr/bin/plymouth quit
|
||||
+ExecStartPre=-/usr/bin/plymouth --wait
|
||||
ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" to try again\\nto boot into default mode.'
|
||||
ExecStart=-/usr/sbin/sulogin
|
||||
ExecStopPost=@SYSTEMCTL@ --fail --no-block default
|
@ -1,16 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This script is based on libcdio_spec-prepare.sh (thanks to sbrabec@suse.cz)
|
||||
# create a -mini spec for systemd for bootstrapping
|
||||
|
||||
ORIG_SPEC=systemd
|
||||
EDIT_WARNING="##### WARNING: please do not edit this auto generated spec file. Use the ${ORIG_SPEC}.spec! #####\n"
|
||||
sed "s/^%define bootstrap.*$/${EDIT_WARNING}%define bootstrap 1/;
|
||||
s/^%define udevpkgname.*$/${EDIT_WARNING}%define udevpkgname udev-mini/;
|
||||
s/^\(Name:.*\)$/\1-mini/;
|
||||
s/^BuildRoot.*/&\n\nProvides: %{real} = %{version}-%{release}\n/
|
||||
" < ${ORIG_SPEC}.spec > ${ORIG_SPEC}-mini.spec
|
||||
cp ${ORIG_SPEC}.changes ${ORIG_SPEC}-mini.changes
|
||||
cp ${ORIG_SPEC}-rpmlintrc ${ORIG_SPEC}-mini-rpmlintrc
|
||||
|
||||
osc service localrun format_spec_file
|
@ -1,91 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Wed, 7 Dec 2011 15:15:07 +0000
|
||||
Subject: remain_after_exit initscript heuristic and add new LSB headers
|
||||
|
||||
Add remain_after_exit heuristic for initscripts and add LSB headers
|
||||
PIDFile: and X-Systemd-RemainAfterExit to control it.
|
||||
|
||||
(bnc#721426) (bnc#727771)
|
||||
---
|
||||
src/core/service.c | 34 ++++++++++++++++++++++++++++++++--
|
||||
src/core/service.h | 1 +
|
||||
2 files changed, 33 insertions(+), 2 deletions(-)
|
||||
|
||||
Index: systemd-208/src/core/service.c
|
||||
===================================================================
|
||||
--- systemd-208.orig/src/core/service.c
|
||||
+++ systemd-208/src/core/service.c
|
||||
@@ -135,6 +135,7 @@ static void service_init(Unit *u) {
|
||||
#ifdef HAVE_SYSV_COMPAT
|
||||
s->sysv_start_priority = -1;
|
||||
s->sysv_start_priority_from_rcnd = -1;
|
||||
+ s->sysv_remain_after_exit_heuristic = true;
|
||||
#endif
|
||||
s->socket_fd = -1;
|
||||
s->guess_main_pid = true;
|
||||
@@ -883,6 +884,34 @@ static int service_load_sysv_path(Servic
|
||||
free(short_description);
|
||||
short_description = d;
|
||||
|
||||
+ } else if (startswith_no_case(t, "PIDFile:")) {
|
||||
+ char *fn;
|
||||
+
|
||||
+ state = LSB;
|
||||
+
|
||||
+ fn = strstrip(t+8);
|
||||
+ if (!path_is_absolute(fn)) {
|
||||
+ log_warning("[%s:%u] PID file not absolute. Ignoring.", path, line);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ if (!(fn = strdup(fn))) {
|
||||
+ r = -ENOMEM;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ free(s->pid_file);
|
||||
+ s->pid_file = fn;
|
||||
+ s->sysv_remain_after_exit_heuristic = false;
|
||||
+ s->remain_after_exit = false;
|
||||
+ } else if (startswith_no_case(t, "X-Systemd-RemainAfterExit:")) {
|
||||
+ char *j;
|
||||
+
|
||||
+ state = LSB;
|
||||
+ if ((j = strstrip(t+26)) && *j) {
|
||||
+ s->remain_after_exit = parse_boolean(j);
|
||||
+ s->sysv_remain_after_exit_heuristic = false;
|
||||
+ }
|
||||
} else if (state == LSB_DESCRIPTION) {
|
||||
|
||||
if (startswith(l, "#\t") || startswith(l, "# ")) {
|
||||
@@ -933,7 +962,8 @@ static int service_load_sysv_path(Servic
|
||||
|
||||
/* Special setting for all SysV services */
|
||||
s->type = SERVICE_FORKING;
|
||||
- s->remain_after_exit = !s->pid_file;
|
||||
+ if (s->sysv_remain_after_exit_heuristic)
|
||||
+ s->remain_after_exit = !s->pid_file;
|
||||
s->guess_main_pid = false;
|
||||
s->restart = SERVICE_RESTART_NO;
|
||||
s->exec_context.ignore_sigpipe = false;
|
||||
@@ -2080,7 +2110,7 @@ static void service_enter_running(Servic
|
||||
if ((main_pid_ok > 0 || (main_pid_ok < 0 && cgroup_ok != 0)) &&
|
||||
(s->bus_name_good || s->type != SERVICE_DBUS)) {
|
||||
#ifdef HAVE_SYSV_COMPAT
|
||||
- if (s->sysv_enabled && !s->pid_file)
|
||||
+ if (s->sysv_enabled && !s->pid_file && s->sysv_remain_after_exit_heuristic)
|
||||
s->remain_after_exit = false;
|
||||
#endif
|
||||
service_set_state(s, SERVICE_RUNNING);
|
||||
Index: systemd-208/src/core/service.h
|
||||
===================================================================
|
||||
--- systemd-208.orig/src/core/service.h
|
||||
+++ systemd-208/src/core/service.h
|
||||
@@ -178,6 +178,7 @@ struct Service {
|
||||
bool is_sysv:1;
|
||||
bool sysv_has_lsb:1;
|
||||
bool sysv_enabled:1;
|
||||
+ bool sysv_remain_after_exit_heuristic:1;
|
||||
int sysv_start_priority_from_rcnd;
|
||||
int sysv_start_priority;
|
||||
|
@ -1,81 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Mon, 29 Oct 2012 13:01:20 +0000
|
||||
Subject: restore /var/run and /var/lock bind mount if they aren't symlink
|
||||
|
||||
---
|
||||
Makefile.am | 9 +++++++++
|
||||
units/var-lock.mount | 19 +++++++++++++++++++
|
||||
units/var-run.mount | 19 +++++++++++++++++++
|
||||
3 files changed, 47 insertions(+)
|
||||
create mode 100644 units/var-lock.mount
|
||||
create mode 100644 units/var-run.mount
|
||||
|
||||
--- systemd-206_git201308300826.orig/Makefile.am
|
||||
+++ systemd-206_git201308300826/Makefile.am
|
||||
@@ -419,6 +419,12 @@ dist_systemunit_DATA = \
|
||||
units/system-update.target \
|
||||
units/initrd-switch-root.target
|
||||
|
||||
+if HAVE_SYSV_COMPAT
|
||||
+dist_systemunit_DATA += \
|
||||
+ units/var-run.mount \
|
||||
+ units/var-lock.mount
|
||||
+endif
|
||||
+
|
||||
nodist_systemunit_DATA = \
|
||||
units/getty@.service \
|
||||
units/serial-getty@.service \
|
||||
@@ -4379,6 +4385,9 @@ RUNLEVEL4_TARGET_WANTS += \
|
||||
systemd-update-utmp-runlevel.service
|
||||
RUNLEVEL5_TARGET_WANTS += \
|
||||
systemd-update-utmp-runlevel.service
|
||||
+LOCAL_FS_TARGET_WANTS += \
|
||||
+ var-run.mount \
|
||||
+ var-lock.mount
|
||||
endif
|
||||
SYSINIT_TARGET_WANTS += \
|
||||
systemd-update-utmp.service
|
||||
--- /dev/null
|
||||
+++ systemd-206_git201308300826/units/var-lock.mount
|
||||
@@ -0,0 +1,19 @@
|
||||
+# This file is part of systemd.
|
||||
+#
|
||||
+# systemd is free software; you can redistribute it and/or modify it
|
||||
+# under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 2 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+
|
||||
+[Unit]
|
||||
+Description=Lock Directory
|
||||
+Before=local-fs.target
|
||||
+# skip mounting if the directory does not exist or is a symlink
|
||||
+ConditionPathIsDirectory=/var/lock
|
||||
+ConditionPathIsSymbolicLink=!/var/lock
|
||||
+
|
||||
+[Mount]
|
||||
+What=/run/lock
|
||||
+Where=/var/lock
|
||||
+Type=bind
|
||||
+Options=bind
|
||||
--- /dev/null
|
||||
+++ systemd-206_git201308300826/units/var-run.mount
|
||||
@@ -0,0 +1,19 @@
|
||||
+# This file is part of systemd.
|
||||
+#
|
||||
+# systemd is free software; you can redistribute it and/or modify it
|
||||
+# under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 2 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+
|
||||
+[Unit]
|
||||
+Description=Runtime Directory
|
||||
+Before=local-fs.target
|
||||
+# skip mounting if the directory does not exist or is a symlink
|
||||
+ConditionPathIsDirectory=/var/run
|
||||
+ConditionPathIsSymbolicLink=!/var/run
|
||||
+
|
||||
+[Mount]
|
||||
+What=/run
|
||||
+Where=/var/run
|
||||
+Type=bind
|
||||
+Options=bind
|
@ -1,20 +0,0 @@
|
||||
From: Robert Schweikert <rjschwei@suse.com>
|
||||
Date: Fri, 12 Apr 2013 12:08:16 -0400
|
||||
Subject: rules: add lid switch of ARM based Chromebook as a power switch to
|
||||
logind
|
||||
|
||||
---
|
||||
src/login/70-power-switch.rules | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/src/login/70-power-switch.rules b/src/login/70-power-switch.rules
|
||||
index 36fb827..d925ab7 100644
|
||||
--- a/src/login/70-power-switch.rules
|
||||
+++ b/src/login/70-power-switch.rules
|
||||
@@ -9,5 +9,6 @@ ACTION=="remove", GOTO="power_switch_end"
|
||||
|
||||
SUBSYSTEM=="input", KERNEL=="event*", SUBSYSTEMS=="acpi", TAG+="power-switch"
|
||||
SUBSYSTEM=="input", KERNEL=="event*", KERNELS=="thinkpad_acpi", TAG+="power-switch"
|
||||
+SUBSYSTEM=="input", KERNEL=="event*", KERNELS=="gpio-keys.8", TAG+="power-switch"
|
||||
|
||||
LABEL="power_switch_end"
|
@ -1,31 +0,0 @@
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Fri, 30 Sep 2011 12:58:17 +0200
|
||||
Subject: service: flags sysv service with detected pid as
|
||||
RemainAfterExit=false
|
||||
|
||||
LSB header doesn't give pidfile, so all LSB initscripts have
|
||||
RemainAfterExit=false, causing daemon termination to not be reported as
|
||||
such by systemd. Checking at startup if daemon is still running for
|
||||
sysv initscript to disable RemainAfterExit helps a lot.
|
||||
Fixes https://bugzilla.novell.com/show_bug.cgi?id=721426
|
||||
---
|
||||
src/core/service.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
--- systemd-206_git201308300826.orig/src/core/service.c
|
||||
+++ systemd-206_git201308300826/src/core/service.c
|
||||
@@ -2100,8 +2100,13 @@ static void service_enter_running(Servic
|
||||
cgroup_ok = cgroup_good(s);
|
||||
|
||||
if ((main_pid_ok > 0 || (main_pid_ok < 0 && cgroup_ok != 0)) &&
|
||||
- (s->bus_name_good || s->type != SERVICE_DBUS))
|
||||
+ (s->bus_name_good || s->type != SERVICE_DBUS)) {
|
||||
+#ifdef HAVE_SYSV_COMPAT
|
||||
+ if (s->sysv_enabled && !s->pid_file)
|
||||
+ s->remain_after_exit = false;
|
||||
+#endif
|
||||
service_set_state(s, SERVICE_RUNNING);
|
||||
+ }
|
||||
else if (s->remain_after_exit)
|
||||
service_set_state(s, SERVICE_EXITED);
|
||||
else
|
@ -1,51 +0,0 @@
|
||||
From 752a4370ecb5643a432ad73b1e22c80cd304948f Mon Sep 17 00:00:00 2001
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Fri, 17 May 2013 13:31:46 +0200
|
||||
Subject: [PATCH] sysctl: handle /boot/sysctl.conf-<kernel_release>
|
||||
|
||||
Add support for kernel release sysctl.conf files (for per-flavor
|
||||
configuration), needed by openSUSE (bnc#809420).
|
||||
---
|
||||
src/sysctl/sysctl.c | 8 ++++++++
|
||||
units/systemd-sysctl.service.in | 1 +
|
||||
2 files changed, 9 insertions(+)
|
||||
|
||||
Index: systemd-207/src/sysctl/sysctl.c
|
||||
===================================================================
|
||||
--- systemd-207.orig/src/sysctl/sysctl.c
|
||||
+++ systemd-207/src/sysctl/sysctl.c
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
#include <getopt.h>
|
||||
+#include <sys/utsname.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "strv.h"
|
||||
@@ -299,6 +300,13 @@ int main(int argc, char *argv[]) {
|
||||
} else {
|
||||
_cleanup_strv_free_ char **files = NULL;
|
||||
char **f;
|
||||
+ char kernel_sysctl[PATH_MAX];
|
||||
+ struct utsname uts;
|
||||
+
|
||||
+ assert_se(uname(&uts) >= 0);
|
||||
+
|
||||
+ snprintf(kernel_sysctl, sizeof(kernel_sysctl), "/boot/sysctl.conf-%s", uts.release);
|
||||
+ r = parse_file(sysctl_options, kernel_sysctl, true);
|
||||
|
||||
r = conf_files_list_nulstr(&files, ".conf", NULL, conf_file_dirs);
|
||||
if (r < 0) {
|
||||
Index: systemd-207/units/systemd-sysctl.service.in
|
||||
===================================================================
|
||||
--- systemd-207.orig/units/systemd-sysctl.service.in
|
||||
+++ systemd-207/units/systemd-sysctl.service.in
|
||||
@@ -19,6 +19,8 @@ ConditionDirectoryNotEmpty=|/usr/lib/sys
|
||||
ConditionDirectoryNotEmpty=|/usr/local/lib/sysctl.d
|
||||
ConditionDirectoryNotEmpty=|/etc/sysctl.d
|
||||
ConditionDirectoryNotEmpty=|/run/sysctl.d
|
||||
+ConditionPathExistsGlob=|/boot/sysctl.conf-%v
|
||||
+RequiresMountsFor=/boot
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:aa64fa864466fd5727005c55d61c092828b94b4f857272c0b503695022146390
|
||||
size 2382904
|
@ -1,11 +0,0 @@
|
||||
--- systemd-207.orig/src/core/dbus.c
|
||||
+++ systemd-207/src/core/dbus.c
|
||||
@@ -50,7 +50,7 @@
|
||||
#define CONNECTIONS_MAX 512
|
||||
|
||||
/* Well-known address (http://dbus.freedesktop.org/doc/dbus-specification.html#message-bus-types) */
|
||||
-#define DBUS_SYSTEM_BUS_DEFAULT_ADDRESS "unix:path=/var/run/dbus/system_bus_socket"
|
||||
+#define DBUS_SYSTEM_BUS_DEFAULT_ADDRESS "unix:path=/run/dbus/system_bus_socket"
|
||||
/* Only used as a fallback */
|
||||
#define DBUS_SESSION_BUS_DEFAULT_ADDRESS "autolaunch:"
|
||||
|
@ -1,33 +0,0 @@
|
||||
#! /bin/sh
|
||||
#
|
||||
# Copyright (c) 2001-2002 SuSE Linux AG, Nuernberg, Germany.
|
||||
# All rights reserved.
|
||||
#
|
||||
# /etc/init.d/systemd-journald
|
||||
#
|
||||
### BEGIN INIT INFO
|
||||
# Provides: syslog
|
||||
# Required-Start: $null
|
||||
# Required-Stop: $null
|
||||
# Default-Start: 2 3 5
|
||||
# Default-Stop:
|
||||
# Short-Description: compat wrapper for journald
|
||||
# Description: compat wrapper for journald
|
||||
### END INIT INFO
|
||||
|
||||
. /etc/rc.status
|
||||
|
||||
rc_reset
|
||||
|
||||
case "$1" in
|
||||
start|stop|restart)
|
||||
rc_failed 3
|
||||
rc_status -v
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 {start|stop|restart}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
rc_exit
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user