zbyszek pushed to systemd (master). "Fix compilation"

notifications at fedoraproject.org notifications at fedoraproject.org
Wed May 20 15:30:17 UTC 2015


From 05c90300b1a5d0c21281259866ea71982d7e8353 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek at in.waw.pl>
Date: Wed, 20 May 2015 10:53:40 -0400
Subject: Fix compilation


diff --git a/0174-resolved-fix-crash-when-shutting-down.patch b/0174-resolved-fix-crash-when-shutting-down.patch
index e4d0963..843224a 100644
--- a/0174-resolved-fix-crash-when-shutting-down.patch
+++ b/0174-resolved-fix-crash-when-shutting-down.patch
@@ -1,4 +1,4 @@
-From 8851f051210fa9c18ffb94ebe601261bacaf37d4 Mon Sep 17 00:00:00 2001
+From 94fa50b44f5b23a075df80bfd4854865ca0b649b Mon Sep 17 00:00:00 2001
 From: Lennart Poettering <lennart at poettering.net>
 Date: Mon, 18 May 2015 23:23:17 +0200
 Subject: [PATCH] resolved: fix crash when shutting down
@@ -11,28 +11,25 @@ Reported by Cristian Rodríguez
 http://lists.freedesktop.org/archives/systemd-devel/2015-May/031626.html
 (cherry picked from commit cab5b05903096e1c9cf5575ccc73f89d15c8db69)
 ---
- src/resolve/resolved-dns-cache.c  |  7 ++-----
+ src/resolve/resolved-dns-cache.c  |  4 +---
  src/resolve/resolved-dns-server.c | 15 ++++++++-------
  src/resolve/resolved-link.c       |  6 +++---
  src/resolve/resolved-manager.c    |  4 ++--
  src/shared/prioq.c                |  6 ++++--
  src/shared/prioq.h                |  2 +-
- 6 files changed, 20 insertions(+), 20 deletions(-)
+ 6 files changed, 19 insertions(+), 18 deletions(-)
 
 diff --git a/src/resolve/resolved-dns-cache.c b/src/resolve/resolved-dns-cache.c
-index 33ca4d1a45..be52891681 100644
+index 33ca4d1a45..874207cfb8 100644
 --- a/src/resolve/resolved-dns-cache.c
 +++ b/src/resolve/resolved-dns-cache.c
