* slocal.c -- asynchronously filter and deliver new mail
*
* $Id$
+ *
+ * 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.
*/
/*
*
* to their $HOME/.forward file.
*
- * Under MMDF-I, users should (symbolically) link
- * /usr/local/nmh/lib/slocal to $HOME/bin/rcvmail.
- *
*/
/* Changed to use getutent() and friends. Assumes that when getutent() exists,
#include <h/signals.h>
#include <h/tws.h>
#include <h/mts.h>
+#include <h/utils.h>
#include <pwd.h>
#include <signal.h>
extern int initgroups(char*, int);
#endif
-
-#ifdef HAVE_DB1_NDBM_H
-#include <db1/ndbm.h>
-#else
-#include <ndbm.h>
+/* This define is needed for Berkeley db v2 and above to
+ * make the header file expose the 'historical' ndbm APIs.
+ * We define it unconditionally because this is simple and
+ * harmless.
+ */
+#define DB_DBM_HSEARCH 1
+#ifdef NDBM_HEADER
+#include NDBM_HEADER
#endif
#include <utmp.h>
static int
usr_delivery (int fd, char *delivery, int su)
{
- int i, accept, status, won, vecp, next;
+ int i, accept, status=1, won, vecp, next;
char *field, *pattern, *action, *result, *string;
char buffer[BUFSIZ], tmpbuf[BUFSIZ];
char *cp, *vec[NVEC];
}
if (vecp > 5) {
- if (!strcasecmp (vec[5], "select")) {
+ if (!mh_strcasecmp (vec[5], "select")) {
if (logged_in () != -1)
continue;
if (vecp > 7 && timely (vec[6], vec[7]) == -1)
* "default" matches only if the message hasn't
* been delivered yet.
*/
- if (!strcasecmp (field, "default")) {
+ if (!mh_strcasecmp (field, "default")) {
if (won)
continue;
break;
switch (*action) {
case 'q':
/* deliver to quoted pipe */
- if (strcasecmp (action, "qpipe"))
+ if (mh_strcasecmp (action, "qpipe"))
continue; /* else fall */
case '^':
expand (tmpbuf, string, fd);
case 'p':
/* deliver to pipe */
- if (strcasecmp (action, "pipe"))
+ if (mh_strcasecmp (action, "pipe"))
continue; /* else fall */
case '|':
vec[2] = "sh";
case 'f':
/* mbox format */
- if (!strcasecmp (action, "file")) {
+ if (!mh_strcasecmp (action, "file")) {
status = usr_file (fd, string, MBOX_FORMAT);
break;
}
/* deliver to nmh folder */
- else if (strcasecmp (action, "folder"))
+ else if (mh_strcasecmp (action, "folder"))
continue; /* else fall */
case '+':
status = usr_folder (fd, string);
case 'm':
/* mmdf format */
- if (!strcasecmp (action, "mmdf")) {
+ if (!mh_strcasecmp (action, "mmdf")) {
status = usr_file (fd, string, MMDF_FORMAT);
break;
}
/* mbox format */
- else if (strcasecmp (action, "mbox"))
+ else if (mh_strcasecmp (action, "mbox"))
continue; /* else fall */
case '>':
case 'd':
/* ignore message */
- if (strcasecmp (action, "destroy"))
+ if (mh_strcasecmp (action, "destroy"))
continue;
status = 0;
break;
}
+ if (status) next = 0; /* action failed, mark for 'N' result */
+
if (accept && status == 0)
won++;
}
lp = add (field, lp);
}
for (p = hdrs; p->p_name; p++) {
- if (!strcasecmp (p->p_name, name)) {
+ if (!mh_strcasecmp (p->p_name, name)) {
if (!(p->p_flags & P_HID)) {
if ((cp = p->p_value)) {
if (p->p_flags & P_ADR) {
lookup (struct pair *pairs, char *key)
{
for (; pairs->p_name; pairs++)
- if (!strcasecmp (pairs->p_name, key))
+ if (!mh_strcasecmp (pairs->p_name, key))
return pairs;
return NULL;
setutent();
while ((utp = getutent()) != NULL) {
- if (utp->ut_type == USER_PROCESS
- && utp->ut_user[0] != 0
- && strncmp (user, utp->ut_user, sizeof(utp->ut_user)) == 0) {
+ if (
+#ifdef HAVE_UTMP_UT_TYPE
+ utp->ut_type == USER_PROCESS
+ &&
+#endif
+ utp->ut_name[0] != 0
+ && strncmp (user, utp->ut_name, sizeof(utp->ut_name)) == 0) {
if (debug)
continue;
endutent();
status = pidwait (child_id, 0);
alarm (0);
-#ifdef MMDFI
- if (status == RP_MOK || status == RP_OK)
- status = 0;
-#endif
if (verbose) {
if (status == 0)
verbose_printf (", success.\n");
case FLDPLUS:
case FLDEOF:
/* Search for the message ID */
- if (strcasecmp (name, "Message-ID")) {
+ if (mh_strcasecmp (name, "Message-ID")) {
while (state == FLDPLUS)
state = m_getfld (state, name, buf, sizeof(buf), in);
continue;