procps: link to ncursesw, add a bunch of patches from Debian. Bumprev.

This commit is contained in:
Juan RP 2010-11-03 15:57:26 +01:00
parent 722db61ea2
commit 561a33f5e4
74 changed files with 5897 additions and 86 deletions

View file

@ -0,0 +1,62 @@
Author: <csmall@debian.org>
Description: ps.1 normal indent widths
pri field explained
--no-heading comment is an alias for --no-headers
Removed setproctitle(1) reference
Bug-Debian: http://bugs.debian.org/465761
Bug-Debian: http://bugs.debian.org/529045
Index: b/ps/ps.1
===================================================================
--- a/ps/ps.1 2009-11-24 20:53:06.000000000 +1100
+++ b/ps/ps.1 2009-11-24 21:00:31.000000000 +1100
@@ -18,19 +18,13 @@
.nh
.if n .ss 12 0
.\"
-.\" 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
-.\"
.\"
.\" ColSize is used for the format spec table.
.\" It's the left margin, minus the right, minus
.\" 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(.lu-\n(.iu/\n(.Hu-26u)n)
.\"
.\" This is for command options
.nr OptSize (16u)
@@ -499,7 +493,7 @@
.opt c
Show the true command name. This is derived from the name of the
executable file, rather than from the argv value. Command arguments
-and any modifications to them (see\ \fIsetproctitle\fR(3)) are
+and any modifications to them are
thus not shown. This option
effectively turns the \fBargs\fR format keyword into the \fBcomm\fR
format keyword; it is useful with the \fB\-f\fR format option and with
@@ -588,7 +582,8 @@
repeat header lines, one per page of output
.opt \-\-no\-headers
-print no header line at all
+print no header line at all. \-\-no\-heading is an alias for this
+option.
.opt \-\-lines \ n
set screen height
@@ -1159,6 +1154,10 @@
parent process ID.
T}
+pri PRI T{
+priority of the process. Higher number means lower priority
+T}
+
psr PSR T{
processor that process is currently assigned to.
T}

View file

@ -1,39 +0,0 @@
Under certain conditions, top's display can break.
This patch is by Curtis Doty, updated by Andreas Kling for 3.2.5.
To reproduce bug:
- run top
- turn on color mode ('z')
- highlight sort column ('x')
- move sort column all the way to the left ('<')
- get drunk
procps e-mail: http://sourceforge.net/mailarchive/forum.php?thread_id=6042978&forum_id=12454
Redhat bug: http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=140975
Gentoo bug: http://bugs.gentoo.org/show_bug.cgi?id=80296
--- top.c~ 2005-01-26 06:15:18.000000000 +0100
+++ top.c 2005-02-01 09:23:35.000000000 +0100
@@ -2952,12 +2952,10 @@
for (x = 0; x < q->maxpflgs; x++) {
char cbuf[ROWBUFSIZ], _z[ROWBUFSIZ];
FLG_t i = q->procflags[x]; // support for our field/column
- const char *f = Fieldstab[i].fmts; // macro AND sometimes the fmt
+ const char *f = Fieldstab[i].fmts + ((x==0) && !Rc.mode_altscr);
unsigned s = Fieldstab[i].scale; // string must be altered !
unsigned w = Fieldstab[i].width;
- int advance = (x==0) && !Rc.mode_altscr;
-
switch (i) {
case P_CMD:
{ char tmp[ROWBUFSIZ];
@@ -3069,7 +3067,7 @@
} /* end: switch 'procflag' */
- rp = scat(rp, cbuf+advance);
+ rp = scat(rp, cbuf);
} /* end: for 'maxpflgs' */
PUFF(

View file

@ -0,0 +1,19 @@
Author: <hesso@hesso.pool.math.tu-berlin.de>
Description: Complain when /proc/version cannot be found instead of
exiting silently.
Index: b/proc/version.c
===================================================================
--- a/proc/version.c 2009-11-24 21:00:44.000000000 +1100
+++ b/proc/version.c 2009-11-24 21:00:46.000000000 +1100
@@ -39,8 +39,10 @@
FILE *fp;
char buf[256];
- if ( (fp=fopen("/proc/version","r")) == NULL) /* failure implies impending death */
+ if ( (fp=fopen("/proc/version","r")) == NULL) {
+ fprintf(stderr, "Cannot find /proc/version - is /proc mounted?\n");
exit(1);
+ }
if (fgets(buf, 256, fp) == NULL) {
fprintf(stderr, "Cannot read kernel version from /proc/version\n");
fclose(fp);

View file

@ -1,5 +1,5 @@
--- proc/module.mk.orig 2010-04-22 13:22:25.736775611 +0200 --- a/proc/module.mk.orig 2010-04-22 13:22:25.736775611 +0200
+++ proc/module.mk 2010-04-22 13:24:09.814780650 +0200 +++ b/proc/module.mk 2010-04-22 13:24:09.814780650 +0200
@@ -42,7 +42,7 @@ FPIC := -fpic @@ -42,7 +42,7 @@ FPIC := -fpic
ifeq ($(SHARED),1) ifeq ($(SHARED),1)
@ -27,8 +27,8 @@
# Junk anyway... supposed to go in /usr/include/$(NAME) # Junk anyway... supposed to go in /usr/include/$(NAME)
#INSTALL += $(addprefix $(include),$(HDRFILES)) #INSTALL += $(addprefix $(include),$(HDRFILES))
--- ps/module.mk.orig 2010-04-22 13:26:49.156775917 +0200 --- a/ps/module.mk.orig 2010-04-22 13:26:49.156775917 +0200
+++ ps/module.mk 2010-04-22 13:27:05.019792210 +0200 +++ b/ps/module.mk 2010-04-22 13:27:05.019792210 +0200
@@ -33,8 +33,8 @@ ps/stacktrace.o: ps/stacktrace.c @@ -33,8 +33,8 @@ ps/stacktrace.o: ps/stacktrace.c
@ -40,8 +40,8 @@
- $(install) --mode a=r $< $@ - $(install) --mode a=r $< $@
+ $(install) -m644 $< $@ + $(install) -m644 $< $@
-rm -f $(DESTDIR)/var/catman/cat1/ps.1.gz $(DESTDIR)/var/man/cat1/ps.1.gz -rm -f $(DESTDIR)/var/catman/cat1/ps.1.gz $(DESTDIR)/var/man/cat1/ps.1.gz
--- Makefile.orig 2009-05-10 20:50:48.000000000 +0200 --- a/Makefile.orig 2009-05-10 20:50:48.000000000 +0200
+++ Makefile 2010-10-28 04:09:31.000000000 +0200 +++ b/Makefile 2010-10-28 04:09:31.000000000 +0200
@@ -24,10 +24,10 @@ TARVERSION := $(VERSION).$(SUBVERSION) @@ -24,10 +24,10 @@ TARVERSION := $(VERSION).$(SUBVERSION)
############ vars ############ vars

View file

@ -0,0 +1,108 @@
Description: Several bugs fixed for the free manpage:
-g flag documented #286900
hypen escaped #282168
Reformated completely #534198
free -o better documented #526604
Bug-Debian: http://bugs.debian.org/286900
Bug-Debian: http://bugs.debian.org/282168
Bug-Debian: http://bugs.debian.org/534198
Bug-Debian: http://bugs.debian.org/526604
Author: <csmall@debian.org>
--- a/free.1
+++ b/free.1
@@ -1,47 +1,67 @@
.\" -*-Nroff-*-
.\" This page Copyright (C) 1993 Matt Welsh, mdw@sunsite.unc.edu.
.\" Freely distributable under the terms of the GPL
-.TH FREE 1 "20 Mar 1993 " "Cohesive Systems" "Linux User's Manual"
+.TH FREE 1 "5 Oct 2009 " "Cohesive Systems" "Linux User's Manual"
.SH NAME
free \- Display amount of free and used memory in the system
.SH SYNOPSIS
-.BR "free " [ "\-b" " | " "\-k" " | " "\-m" "] [" "\-o" "] [" "\-s"
-.I delay
-.RB "] [" "\-t" "] [" "\-V" ]
+.B free
+.RB [ \-b | \-k | \-m | \-g ]
+.RB [ \-c
+.IR count ]
+.RB [ \-l ]
+.RB [ \-o ]
+.RB [ \-t ]
+.RB [ \-s
+.IR delay ]
+.RB [ \-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.
The shared memory column should be ignored; it is obsolete.
-.SS Options
-The \fB-b\fP switch displays the amount of memory in bytes; the
-\fB-k\fP switch (set by default) displays it in kilobytes; the \fB-m\fP
-switch displays it in megabytes.
-.PP
-The \fB-t\fP switch displays a line containing the totals.
-.PP
-The \fB-o\fP switch disables the display of a "buffer adjusted" line.
-If the -o option is not specified, \fBfree\fP subtracts buffer memory
-from the used memory and adds it to the free memory reported.
-.PP
-The \fB-s\fP switch activates continuous polling \fIdelay\fP seconds apart. You
+.SS OPTIONS
+.TP
+\fB\-b\fR
+Display the amount of memory in bytes.
+.TP
+\fB\-c\fR \fIcount\fR
+Display the result \fIcount\fR times. Requires the \fB\-s\fR option.
+.TP
+\fB\-g\fR
+Display the amount of memory in gigabytes.
+.TP
+\fB\-k\fR
+Display the amount of memory in kilobytes. This is the default.
+.TP
+\fB\-l\fR
+Show detailed low and high memory statistics.
+.TP
+\fB\-m\fR
+Display the amount of memory in megabytes.
+.TP
+\fB\-o\fR
+Display the output in old format, the only difference being this option
+will disable the display of the "buffer adjusted" line.
+.TP
+\fB\-s\fR
+Continuously display the result \fIdelay\fP seconds apart. You
may actually specify any floating point number for \fIdelay\fP,
.BR usleep (3)
is used for microsecond resolution delay times.
-.PP
-The \fB\-V\fP displays version information.
+.TP
+\fB\-t\fR
+Display a line showing the column totals.
+.TP
+\fB\-V\fR
+Display version information.
.SH FILES
-.ta
-.IR /proc/meminfo "\-\- memory information"
+.nf
+/proc/meminfo memory information
.fi
-
-.SH "SEE ALSO"
-.BR ps (1),
-.BR slabtop (1),
-.BR vmstat (8),
-.BR top(1)
-
.SH AUTHORS
Written by Brian Edmonds.
Send bug reports to <albert@users.sf.net>
-
+.SH "SEE ALSO"
+.BR ps "(1), " slabtop "(1), " top "(1), " vmstat (8).
+.\"{{{}}}

View file

@ -0,0 +1,36 @@
Author: <csmall@debian.org>
Description: Rework version parsing so its ok with other OSes
Index: b/proc/version.c
===================================================================
--- a/proc/version.c 2009-11-24 20:53:02.000000000 +1100
+++ b/proc/version.c 2009-11-24 21:00:44.000000000 +1100
@@ -35,15 +35,23 @@
static void init_Linux_version(void) __attribute__((constructor));
static void init_Linux_version(void) {
- static struct utsname uts;
int x = 0, y = 0, z = 0; /* cleared in case sscanf() < 3 */
+ FILE *fp;
+ char buf[256];
- if (uname(&uts) == -1) /* failure implies impending death */
- exit(1);
- if (sscanf(uts.release, "%d.%d.%d", &x, &y, &z) < 3)
+ if ( (fp=fopen("/proc/version","r")) == NULL) /* failure implies impending death */
+ exit(1);
+ if (fgets(buf, 256, fp) == NULL) {
+ fprintf(stderr, "Cannot read kernel version from /proc/version\n");
+ fclose(fp);
+ exit(1);
+ }
+ fclose(fp);
+ if (sscanf(buf, "Linux version %d.%d.%d", &x, &y, &z) < 3)
fprintf(stderr, /* *very* unlikely to happen by accident */
"Non-standard uts for running kernel:\n"
- "release %s=%d.%d.%d gives version code %d\n",
- uts.release, x, y, z, LINUX_VERSION(x,y,z));
+ "release %s=%d.%d.%d gives version code %d\n",
+ buf,
+ x, y, z, LINUX_VERSION(x,y,z));
linux_version_code = LINUX_VERSION(x, y, z);
}

View file

@ -0,0 +1,147 @@
Author: Craig Small <csmall@debian.org>
Description: Fix kill.1 manual page
Changed may to cannot or might
Bug-Debian: http://bugs.debian.org/375739
Index: b/kill.1
===================================================================
--- a/kill.1 2009-11-24 20:53:04.000000000 +1100
+++ b/kill.1 2009-11-24 21:00:37.000000000 +1100
@@ -10,23 +10,18 @@
kill \- send a signal to a process
.SH SYNOPSIS
-.TS
-l l.
-kill pid ... Send SIGTERM to every process listed.
-kill -signal pid ... Send a signal to every process listed.
-kill -s signal pid ... Send a signal to every process listed.
-kill -l List all signal names.
-kill -L List all signal names in a nice table.
-kill -l signal Convert a signal number into a name.
-kill -V,--version Show version of program
-.TE
+\fBkill\fR [ \-\fBsignal\fR | \-s \fBsignal\fR ] \fBpid\fR ...
+.br
+\fBkill\fR [ \-L | -V, \-\-version ]
+.br
+\fBkill\fR \-l [ \fBsignal\fR ]
.SH DESCRIPTION
-The default signal for kill is TERM. Use -l or -L to list available signals.
+The default signal for kill is TERM. Use \-l or \-L to list available signals.
Particularly useful signals include HUP, INT, KILL, STOP, CONT, and 0.
-Alternate signals may be specified in three ways: -9 -SIGKILL -KILL.
+Alternate signals may be specified in three ways: \-9 \-SIGKILL \-KILL.
Negative PID values may be used to choose whole process groups; see the
-PGID column in ps command output. A PID of -1 is special; it indicates
+PGID column in ps command output. A PID of \-1 is special; it indicates
all processes except the kill process itself and init.
.SH SIGNALS
@@ -37,12 +32,11 @@
lB rB lB lB
lfCW r l l.
Name Num Action Description
-.TH
0 0 n/a exit code indicates if a signal may be sent
ALRM 14 exit
HUP 1 exit
INT 2 exit
-KILL 9 exit this signal may not be blocked
+KILL 9 exit cannot be blocked
PIPE 13 exit
POLL exit
PROF exit
@@ -50,15 +44,15 @@
USR1 exit
USR2 exit
VTALRM exit
-STKFLT exit may not be implemented
-PWR ignore may exit on some systems
+STKFLT exit might not be implemented
+PWR ignore might exit on some systems
WINCH ignore
CHLD ignore
URG ignore
-TSTP stop may interact with the shell
-TTIN stop may interact with the shell
-TTOU stop may interact with the shell
-STOP stop this signal may not be blocked
+TSTP stop might interact with the shell
+TTIN stop might interact with the shell
+TTOU stop might interact with the shell
+STOP stop cannot be blocked
CONT restart continue if stopped, otherwise ignore
ABRT 6 core
FPE 8 core
@@ -66,11 +60,11 @@
QUIT 3 core
SEGV 11 core
TRAP 5 core
-SYS core may not be implemented
-EMT core may not be implemented
-BUS core core dump may fail
-XCPU core core dump may fail
-XFSZ core core dump may fail
+SYS core might not be implemented
+EMT core might not be implemented
+BUS core core dump might fail
+XCPU core core dump might fail
+XFSZ core core dump might fail
.TE
.SH NOTES
@@ -79,36 +73,30 @@
the conflict.
.SH EXAMPLES
-
-.SS
-.B "kill -9 -1"
-.nf
+.TP
+.B kill \-9 \-1
Kill all processes you can kill.
-.fi
-.PP
-.SS
-.B "kill -l 11"
-.nf
+.TP
+.B kill \-l 11
Translate number 11 into a signal name.
-.fi
-.PP
-.SS
-.B "kill -L"
-.nf
+.TP
+.B kill -L
List the available signal choices in a nice table.
-.fi
-.PP
-.SS
-.B "kill 123 543 2341 3453"
-.nf
+.TP
+.B kill 123 543 2341 3453
Send the default signal, SIGTERM, to all those processes.
-.fi
-.PP
+
.SH "SEE ALSO"
-pkill(1) skill(1) kill(2) renice(1) nice(1) signal(7) killall(1)
+.BR pkill (1),
+.BR skill (1),
+.BR kill (2),
+.BR renice (1),
+.BR nice (1),
+.BR signal (7),
+.BR killall (1).
.SH STANDARDS
-This command meets appropriate standards. The -L flag is Linux-specific.
+This command meets appropriate standards. The \-L flag is Linux-specific.
.SH AUTHOR
Albert Cahalan <albert@users.sf.net> wrote kill in 1999 to replace a

View file

@ -0,0 +1,25 @@
Author: <csmall@debian.org>
Description: Add CR to warning line
Bug-Debian: http://bugs.debian.org/331419
Index: b/skill.c
===================================================================
--- a/skill.c 2009-11-24 21:00:31.000000000 +1100
+++ b/skill.c 2009-11-24 21:00:37.000000000 +1100
@@ -128,7 +128,7 @@
sprintf(buf, "/proc/%d/stat", pid); /* pid (cmd) state ppid pgrp session tty */
fd = open(buf,O_RDONLY);
if(fd==-1){ /* process exited maybe */
- if(pids && w_flag) printf("WARNING: process %d could not be found.",pid);
+ if(pids && w_flag) printf("WARNING: process %d could not be found.\n",pid);
return;
}
fstat(fd, &statbuf);
@@ -342,7 +342,7 @@
}else{
fprintf(stderr,
"Usage: snice [new priority] [options] process selection criteria\n"
- "Example: snice netscape crack +7\n"
+ "Example: snice +7 netscape crack \n"
"\n"
"The default priority is +4. (snice +4 ...)\n"
"Priority numbers range from +20 (slowest) to -20 (fastest).\n"

View file

@ -0,0 +1,15 @@
Author: Craig Small <csmall@debian.org>
Description: Added freeproc to library.map
Index: b/proc/library.map
===================================================================
--- a/proc/library.map 2009-11-24 20:53:03.000000000 +1100
+++ b/proc/library.map 2009-11-24 21:00:40.000000000 +1100
@@ -7,7 +7,7 @@
readproc; readtask; readproctab; readproctab2; look_up_our_self; escape_command;
escape_str; escape_strlist;
- openproc; closeproc;
+ openproc; closeproc; freeproc;
tty_to_dev; dev_to_tty; open_psdb_message; open_psdb; lookup_wchan;
display_version; procps_version; linux_version_code;
Hertz; smp_num_cpus; have_privs;

View file

@ -0,0 +1,13 @@
Author: <xaiki@gonzo>
Description: Make sure Makefile doesnt zot random files while checking GCC
--- a/Makefile
+++ b/Makefile
@@ -120,7 +120,7 @@
# Unlike the kernel one, this check_gcc goes all the way to
# producing an executable. There might be a -m64 that works
# until you go looking for a 64-bit curses library.
-check_gcc = $(shell if $(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) dummy.c $(ALL_LDFLAGS) $(1) -o /dev/null $(CURSES) $(CURSESW) > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
+check_gcc = $(shell if $(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) dummy.c $(ALL_LDFLAGS) $(1) -o will_this_file_really_exist.tmp $(CURSES) $(CURSESW) > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ; rm -f will_this_file_really_exist.tmp)
# Be 64-bit if at all possible. In a cross-compiling situation, one may
# do "make m64=-m32 lib64=lib" to produce 32-bit executables. DO NOT

View file

@ -0,0 +1,15 @@
Author: Craig Small <csmall@debian.org>
Description: Made SHARED variable overwritable
Index: b/proc/module.mk
===================================================================
--- a/proc/module.mk 2009-11-24 20:53:04.000000000 +1100
+++ b/proc/module.mk 2009-11-24 21:00:38.000000000 +1100
@@ -17,7 +17,7 @@
# numbers for future use, the ELF soname can be set equal to the
# file name until some future date when a stable ABI is declared.
-SHARED := 1
+SHARED ?= 1
# for lib$(NAME).so and /usr/include/($NAME) and such
NAME := proc

View file

@ -0,0 +1,93 @@
Description: More ps time sorting
Author: Alfredo Esteban <aedelatorre@gmail.com>
Bug-Debian: http://bugs.debian.org/508435
Author: <csmall@debian.org>
Index: b/ps/output.c
===================================================================
--- a/ps/output.c 2009-11-24 20:53:06.000000000 +1100
+++ b/ps/output.c 2009-11-24 21:00:30.000000000 +1100
@@ -110,6 +110,20 @@
return (int)(P->NAME) - (int)(Q->NAME); \
}
+#define cook_time(P) (P->utime + P->stime) / Hertz
+
+#define cook_etime(P) seconds_since_boot - (unsigned long)(P->start_time / Hertz)
+
+#define CMP_COOKED_TIME(NAME) \
+static int sr_ ## NAME (const proc_t* P, const proc_t* Q) { \
+ unsigned long p_time,q_time; \
+ p_time=cook_ ##NAME (P); \
+ q_time=cook_ ##NAME (Q); \
+ if (p_time < q_time) return -1; \
+ if (p_time > q_time) return 1; \
+ return 0; \
+}
+
CMP_INT(rtprio)
CMP_SMALL(sched)
CMP_INT(cutime)
@@ -185,6 +199,9 @@
CMP_SMALL(state)
+CMP_COOKED_TIME(time)
+CMP_COOKED_TIME(etime)
+
/* approximation to: kB of address space that could end up in swap */
static int sr_swapable(const proc_t* P, const proc_t* Q) {
unsigned long p_swapable = P->vm_data + P->vm_stack;
@@ -408,7 +425,7 @@
unsigned long t;
unsigned dd,hh,mm,ss;
char *cp = outbuf;
- t = seconds_since_boot - (unsigned long)(pp->start_time / Hertz);
+ t = cook_etime(pp);
ss = t%60;
t /= 60;
mm = t%60;
@@ -476,7 +493,7 @@
unsigned long t;
unsigned dd,hh,mm,ss;
int c;
- t = (pp->utime + pp->stime) / Hertz;
+ t = cook_time(pp);
ss = t%60;
t /= 60;
mm = t%60;
@@ -1286,7 +1303,7 @@
{"alarm", "ALARM", pr_alarm, sr_alarm, 5, 0, LNX, AN|RIGHT},
{"argc", "ARGC", pr_nop, sr_nop, 4, 0, LNX, PO|RIGHT},
{"args", "COMMAND", pr_args, sr_cmd, 27, ARG, U98, PO|UNLIMITED}, /*command*/
-{"atime", "TIME", pr_time, sr_nop, 8, 0, SOE, ET|RIGHT}, /*cputime*/ /* was 6 wide */
+{"atime", "TIME", pr_time, sr_time, 8, 0, SOE, ET|RIGHT}, /*cputime*/ /* was 6 wide */
{"blocked", "BLOCKED", pr_sigmask, sr_nop, 9, 0, BSD, TO|SIGNAL}, /*sigmask*/
{"bnd", "BND", pr_nop, sr_nop, 1, 0, AIX, TO|RIGHT},
{"bsdstart", "START", pr_bsdstart, sr_nop, 6, 0, LNX, ET|RIGHT},
@@ -1305,7 +1322,7 @@
{"cp", "CP", pr_cp, sr_pcpu, 3, 0, DEC, ET|RIGHT}, /*cpu*/
{"cpu", "CPU", pr_nop, sr_nop, 3, 0, BSD, AN|RIGHT}, /* FIXME ... HP-UX wants this as the CPU number for SMP? */
{"cpuid", "CPUID", pr_psr, sr_nop, 5, 0, BSD, TO|RIGHT}, // OpenBSD: 8 wide!
-{"cputime", "TIME", pr_time, sr_nop, 8, 0, DEC, ET|RIGHT}, /*time*/
+{"cputime", "TIME", pr_time, sr_time, 8, 0, DEC, ET|RIGHT}, /*time*/
{"cstime", "-", pr_nop, sr_cstime, 1, 0, LNX, AN|RIGHT},
{"ctid", "CTID", pr_nop, sr_nop, 5, 0, SUN, ET|RIGHT}, // resource contracts?
{"cursig", "CURSIG", pr_nop, sr_nop, 6, 0, DEC, AN|RIGHT},
@@ -1320,7 +1337,7 @@
{"end_code", "E_CODE", pr_nop, sr_end_code, 8, 0, LNx, PO|RIGHT},
{"environ","ENVIRONMENT",pr_nop, sr_nop, 11, ENV, LNx, PO|UNLIMITED},
{"esp", "ESP", pr_esp, sr_kstk_esp, 8, 0, LNX, TO|RIGHT},
-{"etime", "ELAPSED", pr_etime, sr_nop, 11, 0, U98, ET|RIGHT}, /* was 7 wide */
+{"etime", "ELAPSED", pr_etime, sr_etime, 11, 0, U98, ET|RIGHT}, /* was 7 wide */
{"euid", "EUID", pr_euid, sr_euid, 5, 0, LNX, ET|RIGHT},
{"euser", "EUSER", pr_euser, sr_euser, 8, USR, LNX, ET|USER},
{"f", "F", pr_flag, sr_flags, 1, 0, XXX, ET|RIGHT}, /*flags*/
@@ -1463,7 +1480,7 @@
{"tdev", "TDEV", pr_nop, sr_nop, 4, 0, XXX, AN|RIGHT},
{"thcount", "THCNT", pr_nlwp, sr_nlwp, 5, 0, AIX, PO|RIGHT},
{"tid", "TID", pr_thread, sr_tid, 5, 0, AIX, TO|PIDMAX|RIGHT},
-{"time", "TIME", pr_time, sr_nop, 8, 0, U98, ET|RIGHT}, /*cputime*/ /* was 6 wide */
+{"time", "TIME", pr_time, sr_time, 8, 0, U98, ET|RIGHT}, /*cputime*/ /* was 6 wide */
{"timeout", "TMOUT", pr_nop, sr_nop, 5, 0, LNX, AN|RIGHT}, // 2.0.xx era
{"tmout", "TMOUT", pr_nop, sr_nop, 5, 0, LNX, AN|RIGHT}, // 2.0.xx era
{"tname", "TTY", pr_tty8, sr_tty, 8, 0, DEC, PO|LEFT},

View file

@ -0,0 +1,76 @@
Author: Madhusudan.C.S <madhusudancs@gmail.com>
Description: Uses alloc instead of fixed PATH_MAX value
Bug-Debian: http://bugs.debian.org/496274
Index: b/proc/readproc.c
===================================================================
--- a/proc/readproc.c 2009-11-24 21:00:41.000000000 +1100
+++ b/proc/readproc.c 2009-11-24 21:00:44.000000000 +1100
@@ -1036,7 +1036,7 @@
* and filled out proc_t structure.
*/
proc_t * get_proc_stats(pid_t pid, proc_t *p) {
- static char path[PATH_MAX], sbuf[1024];
+ static char path[32], sbuf[1024];
struct stat statbuf;
sprintf(path, "/proc/%d", pid);
Index: b/pwdx.c
===================================================================
--- a/pwdx.c 2009-11-24 20:53:02.000000000 +1100
+++ b/pwdx.c 2009-11-24 21:00:44.000000000 +1100
@@ -35,7 +35,6 @@
int main(int argc, char* argv[])
{
- char buf[PATH_MAX+1];
regex_t re;
int i;
@@ -59,6 +58,7 @@
for (i = 1; i < argc; i++) {
if (regexec(&re, argv[i], 0, NULL, 0) != 0) {
+ char buf[27 + strlen (argv[i]) + 1]; // Constant 27 is the length of the error string "pwdx: ... "
snprintf(buf, sizeof buf, "pwdx: invalid process id: %s\n", argv[i]);
die(buf);
}
@@ -68,9 +68,13 @@
regfree(&re);
+ int alloclen = 128;
+ char *pathbuf = malloc(alloclen);
+
for (i = 1; i < argc; i++) {
- char * s = buf;
+ char * s;
int len;
+ char buf[10 + strlen(argv[i]) + 1]; // Constant 10 is the length of strings "/proc/" + "/cwd" + 1
// At this point, all arguments are in the form /proc/nnnn
// or nnnn, so a simple check based on the first char is
@@ -82,14 +86,22 @@
// buf contains /proc/nnnn/cwd symlink name on entry, the
// target of that symlink on return
- if ((len = readlink(buf, buf, PATH_MAX)) < 0) {
+ while ((len = readlink(buf, pathbuf, alloclen)) == alloclen) {
+ alloclen *= 2;
+ pathbuf = realloc(pathbuf, alloclen);
+ }
+
+ if (len < 0) {
s = strerror(errno == ENOENT ? ESRCH : errno);
} else {
- buf[len] = 0;
+ pathbuf[len] = 0;
+ s = pathbuf;
}
printf("%s: %s\n", argv[i], s);
}
+ free(pathbuf);
+
return 0;
}

View file

@ -0,0 +1,208 @@
Author: <csmall@debian.org>
Description: Cleanup pgrep manual page #282168
Uses .BR for see also section #437678
Index: b/pgrep.1
===================================================================
--- a/pgrep.1 2009-11-24 21:00:45.000000000 +1100
+++ b/pgrep.1 2009-11-24 21:00:47.000000000 +1100
@@ -2,35 +2,39 @@
.\" Licensed under version 2 of the GNU General Public License.
.\" Copyright 2000 Kjetil Torgrim Homme
.\"
-.TH PGREP 1 "June 25, 2000" "Linux" "Linux User's Manual"
+.TH PGREP 1 "October 5, 2007" "Linux" "Linux User's Manual"
.SH NAME
pgrep, pkill \- look up or signal processes based on name and other attributes
.SH SYNOPSIS
-pgrep [\-cflvx] [\-d \fIdelimiter\fP] [\-n|\-o] [\-P \fIppid\fP,...] [\-g \fIpgrp\fP,...]
-.br
- [\-s \fIsid\fP,...] [\-u \fIeuid\fP,...] [\-U \fIuid\fP,...] [\-G \fIgid\fP,...]
-.br
- [\-t \fIterm\fP,...] [\fIpattern\fP]
-
-pkill [\-\fIsignal\fP] [\-fvx] [\-n|\-o] [\-P \fIppid\fP,...] [\-g \fIpgrp\fP,...]
-.br
- [\-s \fIsid\fP,...] [\-u \fIeuid\fP,...] [\-U \fIuid\fP,...] [\-G \fIgid\fP,...]
-.br
- [\-t \fIterm\fP,...] [\fIpattern\fP]
+.na
+\fBpgrep\fR [\fB\-cflvx\fR] [\fB\-d\ \fIdelimiter\fR] [\fB\-n\fR|\fB\-o\fR] \
+[\fB\-P\ \fIppid\fR,...] [\fB\-g\ \fIpgrp\fR,...] [\fB\-s\ \fIsid\fR,...] \
+[\fB\-u\ \fIeuid\fR,...] [\fB\-U\ \fIuid\fR,...] [\fB\-G\ \fIgid\fR,...] \
+[\fB\-t\ \fIterm\fR,...] [\fIpattern\fR]
+
+.HP
+\fBpkill\fR [\fB\-\fIsignal\fR] [\fB\-fvx\fR] [\fB\-n\fR|\fB\-o\fR] \
+[\fB\-P\ \fIppid\fR,...] [\fB\-g\ \fIpgrp\fR,...] [\fB\-s\ \fIsid\fR,...] \
+[\fB\-u\ \fIeuid\fR,...] [\fB\-U\ \fIuid\fR,...] [\fB\-G\ \fIgid\fR,...] \
+[\fB\-t\ \fIterm\fR,...] [\fIpattern\fR]
.SH DESCRIPTION
\fBpgrep\fP looks through the currently running processes and lists the
process IDs which matches the selection criteria to stdout. All
the criteria have to match. For example,
-pgrep -u root sshd
+.IP
+$ pgrep \-u root sshd
+.PP
will only list the processes called \fBsshd\fP AND owned by \fBroot\fP.
On the other hand,
-pgrep -u root,daemon
+.IP
+$ pgrep \-u root,daemon
+.PP
will list the processes owned by \fBroot\fP OR \fBdaemon\fP.
\fBpkill\fP will send the specified signal (by default \fBSIGTERM\fP)
@@ -38,18 +42,18 @@
.SH OPTIONS
.TP
-\-c
+\fB\-c\fR
Suppress normal output; instead print a count of matching processes.
.TP
-\-d \fIdelimiter\fP
+\fB\-d \fIdelimiter\fP
Sets the string used to delimit each process ID in the output (by
default a newline). (\fBpgrep\fP only.)
.TP
-\-f
+\fB\-f\fR
The \fIpattern\fP is normally only matched against the process name.
-When \-f is set, the full command line is used.
+When \fB\-f\fR is set, the full command line is used.
.TP
-\-g \fIpgrp\fP,...
+\fB\-g \fIpgrp\fP,...
Only match processes in the process group IDs listed. Process group 0
is translated into \fBpgrep\fP's or \fBpkill\fP's own process group.
.TP
@@ -57,40 +61,40 @@
Only match processes whose real group ID is listed. Either the
numerical or symbolical value may be used.
.TP
-\-l
+\fB\-l\fR
List the process name as well as the process ID. (\fBpgrep\fP only.)
.TP
-\-n
+\fB\-n\fR
Select only the newest (most recently started) of the matching
processes.
.TP
-\-o
+\fB\-o\fR
Select only the oldest (least recently started) of the matching
processes.
.TP
-\-P \fIppid\fP,...
+\fB\-P \fIppid\fP,...
Only match processes whose parent process ID is listed.
.TP
-\-s \fIsid\fP,...
+\fB\-s \fIsid\fP,...
Only match processes whose process session ID is listed. Session ID 0
is translated into \fBpgrep\fP's or \fBpkill\fP's own session ID.
.TP
-\-t \fIterm\fP,...
+\fB\-t \fIterm\fP,...
Only match processes whose controlling terminal is listed. The
terminal name should be specified without the "/dev/" prefix.
.TP
-\-u \fIeuid\fP,...
+\fB\-u \fIeuid\fP,...
Only match processes whose effective user ID is listed. Either the
numerical or symbolical value may be used.
.TP
-\-U \fIuid\fP,...
+\fB\-U \fIuid\fP,...
Only match processes whose real user ID is listed. Either the
numerical or symbolical value may be used.
.TP
-\-v
+\fB\-v\fR
Negates the matching.
.TP
-\-x
+\fB\-x\fR
Only match processes whose name (or command line if \-f is specified)
\fBexactly\fP match the \fIpattern\fP.
.TP
@@ -107,32 +111,40 @@
.SH EXAMPLES
Example 1: Find the process ID of the \fBnamed\fP daemon:
-unix$ pgrep \-u root named
+.IP
+$ pgrep \-u root named
+.PP
Example 2: Make \fBsyslog\fP reread its configuration file:
-unix$ pkill \-HUP syslogd
+.IP
+$ pkill \-HUP syslogd
+.PP
Example 3: Give detailed information on all \fBxterm\fP processes:
-unix$ ps \-fp $(pgrep \-d, \-x xterm)
+.IP
+$ ps \-fp $(pgrep \-d, \-x xterm)
+.PP
Example 4: Make all \fBnetscape\fP processes run nicer:
-unix$ renice +4 `pgrep netscape`
+.IP
+$ renice +4 `pgrep netscape`
.SH "EXIT STATUS"
+.PD 0
.TP
-.I "0"
+.I 0
One or more processes matched the criteria.
.TP
-.I "1"
+.I 1
No processes matched.
.TP
-.I "2"
+.I 2
Syntax error in the command line.
.TP
-.I "3"
+.I 3
Fatal error: out of memory etc.
.SH NOTES
@@ -144,13 +156,19 @@
itself as a match.
.SH BUGS
-The options \-n and \-o and \-v can not be combined. Let me know if
-you need to do this.
+The options \fB\-n\fP and \fB\-o\fP and \fB\-v\fP can not be combined.
+Let me know if you need to do this.
Defunct processes are reported.
.SH "SEE ALSO"
-ps(1) regex(7) signal(7) killall(1) skill(1) kill(1) kill(2)
+.BR ps (1),
+.BR regex (7),
+.BR signal (7),
+.BR killall (1),
+.BR skill (1),
+.BR kill (1),
+.BR kill (2)
.SH STANDARDS
\fBpkill\fP and \fBpgrep\fP were introduced in Sun's Solaris 7. This

View file

@ -0,0 +1,85 @@
Description: c option for pgrep for counting number of matched proceesses
Author: Craig Small <csmall@debian.org>
Bug-Debian: http://bugs.debian.org/375791
Index: b/pgrep.1
===================================================================
--- a/pgrep.1 2009-11-24 20:53:02.000000000 +1100
+++ b/pgrep.1 2009-11-24 21:00:45.000000000 +1100
@@ -7,7 +7,7 @@
pgrep, pkill \- look up or signal processes based on name and other attributes
.SH SYNOPSIS
-pgrep [\-flvx] [\-d \fIdelimiter\fP] [\-n|\-o] [\-P \fIppid\fP,...] [\-g \fIpgrp\fP,...]
+pgrep [\-cflvx] [\-d \fIdelimiter\fP] [\-n|\-o] [\-P \fIppid\fP,...] [\-g \fIpgrp\fP,...]
.br
[\-s \fIsid\fP,...] [\-u \fIeuid\fP,...] [\-U \fIuid\fP,...] [\-G \fIgid\fP,...]
.br
@@ -38,6 +38,9 @@
.SH OPTIONS
.TP
+\-c
+Suppress normal output; instead print a count of matching processes.
+.TP
\-d \fIdelimiter\fP
Sets the string used to delimit each process ID in the output (by
default a newline). (\fBpgrep\fP only.)
Index: b/pgrep.c
===================================================================
--- a/pgrep.c 2009-11-24 21:00:41.000000000 +1100
+++ b/pgrep.c 2009-11-24 21:00:45.000000000 +1100
@@ -54,6 +54,7 @@
static int opt_newest = 0;
static int opt_negate = 0;
static int opt_exact = 0;
+static int opt_count = 0;
static int opt_signal = SIGTERM;
static int opt_lock = 0;
static int opt_case = 0;
@@ -79,7 +80,7 @@
if (i_am_pkill)
fprintf (fp, "Usage: pkill [-SIGNAL] [-fvx] ");
else
- fprintf (fp, "Usage: pgrep [-flvx] [-d DELIM] ");
+ fprintf (fp, "Usage: pgrep [-cflvx] [-d DELIM] ");
fprintf (fp, "[-n|-o] [-P PPIDLIST] [-g PGRPLIST] [-s SIDLIST]\n"
"\t[-u EUIDLIST] [-U UIDLIST] [-G GIDLIST] [-t TERMLIST] "
"[PATTERN]\n");
@@ -565,7 +566,7 @@
strcat (opts, "ld:");
}
- strcat (opts, "LF:fnovxP:g:s:u:U:G:t:?V");
+ strcat (opts, "LF:cfnovxP:g:s:u:U:G:t:?V");
while ((opt = getopt (argc, argv, opts)) != -1) {
switch (opt) {
@@ -613,6 +614,9 @@
exit(EXIT_SUCCESS);
// case 'c': // Solaris: match by contract ID
// break;
+ case 'c':
+ opt_count = 1;
+ break;
case 'd': // Solaris: change the delimiter
opt_delim = strdup (optarg);
break;
@@ -724,10 +728,14 @@
procs[i].num, strerror (errno));
}
} else {
- if (opt_long)
- output_strlist(procs,num);
- else
- output_numlist(procs,num);
+ if (opt_count) {
+ fprintf(stdout, "%ld\n", num);
+ } else {
+ if (opt_long)
+ output_strlist (procs,num);
+ else
+ output_numlist (procs,num);
+ }
}
return !num; // exit(EXIT_SUCCESS) if match, otherwise exit(EXIT_FAILURE)
}

View file

@ -0,0 +1,16 @@
Author: Craig Small <csmall@debian.org>
Description: pgrep.c saved_start_time was missed
Index: b/pgrep.c
===================================================================
--- a/pgrep.c 2009-11-24 20:53:03.000000000 +1100
+++ b/pgrep.c 2009-11-24 21:00:41.000000000 +1100
@@ -430,7 +430,8 @@
preg = do_regcomp();
if (opt_newest) saved_start_time = 0ULL;
- if (opt_oldest) saved_start_time = ~0ULL;
+ else
+ saved_start_time = ~0ULL;
if (opt_newest) saved_pid = 0;
if (opt_oldest) saved_pid = INT_MAX;

View file

@ -0,0 +1,15 @@
Author: <hesso@pool.math.tu-berlin.de>
Description: Distinguish between invalid commandline parameters and '-?'.
Index: b/pgrep.c
===================================================================
--- a/pgrep.c 2009-11-24 21:00:45.000000000 +1100
+++ b/pgrep.c 2009-11-24 21:00:49.000000000 +1100
@@ -681,7 +681,7 @@
// case 'z': // Solaris: match by zone ID
// break;
case '?':
- usage (opt);
+ usage (optopt?optopt:opt);
break;
}
}

View file

@ -0,0 +1,48 @@
Description: Cleanup pmap.1 manual page
Author: Brendan O'Dea <bod@debian.org>
Bug-Debian: http://bugs.debian.org/282168
Reviewed-by: Craig Small <csmall@debian.org>
Index: b/pmap.1
===================================================================
--- a/pmap.1 2009-11-24 20:53:06.000000000 +1100
+++ b/pmap.1 2009-11-24 21:00:30.000000000 +1100
@@ -10,25 +10,29 @@
pmap \- report memory map of a process
.SH SYNOPSIS
-.nf
-pmap [ -x | -d ] [ -q ] pids...
-pmap -V
-.fi
+.B pmap
+.RB [ \-x | \-d ]
+.RB [ \-q ]
+.I pid
+\& ...
+.br
+.B pmap \-V
.SH DESCRIPTION
The pmap command reports the memory map of a process or processes.
.SH "GENERAL OPTIONS"
.TS
-l l l.
--x extended Show the extended format.
--d device Show the device format.
--q quiet Do not display some header/footer lines.
--V show version Displays version of program.
+lB l l.
+\-x extended Show the extended format.
+\-d device Show the device format.
+\-q quiet Do not display some header/footer lines.
+\-V show version Displays version of program.
.TE
.SH "SEE ALSO"
-ps(1) pgrep(1)
+.BR ps(1),
+.BR pgrep(1)
.SH STANDARDS
No standards apply, but pmap looks an awful lot like a SunOS command.

View file

@ -0,0 +1,141 @@
Description: provides information for pmap -x option
Similiar idea to pmap written by Robert Love
Bug-Debian: http://bugs.debian.org/347476
Bug-Debian: http://bugs.debian.org/505571
Author: Craig Small <csmall@debian.org>
--- a/pmap.c
+++ b/pmap.c
@@ -126,24 +126,37 @@
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;
+
// 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 +164,54 @@
}
}
- 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, diff=0;
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 +241,9 @@
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 +280,12 @@
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");

