/* * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* * Copyright (c) 1980 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ #pragma ident "%Z%%M% %I% %E% SMI" #include #include #include #include #include #include #include #include static int match(char *, char *); int main(int argc, char **argv) { char lbuf[BUFSIZ]; char lbuf2[BUFSIZ]; struct passwd *pp; int stashed = 0; char *name; char *sender = NULL; char mailbox[MAXPATHLEN]; char *tmp_mailbox; extern char *optarg; extern int optind; extern int opterr; int c; int errflg = 0; opterr = 0; while ((c = getopt(argc, argv, "s:")) != EOF) switch (c) { case 's': sender = optarg; for (name = sender; *name; name++) if (isupper(*name)) *name = tolower(*name); break; case '?': errflg++; break; } if (errflg) { (void) fprintf(stderr, "Usage: from [-s sender] [user]\n"); exit(1); } if (optind < argc) { (void) sprintf(mailbox, "/var/mail/%s", argv[optind]); } else { if (tmp_mailbox = getenv("MAIL")) { (void) strcpy(mailbox, tmp_mailbox); } else { name = getlogin(); if (name == NULL || strlen(name) == 0) { pp = getpwuid(getuid()); if (pp == NULL) { (void) fprintf(stderr, "Who are you?\n"); exit(1); } name = pp->pw_name; } (void) sprintf(mailbox, "/var/mail/%s", name); } } if (freopen(mailbox, "r", stdin) == NULL) { (void) fprintf(stderr, "Can't open %s\n", mailbox); exit(0); } while (fgets(lbuf, sizeof (lbuf), stdin) != NULL) if (lbuf[0] == '\n' && stashed) { stashed = 0; (void) printf("%s", lbuf2); } else if (strncmp(lbuf, "From ", 5) == 0 && (sender == NULL || match(&lbuf[4], sender))) { (void) strcpy(lbuf2, lbuf); stashed = 1; } if (stashed) (void) printf("%s", lbuf2); return (0); } static int match(char *line, char *str) { char ch; while (*line == ' ' || *line == '\t') ++line; if (*line == '\n') return (0); while (*str && *line != ' ' && *line != '\t' && *line != '\n') { ch = isupper(*line) ? tolower(*line) : *line; if (ch != *str++) return (0); line++; } return (*str == '\0'); }