xref: /original-bsd/usr.bin/from/from.c (revision 1e7fda44)
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