diff options
-rw-r--r-- | Makefile.in | 10 | ||||
-rw-r--r-- | driver.c | 15 | ||||
-rw-r--r-- | etrn.c | 7 | ||||
-rw-r--r-- | fetchmail.c | 1 | ||||
-rw-r--r-- | fetchmail.h | 10 | ||||
-rw-r--r-- | imap.c | 4 | ||||
-rw-r--r-- | pop2.c | 5 | ||||
-rw-r--r-- | pop3.c | 6 | ||||
-rw-r--r-- | rcfile_l.l | 1 | ||||
-rw-r--r-- | rcfile_y.y | 6 |
10 files changed, 46 insertions, 19 deletions
diff --git a/Makefile.in b/Makefile.in index a983c2f3..db605dec 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ CTAGS = ctags protobjs = rcfile_y.o rcfile_l.o socket.o getpass.o pop2.o pop3.o imap.o \ etrn.o fetchmail.o env.o options.o daemon.o driver.o rfc822.o smtp.o \ xmalloc.o uid.o mxget.o md5c.o md5ify.o rpa.o interface.o netrc.o \ - base64.o error.o + base64.o error.o unmime.o objs = $(protobjs) $(extras) $(EXTRAOBJ) @@ -95,7 +95,7 @@ srcs = $(srcdir)/socket.c $(srcdir)/getpass.c $(srcdir)/pop2.c \ $(srcdir)/xmalloc.c $(srcdir)/uid.c $(srcdir)/mxget.c \ $(srcdir)/md5c.c $(srcdir)/md5ify.c $(srcdir)/rpa.c \ $(srcdir)/interface.c $(srcdir)/netrc.c $(srcdir)/base64.c \ - $(srcdir)/error.c + $(srcdir)/error.c $(srcdir)/unmime.c .SUFFIXES: .SUFFIXES: .o .c .h .y .l .ps .dvi .info .texi @@ -112,6 +112,10 @@ fetchmail: $(objs) rfc822: rfc822.c gcc -DTESTMAIN -g rfc822.c -o rfc822 +# Stand-alone MIME decoder +unmime: unmime.c base64.c rfc822.c xmalloc.c error.c + $(CC) -DSTANDALONE -g -o $@ $^ + .c.o: $(CC) $(defines) -c -I$(srcdir) -I. $(CEFLAGS) $(CFLAGS) $< @@ -147,7 +151,7 @@ clean: -rm -f fetchmail *.o core fetchmail.dvi \ rcfile_l.c rcfile_y.h rcfile_y.c \ fetchmail.tar fetchmail.tar.gz \ - rfc822 + rfc822 unmime distclean: clean -rm -f Makefile config.h TAGS tags @@ -1826,7 +1826,7 @@ const struct method *proto; /* protocol method table */ else { char buf [POPBUFSIZE+1], *realhost; - int *msgsizes, len, num, count, new, deletions = 0; + int *msgsizes, len, num, count, new, bytes, deletions = 0; #if INET6 int fetches, dispatches; #else /* INET6 */ @@ -1955,7 +1955,7 @@ const struct method *proto; /* protocol method table */ error(0, 0, "selecting or re-polling default folder"); /* compute # of messages and number of new messages waiting */ - ok = (protocol->getrange)(sock, ctl, idp->id, &count, &new); + ok = (protocol->getrange)(sock, ctl, idp->id, &count, &new, &bytes); if (ok != 0) goto cleanUp; @@ -1964,18 +1964,23 @@ const struct method *proto; /* protocol method table */ (void) sprintf(buf, "%s at %s (folder %s)", ctl->remotename, ctl->server.truename, idp->id); else - (void) sprintf(buf, "%s at %s", ctl->remotename, ctl->server.truename); + (void) sprintf(buf, "%s at %s", + ctl->remotename, ctl->server.truename); if (outlevel > O_SILENT) if (count == -1) /* only used for ETRN */ error(0, 0, "Polling %s", ctl->server.truename); else if (count != 0) { if (new != -1 && (count - new) > 0) - error(0, 0, "%d message%s (%d seen) for %s.", + error_build("%d message%s (%d seen) for %s", count, count > 1 ? "s" : "", count-new, buf); else - error(0, 0, "%d message%s for %s.", + error_build("%d message%s for %s", count, count > 1 ? "s" : "", buf); + if (bytes == -1) + error_complete(0, 0, "."); + else + error_complete(0, 0, " (%d bytes).", bytes); } else { @@ -28,8 +28,8 @@ static int etrn_ok (int sock, char *argbuf) return(ok); } -static int etrn_getrange(int sock, struct query *ctl, char *id, int *countp, - int *newp) +static int etrn_getrange(int sock, struct query *ctl, char *id, + int *countp, int *newp, int *bytes) /* send ETRN and interpret the response */ { int ok, opts; @@ -49,7 +49,8 @@ static int etrn_getrange(int sock, struct query *ctl, char *id, int *countp, return(PS_PROTOCOL); } - *countp = *newp = -1; /* make sure we don't enter the fetch loop */ + /* make sure we don't enter the fetch loop */ + *bytes = *countp = *newp = -1; /* * By default, the hostlist has a single entry, the fetchmail host's diff --git a/fetchmail.c b/fetchmail.c index 9ce2b066..43799cc1 100644 --- a/fetchmail.c +++ b/fetchmail.c @@ -753,6 +753,7 @@ static int load_params(int argc, char **argv, int optind) DEFAULT(ctl->forcecr, FALSE); DEFAULT(ctl->pass8bits, FALSE); DEFAULT(ctl->dropstatus, FALSE); + DEFAULT(ctl->mimedecode, TRUE); DEFAULT(ctl->server.dns, TRUE); DEFAULT(ctl->server.uidl, FALSE); #undef DEFAULT diff --git a/fetchmail.h b/fetchmail.h index 4f01557d..1f528c06 100644 --- a/fetchmail.h +++ b/fetchmail.h @@ -169,6 +169,7 @@ struct query flag forcecr; /* if TRUE, force CRs before LFs in text */ flag pass8bits; /* if TRUE, ignore Content-Transfer-Encoding */ flag dropstatus; /* if TRUE, drop Status lines in mail */ + flag mimedecode; /* if TRUE, decode MIME-coded headers/coded printable*/ int limit; /* limit size of retrieved messages */ int fetchlimit; /* max # msgs to get in single poll */ int batchlimit; /* max # msgs to pass in single SMTP session */ @@ -326,6 +327,15 @@ int prc_filecheck(const char *); void to64frombits(unsigned char *, const unsigned char *, int); int from64tobits(char *, const char *); +/* unmime.c */ +/* Bit-mask returned by MimeBodyType */ +#define MSG_IS_7BIT 0x01 +#define MSG_IS_8BIT 0x02 +#define MSG_NEEDS_DECODE 0x80 +extern void UnMimeHeader(unsigned char *buf); +extern int MimeBodyType(unsigned char *hdrs); +extern int UnMimeBodyline(unsigned char **buf, int collapsedoubledot); + /* interface.c */ void interface_parse(char *, struct hostdata *); void interface_note_activity(struct hostdata *); @@ -709,13 +709,13 @@ static int internal_expunge(int sock) static int imap_getrange(int sock, struct query *ctl, const char *folder, - int *countp, int *newp) + int *countp, int *newp, int *bytes) /* get range of messages to be fetched */ { int ok; /* find out how many messages are waiting */ - recent = unseen = -1; + *bytes, recent = unseen = -1; if (pass > 1) { @@ -59,7 +59,8 @@ int pop2_getauth(int sock, struct query *ctl, char *buf) ctl->remotename, ctl->password)); } -static int pop2_getrange(int sock, struct query *ctl, const char *folder, int*countp, int*newp) +static int pop2_getrange(int sock, struct query *ctl, const char *folder, + int *countp, int *newp, int *bytes) /* get range of messages to be fetched */ { /* maybe the user wanted a non-default folder */ @@ -87,7 +88,7 @@ static int pop2_getrange(int sock, struct query *ctl, const char *folder, int*co return(PS_ERROR); *countp = pound_arg; - *newp = -1; + *bytes = *newp = -1; return(0); } @@ -353,7 +353,7 @@ pop3_slowuidl( int sock, struct query *ctl, int *countp, int *newp) static int pop3_getrange(int sock, struct query *ctl, const char *folder, - int *countp, int *newp) + int *countp, int *newp, int *bytes) /* get range of messages to be fetched */ { int ok; @@ -375,7 +375,7 @@ static int pop3_getrange(int sock, gen_send(sock, "STAT"); ok = pop3_ok(sock, buf); if (ok == 0) - sscanf(buf,"%d %*d", countp); + sscanf(buf,"%d %d", countp, bytes); else return(ok); @@ -445,7 +445,7 @@ static int pop3_getrange(int sock, } } - return(0); + return(PS_SUCCESS); } static int pop3_getsizes(int sock, int count, int *sizes) @@ -79,6 +79,7 @@ forcecr { return FORCECR; } stripcr { return STRIPCR; } pass8(bits)? { return PASS8BITS; } dropstatus? { return DROPSTATUS; } +mimedec(ode)? { return MIMEDECODE; } dns { return DNS; } uidl { return UIDL; } @@ -72,7 +72,7 @@ extern char * yytext; %token <sval> STRING %token <number> NUMBER %token NO KEEP FLUSH FETCHALL REWRITE FORCECR STRIPCR PASS8BITS DROPSTATUS -%token DNS SERVICE PORT UIDL INTERVAL +%token DNS SERVICE PORT UIDL INTERVAL MIMEDECODE %% @@ -283,6 +283,7 @@ user_option : TO localnames HERE | STRIPCR {current.stripcr = FLAG_TRUE;} | PASS8BITS {current.pass8bits = FLAG_TRUE;} | DROPSTATUS {current.dropstatus = FLAG_TRUE;} + | MIMEDECODE {current.mimedecode = FLAG_TRUE;} | NO KEEP {current.keep = FLAG_FALSE;} | NO FLUSH {current.flush = FLAG_FALSE;} @@ -292,6 +293,7 @@ user_option : TO localnames HERE | NO STRIPCR {current.stripcr = FLAG_FALSE;} | NO PASS8BITS {current.pass8bits = FLAG_FALSE;} | NO DROPSTATUS {current.dropstatus = FLAG_FALSE;} + | NO MIMEDECODE {current.mimedecode = FLAG_FALSE;} | LIMIT NUMBER {current.limit = NUM_VALUE($2);} | FETCHLIMIT NUMBER {current.fetchlimit = NUM_VALUE($2);} @@ -500,6 +502,7 @@ static void record_current(void) FLAG_FORCE(stripcr); FLAG_FORCE(pass8bits); FLAG_FORCE(dropstatus); + FLAG_FORCE(mimedecode); FLAG_FORCE(limit); FLAG_FORCE(fetchlimit); FLAG_FORCE(batchlimit); @@ -560,6 +563,7 @@ void optmerge(struct query *h2, struct query *h1) FLAG_MERGE(stripcr); FLAG_MERGE(pass8bits); FLAG_MERGE(dropstatus); + FLAG_MERGE(mimedecode); FLAG_MERGE(limit); FLAG_MERGE(fetchlimit); FLAG_MERGE(batchlimit); |