From 019955453b440666bde624445aac61843bf80847 Mon Sep 17 00:00:00 2001 From: Bill Joy Date: Tue, 8 May 1979 23:16:24 -0800 Subject: [PATCH] BSD 2 development Work on file src/untmp.c Work on file src/whatis.c Work on file src/whereis.c Work on file src/whoami.c Synthesized-from: 2bsd --- src/untmp.c | 42 ++++++++ src/whatis.c | 134 +++++++++++++++++++++++ src/whereis.c | 286 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/whoami.c | 20 ++++ 4 files changed, 482 insertions(+) create mode 100644 src/untmp.c create mode 100644 src/whatis.c create mode 100644 src/whereis.c create mode 100644 src/whoami.c diff --git a/src/untmp.c b/src/untmp.c new file mode 100644 index 0000000000..efc086fe6c --- /dev/null +++ b/src/untmp.c @@ -0,0 +1,42 @@ +/* Copyright (c) 1979 Regents of the University of California */ +/* + * Remove stuff in /tmp owned by the invoker. + */ +#include +#include +#include +#include +#include + +struct direct dirent[2]; + +main() +{ + struct stat stbuf; + register int uid; + + uid = getuid(); + if (chdir("/tmp") < 0) { + perror("/tmp"); + exit(1); + } + if (freopen(".", "r", stdin) == NULL) + exit(1); + while (fread((char *) &dirent[0], sizeof (struct direct), 1, stdin) == 1) { +#define ent dirent[0] + if (ent.d_ino == 0) + continue; + if (stat(ent.d_name, &stbuf)) + continue; + if (!strcmp(ent.d_name, ".") || !strcmp(ent.d_name, "..")) + continue; + if (stbuf.st_uid != uid) + continue; + if ((stbuf.st_mode & S_IFMT) != S_IFREG) + continue; + if (unlink(ent.d_name)) + continue; + printf("%s\n", ent.d_name); + } + exit(0); +} diff --git a/src/whatis.c b/src/whatis.c new file mode 100644 index 0000000000..aeb6c95cca --- /dev/null +++ b/src/whatis.c @@ -0,0 +1,134 @@ +/* Copyright (c) 1979 Regents of the University of California */ +#include +#include +/* + * whatis - what the heck is that file anyways + * + * Bill Joy UCB + */ + +char *calloc(); +char *trim(); +unsigned blklen(); + +main(argc, argv) + int argc; + char *argv[]; +{ + register char **avp; + + argc--, argv++; + if (argc == 0) { + fprintf(stderr, "whatis name ...\n"); + exit(1); + } + if (freopen("/usr/lib/whatis", "r", stdin) == NULL) { + perror("/usr/lib/whatis"); + exit (1); + } + argv[argc] = 0; + for (avp = argv; *avp; avp++) + *avp = trim(*avp); + whatis(argv); + exit(0); +} + +whatis(argv) + char **argv; +{ + char buf[BUFSIZ]; + register char *gotit; + register char **vp; + + gotit = calloc(1, blklen(argv)); + while (fgets(buf, sizeof buf, stdin) != NULL) + for (vp = argv; *vp; vp++) + if (match(buf, *vp)) { + printf("%s", buf); + gotit[vp - argv] = 1; + for (vp++; *vp; vp++) + if (match(buf, *vp)) + gotit[vp - argv] = 1; + break; + } + for (vp = argv; *vp; vp++) + if (gotit[vp - argv] == 0) + printf("%s: not found\n", *vp); +} + +match(buf, str) + char *buf, *str; +{ + register char *bp, *cp; + + bp = buf; +again: + cp = str; + while (*bp && *cp && lmatch(*bp, *cp)) + bp++, cp++; + if (*cp == 0 && (*bp == '(' || *bp == ',' || *bp == '\t' || *bp == ' ')) + return (1); + while (isalpha(*bp) || isdigit(*bp)) + bp++; + if (*bp != ',') + return (0); + bp++; + while (isspace(*bp)) + bp++; + goto again; +} + +lmatch(c, d) + char c, d; +{ + + if (c == d) + return (1); + if (!isalpha(c) || !isalpha(d)) + return (0); + if (islower(c)) + c = toupper(c); + if (islower(d)) + d = toupper(d); + return (c == d); +} + +unsigned +blklen(ip) + register char **ip; +{ + register int i = 0; + + while (*ip++) + i++; + return (i); +} + +char * +trim(cp) + register char *cp; +{ + register char *dp; + + for (dp = cp; *dp; dp++) + if (*dp == '/') + cp = dp + 1; + if (cp[0] != '.') { + if (cp + 3 <= dp && dp[-2] == '.' && any(dp[-1], "cosa12345678npP")) + dp[-2] = 0; + if (cp + 4 <= dp && dp[-3] == '.' && any(dp[-2], "13") && isalpha(dp[-1])) + dp[-3] = 0; + } + return (cp); +} + +any(c, cp) + register int c; + register char *cp; +{ + + while (*cp) + if (c == *cp++) + return (1); + return (0); +} diff --git a/src/whereis.c b/src/whereis.c new file mode 100644 index 0000000000..6e9e0bb233 --- /dev/null +++ b/src/whereis.c @@ -0,0 +1,286 @@ +/* Copyright (c) 1979 Regents of the University of California */ +#include +#include +#include +#include + +static char *bindirs[] = { + "/etc", + "/bin", + "/usr/bin", + "/usr/new", + "/usr/games", + 0 +}; +static char *mandirs[] = { + "man1", + "man2", + "man3", + "man4", + "man5", + "man6", + "man7", + "man8", + "mann", + "127local", + 0 +}; +static char *srcdirs[] = { + "cmd", + "libc/gen", + "libc/stdio", + "games", + "/usr/ucb/src/cmd", + "/usr/ucb/src/new", + "/usr/ucb/src/libc/gen", + "/usr/ucb/src/libc/stdio", + 0 +}; +char sflag = 1; +char bflag = 1; +char mflag = 1; +char **Sflag; +int Scnt; +char **Bflag; +int Bcnt; +char **Mflag; +int Mcnt; +char uflag; +/* + * whereis name + * look for source, documentation and binaries + */ +main(argc, argv) + int argc; + char *argv[]; +{ + +#ifdef CORY + if (getuid() == 0) + nice(-20); + if (((getuid() >> 8) & 0377) > 10) + setuid(getuid()); +#endif + argc--, argv++; + if (argc == 0) { +usage: + fprintf(stderr, "whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n"); + exit(1); + } + do + if (argv[0][0] == '-') { + register char *cp = argv[0] + 1; + while (*cp) switch (*cp++) { + + case 'f': + break; + + case 'S': + getlist(&argc, &argv, &Sflag, &Scnt); + break; + + case 'B': + getlist(&argc, &argv, &Bflag, &Bcnt); + break; + + case 'M': + getlist(&argc, &argv, &Mflag, &Mcnt); + break; + + case 's': + zerof(); + sflag++; + continue; + + case 'u': + uflag++; + continue; + + case 'b': + zerof(); + bflag++; + continue; + + case 'm': + zerof(); + mflag++; + continue; + + default: + goto usage; + } + argv++; + } else + lookup(*argv++); + while (--argc > 0); +} + +getlist(argcp, argvp, flagp, cntp) + char ***argvp; + int *argcp; + char ***flagp; + int *cntp; +{ + + (*argvp)++; + *flagp = *argvp; + *cntp = 0; + for ((*argcp)--; *argcp > 0 && (*argvp)[0][0] != '-'; (*argcp)--) + (*cntp)++, (*argvp)++; + (*argcp)++; + (*argvp)--; +} + + +zerof() +{ + + if (sflag && bflag && mflag) + sflag = bflag = mflag = 0; +} +int count; +int print; + + +lookup(cp) + register char *cp; +{ + register char *dp; + + for (dp = cp; *dp; dp++) + continue; + for (; dp > cp; dp--) { + if (*dp == '.') { + *dp = 0; + break; + } + } + for (dp = cp; *dp; dp++) + if (*dp == '/') + cp = dp + 1; + if (uflag) { + print = 0; + count = 0; + } else + print = 1; +again: + if (print) + printf("%s:", cp); + if (sflag) { + looksrc(cp); + if (uflag && print == 0 && count != 1) { + print = 1; + goto again; + } + } + count = 0; + if (bflag) { + lookbin(cp); + if (uflag && print == 0 && count != 1) { + print = 1; + goto again; + } + } + count = 0; + if (mflag) { + lookman(cp); + if (uflag && print == 0 && count != 1) { + print = 1; + goto again; + } + } + if (print) + printf("\n"); +} + +looksrc(cp) + char *cp; +{ + if (Sflag == 0) { + chdir("/usr/src"); + find(srcdirs, cp); + } else + findv(Sflag, Scnt, cp); +} + +lookbin(cp) + char *cp; +{ + if (Bflag == 0) + find(bindirs, cp); + else + findv(Bflag, Bcnt, cp); +} + +lookman(cp) + char *cp; +{ + if (Mflag == 0) { + chdir("/usr/man"); + find(mandirs, cp); + } else + findv(Mflag, Mcnt, cp); +} + +findv(dirv, dirc, cp) + char **dirv; + int dirc; + char *cp; +{ + + while (dirc > 0) + findin(*dirv++, cp), dirc--; +} + +find(dirs, cp) + char **dirs; + char *cp; +{ + + while (*dirs) + findin(*dirs++, cp); +} + +findin(dir, cp) + char *dir, *cp; +{ + register FILE *d; + struct direct direct; + + d = fopen(dir, "r"); + if (d == NULL) + return; + while (fread(&direct, sizeof direct, 1, d) == 1) { + if (direct.d_ino == 0) + continue; + if (itsit(cp, direct.d_name)) { + count++; + if (print) + printf(" %s/%.14s", dir, direct.d_name); + } + } + fclose(d); +} + +itsit(cp, dp) + register char *cp, *dp; +{ + register int i = 14; + + if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2)) + return (1); + while (*cp && *dp && *cp == *dp) + cp++, dp++, i--; + if (*cp == 0 && *dp == 0) + return (1); + while (isdigit(*dp)) + dp++; + if (*cp == 0 && *dp++ == '.') { + --i; + while (i > 0 && *dp) + if (--i, *dp++ == '.') + return (*dp++ == 'P' && *dp++ == 0); + return (1); + } + return (0); +} diff --git a/src/whoami.c b/src/whoami.c new file mode 100644 index 0000000000..86ff8d16b1 --- /dev/null +++ b/src/whoami.c @@ -0,0 +1,20 @@ +/* Copyright (c) 1979 Regents of the University of California */ +#include +#include +/* + * whoami + */ +struct passwd *getpwuid(); + +main() +{ + register struct passwd *pp; + + pp = getpwuid(getuid()); + if (pp == 0) { + printf("Intruder alert.\n"); + exit(1); + } + printf("%s\n", pp->pw_name); + exit(0); +} -- 2.20.1