1 /*
2 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
4 */
5
6 /*
7 * Copyright (c) 1980 Regents of the University of California.
8 * All rights reserved. The Berkeley software License Agreement
9 * specifies the terms and conditions for redistribution.
10 */
11
12 #pragma ident "%Z%%M% %I% %E% SMI"
13
14 #include <stdio.h>
15 #include <sys/types.h>
16 #include <unistd.h>
17 #include <stdlib.h>
18 #include <ctype.h>
19 #include <pwd.h>
20 #include <sys/param.h>
21 #include <string.h>
22
23 static int match(char *, char *);
24
25 int
main(int argc,char ** argv)26 main(int argc, char **argv)
27 {
28 char lbuf[BUFSIZ];
29 char lbuf2[BUFSIZ];
30 struct passwd *pp;
31 int stashed = 0;
32 char *name;
33 char *sender = NULL;
34 char mailbox[MAXPATHLEN];
35 char *tmp_mailbox;
36 extern char *optarg;
37 extern int optind;
38 extern int opterr;
39 int c;
40 int errflg = 0;
41
42 opterr = 0;
43 while ((c = getopt(argc, argv, "s:")) != EOF)
44 switch (c) {
45 case 's':
46 sender = optarg;
47 for (name = sender; *name; name++)
48 if (isupper(*name))
49 *name = tolower(*name);
50 break;
51 case '?':
52 errflg++;
53 break;
54 }
55 if (errflg) {
56 (void) fprintf(stderr,
57 "Usage: from [-s sender] [user]\n");
58 exit(1);
59 }
60
61 if (optind < argc) {
62 (void) sprintf(mailbox, "/var/mail/%s", argv[optind]);
63 } else {
64 if (tmp_mailbox = getenv("MAIL")) {
65 (void) strcpy(mailbox, tmp_mailbox);
66 } else {
67 name = getlogin();
68 if (name == NULL || strlen(name) == 0) {
69 pp = getpwuid(getuid());
70 if (pp == NULL) {
71 (void) fprintf(stderr,
72 "Who are you?\n");
73 exit(1);
74 }
75 name = pp->pw_name;
76 }
77 (void) sprintf(mailbox, "/var/mail/%s", name);
78 }
79 }
80 if (freopen(mailbox, "r", stdin) == NULL) {
81 (void) fprintf(stderr, "Can't open %s\n", mailbox);
82 exit(0);
83 }
84 while (fgets(lbuf, sizeof (lbuf), stdin) != NULL)
85 if (lbuf[0] == '\n' && stashed) {
86 stashed = 0;
87 (void) printf("%s", lbuf2);
88 } else if (strncmp(lbuf, "From ", 5) == 0 &&
89 (sender == NULL || match(&lbuf[4], sender))) {
90 (void) strcpy(lbuf2, lbuf);
91 stashed = 1;
92 }
93 if (stashed)
94 (void) printf("%s", lbuf2);
95 return (0);
96 }
97
98 static int
match(char * line,char * str)99 match(char *line, char *str)
100 {
101 char ch;
102
103 while (*line == ' ' || *line == '\t')
104 ++line;
105 if (*line == '\n')
106 return (0);
107 while (*str && *line != ' ' && *line != '\t' && *line != '\n') {
108 ch = isupper(*line) ? tolower(*line) : *line;
109 if (ch != *str++)
110 return (0);
111 line++;
112 }
113 return (*str == '\0');
114 }
115