diff options
| -rw-r--r-- | NEWS | 3 | ||||
| -rw-r--r-- | driver.c | 9 | ||||
| -rw-r--r-- | fetchmail.c | 6 | ||||
| -rw-r--r-- | fetchmail.h | 1 | ||||
| -rw-r--r-- | fetchmail.man | 7 | ||||
| -rw-r--r-- | rcfile_y.y | 17 | 
6 files changed, 40 insertions, 3 deletions
@@ -18,11 +18,12 @@ fetchmail-4.3.1 ()  * Code for parsing Received headers now strips out RFC822 routes.  * Fixed processing of -S/-r arguments so giving a comma-separated list works.   * Don't query for the fetchmail host machine by default in ETRN mode. +* Added skip prefix clause on `envelope' option  * Added --invisible option.  Note: you can now either make fetchmail generate    a Received header (the default) *or* spoof your listener into thinking    fetchmail connected from the mailserver machine, *but not both*. -There are 271 people on fetchmail-friends and 37 on fetchmail-announce. +There are 270 people on fetchmail-friends and 37 on fetchmail-announce.  ------------------------------------------------------------------------------  fetchmail-4.3.0 (Mon Oct  6 16:44:38 EDT 1997) @@ -543,7 +543,7 @@ int num;		/* index of message */      char buf[MSGBUFSIZE+1], return_path[MSGBUFSIZE+1];       int	from_offs, ctt_offs, env_offs, next_address;      char *headers, *received_for, *desthost, *rcv; -    int n, linelen, oldlen, ch, remaining; +    int n, linelen, oldlen, ch, remaining, skipcount;      char		*cp;      struct idlist 	*idp, *xmit_names;      flag			good_addresses, bad_addresses, has_nuls; @@ -562,6 +562,7 @@ int num;		/* index of message */      from_offs = ctt_offs = env_offs = -1;      oldlen = 0;      msglen = 0; +    skipcount = 0;      for (remaining = fetchlen; remaining > 0 || protocol->delimited; remaining -= linelen)      { @@ -778,11 +779,17 @@ int num;		/* index of message */  		if (env_offs == -1 && !strncasecmp(ctl->server.envelope,  						line,  						strlen(ctl->server.envelope))) +		    if (skipcount++ != ctl->server.envskip) +			continue;  		    env_offs = (line - headers);  	    }  #ifdef HAVE_RES_SEARCH  	    else if (!received_for && !strncasecmp("Received:", line, 9)) +	    { +		if (skipcount++ != ctl->server.envskip) +		    continue;  		received_for = parse_received(ctl, line); +	    }  #endif /* HAVE_RES_SEARCH */  	}      } diff --git a/fetchmail.c b/fetchmail.c index f70d2d71..66c4331a 100644 --- a/fetchmail.c +++ b/fetchmail.c @@ -568,6 +568,7 @@ static int load_params(int argc, char **argv, int optind)      save_str(&def_opts.smtphunt, FALSE, fetchmailhost);      save_str(&def_opts.smtphunt, FALSE, "localhost");      def_opts.expunge = 1; +    def_opts.server.envskip = 0;      /* this builds the host list */      if (prc_parse_file(rcfile, !versioninfo) != 0) @@ -1044,8 +1045,13 @@ void dump_params (struct query *ctl)  	    if (ctl->server.envelope == STRING_DISABLED)  		printf("  Envelope-address routing is disabled\n");  	    else +	    {  		printf("  Envelope header is assumed to be: %s\n",  		       ctl->server.envelope ? ctl->server.envelope:"Received"); +		if (ctl->server.envskip > 1 || outlevel >= O_VERBOSE) +		    printf("  Number of envelope header to be parsed: %d\n", +			   ctl->server.envskip); +	    }  	    if (ctl->server.akalist)  	    { diff --git a/fetchmail.h b/fetchmail.h index 4d35dded..c7e5795e 100644 --- a/fetchmail.h +++ b/fetchmail.h @@ -90,6 +90,7 @@ struct hostdata		/* shared among all user connections to given server */      int preauthenticate;		/* preauthentication mode to try */      int timeout;			/* inactivity timout in seconds */      char *envelope;			/* envelope address list header */ +    int envskip;			/* skip to numbered envelope header */      char *qvirtual;			/* prefix removed from local user id */      flag skip;				/* suppress poll in implicit mode? */      flag dns;				/* do DNS lookup on multidrop? */ diff --git a/fetchmail.man b/fetchmail.man index bcd349e2..e1c5cbe7 100644 --- a/fetchmail.man +++ b/fetchmail.man @@ -899,6 +899,13 @@ T}  .TE  .PP  Remember that all user options must \fIfollow\fR all server options. +.PP +In the .fetchmailrc file, the `envelope' string argument may be +preceded by a whitespace-separated number.  This number, if specified, +is the number of such headers to skip (that is, an argument of 1 +selects the second header of the given type).  This is sometime useful +for ignoring bogus Received headers created by an ISP's local delivery +agent.  .SS Keywords Not Corresponding To Option Switches  .PP  The `folder' and `smtphost' options (unlike their command-line @@ -133,7 +133,20 @@ serv_option	: AKA alias_list  		| AUTHENTICATE PASSWORD	{current.server.preauthenticate = A_PASSWORD;}  		| AUTHENTICATE KERBEROS4	{current.server.preauthenticate = A_KERBEROS_V4;}  		| TIMEOUT NUMBER	{current.server.timeout = $2;} -		| ENVELOPE STRING	{current.server.envelope = xstrdup($2);} + +		| ENVELOPE NUMBER STRING  +					{ +					    current.server.envelope =  +						xstrdup($3); +					    current.server.envskip = $2; +					} +		| ENVELOPE STRING +					{ +					    current.server.envelope =  +						xstrdup($2); +					    current.server.envskip = 0; +					} +  		| QVIRTUAL STRING	{current.server.qvirtual = xstrdup($2);}  		| INTERFACE STRING	{  #ifdef linux @@ -401,6 +414,7 @@ static void record_current(void)      FLAG_FORCE(server.preauthenticate);      FLAG_FORCE(server.timeout);      FLAG_FORCE(server.envelope); +    FLAG_FORCE(server.envskip);      FLAG_FORCE(server.qvirtual);      FLAG_FORCE(server.skip);      FLAG_FORCE(server.dns); @@ -458,6 +472,7 @@ void optmerge(struct query *h2, struct query *h1)      FLAG_MERGE(server.preauthenticate);      FLAG_MERGE(server.timeout);      FLAG_MERGE(server.envelope); +    FLAG_MERGE(server.envskip);      FLAG_MERGE(server.qvirtual);      FLAG_MERGE(server.skip);      FLAG_MERGE(server.dns);  | 
