]> granicus.if.org Git - procps-ng/commitdiff
Put most of the Debian patches in
authorcsmall <>
Fri, 1 Feb 2002 23:40:38 +0000 (23:40 +0000)
committercsmall <>
Fri, 1 Feb 2002 23:40:38 +0000 (23:40 +0000)
added a lot of cvsignore files

15 files changed:
.cvsignore [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
oldps.c
pgrep.c
proc/.cvsignore [new file with mode: 0644]
proc/devname.c
proc/readproc.c
proc/sysinfo.c
proc/whattime.c
ps/.cvsignore [new file with mode: 0644]
ps/.cvsignore.patch [deleted file]
top.c
uptime.c
w.c
watch.c

diff --git a/.cvsignore b/.cvsignore
new file mode 100644 (file)
index 0000000..0db5681
--- /dev/null
@@ -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 (file)
index 0000000..ed2f269
--- /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 <davey*AT*vision.doa.org>)
+
+       Put most of the Debian diffs in.
+
+
diff --git a/oldps.c b/oldps.c
index 2ed865f334e3dd1c85065da3fdcd3e5b034be064..716d26e3991a504b89d557a6a66d38538086f823 100644 (file)
--- 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 91f6a3a5dd26aa18a196638577daa11c641f799f..7c0a252630eceead6909eaed44185b51deaa2f73 100644 (file)
--- 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 (file)
index 0000000..a83d75f
--- /dev/null
@@ -0,0 +1,2 @@
+libproc.so*
+*.o
index 0a2520d909d5dff2150a8470895c7de2b2827a7b..09b5d2f1aedfd48629ef02086a66a06e04ab4835 100644 (file)
@@ -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++;
index 21a3996e080eba412c748e47b5c4ce7e4f2aeb73..54392381880054e365832b00a1a741d7d7f8921f 100644 (file)
@@ -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;
 
index fbb14daf3c7470e1de4ea7ed7d58009b77e89aea..aa0d208cfb6ad713165f781aef6910678ea57ff9 100644 (file)
@@ -12,6 +12,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
+#include <locale.h>
 
 #include <unistd.h>
 #include <fcntl.h>
@@ -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);
index 61e2601399cb9734e86a67a8fa1fc228634c1a87..80eb743cfaa5b1b0dc965966682a00dc62b77831 100644 (file)
@@ -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 (file)
index 0000000..7fe6c1b
--- /dev/null
@@ -0,0 +1,3 @@
+p
+ps
+*.o
diff --git a/ps/.cvsignore.patch b/ps/.cvsignore.patch
deleted file mode 100644 (file)
index 7c386a2..0000000
+++ /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 848bf9b1ae7cddf7f2e5ad760a36f23ee2df07aa..2faaf0cfbc40c857f28b4b2a17bcf05bd0f2c8d0 100644 (file)
--- a/top.c
+++ b/top.c
 #include <setjmp.h>
 #include <stdarg.h>
 #include <sys/param.h>
+#include <locale.h>
 
 #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));
     }
index e63621efcd5e13324381e8992f6d40f17984b46f..662feea7d23bd7fb980c1d96aacbd57a3fb546c6 100644 (file)
--- a/uptime.c
+++ b/uptime.c
@@ -1,9 +1,17 @@
+#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;
 }
diff --git a/w.c b/w.c
index e847d8697f81697c86506be426fd9f6412828c9f..47d7f1296e6d34fc9e83e967ee4f9bdb9b722385 100644 (file)
--- 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 cd8ac4ea59eb3b881cccee2877f45191f7e5182f..6aa932830c0d970a05df6c26509575fac2fdea55 100644 (file)
--- a/watch.c
+++ b/watch.c
@@ -21,7 +21,7 @@
 #include <sys/ioctl.h>
 #include <time.h>
 #include <unistd.h>
-
+#include <locale.h>
 
 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<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();
@@ -208,10 +214,10 @@ main(int argc, char *argv[])
       /* 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);
 
@@ -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;