forked from pool/util-linux
Compare commits
35 Commits
| Author | SHA256 | Date | |
|---|---|---|---|
|
|
a6a1e091ae | ||
|
|
d669fed9de | ||
|
|
b008c97080 | ||
| 7af9873028 | |||
| d87bf9940a | |||
| 6bdafd9994 | |||
| 526351100b | |||
| d065ff5434 | |||
| bf27a97789 | |||
| d056d99bac | |||
| f93ce2303c | |||
| 85211d2fa9 | |||
| 6e30656a72 | |||
| 0209a3bc33 | |||
| aea0e5246b | |||
| 165fabd559 | |||
| 549d330fc6 | |||
| d2055a82f3 | |||
| c0ae35c85a | |||
| 6858402110 | |||
| fa208609dd | |||
| 25172ba59e | |||
| ed47084f94 | |||
| b1afa335f2 | |||
| 31d054b433 | |||
| fdc0dc88f2 | |||
| b3f37b0f2b | |||
| ed19b913bf | |||
| 3dd6c5f458 | |||
| 5070c16a96 | |||
| 7c038e86c6 | |||
| 794b3b8aac | |||
| b59c309bd1 | |||
| a18f35ecc9 | |||
| ef49e98461 |
@@ -1,32 +0,0 @@
|
||||
From: Xi Ruoyao <xry111@xry111.site>
|
||||
Date: Sun, 31 Mar 2024 00:42:03 +0800
|
||||
Subject: include: Include <unistd.h> in pidfd-utils.h for syscall()
|
||||
Git-repo: https://github.com/util-linux/util-linux.git
|
||||
Git-commit: 10add327c608b11b3d70215048aade4d1797b1fd
|
||||
Patch-mainline: yes
|
||||
References: kernel 6.9
|
||||
|
||||
In Glibc, <sys/syscall.h> only contains SYS_* macros and the syscall()
|
||||
function is in <unistd.h>. So include it.
|
||||
|
||||
Signed-off-by: Xi Ruoyao <xry111@xry111.site>
|
||||
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
|
||||
---
|
||||
include/pidfd-utils.h | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/include/pidfd-utils.h b/include/pidfd-utils.h
|
||||
index ff0bc4c7..0ee55f3b 100644
|
||||
--- a/include/pidfd-utils.h
|
||||
+++ b/include/pidfd-utils.h
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#ifdef HAVE_SYS_SYSCALL_H
|
||||
# include <sys/syscall.h>
|
||||
+# include <unistd.h>
|
||||
|
||||
/*
|
||||
* If the kernel headers are too old to provide the syscall numbers, let's
|
||||
--
|
||||
2.45.0
|
||||
|
||||
@@ -1,319 +0,0 @@
|
||||
From: Xi Ruoyao <xry111@xry111.site>
|
||||
Date: Wed, 3 Apr 2024 15:29:34 +0800
|
||||
Subject: lsfd: Refactor the pidfd logic into lsfd-pidfd.c
|
||||
Git-repo: https://github.com/util-linux/util-linux.git
|
||||
Git-commit: bf6645dc1edef09ad378cc5b9eb2c93861408735
|
||||
Patch-mainline: yes
|
||||
References: kernel 6.9
|
||||
|
||||
We'll reuse these logic for pidfd support on Linux >= 6.9. This should
|
||||
be a no-functional change.
|
||||
|
||||
Besides moving the code, this change also renames anon_pidfd_data to
|
||||
pidfd_data, and removes a redundant nullity check for free (because
|
||||
free(NULL) will just do nothing per the C standard).
|
||||
|
||||
Signed-off-by: Xi Ruoyao <xry111@xry111.site>
|
||||
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
|
||||
---
|
||||
misc-utils/Makemodule.am | 4 +-
|
||||
misc-utils/lsfd-pidfd.c | 95 ++++++++++++++++++++++++++++++++++++++++
|
||||
misc-utils/lsfd-pidfd.h | 37 ++++++++++++++++
|
||||
misc-utils/lsfd-unkn.c | 71 +++++-------------------------
|
||||
misc-utils/meson.build | 1 +
|
||||
5 files changed, 147 insertions(+), 61 deletions(-)
|
||||
create mode 100644 misc-utils/lsfd-pidfd.c
|
||||
create mode 100644 misc-utils/lsfd-pidfd.h
|
||||
|
||||
diff --git a/misc-utils/Makemodule.am b/misc-utils/Makemodule.am
|
||||
index 9edf3d98..7622a5d7 100644
|
||||
--- a/misc-utils/Makemodule.am
|
||||
+++ b/misc-utils/Makemodule.am
|
||||
@@ -298,7 +298,9 @@ lsfd_SOURCES = \
|
||||
misc-utils/lsfd-sock.h \
|
||||
misc-utils/lsfd-sock-xinfo.c \
|
||||
misc-utils/lsfd-unkn.c \
|
||||
- misc-utils/lsfd-fifo.c
|
||||
+ misc-utils/lsfd-fifo.c \
|
||||
+ misc-utils/lsfd-pidfd.h \
|
||||
+ misc-utils/lsfd-pidfd.c
|
||||
lsfd_LDADD = $(LDADD) $(MQ_LIBS) libsmartcols.la libcommon.la
|
||||
lsfd_CFLAGS = $(AM_CFLAGS) -I$(ul_libsmartcols_incdir)
|
||||
endif
|
||||
diff --git a/misc-utils/lsfd-pidfd.c b/misc-utils/lsfd-pidfd.c
|
||||
new file mode 100644
|
||||
index 00000000..430a8028
|
||||
--- /dev/null
|
||||
+++ b/misc-utils/lsfd-pidfd.c
|
||||
@@ -0,0 +1,95 @@
|
||||
+/*
|
||||
+ * lsfd-pidfd.c - handle pidfd (from anon_inode or pidfs)
|
||||
+ *
|
||||
+ * Copyright (C) 2024 Xi Ruoyao <xry111@xry111.site>
|
||||
+ *
|
||||
+ * Refactored and moved out from lsfd-unkn.c (originally authored by
|
||||
+ * Masatake YAMATO <yamato@redhat.com>).
|
||||
+ *
|
||||
+ * 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 would 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
+ */
|
||||
+
|
||||
+#include <string.h>
|
||||
+
|
||||
+#include "strutils.h"
|
||||
+#include "xalloc.h"
|
||||
+
|
||||
+#include "lsfd.h"
|
||||
+#include "lsfd-pidfd.h"
|
||||
+
|
||||
+int pidfd_handle_fdinfo(struct pidfd_data *data, const char *key,
|
||||
+ const char *value)
|
||||
+{
|
||||
+ if (strcmp(key, "Pid") == 0) {
|
||||
+ uint64_t pid;
|
||||
+ int rc = ul_strtou64(value, &pid, 10);
|
||||
+
|
||||
+ if (rc < 0)
|
||||
+ return 0; /* ignore -- parse failed */
|
||||
+
|
||||
+ data->pid = (pid_t)pid;
|
||||
+ return 1;
|
||||
+ } else if (strcmp(key, "NSpid") == 0) {
|
||||
+ data->nspid = xstrdup(value);
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+char *pidfd_get_name(struct pidfd_data *data)
|
||||
+{
|
||||
+ char *str = NULL;
|
||||
+ char *comm = NULL;
|
||||
+ struct proc *proc = get_proc(data->pid);
|
||||
+
|
||||
+ if (proc)
|
||||
+ comm = proc->command;
|
||||
+
|
||||
+ xasprintf(&str, "pid=%d comm=%s nspid=%s",
|
||||
+ data->pid,
|
||||
+ comm ? comm : "",
|
||||
+ data->nspid ? data->nspid : "");
|
||||
+ return str;
|
||||
+}
|
||||
+
|
||||
+bool pidfd_fill_column(struct pidfd_data *data, int column_id, char **str)
|
||||
+{
|
||||
+ switch(column_id) {
|
||||
+ case COL_PIDFD_COMM: {
|
||||
+ struct proc *pidfd_proc = get_proc(data->pid);
|
||||
+ char *pidfd_comm = NULL;
|
||||
+
|
||||
+ if (pidfd_proc)
|
||||
+ pidfd_comm = pidfd_proc->command;
|
||||
+ if (pidfd_comm) {
|
||||
+ *str = xstrdup(pidfd_comm);
|
||||
+ return true;
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ case COL_PIDFD_NSPID:
|
||||
+ if (data->nspid) {
|
||||
+ *str = xstrdup(data->nspid);
|
||||
+ return true;
|
||||
+ }
|
||||
+ break;
|
||||
+ case COL_PIDFD_PID:
|
||||
+ xasprintf(str, "%d", (int)data->pid);
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
diff --git a/misc-utils/lsfd-pidfd.h b/misc-utils/lsfd-pidfd.h
|
||||
new file mode 100644
|
||||
index 00000000..2f65d3b3
|
||||
--- /dev/null
|
||||
+++ b/misc-utils/lsfd-pidfd.h
|
||||
@@ -0,0 +1,37 @@
|
||||
+/*
|
||||
+ * lsfd-pidfd.h - handle pidfd (from anon_inode or pidfs)
|
||||
+ *
|
||||
+ * Copyright (C) 2024 Xi Ruoyao <xry111@xry111.site>
|
||||
+ *
|
||||
+ * 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 would 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
+ */
|
||||
+
|
||||
+#include <stdbool.h>
|
||||
+#include <sys/types.h>
|
||||
+
|
||||
+struct pidfd_data {
|
||||
+ pid_t pid;
|
||||
+ char *nspid;
|
||||
+};
|
||||
+
|
||||
+int pidfd_handle_fdinfo(struct pidfd_data *, const char *, const char *);
|
||||
+char *pidfd_get_name(struct pidfd_data *);
|
||||
+bool pidfd_fill_column(struct pidfd_data *, int, char **);
|
||||
+
|
||||
+static inline void __attribute__((nonnull(1)))
|
||||
+pidfd_free(struct pidfd_data *data)
|
||||
+{
|
||||
+ free(data->nspid);
|
||||
+}
|
||||
diff --git a/misc-utils/lsfd-unkn.c b/misc-utils/lsfd-unkn.c
|
||||
index 8f6e9084..8e257f47 100644
|
||||
--- a/misc-utils/lsfd-unkn.c
|
||||
+++ b/misc-utils/lsfd-unkn.c
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "timeutils.h"
|
||||
|
||||
#include "lsfd.h"
|
||||
+#include "lsfd-pidfd.h"
|
||||
|
||||
#define offsetofend(TYPE, MEMBER) \
|
||||
(offsetof(TYPE, MEMBER) + sizeof_member(TYPE, MEMBER))
|
||||
@@ -183,10 +184,6 @@ static int unkn_handle_fdinfo(struct file *file, const char *key, const char *va
|
||||
/*
|
||||
* pidfd
|
||||
*/
|
||||
-struct anon_pidfd_data {
|
||||
- pid_t pid;
|
||||
- char *nspid;
|
||||
-};
|
||||
|
||||
static bool anon_pidfd_probe(const char *str)
|
||||
{
|
||||
@@ -195,51 +192,28 @@ static bool anon_pidfd_probe(const char *str)
|
||||
|
||||
static char *anon_pidfd_get_name(struct unkn *unkn)
|
||||
{
|
||||
- char *str = NULL;
|
||||
- struct anon_pidfd_data *data = (struct anon_pidfd_data *)unkn->anon_data;
|
||||
+ struct pidfd_data *data = (struct pidfd_data *)unkn->anon_data;
|
||||
|
||||
- char *comm = NULL;
|
||||
- struct proc *proc = get_proc(data->pid);
|
||||
- if (proc)
|
||||
- comm = proc->command;
|
||||
-
|
||||
- xasprintf(&str, "pid=%d comm=%s nspid=%s",
|
||||
- data->pid,
|
||||
- comm? comm: "",
|
||||
- data->nspid? data->nspid: "");
|
||||
- return str;
|
||||
+ return pidfd_get_name(data);
|
||||
}
|
||||
|
||||
static void anon_pidfd_init(struct unkn *unkn)
|
||||
{
|
||||
- unkn->anon_data = xcalloc(1, sizeof(struct anon_pidfd_data));
|
||||
+ unkn->anon_data = xcalloc(1, sizeof(struct pidfd_data));
|
||||
}
|
||||
|
||||
static void anon_pidfd_free(struct unkn *unkn)
|
||||
{
|
||||
- struct anon_pidfd_data *data = (struct anon_pidfd_data *)unkn->anon_data;
|
||||
+ struct pidfd_data *data = (struct pidfd_data *)unkn->anon_data;
|
||||
|
||||
- if (data->nspid)
|
||||
- free(data->nspid);
|
||||
+ pidfd_free(data);
|
||||
free(data);
|
||||
}
|
||||
|
||||
static int anon_pidfd_handle_fdinfo(struct unkn *unkn, const char *key, const char *value)
|
||||
{
|
||||
- if (strcmp(key, "Pid") == 0) {
|
||||
- uint64_t pid;
|
||||
-
|
||||
- int rc = ul_strtou64(value, &pid, 10);
|
||||
- if (rc < 0)
|
||||
- return 0; /* ignore -- parse failed */
|
||||
- ((struct anon_pidfd_data *)unkn->anon_data)->pid = (pid_t)pid;
|
||||
- return 1;
|
||||
- } else if (strcmp(key, "NSpid") == 0) {
|
||||
- ((struct anon_pidfd_data *)unkn->anon_data)->nspid = xstrdup(value);
|
||||
- return 1;
|
||||
-
|
||||
- }
|
||||
- return 0;
|
||||
+ return pidfd_handle_fdinfo((struct pidfd_data *)unkn->anon_data,
|
||||
+ key, value);
|
||||
}
|
||||
|
||||
static bool anon_pidfd_fill_column(struct proc *proc __attribute__((__unused__)),
|
||||
@@ -249,32 +223,9 @@ static bool anon_pidfd_fill_column(struct proc *proc __attribute__((__unused__)
|
||||
size_t column_index __attribute__((__unused__)),
|
||||
char **str)
|
||||
{
|
||||
- struct anon_pidfd_data *data = (struct anon_pidfd_data *)unkn->anon_data;
|
||||
-
|
||||
- switch(column_id) {
|
||||
- case COL_PIDFD_COMM: {
|
||||
- struct proc *pidfd_proc = get_proc(data->pid);
|
||||
- char *pidfd_comm = NULL;
|
||||
- if (pidfd_proc)
|
||||
- pidfd_comm = pidfd_proc->command;
|
||||
- if (pidfd_comm) {
|
||||
- *str = xstrdup(pidfd_comm);
|
||||
- return true;
|
||||
- }
|
||||
- break;
|
||||
- }
|
||||
- case COL_PIDFD_NSPID:
|
||||
- if (data->nspid) {
|
||||
- *str = xstrdup(data->nspid);
|
||||
- return true;
|
||||
- }
|
||||
- break;
|
||||
- case COL_PIDFD_PID:
|
||||
- xasprintf(str, "%d", (int)data->pid);
|
||||
- return true;
|
||||
- }
|
||||
-
|
||||
- return false;
|
||||
+ return pidfd_fill_column((struct pidfd_data *)unkn->anon_data,
|
||||
+ column_id,
|
||||
+ str);
|
||||
}
|
||||
|
||||
static const struct anon_ops anon_pidfd_ops = {
|
||||
diff --git a/misc-utils/meson.build b/misc-utils/meson.build
|
||||
index 847b1012..68ea9777 100644
|
||||
--- a/misc-utils/meson.build
|
||||
+++ b/misc-utils/meson.build
|
||||
@@ -56,6 +56,7 @@ lsfd_sources = files (
|
||||
'lsfd-sock-xinfo.c',
|
||||
'lsfd-unkn.c',
|
||||
'lsfd-fifo.c',
|
||||
+ 'lsfd-pidfd.c',
|
||||
)
|
||||
|
||||
uuidgen_sources = files(
|
||||
--
|
||||
2.45.0
|
||||
|
||||
@@ -1,186 +0,0 @@
|
||||
From: Xi Ruoyao <xry111@xry111.site>
|
||||
Date: Wed, 3 Apr 2024 15:46:57 +0800
|
||||
Subject: lsfd: Support pidfs
|
||||
Git-repo: https://github.com/util-linux/util-linux.git
|
||||
Git-commit: b1a48efd173c7f37d8df39a84eb25b4440335661
|
||||
Patch-mainline: yes
|
||||
References: kernel 6.9
|
||||
|
||||
In Linux 6.9 pidfds are moved from the anonymous inode infrastructure to
|
||||
a tiny pseudo filesystem named pidfs. Recognize it properly.
|
||||
|
||||
Fixes #2865.
|
||||
|
||||
Signed-off-by: Xi Ruoyao <xry111@xry111.site>
|
||||
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
|
||||
---
|
||||
misc-utils/lsfd-file.c | 96 ++++++++++++++++++++++++++++++++++++++++++
|
||||
misc-utils/lsfd.c | 3 ++
|
||||
misc-utils/lsfd.h | 7 ++-
|
||||
3 files changed, 105 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/misc-utils/lsfd-file.c b/misc-utils/lsfd-file.c
|
||||
index 9b91462d..3f330146 100644
|
||||
--- a/misc-utils/lsfd-file.c
|
||||
+++ b/misc-utils/lsfd-file.c
|
||||
@@ -45,6 +45,8 @@
|
||||
#include "procfs.h"
|
||||
|
||||
#include "lsfd.h"
|
||||
+#include "lsfd-pidfd.h"
|
||||
+#include "pidfd-utils.h"
|
||||
|
||||
static struct idcache *username_cache;
|
||||
|
||||
@@ -492,6 +494,22 @@ static unsigned long get_minor_for_mqueue(void)
|
||||
return minor(sb.st_dev);
|
||||
}
|
||||
|
||||
+static unsigned long get_minor_for_pidfs(void)
|
||||
+{
|
||||
+ int fd = pidfd_open(getpid(), 0);
|
||||
+ struct stat sb;
|
||||
+ unsigned long ret = 0;
|
||||
+
|
||||
+ if (fd < 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (fstat(fd, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFREG)
|
||||
+ ret = minor(sb.st_dev);
|
||||
+
|
||||
+ close(fd);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static void file_class_initialize(void)
|
||||
{
|
||||
unsigned long m;
|
||||
@@ -510,6 +528,10 @@ static void file_class_initialize(void)
|
||||
m = get_minor_for_mqueue();
|
||||
if (m)
|
||||
add_nodev(m, "mqueue");
|
||||
+
|
||||
+ m = get_minor_for_pidfs();
|
||||
+ if (m)
|
||||
+ add_nodev(m, "pidfs");
|
||||
}
|
||||
|
||||
static void file_class_finalize(void)
|
||||
@@ -783,3 +805,77 @@ const struct file_class mqueue_file_class = {
|
||||
.fill_column = mqueue_file_fill_column,
|
||||
.get_ipc_class = mqueue_file_get_ipc_class,
|
||||
};
|
||||
+
|
||||
+struct pidfs_file {
|
||||
+ struct file file;
|
||||
+ struct pidfd_data data;
|
||||
+};
|
||||
+
|
||||
+static void init_pidfs_file_content(struct file *file)
|
||||
+{
|
||||
+ struct pidfs_file *pidfs_file = (struct pidfs_file *)file;
|
||||
+
|
||||
+ memset(&pidfs_file->data, 0, sizeof(pidfs_file->data));
|
||||
+}
|
||||
+
|
||||
+static int pidfs_file_handle_fdinfo(struct file *file, const char *key, const char *value)
|
||||
+{
|
||||
+ struct pidfs_file *pidfs_file = (struct pidfs_file *)file;
|
||||
+
|
||||
+ return pidfd_handle_fdinfo(&pidfs_file->data, key, value);
|
||||
+}
|
||||
+
|
||||
+static void pidfs_file_free_content(struct file *file)
|
||||
+{
|
||||
+ struct pidfs_file *pidfs_file = (struct pidfs_file *)file;
|
||||
+
|
||||
+ pidfd_free(&pidfs_file->data);
|
||||
+}
|
||||
+
|
||||
+static bool pidfs_file_fill_column(struct proc *proc __attribute__((__unused__)),
|
||||
+ struct file *file,
|
||||
+ struct libscols_line *ln,
|
||||
+ int column_id,
|
||||
+ size_t column_index)
|
||||
+{
|
||||
+ struct pidfs_file *pidfs_file = (struct pidfs_file *)file;
|
||||
+ char *buf = NULL;
|
||||
+
|
||||
+ switch(column_id) {
|
||||
+ case COL_TYPE:
|
||||
+ if (scols_line_set_data(ln, column_index, "pidfd"))
|
||||
+ err(EXIT_FAILURE, _("failed to add output data"));
|
||||
+ return true;
|
||||
+ case COL_NAME:
|
||||
+ buf = pidfd_get_name(&pidfs_file->data);
|
||||
+ break;
|
||||
+ default:
|
||||
+ if (!pidfd_fill_column(&pidfs_file->data, column_id, &buf))
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ if (buf &&
|
||||
+ scols_line_refer_data(ln, column_index, buf))
|
||||
+ err(EXIT_FAILURE, _("failed to add output data"));
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+const struct file_class pidfs_file_class = {
|
||||
+ .super = &file_class,
|
||||
+ .size = sizeof(struct pidfs_file),
|
||||
+ .initialize_content = init_pidfs_file_content,
|
||||
+ .handle_fdinfo = pidfs_file_handle_fdinfo,
|
||||
+ .fill_column = pidfs_file_fill_column,
|
||||
+ .free_content = pidfs_file_free_content,
|
||||
+};
|
||||
+
|
||||
+bool is_pidfs_dev(dev_t dev)
|
||||
+{
|
||||
+ const char *fs = get_nodev_filesystem(minor(dev));
|
||||
+
|
||||
+ if (fs && (strcmp (fs, "pidfs") == 0))
|
||||
+ return true;
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
diff --git a/misc-utils/lsfd.c b/misc-utils/lsfd.c
|
||||
index 98820ee8..01e88d51 100644
|
||||
--- a/misc-utils/lsfd.c
|
||||
+++ b/misc-utils/lsfd.c
|
||||
@@ -683,6 +683,9 @@ static const struct file_class *stat2class(struct stat *sb)
|
||||
if (is_mqueue_dev(dev))
|
||||
return &mqueue_file_class;
|
||||
|
||||
+ if (is_pidfs_dev(dev))
|
||||
+ return &pidfs_file_class;
|
||||
+
|
||||
return &file_class;
|
||||
default:
|
||||
break;
|
||||
diff --git a/misc-utils/lsfd.h b/misc-utils/lsfd.h
|
||||
index e646758c..f0f17d5b 100644
|
||||
--- a/misc-utils/lsfd.h
|
||||
+++ b/misc-utils/lsfd.h
|
||||
@@ -228,7 +228,7 @@ struct file_class {
|
||||
};
|
||||
|
||||
extern const struct file_class file_class, cdev_class, bdev_class, sock_class, unkn_class, fifo_class,
|
||||
- nsfs_file_class, mqueue_file_class;
|
||||
+ nsfs_file_class, mqueue_file_class, pidfs_file_class;
|
||||
|
||||
/*
|
||||
* IPC
|
||||
@@ -307,4 +307,9 @@ bool is_mqueue_dev(dev_t dev);
|
||||
*/
|
||||
bool is_multiplexed_by_eventpoll(int fd, struct list_head *eventpolls);
|
||||
|
||||
+/*
|
||||
+ * Pidfs
|
||||
+ */
|
||||
+bool is_pidfs_dev(dev_t dev);
|
||||
+
|
||||
#endif /* UTIL_LINUX_LSFD_H */
|
||||
--
|
||||
2.45.0
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
From: Xi Ruoyao <xry111@xry111.site>
|
||||
Date: Thu, 28 Mar 2024 04:01:02 +0800
|
||||
Subject: lsfd: test: Adapt test cases for pidfs
|
||||
Git-repo: https://github.com/util-linux/util-linux.git
|
||||
Git-commit: 04db2ba9008e9635286b1aafc8ecd9533a0a91bf
|
||||
Patch-mainline: yes
|
||||
References: kernel 6.9
|
||||
|
||||
On Linux >= 6.9, pidfds are from pidfs instead of anonymous inode.
|
||||
Thus:
|
||||
|
||||
STTYPE is REG on Linux >= 6.9, UNKN on Linux < 6.9.
|
||||
|
||||
KNAME is pidfd:[inode number] on Linux >= 6.9, anon_inode:[pidfd] on
|
||||
Linux < 6.9.
|
||||
|
||||
And ainode_class test cannot work on Linux >= 6.9, just skip this sub
|
||||
test if STTYPE is REG.
|
||||
|
||||
Signed-off-by: Xi Ruoyao <xry111@xry111.site>
|
||||
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
|
||||
---
|
||||
tests/expected/lsfd/column-name-pidfd | 2 +-
|
||||
tests/expected/lsfd/column-type-pidfd | 2 +-
|
||||
tests/expected/lsfd/mkfds-pidfd | 2 +-
|
||||
tests/ts/lsfd/column-ainodeclass | 8 ++++++++
|
||||
tests/ts/lsfd/column-name | 7 +++++++
|
||||
tests/ts/lsfd/column-type | 7 +++++++
|
||||
tests/ts/lsfd/mkfds-pidfd | 4 ++++
|
||||
7 files changed, 29 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/tests/expected/lsfd/column-name-pidfd b/tests/expected/lsfd/column-name-pidfd
|
||||
index 10e3c5e7..68787d69 100644
|
||||
--- a/tests/expected/lsfd/column-name-pidfd
|
||||
+++ b/tests/expected/lsfd/column-name-pidfd
|
||||
@@ -1,2 +1,2 @@
|
||||
-3 anon_inode:[pidfd] pid=1 comm= nspid=1
|
||||
+3 [KNAME] pid=1 comm= nspid=1
|
||||
pidfd:ASSOC,KNAME,NAME: 0
|
||||
diff --git a/tests/expected/lsfd/column-type-pidfd b/tests/expected/lsfd/column-type-pidfd
|
||||
index 6c9a9632..a4379807 100644
|
||||
--- a/tests/expected/lsfd/column-type-pidfd
|
||||
+++ b/tests/expected/lsfd/column-type-pidfd
|
||||
@@ -1,2 +1,2 @@
|
||||
-3 UNKN pidfd
|
||||
+3 [STTYPE] pidfd
|
||||
pidfd:ASSOC,STTYPE,TYPE: 0
|
||||
diff --git a/tests/expected/lsfd/mkfds-pidfd b/tests/expected/lsfd/mkfds-pidfd
|
||||
index 94846992..bce4dd42 100644
|
||||
--- a/tests/expected/lsfd/mkfds-pidfd
|
||||
+++ b/tests/expected/lsfd/mkfds-pidfd
|
||||
@@ -1,2 +1,2 @@
|
||||
-3 UNKN anon_inodefs pid=1 comm=systemd nspid=1 systemd 1
|
||||
+3 [STTYPE] [SOURCE] pid=1 comm=systemd nspid=1 systemd 1
|
||||
ASSOC,STTYPE,SOURCE,NAME,PIDFD.COMM,PIDFD.PID: 0
|
||||
diff --git a/tests/ts/lsfd/column-ainodeclass b/tests/ts/lsfd/column-ainodeclass
|
||||
index 6829494f..ab2abebd 100755
|
||||
--- a/tests/ts/lsfd/column-ainodeclass
|
||||
+++ b/tests/ts/lsfd/column-ainodeclass
|
||||
@@ -42,10 +42,18 @@ for C in pidfd inotify; do
|
||||
fi
|
||||
wait "${MKFDS_PID}"
|
||||
} > "$TS_OUTPUT" 2>&1
|
||||
+
|
||||
if [ "$C-$?" == "pidfd-$TS_EXIT_NOTSUPP" ]; then
|
||||
ts_skip_subtest "pidfd_open(2) is not available"
|
||||
continue
|
||||
fi
|
||||
+
|
||||
+ STTYPE="$(head -n1 "$TS_OUTPUT" | awk '{print $2}')"
|
||||
+ if [ "$C-$STTYPE" == "pidfd-REG" ]; then
|
||||
+ ts_skip_subtest "pidfd is from pidfs instead of anon inode"
|
||||
+ continue
|
||||
+ fi
|
||||
+
|
||||
ts_finalize_subtest
|
||||
done
|
||||
|
||||
diff --git a/tests/ts/lsfd/column-name b/tests/ts/lsfd/column-name
|
||||
index 8bf8f421..9c67de88 100755
|
||||
--- a/tests/ts/lsfd/column-name
|
||||
+++ b/tests/ts/lsfd/column-name
|
||||
@@ -64,10 +64,17 @@ for C in ro-regular-file pidfd socketpair; do
|
||||
fi
|
||||
} > "$TS_OUTPUT" 2>&1
|
||||
wait "${MKFDS_PID}"
|
||||
+
|
||||
if [ "$C-$?" == "pidfd-$TS_EXIT_NOTSUPP" ]; then
|
||||
ts_skip_subtest "pidfd_open(2) is not available"
|
||||
continue
|
||||
fi
|
||||
+
|
||||
+ case $C in
|
||||
+ pidfd)
|
||||
+ sed -i -E 's/(pidfd|anon_inode):\[[a-zA-Z]+\]/[KNAME]/' "$TS_OUTPUT"
|
||||
+ esac
|
||||
+
|
||||
ts_finalize_subtest
|
||||
done
|
||||
|
||||
diff --git a/tests/ts/lsfd/column-type b/tests/ts/lsfd/column-type
|
||||
index 77bc5c94..1b8aa8c6 100755
|
||||
--- a/tests/ts/lsfd/column-type
|
||||
+++ b/tests/ts/lsfd/column-type
|
||||
@@ -50,10 +50,17 @@ for C in ro-regular-file pidfd inotify socketpair; do
|
||||
fi
|
||||
wait "${MKFDS_PID}"
|
||||
} > "$TS_OUTPUT" 2>&1
|
||||
+
|
||||
if [ "$C-$?" == "pidfd-$TS_EXIT_NOTSUPP" ]; then
|
||||
ts_skip_subtest "pidfd_open(2) is not available"
|
||||
continue
|
||||
fi
|
||||
+
|
||||
+ case $C in
|
||||
+ pidfd)
|
||||
+ sed -i -E 's/UNKN|REG/[STTYPE]/' "$TS_OUTPUT"
|
||||
+ esac
|
||||
+
|
||||
ts_finalize_subtest
|
||||
done
|
||||
|
||||
diff --git a/tests/ts/lsfd/mkfds-pidfd b/tests/ts/lsfd/mkfds-pidfd
|
||||
index c0fae4f7..9b0ff33c 100755
|
||||
--- a/tests/ts/lsfd/mkfds-pidfd
|
||||
+++ b/tests/ts/lsfd/mkfds-pidfd
|
||||
@@ -44,8 +44,12 @@ EXPR="(PID != ${TARGET}) and (FD == 3) and (PIDFD.PID == ${TARGET})"
|
||||
fi
|
||||
wait ${MKFDS_PID}
|
||||
} > $TS_OUTPUT 2>&1
|
||||
+
|
||||
if [ "$?" == "$TS_EXIT_NOTSUPP" ]; then
|
||||
ts_skip "pidfd_open(2) is not available"
|
||||
fi
|
||||
|
||||
+sed -i -E -e 's/UNKN|REG/[STTYPE]/' -e 's/pidfs|anon_inodefs/[SOURCE]/' \
|
||||
+ $TS_OUTPUT
|
||||
+
|
||||
ts_finalize
|
||||
--
|
||||
2.45.0
|
||||
|
||||
@@ -14,12 +14,11 @@ Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
libmount/src/context_mount.c | 41 ++++++++++++++++++++++++++++++++----
|
||||
1 file changed, 37 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libmount/src/context_mount.c b/libmount/src/context_mount.c
|
||||
index f914c9b..a48483f 100644
|
||||
--- a/libmount/src/context_mount.c
|
||||
+++ b/libmount/src/context_mount.c
|
||||
@@ -1423,6 +1423,32 @@ done:
|
||||
return rc;
|
||||
diff -ur util-linux-2.41.orig/libmount/src/context_mount.c util-linux-2.41/libmount/src/context_mount.c
|
||||
--- util-linux-2.41.orig/libmount/src/context_mount.c 2025-03-04 19:14:02.587173600 +0100
|
||||
+++ util-linux-2.41/libmount/src/context_mount.c 2025-04-08 14:03:59.173505340 +0200
|
||||
@@ -1469,6 +1469,32 @@
|
||||
}
|
||||
}
|
||||
|
||||
+/*
|
||||
@@ -51,7 +50,7 @@ index f914c9b..a48483f 100644
|
||||
int mnt_context_get_mount_excode(
|
||||
struct libmnt_context *cxt,
|
||||
int rc,
|
||||
@@ -1670,10 +1696,17 @@ int mnt_context_get_mount_excode(
|
||||
@@ -1772,10 +1798,17 @@
|
||||
case ENODEV:
|
||||
if (!buf)
|
||||
break;
|
||||
@@ -73,6 +72,3 @@ index f914c9b..a48483f 100644
|
||||
snprintf(buf, bufsz, _("unknown filesystem type"));
|
||||
break;
|
||||
|
||||
--
|
||||
2.19.2
|
||||
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAABCAAdFiEEsMZNFDAcxu+u32Dk5LcdXuw5woQFAmY4lxMACgkQ5LcdXuw5
|
||||
woSckw//ZmoxCcjdDBv5LkAK0Yl5EMKZYzkvqswsp/Uwllgevb/FcCGwZ+F49RM3
|
||||
H8F5Kj5CIJW9wh2UNWxaMm4MxcGd3eG2NEwgYh8RiXSS84zEL78yaIJLyFlPziMp
|
||||
kZb0fpc2HpyCzDrvtlw6S5TGkUUx2uFqTQQG7GFd6TOlbPpGp4OpqY3adf85mwmr
|
||||
NKy0XbYLo6sqGENz6Uklbf5Qhc19UEEc1jScOYNpkuCxhRQguxq3Jc6W8A8DQkjB
|
||||
EWaw9Q1XYDV3Bnd40F0K+bo3CYB6z3pMM51NlsYxV0fKt/SoEvJw3S7u3VcbtJWn
|
||||
S6xl6q/sMINDrMIpSL5PAAg5yoBNIIoWW7OxSh0nv6ctp9dmln0sKBtXNr09zTWT
|
||||
q9mLUt7LwXB6LT3XI64262vF21bKq/hQO8IObsx8vfPSlp1SyGq7VqGh6QVbkjx6
|
||||
2vA7ueV5jfIKiAlZAcXz6NHjwxcBqYq7wASeUEmYPgh5lb4HBOuOgatYBNAmQoxp
|
||||
2t5AXPPhI/u95GRa4WntpgqlQm/1CKA9kHiezvO4P0lnpUluT24DXclMTcq4xaiN
|
||||
ci+dzVF2EPRoPJgYy9crKNsr7dftVtvAVXIRk3UaTwDe1o7OK4vSykDc0PSNxsHQ
|
||||
mMabBuFt17oweonotSOZ8z7blHnCVnzZWVxyIxC3Pw/0ChHFAkw=
|
||||
=68JD
|
||||
-----END PGP SIGNATURE-----
|
||||
BIN
util-linux-2.40.1.tar.xz
LFS
BIN
util-linux-2.40.1.tar.xz
LFS
Binary file not shown.
16
util-linux-2.41.3.tar.sign
Normal file
16
util-linux-2.41.3.tar.sign
Normal file
@@ -0,0 +1,16 @@
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAABCAAdFiEEsMZNFDAcxu+u32Dk5LcdXuw5woQFAmlACmoACgkQ5LcdXuw5
|
||||
woRfcRAAgb63+iqbTk7oE5NHTJQ9LdbxVCIfViBRXNp+GlnWmnn5CC4XHcbudyqJ
|
||||
IbgfuFoM45BS0o2dF8EvBxyT0I3dODF9hU/Z/rZy0VtW68vlJYb7h6etIqiFPMj2
|
||||
O2lZTfqb93db2Rhx4/pxWBxQ9KM19sjYPnm4S4KNSuQKtLx3yg8X+dDejKk/sC2+
|
||||
+5Tsb1AVkCLodCWPUPs0RHnRtASb37b8hJVk26p++pVYnHUbNQyMuX8TUrcnyetp
|
||||
h4Rf+lYw4QxCOHdXSwusBHdZi3ukIXSVX47jKqFFEUFjUR/r4rGNYHt1vEdoZjjl
|
||||
I22l3AEuEJ9pFKUriCFxqPS6+1VZfR+DgJsMzwvaFmasMXJCJHMl3SxBoJeQGmgn
|
||||
EQO0q7jk6dHJpn5iHl+r+B8apNWSIEgn0TaIJ7otfknQ8LitHOqiFEvqCSzkwFXm
|
||||
NbFMlhJNlkIi5zdx+LExemedzegpv0lgOnDbl/0mVY4bsqFZVgbCqFs6+FL413Om
|
||||
XPaR6AgtSbo15FBoBjDS5xqbVfrMsxEQROnmMlyFWcR+d8znKAmqWGNZkfgXaPna
|
||||
3AYgAADAojLHKV9SeBT52jIyVarhjMOiC/CNRKlbNxAR5rDCb8WDPJGAAPzziVY9
|
||||
1Q5YarhmXRNGPmL2dlOLdJHlXHFtmpHD35bH6JADxiKHpYl7+4A=
|
||||
=PiZj
|
||||
-----END PGP SIGNATURE-----
|
||||
BIN
util-linux-2.41.3.tar.xz
LFS
Normal file
BIN
util-linux-2.41.3.tar.xz
LFS
Normal file
Binary file not shown.
78
util-linux-agetty-configs.patch
Normal file
78
util-linux-agetty-configs.patch
Normal file
@@ -0,0 +1,78 @@
|
||||
From d1cf7efb17869d0fdf132bb3581d9b74a459bb87 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Schubert <schubi@suse.de>
|
||||
Date: Wed, 17 Sep 2025 13:43:55 +0200
|
||||
Subject: [PATCH 2/8] agetty: using configs lib for parsing issue files
|
||||
|
||||
---
|
||||
term-utils/agetty.c | 39 +++++++++++++++++++++++----------------
|
||||
1 file changed, 23 insertions(+), 16 deletions(-)
|
||||
|
||||
Index: util-linux-2.41.2/term-utils/agetty.c
|
||||
===================================================================
|
||||
--- util-linux-2.41.2.orig/term-utils/agetty.c
|
||||
+++ util-linux-2.41.2/term-utils/agetty.c
|
||||
@@ -122,10 +122,11 @@
|
||||
#ifdef SYSV_STYLE
|
||||
# define ISSUE_SUPPORT
|
||||
# if defined(HAVE_SCANDIRAT) && defined(HAVE_OPENAT)
|
||||
+# include "configs.h"
|
||||
# include <dirent.h>
|
||||
# define ISSUEDIR_SUPPORT
|
||||
-# define ISSUEDIR_EXT ".issue"
|
||||
-# define ISSUEDIR_EXTSIZ (sizeof(ISSUEDIR_EXT) - 1)
|
||||
+# define ISSUEDIR_EXT "issue"
|
||||
+# define ISSUEDIR_EXTSIZ sizeof(ISSUEDIR_EXT)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
@@ -1683,7 +1684,7 @@ static int issuedir_filter(const struct
|
||||
|
||||
namesz = strlen(d->d_name);
|
||||
if (!namesz || namesz < ISSUEDIR_EXTSIZ + 1 ||
|
||||
- strcmp(d->d_name + (namesz - ISSUEDIR_EXTSIZ), ISSUEDIR_EXT) != 0)
|
||||
+ strcmp(d->d_name + (namesz - ISSUEDIR_EXTSIZ), "." ISSUEDIR_EXT) != 0)
|
||||
return 0;
|
||||
|
||||
/* Accept this */
|
||||
@@ -1930,22 +1931,28 @@ skip:
|
||||
goto done;
|
||||
}
|
||||
|
||||
- /* The default /etc/issue and optional /etc/issue.d directory as
|
||||
- * extension to the file. The /etc/issue.d directory is ignored if
|
||||
- * there is no /etc/issue file. The file may be empty or symlink.
|
||||
+#ifdef ISSUEDIR_SUPPORT
|
||||
+ struct list_head file_list;
|
||||
+ struct list_head *current = NULL;
|
||||
+ char *name = NULL;
|
||||
+
|
||||
+ /* Reading all issue files and concatinating all contents to one content.
|
||||
+ * The ordering rules are defineded in:
|
||||
+ * https://github.com/uapi-group/specifications/blob/main/specs/configuration_files_specification.md
|
||||
*/
|
||||
- if (access(_PATH_ISSUE, F_OK|R_OK) == 0) {
|
||||
- issuefile_read(ie, _PATH_ISSUE, op, tp);
|
||||
- issuedir_read(ie, _PATH_ISSUEDIR, op, tp);
|
||||
+ ul_configs_file_list(&file_list,
|
||||
+ NULL,
|
||||
+ _PATH_ETC_ISSUEDIR,
|
||||
+ _PATH_USR_ISSUEDIR,
|
||||
+ _PATH_ISSUE_FILENAME,
|
||||
+ ISSUEDIR_EXT);
|
||||
+
|
||||
+ while (ul_configs_next_filename(&file_list, ¤t, &name) == 0) {
|
||||
+ issuefile_read(ie, name, op, tp);
|
||||
}
|
||||
|
||||
- /* Fallback @runstatedir (usually /run) */
|
||||
- issuefile_read(ie, _PATH_RUNSTATEDIR "/" _PATH_ISSUE_FILENAME, op, tp);
|
||||
- issuedir_read(ie, _PATH_RUNSTATEDIR "/" _PATH_ISSUE_DIRNAME, op, tp);
|
||||
-
|
||||
- /* Fallback @sysconfstaticdir (usually /usr/lib)*/
|
||||
- issuefile_read(ie, _PATH_SYSCONFSTATICDIR "/" _PATH_ISSUE_FILENAME, op, tp);
|
||||
- issuedir_read(ie, _PATH_SYSCONFSTATICDIR "/" _PATH_ISSUE_DIRNAME, op, tp);
|
||||
+ ul_configs_free_list(&file_list);
|
||||
+#endif
|
||||
|
||||
done:
|
||||
if (ie->output) {
|
||||
139
util-linux-agetty-escape-erase.patch
Normal file
139
util-linux-agetty-escape-erase.patch
Normal file
@@ -0,0 +1,139 @@
|
||||
From b462fdefe74836c22cb02039dca419a512dc6c88 Mon Sep 17 00:00:00 2001
|
||||
From: Karel Zak <kzak@redhat.com>
|
||||
Date: Wed, 17 Sep 2025 12:58:59 +0200
|
||||
Subject: [PATCH] agetty: fix erasure of escape sequences and tab characters
|
||||
|
||||
When escape sequences (like arrow keys) or tab characters are entered
|
||||
at the login prompt, they are properly visualized but only partially
|
||||
erasable with backspace. This is because the erase logic assumes each
|
||||
stored character corresponds to one visual character, but escape
|
||||
sequences display as "^[" (2 chars) and tabs expand to multiple spaces.
|
||||
|
||||
Track visual character width for each stored byte in a parallel array.
|
||||
When erasing, use the stored visual width to properly erase all
|
||||
displayed characters for that input byte.
|
||||
|
||||
Fixes: https://github.com/util-linux/util-linux/issues/3624
|
||||
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||
---
|
||||
term-utils/agetty.c | 51 ++++++++++++++++++++++++++++++++++++---------
|
||||
1 file changed, 41 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/term-utils/agetty.c b/term-utils/agetty.c
|
||||
index 5e564c4f0..c6cb48081 100644
|
||||
--- a/term-utils/agetty.c
|
||||
+++ b/term-utils/agetty.c
|
||||
@@ -2131,20 +2131,30 @@ static void next_speed(struct options *op, struct termios *tp)
|
||||
tcsetattr(STDIN_FILENO, TCSANOW, tp);
|
||||
}
|
||||
|
||||
+/* Erase visual characters for one stored character */
|
||||
+static void erase_char(int visual_count, struct chardata *cp)
|
||||
+{
|
||||
+ static const char *const erase[] = { /* backspace-space-backspace */
|
||||
+ "\010\040\010", /* space parity */
|
||||
+ "\010\040\010", /* odd parity */
|
||||
+ "\210\240\210", /* even parity */
|
||||
+ "\210\240\210", /* no parity */
|
||||
+ };
|
||||
+ int i;
|
||||
+ for (i = 0; i < visual_count; i++)
|
||||
+ write_all(1, erase[cp->parity], 3);
|
||||
+}
|
||||
+
|
||||
/* Get user name, establish parity, speed, erase, kill & eol. */
|
||||
static char *get_logname(struct issue *ie, struct options *op, struct termios *tp, struct chardata *cp)
|
||||
{
|
||||
static char logname[BUFSIZ];
|
||||
+ static int visual_widths[BUFSIZ]; /* visual char count for each stored byte */
|
||||
char *bp;
|
||||
+ int *visual_bp;
|
||||
char c; /* input character, full eight bits */
|
||||
char ascval; /* low 7 bits of input character */
|
||||
int eightbit;
|
||||
- static const char *const erase[] = { /* backspace-space-backspace */
|
||||
- "\010\040\010", /* space parity */
|
||||
- "\010\040\010", /* odd parity */
|
||||
- "\210\240\210", /* even parity */
|
||||
- "\210\240\210", /* no parity */
|
||||
- };
|
||||
|
||||
/* Initialize kill, erase, parity etc. (also after switching speeds). */
|
||||
INIT_CHARDATA(cp);
|
||||
@@ -2158,7 +2168,11 @@ static char *get_logname(struct issue *ie, struct options *op, struct termios *t
|
||||
tcflush(STDIN_FILENO, TCIFLUSH);
|
||||
|
||||
eightbit = (op->flags & (F_EIGHTBITS|F_UTF8));
|
||||
+
|
||||
+ /* Initialize buffer pointers. visual_widths tracks how many visual
|
||||
+ * characters each stored byte represents (e.g. ESC = 2 for "^[", tab = 1-8 spaces) */
|
||||
bp = logname;
|
||||
+ visual_bp = visual_widths;
|
||||
*bp = '\0';
|
||||
|
||||
eval_issue_file(ie, op, tp);
|
||||
@@ -2182,6 +2196,7 @@ static char *get_logname(struct issue *ie, struct options *op, struct termios *t
|
||||
&& (op->flags & F_NOCLEAR) == 0)
|
||||
termio_clear(STDOUT_FILENO);
|
||||
bp = logname;
|
||||
+ visual_bp = visual_widths;
|
||||
*bp = '\0';
|
||||
continue;
|
||||
}
|
||||
@@ -2259,8 +2274,9 @@ static char *get_logname(struct issue *ie, struct options *op, struct termios *t
|
||||
cp->erase = ascval; /* set erase character */
|
||||
if (bp > logname) {
|
||||
if ((tp->c_lflag & ECHO) == 0)
|
||||
- write_all(1, erase[cp->parity], 3);
|
||||
+ erase_char(*(visual_bp - 1), cp);
|
||||
bp--;
|
||||
+ visual_bp--;
|
||||
}
|
||||
break;
|
||||
case CTL('U'):
|
||||
@@ -2272,8 +2288,9 @@ static char *get_logname(struct issue *ie, struct options *op, struct termios *t
|
||||
break;
|
||||
while (bp > logname) {
|
||||
if ((tp->c_lflag & ECHO) == 0)
|
||||
- write_all(1, erase[cp->parity], 3);
|
||||
+ erase_char(*(visual_bp - 1), cp);
|
||||
bp--;
|
||||
+ visual_bp--;
|
||||
}
|
||||
break;
|
||||
case CTL('D'):
|
||||
@@ -2283,15 +2300,29 @@ static char *get_logname(struct issue *ie, struct options *op, struct termios *t
|
||||
log_err(_("%s: input overrun"), op->tty);
|
||||
if ((tp->c_lflag & ECHO) == 0) {
|
||||
/* Visualize escape sequence instead of its execution */
|
||||
- if (ascval == CTL('['))
|
||||
+ if (ascval == CTL('[')) {
|
||||
/* Ideally it should be "\xe2\x90\x9b"
|
||||
* if (op->flags & (F_UTF8)),
|
||||
* but only some fonts contain it */
|
||||
write_all(1, "^[", 2);
|
||||
- else
|
||||
+ *visual_bp = 2; /* ESC shows as ^[ (2 chars) */
|
||||
+ } else if (ascval == '\t') {
|
||||
+ /* Tab expands to spaces */
|
||||
+ int pos = bp - logname;
|
||||
+ int spaces = 8 - (pos % 8);
|
||||
+ int i;
|
||||
+ for (i = 0; i < spaces; i++)
|
||||
+ write_all(1, " ", 1);
|
||||
+ *visual_bp = spaces;
|
||||
+ } else {
|
||||
write_all(1, &c, 1); /* echo the character */
|
||||
+ *visual_bp = 1; /* normal char shows as 1 */
|
||||
+ }
|
||||
+ } else {
|
||||
+ *visual_bp = 1; /* when echo is on, assume 1 char */
|
||||
}
|
||||
*bp++ = ascval; /* and store it */
|
||||
+ visual_bp++;
|
||||
break;
|
||||
}
|
||||
/* Everything was erased. */
|
||||
--
|
||||
2.48.1
|
||||
|
||||
69
util-linux-agetty-netlink-fix4.patch
Normal file
69
util-linux-agetty-netlink-fix4.patch
Normal file
@@ -0,0 +1,69 @@
|
||||
From fa9b5740f67bc64d7b58f9b2fcc4f2883d7dcc91 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislav Brabec <sbrabec@suse.cz>
|
||||
Date: Fri, 10 Oct 2025 13:17:26 +0200
|
||||
Subject: [PATCH 6/6] agetty: Process all data from ul_nl_process()
|
||||
|
||||
However select() normally triggers immediately after a partial read, it does not
|
||||
happen for netlink socket. It keeps unprocessed data until the next netlink
|
||||
message appears. It causes raising processing delays.
|
||||
|
||||
Always read all data. It also potentially decreases number of issue redraws.
|
||||
|
||||
Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
|
||||
---
|
||||
include/netlink.h | 6 +++++-
|
||||
term-utils/agetty.c | 14 +++++++++++---
|
||||
2 files changed, 16 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/include/netlink.h b/include/netlink.h
|
||||
index 3d7c3da04..ee4917b39 100644
|
||||
--- a/include/netlink.h
|
||||
+++ b/include/netlink.h
|
||||
@@ -40,7 +40,9 @@
|
||||
* reach unprocessed NLMSG_DONE */
|
||||
#define UL_NL_SOFT_ERROR 4 /* soft error, indicating a race condition or
|
||||
* message relating to events before program
|
||||
- * start); could be optionally ignored */
|
||||
+ * start); could be optionally ignored and it
|
||||
+ * should not considered as a reason to leave the
|
||||
+ * processing */
|
||||
|
||||
struct ul_nl_data;
|
||||
|
||||
@@ -139,6 +141,8 @@ int ul_nl_request_dump(struct ul_nl_data *nl, uint16_t nlmsg_type);
|
||||
/* Process netlink messages.
|
||||
* async: If true, return UL_NL_WOULDBLOCK immediately if there is no data
|
||||
* ready. If false, wait for a message.
|
||||
+ * NOTE: You should read all data until you get UL_NL_WOULDBLOCK, otherwise
|
||||
+ * select() will not trigger even if there is a netlink message.
|
||||
* loop: If true, run in a loop until NLMSG_DONE is received. Returns after
|
||||
* finishing a reply from ul_nl_request_dump(), otherwise it acts as an
|
||||
* infinite loop. If false, it returns after processing one message.
|
||||
diff --git a/term-utils/agetty.c b/term-utils/agetty.c
|
||||
index ec922bd11..08d009261 100644
|
||||
--- a/term-utils/agetty.c
|
||||
+++ b/term-utils/agetty.c
|
||||
@@ -1654,9 +1654,17 @@ static int wait_for_term_input(struct issue *ie, int fd)
|
||||
}
|
||||
|
||||
if (ie->nl.fd >= 0 && FD_ISSET(ie->nl.fd, &rfds)) {
|
||||
- /* We are ignoring errors here to prevent unability of
|
||||
- * further processing. */
|
||||
- ul_nl_process(&(ie->nl), UL_NL_ASYNC, UL_NL_ONESHOT);
|
||||
+ int rc;
|
||||
+
|
||||
+ /* We are looping until it returns UL_NL_WOULDBLOCK.
|
||||
+ * To prevent infinite loop, we are leaving on any other
|
||||
+ * error except UL_NL_SOFT_ERROR. To prevent unability
|
||||
+ * of further processing, we never exit. */
|
||||
+ do {
|
||||
+ rc = ul_nl_process(&(ie->nl), UL_NL_ASYNC,
|
||||
+ UL_NL_ONESHOT);
|
||||
+ }
|
||||
+ while (!rc || rc == UL_NL_SOFT_ERROR);
|
||||
|
||||
/* Just drain the inotify buffer */
|
||||
} else if (inotify_fd >= 0 && FD_ISSET(inotify_fd, &rfds)) {
|
||||
--
|
||||
2.48.1
|
||||
|
||||
636
util-linux-agetty-netlink.patch
Normal file
636
util-linux-agetty-netlink.patch
Normal file
@@ -0,0 +1,636 @@
|
||||
From b8b5030d792c0ffe51ee4a5925d43735b5d782d8 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislav Brabec <sbrabec@suse.cz>
|
||||
Date: Wed, 9 Jul 2025 14:35:28 +0200
|
||||
Subject: [PATCH 2/6] agetty: Implement netlink based IP processing
|
||||
|
||||
The current \4 and \6 issue file escapes implementation is inferior. It
|
||||
uses get getifaddrs() to get a list of IP addresses. This function does not
|
||||
provide enough information to discriminate between stable IP addresses and
|
||||
ephemeral addresses. As a result, especially \6 often gives unreliable
|
||||
results.
|
||||
|
||||
The code is actually unable to get list of all interfaces, so a proper out
|
||||
of the box IP address reporting depends on external tools that generate
|
||||
issue file with the interfaces list.
|
||||
|
||||
The netlink messages are already used, but only as a change notifier. The
|
||||
contents is not used, even if it contains exact information about the
|
||||
change. As a result, change processing is triggered even for unrelated
|
||||
network changes like IPv6 router advertisement.
|
||||
|
||||
The new implementation uses the new netaddrq library. It reports more
|
||||
reliable results especially for IPv6.
|
||||
|
||||
Additionally, two new escapes are implemented:
|
||||
|
||||
\a Report all interfaces and assigned addresses that are considered as
|
||||
reliable.
|
||||
|
||||
\A Report all interfaces and all assigned addresses.
|
||||
|
||||
TODO:
|
||||
|
||||
To prevent overflooding of the console, the list is currently limited to 12
|
||||
interfaces. It would be nice to make it configurable.
|
||||
|
||||
Two pass processing of issue files. First pass just collects IP protocols
|
||||
and list of interfaces (in future interface patterns). Now it always
|
||||
processes both IPv4 and IPv6 on all interfaces. Not so bad, as \a is smart
|
||||
enough to display just the useful part.
|
||||
|
||||
Maybe implement more options and formatting support for \a and \A.
|
||||
|
||||
Maybe implement interface filter globs or regexps for \a and \A. Still not
|
||||
so bad, as \a automatically skips interfaces without reliable addresses
|
||||
(e. g. lo or TUN).
|
||||
|
||||
Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
|
||||
---
|
||||
term-utils/agetty.8.adoc | 6 +
|
||||
term-utils/agetty.c | 417 ++++++++++++++++++++++-----------------
|
||||
2 files changed, 246 insertions(+), 177 deletions(-)
|
||||
|
||||
Index: util-linux-2.41.2/term-utils/agetty.8.adoc
|
||||
===================================================================
|
||||
--- util-linux-2.41.2.orig/term-utils/agetty.8.adoc
|
||||
+++ util-linux-2.41.2/term-utils/agetty.8.adoc
|
||||
@@ -247,6 +247,12 @@ Insert the IPv4 address of the specified
|
||||
6 or 6{_interface_}::
|
||||
The same as \4 but for IPv6.
|
||||
|
||||
+a::
|
||||
+Insert list of "good" IP addresses for all interfaces. It prints best candidates for remote login IP addresses: global and site addresses; if not available, temporary address with the longest lifetime, if not available, link address. Note that link addresses are printed with local interface name, but they has to be done with the interface name on the machine where they will be used.
|
||||
+
|
||||
+A::
|
||||
+Insert list of all IP addresses for all interfaces.
|
||||
+
|
||||
b::
|
||||
Insert the baudrate of the current line.
|
||||
|
||||
Index: util-linux-2.41.2/term-utils/agetty.c
|
||||
===================================================================
|
||||
--- util-linux-2.41.2.orig/term-utils/agetty.c
|
||||
+++ util-linux-2.41.2/term-utils/agetty.c
|
||||
@@ -32,10 +32,7 @@
|
||||
#include <langinfo.h>
|
||||
#include <grp.h>
|
||||
#include <pwd.h>
|
||||
-#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
-#include <ifaddrs.h>
|
||||
-#include <net/if.h>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#include "strutils.h"
|
||||
@@ -50,6 +47,9 @@
|
||||
#include "env.h"
|
||||
#include "path.h"
|
||||
#include "fileutils.h"
|
||||
+#ifdef AGETTY_RELOAD
|
||||
+#include "netaddrq.h"
|
||||
+#endif
|
||||
|
||||
#include "logindefs.h"
|
||||
|
||||
@@ -144,7 +144,6 @@
|
||||
# define AGETTY_RELOAD_FILENAME "/run/agetty.reload" /* trigger file */
|
||||
# define AGETTY_RELOAD_FDNONE -2 /* uninitialized fd */
|
||||
static int inotify_fd = AGETTY_RELOAD_FDNONE;
|
||||
-static int netlink_fd = AGETTY_RELOAD_FDNONE;
|
||||
static uint32_t netlink_groups;
|
||||
#endif
|
||||
|
||||
@@ -154,6 +153,7 @@ struct issue {
|
||||
size_t mem_sz;
|
||||
|
||||
#ifdef AGETTY_RELOAD
|
||||
+ struct ul_nl_data nl;
|
||||
char *mem_old;
|
||||
#endif
|
||||
unsigned int do_tcsetattr : 1,
|
||||
@@ -364,6 +364,7 @@ int main(int argc, char **argv)
|
||||
};
|
||||
struct issue issue = {
|
||||
.mem = NULL,
|
||||
+ .nl.fd = -1
|
||||
};
|
||||
char *login_argv[LOGIN_ARGV_MAX + 1];
|
||||
int login_argc = 0;
|
||||
@@ -1603,81 +1604,7 @@ done:
|
||||
}
|
||||
|
||||
#ifdef AGETTY_RELOAD
|
||||
-static void open_netlink(void)
|
||||
-{
|
||||
- struct sockaddr_nl addr = { 0, };
|
||||
- int sock;
|
||||
-
|
||||
- if (netlink_fd != AGETTY_RELOAD_FDNONE)
|
||||
- return;
|
||||
-
|
||||
- sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
|
||||
- if (sock >= 0) {
|
||||
- addr.nl_family = AF_NETLINK;
|
||||
- addr.nl_pid = getpid();
|
||||
- addr.nl_groups = netlink_groups;
|
||||
- if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
||||
- close(sock);
|
||||
- else
|
||||
- netlink_fd = sock;
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-static int process_netlink_msg(int *triggered)
|
||||
-{
|
||||
- char buf[4096];
|
||||
- struct sockaddr_nl snl;
|
||||
- struct nlmsghdr *h;
|
||||
- int rc;
|
||||
-
|
||||
- struct iovec iov = {
|
||||
- .iov_base = buf,
|
||||
- .iov_len = sizeof(buf)
|
||||
- };
|
||||
- struct msghdr msg = {
|
||||
- .msg_name = &snl,
|
||||
- .msg_namelen = sizeof(snl),
|
||||
- .msg_iov = &iov,
|
||||
- .msg_iovlen = 1,
|
||||
- .msg_control = NULL,
|
||||
- .msg_controllen = 0,
|
||||
- .msg_flags = 0
|
||||
- };
|
||||
-
|
||||
- rc = recvmsg(netlink_fd, &msg, MSG_DONTWAIT);
|
||||
- if (rc < 0) {
|
||||
- if (errno == EWOULDBLOCK || errno == EAGAIN)
|
||||
- return 0;
|
||||
-
|
||||
- /* Failure, just stop listening for changes */
|
||||
- close(netlink_fd);
|
||||
- netlink_fd = AGETTY_RELOAD_FDNONE;
|
||||
- return 0;
|
||||
- }
|
||||
-
|
||||
- for (h = (struct nlmsghdr *)buf; NLMSG_OK(h, (unsigned int)rc); h = NLMSG_NEXT(h, rc)) {
|
||||
- if (h->nlmsg_type == NLMSG_DONE ||
|
||||
- h->nlmsg_type == NLMSG_ERROR) {
|
||||
- close(netlink_fd);
|
||||
- netlink_fd = AGETTY_RELOAD_FDNONE;
|
||||
- return 0;
|
||||
- }
|
||||
-
|
||||
- *triggered = 1;
|
||||
- break;
|
||||
- }
|
||||
-
|
||||
- return 1;
|
||||
-}
|
||||
-
|
||||
-static int process_netlink(void)
|
||||
-{
|
||||
- int triggered = 0;
|
||||
- while (process_netlink_msg(&triggered));
|
||||
- return triggered;
|
||||
-}
|
||||
-
|
||||
-static int wait_for_term_input(int fd)
|
||||
+static int wait_for_term_input(struct issue *ie, int fd)
|
||||
{
|
||||
char buffer[sizeof(struct inotify_event) + NAME_MAX + 1];
|
||||
fd_set rfds;
|
||||
@@ -1711,9 +1638,9 @@ static int wait_for_term_input(int fd)
|
||||
FD_SET(inotify_fd, &rfds);
|
||||
nfds = max(nfds, inotify_fd);
|
||||
}
|
||||
- if (netlink_fd >= 0) {
|
||||
- FD_SET(netlink_fd, &rfds);
|
||||
- nfds = max(nfds, netlink_fd);
|
||||
+ if (ie->nl.fd >= 0) {
|
||||
+ FD_SET(ie->nl.fd, &rfds);
|
||||
+ nfds = max(nfds, ie->nl.fd);
|
||||
}
|
||||
|
||||
/* If waiting fails, just fall through, presumably reading input will fail */
|
||||
@@ -1725,9 +1652,10 @@ static int wait_for_term_input(int fd)
|
||||
|
||||
}
|
||||
|
||||
- if (netlink_fd >= 0 && FD_ISSET(netlink_fd, &rfds)) {
|
||||
- if (!process_netlink())
|
||||
- continue;
|
||||
+ if (ie->nl.fd >= 0 && FD_ISSET(ie->nl.fd, &rfds)) {
|
||||
+ /* We are ignoring errors here to prevent unability of
|
||||
+ * further processing. */
|
||||
+ ul_nl_process(&(ie->nl), UL_NL_ASYNC, UL_NL_ONESHOT);
|
||||
|
||||
/* Just drain the inotify buffer */
|
||||
} else if (inotify_fd >= 0 && FD_ISSET(inotify_fd, &rfds)) {
|
||||
@@ -1937,11 +1865,44 @@ static void eval_issue_file(struct issue
|
||||
struct options *op,
|
||||
struct termios *tp)
|
||||
{
|
||||
-#ifdef AGETTY_RELOAD
|
||||
- netlink_groups = 0;
|
||||
-#endif
|
||||
if (!(op->flags & F_ISSUE))
|
||||
goto done;
|
||||
+
|
||||
+#ifdef AGETTY_RELOAD
|
||||
+/* TODO:
|
||||
+ * Two pass processing for eval_issue_file()
|
||||
+ * Implement pass 1: Just evaluate list of netlink_groups (IP protocols) and
|
||||
+ * intefaces to monitor.
|
||||
+ * That is why again label is here: netlink_groups will be re-evaluated and
|
||||
+ * dump will be performed again.
|
||||
+ */
|
||||
+ /* netlink_groups = 0; */
|
||||
+ netlink_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR;
|
||||
+
|
||||
+ /* Already initialized? */
|
||||
+ if (ie->nl.fd >= 0)
|
||||
+ goto skip;
|
||||
+ /* Prepare netlink. */
|
||||
+ ul_nl_init(&(ie->nl));
|
||||
+ if ((ul_netaddrq_init(&(ie->nl), NULL, NULL, (void *)ie)))
|
||||
+ goto skip;
|
||||
+
|
||||
+ /* Open netlink and create address list. */
|
||||
+ if (ul_nl_open(&(ie->nl),
|
||||
+ RTMGRP_LINK | netlink_groups))
|
||||
+ goto skip;
|
||||
+ if (ul_nl_request_dump(&(ie->nl), RTM_GETADDR))
|
||||
+ goto error;
|
||||
+ if (ul_nl_process(&(ie->nl), UL_NL_SYNC, UL_NL_LOOP) != UL_NL_DONE)
|
||||
+ goto error;
|
||||
+ goto skip;
|
||||
+error:
|
||||
+ /* In case of any error, the addrq list is just empty, and we can use
|
||||
+ * the code without any error checking. */
|
||||
+ ul_nl_close(&(ie->nl));
|
||||
+ ie->nl.fd = -1;
|
||||
+skip:
|
||||
+#endif
|
||||
/*
|
||||
* The custom issue file or directory list specified by:
|
||||
* agetty --issue-file <path[:path]...>
|
||||
@@ -1986,11 +1947,6 @@ static void eval_issue_file(struct issue
|
||||
issuedir_read(ie, _PATH_SYSCONFSTATICDIR "/" _PATH_ISSUE_DIRNAME, op, tp);
|
||||
|
||||
done:
|
||||
-
|
||||
-#ifdef AGETTY_RELOAD
|
||||
- if (netlink_groups != 0)
|
||||
- open_netlink();
|
||||
-#endif
|
||||
if (ie->output) {
|
||||
fclose(ie->output);
|
||||
ie->output = NULL;
|
||||
@@ -2002,7 +1958,7 @@ done:
|
||||
*/
|
||||
static void show_issue(struct options *op)
|
||||
{
|
||||
- struct issue ie = { .output = NULL };
|
||||
+ struct issue ie = { .output = NULL, .nl.fd = -1 };
|
||||
struct termios tp;
|
||||
|
||||
memset(&tp, 0, sizeof(struct termios));
|
||||
@@ -2032,13 +1988,19 @@ again:
|
||||
puts(_("[press ENTER to login]"));
|
||||
#ifdef AGETTY_RELOAD
|
||||
/* reload issue */
|
||||
- if (!wait_for_term_input(STDIN_FILENO)) {
|
||||
+ if (!wait_for_term_input(ie, STDIN_FILENO)) {
|
||||
eval_issue_file(ie, op, tp);
|
||||
if (issue_is_changed(ie)) {
|
||||
if ((op->flags & F_VCONSOLE)
|
||||
&& (op->flags & F_NOCLEAR) == 0)
|
||||
termio_clear(STDOUT_FILENO);
|
||||
- goto again;
|
||||
+ {
|
||||
+ /* TODO: Close to set netlink_groups again using pass 1 */
|
||||
+ /* if (ie->nl.fd >= 0) ul_nl_close(&(ie->nl));
|
||||
+ * ie->nl.fd = -1; */
|
||||
+
|
||||
+ goto again;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -2168,7 +2130,7 @@ static char *get_logname(struct issue *i
|
||||
|
||||
no_reload:
|
||||
#ifdef AGETTY_RELOAD
|
||||
- if (!wait_for_term_input(STDIN_FILENO)) {
|
||||
+ if (!wait_for_term_input(ie, STDIN_FILENO)) {
|
||||
/* refresh prompt -- discard input data, clear terminal
|
||||
* and call do_prompt() again
|
||||
*/
|
||||
@@ -2177,6 +2139,8 @@ static char *get_logname(struct issue *i
|
||||
eval_issue_file(ie, op, tp);
|
||||
if (!issue_is_changed(ie))
|
||||
goto no_reload;
|
||||
+ /* if (ie->nl.fd >= 0) ul_nl_close(&(ie->nl));
|
||||
+ * ie->nl.fd = -1; */
|
||||
tcflush(STDIN_FILENO, TCIFLUSH);
|
||||
if ((op->flags & F_VCONSOLE)
|
||||
&& (op->flags & F_NOCLEAR) == 0)
|
||||
@@ -2576,92 +2540,170 @@ static void log_warn(const char *fmt, ..
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
-static void print_addr(struct issue *ie, sa_family_t family, void *addr)
|
||||
-{
|
||||
- char buff[INET6_ADDRSTRLEN + 1];
|
||||
+static void print_iface_best(struct issue *ie,
|
||||
+ const char *ifname,
|
||||
+ uint8_t ifa_family)
|
||||
+{
|
||||
+ struct ul_netaddrq_ip *best[__ULNETLINK_RATING_MAX];
|
||||
+ struct ul_netaddrq_iface *ifaceq;
|
||||
+ struct list_head *l;
|
||||
+ enum ul_netaddrq_ip_rating threshold;
|
||||
+
|
||||
+ if (!ie->nl.data_addr)
|
||||
+ return; /* error: init failed */
|
||||
|
||||
- inet_ntop(family, addr, buff, sizeof(buff));
|
||||
- fprintf(ie->output, "%s", buff);
|
||||
+ if ((ifaceq = ul_netaddrq_iface_by_name(&(ie->nl), ifname)))
|
||||
+ {
|
||||
+ memset(best, 0, sizeof(best));
|
||||
+ if (ifa_family == AF_INET)
|
||||
+ l = &(ifaceq->ip_quality_list_4);
|
||||
+ else
|
||||
+ /* if (ifa_family == AF_INET6) */
|
||||
+ l = &(ifaceq->ip_quality_list_6);
|
||||
+
|
||||
+ threshold =
|
||||
+ ul_netaddrq_iface_bestaddr(l, &best);
|
||||
+ if (best[threshold])
|
||||
+ fputs(ul_nl_addr_ntop_address(best[threshold]->addr),
|
||||
+ ie->output);
|
||||
+ }
|
||||
}
|
||||
|
||||
-/*
|
||||
- * Prints IP for the specified interface (@iface), if the interface is not
|
||||
- * specified then prints the "best" one (UP, RUNNING, non-LOOPBACK). If not
|
||||
- * found the "best" interface then prints at least host IP.
|
||||
- */
|
||||
-static void output_iface_ip(struct issue *ie,
|
||||
- struct ifaddrs *addrs,
|
||||
- const char *iface,
|
||||
- sa_family_t family)
|
||||
-{
|
||||
- struct ifaddrs *p;
|
||||
- struct addrinfo hints, *info = NULL;
|
||||
- char *host = NULL;
|
||||
- void *addr = NULL;
|
||||
+static void print_addrq_bestofall(struct issue *ie,
|
||||
+ uint8_t ifa_family)
|
||||
+{
|
||||
+ struct ul_netaddrq_iface *best_ifaceq;
|
||||
+ enum ul_netaddrq_ip_rating threshold;
|
||||
+ const char *best_ipp;
|
||||
|
||||
- if (!addrs)
|
||||
- return;
|
||||
+ if (!ie->nl.data_addr)
|
||||
+ return; /* error: init failed */
|
||||
|
||||
- for (p = addrs; p; p = p->ifa_next) {
|
||||
+ best_ipp = ul_netaddrq_get_best_ipp(&(ie->nl), ifa_family,
|
||||
+ &threshold, &best_ifaceq);
|
||||
+ if (best_ipp)
|
||||
+ fputs(best_ipp, ie->output);
|
||||
+}
|
||||
|
||||
- if (!p->ifa_name ||
|
||||
- !p->ifa_addr ||
|
||||
- p->ifa_addr->sa_family != family)
|
||||
- continue;
|
||||
+static void dump_iface_good(struct issue *ie,
|
||||
+ struct ul_netaddrq_iface *ifaceq)
|
||||
+{
|
||||
+ struct ul_netaddrq_ip *best4[__ULNETLINK_RATING_MAX];
|
||||
+ struct ul_netaddrq_ip *best6[__ULNETLINK_RATING_MAX];
|
||||
+ struct list_head *li;
|
||||
+ enum ul_netaddrq_ip_rating threshold = __ULNETLINK_RATING_MAX - 1;
|
||||
+ enum ul_netaddrq_ip_rating fthreshold; /* per family threshold */
|
||||
+ bool first = true;
|
||||
|
||||
- if (iface) {
|
||||
- /* Filter out by interface name */
|
||||
- if (strcmp(p->ifa_name, iface) != 0)
|
||||
- continue;
|
||||
- } else {
|
||||
- /* Select the "best" interface */
|
||||
- if ((p->ifa_flags & IFF_LOOPBACK) ||
|
||||
- !(p->ifa_flags & IFF_UP) ||
|
||||
- !(p->ifa_flags & IFF_RUNNING))
|
||||
- continue;
|
||||
- }
|
||||
+ memset(best4, 0, sizeof(best4));
|
||||
+ threshold = ul_netaddrq_iface_bestaddr(&(ifaceq->ip_quality_list_4),
|
||||
+ &best4);
|
||||
+ memset(best6, 0, sizeof(best6));
|
||||
+ fthreshold = ul_netaddrq_iface_bestaddr(&(ifaceq->ip_quality_list_6),
|
||||
+ &best6);
|
||||
+ if (fthreshold < threshold)
|
||||
+ threshold = fthreshold;
|
||||
|
||||
- addr = NULL;
|
||||
- switch (p->ifa_addr->sa_family) {
|
||||
- case AF_INET:
|
||||
- addr = &((struct sockaddr_in *) p->ifa_addr)->sin_addr;
|
||||
- break;
|
||||
- case AF_INET6:
|
||||
- addr = &((struct sockaddr_in6 *) p->ifa_addr)->sin6_addr;
|
||||
- break;
|
||||
- }
|
||||
+ list_for_each(li, &(ifaceq->ip_quality_list_4))
|
||||
+ {
|
||||
+ struct ul_netaddrq_ip *ipq;
|
||||
|
||||
- if (addr) {
|
||||
- print_addr(ie, family, addr);
|
||||
- return;
|
||||
+ ipq = list_entry(li, struct ul_netaddrq_ip, entry);
|
||||
+ if (threshold <= ULNETLINK_RATING_SCOPE_LINK &&
|
||||
+ ( ipq->quality <= threshold ||
|
||||
+ /* Consider site addresses equally good as global */
|
||||
+ ipq->quality == ULNETLINK_RATING_SCOPE_SITE) &&
|
||||
+ best4[threshold])
|
||||
+ {
|
||||
+ if (first)
|
||||
+ {
|
||||
+ fprintf(ie->output, "%s: ", ifaceq->ifname);
|
||||
+ first = false;
|
||||
+ }
|
||||
+ else
|
||||
+ fprintf(ie->output, " ");
|
||||
+ /* Write only the longest living temporary address */
|
||||
+ if (threshold == ULNETLINK_RATING_F_TEMPORARY)
|
||||
+ {
|
||||
+ fputs(ul_nl_addr_ntop_address(best4[ULNETLINK_RATING_F_TEMPORARY]->addr),
|
||||
+ ie->output);
|
||||
+ goto temp_cont4;
|
||||
+ }
|
||||
+ else
|
||||
+ fputs(ul_nl_addr_ntop_address(ipq->addr),
|
||||
+ ie->output);
|
||||
}
|
||||
+ temp_cont4:;
|
||||
}
|
||||
|
||||
- if (iface)
|
||||
- return;
|
||||
-
|
||||
- /* Hmm.. not found the best interface, print host IP at least */
|
||||
- memset(&hints, 0, sizeof(hints));
|
||||
- hints.ai_family = family;
|
||||
- if (family == AF_INET6)
|
||||
- hints.ai_flags = AI_V4MAPPED;
|
||||
+ list_for_each(li, &(ifaceq->ip_quality_list_6))
|
||||
+ {
|
||||
+ struct ul_netaddrq_ip *ipq;
|
||||
|
||||
- host = xgethostname();
|
||||
- if (host && getaddrinfo(host, NULL, &hints, &info) == 0 && info) {
|
||||
- switch (info->ai_family) {
|
||||
- case AF_INET:
|
||||
- addr = &((struct sockaddr_in *) info->ai_addr)->sin_addr;
|
||||
- break;
|
||||
- case AF_INET6:
|
||||
- addr = &((struct sockaddr_in6 *) info->ai_addr)->sin6_addr;
|
||||
- break;
|
||||
+ ipq = list_entry(li, struct ul_netaddrq_ip, entry);
|
||||
+ if (threshold <= ULNETLINK_RATING_SCOPE_LINK &&
|
||||
+ ( ipq->quality <= threshold ||
|
||||
+ /* Consider site addresses equally good as global */
|
||||
+ ipq->quality == ULNETLINK_RATING_SCOPE_SITE) &&
|
||||
+ best6[threshold])
|
||||
+ {
|
||||
+ if (first)
|
||||
+ {
|
||||
+ fprintf(ie->output, "%s: ", ifaceq->ifname);
|
||||
+ first = false;
|
||||
+ }
|
||||
+ else
|
||||
+ fprintf(ie->output, " ");
|
||||
+ /* Write only the longest living temporary address */
|
||||
+ if (threshold == ULNETLINK_RATING_F_TEMPORARY)
|
||||
+ {
|
||||
+ fputs(ul_nl_addr_ntop_address(best6[ULNETLINK_RATING_F_TEMPORARY]->addr),
|
||||
+ ie->output);
|
||||
+ goto temp_cont6;
|
||||
+ }
|
||||
+ else
|
||||
+ fputs(ul_nl_addr_ntop_address(ipq->addr),
|
||||
+ ie->output);
|
||||
}
|
||||
- if (addr)
|
||||
- print_addr(ie, family, addr);
|
||||
+ temp_cont6:;
|
||||
+ }
|
||||
+ if (!first)
|
||||
+ fputs("\n", ie->output);
|
||||
+}
|
||||
|
||||
- freeaddrinfo(info);
|
||||
+static void dump_iface_all(struct issue *ie,
|
||||
+ struct ul_netaddrq_iface *ifaceq)
|
||||
+{
|
||||
+ struct list_head *li;
|
||||
+ struct ul_netaddrq_ip *ipq;
|
||||
+ bool first = true;
|
||||
+
|
||||
+ list_for_each(li, &(ifaceq->ip_quality_list_4))
|
||||
+ {
|
||||
+ ipq = list_entry(li, struct ul_netaddrq_ip, entry);
|
||||
+ if (first)
|
||||
+ {
|
||||
+ fprintf(ie->output, "%s: ", ifaceq->ifname);
|
||||
+ first = false;
|
||||
+ }
|
||||
+ else
|
||||
+ fprintf(ie->output, " ");
|
||||
+ fputs(ul_nl_addr_ntop_address(ipq->addr), ie->output);
|
||||
+ }
|
||||
+ list_for_each(li, &(ifaceq->ip_quality_list_6))
|
||||
+ {
|
||||
+ ipq = list_entry(li, struct ul_netaddrq_ip, entry);
|
||||
+ if (first)
|
||||
+ {
|
||||
+ fprintf(ie->output, "%s: ", ifaceq->ifname);
|
||||
+ first = false;
|
||||
+ }
|
||||
+ else
|
||||
+ fprintf(ie->output, " ");
|
||||
+ fputs(ul_nl_addr_ntop_address(ipq->addr), ie->output);
|
||||
}
|
||||
- free(host);
|
||||
+ if (!first)
|
||||
+ fputs("\n", ie->output);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2860,26 +2902,47 @@ static void output_special_char(struct i
|
||||
case '4':
|
||||
case '6':
|
||||
{
|
||||
- sa_family_t family = c == '4' ? AF_INET : AF_INET6;
|
||||
- struct ifaddrs *addrs = NULL;
|
||||
- char iface[128];
|
||||
-
|
||||
- if (getifaddrs(&addrs))
|
||||
- break;
|
||||
+ char iface[IF_NAMESIZE];
|
||||
+ uint8_t ifa_family = c == '4' ? AF_INET : AF_INET6;
|
||||
|
||||
if (get_escape_argument(fp, iface, sizeof(iface)))
|
||||
- output_iface_ip(ie, addrs, iface, family);
|
||||
+ print_iface_best(ie, iface, ifa_family);
|
||||
else
|
||||
- output_iface_ip(ie, addrs, NULL, family);
|
||||
-
|
||||
- freeifaddrs(addrs);
|
||||
+ print_addrq_bestofall(ie, ifa_family);
|
||||
|
||||
+ /* TODO: Move to pass 1 */
|
||||
if (c == '4')
|
||||
netlink_groups |= RTMGRP_IPV4_IFADDR;
|
||||
else
|
||||
netlink_groups |= RTMGRP_IPV6_IFADDR;
|
||||
break;
|
||||
}
|
||||
+ case 'a':
|
||||
+ {
|
||||
+ struct list_head *li;
|
||||
+ struct ul_netaddrq_iface *ifaceq;
|
||||
+
|
||||
+ list_for_each_netaddrq_iface(li, &(ie->nl))
|
||||
+ {
|
||||
+ ifaceq = list_entry(li, struct ul_netaddrq_iface, entry);
|
||||
+
|
||||
+ dump_iface_good(ie, ifaceq);
|
||||
+ }
|
||||
+ }
|
||||
+ break;
|
||||
+ case 'A':
|
||||
+ {
|
||||
+ struct list_head *li;
|
||||
+ struct ul_netaddrq_iface *ifaceq;
|
||||
+
|
||||
+ list_for_each_netaddrq_iface(li, &(ie->nl))
|
||||
+ {
|
||||
+ ifaceq = list_entry(li, struct ul_netaddrq_iface, entry);
|
||||
+
|
||||
+ dump_iface_all(ie, ifaceq);
|
||||
+ }
|
||||
+ }
|
||||
+ break;
|
||||
#endif
|
||||
default:
|
||||
putc(c, ie->output);
|
||||
29
util-linux-lib-configs-fix1.patch
Normal file
29
util-linux-lib-configs-fix1.patch
Normal file
@@ -0,0 +1,29 @@
|
||||
From 16826c6675df3b6b28851c72f2dd1d194d3c7189 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Schubert <schubi@suse.de>
|
||||
Date: Wed, 1 Oct 2025 12:19:08 +0200
|
||||
Subject: [PATCH 3/8] Using fix issue dir path "/usr/lib" for agetty
|
||||
|
||||
---
|
||||
include/pathnames.h | 6 +-----
|
||||
1 file changed, 1 insertion(+), 5 deletions(-)
|
||||
|
||||
diff --git a/include/pathnames.h b/include/pathnames.h
|
||||
index 298d94973..80a0ee00a 100644
|
||||
--- a/include/pathnames.h
|
||||
+++ b/include/pathnames.h
|
||||
@@ -73,11 +73,7 @@
|
||||
|
||||
#define _PATH_ISSUE_FILENAME "issue"
|
||||
#define _PATH_ETC_ISSUEDIR "/etc"
|
||||
-#ifdef USE_VENDORDIR
|
||||
-# define _PATH_USR_ISSUEDIR _PATH_VENDORDIR
|
||||
-#else
|
||||
-# define _PATH_USR_ISSUEDIR "/usr/lib"
|
||||
-#endif
|
||||
+#define _PATH_USR_ISSUEDIR "/usr/lib"
|
||||
|
||||
#define _PATH_OS_RELEASE_ETC "/etc/os-release"
|
||||
#define _PATH_OS_RELEASE_USR "/usr/lib/os-release"
|
||||
--
|
||||
2.48.1
|
||||
|
||||
86
util-linux-lib-configs-fix2.patch
Normal file
86
util-linux-lib-configs-fix2.patch
Normal file
@@ -0,0 +1,86 @@
|
||||
From a7f5e5c9f9c00823e04e89e9030337239a5bd7b8 Mon Sep 17 00:00:00 2001
|
||||
From: Karel Zak <kzak@redhat.com>
|
||||
Date: Wed, 1 Oct 2025 14:42:39 +0200
|
||||
Subject: [PATCH 4/8] agetty: use standard path macros
|
||||
|
||||
- remove unnecessary issuefile-related stuff from include/pathnames.h
|
||||
- use standard _PATH_* macros
|
||||
|
||||
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||
---
|
||||
include/pathnames.h | 4 ----
|
||||
lib/configs.c | 4 +---
|
||||
term-utils/agetty.c | 10 ++++++----
|
||||
3 files changed, 7 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/include/pathnames.h b/include/pathnames.h
|
||||
index 80a0ee00a..036f365fd 100644
|
||||
--- a/include/pathnames.h
|
||||
+++ b/include/pathnames.h
|
||||
@@ -71,10 +71,6 @@
|
||||
# define _PATH_BTMP "/var/log/btmp"
|
||||
#endif
|
||||
|
||||
-#define _PATH_ISSUE_FILENAME "issue"
|
||||
-#define _PATH_ETC_ISSUEDIR "/etc"
|
||||
-#define _PATH_USR_ISSUEDIR "/usr/lib"
|
||||
-
|
||||
#define _PATH_OS_RELEASE_ETC "/etc/os-release"
|
||||
#define _PATH_OS_RELEASE_USR "/usr/lib/os-release"
|
||||
#define _PATH_NUMLOCK_ON _PATH_RUNSTATEDIR "/numlock-on"
|
||||
diff --git a/lib/configs.c b/lib/configs.c
|
||||
index b038844d2..0534c18ef 100644
|
||||
--- a/lib/configs.c
|
||||
+++ b/lib/configs.c
|
||||
@@ -16,8 +16,6 @@
|
||||
#include "list.h"
|
||||
#include "fileutils.h"
|
||||
|
||||
-#define DEFAULT_ETC_SUBDIR "/etc"
|
||||
-
|
||||
struct file_element {
|
||||
struct list_head file_list;
|
||||
char *filename;
|
||||
@@ -212,7 +210,7 @@ int ul_configs_file_list(struct list_head *file_list,
|
||||
|
||||
/* Default is /etc */
|
||||
if (!etc_subdir)
|
||||
- etc_subdir = DEFAULT_ETC_SUBDIR;
|
||||
+ etc_subdir = _PATH_SYSCONFDIR;
|
||||
|
||||
if (!usr_subdir)
|
||||
usr_subdir = "";
|
||||
diff --git a/term-utils/agetty.c b/term-utils/agetty.c
|
||||
index 3e0a4ec4f..31dbf2706 100644
|
||||
--- a/term-utils/agetty.c
|
||||
+++ b/term-utils/agetty.c
|
||||
@@ -1969,7 +1969,7 @@ static void eval_issue_file(struct issue *ie,
|
||||
goto done;
|
||||
}
|
||||
|
||||
-#ifdef ISSUEDIR_SUPPORT
|
||||
+#ifdef ISSUEDIR_SUPPORT
|
||||
struct list_head file_list;
|
||||
struct list_head *current = NULL;
|
||||
char *name = NULL;
|
||||
@@ -1977,12 +1977,14 @@ static void eval_issue_file(struct issue *ie,
|
||||
/* Reading all issue files and concatinating all contents to one content.
|
||||
* The ordering rules are defineded in:
|
||||
* https://github.com/uapi-group/specifications/blob/main/specs/configuration_files_specification.md
|
||||
+ *
|
||||
+ * Note that _PATH_RUNSTATEDIR (/run) is always read by ul_configs_file_list().
|
||||
*/
|
||||
ul_configs_file_list(&file_list,
|
||||
NULL,
|
||||
- _PATH_ETC_ISSUEDIR,
|
||||
- _PATH_USR_ISSUEDIR,
|
||||
- _PATH_ISSUE_FILENAME,
|
||||
+ _PATH_SYSCONFDIR,
|
||||
+ _PATH_SYSCONFSTATICDIR,
|
||||
+ "issue",
|
||||
ISSUEDIR_EXT);
|
||||
|
||||
while (ul_configs_next_filename(&file_list, ¤t, &name) == 0) {
|
||||
--
|
||||
2.48.1
|
||||
|
||||
41
util-linux-lib-configs-fix3.patch
Normal file
41
util-linux-lib-configs-fix3.patch
Normal file
@@ -0,0 +1,41 @@
|
||||
From dc1e88ff93f40f2f8093fcf35bda615a9384edcd Mon Sep 17 00:00:00 2001
|
||||
From: Karel Zak <kzak@redhat.com>
|
||||
Date: Wed, 1 Oct 2025 14:39:01 +0200
|
||||
Subject: [PATCH 5/8] build-sys: make sure _PATH_SYSCONFDIR is defined
|
||||
|
||||
The autotools and meson define $sysconfdir, but this variable is not
|
||||
accessible for compiler. Fix it.
|
||||
|
||||
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||
---
|
||||
Makefile.am | 1 +
|
||||
meson.build | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
diff --git a/Makefile.am b/Makefile.am
|
||||
index 01e99701d..dd78a5345 100644
|
||||
--- a/Makefile.am
|
||||
+++ b/Makefile.am
|
||||
@@ -4,6 +4,7 @@ AM_CPPFLAGS = \
|
||||
-DLOCALEDIR=\"$(localedir)\" \
|
||||
-D_PATH_RUNSTATEDIR=\"${runstatedir}\" \
|
||||
-D_PATH_LOCALSTATEDIR=\"${localstatedir}\" \
|
||||
+ -D_PATH_SYSCONFDIR=\"${sysconfdir}\" \
|
||||
-D_PATH_SYSCONFSTATICDIR=\"${sysconfstaticdir}\"
|
||||
|
||||
if USE_VENDORDIR
|
||||
diff --git a/meson.build b/meson.build
|
||||
index c9d1e188e..cdaca47ee 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -73,6 +73,7 @@ conf.set('sysconfdir', sysconfdir)
|
||||
conf.set('usrbin_execdir', usrbin_exec_dir)
|
||||
conf.set('usrsbin_execdir', usrsbin_exec_dir)
|
||||
conf.set('docdir', docdir)
|
||||
+conf.set_quoted('_PATH_SYSCONFDIR', sysconfdir)
|
||||
conf.set_quoted('_PATH_SYSCONFSTATICDIR', sysconfstaticdir)
|
||||
conf.set_quoted('_PATH_RUNSTATEDIR', runstatedir)
|
||||
conf.set_quoted('_PATH_LOCALSTATEDIR', localstatedir)
|
||||
--
|
||||
2.48.1
|
||||
|
||||
108
util-linux-lib-configs-fix4.patch
Normal file
108
util-linux-lib-configs-fix4.patch
Normal file
@@ -0,0 +1,108 @@
|
||||
From 03066584f148a8429386c4a928d093913b3e85e2 Mon Sep 17 00:00:00 2001
|
||||
From: Karel Zak <kzak@redhat.com>
|
||||
Date: Wed, 1 Oct 2025 14:53:41 +0200
|
||||
Subject: [PATCH 6/8] lib/configs: improve readability
|
||||
|
||||
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||
---
|
||||
include/configs.h | 5 +++--
|
||||
lib/configs.c | 16 ++++++++++------
|
||||
2 files changed, 13 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/include/configs.h b/include/configs.h
|
||||
index 783c10e30..ea72afacc 100644
|
||||
--- a/include/configs.h
|
||||
+++ b/include/configs.h
|
||||
@@ -3,7 +3,8 @@
|
||||
* it what you wish.
|
||||
*
|
||||
* Evaluting a list of configuration filenames which have to be handled/parsed.
|
||||
- * The order of this file list has been defined by
|
||||
+ *
|
||||
+ * The order of this file list has been defined by
|
||||
* https://github.com/uapi-group/specifications/blob/main/specs/configuration_files_specification.md
|
||||
*/
|
||||
|
||||
@@ -89,4 +90,4 @@ int ul_configs_next_filename(struct list_head *file_list,
|
||||
struct list_head **current_entry,
|
||||
char **name);
|
||||
|
||||
-#endif
|
||||
+#endif /* UTIL_LINUX_CONFIGS_H */
|
||||
diff --git a/lib/configs.c b/lib/configs.c
|
||||
index 0534c18ef..a5d714f23 100644
|
||||
--- a/lib/configs.c
|
||||
+++ b/lib/configs.c
|
||||
@@ -12,6 +12,7 @@
|
||||
#if defined(HAVE_SCANDIRAT) && defined(HAVE_OPENAT)
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
+
|
||||
#include "configs.h"
|
||||
#include "list.h"
|
||||
#include "fileutils.h"
|
||||
@@ -21,8 +22,8 @@ struct file_element {
|
||||
char *filename;
|
||||
};
|
||||
|
||||
-/* Checking for main configuration file
|
||||
- *
|
||||
+/* Checking for main configuration file
|
||||
+ *
|
||||
* Returning absolute path or NULL if not found
|
||||
* The return value has to be freed by the caller.
|
||||
*/
|
||||
@@ -34,7 +35,7 @@ static char *main_configs(const char *root,
|
||||
bool found = false;
|
||||
char *path = NULL;
|
||||
struct stat st;
|
||||
-
|
||||
+
|
||||
if (config_suffix) {
|
||||
if (asprintf(&path, "%s/%s/%s.%s", root, project, config_name, config_suffix) < 0)
|
||||
return NULL;
|
||||
@@ -179,7 +180,7 @@ finish:
|
||||
return counter;
|
||||
}
|
||||
|
||||
-#endif
|
||||
+#endif /* HAVE_SCANDIRAT */
|
||||
|
||||
static void free_list_entry(struct file_element *element)
|
||||
{
|
||||
@@ -187,7 +188,6 @@ static void free_list_entry(struct file_element *element)
|
||||
free(element);
|
||||
}
|
||||
|
||||
-
|
||||
int ul_configs_file_list(struct list_head *file_list,
|
||||
const char *project,
|
||||
const char *etc_subdir,
|
||||
@@ -201,7 +201,7 @@ int ul_configs_file_list(struct list_head *file_list,
|
||||
struct list_head *etc_entry = NULL, *usr_entry = NULL;
|
||||
struct file_element *add_element = NULL, *usr_element = NULL, *etc_element = NULL;
|
||||
int counter = 0;
|
||||
-
|
||||
+
|
||||
INIT_LIST_HEAD(file_list);
|
||||
|
||||
if (!config_name){
|
||||
@@ -256,11 +256,15 @@ int ul_configs_file_list(struct list_head *file_list,
|
||||
#endif
|
||||
|
||||
list_for_each(etc_entry, &etc_file_list) {
|
||||
+
|
||||
etc_element = list_entry(etc_entry, struct file_element, file_list);
|
||||
etc_basename = ul_basename(etc_element->filename);
|
||||
+
|
||||
list_for_each(usr_entry, &usr_file_list) {
|
||||
+
|
||||
usr_element = list_entry(usr_entry, struct file_element, file_list);
|
||||
usr_basename = ul_basename(usr_element->filename);
|
||||
+
|
||||
if (strcmp(usr_basename, etc_basename) <= 0) {
|
||||
if (strcmp(usr_basename, etc_basename) < 0) {
|
||||
add_element = new_list_entry(usr_element->filename);
|
||||
--
|
||||
2.48.1
|
||||
|
||||
35
util-linux-lib-configs-fix5.patch
Normal file
35
util-linux-lib-configs-fix5.patch
Normal file
@@ -0,0 +1,35 @@
|
||||
From ec71160db85acde32a9eca5fb238c82d6a6e52cb Mon Sep 17 00:00:00 2001
|
||||
From: Karel Zak <kzak@redhat.com>
|
||||
Date: Thu, 2 Oct 2025 11:55:55 +0200
|
||||
Subject: [PATCH 7/8] lib/configs: initialize FD to -1
|
||||
|
||||
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||
---
|
||||
lib/configs.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/lib/configs.c b/lib/configs.c
|
||||
index a5d714f23..d40743198 100644
|
||||
--- a/lib/configs.c
|
||||
+++ b/lib/configs.c
|
||||
@@ -107,7 +107,7 @@ static int read_dir(struct list_head *file_list,
|
||||
char *dirname = NULL;
|
||||
char *filename = NULL;
|
||||
struct stat st;
|
||||
- int dd = 0, nfiles = 0, i;
|
||||
+ int dd = -1, nfiles = 0, i;
|
||||
int counter = 0;
|
||||
struct dirent **namelist = NULL;
|
||||
struct file_element *entry = NULL;
|
||||
@@ -175,7 +175,7 @@ finish:
|
||||
free(namelist[i]);
|
||||
free(namelist);
|
||||
free(dirname);
|
||||
- if (dd > 0)
|
||||
+ if (dd >= 0)
|
||||
close(dd);
|
||||
return counter;
|
||||
}
|
||||
--
|
||||
2.48.1
|
||||
|
||||
166
util-linux-lib-configs-fix6.patch
Normal file
166
util-linux-lib-configs-fix6.patch
Normal file
@@ -0,0 +1,166 @@
|
||||
From 6e723400a384c39f0df709b17af43e51c0a4f505 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Schubert <schubi@suse.de>
|
||||
Date: Tue, 7 Oct 2025 17:24:37 +0200
|
||||
Subject: [PATCH 8/8] parsing /run/issue.d/* too
|
||||
|
||||
---
|
||||
lib/configs.c | 82 ++++++++++++++++++++++++++++++++++++++++++++-------
|
||||
1 file changed, 72 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/lib/configs.c b/lib/configs.c
|
||||
index d40743198..09bfffb66 100644
|
||||
--- a/lib/configs.c
|
||||
+++ b/lib/configs.c
|
||||
@@ -195,11 +195,15 @@ int ul_configs_file_list(struct list_head *file_list,
|
||||
const char *config_name,
|
||||
const char *config_suffix)
|
||||
{
|
||||
- char *filename = NULL, *usr_basename = NULL, *etc_basename = NULL;
|
||||
+ char *filename = NULL, *run_basename = NULL, *usr_basename = NULL,
|
||||
+ *etc_basename = NULL, *etc_run_basename = NULL;
|
||||
struct list_head etc_file_list;
|
||||
+ struct list_head run_file_list;
|
||||
+ struct list_head etc_run_file_list;
|
||||
struct list_head usr_file_list;
|
||||
- struct list_head *etc_entry = NULL, *usr_entry = NULL;
|
||||
- struct file_element *add_element = NULL, *usr_element = NULL, *etc_element = NULL;
|
||||
+ struct list_head *etc_entry = NULL, *usr_entry = NULL, *run_entry = NULL, *etc_run_entry = NULL;
|
||||
+ struct file_element *add_element = NULL, *usr_element = NULL,
|
||||
+ *run_element = NULL, *etc_element = NULL, *etc_run_element = NULL;
|
||||
int counter = 0;
|
||||
|
||||
INIT_LIST_HEAD(file_list);
|
||||
@@ -235,38 +239,94 @@ int ul_configs_file_list(struct list_head *file_list,
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&etc_file_list);
|
||||
+ INIT_LIST_HEAD(&run_file_list);
|
||||
+ INIT_LIST_HEAD(&etc_run_file_list);
|
||||
INIT_LIST_HEAD(&usr_file_list);
|
||||
|
||||
#if defined(HAVE_SCANDIRAT) && defined(HAVE_OPENAT)
|
||||
- int ret_usr = 0, ret_etc = 0;
|
||||
+ int ret_usr = 0, ret_etc = 0, ret_run = 0;
|
||||
ret_etc = read_dir(&etc_file_list,
|
||||
project,
|
||||
etc_subdir,
|
||||
config_name,
|
||||
config_suffix);
|
||||
+ ret_run = read_dir(&run_file_list,
|
||||
+ project,
|
||||
+ _PATH_RUNSTATEDIR,
|
||||
+ config_name,
|
||||
+ config_suffix);
|
||||
ret_usr = read_dir(&usr_file_list,
|
||||
project,
|
||||
usr_subdir,
|
||||
config_name,
|
||||
config_suffix);
|
||||
- if (ret_etc == -ENOMEM || ret_usr == -ENOMEM) {
|
||||
+ if (ret_etc == -ENOMEM || ret_usr == -ENOMEM || ret_run == -ENOMEM) {
|
||||
counter = -ENOMEM;
|
||||
goto finish;
|
||||
}
|
||||
#endif
|
||||
|
||||
+ /* Merging run and etc list in the correct order. Output: etc_run_list */
|
||||
list_for_each(etc_entry, &etc_file_list) {
|
||||
|
||||
etc_element = list_entry(etc_entry, struct file_element, file_list);
|
||||
etc_basename = ul_basename(etc_element->filename);
|
||||
|
||||
+ list_for_each(run_entry, &run_file_list) {
|
||||
+
|
||||
+ run_element = list_entry(run_entry, struct file_element, file_list);
|
||||
+ run_basename = ul_basename(run_element->filename);
|
||||
+
|
||||
+ if (strcmp(run_basename, etc_basename) <= 0) {
|
||||
+ if (strcmp(run_basename, etc_basename) < 0) {
|
||||
+ add_element = new_list_entry(run_element->filename);
|
||||
+ if (add_element == NULL) {
|
||||
+ counter = -ENOMEM;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+ list_add_tail(&add_element->file_list, &etc_run_file_list);
|
||||
+ counter++;
|
||||
+ }
|
||||
+ list_del(&run_element->file_list);
|
||||
+ } else {
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ add_element = new_list_entry(etc_element->filename);
|
||||
+ if (add_element == NULL) {
|
||||
+ counter = -ENOMEM;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+ list_add_tail(&add_element->file_list, &etc_run_file_list);
|
||||
+ counter++;
|
||||
+ }
|
||||
+
|
||||
+ /* taking the rest of /run */
|
||||
+ list_for_each(run_entry, &run_file_list) {
|
||||
+ run_element = list_entry(run_entry, struct file_element, file_list);
|
||||
+ add_element = new_list_entry(run_element->filename);
|
||||
+ if (add_element == NULL) {
|
||||
+ counter = -ENOMEM;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+ list_add_tail(&add_element->file_list, &etc_run_file_list);
|
||||
+ counter++;
|
||||
+ }
|
||||
+
|
||||
+ /* Merging etc_run list and var list in the correct order. Output: file_list
|
||||
+ which will be returned. */
|
||||
+ list_for_each(etc_run_entry, &etc_run_file_list) {
|
||||
+
|
||||
+ etc_run_element = list_entry(etc_run_entry, struct file_element, file_list);
|
||||
+ etc_run_basename = ul_basename(etc_run_element->filename);
|
||||
+
|
||||
list_for_each(usr_entry, &usr_file_list) {
|
||||
|
||||
usr_element = list_entry(usr_entry, struct file_element, file_list);
|
||||
usr_basename = ul_basename(usr_element->filename);
|
||||
|
||||
- if (strcmp(usr_basename, etc_basename) <= 0) {
|
||||
- if (strcmp(usr_basename, etc_basename) < 0) {
|
||||
+ if (strcmp(usr_basename, etc_run_basename) <= 0) {
|
||||
+ if (strcmp(usr_basename, etc_run_basename) < 0) {
|
||||
add_element = new_list_entry(usr_element->filename);
|
||||
if (add_element == NULL) {
|
||||
counter = -ENOMEM;
|
||||
@@ -280,7 +340,7 @@ int ul_configs_file_list(struct list_head *file_list,
|
||||
break;
|
||||
}
|
||||
}
|
||||
- add_element = new_list_entry(etc_element->filename);
|
||||
+ add_element = new_list_entry(etc_run_element->filename);
|
||||
if (add_element == NULL) {
|
||||
counter = -ENOMEM;
|
||||
goto finish;
|
||||
@@ -303,6 +363,7 @@ int ul_configs_file_list(struct list_head *file_list,
|
||||
|
||||
finish:
|
||||
ul_configs_free_list(&etc_file_list);
|
||||
+ ul_configs_free_list(&etc_run_file_list);
|
||||
ul_configs_free_list(&usr_file_list);
|
||||
|
||||
return counter;
|
||||
@@ -319,11 +380,12 @@ int ul_configs_next_filename(struct list_head *file_list,
|
||||
{
|
||||
struct file_element *element = NULL;
|
||||
|
||||
- if (*current_entry == file_list)
|
||||
+ if (list_empty(file_list) || *current_entry == file_list)
|
||||
return 1;
|
||||
|
||||
if (*current_entry == NULL)
|
||||
- *current_entry = file_list;
|
||||
+ *current_entry = file_list->next;
|
||||
+
|
||||
element = list_entry(*current_entry, struct file_element, file_list);
|
||||
*name = element->filename;
|
||||
*current_entry = (*current_entry)->next;
|
||||
--
|
||||
2.48.1
|
||||
|
||||
512
util-linux-lib-configs.patch
Normal file
512
util-linux-lib-configs.patch
Normal file
@@ -0,0 +1,512 @@
|
||||
From 4109f4bfefff9e6cd65815399af3eab2b0a59104 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Schubert <schubi@suse.de>
|
||||
Date: Wed, 17 Sep 2025 13:40:29 +0200
|
||||
Subject: [PATCH 1/8] libcommon: added lib "configs" for parsing configuration
|
||||
files in the correct order
|
||||
|
||||
---
|
||||
include/Makemodule.am | 3 +-
|
||||
include/configs.h | 92 ++++++++++++
|
||||
include/pathnames.h | 10 +-
|
||||
lib/Makemodule.am | 3 +-
|
||||
lib/configs.c | 330 ++++++++++++++++++++++++++++++++++++++++++
|
||||
lib/meson.build | 1 +
|
||||
6 files changed, 433 insertions(+), 6 deletions(-)
|
||||
create mode 100644 include/configs.h
|
||||
create mode 100644 lib/configs.c
|
||||
|
||||
diff --git a/include/Makemodule.am b/include/Makemodule.am
|
||||
index 59ecc793f..bc2c73415 100644
|
||||
--- a/include/Makemodule.am
|
||||
+++ b/include/Makemodule.am
|
||||
@@ -83,4 +83,5 @@ dist_noinst_HEADERS += \
|
||||
include/ttyutils.h \
|
||||
include/widechar.h \
|
||||
include/xalloc.h \
|
||||
- include/xxhash.h
|
||||
+ include/xxhash.h \
|
||||
+ include/configs.h
|
||||
diff --git a/include/configs.h b/include/configs.h
|
||||
new file mode 100644
|
||||
index 000000000..783c10e30
|
||||
--- /dev/null
|
||||
+++ b/include/configs.h
|
||||
@@ -0,0 +1,92 @@
|
||||
+/*
|
||||
+ * No copyright is claimed. This code is in the public domain; do with
|
||||
+ * it what you wish.
|
||||
+ *
|
||||
+ * Evaluting a list of configuration filenames which have to be handled/parsed.
|
||||
+ * The order of this file list has been defined by
|
||||
+ * https://github.com/uapi-group/specifications/blob/main/specs/configuration_files_specification.md
|
||||
+ */
|
||||
+
|
||||
+#ifndef UTIL_LINUX_CONFIGS_H
|
||||
+#define UTIL_LINUX_CONFIGS_H
|
||||
+
|
||||
+#include "list.h"
|
||||
+
|
||||
+/**
|
||||
+ * ul_configs_file_list - Evaluting a list of sorted configuration filenames which have to be handled
|
||||
+ * in the correct order.
|
||||
+ *
|
||||
+ * @file_list: List of filenames which have to be parsed in that order
|
||||
+ * @project: name of the project used as subdirectory, can be NULL
|
||||
+ * @etc_subdir: absolute directory path for user changed configuration files, can be NULL (default "/etc").
|
||||
+ * @usr_subdir: absolute directory path of vendor defined settings (often "/usr/lib").
|
||||
+ * @config_name: basename of the configuration file. If it is NULL, drop-ins without a main configuration file will be parsed only.
|
||||
+ * @config_suffix: suffix of the configuration file. Can also be NULL.
|
||||
+ *
|
||||
+ * Returns the length of the file_list, or -ENOMEM, or -ENOTEMPTY if config_name is NULL
|
||||
+ *
|
||||
+ * Example:
|
||||
+ * int count = 0;
|
||||
+ * struct list_head *file_list;
|
||||
+ *
|
||||
+ * count = ul_configs_file_list(&file_list,
|
||||
+ * "foo",
|
||||
+ * "/etc",
|
||||
+ * "/usr/lib",
|
||||
+ * "example",
|
||||
+ * "conf");
|
||||
+ *
|
||||
+ * The order of this file list has been defined by
|
||||
+ * https://github.com/uapi-group/specifications/blob/main/specs/configuration_files_specification.md
|
||||
+ *
|
||||
+ */
|
||||
+int ul_configs_file_list(struct list_head *file_list,
|
||||
+ const char *project,
|
||||
+ const char *etc_subdir,
|
||||
+ const char *usr_subdir,
|
||||
+ const char *config_name,
|
||||
+ const char *config_suffix);
|
||||
+
|
||||
+
|
||||
+/**
|
||||
+ * ul_configs_free_list - Freeing configuration list.
|
||||
+ *
|
||||
+ * @file_list: List of filenames which has to be freed.
|
||||
+ *
|
||||
+ */
|
||||
+void ul_configs_free_list(struct list_head *file_list);
|
||||
+
|
||||
+
|
||||
+/**
|
||||
+ * ul_configs_next_filename - Going through the file list which has to be handled/parsed.
|
||||
+ *
|
||||
+ * @file_list: List of filenames which have to be handled.
|
||||
+ * @current_entry: Current list entry. Has to be initialized with NULL for the first call.
|
||||
+ * @name: Returned file name for each call.
|
||||
+ *
|
||||
+ * Returns 0 on success, <0 on error and 1 if the end of the list has been reached.
|
||||
+ *
|
||||
+ * Example:
|
||||
+ * int count = 0;
|
||||
+ * struct list_head *file_list = NULL;
|
||||
+ * struct list_head *current = NULL;
|
||||
+ * char *name = NULL;
|
||||
+ *
|
||||
+ * count = ul_configs_file_list(&file_list,
|
||||
+ * "foo",
|
||||
+ * "/etc",
|
||||
+ * "/usr/lib",
|
||||
+ * "example",
|
||||
+ * "conf");
|
||||
+ *
|
||||
+ * while (ul_configs_next_filename(&file_list, ¤t, &name) == 0)
|
||||
+ * printf("filename: %s\n", name);
|
||||
+ *
|
||||
+ * ul_configs_free_list(&file_list);
|
||||
+ *
|
||||
+ */
|
||||
+int ul_configs_next_filename(struct list_head *file_list,
|
||||
+ struct list_head **current_entry,
|
||||
+ char **name);
|
||||
+
|
||||
+#endif
|
||||
diff --git a/include/pathnames.h b/include/pathnames.h
|
||||
index 0f9944f89..298d94973 100644
|
||||
--- a/include/pathnames.h
|
||||
+++ b/include/pathnames.h
|
||||
@@ -72,10 +72,12 @@
|
||||
#endif
|
||||
|
||||
#define _PATH_ISSUE_FILENAME "issue"
|
||||
-#define _PATH_ISSUE_DIRNAME _PATH_ISSUE_FILENAME ".d"
|
||||
-
|
||||
-#define _PATH_ISSUE "/etc/" _PATH_ISSUE_FILENAME
|
||||
-#define _PATH_ISSUEDIR "/etc/" _PATH_ISSUE_DIRNAME
|
||||
+#define _PATH_ETC_ISSUEDIR "/etc"
|
||||
+#ifdef USE_VENDORDIR
|
||||
+# define _PATH_USR_ISSUEDIR _PATH_VENDORDIR
|
||||
+#else
|
||||
+# define _PATH_USR_ISSUEDIR "/usr/lib"
|
||||
+#endif
|
||||
|
||||
#define _PATH_OS_RELEASE_ETC "/etc/os-release"
|
||||
#define _PATH_OS_RELEASE_USR "/usr/lib/os-release"
|
||||
diff --git a/lib/Makemodule.am b/lib/Makemodule.am
|
||||
index a60810d7d..84ab3e3ae 100644
|
||||
--- a/lib/Makemodule.am
|
||||
+++ b/lib/Makemodule.am
|
||||
@@ -40,7 +40,8 @@ libcommon_la_SOURCES = \
|
||||
lib/strv.c \
|
||||
lib/timeutils.c \
|
||||
lib/ttyutils.c \
|
||||
- lib/xxhash.c
|
||||
+ lib/xxhash.c \
|
||||
+ lib/configs.c
|
||||
|
||||
if LINUX
|
||||
libcommon_la_SOURCES += \
|
||||
diff --git a/lib/configs.c b/lib/configs.c
|
||||
new file mode 100644
|
||||
index 000000000..b038844d2
|
||||
--- /dev/null
|
||||
+++ b/lib/configs.c
|
||||
@@ -0,0 +1,330 @@
|
||||
+/*
|
||||
+ * configs_file.c instantiates functions defined and described in configs_file.h
|
||||
+ */
|
||||
+#include <err.h>
|
||||
+#include <errno.h>
|
||||
+#include <sys/syslog.h>
|
||||
+#include <sys/stat.h>
|
||||
+#include <stdbool.h>
|
||||
+#include <string.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <stdio.h>
|
||||
+#if defined(HAVE_SCANDIRAT) && defined(HAVE_OPENAT)
|
||||
+#include <dirent.h>
|
||||
+#endif
|
||||
+#include "configs.h"
|
||||
+#include "list.h"
|
||||
+#include "fileutils.h"
|
||||
+
|
||||
+#define DEFAULT_ETC_SUBDIR "/etc"
|
||||
+
|
||||
+struct file_element {
|
||||
+ struct list_head file_list;
|
||||
+ char *filename;
|
||||
+};
|
||||
+
|
||||
+/* Checking for main configuration file
|
||||
+ *
|
||||
+ * Returning absolute path or NULL if not found
|
||||
+ * The return value has to be freed by the caller.
|
||||
+ */
|
||||
+static char *main_configs(const char *root,
|
||||
+ const char *project,
|
||||
+ const char *config_name,
|
||||
+ const char *config_suffix)
|
||||
+{
|
||||
+ bool found = false;
|
||||
+ char *path = NULL;
|
||||
+ struct stat st;
|
||||
+
|
||||
+ if (config_suffix) {
|
||||
+ if (asprintf(&path, "%s/%s/%s.%s", root, project, config_name, config_suffix) < 0)
|
||||
+ return NULL;
|
||||
+ if (stat(path, &st) == 0) {
|
||||
+ found = true;
|
||||
+ } else {
|
||||
+ free(path);
|
||||
+ path = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+ if (!found) {
|
||||
+ /* trying filename without suffix */
|
||||
+ if (asprintf(&path, "%s/%s/%s", root, project, config_name) < 0)
|
||||
+ return NULL;
|
||||
+ if (stat(path, &st) != 0) {
|
||||
+ /* not found */
|
||||
+ free(path);
|
||||
+ path = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+ return path;
|
||||
+}
|
||||
+
|
||||
+static struct file_element *new_list_entry(const char *filename)
|
||||
+{
|
||||
+ struct file_element *file_element = calloc(1, sizeof(*file_element));
|
||||
+
|
||||
+ if (file_element == NULL)
|
||||
+ return NULL;
|
||||
+
|
||||
+ INIT_LIST_HEAD(&file_element->file_list);
|
||||
+
|
||||
+ if (filename != NULL) {
|
||||
+ file_element->filename = strdup(filename);
|
||||
+ if (file_element->filename == NULL) {
|
||||
+ free(file_element);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ } else {
|
||||
+ file_element->filename = NULL;
|
||||
+ }
|
||||
+
|
||||
+ return file_element;
|
||||
+}
|
||||
+
|
||||
+#if defined(HAVE_SCANDIRAT) && defined(HAVE_OPENAT)
|
||||
+
|
||||
+static int filter(const struct dirent *d)
|
||||
+{
|
||||
+#ifdef _DIRENT_HAVE_D_TYPE
|
||||
+ if (d->d_type != DT_UNKNOWN && d->d_type != DT_REG &&
|
||||
+ d->d_type != DT_LNK)
|
||||
+ return 0;
|
||||
+#endif
|
||||
+ if (*d->d_name == '.')
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Accept this */
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+static int read_dir(struct list_head *file_list,
|
||||
+ const char *project,
|
||||
+ const char *root,
|
||||
+ const char *config_name,
|
||||
+ const char *config_suffix)
|
||||
+{
|
||||
+ bool found = false;
|
||||
+ char *dirname = NULL;
|
||||
+ char *filename = NULL;
|
||||
+ struct stat st;
|
||||
+ int dd = 0, nfiles = 0, i;
|
||||
+ int counter = 0;
|
||||
+ struct dirent **namelist = NULL;
|
||||
+ struct file_element *entry = NULL;
|
||||
+
|
||||
+ if (config_suffix) {
|
||||
+ if (asprintf(&dirname, "%s/%s/%s.%s.d",
|
||||
+ root, project, config_name, config_suffix) < 0)
|
||||
+ return -ENOMEM;
|
||||
+ if (stat(dirname, &st) == 0) {
|
||||
+ found = true;
|
||||
+ } else {
|
||||
+ free(dirname);
|
||||
+ dirname = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+ if (!found) {
|
||||
+ /* trying path without suffix */
|
||||
+ if (asprintf(&dirname, "%s/%s/%s.d", root, project, config_name) < 0)
|
||||
+ return -ENOMEM;
|
||||
+ if (stat(dirname, &st) != 0) {
|
||||
+ /* not found */
|
||||
+ free(dirname);
|
||||
+ dirname = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (dirname==NULL)
|
||||
+ goto finish;
|
||||
+
|
||||
+ dd = open(dirname, O_RDONLY|O_CLOEXEC|O_DIRECTORY);
|
||||
+ if (dd < 0)
|
||||
+ goto finish;
|
||||
+
|
||||
+ nfiles = scandirat(dd, ".", &namelist, filter, alphasort);
|
||||
+ if (nfiles <= 0)
|
||||
+ goto finish;
|
||||
+
|
||||
+ for (i = 0; i < nfiles; i++) {
|
||||
+ struct dirent *d = namelist[i];
|
||||
+ size_t namesz = strlen(d->d_name);
|
||||
+ if (config_suffix && strlen(config_suffix) > 0 &&
|
||||
+ (!namesz || namesz < strlen(config_suffix) + 1 ||
|
||||
+ strcmp(d->d_name + (namesz - strlen(config_suffix)), config_suffix) != 0)) {
|
||||
+ /* filename does not have requested suffix */
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ if (asprintf(&filename, "%s/%s", dirname, d->d_name) < 0) {
|
||||
+ counter = -ENOMEM;
|
||||
+ break;
|
||||
+ }
|
||||
+ entry = new_list_entry(filename);
|
||||
+ free(filename);
|
||||
+ if (entry == NULL) {
|
||||
+ counter = -ENOMEM;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ list_add_tail(&entry->file_list, file_list);
|
||||
+ counter++;
|
||||
+ }
|
||||
+
|
||||
+finish:
|
||||
+ for (i = 0; i < nfiles; i++)
|
||||
+ free(namelist[i]);
|
||||
+ free(namelist);
|
||||
+ free(dirname);
|
||||
+ if (dd > 0)
|
||||
+ close(dd);
|
||||
+ return counter;
|
||||
+}
|
||||
+
|
||||
+#endif
|
||||
+
|
||||
+static void free_list_entry(struct file_element *element)
|
||||
+{
|
||||
+ free(element->filename);
|
||||
+ free(element);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+int ul_configs_file_list(struct list_head *file_list,
|
||||
+ const char *project,
|
||||
+ const char *etc_subdir,
|
||||
+ const char *usr_subdir,
|
||||
+ const char *config_name,
|
||||
+ const char *config_suffix)
|
||||
+{
|
||||
+ char *filename = NULL, *usr_basename = NULL, *etc_basename = NULL;
|
||||
+ struct list_head etc_file_list;
|
||||
+ struct list_head usr_file_list;
|
||||
+ struct list_head *etc_entry = NULL, *usr_entry = NULL;
|
||||
+ struct file_element *add_element = NULL, *usr_element = NULL, *etc_element = NULL;
|
||||
+ int counter = 0;
|
||||
+
|
||||
+ INIT_LIST_HEAD(file_list);
|
||||
+
|
||||
+ if (!config_name){
|
||||
+ return -ENOTEMPTY;
|
||||
+ }
|
||||
+
|
||||
+ /* Default is /etc */
|
||||
+ if (!etc_subdir)
|
||||
+ etc_subdir = DEFAULT_ETC_SUBDIR;
|
||||
+
|
||||
+ if (!usr_subdir)
|
||||
+ usr_subdir = "";
|
||||
+
|
||||
+ if (!project)
|
||||
+ project = "";
|
||||
+
|
||||
+ /* Evaluating first "main" file which has to be parsed */
|
||||
+ /* in the following order : /etc /run /usr */
|
||||
+ filename = main_configs(etc_subdir, project, config_name, config_suffix);
|
||||
+ if (filename == NULL)
|
||||
+ filename = main_configs(_PATH_RUNSTATEDIR, project, config_name, config_suffix);
|
||||
+ if (filename == NULL)
|
||||
+ filename = main_configs(usr_subdir, project, config_name, config_suffix);
|
||||
+ if (filename != NULL) {
|
||||
+ add_element = new_list_entry(filename);
|
||||
+ free(filename);
|
||||
+ if (add_element == NULL)
|
||||
+ return -ENOMEM;
|
||||
+ list_add_tail(&add_element->file_list, file_list);
|
||||
+ counter++;
|
||||
+ }
|
||||
+
|
||||
+ INIT_LIST_HEAD(&etc_file_list);
|
||||
+ INIT_LIST_HEAD(&usr_file_list);
|
||||
+
|
||||
+#if defined(HAVE_SCANDIRAT) && defined(HAVE_OPENAT)
|
||||
+ int ret_usr = 0, ret_etc = 0;
|
||||
+ ret_etc = read_dir(&etc_file_list,
|
||||
+ project,
|
||||
+ etc_subdir,
|
||||
+ config_name,
|
||||
+ config_suffix);
|
||||
+ ret_usr = read_dir(&usr_file_list,
|
||||
+ project,
|
||||
+ usr_subdir,
|
||||
+ config_name,
|
||||
+ config_suffix);
|
||||
+ if (ret_etc == -ENOMEM || ret_usr == -ENOMEM) {
|
||||
+ counter = -ENOMEM;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
+ list_for_each(etc_entry, &etc_file_list) {
|
||||
+ etc_element = list_entry(etc_entry, struct file_element, file_list);
|
||||
+ etc_basename = ul_basename(etc_element->filename);
|
||||
+ list_for_each(usr_entry, &usr_file_list) {
|
||||
+ usr_element = list_entry(usr_entry, struct file_element, file_list);
|
||||
+ usr_basename = ul_basename(usr_element->filename);
|
||||
+ if (strcmp(usr_basename, etc_basename) <= 0) {
|
||||
+ if (strcmp(usr_basename, etc_basename) < 0) {
|
||||
+ add_element = new_list_entry(usr_element->filename);
|
||||
+ if (add_element == NULL) {
|
||||
+ counter = -ENOMEM;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+ list_add_tail(&add_element->file_list, file_list);
|
||||
+ counter++;
|
||||
+ }
|
||||
+ list_del(&usr_element->file_list);
|
||||
+ } else {
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ add_element = new_list_entry(etc_element->filename);
|
||||
+ if (add_element == NULL) {
|
||||
+ counter = -ENOMEM;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+ list_add_tail(&add_element->file_list, file_list);
|
||||
+ counter++;
|
||||
+ }
|
||||
+
|
||||
+ /* taking the rest of /usr */
|
||||
+ list_for_each(usr_entry, &usr_file_list) {
|
||||
+ usr_element = list_entry(usr_entry, struct file_element, file_list);
|
||||
+ add_element = new_list_entry(usr_element->filename);
|
||||
+ if (add_element == NULL) {
|
||||
+ counter = -ENOMEM;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+ list_add_tail(&add_element->file_list, file_list);
|
||||
+ counter++;
|
||||
+ }
|
||||
+
|
||||
+finish:
|
||||
+ ul_configs_free_list(&etc_file_list);
|
||||
+ ul_configs_free_list(&usr_file_list);
|
||||
+
|
||||
+ return counter;
|
||||
+}
|
||||
+
|
||||
+void ul_configs_free_list(struct list_head *file_list)
|
||||
+{
|
||||
+ list_free(file_list, struct file_element, file_list, free_list_entry);
|
||||
+}
|
||||
+
|
||||
+int ul_configs_next_filename(struct list_head *file_list,
|
||||
+ struct list_head **current_entry,
|
||||
+ char **name)
|
||||
+{
|
||||
+ struct file_element *element = NULL;
|
||||
+
|
||||
+ if (*current_entry == file_list)
|
||||
+ return 1;
|
||||
+
|
||||
+ if (*current_entry == NULL)
|
||||
+ *current_entry = file_list;
|
||||
+ element = list_entry(*current_entry, struct file_element, file_list);
|
||||
+ *name = element->filename;
|
||||
+ *current_entry = (*current_entry)->next;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/lib/meson.build b/lib/meson.build
|
||||
index d62af238b..70e2703d5 100644
|
||||
--- a/lib/meson.build
|
||||
+++ b/lib/meson.build
|
||||
@@ -29,6 +29,7 @@ lib_common_sources = '''
|
||||
timeutils.c
|
||||
ttyutils.c
|
||||
xxhash.c
|
||||
+ configs.c
|
||||
'''.split()
|
||||
|
||||
idcache_c = files('idcache.c')
|
||||
--
|
||||
2.48.1
|
||||
|
||||
48
util-linux-lib-netlink-fix1.patch
Normal file
48
util-linux-lib-netlink-fix1.patch
Normal file
@@ -0,0 +1,48 @@
|
||||
From a5db8d0a9ed63969381feeee1eb0c3b39d32876b Mon Sep 17 00:00:00 2001
|
||||
From: Stanislav Brabec <sbrabec@suse.cz>
|
||||
Date: Sun, 5 Oct 2025 02:29:00 +0200
|
||||
Subject: [PATCH 3/6] ul_nl_addr_dup(): Fix address comparison
|
||||
|
||||
When duplicating struct ul_nl_addr, set address to ifa_local, if it is set
|
||||
to ifa_local in the source. This fixes the address for PtP IPv4 network
|
||||
interfaces and avoids UL_NL_SOFT_ERROR during address removal.
|
||||
|
||||
Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
|
||||
---
|
||||
lib/netlink.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/lib/netlink.c b/lib/netlink.c
|
||||
index 3def42e50..f8ac2c4c8 100644
|
||||
--- a/lib/netlink.c
|
||||
+++ b/lib/netlink.c
|
||||
@@ -328,7 +328,7 @@ int ul_nl_close(struct ul_nl_data *nl) {
|
||||
return close(nl->fd);
|
||||
}
|
||||
|
||||
-struct ul_nl_addr *ul_nl_addr_dup (struct ul_nl_addr *addr) {
|
||||
+struct ul_nl_addr *ul_nl_addr_dup(struct ul_nl_addr *addr) {
|
||||
struct ul_nl_addr *newaddr;
|
||||
newaddr = calloc(1, sizeof(struct ul_nl_addr));
|
||||
if (!newaddr)
|
||||
@@ -348,7 +348,7 @@ struct ul_nl_addr *ul_nl_addr_dup (struct ul_nl_addr *addr) {
|
||||
memcpy(newaddr->ifa_local, addr->ifa_local,
|
||||
addr->ifa_local_len);
|
||||
}
|
||||
- if (&(addr->ifa_address) == &(addr->ifa_local))
|
||||
+ if (addr->address == addr->ifa_local)
|
||||
newaddr->address = newaddr->ifa_local;
|
||||
else
|
||||
newaddr->address = newaddr->ifa_address;
|
||||
@@ -360,7 +360,7 @@ error:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
-void ul_nl_addr_free (struct ul_nl_addr *addr) {
|
||||
+void ul_nl_addr_free(struct ul_nl_addr *addr) {
|
||||
if (addr) {
|
||||
free(addr->ifa_address);
|
||||
free(addr->ifa_local);
|
||||
--
|
||||
2.48.1
|
||||
|
||||
42
util-linux-lib-netlink-fix2.patch
Normal file
42
util-linux-lib-netlink-fix2.patch
Normal file
@@ -0,0 +1,42 @@
|
||||
From 030303e4b93b65a5172a0c80f9f864b06f76cb81 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislav Brabec <sbrabec@suse.cz>
|
||||
Date: Sun, 5 Oct 2025 02:53:17 +0200
|
||||
Subject: [PATCH 4/6] netlink process_addr(): Ignore UL_NL_SOFT_ERROR
|
||||
|
||||
UL_NL_SOFT_ERROR can be issued if kernel sends unpaired RTM_DELADDR. It
|
||||
should not happen, but it can happen due to race condition. And it happened
|
||||
in some kernel versions. It is not reason to exit the processing loop.
|
||||
|
||||
Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
|
||||
---
|
||||
lib/netlink.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/lib/netlink.c b/lib/netlink.c
|
||||
index f8ac2c4c8..3e58e17da 100644
|
||||
--- a/lib/netlink.c
|
||||
+++ b/lib/netlink.c
|
||||
@@ -130,7 +130,9 @@ static int process_addr(struct ul_nl_data *nl, struct nlmsghdr *nh)
|
||||
nl->addr.ifname = ifname;
|
||||
else
|
||||
{
|
||||
- /* There can be race, we do not return error here */
|
||||
+ /* There can be race, we do not return error here.
|
||||
+ * It also happens on RTM_DELADDR, as interface name could
|
||||
+ * disappear from kernel tables before we process it. */
|
||||
/* FIXME I18N: *"unknown"* is too generic. Use context. */
|
||||
/* TRANSLATORS: unknown network interface, maximum 15
|
||||
* (IF_NAMESIZE-1) bytes */
|
||||
@@ -289,7 +291,8 @@ int ul_nl_process(struct ul_nl_data *nl, bool async, bool loop)
|
||||
ul_debugobj(nl,
|
||||
"process_msg() returned %d",
|
||||
rc));
|
||||
- return rc;
|
||||
+ if (rc != UL_NL_SOFT_ERROR)
|
||||
+ return rc;
|
||||
}
|
||||
}
|
||||
if (!loop)
|
||||
--
|
||||
2.48.1
|
||||
|
||||
116
util-linux-lib-netlink-fix3.patch
Normal file
116
util-linux-lib-netlink-fix3.patch
Normal file
@@ -0,0 +1,116 @@
|
||||
From 60c5c0516e6ce52863b12343a1cd276423ab3bae Mon Sep 17 00:00:00 2001
|
||||
From: Stanislav Brabec <sbrabec@suse.cz>
|
||||
Date: Wed, 8 Oct 2025 01:14:32 +0200
|
||||
Subject: [PATCH 5/6] netaddrq: Fix crash if there are no IP addresses
|
||||
|
||||
If there are no IP addresses, ul_netaddrq_bestaddr() returns threshold
|
||||
ULNETLINK_RATING_BAD, but there were no addresses in the best array, and
|
||||
best_ifaceq remains unset, which caused crash. Setting the initial
|
||||
threshold to __ULNETLINK_RATING_MAX and checking for that value fixes that.
|
||||
And more, it also allows to accept IP addresses with ULNETLINK_RATING_BAD
|
||||
rating.
|
||||
|
||||
Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
|
||||
---
|
||||
include/netaddrq.h | 14 ++++++++++----
|
||||
lib/netaddrq.c | 10 +++++-----
|
||||
term-utils/agetty.c | 2 +-
|
||||
3 files changed, 16 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/include/netaddrq.h b/include/netaddrq.h
|
||||
index 6d5e655f5..d9c595f32 100644
|
||||
--- a/include/netaddrq.h
|
||||
+++ b/include/netaddrq.h
|
||||
@@ -94,8 +94,11 @@ ul_netaddrq_iface_bestaddr(struct list_head *ipq_list,
|
||||
* best_iface: interface where the best address was seen
|
||||
* best array: best ifa_valid lifetime seen per quality rating
|
||||
* return value: best rating seen
|
||||
- * Note: It can be needed to call it twice: once for ip_quality_list_4, once
|
||||
- * for ip_quality_list_6.
|
||||
+ * Notes:
|
||||
+ * - It can be needed to call it twice: once for ip_quality_list_4, once
|
||||
+ * for ip_quality_list_6.
|
||||
+ * - If no IP addresses are found, the function can return
|
||||
+ * _ULNETLINK_RATING_MAX!
|
||||
*/
|
||||
enum ul_netaddrq_ip_rating
|
||||
ul_netaddrq_bestaddr(struct ul_nl_data *nl,
|
||||
@@ -109,8 +112,11 @@ ul_netaddrq_bestaddr(struct ul_nl_data *nl,
|
||||
* return value: The best address as a string
|
||||
* threshold: The best rating ever seen.
|
||||
* best_ifaceq: The best rated interfece ever seen.
|
||||
- * Note: It can be needed to call it twice: once for AF_INET, once
|
||||
- * for AF_INET6.
|
||||
+ * Notes:
|
||||
+ * - It can be needed to call it twice: once for AF_INET, once
|
||||
+ * for AF_INET6.
|
||||
+ * - If the return value is NULL (i. e. there are no usable interfaces), then
|
||||
+ * *best_ifaceq remains unchanges and cannot be used.
|
||||
*/
|
||||
const char *ul_netaddrq_get_best_ipp(struct ul_nl_data *nl,
|
||||
uint8_t ifa_family,
|
||||
diff --git a/lib/netaddrq.c b/lib/netaddrq.c
|
||||
index 34431d8d3..1ce454aaf 100644
|
||||
--- a/lib/netaddrq.c
|
||||
+++ b/lib/netaddrq.c
|
||||
@@ -296,7 +296,7 @@ ul_netaddrq_iface_bestaddr(struct list_head *ipq_list,
|
||||
struct ul_netaddrq_ip *ipq;
|
||||
enum ul_netaddrq_ip_rating threshold;
|
||||
|
||||
- threshold = ULNETLINK_RATING_BAD;
|
||||
+ threshold = __ULNETLINK_RATING_MAX;
|
||||
list_for_each(li, ipq_list)
|
||||
{
|
||||
ipq = list_entry(li, struct ul_netaddrq_ip, entry);
|
||||
@@ -342,7 +342,7 @@ ul_netaddrq_bestaddr(struct ul_nl_data *nl,
|
||||
ipqo = offsetof(struct ul_netaddrq_iface, ip_quality_list_6);
|
||||
}
|
||||
|
||||
- threshold = ULNETLINK_RATING_BAD;
|
||||
+ threshold = __ULNETLINK_RATING_MAX;
|
||||
list_for_each(li, &(addrq->ifaces))
|
||||
{
|
||||
struct list_head *ipq_list;
|
||||
@@ -374,7 +374,7 @@ const char *ul_netaddrq_get_best_ipp(struct ul_nl_data *nl,
|
||||
|
||||
memset(best, 0, sizeof(best));
|
||||
*threshold = ul_netaddrq_bestaddr(nl, best_ifaceq, &best, ifa_family);
|
||||
- if (best[*threshold])
|
||||
+ if (*threshold != __ULNETLINK_RATING_MAX)
|
||||
return ul_nl_addr_ntop_address(best[*threshold]->addr);
|
||||
return NULL;
|
||||
}
|
||||
@@ -423,7 +423,7 @@ static void dump_iface_best(struct ul_nl_data *nl,
|
||||
memset(best, 0, sizeof(best));
|
||||
threshold = ul_netaddrq_iface_bestaddr(&(ifaceq->ip_quality_list_4),
|
||||
&best);
|
||||
- if (best[threshold])
|
||||
+ if (threshold != __ULNETLINK_RATING_MAX)
|
||||
{
|
||||
fprintf(netout, "%s IPv4: %s", (first ? "best address" : " "),
|
||||
ul_nl_addr_ntop_address(best[threshold]->addr));
|
||||
@@ -432,7 +432,7 @@ static void dump_iface_best(struct ul_nl_data *nl,
|
||||
memset(best, 0, sizeof(best));
|
||||
threshold = ul_netaddrq_iface_bestaddr(&(ifaceq->ip_quality_list_6),
|
||||
&best);
|
||||
- if (best[threshold])
|
||||
+ if (threshold != __ULNETLINK_RATING_MAX)
|
||||
{
|
||||
fprintf(netout, "%s IPv6: %s", (first ? "best address" : " "),
|
||||
ul_nl_addr_ntop_address(best[threshold]->addr));
|
||||
diff --git a/term-utils/agetty.c b/term-utils/agetty.c
|
||||
index b7786ce7d..ec922bd11 100644
|
||||
--- a/term-utils/agetty.c
|
||||
+++ b/term-utils/agetty.c
|
||||
@@ -2603,7 +2603,7 @@ static void print_iface_best(struct issue *ie,
|
||||
|
||||
threshold =
|
||||
ul_netaddrq_iface_bestaddr(l, &best);
|
||||
- if (best[threshold])
|
||||
+ if (threshold != __ULNETLINK_RATING_MAX)
|
||||
fputs(ul_nl_addr_ntop_address(best[threshold]->addr),
|
||||
ie->output);
|
||||
}
|
||||
--
|
||||
2.48.1
|
||||
|
||||
1602
util-linux-lib-netlink.patch
Normal file
1602
util-linux-lib-netlink.patch
Normal file
File diff suppressed because it is too large
Load Diff
@@ -15,7 +15,7 @@ echo -n "Checking login.defs variables in util-linux... " >&2
|
||||
sed -n 's/^.*logindefs_setenv*("[A-Z0-9_]*", "\([A-Z0-9_]*\)".*$/\1/p'
|
||||
) | LC_ALL=C sort -u >util-linux-login_defs-vars.lst
|
||||
|
||||
if test $(sha1sum util-linux-login_defs-vars.lst | sed 's/ .*$//') != 8516ca34e059b2dee1d4421a3ab07e88331b1674 ; then
|
||||
if test $(sha1sum util-linux-login_defs-vars.lst | sed 's/ .*$//') != 713b442bf6d16353b7f74538ece165b424f90932 ; then
|
||||
|
||||
echo "does not match!" >&2
|
||||
echo "Checksum is: $(sha1sum util-linux-login_defs-vars.lst | sed 's/ .*$//')" >&2
|
||||
@@ -32,10 +32,13 @@ If it is false positive:
|
||||
- The same fix is needed in shadow package in shadow-login_defs-check.sh.
|
||||
|
||||
If it is true positive:
|
||||
- Check-out shadow package and call shadow-login_defs-check.sh.
|
||||
- Compare its output shadow-login_defs-check-util-linux.lst with
|
||||
util-linux-login_defs-vars.lst in the util-linux build directory.
|
||||
|
||||
- Check-out shadow package and call shadow-login_defs-check.sh. If it
|
||||
fails, check the output.
|
||||
- Update shadow shadow-login_defs-util-linux.patch, if needed.
|
||||
- Verify that the new variable is included in FOREIGNDEFS in lib/getdef.c.
|
||||
If not, add it to shadow-login_defs-util-linux.patch and send the chunk
|
||||
to the upstream.
|
||||
- If shadow-login_defs-util-linux.patch was updated, update
|
||||
login_defs-support-for-util-linux symbol version in both shadow and
|
||||
util-linux spec files accordingly.
|
||||
|
||||
21
util-linux-man-generated.patch
Normal file
21
util-linux-man-generated.patch
Normal file
@@ -0,0 +1,21 @@
|
||||
Index: util-linux-2.41.2/term-utils/agetty.8
|
||||
===================================================================
|
||||
--- util-linux-2.41.2.orig/term-utils/agetty.8
|
||||
+++ util-linux-2.41.2/term-utils/agetty.8
|
||||
@@ -456,6 +458,16 @@ Insert the IPv4 address of the specified
|
||||
The same as \(rs4 but for IPv6.
|
||||
.RE
|
||||
.sp
|
||||
+a
|
||||
+.RS 4
|
||||
+Insert list of "good" IP addresses for all interfaces. It prints best candidates for remote login IP addresses: global and site addresses; if not available, temporary address with the longest lifetime, if not available, link address. Note that link addresses are printed with local interface name, but they has to be done with the interface name on the machine where they will be used.
|
||||
+.RE
|
||||
+.sp
|
||||
+A
|
||||
+.RS 4
|
||||
+Insert list of all IP addresses for all interfaces.
|
||||
+.RE
|
||||
+.sp
|
||||
b
|
||||
.RS 4
|
||||
Insert the baudrate of the current line.
|
||||
@@ -1,7 +0,0 @@
|
||||
# False positives. Libraries outside LD_LIBRARY_PATH use RPATH to find libraries, not ldconfig.
|
||||
addFilter("library-without-ldconfig-postin /usr/libexec/build/staging/.*")
|
||||
addFilter("library-without-ldconfig-postun /usr/libexec/build/staging/.*")
|
||||
# Not applicable for multi flavor build.
|
||||
addFilter("invalid-spec-name")
|
||||
# Not important, and it simplifies packaging.
|
||||
addFilter("non-etc-or-var-file-marked-as-conffile /usr/libexec/build/staging/.*")
|
||||
@@ -1,3 +1,440 @@
|
||||
-------------------------------------------------------------------
|
||||
Thu Jan 15 17:58:48 UTC 2026 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Fix filelist for systemd flavor.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sat Jan 3 16:31:04 UTC 2026 - Dirk Müller <dmueller@suse.com>
|
||||
|
||||
- update to 2.41.3 (bsc#1254666, CVE-2025-14104):
|
||||
* added bash-completion for lsfd, blkpr
|
||||
* added missing mount options for bash-completion
|
||||
* libfdisk: fix off-by-one in maximum last sector calculation
|
||||
within MS-DOS-style partition tables
|
||||
* login-utils: fix setpwnam() buffer use [CVE-2025-14104]
|
||||
* losetup: sort 'O' correctly for the mutual-exclusive check to
|
||||
work
|
||||
* lscpu: use maximum CPU speed from DMI, avoid duplicate version
|
||||
string
|
||||
* lscpu: add a few missing ARM CPU identifiers
|
||||
* lsfd: fix memory leak related to stat_error_class
|
||||
* umount: consider helper return status for success message
|
||||
* wdctl: remove -d option leftover
|
||||
* misc: fix memory leak in setpwnam()
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Oct 16 01:24:14 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Include agetty netlink fixes from the final upstream commits
|
||||
(jsc#PED-8734, util-linux-lib-netlink.patch and
|
||||
util-linux-agetty-netlink.patch) and upstream fixes
|
||||
(util-linux-lib-netlink-fix1.patch,
|
||||
util-linux-lib-netlink-fix2.patch,
|
||||
util-linux-lib-netlink-fix3.patch and
|
||||
util-linux-agetty-netlink-fix4.patch).
|
||||
- Fix configs library use in agetty (replace
|
||||
util-linux-issuedir-usr-lib.patch by upstream
|
||||
util-linux-lib-configs-fix1.patch,
|
||||
add util-linux-lib-configs-fix2.patch,
|
||||
util-linux-lib-configs-fix3.patch,
|
||||
util-linux-lib-configs-fix4.patch,
|
||||
util-linux-lib-configs-fix5.patch and
|
||||
util-linux-lib-configs-fix6.patch).
|
||||
- Fix agetty erase of escape characters (relevant to bsc#1194818,
|
||||
util-linux-agetty-escape-erase.patch).
|
||||
- Own /usr/lib/issue.d directory.
|
||||
- Perform migration from issue-generator (jsc#PED-8734, fixes
|
||||
boo#1244446).
|
||||
- Drop util-linux-agetty-ssh-host-keys.patch. This feature is not
|
||||
used in MicroOS any more.
|
||||
- Remove Provides/Obsoletes for s390-32, upgrade from SLE11 SP1 is
|
||||
no more supported.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Sep 30 18:35:50 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- agetty: use /usr/lib/issue.d for backward compatibility
|
||||
(util-linux-issuedir-usr-lib.patch).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sun Sep 28 07:15:32 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Fix address matching in agetty (boo#1247371,
|
||||
util-linux-lib-netlink.patch).
|
||||
- Update generated man pages (util-linux-man-generated.patch).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Sep 26 02:28:52 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Add configs library and use it in agetty
|
||||
(gh#util-linux/util-linux#3752,
|
||||
util-linux-lib-configs.patch, util-linux-agetty-configs.patch).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Sep 24 22:48:35 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Update to version 2.41.2:
|
||||
* bash-completion:
|
||||
* fix function name of enosys completion
|
||||
* add choom and coresched
|
||||
* blkid: correct an erroneous error message
|
||||
* findmnt:
|
||||
* (usage) add a needed equals sign before an optional argument
|
||||
* add missing newline in --raw, --pair and --list output
|
||||
formats
|
||||
* fsck.cramfs: check buffer size for memcpy()
|
||||
* getopt: document special symbols that should not be used as
|
||||
option characters
|
||||
* hardlink (man): add note note about ULFILEEQ_DEBUG=
|
||||
* libblkid:
|
||||
* Fix probe_ioctl_tp assigning BLKGETDISKSEQ as physical sector
|
||||
size
|
||||
* (ext) reduce false positive
|
||||
* improve UUID_SUB= description
|
||||
* lib/color-names:
|
||||
* fix stupid bugs
|
||||
* Fix color name canonicalization
|
||||
* libfdisk:
|
||||
* (script) improve separator usage in named-fields dump
|
||||
* (script) fix device name separator parsing
|
||||
* liblastlog2: markup fixes for man pages
|
||||
* libmount: don't report fsconfig errors with "nofail"
|
||||
* lib/path: avoid double free() for cpusets
|
||||
* lib (treewide): add ul_ prefix to functions with generic names
|
||||
* logger:
|
||||
* fix buffer overflow when read stdin
|
||||
* fix incorrect warning message when both --file and a message
|
||||
are specified
|
||||
* lsblk:
|
||||
* fix possible use-after-free
|
||||
* fix memory leak [coverity scan]
|
||||
* use md as fallback TYPE when md/level empty
|
||||
* lscpu:
|
||||
* New Arm C1 parts
|
||||
* Add NVIDIA Olympus arm64 core (jsc#PED-13683)
|
||||
* man:
|
||||
* Fixed incorrect ipcrm options
|
||||
* Replace RETURN VALUE with EXIT STATUS in section 1
|
||||
* mkfs.cramfs: avoid uninitialized value [coverity scan]
|
||||
* more: temporarily ignore stdin when waiting for stderr
|
||||
* rev: add --zero option to --help output
|
||||
* setpriv: Improve getgroups() Portability
|
||||
* sfdisk: reject spurious arguments for
|
||||
--reorder/--backup-pt-sectors
|
||||
* zramctl:
|
||||
* ignore ENOENT when setting max_comp_streams
|
||||
* fix MEM-USED column description
|
||||
* Misc: Add missing ;; to -m case (#1)
|
||||
* tests fixes
|
||||
* translation updates
|
||||
- Remove bash 5.3 hack for kill/decode. It is now fixed.
|
||||
- Mark test script/options as failing. It randomly fails on
|
||||
aarch64, arm7l and s390x inside OBS (needs research).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Aug 11 23:54:47 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Implement escape code for printing of ssh host keys in agetty
|
||||
issue file (util-linux-agetty-ssh-host-keys.patch).
|
||||
- Include fixes from
|
||||
https://github.com/util-linux/util-linux/pull/3649 (jsc#PED-8734,
|
||||
util-linux-lib-netlink.patch, util-linux-agetty-netlink.patch).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Jul 24 10:35:23 UTC 2025 - Dr. Werner Fink <werner@suse.de>
|
||||
|
||||
- For bash 5.3 add (SIG)INT tests/expected/kill/decode as ignored
|
||||
signal for asynchronous coprocesses (boo#1246830)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Jul 10 02:39:17 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- agetty: Implement netlink based IP address detection and issue
|
||||
reload. It makes possible to identify IP addresses usability and
|
||||
prefer stable global addresses over ephemeral or link-local
|
||||
addresses. New issue keywords \a and \A were added. (boo#1139983,
|
||||
jsc#PED-8734, util-linux-lib-netlink.patch,
|
||||
util-linux-agetty-netlink.patch)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Jun 24 22:41:18 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Update to version 2.41.1:
|
||||
* cfdisk: fix memory leak and possible NULL dereference
|
||||
* fdisk: fix possible memory leak
|
||||
* findmnt: fix -k option parsing regression (boo#1242705,
|
||||
drop util-linux-libblkid-econf-parse.patch)
|
||||
* hardlink: fix performance regression
|
||||
* include/cctype: fix string comparison
|
||||
* libblkid:
|
||||
* Fix crash while parsing config with libeconf
|
||||
* befs fix underflow
|
||||
* avoid strcasecmp() for ASCII-only strings
|
||||
* libblkid/src/topology/dm: fix fscanf return value check to
|
||||
match expected number of parsed items
|
||||
* libmount:
|
||||
* (subdir) restrict for real mounts only
|
||||
* (subdir) remove unused code
|
||||
* avoid calling memset() unnecessarily
|
||||
* fix --no-canonicalize regression (boo#1244251,
|
||||
drop libmount-fix-no-canonicalize-regression.patch)
|
||||
* lsblk:
|
||||
* use ID_PART_ENTRY_SCHEME as fallback for PTTYPE
|
||||
* avoid strcasecmp() for ASCII-only strings
|
||||
* lscpu:
|
||||
* fix possible buffer overflow in cpuinfo parser
|
||||
* Fix loongarch op-mode output with recent kernel
|
||||
* lsfd:
|
||||
* scan the protocol field of /proc/net/packet as a hex number
|
||||
* fix the description for PACKET.PROTOCOL column
|
||||
* lsns:
|
||||
* enhance compilation without USE_NS_GET_API
|
||||
* fix undefined reference to add_namespace_for_nsfd #3483
|
||||
* more:
|
||||
* fix broken ':!command' command key
|
||||
* fix implicit previous shell_line execution #3508
|
||||
* tests: (test_mkfds::mapped-packet-socket) add a new parameter,
|
||||
protocol
|
||||
* treewide:
|
||||
* add ul_ to parse_timestamp() function name
|
||||
(drop util-linux-rename-common-symbols-4.patch)
|
||||
* add ul_ to parse_switch() function name
|
||||
(drop util-linux-rename-common-symbols-3.patch)
|
||||
* add ul_ to parse_size() function name
|
||||
(drop util-linux-rename-common-symbols-2.patch)
|
||||
* add ul_ to parse_range() function name
|
||||
(drop util-linux-rename-common-symbols-1.patch)
|
||||
* fix optional arguments usage
|
||||
* avoid strcasecmp() for ASCII-only strings
|
||||
* Wipefs: improve --all descriptions for whole-disks
|
||||
* Misc: Do not call exit() on code ending in shared libraries
|
||||
* Other fixes. For complete list see
|
||||
https://kernel.org/pub/linux/utils/util-linux/v2.41/v2.41.1-ReleaseNotes
|
||||
- Fix problem with uname26 listed twice.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Jun 10 11:16:10 UTC 2025 - Nicolas Belouin <nicolas@belouin.fr>
|
||||
|
||||
- Fix libmount --no-canonicalize regression (boo#1244251,
|
||||
gh#util-linux/util-linux#3479,
|
||||
libmount-fix-no-canonicalize-regression.patch).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu May 29 15:21:59 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Add ul_ prefix to functions with common names. Fixes btrfsprogs
|
||||
build failure (gh#util-linux/util-linux#3603,
|
||||
util-linux-rename-common-symbols-1.patch,
|
||||
util-linux-rename-common-symbols-2.patch,
|
||||
util-linux-rename-common-symbols-3.patch,
|
||||
util-linux-rename-common-symbols-4.patch).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue May 20 14:27:14 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Fix segfault of findmnt (boo#1242705,
|
||||
gh#util-linux/util-linux#3574,
|
||||
util-linux-libblkid-econf-parse.patch).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Apr 17 18:33:03 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Enable mountfd support again (jsc#PED-9752).
|
||||
BREAKING CHANGE
|
||||
Mountfd is nearly completely compatible with the old mount. There
|
||||
is a special case that cannot be handled by mountfd, and it needs
|
||||
to be handled by applications:
|
||||
Mountfd discriminates between physical mount layer and virtual
|
||||
mount layer. Once the physical mount layer is read-only,
|
||||
read-write mount on the virtual layer is not possible.
|
||||
If the first mount is read only, then the physical filesystem is
|
||||
mounted read-only, and later mount of the same file system as
|
||||
read-write is not possible. To solve this problem, the first
|
||||
mount needs to be read-only only on the virtual layer, keeping
|
||||
the physical layer read-write.
|
||||
The user space fix is simple:
|
||||
Instead of
|
||||
mount -oro
|
||||
use
|
||||
mount -oro=vfs
|
||||
This will keep the physical layer read-write, but the virtual
|
||||
file system layer (and the user space access) will be read-only.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Apr 7 21:00:58 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Update to version 2.41:
|
||||
* agetty: Fixed an issue where issue files were not being printed
|
||||
from additional locations, such as /run or /usr/lib. This
|
||||
change now allows for the use of local information from /etc,
|
||||
in addition to generated files from /run and
|
||||
distribution-specific files from /usr/lib.
|
||||
* cfdisk and sfdisk: Added support for the --sector-size command
|
||||
line option.
|
||||
* sfdisk: Added a new option, --discard-free.
|
||||
* fdisk: Added a new command, 'T', to discard sectors.
|
||||
* chrt: The --sched-runtime now supports SCHED_{OTHER,BATCH}
|
||||
policies.
|
||||
* column: Can now handle ANSI SGR colors inside OSC 8 hyperlink
|
||||
escape codes and sequences.
|
||||
* enosys: Can now dump defined filters.
|
||||
* libmount:
|
||||
* Added experimental support for statmount() and listmount()
|
||||
syscalls.
|
||||
* This new functionality can be accessed using "findmnt
|
||||
--kernel=listmount".
|
||||
* Added a new mount option,
|
||||
X-mount.nocanonicalize[=source|target].
|
||||
* Added new mount extensions to the "ro" flag (ro[=vfs,fs]).
|
||||
* Added a new option, X-mount.noloop, to disable automatic loop
|
||||
device creation.
|
||||
* Now supports bind symlinks over symlinks.
|
||||
* Reads all kernel info/warning/error messages from new API
|
||||
syscalls (and mount(8) prints them).
|
||||
* libuuid: Now supports RFC9562 UUIDs.
|
||||
* findmnt, lsblk, and lsfd: Added a new --hyperlink command line
|
||||
option to print paths as terminal hyperlinks.
|
||||
* findmnt: Can now address filesystems using --id and --uniq-id
|
||||
(requires listmount() kernel support).
|
||||
* flock: Added support for the --fcntl command line option.
|
||||
* hardlink: Can now prioritize specified trees on the command
|
||||
line using --prioritize-trees.
|
||||
* Can exclude sub-trees using --exclude-subtree or keep them in
|
||||
the current mount using --mount.
|
||||
* Duplicates can now be printed using --list-duplicates.
|
||||
* hwclock: Added a new --param-index option to address position
|
||||
for RTC_PARAM_{GET,SET} ioctls.
|
||||
* kill: Can now decode signal masks (e.g. as used in /proc) to
|
||||
signal names.
|
||||
* libblkid: Made many changes to improve detection, including
|
||||
exfat, GPT, LUKS2, bitlocker, etc.
|
||||
* login: Added support for LOGIN_ENV_SAFELIST in /etc/login.def.
|
||||
* lsfd: Now supports pidfs and AF_VSOCK sockets.
|
||||
* lsipc, ipcmk, ipcrm: Now supports POSIX ipc.
|
||||
* lslogins: Now supports lastlog2.
|
||||
* lsns: Added support for the --filter option.
|
||||
* build by meson: Now supports translated man pages and has fixed
|
||||
many bugs.
|
||||
* mkswap: The option --file should now be usable on btrfs.
|
||||
* nsenter: Improved support for pidfd and can now join target
|
||||
process's socket net namespace.
|
||||
* scriptlive: Added a new option, --echo <never|always|auto>.
|
||||
* zramctl: Now supports COMP-RATIO and --algorithm-params.
|
||||
* Many other new features and fixes. For complete list see
|
||||
https://kernel.org/pub/linux/utils/util-linux/v2.41/v2.41-ReleaseNotes
|
||||
- Update util-linux-login_defs-check.sh:
|
||||
* Make instructions up to date.
|
||||
* Update checksum reflecting the shadow update.
|
||||
- Refresh libmount-print-a-blacklist-hint-for-unknown-filesyst.patch.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Feb 24 17:16:49 UTC 2025 - Jan Engelhardt <jengelh@inai.de>
|
||||
|
||||
- Delete /usr/sbin/rc* symlinks
|
||||
- Drop bashisms from build recipe
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Jan 28 23:05:38 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Create and own directories /etc/blkid.conf.d and
|
||||
/usr/etc/blkid.conf.d (boo#1235887#c3).
|
||||
- Add missingok for /etc/blkid.conf.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Jan 20 18:12:46 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Move blkid.conf to /usr/etc (boo#1235887).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Jan 14 22:29:47 UTC 2025 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Update to version 2.40.4:
|
||||
* agetty: Prevent cursor escape (bsc#1194818, drop
|
||||
util-linux-agetty-prevent-cursor-escape.patch)
|
||||
add "systemd" to --version output\
|
||||
* chcpu(8): Document CPU deconfiguring behavior
|
||||
* fdisk: SGI fixes
|
||||
* hardlink: fix memory corruption
|
||||
* hardlink.1 directory|file is mandatory
|
||||
* lib/env: fix env_list_setenv() for strings without '='
|
||||
* libblkid:
|
||||
(exfat) validate fields used by prober
|
||||
(gpt) use blkid_probe_verify_csum() for partition array
|
||||
checksum
|
||||
add FSLASTBLOCK for swaparea
|
||||
bitlocker fix version on big-endian systems
|
||||
* libfdisk: make sure libblkid uses the same sector size
|
||||
* libmount:
|
||||
extract common error handling function
|
||||
propagate first error of multiple filesystem types
|
||||
* logger: correctly format tv_usec
|
||||
* lscpu: Skip aarch64 decode path for rest of the architectures
|
||||
(bsc#1229476, drop util-linux-lscpu-skip-aarch64-decode.patch)
|
||||
* lsns: ignore ESRCH errors reported when accessing files under
|
||||
/proc
|
||||
* mkswap: set selinux label also when creating file
|
||||
* more: make sure we have data on stderr
|
||||
* nsenter: support empty environ
|
||||
* umount, losetup: Document loop destroy behavior
|
||||
(bsc#1159034, drop
|
||||
util-linux-umount-losetup-lazy-destruction.patch,
|
||||
util-linux-umount-losetup-lazy-destruction-generated.patch).
|
||||
* uuidd: fix /var/lib/libuuid mode uuidd-tmpfiles.conf
|
||||
fix /var/lib/libuuid mode uuidd-tmpfiles.conf
|
||||
* Many other fixes, improvements and code cleanup. For the
|
||||
complete list see
|
||||
https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.40/v2.40.3-ReleaseNotes
|
||||
https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.40/v2.40.4-ReleaseNotes
|
||||
- Refresh util-linux.keyring. Key validity was extended.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sun Nov 17 21:06:01 UTC 2024 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Skip aarch64 decode path for rest of the architectures
|
||||
(bsc#1229476, util-linux-lscpu-skip-aarch64-decode.patch).
|
||||
- agetty: Prevent login cursor escape (bsc#1194818,
|
||||
util-linux-agetty-prevent-cursor-escape.patch).
|
||||
- Document unexpected side effects of lazy destruction
|
||||
(bsc#1159034, util-linux-umount-losetup-lazy-destruction.patch,
|
||||
util-linux-umount-losetup-lazy-destruction-generated.patch).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Oct 21 23:25:19 UTC 2024 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Disable mountfd API again.
|
||||
(https://github.com/util-linux/util-linux/issues/3158)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Aug 5 22:14:13 UTC 2024 - Stanislav Brabec <sbrabec@suse.com>
|
||||
|
||||
- Update to version 2.40.2:
|
||||
* cfdisk: fix possible integer overflow
|
||||
* libmount: improving robustness in reading kernel messages,
|
||||
add pidfs to pseudo fs list
|
||||
* lscpu: New Arm Cortex part numbers
|
||||
fix hang of lscpu -e (bsc#1225598)
|
||||
* lsfd: Refactor the pidfd logic, support pidfs
|
||||
(obsoletes
|
||||
0001-include-Include-unistd.h-in-pidfd-utils.h-for-syscal.patch,
|
||||
0002-lsfd-Refactor-the-pidfd-logic-into-lsfd-pidfd.c.patch,
|
||||
0003-lsfd-Support-pidfs.patch,
|
||||
0004-lsfd-test-Adapt-test-cases-for-pidfs.patch)
|
||||
* mkswap.8.adoc: update note regarding swapfile creation
|
||||
* setpgid: make -f work
|
||||
* Many other fixes, improvements and code cleanup. For the
|
||||
complete list see
|
||||
https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.40/v2.40.2-ReleaseNotes
|
||||
- Enable kernel mountfd API, as it should be already stable
|
||||
(PED-9752).
|
||||
- Move autoreconf back to %build.
|
||||
- Add devel dependencies.
|
||||
- Remove util-linux-rpmlintrc. It is no more needed with multibuild.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Jul 16 13:25:03 UTC 2024 - Valentin Lefebvre <valentin.lefebvre@suse.com>
|
||||
|
||||
- uncomment "autoreconf --install" to use the new version of automake
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Jun 10 10:44:55 UTC 2024 - Dirk Müller <dmueller@suse.com>
|
||||
|
||||
@@ -75,7 +512,7 @@ Thu Apr 4 12:27:18 UTC 2024 - Thorsten Kukuk <kukuk@suse.com>
|
||||
* blockdev: add support for BLKGETZONESZ
|
||||
* cfdisk: ask y/n before wipe
|
||||
* cfdisk: properly handle out-of-order partitions during resize
|
||||
* chcpu: document limitations of -g
|
||||
* chcpu: document limitations of -g (bsc#1218609)
|
||||
* chsh: use libeconf to read /etc/shells
|
||||
* column: fix -l
|
||||
* column: fix memory leak
|
||||
@@ -98,10 +535,12 @@ Thu Apr 4 12:27:18 UTC 2024 - Thorsten Kukuk <kukuk@suse.com>
|
||||
* lsblk: add --highlight
|
||||
* lsblk: add --list-columns
|
||||
* lsclocks: new command to show clocks
|
||||
* lscpu: even more Arm part numbers
|
||||
* lscpu: even more Arm part numbers (bsc#1223605)
|
||||
* mkfs.minix: handle 64bit time on 32bit system
|
||||
* mkswap: implement --file
|
||||
* mkswap: implement --offset
|
||||
* more: clean processes not cleaned up after failed SSH session
|
||||
using up 100% CPU (bsc#1220117)
|
||||
* mount: add --map-users and --map-groups convenience options
|
||||
* nsenter: add option `-c` to join the cgroup of target process
|
||||
* setarch: add riscv64/riscv32 support
|
||||
@@ -109,6 +548,8 @@ Thu Apr 4 12:27:18 UTC 2024 - Thorsten Kukuk <kukuk@suse.com>
|
||||
* uuidd: add cont_clock persistence
|
||||
* uuidgen: add option --count
|
||||
* wall: query logind for list of users with tty (#2088)
|
||||
properly neutralize escape sequences (bsc#1221831,
|
||||
CVE-2024-28085)
|
||||
* write: query logind for list of users with tty (#2088)
|
||||
* libuuid: improved support for 64-bit time
|
||||
- skip-lsfd-tests-PR2888.patch: skip some lsfd tests which OBS does
|
||||
@@ -228,6 +669,7 @@ Fri Jul 28 14:47:15 UTC 2023 - Goldwyn Rodrigues <rgoldwyn@suse.com>
|
||||
|
||||
- Re-add 0001-Revert-libblkid-try-LUKS2-first-when-probing.patch
|
||||
because the patch is not in 2.39.1
|
||||
(bsc#1224393, boo#1213227, boo#1213361)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Jul 26 01:22:20 UTC 2023 - Neil Brown <nfbrown@suse.com>
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
pub 4096R/EC39C284 2011-10-10 [expires: 2016-10-08]
|
||||
uid Karel Zak <kzak@redhat.com>
|
||||
sub 4096R/7BA16CAC 2011-10-10 [expires: 2016-10-08]
|
||||
pub rsa4096 2011-10-10 [SC] [expires: 2033-05-14]
|
||||
B0C64D14301CC6EFAEDF60E4E4B71D5EEC39C284
|
||||
uid [ unknown] Karel Zak <kzak@redhat.com>
|
||||
sub rsa4096 2011-10-10 [E] [expires: 2033-05-14]
|
||||
FC0214B4E2D01655F5898228ED846C667BA16CAC
|
||||
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: GnuPG v2.0.20 (GNU/Linux)
|
||||
|
||||
mQINBE6StA4BEACp9++Y+DgbBloJEuVhsDjDIvAR1n/aHPDyPQQzg/DkKtR3BXHn
|
||||
dGfTL9/DR8y9YzLNwUf2lWsEAvwHZ2XfUTp5S5nVbgpAB0/Q2ebP0TnkNYaRkxq7
|
||||
@@ -16,41 +17,42 @@ Q+MQyA1L5FifkpA7+akITF5luOqUb2TToEBLiF/nn8y0sIUa/HGgcUrK2N9E1VNJ
|
||||
tcIt/z0sZJUHYC+EBh/G0UNt9tRwPdnUks5sua1sCquXnkd9IS0Kr3Kq/C6JOKzz
|
||||
UDGdFKVc6wExf70hX5h0g1kkypyjNwipGSdk+qVXO0IF/tKMToa8WZqoK3enzryI
|
||||
Kmdq7IQ0ThdTTTC1ctVk4367/30prpNHF4/642G0OOiQCzWBrb0V217HvQARAQAB
|
||||
tBtLYXJlbCBaYWsgPGt6YWtAcmVkaGF0LmNvbT6JAj4EEwECACgFAk6StA4CGwMF
|
||||
CQlmAYAGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEOS3HV7sOcKETI8QAI0U
|
||||
StG6dv1l9kqkmFpXPZJ75hf5SJA69+upcKeTg9BXKrEqjZLeyEn1OVPmfVGwWpz8
|
||||
SRbiYcHh8AhJaggAxKcIgQ/sAUBkmrTP6RyYEQUV6vFW5qv7dcEOs46d+LE/Wkxs
|
||||
ymC2FSXxYOFiw7z27gkXQYq/IkdwfhRLFD6aD5egxcBVl91ZlRyklvPPW7qo046B
|
||||
MWh2LaCVowYg+33GjS4A4JcF+tGkWZc0yqANwov93uhY0VXEdDsT4YWrTVdNDI3/
|
||||
lZ5u5k9sEUGR03oV336M/j0qNtMfAG5iDt2PFrzhJZcGcQPiGd/DeYuJeLVCd8Nl
|
||||
jAwsnfGqu9VITgaDOreLbpSTNSj8egPqOoUBAGncMSfdiQ2ZEhluPyCTwspDy5Pa
|
||||
dESyk0q2Z6tKG9ae01g/RzfTGCVN4GxkORPxcEHloa4XM3C9FBohM1LTWmsvnNXe
|
||||
cPdbPyCoiFKio/yFZDt1CYDkols4uf/0ztCSH6pI874sCmYJVkYev2W9RCxE4aYK
|
||||
KMb8XCUPec8L4C1mpmBiej0NT/d9GHQUnJUpRD4EG7UBxMwNWflhO4P4Q81uM0Kr
|
||||
RMht0lS0EylZXuQPPG5C1nMsa1+eN0wjSTpy7232PTCxu+bhxA1HzvWXYuueUmp2
|
||||
QuV8PyA1lsfYI7PEgk2skfAvbP5vJszorklo2hVGuQINBE6StA4BEADG5Hind61Y
|
||||
qoXXHotraJO2ejsPiy3BxSZTQet+IJO5tyURSXVIv+ZuV/MBRS/88fkBL2nHpK5b
|
||||
BtJT11D2ZESmziZWGgMtZRV4va3fh3GaMeVdi5pXpmPZp4fBc60F3iCKfd1V8/1a
|
||||
zwicZtdhTphkc6O7ETCr240OrJoOgvilbpv8WuVwhjfEOL2DwKITK6tzba1VScXi
|
||||
ehDhhTssP14RQiH/OcMFuiHCHJeHQOH9ku4fzqT2/lxxSo4kMWKR2VslW17f3Zr3
|
||||
Zvrbi/b8UE/3T/RsoaQn2ml9BfDiMgNwT4l2ILlE7HpZMfD2WAP6itGHolcdbhNa
|
||||
jxAMHdP5t64zSdwKmB8AbuIo7nbMKuJMiPdkOS/8x3YHRle4WEEeRWTEcqyzqkMq
|
||||
MCqKLxc4SCuSMv+ingDrHr+d5usuMlQjT8c71PIipl9OpM8Jkl8CI2ToVF20wijY
|
||||
Oof4T/jjObYiZk1KcqqKhQzMXEhKCt9hK5AaKMq5BiublS/Q5EXpzcRgVmG+SMHd
|
||||
hUNLN7gilFx5939Ev+36TNE/f66r9aiF+WbiI1V1JGs0LYVyFzwmFMCgQUsnyqyA
|
||||
RNREnLysdLE98PDSO2ESxu9BO7kTvlP0q5p+MKQiYj/s5wSqXw8EDCSBH9u0/FQi
|
||||
gyV0a+J70WZZNpdi5wq+qVZ16LENQdxtKwARAQABiQIlBBgBAgAPBQJOkrQOAhsM
|
||||
BQkJZgGAAAoJEOS3HV7sOcKEtCYP/3ji7Kt4+M0N6IOkh7wHfWk3HLqBa1XOD1Oz
|
||||
X+rp79L1cDK8J1XUHoW/84bsS8Y3NsXlIej1wLOcaH0HOpEsPzqoqP1JxGilRkAu
|
||||
Yazt3WhqdM2FcOQNEnuk66F8HnN/mD4vLzxdxuPlRtlCruUcDZlZlyzpywk6B7Gi
|
||||
cVfh1CvUJsDA++aOlgYIHB4Z6nSJWYp64z+5QAVToBHzI7ywVyWTJbjO1RCR5QsV
|
||||
fPD07p1deSW96QhqLSb2wQfk93I4YGshaVPwG01ZamxPEbspKqrEIG+5S6E4q/B+
|
||||
VF0zj5GU7jt/6M4qFzKbaY+vxsaqjgCOCPL5bCz5RFTHdtEmC/cmsvVbYuBD/5UY
|
||||
D3JbyXt7KSG/a5Oel4ynK1pRQbnS6eNcGQqZPUop4PBouRKnUqv8uzljaiL9Wm3G
|
||||
Hv9tn1L6ly86VcLt1ALTVuqwm5ci1fDVbddSliPv5atWNJ+So2MfEg3qbCzEC8Is
|
||||
JNsVd4N6fSctYfFvBxsPjy7fw1iEqKq7SzTlHMO5hiKpS+8HSRVv6djHlj3aWtgy
|
||||
u+BTXT/tRQ6c3TlZadqoyumX1U+Tflb6qMyJaZPsqv3bsOpXwjLAVfT4nPRXqbN6
|
||||
WWUhdompzuZufyCCL9Tc6lPDgVmuWyycHk4gbdfERodk4SEYJ0cEwFbl+GjL9XFZ
|
||||
VeljfCzq
|
||||
=8wc5
|
||||
tBtLYXJlbCBaYWsgPGt6YWtAcmVkaGF0LmNvbT6JAlUEEwEIAD8CGwMGCwkIBwMC
|
||||
BhUIAgkKCwQWAgMBAh4BAheAFiEEsMZNFDAcxu+u32Dk5LcdXuw5woQFAmRkpsEF
|
||||
CSid9bMACgkQ5LcdXuw5woSvFA/+LYBDPSubYZF4lS8lNlWwRNe1gP9VrCkaF5mb
|
||||
Psx7cV8eHQICR/QJD7WDSIHlnfaBCmNelwGRc76PB23Huvq8xwvTYiQDWdqIN4Vl
|
||||
gDLqSganq53poN1BNBFRP6ubsdGjHlSYH+ygf8XXL/h+/b9Ud61eb43XQ5sUhFQU
|
||||
kEZEiJ26rCwOQWnlyJBMzo0axwW55qKoMmNjcwtRrB5kW7QDZ8BHVZiEqVrjJxQh
|
||||
0NpwrjlFdRZ8Ak+/3Iz1UOIJl+p0+5sjx6iY7Xy7oKP28msdLcqRy/o58A+IHGQ1
|
||||
Y5DeeosNkatnT9+7TQdAxJdJzuLpH9WTmXyIoG1DP8p2A2fjvLpYMEomWKYBb6ci
|
||||
1MZaI1Kdw9BX3xfaI0OhRDArLN0Nu630jTLafwf+jv8OtNEtb2BnbHWIrQw0rRc7
|
||||
877VRu7wmyTroj5IJthuEVr+NWw9RqCMljO/SDoR3GzE+2xSvKQlZU//vIBdHiVV
|
||||
u4IbKhHlYELFMiqmNWoqlTFwstpP+TgYYtwf0Xuhv/1Y7PezI8Zvp8/pjYwmjCg6
|
||||
CdtTZMSonFBmMuA5hA/5Eg2KEwplHUfz/XgCe4wNv21tnvUY7QuHU2ZvlInEFACM
|
||||
/4L1cIz7/PmQke7z7WvXP0d2pCMtfTra0RqH1nneNgq0VAhGnyI5qpK+n+hSYTqV
|
||||
3VQNNQi5Ag0ETpK0DgEQAMbkeKd3rViqhdcei2tok7Z6Ow+LLcHFJlNB634gk7m3
|
||||
JRFJdUi/5m5X8wFFL/zx+QEvacekrlsG0lPXUPZkRKbOJlYaAy1lFXi9rd+HcZox
|
||||
5V2LmlemY9mnh8FzrQXeIIp93VXz/VrPCJxm12FOmGRzo7sRMKvbjQ6smg6C+KVu
|
||||
m/xa5XCGN8Q4vYPAohMrq3NtrVVJxeJ6EOGFOyw/XhFCIf85wwW6IcIcl4dA4f2S
|
||||
7h/OpPb+XHFKjiQxYpHZWyVbXt/dmvdm+tuL9vxQT/dP9GyhpCfaaX0F8OIyA3BP
|
||||
iXYguUTselkx8PZYA/qK0YeiVx1uE1qPEAwd0/m3rjNJ3AqYHwBu4ijudswq4kyI
|
||||
92Q5L/zHdgdGV7hYQR5FZMRyrLOqQyowKoovFzhIK5Iy/6KeAOsev53m6y4yVCNP
|
||||
xzvU8iKmX06kzwmSXwIjZOhUXbTCKNg6h/hP+OM5tiJmTUpyqoqFDMxcSEoK32Er
|
||||
kBooyrkGK5uVL9DkRenNxGBWYb5Iwd2FQ0s3uCKUXHn3f0S/7fpM0T9/rqv1qIX5
|
||||
ZuIjVXUkazQthXIXPCYUwKBBSyfKrIBE1EScvKx0sT3w8NI7YRLG70E7uRO+U/Sr
|
||||
mn4wpCJiP+znBKpfDwQMJIEf27T8VCKDJXRr4nvRZlk2l2LnCr6pVnXosQ1B3G0r
|
||||
ABEBAAGJAjwEGAEIACYCGwwWIQSwxk0UMBzG767fYOTktx1e7DnChAUCZGSnpQUJ
|
||||
KJ32lwAKCRDktx1e7DnChJ0gD/wOsq5mWpoSvBmhI/Xa4WOl2D9ltYYJxrQpdTd+
|
||||
IhUuQUCZle/z6dSO2jsrpcvnwn3OHBQguvX8vzBr2qFeQDjrAbZ4V76teY2Zg+5o
|
||||
HFy21TlCFrNeFLrk4m8PyCrfQVoQ55ESLPUBp0qK5VLzKjFAHD7+Z90bEie6IGUc
|
||||
rJyUokTNc7hSWsQk96rAENE6cxCgsEGZhtsS41iBZ4lkhkaVfpPj/yxiiOFw101N
|
||||
G1PXq+EAJ6iaIvBbNiy+AI9EFVAkX6uMM8INely0HAn/H3/hc/xADiUFolPiIEwK
|
||||
E04L/8KHVH5vn007kUeMD4DecvL+8XYyT18+jH/Hvpai610uWwfBP50HoKa9A8JD
|
||||
ppBZaqBGzeNvCMUWU6rxyLoNOeJduUwFTh3mUesBoF7Iqdpe1CphuUlOKWUYY6Jq
|
||||
ZEZ7oQN630z0QsLzr6YZinnnfMbO9xNktfJPBMju6UPmOHfYI/zJFRe5VTqvG8w3
|
||||
SxJVriqs75jFpGqSC/a7IcW3j2FeVQ66sAcik4XRA9JO7SpsTJtebAw0tQ8nIkIj
|
||||
ekmNJnNAlIKOnisKca9QRzuUn5HNPl8UDeN9KjxsFkmDMEkRSuijpLEFe+66bkjP
|
||||
NdEeAGQJbiXWb1z9vHHQpDPKMXhK18D5PBnLDIl8iFnpDE+M088Xnavf9eYapj2k
|
||||
Zh9rvA==
|
||||
=cevX
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
152
util-linux.spec
152
util-linux.spec
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# spec file for package util-linux
|
||||
#
|
||||
# Copyright (c) 2024 SUSE LLC
|
||||
# Copyright (c) 2026 SUSE LLC and contributors
|
||||
#
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
# remain the property of their copyright owners, unless otherwise agreed
|
||||
@@ -85,19 +85,19 @@ Group: Development/Languages/Python
|
||||
%endif
|
||||
# ulbuild == python
|
||||
|
||||
Version: 2.40.1
|
||||
Version: 2.41.3
|
||||
Release: 0
|
||||
License: GPL-2.0-or-later
|
||||
#Git-Clone: https://github.com/util-linux/util-linux
|
||||
URL: https://www.kernel.org/pub/linux/utils/util-linux/
|
||||
Source: https://www.kernel.org/pub/linux/utils/util-linux/v2.40/util-linux-%{version}.tar.xz
|
||||
Source: https://www.kernel.org/pub/linux/utils/util-linux/v2.41/util-linux-%{version}.tar.xz
|
||||
Source2: util-linux-login_defs-check.sh
|
||||
Source3: util-linux-rpmlintrc
|
||||
Source7: baselibs.conf
|
||||
Source8: login.pamd
|
||||
Source9: remote.pamd
|
||||
Source10: su.pamd
|
||||
Source11: su.default
|
||||
Source12: https://www.kernel.org/pub/linux/utils/util-linux/v2.39/util-linux-%{version}.tar.sign
|
||||
Source12: https://www.kernel.org/pub/linux/utils/util-linux/v2.41/util-linux-%{version}.tar.sign
|
||||
Source13: %{_name}.keyring
|
||||
Source14: runuser.pamd
|
||||
Source15: runuser-l.pamd
|
||||
@@ -111,10 +111,38 @@ Patch2: Add-documentation-on-blacklisted-modules-to-mount-8-.patch
|
||||
# PATCH-FIX-SUSE util-linux-bash-completion-su-chsh-l.patch bsc1172427 -- Fix "su -s" bash completion.
|
||||
Patch3: util-linux-bash-completion-su-chsh-l.patch
|
||||
Patch5: static_lib.patch
|
||||
Patch6: 0001-include-Include-unistd.h-in-pidfd-utils.h-for-syscal.patch
|
||||
Patch7: 0002-lsfd-Refactor-the-pidfd-logic-into-lsfd-pidfd.c.patch
|
||||
Patch8: 0003-lsfd-Support-pidfs.patch
|
||||
Patch9: 0004-lsfd-test-Adapt-test-cases-for-pidfs.patch
|
||||
# PATCH-FEATURE-UPSTREAM util-linux-lib-netlink.patch boo1139983 jsc#PED-8734 sbrabec@suse.com -- Implement netlink based IP address detection and issue reload.
|
||||
Patch6: util-linux-lib-netlink.patch
|
||||
# PATCH-FEATURE-UPSTREAM util-linux-agetty-netlink.patch boo1139983 jsc#PED-8734 sbrabec@suse.com -- Implement netlink based IP address detection and issue reload.
|
||||
Patch7: util-linux-agetty-netlink.patch
|
||||
# PATCH-FIX-UPSTREAM util-linux-lib-netlink-fix1.patch jsc#PED-8734 sbrabec@suse.com -- Implement netlink based IP address detection and issue reload.
|
||||
Patch8: util-linux-lib-netlink-fix1.patch
|
||||
# PATCH-FIX-UPSTREAM util-linux-lib-netlink-fix2.patch jsc#PED-8734 sbrabec@suse.com -- Implement netlink based IP address detection and issue reload.
|
||||
Patch9: util-linux-lib-netlink-fix2.patch
|
||||
# PATCH-FIX-UPSTREAM util-linux-lib-netlink-fix3.patch jsc#PED-8734 sbrabec@suse.com -- Implement netlink based IP address detection and issue reload.
|
||||
Patch10: util-linux-lib-netlink-fix3.patch
|
||||
# PATCH-FIX-UPSTREAM util-linux-agetty-netlink-fix4.patch jsc#PED-8734 sbrabec@suse.com -- Implement netlink based IP address detection and issue reload.
|
||||
Patch11: util-linux-agetty-netlink-fix4.patch
|
||||
# PATCH-FEATURE-UPSTREAM util-linux-lib-configs.patch gh#util-linux/util-linux#3752 schubi@suse.com -- Added lib "configs" for parsing configuration.
|
||||
Patch12: util-linux-lib-configs.patch
|
||||
# PATCH-FEATURE-UPSTREAM util-linux-agetty-configs.patch gh#util-linux/util-linux#3752 schubi@suse.com -- agetty: using configs lib for parsing issue files.
|
||||
Patch13: util-linux-agetty-configs.patch
|
||||
# PATCH-FIX-UPSTREAM util-linux-lib-configs-fix1.patch schubi@suse.com -- Fix agetty: using configs lib.
|
||||
Patch14: util-linux-lib-configs-fix1.patch
|
||||
# PATCH-FIX-UPSTREAM util-linux-lib-configs-fix2.patch sbrabec@suse.com -- Fix agetty: using configs lib.
|
||||
Patch15: util-linux-lib-configs-fix2.patch
|
||||
# PATCH-FIX-UPSTREAM util-linux-lib-configs-fix3.patch sbrabec@suse.com -- Fix agetty: using configs lib.
|
||||
Patch16: util-linux-lib-configs-fix3.patch
|
||||
# PATCH-FIX-UPSTREAM util-linux-lib-configs-fix4.patch sbrabec@suse.com -- Fix agetty: using configs lib.
|
||||
Patch17: util-linux-lib-configs-fix4.patch
|
||||
# PATCH-FIX-UPSTREAM util-linux-lib-configs-fix5.patch sbrabec@suse.com -- Fix agetty: using configs lib.
|
||||
Patch18: util-linux-lib-configs-fix5.patch
|
||||
# PATCH-FIX-UPSTREAM util-linux-lib-configs-fix6.patch schubi@suse.com -- Fix agetty: using configs lib.
|
||||
Patch19: util-linux-lib-configs-fix6.patch
|
||||
# PATCH-FIX-UPSTREAM util-linux-agetty-escape-erase.patch bsc#1194818 sbrabec@suse.com -- Fix agetty erase of escape characters.
|
||||
Patch20: util-linux-agetty-escape-erase.patch
|
||||
# PATCH-FIX-BUILD util-linux-man-generated.patch sbrabec@suse.com -- Update generated man pages modified by patches.
|
||||
Patch21: util-linux-man-generated.patch
|
||||
BuildRequires: audit-devel
|
||||
BuildRequires: bc
|
||||
BuildRequires: binutils-devel
|
||||
@@ -178,19 +206,16 @@ Obsoletes: rfkill <= 0.5
|
||||
# The last version was 1.0+git.e66999f.
|
||||
Provides: hardlink = 1.1
|
||||
Obsoletes: hardlink < 1.1
|
||||
# bnc#805684:
|
||||
|
||||
%ifarch s390x
|
||||
Obsoletes: s390-32
|
||||
Provides: s390-32
|
||||
%endif
|
||||
# arch s390x
|
||||
|
||||
# New agetty fetures obsoleted issue-generator (up to SLE16 GA).
|
||||
Provides: issue-generator = 1.13
|
||||
Obsoletes: issue-generator <= 1.13
|
||||
Supplements: filesystem(minix)
|
||||
# All login.defs variables require support from shadow side.
|
||||
# Upgrade this symbol version only if new variables appear!
|
||||
# Verify by shadow-login_defs-check.sh from shadow source package.
|
||||
Recommends: login_defs-support-for-util-linux >= 2.37
|
||||
# Use downstream version. Upstream may accept the patch later.
|
||||
Recommends: login_defs-support-for-util-linux >= 4.17.4
|
||||
Requires(post): coreutils
|
||||
%endif
|
||||
# ulsubset == core
|
||||
|
||||
@@ -280,7 +305,10 @@ Library for filesystem detection.
|
||||
Summary: Development files for the filesystem detection library
|
||||
License: LGPL-2.1-or-later
|
||||
Group: Development/Libraries/C and C++
|
||||
Requires: glibc-devel
|
||||
Requires: libblkid-devel
|
||||
Requires: libfdisk1 = %{version}
|
||||
Requires: libuuid-devel
|
||||
|
||||
%description -n libfdisk-devel
|
||||
Files needed to develop applications using the library for filesystem
|
||||
@@ -290,7 +318,10 @@ detection.
|
||||
Summary: Development files for the filesystem detection library
|
||||
License: LGPL-2.1-or-later
|
||||
Group: Development/Libraries/C and C++
|
||||
Requires: libblkid-devel-static
|
||||
Requires: libeconf-devel
|
||||
Requires: libfdisk-devel = %{version}
|
||||
Requires: libuuid-devel-static
|
||||
|
||||
%description -n libfdisk-devel-static
|
||||
Files needed to develop applications using the library for filesystem
|
||||
@@ -309,7 +340,10 @@ mount(8) and /usr/sbin/mount.<type> helpers.
|
||||
Summary: Development files for libmount
|
||||
License: LGPL-2.1-or-later
|
||||
Group: Development/Libraries/C and C++
|
||||
Requires: libblkid-devel
|
||||
Requires: libeconf-devel
|
||||
Requires: libmount1 = %{version}
|
||||
Requires: libselinux-devel
|
||||
|
||||
%description -n libmount-devel
|
||||
Files to develop applications using the libmount library.
|
||||
@@ -318,6 +352,7 @@ Files to develop applications using the libmount library.
|
||||
Summary: Development files for libmount
|
||||
License: LGPL-2.1-or-later
|
||||
Group: Development/Libraries/C and C++
|
||||
Requires: libblkid-devel-static
|
||||
Requires: libmount-devel = %{version}
|
||||
|
||||
%description -n libmount-devel-static
|
||||
@@ -364,6 +399,7 @@ A library to generate universally unique IDs (UUIDs).
|
||||
Summary: Development files for libuuid
|
||||
License: BSD-3-Clause
|
||||
Group: Development/Libraries/C and C++
|
||||
Requires: glibc-devel
|
||||
Requires: libuuid1 = %{version}
|
||||
|
||||
%description -n libuuid-devel
|
||||
@@ -469,6 +505,7 @@ cp -a %{S:2} .
|
||||
rm tests/ts/lsns/ioctl_ns
|
||||
|
||||
%build
|
||||
AUTOPOINT=true GTKDOCIZE=true autoreconf -vfi
|
||||
%global _lto_cflags %{_lto_cflags} -ffat-lto-objects
|
||||
export SUID_CFLAGS="-fpie"
|
||||
export SUID_LDFLAGS="-pie"
|
||||
@@ -478,42 +515,41 @@ export CXXFLAGS="%{optflags} -D_GNU_SOURCE"
|
||||
|
||||
# Here we define a build function. For the base build, we use it as it
|
||||
# is. For python build, we use it repeatedly for all flavors.
|
||||
function configure_and_build() {
|
||||
configure_and_build() {
|
||||
|
||||
# configure options depending on ulbuild and ulsubset values
|
||||
configure_options=""
|
||||
# libmagic is only used for determining in more(1) whether or not a file
|
||||
# is binary. but it has builtin code that is doing the same with a simpler
|
||||
# check and the libmagic database dependency is rather large (9MB+)
|
||||
configure_options+="--without-libmagic "
|
||||
configure_options="$configure_options --without-libmagic "
|
||||
|
||||
%if "%ulbuild" == "python"
|
||||
%define _configure ../configure
|
||||
configure_options+="--disable-all-programs "
|
||||
configure_options+="--with-python "
|
||||
configure_options+="--enable-pylibmount "
|
||||
configure_options+="--enable-libmount "
|
||||
configure_options+="--enable-libblkid "
|
||||
configure_options="$configure_options --disable-all-programs "
|
||||
configure_options="$configure_options --with-python "
|
||||
configure_options="$configure_options --enable-pylibmount "
|
||||
configure_options="$configure_options --enable-libmount "
|
||||
configure_options="$configure_options --enable-libblkid "
|
||||
%endif
|
||||
# ulbuild == python
|
||||
|
||||
%if "%ulbuild" == "base"
|
||||
configure_options+="--enable-all-programs "
|
||||
configure_options+="--without-python "
|
||||
configure_options="$configure_options --enable-all-programs "
|
||||
configure_options="$configure_options --without-python "
|
||||
%endif
|
||||
# ulbuild == base
|
||||
|
||||
%if "%ulsubset" == "core"
|
||||
configure_options+="--without-systemd --disable-liblastlog2"
|
||||
configure_options="$configure_options --without-systemd --disable-liblastlog2"
|
||||
%endif
|
||||
# ulsubset == core
|
||||
|
||||
%if "%ulsubset" == "systemd"
|
||||
configure_options+="--with-systemd "
|
||||
configure_options="$configure_options --with-systemd "
|
||||
%endif
|
||||
# ulsubset == systemd
|
||||
|
||||
#AUTOPOINT=true GTKDOCIZE=true autoreconf -vfi
|
||||
# All dirs needs to be specified, as %%configure does not derive them
|
||||
# from %%_prefix, and bootstrap build will fall back to /usr.
|
||||
%configure\
|
||||
@@ -553,10 +589,9 @@ configure_options+="--with-systemd "
|
||||
--disable-pg\
|
||||
--enable-fs-paths-default="/sbin:/usr/sbin"\
|
||||
--enable-static\
|
||||
--with-vendordir=%{_distconfdir} \
|
||||
--disable-libmount-mountfd-support \
|
||||
--with-vendordir=%{_distconfdir}\
|
||||
$configure_options
|
||||
make %{?_smp_mflags}
|
||||
%make_build
|
||||
}
|
||||
|
||||
################
|
||||
@@ -607,8 +642,10 @@ fi
|
||||
################
|
||||
%if "%ulbuild" == "base"
|
||||
%make_install
|
||||
mkdir -p %{buildroot}{%{_distconfdir}/default,%{_pam_vendordir},%{_sysconfdir}/issue.d}
|
||||
install -m 644 %{SOURCE51} %{buildroot}%{_sysconfdir}/blkid.conf
|
||||
mkdir -p "%{buildroot}%{_distconfdir}/default" "%{buildroot}%{_pam_vendordir}" "%{buildroot}%{_sysconfdir}/issue.d" "%{buildroot}/usr/lib/issue.d"
|
||||
install -m 644 %{SOURCE51} %{buildroot}%{_distconfdir}/blkid.conf
|
||||
touch %{buildroot}%{_sysconfdir}/blkid.conf
|
||||
mkdir %{buildroot}%{_sysconfdir}/blkid.conf.d %{buildroot}%{_distconfdir}/blkid.conf.d
|
||||
install -m 644 %{SOURCE8} %{buildroot}%{_pam_vendordir}/login
|
||||
install -m 644 %{SOURCE9} %{buildroot}%{_pam_vendordir}/remote
|
||||
%if 0%{?suse_version} <= 1500
|
||||
@@ -662,10 +699,10 @@ rm -f %{buildroot}%{_mandir}/man8/fdisk.8*
|
||||
|
||||
# create list of setarch(8) symlinks
|
||||
find %{buildroot}%{_mandir}/man8 -regextype posix-egrep \
|
||||
-regex ".*(linux32|linux64|s390|s390x|i386|ppc|ppc64|ppc32|sparc|sparc64|sparc32|sparc32bash|mips|mips64|mips32|ia64|x86_64|parisc|parisc32|parisc64|uname26)\.8.*" \
|
||||
-regex ".*(linux32|linux64|s390|s390x|i386|ppc|ppc64|ppc32|sparc|sparc64|sparc32|sparc32bash|mips|mips64|mips32|ia64|x86_64|parisc|parisc32|parisc64)\.8.*" \
|
||||
-printf "%{_mandir}/man8/%f*\n" >> %{name}.files
|
||||
find %{buildroot}%{_bindir}/ -regextype posix-egrep -type l \
|
||||
-regex ".*(linux32|linux64|s390|s390x|i386|ppc|ppc64|ppc32|sparc|sparc64|sparc32|sparc32bash|mips|mips64|mips32|ia64|x86_64|parisc|parisc32|parisc64|uname26)$" \
|
||||
-regex ".*(linux32|linux64|s390|s390x|i386|ppc|ppc64|ppc32|sparc|sparc64|sparc32|sparc32bash|mips|mips64|mips32|ia64|x86_64|parisc|parisc32|parisc64)$" \
|
||||
-printf "%{_bindir}/%f\n" >> %{name}.files
|
||||
mkdir -p %{buildroot}/run/uuidd
|
||||
|
||||
@@ -706,8 +743,6 @@ mv %{buildroot}%{_bindir}/login %{buildroot}/bin/
|
||||
%else
|
||||
# ulsubset != core, ulbuild == base
|
||||
echo -n "" >%{name}.lang
|
||||
ln -sf /sbin/service %{buildroot}%{_sbindir}/rcuuidd
|
||||
ln -sf /sbin/service %{buildroot}%{_sbindir}/rcfstrim
|
||||
%endif
|
||||
# ulsubset == core, ulbuild == base
|
||||
|
||||
@@ -762,6 +797,8 @@ export TS_OPT_hardlink_options_known_fail="yes"
|
||||
export TS_OPT_misc_mountpoint_known_fail="yes"
|
||||
# This test appears to be racy
|
||||
export TS_OPT_lslocks_lslocks_known_fail=yes
|
||||
# FIXME: script/options sometimes fails on aarch64, arm7l and s390x
|
||||
export TS_OPT_script_options_known_fail=yes
|
||||
#
|
||||
# hacks
|
||||
export PATH="$PATH:/sbin:/usr/sbin"
|
||||
@@ -873,6 +910,17 @@ done
|
||||
|
||||
%post
|
||||
%service_add_post fstrim.service fstrim.timer
|
||||
# Migrate from issue-generator. Existed up to SLE16 GA
|
||||
if systemctl is-enabled --quiet issue-generator.service ; then
|
||||
rm -f `grep -l '\\\\[46]' /run/issue.d/70-*.conf 2>/dev/null` 2>/dev/null
|
||||
rm -f /run/issue
|
||||
fi
|
||||
# The old issue layout causes double printing in util-linux >= 2.41. Existed up to SLE16 GA
|
||||
if test -L /etc/issue ; then
|
||||
if test "`readlink /etc/issue`" = ../run/issue ; then
|
||||
rm /etc/issue
|
||||
fi
|
||||
fi
|
||||
|
||||
%preun
|
||||
%service_del_preun fstrim.service fstrim.timer
|
||||
@@ -971,7 +1019,7 @@ rmdir --ignore-fail-on-non-empty /run/run >/dev/null 2>&1 || :
|
||||
# defined no_config
|
||||
|
||||
%config %dir %{_sysconfdir}/issue.d
|
||||
|
||||
%dir /usr/lib/issue.d
|
||||
%if %{ul_extra_bin_sbin}
|
||||
%core /bin/kill
|
||||
%core %verify(not mode) %attr(%ul_suid,root,root) /bin/su
|
||||
@@ -1015,7 +1063,9 @@ rmdir --ignore-fail-on-non-empty /run/run >/dev/null 2>&1 || :
|
||||
%core %{_bindir}/kill
|
||||
%core %verify(not mode) %attr(%ul_suid,root,root) %{_bindir}/su
|
||||
%core %{_bindir}/eject
|
||||
%core %{_bindir}/bits
|
||||
%core %{_bindir}/cal
|
||||
%core %{_bindir}/coresched
|
||||
%core %{_bindir}/chmem
|
||||
%core %{_bindir}/choom
|
||||
%core %{_bindir}/chrt
|
||||
@@ -1227,6 +1277,7 @@ rmdir --ignore-fail-on-non-empty /run/run >/dev/null 2>&1 || :
|
||||
|
||||
%core %{_mandir}/man1/kill.1.gz
|
||||
%core %{_mandir}/man1/su.1.gz
|
||||
%core %{_mandir}/man1/bits.1.gz
|
||||
%core %{_mandir}/man1/cal.1.gz
|
||||
%core %{_mandir}/man1/choom.1.gz
|
||||
%core %{_mandir}/man1/chrt.1.gz
|
||||
@@ -1234,6 +1285,7 @@ rmdir --ignore-fail-on-non-empty /run/run >/dev/null 2>&1 || :
|
||||
%core %{_mandir}/man1/colcrt.1.gz
|
||||
%core %{_mandir}/man1/colrm.1.gz
|
||||
%core %{_mandir}/man1/column.1.gz
|
||||
%core %{_mandir}/man1/coresched.1.gz
|
||||
%core %{_mandir}/man1/dmesg.1.gz
|
||||
%core %{_mandir}/man1/enosys.1.gz
|
||||
%core %{_mandir}/man1/eject.1.gz
|
||||
@@ -1360,8 +1412,10 @@ rmdir --ignore-fail-on-non-empty /run/run >/dev/null 2>&1 || :
|
||||
%license README.licensing
|
||||
%license COPYING
|
||||
%license Documentation/licenses/*
|
||||
%config(noreplace) %{_sysconfdir}/blkid.conf
|
||||
|
||||
%ghost %config(missingok) %{_sysconfdir}/blkid.conf
|
||||
%config %dir %{_sysconfdir}/blkid.conf.d
|
||||
%{_distconfdir}/blkid.conf
|
||||
%dir %{_distconfdir}/blkid.conf.d
|
||||
%{_datadir}/bash-completion/completions/*
|
||||
%exclude %{_datadir}/bash-completion/completions/findmnt
|
||||
%exclude %{_datadir}/bash-completion/completions/logger
|
||||
@@ -1386,10 +1440,11 @@ rmdir --ignore-fail-on-non-empty /run/run >/dev/null 2>&1 || :
|
||||
# Systemd files #
|
||||
#################
|
||||
%if "%ulsubset" == "systemd"
|
||||
%exclude %config(noreplace) %{_sysconfdir}/blkid.conf
|
||||
|
||||
%exclude %{_distconfdir}/blkid.conf
|
||||
%exclude %dir %{_distconfdir}/blkid.conf.d
|
||||
%exclude %config(missingok) %{_sysconfdir}/blkid.conf
|
||||
%exclude %config %{_sysconfdir}/blkid.conf.d
|
||||
%exclude %config %dir %{_sysconfdir}/issue.d
|
||||
|
||||
%if %{ul_extra_bin_sbin}
|
||||
/bin/findmnt
|
||||
/bin/logger
|
||||
@@ -1409,19 +1464,23 @@ rmdir --ignore-fail-on-non-empty /run/run >/dev/null 2>&1 || :
|
||||
|
||||
# Exclude core binaries bash-completion
|
||||
%exclude %{_datadir}/bash-completion/completions/addpart
|
||||
%exclude %{_datadir}/bash-completion/completions/bits
|
||||
%exclude %{_datadir}/bash-completion/completions/blkdiscard
|
||||
%exclude %{_datadir}/bash-completion/completions/blkid
|
||||
%exclude %{_datadir}/bash-completion/completions/blkpr
|
||||
%exclude %{_datadir}/bash-completion/completions/blkzone
|
||||
%exclude %{_datadir}/bash-completion/completions/blockdev
|
||||
%exclude %{_datadir}/bash-completion/completions/cal
|
||||
%exclude %{_datadir}/bash-completion/completions/cfdisk
|
||||
%exclude %{_datadir}/bash-completion/completions/chcpu
|
||||
%exclude %{_datadir}/bash-completion/completions/chmem
|
||||
%exclude %{_datadir}/bash-completion/completions/choom
|
||||
%exclude %{_datadir}/bash-completion/completions/chrt
|
||||
%exclude %{_datadir}/bash-completion/completions/col
|
||||
%exclude %{_datadir}/bash-completion/completions/colcrt
|
||||
%exclude %{_datadir}/bash-completion/completions/colrm
|
||||
%exclude %{_datadir}/bash-completion/completions/column
|
||||
%exclude %{_datadir}/bash-completion/completions/coresched
|
||||
%exclude %{_datadir}/bash-completion/completions/ctrlaltdel
|
||||
%exclude %{_datadir}/bash-completion/completions/delpart
|
||||
%exclude %{_datadir}/bash-completion/completions/dmesg
|
||||
@@ -1457,6 +1516,7 @@ rmdir --ignore-fail-on-non-empty /run/run >/dev/null 2>&1 || :
|
||||
%exclude %{_datadir}/bash-completion/completions/losetup
|
||||
%exclude %{_datadir}/bash-completion/completions/lsclocks
|
||||
%exclude %{_datadir}/bash-completion/completions/lscpu
|
||||
%exclude %{_datadir}/bash-completion/completions/lsfd
|
||||
%exclude %{_datadir}/bash-completion/completions/lsipc
|
||||
%exclude %{_datadir}/bash-completion/completions/lsirq
|
||||
%exclude %{_datadir}/bash-completion/completions/lslocks
|
||||
@@ -1577,7 +1637,6 @@ rmdir --ignore-fail-on-non-empty /run/run >/dev/null 2>&1 || :
|
||||
%exclude %{_mandir}/man8/parisc64.8.gz
|
||||
%exclude %{_mandir}/man8/uname26.8.gz
|
||||
|
||||
%{_sbindir}/rcfstrim
|
||||
%{_unitdir}/fstrim.service
|
||||
%{_unitdir}/fstrim.timer
|
||||
%endif
|
||||
@@ -1724,7 +1783,6 @@ rmdir --ignore-fail-on-non-empty /run/run >/dev/null 2>&1 || :
|
||||
%attr(-,uuidd,uuidd) %ghost %dir /run/uuidd
|
||||
%{_datadir}/bash-completion/completions/uuidd
|
||||
%{_mandir}/man8/uuidd.8.gz
|
||||
%{_sbindir}/rcuuidd
|
||||
%{_unitdir}/uuidd.service
|
||||
%{_unitdir}/uuidd.socket
|
||||
|
||||
|
||||
Reference in New Issue
Block a user