root/usr/src/ucbcmd/from/from.c
/*
 * 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.
 */

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>
#include <pwd.h>
#include <sys/param.h>
#include <string.h>

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');
}