Commit | Line | Data |
---|---|---|
124dd274 BJ |
1 | static char *sccsid = "@(#)from.c 4.1 (Berkeley) %G%"; |
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 | } |