From 711fb897179079f20e0603cde913bb31f108b9ca Mon Sep 17 00:00:00 2001 From: David Given Date: Sun, 15 Mar 2015 15:06:06 +0100 Subject: [PATCH] Removed dependencies on scanf unless it's really needed, as it's huge. --HG-- extra : source : 738e62d4775321d341419dcf34d82f71889040b7 --- Applications/util/df.c | 25 +++++++++++++-------- Applications/util/mknod.c | 19 ++++++++++++---- Applications/util/mount.c | 27 ++++++++++++++++------- Applications/util/ssh.c | 25 ++++++++++----------- Applications/util/umount.c | 24 ++++++++++++-------- Applications/util/uud.c | 45 +++++++++++++++++++++++++++++++------- 6 files changed, 114 insertions(+), 51 deletions(-) diff --git a/Applications/util/df.c b/Applications/util/df.c index 5a5ad0d7..074b6050 100644 --- a/Applications/util/df.c +++ b/Applications/util/df.c @@ -6,6 +6,9 @@ #include #include +/* 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); diff --git a/Applications/util/mknod.c b/Applications/util/mknod.c index 97a0794a..bacdd3ca 100644 --- a/Applications/util/mknod.c +++ b/Applications/util/mknod.c @@ -2,15 +2,25 @@ #include #include +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); } diff --git a/Applications/util/mount.c b/Applications/util/mount.c index 72e4693f..01b6c168 100644 --- a/Applications/util/mount.c +++ b/Applications/util/mount.c @@ -2,18 +2,25 @@ #include #include - -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(); diff --git a/Applications/util/ssh.c b/Applications/util/ssh.c index 4bb83074..3cb6edfe 100644 --- a/Applications/util/ssh.c +++ b/Applications/util/ssh.c @@ -12,6 +12,7 @@ #include #include #include +#include #include 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 */ diff --git a/Applications/util/umount.c b/Applications/util/umount.c index 7aa71b2a..9579d6d6 100644 --- a/Applications/util/umount.c +++ b/Applications/util/umount.c @@ -2,21 +2,24 @@ #include #include - -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 { diff --git a/Applications/util/uud.c b/Applications/util/uud.c index 42d82f8c..6ddb6cf1 100644 --- a/Applications/util/uud.c +++ b/Applications/util/uud.c @@ -11,6 +11,7 @@ #include #include #include +#include #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) { -- 2.34.1