Remove upstream and layers of indirection around -bls

Signed-off-by: Robbie Harwood <rharwood@redhat.com>
This commit is contained in:
Robbie Harwood 2022-04-27 15:28:15 +00:00
parent 1bc3038166
commit 415ad451de
19 changed files with 723 additions and 3314 deletions

View File

@ -1,235 +0,0 @@
From aa4472dbc10f3d669e24ac07293d7ac19e606866 Mon Sep 17 00:00:00 2001
From: Dennis Gilmore <dennis@ausil.us>
Date: Wed, 30 Aug 2017 14:03:45 -0500
Subject: [PATCH 1/8] remove the old crufty u-boot support
Fedora has only supported extlinux.conf for a few releases now
as a result it should be the only way we boot systems. Remove
the no longer needed uboot file
Signed-off-by: Dennis Gilmore <dennis@ausil.us>
---
new-kernel-pkg | 116 -------------------------------------------------
uboot | 43 ------------------
2 files changed, 159 deletions(-)
delete mode 100644 uboot
diff --git a/new-kernel-pkg b/new-kernel-pkg
index b634388a83f..962008e3c9d 100755
--- a/new-kernel-pkg
+++ b/new-kernel-pkg
@@ -37,7 +37,6 @@ else
fi
[ -f /etc/sysconfig/kernel ] && . /etc/sysconfig/kernel
-[ -f /etc/sysconfig/uboot ] && . /etc/sysconfig/uboot
cfgGrub2=""
cfgGrub2Efi=""
@@ -50,7 +49,6 @@ grubConfig=""
grub2Config=""
grub2EfiConfig=""
extlinuxConfig=""
-ubootScript="/boot/boot.scr"
ARCH=$(uname -m)
@@ -84,13 +82,6 @@ elif [[ ${ARCH} =~ armv[5|7].*l ]] ; then
liloConfig=""
bootPrefix=/boot
extlinuxConfig=$(readlink -f /etc/extlinux.conf 2>/dev/null)
- ubootDir=${UBOOT_DIR:-"/boot"}
- ubootScript=$ubootDir/${UBOOT_SCR:-"boot.scr"}
- ubootKList=${UBOOT_KLIST:-"klist.txt"}
- ubootDevice=/dev/${UBOOT_DEVICE:-"mmcblk0p1"}
- ubootDefaultImage=${UBOOT_UIMAGE:-"uImage"}
- ubootDefaultInitrd=${UBOOT_UINITRD:-"uInitrd"}
- ubootAddress=${UBOOT_IMGADDR:-"0x00008000"}
mounted=""
liloFlag=""
isx86=""
@@ -382,53 +373,6 @@ remove() {
[ -n "$verbose" ] && echo "$liloConfig does not exist, not running grubby"
fi
- if [ -n "$cfguBoot" ]; then
- [ -n "$verbose" ] && echo "removing $version from $ubootDir..."
-
- if [ -f $ubootDir/$ubootKList ]; then
- tmpKList=`mktemp $ubootDir/$ubootKList.XXXX`
- curversion=`tail -n1 $ubootDir/$ubootKList`
- sed "/$version$/d" $ubootDir/$ubootKList > $tmpKList
- newversion=`tail -n1 $tmpKList`
- if [ -f $ubootDir/uImage-$newversion ] && [ -f $ubootDir/uInitrd-$newversion ]; then
- if [ "$curversion" != "$newversion" ]; then
- cp -fp $ubootDir/uImage-$newversion $ubootDir/${ubootDefaultImage}
- if [ $? -ne 0 ]; then
- [ -n "$verbose" ] && echo "copy uImage-$newversion error, default kernel not replaced!" && exit
- fi
- cp -fp $ubootDir/uInitrd-$newversion $ubootDir/${ubootDefaultInitrd}
- if [ $? -ne 0 ]; then
- [ -n "$verbose" ] && echo "copy uInitrd-$newversion error, default Initrd not replaced!" && exit
- fi
- fi
-
- [ -n "$verbose" ] && echo "removing uImage-$version"
- if [ -f $ubootDir/uImage-$version ]; then
- rm -f $ubootDir/uImage-$version
- else
- [ -n "$verbose" ] && echo "uImage-$version did not exist!"
- fi
-
- [ -n "$verbose" ] && echo "removing uInitrd-$version"
- if [ -f $ubootDir/uInitrd-$version ]; then
- rm -f $ubootDir/uInitrd-$version
- else
- [ -n "$verbose" ] && echo "uInitrd-$version did not exist!"
- fi
-
- mv $tmpKList $ubootDir/$ubootKList
- [ -x /sbin/a-b-c ] && /sbin/a-b-c
- else
- [ -n "$verbose" ] && echo "uImage $newversion does not exist!"
- [ -f $tmpKList ] && rm -f $tmpKList
- fi
- else
- [ -n "$verbose" ] && echo "No previous kernel version. U-Boot images not removed!"
- fi
- else
- [ -n "$verbose" ] && echo "$ubootScript does not exist, not modifying $ubootDir"
- fi
-
if [ -n "$cfgExtlinux" ]; then
[ -n "$verbose" ] && echo "removing $version from $extlinuxConfig"
$grubby --extlinux -c $extlinuxConfig \
@@ -530,36 +474,6 @@ update() {
[ -n "$verbose" ] && echo "$liloConfig does not exist, not running grubby"
fi
- if [ -n "$cfguBoot" ]; then
- [ -n "$verbose" ] && echo "adding $version to $ubootDir..."
-
- [ -n "$verbose" ] && echo "creating uImage-$version"
- mkimage -A arm -O linux -T kernel -C none -a $ubootAddress \
- -e $ubootAddress -n $version \
- -d $kernelImage $ubootDir/uImage-$version
-
- [ -n "$verbose" ] && echo "creating uInitrd-$version"
- mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 \
- -n initramfs -d $initrdfile $ubootDir/uInitrd-$version
-
- if [ -f $ubootDir/uImage-$version ] && [ -f $ubootDir/uInitrd-$version ]; then
- cp -fp $ubootDir/uImage-$version $ubootDir/${ubootDefaultImage}
- if [ $? -ne 0 ]; then
- [ -n "$verbose" ] && echo "copy uImage-$version error, kernel not installed!" && exit
- fi
- cp -fp $ubootDir/uInitrd-$version $ubootDir/${ubootDefaultInitrd}
- if [ $? -ne 0 ]; then
- [ -n "$verbose" ] && echo "copy uInitrd-$version error, kernel not installed!" && exit
- fi
- echo $version >> $ubootDir/$ubootKList
- [ -x /sbin/a-b-c ] && /sbin/a-b-c
- else
- [ -n "$verbose" ] && echo "cannot make $version the default"
- fi
- else
- [ -n "$verbose" ] && echo "$ubootScript does not exist, not setting up $ubootDir"
- fi
-
if [ -n "$cfgExtlinux" ]; then
[ -n "$verbose" ] && echo "updating $version from $extlinuxConfig"
ARGS="--extlinux -c $extlinuxConfig --update-kernel=$kernelImage \
@@ -877,33 +791,6 @@ fi
[ -n "$liloConfig" ] && [ -f "$liloConfig" ] && cfgLilo=1;
[ -n "$extlinuxConfig" ] && [ -f "$extlinuxConfig" ] && cfgExtlinux=1;
-# if we have a U-Boot directory, but no boot script, check if the directory
-# is mounted. If not, mount it, and then check if a boot script exists.
-if [ -n "$ubootDir" ]; then
- if [ -f "$ubootScript" ]; then
- cfguBoot=1
- else
- mountEntry=`mount | grep $ubootDir`
- if [ -z "$mountEntry" ]; then
- mount $ubootDevice $ubootDir
- mounted=1
- fi
- [ -f "$ubootScript" ] && cfguBoot=1;
- fi
-fi
-
-# if we're using U-Boot, check if the default load address should change
-if [ -n "$cfguBoot" -a -z "$UBOOT_IMGADDR" ]; then
- [[ $version =~ .([^.]*)$ ]]
- platform=${BASH_REMATCH[1]}
- # A few platforms use an alternate kernel load address
- if [ "$platform" = "omap" ]; then
- ubootAddress=0x80008000
- elif [ "$platform" = "imx" ]; then
- ubootAddress=0x90008000
- fi
-fi
-
# if we have a lilo config on an x86 box, see if the default boot loader
# is lilo to determine if it should be run
if [ -n "$cfgLilo" -a -n "$isx86" ]; then
@@ -920,7 +807,4 @@ elif [ "$mode" == "--rpmposttrans" ]; then
rpmposttrans
fi
-# if we mounted the U-Boot directory, unmount it.
-[ -n "$mounted" ] && umount $ubootDir
-
exit 0
diff --git a/uboot b/uboot
deleted file mode 100644
index 07d8671822f..00000000000
--- a/uboot
+++ /dev/null
@@ -1,43 +0,0 @@
-# Settings for uBoot setup in /sbin/new-kernel-pkg
-#
-# Default values are provided below (as comments)
-#
-# WARNING: These values affect where grubby installs and removes
-# uBoot kernel images. Changing these _after_ kernels have
-# been installed may cause removing a kernel image to fail.
-
-# directory where uBoot images and scripts are found
-#UBOOT_DIR=/boot
-
-# Override the load address when running mkimage on the kernel.
-# OMAP such as Beagleboard and Pandaboard: Use 0x80008000
-# Tegra such as Trimslice: Use 0x00008000
-# IMX such as Efika mx51 smarttop: Use 0x90008000
-# Kirkwood such as Dreamplug, Guruplug, Sheevaplug: Use 0x00008000
-# If left undefined grubby will use defults for Tegra or OMAP depending
-# upon the contents of /proc/cpuinfo.
-#UBOOT_IMGADDR=0x0x00008000
-
-# name of the text file containing the list of installed kernel versions
-# NOTE: The versions are in order of installation. The last entry should
-# always be the default boot kernel version.
-#UBOOT_KLIST=klist.txt
-
-# device partition where uBoot images reside; mounted on $UBOOT_DIR
-#UBOOT_DEVICE=mmcblk0p1
-
-
-# NOTE: Both of the following files are automatically overwritte
-# when a kernel package is installed or removed.
-
-# default kernel uImage file name
-#UBOOT_UIMAGE=uImage
-
-# default initrd uInitrd file name
-#UBOOT_UINITRD=uInitrd
-
-# defualt for platform shipping an onboard dtb.
-#SHIPSDTB=no
-
-# option to tell new-kernel-pkg a specific dtb file to load in extlinux.conf
-#dtbfile=foo.dtb
--
2.17.1

View File

@ -1,143 +0,0 @@
From 3afc4c0ed28d443bb71956b07fd45c8cfb07566f Mon Sep 17 00:00:00 2001
From: Nathaniel McCallum <npmccallum@redhat.com>
Date: Fri, 2 Mar 2018 14:59:32 -0500
Subject: [PATCH 2/8] Change return type in getRootSpecifier()
Rather than returning a new allocation of the prefix, just return the
length of the prefix. This change accomplishes a couple things. First,
it reduces some memory leaks since the return value was often never
freed. Second, it simplifies the caller who is usually only interested
in the length of the prefix.
---
grubby.c | 54 +++++++++++++++++++++++++++---------------------------
1 file changed, 27 insertions(+), 27 deletions(-)
diff --git a/grubby.c b/grubby.c
index d4ebb86168d..a062ef8e567 100644
--- a/grubby.c
+++ b/grubby.c
@@ -675,7 +675,7 @@ static int lineWrite(FILE * out, struct singleLine * line,
struct configFileInfo * cfi);
static int getNextLine(char ** bufPtr, struct singleLine * line,
struct configFileInfo * cfi);
-static char * getRootSpecifier(char * str);
+static size_t getRootSpecifier(const char *str);
static void requote(struct singleLine *line, struct configFileInfo * cfi);
static void insertElement(struct singleLine * line,
const char * item, int insertHere,
@@ -1840,7 +1840,7 @@ int suitableImage(struct singleEntry * entry, const char * bootPrefix,
char * fullName;
int i;
char * dev;
- char * rootspec;
+ size_t rs;
char * rootdev;
if (skipRemoved && entry->skip) {
@@ -1866,12 +1866,11 @@ int suitableImage(struct singleEntry * entry, const char * bootPrefix,
fullName = alloca(strlen(bootPrefix) +
strlen(line->elements[1].item) + 1);
- rootspec = getRootSpecifier(line->elements[1].item);
- int rootspec_offset = rootspec ? strlen(rootspec) : 0;
+ rs = getRootSpecifier(line->elements[1].item);
int hasslash = endswith(bootPrefix, '/') ||
- beginswith(line->elements[1].item + rootspec_offset, '/');
+ beginswith(line->elements[1].item + rs, '/');
sprintf(fullName, "%s%s%s", bootPrefix, hasslash ? "" : "/",
- line->elements[1].item + rootspec_offset);
+ line->elements[1].item + rs);
if (access(fullName, R_OK)) {
notSuitablePrintf(entry, 0, "access to %s failed\n", fullName);
return 0;
@@ -1952,7 +1951,6 @@ struct singleEntry * findEntryByPath(struct grubConfig * config,
struct singleLine * line;
int i;
char * chptr;
- char * rootspec = NULL;
enum lineType_e checkType = LT_KERNEL;
if (isdigit(*kernel)) {
@@ -2044,11 +2042,10 @@ struct singleEntry * findEntryByPath(struct grubConfig * config,
if (line && line->type != LT_MENUENTRY &&
line->numElements >= 2) {
- rootspec = getRootSpecifier(line->elements[1].item);
- if (!strcmp(line->elements[1].item +
- ((rootspec != NULL) ? strlen(rootspec) : 0),
- kernel + strlen(prefix)))
- break;
+ if (!strcmp(line->elements[1].item +
+ getRootSpecifier(line->elements[1].item),
+ kernel + strlen(prefix)))
+ break;
}
if(line->type == LT_MENUENTRY &&
!strcmp(line->elements[1].item, kernel))
@@ -2797,11 +2794,11 @@ struct singleLine * addLineTmpl(struct singleEntry * entry,
/* but try to keep the rootspec from the template... sigh */
if (tmplLine->type & (LT_HYPER|LT_KERNEL|LT_MBMODULE|LT_INITRD|LT_KERNEL_EFI|LT_INITRD_EFI|LT_KERNEL_16|LT_INITRD_16)) {
- char * rootspec = getRootSpecifier(tmplLine->elements[1].item);
- if (rootspec != NULL) {
- free(newLine->elements[1].item);
- newLine->elements[1].item =
- sdupprintf("%s%s", rootspec, val);
+ size_t rs = getRootSpecifier(tmplLine->elements[1].item);
+ if (rs > 0) {
+ free(newLine->elements[1].item);
+ newLine->elements[1].item = sdupprintf("%.*s%s", (int) rs,
+ tmplLine->elements[1].item, val);
}
}
}
@@ -3729,15 +3726,19 @@ int checkForElilo(struct grubConfig * config) {
return 1;
}
-static char * getRootSpecifier(char * str) {
- char * idx, * rootspec = NULL;
+static size_t getRootSpecifier(const char *str)
+{
+ size_t rs = 0;
if (*str == '(') {
- idx = rootspec = strdup(str);
- while(*idx && (*idx != ')') && (!isspace(*idx))) idx++;
- *(++idx) = '\0';
+ for (; str[rs] != ')' && !isspace(str[rs]); rs++) {
+ if (!str[rs])
+ return rs;
+ }
+ rs++;
}
- return rootspec;
+
+ return rs;
}
static char * getInitrdVal(struct grubConfig * config,
@@ -4616,7 +4617,7 @@ int main(int argc, const char ** argv) {
if (displayDefault) {
struct singleLine * line;
struct singleEntry * entry;
- char * rootspec;
+ size_t rs;
if (config->defaultImage == -1) return 0;
if (config->defaultImage == DEFAULT_SAVED_GRUB2 &&
@@ -4629,9 +4630,8 @@ int main(int argc, const char ** argv) {
line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
if (!line) return 0;
- rootspec = getRootSpecifier(line->elements[1].item);
- printf("%s%s\n", bootPrefix, line->elements[1].item +
- ((rootspec != NULL) ? strlen(rootspec) : 0));
+ rs = getRootSpecifier(line->elements[1].item);
+ printf("%s%s\n", bootPrefix, line->elements[1].item + rs);
return 0;
--
2.17.1

View File

@ -1,209 +0,0 @@
From 112b6e5fc690b2a73b6ad8c92dc4645db08503b6 Mon Sep 17 00:00:00 2001
From: Nathaniel McCallum <npmccallum@redhat.com>
Date: Fri, 2 Mar 2018 08:40:18 -0500
Subject: [PATCH 3/8] Add btrfs subvolume support for grub2
In order to find the subvolume prefix from a given path, we parse
/proc/mounts. In cases where /proc/mounts doesn't contain the
filesystem, the caller can use the --mounts option to specify his own
mounts file.
Btrfs subvolumes are already supported by grub2 and by grub2-mkconfig.
Fixes #22
---
grubby.c | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 143 insertions(+), 5 deletions(-)
diff --git a/grubby.c b/grubby.c
index a062ef8e567..96d252a0a83 100644
--- a/grubby.c
+++ b/grubby.c
@@ -68,6 +68,8 @@ int isEfi = 0;
char *saved_command_line = NULL;
+const char *mounts = "/proc/mounts";
+
/* comments get lumped in with indention */
struct lineElement {
char * item;
@@ -1834,6 +1836,129 @@ static int endswith(const char *s, char c)
return s[slen] == c;
}
+typedef struct {
+ const char *start;
+ size_t chars;
+} field;
+
+static int iscomma(int c)
+{
+ return c == ',';
+}
+
+static int isequal(int c)
+{
+ return c == '=';
+}
+
+static field findField(const field *in, typeof(isspace) *isdelim, field *out)
+{
+ field nxt = {};
+ size_t off = 0;
+
+ while (off < in->chars && isdelim(in->start[off]))
+ off++;
+
+ if (off == in->chars)
+ return nxt;
+
+ out->start = &in->start[off];
+ out->chars = 0;
+
+ while (off + out->chars < in->chars && !isdelim(out->start[out->chars]))
+ out->chars++;
+
+ nxt.start = out->start + out->chars;
+ nxt.chars = in->chars - off - out->chars;
+ return nxt;
+}
+
+static int fieldEquals(const field *in, const char *str)
+{
+ return in->chars == strlen(str) &&
+ strncmp(in->start, str, in->chars) == 0;
+}
+
+/* Parse /proc/mounts to determine the subvolume prefix. */
+static size_t subvolPrefix(const char *str)
+{
+ FILE *file = NULL;
+ char *line = NULL;
+ size_t prfx = 0;
+ size_t size = 0;
+
+ file = fopen(mounts, "r");
+ if (!file)
+ return 0;
+
+ for (ssize_t s; (s = getline(&line, &size, file)) >= 0; ) {
+ field nxt = { line, s };
+ field dev = {};
+ field path = {};
+ field type = {};
+ field opts = {};
+ field opt = {};
+
+ nxt = findField(&nxt, isspace, &dev);
+ if (!nxt.start)
+ continue;
+
+ nxt = findField(&nxt, isspace, &path);
+ if (!nxt.start)
+ continue;
+
+ nxt = findField(&nxt, isspace, &type);
+ if (!nxt.start)
+ continue;
+
+ nxt = findField(&nxt, isspace, &opts);
+ if (!nxt.start)
+ continue;
+
+ if (!fieldEquals(&type, "btrfs"))
+ continue;
+
+ /* We have found a btrfs mount point. */
+
+ nxt = opts;
+ while ((nxt = findField(&nxt, iscomma, &opt)).start) {
+ field key = {};
+ field val = {};
+
+ opt = findField(&opt, isequal, &key);
+ if (!opt.start)
+ continue;
+
+ opt = findField(&opt, isequal, &val);
+ if (!opt.start)
+ continue;
+
+ if (!fieldEquals(&key, "subvol"))
+ continue;
+
+ /* We have found a btrfs subvolume mount point. */
+
+ if (strncmp(val.start, str, val.chars))
+ continue;
+
+ if (val.start[val.chars - 1] != '/' &&
+ str[val.chars] != '/')
+ continue;
+
+ /* The subvolume mount point matches our input. */
+
+ if (prfx < val.chars)
+ prfx = val.chars;
+ }
+ }
+
+ dbgPrintf("%s(): str: '%s', prfx: '%s'\n", __FUNCTION__, str, prfx);
+
+ fclose(file);
+ free(line);
+ return prfx;
+}
+
int suitableImage(struct singleEntry * entry, const char * bootPrefix,
int skipRemoved, int flags) {
struct singleLine * line;
@@ -2794,12 +2919,22 @@ struct singleLine * addLineTmpl(struct singleEntry * entry,
/* but try to keep the rootspec from the template... sigh */
if (tmplLine->type & (LT_HYPER|LT_KERNEL|LT_MBMODULE|LT_INITRD|LT_KERNEL_EFI|LT_INITRD_EFI|LT_KERNEL_16|LT_INITRD_16)) {
- size_t rs = getRootSpecifier(tmplLine->elements[1].item);
+ const char *prfx = tmplLine->elements[1].item;
+ size_t rs = getRootSpecifier(prfx);
+ if (isinitrd(tmplLine->type)) {
+ for (struct singleLine *l = entry->lines;
+ rs == 0 && l; l = l->next) {
+ if (iskernel(l->type)) {
+ prfx = l->elements[1].item;
+ rs = getRootSpecifier(prfx);
+ }
+ }
+ }
if (rs > 0) {
free(newLine->elements[1].item);
- newLine->elements[1].item = sdupprintf("%.*s%s", (int) rs,
- tmplLine->elements[1].item, val);
- }
+ newLine->elements[1].item = sdupprintf("%.*s%s",
+ (int) rs, prfx, val);
+ }
}
}
@@ -3738,7 +3873,7 @@ static size_t getRootSpecifier(const char *str)
rs++;
}
- return rs;
+ return rs + subvolPrefix(str + rs);
}
static char * getInitrdVal(struct grubConfig * config,
@@ -4253,6 +4388,9 @@ int main(int argc, const char ** argv) {
{ "mbargs", 0, POPT_ARG_STRING, &newMBKernelArgs, 0,
_("default arguments for the new multiboot kernel or "
"new arguments for multiboot kernel being updated"), NULL },
+ { "mounts", 0, POPT_ARG_STRING, &mounts, 0,
+ _("path to fake /proc/mounts file (for testing only)"),
+ _("mounts") },
{ "bad-image-okay", 0, 0, &badImageOkay, 0,
_("don't sanity check images in boot entries (for testing only)"),
NULL },
--
2.17.1

File diff suppressed because it is too large Load Diff

View File

@ -1,25 +0,0 @@
From e08c858af4d2b09e62441560f3ccecc9e750c87a Mon Sep 17 00:00:00 2001
From: Rafael dos Santos <rdossant@redhat.com>
Date: Tue, 29 May 2018 15:15:24 +0200
Subject: [PATCH 5/8] Use system LDFLAGS
---
Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
index ac144046133..f0d13720db5 100644
--- a/Makefile
+++ b/Makefile
@@ -25,7 +25,7 @@ OBJECTS = grubby.o log.o
CC = gcc
RPM_OPT_FLAGS ?= -O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector
CFLAGS += $(RPM_OPT_FLAGS) -std=gnu99 -Wall -Werror -Wno-error=unused-function -Wno-unused-function -ggdb
-LDFLAGS :=
+LDFLAGS := $(RPM_LD_FLAGS)
grubby_LIBS = -lblkid -lpopt
--
2.17.1

View File

@ -1,36 +0,0 @@
From db200499551e386e7616c621fcbd69e350081664 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Wed, 18 Jul 2018 13:41:02 -0400
Subject: [PATCH 6/8] Honor sbindir
Signed-off-by: Peter Jones <pjones@redhat.com>
---
Makefile | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Makefile b/Makefile
index f0d13720db5..cfa8e0d60ab 100644
--- a/Makefile
+++ b/Makefile
@@ -42,14 +42,14 @@ test: all
@./test.sh
install: all
- mkdir -p $(DESTDIR)$(PREFIX)/sbin
+ mkdir -p $(DESTDIR)$(PREFIX)$(sbindir)
mkdir -p $(DESTDIR)/$(mandir)/man8
- install -m 755 new-kernel-pkg $(DESTDIR)$(PREFIX)/sbin
+ install -m 755 new-kernel-pkg $(DESTDIR)$(PREFIX)$(sbindir)
install -m 644 new-kernel-pkg.8 $(DESTDIR)/$(mandir)/man8
- install -m 755 installkernel $(DESTDIR)$(PREFIX)/sbin
+ install -m 755 installkernel $(DESTDIR)$(PREFIX)$(sbindir)
install -m 644 installkernel.8 $(DESTDIR)/$(mandir)/man8
if [ -f grubby ]; then \
- install -m 755 grubby $(DESTDIR)$(PREFIX)/sbin ; \
+ install -m 755 grubby $(DESTDIR)$(PREFIX)$(sbindir) ; \
install -m 644 grubby.8 $(DESTDIR)/$(mandir)/man8 ; \
fi
--
2.17.1

View File

@ -1,48 +0,0 @@
From fa1bf7b54cb71fa193da16ffc404f8535d7d16ac Mon Sep 17 00:00:00 2001
From: Javier Martinez Canillas <javierm@redhat.com>
Date: Tue, 31 Jul 2018 17:43:53 +0200
Subject: [PATCH 7/8] Make installkernel to use kernel-install scripts on BLS
configuration
The kernel make install target executes the arch/$ARCH/boot/install.sh
that in turns executes the distro specific installkernel script. This
script always uses new-kernel-pkg to install the kernel images.
But on a BootLoaderSpec setup, the kernel-install scripts must be used
instead. Check if the system uses a BLS setup, and call kernel-install
add in that case instead of new-kernel-pkg.
Reported-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
---
installkernel | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/installkernel b/installkernel
index b887929c179..68dcfac16d2 100755
--- a/installkernel
+++ b/installkernel
@@ -20,6 +20,8 @@
# Author(s): tyson@rwii.com
#
+[[ -f /etc/default/grub ]] && . /etc/default/grub
+
usage() {
echo "Usage: `basename $0` <kernel_version> <bootimage> <mapfile>" >&2
exit 1
@@ -77,6 +79,11 @@ cp $MAPFILE $INSTALL_PATH/System.map-$KERNEL_VERSION
ln -fs ${RELATIVE_PATH}$INSTALL_PATH/$KERNEL_NAME-$KERNEL_VERSION $LINK_PATH/$KERNEL_NAME
ln -fs ${RELATIVE_PATH}$INSTALL_PATH/System.map-$KERNEL_VERSION $LINK_PATH/System.map
+if [ "x${GRUB_ENABLE_BLSCFG}" = "xtrue" ] || [ ! -f /sbin/new-kernel-pkg ]; then
+ kernel-install add $KERNEL_VERSION $INSTALL_PATH/$KERNEL_NAME-$KERNEL_VERSION
+ exit $?
+fi
+
if [ -n "$cfgLoader" ] && [ -x /sbin/new-kernel-pkg ]; then
if [ -n "$(which dracut 2>/dev/null)" ]; then
new-kernel-pkg --mkinitrd --dracut --host-only --depmod --install --kernel-name $KERNEL_NAME $KERNEL_VERSION
--
2.17.1

View File

@ -1,418 +0,0 @@
From b8a581014170c6a9bb8ffb799090401a57a4bbe6 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Fri, 12 Oct 2018 16:39:37 -0400
Subject: [PATCH 8/8] Add /usr/libexec/rpm-sort
Signed-off-by: Peter Jones <pjones@redhat.com>
---
rpm-sort.c | 355 +++++++++++++++++++++++++++++++++++++++++++++++++++++
Makefile | 9 +-
.gitignore | 1 +
3 files changed, 363 insertions(+), 2 deletions(-)
create mode 100644 rpm-sort.c
diff --git a/rpm-sort.c b/rpm-sort.c
new file mode 100644
index 00000000000..f19635645ba
--- /dev/null
+++ b/rpm-sort.c
@@ -0,0 +1,355 @@
+#define _GNU_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <assert.h>
+#include <argp.h>
+#include <rpm/rpmlib.h>
+#include <err.h>
+
+typedef enum {
+ RPMNVRCMP,
+ VERSNVRCMP,
+ RPMVERCMP,
+ STRVERSCMP,
+} comparitors;
+
+static comparitors comparitor = RPMNVRCMP;
+
+static inline void *xmalloc(size_t sz)
+{
+ void *ret = malloc(sz);
+
+ assert(sz == 0 || ret != NULL);
+ return ret;
+}
+
+static inline void *xrealloc(void *p, size_t sz)
+{
+ void *ret = realloc(p, sz);
+
+ assert(sz == 0 || ret != NULL);
+ return ret;
+}
+
+static inline char *xstrdup(const char * const s)
+{
+ void *ret = strdup(s);
+
+ assert(s == NULL || ret != NULL);
+ return ret;
+}
+
+static size_t
+read_file (const char *input, char **ret)
+{
+ FILE *in;
+ size_t s;
+ size_t sz = 2048;
+ size_t offset = 0;
+ char *text;
+
+ if (!strcmp(input, "-"))
+ in = stdin;
+ else
+ in = fopen(input, "r");
+
+ text = xmalloc (sz);
+
+ if (!in)
+ err(1, "cannot open `%s'", input);
+
+ while ((s = fread (text + offset, 1, sz - offset, in)) != 0)
+ {
+ offset += s;
+ if (sz - offset == 0)
+ {
+ sz += 2048;
+ text = xrealloc (text, sz);
+ }
+ }
+
+ text[offset] = '\0';
+ *ret = text;
+
+ if (in != stdin)
+ fclose(in);
+
+ return offset + 1;
+}
+
+/* returns name/version/release */
+/* NULL string pointer returned if nothing found */
+static void
+split_package_string (char *package_string, char **name,
+ char **version, char **release)
+{
+ char *package_version, *package_release;
+
+ /* Release */
+ package_release = strrchr (package_string, '-');
+
+ if (package_release != NULL)
+ *package_release++ = '\0';
+
+ *release = package_release;
+
+ /* Version */
+ package_version = strrchr(package_string, '-');
+
+ if (package_version != NULL)
+ *package_version++ = '\0';
+
+ *version = package_version;
+ /* Name */
+ *name = package_string;
+
+ /* Bubble up non-null values from release to name */
+ if (*name == NULL)
+ {
+ *name = (*version == NULL ? *release : *version);
+ *version = *release;
+ *release = NULL;
+ }
+ if (*version == NULL)
+ {
+ *version = *release;
+ *release = NULL;
+ }
+}
+
+static int
+cmprpmversp(const void *p1, const void *p2)
+{
+ return rpmvercmp(*(char * const *)p1, *(char * const *)p2);
+}
+
+static int
+cmpstrversp(const void *p1, const void *p2)
+{
+ return strverscmp(*(char * const *)p1, *(char * const *)p2);
+}
+
+/*
+ * package name-version-release comparator for qsort
+ * expects p, q which are pointers to character strings (char *)
+ * which will not be altered in this function
+ */
+static int
+package_version_compare (const void *p, const void *q)
+{
+ char *local_p, *local_q;
+ char *lhs_name, *lhs_version, *lhs_release;
+ char *rhs_name, *rhs_version, *rhs_release;
+ int vercmpflag = 0;
+ int (*cmp)(const char *s1, const char *s2);
+
+ switch(comparitor)
+ {
+ default: /* just to shut up -Werror=maybe-uninitialized */
+ case RPMNVRCMP:
+ cmp = rpmvercmp;
+ break;
+ case VERSNVRCMP:
+ cmp = strverscmp;
+ break;
+ case RPMVERCMP:
+ return cmprpmversp(p, q);
+ break;
+ case STRVERSCMP:
+ return cmpstrversp(p, q);
+ break;
+ }
+
+ local_p = alloca (strlen (*(char * const *)p) + 1);
+ local_q = alloca (strlen (*(char * const *)q) + 1);
+
+ /* make sure these allocated */
+ assert (local_p);
+ assert (local_q);
+
+ strcpy (local_p, *(char * const *)p);
+ strcpy (local_q, *(char * const *)q);
+
+ split_package_string (local_p, &lhs_name, &lhs_version, &lhs_release);
+ split_package_string (local_q, &rhs_name, &rhs_version, &rhs_release);
+
+ /* Check Name and return if unequal */
+ vercmpflag = cmp ((lhs_name == NULL ? "" : lhs_name),
+ (rhs_name == NULL ? "" : rhs_name));
+ if (vercmpflag != 0)
+ return vercmpflag;
+
+ /* Check version and return if unequal */
+ vercmpflag = cmp ((lhs_version == NULL ? "" : lhs_version),
+ (rhs_version == NULL ? "" : rhs_version));
+ if (vercmpflag != 0)
+ return vercmpflag;
+
+ /* Check release and return the version compare value */
+ vercmpflag = cmp ((lhs_release == NULL ? "" : lhs_release),
+ (rhs_release == NULL ? "" : rhs_release));
+
+ return vercmpflag;
+}
+
+static void
+add_input (const char *filename, char ***package_names, size_t *n_package_names)
+{
+ char *orig_input_buffer = NULL;
+ char *input_buffer;
+ char *position_of_newline;
+ char **names = *package_names;
+ char **new_names = NULL;
+ size_t n_names = *n_package_names;
+
+ if (!*package_names)
+ new_names = names = xmalloc (sizeof (char *) * 2);
+
+ if (read_file (filename, &orig_input_buffer) < 2)
+ {
+ if (new_names)
+ free (new_names);
+ if (orig_input_buffer)
+ free (orig_input_buffer);
+ return;
+ }
+
+ input_buffer = orig_input_buffer;
+ while (input_buffer && *input_buffer &&
+ (position_of_newline = strchrnul (input_buffer, '\n')))
+ {
+ size_t sz = position_of_newline - input_buffer;
+ char *new;
+
+ if (sz == 0)
+ {
+ input_buffer = position_of_newline + 1;
+ continue;
+ }
+
+ new = xmalloc (sz+1);
+ strncpy (new, input_buffer, sz);
+ new[sz] = '\0';
+
+ names = xrealloc (names, sizeof (char *) * (n_names + 1));
+ names[n_names] = new;
+ n_names++;
+
+ /* move buffer ahead to next line */
+ input_buffer = position_of_newline + 1;
+ if (*position_of_newline == '\0')
+ input_buffer = NULL;
+ }
+
+ free (orig_input_buffer);
+
+ *package_names = names;
+ *n_package_names = n_names;
+}
+
+static char *
+help_filter (int key, const char *text, void *input __attribute__ ((unused)))
+{
+ return (char *)text;
+}
+
+static struct argp_option options[] = {
+ { "comparitor", 'c', "COMPARITOR", 0, "[rpm-nvr-cmp|vers-nvr-cmp|rpmvercmp|strverscmp]", 0},
+ { 0, }
+};
+
+struct arguments
+{
+ size_t ninputs;
+ size_t input_max;
+ char **inputs;
+};
+
+static error_t
+argp_parser (int key, char *arg, struct argp_state *state)
+{
+ struct arguments *arguments = state->input;
+ switch (key)
+ {
+ case 'c':
+ if (!strcmp(arg, "rpm-nvr-cmp") || !strcmp(arg, "rpmnvrcmp"))
+ comparitor = RPMNVRCMP;
+ else if (!strcmp(arg, "vers-nvr-cmp") || !strcmp(arg, "versnvrcmp"))
+ comparitor = VERSNVRCMP;
+ else if (!strcmp(arg, "rpmvercmp"))
+ comparitor = RPMVERCMP;
+ else if (!strcmp(arg, "strverscmp"))
+ comparitor = STRVERSCMP;
+ else
+ err(1, "Invalid comparitor \"%s\"", arg);
+ break;
+ case ARGP_KEY_ARG:
+ assert (arguments->ninputs < arguments->input_max);
+ arguments->inputs[arguments->ninputs++] = xstrdup (arg);
+ break;
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+ return 0;
+}
+
+static struct argp argp = {
+ options, argp_parser, "[INPUT_FILES]",
+ "Sort a list of strings in RPM version sort order.",
+ NULL, help_filter, NULL
+};
+
+int
+main (int argc, char *argv[])
+{
+ struct arguments arguments;
+ char **package_names = NULL;
+ size_t n_package_names = 0;
+ int i;
+
+ memset (&arguments, 0, sizeof (struct arguments));
+ arguments.input_max = argc+1;
+ arguments.inputs = xmalloc ((arguments.input_max + 1)
+ * sizeof (arguments.inputs[0]));
+ memset (arguments.inputs, 0, (arguments.input_max + 1)
+ * sizeof (arguments.inputs[0]));
+
+ /* Parse our arguments */
+ if (argp_parse (&argp, argc, argv, 0, 0, &arguments) != 0)
+ errx(1, "%s", "Error in parsing command line arguments\n");
+
+ /* If there's no inputs in argv, add one for stdin */
+ if (!arguments.ninputs)
+ {
+ arguments.ninputs = 1;
+ arguments.inputs[0] = xmalloc (2);
+ strcpy(arguments.inputs[0], "-");
+ }
+
+ for (i = 0; i < arguments.ninputs; i++)
+ add_input(arguments.inputs[i], &package_names, &n_package_names);
+
+ if (package_names == NULL || n_package_names < 1)
+ errx(1, "Invalid input");
+
+ qsort (package_names, n_package_names, sizeof (char *),
+ package_version_compare);
+
+ /* send sorted list to stdout */
+ for (i = 0; i < n_package_names; i++)
+ {
+ fprintf (stdout, "%s\n", package_names[i]);
+ free (package_names[i]);
+ }
+
+ free (package_names);
+ for (i = 0; i < arguments.ninputs; i++)
+ free (arguments.inputs[i]);
+
+ free (arguments.inputs);
+
+ return 0;
+}
diff --git a/Makefile b/Makefile
index cfa8e0d60ab..1ab58aeb039 100644
--- a/Makefile
+++ b/Makefile
@@ -29,7 +29,7 @@ LDFLAGS := $(RPM_LD_FLAGS)
grubby_LIBS = -lblkid -lpopt
-all: grubby
+all: grubby rpm-sort
debug : clean
$(MAKE) CFLAGS="${CFLAGS} -DDEBUG=1" all
@@ -52,12 +52,17 @@ install: all
install -m 755 grubby $(DESTDIR)$(PREFIX)$(sbindir) ; \
install -m 644 grubby.8 $(DESTDIR)/$(mandir)/man8 ; \
fi
+ install -m 755 -d $(DESTDIR)$(PREFIX)$(libexecdir)/grubby/
+ install -m 755 rpm-sort $(DESTDIR)$(PREFIX)$(libexecdir)/grubby/rpm-sort
grubby:: $(OBJECTS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(grubby_LIBS)
+rpm-sort::rpm-sort.o
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ -lrpm
+
clean:
- rm -f *.o grubby *~
+ rm -f *.o grubby rpm-sort *~
GITTAG = $(VERSION)-1
diff --git a/.gitignore b/.gitignore
index e64d3bc0986..1a5a546eee3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
grubby
+rpm-sort
version.h
*.o
--
2.17.1

View File

@ -1,30 +0,0 @@
From 64f91f29b03639b0726f0c46f004a20f11379e22 Mon Sep 17 00:00:00 2001
From: Jan Stodola <jstodola@redhat.com>
Date: Sat, 1 Dec 2018 02:33:23 +0100
Subject: [PATCH] Improve man page for --info option
1) commit 941d4a0b removed description of --info DEFAULT
2) Add description of --info ALL
---
grubby.8 | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/grubby.8 b/grubby.8
index 355b6eb6908..9ffef895b0f 100644
--- a/grubby.8
+++ b/grubby.8
@@ -132,7 +132,10 @@ is the default on ia32 platforms.
.TP
\fB-\-info\fR=\fIkernel-path\fR
-Display information on all boot entries which match \fIkernel-path\fR. I
+Display information on all boot entries which match \fIkernel-path\fR. If
+\fIkernel-path\fR is \fBDEFAULT\fR, then information on the default kernel
+is displayed. If \fIkernel-path\fR is \fBALL\fR, then information on all boot
+entries are displayed.
.TP
\fB-\-initrd\fR=\fIinitrd-path\fR
--
2.19.1

View File

@ -1,104 +0,0 @@
From 00241c65a5c0b4bb32a847a6abb5a86d0c704a8f Mon Sep 17 00:00:00 2001
From: Javier Martinez Canillas <javierm@redhat.com>
Date: Tue, 5 Feb 2019 20:08:43 +0100
Subject: [PATCH] Fix GCC warnings about possible string truncations and buffer
overflows
Building with -Werror=stringop-truncation and -Werror=stringop-overflow
leads to GCC complaining about possible string truncation and overflows.
Fix this by using memcpy(), explicitly calculating the buffers lenghts
and set a NUL byte terminator after copying the buffers.
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
---
grubby.c | 35 +++++++++++++++++++++++++++--------
1 file changed, 27 insertions(+), 8 deletions(-)
diff --git a/grubby.c b/grubby.c
index 96d252a0a83..5ca689539cf 100644
--- a/grubby.c
+++ b/grubby.c
@@ -459,20 +459,26 @@ char *grub2ExtractTitle(struct singleLine * line) {
snprintf(result, resultMaxSize, "%s", ++current);
i++;
+ int result_len = 0;
for (; i < line->numElements; ++i) {
current = line->elements[i].item;
current_len = strlen(current);
current_indent = line->elements[i].indent;
current_indent_len = strlen(current_indent);
- strncat(result, current_indent, current_indent_len);
+ memcpy(result + result_len, current_indent, current_indent_len);
+ result_len += current_indent_len;
+
if (!isquote(current[current_len-1])) {
- strncat(result, current, current_len);
+ memcpy(result + result_len, current_indent, current_indent_len);
+ result_len += current_len;
} else {
- strncat(result, current, current_len - 1);
+ memcpy(result + result_len, current_indent, current_indent_len);
+ result_len += (current_len - 1);
break;
}
}
+ result[result_len] = '\0';
return result;
}
@@ -1281,6 +1287,7 @@ static struct grubConfig * readConfig(const char * inName,
extras = malloc(len + 1);
*extras = '\0';
+ int buf_len = 0;
/* get title. */
for (int i = 0; i < line->numElements; i++) {
if (!strcmp(line->elements[i].item, "menuentry"))
@@ -1292,13 +1299,18 @@ static struct grubConfig * readConfig(const char * inName,
len = strlen(title);
if (isquote(title[len-1])) {
- strncat(buf, title,len-1);
+ memcpy(buf + buf_len, title, len - 1);
+ buf_len += (len - 1);
break;
} else {
- strcat(buf, title);
- strcat(buf, line->elements[i].indent);
+ memcpy(buf + buf_len, title, len);
+ buf_len += len;
+ len = strlen(line->elements[i].indent);
+ memcpy(buf + buf_len, line->elements[i].indent, len);
+ buf_len += len;
}
}
+ buf[buf_len] = '\0';
/* get extras */
int count = 0;
@@ -4494,10 +4506,17 @@ int main(int argc, const char ** argv) {
exit(1);
}
saved_command_line[0] = '\0';
+ int cmdline_len = 0, arg_len;
for (int j = 1; j < argc; j++) {
- strcat(saved_command_line, argv[j]);
- strncat(saved_command_line, j == argc -1 ? "" : " ", 1);
+ arg_len = strlen(argv[j]);
+ memcpy(saved_command_line + cmdline_len, argv[j], arg_len);
+ cmdline_len += arg_len;
+ if (j != argc - 1) {
+ memcpy(saved_command_line + cmdline_len, " ", 1);
+ cmdline_len++;
+ }
}
+ saved_command_line[cmdline_len] = '\0';
optCon = poptGetContext("grubby", argc, argv, options, 0);
poptReadDefaultConfig(optCon, 1);
--
2.20.1

View File

@ -1,72 +0,0 @@
From ed5e255c023c9b78120d9ff2246d6516f652d4b7 Mon Sep 17 00:00:00 2001
From: Javier Martinez Canillas <javierm@redhat.com>
Date: Mon, 10 Feb 2020 19:32:39 +0100
Subject: [PATCH] Fix stringop-overflow warning
GCC gives the following compile warning:
grubby.c: In function 'main':
grubby.c:4508:27: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=]
4508 | saved_command_line[0] = '\0';
| ~~~~~~~~~~~~~~~~~~~~~~^~~~~~
grubby.c:4503:26: note: at offset 0 to an object with size 0 allocated by 'malloc' here
4503 | saved_command_line = malloc(i);
| ^~~~~~~~~
cc1: all warnings being treated as errors
make: *** [Makefile:38: grubby.o] Error 1
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
---
grubby.c | 35 +++++++++++++++++++----------------
1 file changed, 19 insertions(+), 16 deletions(-)
diff --git a/grubby.c b/grubby.c
index 5ca689539cf..0c0f67a0ae5 100644
--- a/grubby.c
+++ b/grubby.c
@@ -4500,23 +4500,26 @@ int main(int argc, const char ** argv) {
int i = 0;
for (int j = 1; j < argc; j++)
i += strlen(argv[j]) + 1;
- saved_command_line = malloc(i);
- if (!saved_command_line) {
- fprintf(stderr, "grubby: %m\n");
- exit(1);
- }
- saved_command_line[0] = '\0';
- int cmdline_len = 0, arg_len;
- for (int j = 1; j < argc; j++) {
- arg_len = strlen(argv[j]);
- memcpy(saved_command_line + cmdline_len, argv[j], arg_len);
- cmdline_len += arg_len;
- if (j != argc - 1) {
- memcpy(saved_command_line + cmdline_len, " ", 1);
- cmdline_len++;
- }
+
+ if (i > 0) {
+ saved_command_line = malloc(i);
+ if (!saved_command_line) {
+ fprintf(stderr, "grubby: %m\n");
+ exit(1);
+ }
+ saved_command_line[0] = '\0';
+ int cmdline_len = 0, arg_len;
+ for (int j = 1; j < argc; j++) {
+ arg_len = strlen(argv[j]);
+ memcpy(saved_command_line + cmdline_len, argv[j], arg_len);
+ cmdline_len += arg_len;
+ if (j != argc - 1) {
+ memcpy(saved_command_line + cmdline_len, " ", 1);
+ cmdline_len++;
+ }
+ }
+ saved_command_line[cmdline_len] = '\0';
}
- saved_command_line[cmdline_len] = '\0';
optCon = poptGetContext("grubby", argc, argv, options, 0);
poptReadDefaultConfig(optCon, 1);
--
2.24.1

View File

@ -1,35 +0,0 @@
From ee9f80190d4c458a09309fbd9a88d2756dc2d3fa Mon Sep 17 00:00:00 2001
From: Javier Martinez Canillas <javierm@redhat.com>
Date: Mon, 10 Feb 2020 20:13:13 +0100
Subject: [PATCH] Fix maybe-uninitialized warning
GCC gives the following compile warning:
grubby.c: In function 'suseGrubConfGetBoot':
grubby.c:2770:5: error: 'grubDevice' may be used uninitialized in this function [-Werror=maybe-uninitialized]
2770 | free(grubDevice);
| ^~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make: *** [Makefile:38: grubby.o] Error 1
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
---
grubby.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/grubby.c b/grubby.c
index 0c0f67a0ae5..779c25a2bf9 100644
--- a/grubby.c
+++ b/grubby.c
@@ -2755,7 +2755,7 @@ int grubGetBootFromDeviceMap(const char * device,
}
int suseGrubConfGetBoot(const char * path, char ** bootPtr) {
- char * grubDevice;
+ char * grubDevice = NULL;
if (suseGrubConfGetInstallDevice(path, &grubDevice))
dbgPrintf("error looking for grub installation device\n");
--
2.24.1

View File

@ -1,28 +0,0 @@
From 1afddd618629a97479560bedbdcfa11b2c492a0e Mon Sep 17 00:00:00 2001
From: Javier Martinez Canillas <javierm@redhat.com>
Date: Fri, 26 Jun 2020 10:02:51 +0200
Subject: [PATCH] Fix build with rpm-4.16
rpmvercmp() was moved to librpmio, so link against this library instead.
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
---
Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
index 1ab58aeb039..a54b053a30b 100644
--- a/Makefile
+++ b/Makefile
@@ -59,7 +59,7 @@ grubby:: $(OBJECTS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(grubby_LIBS)
rpm-sort::rpm-sort.o
- $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ -lrpm
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ -lrpmio
clean:
rm -f *.o grubby rpm-sort *~
--
2.26.2

340
COPYING Normal file
View File

@ -0,0 +1,340 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program 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.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@ -1,8 +0,0 @@
#!/bin/bash
if [[ -x @@LIBEXECDIR@@/grubby ]] ; then
exec @@LIBEXECDIR@@/grubby "${@}"
elif [[ -x @@LIBEXECDIR@@/grubby-bls ]] ; then
exec @@LIBEXECDIR@@/grubby-bls "${@}"
fi
echo "Grubby is not installed correctly." >>/dev/stderr
exit 1

View File

@ -1,42 +1,27 @@
# What? No.
%define __brp_mangle_shebangs %{nil}
Name: grubby
Version: 8.40
Release: 58%{?dist}
Release: 59%{?dist}
Summary: Command line tool for updating bootloader configs
License: GPLv2+
URL: https://github.com/rhinstaller/grubby
# we only pull git snaps at the moment
# git clone git@github.com:rhinstaller/grubby.git
# git archive --format=tar --prefix=grubby-%%{version}/ HEAD |bzip2 > grubby-%%{version}.tar.bz2
# Source0: %%{name}-%%{version}.tar.bz2
Source0: https://github.com/rhboot/grubby/archive/%{version}-1.tar.gz
Source1: grubby-bls
Source2: grubby.in
Source3: installkernel.in
Source2: rpm-sort.c
Source3: COPYING
Source4: installkernel-bls
Source5: 95-kernel-hooks.install
Source6: 10-devicetree.install
Source7: grubby.8
Patch0001: 0001-remove-the-old-crufty-u-boot-support.patch
Patch0002: 0002-Change-return-type-in-getRootSpecifier.patch
Patch0003: 0003-Add-btrfs-subvolume-support-for-grub2.patch
Patch0004: 0004-Add-tests-for-btrfs-support.patch
Patch0005: 0005-Use-system-LDFLAGS.patch
Patch0006: 0006-Honor-sbindir.patch
Patch0007: 0007-Make-installkernel-to-use-kernel-install-scripts-on-.patch
Patch0008: 0008-Add-usr-libexec-rpm-sort.patch
Patch0009: 0009-Improve-man-page-for-info-option.patch
Patch0010: 0010-Fix-GCC-warnings-about-possible-string-truncations-a.patch
Patch0011: 0011-Fix-stringop-overflow-warning.patch
Patch0012: 0012-Fix-maybe-uninitialized-warning.patch
Patch0013: 0013-Fix-build-with-rpm-4.16.patch
BuildRequires: gcc
BuildRequires: pkgconfig glib2-devel popt-devel
BuildRequires: libblkid-devel sed make
# for make test / getopt:
BuildRequires: util-linux-ng
BuildRequires: glib2-devel
BuildRequires: libblkid-devel
BuildRequires: make
BuildRequires: pkgconfig
BuildRequires: popt-devel
BuildRequires: rpm-devel
BuildRequires: sed
%ifarch aarch64 i686 x86_64 %{power64}
BuildRequires: grub2-tools-minimal
Requires: grub2-tools-minimal
@ -57,27 +42,27 @@ BootLoaderSpec files and is meant to be backward compatible with
the previous grubby tool.
%prep
%autosetup -p1 -n grubby-%{version}-1
# Make sure the license can be found in mock
cp %{SOURCE3} . || true
%build
%set_build_flags
%make_build LDFLAGS="${LDFLAGS}"
gcc ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} -std=gnu99 -DVERSION='"8.4.0"' \
-o rpm-sort %{SOURCE2} -lrpmio
%install
make install DESTDIR=$RPM_BUILD_ROOT mandir=%{_mandir} sbindir=%{_sbindir} libexecdir=%{_libexecdir}
mkdir -p %{buildroot}%{_libexecdir}/grubby/
install -D -m 0755 rpm-sort %{buildroot}%{_libexecdir}/grubby
mkdir -p %{buildroot}%{_sbindir}/
install -T -m 0755 %{SOURCE1} %{buildroot}%{_sbindir}/grubby
install -T -m 0755 %{SOURCE4} %{buildroot}%{_sbindir}/installkernel
mkdir -p %{buildroot}%{_libexecdir}/{grubby,installkernel}/ %{buildroot}%{_sbindir}/
install -m 0755 %{SOURCE1} %{buildroot}%{_libexecdir}/grubby/
install -m 0755 %{SOURCE4} %{buildroot}%{_libexecdir}/installkernel/
sed -e "s,@@LIBEXECDIR@@,%{_libexecdir}/grubby,g" %{SOURCE2} \
> %{buildroot}%{_sbindir}/grubby
sed -e "s,@@LIBEXECDIR@@,%{_libexecdir}/installkernel,g" %{SOURCE3} \
> %{buildroot}%{_sbindir}/installkernel
install -D -m 0755 -t %{buildroot}%{_prefix}/lib/kernel/install.d/ %{SOURCE5}
install -D -m 0755 -t %{buildroot}%{_prefix}/lib/kernel/install.d/ %{SOURCE6}
rm %{buildroot}%{_mandir}/man8/{grubby,new-kernel-pkg}.8*
mkdir -p %{buildroot}%{_mandir}/man8
install -m 0644 %{SOURCE7} %{buildroot}%{_mandir}/man8/
rm %{buildroot}%{_sbindir}/new-kernel-pkg
%post
if [ "$1" = 2 ]; then
@ -89,17 +74,17 @@ fi
%files
%license COPYING
%dir %{_libexecdir}/grubby
%dir %{_libexecdir}/installkernel
%attr(0755,root,root) %{_libexecdir}/grubby/grubby-bls
%attr(0755,root,root) %{_libexecdir}/grubby/rpm-sort
%attr(0755,root,root) %{_sbindir}/grubby
%attr(0755,root,root) %{_libexecdir}/installkernel/installkernel-bls
%attr(0755,root,root) %{_sbindir}/installkernel
%attr(0755,root,root) %{_prefix}/lib/kernel/install.d/10-devicetree.install
%attr(0755,root,root) %{_prefix}/lib/kernel/install.d/95-kernel-hooks.install
%{_mandir}/man8/[gi]*.8*
%{_mandir}/man8/grubby.8*
%changelog
* Wed Apr 27 2022 Robbie Harwood <rharwood@redhat.com> - 8.40-59
- Remove upstream and layers of indirection around -bls
* Thu Mar 10 2022 Robbie Harwood <rharwood@redhat.com> - 8.40-58
- Remove grubby-deprecated

View File

@ -1,8 +0,0 @@
#!/bin/bash
if [[ -x @@LIBEXECDIR@@/installkernel ]] ; then
exec @@LIBEXECDIR@@/installkernel "${@}"
elif [[ -x @@LIBEXECDIR@@/installkernel-bls ]] ; then
exec @@LIBEXECDIR@@/installkernel-bls "${@}"
fi
echo "installkernel is not installed correctly." >>/dev/stderr
exit 1

355
rpm-sort.c Normal file
View File

@ -0,0 +1,355 @@
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <assert.h>
#include <argp.h>
#include <rpm/rpmlib.h>
#include <err.h>
typedef enum {
RPMNVRCMP,
VERSNVRCMP,
RPMVERCMP,
STRVERSCMP,
} comparitors;
static comparitors comparitor = RPMNVRCMP;
static inline void *xmalloc(size_t sz)
{
void *ret = malloc(sz);
assert(sz == 0 || ret != NULL);
return ret;
}
static inline void *xrealloc(void *p, size_t sz)
{
void *ret = realloc(p, sz);
assert(sz == 0 || ret != NULL);
return ret;
}
static inline char *xstrdup(const char * const s)
{
void *ret = strdup(s);
assert(s == NULL || ret != NULL);
return ret;
}
static size_t
read_file (const char *input, char **ret)
{
FILE *in;
size_t s;
size_t sz = 2048;
size_t offset = 0;
char *text;
if (!strcmp(input, "-"))
in = stdin;
else
in = fopen(input, "r");
text = xmalloc (sz);
if (!in)
err(1, "cannot open `%s'", input);
while ((s = fread (text + offset, 1, sz - offset, in)) != 0)
{
offset += s;
if (sz - offset == 0)
{
sz += 2048;
text = xrealloc (text, sz);
}
}
text[offset] = '\0';
*ret = text;
if (in != stdin)
fclose(in);
return offset + 1;
}
/* returns name/version/release */
/* NULL string pointer returned if nothing found */
static void
split_package_string (char *package_string, char **name,
char **version, char **release)
{
char *package_version, *package_release;
/* Release */
package_release = strrchr (package_string, '-');
if (package_release != NULL)
*package_release++ = '\0';
*release = package_release;
/* Version */
package_version = strrchr(package_string, '-');
if (package_version != NULL)
*package_version++ = '\0';
*version = package_version;
/* Name */
*name = package_string;
/* Bubble up non-null values from release to name */
if (*name == NULL)
{
*name = (*version == NULL ? *release : *version);
*version = *release;
*release = NULL;
}
if (*version == NULL)
{
*version = *release;
*release = NULL;
}
}
static int
cmprpmversp(const void *p1, const void *p2)
{
return rpmvercmp(*(char * const *)p1, *(char * const *)p2);
}
static int
cmpstrversp(const void *p1, const void *p2)
{
return strverscmp(*(char * const *)p1, *(char * const *)p2);
}
/*
* package name-version-release comparator for qsort
* expects p, q which are pointers to character strings (char *)
* which will not be altered in this function
*/
static int
package_version_compare (const void *p, const void *q)
{
char *local_p, *local_q;
char *lhs_name, *lhs_version, *lhs_release;
char *rhs_name, *rhs_version, *rhs_release;
int vercmpflag = 0;
int (*cmp)(const char *s1, const char *s2);
switch(comparitor)
{
default: /* just to shut up -Werror=maybe-uninitialized */
case RPMNVRCMP:
cmp = rpmvercmp;
break;
case VERSNVRCMP:
cmp = strverscmp;
break;
case RPMVERCMP:
return cmprpmversp(p, q);
break;
case STRVERSCMP:
return cmpstrversp(p, q);
break;
}
local_p = alloca (strlen (*(char * const *)p) + 1);
local_q = alloca (strlen (*(char * const *)q) + 1);
/* make sure these allocated */
assert (local_p);
assert (local_q);
strcpy (local_p, *(char * const *)p);
strcpy (local_q, *(char * const *)q);
split_package_string (local_p, &lhs_name, &lhs_version, &lhs_release);
split_package_string (local_q, &rhs_name, &rhs_version, &rhs_release);
/* Check Name and return if unequal */
vercmpflag = cmp ((lhs_name == NULL ? "" : lhs_name),
(rhs_name == NULL ? "" : rhs_name));
if (vercmpflag != 0)
return vercmpflag;
/* Check version and return if unequal */
vercmpflag = cmp ((lhs_version == NULL ? "" : lhs_version),
(rhs_version == NULL ? "" : rhs_version));
if (vercmpflag != 0)
return vercmpflag;
/* Check release and return the version compare value */
vercmpflag = cmp ((lhs_release == NULL ? "" : lhs_release),
(rhs_release == NULL ? "" : rhs_release));
return vercmpflag;
}
static void
add_input (const char *filename, char ***package_names, size_t *n_package_names)
{
char *orig_input_buffer = NULL;
char *input_buffer;
char *position_of_newline;
char **names = *package_names;
char **new_names = NULL;
size_t n_names = *n_package_names;
if (!*package_names)
new_names = names = xmalloc (sizeof (char *) * 2);
if (read_file (filename, &orig_input_buffer) < 2)
{
if (new_names)
free (new_names);
if (orig_input_buffer)
free (orig_input_buffer);
return;
}
input_buffer = orig_input_buffer;
while (input_buffer && *input_buffer &&
(position_of_newline = strchrnul (input_buffer, '\n')))
{
size_t sz = position_of_newline - input_buffer;
char *new;
if (sz == 0)
{
input_buffer = position_of_newline + 1;
continue;
}
new = xmalloc (sz+1);
strncpy (new, input_buffer, sz);
new[sz] = '\0';
names = xrealloc (names, sizeof (char *) * (n_names + 1));
names[n_names] = new;
n_names++;
/* move buffer ahead to next line */
input_buffer = position_of_newline + 1;
if (*position_of_newline == '\0')
input_buffer = NULL;
}
free (orig_input_buffer);
*package_names = names;
*n_package_names = n_names;
}
static char *
help_filter (int key, const char *text, void *input __attribute__ ((unused)))
{
return (char *)text;
}
static struct argp_option options[] = {
{ "comparitor", 'c', "COMPARITOR", 0, "[rpm-nvr-cmp|vers-nvr-cmp|rpmvercmp|strverscmp]", 0},
{ 0, }
};
struct arguments
{
size_t ninputs;
size_t input_max;
char **inputs;
};
static error_t
argp_parser (int key, char *arg, struct argp_state *state)
{
struct arguments *arguments = state->input;
switch (key)
{
case 'c':
if (!strcmp(arg, "rpm-nvr-cmp") || !strcmp(arg, "rpmnvrcmp"))
comparitor = RPMNVRCMP;
else if (!strcmp(arg, "vers-nvr-cmp") || !strcmp(arg, "versnvrcmp"))
comparitor = VERSNVRCMP;
else if (!strcmp(arg, "rpmvercmp"))
comparitor = RPMVERCMP;
else if (!strcmp(arg, "strverscmp"))
comparitor = STRVERSCMP;
else
err(1, "Invalid comparitor \"%s\"", arg);
break;
case ARGP_KEY_ARG:
assert (arguments->ninputs < arguments->input_max);
arguments->inputs[arguments->ninputs++] = xstrdup (arg);
break;
default:
return ARGP_ERR_UNKNOWN;
}
return 0;
}
static struct argp argp = {
options, argp_parser, "[INPUT_FILES]",
"Sort a list of strings in RPM version sort order.",
NULL, help_filter, NULL
};
int
main (int argc, char *argv[])
{
struct arguments arguments;
char **package_names = NULL;
size_t n_package_names = 0;
int i;
memset (&arguments, 0, sizeof (struct arguments));
arguments.input_max = argc+1;
arguments.inputs = xmalloc ((arguments.input_max + 1)
* sizeof (arguments.inputs[0]));
memset (arguments.inputs, 0, (arguments.input_max + 1)
* sizeof (arguments.inputs[0]));
/* Parse our arguments */
if (argp_parse (&argp, argc, argv, 0, 0, &arguments) != 0)
errx(1, "%s", "Error in parsing command line arguments\n");
/* If there's no inputs in argv, add one for stdin */
if (!arguments.ninputs)
{
arguments.ninputs = 1;
arguments.inputs[0] = xmalloc (2);
strcpy(arguments.inputs[0], "-");
}
for (i = 0; i < arguments.ninputs; i++)
add_input(arguments.inputs[i], &package_names, &n_package_names);
if (package_names == NULL || n_package_names < 1)
errx(1, "Invalid input");
qsort (package_names, n_package_names, sizeof (char *),
package_version_compare);
/* send sorted list to stdout */
for (i = 0; i < n_package_names; i++)
{
fprintf (stdout, "%s\n", package_names[i]);
free (package_names[i]);
}
free (package_names);
for (i = 0; i < arguments.ninputs; i++)
free (arguments.inputs[i]);
free (arguments.inputs);
return 0;
}

View File

@ -1 +0,0 @@
SHA512 (8.40-1.tar.gz) = 956ea6ccec2e7285fc8ebbf1d7659c4f41b1e9eda913d99a9712af9103144a13e66e93dce4c089b64ab370d1fed63656e922eafb88a0a39f843a6a6d166f72c5