Removed dependencies on scanf unless it's really needed, as it's huge.
authorDavid Given <dg@cowlark.com>
Sun, 15 Mar 2015 14:06:06 +0000 (15:06 +0100)
committerDavid Given <dg@cowlark.com>
Sun, 15 Mar 2015 14:06:06 +0000 (15:06 +0100)
--HG--
extra : source : 738e62d4775321d341419dcf34d82f71889040b7

Applications/util/df.c
Applications/util/mknod.c
Applications/util/mount.c
Applications/util/ssh.c
Applications/util/umount.c
Applications/util/uud.c

index 5a5ad0d..074b605 100644 (file)
@@ -6,6 +6,9 @@
 #include <dirent.h>
 #include <errno.h>
 
+/* Assumed length of a line in /etc/mtab */
+#define MTAB_LINE 160
+
 const char *devname(dev_t);
 const char *mntpoint(const char *);
 void df_path(const char *path);
@@ -116,13 +119,15 @@ void df_dev(dev_t dev)
 void df_all(void)
 {
     FILE *f;
-    static char tmp[256];
-    static char dev[20], mntpt[20], fstype[20], rwflag[20];
+       char tmp[MTAB_LINE];
+       char* dev;
+       char* mntpt;
     
     f = fopen("/etc/mtab", "r");
     if (f) {
-        while (fgets(tmp, 256, f)) {
-            sscanf(tmp, "%s %s %s %s\n", dev, mntpt, fstype, rwflag);
+        while (fgets(tmp, sizeof(MTAB_LINE), f)) {
+                       dev = strtok(tmp, " ");
+                       mntpt = strtok(NULL, " ");
             df_path(mntpt);
         }
         fclose(f);
@@ -164,16 +169,18 @@ const char *devname(dev_t devno)
 const char *mntpoint(const char *devname)
 {
     FILE *f;
-    static char tmp[256];
-    static char dev[20], mntpt[20], fstype[20], rwflag[20];
+       char tmp[MTAB_LINE];
+       char* dev;
+       char* mntpt;
     
     f = fopen("/etc/mtab", "r");
     if (f) {
-        while (fgets(tmp, 256, f)) {
-            sscanf(tmp, "%s %s %s %s\n", dev, mntpt, fstype, rwflag);
+        while (fgets(tmp, sizeof(tmp), f)) {
+                       dev = strtok(tmp, " ");
+                       mntpt = strtok(NULL, " ");
             if (strcmp(dev, devname) == 0) {
                 fclose(f);
-                return mntpt;
+                return strdup(mntpt);
             }
         }
         fclose(f);
index 97a0794..bacdd3c 100644 (file)
@@ -2,15 +2,25 @@
 #include <stdlib.h>
 #include <sys/stat.h>
 
+static long parse_number(const char* p, int base)
+{
+       char* end;
+       unsigned long result;
+       
+       errno = 0;
+       result = strtoul(p, &end, base);
+       if (errno || *end)
+               return -1;
+       return result;
+}
 
 int do_mknod(char *path, char *modes, char *devs)
 {
     int mode;
     int dev;
 
-    mode = -1;
-    sscanf(modes, "%o", &mode);
-    if (mode == -1) {
+       mode = parse_number(modes, 8);
+    if (mode < 0) {
         printf("mknod: bad mode\n");
         return (-1);
     }
@@ -20,7 +30,8 @@ int do_mknod(char *path, char *modes, char *devs)
         return (-1);
     }
 
-    if (sscanf(devs, "%d", &dev) != 1) {
+       dev = parse_number(devs, 10);
+       if (dev < 0) {
         printf("mknod: bad device\n");
         return (-1);
     }
index 72e4693..01b6c16 100644 (file)
@@ -2,18 +2,25 @@
 #include <string.h>
 #include <stdlib.h>
 
-
-char tmp[256];
+/* Assumed length of a line in /etc/mtab */
+#define MTAB_LINE 160
 
 int lsmtab(void)
 {
     FILE *f;
-    static char dev[20], mntpt[20], fstype[20], rwflag[20];
+       char tmp[MTAB_LINE];
+       char* dev;
+       char* mntpt;
+       char* fstype;
+       char* rwflag;
     
     f = fopen("/etc/mtab", "r");
     if (f) {
-        while (fgets(tmp, 256, f)) {
-            sscanf(tmp, "%s %s %s %s\n", dev, mntpt, fstype, rwflag);
+        while (fgets(tmp, sizeof(tmp), f)) {
+                       dev = strtok(tmp, " ");
+                       mntpt = strtok(NULL, " ");
+                       fstype = strtok(NULL, " ");
+                       rwflag = strtok(NULL, "\n");
             if (strcmp(fstype, "swap") == 0)
                 printf("%s is swapspace\n", dev);
             else
@@ -30,6 +37,7 @@ int add2mtab(char *dev, char *mntpt, char *fstype, char *rwflag)
 {
     FILE *inpf, *outf;
     char *tmp_fname;
+       int c;
 
     if ((tmp_fname = tmpnam(NULL)) == NULL) {
         perror("Error getting temporary file name");
@@ -42,8 +50,11 @@ int add2mtab(char *dev, char *mntpt, char *fstype, char *rwflag)
         exit(1);
     }
     if (inpf) {
-        while (fgets(tmp, 255, inpf)) {
-            fprintf(outf, "%s", tmp);
+               for (;;) {
+                       c = fgetc(inpf);
+                       if (c == EOF)
+                               break;
+                       fputc(c, outf);
         }
         fclose(inpf);
     }
@@ -60,7 +71,7 @@ int add2mtab(char *dev, char *mntpt, char *fstype, char *rwflag)
     return 0;
 }
 
-main(int argc, char *argv[])
+int main(int argc, char *argv[])
 {
     if (argc == 1) {
         lsmtab();
index 4bb8307..3cb6edf 100644 (file)
@@ -12,6 +12,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <signal.h>
 #include <unistd.h>
 
 extern char **environ;      /* Location of Envp from executable Header */
@@ -21,16 +22,16 @@ extern char **environ;      /* Location of Envp from executable Header */
 char buf[128];
 char eline[45];                    /* Line for Search command */
 
-char cmd[50], arg[MAX_ARGS][50];
-
+char* cmd;
+char* arg[MAX_ARGS];
 
 int main(int argc, char *argval[])
 {
     char  *path, *tp, *sp;     /* Pointers for Path Searching */
-    int   login_sh, pid, sig, stat, count, asis, i;
+    int   login_sh, pid, sig, stat, asis, i;
     char  cprompt;
     char  *home;
-    char  *argv[MAX_ARGS+1];
+    const char  *argv[MAX_ARGS+1];
 
     login_sh = 0;
     if (argval[0][0] == '-') login_sh = 1;
@@ -47,8 +48,7 @@ int main(int argc, char *argval[])
     cprompt = (getuid() == 0) ? '#' : '$';
 
     for (;;) {
-        cmd[0] = (char) 0;
-        for (i = 0; i < MAX_ARGS; i++) arg[i][0] = (char) 0;
+        for (i = 0; i < MAX_ARGS; i++) arg[i] = NULL;
         do {
             printf("ssh%c ", cprompt);
             fflush(stdout);
@@ -57,10 +57,9 @@ int main(int argc, char *argval[])
             buf[strlen(buf) - 1] = '\0';   /* Strip newline from fgets */
         }
         while (buf[0] == (char) 0);
-        count = sscanf(buf, "%s %s %s %s %s %s %s %s %s %s %s",
-                            cmd,
-                            arg[0], arg[1], arg[2], arg[3], arg[4],
-                            arg[5], arg[6], arg[7], arg[8], arg[9]);
+               cmd = strtok(buf, " \t");
+               for (i = 0; i < MAX_ARGS; i++)
+                       arg[i] = strtok(NULL, " \t");
 
         /* Check for User-Requested Exit back to Login Prompt */
         if (strcmp(cmd, "exit") == 0)
@@ -129,7 +128,7 @@ int main(int argc, char *argval[])
         else {
             argv[0] = cmd;                  /* Build Argv Pointer Array */
             for (i = 0; i < MAX_ARGS; ++i)
-               argv[i+1] = *arg[i] ? arg[i] : (char *) NULL;
+               argv[i+1] = arg[i];
 
             if ((pid = fork()) == -1) {     /* Try to spawn new Process */
                 printf("ssh: can't fork\n");
@@ -154,9 +153,9 @@ int main(int argc, char *argval[])
                             *tp++ = '/';
                         for (i = 0; (*tp++ = cmd[i++]) != '\0'; )
                             ;
-                        execve(eline, (const char **)argv, (const char **)environ);
+                        execve(eline, argv, (const char**) environ);
                     }
-                    printf("ssh: %s?\n", buf);      /* Say we can't exec */
+                    printf("ssh: %s?\n", cmd);      /* Say we can't exec */
                     exit(1);
                 }                                   /* Parent is in context */
                 wait(0);                    /* Parent waits for completion */
index 7aa71b2..9579d6d 100644 (file)
@@ -2,21 +2,24 @@
 #include <string.h>
 #include <stdlib.h>
 
-
-char tmp[256];
+/* Assumed length of a line in /etc/mtab */
+#define MTAB_LINE 160
 
 char *getdev(char *arg)
 {
     FILE *f;
-    static char dev[20], mntpt[20], fstype[20], rwflag[20];
+       char tmp[MTAB_LINE];
+       char* dev;
+       char* mntpt;
     
     f = fopen("/etc/mtab", "r");
     if (f) {
-        while (fgets(tmp, 256, f)) {
-            sscanf(tmp, "%s %s %s %s\n", dev, mntpt, fstype, rwflag);
+        while (fgets(tmp, sizeof(tmp), f)) {
+                       dev = strtok(tmp, " ");
+                       mntpt = strtok(NULL, " ");
             if ((strcmp(dev, arg) == 0) || (strcmp(mntpt, arg) == 0)) {
                 fclose(f);
-                return dev;
+                return strdup(dev);
             }
         }
         fclose(f);
@@ -30,7 +33,9 @@ int rm_mtab(char *devname)
 {
     FILE *inpf, *outf;
     char *tmp_fname;
-    static char dev[20], mntpt[20], fstype[20], rwflag[20];
+       char tmp[MTAB_LINE];
+       char* dev;
+       char* mntpt;
 
     if ((tmp_fname = tmpnam(NULL)) == NULL) {
         perror("Error getting temporary file name");
@@ -46,8 +51,9 @@ int rm_mtab(char *devname)
         perror("Can't create temporary file");
         exit(1);
     }
-    while (fgets(tmp, 255, inpf)) {
-        sscanf(tmp, "%s %s %s %s\n", dev, mntpt, fstype, rwflag);
+    while (fgets(tmp, sizeof(tmp), inpf)) {
+               dev = strtok(tmp, " ");
+               mntpt = strtok(NULL, " ");
         if (strcmp(dev, devname) == 0) {
             continue;
         } else {
index 42d82f8..6ddb6cf 100644 (file)
@@ -11,6 +11,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdio.h>
+#include <errno.h>
 
 #define loop   for(;;)
 
@@ -32,19 +33,39 @@ char blank, part = '\0';
 int  partn, lens;
 int  debug = 0, nochk = 0, onedone = 0;
 int  chtbl[NCHARS], cdlen[NORMLEN + 3];
+char buf[LINELEN];
 
-int  main(int argc, char **argv);
 char *getnword(char *str, int n);
 void gettable(void);
 void decode(void);
 void getfile(char *buf);
 
+static void malformed_begin(void)
+{
+       printf("uud: malformed begin line\n");
+       exit(10);
+}
+
+static long parse_number(const char* p, int base)
+{
+       char* end;
+       unsigned long result;
+       
+       errno = 0;
+       result = strtoul(p, &end, base);
+       if (errno || *end)
+               return -1;
+       return result;
+}
+
 int main(int argc, char *argv[])
 {
     int mode;
     register int i, j;
     char *curarg;
-    char dest[FILELEN], buf[LINELEN];
+       char *begin;
+       char *dest;
+    static char buf[LINELEN];
 
     while ((curarg = argv[1]) != NULL && curarg[0] == '-') {
        if (((curarg[1] == 'd') || (curarg[1] == 'D')) &&
@@ -140,10 +161,19 @@ int main(int argc, char *argv[])
        lens = strlen(buf);
        if (lens) buf[--lens] = '\0';
 
-       if (sscanf(buf, "begin%o%s", &mode, dest) != 2) {
-           printf("uud: Missing filename in begin line.\n");
-           exit(10);
-       }
+       /* Parse the begin line without using sscanf (because it's huge). */
+       begin = strtok(buf, " \t");
+       if (!begin || (strcmp(begin, "begin") != 0))
+               malformed_begin();
+       dest = strtok(NULL, " \t");
+       if (!dest)
+               malformed_begin();
+       mode = parse_number(dest, 8);
+       if (mode < 0)
+               malformed_begin();
+       dest = strtok(NULL, " \t");
+       if (!dest)
+               malformed_begin();
 
        if (target != NULL) {
            strcpy(ofname, target);
@@ -202,7 +232,6 @@ void gettable(void)
 {
     register int c, n = 0;
     register char *cpt;
-    char buf[LINELEN];
 
     for (c = 0; c < NCHARS; c++) chtbl[c] = -1;
 
@@ -245,7 +274,7 @@ void decode(void)
     register int *trtbl = chtbl;
     register int n, c, rlen;
     register unsigned int len;
-    char buf[LINELEN], outl[LINELEN];
+    static char outl[LINELEN];
 
     loop {
        if (fgets(buf, sizeof buf, inpf) == NULL) {