-@@ -91,11 +91,8 @@ void dns_cache_flush(DnsCache *c) {
-         assert(hashmap_size(c->by_key) == 0);
-         assert(prioq_size(c->by_expiry) == 0);
+@@ -93,9 +93,7 @@ void dns_cache_flush(DnsCache *c) {
  
--        hashmap_free(c->by_key);
--        c->by_key = NULL;
+         hashmap_free(c->by_key);
+         c->by_key = NULL;
 -
 -        prioq_free(c->by_expiry);
 -        c->by_expiry = NULL;
-+        c->by_key = hashmap_free(c->by_key);
 +        c->by_expiry = prioq_free(c->by_expiry);
  }
  
diff --git a/0175-resolved-allow-DnsAnswer-objects-with-no-space-for-R.patch b/0175-resolved-allow-DnsAnswer-objects-with-no-space-for-R.patch
index 1a25038..63c64d6 100644
--- a/0175-resolved-allow-DnsAnswer-objects-with-no-space-for-R.patch
+++ b/0175-resolved-allow-DnsAnswer-objects-with-no-space-for-R.patch
@@ -1,4 +1,4 @@
-From c374a32aa317517702ee3531f6fa59be52c4a9f0 Mon Sep 17 00:00:00 2001
+From c3c65351593dde09a2d37b571e0737af94386fe6 Mon Sep 17 00:00:00 2001
 From: Lennart Poettering <lennart at poettering.net>
 Date: Mon, 18 May 2015 23:38:47 +0200
 Subject: [PATCH] resolved: allow DnsAnswer objects with no space for RRs
diff --git a/0176-id128-add-new-sd_id128_is_null-call.patch b/0176-id128-add-new-sd_id128_is_null-call.patch
new file mode 100644
index 0000000..efda7ed
--- /dev/null
+++ b/0176-id128-add-new-sd_id128_is_null-call.patch
@@ -0,0 +1,25 @@
+From a9303ae3af9bbf482842c084cc7ba49e206538c2 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Tue, 24 Feb 2015 00:10:35 +0100
+Subject: [PATCH] id128: add new sd_id128_is_null() call
+
+(cherry picked from commit 15e80c7b75c3a3188bfaaa0baddccf31ae661a7a)
+---
+ src/systemd/sd-id128.h | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/src/systemd/sd-id128.h b/src/systemd/sd-id128.h
+index 48fd87671b..9f445278bb 100644
+--- a/src/systemd/sd-id128.h
++++ b/src/systemd/sd-id128.h
+@@ -106,6 +106,10 @@ _sd_pure_ static inline int sd_id128_equal(sd_id128_t a, sd_id128_t b) {
+         return memcmp(&a, &b, 16) == 0;
+ }
+ 
++_sd_pure_ static inline int sd_id128_is_null(sd_id128_t a) {
++        return a.qwords[0] == 0 && a.qwords[1] == 0;
++}
++
+ #define SD_ID128_NULL ((const sd_id128_t) { .qwords = { 0, 0 }})
+ 
+ _SD_END_DECLARATIONS;
diff --git a/0176-journalctl-Improve-boot-ID-lookup.patch b/0176-journalctl-Improve-boot-ID-lookup.patch
deleted file mode 100644
index 1ac0dbf..0000000
--- a/0176-journalctl-Improve-boot-ID-lookup.patch
+++ /dev/null
@@ -1,400 +0,0 @@
-From a1b1bfdb3e18c69fe7b7665ac9f7256cf4485bbc Mon Sep 17 00:00:00 2001
-From: Jan Janssen <medhefgo at web.de>
-Date: Fri, 1 May 2015 15:15:16 +0200
-Subject: [PATCH] journalctl: Improve boot ID lookup
-
-This method should greatly improve offset based lookup, by simply jumping
-from one boot to the next boot. It starts at the journal head to get the
-a boot ID, makes a _BOOT_ID match and then comes from the opposite
-journal direction (tail) to get to the end that boot. After flushing the matches
-and advancing the journal from that exact position, we arrive at the start
-of next boot. Rinse and repeat.
-
-This is faster than the old method of aggregating the full boot listing just
-so we can jump to a specific boot, which can be a real pain on big journals
-just for a mere "-b -1" case.
-
-As an additional benefit --list-boots should improve slightly too, because
-it does less seeking.
-
-Note that there can be a change in boot order with this lookup method
-because it will use the order of boots in the journal, not the realtime stamp
-stored in them. That's arguably better, though.
-Another deficiency is that it will get confused with boots interleaving in the
-journal, therefore, it will refuse operation in --merge, --file and --directory mode.
-
-https://bugs.freedesktop.org/show_bug.cgi?id=72601
-(cherry picked from commit 596a23293d28f93843aef86721b90043e74d3081)
----
- src/journal/journalctl.c | 275 ++++++++++++++++++++++++++++++-----------------
- 1 file changed, 174 insertions(+), 101 deletions(-)
-
-diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
-index 12c869f5af..c26cc00f51 100644
---- a/src/journal/journalctl.c
-+++ b/src/journal/journalctl.c
-@@ -131,6 +131,7 @@ typedef struct boot_id_t {
-         sd_id128_t id;
-         uint64_t first;
-         uint64_t last;
-+        LIST_FIELDS(struct boot_id_t, boot_list);
- } boot_id_t;
- 
- static void pager_open_if_enabled(void) {
-@@ -735,6 +736,11 @@ static int parse_argv(int argc, char *argv[]) {
-                 return -EINVAL;
-         }
- 
-+        if ((arg_boot || arg_action == ACTION_LIST_BOOTS) && (arg_file || arg_directory || arg_merge)) {
-+                log_error("Using --boot or --list-boots with --file, --directory or --merge is not supported.");
-+                return -EINVAL;
-+        }
-+
-         return 1;
- }
- 
-@@ -854,111 +860,203 @@ static int add_matches(sd_journal *j, char **args) {
-         return 0;
- }
- 
--static int boot_id_cmp(const void *a, const void *b) {
--        uint64_t _a, _b;
-+static int discover_next_boot(sd_journal *j,
-+                              boot_id_t **boot,
-+                              bool advance_older,
-+                              bool read_realtime) {
-+        int r;
-+        char match[9+32+1] = "_BOOT_ID=";
-+        _cleanup_free_ boot_id_t *next_boot = NULL;
- 
--        _a = ((const boot_id_t *)a)->first;
--        _b = ((const boot_id_t *)b)->first;
-+        assert(j);
-+        assert(boot);
- 
--        return _a < _b ? -1 : (_a > _b ? 1 : 0);
--}
-+        /* We expect the journal to be on the last position of a boot
-+         * (in relation to the direction we are going), so that the next
-+         * invocation of sd_journal_next/previous will be from a different
-+         * boot. We then collect any information we desire and then jump
-+         * to the last location of the new boot by using a _BOOT_ID match
-+         * coming from the other journal direction. */
- 
--static int get_boots(sd_journal *j,
--                     boot_id_t **boots,
--                     unsigned int *count,
--                     boot_id_t *query_ref_boot) {
--        int r;
--        const void *data;
--        size_t length, allocated = 0;
-+        /* Make sure we aren't restricted by any _BOOT_ID matches, so that
-+         * we can actually advance to a *different* boot. */
-+        sd_journal_flush_matches(j);
- 
--        assert(j);
--        assert(boots);
--        assert(count);
-+        if (advance_older)
-+                r = sd_journal_previous(j);
-+        else
-+                r = sd_journal_next(j);
-+        if (r < 0)
-+                return r;
-+        else if (r == 0)
-+                return 0; /* End of journal, yay. */
-+
-+        next_boot = new0(boot_id_t, 1);
-+        if (!next_boot)
-+                return log_oom();
- 
--        r = sd_journal_query_unique(j, "_BOOT_ID");
-+        r = sd_journal_get_monotonic_usec(j, NULL, &next_boot->id);
-         if (r < 0)
-                 return r;
- 
--        *count = 0;
--        SD_JOURNAL_FOREACH_UNIQUE(j, data, length) {
--                boot_id_t *id;
-+        if (read_realtime) {
-+                r = sd_journal_get_realtime_usec(j, &next_boot->first);
-+                if (r < 0)
-+                        return r;
-+        }
- 
--                assert(startswith(data, "_BOOT_ID="));
-+        /* Now seek to the last occurrence of this boot ID. */
-+        sd_id128_to_string(next_boot->id, match + 9);
-+        r = sd_journal_add_match(j, match, sizeof(match) - 1);
-+        if (r < 0)
-+                return r;
- 
--                if (!GREEDY_REALLOC(*boots, allocated, *count + 1))
--                        return log_oom();
-+        if (advance_older)
-+                r = sd_journal_seek_head(j);
-+        else
-+                r = sd_journal_seek_tail(j);
-+        if (r < 0)
-+                return r;
- 
--                id = *boots + *count;
-+        if (advance_older)
-+                r = sd_journal_next(j);
-+        else
-+                r = sd_journal_previous(j);
-+        if (r < 0)
-+                return r;
-+        else if (r == 0)
-+                return -ENODATA; /* This shouldn't happen. We just came from this very boot ID. */
- 
--                r = sd_id128_from_string(((const char *)data) + strlen("_BOOT_ID="), &id->id);
-+        if (read_realtime) {
-+                r = sd_journal_get_realtime_usec(j, &next_boot->last);
-                 if (r < 0)
--                        continue;
-+                        return r;
-+        }
-+
-+        *boot = next_boot;
-+        next_boot = NULL;
-+        return 0;
-+}
-+
-+static int get_boots(sd_journal *j,
-+                     boot_id_t **boots,
-+                     boot_id_t *query_ref_boot,
-+                     int ref_boot_offset) {
-+        bool skip_once;
-+        int r, count = 0;
-+        boot_id_t *head = NULL, *tail = NULL;
-+        const bool advance_older = query_ref_boot && ref_boot_offset <= 0;
-+
-+        assert(j);
-+
-+        /* Adjust for the asymmetry that offset 0 is
-+         * the last (and current) boot, while 1 is considered the
-+         * (chronological) first boot in the journal. */
-+        skip_once = query_ref_boot && sd_id128_is_null(query_ref_boot->id) && ref_boot_offset < 0;
-+
-+        /* Advance to the earliest/latest occurrence of our reference
-+         * boot ID (taking our lookup direction into account), so that
-+         * discover_next_boot() can do its job.
-+         * If no reference is given, the journal head/tail will do,
-+         * they're "virtual" boots after all. */
-+        if (query_ref_boot && !sd_id128_is_null(query_ref_boot->id)) {
-+                char match[9+32+1] = "_BOOT_ID=";
-+
-+                sd_journal_flush_matches(j);
- 
--                r = sd_journal_add_match(j, data, length);
-+                sd_id128_to_string(query_ref_boot->id, match + 9);
-+                r = sd_journal_add_match(j, match, sizeof(match) - 1);
-                 if (r < 0)
-                         return r;
- 
--                r = sd_journal_seek_head(j);
-+                if (advance_older)
-+                        r = sd_journal_seek_head(j);
-+                else
-+                        r = sd_journal_seek_tail(j);
-                 if (r < 0)
-                         return r;
- 
--                r = sd_journal_next(j);
-+                if (advance_older)
-+                        r = sd_journal_next(j);
-+                else
-+                        r = sd_journal_previous(j);
-                 if (r < 0)
-                         return r;
-                 else if (r == 0)
--                        goto flush;
--
--                r = sd_journal_get_realtime_usec(j, &id->first);
-+                        goto finish;
-+                else if (ref_boot_offset == 0) {
-+                        count = 1;
-+                        goto finish;
-+                }
-+        } else {
-+                if (advance_older)
-+                        r = sd_journal_seek_tail(j);
-+                else
-+                        r = sd_journal_seek_head(j);
-                 if (r < 0)
-                         return r;
- 
--                if (query_ref_boot) {
--                        id->last = 0;
--                        if (sd_id128_equal(id->id, query_ref_boot->id))
--                                *query_ref_boot = *id;
--                } else {
--                        r = sd_journal_seek_tail(j);
--                        if (r < 0)
--                                return r;
-+                /* No sd_journal_next/previous here. */
-+        }
- 
--                        r = sd_journal_previous(j);
--                        if (r < 0)
--                                return r;
--                        else if (r == 0)
--                                goto flush;
-+        while (true) {
-+                _cleanup_free_ boot_id_t *current = NULL;
- 
--                        r = sd_journal_get_realtime_usec(j, &id->last);
--                        if (r < 0)
--                                return r;
-+                r = discover_next_boot(j, &current, advance_older, !query_ref_boot);
-+                if (r < 0) {
-+                        boot_id_t *id, *id_next;
-+                        LIST_FOREACH_SAFE(boot_list, id, id_next, head)
-+                                free(id);
-+                        return r;
-                 }
- 
--                (*count)++;
--        flush:
--                sd_journal_flush_matches(j);
-+                if (!current)
-+                        break;
-+
-+                if (query_ref_boot) {
-+                        if (!skip_once)
-+                                ref_boot_offset += advance_older ? 1 : -1;
-+                        skip_once = false;
-+
-+                        if (ref_boot_offset == 0) {
-+                                count = 1;
-+                                query_ref_boot->id = current->id;
-+                                break;
-+                        }
-+                } else {
-+                        LIST_INSERT_AFTER(boot_list, head, tail, current);
-+                        tail = current;
-+                        current = NULL;
-+                        count++;
-+                }
-         }
- 
--        qsort_safe(*boots, *count, sizeof(boot_id_t), boot_id_cmp);
--        return 0;
-+finish:
-+        if (boots)
-+                *boots = head;
-+
-+        sd_journal_flush_matches(j);
-+
-+        return count;
- }
- 
- static int list_boots(sd_journal *j) {
--        int r, w, i;
--        unsigned int count;
--        boot_id_t *id;
--        _cleanup_free_ boot_id_t *all_ids = NULL;
-+        int w, i, count;
-+        boot_id_t *id, *id_next, *all_ids;
- 
-         assert(j);
- 
--        r = get_boots(j, &all_ids, &count, NULL);
--        if (r < 0)
--                return r;
-+        count = get_boots(j, &all_ids, NULL, 0);
-+        if (count <= 0)
-+                return count;
- 
-         pager_open_if_enabled();
- 
-         /* numbers are one less, but we need an extra char for the sign */
-         w = DECIMAL_STR_WIDTH(count - 1) + 1;
- 
--        for (id = all_ids, i = 0; id < all_ids + count; id++, i++) {
-+        i = 0;
-+        LIST_FOREACH_SAFE(boot_list, id, id_next, all_ids) {
-                 char a[FORMAT_TIMESTAMP_MAX], b[FORMAT_TIMESTAMP_MAX];
- 
-                 printf("% *i " SD_ID128_FORMAT_STR " %s—%s\n",
-@@ -966,39 +1064,8 @@ static int list_boots(sd_journal *j) {
-                        SD_ID128_FORMAT_VAL(id->id),
-                        format_timestamp_maybe_utc(a, sizeof(a), id->first),
-                        format_timestamp_maybe_utc(b, sizeof(b), id->last));
--        }
--
--        return 0;
--}
--
--static int get_boot_id_by_offset(sd_journal *j, sd_id128_t *boot_id, int offset) {
--        int r;
--        unsigned int count;
--        boot_id_t ref_boot_id = {}, *id;
--        _cleanup_free_ boot_id_t *all_ids = NULL;
--
--        assert(j);
--        assert(boot_id);
--
--        ref_boot_id.id = *boot_id;
--        r = get_boots(j, &all_ids, &count, &ref_boot_id);
--        if (r < 0)
--                return r;
--
--        if (sd_id128_equal(*boot_id, SD_ID128_NULL)) {
--                if (offset > (int) count || offset <= -(int)count)
--                        return -EADDRNOTAVAIL;
--
--                *boot_id = all_ids[(offset <= 0)*count + offset - 1].id;
--        } else {
--                id = bsearch(&ref_boot_id, all_ids, count, sizeof(boot_id_t), boot_id_cmp);
--
--                if (!id ||
--                    offset <= 0 ? (id - all_ids) + offset < 0 :
--                                    (id - all_ids) + offset >= (int) count)
--                        return -EADDRNOTAVAIL;
--
--                *boot_id = (id + offset)->id;
-+                i++;
-+                free(id);
-         }
- 
-         return 0;
-@@ -1007,6 +1074,7 @@ static int get_boot_id_by_offset(sd_journal *j, sd_id128_t *boot_id, int offset)
- static int add_boot(sd_journal *j) {
-         char match[9+32+1] = "_BOOT_ID=";
-         int r;
-+        boot_id_t ref_boot_id = {};
- 
-         assert(j);
- 
-@@ -1016,17 +1084,22 @@ static int add_boot(sd_journal *j) {
-         if (arg_boot_offset == 0 && sd_id128_equal(arg_boot_id, SD_ID128_NULL))
-                 return add_match_this_boot(j, arg_machine);
- 
--        r = get_boot_id_by_offset(j, &arg_boot_id, arg_boot_offset);
--        if (r < 0) {
--                if (sd_id128_equal(arg_boot_id, SD_ID128_NULL))
--                        log_error_errno(r, "Failed to look up boot %+i: %m", arg_boot_offset);
-+        ref_boot_id.id = arg_boot_id;
-+        r = get_boots(j, NULL, &ref_boot_id, arg_boot_offset);
-+        assert(r <= 1);
-+        if (r <= 0) {
-+                const char *reason = (r == 0) ? "No such boot ID in journal" : strerror(-r);
-+
-+                if (sd_id128_is_null(arg_boot_id))
-+                        log_error("Failed to look up boot %+i: %s", arg_boot_offset, reason);
-                 else
-                         log_error("Failed to look up boot ID "SD_ID128_FORMAT_STR"%+i: %s",
--                                  SD_ID128_FORMAT_VAL(arg_boot_id), arg_boot_offset, strerror(-r));
--                return r;
-+                                  SD_ID128_FORMAT_VAL(arg_boot_id), arg_boot_offset, reason);
-+
-+                return r == 0 ? -ENODATA : r;
-         }
- 
--        sd_id128_to_string(arg_boot_id, match + 9);
-+        sd_id128_to_string(ref_boot_id.id, match + 9);
- 
-         r = sd_journal_add_match(j, match, sizeof(match) - 1);
-         if (r < 0)
diff --git a/0177-journalctl-Improve-boot-ID-lookup.patch b/0177-journalctl-Improve-boot-ID-lookup.patch
new file mode 100644
index 0000000..e183d47
--- /dev/null
+++ b/0177-journalctl-Improve-boot-ID-lookup.patch
@@ -0,0 +1,400 @@
+From fb2b7ef1b9a4247adae4a9c85516c72674327488 Mon Sep 17 00:00:00 2001
+From: Jan Janssen <medhefgo at web.de>
+Date: Fri, 1 May 2015 15:15:16 +0200
+Subject: [PATCH] journalctl: Improve boot ID lookup
+
+This method should greatly improve offset based lookup, by simply jumping
+from one boot to the next boot. It starts at the journal head to get the
+a boot ID, makes a _BOOT_ID match and then comes from the opposite
+journal direction (tail) to get to the end that boot. After flushing the matches
+and advancing the journal from that exact position, we arrive at the start
+of next boot. Rinse and repeat.
+
+This is faster than the old method of aggregating the full boot listing just
+so we can jump to a specific boot, which can be a real pain on big journals
+just for a mere "-b -1" case.
+
+As an additional benefit --list-boots should improve slightly too, because
+it does less seeking.
+
+Note that there can be a change in boot order with this lookup method
+because it will use the order of boots in the journal, not the realtime stamp
+stored in them. That's arguably better, though.
+Another deficiency is that it will get confused with boots interleaving in the
+journal, therefore, it will refuse operation in --merge, --file and --directory mode.
+
+https://bugs.freedesktop.org/show_bug.cgi?id=72601
+(cherry picked from commit 596a23293d28f93843aef86721b90043e74d3081)
+---
+ src/journal/journalctl.c | 275 ++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 174 insertions(+), 101 deletions(-)
+
+diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
+index 12c869f5af..c26cc00f51 100644
+--- a/src/journal/journalctl.c
++++ b/src/journal/journalctl.c
+@@ -131,6 +131,7 @@ typedef struct boot_id_t {
+         sd_id128_t id;
+         uint64_t first;
+         uint64_t last;
++        LIST_FIELDS(struct boot_id_t, boot_list);
+ } boot_id_t;
+ 
+ static void pager_open_if_enabled(void) {
+@@ -735,6 +736,11 @@ static int parse_argv(int argc, char *argv[]) {
+                 return -EINVAL;
+         }
+ 
++        if ((arg_boot || arg_action == ACTION_LIST_BOOTS) && (arg_file || arg_directory || arg_merge)) {
++                log_error("Using --boot or --list-boots with --file, --directory or --merge is not supported.");
++                return -EINVAL;
++        }
++
+         return 1;
+ }
+ 
+@@ -854,111 +860,203 @@ static int add_matches(sd_journal *j, char **args) {
+         return 0;
+ }
+ 
+-static int boot_id_cmp(const void *a, const void *b) {
+-        uint64_t _a, _b;
++static int discover_next_boot(sd_journal *j,
++                              boot_id_t **boot,
++                              bool advance_older,
++                              bool read_realtime) {
++        int r;
++        char match[9+32+1] = "_BOOT_ID=";
++        _cleanup_free_ boot_id_t *next_boot = NULL;
+ 
+-        _a = ((const boot_id_t *)a)->first;
+-        _b = ((const boot_id_t *)b)->first;
++        assert(j);
++        assert(boot);
+ 
+-        return _a < _b ? -1 : (_a > _b ? 1 : 0);
+-}
++        /* We expect the journal to be on the last position of a boot
++         * (in relation to the direction we are going), so that the next
++         * invocation of sd_journal_next/previous will be from a different
++         * boot. We then collect any information we desire and then jump
++         * to the last location of the new boot by using a _BOOT_ID match
++         * coming from the other journal direction. */
+ 
+-static int get_boots(sd_journal *j,
+-                     boot_id_t **boots,
+-                     unsigned int *count,
+-                     boot_id_t *query_ref_boot) {
+-        int r;
+-        const void *data;
+-        size_t length, allocated = 0;
++        /* Make sure we aren't restricted by any _BOOT_ID matches, so that
++         * we can actually advance to a *different* boot. */
++        sd_journal_flush_matches(j);
+ 
+-        assert(j);
+-        assert(boots);
+-        assert(count);
++        if (advance_older)
++                r = sd_journal_previous(j);
++        else
++                r = sd_journal_next(j);
++        if (r < 0)
++                return r;
++        else if (r == 0)
++                return 0; /* End of journal, yay. */
++
++        next_boot = new0(boot_id_t, 1);
++        if (!next_boot)
++                return log_oom();
+ 
+-        r = sd_journal_query_unique(j, "_BOOT_ID");
++        r = sd_journal_get_monotonic_usec(j, NULL, &next_boot->id);
+         if (r < 0)
+                 return r;
+ 
+-        *count = 0;
+-        SD_JOURNAL_FOREACH_UNIQUE(j, data, length) {
+-                boot_id_t *id;
++        if (read_realtime) {
++                r = sd_journal_get_realtime_usec(j, &next_boot->first);
++                if (r < 0)
++                        return r;
++        }
+ 
+-                assert(startswith(data, "_BOOT_ID="));
++        /* Now seek to the last occurrence of this boot ID. */
++        sd_id128_to_string(next_boot->id, match + 9);
++        r = sd_journal_add_match(j, match, sizeof(match) - 1);
++        if (r < 0)
++                return r;
+ 
+-                if (!GREEDY_REALLOC(*boots, allocated, *count + 1))
+-                        return log_oom();
++        if (advance_older)
++                r = sd_journal_seek_head(j);
++        else
++                r = sd_journal_seek_tail(j);
++        if (r < 0)
++                return r;
+ 
+-                id = *boots + *count;
++        if (advance_older)
++                r = sd_journal_next(j);
++        else
++                r = sd_journal_previous(j);
++        if (r < 0)
++                return r;
++        else if (r == 0)
++                return -ENODATA; /* This shouldn't happen. We just came from this very boot ID. */
+ 
+-                r = sd_id128_from_string(((const char *)data) + strlen("_BOOT_ID="), &id->id);
++        if (read_realtime) {
++                r = sd_journal_get_realtime_usec(j, &next_boot->last);
+                 if (r < 0)
+-                        continue;
++                        return r;
++        }
++
++        *boot = next_boot;
++        next_boot = NULL;
++        return 0;
++}
++
++static int get_boots(sd_journal *j,
++                     boot_id_t **boots,
++                     boot_id_t *query_ref_boot,
++                     int ref_boot_offset) {
++        bool skip_once;
++        int r, count = 0;
++        boot_id_t *head = NULL, *tail = NULL;
++        const bool advance_older = query_ref_boot && ref_boot_offset <= 0;
++
++        assert(j);
++
++        /* Adjust for the asymmetry that offset 0 is
++         * the last (and current) boot, while 1 is considered the
++         * (chronological) first boot in the journal. */
++        skip_once = query_ref_boot && sd_id128_is_null(query_ref_boot->id) && ref_boot_offset < 0;
++
++        /* Advance to the earliest/latest occurrence of our reference
++         * boot ID (taking our lookup direction into account), so that
++         * discover_next_boot() can do its job.
++         * If no reference is given, the journal head/tail will do,
++         * they're "virtual" boots after all. */
++        if (query_ref_boot && !sd_id128_is_null(query_ref_boot->id)) {
++                char match[9+32+1] = "_BOOT_ID=";
++
++                sd_journal_flush_matches(j);
+ 
+-                r = sd_journal_add_match(j, data, length);
++                sd_id128_to_string(query_ref_boot->id, match + 9);
++                r = sd_journal_add_match(j, match, sizeof(match) - 1);
+                 if (r < 0)
+                         return r;
+ 
+-                r = sd_journal_seek_head(j);
++                if (advance_older)
++                        r = sd_journal_seek_head(j);
++                else
++                        r = sd_journal_seek_tail(j);
+                 if (r < 0)
+                         return r;
+ 
+-                r = sd_journal_next(j);
++                if (advance_older)
++                        r = sd_journal_next(j);
++                else
++                        r = sd_journal_previous(j);
+                 if (r < 0)
+                         return r;
+                 else if (r == 0)
+-                        goto flush;
+-
+-                r = sd_journal_get_realtime_usec(j, &id->first);
++                        goto finish;
++                else if (ref_boot_offset == 0) {
++                        count = 1;
++                        goto finish;
++                }
++        } else {
++                if (advance_older)
++                        r = sd_journal_seek_tail(j);
++                else
++                        r = sd_journal_seek_head(j);
+                 if (r < 0)
+                         return r;
+ 
+-                if (query_ref_boot) {
+-                        id->last = 0;
+-                        if (sd_id128_equal(id->id, query_ref_boot->id))
+-                                *query_ref_boot = *id;
+-                } else {
+-                        r = sd_journal_seek_tail(j);
+-                        if (r < 0)
+-                                return r;
++                /* No sd_journal_next/previous here. */
++        }
+ 
+-                        r = sd_journal_previous(j);
+-                        if (r < 0)
+-                                return r;
+-                        else if (r == 0)
+-                                goto flush;
++        while (true) {
++                _cleanup_free_ boot_id_t *current = NULL;
+ 
+-                        r = sd_journal_get_realtime_usec(j, &id->last);
+-                        if (r < 0)
+-                                return r;
++                r = discover_next_boot(j, &current, advance_older, !query_ref_boot);
++                if (r < 0) {
++                        boot_id_t *id, *id_next;
++                        LIST_FOREACH_SAFE(boot_list, id, id_next, head)
++                                free(id);
++                        return r;
+                 }
+ 
+-                (*count)++;
+-        flush:
+-                sd_journal_flush_matches(j);
++                if (!current)
++                        break;
++
++                if (query_ref_boot) {
++                        if (!skip_once)
++                                ref_boot_offset += advance_older ? 1 : -1;
++                        skip_once = false;
++
++                        if (ref_boot_offset == 0) {
++                                count = 1;
++                                query_ref_boot->id = current->id;
++                                break;
++                        }
++                } else {
++                        LIST_INSERT_AFTER(boot_list, head, tail, current);
++                        tail = current;
++                        current = NULL;
++                        count++;
++                }
+         }
+ 
+-        qsort_safe(*boots, *count, sizeof(boot_id_t), boot_id_cmp);
+-        return 0;
++finish:
++        if (boots)
++                *boots = head;
++
++        sd_journal_flush_matches(j);
++
++        return count;
+ }
+ 
+ static int list_boots(sd_journal *j) {
+-        int r, w, i;
+-        unsigned int count;
+-        boot_id_t *id;
+-        _cleanup_free_ boot_id_t *all_ids = NULL;
++        int w, i, count;
++        boot_id_t *id, *id_next, *all_ids;
+ 
+         assert(j);
+ 
+-        r = get_boots(j, &all_ids, &count, NULL);
+-        if (r < 0)
+-                return r;
++        count = get_boots(j, &all_ids, NULL, 0);
++        if (count <= 0)
++                return count;
+ 
+         pager_open_if_enabled();
+ 
+         /* numbers are one less, but we need an extra char for the sign */
+         w = DECIMAL_STR_WIDTH(count - 1) + 1;
+ 
+-        for (id = all_ids, i = 0; id < all_ids + count; id++, i++) {
++        i = 0;
++        LIST_FOREACH_SAFE(boot_list, id, id_next, all_ids) {
+                 char a[FORMAT_TIMESTAMP_MAX], b[FORMAT_TIMESTAMP_MAX];
+ 
+                 printf("% *i " SD_ID128_FORMAT_STR " %s—%s\n",
+@@ -966,39 +1064,8 @@ static int list_boots(sd_journal *j) {
+                        SD_ID128_FORMAT_VAL(id->id),
+                        format_timestamp_maybe_utc(a, sizeof(a), id->first),
+                        format_timestamp_maybe_utc(b, sizeof(b), id->last));
+-        }
+-
+-        return 0;
+-}
+-
+-static int get_boot_id_by_offset(sd_journal *j, sd_id128_t *boot_id, int offset) {
+-        int r;
+-        unsigned int count;
+-        boot_id_t ref_boot_id = {}, *id;
+-        _cleanup_free_ boot_id_t *all_ids = NULL;
+-
+-        assert(j);
+-        assert(boot_id);
+-
+-        ref_boot_id.id = *boot_id;
+-        r = get_boots(j, &all_ids, &count, &ref_boot_id);
+-        if (r < 0)
+-                return r;
+-
+-        if (sd_id128_equal(*boot_id, SD_ID128_NULL)) {
+-                if (offset > (int) count || offset <= -(int)count)
+-                        return -EADDRNOTAVAIL;
+-
+-                *boot_id = all_ids[(offset <= 0)*count + offset - 1].id;
+-        } else {
+-                id = bsearch(&ref_boot_id, all_ids, count, sizeof(boot_id_t), boot_id_cmp);
+-
+-                if (!id ||
+-                    offset <= 0 ? (id - all_ids) + offset < 0 :
+-                                    (id - all_ids) + offset >= (int) count)
+-                        return -EADDRNOTAVAIL;
+-
+-                *boot_id = (id + offset)->id;
++                i++;
++                free(id);
+         }
+ 
+         return 0;
+@@ -1007,6 +1074,7 @@ static int get_boot_id_by_offset(sd_journal *j, sd_id128_t *boot_id, int offset)
+ static int add_boot(sd_journal *j) {
+         char match[9+32+1] = "_BOOT_ID=";
+         int r;
++        boot_id_t ref_boot_id = {};
+ 
+         assert(j);
+ 
+@@ -1016,17 +1084,22 @@ static int add_boot(sd_journal *j) {
+         if (arg_boot_offset == 0 && sd_id128_equal(arg_boot_id, SD_ID128_NULL))
+                 return add_match_this_boot(j, arg_machine);
+ 
+-        r = get_boot_id_by_offset(j, &arg_boot_id, arg_boot_offset);
+-        if (r < 0) {
+-                if (sd_id128_equal(arg_boot_id, SD_ID128_NULL))
+-                        log_error_errno(r, "Failed to look up boot %+i: %m", arg_boot_offset);
++        ref_boot_id.id = arg_boot_id;
++        r = get_boots(j, NULL, &ref_boot_id, arg_boot_offset);
++        assert(r <= 1);
++        if (r <= 0) {
++                const char *reason = (r == 0) ? "No such boot ID in journal" : strerror(-r);
++
++                if (sd_id128_is_null(arg_boot_id))
++                        log_error("Failed to look up boot %+i: %s", arg_boot_offset, reason);
+                 else
+                         log_error("Failed to look up boot ID "SD_ID128_FORMAT_STR"%+i: %s",
+-                                  SD_ID128_FORMAT_VAL(arg_boot_id), arg_boot_offset, strerror(-r));
+-                return r;
++                                  SD_ID128_FORMAT_VAL(arg_boot_id), arg_boot_offset, reason);
++
++                return r == 0 ? -ENODATA : r;
+         }
+ 
+-        sd_id128_to_string(arg_boot_id, match + 9);
++        sd_id128_to_string(ref_boot_id.id, match + 9);
+ 
+         r = sd_journal_add_match(j, match, sizeof(match) - 1);
+         if (r < 0)
diff --git a/0177-test-hashmap-fix-an-assert.patch b/0177-test-hashmap-fix-an-assert.patch
deleted file mode 100644
index 4484e8c..0000000
--- a/0177-test-hashmap-fix-an-assert.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 094ea5dd03ece57d3162caf33755d76ff2399bb3 Mon Sep 17 00:00:00 2001
-From: Thomas Hindoe Paaboel Andersen <phomes at gmail.com>
-Date: Tue, 19 May 2015 06:33:54 +0200
-Subject: [PATCH] test-hashmap: fix an assert
-
-CID#1299016
-
-(cherry picked from commit b669934fae49c9158c35e612e54e1765edca8584)
----
- src/test/test-hashmap-plain.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/test/test-hashmap-plain.c b/src/test/test-hashmap-plain.c
-index 84b508f874..c1a5ccf1f5 100644
---- a/src/test/test-hashmap-plain.c
-+++ b/src/test/test-hashmap-plain.c
-@@ -682,7 +682,7 @@ static void test_hashmap_get2(void) {
-         r = hashmap_get2(m, key_orig, &key_copy);
-         assert_se(streq(r, val));
-         assert_se(key_orig != key_copy);
--        assert_se(streq(key_orig, key_orig));
-+        assert_se(streq(key_orig, key_copy));
- 
-         r = hashmap_get2(m, "no such key", NULL);
-         assert_se(r == NULL);
diff --git a/0178-test-hashmap-fix-an-assert.patch b/0178-test-hashmap-fix-an-assert.patch
new file mode 100644
index 0000000..a436178
--- /dev/null
+++ b/0178-test-hashmap-fix-an-assert.patch
@@ -0,0 +1,25 @@
+From 089491f20443a48ad3b65c24b7e98115fe955805 Mon Sep 17 00:00:00 2001
+From: Thomas Hindoe Paaboel Andersen <phomes at gmail.com>
+Date: Tue, 19 May 2015 06:33:54 +0200
+Subject: [PATCH] test-hashmap: fix an assert
+
+CID#1299016
+
+(cherry picked from commit b669934fae49c9158c35e612e54e1765edca8584)
+---
+ src/test/test-hashmap-plain.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/test/test-hashmap-plain.c b/src/test/test-hashmap-plain.c
+index 84b508f874..c1a5ccf1f5 100644
+--- a/src/test/test-hashmap-plain.c
++++ b/src/test/test-hashmap-plain.c
+@@ -682,7 +682,7 @@ static void test_hashmap_get2(void) {
+         r = hashmap_get2(m, key_orig, &key_copy);
+         assert_se(streq(r, val));
+         assert_se(key_orig != key_copy);
+-        assert_se(streq(key_orig, key_orig));
++        assert_se(streq(key_orig, key_copy));
+ 
+         r = hashmap_get2(m, "no such key", NULL);
+         assert_se(r == NULL);
diff --git a/0178-units-make-sure-systemd-nspawn-.slice-instances-are-.patch b/0178-units-make-sure-systemd-nspawn-.slice-instances-are-.patch
deleted file mode 100644
index a108570..0000000
--- a/0178-units-make-sure-systemd-nspawn-.slice-instances-are-.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From 97f36b10cbbcc61c6c8194be0af3bb526bab6df2 Mon Sep 17 00:00:00 2001
-From: Lennart Poettering <lennart at poettering.net>
-Date: Tue, 19 May 2015 19:47:52 +0200
-Subject: [PATCH] units: make sure systemd-nspawn at .slice instances are actually
- located in machine.slice
-
-https://plus.google.com/112206451048767236518/posts/SYAueyXHeEX
-(cherry picked from commit 45d383a3b888195b01b58dbd2c46a11027ff5022)
----
- units/systemd-nspawn at .service.in | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/units/systemd-nspawn at .service.in b/units/systemd-nspawn at .service.in
-index 3e26b53fd6..5e86121130 100644
---- a/units/systemd-nspawn at .service.in
-+++ b/units/systemd-nspawn at .service.in
-@@ -17,6 +17,7 @@ KillMode=mixed
- Type=notify
- RestartForceExitStatus=133
- SuccessExitStatus=133
-+Slice=machine.slice
- Delegate=yes
- 
- [Install]
diff --git a/0179-units-make-sure-systemd-nspawn-.slice-instances-are-.patch b/0179-units-make-sure-systemd-nspawn-.slice-instances-are-.patch
new file mode 100644
index 0000000..a664d62
--- /dev/null
+++ b/0179-units-make-sure-systemd-nspawn-.slice-instances-are-.patch
@@ -0,0 +1,24 @@
+From c1d39ccd066356ef5581081a97acfbe847103de7 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Tue, 19 May 2015 19:47:52 +0200
+Subject: [PATCH] units: make sure systemd-nspawn at .slice instances are actually
+ located in machine.slice
+
+https://plus.google.com/112206451048767236518/posts/SYAueyXHeEX
+(cherry picked from commit 45d383a3b888195b01b58dbd2c46a11027ff5022)
+---
+ units/systemd-nspawn at .service.in | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/units/systemd-nspawn at .service.in b/units/systemd-nspawn at .service.in
+index 3e26b53fd6..5e86121130 100644
+--- a/units/systemd-nspawn at .service.in
++++ b/units/systemd-nspawn at .service.in
+@@ -17,6 +17,7 @@ KillMode=mixed
+ Type=notify
+ RestartForceExitStatus=133
+ SuccessExitStatus=133
++Slice=machine.slice
+ Delegate=yes
+ 
+ [Install]
diff --git a/systemd.spec b/systemd.spec
index 86f73e2..2f94859 100644
--- a/systemd.spec
+++ b/systemd.spec
@@ -213,9 +213,10 @@ Patch0172:      0172-zsh-completion-removing-more-pointless-forks.patch
 Patch0173:      0173-zsh-completion-make-the-arrays-_sys_active_units-_sy.patch
 Patch0174:      0174-resolved-fix-crash-when-shutting-down.patch
 Patch0175:      0175-resolved-allow-DnsAnswer-objects-with-no-space-for-R.patch
-Patch0176:      0176-journalctl-Improve-boot-ID-lookup.patch
-Patch0177:      0177-test-hashmap-fix-an-assert.patch
-Patch0178:      0178-units-make-sure-systemd-nspawn-.slice-instances-are-.patch
+Patch0176:      0176-id128-add-new-sd_id128_is_null-call.patch
+Patch0177:      0177-journalctl-Improve-boot-ID-lookup.patch
+Patch0178:      0178-test-hashmap-fix-an-assert.patch
+Patch0179:      0179-units-make-sure-systemd-nspawn-.slice-instances-are-.patch
 
 
 # kernel-install patch for grubby, drop if grubby is obsolete
@@ -907,6 +908,7 @@ getent passwd systemd-journal-upload >/dev/null 2>&1 || useradd -r -l -g systemd
 %{_prefix}/lib/sysctl.d/50-coredump.conf
 %{_prefix}/lib/sysusers.d/basic.conf
 %{_prefix}/lib/sysusers.d/systemd.conf
+%{pkgdir}/system-preset/90-systemd.preset
 %{pkgdir}/catalog/systemd.catalog
 %{_prefix}/lib/kernel/install.d/50-depmod.install
 %{_prefix}/lib/kernel/install.d/90-loaderentry.install
-- 
cgit v0.10.2


	http://pkgs.fedoraproject.org/cgit/systemd.git/commit/?h=master&id=05c90300b1a5d0c21281259866ea71982d7e8353


More information about the scm-commits mailing list