Compare commits

...

3 Commits

Author SHA1 Message Date
Robbie Harwood 68f872a10e Drop custom rpm-sort
See-also: https://github.com/rpm-software-management/rpm/pull/2249
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
2022-11-01 13:58:51 -04:00
Robbie Harwood 9f3764d8d2 Apply Marta's copy-default args fix
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
2022-10-04 17:16:29 +00:00
Marta Lewandowska 2f6207731e Fix passing --args without copy-default
Fix so that --args are not passed by default if copy-default is not used.
Set root when --args are passed without copy-default.
2022-10-04 13:08:06 +00:00
3 changed files with 16 additions and 373 deletions

View File

@ -92,7 +92,7 @@ get_bls_values() {
bls="${bls%.conf}"
bls="${bls##*/}"
echo "${bls}"
done | /usr/libexec/grubby/rpm-sort -c rpmnvrcmp 2>/dev/null | tac)) || :
done | sort -Vr 2>/dev/null)) || :
for bls in "${files[@]}" ; do
blspath="${blsdir}/${bls}.conf"
@ -827,13 +827,12 @@ fi
remove_var_prefix "$(get_prefix)"
if [[ -n $kernel ]]; then
if [[ $copy_default = "true" ]]; then
opts="${bls_options[$default_index]}"
if [[ -n $args ]]; then
opts="${opts} ${args}"
fi
else
opts="${args}"
opts="${bls_options[$default_index]}"
if [[ $copy_default != "true" ]]; then
opts=$(echo $opts | sed -e 's/ .*//')
fi
if [[ -n $args ]]; then
opts="${opts} ${args}"
fi
add_bls_fragment "${kernel}" "${title}" "${opts}" "${initrd}" \

View File

@ -3,11 +3,11 @@
Name: grubby
Version: 8.40
Release: 66%{?dist}
Release: 68%{?dist}
Summary: Command line tool for updating bootloader configs
License: GPLv2+
Source1: grubby-bls
Source2: rpm-sort.c
# Source2: rpm-sort.c
Source3: COPYING
Source4: installkernel-bls
Source5: 95-kernel-hooks.install
@ -49,13 +49,8 @@ cp %{SOURCE3} . || true
%build
%set_build_flags
gcc ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} -std=gnu99 -DVERSION='"8.4.0"' \
-o rpm-sort %{SOURCE2} -lrpmio
%install
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
@ -75,8 +70,6 @@ fi
%files
%license COPYING
%dir %{_libexecdir}/grubby
%attr(0755,root,root) %{_libexecdir}/grubby/rpm-sort
%attr(0755,root,root) %{_sbindir}/grubby
%attr(0755,root,root) %{_sbindir}/installkernel
%attr(0755,root,root) %{_prefix}/lib/kernel/install.d/10-devicetree.install
@ -84,6 +77,13 @@ fi
%{_mandir}/man8/grubby.8*
%changelog
* Tue Nov 01 2022 Robbie Harwood <rharwood@redhat.com> - 8.40-68
- Drop custom rpm-sort
- See-also: https://github.com/rpm-software-management/rpm/pull/2249
* Tue Oct 04 2022 Robbie Harwood <rharwood@redhat.com> - 8.40-67
- Apply Marta's copy-default args fix
* Mon Aug 22 2022 Robbie Harwood <rharwood@redhat.com> - 8.40-66
- Give up and just pull the config from BLS
- Suggested-by: Bojan Smojver <bojan@rexursive.com>

View File

@ -1,356 +0,0 @@
#define _GNU_SOURCE
#include <argp.h>
#include <assert.h>
#include <err.h>
#include <errno.h>
#include <rpm/rpmlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.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;
}