Merge pull request #1488 from Rmys/master

procps ver. bump
This commit is contained in:
Rmys
2022-12-07 12:43:35 +03:00
committed by GitHub
57 changed files with 1346 additions and 2754 deletions
@@ -0,0 +1,49 @@
diff --git a/lib/test_process.c b/lib/test_process.c
index e20b270d..f8ff5ed0 100644
--- a/lib/test_process.c
+++ b/lib/test_process.c
@@ -69,6 +69,7 @@ signal_handler(int signum, siginfo_t *siginfo, void *ucontext)
exit(EXIT_FAILURE);
}
+ free(signame);
}
int main(int argc, char *argv[])
diff --git a/pmap.c b/pmap.c
index 49a2a6a8..d8565fc3 100644
--- a/pmap.c
+++ b/pmap.c
@@ -346,6 +346,9 @@ static void print_extended_maps (FILE *f)
if (listnode == NULL) {
assert(firstmapping == 2);
listnode = calloc(1, sizeof *listnode);
+ if (listnode == NULL)
+ xerrx(EXIT_FAILURE, _("ERROR: memory allocation failed"));
+
if (listhead == NULL) {
assert(listtail == NULL);
listhead = listnode;
diff --git a/watch.c b/watch.c
index 1a95454e..772879cd 100644
--- a/watch.c
+++ b/watch.c
@@ -124,8 +124,6 @@ static void reset_ansi(void)
static void init_ansi_colors(void)
{
- int color;
-
short ncurses_colors[] = {
-1, COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW,
COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE
@@ -172,6 +170,9 @@ static int process_ansi_color_escape_sequence(char** escape_sequence) {
// ESC[ 48;2;⟨r⟩;⟨g⟩;⟨b⟩ m Select RGB background color
int num;
+ if (!escape_sequence)
+ return 0; /* avoid NULLPTR dereference, return "not understood" */
+
if ((*escape_sequence)[0] != ';')
return 0; /* not understood */
@@ -0,0 +1,12 @@
diff -up ./free.c.ori ./free.c
--- ./free.c.ori 2022-09-20 15:02:22.469320938 +0200
+++ ./free.c 2022-09-20 15:03:33.767710892 +0200
@@ -120,7 +120,7 @@ static const char *scale_size(unsigned l
/* default output */
if (args.exponent == 0 && !(flags & FREE_HUMANREADABLE)) {
- snprintf(buf, sizeof(buf), "%ld", size);
+ snprintf(buf, sizeof(buf), "%ld", (long)( ((long long int)size) * 1024 / (long long int)base));
return buf;
}
@@ -0,0 +1,286 @@
From 52afb3a8d31871d28b1c39573a7ed5196c2d5023 Mon Sep 17 00:00:00 2001
From: Craig Small <csmall@dropbear.xyz>
Date: Mon, 15 Feb 2021 21:10:06 +1100
Subject: [PATCH] pidwait: Rename from pwait
pwait is already in at least Debian in a different package
References:
https://bugs.debian.org/982391
---
diff --git a/Makefile.am b/Makefile.am
index e037e4c..de15e13 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -49,8 +49,8 @@ bin_PROGRAMS = \
uptime \
vmstat \
w
-if BUILD_PWAIT
-bin_PROGRAMS += pwait
+if BUILD_PIDWAIT
+bin_PROGRAMS += pidwait
endif
else
usrbin_exec_PROGRAMS += \
@@ -85,8 +85,8 @@ dist_man_MANS += \
sysctl.conf.5 \
ps/ps.1
-if BUILD_PWAIT
-dist_man_MANS += pwait.1
+if BUILD_PIDWAIT
+dist_man_MANS += pidwait.1
endif
endif
@@ -199,8 +199,8 @@ free_SOURCES = free.c lib/strutils.c lib/fileutils.c
pgrep_SOURCES = pgrep.c lib/fileutils.c lib/nsutils.c
pkill_SOURCES = pgrep.c lib/fileutils.c lib/nsutils.c
pmap_SOURCES = pmap.c lib/fileutils.c
-if BUILD_PWAIT
-pwait_SOURCES = pgrep.c lib/fileutils.c lib/nsutils.c
+if BUILD_PIDWAIT
+pidwait_SOURCES = pgrep.c lib/fileutils.c lib/nsutils.c
endif
if !CYGWIN
pwdx_SOURCES = pwdx.c lib/fileutils.c
diff --git a/NEWS b/NEWS
index da63c9c..5fe6761 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+procps-ng-NEXT
+---------------
+ * Rename pwait to pidwait
+
procps-ng-3.3.17
---------------
* library: Incremented to 8:3:0
diff --git a/configure.ac b/configure.ac
index 56a8669..750c0fb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -132,20 +132,20 @@ AC_TRY_COMPILE([#include <errno.h>],
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))
-AC_CHECK_FUNC([pidfd_open], [enable_pwait=yes], [
+AC_CHECK_FUNC([pidfd_open], [enable_pidwait=yes], [
AC_MSG_CHECKING([for __NR_pidfd_open])
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
#include <sys/syscall.h>
#ifndef __NR_pidfd_open
#error __NR_pidfd_open not defined
#endif
- ])], [enable_pwait=yes], [enable_pwait=no])
- AC_MSG_RESULT([$enable_pwait])
+ ])], [enable_pidwait=yes], [enable_pidwait=no])
+ AC_MSG_RESULT([$enable_pidwait])
])
-if test "$enable_pwait" = yes; then
- AC_DEFINE([ENABLE_PWAIT], [1], [Enable pwait])
+if test "$enable_pidwait" = yes; then
+ AC_DEFINE([ENABLE_PIDWAIT], [1], [Enable pidwait])
fi
-AM_CONDITIONAL([BUILD_PWAIT], [test x$enable_pwait = xyes])
+AM_CONDITIONAL([BUILD_PIDWAIT], [test x$enable_pidwait = xyes])
dnl watch8bit must be before the AC_ARG_WITH set as it sets up ncurses
AC_SUBST([WITH_WATCH8BIT])
diff --git a/pgrep.1 b/pgrep.1
index 4f8907b..af6dcd5 100644
--- a/pgrep.1
+++ b/pgrep.1
@@ -9,7 +9,7 @@
.\"
.TH PGREP "1" "2020-06-04" "procps-ng" "User Commands"
.SH NAME
-pgrep, pkill, pwait \- look up, signal, or wait for processes based on name and other attributes
+pgrep, pkill, pidwait \- look up, signal, or wait for processes based on name and other attributes
.SH SYNOPSIS
.B pgrep
[options] pattern
@@ -17,7 +17,7 @@ pgrep, pkill, pwait \- look up, signal, or wait for processes based on name and
.B pkill
[options] pattern
.br
-.B pwait
+.B pidwait
[options] pattern
.SH DESCRIPTION
.B pgrep
@@ -45,7 +45,7 @@ will send the specified signal (by default
.BR SIGTERM )
to each process instead of listing them on stdout.
.PP
-.B pwait
+.B pidwait
will wait for each process instead of listing them on stdout.
.SH OPTIONS
.TP
@@ -60,7 +60,7 @@ only.)
\fB\-c\fR, \fB\-\-count\fR
Suppress normal output; instead print a count of matching processes. When
count does not match anything, e.g. returns zero, the command will return
-non-zero value. Note that for pkill and pwait, the count is the number of
+non-zero value. Note that for pkill and pidwait, the count is the number of
matching processes, not the processes that were successfully signaled or waited
for.
.TP
@@ -88,7 +88,7 @@ translated into
.BR pgrep 's,
.BR pkill 's,
or
-.BR pwait 's
+.BR pidwait 's
own process group.
.TP
\fB\-G\fR, \fB\-\-group\fR \fIgid\fP,...
@@ -126,7 +126,7 @@ is translated into
.BR pgrep 's,
.BR pkill 's,
or
-.BR pwait 's
+.BR pidwait 's
own session ID.
.TP
\fB\-t\fR, \fB\-\-terminal\fR \fIterm\fP,...
@@ -145,7 +145,7 @@ symbolical value may be used.
Negates the matching. This option is usually used in
.BR pgrep 's
or
-.BR pwait 's
+.BR pidwait 's
context. In
.BR pkill 's
context the short option is disabled to avoid accidental usage of the option.
@@ -154,7 +154,7 @@ context the short option is disabled to avoid accidental usage of the option.
Shows all thread ids instead of pids in
.BR pgrep 's
or
-.BR pwait 's
+.BR pidwait 's
context. In
.BR pkill 's
context this option is disabled.
@@ -167,7 +167,7 @@ match the
.TP
\fB\-F\fR, \fB\-\-pidfile\fR \fIfile\fR
Read \fIPID\fRs from \fIfile\fR. This option is more useful for
-.BR pkill or pwait
+.BR pkill or pidwait
than
.BR pgrep .
.TP
@@ -237,7 +237,7 @@ $ renice +4 $(pgrep chrome)
.PD 0
.TP
0
-One or more processes matched the criteria. For pkill and pwait, one or more
+One or more processes matched the criteria. For pkill and pidwait, one or more
processes must also have been successfully signalled or waited for.
.TP
1
@@ -258,7 +258,7 @@ The running
.BR pgrep ,
.BR pkill ,
or
-.B pwait
+.B pidwait
process will never report itself as a
match.
.SH BUGS
diff --git a/pgrep.c b/pgrep.c
index 4fe5e8a..1905cd1 100644
--- a/pgrep.c
+++ b/pgrep.c
@@ -38,7 +38,7 @@
#include <stdbool.h>
#include <time.h>
-#if defined(ENABLE_PWAIT) && !defined(HAVE_PIDFD_OPEN)
+#if defined(ENABLE_PIDWAIT) && !defined(HAVE_PIDFD_OPEN)
#include <sys/epoll.h>
#include <sys/syscall.h>
#endif
@@ -68,8 +68,8 @@
static enum {
PGREP = 0,
PKILL,
-#ifdef ENABLE_PWAIT
- PWAIT,
+#ifdef ENABLE_PIDWAIT
+ PIDWAIT,
#endif
} prog_mode;
@@ -136,8 +136,8 @@ static int __attribute__ ((__noreturn__)) usage(int opt)
fputs(_(" -q, --queue <value> integer value to be sent with the signal\n"), fp);
fputs(_(" -e, --echo display what is killed\n"), fp);
break;
-#ifdef ENABLE_PWAIT
- case PWAIT:
+#ifdef ENABLE_PIDWAIT
+ case PIDWAIT:
fputs(_(" -e, --echo display PIDs before waiting\n"), fp);
break;
#endif
@@ -687,7 +687,7 @@ static struct el * select_procs (int *num)
xerrx(EXIT_FAILURE, _("internal error"));
}
- // pkill and pwait don't support -w, but this is checked in getopt
+ // pkill and pidwait don't support -w, but this is checked in getopt
if (opt_threads) {
while (readtask(ptp, &task, &subtask)){
// don't add redundant tasks
@@ -742,7 +742,7 @@ static int signal_option(int *argc, char **argv)
return -1;
}
-#if defined(ENABLE_PWAIT) && !defined(HAVE_PIDFD_OPEN)
+#if defined(ENABLE_PIDWAIT) && !defined(HAVE_PIDFD_OPEN)
static int pidfd_open (pid_t pid, unsigned int flags)
{
return syscall(__NR_pidfd_open, pid, flags);
@@ -793,9 +793,9 @@ static void parse_opts (int argc, char **argv)
{NULL, 0, NULL, 0}
};
-#ifdef ENABLE_PWAIT
- if (strcmp (program_invocation_short_name, "pwait") == 0) {
- prog_mode = PWAIT;
+#ifdef ENABLE_PIDWAIT
+ if (strcmp (program_invocation_short_name, "pidwait") == 0) {
+ prog_mode = PIDWAIT;
strcat (opts, "e");
} else
#endif
@@ -1008,7 +1008,7 @@ int main (int argc, char **argv)
int num;
int i;
int kill_count = 0;
-#ifdef ENABLE_PWAIT
+#ifdef ENABLE_PIDWAIT
int poll_count = 0;
int wait_count = 0;
int epollfd = epoll_create(1);
@@ -1055,8 +1055,8 @@ int main (int argc, char **argv)
fprintf(stdout, "%d\n", num);
return !kill_count;
-#ifdef ENABLE_PWAIT
- case PWAIT:
+#ifdef ENABLE_PIDWAIT
+ case PIDWAIT:
if (opt_count)
fprintf(stdout, "%d\n", num);
diff --git a/pwait.1 b/pidwait.1
similarity index 100%
rename from pwait.1
rename to pidwait.1
--
GitLab
@@ -0,0 +1,833 @@
diff -up ./NEWS.ori ./NEWS
diff -up ./sysctl.c.ori ./sysctl.c
--- ./sysctl.c.ori 2021-02-09 11:11:25.000000000 +0100
+++ ./sysctl.c 2022-03-31 18:27:36.536486629 +0200
@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
+ * Part of this code comes from systemd, especially sysctl.c
* Changelog:
* v1.01:
* - added -p <preload> to preload values from a file
@@ -40,6 +41,7 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
+#include <ctype.h>
#include "c.h"
#include "fileutils.h"
@@ -66,12 +68,34 @@ static bool PrintName;
static bool PrintNewline;
static bool IgnoreError;
static bool Quiet;
+static bool DryRun;
static char *pattern;
#define LINELEN 4096
static char *iobuf;
static size_t iolen = LINELEN;
+typedef struct SysctlSetting {
+ char *key;
+ char *path;
+ char *value;
+ bool ignore_failure;
+ bool glob_exclude;
+ struct SysctlSetting *next;
+} SysctlSetting;
+
+typedef struct SettingList {
+ struct SysctlSetting *head;
+ struct SysctlSetting *tail;
+} SettingList;
+
+#define GLOB_CHARS "*?["
+static inline bool string_is_glob(const char *p)
+{
+ return !!strpbrk(p, GLOB_CHARS);
+}
+
+
/* Function prototypes. */
static int pattern_match(const char *string, const char *pat);
static int DisplayAll(const char *restrict const path);
@@ -100,6 +124,81 @@ static void slashdot(char *restrict p, c
}
}
+static void setting_free(SysctlSetting *s) {
+ if (!s)
+ return;
+
+ free(s->key);
+ free(s->path);
+ free(s->value);
+ free(s);
+}
+
+static SysctlSetting *setting_new(
+ const char *key,
+ const char *value,
+ bool ignore_failure,
+ bool glob_exclude) {
+
+ SysctlSetting *s = NULL;
+ char *path = NULL;
+ int proc_len;
+
+ proc_len = strlen(PROC_PATH);
+ /* used to open the file */
+ path = xmalloc(strlen(key) + proc_len + 2);
+ strcpy(path, PROC_PATH);
+ if (key[0] == '-')
+ strcat(path + proc_len, key+1);
+ else
+ strcat(path + proc_len, key);
+ /* change . to / */
+ slashdot(path + proc_len, '.', '/');
+
+ s = xmalloc(sizeof(SysctlSetting));
+
+ *s = (SysctlSetting) {
+ .key = strdup(key),
+ .path = path,
+ .value = value? strdup(value): NULL,
+ .ignore_failure = ignore_failure,
+ .glob_exclude = glob_exclude,
+ .next = NULL,
+ };
+
+ return s;
+}
+
+static void settinglist_add(SettingList *l, SysctlSetting *s) {
+ SysctlSetting *old_tail;
+
+ if (!l)
+ return;
+
+ if (l->head == NULL)
+ l->head = s;
+
+ if (l->tail != NULL) {
+ old_tail = l->tail;
+ old_tail->next = s;
+ }
+ l->tail = s;
+}
+
+static SysctlSetting *settinglist_findpath(const SettingList *l, const char *path) {
+ SysctlSetting *node;
+
+ for (node=l->head; node != NULL; node = node->next) {
+ if (strcmp(node->path, path) == 0)
+ return node;
+ }
+ return NULL;
+}
+
+/* Function prototypes. */
+static int pattern_match(const char *string, const char *pat);
+static int DisplayAll(const char *restrict const path);
+
/*
* Display the usage format
*/
@@ -115,6 +214,7 @@ static void __attribute__ ((__noreturn__
fputs(_(" -A alias of -a\n"), out);
fputs(_(" -X alias of -a\n"), out);
fputs(_(" --deprecated include deprecated parameters to listing\n"), out);
+ fputs(_(" --dry-run Print the key and values but do not write\n"), out);
fputs(_(" -b, --binary print value without new line\n"), out);
fputs(_(" -e, --ignore ignore unknown variables errors\n"), out);
fputs(_(" -N, --names print variable names without values\n"), out);
@@ -138,6 +238,39 @@ static void __attribute__ ((__noreturn__
}
/*
+ * Strip left/leading side of a string
+ */
+static char *lstrip(char *line)
+{
+ char *start;
+
+ if (!line || !*line)
+ return line;
+
+ start = line;
+ while(isspace(*start)) start++;
+
+ return start;
+}
+
+/*
+ * Strip right/trailing side of a string
+ * by placing a \0
+ */
+static void rstrip(char *line)
+{
+ char *end;
+
+ if (!line || !*line)
+ return;
+
+ end = line + strlen(line) - 1;
+ while(end > line && isspace(*end)) end--;
+
+ end[1] = '\0';
+}
+
+/*
* Strip the leading and trailing spaces from a string
*/
static char *StripLeadingAndTrailingSpaces(char *oneline)
@@ -166,7 +299,7 @@ static char *StripLeadingAndTrailingSpac
*/
static int ReadSetting(const char *restrict const name)
{
- int rc = 0;
+ int rc = EXIT_SUCCESS;
char *restrict tmpname;
char *restrict outname;
ssize_t rlen;
@@ -198,7 +331,7 @@ static int ReadSetting(const char *restr
if (stat(tmpname, &ts) < 0) {
if (!IgnoreError) {
xwarn(_("cannot stat %s"), tmpname);
- rc = -1;
+ rc = EXIT_FAILURE;
}
goto out;
}
@@ -215,7 +348,7 @@ static int ReadSetting(const char *restr
}
if (pattern && !pattern_match(outname, pattern)) {
- rc = 0;
+ rc = EXIT_SUCCESS;
goto out;
}
@@ -231,19 +364,19 @@ static int ReadSetting(const char *restr
case ENOENT:
if (!IgnoreError) {
xwarnx(_("\"%s\" is an unknown key"), outname);
- rc = -1;
+ rc = EXIT_FAILURE;
}
break;
case EACCES:
xwarnx(_("permission denied on key '%s'"), outname);
- rc = -1;
+ rc = EXIT_FAILURE;
break;
case EIO: /* Ignore stable_secret below /proc/sys/net/ipv6/conf */
- rc = -1;
+ rc = EXIT_FAILURE;
break;
default:
xwarn(_("reading key \"%s\""), outname);
- rc = -1;
+ rc = EXIT_FAILURE;
break;
}
} else {
@@ -279,7 +412,7 @@ static int ReadSetting(const char *restr
case EACCES:
xwarnx(_("permission denied on key '%s'"),
outname);
- rc = -1;
+ rc = EXIT_FAILURE;
break;
case EISDIR: {
size_t len;
@@ -291,11 +424,11 @@ static int ReadSetting(const char *restr
goto out;
}
case EIO: /* Ignore stable_secret below /proc/sys/net/ipv6/conf */
- rc = -1;
+ rc = EXIT_FAILURE;
break;
default:
xwarnx(_("reading key \"%s\""), outname);
- rc = -1;
+ rc = EXIT_FAILURE;
case 0:
break;
}
@@ -323,7 +456,7 @@ static int is_deprecated(char *filename)
*/
static int DisplayAll(const char *restrict const path)
{
- int rc = 0;
+ int rc = EXIT_SUCCESS;
int rc2;
DIR *restrict dp;
struct dirent *restrict de;
@@ -333,7 +466,7 @@ static int DisplayAll(const char *restri
if (!dp) {
xwarnx(_("unable to open directory \"%s\""), path);
- rc = -1;
+ rc = EXIT_FAILURE;
} else {
readdir(dp); /* skip . */
readdir(dp); /* skip .. */
@@ -369,130 +502,183 @@ static int DisplayAll(const char *restri
/*
* Write a sysctl setting
*/
-static int WriteSetting(const char *setting)
-{
- int rc = 0;
- const char *name = setting;
- const char *value;
- const char *equals;
- char *tmpname;
- char *outname;
- char *last_dot;
- bool ignore_failure;
+static int WriteSetting(
+ const char *key,
+ const char *path,
+ const char *value,
+ const bool ignore_failure) {
- FILE *fp;
+ int rc = EXIT_SUCCESS;
+ FILE *fp;
struct stat ts;
- if (!name)
- /* probably don't want to display this err */
- return 0;
-
- equals = strchr(setting, '=');
-
- if (!equals) {
- xwarnx(_("\"%s\" must be of the form name=value"),
- setting);
- return -1;
- }
-
- /* point to the value in name=value */
- value = equals + 1;
-
- if (!*name || name == equals) {
- xwarnx(_("malformed setting \"%s\""), setting);
- return -2;
- }
-
- ignore_failure = name[0] == '-';
- if (ignore_failure)
- name++;
+ if (!key || !path)
+ return rc;
- /* used to open the file */
- tmpname = xmalloc(equals - name + 1 + strlen(PROC_PATH));
- strcpy(tmpname, PROC_PATH);
- strncat(tmpname, name, (int) (equals - name));
- tmpname[equals - name + strlen(PROC_PATH)] = 0;
- /* change . to / */
- slashdot(tmpname + strlen(PROC_PATH), '.', '/');
-
- /* used to display the output */
- outname = xmalloc(equals - name + 1);
- strncpy(outname, name, (int) (equals - name));
- outname[equals - name] = 0;
- /* change / to . */
- slashdot(outname, '/', '.');
- last_dot = strrchr(outname, '.');
- if (last_dot != NULL && is_deprecated(last_dot + 1)) {
- xwarnx(_("%s is deprecated, value not set"), outname);
- goto out;
- }
-
- if (stat(tmpname, &ts) < 0) {
+ if (stat(path, &ts) < 0) {
if (!IgnoreError) {
- xwarn(_("cannot stat %s"), tmpname);
- rc = -1;
+ xwarn(_("cannot stat %s"), path);
+ rc = EXIT_FAILURE;
}
- goto out;
+ return rc;
}
if ((ts.st_mode & S_IWUSR) == 0) {
- xwarn(_("setting key \"%s\""), outname);
- goto out;
+ xwarn(_("setting key \"%s\""), key);
+ return rc;
}
if (S_ISDIR(ts.st_mode)) {
- xwarn(_("setting key \"%s\""), outname);
- goto out;
+ xwarn(_("setting key \"%s\""), key);
+ return rc;
}
- fp = fprocopen(tmpname, "w");
-
- if (!fp) {
- switch (errno) {
- case ENOENT:
- if (!IgnoreError) {
- xwarnx(_("\"%s\" is an unknown key%s"), outname, (ignore_failure?_(", ignoring"):""));
+ if (!DryRun) {
+ if ((fp = fprocopen(path, "w")) == NULL) {
+ switch (errno) {
+ case ENOENT:
+ if (!IgnoreError) {
+ xwarnx(_("\"%s\" is an unknown key%s"),
+ key, (ignore_failure?_(", ignoring"):""));
if (!ignore_failure)
- rc = -1;
+ rc = EXIT_FAILURE;
}
break;
- case EPERM:
- case EROFS:
- case EACCES:
- xwarnx(_("permission denied on key \"%s\"%s"), outname, (ignore_failure?_(", ignoring"):""));
- break;
- default:
- xwarn(_("setting key \"%s\"%s"), outname, (ignore_failure?_(", ignoring"):""));
- break;
- }
- if (!ignore_failure && errno != ENOENT)
- rc = -1;
- } else {
- rc = fprintf(fp, "%s\n", value);
- if (0 < rc)
- rc = 0;
- if (close_stream(fp) != 0)
- xwarn(_("setting key \"%s\""), outname);
- else if (rc == 0 && !Quiet) {
- if (NameOnly) {
- fprintf(stdout, "%s\n", outname);
- } else {
- if (PrintName) {
- fprintf(stdout, "%s = %s\n",
- outname, value);
- } else {
- if (PrintNewline)
- fprintf(stdout, "%s\n", value);
- else
- fprintf(stdout, "%s", value);
- }
- }
- }
- }
- out:
- free(tmpname);
- free(outname);
- return rc;
+ case EPERM:
+ case EROFS:
+ case EACCES:
+ xwarnx(_("permission denied on key \"%s\"%s"),
+ key, (ignore_failure?_(", ignoring"):""));
+ break;
+ default:
+ xwarn(_("setting key \"%s\"%s"),
+ key, (ignore_failure?_(", ignoring"):""));
+ break;
+ }
+ if (!ignore_failure && errno != ENOENT)
+ rc = EXIT_FAILURE;
+ } else {
+ if (0 < fprintf(fp, "%s\n", value))
+ rc = EXIT_SUCCESS;
+ if (close_stream(fp) != 0) {
+ xwarn(_("setting key \"%s\""), path);
+ return rc;
+ }
+ }
+ }
+ if ((rc == EXIT_SUCCESS && !Quiet) || DryRun) {
+ if (NameOnly) {
+ printf("%s\n", value);
+ } else {
+ if (PrintName) {
+ printf("%s = %s\n", path, value);
+ } else {
+ if (PrintNewline)
+ printf("%s\n", value);
+ else
+ printf("%s", value);
+ }
+ }
+ }
+ return rc;
+}
+
+/*
+ * parse each configuration line, there are multiple ways of specifying
+ * a key/value here:
+ *
+ * key = value simple setting
+ * -key = value ignore errors
+ * key.pattern.*.with.glob = value set keys that match glob
+ * -key.pattern.exclude.with.glob dont set this value
+ * key.pattern.override.with.glob = value set this glob match to value
+ *
+ */
+
+static SysctlSetting *parse_setting_line(
+ const char *path,
+ const int linenum,
+ char *line)
+{
+ SysctlSetting *s;
+ char *key;
+ char *value;
+ bool glob_exclude = FALSE;
+ bool ignore_failure = FALSE;
+
+ key = lstrip(line);
+ if (strlen(key) < 2)
+ return NULL;
+
+ /* skip over comments */
+ if (key[0] == '#' || key[0] == ';')
+ return NULL;
+
+ if (pattern && !pattern_match(key, pattern))
+ return NULL;
+
+ value = strchr(key, '=');
+ if (value == NULL) {
+ if (key[0] == '-') {
+ glob_exclude = TRUE;
+ key++;
+ value = NULL;
+ rstrip(key);
+ } else {
+ xwarnx(_("%s(%d): invalid syntax, continuing..."),
+ path, linenum);
+ return NULL;
+ }
+ } else {
+ value[0]='\0';
+ if (key[0] == '-') {
+ ignore_failure = TRUE;
+ key++;
+ }
+ value++; // skip over =
+ value=lstrip(value);
+ rstrip(value);
+ rstrip(key);
+ }
+ return setting_new(key, value, ignore_failure, glob_exclude);
+}
+
+/* Go through the setting list, expand and sort out
+ * setting globs and actually write the settings out
+ */
+static int write_setting_list(const SettingList *sl)
+{
+ SysctlSetting *node;
+ int rc = EXIT_SUCCESS;
+
+ for (node=sl->head; node != NULL; node=node->next) {
+ if (node->glob_exclude)
+ continue;
+
+ if (string_is_glob(node->path)) {
+ char *gl_path;
+ glob_t globbuf;
+ int i;
+
+ if (glob(node->path, 0, NULL, &globbuf) != 0)
+ continue;
+
+ for(i=0; i < globbuf.gl_pathc; i++) {
+ if (settinglist_findpath(sl, globbuf.gl_pathv[i]))
+ continue; // override or exclude
+
+ rc |= WriteSetting(node->key, globbuf.gl_pathv[i], node->value,
+ node->ignore_failure);
+ }
+ } else {
+ rc |= WriteSetting(node->key, node->path, node->value,
+ node->ignore_failure);
+ }
+
+
+ }
+
+ return rc;
}
static int pattern_match(const char *string, const char *pat)
@@ -513,12 +699,12 @@ static int pattern_match(const char *str
* Preload the sysctl's from the conf file. We parse the file and then
* reform it (strip out whitespace).
*/
-static int Preload(const char *restrict const filename)
+static int Preload(SettingList *setlist, const char *restrict const filename)
{
FILE *fp;
char *t;
int n = 0;
- int rc = 0;
+ int rc = EXIT_SUCCESS;
ssize_t rlen;
char *name, *value;
glob_t globbuf;
@@ -547,62 +733,26 @@ static int Preload(const char *restrict
? stdin : fopen(globbuf.gl_pathv[j], "r");
if (!fp) {
xwarn(_("cannot open \"%s\""), globbuf.gl_pathv[j]);
- rc = -1;
- goto out;
+ return EXIT_FAILURE;
}
while ((rlen = getline(&iobuf, &iolen, fp)) > 0) {
size_t offset;
+ SysctlSetting *setting;
n++;
if (rlen < 2)
continue;
- t = StripLeadingAndTrailingSpaces(iobuf);
- if (strlen(t) < 2)
- continue;
-
- if (*t == '#' || *t == ';')
- continue;
-
- name = strtok(t, "=");
- if (!name || !*name) {
- xwarnx(_("%s(%d): invalid syntax, continuing..."),
- globbuf.gl_pathv[j], n);
- continue;
- }
-
- StripLeadingAndTrailingSpaces(name);
-
- if (pattern && !pattern_match(name, pattern))
- continue;
-
- offset = strlen(name);
- memmove(&iobuf[0], name, offset);
- iobuf[offset++] = '=';
-
- value = strtok(NULL, "\n\r");
- if (!value || !*value) {
- xwarnx(_("%s(%d): invalid syntax, continuing..."),
- globbuf.gl_pathv[j], n);
- continue;
- }
-
- while ((*value == ' ' || *value == '\t') && *value != 0)
- value++;
-
- /* should NameOnly affect this? */
- memmove(&iobuf[offset], value, strlen(value));
- offset += strlen(value);
- iobuf[offset] = '\0';
-
- rc |= WriteSetting(iobuf);
+ if ( (setting = parse_setting_line(globbuf.gl_pathv[j], n, iobuf))
+ == NULL)
+ continue;
+ settinglist_add(setlist, setting);
}
fclose(fp);
}
-out:
return rc;
}
@@ -618,7 +768,7 @@ static int sortpairs(const void *A, cons
return strcmp(a->name, b->name);
}
-static int PreloadSystem(void)
+static int PreloadSystem(SettingList *setlist)
{
unsigned di, i;
const char *dirs[] = {
@@ -630,7 +780,7 @@ static int PreloadSystem(void)
};
struct pair **cfgs = NULL;
unsigned ncfgs = 0;
- int rc = 0;
+ int rc = EXIT_SUCCESS;
struct stat ts;
enum { nprealloc = 16 };
@@ -688,14 +838,14 @@ static int PreloadSystem(void)
for (i = 0; i < ncfgs; ++i) {
if (!Quiet)
printf(_("* Applying %s ...\n"), cfgs[i]->value);
- rc |= Preload(cfgs[i]->value);
+ rc |= Preload(setlist, cfgs[i]->value);
}
if (stat(DEFAULT_PRELOAD, &ts) == 0 && S_ISREG(ts.st_mode)) {
if (!Quiet)
printf(_("* Applying %s ...\n"), DEFAULT_PRELOAD);
- rc |= Preload(DEFAULT_PRELOAD);
+ rc |= Preload(setlist, DEFAULT_PRELOAD);
}
/* cleaning */
@@ -717,15 +867,19 @@ int main(int argc, char *argv[])
bool preloadfileOpt = false;
int ReturnCode = 0;
int c;
+ int rc;
const char *preloadfile = NULL;
+ SettingList *setlist;
enum {
DEPRECATED_OPTION = CHAR_MAX + 1,
- SYSTEM_OPTION
+ SYSTEM_OPTION,
+ DRYRUN_OPTION
};
static const struct option longopts[] = {
{"all", no_argument, NULL, 'a'},
{"deprecated", no_argument, NULL, DEPRECATED_OPTION},
+ {"dry-run", no_argument, NULL, DRYRUN_OPTION},
{"binary", no_argument, NULL, 'b'},
{"ignore", no_argument, NULL, 'e'},
{"names", no_argument, NULL, 'N'},
@@ -753,6 +907,10 @@ int main(int argc, char *argv[])
IgnoreError = false;
Quiet = false;
IgnoreDeprecated = true;
+ DryRun = false;
+ setlist = xmalloc(sizeof(SettingList));
+ setlist->head = NULL;
+ setlist->tail = NULL;
if (argc < 2)
Usage(stderr);
@@ -805,7 +963,12 @@ int main(int argc, char *argv[])
break;
case SYSTEM_OPTION:
IgnoreError = true;
- return PreloadSystem();
+ rc |= PreloadSystem(setlist);
+ rc |= write_setting_list(setlist);
+ return rc;
+ case DRYRUN_OPTION:
+ DryRun = true;
+ break;
case 'r':
pattern = xstrdup(optarg);
break;
@@ -833,15 +996,16 @@ int main(int argc, char *argv[])
int ret = EXIT_SUCCESS, i;
if (!preloadfile) {
if (!argc) {
- ret |= Preload(DEFAULT_PRELOAD);
+ ret |= Preload(setlist, DEFAULT_PRELOAD);
}
} else {
/* This happens when -pfile option is
* used without space. */
- ret |= Preload(preloadfile);
+ ret |= Preload(setlist, preloadfile);
}
for (i = 0; i < argc; i++)
- ret |= Preload(argv[i]);
+ ret |= Preload(setlist, argv[i]);
+ ret |= write_setting_list(setlist);
return ret;
}
@@ -855,9 +1019,14 @@ int main(int argc, char *argv[])
program_invocation_short_name);
for ( ; *argv; argv++) {
- if (WriteMode || strchr(*argv, '='))
- ReturnCode += WriteSetting(*argv);
- else
+ if (WriteMode || strchr(*argv, '=')) {
+ SysctlSetting *s;
+ if ( (s = parse_setting_line("command line", 0, *argv)) != NULL)
+ ReturnCode |= WriteSetting(s->key, s->path, s->value,
+ s->ignore_failure);
+ else
+ ReturnCode |= EXIT_FAILURE;
+ } else
ReturnCode += ReadSetting(*argv);
}
return ReturnCode;
diff -up ./testsuite/config/unix.exp.ori ./testsuite/config/unix.exp
--- ./testsuite/config/unix.exp.ori 2021-02-09 11:11:25.000000000 +0100
+++ ./testsuite/config/unix.exp 2022-03-31 18:27:36.536486629 +0200
@@ -136,6 +136,15 @@ proc expect_table_dsc { test match_heade
#}
}
+proc expect_spawn_retval { test retval } {
+ foreach {pid spawnid os_error_flag value} [wait] break
+
+ if {$value == $retval} {
+ return
+ }
+ fail "$test (exit value)"
+}
+
proc make_pipeproc { } {
global pipeproc_pid pipeproc_spawnid topdir
diff -up ./testsuite/sysctl_glob_test.conf.ori ./testsuite/sysctl_glob_test.conf
--- ./testsuite/sysctl_glob_test.conf.ori 2022-03-31 18:27:36.537486635 +0200
+++ ./testsuite/sysctl_glob_test.conf 2022-03-31 18:27:36.537486635 +0200
@@ -0,0 +1,6 @@
+#
+# Test configuration for for glob in sysctl
+#
+fs.protected_* = 2
+fs.protected_hardlinks = 1
+-fs.protected_regular
diff -up ./testsuite/sysctl.test/sysctl_write.exp.ori ./testsuite/sysctl.test/sysctl_write.exp
--- ./testsuite/sysctl.test/sysctl_write.exp.ori 2022-03-31 18:27:36.536486629 +0200
+++ ./testsuite/sysctl.test/sysctl_write.exp 2022-03-31 18:27:36.536486629 +0200
@@ -0,0 +1,29 @@
+
+set sysctl ${topdir}sysctl
+
+set test "sysctl write from command line"
+spawn $sysctl --dry-run kernel.hostname=procps-test
+expect_pass "$test" "/proc/sys/kernel/hostname = procps-test"
+
+set test "sysctl write from configuration file"
+spawn $sysctl --dry-run -f ${topdir}testsuite/sysctl_glob_test.conf
+expect_pass "$test" "/proc/sys/fs/protected_fifos = 2\\s+/proc/sys/fs/protected_symlinks = 2\\s+/proc/sys/fs/protected_hardlinks = 1"
+
+set hostname_file "/proc/sys/kernel/hostname"
+if {[file exists ${hostname_file}]} {
+ if {[file writable ${hostname_file}]} {
+ unsupported "sysctl write: hostname file is writable"
+ } else {
+ set test "sysctl write unwritable file"
+ spawn $sysctl -q kernel.hostname=procpstest
+ expect_pass "$test" "sysctl: permission denied on key \"kernel.hostname\"\\s*$"
+ expect_spawn_retval "$test" 1
+
+ set test "sysctl write unwritable file ignored"
+ spawn $sysctl -q -- -kernel.hostname=procpstest
+ expect_pass "$test" "sysctl: permission denied on key \"kernel.hostname\", ignoring\\s*$"
+ expect_spawn_retval "$test" 0
+ }
+} else {
+ unsupported "sysctl write: hostname file doe not exist"
+}
@@ -0,0 +1,153 @@
diff -up ./NEWS.ori ./NEWS
--- ./NEWS.ori 2022-08-15 11:59:35.929714848 +0200
+++ ./NEWS 2022-08-15 12:00:12.892937479 +0200
@@ -1,4 +1,14 @@
procps-ng-NEXT
+<<<<<<< HEAD
+=======
+ * library
+ Re-add elogind support merge #151
+ * ps: threads again display when -L is used with -q issue #234
+ * ps: proper aix format string behavior was restored
+ * sysctl: print dotted keys again
+
+procps-ng-4.0.0
+>>>>>>> b159c198 (sysctl: print dotted keys again)
---------------
* Rename pwait to pidwait
diff -up ./sysctl.c.ori ./sysctl.c
--- ./sysctl.c.ori 2022-08-15 11:59:35.934714878 +0200
+++ ./sysctl.c 2022-08-15 12:00:12.893937485 +0200
@@ -152,7 +152,7 @@ static SysctlSetting *setting_new(
strcat(path + proc_len, key+1);
else
strcat(path + proc_len, key);
- /* change . to / */
+ /* change . to / for path */
slashdot(path + proc_len, '.', '/');
s = xmalloc(sizeof(SysctlSetting));
@@ -510,7 +510,8 @@ static int WriteSetting(
int rc = EXIT_SUCCESS;
FILE *fp;
- struct stat ts;
+ struct stat ts;
+ char *dotted_key;
if (!key || !path)
return rc;
@@ -523,13 +524,22 @@ static int WriteSetting(
return rc;
}
- if ((ts.st_mode & S_IWUSR) == 0) {
- xwarn(_("setting key \"%s\""), key);
+ /* Convert the globbed path into a dotted key */
+ if ( (dotted_key = strdup(path + strlen(PROC_PATH))) == NULL) {
+ xerrx(EXIT_FAILURE, _("strdup key"));
+ return EXIT_FAILURE;
+ }
+ slashdot(dotted_key, '/', '.');
+
+ if ((ts.st_mode & S_IWUSR) == 0) {
+ xwarn(_("setting key \"%s\""), dotted_key);
+ free(dotted_key);
return rc;
}
- if (S_ISDIR(ts.st_mode)) {
- xwarn(_("setting key \"%s\""), key);
+ if (S_ISDIR(ts.st_mode)) {
+ xwarn(_("setting key \"%s\""), dotted_key);
+ free(dotted_key);
return rc;
}
@@ -539,7 +549,7 @@ static int WriteSetting(
case ENOENT:
if (!IgnoreError) {
xwarnx(_("\"%s\" is an unknown key%s"),
- key, (ignore_failure?_(", ignoring"):""));
+ dotted_key, (ignore_failure?_(", ignoring"):""));
if (!ignore_failure)
rc = EXIT_FAILURE;
}
@@ -548,11 +558,11 @@ static int WriteSetting(
case EROFS:
case EACCES:
xwarnx(_("permission denied on key \"%s\"%s"),
- key, (ignore_failure?_(", ignoring"):""));
+ dotted_key, (ignore_failure?_(", ignoring"):""));
break;
default:
xwarn(_("setting key \"%s\"%s"),
- key, (ignore_failure?_(", ignoring"):""));
+ dotted_key, (ignore_failure?_(", ignoring"):""));
break;
}
if (!ignore_failure && errno != ENOENT)
@@ -561,7 +571,7 @@ static int WriteSetting(
if (0 < fprintf(fp, "%s\n", value))
rc = EXIT_SUCCESS;
if (close_stream(fp) != 0) {
- xwarn(_("setting key \"%s\""), path);
+ xwarn(_("setting key \"%s\""), dotted_key);
return rc;
}
}
@@ -571,7 +581,7 @@ static int WriteSetting(
printf("%s\n", value);
} else {
if (PrintName) {
- printf("%s = %s\n", path, value);
+ printf("%s = %s\n", dotted_key, value);
} else {
if (PrintNewline)
printf("%s\n", value);
@@ -580,6 +590,7 @@ static int WriteSetting(
}
}
}
+ free(dotted_key);
return rc;
}
diff -up ./testsuite/sysctl_slash_test.conf.ori ./testsuite/sysctl_slash_test.conf
--- ./testsuite/sysctl_slash_test.conf.ori 2022-08-15 12:00:12.894937491 +0200
+++ ./testsuite/sysctl_slash_test.conf 2022-08-15 12:00:12.893937485 +0200
@@ -0,0 +1 @@
+kernel/hostname = procps-test
diff -up ./testsuite/sysctl.test/sysctl_write.exp.ori ./testsuite/sysctl.test/sysctl_write.exp
--- ./testsuite/sysctl.test/sysctl_write.exp.ori 2022-08-15 11:59:35.934714878 +0200
+++ ./testsuite/sysctl.test/sysctl_write.exp 2022-08-15 12:00:12.893937485 +0200
@@ -3,11 +3,19 @@ set sysctl ${topdir}sysctl
set test "sysctl write from command line"
spawn $sysctl --dry-run kernel.hostname=procps-test
-expect_pass "$test" "/proc/sys/kernel/hostname = procps-test"
+expect_pass "$test" "kernel.hostname = procps-test"
+
+set test "sysctl write from command line using slash"
+spawn $sysctl --dry-run kernel/hostname=procps-test
+expect_pass "$test" "kernel.hostname = procps-test"
set test "sysctl write from configuration file"
spawn $sysctl --dry-run -f ${topdir}testsuite/sysctl_glob_test.conf
-expect_pass "$test" "/proc/sys/fs/protected_fifos = 2\\s+/proc/sys/fs/protected_symlinks = 2\\s+/proc/sys/fs/protected_hardlinks = 1"
+expect_pass "$test" "fs.protected_fifos = 2\\s+fs.protected_symlinks = 2\\s+fs.protected_hardlinks = 1"
+
+set test "sysctl write from file with slashes"
+spawn $sysctl --dry-run -f ${topdir}testsuite/sysctl_slash_test.conf
+expect_pass "$test" "kernel.hostname = procps-test"
set hostname_file "/proc/sys/kernel/hostname"
if {[file exists ${hostname_file}]} {
@@ -25,5 +33,5 @@ if {[file exists ${hostname_file}]} {
expect_spawn_retval "$test" 0
}
} else {
- unsupported "sysctl write: hostname file doe not exist"
+ unsupported "sysctl write: hostname file does not exist"
}
-60
View File
@@ -1,60 +0,0 @@
From bb96fc42956c9ed926a1b958ab715f8b4a663dec Mon Sep 17 00:00:00 2001
From: Craig Small <csmall@dropbear.xyz>
Date: Sun, 5 Jan 2020 15:05:55 +1100
Subject: [PATCH] pgrep: check sanity of SC_ARG_MAX
A kernel change means we cannot trust what sysconf(SC_ARG_MAX)
returns. We clamp it so its more than 4096 and less than 128*1024
which is what findutils does.
References:
procps-ng/procps#152
https://git.savannah.gnu.org/cgit/findutils.git/tree/lib/buildcmd.c#n535
https://lwn.net/Articles/727862/
---
pgrep.c | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/pgrep.c b/pgrep.c
index 01563db..bde7448 100644
--- a/pgrep.c
+++ b/pgrep.c
@@ -485,6 +485,26 @@ static regex_t * do_regcomp (void)
return preg;
}
+/*
+ * SC_ARG_MAX used to return the maximum size a command line can be
+ * however changes to the kernel mean this can be bigger than we can
+ * alloc. Clamp it to 128kB like xargs and friends do
+ * Should also not be smaller than POSIX_ARG_MAX which is 4096
+ */
+static size_t get_arg_max(void)
+{
+#define MIN_ARG_SIZE 4096u
+#define MAX_ARG_SIZE (128u * 1024u)
+
+ size_t val = sysconf(_SC_ARG_MAX);
+
+ if (val < MIN_ARG_SIZE)
+ val = MIN_ARG_SIZE;
+ if (val > MAX_ARG_SIZE)
+ val = MAX_ARG_SIZE;
+
+ return val;
+}
static struct el * select_procs (int *num)
{
PROCTAB *ptp;
@@ -497,7 +517,7 @@ static struct el * select_procs (int *num)
regex_t *preg;
pid_t myself = getpid();
struct el *list = NULL;
- long cmdlen = sysconf(_SC_ARG_MAX) * sizeof(char);
+ long cmdlen = get_arg_max() * sizeof(char);
char *cmdline = xmalloc(cmdlen);
char *cmdsearch = xmalloc(cmdlen);
char *cmdoutput = xmalloc(cmdlen);
--
2.26.2
-10
View File
@@ -1,10 +0,0 @@
--- procps-3.2.7~/top.c 2006-06-25 08:41:48.000000000 +0200
+++ procps-3.2.7/top.c 2007-07-20 12:50:00.000000000 +0200
@@ -2886,6 +2886,7 @@
s_frme = cpu->s - cpu->s_sav;
n_frme = cpu->n - cpu->n_sav;
i_frme = TRIMz(cpu->i - cpu->i_sav);
+ if ((u_frme == 0) && (i_frme == 0)) i_frme = 100.0;
w_frme = cpu->w - cpu->w_sav;
x_frme = cpu->x - cpu->x_sav;
y_frme = cpu->y - cpu->y_sav;
@@ -1,10 +0,0 @@
--- procps-3.2.5/top.h
+++ procps-3.2.5/top.h
@@ -132,6 +132,7 @@
#define _PUFF(fmt,arg...) \
do { \
char _str[ROWBUFSIZ]; \
+ if (Pseudo_row >= Screen_rows-1) break; \
int _len = 1 + snprintf(_str, sizeof(_str), fmt, ## arg); \
putp ( Batch ? _str : \
({ \
@@ -1,19 +0,0 @@
--- procps-3.2.5/w.c
+++ procps-3.2.5/w.c
@@ -285,10 +285,16 @@
if (ioctl(1, TIOCGWINSZ, &win) != -1 && win.ws_col > 0)
maxcmd = win.ws_col;
+#if 0
+/* I have no idea why I shouldn't be allowed to see the result
+ with a line wrap. The other solution would be to create a
+ wcat alias, which does w|cat to work around this, but this
+ would be stupid in my opinion. */
if (maxcmd < 71) {
fprintf(stderr, "%d column window is too narrow\n", maxcmd);
exit(1);
}
+#endif
maxcmd -= 29 + (from ? 16 : 0) + (longform ? 20 : 0);
if (maxcmd < 3)
fprintf(stderr, "warning: screen width %d suboptimal.\n", win.ws_col);
@@ -1,11 +0,0 @@
--- procps-3.2.5/top.c
+++ procps-3.2.5/top.c
@@ -3285,7 +3285,7 @@
if (rc <= 0) {
// EOF is pretty much a "can't happen" except for a kernel bug.
// We should quickly die via SIGHUP, and thus not spin here.
- // if (rc == 0) end_pgm(0); /* EOF from terminal */
+ if (rc == 0) end_pgm(0); /* EOF from terminal */
fcntl(STDIN_FILENO, F_SETFL, file_flags);
select(1, &fs, NULL, NULL, &tv);
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK|file_flags);
@@ -1,6 +0,0 @@
--- a/proc/readproc.c
+++ b/proc/readproc.c
@@ -858,2 +858,2 @@
if(file2str("/proc/self", "stat", sbuf, sizeof sbuf) == -1){
- fprintf(stderr, "Error, do this: mount -t proc none /proc\n");
+ fprintf(stderr, "Error, do this: mount -t proc proc /proc\n");
@@ -1,28 +0,0 @@
diff -up procps-3.2.7/proc/escape.c.p8 procps-3.2.7/proc/escape.c
--- procps-3.2.7/proc/escape.c.p8 2005-01-05 21:50:26.000000000 +0100
+++ procps-3.2.7/proc/escape.c 2008-09-01 11:31:15.000000000 +0200
@@ -79,6 +79,7 @@ static int escape_str_utf8(char *restric
// multibyte - printable
// Got space?
if (my_cells+wlen > *maxcells || my_bytes+1+len >= bufsize) break;
+#ifdef OUTPUT_PARANOID
// 0x9b is control byte for some terminals
if (memchr(src, 0x9B, len)) {
// unsafe multibyte
@@ -87,13 +88,16 @@ static int escape_str_utf8(char *restric
my_cells++;
my_bytes++;
} else {
+#endif
// safe multibyte
memcpy(dst, src, len);
my_cells += wlen;
dst += len;
my_bytes += len;
src += len;
+#ifdef OUTPUT_PARANOID
}
+#endif
}
}
//fprintf(stdout, "cells: %d\n", my_cells);
@@ -1,49 +0,0 @@
diff -up procps-3.2.7/ps/parser.c.p3 procps-3.2.7/ps/parser.c
--- procps-3.2.7/ps/parser.c.p3 2008-09-01 11:11:50.000000000 +0200
+++ procps-3.2.7/ps/parser.c 2008-09-01 11:11:50.000000000 +0200
@@ -1238,7 +1238,7 @@ try_bsd:
// as SysV options... and you're screwed if you've been patching
// out the friendly warning. Cut-over is likely to be in 2005.
if(!(personality & PER_FORCE_BSD))
- fprintf(stderr, "Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html\n");
+ fprintf(stderr, "Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-%s/FAQ\n",procps_number_version);
// Remember: contact albert@users.sf.net or procps-feedback@lists.sf.net
// if you should feel tempted. Be damn sure you understand all
// the issues. The same goes for other stuff too, BTW. Please ask.
diff -up procps-3.2.7/proc/version.h.p3 procps-3.2.7/proc/version.h
--- procps-3.2.7/proc/version.h.p3 2002-12-15 01:08:32.000000000 +0100
+++ procps-3.2.7/proc/version.h 2008-09-01 11:11:50.000000000 +0200
@@ -16,6 +16,7 @@ EXTERN_C_BEGIN
extern void display_version(void); /* display suite version */
extern const char procps_version[]; /* global buf for suite version */
+extern const char procps_number_version[]; /* global buf for suite number version */
extern int linux_version_code; /* runtime version of LINUX_VERSION_CODE
in /usr/include/linux/version.h */
diff -up procps-3.2.7/proc/library.map.p3 procps-3.2.7/proc/library.map
--- procps-3.2.7/proc/library.map.p3 2005-03-14 05:32:40.000000000 +0100
+++ procps-3.2.7/proc/library.map 2008-09-01 11:11:50.000000000 +0200
@@ -9,7 +9,7 @@ global:
escape_str; escape_strlist;
openproc; closeproc;
tty_to_dev; dev_to_tty; open_psdb_message; open_psdb; lookup_wchan;
- display_version; procps_version; linux_version_code;
+ display_version; procps_version; procps_number_version; linux_version_code;
Hertz; smp_num_cpus; have_privs;
sprint_uptime; uptime; user_from_uid; print_uptime; loadavg;
pretty_print_signals; print_given_signals; unix_print_signals; signal_name_to_number; signal_number_to_name;
diff -up procps-3.2.7/proc/version.c.p3 procps-3.2.7/proc/version.c
--- procps-3.2.7/proc/version.c.p3 2003-01-29 02:11:43.000000000 +0100
+++ procps-3.2.7/proc/version.c 2008-09-01 11:11:50.000000000 +0200
@@ -16,8 +16,10 @@
#ifdef MINORVERSION
const char procps_version[] = "procps version " VERSION "." SUBVERSION "." MINORVERSION;
+const char procps_number_version[] = VERSION "." SUBVERSION "." MINORVERSION;
#else
const char procps_version[] = "procps version " VERSION "." SUBVERSION;
+const char procps_number_version[] = VERSION "." SUBVERSION;
#endif
void display_version(void) {
@@ -1,23 +0,0 @@
diff -up procps-3.2.7/free.1.hlmem procps-3.2.7/free.1
--- procps-3.2.7/free.1.hlmem 2009-02-24 10:54:35.000000000 +0100
+++ procps-3.2.7/free.1 2009-02-24 11:00:26.000000000 +0100
@@ -7,7 +7,7 @@ free \- Display amount of free and used
.SH SYNOPSIS
.BR "free " [ "\-b" " | " "\-k" " | " "\-m" "] [" "\-o" "] [" "\-s"
.I delay
-.RB "] [" "\-t" "] [" "\-V" ]
+.RB "] [" "\-t" "] [" "\-l" "] [" "\-V" "]
.SH DESCRIPTION
\fBfree\fP displays the total amount of free and used physical and swap
memory in the system, as well as the buffers used by the kernel.
@@ -28,7 +28,9 @@ may actually specify any floating point
.BR usleep (3)
is used for microsecond resolution delay times.
.PP
-The \fB\-V\fP displays version information.
+The \fB-l\fP switch shows detailed low and high memory statistics.
+.PP
+The \fB\-V\fP switch displays version information.
.SH FILES
.ta
.IR /proc/meminfo "\-\- memory information"
@@ -1,61 +0,0 @@
diff -up procps-3.2.7/ps/output.c.p12 procps-3.2.7/ps/output.c
--- procps-3.2.7/ps/output.c.p12 2006-06-19 01:27:02.000000000 +0200
+++ procps-3.2.7/ps/output.c 2008-09-01 11:35:06.000000000 +0200
@@ -1090,7 +1090,7 @@ static int pr_sgi_p(char *restrict const
return snprintf(outbuf, COLWID, "*");
}
-
+#ifdef STATICLIB
/****************** FLASK & seLinux security stuff **********************/
// move the bulk of this to libproc sometime
@@ -1122,7 +1122,7 @@ fail:
return 1;
}
-#if 0
+#else
// This needs more study, considering:
// 1. the static linking option (maybe disable this in that case)
// 2. the -z and -Z option issue
@@ -1134,7 +1134,7 @@ static int pr_context(char *restrict con
char *context;
if(!ps_getpidcon && !tried_load){
- void *handle = dlopen("libselinux.so.1", RTLD_NOW);
+ void *handle = dlopen("libselinux.so", RTLD_NOW);
if(handle){
dlerror();
ps_getpidcon = dlsym(handle, "getpidcon");
diff -up procps-3.2.7/Makefile.p12 procps-3.2.7/Makefile
--- procps-3.2.7/Makefile.p12 2006-06-24 11:02:25.000000000 +0200
+++ procps-3.2.7/Makefile 2008-09-01 11:35:06.000000000 +0200
@@ -73,12 +73,12 @@ CURSES := -lncurses
# Something like this is probably needed to make the SE Linux
# library loading not conflict with embedded systems stuff.
#
-#ifeq ($(SHARED),1)
-#ldl := -ldl
-#LIBTYPE := -DSHAREDLIB
-#else
-#LIBTYPE := -DSTATICLIB
-#endif
+ifeq ($(SHARED),1)
+ldl := -ldl
+LIBTYPE := -DSHAREDLIB
+else
+LIBTYPE := -DSTATICLIB
+endif
# Preprocessor flags.
PKG_CPPFLAGS := -D_GNU_SOURCE -I proc
@@ -103,7 +103,7 @@ PKG_CFLAGS := -fno-common -ffast-math
# Note that some stuff below is conditional on CFLAGS containing
# an option that starts with "-g". (-g, -g2, -g3, -ggdb, etc.)
CFLAGS := -O2 -s
-ALL_CFLAGS := $(PKG_CFLAGS) $(CFLAGS)
+ALL_CFLAGS := $(PKG_CFLAGS) $(CFLAGS) $(LIBTYPE)
PKG_LDFLAGS := -Wl,-warn-common
LDFLAGS :=
@@ -1,22 +0,0 @@
--- procps-3.2.7/proc/readproc.c.kzak 2006-06-16 10:18:13.000000000 +0200
+++ procps-3.2.7/proc/readproc.c 2006-09-27 11:25:13.000000000 +0200
@@ -432,14 +432,17 @@
if(fd==-1) return NULL;
/* 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))
end_of_file = 1;
- if (n == 0 && rbuf == 0)
+ if (n == 0 && rbuf == 0) {
+ close(fd);
return NULL; /* process died between our open and read */
+ }
if (n < 0) {
if (rbuf)
free(rbuf);
+ close(fd);
return NULL; /* read error */
}
if (end_of_file && buf[n-1]) /* last read char not null */
@@ -1,36 +0,0 @@
diff -up procps-3.2.7/watch.c.p2 procps-3.2.7/watch.c
--- procps-3.2.7/watch.c.p2 2006-06-17 11:18:38.000000000 +0200
+++ procps-3.2.7/watch.c 2008-09-01 10:46:17.000000000 +0200
@@ -25,6 +25,9 @@
#include <termios.h>
#include <locale.h>
#include "proc/procps.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
#ifdef FORCE_8BIT
#undef isprint
@@ -138,6 +141,7 @@ int
main(int argc, char *argv[])
{
int optc;
+ int fd;
int option_differences = 0,
option_differences_cumulative = 0,
option_help = 0, option_version = 0;
@@ -260,7 +264,13 @@ main(int argc, char *argv[])
mvaddstr(0, width - tsl + 1, ts);
free(header);
}
-
+ close(0);
+ fd=open("/dev/null",O_RDWR);
+ if (fd!=0) {
+ perror("open");
+ do_exit(2);
+ }
+
if (!(p = popen(command, "r"))) {
perror("popen");
do_exit(2);
@@ -1,19 +0,0 @@
diff -up procps-3.2.7/top.c.p6 procps-3.2.7/top.c
--- procps-3.2.7/top.c.p6 2006-06-25 08:41:48.000000000 +0200
+++ procps-3.2.7/top.c 2008-09-01 11:28:15.000000000 +0200
@@ -3331,12 +3331,15 @@ static void frame_make (void)
int main (int dont_care_argc, char *argv[])
{
+ struct stat isproc;
(void)dont_care_argc;
before(*argv);
// +-------------+
windows_stage1(); // top (sic) slice
configs_read(); // > spread etc, <
parse_args(&argv[1]); // > lean stuff, <
+ if (stat("/proc/self", &isproc)==-1)
+ std_err("/proc is not mounted, required for output data");
whack_terminal(); // > onions etc. <
windows_stage2(); // as bottom slice
// +-------------+
@@ -1,67 +0,0 @@
diff -up procps-3.2.7/ps/output.c.pom procps-3.2.7/ps/output.c
--- procps-3.2.7/ps/output.c.pom 2009-02-15 13:16:27.000000000 +0100
+++ procps-3.2.7/ps/output.c 2009-02-15 14:02:34.000000000 +0100
@@ -1097,6 +1097,40 @@ static int pr_sgi_p(char *restrict const
return snprintf(outbuf, COLWID, "*");
}
+static int pr_cgroup(char *restrict const outbuf, const proc_t *restrict const pp){
+ char filename[48];
+ FILE *fd;
+ int counter = 0;
+ int c;
+ int is_cgroup = 0;
+
+ outbuf[0]='\0';
+ snprintf(filename, sizeof filename, "/proc/%d/cgroup", pp->tgid);
+ fd = fopen(filename, "r");
+ if (likely(fd == NULL)) goto fail;
+ while (( (c = fgetc(fd)) != EOF) && (counter<665)) {
+ if (is_cgroup == 0) {
+ if (c == ':') {
+ is_cgroup = 1;
+ if (counter>0)
+ outbuf[counter++]=';';
+ }
+ }else
+ if ((c == '\n') || (c == '\0'))
+ is_cgroup = 0;
+ else
+ outbuf[counter++]=c;
+ }
+ outbuf[counter]='\0';
+ close(fd);
+ if (counter>0)
+ return counter;
+fail:
+ outbuf[0] = '-';
+ outbuf[1] = '\0';
+ return 1;
+}
+
#ifdef STATICLIB
/****************** FLASK & seLinux security stuff **********************/
// move the bulk of this to libproc sometime
@@ -1291,6 +1325,7 @@ static const format_struct format_array[
{"bsdtime", "TIME", pr_bsdtime, sr_nop, 6, 0, LNX, ET|RIGHT},
{"c", "C", pr_c, sr_pcpu, 2, 0, SUN, ET|RIGHT},
{"caught", "CAUGHT", pr_sigcatch, sr_nop, 9, 0, BSD, TO|SIGNAL}, /*sigcatch*/
+{"cgroup", "CGROUP", pr_cgroup, sr_nop, 35, 0, LNX, PO|LEFT}, /* cgroups*/
{"class", "CLS", pr_class, sr_sched, 3, 0, XXX, TO|LEFT},
{"cls", "CLS", pr_class, sr_sched, 3, 0, HPU, TO|RIGHT}, /*says HPUX or RT*/
{"cmaj_flt", "-", pr_nop, sr_cmaj_flt, 1, 0, LNX, AN|RIGHT},
diff -up procps-3.2.7/ps/ps.1.pom procps-3.2.7/ps/ps.1
--- procps-3.2.7/ps/ps.1.pom 2009-02-15 13:16:27.000000000 +0100
+++ procps-3.2.7/ps/ps.1 2009-02-15 14:00:33.000000000 +0100
@@ -908,6 +908,10 @@ width of the field, a 32 or 64 bits mask
displayed. (alias\ \fBsig_catch\fR,\ \fBsigcatch\fR).
T}
+cgroup CGROUP T{
+display control groups to which the process belonges.
+t}
+
class CLS T{
scheduling class of the process. (alias\ \fBpolicy\fR,\ \fBcls\fR).
Field's possible values are:
@@ -1,48 +0,0 @@
--- procps-3.2.7/ps/ps.1.eip64 2007-06-14 11:08:35.000000000 +0200
+++ procps-3.2.7/ps/ps.1 2007-06-14 11:03:28.000000000 +0200
@@ -1156,6 +1156,14 @@
or\ a\ decimal representation otherwise.
T}
+rip RIP T{
+64-bit instruction pointer.
+T}
+
+rsp RSP T{
+64-bit stack pointer.
+T}
+
rss RSS T{
resident set size, the non\-swapped physical memory that
a task has used (in\ kiloBytes).
--- procps-3.2.7/ps/output.c.eip64 2007-06-14 11:08:24.000000000 +0200
+++ procps-3.2.7/ps/output.c 2007-06-14 10:58:21.000000000 +0200
@@ -764,10 +764,18 @@
return snprintf(outbuf, COLWID, "%08x", (unsigned)(pp->kstk_esp));
}
+static int pr_rsp(char *restrict const outbuf, const proc_t *restrict const pp){
+ return snprintf(outbuf, COLWID, "%016lx", (unsigned long)(pp->kstk_esp));
+}
+
static int pr_eip(char *restrict const outbuf, const proc_t *restrict const pp){
return snprintf(outbuf, COLWID, "%08x", (unsigned)(pp->kstk_eip));
}
+static int pr_rip(char *restrict const outbuf, const proc_t *restrict const pp){
+ return snprintf(outbuf, COLWID, "%016lx", (unsigned long)(pp->kstk_eip));
+}
+
/* This function helps print old-style time formats */
static int old_time_helper(char *dst, unsigned long long t, unsigned long long rel) {
if(!t) return snprintf(dst, COLWID, " -");
@@ -1403,7 +1411,9 @@
{"resident", "RES", pr_nop, sr_resident, 5,MEM, LNX, PO|RIGHT},
{"rgid", "RGID", pr_rgid, sr_rgid, 5, 0, XXX, ET|RIGHT},
{"rgroup", "RGROUP", pr_rgroup, sr_rgroup, 8, GRP, U98, ET|USER}, /* was 8 wide */
+{"rip", "RIP", pr_rip, sr_kstk_eip, 16, 0, LNX, TO|RIGHT},
{"rlink", "RLINK", pr_nop, sr_nop, 8, 0, BSD, AN|RIGHT},
+{"rsp", "RSP", pr_rsp, sr_kstk_eip, 16, 0, LNX, TO|RIGHT},
{"rss", "RSS", pr_rss, sr_rss, 5, 0, XXX, PO|RIGHT}, /* was 5 wide */
{"rssize", "RSS", pr_rss, sr_vm_rss, 5, 0, DEC, PO|RIGHT}, /*rsz*/
{"rsz", "RSZ", pr_rss, sr_vm_rss, 5, 0, BSD, PO|RIGHT}, /*rssize*/
@@ -1,11 +0,0 @@
--- procps-3.2.7/ps/output.c.libselinux 2007-08-27 08:34:13.000000000 +0200
+++ procps-3.2.7/ps/output.c 2007-08-27 08:34:30.000000000 +0200
@@ -1141,7 +1141,7 @@
char *context;
if(!ps_getpidcon && !tried_load){
- void *handle = dlopen("libselinux.so", RTLD_NOW);
+ void *handle = dlopen("libselinux.so.1", RTLD_NOW);
if(handle){
dlerror();
ps_getpidcon = dlsym(handle, "getpidcon");
@@ -1,12 +0,0 @@
diff -up procps-3.2.7/ps/ps.1.ps-man-fmt procps-3.2.7/ps/ps.1
--- procps-3.2.7/ps/ps.1.ps-man-fmt 2008-09-01 11:43:18.000000000 +0200
+++ procps-3.2.7/ps/ps.1 2008-09-01 11:43:41.000000000 +0200
@@ -30,7 +30,7 @@
.\" the space needed for the 1st two columns.
.\" Making it messy: inches, ens, points, scaled points...
.\"
-.nr ColSize ((\n(.lu-\n(.iu/\n(.Hu-20u)n)
+.nr ColSize ((\n[.l] - \n[.i]) / 1n - 20)
.\"
.\" This is for command options
.nr OptSize (16u)
@@ -1,71 +0,0 @@
--- procps-3.2.7/ps/output.c.jitter 2007-04-26 13:15:47.000000000 +0200
+++ procps-3.2.7/ps/output.c 2007-04-26 13:31:24.000000000 +0200
@@ -77,7 +77,6 @@
static int wide_signals; /* true if we have room */
static unsigned long seconds_since_1970;
-static unsigned long time_of_boot;
static unsigned long page_shift;
@@ -1952,7 +1951,6 @@
// available space: page_size*outbuf_pages-SPACE_AMOUNT
seconds_since_1970 = time(NULL);
- time_of_boot = seconds_since_1970 - seconds_since_boot;
meminfo();
--- procps-3.2.7/ps/common.h.jitter 2005-01-27 04:43:22.000000000 +0100
+++ procps-3.2.7/ps/common.h 2007-04-26 12:44:01.000000000 +0200
@@ -302,6 +302,7 @@
extern int screen_cols;
extern int screen_rows;
extern unsigned long seconds_since_boot;
+extern unsigned long time_of_boot;
extern selection_node *selection_list;
extern unsigned simple_select;
extern sort_node *sort_list;
--- procps-3.2.7/ps/global.c.jitter 2005-10-30 01:43:34.000000000 +0200
+++ procps-3.2.7/ps/global.c 2007-04-26 13:26:38.000000000 +0200
@@ -70,6 +70,7 @@
int screen_cols = -1;
int screen_rows = -1;
unsigned long seconds_since_boot = -1;
+unsigned long time_of_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,7 +362,23 @@
look_up_our_self(&p);
set_screen_size();
set_personality();
-
+ int fd;
+ char *buf[BUFFSIZE];
+ const char *b;
+
+ /* get boot time from /proc/stat */
+ fd = open("/proc/stat", O_RDONLY, 0);
+ if (fd != -1) {
+ buf[BUFFSIZE-1] = 0;
+ read(fd, buf, BUFFSIZE-1);
+ b = strstr(buf, "btime ");
+ if (b) {
+ sscanf(b, "btime %lu", &time_of_boot);
+ seconds_since_boot = time(0) - time_of_boot;
+ }
+ close(fd);
+ }
+
all_processes = 0;
bsd_c_option = 0;
bsd_e_option = 0;
@@ -380,7 +397,6 @@
negate_selection = 0;
page_size = getpagesize();
running_only = 0;
- seconds_since_boot = uptime(0,0);
selection_list = NULL;
simple_select = 0;
sort_list = NULL;
@@ -1,19 +0,0 @@
diff -up procps-3.2.7/top.h.p7 procps-3.2.7/top.h
--- procps-3.2.7/top.h.p7 2006-06-25 08:41:48.000000000 +0200
+++ procps-3.2.7/top.h 2008-09-01 11:29:15.000000000 +0200
@@ -149,8 +149,13 @@ do {
int _len = 1 + snprintf(_str, sizeof(_str), fmt, ## arg); \
if (Batch) _ptr = _str; \
else { \
- _ptr = &Pseudo_scrn[Pseudo_row++ * Pseudo_cols]; \
- if (memcmp(_ptr, _str, _len)) { \
+ int _rest; \
+ _ptr = &Pseudo_scrn[Pseudo_row * Pseudo_cols]; \
+ _rest = Pseudo_size-(_ptr-Pseudo_scrn); \
+ Pseudo_row = (Pseudo_row+1) % Screen_rows; \
+ if (_rest < _len) \
+ _len = _rest; \
+ if (memcmp(_ptr, _str, _len)) { \
memcpy(_ptr, _str, _len); \
} else { \
_ptr = "\n"; \
@@ -1,22 +0,0 @@
--- procps-3.2.7/ps/ps.1.psman 2007-06-20 08:30:47.000000000 +0200
+++ procps-3.2.7/ps/ps.1 2007-06-20 08:50:10.000000000 +0200
@@ -21,8 +21,8 @@
.\" See /usr/share/groff/current/tmac/an-old.tmac for what these do.
.\" Setting them to zero provides extra space, but only do that for
.\" plain text output. PostScript and such will remain indented.
-.if n .nr IN 0n
-.if n .nr an-prevailing-indent 0n
+.\" .if n .nr IN 0n
+.\" .if n .nr an-prevailing-indent 0n
.\"
.\"
.\" ColSize is used for the format spec table.
@@ -838,6 +838,8 @@
.\" lB1 lB1 lBw(5.5i)
.\" lB1 l1 l.
.\"
+.RE
+
.TS
expand;
lB1 lB1 lBw(\n[ColSize]n)
@@ -1,113 +0,0 @@
diff -up procps-3.2.7/slabtop.c.once procps-3.2.7/slabtop.c
--- procps-3.2.7/slabtop.c.once 2008-12-11 13:24:52.000000000 +0100
+++ procps-3.2.7/slabtop.c 2008-12-11 13:33:12.000000000 +0100
@@ -268,9 +268,24 @@ static void parse_input(char c)
}
}
+/*printw or printf depending on the context*/
+static void printwf(int once, const char *s,...)
+{
+va_list va;
+
+va_start(va,s);
+if(once)
+ vprintf(s,va);
+else
+ vwprintw(stdscr, s, va);
+va_end(va);
+}
+
+
int main(int argc, char *argv[])
{
int o;
+ int once = 0;
unsigned short old_rows;
struct slab_info *slab_list = NULL;
@@ -307,6 +322,7 @@ int main(int argc, char *argv[])
break;
case 'o':
delay = 0;
+ once = 1;
break;
case 'V':
display_version();
@@ -322,12 +338,18 @@ int main(int argc, char *argv[])
if (tcgetattr(0, &saved_tty) == -1)
perror("tcgetattr");
- initscr();
- term_size(0);
- old_rows = rows;
- resizeterm(rows, cols);
- signal(SIGWINCH, term_size);
- signal(SIGINT, sigint_handler);
+ if(!once) {
+ initscr();
+ term_size(0);
+ old_rows = rows;
+ resizeterm(rows, cols);
+ signal(SIGWINCH, term_size);
+ signal(SIGINT, sigint_handler);
+ } else {
+ old_rows = rows;
+ rows = 80;
+ cols = 24;
+ }
do {
struct slab_info *curr;
@@ -341,12 +363,12 @@ int main(int argc, char *argv[])
break;
if (old_rows != rows) {
- resizeterm(rows, cols);
+ if(!once) resizeterm(rows, cols);
old_rows = rows;
}
move(0,0);
- printw( " Active / Total Objects (%% used) : %d / %d (%.1f%%)\n"
+ printwf(once, " Active / Total Objects (%% used) : %d / %d (%.1f%%)\n"
" Active / Total Slabs (%% used) : %d / %d (%.1f%%)\n"
" Active / Total Caches (%% used) : %d / %d (%.1f%%)\n"
" Active / Total Size (%% used) : %.2fK / %.2fK (%.1f%%)\n"
@@ -360,15 +382,15 @@ int main(int argc, char *argv[])
slab_list = slabsort(slab_list);
- attron(A_REVERSE);
- printw( "%6s %6s %4s %8s %6s %8s %10s %-23s\n",
+ if(!once) attron(A_REVERSE);
+ printwf(once, "%6s %6s %4s %8s %6s %8s %10s %-23s\n",
"OBJS", "ACTIVE", "USE", "OBJ SIZE", "SLABS",
"OBJ/SLAB", "CACHE SIZE", "NAME");
- attroff(A_REVERSE);
+ if(!once) attroff(A_REVERSE);
curr = slab_list;
for (i = 0; i < rows - 8 && curr->next; i++) {
- printw("%6u %6u %3u%% %7.2fK %6u %8u %9uK %-23s\n",
+ printwf(once, "%6u %6u %3u%% %7.2fK %6u %8u %9uK %-23s\n",
curr->nr_objs, curr->nr_active_objs, curr->use,
curr->obj_size / 1024.0, curr->nr_slabs,
curr->objs_per_slab, (unsigned)(curr->cache_size / 1024),
@@ -376,7 +398,7 @@ int main(int argc, char *argv[])
curr = curr->next;
}
- refresh();
+ if(!once) refresh();
put_slabinfo(slab_list);
FD_ZERO(&readfds);
@@ -392,6 +414,6 @@ int main(int argc, char *argv[])
tcsetattr(0, TCSAFLUSH, &saved_tty);
free_slabinfo(slab_list);
- endwin();
+ if(!once) endwin();
return 0;
}
@@ -1,87 +0,0 @@
--- procps-3.2.7/sysctl.c.kzak 2007-04-03 01:26:01.000000000 +0200
+++ procps-3.2.7/sysctl.c 2007-04-03 01:26:13.000000000 +0200
@@ -63,6 +63,44 @@
static const char ERR_PRELOAD_FILE[] = "error: unable to open preload file \"%s\"\n";
static const char WARN_BAD_LINE[] = "warning: %s(%d): invalid syntax, continuing...\n";
+/* Ignore deprecated sysctls
+ * -- we use this list when we scan (DisplayAll) /proc/sys only. We don't use it
+ * in case when user direcly uses deprecated key. It's better when user can read
+ * an error message from kernel.
+ */
+struct sysctl_ignore {
+ const char *prefix;
+ int prefix_len;
+ const char *option;
+ int option_len;
+};
+
+#define IGNORE_ENTRY(prefix, option) \
+ { prefix, sizeof(prefix)-1, option, sizeof(option)-1 }
+
+static struct sysctl_ignore Ignore[] =
+{
+ IGNORE_ENTRY( "net.ipv6.neigh", "base_reachable_time" ),
+ IGNORE_ENTRY( "net.ipv6.neigh", "retrans_time" )
+};
+
+static bool IsIgnored(const char *name)
+{
+ unsigned int i;
+ int sz = strlen(name);
+
+ for (i = 0; i < sizeof(Ignore)/sizeof(struct sysctl_ignore); i++) {
+ struct sysctl_ignore *p = &Ignore[i];
+
+ if (sz < (p->prefix_len + p->option_len))
+ continue;
+
+ if (strncmp(name, p->prefix, p->prefix_len) == 0 &&
+ strcmp(name + (sz - p->option_len), p->option) == 0)
+ return true;
+ }
+ return false;
+}
static void slashdot(char *restrict p, char old, char new){
p = strpbrk(p,"/.");
@@ -122,7 +160,7 @@
* Read a sysctl setting
*
*/
-static int ReadSetting(const char *restrict const name) {
+static int ReadSetting(const char *restrict const name, bool useign) {
int rc = 0;
char *restrict tmpname;
char *restrict outname;
@@ -145,6 +183,12 @@
outname = strdup(name);
slashdot(outname,'/','.'); /* change / to . */
+ if (useign && IsIgnored(outname)) {
+ free(outname);
+ free(tmpname);
+ return rc;
+ }
+
if (stat(tmpname, &st)==0) {
if (st.st_mode & (S_IRUSR|S_IROTH|S_IRGRP))
fp = fopen(tmpname, "r");
@@ -257,7 +301,7 @@
strcat(tmpdir, "/");
DisplayAll(tmpdir);
} else {
- rc |= ReadSetting(tmpdir+strlen(PROC_PATH));
+ rc |= ReadSetting(tmpdir+strlen(PROC_PATH), true);
}
}
free(tmpdir);
@@ -519,7 +563,7 @@
if (WriteMode || index(*argv, '='))
ReturnCode = WriteSetting(*argv);
else
- ReturnCode = ReadSetting(*argv);
+ ReturnCode = ReadSetting(*argv, false);
}
}
@@ -1,56 +0,0 @@
diff -up procps-3.2.7/sysctl.c.p9 procps-3.2.7/sysctl.c
--- procps-3.2.7/sysctl.c.p9 2006-06-25 02:51:51.000000000 +0200
+++ procps-3.2.7/sysctl.c 2008-09-01 11:31:58.000000000 +0200
@@ -127,7 +127,8 @@ static int ReadSetting(const char *restr
char *restrict tmpname;
char *restrict outname;
char inbuf[1025];
- FILE *restrict fp;
+ FILE *restrict fp = NULL;
+ struct stat st;
if (!name || !*name) {
fprintf(stderr, ERR_INVALID_KEY, name);
@@ -144,7 +145,13 @@ static int ReadSetting(const char *restr
outname = strdup(name);
slashdot(outname,'/','.'); /* change / to . */
- fp = fopen(tmpname, "r");
+ if (stat(tmpname, &st)==0) {
+ if (st.st_mode & (S_IRUSR|S_IROTH|S_IRGRP))
+ fp = fopen(tmpname, "r");
+ else
+ /* ignore write-only files */
+ return -1;
+ }
if (!fp) {
switch(errno) {
@@ -158,12 +165,16 @@ static int ReadSetting(const char *restr
fprintf(stderr, ERR_PERMISSION_DENIED, outname);
rc = -1;
break;
+ case EINVAL: /* fopen()/stat() invalid argument */
+ case ENOTTY: /* inappropriate ioctl for device */
+ break;
default:
fprintf(stderr, ERR_UNKNOWN_READING, strerror(errno), outname);
rc = -1;
break;
}
} else {
+ errno=0;
if(fgets(inbuf, sizeof inbuf - 1, fp)) {
// this loop is required, see
// /sbin/sysctl -a | egrep -6 dev.cdrom.info
@@ -183,7 +194,9 @@ static int ReadSetting(const char *restr
}
}
} while(fgets(inbuf, sizeof inbuf - 1, fp));
- } else {
+
+ /* fgets() returns NULL and errno without change if the file is empty */
+ } else if (errno) {
switch(errno) {
case EACCES:
fprintf(stderr, ERR_PERMISSION_DENIED, outname);
@@ -1,19 +0,0 @@
diff -up procps-3.2.7/top.c.clrscr procps-3.2.7/top.c
--- procps-3.2.7/top.c.clrscr 2008-04-08 08:49:48.000000000 +0200
+++ procps-3.2.7/top.c 2008-04-08 08:50:07.000000000 +0200
@@ -2109,6 +2109,7 @@ static void fields_sort (void)
*p = x + 'A';
Curwin->rc.sortindx = x;
putp(Cap_curs_norm);
+ putp(Cap_clr_scr);
}
@@ -2134,6 +2135,7 @@ static void fields_toggle (void)
*p = i + 'A';
}
putp(Cap_curs_norm);
+ putp(Cap_clr_scr);
}
/*###### Windows/Field Groups support #################################*/
@@ -1,20 +0,0 @@
--- procps-3.2.7/top.c.orig 2007-09-07 21:28:41.000000000 +0100
+++ procps-3.2.7/top.c 2007-09-07 21:29:15.000000000 +0100
@@ -959,8 +959,15 @@
// and just in case we're 2.2.xx compiled without SMP support...
if (Cpu_tot == 1) {
- cpus[1].id = 0;
- memcpy(cpus, &cpus[1], sizeof(CPU_t));
+ cpus[0].id = cpus[1].id = 0;
+ cpus[0].u = cpus[1].u;
+ cpus[0].n = cpus[1].n;
+ cpus[0].s = cpus[1].s;
+ cpus[0].i = cpus[1].i;
+ cpus[0].w = cpus[1].w;
+ cpus[0].x = cpus[1].x;
+ cpus[0].y = cpus[1].y;
+ cpus[0].z = cpus[1].z;
}
// now value each separate cpu's tics
@@ -1,12 +0,0 @@
diff -up procps-3.2.7/top.c.cpuint procps-3.2.7/top.c
--- procps-3.2.7/top.c.cpuint 2008-01-11 08:32:44.000000000 +0100
+++ procps-3.2.7/top.c 2008-01-11 08:32:52.000000000 +0100
@@ -1824,7 +1824,7 @@ static void configs_read (void)
if(Rc.mode_irixps && smp_num_cpus>1){
// good for 100 CPUs per process
pcpu_max_value = 9999.0;
- Fieldstab[P_CPU].fmts = " %4.0f";
+ Fieldstab[P_CPU].fmts = " %4.1f";
}
// lastly, establish the true runtime secure mode and delay time
@@ -1,83 +0,0 @@
diff -up procps-3.2.7/top.c.p15 procps-3.2.7/top.c
--- procps-3.2.7/top.c.p15 2008-09-01 11:37:51.000000000 +0200
+++ procps-3.2.7/top.c 2008-09-01 11:37:51.000000000 +0200
@@ -121,6 +121,7 @@ static int No_ksyms = -1, // set t
Secure_mode = 0; // set if some functionality restricted
static int VIRT_vmsize = 0; //use vm_size for VIRT
+static int CPU_loop = 0; // wait for reliable CPU data
/* Some cap's stuff to reduce runtime calls --
to accomodate 'Batch' mode, they begin life as empty strings */
@@ -1679,6 +1680,8 @@ static void before (char *me)
if (( getenv("STATSIZE")) && ( atoi(getenv("STATSIZE")) == 1 ))
VIRT_vmsize = 1;
+ if (( getenv("CPULOOP")) && ( atoi(getenv("CPULOOP")) == 1 ))
+ CPU_loop = 1;
}
@@ -2978,6 +2981,7 @@ static proc_t **summary_show (void)
{
static proc_t **p_table = NULL;
static CPU_t *smpcpu = NULL;
+ static int first = 0;
// whoa first time, gotta' prime the pump...
if (!p_table) {
@@ -3025,6 +3029,28 @@ static proc_t **summary_show (void)
smpcpu = cpus_refresh(smpcpu);
+ if (first==0 && CPU_loop)
+ {
+ int i;
+ CPU_t *cpu;
+ for (i = 0; i < Cpu_tot; i++) {
+ cpu = &smpcpu[i];
+ cpu->u_sav = cpu->u;
+ cpu->s_sav = cpu->s;
+ cpu->n_sav = cpu->n;
+ cpu->i_sav = cpu->i;
+ cpu->w_sav = cpu->w;
+ cpu->x_sav = cpu->x;
+ cpu->y_sav = cpu->y;
+ cpu->z_sav = cpu->z;
+ }
+ tv.tv_sec = Rc.delay_time;
+ tv.tv_usec = (Rc.delay_time - (int)Rc.delay_time) * 1000000;
+ select(0, NULL, NULL, NULL, &tv);
+
+ smpcpu = cpus_refresh(smpcpu);
+ }
+
if (CHKw(Curwin, View_CPUSUM)) {
// display just the 1st /proc/stat line
summaryhlp(&smpcpu[Cpu_tot], "Cpu(s):");
@@ -3050,6 +3076,8 @@ static proc_t **summary_show (void)
}
SETw(Curwin, NEWFRAM_cwo);
+
+ first = 1;
return p_table;
}
diff -up procps-3.2.7/top.1.p15 procps-3.2.7/top.1
--- procps-3.2.7/top.1.p15 2008-09-01 11:37:51.000000000 +0200
+++ procps-3.2.7/top.1 2008-09-01 11:37:51.000000000 +0200
@@ -1183,6 +1183,13 @@ Then ponder this:
Send bug reports to:
Albert D\. Cahalan, <albert@users.sf.net>
+The top command calculates Cpu(s) by looking at the change in CPU time values
+between samples. When you first run it, it has no previous sample to compare
+to, so these initial values are the percentages since boot. It means you need
+at least two loops or you have to ignore summary output from the first loop.
+This is problem for example for batch mode. There is a possible workaround if
+you define the CPULOOP=1 environment variable. The top command will be run one
+extra hidden loop for CPU data before standard output.
.\" ----------------------------------------------------------------------
.SH 8. HISTORY Former top
@@ -1,55 +0,0 @@
diff -up procps-3.2.7/top.c.p14 procps-3.2.7/top.c
--- procps-3.2.7/top.c.p14 2008-09-01 11:36:55.000000000 +0200
+++ procps-3.2.7/top.c 2008-09-01 11:36:55.000000000 +0200
@@ -120,6 +120,8 @@ static int No_ksyms = -1, // set t
Loops = -1, // number of iterations, -1 loops forever
Secure_mode = 0; // set if some functionality restricted
+static int VIRT_vmsize = 0; //use vm_size for VIRT
+
/* Some cap's stuff to reduce runtime calls --
to accomodate 'Batch' mode, they begin life as empty strings */
static char Cap_clr_eol [CAPBUFSIZ],
@@ -1674,6 +1676,9 @@ static void before (char *me)
Fieldstab[P_PPD].fmts = pid_fmt;
Fieldstab[P_PPD].head = " PPID" + 10 - pid_digits;
}
+
+ if (( getenv("STATSIZE")) && ( atoi(getenv("STATSIZE")) == 1 ))
+ VIRT_vmsize = 1;
}
@@ -2207,6 +2212,7 @@ static void reframewins (void)
}
if (!Frames_libflags) Frames_libflags = L_DEFAULT;
if (selection_type=='p') Frames_libflags |= PROC_PID;
+ if (VIRT_vmsize) Frames_libflags |= L_status;
}
@@ -3186,7 +3192,10 @@ static void task_show (const WIN_t *q, c
MKCOL(p->ruser);
break;
case P_VRT:
- MKCOL(scale_num(PAGES_TO_KB(p->size), w, s));
+ if (VIRT_vmsize)
+ MKCOL(scale_num(PAGES_TO_KB(p->vm_size), w, s));
+ else
+ MKCOL(scale_num(PAGES_TO_KB(p->size), w, s));
break;
case P_WCH:
if (No_ksyms) {
diff -up procps-3.2.7/top.1.p14 procps-3.2.7/top.1
--- procps-3.2.7/top.1.p14 2006-06-19 06:33:51.000000000 +0200
+++ procps-3.2.7/top.1 2008-09-01 11:36:55.000000000 +0200
@@ -401,7 +401,8 @@ A task's currently used share of availab
o:\fB VIRT\fR \*(EM Virtual Image (kb)
The total amount of \*(MV used by the task.
It includes all code, data and shared libraries plus pages that have been
-swapped out.
+swapped out. (Note: you can define the STATSIZE=1 environment variable and the VIRT
+will be calculated from the /proc/#/state VmSize field.)
VIRT = SWAP + RES.
@@ -1,24 +0,0 @@
diff -up procps-3.2.7/top.1.cpudesc procps-3.2.7/top.1
--- procps-3.2.7/top.1.cpudesc 2008-01-18 08:04:19.000000000 +0100
+++ procps-3.2.7/top.1 2008-01-18 08:15:49.000000000 +0100
@@ -540,6 +540,20 @@ You\fI move\fR a field to the\fB left\fR
upper case\fR letter and to the\fB right\fR with the\fB lower case\fR
letter.
+.\" ......................................................................
+.SS 2c. SUMMARY Area Fields
+.\" ----------------------------------------------------------------------
+The summary area fields describing CPU statistics are abbreviated. They provide
+information about times spent in:
+ \fR us = user mode
+ \fR sy = system mode
+ \fR ni = low priority user mode (nice)
+ \fR id = idle task
+ \fR wa = I/O waiting
+ \fR hi = servicing IRQs
+ \fR si = servicing soft IRQs
+ \fR st = steal (time given to other DomU instances)
+
.\" ----------------------------------------------------------------------
.SH 3. INTERACTIVE Commands
@@ -1,15 +0,0 @@
diff -up procps-3.2.7/top.c.p10 procps-3.2.7/top.c
--- procps-3.2.7/top.c.p10 2008-09-01 11:33:06.000000000 +0200
+++ procps-3.2.7/top.c 2008-09-01 11:33:06.000000000 +0200
@@ -2462,7 +2462,10 @@ static void windows_stage2 (void)
int i;
for (i = 0; i < GROUPSMAX; i++) {
- win_names(&Winstk[i], Winstk[i].rc.winname);
+ /* Please, never use something like sprintf(x, "%s", x); ... see win_names() */
+ char buf[WINNAMSIZ];
+ strncpy(buf, Winstk[i].rc.winname, WINNAMSIZ);
+ win_names(&Winstk[i], buf);
capsmk(&Winstk[i]);
}
// rely on this next guy to force a call (eventually) to reframewins
@@ -1,98 +0,0 @@
--- procps-3.2.7/top.c.remcpu 2006-07-10 10:41:11.000000000 +0200
+++ procps-3.2.7/top.c 2006-07-10 10:41:35.000000000 +0200
@@ -912,6 +912,7 @@
static CPU_t *cpus_refresh (CPU_t *cpus)
{
static FILE *fp = NULL;
+ static int cpu_max;
int i;
int num;
// enough for a /proc/stat CPU line (not the intr line)
@@ -926,24 +927,29 @@
can hold tics representing the /proc/stat cpu summary (the first
line read) -- that slot supports our View_CPUSUM toggle */
cpus = alloc_c((1 + Cpu_tot) * sizeof(CPU_t));
+ cpu_max = Cpu_tot;
}
+ else if (cpu_max > Cpu_tot)
+ /* move saved CUPs summary to cpu_max possition */
+ memcpy(&cpus[cpu_max], &cpus[Cpu_tot], sizeof(CPU_t));
+
rewind(fp);
fflush(fp);
// first value the last slot with the cpu summary line
if (!fgets(buf, sizeof(buf), fp)) std_err("failed /proc/stat read");
- cpus[Cpu_tot].x = 0; // FIXME: can't tell by kernel version number
- cpus[Cpu_tot].y = 0; // FIXME: can't tell by kernel version number
- cpus[Cpu_tot].z = 0; // FIXME: can't tell by kernel version number
+ cpus[cpu_max].x = 0; // FIXME: can't tell by kernel version number
+ cpus[cpu_max].y = 0; // FIXME: can't tell by kernel version number
+ cpus[cpu_max].z = 0; // FIXME: can't tell by kernel version number
num = sscanf(buf, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu",
- &cpus[Cpu_tot].u,
- &cpus[Cpu_tot].n,
- &cpus[Cpu_tot].s,
- &cpus[Cpu_tot].i,
- &cpus[Cpu_tot].w,
- &cpus[Cpu_tot].x,
- &cpus[Cpu_tot].y,
- &cpus[Cpu_tot].z
+ &cpus[cpu_max].u,
+ &cpus[cpu_max].n,
+ &cpus[cpu_max].s,
+ &cpus[cpu_max].i,
+ &cpus[cpu_max].w,
+ &cpus[cpu_max].x,
+ &cpus[cpu_max].y,
+ &cpus[cpu_max].z
);
if (num < 4)
std_err("failed /proc/stat read");
@@ -955,7 +961,7 @@
}
// now value each separate cpu's tics
- for (i = 0; 1 < Cpu_tot && i < Cpu_tot; i++) {
+ for (i = 0; ; i++) {
if (!fgets(buf, sizeof(buf), fp)) std_err("failed /proc/stat read");
cpus[i].x = 0; // FIXME: can't tell by kernel version number
cpus[i].y = 0; // FIXME: can't tell by kernel version number
@@ -964,9 +970,35 @@
&cpus[i].id,
&cpus[i].u, &cpus[i].n, &cpus[i].s, &cpus[i].i, &cpus[i].w, &cpus[i].x, &cpus[i].y, &cpus[i].z
);
- if (num < 4)
- std_err("failed /proc/stat read");
+ if (num < 4) {
+ Cpu_tot = i;
+ break;
+ }
+ if (i == cpu_max - 1) {
+ // Bump cpu_max and extend cpus
+ cpu_max++;
+ cpus = realloc(cpus, (1 + cpu_max) * sizeof(CPU_t));
+ if (!cpus) std_err("realloc failed");
+ memcpy(&cpus[cpu_max], &cpus[cpu_max-1], sizeof(CPU_t));
+ }
+ }
+
+ if (cpu_max > Cpu_tot)
+ memcpy(&cpus[Cpu_tot], &cpus[cpu_max], sizeof(CPU_t));
+
+ // and just in case we're 2.2.xx compiled without SMP support...
+ if (Cpu_tot == 1) {
+ cpus[0].id = cpus[1].id = 0;
+ cpus[0].u = cpus[1].u;
+ cpus[0].n = cpus[1].n;
+ cpus[0].s = cpus[1].s;
+ cpus[0].i = cpus[1].i;
+ cpus[0].w = cpus[1].w;
+ cpus[0].x = cpus[1].x;
+ cpus[0].y = cpus[1].y;
+ cpus[0].z = cpus[1].z;
}
+
return cpus;
}
@@ -1,37 +0,0 @@
--- procps-3.2.7/top.c.sorthigh 2007-02-05 09:06:34.000000000 +0100
+++ procps-3.2.7/top.c 2007-02-05 09:09:35.000000000 +0100
@@ -3121,6 +3121,7 @@
unsigned w = Fieldstab[i].width;
int advance = (x==0) && !Rc.mode_altscr;
+ f += advance;
switch (i) {
case P_CMD:
@@ -3179,7 +3180,7 @@
break;
case P_PRI:
if (unlikely(-99 > p->priority) || unlikely(999 < p->priority)) {
- f = " RT";
+ f = advance ? " RT" : " RT";
MKCOL("");
} else
MKCOL((int)p->priority);
@@ -3227,7 +3228,7 @@
break;
case P_WCH:
if (No_ksyms) {
- f = " %08lx ";
+ f = advance ? "%08lx " : " %08lx ";
MKCOL((long)p->wchan);
} else {
MKCOL(lookup_wchan(p->wchan, p->XXXID));
@@ -3236,7 +3237,7 @@
} /* end: switch 'procflag' */
- rp = scat(rp, cbuf+advance);
+ rp = scat(rp, cbuf);
} /* end: for 'maxpflgs' */
PUFF(
@@ -1,342 +0,0 @@
--- procps-3.2.7/top.1
+++ procps-3.2.7/top.1 2006-06-26 16:34:01.000000000 +0200
@@ -20,7 +20,7 @@
..
.\" Setup ////////////////////////////////////////////////////////////////
\# ** Comment out '.nr' or set to 0 to eliminate WIDTH fiddlin' !
-.nr half_xtra 4
+.nr half_xtra 0
.
.ll +(\n[half_xtra] + \n[half_xtra])
.
@@ -504,7 +504,7 @@ and 'Order fields' screens.
.\" ......................................................................
.SS 2b. SELECTING and ORDERING Columns
.\" ----------------------------------------------------------------------
-After pressing the \*(CIs 'f' (Fields select) or \'o' (Order fields) you will
+After pressing the \*(CIs 'f' (Fields select) or 'o' (Order fields) you will
be shown a screen containing the current \fBfields string\fR followed by names
and descriptions for all fields.
@@ -580,7 +580,7 @@ Use either of these keys if you have a l
see current status,
.TP 7
-\ \ \'\fB?\fR\' or \'\fBh\fR\' :\fIHelp\fR
+\ \ '\fB?\fR' or '\fBh\fR' :\fIHelp\fR
There are two help levels available.
The first will provide a reminder of all the basic \*(CIs.
If \*(Me is\fI secured\fR, that screen will be abbreviated.
@@ -589,7 +589,7 @@ Typing 'h' or '?' on that help screen wi
applicable to \*(AM.
.TP 7
-\ \ \'\fB=\fR\' :\fIExit_Task_Limits\fR
+\ \ '\fB=\fR' :\fIExit_Task_Limits\fR
Removes restrictions on which tasks are shown.
This command will reverse any 'i' (idle tasks) and 'n' (max tasks) commands
that might be active.
@@ -599,13 +599,13 @@ See the '-p' \*(CO for a discussion of P
When operating in \*(AM this command has a slightly broader meaning.
.TP 7
-\ \ \'\fBA\fR\' :\fIAlternate_Display_Mode_toggle\fR
+\ \ '\fBA\fR' :\fIAlternate_Display_Mode_toggle\fR
This command will switch between \*(FM and \*(AM.
\*(XT 4. ALTERNATE\-DISPLAY Mode and the 'G' \*(CI for insight into
\*(CWs and field groups.
.TP 7
-\ \ \'\fBB\fR\' :\fIBold_Disable/Enable_toggle\fR
+\ \ '\fBB\fR' :\fIBold_Disable/Enable_toggle\fR
This command will influence use of the 'bold' terminfo capability and
alters\fB both\fR the \*(SA and \*(TA for the \*(CW.
While it is intended primarily for use with dumb terminals, it can be
@@ -617,7 +617,7 @@ Thus, unless the 'x' and/or 'y' toggles
there will be no visual confirmation that they are even on.
.TP 7
-*\ \'\fBd\fR\' or \'\fBs\fR\' :\fIChange_Delay_Time_interval\fR
+*\ '\fBd\fR' or '\fBs\fR' :\fIChange_Delay_Time_interval\fR
You will be prompted to enter the delay time, in seconds, between
display updates.
@@ -631,32 +631,32 @@ If at any time you wish to know the curr
and view the system summary on the second line.
.TP 7
-\ \ \'\fBG\fR\' :\fIChoose_Another_Window/Field_Group\fR
+\ \ '\fBG\fR' :\fIChoose_Another_Window/Field_Group\fR
You will be prompted to enter a number between 1 and 4 designating the
window/field group which should be made the \*(CW.
You will soon grow comfortable with these 4 windows, especially after
experimenting with \*(AM.
.TP 7
-\ \ \'\fBI\fR\' :\fIIrix/Solaris_Mode_toggle\fR
+\ \ '\fBI\fR' :\fIIrix/Solaris_Mode_toggle\fR
When operating in 'Solaris mode' ('I' toggled \*F), a task's \*(Pu usage
will be divided by the total number of \*(PUs.
After issuing this command, you'll be informed of the new state of this toggle.
.TP 7
-\ \ \'\fBu\fR\' :\fIselect a user\fR
+\ \ '\fBu\fR' :\fIselect a user\fR
You will be prompted for a UID or username. Only processes
belonging to the selected user will be displayed. This option
matches on the effective UID.
.TP 7
-\ \ \'\fBU\fR\' :\fIselect a user\fR
+\ \ '\fBU\fR' :\fIselect a user\fR
You will be prompted for a UID or username. Only processes
belonging to the selected user will be displayed. This option
matches on the real, effective, saved, and filesystem UID.
.TP 7
-*\ \'\fBk\fR\' :\fIKill_a_task\fR
+*\ '\fBk\fR' :\fIKill_a_task\fR
You will be prompted for a PID and then the signal to send.
The default signal, as reflected in the prompt, is SIGTERM.
However, you can send any signal, via number or name.
@@ -667,24 +667,24 @@ depending on your progress:
2) at the signal prompt, type 0
.TP 7
-\ \ \'\fBq\fR\' :\fIQuit\fR
+\ \ '\fBq\fR' :\fIQuit\fR
.TP 7
-*\ \'\fBr\fR\' :\fIRenice_a_Task\fR
+*\ '\fBr\fR' :\fIRenice_a_Task\fR
You will be prompted for a PID and then the value to nice it to.
Entering a positive value will cause a process to lose priority.
Conversely, a negative value will cause a process to be viewed more
favorably by the kernel.
.TP 7
-\ \ \'\fBW\fR\' :\fIWrite_the_Configuration_File\fR
+\ \ '\fBW\fR' :\fIWrite_the_Configuration_File\fR
This will save all of your options and toggles plus the current
display mode and delay time.
By issuing this command just before quitting \*(Me, you will be able restart
later in exactly that same state.
.TP 7
-\ \ \'\fBZ\fR\' :\fIChange_Color_Mapping
+\ \ '\fBZ\fR' :\fIChange_Color_Mapping
This key will take you to a separate screen where you can change the
colors for the \*(CW, or for all windows.
For details regarding this \*(CI \*(Xt 3d. COLOR Mapping.
@@ -704,21 +704,21 @@ These commands always impact just the \*
\*(CWs and field groups.
.TP 7
-\ \ \'\fBl\fR\' :\fIToggle_Load_Average/Uptime\fR \*(EM On/Off
+\ \ '\fBl\fR' :\fIToggle_Load_Average/Uptime\fR \*(EM On/Off
This is also the line containing the program name (possibly an alias) when
operating in \*(FM or the \*(CW name when operating in \*(AM.
.TP 7
-\ \ \'\fBm\fR\' :\fIToggle_Memory/Swap_Usage\fR \*(EM On/Off
+\ \ '\fBm\fR' :\fIToggle_Memory/Swap_Usage\fR \*(EM On/Off
This command affects two \*(SA lines.
.TP 7
-\ \ \'\fBt\fR\' :\fIToggle_Task/Cpu_States\fR \*(EM On/Off
+\ \ '\fBt\fR' :\fIToggle_Task/Cpu_States\fR \*(EM On/Off
This command affects from 2 to many \*(SA lines, depending on the state
of the '1' toggle and whether or not \*(Me is running under true SMP.
.TP 7
-\ \ \'\fB1\fR\' :\fIToggle_Single/Separate_Cpu_States\fR \*(EM On/Off
+\ \ '\fB1\fR' :\fIToggle_Single/Separate_Cpu_States\fR \*(EM On/Off
This command affects how the 't' command's Cpu States portion is shown.
Although this toggle exists primarily to serve massively-parallel SMP machines,
it is not restricted to solely SMP environments.
@@ -750,12 +750,12 @@ global 'B' (bold disable) toggle.
.in
.TP 7
-\ \ \'\fBb\fR\' :\fIBold/Reverse_toggle\fR
+\ \ '\fBb\fR' :\fIBold/Reverse_toggle\fR
This command will impact how the 'x' and 'y' toggles are displayed.
Further, it will only be available when at least one of those toggles is \*O.
.TP 7
-\ \ \'\fBx\fR\' :\fIColumn_Highlight_toggle\fR
+\ \ '\fBx\fR' :\fIColumn_Highlight_toggle\fR
Changes highlighting for the current sort field.
You probably don't need a constant visual reminder of the sort field and
\*(Me hopes that you always run with 'column highlight' \*F, due to the cost
@@ -765,7 +765,7 @@ If you forget which field is being sorte
visual reminder.
.TP 7
-\ \ \'\fBy\fR\' :\fIRow_Highlight_toggle\fR
+\ \ '\fBy\fR' :\fIRow_Highlight_toggle\fR
Changes highlighting for "running" tasks.
For additional insight into this task state, \*(Xt 2a. DESCRIPTIONS of Fields,
Process Status.
@@ -774,7 +774,7 @@ Use of this provision provides important
The only costs will be a few additional tty escape sequences.
.TP 7
-\ \ \'\fBz\fR\' :\fIColor/Monochrome_toggle\fR
+\ \ '\fBz\fR' :\fIColor/Monochrome_toggle\fR
Switches the \*(CW between your last used color scheme and the older form
of black-on-white or white-on-black.
This command will alter\fB both\fR the \*(SA and \*(TA but does not affect the
@@ -785,24 +785,24 @@ state of the 'x', 'y' or 'b' toggles.
.B CONTENT\fR of \*(TW
.PD 0
.TP 7
-\ \ \'\fBc\fR\' :\fICommand_Line/Program_Name_toggle\fR
+\ \ '\fBc\fR' :\fICommand_Line/Program_Name_toggle\fR
This command will be honored whether or not the 'Command' column
is currently visible.
Later, should that field come into view, the change you applied will be seen.
.TP 7
-\ \ \'\fBf\fR\' and \'\fBo\fR\' :\fIFields_select\fR or \fIOrder_fields\fR
+\ \ '\fBf\fR' and '\fBo\fR' :\fIFields_select\fR or \fIOrder_fields\fR
These keys display separate screens where you can change which
fields are displayed and their order.
For additional information on these \*(CIs
\*(Xt 2b. SELECTING and ORDERING Columns.
.TP 7
-\ \ \'\fBH\fR\' :\fIThreads_toggle\fR
+\ \ '\fBH\fR' :\fIThreads_toggle\fR
When this toggle is \*O, all individual threads will be displayed. Otherwise, \*(Me displays a summation of all threads in a process.
.TP 7
-\ \ \'\fBS\fR\' :\fICumulative_Time_Mode_toggle\fR
+\ \ '\fBS\fR' :\fICumulative_Time_Mode_toggle\fR
When 'Cumulative mode' is \*O, each process is listed with the \*(Pu
time that it and its dead children have used.
@@ -818,7 +818,7 @@ If you wish to know in advance whether o
effect, simply ask for help and view the window summary on the second line.
.TP 7
-\ \ \'\fBu\fR\' :\fIShow_Specific_User_Only\fR
+\ \ '\fBu\fR' :\fIShow_Specific_User_Only\fR
You will be prompted to enter the name of the user to display.
Thereafter, in that \*(TW only matching User ID's will be shown, or possibly
no tasks will be shown.
@@ -831,7 +831,7 @@ just press <Enter> at the prompt, withou
.B SIZE\fR of \*(TW
.PD 0
.TP 7
-\ \ \'\fBi\fR\' :\fIIdle_Processes_toggle\fR
+\ \ '\fBi\fR' :\fIIdle_Processes_toggle\fR
Displays all tasks or just active tasks.
When this toggle is \*F, idled or zombied processes will not be displayed.
@@ -839,7 +839,7 @@ If this command is applied to the last \
affect the window's size, as all prior \*(TDs will have already been painted.
.TP 7
-\ \ \'\fBn\fR\' or \'#\' :\fISet_Maximum_Tasks\fR
+\ \ '\fBn\fR' or '#' :\fISet_Maximum_Tasks\fR
You will be prompted to enter the number of tasks to display.
The lessor of your number and available screen rows will be used.
@@ -878,12 +878,12 @@ The sort field might\fI not\fR be visibl
.in
.TP 7
-\ \ \'\fB<\fR\' :\fIMove_Sort_Field_Left\fR
+\ \ '\fB<\fR' :\fIMove_Sort_Field_Left\fR
Moves the sort column to the left unless the current sort field is
the first field being displayed.
.TP 7
-\ \ \'\fB>\fR\' :\fIMove_Sort_Field_Right\fR
+\ \ '\fB>\fR' :\fIMove_Sort_Field_Right\fR
Moves the sort column to the right unless the current sort field is
the last field being displayed.
@@ -894,7 +894,7 @@ the current sort field is visible.
.in
.TP 7
-\ \ \'\fBF\fR\' or \'\fBO\fR\' :\fISelect_Sort_Field\fR
+\ \ '\fBF\fR' or '\fBO\fR' :\fISelect_Sort_Field\fR
These keys display a separate screen where you can change which field
is used as the sort column.
@@ -907,7 +907,7 @@ This \*(CI can be a convenient way to si
when running \*(Me with column highlighting turned \*F.
.TP 7
-\ \ \'\fBR\fR\' :\fIReverse/Normal_Sort_Field_toggle\fR
+\ \ '\fBR\fR' :\fIReverse/Normal_Sort_Field_toggle\fR
Using this \*(CI you can alternate between high-to-low and low-to-high sorts.
.PP
@@ -984,7 +984,7 @@ know what window is the \*(CW.
.\" ......................................................................
.SS 4b. COMMANDS for Windows
.TP 7
-\ \ \'\fB-\fR\' and \'\fB_\fR\' :\fIShow/Hide_Window(s)_toggles\fR
+\ \ '\fB-\fR' and '\fB_\fR' :\fIShow/Hide_Window(s)_toggles\fR
The '-' key turns the \*(CW's \*(TD \*O and \*F.
When \*O, that \*(TA will show a minimum of the columns header you've
established with the 'f' and 'o' commands.
@@ -998,7 +998,7 @@ If all 4 \*(TDs are currently visible, t
as the only display element.
.TP 7
-*\ \'\fB=\fR\' and \'\fB+\fR\' :\fIEqualize_(re-balance)_Window(s)\fR
+*\ '\fB=\fR' and '\fB+\fR' :\fIEqualize_(re-balance)_Window(s)\fR
The '=' key forces the \*(CW's \*(TD to be visible.
It also reverses any 'i' (idle tasks) and 'n' (max tasks) commands that might
be active.
@@ -1009,7 +1009,7 @@ They will also have retained any customi
except for the 'i' (idle tasks) and 'n' (max tasks) commands.
.TP 7
-*\ \'\fBA\fR\' :\fIAlternate_Display_Mode_toggle\fR
+*\ '\fBA\fR' :\fIAlternate_Display_Mode_toggle\fR
This command will switch between \*(FM and \*(AM.
The first time you issue this command, all four \*(TDs will be shown.
@@ -1017,7 +1017,7 @@ Thereafter when you switch modes, you wi
chosen to make visible.
.TP 7
-*\ \'\fBa\fR\' and \'\fBw\fR\' :\fINext_Window_Forward/Backward\fR
+*\ '\fBa\fR' and '\fBw\fR' :\fINext_Window_Forward/Backward\fR
This will change the \*(CW, which in turn changes the window to which
commands are directed.
These keys act in a circular fashion so you can reach any desired \*(CW
@@ -1028,7 +1028,7 @@ whenever the \*(CW name loses its emphas
the \*(TD is \*F and many commands will be restricted.
.TP 7
-*\ \'\fBG\fR\' :\fIChoose_Another_Window/Field_Group\fR
+*\ '\fBG\fR' :\fIChoose_Another_Window/Field_Group\fR
You will be prompted to enter a number between 1 and 4 designating the
window/field group which should be made the \*(CW.
@@ -1037,15 +1037,15 @@ In \*(AM, it is simply a less convenient
commands.
.TP 7
-\ \ \'\fBg\fR\' :\fIChange_Window/Field_Group_Name\fR
+\ \ '\fBg\fR' :\fIChange_Window/Field_Group_Name\fR
You will be prompted for a new name to be applied to the \*(CW.
It does not require that the window name be visible
(the 'l' toggle to be \*O).
.IP "*" 3
The \*(CIs shown with an \*(AS have use beyond \*(AM.
- \'=', 'A', 'G' are always available
- \'a', 'w' act the same when color mapping
+ '=', 'A', 'G' are always available
+ 'a', 'w' act the same when color mapping
.\" ----------------------------------------------------------------------
@@ -1,52 +0,0 @@
--- procps-3.2.7/vmstat.c.steal 2006-07-10 10:49:49.000000000 +0200
+++ procps-3.2.7/vmstat.c 2006-07-10 10:54:03.000000000 +0200
@@ -150,15 +150,15 @@
////////////////////////////////////////////////////////////////////////////
static void new_header(void){
- printf("procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----\n");
+ printf("procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------\n");
printf(
- "%2s %2s %6s %6s %6s %6s %4s %4s %5s %5s %4s %4s %2s %2s %2s %2s\n",
+ "%2s %2s %6s %6s %6s %6s %4s %4s %5s %5s %4s %4s %2s %2s %2s %2s %2s\n",
"r","b",
"swpd", "free", a_option?"inact":"buff", a_option?"active":"cache",
"si","so",
"bi","bo",
"in","cs",
- "us","sy","id","wa"
+ "us","sy","id","wa", "st"
);
}
@@ -173,7 +173,7 @@
////////////////////////////////////////////////////////////////////////////
static void new_format(void) {
- const char format[]="%2u %2u %6lu %6lu %6lu %6lu %4u %4u %5u %5u %4u %4u %2u %2u %2u %2u\n";
+ const char format[]="%2u %2u %6lu %6lu %6lu %6lu %4u %4u %5u %5u %4u %4u %2u %2u %2u %2u %2u\n";
unsigned int tog=0; /* toggle switch for cleaner code */
unsigned int i;
unsigned int hz = Hertz;
@@ -217,8 +217,8 @@
(unsigned)( (100*duse + divo2) / Div ),
(unsigned)( (100*dsys + divo2) / Div ),
(unsigned)( (100*didl + divo2) / Div ),
- (unsigned)( (100*diow + divo2) / Div ) /* ,
- (unsigned)( (100*dstl + divo2) / Div ) */
+ (unsigned)( (100*diow + divo2) / Div ),
+ (unsigned)( (100*dstl + divo2) / Div )
);
for(i=1;i<num_updates;i++) { /* \\\\\\\\\\\\\\\\\\\\ main loop ////////////////// */
@@ -266,8 +266,8 @@
(unsigned)( (100*duse+divo2)/Div ), /*us*/
(unsigned)( (100*dsys+divo2)/Div ), /*sy*/
(unsigned)( (100*didl+divo2)/Div ), /*id*/
- (unsigned)( (100*diow+divo2)/Div )/*, //wa
- (unsigned)( (100*dstl+divo2)/Div ) //st */
+ (unsigned)( (100*diow+divo2)/Div ), //wa
+ (unsigned)( (100*dstl+divo2)/Div ) //st
);
}
}
@@ -1,12 +0,0 @@
diff -up procps-3.2.7/vmstat.c.jx procps-3.2.7/vmstat.c
--- procps-3.2.7/vmstat.c.jx 2009-01-07 14:13:52.000000000 -0500
+++ procps-3.2.7/vmstat.c 2009-01-07 14:17:07.000000000 -0500
@@ -150,7 +150,7 @@ static int format_1000(unsigned long lon
////////////////////////////////////////////////////////////////////////////
static void new_header(void){
- printf("procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------\n");
+ printf("procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----\n");
printf(
"%2s %2s %6s %6s %6s %6s %4s %4s %5s %5s %4s %4s %2s %2s %2s %2s %2s\n",
"r","b",
@@ -1,95 +0,0 @@
diff -up procps-3.2.7/proc/sysinfo.c.vmstat procps-3.2.7/proc/sysinfo.c
--- procps-3.2.7/proc/sysinfo.c.vmstat 2008-12-04 15:25:50.000000000 +0100
+++ procps-3.2.7/proc/sysinfo.c 2008-12-04 16:54:29.000000000 +0100
@@ -784,6 +784,18 @@ unsigned int getpartitions_num(struct di
}
/////////////////////////////////////////////////////////////////////////////
+static int is_disk(char *dev)
+{
+ char syspath[PATH_MAX];
+ char *slash;
+
+ while ((slash = strchr(dev, '/')))
+ *slash = '!';
+ snprintf(syspath, sizeof(syspath), "/sys/block/%s", dev);
+ return !(access(syspath, F_OK));
+}
+
+/////////////////////////////////////////////////////////////////////////////
unsigned int getdiskstat(struct disk_stat **disks, struct partition_stat **partitions){
FILE* fd;
@@ -791,6 +803,7 @@ unsigned int getdiskstat(struct disk_sta
int cPartition = 0;
int fields;
unsigned dummy;
+ char devname[PATH_MAX];
*disks = NULL;
*partitions = NULL;
@@ -803,10 +816,11 @@ unsigned int getdiskstat(struct disk_sta
fclose(fd);
break;
}
- fields = sscanf(buff, " %*d %*d %*s %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %u", &dummy);
- if (fields == 1){
+ fields = sscanf(buff, " %*d %*d %15s %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %u",
+ &devname, &dummy);
+ if (fields == 2 && is_disk(devname)){
(*disks) = realloc(*disks, (cDisk+1)*sizeof(struct disk_stat));
- sscanf(buff, " %*d %*d %15s %u %u %llu %u %u %u %llu %u %u %u %u",
+ sscanf(buff, " %*d %*d %15s %lu %lu %llu %lu %lu %lu %llu %lu %lu %lu %lu",
//&disk_major,
//&disk_minor,
(*disks)[cDisk].disk_name,
@@ -827,7 +841,9 @@ unsigned int getdiskstat(struct disk_sta
}else{
(*partitions) = realloc(*partitions, (cPartition+1)*sizeof(struct partition_stat));
fflush(stdout);
- sscanf(buff, " %*d %*d %15s %u %llu %u %u",
+ sscanf(buff, (fields == 2)
+ ? " %*d %*d %15s %u %*u %llu %*u %u %*u %llu %*u %*u %*u %*u"
+ : " %*d %*d %15s %u %llu %u %llu",
//&part_major,
//&part_minor,
(*partitions)[cPartition].partition_name,
diff -up procps-3.2.7/proc/sysinfo.h.vmstat procps-3.2.7/proc/sysinfo.h
--- procps-3.2.7/proc/sysinfo.h.vmstat 2008-12-04 15:25:41.000000000 +0100
+++ procps-3.2.7/proc/sysinfo.h 2008-12-04 16:54:32.000000000 +0100
@@ -95,16 +95,16 @@ typedef struct disk_stat{
unsigned long long reads_sectors;
unsigned long long written_sectors;
char disk_name [16];
- unsigned inprogress_IO;
- unsigned merged_reads;
- unsigned merged_writes;
- unsigned milli_reading;
- unsigned milli_spent_IO;
- unsigned milli_writing;
- unsigned partitions;
- unsigned reads;
- unsigned weighted_milli_spent_IO;
- unsigned writes;
+ unsigned long inprogress_IO;
+ unsigned long merged_reads;
+ unsigned long merged_writes;
+ unsigned long milli_reading;
+ unsigned long milli_spent_IO;
+ unsigned long milli_writing;
+ unsigned long partitions;
+ unsigned long reads;
+ unsigned long weighted_milli_spent_IO;
+ unsigned long writes;
}disk_stat;
typedef struct partition_stat{
@@ -113,7 +113,7 @@ typedef struct partition_stat{
unsigned parent_disk; // index into a struct disk_stat array
unsigned reads;
unsigned writes;
- unsigned requested_writes;
+ unsigned long long requested_writes;
}partition_stat;
extern unsigned int getpartitions_num(struct disk_stat *disks, int ndisks);
@@ -1,12 +0,0 @@
diff -up procps-3.2.7/vmstat.c.vmstat procps-3.2.7/vmstat.c
--- procps-3.2.7/vmstat.c.vmstat 2009-02-23 13:44:27.000000000 +0100
+++ procps-3.2.7/vmstat.c 2009-02-23 13:45:03.000000000 +0100
@@ -312,7 +312,7 @@ static int diskpartition_format(const ch
struct disk_stat *disks;
struct partition_stat *partitions, *current_partition=NULL;
unsigned long ndisks, j, k, npartitions;
- const char format[] = "%20u %10llu %10u %10u\n";
+ const char format[] = "%20u %10llu %10u %10llu\n";
fDiskstat=fopen("/proc/diskstats","rb");
if(!fDiskstat){
@@ -1,235 +0,0 @@
--- procps-3.2.7/proc/sysinfo.h.kzak 2006-06-25 08:41:48.000000000 +0200
+++ procps-3.2.7/proc/sysinfo.h 2006-08-04 11:19:09.000000000 +0200
@@ -57,7 +57,7 @@
#define BUFFSIZE (64*1024)
typedef unsigned long long jiff;
extern void getstat(jiff *restrict cuse, jiff *restrict cice, jiff *restrict csys, jiff *restrict cide, jiff *restrict ciow, jiff *restrict cxxx, jiff *restrict cyyy, jiff *restrict czzz,
- unsigned long *restrict pin, unsigned long *restrict pout, unsigned long *restrict s_in, unsigned long *restrict sout,
+ unsigned long long *restrict pin, unsigned long long *restrict pout, unsigned long long *restrict s_in, unsigned long long *restrict sout,
unsigned *restrict intr, unsigned *restrict ctxt,
unsigned int *restrict running, unsigned int *restrict blocked,
unsigned int *restrict btime, unsigned int *restrict processes);
@@ -72,10 +72,10 @@
extern unsigned long vm_nr_reverse_maps;
extern unsigned long vm_nr_mapped;
extern unsigned long vm_nr_slab;
-extern unsigned long vm_pgpgin;
-extern unsigned long vm_pgpgout;
-extern unsigned long vm_pswpin;
-extern unsigned long vm_pswpout;
+extern unsigned long long vm_pgpgin;
+extern unsigned long long vm_pgpgout;
+extern unsigned long long vm_pswpin;
+extern unsigned long long vm_pswpout;
extern unsigned long vm_pgalloc;
extern unsigned long vm_pgfree;
extern unsigned long vm_pgactivate;
--- procps-3.2.7/proc/sysinfo.c.kzak 2006-06-25 08:41:48.000000000 +0200
+++ procps-3.2.7/proc/sysinfo.c 2006-08-04 12:04:06.000000000 +0200
@@ -368,7 +368,7 @@
/***********************************************************************/
void getstat(jiff *restrict cuse, jiff *restrict cice, jiff *restrict csys, jiff *restrict cide, jiff *restrict ciow, jiff *restrict cxxx, jiff *restrict cyyy, jiff *restrict czzz,
- unsigned long *restrict pin, unsigned long *restrict pout, unsigned long *restrict s_in, unsigned long *restrict sout,
+ unsigned long long *restrict pin, unsigned long long *restrict pout, unsigned long long *restrict s_in, unsigned long long *restrict sout,
unsigned *restrict intr, unsigned *restrict ctxt,
unsigned int *restrict running, unsigned int *restrict blocked,
unsigned int *restrict btime, unsigned int *restrict processes) {
@@ -396,11 +396,11 @@
if(b) sscanf(b, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu", cuse, cice, csys, cide, ciow, cxxx, cyyy, czzz);
b = strstr(buff, "page ");
- if(b) sscanf(b, "page %lu %lu", pin, pout);
+ if(b) sscanf(b, "page %llu %llu", pin, pout);
else need_vmstat_file = 1;
b = strstr(buff, "swap ");
- if(b) sscanf(b, "swap %lu %lu", s_in, sout);
+ if(b) sscanf(b, "swap %llu %llu", s_in, sout);
else need_vmstat_file = 1;
b = strstr(buff, "intr ");
@@ -611,9 +611,12 @@
typedef struct vm_table_struct {
const char *name; /* VM statistic name */
- unsigned long *slot; /* slot in return struct */
+ void *slot; /* slot in return struct */
+ int sz; /* size of slot value */
} vm_table_struct;
+#define VM_TABENTRY(_name_) { # _name_, &vm_ ## _name_, sizeof(vm_ ## _name_) }
+
static int compare_vm_table_structs(const void *a, const void *b){
return strcmp(((const vm_table_struct*)a)->name,((const vm_table_struct*)b)->name);
}
@@ -626,10 +629,10 @@
unsigned long vm_nr_reverse_maps; // includes PageDirect
unsigned long vm_nr_mapped; // mapped into pagetables
unsigned long vm_nr_slab; // in slab
-unsigned long vm_pgpgin; // kB disk reads (same as 1st num on /proc/stat page line)
-unsigned long vm_pgpgout; // kB disk writes (same as 2nd num on /proc/stat page line)
-unsigned long vm_pswpin; // swap reads (same as 1st num on /proc/stat swap line)
-unsigned long vm_pswpout; // swap writes (same as 2nd num on /proc/stat swap line)
+unsigned long long vm_pgpgin; // kB disk reads (same as 1st num on /proc/stat page line)
+unsigned long long vm_pgpgout; // kB disk writes (same as 2nd num on /proc/stat page line)
+unsigned long long vm_pswpin; // swap reads (same as 1st num on /proc/stat swap line)
+unsigned long long vm_pswpout; // swap writes (same as 2nd num on /proc/stat swap line)
unsigned long vm_pgalloc; // page allocations
unsigned long vm_pgfree; // page freeings
unsigned long vm_pgactivate; // pages moved inactive -> active
@@ -668,54 +671,54 @@
void vminfo(void){
char namebuf[16]; /* big enough to hold any row name */
- vm_table_struct findme = { namebuf, NULL};
+ vm_table_struct findme = { namebuf, NULL, 0};
vm_table_struct *found;
char *head;
char *tail;
static const vm_table_struct vm_table[] = {
- {"allocstall", &vm_allocstall},
- {"kswapd_inodesteal", &vm_kswapd_inodesteal},
- {"kswapd_steal", &vm_kswapd_steal},
- {"nr_dirty", &vm_nr_dirty}, // page version of meminfo Dirty
- {"nr_mapped", &vm_nr_mapped}, // page version of meminfo Mapped
- {"nr_page_table_pages", &vm_nr_page_table_pages},// same as meminfo PageTables
- {"nr_pagecache", &vm_nr_pagecache}, // gone in 2.5.66+ kernels
- {"nr_reverse_maps", &vm_nr_reverse_maps}, // page version of meminfo ReverseMaps GONE
- {"nr_slab", &vm_nr_slab}, // page version of meminfo Slab
- {"nr_unstable", &vm_nr_unstable},
- {"nr_writeback", &vm_nr_writeback}, // page version of meminfo Writeback
- {"pageoutrun", &vm_pageoutrun},
- {"pgactivate", &vm_pgactivate},
- {"pgalloc", &vm_pgalloc}, // GONE (now separate dma,high,normal)
- {"pgalloc_dma", &vm_pgalloc_dma},
- {"pgalloc_high", &vm_pgalloc_high},
- {"pgalloc_normal", &vm_pgalloc_normal},
- {"pgdeactivate", &vm_pgdeactivate},
- {"pgfault", &vm_pgfault},
- {"pgfree", &vm_pgfree},
- {"pginodesteal", &vm_pginodesteal},
- {"pgmajfault", &vm_pgmajfault},
- {"pgpgin", &vm_pgpgin}, // important
- {"pgpgout", &vm_pgpgout}, // important
- {"pgrefill", &vm_pgrefill}, // GONE (now separate dma,high,normal)
- {"pgrefill_dma", &vm_pgrefill_dma},
- {"pgrefill_high", &vm_pgrefill_high},
- {"pgrefill_normal", &vm_pgrefill_normal},
- {"pgrotated", &vm_pgrotated},
- {"pgscan", &vm_pgscan}, // GONE (now separate direct,kswapd and dma,high,normal)
- {"pgscan_direct_dma", &vm_pgscan_direct_dma},
- {"pgscan_direct_high", &vm_pgscan_direct_high},
- {"pgscan_direct_normal",&vm_pgscan_direct_normal},
- {"pgscan_kswapd_dma", &vm_pgscan_kswapd_dma},
- {"pgscan_kswapd_high", &vm_pgscan_kswapd_high},
- {"pgscan_kswapd_normal",&vm_pgscan_kswapd_normal},
- {"pgsteal", &vm_pgsteal}, // GONE (now separate dma,high,normal)
- {"pgsteal_dma", &vm_pgsteal_dma},
- {"pgsteal_high", &vm_pgsteal_high},
- {"pgsteal_normal", &vm_pgsteal_normal},
- {"pswpin", &vm_pswpin}, // important
- {"pswpout", &vm_pswpout}, // important
- {"slabs_scanned", &vm_slabs_scanned},
+ VM_TABENTRY(allocstall),
+ VM_TABENTRY(kswapd_inodesteal),
+ VM_TABENTRY(kswapd_steal),
+ VM_TABENTRY(nr_dirty),
+ VM_TABENTRY(nr_mapped),
+ VM_TABENTRY(nr_page_table_pages),
+ VM_TABENTRY(nr_pagecache),
+ VM_TABENTRY(nr_reverse_maps),
+ VM_TABENTRY(nr_slab),
+ VM_TABENTRY(nr_unstable),
+ VM_TABENTRY(nr_writeback),
+ VM_TABENTRY(pageoutrun),
+ VM_TABENTRY(pgactivate),
+ VM_TABENTRY(pgalloc),
+ VM_TABENTRY(pgalloc_dma),
+ VM_TABENTRY(pgalloc_high),
+ VM_TABENTRY(pgalloc_normal),
+ VM_TABENTRY(pgdeactivate),
+ VM_TABENTRY(pgfault),
+ VM_TABENTRY(pgfree),
+ VM_TABENTRY(pginodesteal),
+ VM_TABENTRY(pgmajfault),
+ VM_TABENTRY(pgpgin),
+ VM_TABENTRY(pgpgout),
+ VM_TABENTRY(pgrefill),
+ VM_TABENTRY(pgrefill_dma),
+ VM_TABENTRY(pgrefill_high),
+ VM_TABENTRY(pgrefill_normal),
+ VM_TABENTRY(pgrotated),
+ VM_TABENTRY(pgscan),
+ VM_TABENTRY(pgscan_direct_dma),
+ VM_TABENTRY(pgscan_direct_high),
+ VM_TABENTRY(pgscan_direct_normal),
+ VM_TABENTRY(pgscan_kswapd_dma),
+ VM_TABENTRY(pgscan_kswapd_high),
+ VM_TABENTRY(pgscan_kswapd_normal),
+ VM_TABENTRY(pgsteal),
+ VM_TABENTRY(pgsteal_dma),
+ VM_TABENTRY(pgsteal_high),
+ VM_TABENTRY(pgsteal_normal),
+ VM_TABENTRY(pswpin),
+ VM_TABENTRY(pswpout),
+ VM_TABENTRY(slabs_scanned)
};
const int vm_table_count = sizeof(vm_table)/sizeof(vm_table_struct);
@@ -741,7 +744,10 @@
);
head = tail+1;
if(!found) goto nextline;
- *(found->slot) = strtoul(head,&tail,10);
+ if (found->sz == sizeof(unsigned long long))
+ *((unsigned long long *) found->slot) = strtoull(head,&tail,10);
+ else
+ *((unsigned long *) found->slot) = strtoul(head,&tail,10);
nextline:
//if(found) fprintf(stderr,"%s=%d\n",found->name,*(found->slot));
--- procps-3.2.7/vmstat.c.kzak 2006-08-04 10:52:38.000000000 +0200
+++ procps-3.2.7/vmstat.c 2006-08-04 12:05:49.000000000 +0200
@@ -180,7 +180,7 @@
unsigned int running,blocked,dummy_1,dummy_2;
jiff cpu_use[2], cpu_nic[2], cpu_sys[2], cpu_idl[2], cpu_iow[2], cpu_xxx[2], cpu_yyy[2], cpu_zzz[2];
jiff duse, dsys, didl, diow, dstl, Div, divo2;
- unsigned long pgpgin[2], pgpgout[2], pswpin[2], pswpout[2];
+ unsigned long long pgpgin[2], pgpgout[2], pswpin[2], pswpout[2];
unsigned int intr[2], ctxt[2];
unsigned int sleep_half;
unsigned long kb_per_page = sysconf(_SC_PAGESIZE) / 1024ul;
@@ -509,7 +509,7 @@
static void sum_format(void) {
unsigned int running, blocked, btime, processes;
jiff cpu_use, cpu_nic, cpu_sys, cpu_idl, cpu_iow, cpu_xxx, cpu_yyy, cpu_zzz;
- unsigned long pgpgin, pgpgout, pswpin, pswpout;
+ unsigned long long pgpgin, pgpgout, pswpin, pswpout;
unsigned int intr, ctxt;
meminfo();
@@ -539,10 +539,10 @@
printf("%13Lu IRQ cpu ticks\n", cpu_xxx);
printf("%13Lu softirq cpu ticks\n", cpu_yyy);
printf("%13Lu stolen cpu ticks\n", cpu_zzz);
- printf("%13lu pages paged in\n", pgpgin);
- printf("%13lu pages paged out\n", pgpgout);
- printf("%13lu pages swapped in\n", pswpin);
- printf("%13lu pages swapped out\n", pswpout);
+ printf("%13llu pages paged in\n", pgpgin);
+ printf("%13llu pages paged out\n", pgpgout);
+ printf("%13llu pages swapped in\n", pswpin);
+ printf("%13llu pages swapped out\n", pswpout);
printf("%13u interrupts\n", intr);
printf("%13u CPU context switches\n", ctxt);
printf("%13u boot time\n", btime);
@@ -554,7 +554,7 @@
static void fork_format(void) {
unsigned int running, blocked, btime, processes;
jiff cpu_use, cpu_nic, cpu_sys, cpu_idl, cpu_iow, cpu_xxx, cpu_yyy, cpu_zzz;
- unsigned long pgpgin, pgpgout, pswpin, pswpout;
+ unsigned long long pgpgin, pgpgout, pswpin, pswpout;
unsigned int intr, ctxt;
getstat(&cpu_use, &cpu_nic, &cpu_sys, &cpu_idl,
@@ -1,22 +0,0 @@
diff -up procps-3.2.7/vmstat.8.timestamp procps-3.2.7/vmstat.8
--- procps-3.2.7/vmstat.8.timestamp 2009-02-03 12:32:27.000000000 +0100
+++ procps-3.2.7/vmstat.8 2009-02-03 12:34:37.000000000 +0100
@@ -8,6 +8,7 @@ vmstat \- Report virtual memory statisti
.B vmstat
.RB [ "\-a" ]
.RB [ "\-n" ]
+.RB [ "\-t" ]
.RI [ delay " [ " count ]]
.br
.B vmstat
@@ -43,7 +44,9 @@ equivalent to the total number of tasks
is represented by one or more tasks, depending on thread usage.
This display does not repeat.
.PP
-The \fB-m\fP displays slabinfo.
+The \fB-t\fP switch adds timestamp to the output.
+.PP
+The \fB-m\fP switch displays slabinfo.
.PP
The \fB-n\fP switch causes the header to be displayed only once rather than periodically.
.PP
@@ -1,117 +0,0 @@
--- procps-3.2.7/vmstat.c 2008-12-11 22:11:30.042532106 -0500
+++ procps-3.2.7/vmstat.c.timestamp 2008-12-11 22:08:11.553529883 -0500
@@ -25,6 +25,7 @@
#include <sys/ioctl.h>
#include <sys/dir.h>
#include <dirent.h>
+#include <time.h>
#include "proc/sysinfo.h"
#include "proc/version.h"
@@ -56,6 +57,7 @@
static unsigned int height; // window height
static unsigned int moreheaders=TRUE;
+static unsigned int showtimestamp=FALSE;
/////////////////////////////////////////////////////////////////////////
@@ -71,6 +73,7 @@
fprintf(stderr," -p prints disk partition statistics\n");
fprintf(stderr," -s prints vm table\n");
fprintf(stderr," -m prints slabinfo\n");
+ fprintf(stderr," -t add timestamp to output\n");
fprintf(stderr," -S unit size\n");
fprintf(stderr," delay is the delay between updates in seconds. \n");
fprintf(stderr," unit size k:1000 K:1024 m:1000000 M:1048576 (default is K)\n");
@@ -150,7 +153,11 @@
////////////////////////////////////////////////////////////////////////////
static void new_header(void){
- printf("procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----\n");
+ if(!showtimestamp){
+ printf("procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----\n");
+ } else {
+ printf("procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---\n");
+ }
printf(
"%2s %2s %6s %6s %6s %6s %4s %4s %5s %5s %4s %4s %2s %2s %2s %2s %2s\n",
"r","b",
@@ -173,7 +180,7 @@
////////////////////////////////////////////////////////////////////////////
static void new_format(void) {
- const char format[]="%2u %2u %6lu %6lu %6lu %6lu %4u %4u %5u %5u %4u %4u %2u %2u %2u %2u %2u\n";
+ const char format[]="%2u %2u %6lu %6lu %6lu %6lu %4u %4u %5u %5u %4u %4u %2u %2u %2u %2u %2u\t%s\n";
unsigned int tog=0; /* toggle switch for cleaner code */
unsigned int i;
unsigned int hz = Hertz;
@@ -185,6 +192,10 @@
unsigned int sleep_half;
unsigned long kb_per_page = sysconf(_SC_PAGESIZE) / 1024ul;
int debt = 0; // handle idle ticks running backwards
+ struct tm *tm_ptr;
+ time_t the_time;
+ char timebuf[32];
+ timebuf[0] = '\0';
sleep_half=(sleep_time/2);
new_header();
@@ -196,6 +207,13 @@
&running,&blocked,
&dummy_1, &dummy_2);
+ if (showtimestamp)
+ {
+ (void) time( &the_time );
+ tm_ptr = localtime( &the_time );
+ strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S %Z", tm_ptr);
+ }
+
duse= *cpu_use + *cpu_nic;
dsys= *cpu_sys + *cpu_xxx + *cpu_yyy;
didl= *cpu_idl;
@@ -218,7 +236,8 @@
(unsigned)( (100*dsys + divo2) / Div ),
(unsigned)( (100*didl + divo2) / Div ),
(unsigned)( (100*diow + divo2) / Div ),
- (unsigned)( (100*dstl + divo2) / Div )
+ (unsigned)( (100*dstl + divo2) / Div ),
+ timebuf
);
for(i=1;i<num_updates;i++) { /* \\\\\\\\\\\\\\\\\\\\ main loop ////////////////// */
@@ -234,6 +253,13 @@
&running,&blocked,
&dummy_1,&dummy_2);
+ if (showtimestamp)
+ {
+ (void) time( &the_time );
+ tm_ptr = localtime( &the_time );
+ strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S %Z", tm_ptr);
+ }
+
duse= cpu_use[tog]-cpu_use[!tog] + cpu_nic[tog]-cpu_nic[!tog];
dsys= cpu_sys[tog]-cpu_sys[!tog] + cpu_xxx[tog]-cpu_xxx[!tog] + cpu_yyy[tog]-cpu_yyy[!tog];
didl= cpu_idl[tog]-cpu_idl[!tog];
@@ -267,7 +293,8 @@
(unsigned)( (100*dsys+divo2)/Div ), /*sy*/
(unsigned)( (100*didl+divo2)/Div ), /*id*/
(unsigned)( (100*diow+divo2)/Div ), //wa
- (unsigned)( (100*dstl+divo2)/Div ) //st
+ (unsigned)( (100*dstl+divo2)/Div ), //st
+ timebuf /* timestamp */
);
}
}
@@ -641,6 +668,9 @@
case 's':
statMode |= VMSUMSTAT;
break;
+ case 't':
+ showtimestamp=TRUE;
+ break;
default:
/* no other aguments defined yet. */
usage();
@@ -1,16 +0,0 @@
--- procps-3.2.7/w.c.kzak 2007-04-02 23:58:30.000000000 +0200
+++ procps-3.2.7/w.c 2007-04-03 00:09:15.000000000 +0200
@@ -149,11 +149,11 @@
const proc_t *restrict const tmp = *pptr;
if(unlikely(tmp->tgid == u->ut_pid)) {
*found_utpid = 1;
- best = tmp;
+ if (!best)
+ best = tmp;
}
if(tmp->tty != line) continue;
(*jcpu) += tmp->utime + tmp->stime;
- secondbest = tmp;
/* same time-logic here as for "best" below */
if(! (secondbest && tmp->start_time <= secondbest->start_time) ){
secondbest = tmp;
@@ -1,139 +0,0 @@
diff -u procps-3.2.7/Makefile procps/Makefile
--- procps-3.2.7/Makefile 2007-01-16 17:24:49.000000000 +0100
+++ procps/Makefile 2007-01-16 17:29:27.000000000 +0100
@@ -67,7 +67,7 @@
# plus the top-level Makefile to make it work stand-alone.
_TARFILES := Makefile
-CURSES := -lncurses
+CURSES := -lncursesw
# This seems about right for the dynamic library stuff.
# Something like this is probably needed to make the SE Linux
diff -u procps-3.2.7/watch.c procps/watch.c
--- procps-3.2.7/watch.c 2007-01-16 17:24:49.000000000 +0100
+++ procps/watch.c 2007-01-16 18:06:57.000000000 +0100
@@ -28,6 +28,8 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <wchar.h>
+#include <wctype.h>
#ifdef FORCE_8BIT
#undef isprint
@@ -137,6 +139,27 @@
}
}
+static wint_t
+readwc(FILE *stream, mbstate_t *mbs)
+{
+ for (;;) {
+ int chr;
+ char c;
+ wchar_t wc;
+ size_t len;
+
+ chr = getc(stream);
+ if (chr == EOF)
+ return WEOF;
+ c = chr;
+ len = mbrtowc(&wc, &c, 1, mbs);
+ if (len == (size_t)-1)
+ memset(mbs, 0, sizeof(*mbs));
+ else if (len != (size_t)-2)
+ return wc;
+ }
+}
+
int
main(int argc, char *argv[])
{
@@ -243,6 +266,7 @@
FILE *p;
int x, y;
int oldeolseen = 1;
+ mbstate_t mbs;
if (screen_size_changed) {
get_terminal_size();
@@ -276,49 +300,63 @@
do_exit(2);
}
+ memset(&mbs, 0, sizeof(mbs));
for (y = show_title; y < height; y++) {
int eolseen = 0, tabpending = 0;
for (x = 0; x < width; x++) {
- int c = ' ';
- int attr = 0;
+ wint_t c = L' ';
+ int attr = 0, c_width;
+ cchar_t cc;
+ wchar_t wstr[2];
if (!eolseen) {
/* if there is a tab pending, just spit spaces until the
next stop instead of reading characters */
if (!tabpending)
do
- c = getc(p);
- while (c != EOF && !isprint(c)
- && c != '\n'
- && c != '\t');
- if (c == '\n')
+ c = readwc(p, &mbs);
+ while (c != WEOF && !iswprint(c)
+ && c != L'\n'
+ && c != L'\t');
+ if (c == L'\n')
if (!oldeolseen && x == 0) {
x = -1;
continue;
} else
eolseen = 1;
- else if (c == '\t')
+ else if (c == L'\t')
tabpending = 1;
- if (c == EOF || c == '\n' || c == '\t')
- c = ' ';
+ if (c == WEOF || c == L'\n' || c == L'\t')
+ c = L' ';
if (tabpending && (((x + 1) % 8) == 0))
tabpending = 0;
}
+ wstr[0] = c;
+ wstr[1] = 0;
+ setcchar (&cc, wstr, 0, 0, NULL);
move(y, x);
if (option_differences) {
- chtype oldch = inch();
- char oldc = oldch & A_CHARTEXT;
+ cchar_t oldc;
+ wchar_t oldwstr[2];
+ attr_t attrs;
+ short colors;
+
+ in_wch(&oldc);
+ getcchar(&oldc, oldwstr, &attrs, &colors, NULL);
attr = !first_screen
- && ((char)c != oldc
+ && (wstr[0] != oldwstr[0]
||
(option_differences_cumulative
- && (oldch & A_ATTRIBUTES)));
+ && attrs));
}
if (attr)
standout();
- addch(c);
+ add_wch(&cc);
if (attr)
standend();
+ c_width = wcwidth(c);
+ if (c_width > 1)
+ x += c_width - 1;
}
oldeolseen = eolseen;
}
@@ -1,38 +0,0 @@
Description: Call libproc constructors in strict order
Having one constructor depend on another means if the order is reversed
you get a different result. Patched based on idea by Tom Evans.
Bug-Debian: http://bugs.debian.org/460331
Author: Craig Small <csmall@debian.org>
Adapted to Fedora: Jan Görig <jgorig@redhat.com>
--- a/proc/sysinfo.c
+++ b/proc/sysinfo.c
@@ -213,6 +213,7 @@
static void init_libproc(void) __attribute__((constructor));
static void init_libproc(void){
have_privs = check_for_privs();
+ init_Linux_version(); /* Must be called before we check code */
// ought to count CPUs in /proc/stat instead of relying
// on glibc, which foolishly tries to parse /proc/cpuinfo
//
--- a/proc/version.c
+++ b/proc/version.c
@@ -33,8 +33,7 @@
int linux_version_code;
-static void init_Linux_version(void) __attribute__((constructor));
-static void init_Linux_version(void) {
+void init_Linux_version(void) {
static struct utsname uts;
int x = 0, y = 0, z = 0; /* cleared in case sscanf() < 3 */
--- a/proc/version.h
+++ b/proc/version.h
@@ -14,6 +14,7 @@
EXTERN_C_BEGIN
+void init_Linux_version(void); /* Get Linux version */
extern void display_version(void); /* display suite version */
extern const char procps_version[]; /* global buf for suite version */
extern const char procps_number_version[]; /* global buf for suite number version */
@@ -1,13 +0,0 @@
diff -up procps-3.2.8/Makefile.make procps-3.2.8/Makefile
--- procps-3.2.8/Makefile.make 2010-09-08 18:16:34.000000000 +0200
+++ procps-3.2.8/Makefile 2010-09-08 18:54:41.668727996 +0200
@@ -174,7 +174,8 @@ INSTALL := $(BINFILES) $(MANFILES)
# want this rule first, use := on ALL, and ALL not filled in yet
all: do_all
--include */module.mk
+-include proc/module.mk
+-include ps/module.mk
do_all: $(ALL)
@@ -1,36 +0,0 @@
--- procps-3.2.8/ps/output.c 2010-05-18 06:00:18.000000000 +0200
+++ procps-3.2.8.lennart/ps/output.c 2010-05-18 05:59:46.000000000 +0200
@@ -1109,7 +1109,7 @@
static int pr_cgroup(char *restrict const outbuf, const proc_t *restrict const pp){
char filename[48];
FILE *fd;
- int counter = 0;
+ int counter = 0, last_begin = 0, slash = 0;
int c;
int is_cgroup = 0;
@@ -1121,15 +1121,22 @@
if (is_cgroup == 0) {
if (c == ':') {
is_cgroup = 1;
+ slash = 0;
if (counter>0)
outbuf[counter++]=';';
}
}else
- if ((c == '\n') || (c == '\0'))
- is_cgroup = 0;
+ if ((c == '\n') || (c == '\0')){
+ if (slash) /* if the last char was a / this process is in the root cgroup which we should suppress */
+ counter = last_begin;
else
+ last_begin = counter;
+ is_cgroup = 0;
+ } else {
+ slash = c == '/';
outbuf[counter++]=c;
}
+ }
outbuf[counter]='\0';
close(fd);
if (counter>0)
@@ -1,66 +0,0 @@
diff -Nur procps-3.2.8-orig/proc/sysinfo.c procps-3.2.8/proc/sysinfo.c
--- procps-3.2.8-orig/proc/sysinfo.c 2008-03-24 05:33:43.000000000 +0100
+++ procps-3.2.8/proc/sysinfo.c 2009-12-18 22:50:52.000000000 +0100
@@ -74,17 +74,19 @@
/***********************************************************************/
int uptime(double *restrict uptime_secs, double *restrict idle_secs) {
double up=0, idle=0;
- char *restrict savelocale;
+ char *savelocale;
FILE_TO_BUF(UPTIME_FILE,uptime_fd);
- savelocale = setlocale(LC_NUMERIC, NULL);
+ savelocale = strdup(setlocale(LC_NUMERIC, NULL));
setlocale(LC_NUMERIC,"C");
if (sscanf(buf, "%lf %lf", &up, &idle) < 2) {
setlocale(LC_NUMERIC,savelocale);
+ free(savelocale);
fputs("bad data in " UPTIME_FILE "\n", stderr);
return 0;
}
setlocale(LC_NUMERIC,savelocale);
+ free(savelocale);
SET_IF_DESIRED(uptime_secs, up);
SET_IF_DESIRED(idle_secs, idle);
return up; /* assume never be zero seconds in practice */
@@ -128,9 +130,9 @@
double up_1, up_2, seconds;
unsigned long long jiffies;
unsigned h;
- char *restrict savelocale;
+ char *savelocale;
- savelocale = setlocale(LC_NUMERIC, NULL);
+ savelocale = strdup(setlocale(LC_NUMERIC, NULL));
setlocale(LC_NUMERIC, "C");
do{
FILE_TO_BUF(UPTIME_FILE,uptime_fd); sscanf(buf, "%lf", &up_1);
@@ -141,6 +143,7 @@
/* uptime(&up_2, NULL); */
} while((long long)( (up_2-up_1)*1000.0/up_1 )); /* want under 0.1% error */
setlocale(LC_NUMERIC, savelocale);
+ free(savelocale);
jiffies = user_j + nice_j + sys_j + other_j;
seconds = (up_1 + up_2) / 2;
h = (unsigned)( (double)jiffies/seconds/smp_num_cpus );
@@ -303,16 +306,18 @@
/***********************************************************************/
void loadavg(double *restrict av1, double *restrict av5, double *restrict av15) {
double avg_1=0, avg_5=0, avg_15=0;
- char *restrict savelocale;
+ char *savelocale;
FILE_TO_BUF(LOADAVG_FILE,loadavg_fd);
- savelocale = setlocale(LC_NUMERIC, NULL);
+ savelocale = strdup(setlocale(LC_NUMERIC, NULL));
setlocale(LC_NUMERIC, "C");
if (sscanf(buf, "%lf %lf %lf", &avg_1, &avg_5, &avg_15) < 3) {
fputs("bad data in " LOADAVG_FILE "\n", stderr);
+ free(savelocale);
exit(1);
}
setlocale(LC_NUMERIC, savelocale);
+ free(savelocale);
SET_IF_DESIRED(av1, avg_1);
SET_IF_DESIRED(av5, avg_5);
SET_IF_DESIRED(av15, avg_15);
@@ -1,49 +0,0 @@
diff -up procps-3.2.8/top.c.threads procps-3.2.8/top.c
--- procps-3.2.8/top.c.threads 2009-10-01 07:14:43.000000000 -0400
+++ procps-3.2.8/top.c 2009-10-05 14:05:00.000000000 -0400
@@ -1138,6 +1138,7 @@ static proc_t **procs_refresh (proc_t **
#define ENTsz sizeof(proc_t)
static unsigned savmax = 0; // first time, Bypass: (i)
proc_t *ptsk = (proc_t *)-1; // first time, Force: (ii)
+ proc_t *saved_ptsk;
unsigned curmax = 0; // every time (jeeze)
PROCTAB* PT;
static int show_threads_was_enabled = 0; // optimization
@@ -1172,6 +1173,10 @@ static proc_t **procs_refresh (proc_t **
while (curmax < savmax) {
proc_t *ttsk;
if (unlikely(!(ptsk = readproc(PT, NULL)))) break;
+ if(!show_threads_was_enabled)
+ saved_ptsk = ptsk;
+ else
+ saved_ptsk = NULL;
show_threads_was_enabled = 1;
while (curmax < savmax) {
unsigned idx;
@@ -1189,7 +1194,7 @@ static proc_t **procs_refresh (proc_t **
prochlp(ttsk);
++curmax;
}
- free(ptsk); // readproc() proc_t not used
+ if(!saved_ptsk) free(ptsk); // readproc() proc_t not used
}
}
@@ -1208,7 +1213,8 @@ static proc_t **procs_refresh (proc_t **
else { // show each thread in a process separately
while (ptsk) {
proc_t *ttsk;
- if (likely(ptsk = readproc(PT, NULL))) {
+ if (likely(ptsk = readproc(PT, NULL)) ||
+ unlikely(saved_ptsk && (ptsk = saved_ptsk)) ) {
show_threads_was_enabled = 1;
while (1) {
table = alloc_r(table, (curmax + 1) * PTRsz);
@@ -1216,6 +1222,7 @@ static proc_t **procs_refresh (proc_t **
prochlp(ttsk);
table[curmax++] = ttsk;
}
+ saved_ptsk = NULL;
free(ptsk); // readproc() proc_t not used
}
}
@@ -1,126 +0,0 @@
diff -up procps-3.2.8/vmstat.c.getopt procps-3.2.8/vmstat.c
--- procps-3.2.8/vmstat.c.getopt 2010-04-06 14:39:24.000000000 +0200
+++ procps-3.2.8/vmstat.c 2010-04-06 14:47:52.000000000 +0200
@@ -30,14 +30,15 @@
#include "proc/sysinfo.h"
#include "proc/version.h"
-static unsigned long dataUnit=1024;
-static char szDataUnit [16];
#define UNIT_B 1
#define UNIT_k 1000
#define UNIT_K 1024
#define UNIT_m 1000000
#define UNIT_M 1048576
+static unsigned long dataUnit=UNIT_K;
+static char szDataUnit[3] = "K";
+
#define VMSTAT 0
#define DISKSTAT 0x00000001
#define VMSUMSTAT 0x00000002
@@ -609,12 +610,10 @@ static int winhi(void) {
////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[]) {
- char partition[16];
- argc=0; /* redefined as number of integer arguments */
- for (argv++;*argv;argv++) {
- if ('-' ==(**argv)) {
- switch (*(++(*argv))) {
-
+ char *partition = NULL;
+ int c;
+
+ while((c = getopt(argc, argv, "VdafmDnp:S:s")) != EOF) switch(c) {
case 'V':
display_version();
exit(0);
@@ -630,7 +629,7 @@ int main(int argc, char *argv[]) {
fork_format();
exit(0);
case 'm':
- statMode |= SLABSTAT;
+ statMode |= SLABSTAT;
break;
case 'D':
statMode |= DISKSUMSTAT;
@@ -641,29 +640,21 @@ int main(int argc, char *argv[]) {
break;
case 'p':
statMode |= PARTITIONSTAT;
- if (argv[1]){
- char *cp = *++argv;
- if(!memcmp(cp,"/dev/",5)) cp += 5;
- snprintf(partition, sizeof partition, "%s", cp);
- }else{
- fprintf(stderr, "-p requires an argument\n");
- exit(EXIT_FAILURE);
- }
+ partition = optarg;
+ if (memcmp(partition, "/dev/", 5) == 0) partition += 5;
break;
case 'S':
- if (argv[1]){
- ++argv;
- if (!strcmp(*argv, "k")) dataUnit=UNIT_k;
- else if (!strcmp(*argv, "K")) dataUnit=UNIT_K;
- else if (!strcmp(*argv, "m")) dataUnit=UNIT_m;
- else if (!strcmp(*argv, "M")) dataUnit=UNIT_M;
- else {fprintf(stderr, "-S requires k, K, m or M (default is kb)\n");
- exit(EXIT_FAILURE);
- }
- strcpy(szDataUnit, *argv);
- }else {fprintf(stderr, "-S requires an argument\n");
- exit(EXIT_FAILURE);
- }
+ switch(optarg[0]) {
+ case 'b': case 'B': dataUnit = UNIT_B; break;
+ case 'k': dataUnit = UNIT_k; break;
+ case 'K': dataUnit = UNIT_K; break;
+ case 'm': dataUnit = UNIT_m; break;
+ case 'M': dataUnit = UNIT_M; break;
+ default:
+ fprintf(stderr, "-S requires k, K, m or M (default is kb)\n");
+ exit(EXIT_FAILURE);
+ }
+ szDataUnit[0] = optarg[0];
break;
case 's':
statMode |= VMSUMSTAT;
@@ -674,23 +665,18 @@ int main(int argc, char *argv[]) {
default:
/* no other aguments defined yet. */
usage();
- }
- }else{
- argc++;
- switch (argc) {
- case 1:
- if ((sleep_time = atoi(*argv)) == 0)
- usage();
- num_updates = ULONG_MAX;
- break;
- case 2:
- num_updates = atol(*argv);
- break;
- default:
- usage();
- } /* switch */
- }
-}
+ }
+
+ if (optind < argc) {
+if ((sleep_time = atoi(argv[optind++])) == 0)
+ usage();
+ num_updates = ULONG_MAX;
+ }
+ if (optind < argc)
+ num_updates = atol(argv[optind++]);
+ if (optind < argc)
+ usage();
+
if (moreheaders) {
int tmp=winhi()-3;
height=((tmp>0)?tmp:22);
@@ -1,11 +0,0 @@
--- procps-3.2.7/ps/display.c.enable-core 2009-02-27 11:57:21.000000000 +0000
+++ procps-3.2.7/ps/display.c 2009-02-27 11:57:48.000000000 +0000
@@ -562,6 +562,8 @@
default:
sigaction(i,&sa,NULL);
case 0:
+ case SIGABRT:
+ case SIGSEGV:
case SIGINT: /* ^C */
case SIGTSTP: /* ^Z */
case SIGTTOU: /* see stty(1) man page */
@@ -1,138 +0,0 @@
diff -up procps-3.2.8/pmap.c.pmap procps-3.2.8/pmap.c
--- procps-3.2.8/pmap.c.pmap 2008-10-19 21:34:34.000000000 +0200
+++ procps-3.2.8/pmap.c 2010-02-08 15:40:19.000000000 +0100
@@ -126,24 +126,38 @@ static int one_proc(proc_t *p){
char buf[32];
char mapbuf[9600];
char cmdbuf[512];
+ FILE *fp;
unsigned long total_shared = 0ul;
unsigned long total_private_readonly = 0ul;
unsigned long total_private_writeable = 0ul;
+ char *cp2=NULL;
+ unsigned long long rss = 0ull;
+ unsigned long long private_dirty = 0ull;
+ unsigned long long shared_dirty = 0ull;
+ unsigned long long total_rss = 0ull;
+ unsigned long long total_private_dirty = 0ull;
+ unsigned long long total_shared_dirty = 0ull;
+ unsigned KLONG diff = 0;
+
// Overkill, but who knows what is proper? The "w" prog
// uses the tty width to determine this.
int maxcmd = 0xfffff;
sprintf(buf,"/proc/%u/maps",p->tgid);
- if(!freopen(buf, "r", stdin)) return 1;
+ if ( (fp = fopen(buf, "r")) == NULL) return 1;
+ if (x_option) {
+ sprintf(buf,"/proc/%u/smaps",p->tgid);
+ if ( (fp = freopen(buf, "r", fp)) == NULL) return 1;
+ }
escape_command(cmdbuf, p, sizeof cmdbuf, &maxcmd, ESC_ARGS|ESC_BRACKETS);
printf("%u: %s\n", p->tgid, cmdbuf);
if(!q_option && (x_option|d_option)){
if(x_option){
- if(sizeof(KLONG)==4) printf("Address Kbytes RSS Anon Locked Mode Mapping\n");
- else printf("Address Kbytes RSS Anon Locked Mode Mapping\n");
+ if(sizeof(KLONG)==4) printf("Address Kbytes RSS Dirty Mode Mapping\n");
+ else printf("Address Kbytes RSS Dirty Mode Mapping\n");
}
if(d_option){
if(sizeof(KLONG)==4) printf("Address Kbytes Mode Offset Device Mapping\n");
@@ -151,12 +165,54 @@ static int one_proc(proc_t *p){
}
}
- while(fgets(mapbuf,sizeof mapbuf,stdin)){
+ while(fgets(mapbuf,sizeof mapbuf,fp)){
char flags[32];
char *tmp; // to clean up unprintables
- unsigned KLONG start, end, diff;
+ unsigned KLONG start, end;
unsigned long long file_offset, inode;
unsigned dev_major, dev_minor;
+ unsigned long long smap_value;
+ char smap_key[20];
+
+ /* hex values are lower case or numeric, keys are upper */
+ if (mapbuf[0] >= 'A' && mapbuf[0] <= 'Z') {
+ /* Its a key */
+ if (sscanf(mapbuf,"%20[^:]: %llu", smap_key, &smap_value) == 2) {
+ if (strncmp("Rss", smap_key, 3) == 0) {
+ rss = smap_value;
+ total_rss += smap_value;
+ continue;
+ }
+ if (strncmp("Shared_Dirty", smap_key, 12) == 0) {
+ shared_dirty = smap_value;
+ total_shared_dirty += smap_value;
+ continue;
+ }
+ if (strncmp("Private_Dirty", smap_key, 13) == 0) {
+ private_dirty = smap_value;
+ total_private_dirty += smap_value;
+ continue;
+ }
+ if (strncmp("Swap", smap_key, 4) == 0) { /*doesnt matter as long as last*/
+ printf(
+ (sizeof(KLONG)==8)
+ ? "%016"KLF"x %7lu %7llu %7llu %s %s\n"
+ : "%08lx %7lu %7llu %7llu %s %s\n",
+ start,
+ (unsigned long)(diff>>10),
+ rss,
+ (private_dirty + shared_dirty),
+ flags,
+ cp2
+ );
+ /* reset some counters */
+ rss = shared_dirty = private_dirty = 0ull;
+ continue;
+ }
+ /* Other keys */
+ continue;
+ }
+ }
sscanf(mapbuf,"%"KLF"x-%"KLF"x %31s %Lx %x:%x %Lu", &start, &end, flags, &file_offset, &dev_major, &dev_minor, &inode);
if(start > range_high)
@@ -186,16 +242,9 @@ static int one_proc(proc_t *p){
flags[5] = '\0';
if(x_option){
- const char *cp = mapping_name(p, start, diff, mapbuf, 0, dev_major, dev_minor, inode);
- printf(
- (sizeof(KLONG)==8)
- ? "%016"KLF"x %7lu - - - %s %s\n"
- : "%08lx %7lu - - - %s %s\n",
- start,
- (unsigned long)(diff>>10),
- flags,
- cp
- );
+ cp2 = mapping_name(p, start, diff, mapbuf, 0, dev_major, dev_minor, inode);
+ /* printed with the keys */
+ continue;
}
if(d_option){
const char *cp = mapping_name(p, start, diff, mapbuf, 0, dev_major, dev_minor, inode);
@@ -232,10 +281,12 @@ static int one_proc(proc_t *p){
if(!q_option){
if(x_option){
if(sizeof(KLONG)==8){
- printf("---------------- ------ ------ ------ ------\n");
+ printf("---------------- ------ ------ ------\n");
printf(
- "total kB %15ld - - -\n",
- (total_shared + total_private_writeable + total_private_readonly) >> 10
+ "total kB %15ld %7llu %7llu\n",
+ (total_shared + total_private_writeable + total_private_readonly) >> 10,
+ total_rss, (total_shared_dirty+total_private_dirty)
+
);
}else{
printf("-------- ------- ------- ------- -------\n");
@@ -1,10 +0,0 @@
--- procps-3.2.7/pwdx.c
+++ procps-3.2.7/pwdx.c 2006-06-26 16:38:12.000000000 +0200
@@ -60,6 +60,7 @@
for (i = 1; i < argc; i++) {
if (regexec(&re, argv[i], 0, NULL, 0) != 0) {
snprintf(buf, sizeof buf, "pwdx: invalid process id: %s\n", argv[i]);
+ buf[sizeof(buf)-1] = '\0';
die(buf);
}
if (!strcmp("-V", argv[i]) || !strcmp("--version", argv[i]))
+13 -2
View File
@@ -12,12 +12,16 @@
<IsA>app:console</IsA>
<Summary>Standard informational utilities and process-handling tools</Summary>
<Description>procps is the package that has a bunch of small useful utilities that give information about processes using the /proc filesystem. The package includes the programs ps, top, vmstat, w, kill, free, slabtop, and skill.</Description>
<Archive sha1sum="1645168d28b70837d787f4337fd85f6f82f0a251" type="tarxz">http://downloads.sourceforge.net/project/procps-ng/Production/procps-ng-3.3.16.tar.xz</Archive>
<Archive sha1sum="a52952e8bc6aaab812176c00d25adc4d4e1552e2" type="tarxz">http://downloads.sourceforge.net/project/procps-ng/Production/procps-ng-3.3.17.tar.xz</Archive>
<BuildDependencies>
<Dependency>ncurses-devel</Dependency>
</BuildDependencies>
<Patches>
<Patch level="1">fs66093.patch</Patch>
<Patch level="1">fedora/covscan-findings.patch</Patch>
<Patch level="1">fedora/free-si-fix.patch</Patch>
<Patch level="1">fedora/pwait-to-pidwait.patch</Patch>
<Patch level="1">fedora/sysctl-hyphen-param.patch</Patch>
<Patch level="1">fedora/sysctl-print-dotted-keys-again.patch</Patch>
</Patches>
</Source>
@@ -41,6 +45,13 @@
</Package>
<History>
<Update release="8">
<Date>2022-12-07</Date>
<Version>3.3.17</Version>
<Comment>Version bump.</Comment>
<Name>Mustafa Cinasal</Name>
<Email>muscnsl@gmail.com</Email>
</Update>
<Update release="7">
<Date>2020-12-09</Date>
<Version>3.3.16</Version>