1 static char *sccsid = "@(#)from.c 4.1 (Berkeley) 10/01/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 } 93