Sync from SUSE:SLFO:Main procps revision 90cf1b80923b9f8269a440e1d362954c

This commit is contained in:
Adrian Schröter 2024-10-01 08:51:58 +02:00
parent 844627c634
commit fb2f19b539
40 changed files with 1019 additions and 1445 deletions

176
79042e07.patch Normal file
View File

@ -0,0 +1,176 @@
From 79042e07fab9956135a21b1df7a69d1fbde7ef79 Mon Sep 17 00:00:00 2001
From: Craig Small <csmall@dropbear.xyz>
Date: Tue, 12 Sep 2023 16:59:18 +1000
Subject: [PATCH] ps: Don't crash when using short option
ps would crash with the -si or -sf options with systemd enabled.
The issue was the utmp wasn't filled in, the long option checked, the
short option did not.
Refactored the showinfo() function so instead of a branch with duplicate
prints for the items in both long and short we just branch on the items
for long output.
Also, made the function prototypes not dependendent on systemd enabled,
it was too messy that way and passing a char* NULL is not really going
to hurt anything.
References:
#301
Signed-off-by: Craig Small <csmall@dropbear.xyz>
---
NEWS | 1 +
src/w.c | 61 ++++++++++++++++++++-------------------------------------
2 files changed, 22 insertions(+), 40 deletions(-)
|diff --git a/NEWS b/NEWS
|index 4ad9f74e..883f9139 100644
|--- a/NEWS
|+++ b/NEWS
|@@ -1,5 +1,6 @@
| procps-ng-NEXT
| ---------------
|+ * w: Don't segfault with -s option issue #301
|
| procps-ng-4.0.4
| ---------------
diff --git a/src/w.c b/src/w.c
index fd6e75f7..e2d754b5 100644
--- a/src/w.c
+++ b/src/w.c
@@ -207,9 +207,7 @@ static void print_display_or_interface(const char *restrict host, int len, int r
/* This routine prints either the hostname or the IP address of the remote */
static void print_from(
-#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
const char *session,
-#endif
const utmp_t *restrict const u, const int ip_addresses, const int fromlen) {
#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
if (session) {
@@ -508,11 +506,10 @@ static int find_best_proc(
#undef PIDS_GETSTR
}
+
static void showinfo(
-#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
const char *session, const char *name,
-#endif
- utmp_t * u, int formtype, int maxcmd, int from,
+ utmp_t * u, const int longform, int maxcmd, int from,
const int userlen, const int fromlen, const int ip_addresses,
const int pids)
{
@@ -575,25 +572,20 @@ static void showinfo(
/* force NUL term for printf */
uname[UT_NAMESIZE] = '\0';
- if (formtype) {
- printf("%-*.*s%-9.8s", userlen + 1, userlen, uname, tty + 5);
+ printf("%-*.*s%-9.8s", userlen + 1, userlen, uname, tty + 5);
+ if (from)
+ print_from(session, NULL, ip_addresses, fromlen);
+
+ /* login time */
+ if (longform) {
#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
if (session) {
uint64_t ltime;
- if (from)
- print_from(session, NULL, ip_addresses, fromlen);
-
sd_session_get_start_time(session, &ltime);
print_logintime(ltime/((uint64_t) 1000000ULL), stdout);
} else {
#endif
- if (from)
- print_from(
-#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
- NULL,
-#endif
- u, ip_addresses, fromlen);
#ifdef HAVE_UTMPX_H
print_logintime(u->ut_tv.tv_sec, stdout);
@@ -603,11 +595,16 @@ static void showinfo(
#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
}
#endif
- if (u && *u->ut_line == ':')
- /* idle unknown for xdm logins */
- printf(" ?xdm? ");
- else
- print_time_ival7(idletime(tty), 0, stdout);
+ }
+ /* idle */
+ if (u && *u->ut_line == ':')
+ /* idle unknown for xdm logins */
+ printf(" ?xdm? ");
+ else
+ print_time_ival7(idletime(tty), 0, stdout);
+
+ /* jpcpu/pcpu */
+ if (longform) {
print_time_ival7(jcpu / hertz, (jcpu % hertz) * (100. / hertz),
stdout);
if (pcpu > 0)
@@ -616,20 +613,8 @@ static void showinfo(
stdout);
else
printf(" ? ");
- } else {
- printf("%-*.*s%-9.8s", userlen + 1, userlen, uname, tty + 5);
- if (from)
- print_from(
-#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
- NULL,
-#endif
- u, ip_addresses, fromlen);
- if (u && *u->ut_line == ':')
- /* idle unknown for xdm logins */
- printf(" ?xdm? ");
- else
- print_time_ival7(idletime(tty), 0, stdout);
}
+ /* what */
if (pids) {
pid_t ut_pid = -1;
if (u)
@@ -798,9 +783,9 @@ int main(int argc, char **argv)
* headers. Try to keep alignment intact. */
printf(_("%-*s TTY "), userlen, _("USER"));
if (from)
- printf("%-*s", fromlen - 1, _("FROM"));
+ printf("%-*s", fromlen, _("FROM"));
if (longform)
- printf(_(" LOGIN@ IDLE JCPU PCPU WHAT\n"));
+ printf(_(" LOGIN@ IDLE JCPU PCPU WHAT\n"));
else
printf(_(" IDLE WHAT\n"));
}
@@ -857,9 +842,7 @@ int main(int argc, char **argv)
continue;
if (!strncmp(u->ut_user, user, UT_NAMESIZE))
showinfo(
-#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
NULL, NULL,
-#endif
u, longform, maxcmd, from, userlen,
fromlen, ip_addresses, pids);
}
@@ -876,9 +859,7 @@ int main(int argc, char **argv)
continue;
if (*u->ut_user)
showinfo(
-#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
NULL, NULL,
-#endif
u, longform, maxcmd, from, userlen,
fromlen, ip_addresses, pids);
}
--
GitLab

View File

@ -1,102 +0,0 @@
From 2c933ecba3bb1d3041a5a7a53a7b4078a6003413 Mon Sep 17 00:00:00 2001
From: Craig Small <csmall@dropbear.xyz>
Date: Thu, 10 Aug 2023 21:18:38 +1000
Subject: [PATCH] ps: Fix possible buffer overflow in -C option
ps allocates memory using malloc(length of arg * len of struct).
In certain strange circumstances, the arg length could be very large
and the multiplecation will overflow, allocating a small amount of
memory.
Subsequent strncpy() will then write into unallocated memory.
The fix is to use calloc. It's slower but this is a one-time
allocation. Other malloc(x * y) calls have also been replaced
by calloc(x, y)
References:
https://www.freelists.org/post/procps/ps-buffer-overflow-CVE-20234016
https://nvd.nist.gov/vuln/detail/CVE-2023-4016
https://gitlab.com/procps-ng/procps/-/issues/297
https://bugs.debian.org/1042887
Signed-off-by: Craig Small <csmall@dropbear.xyz>
---
ps/parser.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
--- ps/parser.c
+++ ps/parser.c 2023-08-15 12:19:13.375422122 +0000
@@ -183,8 +183,7 @@ static const char *parse_list(const char
int need_item;
const char *err; /* error code that could or did happen */
/*** prepare to operate ***/
- node = malloc(sizeof(selection_node));
- node->u = malloc(strlen(arg)*sizeof(sel_union)); /* waste is insignificant */
+ node = xmalloc(sizeof(selection_node));
node->n = 0;
buf = strdup(arg);
/*** sanity check and count items ***/
@@ -205,6 +204,7 @@ static const char *parse_list(const char
} while (*++walk);
if(need_item) goto parse_error;
node->n = items;
+ node->u = xcalloc(items*sizeof(sel_union));
/*** actually parse the list ***/
walk = buf;
while(items--){
@@ -569,8 +569,8 @@ static const char *parse_bsd_option(void
/* put our tty on a tiny list */
{
selection_node *node;
- node = malloc(sizeof(selection_node));
- node->u = malloc(sizeof(sel_union));
+ node = xmalloc(sizeof(selection_node));
+ node->u = xmalloc(sizeof(sel_union));
node->u[0].tty = cached_tty;
node->typecode = SEL_TTY;
node->n = 1;
@@ -706,8 +706,8 @@ static const char *parse_bsd_option(void
if(!arg){
/* Wow, obsolete BSD syntax. Put our tty on a tiny list. */
selection_node *node;
- node = malloc(sizeof(selection_node));
- node->u = malloc(sizeof(sel_union));
+ node = xmalloc(sizeof(selection_node));
+ node->u = xmalloc(sizeof(sel_union));
node->u[0].tty = cached_tty;
node->typecode = SEL_TTY;
node->n = 1;
@@ -1030,16 +1030,16 @@ static const char *parse_trailing_pids(v
argp = ps_argv + thisarg;
thisarg = ps_argc - 1; /* we must be at the end now */
- pidnode = malloc(sizeof(selection_node));
- pidnode->u = malloc(i*sizeof(sel_union)); /* waste is insignificant */
+ pidnode = xmalloc(sizeof(selection_node));
+ pidnode->u = xcalloc(i*sizeof(sel_union)); /* waste is insignificant */
pidnode->n = 0;
- grpnode = malloc(sizeof(selection_node));
- grpnode->u = malloc(i*sizeof(sel_union)); /* waste is insignificant */
+ grpnode = xmalloc(sizeof(selection_node));
+ grpnode->u = xcalloc(i*sizeof(sel_union)); /* waste is insignificant */
grpnode->n = 0;
- sidnode = malloc(sizeof(selection_node));
- sidnode->u = malloc(i*sizeof(sel_union)); /* waste is insignificant */
+ sidnode = xmalloc(sizeof(selection_node));
+ sidnode->u = xcalloc(i*sizeof(sel_union)); /* waste is insignificant */
sidnode->n = 0;
while(i--){
--- proc/libprocps.sym
+++ proc/libprocps.sym 2023-08-15 12:43:18.905661726 +0000
@@ -67,6 +67,8 @@ global:
unix_print_signals;
uptime;
xalloc_err_handler;
+ xcalloc;
+ xmalloc;
local:
*;
};

View File

@ -1,33 +0,0 @@
From 23da4f40ea27afe998e92ca317f2dcb48a6ffc1f Mon Sep 17 00:00:00 2001
From: Tommi Rantala <tommi.t.rantala@nokia.com>
Date: Mon, 11 Oct 2021 13:33:18 +0300
Subject: [PATCH] ps: ignore SIGURG
Stop registering signal handler for SIGURG, to avoid ps failure if
someone sends such signal. Without the signal handler, SIGURG will
just be ignored.
Signal 23 (URG) caught by ps (3.3.16).
ps:ps/display.c:66: please report this bug
https://man7.org/linux/man-pages/man7/signal.7.html
https://www.freebsd.org/cgi/man.cgi?sektion=3&query=signal
---
ps/display.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/ps/display.c b/ps/display.c
index 04803c3b..346e21a7 100644
--- a/ps/display.c
+++ b/ps/display.c
@@ -673,6 +673,7 @@ int main(int argc, char *argv[]){
case SIGKILL: /* can not catch */
case SIGSTOP: /* can not catch */
case SIGWINCH: /* don't care if window size changes */
+ case SIGURG: /* Urgent condition on socket (4.2BSD) */
;
}
} while (0);
--
GitLab

View File

@ -1,45 +0,0 @@
From 3dd1661a3d91671ca6c977c2e514f47d807be79d Mon Sep 17 00:00:00 2001
From: Craig Small <csmall@dropbear.xyz>
Date: Mon, 29 Mar 2021 22:11:27 +1100
Subject: [PATCH] docs: psr ps field is last run processor
The ps.1 manpage incorrectly stated that psr field showed the
processor the process was assigned to. However if the assignment
has changed but the process has not run, then the field doesn't
change.
Some digging by @srikard showed it wasn't the processor assigned
but the last one it was run on. The man page now correctly
describes psr in that way.
References:
procps-ng/procps#187
---
ps/ps.1 | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git ps/ps.1 ps/ps.1
index 8678123..b433655 100644
--- ps/ps.1
+++ ps/ps.1
|@@ -4,7 +4,7 @@
| .\" Quick hack conversion by Albert Cahalan, 1998.
| .\" Licensed under version 2 of the Gnu General Public License.
| .\"
|-.TH PS "1" "2021-03-05" "procps-ng" "User Commands"
|+.TH PS "1" "2021-03-29" "procps-ng" "User Commands"
| .\"
| .\" To render this page:
| .\" groff -t -b -man -X -P-resolution -P100 -Tps ps.1 &
@@ -1518,7 +1518,7 @@ priority of the process. Higher number means lower priority.
T}
psr PSR T{
-processor that process is currently assigned to.
+processor that process last executed on.
T}
rgid RGID T{
--
2.26.2

View File

@ -1,11 +0,0 @@
--- procps-3.3.17/sysctl.c.old 2021-02-09 11:11:25.000000000 +0100
+++ procps-3.3.17/sysctl.c 2023-12-14 13:56:36.785976315 +0100
@@ -546,6 +546,8 @@
fp = (globbuf.gl_pathv[j][0] == '-' && !globbuf.gl_pathv[j][1])
? stdin : fopen(globbuf.gl_pathv[j], "r");
if (!fp) {
+ if (strcmp ("/usr/lib/sysctl.d/99-sysctl.conf", globbuf.gl_pathv[j]) == 0)
+ continue;
xwarn(_("cannot open \"%s\""), globbuf.gl_pathv[j]);
rc = -1;
goto out;

View File

@ -1,41 +0,0 @@
---
free.1 | 2 +-
proc/sysinfo.c | 9 +++++----
2 files changed, 6 insertions(+), 5 deletions(-)
--- free.1
+++ free.1 2022-12-15 09:40:32.807087343 +0000
@@ -19,7 +19,7 @@ columns are:
Total installed memory (MemTotal and SwapTotal in /proc/meminfo)
.TP
\fBused\fR
-Used memory (calculated as \fBtotal\fR - \fBfree\fR - \fBbuffers\fR - \fBcache\fR)
+Used memory (calculated as \fBtotal\fR - \fBavailable\fR)
.TP
\fBfree\fR
Unused memory (MemFree and SwapFree in /proc/meminfo)
--- proc/sysinfo.c
+++ proc/sysinfo.c 2022-06-22 11:29:39.240066488 +0000
@@ -794,10 +794,6 @@ nextline:
where such values will be dramatically distorted over those of the host. */
if (kb_main_available > kb_main_total)
kb_main_available = kb_main_free;
- mem_used = kb_main_total - kb_main_free - kb_main_cached - kb_main_buffers;
- if (mem_used < 0)
- mem_used = kb_main_total - kb_main_free;
- kb_main_used = (unsigned long)mem_used;
/* zero? might need fallback for 2.6.27 <= kernel <? 3.14 */
if (!kb_main_available) {
@@ -821,6 +817,11 @@ nextline:
kb_main_available = kb_main_free;
#endif /* linux */
}
+
+ mem_used = kb_main_total - kb_main_available;
+ if (mem_used < 0)
+ mem_used = kb_main_total - kb_main_free;
+ kb_main_used = (unsigned long)mem_used;
}
/*****************************************************************/

View File

@ -1,37 +0,0 @@
---
top/top.1 | 4 ++--
top/top.c | 6 ++++--
2 files changed, 6 insertions(+), 4 deletions(-)
--- top/top.1
+++ top/top.1 2022-06-22 12:05:55.572154830 +0000
@@ -565,8 +565,8 @@ visual graphs of those representations.
In the case of \*(MP, the percentage represents the \fBtotal\fR minus the estimated
\fBavail\fR noted above.
-The `Mem' graph itself is divided between \fBused\fR and any remaining memory not
-otherwise accounted for by \fBavail\fR.
+The `Mem' graph itself is divided between the non-cached portion of \fBused\fR and
+any remaining memory not otherwise accounted for by \fBavail\fR.
\*(XT 4b. SUMMARY AREA Commands and the `m' command for additional information
on that special 4-way toggle.
--- top/top.c
+++ top/top.c 2022-06-22 12:03:17.911044097 +0000
@@ -6086,12 +6086,14 @@ numa_nope:
char used[SMLBUFSIZ], util[SMLBUFSIZ], dual[MEDBUFSIZ];
float pct_used, pct_misc, pct_swap;
int ix, num_used, num_misc;
+ unsigned long my_ulong;
- pct_used = (float)kb_main_used * (100.0 / (float)kb_main_total);
+ my_ulong = kb_main_total - kb_main_buffers - kb_main_cached - kb_main_free;
+ pct_used = (float)my_ulong * (100.0 / (float)kb_main_total);
#ifdef MEMGRAPH_OLD
pct_misc = (float)(kb_main_buffers + kb_main_cached) * (100.0 / (float)kb_main_total);
#else
- pct_misc = (float)(kb_main_total - kb_main_available - kb_main_used) * (100.0 / (float)kb_main_total);
+ pct_misc = (float)(kb_main_total - kb_main_available - my_ulong) * (100.0 / (float)kb_main_total);
#endif
if (pct_used + pct_misc > 100.0 || pct_misc < 0) pct_misc = 0;
pct_swap = kb_swap_total ? (float)kb_swap_used * (100.0 / (float)kb_swap_total) : 0;

View File

@ -1,61 +0,0 @@
---
proc/libprocps.sym | 1 +
proc/sysinfo.c | 13 +++++++++++--
proc/sysinfo.h | 2 ++
3 files changed, 14 insertions(+), 2 deletions(-)
--- proc/libprocps.sym
+++ proc/libprocps.sym 2018-04-04 11:30:51.841725161 +0000
@@ -60,6 +60,7 @@ global:
signal_name_to_number;
signal_number_to_name;
smp_num_cpus;
+ __smp_num_cpus;
sprint_uptime;
strtosig;
tty_to_dev;
--- proc/sysinfo.c
+++ proc/sysinfo.c 2018-04-04 11:33:26.306886237 +0000
@@ -47,7 +47,8 @@
#endif
#include <elf.h>
-long smp_num_cpus; /* number of CPUs */
+#undef smp_num_cpus
+long smp_num_cpus=-1; /* number of CPUs */
long page_bytes; /* this architecture's page size */
#define BAD_OPEN_MESSAGE \
@@ -1166,7 +1167,11 @@ out:
///////////////////////////////////////////////////////////////////////////
-void cpuinfo (void) {
+long __smp_num_cpus (void) {
+
+ if (smp_num_cpus != -1)
+ return(smp_num_cpus);
+
// ought to count CPUs in /proc/stat instead of relying
// on glibc, which foolishly tries to parse /proc/cpuinfo
// note: that may have been the case but now /proc/stat
@@ -1181,4 +1186,8 @@ void cpuinfo (void) {
smp_num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
if (smp_num_cpus<1) /* SPARC glibc is buggy */
smp_num_cpus=1;
+
+ return smp_num_cpus;
}
+
+void cpuinfo (void) { (void)__smp_num_cpus(); }
--- proc/sysinfo.h
+++ proc/sysinfo.h 2018-04-04 11:30:51.841725161 +0000
@@ -8,6 +8,8 @@ EXTERN_C_BEGIN
extern unsigned long long Hertz; /* clock tick frequency */
extern long smp_num_cpus; /* number of CPUs */
+extern long __smp_num_cpus(void);
+#define smp_num_cpus __smp_num_cpus()
extern int have_privs; /* boolean, true if setuid or similar */
extern long page_bytes; /* this architecture's bytes per page */

View File

@ -6,20 +6,20 @@ open("/usr/lib/locale/de_DE.utf8/LC_NUMERIC", O_RDONLY|O_CLOEXEC) = 3
and this causes a problem later on (bsc#908516) and this causes a problem later on (bsc#908516)
--- ---
free.c | 5 +++++ src/free.c | 5 +++++
1 file changed, 5 insertions(+) 1 file changed, 5 insertions(+)
--- free.c --- src/free.c
+++ free.c 2018-04-04 12:47:06.360757839 +0000 +++ src/free.c 2022-10-20 13:33:28.880818112 +0000
@@ -197,6 +197,7 @@ int main(int argc, char **argv) @@ -208,6 +208,7 @@ int main(int argc, char **argv)
{ int c, flags = 0, unit_set = 0, rc = 0;
int c, flags = 0, unit_set = 0;
struct commandline_arguments args; struct commandline_arguments args;
struct meminfo_info *mem_info = NULL;
+ int errsv; + int errsv;
/* /*
* For long options that have no equivalent short option, use a * For long options that have no equivalent short option, use a
@@ -247,10 +248,12 @@ int main(int argc, char **argv) @@ -260,10 +261,12 @@ int main(int argc, char **argv)
#ifdef HAVE_PROGRAM_INVOCATION_NAME #ifdef HAVE_PROGRAM_INVOCATION_NAME
program_invocation_name = program_invocation_short_name; program_invocation_name = program_invocation_short_name;
#endif #endif
@ -30,9 +30,9 @@ and this causes a problem later on (bsc#908516)
atexit(close_stdout); atexit(close_stdout);
+ errno = errsv; + errno = errsv;
while ((c = getopt_long(argc, argv, "bkmghltCc:ws:V", longopts, NULL)) != -1) while ((c = getopt_long(argc, argv, "bkmghlLtvCc:ws:V", longopts, NULL)) != -1)
switch (c) { switch (c) {
@@ -317,11 +320,13 @@ int main(int argc, char **argv) @@ -336,11 +339,13 @@ int main(int argc, char **argv)
break; break;
case 's': case 's':
flags |= FREE_REPEAT; flags |= FREE_REPEAT;

View File

@ -1,38 +0,0 @@
---
vmstat.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
--- vmstat.c
+++ vmstat.c 2018-04-04 11:16:07.577968520 +0000
@@ -40,6 +40,7 @@
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
+#include <sys/stat.h>
#include <termios.h>
#include <unistd.h>
#include <time.h>
@@ -708,13 +709,12 @@ static void slabheader(void)
static void slabformat(void)
{
- FILE *fSlab;
+ struct stat fSlab;
struct slab_cache *slabs;
unsigned long nSlab, i, j, k;
const char format[] = "%-24s %6u %6u %6u %6u\n";
- fSlab = fopen("/proc/slabinfo", "rb");
- if (!fSlab) {
+ if (stat("/proc/slabinfo", &fSlab) < 0) {
xwarnx(_("your kernel does not support slabinfo or your permissions are insufficient"));
return;
}
@@ -746,7 +746,6 @@ static void slabformat(void)
}
free(slabs);
}
- fclose(fSlab);
}
static void disksum_format(void)

View File

@ -1,61 +0,0 @@
---
free.c | 19 ++++++++++++++++---
proc/sysinfo.c | 5 ++++-
2 files changed, 20 insertions(+), 4 deletions(-)
--- free.c
+++ free.c 2021-02-10 09:58:35.409695062 +0000
@@ -134,7 +134,7 @@ static const char *scale_size(unsigned l
if (args.exponent > 1) {
/* In desired scale. */
snprintf(buf, sizeof(buf), "%ld",
- (long int)((size * 1024.0) / power(base, args.exponent-1))
+ (long int)(((long long int)size * 1024) / power(base, args.exponent-1))
);
return buf;
}
@@ -381,15 +381,28 @@ int main(int argc, char **argv)
* to print the high info, even if it is zero.
*/
if (flags & FREE_LOHI) {
+ unsigned long kb_low_used;
+ unsigned long kb_high_used;
+
+ if (kb_low_total > kb_low_free)
+ kb_low_used = kb_low_total - kb_low_free;
+ else
+ kb_low_used = 0;
+
+ if (kb_high_total > kb_high_free)
+ kb_high_used = kb_high_total - kb_high_free;
+ else
+ kb_high_used = 0;
+
printf("%-9s", _("Low:"));
printf("%11s", scale_size(kb_low_total, flags, args));
- printf(" %11s", scale_size(kb_low_total - kb_low_free, flags, args));
+ printf(" %11s", scale_size(kb_low_used, flags, args));
printf(" %11s", scale_size(kb_low_free, flags, args));
printf("\n");
printf("%-9s", _("High:"));
printf("%11s", scale_size(kb_high_total, flags, args));
- printf(" %11s", scale_size(kb_high_total - kb_high_free, flags, args));
+ printf(" %11s", scale_size(kb_high_used, flags, args));
printf(" %11s", scale_size(kb_high_free, flags, args));
printf("\n");
}
--- proc/sysinfo.c
+++ proc/sysinfo.c 2021-02-10 10:00:35.227385913 +0000
@@ -783,7 +783,10 @@ nextline:
kb_main_cached = kb_page_cache + kb_slab_reclaimable;
if ((ev=getenv("PS_FULL_CACHE")))
kb_main_cached += kb_swap_cached + kb_nfs_unstable;
- kb_swap_used = kb_swap_total - kb_swap_free;
+ if (kb_swap_total > kb_swap_free)
+ kb_swap_used = kb_swap_total - kb_swap_free;
+ else
+ kb_swap_used = 0;
/* if kb_main_available is greater than kb_main_total or our calculation of
mem_used overflows, that's symptomatic of running within a lxc container

View File

@ -1,19 +0,0 @@
---
top/top.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
--- top/top.c
+++ top/top.c 2018-04-04 12:09:16.087193018 +0000
@@ -2404,7 +2404,11 @@ static void zap_fieldstab (void) {
Cpu_pmax = 99.9;
if (Rc.mode_irixps && smp_num_cpus > 1 && !Thread_mode) {
Cpu_pmax = 100.0 * smp_num_cpus;
- if (smp_num_cpus > 10) {
+ if (smp_num_cpus > 1000) {
+ if (Cpu_pmax > 9999999.0) Cpu_pmax = 9999999.0;
+ } else if (smp_num_cpus > 100) {
+ if (Cpu_pmax > 999999.0) Cpu_pmax = 999999.0;
+ } else if (smp_num_cpus > 10) {
if (Cpu_pmax > 99999.0) Cpu_pmax = 99999.0;
} else {
if (Cpu_pmax > 999.9) Cpu_pmax = 999.9;

View File

@ -1,13 +1,43 @@
--- ---
free.1 | 6 ++++++ library/meminfo.c | 7 ++++++-
free.c | 7 ++++++- man/free.1 | 6 ++++++
proc/sysinfo.c | 4 ++++ src/free.c | 7 ++++++-
vmstat.c | 6 +++++- src/vmstat.c | 7 ++++++-
4 files changed, 21 insertions(+), 2 deletions(-) 4 files changed, 24 insertions(+), 3 deletions(-)
--- free.1 --- library/meminfo.c
+++ free.1 2019-12-11 06:20:16.659772479 +0000 +++ library/meminfo.c 2023-09-12 12:08:41.033738450 +0000
@@ -100,6 +100,12 @@ Switch to the wide mode. The wide mode p @@ -3,6 +3,7 @@
*
* Copyright © 2015-2023 Jim Warner <james.warner@comcast.net>
* Copyright © 2015-2023 Craig Small <csmall@dropbear.xyz>
+ * Copyright © 2008 Bart Van Assche.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -640,6 +641,7 @@ static int meminfo_read_failed (
int size;
unsigned long *valptr;
signed long mem_used;
+ const char *ev;
// remember history from last time around
memcpy(&info->hist.old, &info->hist.new, sizeof(struct meminfo_data));
@@ -692,7 +694,10 @@ static int meminfo_read_failed (
if (0 == mHr(MemAvailable))
mHr(MemAvailable) = mHr(MemFree);
- mHr(derived_mem_cached) = mHr(Cached) + mHr(SReclaimable);
+ if ((ev=getenv("PS_FULL_CACHE")))
+ mHr(derived_mem_cached) = mHr(Cached) + mHr(SReclaimable) + mHr(NFS_Unstable);
+ else
+ mHr(derived_mem_cached) = mHr(Cached) + mHr(SReclaimable);
/* if 'available' is greater than 'total' or our calculation of mem_used
overflows, that's symptomatic of running within a lxc container where
--- man/free.1
+++ man/free.1 2023-09-12 12:08:41.029738522 +0000
@@ -110,6 +110,12 @@ Switch to the wide mode. The wide mode p
than 80 characters. In this mode \fBbuffers\fR and \fBcache\fR than 80 characters. In this mode \fBbuffers\fR and \fBcache\fR
are reported in two separate columns. are reported in two separate columns.
.TP .TP
@ -20,34 +50,34 @@
\fB\-c\fR, \fB\-\-count\fR \fIcount\fR \fB\-c\fR, \fB\-\-count\fR \fIcount\fR
Display the result Display the result
.I count .I count
--- free.c --- src/free.c
+++ free.c 2019-12-11 06:20:16.659772479 +0000 +++ src/free.c 2023-09-12 12:10:26.647842455 +0000
@@ -90,6 +90,7 @@ static void __attribute__ ((__noreturn__ @@ -92,6 +92,7 @@ static void __attribute__ ((__noreturn__
fputs(_(" -t, --total show total for RAM + swap\n"), out); fputs(_(" -v, --committed show committed memory and commit limit\n"), out);
fputs(_(" -s N, --seconds N repeat printing every N seconds\n"), out); fputs(_(" -s N, --seconds N repeat printing every N seconds\n"), out);
fputs(_(" -c N, --count N repeat printing N times, then exit\n"), out); fputs(_(" -c N, --count N repeat printing N times, then exit\n"), out);
+ fputs(_(" -C, --full-cache add further cache lines to main cache\n"), out); + fputs(_(" -C, --full-cache add further cache lines to main cache\n"), out);
fputs(_(" -w, --wide wide output\n"), out); fputs(_(" -w, --wide wide output\n"), out);
fputs(USAGE_SEPARATOR, out); fputs(USAGE_SEPARATOR, out);
fputs(_(" --help display this help and exit\n"), out); fputs(_(" --help display this help and exit\n"), out);
@@ -231,6 +232,7 @@ int main(int argc, char **argv) @@ -244,6 +245,7 @@ int main(int argc, char **argv)
{ "total", no_argument, NULL, 't' }, { "committed", no_argument, NULL, 'v' },
{ "seconds", required_argument, NULL, 's' }, { "seconds", required_argument, NULL, 's' },
{ "count", required_argument, NULL, 'c' }, { "count", required_argument, NULL, 'c' },
+ { "full-cache",required_argument, NULL, HELP_OPTION }, + { "full-cache",no_argument, NULL, 'C' },
{ "wide", no_argument, NULL, 'w' }, { "wide", no_argument, NULL, 'w' },
{ "help", no_argument, NULL, HELP_OPTION }, { "help", no_argument, NULL, HELP_OPTION },
{ "version", no_argument, NULL, 'V' }, { "version", no_argument, NULL, 'V' },
@@ -250,7 +252,7 @@ int main(int argc, char **argv) @@ -263,7 +265,7 @@ int main(int argc, char **argv)
textdomain(PACKAGE); textdomain(PACKAGE);
atexit(close_stdout); atexit(close_stdout);
- while ((c = getopt_long(argc, argv, "bkmghltc:ws:V", longopts, NULL)) != -1) - while ((c = getopt_long(argc, argv, "bkmghlLtvc:ws:V", longopts, NULL)) != -1)
+ while ((c = getopt_long(argc, argv, "bkmghltCc:ws:V", longopts, NULL)) != -1) + while ((c = getopt_long(argc, argv, "bkmghlLtvCc:ws:V", longopts, NULL)) != -1)
switch (c) { switch (c) {
case 'b': case 'b':
check_unit_set(&unit_set); check_unit_set(&unit_set);
@@ -333,6 +335,9 @@ int main(int argc, char **argv) @@ -352,6 +354,9 @@ int main(int argc, char **argv)
case 'w': case 'w':
flags |= FREE_WIDE; flags |= FREE_WIDE;
break; break;
@ -57,59 +87,40 @@
case HELP_OPTION: case HELP_OPTION:
usage(stdout); usage(stdout);
case 'V': case 'V':
--- proc/sysinfo.c --- src/vmstat.c
+++ proc/sysinfo.c 2019-12-11 06:20:16.659772479 +0000 +++ src/vmstat.c 2023-09-12 12:08:41.033738450 +0000
@@ -3,6 +3,7 @@ @@ -230,6 +230,7 @@ static void __attribute__ ((__noreturn__
* Copyright (C) 1992-1998 by Michael K. Johnson, johnsonm@redhat.com
* Copyright 1998-2003 Albert Cahalan
* June 2003, Fabian Frederick, disk and slab info
+ * Copyright (c) 2008 Bart Van Assche.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -700,6 +701,7 @@ void meminfo(void){
int linux_version_code = procps_linux_version();
mem_table_struct findme = { namebuf, NULL};
mem_table_struct *found;
+ const char *ev;
char *head;
char *tail;
static const mem_table_struct mem_table[] = {
@@ -779,6 +781,8 @@ nextline:
kb_inactive = kb_inact_dirty + kb_inact_clean + kb_inact_laundry;
}
kb_main_cached = kb_page_cache + kb_slab_reclaimable;
+ if ((ev=getenv("PS_FULL_CACHE")))
+ kb_main_cached += kb_swap_cached + kb_nfs_unstable;
kb_swap_used = kb_swap_total - kb_swap_free;
/* if kb_main_available is greater than kb_main_total or our calculation of
--- vmstat.c
+++ vmstat.c 2019-12-11 06:22:44.716984764 +0000
@@ -103,6 +103,7 @@ static void __attribute__ ((__noreturn__
fputs(_(" -p, --partition <dev> partition specific statistics\n"), out); fputs(_(" -p, --partition <dev> partition specific statistics\n"), out);
fputs(_(" -S, --unit <char> define display unit\n"), out); fputs(_(" -S, --unit <char> define display unit\n"), out);
fputs(_(" -w, --wide wide output\n"), out); fputs(_(" -w, --wide wide output\n"), out);
+ fputs(_(" -C, --full-cache add further cache lines to main cache\n"), out); + fputs(_(" -C, --full-cache add further cache lines to main cache\n"), out);
fputs(_(" -t, --timestamp show timestamp\n"), out); fputs(_(" -t, --timestamp show timestamp\n"), out);
fputs(_(" -y, --no-first skips first line of output\n"), out);
fputs(USAGE_SEPARATOR, out); fputs(USAGE_SEPARATOR, out);
fputs(USAGE_HELP, out); @@ -951,6 +952,7 @@ int main(int argc, char *argv[])
@@ -899,7 +900,7 @@ int main(int argc, char *argv[]) {"partition", required_argument, NULL, 'p'},
{"unit", required_argument, NULL, 'S'},
{"wide", no_argument, NULL, 'w'},
+ {"full-cache", no_argument, NULL, 'C'},
{"timestamp", no_argument, NULL, 't'},
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'},
@@ -967,7 +969,7 @@ int main(int argc, char *argv[])
atexit(close_stdout); atexit(close_stdout);
while ((c = while ((c =
- getopt_long(argc, argv, "afmnsdDp:S:wthV", longopts, - getopt_long(argc, argv, "afmnsdDp:S:wthVy", longopts, NULL)) != -1)
+ getopt_long(argc, argv, "aCfmnsdDp:S:wthV", longopts, + getopt_long(argc, argv, "aCfmnsdDp:S:wthVy", longopts, NULL)) != -1)
NULL)) != -1)
switch (c) { switch (c) {
case 'V': case 'V':
@@ -968,6 +969,9 @@ int main(int argc, char *argv[]) printf(PROCPS_NG_VERSION);
@@ -1034,6 +1036,9 @@ int main(int argc, char *argv[])
case 't': case 't':
t_option = 1; t_option = 1;
break; break;
+ case 'C': + case 'C':
+ setenv("PS_FULL_CACHE", "yes", 1); + setenv("PS_FULL_CACHE", "yes", 1);
+ break; + break;
default: case 'y':
/* no other aguments defined yet. */ /* Don't display stats since system restart */
usage(stderr); y_option = 1;

View File

@ -1,7 +1,11 @@
--- vmstat.c ---
+++ vmstat.c 2015-01-27 14:57:19.467491788 +0000 vmstat.c | 12 ++++++------
@@ -295,7 +295,7 @@ static void new_format(void) 1 file changed, 6 insertions(+), 6 deletions(-)
unsigned int intr[2], ctxt[2];
--- src/vmstat.c
+++ src/vmstat.c 2022-03-29 09:21:41.156855432 +0000
@@ -357,7 +357,7 @@ static void new_format(void)
unsigned long pgpgin[2], pgpgout[2], pswpin[2] = {0,0}, pswpout[2];
unsigned int sleep_half; unsigned int sleep_half;
unsigned long kb_per_page = sysconf(_SC_PAGESIZE) / 1024ul; unsigned long kb_per_page = sysconf(_SC_PAGESIZE) / 1024ul;
- int debt = 0; /* handle idle ticks running backwards */ - int debt = 0; /* handle idle ticks running backwards */
@ -9,21 +13,21 @@
struct tm *tm_ptr; struct tm *tm_ptr;
time_t the_time; time_t the_time;
char timebuf[32]; char timebuf[32];
@@ -386,12 +386,12 @@ static void new_format(void) @@ -484,12 +484,12 @@ static void new_format(void)
/* idle can run backwards for a moment -- kernel "feature" */ /* idle can run backwards for a moment -- kernel "feature" */
if (debt) { if (debt) {
- didl = (int)didl + debt; - cpu_idl = (int)cpu_idl + debt;
- debt = 0; - debt = 0;
+ didl = (long long)didl + debt; + cpu_idl = cpu_idl + debt;
+ debt = 0LL; + debt = 0LL;
} }
- if ((int)didl < 0) { - if ((int)cpu_idl < 0) {
- debt = (int)didl; - debt = (int)cpu_idl;
- didl = 0; - cpu_idl = 0;
+ if ((long long)didl < 0) { + if (cpu_idl < 0) {
+ debt = (long long)didl; + debt = cpu_idl;
+ didl = 0ULL; + cpu_idl = 0LL;
} }
Div = duse + dsys + didl + diow + dstl; Div = cpu_use + cpu_sys + cpu_idl + cpu_iow + cpu_sto;

View File

@ -1,11 +1,11 @@
--- ---
pmap.c | 47 ++++++++++++++++++++++++++++++++----------- src/pmap.c | 47 ++++++++++++++++++++++++++++++++-----------
testsuite/pmap.test/pmap.exp | 17 +++++++-------- testsuite/pmap.test/pmap.exp | 17 +++++++--------
2 files changed, 44 insertions(+), 20 deletions(-) 2 files changed, 44 insertions(+), 20 deletions(-)
--- pmap.c --- src/pmap.c
+++ pmap.c 2018-06-05 09:37:34.404294888 +0000 +++ src/pmap.c 2023-09-12 12:23:39.537610124 +0000
@@ -49,7 +49,9 @@ const char *nls_Address, @@ -59,7 +59,9 @@ const char *nls_Address,
*nls_Kbytes, *nls_Kbytes,
*nls_Mode, *nls_Mode,
*nls_RSS, *nls_RSS,
@ -16,7 +16,7 @@
static void nls_initialize(void) static void nls_initialize(void)
{ {
@@ -73,7 +75,9 @@ static void nls_initialize(void) @@ -83,7 +85,9 @@ static void nls_initialize(void)
nls_Kbytes = _("Kbytes"); nls_Kbytes = _("Kbytes");
nls_Mode = _("Mode"); nls_Mode = _("Mode");
nls_RSS = _("RSS"); nls_RSS = _("RSS");
@ -26,20 +26,20 @@
} }
static int justify_print(const char *str, int width, int right) static int justify_print(const char *str, int width, int right)
@@ -141,10 +145,10 @@ static int d_option; @@ -150,10 +154,10 @@ static int d_option = 0;
static int n_option; static int n_option = 0;
static int N_option; static int N_option = 0;
static int q_option; static int q_option = 0;
-static int x_option; -static int x_option = 0;
+static int x_option = 1; +static int x_option = 1;
static int X_option; static int X_option = 0;
-static int map_desc_showpath; -static int map_desc_showpath;
+static int map_desc_showpath = 1; +static int map_desc_showpath = 1;
static unsigned shm_minor = ~0u; static unsigned shm_minor = ~0u;
@@ -522,12 +526,17 @@ static int one_proc(const proc_t * p) @@ -544,12 +548,17 @@ static int one_proc (struct pids_stack *
char perms[32] = ""; char perms[32] = "";
const char *cp2 = NULL; const char *cp2 = NULL;
unsigned long long rss = 0ull; unsigned long long rss = 0ull;
@ -55,12 +55,12 @@
int maxw1=0, maxw2=0, maxw3=0, maxw4=0, maxw5=0; int maxw1=0, maxw2=0, maxw3=0, maxw4=0, maxw5=0;
+ int maxw6=0, maxw7=0; + int maxw6=0, maxw7=0;
/* Overkill, but who knows what is proper? The "w" prog uses printf("%u: %s\n", PIDS_VAL(tgid, s_int, p, Pids_info), PIDS_VAL(cmdline, str, p, Pids_info));
* the tty width to determine this.
@@ -557,13 +566,15 @@ static int one_proc(const proc_t * p) @@ -572,13 +581,15 @@ static int one_proc (struct pids_stack *
if (x_option) { if (x_option) {
maxw1 = 16; maxw1 = 16;
if (sizeof(KLONG) == 4) maxw1 = 8; if (sizeof(long) == 4) maxw1 = 8;
- maxw2 = maxw3 = maxw4 = 7; - maxw2 = maxw3 = maxw4 = 7;
+ maxw2 = maxw3 = maxw4 = maxw6 = maxw7 = 7; + maxw2 = maxw3 = maxw4 = maxw6 = maxw7 = 7;
maxw5 = 5; maxw5 = 5;
@ -74,7 +74,7 @@
maxw5 = justify_print(nls_Mode, maxw5, 0); maxw5 = justify_print(nls_Mode, maxw5, 0);
justify_print(nls_Mapping, 0, 0); justify_print(nls_Mapping, 0, 0);
} }
@@ -603,6 +614,11 @@ static int one_proc(const proc_t * p) @@ -618,6 +629,11 @@ static int one_proc (struct pids_stack *
total_rss += smap_value; total_rss += smap_value;
continue; continue;
} }
@ -86,15 +86,16 @@
if (strcmp("Shared_Dirty", smap_key) == 0) { if (strcmp("Shared_Dirty", smap_key) == 0) {
shared_dirty = smap_value; shared_dirty = smap_value;
total_shared_dirty += smap_value; total_shared_dirty += smap_value;
@@ -615,15 +631,19 @@ static int one_proc(const proc_t * p) @@ -630,16 +646,20 @@ static int one_proc (struct pids_stack *
} }
if (strcmp("Swap", smap_key) == 0) { if (strcmp("Swap", smap_key) == 0) {
/* doesn't matter as long as last */ /* doesn't matter as long as last */
- if (cp2) printf("%0*" KLF "x %*lu %*llu %*llu %*s %s\n",
+ swap = smap_value; + swap = smap_value;
+ total_swap += smap_value; + total_swap += smap_value;
+ if (cp2) printf("%0*" KLF "x %*lu %*llu %*llu %*llu %*llu %*s %s\n", if (cp2)
maxw1, start, - printf("%0*lx %*lu %*llu %*llu %*s %s\n",
+ printf("%0*lx %*lu %*llu %*llu %*llu %*llu %*s %s\n",
maxw1, start_To_Avoid_Warning,
maxw2, (unsigned long)(diff >> 10), maxw2, (unsigned long)(diff >> 10),
maxw3, rss, maxw3, rss,
+ maxw6, pss, + maxw6, pss,
@ -105,10 +106,10 @@
/* reset some counters */ /* reset some counters */
- rss = shared_dirty = private_dirty = 0ull; - rss = shared_dirty = private_dirty = 0ull;
+ rss = pss = shared_dirty = private_dirty = swap = 0ull; + rss = pss = shared_dirty = private_dirty = swap = 0ull;
start = diff = end = 0; diff = end = 0;
perms[0] = '\0'; perms[0] = '\0';
cp2 = NULL; cp2 = NULL;
@@ -656,7 +676,6 @@ static int one_proc(const proc_t * p) @@ -673,7 +693,6 @@ static int one_proc (struct pids_stack *
if (perms[3] == 's') if (perms[3] == 's')
total_shared += diff; total_shared += diff;
if (perms[3] == 'p') { if (perms[3] == 'p') {
@ -116,7 +117,7 @@
if (perms[1] == 'w') if (perms[1] == 'w')
total_private_writeable += diff; total_private_writeable += diff;
else else
@@ -708,17 +727,21 @@ static int one_proc(const proc_t * p) @@ -725,17 +744,21 @@ static int one_proc (struct pids_stack *
justify_print("----------------", maxw1, 0); justify_print("----------------", maxw1, 0);
justify_print("-------", maxw2, 1); justify_print("-------", maxw2, 1);
justify_print("-------", maxw3, 1); justify_print("-------", maxw3, 1);
@ -140,7 +141,7 @@
} }
if (d_option) { if (d_option) {
printf printf
@@ -1028,16 +1051,18 @@ int main(int argc, char **argv) @@ -1052,16 +1075,18 @@ int main(int argc, char **argv)
while ((c = getopt_long(argc, argv, "xXrdqA:hVcC:nN:p", longopts, NULL)) != -1) while ((c = getopt_long(argc, argv, "xXrdqA:hVcC:nN:p", longopts, NULL)) != -1)
switch (c) { switch (c) {
case 'x': case 'x':
@ -162,7 +163,7 @@
case 'q': case 'q':
q_option = 1; q_option = 1;
--- testsuite/pmap.test/pmap.exp --- testsuite/pmap.test/pmap.exp
+++ testsuite/pmap.test/pmap.exp 2018-06-05 09:23:53.955370363 +0000 +++ testsuite/pmap.test/pmap.exp 2023-09-12 12:25:22.375764402 +0000
@@ -8,16 +8,16 @@ set pmap_procname "${mypid}:\\s+\\S+\[^\ @@ -8,16 +8,16 @@ set pmap_procname "${mypid}:\\s+\\S+\[^\
set pmap_initname "1:\\s+\\S+\[^\\r\]+\\s+" set pmap_initname "1:\\s+\\S+\[^\\r\]+\\s+"
set pmap_std_header $pmap_procname set pmap_std_header $pmap_procname
@ -205,12 +206,12 @@
set test "pmap device output quiet (dq)" set test "pmap device output quiet (dq)"
spawn $pmap -dq $mypid spawn $pmap -dq $mypid
expect_table $test $pmap_procname $pmap_device_items "\$" expect_table $test $pmap_procname $pmap_device_items "\$"
@@ -47,7 +46,7 @@ expect_table $test $pmap_procname $pmap_ @@ -50,7 +49,7 @@ if { [ file readable "/proc/self/smaps"
} else {
set test "pmap extended output" set test "pmap extended output"
spawn $pmap -x $mypid spawn $pmap -x $mypid
-expect_table $test $pmap_ext_header $pmap_ext_items $pmap_ext_footer - expect_table $test $pmap_ext_header $pmap_ext_items $pmap_ext_footer
+expect_table $test $pmap_std_header $pmap_std_items $pmap_std_footer + expect_table $test $pmap_std_header $pmap_std_items $pmap_std_footer
# -X and -XX have no real format as its dependent on smaps # -X and -XX have no real format as its dependent on smaps
set test "pmap extra extended output" set test "pmap extra extended output"

View File

@ -1,407 +0,0 @@
diff -ur procps-3.3.17/configure.ac procps-3.3.17-no-utmp/configure.ac
--- procps-3.3.17/configure.ac 2023-10-27 17:02:55.230522174 +0200
+++ procps-3.3.17-no-utmp/configure.ac 2023-10-27 17:05:56.027565296 +0200
@@ -214,6 +214,13 @@
AS_IF([test "x$with_systemd" != "xno"], [
PKG_CHECK_MODULES([SYSTEMD], [libsystemd])
AC_DEFINE(WITH_SYSTEMD, 1, [enable systemd support])
+
+ # The functions needed to replace utmp with logind are only available
+ # with systemd v254 or later.
+ old_LIBS="$LIBS"
+ LIBS="$LIBS $SYSTEMD_LIBS"
+ AC_CHECK_FUNCS([sd_session_get_leader])
+ LIBS="$old_LIBS"
])
AM_CONDITIONAL([WITH_SYSTEMD], [test x$with_systemd != xno])
diff -ur procps-3.3.17/proc/whattime.c procps-3.3.17-no-utmp/proc/whattime.c
--- procps-3.3.17/proc/whattime.c 2021-02-09 11:11:25.000000000 +0100
+++ procps-3.3.17-no-utmp/proc/whattime.c 2023-10-27 17:05:56.027565296 +0200
@@ -38,6 +38,15 @@
#include "whattime.h"
#include "sysinfo.h"
+#ifdef WITH_SYSTEMD
+#include <systemd/sd-daemon.h>
+#include <systemd/sd-login.h>
+#endif
+#ifdef WITH_ELOGIND
+#include <elogind/sd-daemon.h>
+#include <elogind/sd-login.h>
+#endif
+
static char buf[256];
static double av[3];
@@ -98,6 +107,11 @@
/* count the number of users */
numuser = 0;
+#if defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)
+ if (sd_booted() > 0)
+ numuser = sd_get_sessions(NULL);
+ else {
+#endif
setutent();
while ((utmpstruct = getutent())) {
if ((utmpstruct->ut_type == USER_PROCESS) &&
@@ -105,6 +119,10 @@
numuser++;
}
endutent();
+#if defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)
+ }
+#endif
+
pos += sprintf(buf + pos, "%2d user%s, ", numuser, numuser == 1 ? "" : "s");
Datei procps-3.3.17/screen.620TQo/23075..f05 ist ein Socket, während Datei procps-3.3.17-no-utmp/screen.620TQo/23075..f05 ein Socket ist.
diff -ur procps-3.3.17/w.c procps-3.3.17-no-utmp/w.c
--- procps-3.3.17/w.c 2023-10-27 17:02:55.194521966 +0200
+++ procps-3.3.17-no-utmp/w.c 2023-10-27 18:10:00.371042829 +0200
@@ -56,11 +56,22 @@
#include <time.h>
#include <unistd.h>
#ifdef HAVE_UTMPX_H
-# include <utmpx.h>
+#include <utmpx.h>
+#ifndef HAVE_UT_HOSTSIZE_IN_UTMPX
+#include <utmp.h>
+#endif
#else
# include <utmp.h>
#endif
#include <arpa/inet.h>
+#ifdef WITH_SYSTEMD
+# include <systemd/sd-login.h>
+# include <systemd/sd-daemon.h>
+#endif
+#ifdef WITH_ELOGIND
+# include <elogind/sd-login.h>
+# include <elogind/sd-daemon.h>
+#endif
static int ignoreuser = 0; /* for '-u' */
static int oldstyle = 0; /* for '-o' */
@@ -72,12 +83,6 @@
typedef struct utmp utmp_t;
#endif
-#if !defined(UT_HOSTSIZE) || defined(__UT_HOSTSIZE)
-# define UT_HOSTSIZE __UT_HOSTSIZE
-# define UT_LINESIZE __UT_LINESIZE
-# define UT_NAMESIZE __UT_NAMESIZE
-#endif
-
#ifdef W_SHOWFROM
# define FROM_STRING "on"
#else
@@ -198,7 +203,25 @@
/* This routine prints either the hostname or the IP address of the remote */
-static void print_from(const utmp_t *restrict const u, const int ip_addresses, const int fromlen) {
+static void print_from(
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ const char *session,
+#endif
+ const utmp_t *restrict const u, const int ip_addresses, const int fromlen) {
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ if (session) {
+ char *host = NULL;
+ int r;
+
+ r = sd_session_get_remote_host(session, &host);
+ if (r < 0 || host == NULL)
+ print_host("", 0, fromlen);
+ else {
+ print_host(host, strlen(host), fromlen == 0?strlen(host):fromlen);
+ free(host);
+ }
+ } else {
+#endif
char buf[fromlen + 1];
char buf_ipv6[INET6_ADDRSTRLEN];
int len;
@@ -243,6 +266,9 @@
#else
print_host(u->ut_host, UT_HOSTSIZE, fromlen);
#endif
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ }
+#endif
}
@@ -341,7 +367,11 @@
* the user for that login session is doing currently. This the
* essential core of 'w'.
*/
-static const proc_t *getproc(const utmp_t * restrict const u,
+static const proc_t *getproc(
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ const char *session,
+#endif
+ const utmp_t * restrict const u,
const char *restrict const tty,
unsigned long long *restrict const jcpu,
int *restrict const found_utpid)
@@ -351,9 +381,16 @@
const proc_t *best = NULL;
const proc_t *secondbest = NULL;
unsigned uid = ~0U;
+ pid_t ut_pid = -1;
*found_utpid = 0;
if (!ignoreuser) {
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ if (session) {
+ if (sd_session_get_uid(session, &uid) < 0)
+ return 0;
+ } else {
+#endif
char buf[UT_NAMESIZE + 1];
/* pointer to static data */
struct passwd *passwd_data;
@@ -364,12 +401,21 @@
return NULL;
uid = passwd_data->pw_uid;
/* OK to have passwd_data go out of scope here */
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ }
+#endif
}
line = tty_to_dev(tty);
*jcpu = 0;
+ if (u)
+ ut_pid = u->ut_pid;
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ else
+ sd_session_get_leader(session, &ut_pid);
+#endif
for (; *pptr; pptr++) {
- const proc_t *restrict const tmp = *pptr;
- if (unlikely(tmp->tgid == u->ut_pid)) {
+ const proc_t *restrict const tmp = *pptr;
+ if (unlikely(tmp->tgid == ut_pid)) {
*found_utpid = 1;
if (!best)
best = tmp;
@@ -393,7 +439,11 @@
return best ? best : secondbest;
}
-static void showinfo(utmp_t * u, int formtype, int maxcmd, int from,
+static void showinfo(
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ const char *session, const char *name,
+#endif
+ utmp_t * u, int formtype, int maxcmd, int from,
int userlen, int fromlen, const int ip_addresses)
{
unsigned long long jcpu;
@@ -402,14 +452,36 @@
char uname[UT_NAMESIZE + 1] = "", tty[5 + UT_LINESIZE + 1] = "/dev/";
const proc_t *best;
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ if (session) {
+ char *sd_tty;
+
+ if (sd_session_get_tty(session, &sd_tty) >= 0) {
+ for (i = 0; i < strlen (sd_tty); i++)
+ /* clean up tty if garbled */
+ if (isalnum(sd_tty[i]) || (sd_tty[i] == '/'))
+ tty[i + 5] = sd_tty[i];
+ else
+ tty[i + 5] = '\0';
+ free(sd_tty);
+ }
+ } else {
+#endif
for (i = 0; i < UT_LINESIZE; i++)
/* clean up tty if garbled */
if (isalnum(u->ut_line[i]) || (u->ut_line[i] == '/'))
tty[i + 5] = u->ut_line[i];
else
tty[i + 5] = '\0';
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ }
+#endif
- best = getproc(u, tty + 5, &jcpu, &ut_pid_found);
+ best = getproc(
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ session,
+#endif
+ u, tty + 5, &jcpu, &ut_pid_found);
/*
* just skip if stale utmp entry (i.e. login proc doesn't
@@ -420,26 +492,56 @@
if (!ut_pid_found)
return;
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ if (name)
+ strncpy(uname, name, UT_NAMESIZE);
+ else
+#endif
+ strncpy(uname, u->ut_user, UT_NAMESIZE);
/* force NUL term for printf */
- strncpy(uname, u->ut_user, UT_NAMESIZE);
+ uname[UT_NAMESIZE] = '\0';
if (formtype) {
- int utlnlen = 8;
- if (formtype > 1) {
- userlen = strnlen(uname, UT_NAMESIZE);
- fromlen = strnlen(u->ut_host, UT_HOSTSIZE);
- utlnlen = strnlen(u->ut_line, UT_LINESIZE);
- maxcmd = MAX_CMD_WIDTH;
+ int utlnlen = 8;
+ if (formtype > 1) {
+ userlen = strnlen(uname, UT_NAMESIZE);
+ if (u) {
+ fromlen = strnlen(u->ut_host, UT_HOSTSIZE);
+ utlnlen = strnlen(u->ut_line, UT_LINESIZE);
+ } else {
+ fromlen = 0;
+ utlnlen = strlen (tty+5);
}
- printf("%-*.*s%-*.*s", userlen + 1, userlen, uname, utlnlen + 1, utlnlen, u->ut_line);
+ maxcmd = MAX_CMD_WIDTH;
+ }
+ printf("%-*.*s%-*.*s", userlen + 1, userlen, uname, utlnlen + 1, utlnlen, tty+5);
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ if (session) {
+ uint64_t ltime;
+
if (from)
- print_from(u, ip_addresses, fromlen);
+ print_from(session, NULL, ip_addresses, fromlen);
+
+ sd_session_get_start_time(session, &ltime);
+ print_logintime(ltime/((uint64_t) 1000000ULL), stdout);
+ } else {
+#endif
+ if (from)
+ print_from(
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ NULL,
+#endif
+ u, ip_addresses, fromlen);
+
#ifdef HAVE_UTMPX_H
print_logintime(u->ut_tv.tv_sec, stdout);
#else
print_logintime(u->ut_time, stdout);
#endif
- if (*u->ut_line == ':')
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ }
+#endif
+ if (u && *u->ut_line == ':')
/* idle unknown for xdm logins */
printf(" ?xdm? ");
else
@@ -454,11 +556,15 @@
} else
printf(" ? ");
} else {
- printf("%-*.*s%-9.8s", userlen + 1, userlen, u->ut_user,
- u->ut_line);
+ printf("%-*.*s%-9.8s", userlen + 1, userlen, uname,
+ tty+5);
if (from)
- print_from(u, ip_addresses, fromlen);
- if (*u->ut_line == ':')
+ print_from(
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ session,
+#endif
+ u, ip_addresses, fromlen);
+ if (u && *u->ut_line == ':')
/* idle unknown for xdm logins */
printf(" ?xdm? ");
else
@@ -635,7 +741,40 @@
else
printf(_(" IDLE WHAT\n"));
}
-
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ if (sd_booted() > 0) {
+ char **sessions_list;
+ int sessions;
+ int i;
+
+ sessions = sd_get_sessions (&sessions_list);
+ if (sessions < 0 && sessions != -ENOENT)
+ error(EXIT_FAILURE, -sessions, _("error getting sessions"));
+
+ if (sessions >= 0) {
+ for (int i = 0; i < sessions; i++) {
+ char *name;
+ int r;
+
+ if ((r = sd_session_get_username(sessions_list[i], &name)) < 0)
+ error(EXIT_FAILURE, -r, _("get user name failed"));
+
+ if (user) {
+ if (!strcmp(name, user))
+ showinfo(sessions_list[i], name, NULL, longform,
+ maxcmd, from, userlen, fromlen,
+ ip_addresses);
+ } else {
+ showinfo(sessions_list[i], name, NULL, longform, maxcmd,
+ from, userlen, fromlen, ip_addresses);
+ }
+ free(name);
+ free(sessions_list[i]);
+ }
+ free(sessions_list);
+ }
+ } else {
+#endif
#ifdef HAVE_UTMPX_H
setutxent();
#else
@@ -654,7 +793,11 @@
if (u->ut_type != USER_PROCESS)
continue;
if (!strncmp(u->ut_user, user, UT_NAMESIZE))
- showinfo(u, longform, maxcmd, from, userlen,
+ showinfo(
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ NULL, NULL,
+#endif
+ u, longform, maxcmd, from, userlen,
fromlen, ip_addresses);
}
} else {
@@ -669,7 +812,11 @@
if (u->ut_type != USER_PROCESS)
continue;
if (*u->ut_user)
- showinfo(u, longform, maxcmd, from, userlen,
+ showinfo(
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ NULL, NULL,
+#endif
+ u, longform, maxcmd, from, userlen,
fromlen, ip_addresses);
}
}
@@ -678,6 +825,9 @@
#else
endutent();
#endif
+#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ }
+#endif
return EXIT_SUCCESS;
}

BIN
procps-ng-3.3.17.tar.xz (Stored with Git LFS)

Binary file not shown.

View File

@ -1,99 +0,0 @@
---
ps/common.h | 1 +
ps/global.c | 5 ++++-
ps/output.c | 19 ++++++++++---------
3 files changed, 15 insertions(+), 10 deletions(-)
--- ps/common.h
+++ ps/common.h 2018-04-04 11:14:33.915688098 +0000
@@ -303,6 +303,7 @@ extern int running_only;
extern int screen_cols;
extern int screen_rows;
extern time_t seconds_since_boot;
+extern unsigned long long jiffies_since_boot;
extern selection_node *selection_list;
extern unsigned simple_select;
extern sort_node *sort_list;
--- ps/global.c
+++ ps/global.c 2018-04-04 11:14:33.915688098 +0000
@@ -78,6 +78,7 @@ int prefer_bsd_defaults = -1
int screen_cols = -1;
int screen_rows = -1;
time_t seconds_since_boot = -1;
+unsigned long long jiffies_since_boot = -1;
selection_node *selection_list = (selection_node *)0xdeadbeef;
unsigned simple_select = 0xffffffff;
sort_node *sort_list = (sort_node *)0xdeadbeef; /* ready-to-use sort list */
@@ -361,6 +362,7 @@ static const char *set_personality(void)
/************ Call this to reinitialize everything ***************/
void reset_global(void){
static proc_t p;
+ double uptime_secs;
reset_selection_list();
look_up_our_self(&p);
set_screen_size();
@@ -383,7 +385,8 @@ void reset_global(void){
negate_selection = 0;
page_size = getpagesize();
running_only = 0;
- seconds_since_boot = uptime(0,0);
+ seconds_since_boot = uptime(&uptime_secs,0);
+ jiffies_since_boot = ((long double)uptime_secs * Hertz);
selection_list = NULL;
simple_select = 0;
sort_list = NULL;
--- ps/output.c
+++ ps/output.c 2018-04-04 11:14:33.915688098 +0000
@@ -134,6 +134,7 @@ static int sr_ ## NAME (const proc_t* P,
#define cook_time(P) (P->utime + P->stime) / Hertz
#define cook_etime(P) (((unsigned long long)seconds_since_boot >= (P->start_time / Hertz)) ? ((unsigned long long)seconds_since_boot - (P->start_time / Hertz)) : 0)
+#define cook_jtime(P) (((unsigned long long)jiffies_since_boot >= (P->start_time)) ? ((unsigned long long)jiffies_since_boot - (P->start_time)) : 0)
#define CMP_COOKED_TIME(NAME) \
static int sr_ ## NAME (const proc_t* P, const proc_t* Q) { \
@@ -507,11 +508,11 @@ static int pr_etimes(char *restrict cons
static int pr_c(char *restrict const outbuf, const proc_t *restrict const pp){
unsigned long long total_time; /* jiffies used by this process */
unsigned pcpu = 0; /* scaled %cpu, 99 means 99% */
- unsigned long long seconds; /* seconds of process life */
+ unsigned long long jiffies; /* jiffies of process life */
total_time = pp->utime + pp->stime;
if(include_dead_children) total_time += (pp->cutime + pp->cstime);
- seconds = cook_etime(pp);
- if(seconds) pcpu = (total_time * 100ULL / Hertz) / seconds;
+ jiffies = cook_jtime(pp);
+ if(jiffies) pcpu = (total_time * 100ULL) / jiffies;
if (pcpu > 99U) pcpu = 99U;
return snprintf(outbuf, COLWID, "%2u", pcpu);
}
@@ -519,11 +520,11 @@ static int pr_c(char *restrict const out
static int pr_pcpu(char *restrict const outbuf, const proc_t *restrict const pp){
unsigned long long total_time; /* jiffies used by this process */
unsigned pcpu = 0; /* scaled %cpu, 999 means 99.9% */
- unsigned long long seconds; /* seconds of process life */
+ unsigned long long jiffies; /* jiffies of process life */
total_time = pp->utime + pp->stime;
if(include_dead_children) total_time += (pp->cutime + pp->cstime);
- seconds = cook_etime(pp);
- if(seconds) pcpu = (total_time * 1000ULL / Hertz) / seconds;
+ jiffies = cook_jtime(pp);
+ if(jiffies) pcpu = (total_time * 1000ULL) / jiffies;
if (pcpu > 999U)
return snprintf(outbuf, COLWID, "%u", pcpu/10U);
return snprintf(outbuf, COLWID, "%u.%u", pcpu/10U, pcpu%10U);
@@ -532,11 +533,11 @@ static int pr_pcpu(char *restrict const
static int pr_cp(char *restrict const outbuf, const proc_t *restrict const pp){
unsigned long long total_time; /* jiffies used by this process */
unsigned pcpu = 0; /* scaled %cpu, 999 means 99.9% */
- unsigned long long seconds; /* seconds of process life */
+ unsigned long long jiffies; /* jiffies of process life */
total_time = pp->utime + pp->stime;
if(include_dead_children) total_time += (pp->cutime + pp->cstime);
- seconds = cook_etime(pp);
- if(seconds) pcpu = (total_time * 1000ULL / Hertz) / seconds;
+ jiffies = cook_jtime(pp);
+ if(jiffies) pcpu = (total_time * 1000ULL) / jiffies;
if (pcpu > 999U) pcpu = 999U;
return snprintf(outbuf, COLWID, "%3u", pcpu);
}

View File

@ -1,29 +0,0 @@
Do not setup SIGHUP signal handler if we are in the batch mode
Top enables a signal handler for the SIGHUP signal (loss of terminal). While
this makes sense for top's default interactive mode, it doesn't make any sense
for batch mode. If you run top in nohup just to collect data over time and
disconnect top finishes which is not what one would expect.
Index: procps-3.2.8/top.c
---
top/top.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
--- top/top.c
+++ top/top.c 2018-04-04 11:33:59.278280201 +0000
@@ -3691,7 +3691,13 @@ static void before (char *me) {
sa.sa_flags = 0;
for (i = SIGRTMAX; i; i--) {
switch (i) {
- case SIGALRM: case SIGHUP: case SIGINT:
+ case SIGHUP:
+ if (Batch)
+ sa.sa_handler = SIG_IGN;
+ else
+ sa.sa_handler = sig_endpgm;
+ break;
+ case SIGALRM: case SIGINT:
case SIGPIPE: case SIGQUIT: case SIGTERM:
case SIGUSR1: case SIGUSR2:
sa.sa_handler = sig_endpgm;

View File

@ -8,12 +8,12 @@ Ignore it for avoiding the kernel warning message.
Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
--- ---
sysctl.c | 1 + src/sysctl.c | 1 +
1 file changed, 1 insertion(+) 1 file changed, 1 insertion(+)
--- a/sysctl.c --- a/src/sysctl.c
+++ b/sysctl.c +++ b/src/sysctl.c
@@ -59,6 +59,7 @@ static const char DEFAULT_PRELOAD[] = "/ @@ -63,6 +58,7 @@ static const char DEFAULT_PRELOAD[] = "/
static const char *DEPRECATED[] = { static const char *DEPRECATED[] = {
"base_reachable_time", "base_reachable_time",
"retrans_time", "retrans_time",

View File

@ -1,11 +1,11 @@
--- ---
top/top.c | 6 +++--- src/top/top.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-) 1 file changed, 3 insertions(+), 3 deletions(-)
--- top/top.c --- src/top/top.c
+++ top/top.c 2018-04-04 11:49:56.472660056 +0000 +++ src/top/top.c 2022-03-29 10:24:43.327490984 +0000
@@ -1626,9 +1626,9 @@ static inline const char *make_str_utf8 @@ -1684,9 +1684,9 @@ static inline const char *make_str_utf8
static const char *scale_mem (int target, unsigned long num, int width, int justr) { static const char *scale_mem (int target, float num, int width, int justr) {
// SK_Kb SK_Mb SK_Gb SK_Tb SK_Pb SK_Eb // SK_Kb SK_Mb SK_Gb SK_Tb SK_Pb SK_Eb
#ifdef BOOST_MEMORY #ifdef BOOST_MEMORY
- static const char *fmttab[] = { "%.0f", "%#.1f%c", "%#.3f%c", "%#.3f%c", "%#.3f%c", NULL }; - static const char *fmttab[] = { "%.0f", "%#.1f%c", "%#.3f%c", "%#.3f%c", "%#.3f%c", NULL };
@ -15,13 +15,13 @@
+ static const char *fmttab[] = { "%.0f", "%.1f%c", "%.1f%c", "%.1f%c", "%.1f%c", "%.1f%c", NULL }; + static const char *fmttab[] = { "%.0f", "%.1f%c", "%.1f%c", "%.1f%c", "%.1f%c", "%.1f%c", NULL };
#endif #endif
static char buf[SMLBUFSIZ]; static char buf[SMLBUFSIZ];
float scaled_num; char *psfx;
@@ -1640,7 +1640,7 @@ static const char *scale_mem (int target @@ -1696,7 +1696,7 @@ static const char *scale_mem (int target
if (Rc.zero_suppress && 0 >= num)
goto end_justifies; goto end_justifies;
scaled_num = num;
- for (i = SK_Kb, psfx = Scaled_sfxtab; i < SK_Eb; psfx++, i++) { - for (i = SK_Kb, psfx = Scaled_sfxtab; i < SK_Eb; psfx++, i++) {
+ for (i = SK_Kb, psfx = Scaled_sfxtab; i <= SK_Eb; psfx++, i++) { + for (i = SK_Kb, psfx = Scaled_sfxtab; i <= SK_Eb; psfx++, i++) {
if (i >= target if (i >= target
&& (width >= snprintf(buf, sizeof(buf), fmttab[i], scaled_num, *psfx))) && (width >= snprintf(buf, sizeof(buf), fmttab[i], num, *psfx)))
goto end_justifies; goto end_justifies;

View File

@ -1,11 +1,11 @@
--- ---
proc/readproc.c | 20 ++++++++++---------- library/readproc.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-) 1 file changed, 10 insertions(+), 10 deletions(-)
--- proc/readproc.c --- library/readproc.c
+++ proc/readproc.c 2018-06-05 08:54:06.408030693 +0000 +++ library/readproc.c 2022-03-28 11:51:04.751862744 +0000
@@ -675,7 +675,7 @@ static int file2str(const char *director @@ -735,7 +735,7 @@ static int file2str(const char *director
else ub->buf = xcalloc((ub->siz = buffGRW)); }
len = snprintf(path, sizeof path, "%s/%s", directory, what); len = snprintf(path, sizeof path, "%s/%s", directory, what);
if (len <= 0 || (size_t)len >= sizeof path) return -1; if (len <= 0 || (size_t)len >= sizeof path) return -1;
- if (-1 == (fd = open(path, O_RDONLY, 0))) return -1; - if (-1 == (fd = open(path, O_RDONLY, 0))) return -1;
@ -13,8 +13,8 @@
while (0 < (num = read(fd, ub->buf + tot_read, ub->siz - tot_read))) { while (0 < (num = read(fd, ub->buf + tot_read, ub->siz - tot_read))) {
tot_read += num; tot_read += num;
if (tot_read < ub->siz) break; if (tot_read < ub->siz) break;
@@ -695,25 +695,25 @@ static int file2str(const char *director @@ -759,25 +759,25 @@ static int file2str(const char *director
static char** file2strvec(const char* directory, const char* what) { static char **file2strvec(const char *directory, const char *what) {
char buf[2048]; /* read buf bytes at a time */ char buf[2048]; /* read buf bytes at a time */
char *p, *rbuf = 0, *endbuf, **q, **ret, *strp; char *p, *rbuf = 0, *endbuf, **q, **ret, *strp;
- int fd, tot = 0, n, c, end_of_file = 0; - int fd, tot = 0, n, c, end_of_file = 0;
@ -31,7 +31,7 @@
/* read whole file into a memory buffer, allocating as we go */ /* read whole file into a memory buffer, allocating as we go */
while ((n = read(fd, buf, sizeof buf - 1)) >= 0) { while ((n = read(fd, buf, sizeof buf - 1)) >= 0) {
- if (n < (int)(sizeof buf - 1)) - if (n < (int)(sizeof buf - 1))
+ if (n < sizeof buf - 1) + if (n < (sizeof(buf) - 1))
end_of_file = 1; end_of_file = 1;
- if (n <= 0 && tot <= 0) { /* nothing read now, nothing read before */ - if (n <= 0 && tot <= 0) { /* nothing read now, nothing read before */
+ if (n <= 0 && tot <= 0) /* nothing read now, nothing read before */ + if (n <= 0 && tot <= 0) /* nothing read now, nothing read before */
@ -46,7 +46,7 @@
end_of_file = 1; /* integer overflow: null-terminate and break */ end_of_file = 1; /* integer overflow: null-terminate and break */
n = 0; /* but tot > 0 */ n = 0; /* but tot > 0 */
} }
@@ -741,7 +741,7 @@ static char** file2strvec(const char* di @@ -811,7 +811,7 @@ static char **file2strvec(const char *di
c = sizeof(char*); /* one extra for NULL term */ c = sizeof(char*); /* one extra for NULL term */
for (p = rbuf; p < endbuf; p++) { for (p = rbuf; p < endbuf; p++) {
if (!*p || *p == '\n') { if (!*p || *p == '\n') {
@ -55,7 +55,7 @@
c += sizeof(char*); c += sizeof(char*);
} }
if (*p == '\n') if (*p == '\n')
@@ -753,7 +753,7 @@ static char** file2strvec(const char* di @@ -824,7 +824,7 @@ static char **file2strvec(const char *di
q = ret = (char**) (endbuf+align); /* ==> free(*ret) to dealloc */ q = ret = (char**) (endbuf+align); /* ==> free(*ret) to dealloc */
for (strp = p = rbuf; p < endbuf; p++) { for (strp = p = rbuf; p < endbuf; p++) {
if (!*p) { /* NUL char implies that */ if (!*p) { /* NUL char implies that */

View File

@ -4,32 +4,30 @@
2 files changed, 9 insertions(+), 1 deletion(-) 2 files changed, 9 insertions(+), 1 deletion(-)
--- Makefile.am --- Makefile.am
+++ Makefile.am 2018-04-04 12:28:14.937957527 +0000 +++ Makefile.am 2022-10-20 13:21:37.505517043 +0000
@@ -171,7 +171,7 @@ else @@ -191,7 +191,7 @@ src_top_top_SOURCES += local/strverscmp.
slabtop_LDADD = $(LDADD) @NCURSES_LIBS@
endif endif
-top_top_LDADD = $(LDADD) @NCURSES_LIBS@ $(DL_LIB) src_top_top_CFLAGS = @NCURSES_CFLAGS@
+top_top_LDADD = $(LDADD) @TOP_NCURSES_LIBS@ $(DL_LIB) -src_top_top_LDADD = $(LDADD) @NCURSES_LIBS@ $(DL_LIB)
+src_top_top_LDADD = $(LDADD) @TOP_NCURSES_LIBS@ $(DL_LIB)
endif endif
if BUILD_SKILL if BUILD_SKILL
--- configure.ac --- configure.ac
+++ configure.ac 2018-04-04 12:29:23.364676155 +0000 +++ configure.ac 2022-10-20 13:23:50.707138810 +0000
@@ -194,8 +194,16 @@ else @@ -281,6 +281,14 @@ fi
else # else
WATCH_NCURSES_LIBS="$NCURSES_LIBS" # WATCH_NCURSES_LIBS="$NCURSES_LIBS"
fi # fi
+ cf_tinfo="" +cf_tinfo=""
+ AC_CHECK_LIB(tinfo, setupterm, [cf_tinfo="tinfo"]) +AC_CHECK_LIB(tinfo, setupterm, [cf_tinfo="tinfo"])
+ if test x$cf_tinfo = xtinfo ; then +if test x$cf_tinfo = xtinfo ; then
+ TOP_NCURSES_LIBS="-ltinfo" + TOP_NCURSES_LIBS="-ltinfo"
+ else +else
+ TOP_NCURSES_LIBS="$NCURSES_LIBS" + TOP_NCURSES_LIBS="$NCURSES_LIBS"
+ fi +fi
fi
AC_SUBST([NCURSES_LIBS])
+AC_SUBST([TOP_NCURSES_LIBS]) +AC_SUBST([TOP_NCURSES_LIBS])
AC_SUBST([WATCH_NCURSES_LIBS])
AC_SUBST([WATCH_NCURSES_CFLAGS])
AC_ARG_WITH([systemd],
[AS_HELP_STRING([--with-systemd], [enable systemd support])],

View File

@ -1,15 +1,15 @@
--- ---
vmstat.c | 4 ++-- src/vmstat.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-) 1 file changed, 2 insertions(+), 2 deletions(-)
--- vmstat.c --- src/vmstat.c
+++ vmstat.c 2016-07-11 13:18:04.993371059 +0000 +++ src/vmstat.c 2023-02-08 08:59:05.175343180 +0000
@@ -273,8 +273,8 @@ static void new_header(void) @@ -333,8 +333,8 @@ static void new_header(void)
static unsigned long unitConvert(unsigned long size) static unsigned long unitConvert(unsigned long size)
{ {
- float cvSize; - double cvSize;
- cvSize = (float)size / dataUnit * ((statMode == SLABSTAT) ? 1 : 1024); - cvSize = (double)size / dataUnit * ((statMode == SLABSTAT) ? 1 : 1024);
+ long double cvSize; + long double cvSize;
+ cvSize = (long double)size / dataUnit * ((statMode == SLABSTAT) ? 1 : 1024); + cvSize = (long double)size / dataUnit * ((statMode == SLABSTAT) ? 1 : 1024);
return ((unsigned long)cvSize); return ((unsigned long)cvSize);

View File

@ -1,11 +1,11 @@
--- ---
w.1 | 3 +++ procps-ng-4.0.4/man/w.1 | 3 +++
w.c | 19 ++++++++++++++++--- procps-ng-4.0.4/src/w.c | 27 +++++++++++++++++++++++----
2 files changed, 19 insertions(+), 3 deletions(-) 2 files changed, 26 insertions(+), 4 deletions(-)
--- w.1 --- procps-ng-4.0.4/man/w.1
+++ w.1 2023-08-18 08:21:51.764340794 +0000 +++ procps-ng-4.0.4/man/w.1 2023-11-13 12:22:54.245834105 +0000
@@ -40,6 +40,9 @@ and a @@ -51,6 +51,9 @@ and a
\fB\-s\fR, \fB\-\-short\fR \fB\-s\fR, \fB\-\-short\fR
Use the short format. Don't print the login time, JCPU or PCPU times. Use the short format. Don't print the login time, JCPU or PCPU times.
.TP .TP
@ -15,34 +15,56 @@
\fB\-f\fR, \fB\-\-from\fR \fB\-f\fR, \fB\-\-from\fR
Toggle printing the Toggle printing the
.B from .B from
--- w.c --- procps-ng-4.0.4/src/w.c
+++ w.c 2023-08-18 08:37:32.143482035 +0000 +++ procps-ng-4.0.4/src/w.c 2023-11-13 12:47:16.843483082 +0000
@@ -394,7 +394,7 @@ static const proc_t *getproc(const utmp_ @@ -218,7 +218,8 @@ static void print_from(
if (r < 0 || host == NULL)
print_host("", 0, fromlen);
else {
- print_host(host, strlen(host), fromlen);
+ print_host(host, strlen(host),
+ fromlen == 0?strlen(host):fromlen);
free(host);
} }
} else {
static void showinfo(utmp_t * u, int formtype, int maxcmd, int from, @@ -510,7 +511,7 @@ static int find_best_proc(
- const int userlen, const int fromlen, const int ip_addresses) static void showinfo(
+ int userlen, int fromlen, const int ip_addresses) const char *session, const char *name,
utmp_t * u, const int longform, int maxcmd, int from,
- const int userlen, const int fromlen, const int ip_addresses,
+ int userlen, int fromlen, const int ip_addresses,
const int pids)
{ {
unsigned long long jcpu; unsigned long long jcpu, pcpu;
int ut_pid_found; @@ -520,6 +521,7 @@ static void showinfo(
@@ -424,7 +424,14 @@ static void showinfo(utmp_t * u, int for char cmdline[MAX_CMD_WIDTH + 1];
strncpy(uname, u->ut_user, UT_NAMESIZE); pid_t best_pid = -1;
int pids_length = 0;
if (formtype) {
- printf("%-*.*s%-9.8s", userlen + 1, userlen, uname, u->ut_line);
+ int utlnlen = 8; + int utlnlen = 8;
+ if (formtype > 1) {
+ userlen = strnlen(uname, UT_NAMESIZE); strcpy(cmdline, "-");
@@ -572,7 +574,18 @@ static void showinfo(
/* force NUL term for printf */
uname[UT_NAMESIZE] = '\0';
- printf("%-*.*s%-9.8s", userlen + 1, userlen, uname, tty + 5);
+ if (longform > 1) {
+ userlen = strlen(uname);
+ if (u) {
+ fromlen = strnlen(u->ut_host, UT_HOSTSIZE); + fromlen = strnlen(u->ut_host, UT_HOSTSIZE);
+ utlnlen = strnlen(u->ut_line, UT_LINESIZE); + utlnlen = strnlen(u->ut_line, UT_LINESIZE);
+ } else {
+ fromlen = 0;
+ utlnlen = strlen (tty+5);
+ }
+ maxcmd = MAX_CMD_WIDTH; + maxcmd = MAX_CMD_WIDTH;
+ } + }
+ printf("%-*.*s%-*.*s", userlen + 1, userlen, uname, utlnlen + 1, utlnlen, u->ut_line); + printf("%-*.*s%-*.*s", userlen + 1, userlen, uname, utlnlen + 1, utlnlen, tty+5);
if (from) if (from)
print_from(u, ip_addresses, fromlen); print_from(session, NULL, ip_addresses, fromlen);
#ifdef HAVE_UTMPX_H
@@ -478,6 +485,7 @@ static void __attribute__ ((__noreturn__ @@ -643,6 +656,7 @@ static void __attribute__ ((__noreturn__
fputs(_(" -h, --no-header do not print header\n"),out); fputs(_(" -h, --no-header do not print header\n"),out);
fputs(_(" -u, --no-current ignore current process username\n"),out); fputs(_(" -u, --no-current ignore current process username\n"),out);
fputs(_(" -s, --short short format\n"),out); fputs(_(" -s, --short short format\n"),out);
@ -50,7 +72,7 @@
fputs(_(" -f, --from show remote hostname field\n"),out); fputs(_(" -f, --from show remote hostname field\n"),out);
fputs(_(" -o, --old-style old style output\n"),out); fputs(_(" -o, --old-style old style output\n"),out);
fputs(_(" -i, --ip-addr display IP address instead of hostname (if possible)\n"), out); fputs(_(" -i, --ip-addr display IP address instead of hostname (if possible)\n"), out);
@@ -514,6 +522,7 @@ int main(int argc, char **argv) @@ -681,6 +695,7 @@ int main(int argc, char **argv)
{"no-header", no_argument, NULL, 'h'}, {"no-header", no_argument, NULL, 'h'},
{"no-current", no_argument, NULL, 'u'}, {"no-current", no_argument, NULL, 'u'},
{"short", no_argument, NULL, 's'}, {"short", no_argument, NULL, 's'},
@ -58,16 +80,16 @@
{"from", no_argument, NULL, 'f'}, {"from", no_argument, NULL, 'f'},
{"old-style", no_argument, NULL, 'o'}, {"old-style", no_argument, NULL, 'o'},
{"ip-addr", no_argument, NULL, 'i'}, {"ip-addr", no_argument, NULL, 'i'},
@@ -535,7 +544,7 @@ int main(int argc, char **argv) @@ -703,7 +718,7 @@ int main(int argc, char **argv)
#endif #endif
while ((ch = while ((ch =
- getopt_long(argc, argv, "husfoVi", longopts, NULL)) != -1) - getopt_long(argc, argv, "husfoVip", longopts, NULL)) != -1)
+ getopt_long(argc, argv, "husnfoVi", longopts, NULL)) != -1) + getopt_long(argc, argv, "husnfoVip", longopts, NULL)) != -1)
switch (ch) { switch (ch) {
case 'h': case 'h':
header = 0; header = 0;
@@ -546,6 +555,10 @@ int main(int argc, char **argv) @@ -711,6 +726,10 @@ int main(int argc, char **argv)
case 's': case 's':
longform = 0; longform = 0;
break; break;

View File

@ -1,14 +0,0 @@
---
proc/libprocps.sym | 1 +
1 file changed, 1 insertion(+)
--- proc/libprocps.sym
+++ proc/libprocps.sym 2016-07-11 12:45:32.463107052 +0000
@@ -13,6 +13,7 @@ global:
get_ns_id;
get_ns_name;
get_pid_digits;
+ get_proc_stats;
get_slabinfo;
getbtime;
getdiskstat;

View File

@ -0,0 +1,65 @@
---
local/strutils.c | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
--- local/strutils.c
+++ local/strutils.c 2021-02-09 10:11:25.000000000 +0000
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#include <float.h>
+#include <math.h>
#include <stdlib.h>
#include <ctype.h>
@@ -71,9 +73,9 @@ double strtod_or_err(const char *str, co
*/
double strtod_nol_or_err(char *str, const char *errmesg)
{
- double num;
+ long double num;
const char *cp, *radix;
- double mult;
+ long double mult;
int negative = 0;
if (str != NULL && *str != '\0') {
@@ -95,29 +97,29 @@ double strtod_nol_or_err(char *str, cons
mult=0.1;
while(isdigit(*radix)) {
radix++;
- mult *= 10;
+ mult *= 10.0;
}
while(isdigit(*cp)) {
- num += (*cp - '0') * mult;
- mult /= 10;
+ num += (long double)(*cp - '0') * mult;
+ mult /= 10.0;
cp++;
}
/* got the integers */
if (*cp == '\0')
- return (negative?-num:num);
+ return (double)(negative?-num:num);
if (*cp != '.' && *cp != ',')
error(EXIT_FAILURE, EINVAL, "%s: '%s'", errmesg, str);
cp++;
mult = 0.1;
while(isdigit(*cp)) {
- num += (*cp - '0') * mult;
- mult /= 10;
+ num += (long double)(*cp - '0') * mult;
+ mult /= 10.0;
cp++;
}
if (*cp == '\0')
- return (negative?-num:num);
+ return (double)(negative?-num:num);
}
error(EXIT_FAILURE, errno, "%s: '%s'", errmesg, str);
- return 0;
+ return (double)0;
}

View File

@ -0,0 +1,26 @@
---
library/meminfo.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
--- library/meminfo.c
+++ library/meminfo.c 2022-03-29 09:50:45.076823155 +0000
@@ -710,7 +710,9 @@ static int meminfo_read_failed (
mHr(derived_mem_used) = (unsigned long)mem_used;
if (mHr(HighFree) < mHr(HighTotal))
- mHr(derived_mem_hi_used) = mHr(HighTotal) - mHr(HighFree);
+ mHr(derived_mem_hi_used) = mHr(HighTotal) - mHr(HighFree);
+ else
+ mHr(derived_mem_hi_used) = 0;
if (0 == mHr(LowTotal)) {
mHr(LowTotal) = mHr(MemTotal);
@@ -718,6 +720,8 @@ static int meminfo_read_failed (
}
if (mHr(LowFree) < mHr(LowTotal))
mHr(derived_mem_lo_used) = mHr(LowTotal) - mHr(LowFree);
+ else
+ mHr(derived_mem_lo_used) = 0;
if (mHr(SwapFree) < mHr(SwapTotal))
mHr(derived_swap_used) = mHr(SwapTotal) - mHr(SwapFree);

View File

@ -0,0 +1,15 @@
---
src/sysctl.c | 2 ++
1 file changed, 2 insertions(+)
--- src/sysctl.c
+++ src/sysctl.c 2023-12-14 13:46:09.181625220 +0000
@@ -772,6 +772,8 @@ static int Preload(SettingList *setlist,
fp = (globbuf.gl_pathv[j][0] == '-' && !globbuf.gl_pathv[j][1])
? stdin : fopen(globbuf.gl_pathv[j], "r");
if (!fp) {
+ if (strcmp ("/usr/lib/sysctl.d/99-sysctl.conf", globbuf.gl_pathv[j]) == 0)
+ continue;
xwarn(_("cannot open \"%s\""), globbuf.gl_pathv[j]);
return EXIT_FAILURE;
}

View File

@ -0,0 +1,38 @@
---
testsuite/pmap.test/pmap.exp | 25 -------------------------
1 file changed, 25 deletions(-)
--- testsuite/pmap.test/pmap.exp
+++ testsuite/pmap.test/pmap.exp 2023-11-15 15:34:02.613151770 +0000
@@ -69,31 +69,6 @@ if { [ file readable "/proc/self/smaps"
expect_pass $test "$pmap_initname\$"
}
-
-proc expect_twice_total { test } {
- set totkb 0
- expect {
- -re "\r\n\\s+(\\d+)\[0-9 \]*KB" {
- set totkb $expect_out(1,string)
- expect {
- -re "\r\n\\s+$totkb\[0-9 \]*KB" { pass "$test" }
- eof { fail "$test" }
- timeout { fail "$test" }
- }
- }
- eof { fail "$test" }
- timeout { fail "$test" }
- }
-}
-
-set test "pmap X pid pid has same total"
-spawn $pmap -X $mypid $mypid
-expect_twice_total "$test"
-
-set test "pmap XX pid pid has same total"
-spawn $pmap -XX $mypid $mypid
-expect_twice_total "$test"
-
set test "pmap finding shm"
make_testshm_proc
if { $shmid == "" } {

BIN
procps-ng-4.0.4.tar.xz (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,16 @@
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEXT3w9TizJ8CqeneiAiFmwP88hOMFAmTwbLAACgkQAiFmwP88
hONNRg//a6SXHpenZGCpz6bu6qL6UVGGbanjXOCVzEo0eMwX7/b/Pk3r/wLmtP+a
zpfjYVxyLHakeN4gThphLp01SnkuOmFoqXZBe8XZUQTbRm1BMBmmAi7E8GamDJbw
TgpAIW1qKZPgYRMKB1nSxA5a0OCoM1t8ntXrZdau72LoEnGwuEJEeV4F8GmjZnd/
2XIocwuz3xlm7/ByziZ7GuRqibCs+crhBO3vk120LSCRBCNfoS1uSMrdodO95vpX
EMYCYYMomxOYxq2p1gHDQ+KtEy61zDJ9LbMvzs+9TpHy5Ihw+wXNYu8CQmJIIlnT
7gLoAxhl4Ix0QoyUSgvAu7ANYyndFrz7KBPkOCC/2Ig6BJJzf+YEzWSs1QTh2Lld
vKEDjwqc9UiGW/2yKc0rAmeO1EiQf9dyOe+Sray5OiyLUTtoTUxVLSlXiMwsBWiK
E6dtebUIfxm5uxN5z6Ysmcx+hlxbSVPZkjdWG1W8LQdECsNR8/pPO14VpBYZjvSC
MAvzmONM3FSryxw3y5AeuQLS4lrNw+XuG4y8q7zisBtW7RzS9HkM0yFPco5DlnYm
DlMpnY4PIAltZTO2secnV12CdDljVZ6GjoJqnmLKhM6H4M3H/p3oFiZEIvgd2bKK
D/PV9XZJF1/wnNMxBUgJ9cQuqlh013UOuwUzxJ11q9uDj63n9do=
=XLqg
-----END PGP SIGNATURE-----

View File

@ -1 +1,2 @@
addFilter(".*W:.*shared-lib-calls-exit.*libprocps\.so.*") addFilter(".*W:.*shared-lib-calls-exit.*libproc2\.so.*")
addFilter(".*W:.*macro-in-comment.*%{version}.*")

View File

@ -2,9 +2,9 @@
ps/global.c | 13 ++++++++++--- ps/global.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-) 1 file changed, 10 insertions(+), 3 deletions(-)
--- ps/global.c --- src/ps/global.c
+++ ps/global.c 2016-07-11 13:04:59.600533764 +0000 +++ src/ps/global.c 2022-03-29 09:31:24.242140877 +0000
@@ -147,8 +147,11 @@ static void set_screen_size(void){ @@ -264,8 +264,11 @@ static void set_screen_size(void){
screen_cols = ws.ws_col; // hmmm, NetBSD subtracts 1 screen_cols = ws.ws_col; // hmmm, NetBSD subtracts 1
screen_rows = ws.ws_row; screen_rows = ws.ws_row;
@ -18,7 +18,7 @@
columns = getenv("COLUMNS"); columns = getenv("COLUMNS");
if(columns && *columns){ if(columns && *columns){
@@ -290,6 +293,7 @@ static const char *set_personality(void) @@ -407,6 +410,7 @@ static const char *set_personality(void)
return NULL; return NULL;
case_aix: case_aix:
@ -26,7 +26,7 @@
bsd_j_format = "FB_j"; bsd_j_format = "FB_j";
bsd_l_format = "FB_l"; bsd_l_format = "FB_l";
/* bsd_s_format not used */ /* bsd_s_format not used */
@@ -317,6 +321,7 @@ static const char *set_personality(void) @@ -434,6 +438,7 @@ static const char *set_personality(void)
case_sunos4: case_sunos4:
personality = PER_NO_DEFAULT_g; personality = PER_NO_DEFAULT_g;
@ -34,7 +34,7 @@
prefer_bsd_defaults = 1; prefer_bsd_defaults = 1;
bsd_j_format = "FB_j"; bsd_j_format = "FB_j";
bsd_l_format = "FB_l"; bsd_l_format = "FB_l";
@@ -342,12 +347,14 @@ static const char *set_personality(void) @@ -459,12 +464,14 @@ static const char *set_personality(void)
case_hp: case_hp:
case_hpux: case_hpux:
personality = PER_HPUX_x; personality = PER_HPUX_x;
@ -49,10 +49,10 @@
return NULL; return NULL;
case_posix: case_posix:
@@ -365,8 +372,8 @@ void reset_global(void){ @@ -505,8 +512,8 @@ void reset_global(void){
double uptime_secs; }
reset_selection_list(); // --- <pids> interface --------------------------------------------------
look_up_our_self(&p);
- set_screen_size(); - set_screen_size();
set_personality(); set_personality();
+ set_screen_size(); + set_screen_size();

View File

@ -1,7 +1,7 @@
--- proc/devname.c --- library/devname.c
+++ proc/devname.c 2012-06-01 13:35:43.452010553 +0000 +++ library/devname.c 2012-06-01 13:35:43.452010553 +0000
@@ -53,6 +53,10 @@ @@ -50,6 +50,10 @@
#define minor <-- do not use --> #define minor(d) ( ((unsigned)(d)&0xffu) | (((unsigned)(d)&0xfff00000u)>>12u) )
#endif #endif
+#ifndef PAGE_SIZE +#ifndef PAGE_SIZE

View File

@ -1,10 +1,10 @@
--- ---
pwdx.c | 1 + src/pwdx.c | 1 +
1 file changed, 1 insertion(+) 1 file changed, 1 insertion(+)
--- pwdx.c --- src/pwdx.c
+++ pwdx.c 2016-07-11 13:17:16.154313659 +0000 +++ src/pwdx.c 2016-07-11 13:17:16.154313659 +0000
@@ -109,6 +109,7 @@ int main(int argc, char *argv[]) @@ -113,6 +113,7 @@ int main(int argc, char *argv[])
buflen = 10 + strlen(argv[i]) + 1; buflen = 10 + strlen(argv[i]) + 1;
buf = xmalloc(buflen); buf = xmalloc(buflen);

View File

@ -1,38 +1,38 @@
--- ---
sysctl.8 | 2 ++ man/sysctl.8 | 2 ++
sysctl.c | 12 ++++++++++++ src/sysctl.c | 12 ++++++++++++
2 files changed, 14 insertions(+) 2 files changed, 14 insertions(+)
--- sysctl.8 --- man/sysctl.8
+++ sysctl.8 2021-02-10 10:05:27.781748090 +0000 +++ man/sysctl.8 2022-03-29 10:21:47.926686046 +0000
@@ -81,6 +81,8 @@ directories in the following list in giv @@ -123,6 +123,8 @@ will read files from directories in the
Once a file of a given filename is loaded, any file of the same name order from top to bottom. Once a file of a given filename is loaded, any
in subsequent directories is ignored. file of the same name in subsequent directories is ignored.
.br
+/boot/sysctl.conf-<kernelversion> +/boot/sysctl.conf-<kernelversion>
+.br +.br
/etc/sysctl.d/*.conf /etc/sysctl.d/*.conf
.br .br
/run/sysctl.d/*.conf /run/sysctl.d/*.conf
--- sysctl.c --- src/sysctl.c
+++ sysctl.c 2021-02-10 10:04:25.290952318 +0000 +++ src/sysctl.c 2022-03-29 10:20:51.795708321 +0000
@@ -39,6 +39,7 @@ @@ -45,6 +45,7 @@
#include <string.h> #include <string.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
+#include <sys/utsname.h> +#include <sys/utsname.h>
#include <unistd.h> #include <unistd.h>
#include <ctype.h>
#include "c.h" @@ -808,6 +809,7 @@ static int sortpairs(const void *A, cons
@@ -621,6 +622,7 @@ static int sortpairs(const void *A, cons static int PreloadSystem(SettingList *setlist)
static int PreloadSystem(void)
{ {
unsigned di, i; unsigned di, i;
+ struct utsname uts; + struct utsname uts;
const char *dirs[] = { const char *dirs[] = {
"/etc/sysctl.d", "/etc/sysctl.d",
"/run/sysctl.d", "/run/sysctl.d",
@@ -685,6 +687,16 @@ static int PreloadSystem(void) @@ -872,6 +874,16 @@ static int PreloadSystem(SettingList *se
} }
qsort(cfgs, ncfgs, sizeof(struct cfg *), sortpairs); qsort(cfgs, ncfgs, sizeof(struct cfg *), sortpairs);
@ -42,7 +42,7 @@
+ if (access(buf, R_OK) == 0) { + if (access(buf, R_OK) == 0) {
+ if (!Quiet) + if (!Quiet)
+ printf("* Applying %s ...\n", buf); + printf("* Applying %s ...\n", buf);
+ Preload(buf); + Preload(setlist, buf);
+ } + }
+ } + }
+ +

View File

@ -1,3 +1,43 @@
-------------------------------------------------------------------
Tue Jul 30 07:14:45 UTC 2024 - Dominique Leuenberger <dimstar@opensuse.org>
- Switch to procps 4 branch, absorbing the former procps4 package:
+ Add provides/obsoletes procps4: make zypper replace procps4
with the main package for users that manually switched.
- Aligning to the existing procps4 package, drop/add/modify
patches:
A 79042e07.patch
A procps-ng-4.0.0-integer-overflow.patch
A procps-ng-4.0.4-ignore-sysctl_conf.patch
A procps-ng-4.0.4-pmapX-not-twice-anymore.patch
A procps-ng-4.0.0-floats.dif
D CVE-2023-4016.patch
D bsc1195468-23da4f40.patch
D procps-3.3.17-bsc1181976.patch
D procps-3.3.17-ignore-sysctl_conf.patch
D procps-3.3.17-library-bsc1181475.patch
D procps-3.3.17-top-bsc1181475.patch
D procps-ng-3.3.10-integer-overflow.patch
D procps-ng-3.3.10-large_pcpu.patch
D procps-ng-3.3.17-logind.patch
D procps-ng-3.3.8-bnc634840.patch
D procps-ng-3.3.9-watch.patch
D procps-ng-3.3.8-accuracy.dif
D procps-ng-3.3.10-bnc634071_procstat2.diff
D procps-ng-3.3.10-fdleak.dif
M procps-ng-3.3.10-errno.patch
M procps-ng-3.3.10-slab.patch
M procps-ng-3.3.11-pmap4suse.patch
M procps-ng-3.3.8-ignore-scan_unevictable_pages.patch
M procps-ng-3.3.8-petabytes.patch
M procps-ng-3.3.8-readeof.patch
M procps-v3.3.3-pwdx.patch
-------------------------------------------------------------------
Thu Feb 29 14:34:38 UTC 2024 - Dominique Leuenberger <dimstar@opensuse.org>
- Use %patch -P N instead of deprecated %patchN.
------------------------------------------------------------------- -------------------------------------------------------------------
Thu Dec 14 13:26:05 UTC 2023 - Thorsten Kukuk <kukuk@suse.com> Thu Dec 14 13:26:05 UTC 2023 - Thorsten Kukuk <kukuk@suse.com>

170
procps.keyring Normal file
View File

@ -0,0 +1,170 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=enAj
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -1,7 +1,7 @@
# #
# spec file for package procps # spec file for package procps
# #
# Copyright (c) 2023 SUSE LLC # Copyright (c) 2024 SUSE LLC
# #
# All modifications and additions to the file contributed by third parties # All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed # remain the property of their copyright owners, unless otherwise agreed
@ -16,8 +16,8 @@
# #
%define somajor 8 %define somajor 0
%define libname libprocps%{somajor} %define libname libproc2-%{somajor}
%if 0%{?suse_version} < 1550 %if 0%{?suse_version} < 1550
%bcond_with bin2usr %bcond_with bin2usr
%else %else
@ -26,30 +26,28 @@
%bcond_without pidof %bcond_without pidof
%bcond_without nls %bcond_without nls
Name: procps Name: procps
Version: 3.3.17 Version: 4.0.4
Release: 0 Release: 0
Summary: The ps utilities for /proc Summary: The ps utilities for /proc
License: GPL-2.0-or-later AND LGPL-2.1-or-later License: GPL-2.0-or-later AND LGPL-2.1-or-later
Group: System/Monitoring Group: System/Monitoring
URL: https://sf.net/projects/procps-ng/ URL: https://sf.net/projects/procps-ng/
Source: https://downloads.sourceforge.net/project/procps-ng/Production/procps-ng-%{version}.tar.xz Source: https://downloads.sourceforge.net/project/procps-ng/Production/procps-ng-%{version}.tar.xz
Source1: https://downloads.sourceforge.net/project/procps-ng/Production/procps-ng-%{version}.tar.xz.asc
#Alternate: https://gitlab.com/procps-ng/procps/-/archive/v%{version}/procps-v%{version}.tar.gz #Alternate: https://gitlab.com/procps-ng/procps/-/archive/v%{version}/procps-v%{version}.tar.gz
Source1: procps-rpmlintrc Source2: procps-rpmlintrc
Patch0: procps-ng-3.3.9-watch.patch Source3: procps.keyring
# PATCH-FIX-USTREAM -- w: Don't crash when using short option
Patch0: 79042e07.patch
Patch1: procps-v3.3.3-ia64.diff Patch1: procps-v3.3.3-ia64.diff
Patch3: procps-ng-3.3.9-w-notruncate.diff Patch3: procps-ng-3.3.9-w-notruncate.diff
Patch7: procps-ng-3.3.8-readeof.patch Patch7: procps-ng-3.3.8-readeof.patch
Patch8: procps-ng-3.3.10-slab.patch Patch8: procps-ng-3.3.10-slab.patch
Patch10: procps-ng-3.3.8-accuracy.dif
Patch11: procps-ng-3.3.10-xen.dif Patch11: procps-ng-3.3.10-xen.dif
Patch12: procps-ng-3.3.10-fdleak.dif
Patch13: procps-v3.3.3-columns.dif Patch13: procps-v3.3.3-columns.dif
Patch14: procps-ng-3.3.10-integer-overflow.patch Patch14: procps-ng-4.0.0-integer-overflow.patch
Patch15: procps-ng-3.3.10-bnc634071_procstat2.diff
Patch16: procps-ng-3.3.8-bnc634840.patch
Patch17: procps-v3.3.3-read-sysctls-also-from-boot-sysctl.conf-kernelversion.diff Patch17: procps-v3.3.3-read-sysctls-also-from-boot-sysctl.conf-kernelversion.diff
Patch18: procps-ng-3.3.8-petabytes.patch Patch18: procps-ng-3.3.8-petabytes.patch
Patch19: procps-ng-3.3.10-large_pcpu.patch
Patch20: procps-ng-3.3.8-tinfo.dif Patch20: procps-ng-3.3.8-tinfo.dif
Patch21: procps-v3.3.3-pwdx.patch Patch21: procps-v3.3.3-pwdx.patch
# PATCH-FIX-OPENSUSE -- trifle rest of the old terabyte patch # PATCH-FIX-OPENSUSE -- trifle rest of the old terabyte patch
@ -60,20 +58,16 @@ Patch31: procps-ng-3.3.8-ignore-scan_unevictable_pages.patch
Patch32: procps-ng-3.3.10-errno.patch Patch32: procps-ng-3.3.10-errno.patch
# PATCH-FEATURE-SUSE -- Let upstream pmap behave similar to old suse pmap # PATCH-FEATURE-SUSE -- Let upstream pmap behave similar to old suse pmap
Patch33: procps-ng-3.3.11-pmap4suse.patch Patch33: procps-ng-3.3.11-pmap4suse.patch
# PATCH-FIX-UPSTREAM -- bsc#1181976 # PATCH-FIX-SUSE -- Avoid float errors on 32bit architectures
Patch34: procps-3.3.17-bsc1181976.patch Patch37: procps-ng-4.0.0-floats.dif
# PATCH-FIX-UPSTREAM -- bsc#1195468 # PATCH-FIX-SUSE -- with 4.0.4 the totals on -X option are always reset for each pid
Patch35: bsc1195468-23da4f40.patch Patch38: procps-ng-4.0.4-pmapX-not-twice-anymore.patch
# PATCH-FIX-UPSTREAM -- bsc#1214290 # PATCH-FIX-SUSE -- ignore dangling symlink to missing /etc/sysctl.conf file
Patch36: CVE-2023-4016.patch Patch39: procps-ng-4.0.4-ignore-sysctl_conf.patch
# PATCH-BACKPORT-FROM-UPSTREAM -- bsc#1181475: 'free' command reports misleading "used" value
Patch42: procps-3.3.17-library-bsc1181475.patch
Patch43: procps-3.3.17-top-bsc1181475.patch
Patch44: procps-ng-3.3.17-logind.patch
Patch45: procps-3.3.17-ignore-sysctl_conf.patch
BuildRequires: automake BuildRequires: automake
BuildRequires: dejagnu BuildRequires: dejagnu
BuildRequires: diffutils BuildRequires: diffutils
BuildRequires: libnuma-devel
BuildRequires: libselinux-devel BuildRequires: libselinux-devel
BuildRequires: libtool BuildRequires: libtool
BuildRequires: ncurses-devel BuildRequires: ncurses-devel
@ -81,13 +75,10 @@ BuildRequires: pkgconfig
BuildRequires: screen BuildRequires: screen
BuildRequires: xz BuildRequires: xz
BuildRequires: pkgconfig(libsystemd) BuildRequires: pkgconfig(libsystemd)
Provides: procps4 = %{version}
Obsoletes: procps4 <= 4.0.4
Provides: ps = %{version}-%{release} Provides: ps = %{version}-%{release}
Obsoletes: ps < %{version}-%{release} Obsoletes: ps < %{version}-%{release}
Requires: %{libname} = %{version}-%{release}
%ifarch ia64 x86_64 ppc64 ppc %{sparc}
BuildRequires: libnuma-devel
%endif
%lang_package
%description %description
The procps package contains a set of system utilities that provide The procps package contains a set of system utilities that provide
@ -107,11 +98,23 @@ logged on and what they are running. The watch program watches a
running program. The vmstat command displays virtual memory statistics running program. The vmstat command displays virtual memory statistics
about processes, memory, paging, block I/O, traps, and CPU activity. about processes, memory, paging, block I/O, traps, and CPU activity.
%package lang
Summary: Translations for package %{name}
Group: System/Localization
Requires: %{name} = %{version}
Provides: %{name}-lang-all = %{version}
Obsoletes: procps4-lang <= 4.0.4
BuildArch: noarch
%description lang
Provides translations for the "%{name}" package.
%package devel %package devel
Summary: Development files for procps Summary: Development files for procps
License: GPL-2.0-or-later AND LGPL-2.1-or-later License: GPL-2.0-or-later AND LGPL-2.1-or-later
Group: Development/Libraries/C and C++ Group: Development/Libraries/C and C++
Requires: %{libname} = %{version} Requires: %{libname} = %{version}
Obsoletes: procps4-devel <= 4.0.4
%description devel %description devel
The procps library can be used to read informations out from /proc The procps library can be used to read informations out from /proc
@ -129,40 +132,35 @@ The procps library can be used to read informations out from /proc
the process information pseudo-file system. the process information pseudo-file system.
%prep %prep
%setup -q %setup -q -n procps-ng-%{version}
%patch0 %patch -P0 -p1
%patch1 %patch -P1
%patch3 -b .trcate %patch -P3 -p1 -b .trcate
%patch7 -b .rof %patch -P7 -b .rof
%patch8 -b .cache %patch -P8 -b .cache
%patch10 -b .acc %patch -P11
%patch11 %patch -P13 -b .column
%patch12 %patch -P14 -b .ovrflw
%patch13 -b .column %patch -P17 -b .sysctl
%patch14 -b .ovrflw %patch -P18
%patch15 %patch -P20 -b .p20
%patch16 %patch -P21
%patch17 -b .sysctl %patch -P28
%patch18 %patch -P31 -p1
%patch19 %patch -P32 -b .p32
%patch20 %patch -P33 -b .pmap4us
%patch21 %patch -P37
%patch28 %patch -P38
%patch31 -p1 %patch -P39
%patch32
%patch33 -b .pmap4us
%patch34
%patch35 -p1
%patch36 -p0
%patch42
%patch43
%patch44 -p1
%patch45 -p1
%build %build
test -s .tarball-version || echo %{version} > .tarball-version test -s .tarball-version || echo %{version} > .tarball-version
#./autogen.sh if test -f po/Makefile.in.in
autoreconf -fiv then
autoreconf -fiv
else
sh ./autogen.sh
fi
major=$(sed -rn 's/^#define\s+NCURSES_VERSION_MAJOR\s+([0-9]+)/\1/p' %{_includedir}/ncurses.h) major=$(sed -rn 's/^#define\s+NCURSES_VERSION_MAJOR\s+([0-9]+)/\1/p' %{_includedir}/ncurses.h)
export NCURSESW_CFLAGS="$(ncursesw${major}-config --cflags)" export NCURSESW_CFLAGS="$(ncursesw${major}-config --cflags)"
export NCURSESW_LIBS="$(ncursesw${major}-config --libs)" export NCURSESW_LIBS="$(ncursesw${major}-config --libs)"
@ -194,7 +192,7 @@ export LFS_CFLAGS="$(getconf LFS_CFLAGS)"
%make_build %make_build
LD_LIBRARY_PATH=$PWD/proc/.libs \ LD_LIBRARY_PATH=$PWD/proc/.libs \
./pmap $$ || { ./src/pmap $$ || {
uname -a uname -a
echo /proc/$$/maps echo /proc/$$/maps
cat /proc/$$/maps cat /proc/$$/maps
@ -218,11 +216,11 @@ rm -f %{buildroot}%{_mandir}/*/man1/uptime.1
find %{buildroot} -type f -name "*.la" -delete -print find %{buildroot} -type f -name "*.la" -delete -print
rm -rf %{buildroot}%{_datadir}/doc/procps-ng rm -rf %{buildroot}%{_datadir}/doc/procps-ng
if cmp -s %{buildroot}%{_mandir}/man1/procps.1 %{buildroot}%{_mandir}/man1/ps.1 if cmp -s %{buildroot}%{_mandir}/man1/pidwait.1 %{buildroot}%{_mandir}/man1/pkill.1
then then
rm -vf %{buildroot}%{_mandir}/man1/procps.1 rm -vf %{buildroot}%{_mandir}/man1/pidwait.1
(cat > %{buildroot}%{_mandir}/man1/procps.1)<<-'EOF' (cat > %{buildroot}%{_mandir}/man1/pidwait.1)<<-'EOF'
.so man1/ps.1 .so man1/pkill.1
EOF EOF
fi fi
@ -284,6 +282,10 @@ ln -s /sbin/sysctl %{buildroot}%{_sbindir}/sysctl
%postun -n %{libname} -p /sbin/ldconfig %postun -n %{libname} -p /sbin/ldconfig
%check %check
set +x
ls -ld /proc/[a-z]*
cat /proc/stat
set -x
# #
# Skip w test as there is no valid utmp # Skip w test as there is no valid utmp
# #
@ -294,11 +296,13 @@ rm -rvf testsuite/w.test
LANG=POSIX LANG=POSIX
LC_ALL=$LANG LC_ALL=$LANG
unset LC_CTYPE unset LC_CTYPE
TMPDIR=$(mktemp -d /tmp/bash.XXXXXXXXXX) || exit 1
SCREENDIR=$(mktemp -d ${PWD}/screen.XXXXXX) || exit 1 SCREENDIR=$(mktemp -d ${PWD}/screen.XXXXXX) || exit 1
SCREENRC=${SCREENDIR}/bash SCREENRC=${SCREENDIR}/bash
export SCREENRC SCREENDIR export SCREENRC SCREENDIR
exec 0< /dev/null exec 0< /dev/null
SCREENLOG=${SCREENDIR}/log SCREENLOG=${SCREENDIR}/log
> $SCREENLOG
cat > $SCREENRC<<-EOF cat > $SCREENRC<<-EOF
deflogin off deflogin off
deflog on deflog on
@ -311,17 +315,17 @@ cat > $SCREENRC<<-EOF
silence on silence on
utf8 on utf8 on
EOF EOF
TMPDIR=$(mktemp -d /tmp/bash.XXXXXXXXXX) || exit 1
> $SCREENLOG
tail -q -s 0.5 -f $SCREENLOG & pid=$! tail -q -s 0.5 -f $SCREENLOG & pid=$!
env HOME=$PWD TERM=$TERM TMPDIR=$TMPDIR SCREENRC=$SCREENRC SCREENDIR=$SCREENDIR \ env HOME=$PWD TERM=$TERM TMPDIR=$TMPDIR SCREENRC=$SCREENRC SCREENDIR=$SCREENDIR \
screen -D -m make check screen -D -m make check
sleep 1
kill -TERM $pid kill -TERM $pid
error=no error=no
for log in test-suite.log testsuite/*.log for log in testsuite/*.log test-suite.log
do do
if grep -E '^(XFAIL|FAIL|ERROR):' $log if grep -E '^(XFAIL|FAIL|ERROR):' $log
then then
echo Check $log
cat $log cat $log
error=yes error=yes
fi fi
@ -338,7 +342,7 @@ test $error = no || exit 1
%files %files
%defattr (-,root,root,755) %defattr (-,root,root,755)
%license COPYING COPYING.LIB %license COPYING COPYING.LIB
%doc NEWS Documentation/bugs.md Documentation/FAQ %doc NEWS doc/bugs.md doc/FAQ
%if %{with bin2usr} %if %{with bin2usr}
%if 0%{?suse_version} < 1550 %if 0%{?suse_version} < 1550
%verify(link) /bin/ps %verify(link) /bin/ps
@ -365,7 +369,7 @@ test $error = no || exit 1
%{_bindir}/pidof %{_bindir}/pidof
%endif %endif
%{_bindir}/pmap %{_bindir}/pmap
%{_bindir}/pwait %{_bindir}/pidwait
%{_bindir}/pwdx %{_bindir}/pwdx
%{_bindir}/skill %{_bindir}/skill
%{_bindir}/slabtop %{_bindir}/slabtop
@ -382,9 +386,8 @@ test $error = no || exit 1
%endif %endif
%{_mandir}/man1/pkill.1%{?ext_man} %{_mandir}/man1/pkill.1%{?ext_man}
%{_mandir}/man1/pmap.1%{?ext_man} %{_mandir}/man1/pmap.1%{?ext_man}
%{_mandir}/man1/procps.1%{?ext_man}
%{_mandir}/man1/ps.1%{?ext_man} %{_mandir}/man1/ps.1%{?ext_man}
%{_mandir}/man1/pwait.1%{?ext_man} %{_mandir}/man1/pidwait.1%{?ext_man}
%{_mandir}/man1/pwdx.1%{?ext_man} %{_mandir}/man1/pwdx.1%{?ext_man}
%{_mandir}/man1/skill.1%{?ext_man} %{_mandir}/man1/skill.1%{?ext_man}
%{_mandir}/man1/slabtop.1%{?ext_man} %{_mandir}/man1/slabtop.1%{?ext_man}
@ -399,33 +402,18 @@ test $error = no || exit 1
%files devel %files devel
%defattr (-,root,root,755) %defattr (-,root,root,755)
%dir %{_includedir}/proc %dir %{_includedir}/libproc2/
%{_includedir}/proc/alloc.h %{_includedir}/libproc2/*.h
%{_includedir}/proc/devname.h %{_libdir}/libproc2.so
%{_includedir}/proc/escape.h %{_libdir}/pkgconfig/libproc2.pc
%{_includedir}/proc/numa.h %{_mandir}/man3/procps.3%{?ext_man}
%{_includedir}/proc/procps.h %{_mandir}/man3/procps_misc.3%{?ext_man}
%{_includedir}/proc/pwcache.h %{_mandir}/man3/procps_pids.3%{?ext_man}
%{_includedir}/proc/readproc.h
%{_includedir}/proc/sig.h
%{_includedir}/proc/slab.h
%{_includedir}/proc/sysinfo.h
%{_includedir}/proc/version.h
%{_includedir}/proc/wchan.h
%{_includedir}/proc/whattime.h
%{_libdir}/libprocps.so
%{_libdir}/pkgconfig/libprocps.pc
%{_mandir}/man3/openproc.3%{?ext_man}
%{_mandir}/man3/readproc.3%{?ext_man}
%{_mandir}/man3/readproctab.3%{?ext_man}
%files -n %{libname} %files -n %{libname}
%defattr (-,root,root,755) %defattr (-,root,root,755)
%{_libdir}/libprocps.so.%{somajor}* %{_libdir}/libproc2.so.%{somajor}*
%files lang -f procps-ng.lang %files lang -f procps-ng.lang
%if 0%{?suse_version} < 1550
%dir %{_mandir}/uk/
%endif
%changelog %changelog