X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmsgchk.c;h=dfbdd69e1df828fa726fd31737ea042cdf9d640f;hp=7b29b54c6a5e6ee8a6311db55822ed6c1b9b3eb6;hb=32b2354dbaf4bf934936eb5b102a4a3d2fdd209a;hpb=240013872c392fe644bd4f79382d9f5314b4ea60 diff --git a/uip/msgchk.c b/uip/msgchk.c index 7b29b54..dfbdd69 100644 --- a/uip/msgchk.c +++ b/uip/msgchk.c @@ -7,7 +7,6 @@ */ #include -#include #include #include @@ -21,9 +20,10 @@ static struct swit switches[] = { #define NNOTESW 3 { "nonotify type", 0 }, #define VERSIONSW 4 - { "version", 0 }, + { "Version", 0 }, #define HELPSW 5 { "help", 0 }, + { NULL, 0 }, }; /* @@ -32,25 +32,21 @@ static struct swit switches[] = { */ #define MAXVEC 51 -#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 MAILOLD 0x4 +#define MAILNEW 0x8 +#define MAILOK (MAILOLD | MAILNEW) /* ** static prototypes */ static int donote(char *, int); -static int checkmail(char *, char *, int, int, int); +static int checkmail(char *, int, int, int); int @@ -59,7 +55,6 @@ 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]; @@ -73,8 +68,6 @@ main(int argc, char **argv) /* read user profile/context */ context_read(); - mts_init(invo_name); - uid = getuid(); user = getusername(); arguments = getarguments(invo_name, argc, argv, 1); @@ -83,37 +76,39 @@ main(int argc, char **argv) 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 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) @@ -123,30 +118,18 @@ main(int argc, char **argv) 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; - } - 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) { + 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; } @@ -167,19 +150,18 @@ 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; + 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. */ @@ -188,55 +170,72 @@ donote(char *cp, int ntflag) 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); + 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 ? MMDFNEW : MMDFOLD; + : st.st_atime <= st.st_mtime ? MAILNEW : MAILOLD; - if ((mf & UUCPOK) || (mf & MMDFOK)) { + if (mf & MAILOK) { 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" : ""); + 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) - printf(personal ? "You don't %s%s" : "%s doesn't %s", - personal ? "" : user, - "have any mail waiting"); - else + } 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, 1)); - if (notifysw) + if (notifysw) { + if (datesw && st.st_atime) { + printf("; last read on %s", dtime(&st.st_atime)); + } printf("\n"); + } return status; }