X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmsgchk.c;h=dfbdd69e1df828fa726fd31737ea042cdf9d640f;hp=2553c496f7850463b76dc1e20cbe391893ca7272;hb=32b2354dbaf4bf934936eb5b102a4a3d2fdd209a;hpb=017a82124bf2ea39ced5aa4c8f969c18b3c2fb90 diff --git a/uip/msgchk.c b/uip/msgchk.c index 2553c49..dfbdd69 100644 --- a/uip/msgchk.c +++ b/uip/msgchk.c @@ -1,430 +1,241 @@ - /* - * msgchk.c -- check for mail - * - * $Id$ - */ +** 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 -#include -#include +#include #include -#ifdef POP -# include -#endif - -#ifdef HESIOD -# include -#endif - -#ifndef POP -# define POPminc(a) (a) -#else -# define POPminc(a) 0 -#endif - -#ifndef RPOP -# define RPOPminc(a) (a) -#else -# define RPOPminc(a) 0 -#endif - -#ifndef APOP -# define APOPminc(a) (a) -#else -# define APOPminc(a) 0 -#endif - -#ifndef KPOP -# define KPOPminc(a) (a) -#else -# define KPOPminc(a) 0 -#endif - 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 HOSTSW 4 - { "host hostname", POPminc (-4) }, -#define USERSW 5 - { "user username", POPminc (-4) }, -#define APOPSW 6 - { "apop", APOPminc (-4) }, -#define NAPOPSW 7 - { "noapop", APOPminc (-6) }, -#define RPOPSW 8 - { "rpop", RPOPminc (-4) }, -#define NRPOPSW 9 - { "norpop", RPOPminc (-6) }, -#define VERSIONSW 10 - { "version", 0 }, -#define HELPSW 11 - { "help", 0 }, -#define SNOOPSW 12 - { "snoop", -5 }, -#define KPOPSW 13 - { "kpop", KPOPminc (-4) }, - { NULL, 0 } +#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). - */ +** Maximum numbers of users we can check (plus +** one for the NULL vector at the end). +*/ #define MAXVEC 51 -#define NT_NONE 0x0 -#define NT_MAIL 0x1 -#define NT_NMAI 0x2 -#define NT_ALL (NT_MAIL | NT_NMAI) +#define NT_MAIL 0x1 +#define NT_NMAI 0x2 +#define NT_ALL (NT_MAIL | NT_NMAI) -#define NONEOK 0x0 -#define UUCPOLD 0x1 -#define UUCPNEW 0x2 -#define UUCPOK (UUCPOLD | UUCPNEW) -#define MMDFOLD 0x4 -#define MMDFNEW 0x8 -#define MMDFOK (MMDFOLD | MMDFNEW) +#define NONEOK 0x0 +#define MAILOLD 0x4 +#define MAILNEW 0x8 +#define MAILOK (MAILOLD | MAILNEW) /* - * static prototypes - */ -static int donote (char *, int); -static int checkmail (char *, char *, int, int, int); - -#ifdef POP -static int remotemail (char *, char *, int, int, int, int, int); -#endif +** static prototypes +*/ +static int donote(char *, int); +static int checkmail(char *, int, int, int); int -main (int argc, char **argv) +main(int argc, char **argv) { - int datesw = 1, notifysw = NT_ALL; - int rpop, status = 0; - int kpop = 0; - int snoop = 0, vecp = 0; - uid_t uid; - char *cp, *host = NULL, *user, buf[BUFSIZ]; - char **argp, **arguments, *vec[MAXVEC]; - struct passwd *pw; - -#ifdef HESIOD - struct hes_postoffice *po; - char *tmphost; -#endif + 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 = r1bindex (argv[0], '/'); - - /* read user profile/context */ - context_read(); - - mts_init (invo_name); - uid = getuid (); - user = getusername(); - - arguments = getarguments (invo_name, argc, argv, 1); - argp = arguments; - -#ifdef POP - if ((cp = getenv ("MHPOPDEBUG")) && *cp) - snoop++; + setlocale(LC_ALL, ""); #endif - - rpop = 0; - - 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; - - case HOSTSW: - if (!(host = *argp++) || *host == '-') - adios (NULL, "missing argument to %s", argp[-2]); - continue; - case USERSW: - if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); - if (vecp >= MAXVEC-1) - adios (NULL, "you can only check %d users at a time", MAXVEC-1); - else + 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; - continue; - - case APOPSW: - rpop = -1; - continue; - case NAPOPSW: - rpop = 0; - continue; - - case RPOPSW: - rpop = 1; - continue; - case NRPOPSW: - rpop = 0; - continue; - - case KPOPSW: - kpop = 1; - continue; - - case SNOOPSW: - snoop++; - continue; - } } - if (vecp >= MAXVEC-1) - adios (NULL, "you can only check %d users at a time", MAXVEC-1); - else - vec[vecp++] = cp; - } - -#ifdef POP - /* - * If -host is not specified by user - */ - if (!host || !*host) { -# ifdef HESIOD - /* - * Scheme is: - * use MAILHOST environment variable if present, - * else try Hesiod. - * If that fails, use the default (if any) - * provided by mts.conf in mts_init() - */ - if ((tmphost = getenv("MAILHOST")) != NULL) - pophost = tmphost; - else if ((po = hes_getmailhost(vecp ? vec[0] : user)) != NULL && - strcmp(po->po_type, "POP") == 0) - pophost = po->po_host; -# endif /* HESIOD */ - /* - * If "pophost" is specified in mts.conf, - * use it as default value. - */ - if (pophost && *pophost) - host = pophost; - } - if (!host || !*host) - host = NULL; - if (!host || rpop <= 0) - setuid (uid); -#endif /* POP */ - - if (vecp != 0) - vec[vecp] = NULL; -#ifdef POP - if (host) { - if (vecp == 0) { - status = remotemail (host, user, rpop, kpop, notifysw, 1, snoop); - } else { - for (vecp = 0; vec[vecp]; vecp++) - status += remotemail (host, vec[vecp], rpop, kpop, notifysw, 0, snoop); + if (!vecp) { + done(checkmail(user, datesw, notifysw, 1)); + return 1; } - } else { -#endif /* POP */ - - if (vecp == 0) { - char *home; - home = (uid = geteuid()) ? home = getenv ("HOME") : NULL; - if (home == NULL) { - pw = getpwnam (user); - if (pw == NULL) - adios (NULL, "unable to get information about user"); - if (home == NULL) - home = pw->pw_dir; - } - status = checkmail (user, home, datesw, notifysw, 1); - } else { + vec[vecp] = NULL; for (vecp = 0; vec[vecp]; vecp++) { - if ((pw = getpwnam (vec[vecp]))) - status += checkmail (pw->pw_name, pw->pw_dir, datesw, notifysw, 0); - else - advise (NULL, "no such user as %s", vec[vecp]); + if ((pw = getpwnam(vec[vecp]))) + status += checkmail(pw->pw_name, datesw, notifysw, 0); + else + advise(NULL, "no such user as %s", vec[vecp]); } - } -#ifdef POP - } /* host == NULL */ -#endif - - return done (status); + 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 } +#define NALLSW 0 + { "all", 0 }, +#define NMAISW 1 + { "mail", 0 }, +#define NNMAISW 2 + { "nomail", 0 }, + { NULL, 0 } }; static int -donote (char *cp, int ntflag) +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; - } + 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; + } - return 0; /* Before 1999-07-15, garbage was returned if control got here. */ + /* Before 1999-07-15, garbage was returned if control got here. */ + return 0; } static int -checkmail (char *user, char *home, int datesw, int notifysw, int personal) +checkmail(char *user, int datesw, int notifysw, int personal) { - int mf, status; - char buffer[BUFSIZ]; - struct stat st; - - snprintf (buffer, sizeof(buffer), "%s/%s", mmdfldir[0] ? mmdfldir : home, mmdflfil[0] ? mmdflfil : 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 ? MMDFNEW : MMDFOLD; - - if ((mf & UUCPOK) || (mf & MMDFOK)) { - if (notifysw & NT_MAIL) { - printf (personal ? "You have " : "%s has ", user); - if (mf & UUCPOK) - printf ("%s old-style bell", mf & UUCPOLD ? "old" : "new"); - if ((mf & UUCPOK) && (mf & MMDFOK)) - printf (" and "); - if (mf & MMDFOK) - printf ("%s%s", mf & MMDFOLD ? "old" : "new", - mf & UUCPOK ? " Internet" : ""); - printf (" mail waiting"); + 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 { - notifysw = 0; + snprintf(buffer, sizeof(buffer), "%s/%s", mailspool, user); } - status = 0; - } - else { - if (notifysw & NT_NMAI) - printf (personal ? "You don't %s%s" : "%s doesn't %s", - personal ? "" : user, "have any mail waiting"); - else - notifysw = 0; - - status = 1; - } - - if (notifysw) - if (datesw && st.st_atime) - printf ("; last read on %s", dtime (&st.st_atime, 1)); - if (notifysw) - printf ("\n"); - - return status; -} - - -#ifdef POP -extern char response[]; - -static int -remotemail (char *host, char *user, int rpop, int kpop, int notifysw, int personal, int snoop) -{ - int nmsgs, nbytes, status; - char *pass = NULL; - - if (user == NULL) - user = getusername (); - if (kpop || (rpop > 0)) - pass = getusername (); - else - ruserpass (host, &user, &pass); - - /* open the POP connection */ - if (pop_init (host, user, pass, snoop, kpop ? 1 : rpop, kpop) == NOTOK - || pop_stat (&nmsgs, &nbytes) == NOTOK /* check for messages */ - || pop_quit () == NOTOK) { /* quit POP connection */ - advise (NULL, "%s", response); - return 1; - } - - if (nmsgs) { - if (notifysw & NT_MAIL) { - printf (personal ? "You have " : "%s has ", user); - printf ("%d message%s (%d bytes)", - nmsgs, nmsgs != 1 ? "s" : "", nbytes); + 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; } - else - notifysw = 0; - status = 0; - } else { - if (notifysw & NT_NMAI) - printf (personal ? "You don't %s%s" : "%s doesn't %s", - personal ? "" : user, "have any mail waiting"); - else - notifysw = 0; - status = 1; - } - if (notifysw) - printf (" on %s\n", host); + if (notifysw) { + if (datesw && st.st_atime) { + printf("; last read on %s", dtime(&st.st_atime)); + } + printf("\n"); + } - return status; + return status; } -#endif /* POP */