|
|
1.1 ! root 1: static char *sccsid = "@(#)from.c 4.1 (Berkeley) 10/1/80"; ! 2: #include <stdio.h> ! 3: #include <ctype.h> ! 4: #include <pwd.h> ! 5: ! 6: struct passwd *getpwuid(); ! 7: ! 8: main(argc, argv) ! 9: int argc; ! 10: register char **argv; ! 11: { ! 12: char lbuf[BUFSIZ]; ! 13: char lbuf2[BUFSIZ]; ! 14: register struct passwd *pp; ! 15: int stashed = 0; ! 16: register char *name; ! 17: char *sender; ! 18: char *getlogin(); ! 19: ! 20: if (argc > 1 && *(argv[1]) == '-' && (*++argv)[1] == 's') { ! 21: if (--argc <= 1) { ! 22: fprintf (stderr, "Usage: from [-s sender] [user]\n"); ! 23: exit (1); ! 24: } ! 25: --argc; ! 26: sender = *++argv; ! 27: for (name = sender; *name; name++) ! 28: if (isupper(*name)) ! 29: *name = tolower(*name); ! 30: ! 31: } ! 32: else ! 33: sender = NULL; ! 34: if (chdir("/usr/spool/mail") < 0) ! 35: exit(1); ! 36: if (argc > 1) ! 37: name = argv[1]; ! 38: else { ! 39: name = getlogin (); ! 40: if (name == NULL || strlen(name) == 0) { ! 41: pp = getpwuid(getuid()); ! 42: if (pp == NULL) { ! 43: fprintf(stderr, "Who are you?\n"); ! 44: exit(1); ! 45: } ! 46: name = pp->pw_name; ! 47: } ! 48: } ! 49: if (freopen(name, "r", stdin) == NULL) ! 50: exit(0); ! 51: while(fgets(lbuf, sizeof lbuf, stdin) != NULL) ! 52: if (lbuf[0] == '\n' && stashed) { ! 53: stashed = 0; ! 54: printf("%s", lbuf2); ! 55: } ! 56: else if (bufcmp(lbuf, "From ", 5) && ! 57: (sender == NULL || match(&lbuf[4], sender))) { ! 58: strcpy(lbuf2, lbuf); ! 59: stashed = 1; ! 60: } ! 61: if (stashed) ! 62: printf("%s", lbuf2); ! 63: exit(0); ! 64: } ! 65: ! 66: bufcmp (b1, b2, n) ! 67: register char *b1, *b2; ! 68: register int n; ! 69: { ! 70: while (n-- > 0) ! 71: if (*b1++ != *b2++) ! 72: return (0); ! 73: return (1); ! 74: } ! 75: ! 76: match (line, str) ! 77: register char *line, *str; ! 78: { ! 79: register char ch; ! 80: ! 81: while (*line == ' ' || *line == '\t') ! 82: ++line; ! 83: if (*line == '\n') ! 84: return (0); ! 85: while (*str && *line != ' ' && *line != '\t' && *line != '\n') { ! 86: ch = isupper(*line) ? tolower(*line) : *line; ! 87: if (ch != *str++) ! 88: return (0); ! 89: line++; ! 90: } ! 91: return (*str == '\0'); ! 92: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.