* complete copyright information.
*/
-#include <h/mh.h>
-#include <h/mts.h>
-#include <h/tws.h>
-#include <h/utils.h>
+#include "h/mh.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 <pwd.h>
-#include <h/popsbr.h>
+#include "h/popsbr.h"
#ifndef CYRUS_SASL
# define SASLminc(a) (a)
*/
#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 *);
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 ();
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 ...]",
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);
+ 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);
+ die("you can only check %d users at a time", MAXVEC-1);
vec[vecp++] = cp;
}
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);
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;
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 ? mmdfldir : home,
+ *mmdflfil ? mmdflfil : user);
- 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;
+ struct stat st;
+ bool statok = stat(buffer, &st) != -1;
+ bool empty = !statok || st.st_size == 0;
- 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;
+ if ((empty && !(notifysw & NT_NMAI)) ||
+ (!empty && !(notifysw & NT_MAIL))) {
+ return empty;
}
- 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;
}
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");
}
}
if (nmsgs) {
if (notifysw & NT_MAIL) {
if (personal)
- printf ("You have ");
+ fputs("You have ", stdout);
else
printf ("%s has ", user);
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);