From e4c67b272475448d8b2a60a4bd816a5bd0f0303b Mon Sep 17 00:00:00 2001 From: csmall <> Date: Fri, 1 Feb 2002 23:40:38 +0000 Subject: [PATCH] Put most of the Debian patches in added a lot of cvsignore files --- .cvsignore | 18 ++++++ ChangeLog | 11 ++++ oldps.c | 5 +- pgrep.c | 4 +- proc/.cvsignore | 2 + proc/devname.c | 66 +++++++++++++++------ proc/readproc.c | 4 +- proc/sysinfo.c | 31 ++++++++-- proc/whattime.c | 5 +- ps/.cvsignore | 3 + ps/.cvsignore.patch | 5 -- top.c | 136 +++++++++++++++++++++++++------------------- uptime.c | 14 ++++- w.c | 10 +--- watch.c | 38 ++++++++----- 15 files changed, 235 insertions(+), 117 deletions(-) create mode 100644 .cvsignore create mode 100644 ChangeLog create mode 100644 proc/.cvsignore create mode 100644 ps/.cvsignore delete mode 100644 ps/.cvsignore.patch diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 00000000..0db56811 --- /dev/null +++ b/.cvsignore @@ -0,0 +1,18 @@ +*.o +free +kill +oldps +pgrep +pkill +proc +ps +skill +snice +sysctl +t +tload +top +uptime +vmstat +w +watch diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 00000000..ed2f2695 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,11 @@ +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 ) + + Put most of the Debian diffs in. + + diff --git a/oldps.c b/oldps.c index 2ed865f3..716d26e3 100644 --- a/oldps.c +++ b/oldps.c @@ -209,6 +209,8 @@ int main(int argc, char **argv) { } } 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. */ @@ -425,7 +427,8 @@ static void show_jobs(char *s, proc_t *p) { /*****************************/ 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; diff --git a/pgrep.c b/pgrep.c index 91f6a3a5..7c0a2526 100644 --- a/pgrep.c +++ b/pgrep.c @@ -70,9 +70,9 @@ static int 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"); diff --git a/proc/.cvsignore b/proc/.cvsignore new file mode 100644 index 00000000..a83d75f8 --- /dev/null +++ b/proc/.cvsignore @@ -0,0 +1,2 @@ +libproc.so* +*.o diff --git a/proc/devname.c b/proc/devname.c index 0a2520d9..09b5d2f1 100644 --- a/proc/devname.c +++ b/proc/devname.c @@ -33,7 +33,9 @@ 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; @@ -46,25 +48,46 @@ static void load_drivers(void){ 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); @@ -80,11 +103,19 @@ static int driver_name(char * const buf, int maj, int min){ 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; @@ -170,10 +201,10 @@ int dev_to_tty(char *ret, int chop, int dev, int pid, unsigned int flags) { 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; @@ -181,7 +212,10 @@ abbrev: 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++; diff --git a/proc/readproc.c b/proc/readproc.c index 21a3996e..54392381 100644 --- a/proc/readproc.c +++ b/proc/readproc.c @@ -300,7 +300,7 @@ static char** file2strvec(char* directory, char* what) { 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; @@ -400,7 +400,7 @@ next_proc: /* get next PID for consideration */ 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; diff --git a/proc/sysinfo.c b/proc/sysinfo.c index fbb14daf..aa0d208c 100644 --- a/proc/sysinfo.c +++ b/proc/sysinfo.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -68,12 +69,17 @@ static char buf[1024]; /***********************************************************************/ 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 */ @@ -109,8 +115,12 @@ static void init_Hertz_value(void){ 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); */ @@ -119,6 +129,7 @@ static void init_Hertz_value(void){ 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 ); @@ -132,10 +143,16 @@ static void init_Hertz_value(void){ 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 @@ -194,12 +211,16 @@ void four_cpu_numbers(double *uret, double *nret, double *sret, double *iret){ /***********************************************************************/ 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); diff --git a/proc/whattime.c b/proc/whattime.c index 61e26013..80eb743c 100644 --- a/proc/whattime.c +++ b/proc/whattime.c @@ -40,9 +40,8 @@ char *sprint_uptime(void) { 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 */ diff --git a/ps/.cvsignore b/ps/.cvsignore new file mode 100644 index 00000000..7fe6c1b3 --- /dev/null +++ b/ps/.cvsignore @@ -0,0 +1,3 @@ +p +ps +*.o diff --git a/ps/.cvsignore.patch b/ps/.cvsignore.patch deleted file mode 100644 index 7c386a25..00000000 --- a/ps/.cvsignore.patch +++ /dev/null @@ -1,5 +0,0 @@ -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 diff --git a/top.c b/top.c index 848bf9b1..2faaf0cf 100644 --- a/top.c +++ b/top.c @@ -101,6 +101,7 @@ #include #include #include +#include #include "proc/sysinfo.h" #include "proc/procps.h" @@ -235,39 +236,50 @@ static void get_options(void) { 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); } @@ -722,6 +734,7 @@ static float getfloat(void) char *line; int i; float r; + char *savelocale; line = getstr(); @@ -736,7 +749,10 @@ static float getfloat(void) 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); } @@ -1625,45 +1641,49 @@ static void do_key(char c) 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)); } diff --git a/uptime.c b/uptime.c index e63621ef..662feea7 100644 --- a/uptime.c +++ b/uptime.c @@ -1,9 +1,17 @@ +#include #include #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; } diff --git a/w.c b/w.c index e847d869..47d7f129 100644 --- a/w.c +++ b/w.c @@ -104,8 +104,6 @@ static void print_logintime(time_t logt, FILE* fout) { "Aug", "Sep", "Oct", "Nov", "Dec" }; time_t curt; struct tm *logtm, *curtm; - int hour; - char *merid; /* meridian indicator */ int today; curt = time(NULL); @@ -113,18 +111,14 @@ static void print_logintime(time_t logt, FILE* fout) { /* 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); } } diff --git a/watch.c b/watch.c index cd8ac4ea..6aa93283 100644 --- a/watch.c +++ b/watch.c @@ -21,7 +21,7 @@ #include #include #include - +#include static struct option longopts[] = { @@ -105,7 +105,10 @@ main(int argc, char *argv[]) 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)) @@ -123,9 +126,9 @@ main(int argc, char *argv[]) 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; @@ -159,16 +162,19 @@ main(int argc, char *argv[]) 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 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); @@ -238,6 +244,10 @@ main(int argc, char *argv[]) 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;