X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/e9bab734900d62af2bf2fc873dd480e7503335b9..e99caef6d3e09d481849d3bdc51871f4c7bb574a:/uip/msgchk.c?ds=sidebyside diff --git a/uip/msgchk.c b/uip/msgchk.c index 44d93528..ca3e3826 100644 --- a/uip/msgchk.c +++ b/uip/msgchk.c @@ -5,12 +5,21 @@ * complete copyright information. */ -#include -#include -#include +#include "h/mh.h" +#include "sbr/dtime.h" +#include "sbr/getarguments.h" +#include "sbr/smatch.h" +#include "sbr/ambigsw.h" +#include "sbr/print_version.h" +#include "sbr/print_help.h" +#include "sbr/error.h" +#include "h/mts.h" +#include "h/tws.h" +#include "h/done.h" +#include "h/utils.h" #include -#include +#include "popsbr.h" #ifndef CYRUS_SASL # define SASLminc(a) (a) @@ -59,26 +68,15 @@ DEFINE_SWITCH_ARRAY(MSGCHK, switches); */ #define MAXVEC 51 -#define NT_NONE 0x0 -#ifdef NT_NONE -#endif /* Use NT_NONE to prevent warning from gcc -Wunused-macros. */ #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) - /* * static prototypes */ -static int donote (char *, int); +static int donote (char *, int) PURE; static int checkmail (char *, char *, int, int, int); static int remotemail (char *, char *, char *, char *, int, int, int, int, char *, int, const char *); @@ -87,15 +85,20 @@ static int remotemail (char *, char *, char *, char *, int, int, int, int, int main (int argc, char **argv) { - int datesw = 1, notifysw = NT_ALL; - int status = 0, sasl = 0, tls = 0, noverify = 0; - int snoop = 0, vecp = 0; + bool datesw = true; + int notifysw = NT_ALL; + int status = 0; + bool sasl = false; + bool tls = false; + bool noverify = false; + bool snoop = false; + int vecp = 0; char *cp, *host = NULL, *port = NULL, *user = NULL, *proxy = NULL; char buf[BUFSIZ], *saslmech = NULL, *auth_svc = NULL; char **argp, **arguments, *vec[MAXVEC]; struct passwd *pw; - if (nmh_init(argv[0], 1)) { return 1; } + if (nmh_init(argv[0], true, true)) { return 1; } mts_init (); @@ -109,7 +112,7 @@ main (int argc, char **argv) ambigsw (cp, switches); done (1); case UNKWNSW: - adios (NULL, "-%s unknown", cp); + die("-%s unknown", cp); case HELPSW: snprintf (buf, sizeof(buf), "%s [switches] [users ...]", @@ -121,94 +124,92 @@ main (int argc, char **argv) done (0); case DATESW: - datesw++; + datesw = true; continue; case NDATESW: - datesw = 0; + datesw = false; continue; case NOTESW: if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("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]); + die("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]); + die("missing argument to %s", argp[-2]); continue; case PORTSW: if (!(port = *argp++) || *port == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case USERSW: if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); if (vecp >= MAXVEC-1) - adios (NULL, "you can only check %d users at a time", MAXVEC-1); - else - user = vec[vecp++] = cp; + die("you can only check %d users at a time", MAXVEC-1); + user = vec[vecp++] = cp; continue; case SNOOPSW: - snoop++; + snoop = true; continue; case SASLSW: - sasl++; + sasl = true; continue; case NOSASLSW: - sasl = 0; + sasl = false; continue; case SASLMECHSW: if (!(saslmech = *argp++) || *saslmech == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case INITTLSSW: - tls++; + tls = true; continue; case NOTLSSW: - tls = 0; + tls = false; continue; case CERTVERSW: - noverify = 0; + noverify = false; continue; case NOCERTVERSW: - noverify++; + noverify = true; continue; case AUTHSERVICESW: #ifdef OAUTH_SUPPORT if (!(auth_svc = *argp++) || *auth_svc == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); #else - adios (NULL, "not built with OAuth support"); + die("not built with OAuth support"); #endif continue; case PROXYSW: if (!(proxy = *argp++) || *proxy == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; } } if (vecp >= MAXVEC-1) - adios (NULL, "you can only check %d users at a time", MAXVEC-1); - else - vec[vecp++] = cp; + die("you can only check %d users at a time", MAXVEC-1); + vec[vecp++] = cp; } /* @@ -254,7 +255,7 @@ main (int argc, char **argv) if (!geteuid() || NULL == (home = getenv("HOME"))) { pw = getpwnam (user); if (pw == NULL) - adios (NULL, "unable to get information about user"); + die("unable to get information about user"); home = pw->pw_dir; } status = checkmail (user, home, datesw, notifysw, 1); @@ -295,7 +296,7 @@ donote (char *cp, int ntflag) ambigsw (cp, ntswitches); done (1); case UNKWNSW: - adios (NULL, "-%snotify %s unknown", ntflag ? "" : "no", cp); + die("-%snotify %s unknown", ntflag ? "" : "no", cp); case NALLSW: return NT_ALL; @@ -312,54 +313,39 @@ donote (char *cp, int ntflag) static int checkmail (char *user, char *home, int datesw, int notifysw, int personal) { - int mf, status; char buffer[BUFSIZ]; + snprintf(buffer, sizeof buffer, "%s/%s", *mmdfldir ? mmdfldir : home, + *mmdflfil ? mmdflfil : user); + struct stat st; + bool statok = stat(buffer, &st) != -1; + bool empty = !statok || st.st_size == 0; - 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; + if ((empty && !(notifysw & NT_NMAI)) || + (!empty && !(notifysw & NT_MAIL))) { + return empty; } - 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) { - if (personal) - printf ("You have "); - else - printf ("%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; - } - 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 (empty) { + if (personal) { + fputs("You don't have any mail waiting", stdout); + } else { + printf("%s doesn't have any mail waiting", user); + } + } else { + char *kind = st.st_mtime < st.st_atime ? "old" : "new"; + if (personal) { + printf("You have %s mail waiting", kind); + } else { + printf("%s has %s mail waiting", user, kind); + } } - if (notifysw) - if (datesw && st.st_atime) - printf ("; last read on %s", dtime (&st.st_atime, 1)); - if (notifysw) - putchar('\n'); + if (datesw && statok && st.st_atime) + printf("; last read on %s", dtime(&st.st_atime, 1)); + putchar('\n'); - return status; + return empty; } @@ -370,15 +356,16 @@ remotemail (char *host, char *port, char *user, char *proxy, int notifysw, int personal, int snoop, int sasl, char *saslmech, int tls, const char *auth_svc) { - int nmsgs, nbytes, status; + int nmsgs, nbytes; + bool status; if (auth_svc == NULL) { if (saslmech && ! strcasecmp(saslmech, "xoauth2")) { - adios (NULL, "must specify -authservice with -saslmech xoauth2"); + die("must specify -authservice with -saslmech xoauth2"); } } else { if (user == NULL) { - adios (NULL, "must specify -user with -saslmech xoauth2"); + die("must specify -user with -saslmech xoauth2"); } } @@ -394,7 +381,7 @@ remotemail (char *host, char *port, char *user, char *proxy, int notifysw, if (nmsgs) { if (notifysw & NT_MAIL) { if (personal) - printf ("You have "); + fputs("You have ", stdout); else printf ("%s has ", user); @@ -404,14 +391,14 @@ remotemail (char *host, char *port, char *user, char *proxy, int notifysw, else notifysw = 0; - status = 0; + status = false; } 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; + status = true; } if (notifysw) printf (" on %s\n", host);