View file

@ -0,0 +1,37 @@
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>
--- 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) {
int x = 0, y = 0, z = 0; /* cleared in case sscanf() < 3 */
FILE *fp;
char buf[256];
--- 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 */

View file

@ -1,22 +0,0 @@
Ripped from Fedora
If /proc isnt mounted, `top` will cause screen corruption ...
--- top.c~
+++ top.c
@@ -3201,12 +3201,15 @@
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
// +-------------+

View file

@ -1,16 +0,0 @@
X-Gentoo-Bug: 279819
Upstream-Patch: http://procps.cvs.sourceforge.net/viewvc/procps/procps/top.c?r1=1.132&r2=1.134
--- top.c~ 2008/03/24 04:41:26 1.132
+++ top.c 2009/12/10 11:37:48 1.134
@@ -2190,7 +2190,10 @@
// Value a window's name and make the associated group name.
static void win_names (WIN_t *q, const char *name)
{
- sprintf(q->rc.winname, "%.*s", WINNAMSIZ -1, name);
+ // Note that src==dst is illegal in sprintf.
+ // Failure: amd64, glibc 2.9-20081201, gcc 4.3.4
+ if(q->rc.winname != name)
+ sprintf(q->rc.winname, "%.*s", WINNAMSIZ -1, name);
sprintf(q->grpname, "%d:%.*s", q->winnum, WINNAMSIZ -1, name);
}

View file

@ -0,0 +1,30 @@
Description: Documenting maj_flt and min_flt output specifiers in ps.1
Bug-Debian: http://bugs.debian.org/434221
Author: Craig Small <csmall@debian.org>
Last-Update: 2010-02-25
--- a/ps/ps.1
+++ b/ps/ps.1
@@ -4,7 +4,7 @@
.\" Quick hack conversion by Albert Cahalan, 1998.
.\" Licensed under version 2 of the Gnu General Public License.
.\"
-.TH PS 1 "July 28, 2004" "Linux" "Linux User's Manual"
+.TH PS 1 "February 25, 2010" "Linux" "Linux User's Manual"
.\"
.\" To render this page:
.\" groff -t -b -man -X -P-resolution -P100 -Tps ps.1 &
@@ -1084,6 +1084,14 @@
(alias\ \fBspid\fR,\ \fBtid\fR).
T}
+maj_flt MAJFLT T{
+The number of major page faults that have occured with this process.
+T}
+
+min_flt MINFLT T{
+The number of minor page faults that have occured with this process.
+T}
+
ni NI T{
nice value. This ranges from 19 (nicest) to \-20 (not\ nice to\ others),
see\ \fInice\fR(1). (alias\ \fBnice\fR).

View file

@ -0,0 +1,548 @@
Author: Jari Aalto <jari.aalto@cante.net>
Description: Re-sort ps.1 options
Bug-Debian: http://bugs.debian.org/518620
Reviewed-by: Craig Small <csmall@debian.org>
Index: b/ps/ps.1
===================================================================
--- a/ps/ps.1 2009-11-24 21:00:48.000000000 +1100
+++ b/ps/ps.1 2009-11-24 21:00:49.000000000 +1100
@@ -158,20 +158,6 @@
.PP
.\" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.SH "SIMPLE PROCESS SELECTION"
-.opt \-A
-Select all processes. Identical to \fB\-e\fR.
-
-.opt \-N
-Select all processes except those that fulfill the specified conditions.
-(negates the selection) Identical to \fB\-\-deselect\fR.
-
-.opt T
-Select all processes associated with this terminal. Identical to the
-\fBt\fR option without any argument.
-
-.opt \-a
-Select all processes except both session leaders (see \fIgetsid\fR(2)) and
-processes not associated with a terminal.
.opt a
Lift the BSD\-style "only yourself" restriction, which is imposed upon
@@ -183,9 +169,20 @@
list all processes with a terminal (tty),
or to list all processes when used together with the \fBx\fR option.
+.opt \-A
+Select all processes. Identical to \fB\-e\fR.
+
+.opt \-a
+Select all processes except both session leaders (see \fIgetsid\fR(2)) and
+processes not associated with a terminal.
+
.opt \-d
Select all processes except session leaders.
+.opt \-\-deselect
+Select all processes except those that fulfill the specified conditions.
+(negates the selection) Identical to \fB\-N\fR.
+
.opt \-e
Select all processes. Identical to \fB\-A\fR.
@@ -194,11 +191,20 @@
.\" add in the group leaders -- at least according to the SunOS 4
.\" man page on the FreeBSD site. Uh oh. I think I had tested SunOS
.\" though, so maybe the code is correct.
+
.opt g
Really all, even session leaders. This flag is obsolete and may be
discontinued in a future release. It is normally implied by the \fBa\fR flag,
and is only useful when operating in the sunos4 personality.
+.opt \-N
+Select all processes except those that fulfill the specified conditions.
+(negates the selection) Identical to \fB\-\-deselect\fR.
+
+.opt T
+Select all processes associated with this terminal. Identical to the
+\fBt\fR option without any argument.
+
.opt r
Restrict the selection to only running processes.
@@ -212,10 +218,6 @@
list all processes owned by you (same EUID as \fBps\fR),
or to list all processes when used together with the \fBa\fR option.
-.opt \-\-deselect
-Select all processes except those that fulfill the specified conditions.
-(negates the selection) Identical to \fB\-N\fR.
-
.\" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.PD
.PP
@@ -224,6 +226,13 @@
or comma\-separated list. They can be used multiple times.
For\ example:\ \fBps\ \-p\ "1\ 2"\ \-p\ 3,4\fR
.P
+
+.opt \-\fI123\fR
+Identical to \fB\-\-sid\ \fI123\fR.
+
+.opt \fI123\fR
+Identical to \fB\-\-pid\ \fI123\fR.
+
.opt \-C \ cmdlist
Select by command name.
.br
@@ -237,24 +246,6 @@
\fIgrplist\fR list. The real group ID identifies the group of the user
who created the process, see \fIgetgid\fR(2).
-.opt U \ userlist
-Select by effective user ID (EUID) or name.
-.br
-This selects the processes whose effective user name
-or ID is in \fIuserlist\fR.
-The effective user\ ID describes the user whose file
-access permissions are used by the process
-(see\ \fIgeteuid\fR(2)).
-Identical to \fB\-u\fR and\ \fB\-\-user\fR.
-
-.opt \-U \ userlist
-select by real user ID (RUID) or name.
-.br
-It selects the processes whose real user name or ID is in the
-\fIuserlist\fR list.
-The real user ID identifies the user who created the process,
-see\ \fIgetuid\fR(2).
-
.opt \-g \ grplist
Select by session OR by effective group name.
.br
@@ -266,6 +257,17 @@
Group ID numbers will work only when some group names are also specified.
See the \fB\-s\fR and \fB\-\-group\fR options.
+.opt \-\-Group \ grplist
+Select by real group ID (RGID) or name. Identical to \fB\-G\fR.
+
+.opt \-\-group \ grplist
+Select by effective group ID (EGID) or name.
+.br
+This selects the processes whose effective group name or ID is in
+\fIgrouplist\fR. The effective group ID describes the group whose file
+access permissions are used by the process (see\ \fIgeteuid\fR(2)).
+The \fB\-g\fR option is often an alternative to\ \fB\-\-group\fR.
+
.opt p \ pidlist
Select by process ID. Identical to \fB\-p\fR and\ \fB\-\-pid\fR.
@@ -275,12 +277,25 @@
This selects the processes whose process ID numbers appear in
\fIpidlist\fR. Identical to \fBp\fR and\ \fB\-\-pid\fR.
+.opt \-\-pid \ pidlist
+Select by process\ ID. Identical to \fB\-p\fR\ and\ \fBp\fR.
+
+.opt \-\-ppid \ pidlist
+Select by parent process\ ID.
+This selects the processes
+with a parent\ process\ ID in \fRpidlist\fR.
+That\ is, it selects processes that are children
+of those listed in \fRpidlist\fR.
+
.opt \-s \ sesslist
Select by session ID.
.br
This selects the processes
with a session ID specified in\ \fIsesslist\fR.
+.opt \-\-sid \ sesslist
+Select by session\ ID. Identical to\ \fB\-s\fR.
+
.opt t \ ttylist
Select by tty. Nearly identical to \fB\-t\fR and \fB\-\-tty\fR,
but can also be used with an empty \fIttylist\fR to indicate
@@ -297,6 +312,27 @@
forms: /dev/ttyS1, ttyS1, S1.
A\ plain "\-" may be used to select processes not attached to any terminal.
+.opt \-\-tty \ ttylist
+Select by terminal. Identical to \fB\-t\fR and\ \fBt\fR.
+
+.opt U \ userlist
+Select by effective user ID (EUID) or name.
+.br
+This selects the processes whose effective user name
+or ID is in \fIuserlist\fR.
+The effective user\ ID describes the user whose file
+access permissions are used by the process
+(see\ \fIgeteuid\fR(2)).
+Identical to \fB\-u\fR and\ \fB\-\-user\fR.
+
+.opt \-U \ userlist
+select by real user ID (RUID) or name.
+.br
+It selects the processes whose real user name or ID is in the
+\fIuserlist\fR list.
+The real user ID identifies the user who created the process,
+see\ \fIgetuid\fR(2).
+
.opt \-u \ userlist
Select by effective user ID (EUID) or name.
.br
@@ -305,46 +341,13 @@
access permissions are used by the process (see\ \fIgeteuid\fR(2)).
Identical to \fBU\fR and \fB\-\-user\fR.
-.opt \-\-Group \ grplist
-Select by real group ID (RGID) or name. Identical to \fB\-G\fR.
-
.opt \-\-User \ userlist
Select by real user ID (RUID) or name. Identical to \fB\-U\fR.
-.opt \-\-group \ grplist
-Select by effective group ID (EGID) or name.
-.br
-This selects the processes whose effective group name or ID is in
-\fIgrouplist\fR. The effective group ID describes the group whose file
-access permissions are used by the process (see\ \fIgeteuid\fR(2)).
-The \fB\-g\fR option is often an alternative to\ \fB\-\-group\fR.
-
-.opt \-\-pid \ pidlist
-Select by process\ ID. Identical to \fB\-p\fR\ and\ \fBp\fR.
-
-.opt \-\-ppid \ pidlist
-Select by parent process\ ID.
-This selects the processes
-with a parent\ process\ ID in \fRpidlist\fR.
-That\ is, it selects processes that are children
-of those listed in \fRpidlist\fR.
-
-.opt \-\-sid \ sesslist
-Select by session\ ID. Identical to\ \fB\-s\fR.
-
-.opt \-\-tty \ ttylist
-Select by terminal. Identical to \fB\-t\fR and\ \fBt\fR.
-
.opt \-\-user \ userlist
Select by effective user ID (EUID) or name.
Identical to \fB\-u\fR and\ \fBU\fR.
-.opt \-\fI123\fR
-Identical to \fB\-\-sid\ \fI123\fR.
-
-.opt \fI123\fR
-Identical to \fB\-\-pid\ \fI123\fR.
-
.\" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.PD
.PP
@@ -353,38 +356,12 @@
The output may differ by personality.
.PP
-.opt \-F
-extra full format. See the \fB\-f\fR option, which \fB\-F\fR implies.
-
-.opt \-O \ format
-is like \fB\-o\fR, but preloaded with some default columns.
-Identical to \fB\-o\ pid,\fIformat\fB,state,tname,time,command\fR
-or \fB\-o\ pid,\fIformat\fB,tname,time,cmd\fR, see\ \fB\-o\fR\ below.
-
-.opt O \ format
-is preloaded \fBo\fR (overloaded).
-.br
-The BSD \fBO\fR option can act like \fB\-O\fR (user\-defined output
-format with some common fields predefined) or can be used to specify
-sort order. Heuristics are used to determine the behavior of this
-option. To ensure that the desired behavior is obtained (sorting or
-formatting), specify the option in some other way
-(e.g. with \fB\-O\fR or \fB\-\-sort\fR).
-When used as a formatting option, it is identical to \fB\-O\fR, with the
-BSD\ personality.
-
-.opt \-M
-Add a column of security data. Identical to \fBZ\fR. (for\ SE\ Linux)
-
-.opt X
-Register format.
-
-.opt Z
-Add a column of security data. Identical to \fB\-M\fR. (for\ SE\ Linux)
-
.opt \-c
Show different scheduler information for the \fB\-l\fR option.
+.opt \-\-context
+Display security context format. (for\ SE\ Linux)
+
.opt \-f
does full\-format listing. This option can be combined with many
other UNIX\-style options to add additional columns. It also causes
@@ -393,6 +370,12 @@
See the \fBc\fR option, the format keyword \fBargs\fR, and the
format keyword \fBcomm\fR.
+.opt \-F
+extra full format. See the \fB\-f\fR option, which \fB\-F\fR implies.
+
+.opt \-\-format \ format
+user\-defined format. Identical to \fB\-o\fR and \fBo\fR.
+
.opt j
BSD job control format.
@@ -405,6 +388,26 @@
.opt \-l
long format. The \fB\-y\fR option is often useful with this.
+.opt \-M
+Add a column of security data. Identical to \fBZ\fR. (for\ SE\ Linux)
+
+.opt O \ format
+is preloaded \fBo\fR (overloaded).
+.br
+The BSD \fBO\fR option can act like \fB\-O\fR (user\-defined output
+format with some common fields predefined) or can be used to specify
+sort order. Heuristics are used to determine the behavior of this
+option. To ensure that the desired behavior is obtained (sorting or
+formatting), specify the option in some other way
+(e.g. with \fB\-O\fR or \fB\-\-sort\fR).
+When used as a formatting option, it is identical to \fB\-O\fR, with the
+BSD\ personality.
+
+.opt \-O \ format
+is like \fB\-o\fR, but preloaded with some default columns.
+Identical to \fB\-o\ pid,\fIformat\fB,state,tname,time,command\fR
+or \fB\-o\ pid,\fIformat\fB,tname,time,cmd\fR, see\ \fB\-o\fR\ below.
+
.opt o \ format
specify user\-defined format. Identical to \fB\-o\fR and
\fB\-\-format\fR.
@@ -440,15 +443,15 @@
.opt v
display virtual memory format
+.opt X
+Register format.
+
.opt \-y
Do not show flags; show rss in place of addr.
This option can only be used with \fB\-l\fR.
-.opt \-\-format \ format
-user\-defined format. Identical to \fB\-o\fR and \fBo\fR.
-
-.opt \-\-context
-Display security context format. (for\ SE\ Linux)
+.opt Z
+Add a column of security data. Identical to \fB\-M\fR. (for\ SE\ Linux)
.\" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.PD
@@ -459,37 +462,6 @@
.\" .B C
.\" use raw CPU time for %CPU instead of decaying average
-.opt \-H
-show process hierarchy (forest)
-
-.opt N \ namelist
-Specify namelist file. Identical to \fB\-n\fR, see \fB\-n\fR above.
-
-.opt O \ order
-Sorting order. (overloaded)
-.br
-The BSD \fBO\fR option can act like \fB\-O\fR (user\-defined output
-format with some common fields predefined) or can be used to specify
-sort order. Heuristics are used to determine the behavior of this
-option. To ensure that the desired behavior is obtained (sorting or
-formatting), specify the option in some other way (e.g. with \fB\-O\fR
-or \fB\-\-sort\fR).
-
-For sorting, obsolete BSD \fBO\fR option syntax is
-\fBO\fR[\fB+\fR|\fB\-\fR]\fIk1\fR[,[\fB+\fR|\fB\-\fR]\fIk2\fR[,...]].
-It orders the processes listing according to the multilevel sort specified by
-the sequence of one\-letter short keys \fIk1\fR, \fIk2\fR, ... described
-in the \fBOBSOLETE SORT KEYS\fR section below.
-The\ "+" is currently optional,
-merely re\-iterating the default direction on a key,
-but may help to distinguish an \fBO\fR sort from an \fBO\fR format.
-The\ "\-" reverses direction only on the key it precedes.
-
-.opt S
-Sum up some information, such as CPU usage, from dead child processes
-into their parent. This is useful for examining a system where a
-parent process repeatedly forks off short\-lived children to do work.
-
.opt c
Show the true command name. This is derived from the name of the
executable file, rather than from the argv value. Command arguments
@@ -502,12 +474,24 @@
See the \fB\-f\fR option, the format keyword \fBargs\fR, and the
format keyword \fBcomm\fR.
+.opt \-\-cols \ n
+set screen width
+
+.opt \-\-columns \ n
+set screen width
+
+.opt \-\-cumulative
+include some dead child process data (as a sum with the parent)
+
.opt e
Show the environment after the command.
.opt f
ASCII\-art process hierarchy (forest)
+.opt \-\-forest
+ASCII art process tree
+
.opt h
No header. (or, one header per screen in the BSD personality)
.br
@@ -521,6 +505,12 @@
and \fB\-\-no\-headers\fR to enable printing headers each page or
disable headers entirely, respectively.
+.opt \-H
+show process hierarchy (forest)
+
+.opt \-\-headers
+repeat header lines, one per page of output
+
.opt k \ spec
specify sorting order. Sorting syntax is
[\fB+\fR|\fB\-\fR]\fIkey\fR[,[\fB+\fR|\fB\-\fR]\fIkey\fR[,...]]
@@ -557,40 +547,47 @@
.br
/System.map
+.opt \-\-lines \ n
+set screen height
+
.opt n
Numeric output for WCHAN and USER. (including all types of UID and GID)
-.opt \-w
-Wide output. Use this option twice for unlimited width.
-
-.opt w
-Wide output. Use this option twice for unlimited width.
-
-.opt \-\-cols \ n
-set screen width
-
-.opt \-\-columns \ n
-set screen width
-
-.opt \-\-cumulative
-include some dead child process data (as a sum with the parent)
+.opt N \ namelist
+Specify namelist file. Identical to \fB\-n\fR, see \fB\-n\fR above.
-.opt \-\-forest
-ASCII art process tree
+.opt O \ order
+Sorting order. (overloaded)
+.br
+The BSD \fBO\fR option can act like \fB\-O\fR (user\-defined output
+format with some common fields predefined) or can be used to specify
+sort order. Heuristics are used to determine the behavior of this
+option. To ensure that the desired behavior is obtained (sorting or
+formatting), specify the option in some other way (e.g. with \fB\-O\fR
+or \fB\-\-sort\fR).
-.opt \-\-headers
-repeat header lines, one per page of output
+For sorting, obsolete BSD \fBO\fR option syntax is
+\fBO\fR[\fB+\fR|\fB\-\fR]\fIk1\fR[,[\fB+\fR|\fB\-\fR]\fIk2\fR[,...]].
+It orders the processes listing according to the multilevel sort specified by
+the sequence of one\-letter short keys \fIk1\fR, \fIk2\fR, ... described
+in the \fBOBSOLETE SORT KEYS\fR section below.
+The\ "+" is currently optional,
+merely re\-iterating the default direction on a key,
+but may help to distinguish an \fBO\fR sort from an \fBO\fR format.
+The\ "\-" reverses direction only on the key it precedes.
.opt \-\-no\-headers
print no header line at all. \-\-no\-heading is an alias for this
option.
-.opt \-\-lines \ n
-set screen height
-
.opt \-\-rows \ n
set screen height
+.opt S
+Sum up some information, such as CPU usage, from dead child processes
+into their parent. This is useful for examining a system where a
+parent process repeatedly forks off short\-lived children to do work.
+
.opt \-\-sort \ spec
specify sorting order. Sorting syntax is
[\fB+\fR|\fB\-\fR]\fIkey\fR[,[\fB+\fR|\fB\-\fR]\fIkey\fR[,...]]
@@ -599,6 +596,12 @@
lexicographic order. Identical to\ \fBk\fR.
For example: \fBps\ jax\ \-\-sort=uid,\-ppid,+pid\fR
+.opt w
+Wide output. Use this option twice for unlimited width.
+
+.opt \-w
+Wide output. Use this option twice for unlimited width.
+
.opt \-\-width \ n
set screen width
@@ -614,35 +617,35 @@
.opt \-L
Show threads, possibly with LWP and NLWP columns
-.opt \-T
-Show threads, possibly with SPID column
-
.opt m
Show threads after processes
.opt \-m
Show threads after processes
+.opt \-T
+Show threads, possibly with SPID column
+
.\" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.PD
.PP
.SH "OTHER INFORMATION"
.PD 0
+.opt \-\-help
+Print a help message.
+
+.opt \-\-info
+Print debugging info.
+
.opt L
List all format specifiers.
-.opt \-V
-Print the procps version.
-
.opt V
Print the procps version.
-.opt \-\-help
-Print a help message.
-
-.opt \-\-info
-Print debugging info.
+.opt \-V
+Print the procps version.
.opt \-\-version
Print the procps version.

View file

@ -0,0 +1,157 @@
Description: ps displays cgroup
Author: Swann Perarnau <swann.perarnau@imag.fr>
Bug-Debian: http://bugs.debian.org/469669
Reviewed-by: Craig Small <csmall@debian.org>
--- a/proc/readproc.c
+++ b/proc/readproc.c
@@ -598,6 +598,17 @@
p->environ = file2strvec(path, "environ");
else
p->environ = NULL;
+
+ if(linux_version_code>=LINUX_VERSION(2,6,24) && (flags & PROC_FILLCGROUP)) {
+ p->cgroup = file2strvec(path, "cgroup"); /* read /proc/#/cgroup */
+ if(p->cgroup && *p->cgroup) {
+ int i = strlen(*p->cgroup);
+ if( (*p->cgroup)[i-1]=='\n' )
+ (*p->cgroup)[i-1] = ' '; //little hack to remove trailing \n
+ }
+ }
+ else
+ p->cgroup = NULL;
return p;
next_proc:
@@ -686,7 +697,7 @@
t->cmdline = p->cmdline; // better not free these until done with all threads!
t->environ = p->environ;
#endif
-
+ t->cgroup = p->cgroup;
t->ppid = p->ppid; // ought to put the per-task ppid somewhere
return t;
@@ -896,6 +907,8 @@
free((void*)*p->cmdline);
if (p->environ)
free((void*)*p->environ);
+ if (p->cgroup)
+ free((void*)*p->cgroup);
free(p);
}
--- a/proc/readproc.h
+++ b/proc/readproc.h
@@ -139,6 +139,7 @@
tpgid, // stat terminal process group id
exit_signal, // stat might not be SIGCHLD
processor; // stat current (or most recent?) CPU
+ char **cgroup; // cgroup current cgroup, looks like a classic filepath
} proc_t;
// PROCTAB: data structure holding the persistent information readproc needs
@@ -236,8 +237,9 @@
#define PROC_FILLSTAT 0x0040 // read stat -- currently unconditional
#define PROC_FILLWCHAN 0x0080 // look up WCHAN name
#define PROC_FILLARG 0x0100 // alloc and fill in `cmdline'
+#define PROC_FILLCGROUP 0x0200 // alloc and fill in `cgroup`
-#define PROC_LOOSE_TASKS 0x0200 // threat threads as if they were processes
+#define PROC_LOOSE_TASKS 0x2000 // threat threads as if they were processes
// Obsolete, consider only processes with one of the passed:
#define PROC_PID 0x1000 // process id numbers ( 0 terminated)
--- a/ps/display.c
+++ b/ps/display.c
@@ -223,8 +223,7 @@
#define needs_for_format (proc_format_needs|task_format_needs)
-#define PROC_ONLY_FLAGS (PROC_FILLENV|PROC_FILLARG|PROC_FILLCOM|PROC_FILLMEM)
-
+#define PROC_ONLY_FLAGS (PROC_FILLENV|PROC_FILLARG|PROC_FILLCOM|PROC_FILLMEM|PROC_FILLCGROUP)
/***** munge lists and determine openproc() flags */
static void lists_and_needs(void){
check_headers();
@@ -342,6 +341,7 @@
}
if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse
if(buf.environ) free((void*)*buf.environ); // ought to reuse
+ if(buf.cgroup) free((void*)*buf.cgroup);
}
break;
case TF_show_proc|TF_loose_tasks: // H option
@@ -354,6 +354,7 @@
}
if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse
if(buf.environ) free((void*)*buf.environ); // ought to reuse
+ if(buf.cgroup) free((void*)*buf.cgroup);
}
break;
case TF_show_proc|TF_show_task: // m and -m options
@@ -366,7 +367,8 @@
}
if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse
if(buf.environ) free((void*)*buf.environ); // ought to reuse
- }
+ if(buf.cgroup) free((void*)*buf.cgroup);
+ }
break;
case TF_show_task: // -L and -T options
while(readproc(ptp,&buf)){
@@ -377,7 +379,8 @@
}
if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse
if(buf.environ) free((void*)*buf.environ); // ought to reuse
- }
+ if(buf.cgroup) free((void*)*buf.cgroup);
+ }
break;
}
closeproc(ptp);
--- a/ps/output.c
+++ b/ps/output.c
@@ -376,6 +376,26 @@
return max_rightward-rightward;
}
+static int pr_cgroup(char *restrict const outbuf,const proc_t *restrict const pp) {
+ if(pp->cgroup && *pp->cgroup) {
+ char *endp = outbuf;
+ int rightward=max_rightward;
+ if(forest_prefix){
+ int fh = forest_helper(outbuf);
+ endp += fh;
+ rightward -= fh;
+ }
+ if(rightward>1){
+ *endp++ = ' ';
+ rightward--;
+ endp += escape_str(endp, *pp->cgroup, OUTBUF_SIZE, &rightward);
+ }
+ return max_rightward-rightward;
+ }
+ else
+ return pr_nop(outbuf,pp);
+}
+
/* "ucomm" is the same thing: short unless -f */
static int pr_comm(char *restrict const outbuf, const proc_t *restrict const pp){
char *endp = outbuf;
@@ -1274,7 +1294,7 @@
#define GRP PROC_FILLGRP /* gid_t -> group names */
#define WCH PROC_FILLWCHAN /* do WCHAN lookup */
-
+#define CGRP PROC_FILLCGROUP /* read cgroup */
/* TODO
* pull out annoying BSD aliases into another table (to macro table?)
* add sorting functions here (to unify names)
@@ -1310,6 +1330,7 @@
{"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, 27, CGRP, LNX, PO|UNLIMITED},
{"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},

View file

@ -0,0 +1,29 @@
Author: <csmall@debian.org>
Description: Renames second SZ to SIZE, means we don't follow SCO but less confusion
Bug-Debian: http://bugs.debian.org/541061
Index: b/ps/output.c
===================================================================
--- a/ps/output.c 2009-11-24 21:00:47.000000000 +1100
+++ b/ps/output.c 2009-11-24 21:00:48.000000000 +1100
@@ -1522,7 +1522,7 @@
{"sigcatch", "CAUGHT", pr_sigcatch, sr_nop, 9, 0, XXX, TO|SIGNAL}, /*caught*/
{"sigignore", "IGNORED", pr_sigignore,sr_nop, 9, 0, XXX, TO|SIGNAL}, /*ignored*/
{"sigmask", "BLOCKED", pr_sigmask, sr_nop, 9, 0, XXX, TO|SIGNAL}, /*blocked*/
-{"size", "SZ", pr_swapable, sr_swapable, 5, 0, SCO, PO|RIGHT},
+{"size", "SIZE", pr_swapable, sr_swapable, 5, 0, SCO, PO|RIGHT},
{"sl", "SL", pr_nop, sr_nop, 3, 0, XXX, AN|RIGHT},
{"spid", "SPID", pr_thread, sr_tid, 5, 0, SGI, TO|PIDMAX|RIGHT},
{"stackp", "STACKP", pr_stackp, sr_start_stack, 8, 0, LNX, PO|RIGHT}, /*start_stack*/
Index: b/ps/ps.1
===================================================================
--- a/ps/ps.1 2009-11-24 21:00:47.000000000 +1100
+++ b/ps/ps.1 2009-11-24 21:00:48.000000000 +1100
@@ -1254,7 +1254,7 @@
see\ \fBblocked\fR. (alias\ \fBblocked\fR,\ \fBsig_block\fR).
T}
-size SZ T{
+size SIZE T{
approximate amount of swap space that would be required
if the process were to dirty all writable pages and then
be swapped out.

View file

@ -0,0 +1,446 @@
Description: 506303 ps displays supplementary groups
Author: Alfredo Esteban <aedelatorre@gmail.com>
Bug-Debian: http://bugs.debian.org/506303
Reviewed-by: Craig Small <csmall@debian.org>
--- a/proc/library.map
+++ b/proc/library.map
@@ -7,7 +7,7 @@
readproc; readtask; readproctab; readproctab2; look_up_our_self; escape_command;
escape_str; escape_strlist;
- openproc; closeproc; freeproc;
+ openproc; closeproc; freeproc; allocsupgrp; freesupgrp;
tty_to_dev; dev_to_tty; open_psdb_message; open_psdb; lookup_wchan;
display_version; procps_version; linux_version_code;
Hertz; smp_num_cpus; have_privs;
--- a/proc/readproc.c
+++ b/proc/readproc.c
@@ -20,6 +20,7 @@
#include <errno.h>
#include <stdarg.h>
#include <string.h>
+#include <limits.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
@@ -85,63 +86,68 @@
long Threads = 0;
long Tgid = 0;
long Pid = 0;
+ int hash = 0;
+ int isupgid = 0;
- static const unsigned char asso[] =
+ static const unsigned char asso[] =
{
- 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
- 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
- 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
- 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
- 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
- 61, 61, 61, 61, 61, 61, 61, 61, 15, 61,
- 61, 61, 61, 61, 61, 61, 30, 3, 5, 5,
- 61, 5, 61, 8, 61, 61, 3, 61, 10, 61,
- 6, 61, 13, 0, 30, 25, 0, 61, 61, 61,
- 61, 61, 61, 61, 61, 61, 61, 3, 61, 13,
- 0, 0, 61, 30, 61, 25, 61, 61, 61, 0,
- 61, 61, 61, 61, 5, 61, 0, 61, 61, 61,
- 0, 61, 61, 61, 61, 61, 61, 61
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 0, 66,
+ 66, 66, 66, 66, 66, 66, 3, 30, 20, 30,
+ 66, 25, 66, 20, 66, 66, 30, 66, 25, 66,
+ 0, 66, 8, 10, 3, 18, 5, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 3, 66, 10,
+ 0, 0, 66, 25, 66, 5, 66, 66, 66, 25,
+ 66, 5, 66, 66, 0, 66, 0, 0, 66, 66,
+ 25, 66, 66, 66, 66, 66, 66, 66
};
static const status_table_struct table[] = {
- F(VmStk)
+ F(Pid)
NUL NUL
- F(State)
+ F(Threads)
+ NUL
+ F(PPid)
+ NUL NUL
+ F(Tgid)
NUL
- F(VmExe)
F(ShdPnd)
+ NUL NUL
+ F(State)
NUL
- F(VmData)
+ F(VmStk)
+ NUL NUL
+ F(Uid)
NUL
- F(Name)
+ F(VmSize)
NUL NUL
F(VmRSS)
- NUL NUL
- F(VmLck)
- NUL NUL NUL
+ NUL
F(Gid)
- F(Pid)
- NUL NUL NUL
- F(VmSize)
NUL NUL
- F(VmLib)
- NUL NUL
- F(PPid)
- NUL
- F(SigCgt)
+ F(VmData)
NUL
- F(Threads)
+ F(Groups)
+ NUL NUL NUL NUL
F(SigPnd)
+ NUL NUL
+ F(SigBlk)
NUL
+ F(VmLib)
+ NUL NUL NUL NUL
+ F(VmLck)
+ NUL NUL NUL NUL
+ F(Name)
+ NUL NUL NUL NUL
F(SigIgn)
- NUL
- F(Uid)
- NUL NUL NUL NUL NUL NUL NUL NUL NUL
- NUL NUL NUL NUL NUL
- F(Tgid)
NUL NUL NUL NUL
- F(SigBlk)
- NUL NUL NUL
+ F(VmExe)
+ NUL NUL NUL NUL
+ F(SigCgt)
};
#undef F
@@ -157,6 +163,9 @@
P->vm_exe = 0;
P->vm_lib = 0;
P->nlwp = 0;
+ P->nsupgid = 0;
+ P->supgid = NULL;
+ P->supgrp = NULL;
P->signal[0] = '\0'; // so we can detect it as missing for very old kernels
goto base;
@@ -173,7 +182,9 @@
// examine a field name (hash and compare)
base:
if(unlikely(!*S)) break;
- entry = table[63 & (asso[(int)S[3]] + asso[(int)S[2]] + asso[(int)S[0]])];
+ hash = asso[S[3]] + asso[S[2]] + asso[S[0]];
+ if (hash > 65) continue;
+ entry = table[hash];
colon = strchr(S, ':');
if(unlikely(!colon)) break;
if(unlikely(colon[1]!='\t')) break;
@@ -271,6 +282,21 @@
P->sgid = strtol(S,&S,10);
P->fgid = strtol(S,&S,10);
continue;
+ case_Groups:
+ isupgid = 0;
+ if (*S != '\n'){ // Is there any supplementary group ?
+ P->supgid = (int *) xmalloc(0x0004 * sizeof(int));
+ int vctsize = 0x0004;
+ while (S[1] != '\n' && isupgid<INT_MAX){ // There is one blank before '\n'
+ if (isupgid == vctsize){
+ vctsize *= 2;
+ P->supgid = (int *)xrealloc(P->supgid,vctsize * sizeof(int));
+ }
+ P->supgid[isupgid++] = strtol(S,&S,10);
+ P->nsupgid++;
+ }
+ }
+ continue;
case_VmData:
P->vm_data = strtol(S,&S,10);
continue;
@@ -589,6 +615,13 @@
}
}
+ if (flags & PROC_FILLSUPGRP && p->nsupgid > 0){
+ allocsupgrp(p);
+ int i;
+ for (i=0; i < p->nsupgid; i++)
+ memcpy(p->supgrp[i], group_from_gid(p->supgid[i]), P_G_SZ);
+ }
+
if ((flags & PROC_FILLCOM) || (flags & PROC_FILLARG)) /* read+parse /proc/#/cmdline */
p->cmdline = file2strvec(path, "cmdline");
else
@@ -683,6 +716,13 @@
}
}
+ if (flags & PROC_FILLSUPGRP && t->nsupgid > 0){
+ allocsupgrp(t);
+ int i;
+ for (i=0; i < t->nsupgid; i++)
+ memcpy(t->supgrp[i], group_from_gid(t->supgid[i]), P_G_SZ);
+ }
+
#if 0
if ((flags & PROC_FILLCOM) || (flags & PROC_FILLARG)) /* read+parse /proc/#/cmdline */
t->cmdline = file2strvec(path, "cmdline");
@@ -897,6 +937,23 @@
}
}
+// allocate memory for supgrp
+void allocsupgrp(proc_t *p) {
+ if (!p || p->nsupgid == 0) return;
+ p->supgrp = (char**)xmalloc(p->nsupgid * sizeof(char*));
+ int i;
+ for (i=0; i<p->nsupgid; i++)
+ p->supgrp[i] = (char*)xmalloc(P_G_SZ * sizeof(char));
+}
+
+// free memory allocated for supgrp
+void freesupgrp(proc_t *p) {
+ int i;
+ for (i=0; i<p->nsupgid; i++)
+ if (p->supgrp[i]) free(p->supgrp[i]);
+ free(p->supgrp);
+}
+
// deallocate the space allocated by readproc if the passed rbuf was NULL
void freeproc(proc_t* p) {
if (!p) /* in case p is NULL */
--- a/proc/readproc.h
+++ b/proc/readproc.h
@@ -122,6 +122,7 @@
egroup[P_G_SZ], // status effective group name
sgroup[P_G_SZ], // status saved group name
fgroup[P_G_SZ], // status filesystem group name
+ **supgrp, // status supplementary groups
cmd[16]; // stat,status basename of executable file in call to exec(2)
struct proc_t
*ring, // n/a thread group ring
@@ -137,6 +138,8 @@
suid, sgid, // status saved
fuid, fgid, // status fs (used for file access only)
tpgid, // stat terminal process group id
+ nsupgid, // status number of supplementary groups
+ *supgid, // status supplementary gid's
exit_signal, // stat might not be SIGCHLD
processor; // stat current (or most recent?) CPU
char **cgroup; // cgroup current cgroup, looks like a classic filepath
@@ -198,6 +201,12 @@
// clean-up open files, etc from the openproc()
extern void closeproc(PROCTAB* PT);
+// allocate memory for supgrp
+extern void allocsupgrp(proc_t *p);
+
+// free memory allocated for supgrp
+extern void freesupgrp(proc_t *p);
+
// retrieve the next process matching the criteria set by the openproc()
extern proc_t* readproc(PROCTAB *restrict const PT, proc_t *restrict p);
extern proc_t* readtask(PROCTAB *restrict const PT, const proc_t *restrict const p, proc_t *restrict t);
@@ -238,6 +247,7 @@
#define PROC_FILLWCHAN 0x0080 // look up WCHAN name
#define PROC_FILLARG 0x0100 // alloc and fill in `cmdline'
#define PROC_FILLCGROUP 0x0200 // alloc and fill in `cgroup`
+#define PROC_FILLSUPGRP 0x0400 // resolve supplementary group id number -> group name
#define PROC_LOOSE_TASKS 0x2000 // threat threads as if they were processes
--- a/ps/display.c
+++ b/ps/display.c
@@ -342,6 +342,8 @@
if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse
if(buf.environ) free((void*)*buf.environ); // ought to reuse
if(buf.cgroup) free((void*)*buf.cgroup);
+ if(buf.nsupgid > 0 && buf.supgid) free(buf.supgid);
+ if((ptp->flags & PROC_FILLSUPGRP) && buf.nsupgid>0 && buf.supgrp) freesupgrp(&buf);
}
break;
case TF_show_proc|TF_loose_tasks: // H option
@@ -349,12 +351,16 @@
proc_t buf2;
// must still have the process allocated
while(readtask(ptp,&buf,&buf2)){
- if(!want_this_proc(&buf)) continue;
- show_one_proc(&buf2, task_format_list);
+ if(want_this_proc(&buf)) show_one_proc(&buf2, task_format_list);
+ if(buf2.nsupgid > 0 && buf2.supgid && buf.supgid!=buf2.supgid) free(buf2.supgid);
+ if((ptp->flags & PROC_FILLSUPGRP) && buf2.nsupgid>0 && buf2.supgrp && buf.supgrp!=buf2.supgrp)
+ freesupgrp(&buf2);
}
if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse
if(buf.environ) free((void*)*buf.environ); // ought to reuse
if(buf.cgroup) free((void*)*buf.cgroup);
+ if(buf.nsupgid > 0 && buf.supgid) free(buf.supgid);
+ if((ptp->flags & PROC_FILLSUPGRP) && buf.nsupgid>0 && buf.supgrp) freesupgrp(&buf);
}
break;
case TF_show_proc|TF_show_task: // m and -m options
@@ -363,11 +369,18 @@
proc_t buf2;
show_one_proc(&buf, proc_format_list);
// must still have the process allocated
- while(readtask(ptp,&buf,&buf2)) show_one_proc(&buf2, task_format_list);
+ while(readtask(ptp,&buf,&buf2)){
+ show_one_proc(&buf2, task_format_list);
+ if(buf2.nsupgid > 0 && buf2.supgid && buf.supgid!=buf2.supgid) free(buf2.supgid);
+ if(ptp->flags & PROC_FILLSUPGRP && buf2.nsupgid>0 && buf2.supgrp && buf.supgrp!=buf2.supgrp)
+ freesupgrp(&buf2);
+ }
}
if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse
if(buf.environ) free((void*)*buf.environ); // ought to reuse
if(buf.cgroup) free((void*)*buf.cgroup);
+ if(buf.nsupgid > 0 && buf.supgid) free(buf.supgid);
+ if((ptp->flags & PROC_FILLSUPGRP) && buf.nsupgid>0 && buf.supgrp) freesupgrp(&buf);
}
break;
case TF_show_task: // -L and -T options
@@ -375,11 +388,18 @@
if(want_this_proc(&buf)){
proc_t buf2;
// must still have the process allocated
- while(readtask(ptp,&buf,&buf2)) show_one_proc(&buf2, task_format_list);
+ while(readtask(ptp,&buf,&buf2)){
+ show_one_proc(&buf2, task_format_list);
+ if(buf2.nsupgid > 0 && buf2.supgid && buf.supgid!=buf2.supgid) free(buf2.supgid);
+ if(ptp->flags & PROC_FILLSUPGRP && buf2.nsupgid>0 && buf2.supgrp && buf.supgrp!=buf2.supgrp)
+ freesupgrp(&buf2);
+ }
}
if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse
if(buf.environ) free((void*)*buf.environ); // ought to reuse
if(buf.cgroup) free((void*)*buf.cgroup);
+ if(buf.nsupgid > 0 && buf.supgid) free(buf.supgid);
+ if((ptp->flags & PROC_FILLSUPGRP) && buf.nsupgid>0 && buf.supgrp) freesupgrp(&buf);
}
break;
}
@@ -542,6 +562,12 @@
qsort(processes, n, sizeof(proc_t*), compare_two_procs);
if(forest_type) show_forest(n);
else show_proc_array(ptp,n);
+ int i;
+ for (i=0; i<n; i++)
+ if (processes[i]->nsupgid>0 && processes[i]->supgid) free(processes[i]->supgid);
+ if (ptp->flags & PROC_FILLSUPGRP)
+ for (i=0; i<n; i++)
+ if (processes[i]->nsupgid>0 && processes[i]->supgrp) freesupgrp(processes[i]);
closeproc(ptp);
}
--- a/ps/output.c
+++ b/ps/output.c
@@ -211,6 +211,32 @@
return 0;
}
+static int sr_supgid(const proc_t* P, const proc_t* Q){
+ int i;
+ for (i = 0; i < INT_MAX; i++){
+ if (P->nsupgid == i){
+ if (Q->nsupgid == i) return 0;
+ else return -1;
+ }
+ if (Q->nsupgid == i) return 1;
+ if (P->supgid[i] != Q->supgid[i]) return P->supgid[i] - Q->supgid[i];
+ }
+ return 0;
+}
+
+static int sr_supgrp(const proc_t* P, const proc_t* Q){
+ int i;
+ for (i = 0; i < INT_MAX; i++){
+ if (P->nsupgid == i){
+ if (Q->nsupgid == i) return 0;
+ else return -1;
+ }
+ if (Q->nsupgid == i) return 1;
+ int cmp = strncmp(P->supgrp[i],Q->supgrp[i],P_G_SZ);
+ if (cmp != 0) return cmp;
+ }
+ return 0;
+}
/***************************************************************************/
/************ Lots of format functions, starting with the NOP **************/
@@ -1062,6 +1088,24 @@
return snprintf(outbuf, COLWID, "%d", pp->fuid);
}
+static int pr_supgid(char *restrict const outbuf, const proc_t *restrict const pp){
+ if (pp->nsupgid == 0) return snprintf(outbuf,2,"-");
+ int rest = COLWID;
+ int i = 0;
+ for (i = 0; i < pp->nsupgid && rest > 5; i++)
+ rest-= snprintf(outbuf+COLWID-rest, rest, "%d ", pp->supgid[i]);
+ return COLWID-rest;
+}
+
+static int pr_supgrp(char *restrict const outbuf, const proc_t *restrict const pp){
+ if (pp->nsupgid == 0) return snprintf(outbuf,2,"-");
+ int rest = COLWID;
+ int i = 0;
+ for (i = 0; i < pp->nsupgid && rest > sizeof( pp->supgrp[i] ) + 1; i++)
+ rest-= snprintf(outbuf+COLWID-rest, rest, "%s ", pp->supgrp[i]);
+ return COLWID-rest;
+}
+
// The Open Group Base Specifications Issue 6 (IEEE Std 1003.1, 2004 Edition)
// requires that user and group names print as decimal numbers if there is
// not enough room in the column, so tough luck if you don't like it.
@@ -1293,6 +1337,7 @@
#define USR PROC_FILLUSR /* uid_t -> user names */
#define GRP PROC_FILLGRP /* gid_t -> group names */
#define WCH PROC_FILLWCHAN /* do WCHAN lookup */
+#define SUPGRP PROC_FILLSUPGRP /* supgid -> supplementary group names */
#define CGRP PROC_FILLCGROUP /* read cgroup */
/* TODO
@@ -1490,6 +1535,8 @@
{"status", "STATUS", pr_nop, sr_nop, 6, 0, DEC, AN|RIGHT},
{"stime", "STIME", pr_stime, sr_stime, 5, 0, XXX, ET|RIGHT}, /* was 6 wide */
{"suid", "SUID", pr_suid, sr_suid, 5, 0, LNx, ET|RIGHT},
+{"supgid", "SUPGID", pr_supgid, sr_supgid, 27, 0, LNX, PO|UNLIMITED},
+{"supgrp", "SUPGRP", pr_supgrp, sr_supgrp, 27, SUPGRP, LNX, PO|UNLIMITED},
{"suser", "SUSER", pr_suser, sr_suser, 8, USR, LNx, ET|USER},
{"svgid", "SVGID", pr_sgid, sr_sgid, 5, 0, XXX, ET|RIGHT},
{"svgroup", "SVGROUP", pr_sgroup, sr_sgroup, 8, GRP, LNX, ET|USER},
--- a/ps/ps.1
+++ b/ps/ps.1
@@ -1303,6 +1303,16 @@
saved user\ ID. (alias\ \fBsvuid\fR).
T}
+supgid SUPGID T{
+gid of supplementary groups, see
+.BR getgroups (2).
+T}
+
+supgrp SUPGRP T{
+names of supplementary groups, see
+.BR getgroups (2).
+T}
+
suser SUSER T{
saved user name. This will be the textual user\ ID,
if\ it can be obtained and the field width permits,

View file

@ -0,0 +1,25 @@
Author: Craig Small <csmall@debian.org>
Description: readproc.c some type conversion help
return if unable to open /proc
Index: b/proc/readproc.c
===================================================================
--- a/proc/readproc.c 2009-11-24 20:53:03.000000000 +1100
+++ b/proc/readproc.c 2009-11-24 21:00:41.000000000 +1100
@@ -173,7 +173,7 @@
// examine a field name (hash and compare)
base:
if(unlikely(!*S)) break;
- entry = table[63 & (asso[S[3]] + asso[S[2]] + asso[S[0]])];
+ entry = table[63 & (asso[(int)S[3]] + asso[(int)S[2]] + asso[(int)S[0]])];
colon = strchr(S, ':');
if(unlikely(!colon)) break;
if(unlikely(colon[1]!='\t')) break;
@@ -942,6 +942,8 @@
else
PT = openproc(flags);
va_end(ap);
+ if (!PT)
+ return 0;
do { /* read table: */
tab = xrealloc(tab, (n+1)*sizeof(proc_t*));/* realloc as we go, using */
tab[n] = readproc_direct(PT, NULL); /* final null to terminate */

View file

@ -0,0 +1,21 @@
Description: zeros out reused structures to stop double free problems
Bug-Debian: http://bugs.debian.org/550009
Author: Arnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
--- a/proc/readproc.c
+++ b/proc/readproc.c
@@ -828,6 +828,7 @@
saved_p = p;
if(!p) p = xcalloc(p, sizeof *p); /* passed buf or alloced mem */
+ else memset(p, 0, sizeof *p);
for(;;){
// fills in the path, plus p->tid and p->tgid
@@ -856,6 +857,7 @@
saved_t = t;
if(!t) t = xcalloc(t, sizeof *t); /* passed buf or alloced mem */
+ else memset(t, 0, sizeof *t);
// 1. got to fake a thread for old kernels
// 2. for single-threaded processes, this is faster (but must patch up stuff that differs!)

View file

@ -0,0 +1,69 @@
fix_Makefile.diff
slabtop_once.patch
free.1.patch
output_sort_time.patch
pmap.1.patch
10_ps.1.patch
skill.1.patch
skill_perror.patch
slabtop_1.patch
sysctl.8.patch
sysctl_options.patch
tload.1.patch
top_irix.patch
top_no_openproc.patch
top_stdin_eof.patch
top_uid_length.patch
uptime.1.patch
vmstat.8.patch
watch.1.patch
w_time.patch
kill.1.patch
kill_warncr.patch
module_mk_shared.patch
sysinfo_elfnote.patch
top.1.patch
top_c_resize.patch
w-bassman.patch
top.1_cpustates.patch
watch_8bitchar.patch
library_map_freeproc.patch
pgrep_start_time.patch
readproc_c.patch
sysinfo_7_numbers.patch
tload_no_optargs.patch
w.1.patch
w_columns.patch
watch_exec_beep.patch
path_max.patch
w_envlength.patch
gnu-kbsd-version.patch
pgrep_c_option.patch
ps_cgroup_display.patch
watch_precision_time.patch
watch_unicode.patch
complain_unmounted_proc.patch
ps_supgid_display.patch
makefile_dev_null.patch
pgrep.1.patch
ps_size_sz.patch
top_mintime.patch
vmstat_headers.patch
pgrep_usage_exitcode.patch
ps_1_options.patch
top_highlight.patch
top_nohz.patch
vmstat_part_format.patch
readproc_double_free.patch
vmstat_units.patch
skill_null_argv.patch
skill_multiarg.patch
proc_version_constructor.patch
pmaps_smaps.patch
top_numeric_args.patch
top_1_swap.patch
w_userproc.patch
sysinfo_kfreebsd_hertz.patch
ps_1_flt_output.patch
watch_ansi_colour.patch
top_username_parse.patch

View file

@ -0,0 +1,116 @@
Description: Cleanup man page #282168
Bug-Debian: http://bugs.debian.org/282168
Author: Brendan O'Dea <bod@debian.org>
Reviewed-by: Craig Small <csmall@debian.org>
Index: b/skill.1
===================================================================
--- a/skill.1 2009-11-24 20:53:05.000000000 +1100
+++ b/skill.1 2009-11-24 21:00:31.000000000 +1100
@@ -11,37 +11,38 @@
skill, snice \- send a signal or report process status
.SH SYNOPSIS
-.nf
-skill [signal to send] [options] process selection criteria
-snice [new priority] [options] process selection criteria
-.fi
+.B skill
+.RI [ "signal to send" ]
+.RI [ options ]
+.I process selection criteria
+.br
+.B snice
+.RI [ "new priority" ]
+.RI [ options ]
+.I process selection criteria
.SH DESCRIPTION
These tools are probably obsolete and unportable. The command
syntax is poorly defined. Consider using the killall, pkill,
and pgrep commands instead.
-The default signal for skill is TERM. Use -l or -L to list available signals.
+The default signal for skill is TERM. Use \-l or \-L to list available signals.
Particularly useful signals include HUP, INT, KILL, STOP, CONT, and 0.
-Alternate signals may be specified in three ways: -9 -SIGKILL -KILL.
+Alternate signals may be specified in three ways: \-9 \-SIGKILL \-KILL.
The default priority for snice is +4. (snice +4 ...)
-Priority numbers range from +20 (slowest) to -20 (fastest).
+Priority numbers range from +20 (slowest) to \-20 (fastest).
Negative priority numbers are restricted to administrative users.
.SH "GENERAL OPTIONS"
.TS
-l l l.
--f fast mode This is not currently useful.
--i interactive use T{
-You will be asked to approve each action.
-T}
--v verbose output T{
-Display information about selected processes.
-T}
--w warnings enabled This is not currently useful.
--n no action This only displays the process ID.
--V show version Displays version of program.
+lB l l.
+\-f fast mode This is not currently useful.
+\-i interactive use You will be asked to approve each action.
+\-v verbose output Display information about selected processes.
+\-w warnings enabled This is not currently useful.
+\-n no action This only displays the process ID.
+\-V show version Displays version of program.
.TE
.SH "PROCESS SELECTION OPTIONS"
@@ -49,11 +50,11 @@
The options below may be used to ensure correct interpretation.
Do not blame Albert for this interesting interface.
.TS
-l l.
--t The next argument is a terminal (tty or pty).
--u The next argument is a username.
--p The next argument is a process ID number.
--c The next argument is a command name.
+lB l.
+\-t The next argument is a terminal (tty or pty).
+\-u The next argument is a username.
+\-p The next argument is a process ID number.
+\-c The next argument is a command name.
.TE
.SH SIGNALS
@@ -63,7 +64,6 @@
lB rB lB lB
lfCW r l l.
Name Num Action Description
-.TH
0 0 n/a exit code indicates if a signal may be sent
ALRM 14 exit
HUP 1 exit
@@ -104,15 +104,20 @@
lB lB
lfCW l.
Command Description
-.TC
snice seti crack +7 Slow down seti and crack
-skill -KILL -v /dev/pts/* Kill users on new-style PTY devices
-skill -STOP viro lm davem Stop 3 users
-snice -17 root bash Give priority to root's shell
+skill \-KILL \-v /dev/pts/* Kill users on new-style PTY devices
+skill \-STOP viro lm davem Stop 3 users
+snice \-17 root bash Give priority to root's shell
.TE
.SH "SEE ALSO"
-killall(1) pkill(1) kill(1) renice(1) nice(1) signal(7) kill(2)
+.BR killall (1),
+.BR pkill (1),
+.BR kill (1),
+.BR renice (1),
+.BR nice(1),
+.BR kill(2),
+.BR signal(7)
.SH STANDARDS
No standards apply.

View file

@ -0,0 +1,18 @@
Description: Fixed -v and -i and other flags in skill/snice
There was a too greedy option parser
Patch based on submitted patch by Yoshio Nakamura
Bug-Debian: http://bugs.debian.org/331419
Bug-Debian: http://bugs.debian.org/569030
Author: Craig Small <csmall@debian.org>
--- a/skill.c
+++ b/skill.c
@@ -464,6 +464,8 @@
switch(force){ /* fall through each data type */
default: skillsnice_usage();
case 0: /* not forced */
+ if (argptr && argptr[0] == '-') /* its the next argument not a parameter */
+ continue;
case 't':
if(argc){
struct stat sbuf;

View file

@ -0,0 +1,14 @@
Author: WANG Yunfeng <uhuruh@gmail.com>
Description: Don't treat skill null parameter as 0
Bug-Debian: http://bugs.debian.org/551173
--- a/skill.c
+++ b/skill.c
@@ -307,7 +307,7 @@
long pid;
char *endp;
pid = strtol(argv[argc],&endp,10);
- if(!*endp){
+ if(!*endp && (endp != argv[argc])){
if(!kill((pid_t)pid,signo)) continue;
// The UNIX standard contradicts itself. If at least one process
// is matched for each PID (as if processes could share PID!) and

View file

@ -0,0 +1,16 @@
Description: kill prints perror
Author: Justin Pryzby <justinpryzby@users.sourceforge.net>
Bug-Debian: http://bugs.debian.org/468363
Reviewed-by: Craig Small <csmall@debian.org>
Index: b/skill.c
===================================================================
--- a/skill.c 2009-11-24 20:53:05.000000000 +1100
+++ b/skill.c 2009-11-24 21:00:31.000000000 +1100
@@ -317,6 +317,7 @@
// The standard says we return non-zero if an error occurs. Thus if
// killing two processes gives 0 for one and EPERM for the other,
// we are required to return both zero and non-zero. Quantum kill???
+ perror("kill");
exitvalue = 1;
continue;
}

View file

@ -0,0 +1,97 @@
Description: Cleanup slabtop man page
Author: Brendan O'Dea <bod@debian.org>
Bug-Debian: http://bugs.debian.org/282168
Reviewed-by: Craig Small <csmall@debian.org>
Index: b/slabtop.1
===================================================================
--- a/slabtop.1 2009-11-24 20:53:05.000000000 +1100
+++ b/slabtop.1 2009-11-24 21:00:32.000000000 +1100
@@ -7,36 +7,39 @@
slabtop \- display kernel slab cache information in real time
.SH SYNOPSIS
-.BI "slabtop [ " options " ] "
+.B slabtop
+.RI [ options ]
.SH DESCRIPTION
-.BR slabtop (1)
+.B slabtop
displays detailed kernel slab cache information in real time. It displays a
listing of the top caches sorted by one of the listed sort criteria. It also
displays a statistics header filled with slab layer information.
.SH OPTIONS
Normal invocation of
-.BR slabtop (1)
+.B slabtop
does not require any options. The behavior, however, can be fine-tuned by
specifying one or more of the following flags:
.TP
-.B \-\^\-delay=n, \-d n
-Refresh the display every n seconds. By default,
-.BR slabtop (1)
+.B \-\-delay=\fIn\fR, \fB\-d \fIn
+Refresh the display every
+.I n
+in seconds. By default,
+.B slabtop
refreshes the display every three seconds. To exit the program, hit
.BR q.
.TP
-.B \-\^\-sort=S, \-s S
-Sort by S, where S is one of the sort criteria.
+.B \-\-sort=\fIS\fR, \fB\-s\fR \fIS
+Sort by \fIS\fR, where \fIS\fR is one of the sort criteria.
.TP
-.B \-\^\-once, \-o
+.B \-\-once\fR, \fB\-o
Display the output once and then exit.
.TP
-.B \-\^\-version, \-V
+.B \-\-version\fR, \fB\-V
Display version information and exit.
.TP
-.B \-\^\-help
+.B \-\-help
Display usage information and exit.
.SH SORT CRITERIA
@@ -78,7 +81,7 @@
sort by cache utilization
.SH COMMANDS
-.BR slabtop (1)
+.B slabtop
accepts keyboard commands from the user during use. The following are
supported. In the case of letters, both cases are accepted.
@@ -94,7 +97,9 @@
Quit the program.
.SH FILES
-.IR /proc/slabinfo " \-\- slab information"
+.TP
+.I /proc/slabinfo
+slab information
.SH "SEE ALSO"
.BR free (1),
@@ -104,7 +109,7 @@
.SH NOTES
Currently,
-.BR slabtop (1)
+.B slabtop
requires a 2.4 or later kernel (specifically, a version 1.1 or later
.IR /proc/slabinfo ).
Kernel 2.2 should be supported in the future.
@@ -116,7 +121,7 @@
.SH AUTHORS
Written by Chris Rivera and Robert Love.
-.BR slabtop (1)
+.B slabtop
was inspired by Martin Bligh's perl script,
.BR vmtop .
The procps package is maintained by Albert Cahalan <albert@users.sf.net>.

View file

@ -0,0 +1,116 @@
Description: Don't use ncurses for running once
Using ncurses initscr/endwin clears the screen for xterm/etc it
now prints raw text using printf
Bug-Debian: http://bugs.debian.org/503089
Author: Craig Small <csmall@debian.org>
--- a/slabtop.c
+++ b/slabtop.c
@@ -268,11 +268,13 @@
}
}
+#define print_line(fmt, args...) if (run_once) printf(fmt, ## args); else printw(fmt, ## args)
int main(int argc, char *argv[])
{
int o;
unsigned short old_rows;
struct slab_info *slab_list = NULL;
+ int run_once=0;
struct option longopts[] = {
{ "delay", 1, NULL, 'd' },
@@ -306,6 +308,7 @@
sort_func = set_sort_func(optarg[0]);
break;
case 'o':
+ run_once=1;
delay = 0;
break;
case 'V':
@@ -322,11 +325,13 @@
if (tcgetattr(0, &saved_tty) == -1)
perror("tcgetattr");
- initscr();
- term_size(0);
old_rows = rows;
- resizeterm(rows, cols);
- signal(SIGWINCH, term_size);
+ term_size(0);
+ if (!run_once) {
+ initscr();
+ resizeterm(rows, cols);
+ signal(SIGWINCH, term_size);
+ }
signal(SIGINT, sigint_handler);
do {
@@ -340,13 +345,13 @@
if (get_slabinfo(&slab_list, &stats))
break;
- if (old_rows != rows) {
+ if (!run_once && old_rows != rows) {
resizeterm(rows, cols);
old_rows = rows;
}
move(0,0);
- printw( " Active / Total Objects (%% used) : %d / %d (%.1f%%)\n"
+ print_line( " 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"
@@ -361,14 +366,14 @@
slab_list = slabsort(slab_list);
attron(A_REVERSE);
- printw( "%6s %6s %4s %8s %6s %8s %10s %-23s\n",
+ print_line( "%6s %6s %4s %8s %6s %8s %10s %-23s\n",
"OBJS", "ACTIVE", "USE", "OBJ SIZE", "SLABS",
"OBJ/SLAB", "CACHE SIZE", "NAME");
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",
+ print_line("%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,22 +381,24 @@
curr = curr->next;
}
- refresh();
put_slabinfo(slab_list);
- FD_ZERO(&readfds);
- FD_SET(0, &readfds);
- tv.tv_sec = delay;
- tv.tv_usec = 0;
- if (select(1, &readfds, NULL, NULL, &tv) > 0) {
- if (read(0, &c, 1) != 1)
- break;
- parse_input(c);
- }
+ if (!run_once) {
+ refresh();
+ FD_ZERO(&readfds);
+ FD_SET(0, &readfds);
+ tv.tv_sec = delay;
+ tv.tv_usec = 0;
+ if (select(1, &readfds, NULL, NULL, &tv) > 0) {
+ if (read(0, &c, 1) != 1)
+ break;
+ parse_input(c);
+ }
+ }
} while (delay);
tcsetattr(0, TCSAFLUSH, &saved_tty);
free_slabinfo(slab_list);
- endwin();
+ if (!run_once) endwin();
return 0;
}

View file

@ -0,0 +1,147 @@
Author: <csmall@debian.org>
Description: -p flag has OPTIONAL filename
cleanup sysctl man page
Bug-Debian: http://bugs.debian.org/297144
Bug-Debian: http://bugs.debian.org/282168
Index: b/sysctl.8
===================================================================
--- a/sysctl.8 2009-11-24 20:53:05.000000000 +1100
+++ b/sysctl.8 2009-11-24 21:00:32.000000000 +1100
@@ -10,76 +10,108 @@
.SH NAME
sysctl \- configure kernel parameters at runtime
.SH SYNOPSIS
-.B "sysctl [-n] [-e] variable ..."
+.B sysctl
+.RB [ \-n ]
+.RB [ \-e ]
+.I variable
+\&...
.br
-.B "sysctl [-n] [-e] [-q] -w variable=value ..."
+.B sysctl
+.RB [ \-n ]
+.RB [ \-e ]
+.RB [ \-q ]
+.B \-w
+.IR variable = value
+\&...
.br
-.B "sysctl [-n] [-e] [-q] -p <filename>"
+.B sysctl
+.RB [ \-n ]
+.RB [ \-e ]
+.RB [ \-q ]
+.B \-p
+.RI [ filename ]
.br
-.B "sysctl [-n] [-e] -a"
+.B sysctl
+.RB [ \-n ]
+.RB [ \-e ]
+.B \-a
.br
-.B "sysctl [-n] [-e] -A"
+.B sysctl
+.RB [ \-n ]
+.RB [ \-e ]
+.B \-A
.SH DESCRIPTION
.B sysctl
is used to modify kernel parameters at runtime. The parameters available
are those listed under /proc/sys/. Procfs is required for
-.B sysctl(8)
+.B sysctl
support in Linux. You can use
-.B sysctl(8)
+.B sysctl
to both read and write sysctl data.
.SH PARAMETERS
.TP
-.B "variable"
+.I variable
The name of a key to read from. An example is kernel.ostype. The '/'
separator is also accepted in place of a '.'.
.TP
-.B "variable=value"
-To set a key, use the form variable=value, where variable is the key and
-value is the value to set it to. If the value contains quotes or characters
+.IR variable = value
+To set a key, use the form
+.IR variable = value
+where
+.I variable
+is the key and
+.I value
+is the value to set it to. If the value contains quotes or characters
which are parsed by the shell, you may need to enclose the value in double
-quotes. This requires the -w parameter to use.
+quotes. This requires the
+.B \-w
+parameter to use.
.TP
-.B "-n"
+.B \-n
Use this option to disable printing of the key name when printing values.
.TP
-.B "-e"
+.B \-e
Use this option to ignore errors about unknown keys.
.TP
-.B "-N"
+.B \-N
Use this option to only print the names. It may be useful with shells that
have programmable completion.
.TP
-.B "-q"
+.B \-q
Use this option to not display the values set to stdout.
.TP
-.B "-w"
+.B \-w
Use this option when you want to change a sysctl setting.
.TP
-.B "-p"
+.B \-p
Load in sysctl settings from the file specified or /etc/sysctl.conf if none given.
Specifying \- as filename means reading data from standard input.
.TP
-.B "-a"
+.B \-a
Display all values currently available.
.TP
-.B "-A"
+.B \-A
Display all values currently available in table form.
.SH EXAMPLES
-.TP
-/sbin/sysctl -a
-.TP
-/sbin/sysctl -n kernel.hostname
-.TP
-/sbin/sysctl -w kernel.domainname="example.com"
-.TP
-/sbin/sysctl -p /etc/sysctl.conf
+/sbin/sysctl \-a
+.br
+/sbin/sysctl \-n kernel.hostname
+.br
+/sbin/sysctl \-w kernel.domainname="example.com"
+.br
+/sbin/sysctl \-p /etc/sysctl.conf
.SH FILES
.I /proc/sys
+.br
.I /etc/sysctl.conf
.SH SEE ALSO
.BR sysctl.conf (5)
.SH BUGS
-The -A parameter behaves just as -a does.
+The
+.B \-A
+parameter behaves just as
+.B \-a
+does.
.SH AUTHOR
George Staikos, <staikos@0wned.org>

View file

@ -0,0 +1,46 @@
Author: <csmall@debian.org>
Description: Fix up some option processing
Index: b/sysctl.c
===================================================================
--- a/sysctl.c 2009-11-24 20:53:05.000000000 +1100
+++ b/sysctl.c 2009-11-24 21:00:33.000000000 +1100
@@ -421,6 +421,7 @@
const char *me = (const char *)basename(argv[0]);
bool SwitchesAllowed = true;
bool WriteMode = false;
+ bool DisplayAllOpt = false;
int ReturnCode = 0;
const char *preloadfile = DEFAULT_PRELOAD;
@@ -486,8 +487,8 @@
case 'a': // string and integer values (for Linux, all of them)
case 'A': // same as -a -o
case 'X': // same as -a -x
- SwitchesAllowed = false;
- return DisplayAll(PROC_PATH);
+ DisplayAllOpt = true;
+ break;
case 'V':
fprintf(stdout, "sysctl (%s)\n",procps_version);
exit(0);
@@ -502,6 +503,8 @@
} else {
if (NameOnly && Quiet) // nonsense
return Usage(me);
+ if (DisplayAllOpt) // We cannot have values with -a
+ return Usage(me);
SwitchesAllowed = false;
if (WriteMode || index(*argv, '='))
ReturnCode = WriteSetting(*argv);
@@ -509,6 +512,11 @@
ReturnCode = ReadSetting(*argv);
}
}
+ if (DisplayAllOpt) {
+ if (Quiet)
+ return Usage(me);
+ return DisplayAll(PROC_PATH);
+ }
return ReturnCode;
}

View file

@ -0,0 +1,36 @@
Author: Craig Small <csmall@debian.org>
Description: Adds up 7 cpu numbers not 4
Bug-Debian: http://bugs.debian.org/460331
Index: b/proc/sysinfo.c
===================================================================
--- a/proc/sysinfo.c 2009-11-24 21:00:38.000000000 +1100
+++ b/proc/sysinfo.c 2009-11-24 21:00:42.000000000 +1100
@@ -124,24 +124,25 @@
unsigned long long Hertz;
static void old_Hertz_hack(void){
- unsigned long long user_j, nice_j, sys_j, other_j; /* jiffies (clock ticks) */
+ unsigned long long user_j, nice_j, sys_j, other_j, wait_j, hirq_j, sirq_j, stol_j; /* jiffies (clock ticks) */
double up_1, up_2, seconds;
unsigned long long jiffies;
unsigned h;
char *restrict savelocale;
+ wait_j = hirq_j = sirq_j = stol_j = 0;
savelocale = setlocale(LC_NUMERIC, NULL);
setlocale(LC_NUMERIC, "C");
do{
FILE_TO_BUF(UPTIME_FILE,uptime_fd); sscanf(buf, "%lf", &up_1);
/* uptime(&up_1, NULL); */
FILE_TO_BUF(STAT_FILE,stat_fd);
- sscanf(buf, "cpu %Lu %Lu %Lu %Lu", &user_j, &nice_j, &sys_j, &other_j);
+ sscanf(buf, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu", &user_j, &nice_j, &sys_j, &other_j, &wait_j, &hirq_j, &sirq_j, &stol_j);
FILE_TO_BUF(UPTIME_FILE,uptime_fd); sscanf(buf, "%lf", &up_2);
/* uptime(&up_2, NULL); */
} while((long long)( (up_2-up_1)*1000.0/up_1 )); /* want under 0.1% error */
setlocale(LC_NUMERIC, savelocale);
- jiffies = user_j + nice_j + sys_j + other_j;
+ jiffies = user_j + nice_j + sys_j + other_j + wait_j + hirq_j + sirq_j + stol_j ;
seconds = (up_1 + up_2) / 2;
h = (unsigned)( (double)jiffies/seconds/smp_num_cpus );
/* actual values used by 2.4 kernels: 32 64 100 128 1000 1024 1200 */

View file

@ -0,0 +1,23 @@
Description: Find AT_CLKTCK elf note only on Linux
Author: Petr Salinger <Petr.Salinger@seznam.cz>
Bug-Debian: http://bugs.debian.org/378157
Reviewed-by: Craig Small <csmall@debian.org>
Index: b/proc/sysinfo.c
===================================================================
--- a/proc/sysinfo.c 2009-11-24 20:53:04.000000000 +1100
+++ b/proc/sysinfo.c 2009-11-24 21:00:38.000000000 +1100
@@ -221,12 +221,13 @@
// _SC_NPROCESSORS_ONLN returns 1, which should work OK
smp_num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
if(smp_num_cpus<1) smp_num_cpus=1; /* SPARC glibc is buggy */
-
+#ifdef __linux__
if(linux_version_code > LINUX_VERSION(2, 4, 0)){
Hertz = find_elf_note(AT_CLKTCK);
if(Hertz!=NOTE_NOT_FOUND) return;
fputs("2.4+ kernel w/o ELF notes? -- report this\n", stderr);
}
+#endif
old_Hertz_hack();
}

View file

@ -0,0 +1,20 @@
Description: Fix Hertz calculation for kfreebsd
Bug-Debian: http://bugs.debian.org/460331
Author: Petr Salinger
--- a/proc/sysinfo.c
+++ b/proc/sysinfo.c
@@ -230,6 +230,14 @@
fputs("2.4+ kernel w/o ELF notes? -- report this\n", stderr);
}
#endif
+#if defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
+ /* On FreeBSD the Hertz hack is unrelaible, there is no ELF note and
+ * Hertz isn't defined in asm/params.h
+ * See Debian Bug #460331
+ */
+ Hertz = 100;
+ return;
+#endif
old_Hertz_hack();
}

View file

@ -0,0 +1,15 @@
Author: <csmall@debian.org>
Description: Reword tload.1 man page for the alarm
Index: b/tload.1
===================================================================
--- a/tload.1 2009-11-24 20:53:05.000000000 +1100
+++ b/tload.1 2009-11-24 21:00:33.000000000 +1100
@@ -39,7 +39,7 @@
.BI "\-d" " delay"
option sets the time argument for an
.BR alarm (2);
-if -d 0 is specified, the alarm is set to 0, which will never send the
+if \-d 0 is specified, the alarm is set to 0, which will never send the
.B SIGALRM
and update the display.

View file

@ -0,0 +1,16 @@
Author: Craig Small <csmall@debian.org>
Description: Removed unneeded optarg and optind variables form tload.c
Index: b/tload.c
===================================================================
--- a/tload.c 2009-11-24 20:53:03.000000000 +1100
+++ b/tload.c 2009-11-24 21:00:42.000000000 +1100
@@ -30,9 +30,6 @@
static int dly=5;
static jmp_buf jb;
-extern int optind;
-extern char *optarg;
-
static void alrm(int signo)
{
(void)signo;

View file

@ -0,0 +1,416 @@
Description: Fix bold in top manual page
Fix page fault description because storage may not be disk
Author: Craig Small <csmall@debian.org>
Index: b/top.1
===================================================================
--- a/top.1 2009-11-24 20:53:04.000000000 +1100
+++ b/top.1 2009-11-24 21:00:38.000000000 +1100
@@ -42,7 +42,7 @@
.ds EM \ \fB\-\-\ \fR
\# - these two are for chuckles, makes great grammar
.ds Me top
-.ds ME \fBtop\fR
+.ds NE \fBtop\fR
\# - other misc strings for consistent usage/emphasis
.ds F \fIOff\fR
.ds O \fIOn\fR
@@ -85,7 +85,7 @@
.\" ----------------------------------------------------------------------
.SH SYNOPSIS
.\" ----------------------------------------------------------------------
-\*(ME \-\fBhv\fR | \-\fBbcHisS\fR \-\fBd\fI delay\fR \-\fBn\fI
+\*(NE \-\fBhv\fR | \-\fBbcHisS\fR \-\fBd\fI delay\fR \-\fBn\fI
iterations\fR \-\fBp\fI pid\fR [,\fI pid\fR ...]
The traditional switches '-' and whitespace are optional.
@@ -94,7 +94,7 @@
.\" ----------------------------------------------------------------------
.SH DESCRIPTION
.\" ----------------------------------------------------------------------
-The \*(ME program provides a dynamic real-time view of a running system.
+The \*(NE program provides a dynamic real-time view of a running system.
It can display\fB system\fR summary information as well as a list of\fB
tasks\fR currently being managed by the Linux kernel.
The types of system summary information shown and the types, order and
@@ -104,7 +104,7 @@
The program provides a limited interactive interface for process
manipulation as well as a much more extensive interface for personal
configuration \*(EM encompassing every aspect of its operation.
-And while \*(ME is referred to throughout this document, you are free
+And while \*(NE is referred to throughout this document, you are free
to name the program anything you wish.
That new name, possibly an alias, will then be reflected on \*(Me's display
and used when reading and writing a \*(CF.
@@ -190,7 +190,7 @@
'I' - Irix mode On\ \ (no, 'solaris' smp)
* 'p' - PID monitoring Off
* 's' - Secure mode Off (unsecured)
- 'B' - Bold disable Off
+ 'B' - Bold enable Off
\fISummary_Area_defaults\fR
'l' - Load Avg/Uptime On\ \ (thus program name)
't' - Task/Cpu states On\ \ (1+1 lines, see '1')
@@ -413,16 +413,14 @@
q:\fB RES\fR \*(EM Resident size (kb)
The non-swapped \*(MP a task has used.
-RES = CODE + DATA.
-
.TP 3
r:\fB CODE\fR \*(EM Code size (kb)
-The amount of \*(MP devoted to executable code, also known as
+The amount of \*(MV devoted to executable code, also known as
the 'text resident set' size or TRS.
.TP 3
s:\fB DATA\fR \*(EM Data+Stack size (kb)
-The amount of \*(MP devoted to other than executable code, also known as
+The amount of \*(MV devoted to other than executable code, also known as
the 'data resident set' size or DRS.
.TP 3
@@ -436,8 +434,8 @@
The number of\fB major\fR page faults that have occurred for a task.
A page fault occurs when a process attempts to read from or write to a virtual
page that is not currently present in its address space.
-A major page fault is when disk access is involved in making that
-page available.
+A major page fault is when backing storage access (such as a disk) is involved
+in making that page available.
.TP 3
v:\fB nDRT\fR \*(EM Dirty Pages count
@@ -504,7 +502,7 @@
.\" ......................................................................
.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 +578,7 @@
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 +587,7 @@
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 +597,13 @@
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.
+\*(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 +615,7 @@
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 +629,32 @@
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 +665,24 @@
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.
@@ -700,25 +698,25 @@
of messages and prompts.
These commands always impact just the \*(CW/field group.
-\*(XT 4. ALTERNATE\-DISPLAY Mode and the 'G' \*(CI for insight into
-\*(CWs and field groups.
+\*(XT 4. ALTERNATE\-DISPLAY Mode and the 'G' \*(CI for insight
+into \*(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 +748,12 @@
.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 +763,7 @@
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 +772,7 @@
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,20 +783,20 @@
.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
+\ \ \<\fBS\fR\> :\fICumulative_Time_Mode_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
@@ -818,7 +816,7 @@
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 +829,7 @@
.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 +837,7 @@
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 \<\fB#\fR\> :\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 +876,12 @@
.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 +892,7 @@
.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 +905,7 @@
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 +982,7 @@
.\" ......................................................................
.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 +996,7 @@
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 +1007,7 @@
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 +1015,7 @@
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 +1026,7 @@
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 +1035,15 @@
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
.\" ----------------------------------------------------------------------

View file

@ -0,0 +1,50 @@
Description: top CPU state descriptions
Author: Craig Small <csmall@debian.org>
Bug-Debian: http://bugs.debian.org/312157
Index: b/top.1
===================================================================
--- a/top.1 2009-11-24 21:00:38.000000000 +1100
+++ b/top.1 2009-11-24 21:00:40.000000000 +1100
@@ -537,6 +537,42 @@
upper case\fR letter and to the\fB right\fR with the\fB lower case\fR
letter.
+.\" ......................................................................
+.SS 2c. CPU States
+.\" ----------------------------------------------------------------------
+The CPU states are shown in the Summary Area. They are always shown as a
+percentage and are for the time between now and the last refresh.
+
+.TP 3
+\fB us\fR \*(EM User CPU time
+The time the CPU has spent running users' processes that are not
+niced.
+
+.TP 3
+\fB sy\fR \*(EM System CPU time
+The time the CPU has spent running the kernel and its processes.
+
+.TP 3
+\fB ni\fR \*(EM Nice CPU time
+The time the CPU has spent running users' proccess that have been
+niced.
+
+.TP 3
+\fB wa\fR \*(EM iowait
+Amount of time the CPU has been waiting for I/O to complete.
+
+.TP 3
+\fB hi\fR \*(EM Hardware IRQ
+The amount of time the CPU has been servicing hardware interrupts.
+
+.TP 3
+\fB si\fR \*(EM Software Interrupts
+The amount of time the CPU has been servicing software interrupts.
+
+.TP 3
+\fB st\fR \*(EM Steal Time
+The amount of CPU 'stolen' from this virtual machine by the hypervisor
+for other tasks (such as running another virtual machine).
.\" ----------------------------------------------------------------------
.SH 3. INTERACTIVE Commands

View file

@ -0,0 +1,23 @@
Description: Explain what SWAP means in top
Bug-Debian: http://bugs.debian.org/217841
Author: Craig Small <csmall@debian.org>
--- a/top.1
+++ b/top.1
@@ -401,13 +401,13 @@
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.
-
-VIRT = SWAP + RES.
+swapped out and pages that have been mapped but not used.
.TP 3
p:\fB SWAP\fR \*(EM Swapped size (kb)
-The swapped out portion of a task's total \*(MV image.
+Memory that is not resident but is present in a task. This is memory that
+has been swapped out but could include additional non-resident memory.
+This column is calculated by subtracting \*(MP from \*(MV.
.TP 3
q:\fB RES\fR \*(EM Resident size (kb)

View file

@ -0,0 +1,75 @@
Author: <hesso@pool.math.tu-berlin.de>
Description: Prevent top from segfaulting when the display is shrinked to only
a few (read: 3 or less) lines.
Index: b/top.c
===================================================================
--- a/top.c 2009-11-24 21:00:35.000000000 +1100
+++ b/top.c 2009-11-24 21:00:39.000000000 +1100
@@ -140,7 +140,7 @@
are exploited in a macro and represent 90% of our optimization.
The Stdout_buf is transparent to our code and regardless of whose
buffer is used, stdout is flushed at frame end or if interactive. */
-static char *Pseudo_scrn;
+static PSEUDO_SCREEN_t Pseudo_scrn;
static int Pseudo_row, Pseudo_cols, Pseudo_size;
#ifndef STDOUT_IOLBF
// less than stdout's normal buffer but with luck mostly '\n' anyway
@@ -2431,7 +2431,10 @@
Pseudo_cols = Screen_cols + CLRBUFSIZ + 1;
if (Batch) Pseudo_size = ROWBUFSIZ + 1;
else Pseudo_size = Pseudo_cols * Screen_rows;
- Pseudo_scrn = alloc_r(Pseudo_scrn, Pseudo_size);
+ if( Pseudo_scrn.buf == NULL || Pseudo_size > Pseudo_scrn.mem_size ) {
+ Pseudo_scrn.buf = alloc_r(Pseudo_scrn.buf, Pseudo_size);
+ Pseudo_scrn.mem_size = Pseudo_size;
+ }
// force rebuild of column headers AND libproc/readproc requirements
Frames_libflags = 0;
@@ -3315,7 +3318,7 @@
// reframewins(), who also builds each window's column headers
if (!Frames_libflags) {
reframewins();
- memset(Pseudo_scrn, '\0', Pseudo_size);
+ memset(Pseudo_scrn.buf, '\0', Pseudo_size);
}
Pseudo_row = Msg_row = scrlins = 0;
ppt = summary_show();
Index: b/top.h
===================================================================
--- a/top.h 2009-11-24 20:53:04.000000000 +1100
+++ b/top.h 2009-11-24 21:00:39.000000000 +1100
@@ -135,7 +135,7 @@
int _len = 1 + snprintf(_str, sizeof(_str), fmt, ## arg); \
putp ( Batch ? _str : \
({ \
- char *restrict const _pse = &Pseudo_scrn[Pseudo_row++ * Pseudo_cols]; \
+ char *restrict const _pse = &Pseudo_scrn.buf[Pseudo_row++ * Pseudo_cols]; \
memcmp(_pse, _str, _len) ? memcpy(_pse, _str, _len) : "\n"; \
}) \
); \
@@ -149,7 +149,11 @@
int _len = 1 + snprintf(_str, sizeof(_str), fmt, ## arg); \
if (Batch) _ptr = _str; \
else { \
- _ptr = &Pseudo_scrn[Pseudo_row++ * Pseudo_cols]; \
+ if (Pseudo_row * Pseudo_cols + _len > Pseudo_size) { \
+ Pseudo_scrn.buf = realloc(Pseudo_scrn.buf, Pseudo_row * Pseudo_cols + _len); \
+ Pseudo_scrn.mem_size = Pseudo_size = Pseudo_row * Pseudo_cols + _len; \
+ } \
+ _ptr = &Pseudo_scrn.buf[Pseudo_row++ * Pseudo_cols]; \
if (memcmp(_ptr, _str, _len)) { \
memcpy(_ptr, _str, _len); \
} else { \
@@ -237,6 +241,11 @@
RCW_t win [4]; // a 'WIN_t.rc' for each of the 4 windows
} RCF_t;
+typedef struct PSEUDO_SCREEN_t {
+ char *buf;
+ int mem_size;
+} PSEUDO_SCREEN_t;
+
// The scaling 'type' used with scale_num() -- this is how
// the passed number is interpreted should scaling be necessary
enum scale_num {

View file

@ -0,0 +1,19 @@
Author: Paolo Pantaleo <paolopantaleo@gmail.com>
Description: Fix highlighting problem in top
Bug-Debian: http://bugs.debian.org/351065
Index: b/top.c
===================================================================
--- a/top.c 2009-11-24 21:00:48.000000000 +1100
+++ b/top.c 2009-11-24 21:00:50.000000000 +1100
@@ -3054,9 +3054,10 @@
snprintf(_z, sizeof(_z), f, ## va); \
snprintf(cbuf, sizeof(cbuf), "%s%s%s", \
q->capclr_rowhigh, \
- _z, \
+ _z+advance, \
!(CHKw(q, Show_HIROWS) && 'R' == p->state) ? q->capclr_rownorm : "" \
); \
+ advance=0; \
pad += q->len_rowhigh; \
if (!(CHKw(q, Show_HIROWS) && 'R' == p->state)) pad += q->len_rownorm; \
} \

View file

@ -0,0 +1,44 @@
Description: Change formal of IRix mode when showing threads
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Bug-Debian: http://bugs.debian.org/459890
Reviewed-by: Craig Small <csmall@debian.org>
Index: b/top.c
===================================================================
--- a/top.c 2009-11-24 20:53:05.000000000 +1100
+++ b/top.c 2009-11-24 21:00:33.000000000 +1100
@@ -1783,7 +1783,8 @@
confighlp(Winstk[i].rc.fieldscur);
}
- if(Rc.mode_irixps && smp_num_cpus>1){
+ if(Rc.mode_irixps && smp_num_cpus>1 &&
+ !(CHKw(Curwin, Show_THREADS))) {
// good for 100 CPUs per process
pcpu_max_value = 9999.0;
Fieldstab[P_CPU].fmts = " %4.0f";
@@ -2570,6 +2571,15 @@
case 'H':
if (VIZCHKc) {
TOGw(Curwin, Show_THREADS);
+ if(Rc.mode_irixps && smp_num_cpus>1 &&
+ !(CHKw(Curwin, Show_THREADS))){
+ // good for 100 CPUs per process
+ pcpu_max_value = 9999.0;
+ Fieldstab[P_CPU].fmts = " %4.0f";
+ } else {
+ pcpu_max_value = 99.9;
+ Fieldstab[P_CPU].fmts = " %#4.1f";
+ }
show_msg(fmtmk("Show threads %s"
, CHKw(Curwin, Show_THREADS) ? "On" : "Off"));
}
@@ -2626,7 +2636,8 @@
Rc.mode_irixps = !Rc.mode_irixps;
show_msg(fmtmk("Irix mode %s", Rc.mode_irixps ? "On" : "Off"));
#endif
- if(Rc.mode_irixps && smp_num_cpus>1){
+ if(Rc.mode_irixps && smp_num_cpus>1 &&
+ !(CHKw(Curwin, Show_THREADS))){
// good for 100 CPUs per process
pcpu_max_value = 9999.0;
Fieldstab[P_CPU].fmts = " %4.0f";

View file

@ -0,0 +1,16 @@
Author: <csmall@debian.org>
Description: Checks minimum time is valid
Index: b/top.c
===================================================================
--- a/top.c 2009-11-24 21:00:39.000000000 +1100
+++ b/top.c 2009-11-24 21:00:48.000000000 +1100
@@ -2552,7 +2552,8 @@
else {
float tmp =
get_float(fmtmk("Change delay from %.1f to", Rc.delay_time));
- if (tmp > -1) Rc.delay_time = tmp;
+ if (tmp == 0.0) show_msg("\aNot valid");
+ else if (tmp > 0) Rc.delay_time = tmp;
}
break;

View file

@ -0,0 +1,21 @@
Description: Exit top if cannot openproc
Author: Justin Pryzby <justinpryzby@users.sourceforge.net>
Bug-Debian: http://bugs.debian.org/378695
Reviewed-by: Craig Small <csmall@debian.org>
Index: b/top.c
===================================================================
--- a/top.c 2009-11-24 21:00:33.000000000 +1100
+++ b/top.c 2009-11-24 21:00:34.000000000 +1100
@@ -1106,6 +1106,12 @@
else
PT = openproc(flags);
+ if (PT==NULL) {
+ std_err(strerror(errno));
+ exit(1);
+ }
+
+
// i) Allocated Chunks: *Existing* table; refresh + reuse
if (!(CHKw(Curwin, Show_THREADS))) {
while (curmax < savmax) {

View file

@ -0,0 +1,14 @@
Author: <fabbione@sunfire.int.fabbione.net>
Description: Handle idle time calculations correctly when running with NOHZ.
Index: b/top.c
===================================================================
--- a/top.c 2009-11-24 21:00:50.000000000 +1100
+++ b/top.c 2009-11-24 21:00:50.000000000 +1100
@@ -2916,6 +2916,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;

View file

@ -0,0 +1,98 @@
Description: Better top numeric argument handling
Bug-Debian: http://bugs.debian.org/358724
Author: Justin Pryzby <justinpryzby@users.sourceforge.net>
--- a/top.c
+++ b/top.c
@@ -32,6 +32,7 @@
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
+#include <math.h>
#include <string.h>
// Foul POS defines all sorts of stuff...
@@ -1825,8 +1826,12 @@
while (*args) {
const char *cp = *(args++);
+ if (*cp!='-') {
+ std_err(fmtmk("unknown argument '%c'\nusage:\t%s%s" , *cp, Myname, usage));
+ }
- while (*cp) {
+ for(++cp; *cp; cp++) {
+ char *end;
switch (*cp) {
case '\0':
case '-':
@@ -1842,8 +1847,15 @@
else if (*args) cp = *args++;
else std_err("-d requires argument");
/* a negative delay will be dealt with shortly... */
- if (sscanf(cp, "%f", &tmp_delay) != 1)
- std_err(fmtmk("bad delay '%s'", cp));
+ errno=0;
+ if (( (fabs(tmp_delay=strtod(cp, &end))==HUGE_VAL &&
+ errno==ERANGE) ||
+ (tmp_delay==0 && errno!=0) ||
+ end==cp ||
+ end!=cp+strlen(cp))) {
+ std_err(fmtmk("bad delay '%s'", cp));
+ }
+ cp=-1+end;
break;
case 'H':
TOGw(Curwin, Show_THREADS);
@@ -1859,8 +1871,15 @@
if (cp[1]) cp++;
else if (*args) cp = *args++;
else std_err("-n requires argument");
- if (sscanf(cp, "%d", &Loops) != 1 || Loops < 1)
- std_err(fmtmk("bad iterations arg '%s'", cp));
+ errno=0;
+ if ((((Loops=strtol(cp, &end, 0))==LONG_MIN ||
+ Loops==LONG_MAX) &&
+ errno==ERANGE) ||
+ end==cp ||
+ end!=cp+strlen(cp) || Loops<1) {
+ std_err(fmtmk("bad iterations arg '%s'", cp));
+ }
+ cp=-1+end;
break;
case 'p':
do {
@@ -1868,11 +1887,19 @@
selection_type = 'p';
if (cp[1]) cp++;
else if (*args) cp = *args++;
- else std_err("-p argument missing");
+ else std_err("-p requires argument");
if (Monpidsidx >= MONPIDMAX)
std_err(fmtmk("pid limit (%d) exceeded", MONPIDMAX));
- if (sscanf(cp, "%d", &Monpids[Monpidsidx]) != 1 || Monpids[Monpidsidx] < 0)
- std_err(fmtmk("bad pid '%s'", cp));
+ errno=0;
+ if ((((Monpids[Monpidsidx]=strtol(cp, &end, 0))==LONG_MIN ||
+ Monpids[Monpidsidx]==LONG_MAX) &&
+ errno==ERANGE) ||
+ end==cp ||
+ Monpids[Monpidsidx]<1) {
+ std_err(fmtmk("bad pid '%s'", cp));
+ }
+ cp=-1+end;
+
if (!Monpids[Monpidsidx])
Monpids[Monpidsidx] = getpid();
Monpidsidx++;
@@ -1918,10 +1945,7 @@
, *cp, Myname, usage));
} /* end: switch (*cp) */
-
- /* advance cp and jump over any numerical args used above */
- if (*cp) cp += strspn(&cp[1], "- ,.1234567890") + 1;
- } /* end: while (*cp) */
+ } /* end: for (; *cp) */
} /* end: while (*args) */
/* fixup delay time, maybe... */

View file

@ -0,0 +1,20 @@
Description: Check for stdin eof if term
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Bug-Debian: http://bugs.debian.org/458986
Reviewed-by: Craig Small <csmall@debian.org>
Index: b/top.c
===================================================================
--- a/top.c 2009-11-24 21:00:34.000000000 +1100
+++ b/top.c 2009-11-24 21:00:35.000000000 +1100
@@ -3408,9 +3408,8 @@
// check 1st, in case tv zeroed (by sig handler) before it got set
rc = chin(0, &c, 1);
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, may happen if top
+ * erroneously gets detached from it. */
fcntl(STDIN_FILENO, F_SETFL, file_flags);
select(1, &fs, NULL, NULL, &tv);
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK|file_flags);

View file

@ -0,0 +1,16 @@
Description: Make the uid length 5 not 4
Author: <csmall@debian.org>
Bug-Debian: http://bugs.debian.org/426782
Index: b/top.c
===================================================================
--- a/top.c 2009-11-24 21:00:35.000000000 +1100
+++ b/top.c 2009-11-24 21:00:35.000000000 +1100
@@ -1237,7 +1237,7 @@
{ "AaAa", " PID", " %5u", -1, -1, SF(PID), "Process Id", L_NONE },
{ "BbBb", " PPID", " %5u", -1, -1, SF(PPD), "Parent Process Pid", L_EITHER },
{ "CcQq", " RUSER ", " %-8.8s", -1, -1, SF(URR), "Real user name", L_RUSER },
- { "DdCc", " UID", " %4u", -1, -1, SF(UID), "User Id", L_NONE },
+ { "DdCc", " UID", " %5u", -1, -1, SF(UID), "User Id", L_NONE },
{ "EeDd", " USER ", " %-8.8s", -1, -1, SF(URE), "User Name", L_EUSER },
{ "FfNn", " GROUP ", " %-8.8s", -1, -1, SF(GRP), "Group Name", L_GROUP },
{ "GgGg", " TTY ", " %-8.8s", 8, -1, SF(TTY), "Controlling Tty", L_stat },

View file

@ -0,0 +1,15 @@
Description: Fixes off-by-one error so top -u username works
Bug-Debian: http://bugs.debian.org/571790
Author: Chuan-kai Lin <cklin@debian.org>
Last-Update: 2010-03-01
--- a/top.c
+++ b/top.c
@@ -1924,7 +1924,7 @@
errmsg = parse_uid(cp, &selection_uid);
if (errmsg) std_err(errmsg);
selection_type = 'u';
- cp += snprintf(Curwin->colusrnam, USRNAMSIZ-1, "%s", cp); // FIXME: junk
+ cp += snprintf(Curwin->colusrnam, USRNAMSIZ-1, "%s", cp)-1; // FIXME: junk
} while(0);
break;
case 'U':

View file

@ -0,0 +1,48 @@
Description: Cleanup uptime man page #282168
Author: Brendan O'Dea <bod@debian.org>
Bug-Debian: http://bugs.debian.org/282168
Reviewed-by: Craig Small<csmall@debian.org>
Index: b/uptime.1
===================================================================
--- a/uptime.1 2009-11-24 20:53:05.000000000 +1100
+++ b/uptime.1 2009-11-24 21:00:35.000000000 +1100
@@ -6,7 +6,8 @@
.SH SYNOPSIS
.B uptime
.br
-.BR uptime " [" "\-V" ]
+.B uptime
+.RB [ \-V ]
.SH DESCRIPTION
.B uptime
gives a one line display of the following information.
@@ -14,13 +15,25 @@
how long the system has been running,
how many users are currently logged on,
and the system load averages for the past 1, 5, and 15 minutes.
-.sp
+
This is the same information contained in the header line displayed by
.BR w (1).
+.sp
+System load averages is the average number of processes that are either
+in a runnable or uninterruptable state. A process in a runnable state is
+either using the CPU or waiting to use the CPU. A process in
+uninterruptable state is waiting for some I/O access, eg waiting for
+disk. The averages are taken over the three time intervals.
+Load averages are not normalized for the number of CPUs in a system, so
+a load average of 1 means a single CPU system is loaded all the time
+while on a 4 CPU system it means it was idle 75% of the time.
.SH FILES
-.IR /var/run/utmp " information about who is currently logged on"
-.br
-.IR /proc " process information"
+.TP
+.I /var/run/utmp
+information about who is currently logged on
+.TP
+.I /proc
+process information
.SH AUTHORS
.B uptime
was written by Larry Greenfield <greenfie@gauss.rutgers.edu> and

View file

@ -0,0 +1,109 @@
Author: <csmall@debian.org>
Description: Fixes groff problems
Removes pslab as it doesnt appear
Index: b/vmstat.8
===================================================================
--- a/vmstat.8 2009-11-24 20:53:04.000000000 +1100
+++ b/vmstat.8 2009-11-24 21:00:36.000000000 +1100
@@ -1,6 +1,6 @@
.\" This page Copyright (C) 1994 Henry Ware <al172@yfn.ysu.edu>
.\" Distributed under the GPL, Copyleft 1994.
-.TH VMSTAT 8 "27 July 1994 " "Throatwobbler Ginkgo Labs" "Linux Administrator's Manual"
+.TH VMSTAT 8 "2009 Jan 9" "Throatwobbler Ginkgo Labs" "Linux Administrator's Manual"
.SH NAME
vmstat \- Report virtual memory statistics
.SH SYNOPSIS
@@ -22,32 +22,35 @@
.RB [ "\-d"]
.br
.B vmstat
+.RB [ "\-D"]
+.br
+.B vmstat
.RB [ "\-p disk partition"]
.br
.B vmstat
.RB [ "\-V" ]
.SH DESCRIPTION
\fBvmstat\fP reports information about processes, memory, paging,
-block IO, traps, and cpu activity.
+block IO, traps, disks and cpu activity.
The first report produced gives averages since the last reboot. Additional
reports give information on a sampling period of length \fIdelay\fP.
The process and memory reports are instantaneous in either case.
.SS Options
-The \fB-a\fP switch displays active/inactive memory, given a 2.5.41 kernel or better.
+The \fB\-a\fP switch displays active/inactive memory, given a 2.5.41 kernel or better.
.PP
-The \fB-f\fP switch displays the number of forks since boot.
+The \fB\-f\fP switch displays the number of forks since boot.
This includes the fork, vfork, and clone system calls, and is
equivalent to the total number of tasks created. Each process
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\-m\fP displays slabinfo.
.PP
-The \fB-n\fP switch causes the header to be displayed only once rather than periodically.
+The \fB\-n\fP switch causes the header to be displayed only once rather than periodically.
.PP
-The \fB-s\fP switch displays a table of various event counters
+The \fB\-s\fP switch displays a table of various event counters
and memory statistics. This display does not repeat.
.PP
.I delay
@@ -58,13 +61,15 @@
is the number of updates. If no count is specified and delay is
defined, \fIcount\fP defaults to infinity.
.PP
-The \fB-d\fP reports disk statistics (2.5.70 or above required)
+The \fB\-d\fP reports disk statistics (2.5.70 or above required)
+.PP
+The \fB-D\fP reports some summary statistics about disk activity.
.PP
-The \fB-p\fP followed by some partition name for detailed statistics (2.5.70 or above required)
+The \fB\-p\fP followed by some partition name for detailed statistics (2.5.70 or above required)
.PP
-The \fB-S\fP followed by k or K or m or M switches outputs between 1000, 1024, 1000000, or 1048576 bytes
+The \fB\-S\fP followed by k or K or m or M switches outputs between 1000, 1024, 1000000, or 1048576 bytes
.PP
-The \fB-V\fP switch results in displaying version information.
+The \fB\-V\fP switch results in displaying version information.
.PP
.SH FIELD DESCRIPTION FOR VM MODE
.SS
@@ -81,8 +86,8 @@
free: the amount of idle memory.
buff: the amount of memory used as buffers.
cache: the amount of memory used as cache.
-inact: the amount of inactive memory. (-a option)
-active: the amount of active memory. (-a option)
+inact: the amount of inactive memory. (\-a option)
+active: the amount of active memory. (\-a option)
.fi
.PP
.SS
@@ -110,9 +115,9 @@
.B "CPU "
These are percentages of total CPU time.
.nf
-us: Time spent running non-kernel code. (user time, including nice time)
+us: Time spent running non\-kernel code. (user time, including nice time)
sy: Time spent running kernel code. (system time)
-id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
+id: Time spent idle. Prior to Linux 2.5.41, this includes IO\-wait time.
wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.
st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.
@@ -161,8 +166,6 @@
total: Total number of available objects
size: Size of each object
pages: Number of pages with at least one active object
-totpages: Total number of allocated pages
-pslab: Number of pages per slab
.fi
.SH NOTES

View file

@ -0,0 +1,148 @@
Description: Headers for disk and slab info
getopt replacement
Author: Liu Xing <liuxing@cn.fujitsu.com>
Author: Michael Tokarev <mjt@corpit.ru>
Bug-Debian: http://bugs.debian.org/436805
Bug-Debian: http://bugs.debian.org/408088
Index: b/vmstat.c
===================================================================
--- a/vmstat.c 2009-11-24 20:53:00.000000000 +1100
+++ b/vmstat.c 2009-11-24 21:00:49.000000000 +1100
@@ -29,14 +29,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
@@ -354,6 +355,7 @@
if ((fDiskstat=fopen("/proc/diskstats", "rb"))){
fclose(fDiskstat);
ndisks=getdiskstat(&disks,&partitions);
+ if (!moreheaders) diskheader();
for(k=0; k<ndisks; k++){
if (moreheaders && ((k%height)==0)) diskheader();
printf(format,
@@ -424,6 +426,7 @@
return;
}
+ if (!moreheaders) slabheader();
nSlab = getslabinfo(&slabs);
for(k=0; k<nSlab; k++){
if (moreheaders && ((k%height)==0)) slabheader();
@@ -582,12 +585,10 @@
////////////////////////////////////////////////////////////////////////////
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);
@@ -603,7 +604,7 @@
fork_format();
exit(0);
case 'm':
- statMode |= SLABSTAT;
+ statMode |= SLABSTAT;
break;
case 'D':
statMode |= DISKSUMSTAT;
@@ -614,53 +615,40 @@
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;
+ statMode |= VMSUMSTAT;
break;
default:
/* no other aguments defined yet. */
usage();
- }
- }else{
- argc++;
- switch (argc) {
- case 1:
- if ((sleep_time = atoi(*argv)) == 0)
+ }
+
+ if (optind < argc) {
+ if ((sleep_time = atoi(argv[optind++])) == 0)
usage();
- num_updates = ULONG_MAX;
- break;
- case 2:
- num_updates = atol(*argv);
- break;
- default:
- usage();
- } /* switch */
+ 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);

View file

@ -0,0 +1,77 @@
Author: Daniel Novotny
Description: The contents of /proc/diskstats have changed since 2.6.25
Bug-Redhat: https://bugzilla.redhat.com/show_bug.cgi?id=485243
--- a/proc/sysinfo.c
+++ b/proc/sysinfo.c
@@ -796,6 +796,18 @@
}
/////////////////////////////////////////////////////////////////////////////
+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;
@@ -803,6 +815,7 @@
int cPartition = 0;
int fields;
unsigned dummy;
+ char devname[PATH_MAX];
*disks = NULL;
*partitions = NULL;
@@ -815,8 +828,9 @@
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",
//&disk_major,
@@ -839,7 +853,9 @@
}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,
--- a/proc/sysinfo.h
+++ b/proc/sysinfo.h
@@ -113,7 +113,7 @@
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);
--- a/vmstat.c
+++ b/vmstat.c
@@ -286,7 +286,7 @@
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){

View file

@ -0,0 +1,52 @@
Author: Michael Tokarev <mjt@tls.msk.ru>
Description: For vmstat only change units where it makes sense and try
to stop some overflows of some kernel variables
Bug-Debian: http://bugs.debian.org/558134
Bug-Debian: http://bugs.debian.org/558361
--- a/proc/sysinfo.c
+++ b/proc/sysinfo.c
@@ -606,7 +606,7 @@
);
head = tail+1;
if(!found) goto nextline;
- *(found->slot) = strtoul(head,&tail,10);
+ *(found->slot) = (unsigned long)strtoull(head,&tail,10);
nextline:
tail = strchr(head, '\n');
if(!tail) break;
--- a/vmstat.c
+++ b/vmstat.c
@@ -209,8 +209,8 @@
unitConvert(kb_swap_used), unitConvert(kb_main_free),
unitConvert(a_option?kb_inactive:kb_main_buffers),
unitConvert(a_option?kb_active:kb_main_cached),
- (unsigned)( (*pswpin * unitConvert(kb_per_page) * hz + divo2) / Div ),
- (unsigned)( (*pswpout * unitConvert(kb_per_page) * hz + divo2) / Div ),
+ (unsigned)( (*pswpin * kb_per_page * hz + divo2) / Div ),
+ (unsigned)( (*pswpout * kb_per_page * hz + divo2) / Div ),
(unsigned)( (*pgpgin * hz + divo2) / Div ),
(unsigned)( (*pgpgout * hz + divo2) / Div ),
(unsigned)( (*intr * hz + divo2) / Div ),
@@ -258,8 +258,8 @@
unitConvert(kb_swap_used),unitConvert(kb_main_free),
unitConvert(a_option?kb_inactive:kb_main_buffers),
unitConvert(a_option?kb_active:kb_main_cached),
- (unsigned)( ( (pswpin [tog] - pswpin [!tog])*unitConvert(kb_per_page)+sleep_half )/sleep_time ), /*si*/
- (unsigned)( ( (pswpout[tog] - pswpout[!tog])*unitConvert(kb_per_page)+sleep_half )/sleep_time ), /*so*/
+ (unsigned)( ( (pswpin [tog] - pswpin [!tog])*kb_per_page+sleep_half )/sleep_time ), /*si*/
+ (unsigned)( ( (pswpout[tog] - pswpout[!tog])*kb_per_page+sleep_half )/sleep_time ), /*so*/
(unsigned)( ( pgpgin [tog] - pgpgin [!tog] +sleep_half )/sleep_time ), /*bi*/
(unsigned)( ( pgpgout[tog] - pgpgout[!tog] +sleep_half )/sleep_time ), /*bo*/
(unsigned)( ( intr [tog] - intr [!tog] +sleep_half )/sleep_time ), /*in*/
--- a/vmstat.8
+++ b/vmstat.8
@@ -67,7 +67,8 @@
.PP
The \fB\-p\fP followed by some partition name for detailed statistics (2.5.70 or above required)
.PP
-The \fB\-S\fP followed by k or K or m or M switches outputs between 1000, 1024, 1000000, or 1048576 bytes
+The \fB\-S\fP followed by k or K or m or M switches changes the units of
+ouput from bytes to outputs between 1000, 1024, 1000000, or 1048576 bytes. Note this does not change the swap (si/so) or block (bi/bo) fields.
.PP
The \fB\-V\fP switch results in displaying version information.
.PP

View file

@ -0,0 +1,88 @@
Author: <csmall@debian.org>
Description: w-bassman emulation with -o flag
Bug-Debian: http://bugs.debian.org/414906
Index: b/w.1
===================================================================
--- a/w.1 2009-11-24 20:53:04.000000000 +1100
+++ b/w.1 2009-11-24 21:00:39.000000000 +1100
@@ -5,7 +5,7 @@
w \- Show who is logged on and what they are doing.
.SH SYNOPSIS
.B w \-
-.RB [ husfV ]
+.RB [ husfVo ]
.RI [ user ]
.SH DESCRIPTION
.B "w "
@@ -55,6 +55,9 @@
.B "\-V "
Display version information.
.TP 0.5i
+.B "\-o "
+Old style output. Prints blank space for idle times less than one minute.
+.TP 0.5i
.B "user "
Show information about the specified user only.
Index: b/w.c
===================================================================
--- a/w.c 2009-11-24 21:00:37.000000000 +1100
+++ b/w.c 2009-11-24 21:00:39.000000000 +1100
@@ -30,6 +30,7 @@
#include <termios.h>
static int ignoreuser = 0; /* for '-u' */
+static int oldstyle = 0; /* for '-o' */
static proc_t **procs; /* our snapshot of the process table */
typedef struct utmp utmp_t;
@@ -76,6 +77,16 @@
printf(" ? ");
return;
}
+ if (oldstyle) {
+ if (t >= 48*60*60) /* > 2 days */
+ fprintf(fout, " %2ludays", t/(24*60*60));
+ else if (t >= 60*60) /* > 1 hour */
+ fprintf(fout, " %2lu:%02u ", t/(60*60), (unsigned) ((t/60)%60));
+ else if (t > 60) /* > 1 minute */
+ fprintf(fout, " %2lu:%02um", t/60, (unsigned) t%60);
+ else
+ fprintf(fout, " ");
+ } else {
if (t >= 48*60*60) /* > 2 days */
fprintf(fout, " %2ludays", t/(24*60*60));
else if (t >= 60*60) /* > 1 hour */
@@ -84,6 +95,7 @@
fprintf(fout, " %2lu:%02u ", t/60, (unsigned) t%60);
else
fprintf(fout, " %2lu.%02us", t, centi_sec);
+ }
}
/**** stat the device file to get an idle time */
@@ -239,7 +251,7 @@
#endif
setlocale(LC_ALL, "");
- for (args=0; (ch = getopt(argc, argv, "hlusfV")) != EOF; args++)
+ for (args=0; (ch = getopt(argc, argv, "hlusfVo")) != EOF; args++)
switch (ch) {
case 'h': header = 0; break;
case 'l': longform = 1; break;
@@ -247,6 +259,7 @@
case 'f': from = !from; break;
case 'V': display_version(); exit(0);
case 'u': ignoreuser = 1; break;
+ case 'o': oldstyle = 1; break;
default:
printf("usage: w -hlsufV [user]\n"
" -h skip header\n"
@@ -254,6 +267,7 @@
" -s short listing\n"
" -u ignore uid of processes\n"
" -f toggle FROM field (default %s)\n"
+ " -o old-style output\n"
" -V display version\n", FROM_STRING);
exit(1);
}

View file

@ -0,0 +1,70 @@
Author: <csmall@debian.org>
Description: Cleaned up the w man page
Make note of the time formats
Bug-Debian: http://bugs.debian.org/414906
Index: b/w.1
===================================================================
--- a/w.1 2009-11-24 21:00:39.000000000 +1100
+++ b/w.1 2009-11-24 21:00:42.000000000 +1100
@@ -4,26 +4,26 @@
.SH NAME
w \- Show who is logged on and what they are doing.
.SH SYNOPSIS
-.B w \-
-.RB [ husfVo ]
+.B w
+.RB [ \-husfVo ]
.RI [ user ]
.SH DESCRIPTION
-.B "w "
+.B w
displays information about the users currently on the machine,
and their processes.
The header shows, in this order, the current time,
how long the system has been running,
how many users are currently logged on,
and the system load averages for the past 1, 5, and 15 minutes.
-.sp
+
The following entries are displayed for each user:
login name, the tty name, the remote host, login time, idle time, JCPU, PCPU,
and the command line of their current process.
-.sp
+
The JCPU time is the time used by all processes attached to the tty. It
does not include past background jobs, but does include currently
running background jobs.
-.sp
+
The PCPU time is the time used by the current process, named in the "what"
field.
@@ -35,7 +35,7 @@
.TP 0.5i
.B "\-u "
Ignores the username while figuring out the current process and cpu
-times. To demonstrate this, do a "su" and do a "w" and a "w -u".
+times. To demonstrate this, do a "su" and do a "w" and a "w \-u".
.TP 0.5i
.B "\-s "
Use the short format.
@@ -70,6 +70,19 @@
process information
.PP
+.SH NOTES
+The output for Idle, JCPU and PCPU times vaires depending on if you use
+the \-o (old style) option or not. These formats can be confusing if you
+switch between the old style and standard. In the following paragraphs
+days are DD, hours HH, minutes MM, seconds SS and 100ths of seconds CC.
+
+The standard format is DDdays, HH:MMm, MM:SS or SS.CC if the times are
+greater than 2 days, 1hour, or 1 minute respectively.
+
+For the \-o option, the output will be either DDdays, HH:MM, MM:SSm or
+blank if the times are greater than 2 days, 1 hour or 1 minute
+respectively.
+
.SH "SEE ALSO"
.BR free (1),
.BR ps (1),

View file

@ -0,0 +1,30 @@
Description: use COLUMNS environment if TIOCGWINSZ fails
Author: Craig Small <csmall@debian.org>
Index: b/w.c
===================================================================
--- a/w.c 2009-11-24 21:00:39.000000000 +1100
+++ b/w.c 2009-11-24 21:00:43.000000000 +1100
@@ -241,10 +241,10 @@
/***** main */
int main(int argc, char **argv) {
- char *user = NULL;
+ char *user = NULL, *p;
utmp_t *u;
struct winsize win;
- int header=1, longform=1, from=1, args, maxcmd=80, ch;
+ int header=1, longform=1, from=1, args, maxcmd, ch;
#ifndef W_SHOWFROM
from = 0;
@@ -277,6 +277,10 @@
if (ioctl(1, TIOCGWINSZ, &win) != -1 && win.ws_col > 0)
maxcmd = win.ws_col;
+ else if (p = getenv("COLUMNS"))
+ maxcmd = atoi(p);
+ else
+ maxcmd = 80;
if (maxcmd < 71) {
fprintf(stderr, "%d column window is too narrow\n", maxcmd);
exit(1);

View file

@ -0,0 +1,173 @@
Description: Use environment to set user and from/host column widths
Author: Craig Small <csmall@debian.org>
Bug-Debian: http://bugs.debian.org/396423
Bug-Debian: http://bugs.debian.org/341439
Index: b/w.1
===================================================================
--- a/w.1 2009-11-24 21:00:42.000000000 +1100
+++ b/w.1 2009-11-24 21:00:44.000000000 +1100
@@ -1,6 +1,6 @@
.\" -*-Nroff-*-
.\"
-.TH W 1 "8 Dec 1993 " " " "Linux User's Manual"
+.TH W 1 "5 October 2009 " " " "Linux User's Manual"
.SH NAME
w \- Show who is logged on and what they are doing.
.SH SYNOPSIS
@@ -61,6 +61,14 @@
.B "user "
Show information about the specified user only.
+.SH ENVIRONMENT
+.TP
+PROCPS_USERLEN
+Override the default width of the username column. Defaults to 8.
+.TP
+PROCPS_FROMLEN
+Override the default width of the from column. Defaults to 16.
+
.SH FILES
.TP
.I /var/run/utmp
Index: b/w.c
===================================================================
--- a/w.c 2009-11-24 21:00:43.000000000 +1100
+++ b/w.c 2009-11-24 21:00:44.000000000 +1100
@@ -44,20 +44,19 @@
/* Uh... same thing as UT_NAMESIZE */
#define USERSZ (sizeof u->ut_user)
+/* Arbitary setting, not too big for the screen, max host size */
+#define HOSTSZ 40
+
/* This routine is careful since some programs leave utmp strings
- * unprintable. Always outputs at least 16 chars padded with spaces
+ * unprintable. Always outputs at least fromlen chars padded with spaces
* on the right if necessary.
*/
-static void print_host(const char *restrict host, int len) {
+static void print_host(const char *restrict host, int len, const int fromlen) {
const char *last;
int width = 0;
- /* FIXME: there should really be a way to configure this... */
- /* for now, we'll just limit it to the 16 that the libc5 version
- * of utmp uses.
- */
- if (len > 16) len = 16;
+ if (len > fromlen) len = fromlen;
last = host + len;
for ( ; host < last ; host++){
if (isprint(*host) && *host != ' ') {
@@ -68,7 +67,8 @@
}
}
// space-fill, and a '-' too if needed to ensure the column exists
- if(width < 16) fputs("- "+width, stdout);
+ while(width++ < fromlen)
+ fputc(' ',stdout);
}
/***** compact 7 char format for time intervals (belongs in libproc?) */
@@ -180,7 +180,7 @@
/***** showinfo */
-static void showinfo(utmp_t *u, int formtype, int maxcmd, int from) {
+static void showinfo(utmp_t *u, int formtype, int maxcmd, int from, const int userlen, const int fromlen) {
unsigned long long jcpu;
int ut_pid_found;
unsigned i;
@@ -205,9 +205,9 @@
strncpy(uname, u->ut_user, USERSZ); /* force NUL term for printf */
if (formtype) {
- printf("%-9.8s%-9.8s", uname, u->ut_line);
+ printf("%-*.*s%-9.8s", userlen+1, userlen, uname, u->ut_line);
if (from)
- print_host(u->ut_host, sizeof u->ut_host);
+ print_host(u->ut_host, sizeof u->ut_host, fromlen);
print_logintime(u->ut_time, stdout);
if (*u->ut_line == ':') /* idle unknown for xdm logins */
printf(" ?xdm? ");
@@ -220,9 +220,9 @@
} else
printf(" ? ");
} else {
- printf("%-9.8s%-9.8s", u->ut_user, u->ut_line);
+ printf("%-*.*s%-9.8s", userlen+1, userlen, u->ut_user, u->ut_line);
if (from)
- print_host(u->ut_host, sizeof u->ut_host);
+ print_host(u->ut_host, sizeof u->ut_host, fromlen);
if (*u->ut_line == ':') /* idle unknown for xdm logins */
printf(" ?xdm? ");
else
@@ -245,6 +245,9 @@
utmp_t *u;
struct winsize win;
int header=1, longform=1, from=1, args, maxcmd, ch;
+ int userlen = 8;
+ int fromlen = 16;
+ char *env_var;
#ifndef W_SHOWFROM
from = 0;
@@ -275,6 +278,22 @@
if ((argv[optind]))
user = (argv[optind]);
+ /* Get user field length from environment */
+ if ( (env_var = getenv("PROCPS_USERLEN")) != NULL) {
+ userlen = atoi(env_var);
+ if (userlen < 8 || userlen > USERSZ) {
+ fprintf(stderr, "User length environment PROCPS_USERLEN must be between 8 and %d, ignoring.\n", USERSZ);
+ userlen=8;
+ }
+ }
+ /* Get from field length from environment */
+ if ( (env_var = getenv("PROCPS_FROMLEN")) != NULL) {
+ fromlen = atoi(env_var);
+ if (fromlen < 8 || fromlen > HOSTSZ) {
+ fprintf(stderr, "From length environment PROCPS_FROMLEN must be between 8 and %d, ignoring.\n", HOSTSZ);
+ fromlen=16;
+ }
+ }
if (ioctl(1, TIOCGWINSZ, &win) != -1 && win.ws_col > 0)
maxcmd = win.ws_col;
else if (p = getenv("COLUMNS"))
@@ -285,7 +304,7 @@
fprintf(stderr, "%d column window is too narrow\n", maxcmd);
exit(1);
}
- maxcmd -= 29 + (from ? 16 : 0) + (longform ? 20 : 0);
+ maxcmd -= 21 + userlen + (from ? fromlen : 0) + (longform ? 20 : 0);
if (maxcmd < 3)
fprintf(stderr, "warning: screen width %d suboptimal.\n", win.ws_col);
@@ -293,7 +312,7 @@
if (header) { /* print uptime and headers */
print_uptime();
- printf("USER TTY ");
+ printf("%-*s TTY ",userlen,"USER");
if (from)
printf("FROM ");
if (longform)
@@ -309,14 +328,14 @@
u = getutent();
if (unlikely(!u)) break;
if (u->ut_type != USER_PROCESS) continue;
- if (!strncmp(u->ut_user, user, USERSZ)) showinfo(u, longform, maxcmd, from);
+ if (!strncmp(u->ut_user, user, USERSZ)) showinfo(u, longform, maxcmd, from, userlen, fromlen);
}
} else {
for (;;) {
u = getutent();
if (unlikely(!u)) break;
if (u->ut_type != USER_PROCESS) continue;
- if (*u->ut_user) showinfo(u, longform, maxcmd, from);
+ if (*u->ut_user) showinfo(u, longform, maxcmd, from, userlen, fromlen);
}
}
endutent();

View file

@ -0,0 +1,16 @@
Description: Let fprintf print locale-friendly seconds
Author: Craig Small <csmall@debian.org>
Bug-Debian: http://bugs.debian.org/252575
Index: b/w.c
===================================================================
--- a/w.c 2009-11-24 20:53:04.000000000 +1100
+++ b/w.c 2009-11-24 21:00:37.000000000 +1100
@@ -83,7 +83,7 @@
else if (t > 60) /* > 1 minute */
fprintf(fout, " %2lu:%02u ", t/60, (unsigned) t%60);
else
- fprintf(fout, " %2lu.%02us", t, centi_sec);
+ fprintf(fout, " %2lu.%02us", t, centi_sec);
}
/**** stat the device file to get an idle time */

View file

@ -0,0 +1,15 @@
Description: Make w make better guesses for user process
Based on suggestion by Herbert Xu <herbert@gondor.apana.org.au>
Bug-Debian: http://bugs.debian.org/187808
Author: Craig Small <csmall@debian.org>
--- a/w.c
+++ b/w.c
@@ -171,7 +171,7 @@
secondbest = tmp;
}
if(!ignoreuser && uid != tmp->euid && uid != tmp->ruid) continue;
- if(tmp->tgid != tmp->tpgid) continue;
+ if(tmp->pgrp != tmp->tpgid) continue;
if(best && tmp->start_time <= best->start_time) continue;
best = tmp;
}

View file

@ -0,0 +1,103 @@
Description: Cleanup of manual page and cumulative is a parameter not option
Author: jidanni@jidanni.org
Bug-Debian: http://bugs.debian.org/527193
Reviewed-by: Craig Small <csmall@debian.org>
Index: b/watch.1
===================================================================
--- a/watch.1 2009-11-24 20:53:04.000000000 +1100
+++ b/watch.1 2009-11-24 21:00:36.000000000 +1100
@@ -1,45 +1,54 @@
-.TH WATCH 1 "1999 Apr 3" " " "Linux User's Manual"
+.TH WATCH 1 "2009 May 11" " " "Linux User's Manual"
.SH NAME
watch \- execute a program periodically, showing output fullscreen
.SH SYNOPSIS
+.na
.B watch
-.I [\-dhvt] [\-n <seconds>] [\-\-differences[=cumulative]] [\-\-help] [\-\-interval=<seconds>] [\-\-no\-title] [\-\-version] <command>
+.RB [ \-dhvt ]
+.RB [ \-n
+.IR seconds ]
+.RB [ \-\-differences[=\fIcumulative\fP]]
+.RB [ \-\-help ]
+.RB [ \-\-interval=\fIseconds\fP]
+.RB [ \-\-no\-title ]
+.RB [ \-\-version ]
+.I command
.SH DESCRIPTION
-.BR watch
+.B watch
runs
.I command
repeatedly, displaying its output (the first screenfull). This allows you to
watch the program output change over time. By default, the program is run
every 2 seconds; use
-.I -n
+.B \-n
or
-.I --interval
+.B \-\-interval
to specify a different interval.
.PP
The
-.I -d
+.B \-d
or
-.I --differences
-flag will highlight the differences between successive updates. The
-.I --cumulative
-option makes highlighting "sticky", presenting a running display of all
+.B \-\-differences
+flag will highlight the differences between successive updates. Using
+.B \-\-differences=\fIcumulative\fP
+makes highlighting "sticky", presenting a running display of all
positions that have ever changed. The
-.I -t
+.B \-t
or
-.I --no-title
+.B \-\-no\-title
option turns off the header showing the interval, command, and current
time at the top of the display, as well as the following blank line.
.PP
-.BR watch
+.B watch
will run until interrupted.
.SH NOTE
Note that
.I command
-is given to "sh -c"
+is given to "sh \-c"
which means that you may need to use extra quoting to get the desired effect.
.PP
Note that POSIX option processing is used (i.e., option processing stops at
-the first non-option argument). This means that flags after
+the first non\-option argument). This means that flags after
.I command
don't get interpreted by
.BR watch
@@ -61,20 +70,20 @@
To see the effects of quoting, try these out
.IP
watch echo $$
-.IP
+.br
watch echo '$$'
-.IP
+.br
watch echo "'"'$$'"'"
.PP
You can watch for your administrator to install the latest kernel with
.IP
-watch uname -r
+watch uname \-r
.PP
(Just kidding.)
.SH BUGS
Upon terminal resize, the screen will not be correctly repainted until the
next scheduled update. All
-.I --differences
+.B \-\-differences
highlighting is lost on that update as well.
.PP
Non-printing characters are stripped from program output. Use "cat -v" as

View file

@ -0,0 +1,15 @@
Author: <csmall@debian.org>
Description: Make watch unsigned chars and 8bit clean
Index: b/watch.c
===================================================================
--- a/watch.c 2009-11-24 20:53:03.000000000 +1100
+++ b/watch.c 2009-11-24 21:00:40.000000000 +1100
@@ -297,7 +297,7 @@
move(y, x);
if (option_differences) {
chtype oldch = inch();
- char oldc = oldch & A_CHARTEXT;
+ unsigned char oldc = oldch & A_CHARTEXT;
attr = !first_screen
&& ((char)c != oldc
||

View file

@ -0,0 +1,180 @@
Description: Interprets ANSI color code sequences
Bug-Debian: http://bugs.debian.org/129334
Author: Craig Small <csmall@debian.org>
Last-Update: 2010-03-01
--- a/watch.c
+++ b/watch.c
@@ -37,6 +37,7 @@
#endif
static struct option longopts[] = {
+ {"color", no_argument, 0, 'c' },
{"differences", optional_argument, 0, 'd'},
{"help", no_argument, 0, 'h'},
{"interval", required_argument, 0, 'n'},
@@ -50,7 +51,7 @@
};
static char usage[] =
- "Usage: %s [-bdhnptvx] [--beep] [--differences[=cumulative]] [--exec] [--help] [--interval=<n>] [--no-title] [--version] <command>\n";
+ "Usage: %s [-bcdhnptvx] [--beep] [--color] [--differences[=cumulative]] [--exec] [--help] [--interval=<n>] [--no-title] [--version] <command>\n";
static char *progname;
@@ -62,6 +63,74 @@
static int precise_timekeeping = 0;
#define min(x,y) ((x) > (y) ? (y) : (x))
+#define MAX_ANSIBUF 10
+
+static void init_ansi_colors(void)
+{
+ int i;
+ short ncurses_colors[] = {
+ COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW, COLOR_BLUE,
+ COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE };
+
+ for (i=0; i< 8; i++)
+ init_pair(i+1, ncurses_colors[i], -1);
+}
+
+static void set_ansi_attribute(const int attrib)
+{
+ switch (attrib)
+ {
+ case -1:
+ return;
+ case 0:
+ standend();
+ return;
+ case 1:
+ attrset(A_BOLD);
+ return;
+ }
+ if (attrib >= 30 && attrib <= 37) {
+ color_set(attrib-29,NULL);
+ return;
+ }
+}
+
+static void process_ansi(FILE *fp)
+{
+ int i,c, num1, num2;
+ char buf[MAX_ANSIBUF];
+ char *nextnum;
+
+
+ c= getc(fp);
+ if (c != '[') {
+ ungetc(c, fp);
+ return;
+ }
+ for(i=0; i<MAX_ANSIBUF; i++)
+ {
+ c = getc(fp);
+ if (c == 'm') //COLOUR SEQUENCE ENDS in 'm'
+ {
+ buf[i] = '\0';
+ break;
+ }
+ if (c < '0' && c > '9' && c != ';')
+ {
+ while(--i >= 0)
+ ungetc(buf[i],fp);
+ return;
+ }
+ buf[i] = (char)c;
+ }
+ num1 = strtol(buf, &nextnum, 10);
+ if (nextnum != buf && nextnum[0] != '\0')
+ num2 = strtol(nextnum+1, NULL, 10);
+ else
+ num2 = -1;
+ set_ansi_attribute(num1);
+ set_ansi_attribute(num2);
+}
static void do_usage(void) NORETURN;
static void do_usage(void)
@@ -187,6 +256,7 @@
option_differences_cumulative = 0,
option_exec = 0,
option_beep = 0,
+ option_color = 0,
option_errexit = 0,
option_help = 0, option_version = 0;
double interval = 2;
@@ -205,12 +275,15 @@
setlocale(LC_ALL, "");
progname = argv[0];
- while ((optc = getopt_long(argc, argv, "+bed::hn:pvtx", longopts, (int *) 0))
+ while ((optc = getopt_long(argc, argv, "+bced::hn:pvtx", longopts, (int *) 0))
!= EOF) {
switch (optc) {
case 'b':
option_beep = 1;
break;
+ case 'c':
+ option_color = 1;
+ break;
case 'd':
option_differences = 1;
if (optarg)
@@ -319,6 +392,14 @@
/* Set up tty for curses use. */
curses_started = 1;
initscr();
+ if (option_color) {
+ if (has_colors()) {
+ start_color();
+ use_default_colors();
+ init_ansi_colors();
+ } else
+ option_color = 0;
+ }
nonl();
noecho();
cbreak();
@@ -460,7 +541,13 @@
}while (c != WEOF && !isprint(c) && c<128
&& wcwidth(c) == 0
&& c != L'\n'
- && c != L'\t');
+ && c != L'\t'
+ && (c != L'\033' || option_color != 1));
+ if (c == L'\033' && option_color == 1) {
+ x--;
+ process_ansi(p);
+ continue;
+ }
if (c == L'\n')
if (!oldeolseen && x == 0) {
x = -1;
--- a/watch.1
+++ b/watch.1
@@ -1,4 +1,4 @@
-.TH WATCH 1 "2009 May 11" " " "Linux User's Manual"
+.TH WATCH 1 "2010 Mar 01" " " "Linux User's Manual"
.SH NAME
watch \- execute a program periodically, showing output fullscreen
.SH SYNOPSIS
@@ -8,6 +8,7 @@
.RB [ \-n
.IR seconds ]
.RB [ \-\-beep ]
+.RB [ \-\-color ]
.RB [ \-\-differences[=\fIcumulative\fP]]
.RB [ \-\-errexit ]
.RB [ \-\-exec ]
@@ -75,6 +76,10 @@
options, which will cause
.B watch
to exit if the return value from the program is non-zero.
+.PP
+By default \fBwatch\fR will normally not pass escape characters, however
+if you use the \fI\-\-c\fR or \fI\-\-color\fR option, then
+\fBwatch\fR will interpret ANSI color sequences for the foreground.
.SH NOTE
Note that

View file

@ -0,0 +1,259 @@
Description: Adds -exec and -beep flags and has better quoting #410967
Adds -errexit flag now too #183346
Author: Mordechai T. Abzug <morty@frakir.org>
Bug-Debian: http://bugs.debian.org/410967
Bug-Debian: http://bugs.debian.org/183346
Reviewed-by: Craig Small <csmall@debian.org>
Index: b/watch.1
===================================================================
--- a/watch.1 2009-11-24 21:00:36.000000000 +1100
+++ b/watch.1 2009-11-24 21:00:43.000000000 +1100
@@ -4,10 +4,13 @@
.SH SYNOPSIS
.na
.B watch
-.RB [ \-dhvt ]
+.RB [ \-bdehvtx ]
.RB [ \-n
.IR seconds ]
+.RB [ \-\-beep ]
.RB [ \-\-differences[=\fIcumulative\fP]]
+.RB [ \-\-errexit ]
+.RB [ \-\-exec ]
.RB [ \-\-help ]
.RB [ \-\-interval=\fIseconds\fP]
.RB [ \-\-no\-title ]
@@ -17,7 +20,8 @@
.B watch
runs
.I command
-repeatedly, displaying its output (the first screenfull). This allows you to
+repeatedly, displaying its output and errors (the first screenfull). This
+allows you to
watch the program output change over time. By default, the program is run
every 2 seconds; use
.B \-n
@@ -37,15 +41,33 @@
or
.B \-\-no\-title
option turns off the header showing the interval, command, and current
-time at the top of the display, as well as the following blank line.
+time at the top of the display, as well as the following blank line. The
+.I \-b
+or
+.I \-\-beep
+option causes the command to beep if it has a non-zero exit.
.PP
.B watch
-will run until interrupted.
+will normally run until interrupted. If you want
+.B watch
+to exit on an error from the program running use the
+.I \-e
+or
+.I \-\-errexit
+options, which will cause
+.B watch
+to exit if the return value from the program is non-zero.
+
.SH NOTE
Note that
.I command
is given to "sh \-c"
which means that you may need to use extra quoting to get the desired effect.
+You can disable this with the
+.I -x
+or
+.I --exec
+option, which passes the command to exec(2) instead.
.PP
Note that POSIX option processing is used (i.e., option processing stops at
the first non\-option argument). This means that flags after
@@ -93,4 +115,5 @@
.B watch
was written by Tony Rems <rembo@unisoft.com> in 1991, with mods and
corrections by Francois Pinard. It was reworked and new features added by
-Mike Coleman <mkc@acm.org> in 1999.
+Mike Coleman <mkc@acm.org> in 1999. The beep, exec, and error handling
+features were added by Morty Abzug <morty@frakir.org> in 2008.
Index: b/watch.c
===================================================================
--- a/watch.c 2009-11-24 21:00:40.000000000 +1100
+++ b/watch.c 2009-11-24 21:00:43.000000000 +1100
@@ -8,6 +8,7 @@
* Mike Coleman <mkc@acm.org>.
*
* Changes by Albert Cahalan, 2002-2003.
+ * stderr handling, exec, and beep option added by Morty Abzug, 2008
*/
#define VERSION "0.2.0"
@@ -35,13 +36,16 @@
{"differences", optional_argument, 0, 'd'},
{"help", no_argument, 0, 'h'},
{"interval", required_argument, 0, 'n'},
+ {"beep", no_argument, 0, 'b'},
+ {"errexit", no_argument, 0, 'e'},
+ {"exec", no_argument, 0, 'x'},
{"no-title", no_argument, 0, 't'},
{"version", no_argument, 0, 'v'},
{0, 0, 0, 0}
};
static char usage[] =
- "Usage: %s [-dhntv] [--differences[=cumulative]] [--help] [--interval=<n>] [--no-title] [--version] <command>\n";
+ "Usage: %s [-bdhntvx] [--beep] [--differences[=cumulative]] [--exec] [--help] [--interval=<n>] [--no-title] [--version] <command>\n";
static char *progname;
@@ -140,28 +144,44 @@
int optc;
int option_differences = 0,
option_differences_cumulative = 0,
+ option_exec = 0,
+ option_beep = 0,
+ option_errexit = 0,
option_help = 0, option_version = 0;
double interval = 2;
char *command;
+ char **command_argv;
int command_length = 0; /* not including final \0 */
+ int pipefd[2];
+ int status;
+ pid_t child;
setlocale(LC_ALL, "");
progname = argv[0];
- while ((optc = getopt_long(argc, argv, "+d::hn:vt", longopts, (int *) 0))
+ while ((optc = getopt_long(argc, argv, "+bed::hn:vtx", longopts, (int *) 0))
!= EOF) {
switch (optc) {
+ case 'b':
+ option_beep = 1;
+ break;
case 'd':
option_differences = 1;
if (optarg)
option_differences_cumulative = 1;
break;
+ case 'e':
+ option_errexit = 1;
+ break;
case 'h':
option_help = 1;
break;
case 't':
show_title = 0;
break;
+ case 'x':
+ option_exec = 1;
+ break;
case 'n':
{
char *str;
@@ -191,18 +211,23 @@
if (option_help) {
fprintf(stderr, usage, progname);
+ fputs(" -b, --beep\t\t\t\tbeep if the command has a non-zero exit\n", stderr);
fputs(" -d, --differences[=cumulative]\thighlight changes between updates\n", stderr);
fputs("\t\t(cumulative means highlighting is cumulative)\n", stderr);
+ fputs(" -e, --errexit\t\t\t\texit watch if the command has a non-zero exit\n", stderr);
fputs(" -h, --help\t\t\t\tprint a summary of the options\n", stderr);
fputs(" -n, --interval=<seconds>\t\tseconds to wait between updates\n", stderr);
fputs(" -v, --version\t\t\t\tprint the version number\n", stderr);
fputs(" -t, --no-title\t\t\tturns off showing the header\n", stderr);
+ fputs(" -x, --exec\t\t\t\tpass command to exec instead of sh\n", stderr);
exit(0);
}
if (optind >= argc)
do_usage();
+ command_argv=&(argv[optind]); /* save for later */
+
command = strdup(argv[optind++]);
command_length = strlen(command);
for (; optind < argc; optind++) {
@@ -261,11 +286,57 @@
free(header);
}
- if (!(p = popen(command, "r"))) {
- perror("popen");
+ /* allocate pipes */
+ if (pipe(pipefd)<0) {
+ perror("pipe");
+ do_exit(7);
+ }
+
+ /* flush stdout and stderr, since we're about to do fd stuff */
+ fflush(stdout);
+ fflush(stderr);
+
+ /* fork to prepare to run command */
+ child=fork();
+
+ if (child<0) { /* fork error */
+ perror("fork");
do_exit(2);
+ } else if (child==0) { /* in child */
+ close (pipefd[0]); /* child doesn't need read side of pipe */
+ close (1); /* prepare to replace stdout with pipe */
+ if (dup2 (pipefd[1], 1)<0) { /* replace stdout with write side of pipe */
+ perror("dup2");
+ exit(3);
+ }
+ dup2(1, 2); /* stderr should default to stdout */
+
+ if (option_exec) { /* pass command to exec instead of system */
+ if (execvp(command_argv[0], command_argv)==-1) {
+ perror("exec");
+ exit(4);
+ }
+ } else {
+ status=system(command); /* watch manpage promises sh quoting */
+
+ /* propagate command exit status as child exit status */
+ if (!WIFEXITED(status)) { /* child exits nonzero if command does */
+ exit(1);
+ } else {
+ exit(WEXITSTATUS(status));
+ }
+ }
+
+ }
+
+ /* otherwise, we're in parent */
+ close(pipefd[1]); /* close write side of pipe */
+ if ((p=fdopen(pipefd[0], "r"))==NULL) {
+ perror("fdopen");
+ do_exit(5);
}
+
for (y = show_title; y < height; y++) {
int eolseen = 0, tabpending = 0;
for (x = 0; x < width; x++) {
@@ -313,7 +384,19 @@
oldeolseen = eolseen;
}
- pclose(p);
+ fclose(p);
+
+ /* harvest child process and get status, propagated from command */
+ if (waitpid(child, &status, 0)<0) {
+ perror("waitpid");
+ do_exit(8);
+ };
+
+ /* if child process exited in error, beep if option_beep is set */
+ if ((!WIFEXITED(status) || WEXITSTATUS(status))) {
+ if (option_beep) beep();
+ if (option_errexit) do_exit(8);
+ }
first_screen = 0;
refresh();

View file

@ -0,0 +1,216 @@
Description: Add precision wait time option -p
Author: Anthony DeRobertis <asd@suespammers.org>
Bug-Debian: http://bugs.debian.org/183486
Reviewed-by: Craig Small <csmall@debian.org>
Index: b/watch.1
===================================================================
--- a/watch.1 2009-11-24 21:00:43.000000000 +1100
+++ b/watch.1 2009-11-24 21:00:46.000000000 +1100
@@ -4,7 +4,7 @@
.SH SYNOPSIS
.na
.B watch
-.RB [ \-bdehvtx ]
+.RB [ \-bdehpvtx ]
.RB [ \-n
.IR seconds ]
.RB [ \-\-beep ]
@@ -14,6 +14,7 @@
.RB [ \-\-help ]
.RB [ \-\-interval=\fIseconds\fP]
.RB [ \-\-no\-title ]
+.RB [ \-\-precise ]
.RB [ \-\-version ]
.I command
.SH DESCRIPTION
@@ -27,7 +28,24 @@
.B \-n
or
.B \-\-interval
-to specify a different interval.
+to specify a different interval. Normally, this interval is interpreted
+as the amout of time between the completion of one run of
+.I command
+and the beginning of the next run. However, with the
+.I \-p
+or
+.I \-\-precise
+option, you can make
+.BR watch
+attempt to run
+.I command
+every
+.I interval
+seconds. Try it with
+.B ntptime
+and notice how the fractional seconds stays
+(nearly) the same, as opposed to normal mode where they continuously
+increase.
.PP
The
.B \-d
@@ -97,11 +115,21 @@
.br
watch echo "'"'$$'"'"
.PP
+To see the effect of precision time keeping, try adding
+.I \-p
+to
+.IP
+watch \-n 10 sleep 1
+.PP
You can watch for your administrator to install the latest kernel with
.IP
watch uname \-r
.PP
-(Just kidding.)
+(Note that
+.I \-p
+isn't guaranteed to work across reboots, especially in the face of
+.B ntpdate
+or other bootup time-changing mechanisms)
.SH BUGS
Upon terminal resize, the screen will not be correctly repainted until the
next scheduled update. All
@@ -110,6 +138,22 @@
.PP
Non-printing characters are stripped from program output. Use "cat -v" as
part of the command pipeline if you want to see them.
+.PP
+.I \-\-precise
+mode doesn't yet have advanced temporal distortion technology to
+compensate for a
+.I command
+that takes more than
+.I interval
+seconds to execute.
+.B watch
+also can get into a state where it rapid-fires as many executions of
+.I command
+as it can to catch up from a previous executions running longer than
+.I interval
+(for example,
+.B netstat
+taking ages on a DNS lookup).
.SH AUTHORS
The original
.B watch
@@ -117,3 +161,7 @@
corrections by Francois Pinard. It was reworked and new features added by
Mike Coleman <mkc@acm.org> in 1999. The beep, exec, and error handling
features were added by Morty Abzug <morty@frakir.org> in 2008.
+On a not so dark and stormy morning
+in March of 2003, Anthony DeRobertis <asd@suespammers.org> got sick of
+his watches that should update every minute eventually updating many
+seconds after the minute started, and added microsecond precision.
Index: b/watch.c
===================================================================
--- a/watch.c 2009-11-24 21:00:43.000000000 +1100
+++ b/watch.c 2009-11-24 21:00:46.000000000 +1100
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
+#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <termios.h>
@@ -39,13 +40,14 @@
{"beep", no_argument, 0, 'b'},
{"errexit", no_argument, 0, 'e'},
{"exec", no_argument, 0, 'x'},
+ {"precise", no_argument, 0, 'p'},
{"no-title", no_argument, 0, 't'},
{"version", no_argument, 0, 'v'},
{0, 0, 0, 0}
};
static char usage[] =
- "Usage: %s [-bdhntvx] [--beep] [--differences[=cumulative]] [--exec] [--help] [--interval=<n>] [--no-title] [--version] <command>\n";
+ "Usage: %s [-bdhnptvx] [--beep] [--differences[=cumulative]] [--exec] [--help] [--interval=<n>] [--no-title] [--version] <command>\n";
static char *progname;
@@ -54,6 +56,7 @@
static int screen_size_changed = 0;
static int first_screen = 1;
static int show_title = 2; // number of lines used, 2 or 0
+static int precise_timekeeping = 0;
#define min(x,y) ((x) > (y) ? (y) : (x))
@@ -138,6 +141,15 @@
}
}
+/* get current time in usec */
+typedef unsigned long long watch_usec_t;
+#define USECS_PER_SEC (1000000ull)
+watch_usec_t get_time_usec() {
+ struct timeval now;
+ gettimeofday(&now, NULL);
+ return USECS_PER_SEC*now.tv_sec + now.tv_usec;
+}
+
int
main(int argc, char *argv[])
{
@@ -152,6 +164,8 @@
char *command;
char **command_argv;
int command_length = 0; /* not including final \0 */
+ watch_usec_t next_loop; /* next loop time in us, used for precise time
+ keeping only */
int pipefd[2];
int status;
pid_t child;
@@ -159,7 +173,7 @@
setlocale(LC_ALL, "");
progname = argv[0];
- while ((optc = getopt_long(argc, argv, "+bed::hn:vtx", longopts, (int *) 0))
+ while ((optc = getopt_long(argc, argv, "+bed::hn:pvtx", longopts, (int *) 0))
!= EOF) {
switch (optc) {
case 'b':
@@ -194,6 +208,9 @@
interval = ~0u/1000000;
}
break;
+ case 'p':
+ precise_timekeeping = 1;
+ break;
case 'v':
option_version = 1;
break;
@@ -217,6 +234,7 @@
fputs(" -e, --errexit\t\t\t\texit watch if the command has a non-zero exit\n", stderr);
fputs(" -h, --help\t\t\t\tprint a summary of the options\n", stderr);
fputs(" -n, --interval=<seconds>\t\tseconds to wait between updates\n", stderr);
+ fputs(" -p, --precise\t\t\t\tprecise timing, ignore command run time\n", stderr);
fputs(" -v, --version\t\t\t\tprint the version number\n", stderr);
fputs(" -t, --no-title\t\t\tturns off showing the header\n", stderr);
fputs(" -x, --exec\t\t\t\tpass command to exec instead of sh\n", stderr);
@@ -256,6 +274,9 @@
noecho();
cbreak();
+ if (precise_timekeeping)
+ next_loop = get_time_usec();
+
for (;;) {
time_t t = time(NULL);
char *ts = ctime(&t);
@@ -400,6 +421,12 @@
first_screen = 0;
refresh();
+ if (precise_timekeeping) {
+ watch_usec_t cur_time = get_time_usec();
+ next_loop += USECS_PER_SEC*interval;
+ if (cur_time < next_loop)
+ usleep(next_loop - cur_time);
+ } else
usleep(interval * 1000000);
}

View file

@ -0,0 +1,292 @@
Description: Unicode/8bit for watch
Bug-Debian: http://bugs.debian.org/240989
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/procps/+bug/318221
Author: Jarrod Lowe <ubuntu@rrod.net>
--- a/AUTHORS
+++ b/AUTHORS
@@ -47,4 +47,5 @@
watch:
Tony Rems <rembo@unisoft.com>
Mike Coleman <mkc@acm.org>
+Jarrod Lowe <procps@rrod.net>
--- a/Makefile
+++ b/Makefile
@@ -68,6 +68,7 @@
_TARFILES := Makefile
CURSES := -lncurses
+CURSESW := -lncursesw
# This seems about right for the dynamic library stuff.
# Something like this is probably needed to make the SE Linux
@@ -119,7 +120,7 @@
# Unlike the kernel one, this check_gcc goes all the way to
# producing an executable. There might be a -m64 that works
# until you go looking for a 64-bit curses library.
-check_gcc = $(shell if $(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) dummy.c $(ALL_LDFLAGS) $(1) -o /dev/null $(CURSES) > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
+check_gcc = $(shell if $(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) dummy.c $(ALL_LDFLAGS) $(1) -o /dev/null $(CURSES) $(CURSESW) > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
# Be 64-bit if at all possible. In a cross-compiling situation, one may
# do "make m64=-m32 lib64=lib" to produce 32-bit executables. DO NOT
@@ -250,7 +251,7 @@
$(CC) $(ALL_CFLAGS) $^ $(ALL_LDFLAGS) -o $@ $(CURSES)
watch: % : %.o
- $(CC) $(ALL_CFLAGS) $^ $(ALL_LDFLAGS) -o $@ $(CURSES)
+ $(CC) $(ALL_CFLAGS) $^ $(ALL_LDFLAGS) -o $@ $(CURSESW)
############ progX --> progY
--- a/watch.1
+++ b/watch.1
@@ -139,6 +139,17 @@
Non-printing characters are stripped from program output. Use "cat -v" as
part of the command pipeline if you want to see them.
.PP
+Combining Characters that are supposed to display on the character at the
+last column on the screen may display one column early, or they may not
+display at all.
+.PP
+Combining Characters never count as different in
+.I \-\-differences
+mode. Only the base character counts.
+.PP
+Blank lines directly after a line which ends in the last column do not
+display.
+.PP
.I \-\-precise
mode doesn't yet have advanced temporal distortion technology to
compensate for a
@@ -165,3 +176,4 @@
in March of 2003, Anthony DeRobertis <asd@suespammers.org> got sick of
his watches that should update every minute eventually updating many
seconds after the minute started, and added microsecond precision.
+Unicode support was added in 2009 by Jarrod Lowe <procps@rrod.net>.
--- a/watch.c
+++ b/watch.c
@@ -9,14 +9,16 @@
*
* Changes by Albert Cahalan, 2002-2003.
* stderr handling, exec, and beep option added by Morty Abzug, 2008
+ * Unicode Support added by Jarrod Lowe <procps@rrod.net> in 2009.
*/
-#define VERSION "0.2.0"
+#define VERSION "0.3.0"
+#include <wchar.h>
#include <ctype.h>
#include <getopt.h>
#include <signal.h>
-#include <ncurses.h>
+#include <ncursesw/ncurses.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -27,6 +29,7 @@
#include <termios.h>
#include <locale.h>
#include "proc/procps.h"
+#include <errno.h>
#ifdef FORCE_8BIT
#undef isprint
@@ -150,6 +153,32 @@
return USECS_PER_SEC*now.tv_sec + now.tv_usec;
}
+// read a wide character from a popen'd stream
+#define MAX_ENC_BYTES 16
+wint_t my_getwc(FILE *s);
+wint_t my_getwc(FILE *s) {
+ char i[MAX_ENC_BYTES]; //assuming no encoding ever consumes more than 16 bytes
+ int byte = 0;
+ int convert;
+ int x;
+ wchar_t rval;
+ while(1) {
+ i[byte] = getc(s);
+ if (i[byte]==EOF) { return WEOF; }
+ byte++;
+ errno = 0;
+ mbtowc(NULL, NULL, 0);
+ convert = mbtowc(&rval, i, byte);
+ x = errno;
+ if(convert > 0) { return rval; } //legal conversion
+ if(byte == MAX_ENC_BYTES) {
+ while(byte > 1) { ungetc(i[--byte], s); } //at least *try* to fix up
+ errno = -EILSEQ;
+ return WEOF;
+ }
+ }
+}
+
int
main(int argc, char *argv[])
{
@@ -162,8 +191,11 @@
option_help = 0, option_version = 0;
double interval = 2;
char *command;
+ wchar_t *wcommand = NULL;
char **command_argv;
int command_length = 0; /* not including final \0 */
+ int wcommand_columns = 0; /* not including final \0 */
+ int wcommand_characters = 0; /* not including final \0 */
watch_usec_t next_loop; /* next loop time in us, used for precise time
keeping only */
int pipefd[2];
@@ -259,6 +291,23 @@
command[command_length] = '\0';
}
+ // convert to wide for printing purposes
+ //mbstowcs(NULL, NULL, 0);
+ wcommand_characters = mbstowcs(NULL, command, 0);
+ if(wcommand_characters < 0) {
+ fprintf(stderr, "Unicode Handling Error\n");
+ exit(1);
+ }
+ wcommand = (wchar_t*)malloc((wcommand_characters+1) * sizeof(wcommand));
+ if(wcommand == NULL) {
+ fprintf(stderr, "Unicode Handling Error (malloc)\n");
+ exit(1);
+ }
+ mbstowcs(wcommand, command, wcommand_characters+1);
+ wcommand_columns = wcswidth(wcommand, -1);
+
+
+
get_terminal_size();
/* Catch keyboard interrupts so we can put tty back in a sane state. */
@@ -298,12 +347,44 @@
if (show_title) {
// left justify interval and command,
// right justify time, clipping all to fit window width
- asprintf(&header, "Every %.1fs: %.*s",
- interval, min(width - 1, command_length), command);
- mvaddstr(0, 0, header);
- if (strlen(header) > (size_t) (width - tsl - 1))
- mvaddstr(0, width - tsl - 4, "... ");
- mvaddstr(0, width - tsl + 1, ts);
+
+ int hlen = asprintf(&header, "Every %.1fs: ", interval);
+
+ // the rules:
+ // width < tsl : print nothing
+ // width < tsl + hlen + 1: print ts
+ // width = tsl + hlen + 1: print header, ts
+ // width < tsl + hlen + 4: print header, ..., ts
+ // width < tsl + hlen + wcommand_columns: print header, truncated wcommand, ..., ts
+ // width > "": print header, wcomand, ts
+ // this is slightly different from how it used to be
+ if(width >= tsl) {
+ if(width >= tsl + hlen + 1) {
+ mvaddstr(0, 0, header);
+ if(width >= tsl + hlen + 2) {
+ if(width < tsl + hlen + 4) {
+ mvaddstr(0, width - tsl - 4, "... ");
+ }else{
+ if(width < tsl + hlen + wcommand_columns) {
+ // print truncated
+ int avail_columns = width - tsl - hlen;
+ int using_columns = wcommand_columns;
+ int using_characters = wcommand_characters;
+ while(using_columns > avail_columns - 4) {
+ using_characters--;
+ using_columns = wcswidth(wcommand, using_characters);
+ }
+ mvaddnwstr(0, hlen, wcommand, using_characters);
+ mvaddstr(0, width - tsl - 4, "... ");
+ }else{
+ mvaddwstr(0, hlen, wcommand);
+ }
+ }
+ }
+ }
+ mvaddstr(0, width - tsl + 1, ts);
+ }
+
free(header);
}
@@ -360,47 +441,62 @@
for (y = show_title; y < height; y++) {
int eolseen = 0, tabpending = 0;
+ wint_t carry = WEOF;
for (x = 0; x < width; x++) {
- int c = ' ';
+ wint_t c = L' ';
int attr = 0;
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')
+ do {
+ if(carry == WEOF) {
+ c = my_getwc(p);
+ }else{
+ c = carry;
+ carry = WEOF;
+ }
+ }while (c != WEOF && !isprint(c) && c<128
+ && wcwidth(c) == 0
+ && 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 (x==width-1 && wcwidth(c)==2) {
+ y++;
+ x = -1; //process this double-width
+ carry = c; //character on the next line
+ continue; //because it won't fit here
+ }
+ if (c == WEOF || c == L'\n' || c == L'\t')
+ c = L' ';
if (tabpending && (((x + 1) % 8) == 0))
tabpending = 0;
}
move(y, x);
if (option_differences) {
- chtype oldch = inch();
- unsigned char oldc = oldch & A_CHARTEXT;
+ cchar_t oldc;
+ in_wch(&oldc);
attr = !first_screen
- && ((char)c != oldc
+ && ((wchar_t)c != oldc.chars[0]
||
(option_differences_cumulative
- && (oldch & A_ATTRIBUTES)));
+ && (oldc.attr & A_ATTRIBUTES)));
}
if (attr)
standout();
- addch(c);
+ addnwstr((wchar_t*)&c,1);
if (attr)
standend();
+ if(wcwidth(c) == 0) { x--; }
+ if(wcwidth(c) == 2) { x++; }
}
oldeolseen = eolseen;
}

View file

@ -1,8 +1,9 @@
# Template file for 'procps' # Template file for 'procps'
pkgname=procps pkgname=procps
version=3.2.8 version=3.2.8
revision=2 revision=4
distfiles="http://procps.sf.net/$pkgname-$version.tar.gz" distfiles="http://procps.sf.net/$pkgname-$version.tar.gz"
patch_args="-Np1"
build_style=gnu_makefile build_style=gnu_makefile
short_desc="The /proc file system utilities" short_desc="The /proc file system utilities"
maintainer="Juan RP <xtraeme@gmail.com>" maintainer="Juan RP <xtraeme@gmail.com>"
@ -16,5 +17,10 @@ long_desc="
performance improvements, and new features." performance improvements, and new features."
Add_dependency run glibc Add_dependency run glibc
Add_dependency run ncurses-libs Add_dependency run ncursesw
Add_dependency build ncurses-devel Add_dependency build ncursesw-devel
pre_build()
{
sed -i -e "s|-lncurses$|-lncursesw|g" ${wrksrc}/Makefile
}