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
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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);
+}
#include "timeutils.h"
#include "lsfd.h"
+#include "lsfd-pidfd.h"
#define offsetofend(TYPE, MEMBER) \
(offsetof(TYPE, MEMBER) + sizeof_member(TYPE, MEMBER))
/*
* pidfd
*/
-struct anon_pidfd_data {
- pid_t pid;
- char *nspid;
-};
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__)),
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 = {
'lsfd-sock-xinfo.c',
'lsfd-unkn.c',
'lsfd-fifo.c',
+ 'lsfd-pidfd.c',
)
uuidgen_sources = files(