*/
#ifdef MAILGROUP
-/* Revised: Sat Apr 14 17:08:17 PDT 1990 (marvit@hplabs)
+/*
+ * Thu Feb 12 21:00 CST 2015 Marcin Cieslak <saper@saper.info>
+ * Replaced setgid() calls with setegid() so that it works with dot
+ * locking on FreeBSD. setegid() should be supported on modern POSIX
+ * systems.
+ *
+ * Revised: Sat Apr 14 17:08:17 PDT 1990 (marvit@hplabs)
* Added hpux hacks to set and reset gid to be "mail" as needed. The reset
* is necessary so inc'ed mail is the group of the inc'er, rather than
* "mail". We setgid to egid only when [un]locking the mail file. This
X("width columns", 0, WIDTHSW) \
X("version", 0, VERSIONSW) \
X("help", 0, HELPSW) \
- X("snoop", -5, SNOOPSW) \
- X("sasl", SASLminc(-4), SASLSW) \
- X("nosasl", SASLminc(-6), NOSASLSW) \
- X("saslmech", SASLminc(-8), SASLMECHSW) \
+ X("snoop", 0, SNOOPSW) \
+ X("sasl", SASLminc(5), SASLSW) \
+ X("nosasl", SASLminc(3), NOSASLSW) \
+ X("saslmech", SASLminc(5), SASLMECHSW) \
+ X("authservice", SASLminc(0), AUTHSERVICESW) \
X("proxy command", 0, PROXYSW) \
#define X(sw, minchars, id) id,
* For setting and returning to "mail" gid
*/
#ifdef MAILGROUP
-static int return_gid;
+static gid_t return_gid;
#define TRYDROPGROUPPRIVS() DROPGROUPPRIVS()
-#define DROPGROUPPRIVS() setgid(getgid())
-#define GETGROUPPRIVS() setgid(return_gid)
+#define DROPGROUPPRIVS() \
+ if (setegid(getgid()) != 0) { \
+ adios ("setegid", "unable to restore group to %ld", (long) getgid()); \
+ }
+#define GETGROUPPRIVS() \
+ if (setegid(return_gid) != 0) { \
+ adios ("setegid", "unable to set group to %ld", (long) return_gid); \
+ }
#define SAVEGROUPPRIVS() return_gid = getegid()
#else
/* define *GROUPPRIVS() as null; this avoids having lots of "#ifdef MAILGROUP"s */
char *cp, *maildir = NULL, *folder = NULL;
char *format = NULL, *form = NULL;
char *host = NULL, *port = NULL, *user = NULL, *proxy = NULL;
- char *audfile = NULL, *from = NULL, *saslmech = NULL;
+ char *audfile = NULL, *from = NULL, *saslmech = NULL, *auth_svc = NULL;
char buf[BUFSIZ], **argp, *nfs, **arguments;
struct msgs *mp = NULL;
struct stat st, s1;
int nmsgs, nbytes;
char *MAILHOST_env_variable;
-
done=inc_done;
/* absolutely the first thing we do is save our privileges,
if (nmh_init(argv[0], 1)) { return 1; }
- mts_init (invo_name);
+ mts_init ();
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
if (!(saslmech = *argp++) || *saslmech == '-')
adios (NULL, "missing argument to %s", argp[-2]);
continue;
+
+ case AUTHSERVICESW:
+#ifdef OAUTH_SUPPORT
+ if (!(auth_svc = *argp++) || *auth_svc == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+#else
+ adios (NULL, "not built with OAuth support");
+#endif
+ continue;
+
case PROXYSW:
if (!(proxy = *argp++) || *proxy == '-')
adios (NULL, "missing argument to %s", argp[-2]);
if (inc_type == INC_POP) {
struct nmh_creds creds = { 0, 0, 0 };
+ if (auth_svc == NULL) {
+ if (saslmech && ! strcasecmp(saslmech, "xoauth2")) {
+ adios (NULL, "must specify -authservice with -saslmech xoauth2");
+ }
+ nmh_get_credentials (host, user, sasl, &creds);
+ } else {
+ if (user == NULL) {
+ adios (NULL, "must specify -user with -saslmech xoauth2");
+ }
+ creds.user = user;
+ }
+
/*
* initialize POP connection
*/
- nmh_get_credentials (host, user, sasl, &creds);
if (pop_init (host, port, creds.user, creds.password, proxy, snoop,
- sasl, saslmech) == NOTOK)
+ sasl, saslmech, auth_svc) == NOTOK)
adios (NULL, "%s", response);
/* Check if there are any messages */
if (errno != ENOENT)
adios (packfile, "error on file");
cp = concat ("Create file \"", packfile, "\"? ", NULL);
- if (noisy && !getanswer (cp))
+ if (noisy && !read_yes_or_no_if_tty (cp))
done (1);
free (cp);
}
fseek (pf, 0L, SEEK_CUR);
pos = ftell (pf);
size = 0;
- fwrite (mmdlm1, 1, strlen (mmdlm1), pf);
+ if (fwrite (mmdlm1, 1, strlen (mmdlm1), pf) < strlen (mmdlm1)) {
+ advise (mmdlm1, "fwrite");
+ }
start = ftell (pf);
if (pop_retr (i, pop_pack) == NOTOK)
if (packfile) {
fseek (pf, stop, SEEK_SET);
- fwrite (mmdlm2, 1, strlen (mmdlm2), pf);
+ if (fwrite (mmdlm2, 1, strlen (mmdlm2), pf) < strlen (mmdlm1)) {
+ advise (mmdlm2, "fwrite");
+ }
if (fflush (pf) || ferror (pf)) {
int e = errno;
pop_quit ();
static void
inc_done (int status)
{
+ done = exit;
if (packfile && pd != NOTOK)
mbx_close (packfile, pd);
if (locked)