-/*
-** msgchk.c -- check for mail
-**
-** This code is Copyright (c) 2002, by the authors of nmh. See the
-** COPYRIGHT file in the root directory of the nmh distribution for
-** complete copyright information.
-*/
-
-#include <h/mh.h>
-#include <h/tws.h>
-#include <pwd.h>
-
-static struct swit switches[] = {
-#define DATESW 0
- { "date", 0 },
-#define NDATESW 1
- { "nodate", 0 },
-#define NOTESW 2
- { "notify type", 0 },
-#define NNOTESW 3
- { "nonotify type", 0 },
-#define VERSIONSW 4
- { "Version", 0 },
-#define HELPSW 5
- { "help", 0 },
- { NULL, 0 },
-};
-
-/*
-** Maximum numbers of users we can check (plus
-** one for the NULL vector at the end).
-*/
-#define MAXVEC 51
-
-#define NT_MAIL 0x1
-#define NT_NMAI 0x2
-#define NT_ALL (NT_MAIL | NT_NMAI)
-
-#define NONEOK 0x0
-#define MAILOLD 0x4
-#define MAILNEW 0x8
-#define MAILOK (MAILOLD | MAILNEW)
-
-
-/*
-** static prototypes
-*/
-static int donote(char *, int);
-static int checkmail(char *, int, int, int);
-
-
-int
-main(int argc, char **argv)
-{
- int datesw = 1, notifysw = NT_ALL;
- int status = 0;
- int vecp = 0;
- char buf[BUFSIZ];
- char *user, *cp;
- char **argp, **arguments, *vec[MAXVEC];
- struct passwd *pw;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = mhbasename(argv[0]);
-
- /* read user profile/context */
- context_read();
-
- user = getusername();
-
- arguments = getarguments(invo_name, argc, argv, 1);
- argp = arguments;
-
- while ((cp = *argp++)) {
- if (*cp == '-') {
- switch (smatch(++cp, switches)) {
- case AMBIGSW:
- ambigsw(cp, switches);
- done(1);
- case UNKWNSW:
- adios(NULL, "-%s unknown", cp);
-
- case HELPSW:
- snprintf(buf, sizeof(buf), "%s [switches] [users ...]", invo_name);
- print_help(buf, switches, 1);
- done(1);
- case VERSIONSW:
- print_version(invo_name);
- done(1);
-
- case DATESW:
- datesw++;
- continue;
- case NDATESW:
- datesw = 0;
- continue;
-
- case NOTESW:
- if (!(cp = *argp++) || *cp == '-')
- adios(NULL, "missing argument to %s",
- argp[-2]);
- notifysw |= donote(cp, 1);
- continue;
- case NNOTESW:
- if (!(cp = *argp++) || *cp == '-')
- adios(NULL, "missing argument to %s",
- argp[-2]);
- notifysw &= ~donote(cp, 0);
- continue;
- }
- }
- if (vecp >= MAXVEC-1)
- adios(NULL, "you can only check %d users at a time",
- MAXVEC-1);
- else
- vec[vecp++] = cp;
- }
-
- if (!vecp) {
- done(checkmail(user, datesw, notifysw, 1));
- return 1;
- }
-
- vec[vecp] = NULL;
- for (vecp = 0; vec[vecp]; vecp++) {
- if ((pw = getpwnam(vec[vecp])))
- status += checkmail(pw->pw_name, datesw, notifysw, 0);
- else
- advise(NULL, "no such user as %s", vec[vecp]);
- }
- done(status);
- return 1;
-}
-
-
-static struct swit ntswitches[] = {
-#define NALLSW 0
- { "all", 0 },
-#define NMAISW 1
- { "mail", 0 },
-#define NNMAISW 2
- { "nomail", 0 },
- { NULL, 0 }
-};
-
-
-static int
-donote(char *cp, int ntflag)
-{
- switch (smatch(cp, ntswitches)) {
- case AMBIGSW:
- ambigsw(cp, ntswitches);
- done(1);
- case UNKWNSW:
- adios(NULL, "-%snotify %s unknown", ntflag ? "" : "no", cp);
-
- case NALLSW:
- return NT_ALL;
- case NMAISW:
- return NT_MAIL;
- case NNMAISW:
- return NT_NMAI;
- }
-
- /* Before 1999-07-15, garbage was returned if control got here. */
- return 0;
-}
-
-
-static int
-checkmail(char *user, int datesw, int notifysw, int personal)
-{
- int mf, status;
- char buffer[BUFSIZ];
- struct stat st;
- char *maildrop;
-
- if (personal) {
- /*
- ** Evaluate the env var and profile only if the check is
- ** for the calling user.
- */
- if ((maildrop = getenv("MAILDROP")) && *maildrop) {
- snprintf(buffer, sizeof buffer, "%s",
- toabsdir(maildrop));
- } else if ((maildrop=context_find("maildrop")) && *maildrop) {
- snprintf(buffer, sizeof buffer, "%s",
- toabsdir(maildrop));
- } else {
- snprintf(buffer, sizeof buffer, "%s/%s",
- mailspool, user);
- }
- } else {
- snprintf(buffer, sizeof(buffer), "%s/%s", mailspool, user);
- }
- if (datesw) {
- st.st_size = 0;
- st.st_atime = st.st_mtime = 0;
- }
- mf = (stat(buffer, &st) == NOTOK || st.st_size == 0) ? NONEOK
- : st.st_atime <= st.st_mtime ? MAILNEW : MAILOLD;
-
- if (mf & MAILOK) {
- if (notifysw & NT_MAIL) {
- if (personal) {
- printf("You have ");
- } else {
- printf("%s has ", user);
- }
- if (mf & MAILOK)
- printf(mf & MAILOLD ? "old" : "new");
- printf(" mail waiting");
- } else {
- notifysw = 0;
- }
- status = 0;
- } else {
- if (notifysw & NT_NMAI) {
- if (personal) {
- printf("You don't have any mail waiting");
- } else {
- printf("%s doesn't have any mail waiting",
- user);
- }
- } else {
- notifysw = 0;
- }
- status = 1;
- }
-
- if (notifysw) {
- if (datesw && st.st_atime) {
- printf("; last read on %s", dtime(&st.st_atime));
- }
- printf("\n");
- }
-
- return status;
-}