aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.in7
-rw-r--r--driver.c265
-rw-r--r--fetchmail.c8
-rw-r--r--fetchmail.h3
4 files changed, 14 insertions, 269 deletions
diff --git a/Makefile.in b/Makefile.in
index a1524a0a..29867e98 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -78,7 +78,7 @@ ETAGS = etags -tw
CTAGS = ctags -tw
popobjs = socket.o getpass.o pop2.o pop3.o imap.o fetchmail.o options.o \
- rcfile_l.o rcfile_y.o daemon.o driver.o smtp.o xmalloc.o \
+ rcfile_l.o rcfile_y.o daemon.o smtp.o driver.o rfc822.o xmalloc.o \
uid.o mxget.o md5c.o md5ify.o
objs = $(popobjs) $(extras) $(EXTRAOBJ)
@@ -86,8 +86,9 @@ objs = $(popobjs) $(extras) $(EXTRAOBJ)
srcs = $(srcdir)/socket.c $(srcdir)/getpass.c $(srcdir)/pop2.c \
$(srcdir)/pop3.c $(srcdir)/imap.c $(srcdir)/fetchmail.c \
$(srcdir)/options.c $(srcdir)/daemon.c $(srcdir)/driver.c \
- $(srcdir)/smtp.c $(srcdir)/xmalloc.c $(srcdir)/uid.c \
- $(srcdir)/mxget.c $(srcdir)/md5c.c $(srcdir)/md5ify.c
+ $(srcdir)/rfc822.c $(srcdir)/smtp.c $(srcdir)/xmalloc.c \
+ $(srcdir)/uid.c $(srcdir)/mxget.c $(srcdir)/md5c.c \
+ $(srcdir)/md5ify.c
.SUFFIXES:
.SUFFIXES: .o .c .h .y .l .ps .dvi .info .texi
diff --git a/driver.c b/driver.c
index 096c5f2a..38f0b1eb 100644
--- a/driver.c
+++ b/driver.c
@@ -91,271 +91,6 @@ static void vtalarm_handler (int signal)
longjmp(restart, 1);
}
-static void reply_hack(buf, host)
-/* hack message headers so replies will work properly */
-char *buf; /* header to be hacked */
-const char *host; /* server hostname */
-{
- const char *from;
- int parendepth, state = 0, tokencount = 0;
- char mycopy[POPBUFSIZE+1];
-
- if (strncmp("From: ", buf, 6)
- && strncmp("To: ", buf, 4)
- && strncmp("Reply-", buf, 6)
- && strncmp("Cc: ", buf, 4)
- && strncmp("Bcc: ", buf, 5)) {
- return;
- }
-
- strcpy(mycopy, buf);
- for (from = mycopy; *from; from++)
- {
- switch (state)
- {
- case 0: /* before header colon */
- if (*from == ':')
- state = 1;
- break;
-
- case 1: /* we've seen the colon, we're looking for addresses */
- if (*from == '"')
- state = 3;
- else if (*from == '(')
- {
- parendepth = 1;
- state = 4;
- }
- else if (*from == '<' || isalnum(*from))
- state = 5;
- else if (isspace(*from))
- state = 2;
- break;
-
- case 2: /* found a token boundary -- reset without copying */
- if (*from != ' ' && *from != '\t')
- {
- tokencount++;
- state = 1;
- --from;
- continue;
- }
-
- case 3: /* we're in a quoted human name, copy and ignore */
- if (*from == '"')
- state = 1;
- break;
-
- case 4: /* we're in a parenthesized human name, copy and ignore */
- if (*from == '(')
- ++parendepth;
- else if (*from == ')')
- --parendepth;
- if (parendepth == 0)
- state = 1;
- break;
-
- case 5: /* the real work gets done here */
- /*
- * We're in something that might be an address part,
- * either a bare unquoted/unparenthesized text or text
- * enclosed in <> as per RFC822.
- */
- /* if the address part contains an @, don't mess with it */
- if (*from == '@')
- state = 6;
-
- /* If the address token is not properly terminated, ignore it. */
- else if (*from == ' ' || *from == '\t')
- {
- const char *cp;
-
- /*
- * The only lookahead case. If we're looking at space or tab,
- * we might be looking at a local name immediately followed
- * by a human name.
- */
- for (cp = from; isspace(*cp); cp++)
- continue;
- if (*cp == '(')
- {
- strcpy(buf, "@");
- strcat(buf, host);
- buf += strlen(buf);
- state = 1;
- }
- }
-
- /*
- * On proper termination with no @, insert hostname.
- * Case '>' catches <>-enclosed mail IDs. Case ',' catches
- * comma-separated bare IDs.
- */
- else if (strchr(">,", *from))
- {
- strcpy(buf, "@");
- strcat(buf, host);
- buf += strlen(buf);
- tokencount = 0;
- state = 1;
- }
-
- /* a single local name alone on the line */
- else if (*from == '\n' && tokencount == 1)
- {
- strcpy(buf, "@");
- strcat(buf, host);
- buf += strlen(buf);
- state = 2;
- }
-
- /* everything else, including alphanumerics, just passes through */
- break;
-
- case 6: /* we're in a remote mail ID, no need to append hostname */
- if (*from == '>' || *from == ',' || isspace(*from))
- state = 1;
- break;
- }
-
- /* all characters from the old buffer get copied to the new one */
- *buf++ = *from;
- }
- *buf++ = '\0';
-}
-
-static char *nxtaddr(hdr)
-/* parse addresses in succession out of a specified RFC822 header */
-char *hdr; /* header line to be parsed, NUL to continue in previous hdr */
-{
- static char *hp, *tp, address[POPBUFSIZE+1];
- static int state;
- int parendepth;
-
- /*
- * Note 1: RFC822 escaping with \ is *not* handled. Note 2: it is
- * important that this routine not stop on \r, since we use \r as
- * a marker for RFC822 continuations below.
- */
-
- if (hdr)
- {
- hp = hdr;
- state = 0;
- }
-
- for (; *hp; hp++)
- {
- switch (state)
- {
- case 0: /* before header colon */
- if (*hp == '\n')
- return(NULL);
- else if (*hp == ':')
- {
- state = 1;
- tp = address;
- }
- break;
-
- case 1: /* we've seen the colon, now grab the address */
- if (*hp == '\n') /* end of address list */
- {
- *tp++ = '\0';
- state = 6;
- return(address);
- }
- else if (*hp == ',') /* end of address */
- {
- *tp++ = '\0';
- return(address);
- }
- else if (*hp == '"') /* quoted string */
- {
- state = 2;
- *tp++ = *hp;
- }
- else if (*hp == '(') /* address comment -- ignore */
- {
- parendepth = 1;
- state = 3;
- }
- else if (*hp == '<') /* begin <address> */
- {
- state = 4;
- tp = address;
- }
- else if (isspace(*hp)) /* ignore space */
- state = 1;
- else /* just take it */
- {
- state = 1;
- *tp++ = *hp;
- }
- break;
-
- case 2: /* we're in a quoted string, copy verbatim */
- if (*hp == '\n')
- return(NULL);
- if (*hp != '"')
- *tp++ = *hp;
- else if (*hp == '"')
- {
- *tp++ = *hp;
- state = 1;
- }
- break;
-
- case 3: /* we're in a parenthesized comment, ignore */
- if (*hp == '\n')
- return(NULL);
- else if (*hp == '(')
- ++parendepth;
- else if (*hp == ')')
- --parendepth;
- if (parendepth == 0)
- state = 1;
- break;
-
- case 4: /* possible <>-enclosed address */
- if (*hp == '>') /* end of address */
- {
- *tp++ = '\0';
- state = 1;
- return(address);
- }
- else if (*hp == '<') /* nested <> */
- tp = address;
- else if (*hp == '"') /* quoted address */
- {
- *tp++ = *hp;
- state = 5;
- }
- else /* just copy address */
- *tp++ = *hp;
- break;
-
- case 5: /* we're in a quoted address, copy verbatim */
- if (*hp == '\n') /* mismatched quotes */
- return(NULL);
- if (*hp != '"') /* just copy it if it isn't a quote */
- *tp++ = *hp;
- else if (*hp == '"') /* end of quoted string */
- {
- *tp++ = *hp;
- state = 4;
- }
- break;
-
- case 6:
- return(NULL);
- break;
- }
- }
-
- return(NULL);
-}
-
#ifdef HAVE_GETHOSTBYNAME
#define MX_RETRIES 3
diff --git a/fetchmail.c b/fetchmail.c
index f6cf3259..17fcca56 100644
--- a/fetchmail.c
+++ b/fetchmail.c
@@ -59,6 +59,12 @@ static int lastsig;
RETSIGTYPE donothing(sig) int sig; {signal(sig, donothing); lastsig = sig;}
+static void unlockit()
+/* must-do actions for exit (but we can't count on being able to do malloc) */
+{
+ unlink(lockfile);
+}
+
int main (argc,argv)
int argc;
char **argv;
@@ -284,6 +290,7 @@ char **argv;
if (poll_interval)
fprintf(lockfp," %d", poll_interval);
fclose(lockfp);
+ atexit(unlockit);
}
/*
@@ -571,7 +578,6 @@ void termhook(int sig)
if (!check_only)
write_saved_lists(querylist, idfile);
- unlink(lockfile);
exit(popstatus);
}
diff --git a/fetchmail.h b/fetchmail.h
index eaf11fb0..9bf6d105 100644
--- a/fetchmail.h
+++ b/fetchmail.h
@@ -165,6 +165,9 @@ int doPOP2 (struct query *);
int doPOP3 (struct query *);
int doIMAP (struct query *);
+void reply_hack(char *, const char *);
+char *nxtaddr(const char *);
+
void initialize_saved_lists(struct query *, char *);
void save_uid(struct idlist **, int, char *);
void free_uid_list(struct idlist **);