--- /dev/null
+*.o
+free
+kill
+oldps
+pgrep
+pkill
+proc
+ps
+skill
+snice
+sysctl
+t
+tload
+top
+uptime
+vmstat
+w
+watch
--- /dev/null
+Version ????
+
+ /proc/tty/drivers correctly parsed. Debian #108654
+ (Thanks russell*AT*coker.com.au)
+
+ oldps doesn't FPE because of no shared mem Debian #101917
+ (Thanks David Murn <davey*AT*vision.doa.org>)
+
+ Put most of the Debian diffs in.
+
+
}
} while (argc > 1);
+ meminfo();
+
if (!CL_sort) /* since the unsorted mode is intended to be speedy */
CL_forest = 0; /* turn off the expensive forest option as well. */
/*****************************/
static void show_user(char *s, proc_t *p) {
- long pmem, total_time, seconds;
+ long pmem, total_time;
+ long long seconds;
time_t start;
unsigned int pcpu;
usage (int opt)
{
if (i_am_pkill)
- fprintf (stderr, "Usage: pgrep [-flnvx] [-d DELIM] ");
- else
fprintf (stderr, "Usage: pkill [-SIGNAL] [-fnvx] ");
+ else
+ fprintf (stderr, "Usage: pgrep [-flnvx] [-d DELIM] ");
fprintf (stderr, "[-P PPIDLIST] [-g PGRPLIST] [-s SIDLIST]\n"
"\t[-u EUIDLIST] [-U UIDLIST] [-G GIDLIST] [-t TERMLIST] "
"[PATTERN]\n");
--- /dev/null
+libproc.so*
+*.o
typedef struct tty_map_node {
struct tty_map_node *next;
int major_number; /* not unsigned! Ugh... */
- char name[4];
+ int minor_first, minor_last;
+ char name[16];
+ char devfs_type;
} tty_map_node;
static tty_map_node *tty_map = NULL;
int bytes;
fd = open("/proc/tty/drivers",O_RDONLY);
if(fd == -1) goto fail;
- bytes = read(fd, buf, 9999);
+ bytes = read(fd, buf, sizeof(buf) - 1);
if(bytes == -1) goto fail;
buf[bytes] = '\0';
p = buf;
- while(( p = strstr(p, " /dev/tty") )){
+ while(( p = strstr(p, " /dev/") )){
tty_map_node *tmn;
int len;
- p += 9;
- len = strspn(p, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
- if(!len) continue;
- if(len>3) continue;
- if((len=1) && (*p=='S')) continue;
- tmn = malloc(sizeof(tty_map_node));
+ char *end;
+ int rc;
+ p += 6;
+ end = strchr(p, ' ');
+ if(!end) continue;
+ len = end - p;
+ tmn = calloc(1, sizeof(tty_map_node));
tmn->next = tty_map;
tty_map = tmn;
- memset(tmn->name, '\0', 4);
+ /* if we have a devfs type name such as /dev/tts/%d then strip the %d but
+ keep a flag. */
+ if(len >= 3 && !strncmp(end - 2, "%d", 2))
+ {
+ len -= 2;
+ tmn->devfs_type = 1;
+ }
strncpy(tmn->name, p, len);
- p += len;
+ p = end; /* set p to point past the %d as well if there is one */
+ while(*p == ' ') p++;
tmn->major_number = atoi(p);
+ p += strspn(p, "0123456789");
+ while(*p == ' ') p++;
+ rc = sscanf(p, "%d-%d", &tmn->minor_first, &tmn->minor_last);
+ if(rc == 1)
+ {
+ tmn->minor_last = tmn->minor_first;
+ }
+ else if(rc == 0)
+ {
+ /* Can't finish parsing this line so we remove it from the list */
+ tty_map = tty_map->next;
+ free(tmn);
+ }
}
fail:
if(fd != -1) close(fd);
tmn = tty_map;
for(;;){
if(!tmn) return 0;
- if(tmn->major_number == maj) break;
+ if(tmn->major_number == maj && tmn->minor_first <= min && tmn->minor_last >= min) break;
tmn = tmn->next;
}
- sprintf(buf, "/dev/tty%s%d", tmn->name, min); /* like "/dev/ttyZZ255" */
- if(stat(buf, &sbuf) < 0) return 0;
+ sprintf(buf, "/dev/%s%d", tmn->name, min); /* like "/dev/ttyZZ255" */
+ if(tmn->devfs_type)
+ {
+ if(stat(buf, &sbuf) < 0) return 0;
+ }
+ else if(stat(buf, &sbuf) < 0)
+ {
+ sprintf(buf, "/dev/%s", tmn->name); /* like "/dev/ttyZZ255" */
+ if(stat(buf, &sbuf) < 0) return 0;
+ }
if(min != minor(sbuf.st_rdev)) return 0;
if(maj != major(sbuf.st_rdev)) return 0;
return 1;
int c;
if((short)dev == (short)-1) goto fail;
if( link_name(tmp, major(dev), minor(dev), pid, "tty" )) goto abbrev;
+ if(driver_name(tmp, major(dev), minor(dev) )) goto abbrev;
if( link_name(tmp, major(dev), minor(dev), pid, "fd/2" )) goto abbrev;
if( guess_name(tmp, major(dev), minor(dev) )) goto abbrev;
if( link_name(tmp, major(dev), minor(dev), pid, "fd/255")) goto abbrev;
- if(driver_name(tmp, major(dev), minor(dev) )) goto abbrev;
fail:
strcpy(ret, "?");
return 1;
if((flags&ABBREV_DEV) && !strncmp(tmp,"/dev/",5) && tmp[5]) tmp += 5;
if((flags&ABBREV_TTY) && !strncmp(tmp,"tty", 3) && tmp[3]) tmp += 3;
if((flags&ABBREV_PTS) && !strncmp(tmp,"pts/", 4) && tmp[4]) tmp += 4;
- tmp[chop] = '\0';
+ /* gotta check before we chop or we may chop someone else's memory */
+ if(tmp + chop - buf <= PAGE_SIZE)
+ tmp[chop] = '\0';
+ /* replace non-ASCII characters with '?' and return the number of chars */
for(;;){
c = *tmp;
tmp++;
proc_t* readproc(PROCTAB* PT, proc_t* rbuf) {
static struct direct *ent; /* dirent handle */
static struct stat sb; /* stat buffer */
- static char path[32], sbuf[512]; /* bufs for stat,statm */
+ static char path[32], sbuf[1024]; /* bufs for stat,statm */
int allocated = 0, matched = 0; /* flags */
proc_t *p = NULL;
proc_t* ps_readproc(PROCTAB* PT, proc_t* rbuf) {
static struct direct *ent; /* dirent handle */
static struct stat sb; /* stat buffer */
- static char path[32], sbuf[512]; /* bufs for stat,statm */
+ static char path[32], sbuf[1024]; /* bufs for stat,statm */
int allocated = 0 /* , matched = 0 */ ; /* flags */
proc_t *p = NULL;
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
+#include <locale.h>
#include <unistd.h>
#include <fcntl.h>
/***********************************************************************/
int uptime(double *uptime_secs, double *idle_secs) {
double up=0, idle=0;
+ char *savelocale;
FILE_TO_BUF(UPTIME_FILE,uptime_fd);
+ savelocale = setlocale(LC_NUMERIC, NULL);
+ setlocale(LC_NUMERIC,"C");
if (sscanf(buf, "%lf %lf", &up, &idle) < 2) {
- fprintf(stderr, "bad data in " UPTIME_FILE "\n");
- return 0;
+ setlocale(LC_NUMERIC,savelocale);
+ fprintf(stderr, "bad data in " UPTIME_FILE "\n");
+ return 0;
}
+ setlocale(LC_NUMERIC,savelocale);
SET_IF_DESIRED(uptime_secs, up);
SET_IF_DESIRED(idle_secs, idle);
return up; /* assume never be zero seconds in practice */
unsigned long user_j, nice_j, sys_j, other_j; /* jiffies (clock ticks) */
double up_1, up_2, seconds;
unsigned long jiffies, h;
+ char *savelocale;
+
smp_num_cpus = sysconf(_SC_NPROCESSORS_CONF);
- if(smp_num_cpus==-1) smp_num_cpus=1;
+ if(smp_num_cpus<1) smp_num_cpus=1;
+ 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(UPTIME_FILE,uptime_fd); sscanf(buf, "%lf", &up_2);
/* uptime(&up_2, NULL); */
} while((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;
seconds = (up_1 + up_2) / 2;
h = (unsigned long)( (double)jiffies/seconds/smp_num_cpus );
case 124 ... 132 : Hertz = 128; break; /* MIPS, ARM */
case 195 ... 204 : Hertz = 200; break; /* normal << 1 */
case 253 ... 260 : Hertz = 256; break;
+ case 295 ... 304 : Hertz = 300; break; /* 3 cpus */
case 393 ... 408 : Hertz = 400; break; /* normal << 2 */
+ case 495 ... 504 : Hertz = 500; break; /* 5 cpus */
+ case 595 ... 604 : Hertz = 600; break; /* 6 cpus */
+ case 695 ... 704 : Hertz = 700; break; /* 7 cpus */
case 790 ... 808 : Hertz = 800; break; /* normal << 3 */
+ case 895 ... 904 : Hertz = 900; break; /* 9 cpus */
case 990 ... 1010 : Hertz = 1000; break; /* ARM */
case 1015 ... 1035 : Hertz = 1024; break; /* Alpha, ia64 */
+ case 1095 ... 1104 : Hertz = 1100; break; /* 11 cpus */
case 1180 ... 1220 : Hertz = 1200; break; /* Alpha */
default:
#ifdef HZ
/***********************************************************************/
void loadavg(double *av1, double *av5, double *av15) {
double avg_1=0, avg_5=0, avg_15=0;
+ char *savelocale;
FILE_TO_BUF(LOADAVG_FILE,loadavg_fd);
+ savelocale = setlocale(LC_NUMERIC, NULL);
+ setlocale(LC_NUMERIC, "C");
if (sscanf(buf, "%lf %lf %lf", &avg_1, &avg_5, &avg_15) < 3) {
- fprintf(stderr, "bad data in " LOADAVG_FILE "\n");
- exit(1);
+ fprintf(stderr, "bad data in " LOADAVG_FILE "\n");
+ exit(1);
}
+ setlocale(LC_NUMERIC, savelocale);
SET_IF_DESIRED(av1, avg_1);
SET_IF_DESIRED(av5, avg_5);
SET_IF_DESIRED(av15, avg_15);
time(&realseconds);
realtime = localtime(&realseconds);
- pos = sprintf(buf, " %2d:%02d%s ",
- realtime->tm_hour%12 ? realtime->tm_hour%12 : 12,
- realtime->tm_min, realtime->tm_hour > 11 ? "pm" : "am");
+ pos = sprintf(buf, " %02d:%02d:%02d ",
+ realtime->tm_hour, realtime->tm_min, realtime->tm_sec);
/* read and calculate the amount of uptime */
--- /dev/null
+p
+ps
+*.o
+++ /dev/null
-diff -Naur procps-2.0.6/ps/.cvsignore procps-2.0.7/ps/.cvsignore
---- procps-2.0.6/ps/.cvsignore Wed Dec 31 19:00:00 1969
-+++ procps-2.0.7/ps/.cvsignore Fri Jul 14 16:45:01 2000
-@@ -0,0 +1 @@
-+ps
#include <setjmp.h>
#include <stdarg.h>
#include <sys/param.h>
+#include <locale.h>
#include "proc/sysinfo.h"
#include "proc/procps.h"
{
FILE *fp;
char *pt;
- char rcfile[MAXNAMELEN];
+ char *rcfile = NULL; /* path to rc file... */
+ char *home = NULL; /* path of user's home directory... */
+ size_t home_length = 0; /* length of path... */
char Options[256] = "";
int i;
nr_cpu = sysconf (_SC_NPROCESSORS_ONLN);
+ if (nr_cpu < 1) nr_cpu = 1;
cpu_mapping = (int *) xmalloc (sizeof (int) * nr_cpu);
/* read cpuname */
for (i=0; i< nr_cpu; i++) cpu_mapping[i]=i;
header_lines = 6 + nr_cpu;
- strcpy(rcfile, SYS_TOPRC);
- fp = fopen(rcfile, "r");
+ fp = fopen(SYS_TOPRC, "r");
if (fp != NULL) {
fgets(Options, 254, fp);
fclose(fp);
}
parse_options(Options, 0);
strcpy(Options, "");
- if (getenv("HOME")) {
- strcpy(rcfile, getenv("HOME"));
- strcat(rcfile, "/");
- }
- strcat(rcfile, RCFILE);
- fp = fopen(rcfile, "r");
- if (fp == NULL) {
- strcpy(Fields, DEFAULT_SHOW);
- } else {
- if (fgets(Fields, 254, fp) != NULL) {
- pt = strchr(Fields, '\n');
- if (pt) *pt = 0;
- }
- fgets(Options, 254, fp);
- fclose(fp);
+
+ if ( (home = getenv("HOME")) != NULL) {
+ home_length = strlen(home);
}
+
+ if ( (rcfile = malloc(home_length + strlen(RCFILE) + 2))) {
+ if (home != NULL) {
+ strcpy(rcfile, home);
+ strcat(rcfile, "/");
+ }
+ strcat(rcfile, RCFILE);
+ fp = fopen(rcfile, "r");
+ if (fp == NULL) {
+ strcpy(Fields, DEFAULT_SHOW);
+ } else {
+ if (fgets(Fields, 254, fp) != NULL) {
+ pt = strchr(Fields, '\n');
+ if (pt) *pt = 0;
+ }
+ fgets(Options, 254, fp);
+ fclose(fp);
+ }
+
+ free(rcfile);
+ }
parse_options(Options, getuid()? Secure : 0);
}
char *line;
int i;
float r;
+ char *savelocale;
line = getstr();
if (!line[0])
return (BAD_INPUT);
- sscanf(line, "%f", &r);
+ savelocale = setlocale(LC_NUMERIC, NULL);
+ setlocale(LC_NUMERIC, "C");
+ sscanf(line, "%f", &r);
+ setlocale(LC_NUMERIC, savelocale);
return (r);
}
change_order();
break;
case 'W':
- if (getenv("HOME")) {
- strcpy(rcfile, getenv("HOME"));
- strcat(rcfile, "/");
- strcat(rcfile, RCFILE);
- fp = fopen(rcfile, "w");
- if (fp != NULL) {
- fprintf(fp, "%s\n", Fields);
- i = (int) Sleeptime;
- if (i < 2)
- i = 2;
- if (i > 9)
- i = 9;
- fprintf(fp, "%d", i);
- if (Secure)
- fprintf(fp, "%c", 's');
- if (Cumulative)
- fprintf(fp, "%c", 'S');
- if (!show_cmd)
- fprintf(fp, "%c", 'c');
- if (Noidle)
- fprintf(fp, "%c", 'i');
- if (!show_memory)
- fprintf(fp, "%c", 'm');
- if (!show_loadav)
- fprintf(fp, "%c", 'l');
- if (!show_stats)
- fprintf(fp, "%c", 't');
- if (!Irixmode)
- fprintf(fp, "%c", 'I');
- fprintf(fp, "\n");
- fclose(fp);
- SHOWMESSAGE(("Wrote configuration to %s", rcfile));
- } else {
- SHOWMESSAGE(("Couldn't open %s", rcfile));
- }
- } else {
- SHOWMESSAGE(("Couldn't get $HOME -- not saving"));
- }
- break;
+ if (Secure)
+ SHOWMESSAGE(("\aCan't write configuration in secure mode"));
+ else {
+ if (getenv("HOME")) {
+ strcpy(rcfile, getenv("HOME"));
+ strcat(rcfile, "/");
+ strcat(rcfile, RCFILE);
+ fp = fopen(rcfile, "w");
+ if (fp != NULL) {
+ fprintf(fp, "%s\n", Fields);
+ i = (int) Sleeptime;
+ if (i < 2)
+ i = 2;
+ if (i > 9)
+ i = 9;
+ fprintf(fp, "%d", i);
+ if (Secure)
+ fprintf(fp, "%c", 's');
+ if (Cumulative)
+ fprintf(fp, "%c", 'S');
+ if (!show_cmd)
+ fprintf(fp, "%c", 'c');
+ if (Noidle)
+ fprintf(fp, "%c", 'i');
+ if (!show_memory)
+ fprintf(fp, "%c", 'm');
+ if (!show_loadav)
+ fprintf(fp, "%c", 'l');
+ if (!show_stats)
+ fprintf(fp, "%c", 't');
+ if (!Irixmode)
+ fprintf(fp, "%c", 'I');
+ fprintf(fp, "\n");
+ fclose(fp);
+ SHOWMESSAGE(("Wrote configuration to %s", rcfile));
+ } else {
+ SHOWMESSAGE(("Couldn't open %s", rcfile));
+ }
+ } else {
+ SHOWMESSAGE(("Couldn't get $HOME -- not saving"));
+ }
+ }
+ break;
default:
SHOWMESSAGE(("\aUnknown command `%c' -- hit `h' for help", c));
}
+#include <stdio.h>
#include <string.h>
#include "proc/whattime.h"
#include "proc/version.h"
int main(int argc, char *argv[]) {
- if(argc == 1) print_uptime();
- if((argc == 2) && (!strcmp(argv[1], "-V"))) display_version();
- return 0;
+ if(argc == 1) {
+ print_uptime();
+ return 0;
+ }
+ if((argc == 2) && (!strcmp(argv[1], "-V"))) {
+ display_version();
+ return 0;
+ }
+ fprintf(stderr, "usage: w -V\n -V display version\n");
+ return 1;
}
"Aug", "Sep", "Oct", "Nov", "Dec" };
time_t curt;
struct tm *logtm, *curtm;
- int hour;
- char *merid; /* meridian indicator */
int today;
curt = time(NULL);
/* localtime returns a pointer to static memory */
today = curtm->tm_yday;
logtm = localtime(&logt);
- hour = logtm->tm_hour;
- merid = (hour < 12) ? "am" : "pm";
- if (hour >= 12) hour -= 12;
- if (hour == 0) hour = 12;
if (curt - logt > 12*60*60 && logtm->tm_yday != today) {
if (curt - logt > 6*24*60*60)
fprintf(fout, " %02d%3s%02d", logtm->tm_mday, month[logtm->tm_mon],
logtm->tm_year % 100);
else
- fprintf(fout, " %3s%02d%s", weekday[logtm->tm_wday], hour, merid);
+ fprintf(fout, " %3s%02d ", weekday[logtm->tm_wday], logtm->tm_hour);
} else {
- fprintf(fout, " %02d:%02d%s", hour, logtm->tm_min, merid);
+ fprintf(fout, " %02d:%02d ", logtm->tm_hour, logtm->tm_min);
}
}
#include <sys/ioctl.h>
#include <time.h>
#include <unistd.h>
-
+#include <locale.h>
static struct option longopts[] =
{
int interval=2;
char *command;
int command_length=0; /* not including final \0 */
+ int s;
+ char *endp;
+ setlocale(LC_ALL,"");
progname = argv[0];
while ((optc = getopt_long(argc, argv, "+d::hn:v", longopts, (int *) 0))
break;
case 'n':
{
- char *s;
- interval = strtol(optarg, &s, 10);
- if (!*optarg || *s)
+ char *str;
+ interval = strtol(optarg, &str, 10);
+ if (!*optarg || *str)
do_usage();
}
break;
if (optind >= argc)
do_usage();
- command = strdup(argv[optind++]);
- command_length = strlen(command);
+ command_length = strlen(argv[optind]);
+ command = (char*)malloc(command_length + 1); /* space or \0 */
+ memcpy(command, argv[optind++], command_length);
+ command[command_length] = '\0';
for (;optind<argc;optind++)
{
- int s = strlen(argv[optind]);
- char *endp = &command[command_length];
+ s = strlen(argv[optind]);
+ command = realloc(command, command_length+s+2); /* space and \0 */
+ endp = command + command_length;
*endp = ' ';
- command_length += s + 1;
- command = realloc(command, command_length+1);
- strcpy(endp+1, argv[optind]);
+ memcpy(endp+1, argv[optind],s);
+ command_length += 1+s; /* space then string length */
+ command[command_length] = '\0';
}
get_terminal_size();
/* left justify interval and command, right justify time, clipping all
to fit window width */
asprintf(&header, "Every %ds: %.*s",
- interval, max(width-1, command_length), command);
+ interval, min(width-1, command_length), command);
mvaddstr(0, 0, header);
- if (strlen(header) > width - tsl - 1)
- mvaddstr(0, width - tsl - 4, "... ");
+ if (strlen(header) > (size_t)(width - tsl - 1))
+ mvaddstr(0, width - tsl - 4, "... ");
mvaddstr(0, width - tsl + 1, ts);
free(header);
c = getc(p);
while (c != EOF && !isprint(c) && c != '\n' && c != '\t');
if (c == '\n')
+ if (x == 0) {
+ x=-1;
+ continue;
+ } else
eolseen = 1;
else if (c == '\t')
tabpending = 1;