|
|
ca6b193 |
From 14119148dabb7f4f633623c00eece44c5771db10 Mon Sep 17 00:00:00 2001
|
|
|
ca6b193 |
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
|
|
ca6b193 |
Date: Mon, 20 Jun 2022 17:43:05 +0200
|
|
|
ca6b193 |
Subject: [PATCH 1/2] Revert "zipl/src: Implement sorting bls entries by
|
|
|
ca6b193 |
versions"
|
|
|
ca6b193 |
|
|
|
ca6b193 |
This reverts commit a0dba6bfdb50ff373fa710ffe2a307cc0748f18b.
|
|
|
ca6b193 |
---
|
|
|
ca6b193 |
zipl/src/scan.c | 139 ++----------------------------------------------
|
|
|
ca6b193 |
1 file changed, 3 insertions(+), 136 deletions(-)
|
|
|
ca6b193 |
|
|
|
ca6b193 |
diff --git a/zipl/src/scan.c b/zipl/src/scan.c
|
|
|
ca6b193 |
index 0cea1d4..9352f76 100644
|
|
|
ca6b193 |
--- a/zipl/src/scan.c
|
|
|
ca6b193 |
+++ b/zipl/src/scan.c
|
|
|
ca6b193 |
@@ -10,7 +10,6 @@
|
|
|
ca6b193 |
*
|
|
|
ca6b193 |
*/
|
|
|
ca6b193 |
|
|
|
ca6b193 |
-static const char *VERSION_KEYWORD = "version";
|
|
|
ca6b193 |
|
|
|
ca6b193 |
/* Need ISOC99 function isblank() in ctype.h */
|
|
|
ca6b193 |
#ifndef __USE_ISOC99
|
|
|
ca6b193 |
@@ -646,7 +645,7 @@ scan_file(const char* filename, struct scan_token** token)
|
|
|
ca6b193 |
|
|
|
ca6b193 |
|
|
|
ca6b193 |
static int
|
|
|
ca6b193 |
-bls_filter_by_names(const struct dirent *ent)
|
|
|
ca6b193 |
+bls_filter(const struct dirent *ent)
|
|
|
ca6b193 |
{
|
|
|
ca6b193 |
int offset = strlen(ent->d_name) - strlen(".conf");
|
|
|
ca6b193 |
|
|
|
ca6b193 |
@@ -656,111 +655,13 @@ bls_filter_by_names(const struct dirent *ent)
|
|
|
ca6b193 |
return strncmp(ent->d_name + offset, ".conf", strlen(".conf")) == 0;
|
|
|
ca6b193 |
}
|
|
|
ca6b193 |
|
|
|
ca6b193 |
-struct version {
|
|
|
ca6b193 |
- char *line; /* pointer to a line with version keyword */
|
|
|
ca6b193 |
- int offset; /* offset of version value in the line */
|
|
|
ca6b193 |
-};
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
-/*
|
|
|
ca6b193 |
- * Locate version in bls file represented by ENT
|
|
|
ca6b193 |
- */
|
|
|
ca6b193 |
-static void get_version(const struct dirent *ent, struct version *v)
|
|
|
ca6b193 |
-{
|
|
|
ca6b193 |
- char *line = NULL;
|
|
|
ca6b193 |
- size_t len = 0;
|
|
|
ca6b193 |
- char *d_name;
|
|
|
ca6b193 |
- FILE *stream;
|
|
|
ca6b193 |
- ssize_t read;
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
- memset(v, 0, sizeof(*v));
|
|
|
ca6b193 |
- d_name = misc_make_path((char *)blsdir, (char *)ent->d_name);
|
|
|
ca6b193 |
- if (!d_name)
|
|
|
ca6b193 |
- return;
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
- stream = fopen(d_name, "r");
|
|
|
ca6b193 |
- free(d_name);
|
|
|
ca6b193 |
- if (!stream)
|
|
|
ca6b193 |
- return;
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
- while ((read = getline(&line, &len, stream)) != -1) {
|
|
|
ca6b193 |
- if (line[read - 1] == '\n') {
|
|
|
ca6b193 |
- line[read - 1] = '\0';
|
|
|
ca6b193 |
- read--;
|
|
|
ca6b193 |
- }
|
|
|
ca6b193 |
- if ((size_t)read <= strlen(VERSION_KEYWORD) + 1)
|
|
|
ca6b193 |
- continue;
|
|
|
ca6b193 |
- if (strcmp(VERSION_KEYWORD, line) > 0)
|
|
|
ca6b193 |
- continue;
|
|
|
ca6b193 |
- if (!isblank(line[strlen(VERSION_KEYWORD)]))
|
|
|
ca6b193 |
- continue;
|
|
|
ca6b193 |
- /* skip blanks */
|
|
|
ca6b193 |
- v->offset = strlen(VERSION_KEYWORD) + 1;
|
|
|
ca6b193 |
- while (v->offset < read - 1 && isblank(line[v->offset]))
|
|
|
ca6b193 |
- v->offset++;
|
|
|
ca6b193 |
- if (isblank(line[v->offset]))
|
|
|
ca6b193 |
- /*
|
|
|
ca6b193 |
- * all characters after the keyword
|
|
|
ca6b193 |
- * are blanks. Invalid version
|
|
|
ca6b193 |
- */
|
|
|
ca6b193 |
- continue;
|
|
|
ca6b193 |
- v->line = line;
|
|
|
ca6b193 |
- fclose(stream);
|
|
|
ca6b193 |
- return;
|
|
|
ca6b193 |
- }
|
|
|
ca6b193 |
- free(line);
|
|
|
ca6b193 |
- fclose(stream);
|
|
|
ca6b193 |
-}
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
-static void put_version(struct version *v)
|
|
|
ca6b193 |
-{
|
|
|
ca6b193 |
- free(v->line);
|
|
|
ca6b193 |
-}
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
-/**
|
|
|
ca6b193 |
- * Check version in bls file represented by ENT.
|
|
|
ca6b193 |
- * Return 1 if version is valid. Otherwise return 0
|
|
|
ca6b193 |
- */
|
|
|
ca6b193 |
-static int bls_filter_by_versions(const struct dirent *ent)
|
|
|
ca6b193 |
-{
|
|
|
ca6b193 |
- struct version v;
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
- if (bls_filter_by_names(ent) == 0)
|
|
|
ca6b193 |
- return 0;
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
- get_version(ent, &v);
|
|
|
ca6b193 |
- if (v.line) {
|
|
|
ca6b193 |
- put_version(&v);
|
|
|
ca6b193 |
- return 1;
|
|
|
ca6b193 |
- }
|
|
|
ca6b193 |
- return 0;
|
|
|
ca6b193 |
-}
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
|
|
|
ca6b193 |
static int
|
|
|
ca6b193 |
-bls_sort_by_names(const struct dirent **ent_a, const struct dirent **ent_b)
|
|
|
ca6b193 |
+bls_sort(const struct dirent **ent_a, const struct dirent **ent_b)
|
|
|
ca6b193 |
{
|
|
|
ca6b193 |
return strverscmp((*ent_a)->d_name, (*ent_b)->d_name);
|
|
|
ca6b193 |
}
|
|
|
ca6b193 |
|
|
|
ca6b193 |
-static int
|
|
|
ca6b193 |
-bls_sort_by_versions(const struct dirent **ent_a, const struct dirent **ent_b)
|
|
|
ca6b193 |
-{
|
|
|
ca6b193 |
- struct version v1, v2;
|
|
|
ca6b193 |
- int ret;
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
- get_version(*ent_a, &v1;;
|
|
|
ca6b193 |
- get_version(*ent_b, &v2;;
|
|
|
ca6b193 |
- /*
|
|
|
ca6b193 |
- * Both versions are valid.
|
|
|
ca6b193 |
- * It is guaranteed by bls_filter_by_versions()
|
|
|
ca6b193 |
- */
|
|
|
ca6b193 |
- ret = strverscmp(v1.line + v1.offset, v2.line + v2.offset);
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
- put_version(&v1;;
|
|
|
ca6b193 |
- put_version(&v2;;
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
- return ret;
|
|
|
ca6b193 |
-}
|
|
|
ca6b193 |
|
|
|
ca6b193 |
static int
|
|
|
ca6b193 |
scan_append_section_heading(struct scan_token* scan, int* index, char* name);
|
|
|
ca6b193 |
@@ -1110,40 +1011,6 @@ scan_count_target_keywords(char* keyword[])
|
|
|
ca6b193 |
return num;
|
|
|
ca6b193 |
}
|
|
|
ca6b193 |
|
|
|
ca6b193 |
-static int bls_scandir(struct dirent ***bls_entries)
|
|
|
ca6b193 |
-{
|
|
|
ca6b193 |
- struct dirent **entries1;
|
|
|
ca6b193 |
- struct dirent **entries2;
|
|
|
ca6b193 |
- int n1, n2;
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
- /* arrange by names */
|
|
|
ca6b193 |
- n1 = scandir(blsdir, &entries1,
|
|
|
ca6b193 |
- bls_filter_by_names, bls_sort_by_names);
|
|
|
ca6b193 |
- if (n1 <= 0)
|
|
|
ca6b193 |
- return n1;
|
|
|
ca6b193 |
- /* arrange by versions */
|
|
|
ca6b193 |
- n2 = scandir(blsdir, &entries2,
|
|
|
ca6b193 |
- bls_filter_by_versions, bls_sort_by_versions);
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
- if (n2 <= 0 || n2 < n1) {
|
|
|
ca6b193 |
- /*
|
|
|
ca6b193 |
- * failed to sort by versions,
|
|
|
ca6b193 |
- * fall back to sorting by filenames
|
|
|
ca6b193 |
- */
|
|
|
ca6b193 |
- *bls_entries = entries1;
|
|
|
ca6b193 |
- while (n2--)
|
|
|
ca6b193 |
- free(entries2[n2]);
|
|
|
ca6b193 |
- free(entries2);
|
|
|
ca6b193 |
- return n1;
|
|
|
ca6b193 |
- }
|
|
|
ca6b193 |
- /* use arrangement by versions */
|
|
|
ca6b193 |
- *bls_entries = entries2;
|
|
|
ca6b193 |
- while (n1--)
|
|
|
ca6b193 |
- free(entries1[n1]);
|
|
|
ca6b193 |
- free(entries1);
|
|
|
ca6b193 |
- return n2;
|
|
|
ca6b193 |
-}
|
|
|
ca6b193 |
-
|
|
|
ca6b193 |
int
|
|
|
ca6b193 |
scan_check_target_data(char* keyword[], int* line)
|
|
|
ca6b193 |
{
|
|
|
ca6b193 |
@@ -1464,7 +1331,7 @@ int scan_bls(struct scan_token **token, int scan_size)
|
|
|
ca6b193 |
if (!(stat(blsdir, &sb) == 0 && S_ISDIR(sb.st_mode)))
|
|
|
ca6b193 |
return 0;
|
|
|
ca6b193 |
|
|
|
ca6b193 |
- n = bls_scandir(&bls_entries);
|
|
|
ca6b193 |
+ n = scandir(blsdir, &bls_entries, bls_filter, bls_sort);
|
|
|
ca6b193 |
if (n <= 0)
|
|
|
ca6b193 |
return n;
|
|
|
ca6b193 |
|
|
|
ca6b193 |
--
|
|
|
ca6b193 |
2.36.1
|
|
|
ca6b193 |
|
|
|
ca6b193 |
|
|
|
ca6b193 |
From 661f143bb0b429c732d0ad9756c745dcb8799bc7 Mon Sep 17 00:00:00 2001
|
|
|
ca6b193 |
From: Peter Jones <pjones@redhat.com>
|
|
|
ca6b193 |
Date: Mon, 20 Jun 2022 17:46:59 +0200
|
|
|
ca6b193 |
Subject: [PATCH 2/2] blscfg: sort like rpm nvr, not like a single version
|
|
|
ca6b193 |
MIME-Version: 1.0
|
|
|
ca6b193 |
Content-Type: text/plain; charset=UTF-8
|
|
|
ca6b193 |
Content-Transfer-Encoding: 8bit
|
|
|
ca6b193 |
|
|
|
ca6b193 |
Signed-off-by: Peter Jones <pjones@redhat.com>
|
|
|
ca6b193 |
Signed-off-by: Dan HorĂ¡k <dan@danny.cz>
|
|
|
ca6b193 |
---
|
|
|
ca6b193 |
zipl/src/Makefile | 2 +-
|
|
|
ca6b193 |
zipl/src/scan.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++-
|
|
|
ca6b193 |
2 files changed, 95 insertions(+), 3 deletions(-)
|
|
|
ca6b193 |
|
|
|
ca6b193 |
diff --git a/zipl/src/Makefile b/zipl/src/Makefile
|
|
|
ca6b193 |
index 786bb7f..1adc486 100644
|
|
|
ca6b193 |
--- a/zipl/src/Makefile
|
|
|
ca6b193 |
+++ b/zipl/src/Makefile
|
|
|
61130fa |
@@ -7,7 +7,7 @@ ALL_CPPFLAGS += -I../include -I../boot \
|
|
|
61130fa |
-D_FILE_OFFSET_BITS=64 $(NO_PIE_CFLAGS)
|
|
|
51e189a |
ALL_LDFLAGS += -Wl,-z,noexecstack $(NO_PIE_LDFLAGS)
|
|
|
51e189a |
|
|
|
61130fa |
-libs = $(rootdir)/libutil/libutil.a
|
|
|
6ce1f4d |
+libs = $(rootdir)/libutil/libutil.a -lrpmio -lrpm
|
|
|
51e189a |
|
|
|
ea8f5ea |
objects = misc.o error.o scan.o job.o boot.o bootmap.o fs-map.o disk.o \
|
|
|
ea8f5ea |
bootmap_header.o envblk.o install.o zipl.o $(rootdir)/zipl/boot/data.o
|
|
|
ca6b193 |
diff --git a/zipl/src/scan.c b/zipl/src/scan.c
|
|
|
ca6b193 |
index 9352f76..3327e2d 100644
|
|
|
ca6b193 |
--- a/zipl/src/scan.c
|
|
|
ca6b193 |
+++ b/zipl/src/scan.c
|
|
|
ca6b193 |
@@ -35,6 +35,8 @@
|
|
|
c301cb5 |
|
|
|
c301cb5 |
#include "lib/util_base.h"
|
|
|
c301cb5 |
|
|
|
c301cb5 |
+#include <rpm/rpmlib.h>
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
#include "boot.h"
|
|
|
c301cb5 |
#include "error.h"
|
|
|
c301cb5 |
#include "misc.h"
|
|
|
ca6b193 |
@@ -655,13 +657,103 @@ bls_filter(const struct dirent *ent)
|
|
|
c301cb5 |
return strncmp(ent->d_name + offset, ".conf", strlen(".conf")) == 0;
|
|
|
c301cb5 |
}
|
|
|
c301cb5 |
|
|
|
c301cb5 |
+/* returns name/version/release */
|
|
|
c301cb5 |
+/* NULL string pointer returned if nothing found */
|
|
|
c301cb5 |
+static void
|
|
|
c301cb5 |
+split_package_string (char *package_string, char **name,
|
|
|
c301cb5 |
+ char **version, char **release)
|
|
|
c301cb5 |
+{
|
|
|
c301cb5 |
+ char *package_version, *package_release;
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ /* Release */
|
|
|
c301cb5 |
+ package_release = strrchr (package_string, '-');
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ if (package_release != NULL)
|
|
|
c301cb5 |
+ *package_release++ = '\0';
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ *release = package_release;
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ /* Version */
|
|
|
c301cb5 |
+ package_version = strrchr(package_string, '-');
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ if (package_version != NULL)
|
|
|
c301cb5 |
+ *package_version++ = '\0';
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ *version = package_version;
|
|
|
c301cb5 |
+ /* Name */
|
|
|
c301cb5 |
+ *name = package_string;
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ /* Bubble up non-null values from release to name */
|
|
|
c301cb5 |
+ if (name != NULL && *name == NULL) {
|
|
|
c301cb5 |
+ *name = (*version == NULL ? *release : *version);
|
|
|
c301cb5 |
+ *version = *release;
|
|
|
c301cb5 |
+ *release = NULL;
|
|
|
c301cb5 |
+ }
|
|
|
c301cb5 |
+ if (*version == NULL) {
|
|
|
c301cb5 |
+ *version = *release;
|
|
|
c301cb5 |
+ *release = NULL;
|
|
|
c301cb5 |
+ }
|
|
|
c301cb5 |
+}
|
|
|
51e189a |
|
|
|
51e189a |
static int
|
|
|
51e189a |
-bls_sort(const struct dirent **ent_a, const struct dirent **ent_b)
|
|
|
c301cb5 |
+split_cmp(char *nvr0, char *nvr1, int has_name)
|
|
|
c301cb5 |
+{
|
|
|
c301cb5 |
+ int ret = 0;
|
|
|
c301cb5 |
+ char *name0, *version0, *release0;
|
|
|
c301cb5 |
+ char *name1, *version1, *release1;
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ split_package_string(nvr0, has_name ? &name0 : NULL, &version0, &release0);
|
|
|
c301cb5 |
+ split_package_string(nvr1, has_name ? &name1 : NULL, &version1, &release1);
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ if (has_name) {
|
|
|
c301cb5 |
+ ret = rpmvercmp(name0 == NULL ? "" : name0,
|
|
|
c301cb5 |
+ name1 == NULL ? "" : name1);
|
|
|
c301cb5 |
+ if (ret != 0)
|
|
|
c301cb5 |
+ return ret;
|
|
|
c301cb5 |
+ }
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ ret = rpmvercmp(version0 == NULL ? "" : version0,
|
|
|
c301cb5 |
+ version1 == NULL ? "" : version1);
|
|
|
c301cb5 |
+ if (ret != 0)
|
|
|
c301cb5 |
+ return ret;
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ ret = rpmvercmp(release0 == NULL ? "" : release0,
|
|
|
c301cb5 |
+ release1 == NULL ? "" : release1);
|
|
|
c301cb5 |
+ return ret;
|
|
|
c301cb5 |
+}
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+/* return 1: filename0 is newer than filename1 */
|
|
|
c301cb5 |
+/* 0: filename0 and filename1 are the same version */
|
|
|
c301cb5 |
+/* -1: filename1 is newer than filename0 */
|
|
|
c301cb5 |
+static int bls_cmp(const char *filename0, const char *filename1)
|
|
|
51e189a |
{
|
|
|
51e189a |
- return strverscmp((*ent_a)->d_name, (*ent_b)->d_name);
|
|
|
c301cb5 |
+ char *id0, *id1;
|
|
|
c301cb5 |
+ int l, r;
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ id0 = strdup(filename0);
|
|
|
c301cb5 |
+ id1 = strdup(filename1);
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ l = strlen(id0);
|
|
|
c301cb5 |
+ if (l > 5 && strcmp(id0 + l - 5, ".conf"))
|
|
|
c301cb5 |
+ id0[l-5] = '\0';
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ l = strlen(id1);
|
|
|
c301cb5 |
+ if (l > 5 && strcmp(id1 + l - 5, ".conf"))
|
|
|
c301cb5 |
+ id1[l-5] = '\0';
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ r = split_cmp(id0, id1, 1);
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ free(id0);
|
|
|
c301cb5 |
+ free(id1);
|
|
|
c301cb5 |
+
|
|
|
c301cb5 |
+ return r;
|
|
|
51e189a |
}
|
|
|
c301cb5 |
|
|
|
51e189a |
+static int
|
|
|
51e189a |
+bls_sort(const struct dirent **ent_a, const struct dirent **ent_b)
|
|
|
51e189a |
+{
|
|
|
c301cb5 |
+ return bls_cmp((*ent_a)->d_name, (*ent_b)->d_name);
|
|
|
51e189a |
+}
|
|
|
c301cb5 |
|
|
|
c301cb5 |
static int
|
|
|
c301cb5 |
scan_append_section_heading(struct scan_token* scan, int* index, char* name);
|
|
|
ca6b193 |
--
|
|
|
ca6b193 |
2.36.1
|
|
|
ca6b193 |
|