**
*/
-/* Changed to use getutent() and friends. Assumes that when getutent() exists,
-** a number of other things also exist. Please check.
-** Ruud de Rooij <ruud@ruud.org> Sun, 28 May 2000 17:28:55 +0200
-*/
#include <h/mh.h>
#include <h/rcvmail.h>
extern int initgroups(char*, int);
#endif
-#include <utmp.h>
-
-#ifndef HAVE_GETUTENT
-# ifndef UTMP_FILE
-# ifdef _PATH_UTMP
-# define UTMP_FILE _PATH_UTMP
-# else
-# define UTMP_FILE "/etc/utmp"
-# endif
-# endif
-#endif
-
static struct swit switches[] = {
#define ADDRSW 0
{ "addr address", 0 },
};
-/* global maildelivery file */
-char *maildelivery = NMHETCDIR"/maildelivery";
-
-
static int globbed = 0; /* have we built "vars" table yet? */
static int parsed = 0; /* have we built header field table yet */
-static int utmped = 0; /* have we scanned umtp(x) file yet */
static int verbose = 0;
static int debug = 0;
static void expand(char *, char *, int);
static void glob(int);
static struct pair *lookup(struct pair *, char *);
-static int logged_in(void);
-static int timely(char *, char *);
static int usr_file(int, char *);
static int usr_pipe(int, char *, char *, char **, int);
static int usr_folder(int, char *);
-static RETSIGTYPE alrmser(int);
+static void alrmser(int);
static void get_sender(char *, char **);
static int copy_message(int, char *, int);
static void verbose_printf(char *fmt, ...);
if (!(now = dlocaltimenow())) {
adios(NULL, "unable to ascertain local time");
}
- snprintf(ddate, sizeof(ddate), "Delivery-Date: %s\n", dtimenow(0));
+ snprintf(ddate, sizeof(ddate), "Delivery-Date: %s\n", dtimenow());
/*
** Copy the message to a temporary file
static int
localmail(int fd, char *mdlvr)
{
+ char buf[BUFSIZ];
+
/* delivery according to personal Maildelivery file */
if (usr_delivery(fd, mdlvr ? mdlvr : ".maildelivery", 0) != -1) {
return 0;
}
/* delivery according to global Maildelivery file */
- if (usr_delivery(fd, maildelivery, 1) != -1) {
+ snprintf(buf, sizeof buf, "%s/%s", mhetcdir, "maildelivery");
+ if (usr_delivery(fd, buf, 1) != -1) {
return 0;
}
if (verbose) {
break;
}
- if (vecp > 5 && mh_strcasecmp(vec[5], "select")==0) {
- if (logged_in() != -1) {
- continue;
- }
- if (vecp > 7 && timely(vec[6], vec[7]) == -1) {
- continue;
- }
- }
-
/* check if the field matches */
switch (*field) {
case '*':
/*
-** Check utmp(x) file to see if user is currently
-** logged in.
-*/
-#ifdef HAVE_GETUTENT
-static int
-logged_in(void)
-{
- struct utmp * utp;
-
- if (utmped) {
- return utmped;
- }
- setutent();
-
- while ((utp = getutent())) {
- if (
-#ifdef HAVE_STRUCT_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();
- return (utmped = DONE);
- }
- }
-
- endutent();
- return (utmped = NOTOK);
-}
-#else
-static int
-logged_in(void)
-{
- struct utmp ut;
- FILE *uf;
-
- if (utmped) {
- return utmped;
- }
- if (!(uf = fopen(UTMP_FILE, "r"))) {
- return NOTOK;
- }
- while (fread((char *) &ut, sizeof(ut), 1, uf) == 1) {
- if (ut.ut_name[0] && strncmp(user, ut.ut_name,
- sizeof(ut.ut_name))==0) {
- if (debug) {
- continue;
- }
- fclose(uf);
- return (utmped = DONE);
- }
- }
- fclose(uf);
- return (utmped = NOTOK);
-}
-#endif
-
-#define check(t,a,b) if ((t) < (a) || (t) > (b)) return -1
-#define cmpar(h1,m1,h2,m2) if ((h1)<(h2) || ((h1)==(h2) && (m1)<(m2))) \
- return 0
-
-static int
-timely(char *t1, char *t2)
-{
- int t1hours, t1mins, t2hours, t2mins;
-
- if (sscanf(t1, "%d:%d", &t1hours, &t1mins) != 2) {
- return -1;
- }
- check(t1hours, 0, 23);
- check(t1mins, 0, 59);
-
- if (sscanf(t2, "%d:%d", &t2hours, &t2mins) != 2) {
- return -1;
- }
- check(t2hours, 0, 23);
- check(t2mins, 0, 59);
-
- cmpar(now->tw_hour, now->tw_min, t1hours, t1mins);
- cmpar(t2hours, t2mins, now->tw_hour, now->tw_min);
-
- return -1;
-}
-
-
-/*
** Deliver message by appending to a file, using rcvpack(1).
*/
static int
vec[1] = folder;
vec[2] = NULL;
- return usr_pipe(fd, "rcvstore", rcvstoreproc, vec, 1);
+ return usr_pipe(fd, "rcvstore", "rcvstore", vec, 1);
}
/*
usr_pipe(int fd, char *cmd, char *pgm, char **vec, int suppress)
{
pid_t child_id;
- int bytes, seconds, status;
+ int bytes, seconds, status, n;
struct stat st;
+ char *path;
if (verbose && !suppress) {
verbose_printf("delivering to pipe \"%s\"", cmd);
if (fd != 3) {
dup2(fd, 3);
}
- closefds(4);
+ for (n=4; n<OPEN_MAX; n++) {
+ close(n);
+ }
#ifdef TIOCNOTTY
if ((fd = open("/dev/tty", O_RDWR)) != -1) {
/* put in own process group */
setpgid((pid_t) 0, getpid());
+ path = getenv("PATH");
*environ = NULL;
m_putenv("USER", pw->pw_name);
m_putenv("HOME", pw->pw_dir);
m_putenv("SHELL", pw->pw_shell);
+ m_putenv("PATH", path);
execvp(pgm, vec);
_exit(-1);
** Ruthlessly kill the child and anything
** else in its process group.
*/
- KILLPG(child_id, SIGKILL);
+ kill(-child_id, SIGKILL);
if (verbose)
verbose_printf(", timed-out; terminated\n");
return -1;
}
-static RETSIGTYPE
+static void
alrmser(int i)
{
-#ifndef RELIABLE_SIGNALS
- SIGNAL(SIGALRM, alrmser);
-#endif
-
longjmp(myctx, DONE);
}
FILE *qfp, *ffp;
char *tfile = NULL;
- tfile = m_mktemp2(NULL, invo_name, &fd1, NULL);
+ tfile = m_mktemp2("/tmp/", invo_name, &fd1, NULL);
if (tfile == NULL) return -1;
fchmod(fd1, 0600);
strncpy(tmpfil, tfile, BUFSIZ);
if (first) {
first = 0;
if (strncmp(buffer, "From ", i)==0) {
- char *fp, *cp;
/*
** get copy of envelope information
** ("From " line)
*/
envelope = getcpy(buffer);
- /*
- ** Now create a "Return-Path:" line
- ** from the "From " line.
- */
- cp = strchr(fp = envelope + i, ' ');
- snprintf(buffer, sizeof(buffer),
- "Return-Path: %.*s\n",
- (int)(cp - fp), fp);
-
- /* Add Return-Path header to message */
- fputs(buffer, ffp);
- if (ferror(ffp)) {
- goto fputs_error;
- }
/* Put the delivery date in message */
fputs(ddate, ffp);
if (ferror(ffp)) {