X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmsgchk.c;h=0b2f3eb55c941b64464f36c6612e3d490418e22a;hp=7ee5df5d69c60a6405e55fe73a1565c6dcd597cb;hb=ced6090a330d3d83d0bce709f756aa3d7d65fea4;hpb=ab7b48411962d26439f92f35ed084d3d6275459c diff --git a/uip/msgchk.c b/uip/msgchk.c index 7ee5df5..0b2f3eb 100644 --- a/uip/msgchk.c +++ b/uip/msgchk.c @@ -1,11 +1,10 @@ - /* - * 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. - */ +** 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 @@ -13,43 +12,43 @@ #include 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 7 - { "version", 0 }, -#define HELPSW 8 - { "help", 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 }, }; /* - * 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_NONE 0x0 +#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 UUCPOLD 0x1 +#define UUCPNEW 0x2 +#define UUCPOK (UUCPOLD | UUCPNEW) +#define MMDFOLD 0x4 +#define MMDFNEW 0x8 +#define MMDFOK (MMDFOLD | MMDFNEW) /* - * static prototypes - */ +** static prototypes +*/ static int donote (char *, int); static int checkmail (char *, char *, int, int, int); @@ -57,180 +56,185 @@ static int checkmail (char *, char *, int, int, int); int main (int argc, char **argv) { - int datesw = 1, notifysw = NT_ALL; - int status = 0; - int vecp = 0; - uid_t uid; - char buf[BUFSIZ]; - char *user, *cp; - char **argp, **arguments, *vec[MAXVEC]; - struct passwd *pw; + int datesw = 1, notifysw = NT_ALL; + int status = 0; + int vecp = 0; + uid_t uid; + char buf[BUFSIZ]; + char *user, *cp; + char **argp, **arguments, *vec[MAXVEC]; + struct passwd *pw; #ifdef LOCALE - setlocale(LC_ALL, ""); + 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; - - 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 != 0) - vec[vecp] = NULL; - - if (vecp == 0) { - char *home; - - /* Not sure this check makes sense... */ - if (!geteuid() || NULL == (home = getenv("HOME"))) { - pw = getpwnam (user); - if (pw == NULL) - adios (NULL, "unable to get information about user"); - home = pw->pw_dir; + 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; + + 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; } - status = checkmail (user, home, datesw, notifysw, 1); - } else { - 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 (vecp != 0) + vec[vecp] = NULL; + + if (vecp == 0) { + char *home; + + /* Not sure this check makes sense... */ + if (!geteuid() || NULL == (home = getenv("HOME"))) { + pw = getpwnam (user); + if (pw == NULL) + adios (NULL, "unable to get information about user"); + home = pw->pw_dir; + } + status = checkmail (user, home, datesw, notifysw, 1); + } else { + 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]); + } } - } - done (status); - return 1; + 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) { - 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. */ + 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, char *home, 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"); - } else { - notifysw = 0; + 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"); + } else { + notifysw = 0; + } + status = 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) - if (datesw && st.st_atime) - printf ("; last read on %s", dtime (&st.st_atime, 1)); - if (notifysw) - printf ("\n"); - - return status; + 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; }