From b61eab701a47c73b7ecdafacde33104720fb3934 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Wed, 6 Nov 1996 20:11:12 +0000 Subject: Split RFC822-bashing code out of the driver. svn path=/trunk/; revision=492 --- Makefile.in | 7 +- driver.c | 265 ------------------------------------------------------------ fetchmail.c | 8 +- fetchmail.h | 3 + 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
*/ - { - 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 **); -- cgit v1.2.3