diff options
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | driver.c | 3 | ||||
-rw-r--r-- | fetchmail-features.html | 8 | ||||
-rw-r--r-- | fetchmail.c | 3 | ||||
-rw-r--r-- | fetchmail.man | 20 | ||||
-rw-r--r-- | socket.c | 49 | ||||
-rw-r--r-- | uid.c | 6 |
7 files changed, 79 insertions, 13 deletions
@@ -2,11 +2,14 @@ (The `lines' figures total .c, .h, .l, and .y files under version control.) +* Dave Zarzycki's patch to enhance plugins, adding %h and %p. * Vitezslav Samel's patch to fix a Y2K bug in lsmgen.sh. * Fixed a fatal typo in fetchmailconf. * Resolved Debian bug #67559. It was a misdiagnosis. * Resolved Debian bugs #62115, #61983. * Return PS_NOMAIL when no server entries are active. +* pt_BR Update from George Godoy. +* David Taylor's fixes for the UIDL code. fetchmail-5.4.4 (Sun Jul 23 15:56:16 EDT 2000), 19172 lines: @@ -2201,7 +2201,8 @@ const int maxfetch; /* maximum number of messages to fetch */ struct idlist *sdp; for (sdp = ctl->newsaved; sdp; sdp = sdp->next) - if (sdp->val.status.num == num) + if ((sdp->val.status.num == num) + && (!toolarge || oldmsg)) sdp->val.status.mark = UID_SEEN; } diff --git a/fetchmail-features.html b/fetchmail-features.html index 563596d7..6bc065d4 100644 --- a/fetchmail-features.html +++ b/fetchmail-features.html @@ -10,7 +10,7 @@ <table width="100%" cellpadding=0><tr> <td width="30%">Back to <a href="index.html">Fetchmail Home Page</a> <td width="30%" align=center>To <a href="/~esr/sitemap.html">Site Map</a> -<td width="30%" align=right>$Date: 2000/07/23 13:21:22 $ +<td width="30%" align=right>$Date: 2000/08/06 09:01:42 $ </table> <HR> @@ -19,6 +19,10 @@ <H2>Since 5.0:</H2> <UL> <LI> +The plugin facility has been enhanced; %h and %p options are now +available to pass in the hostname and service port number. + +<LI> Added a dropdelivered option to discard Delivered-To headers. This addresses a problem with using fetchmail and postfix as a relay inside a domain; when postfix sees incoming messages with delivered-to @@ -228,7 +232,7 @@ get-mail, gwpop, pimp-1.0, pop-perl5-1.2, popc, popmail-1.6 and upop.<P> <table width="100%" cellpadding=0><tr> <td width="30%">Back to <a href="index.html">Fetchmail Home Page</a> <td width="30%" align=center>To <a href="/~esr/sitemap.html">Site Map</a> -<td width="30%" align=right>$Date: 2000/07/23 13:21:22 $ +<td width="30%" align=right>$Date: 2000/08/06 09:01:42 $ </table> <P><ADDRESS>Eric S. Raymond <A HREF="mailto:esr@thyrsus.com"><esr@snark.thyrsus.com></A></ADDRESS> diff --git a/fetchmail.c b/fetchmail.c index 970e1ac1..6c392f4a 100644 --- a/fetchmail.c +++ b/fetchmail.c @@ -653,7 +653,8 @@ int main(int argc, char **argv) #ifdef POP3_ENABLE /* leave the UIDL state alone if there have been any errors */ - if (!check_only && !querystatus) + if (!check_only && + ((querystatus==PS_SUCCESS) || (querystatus==PS_NOMAIL))) uid_swap_lists(ctl); #endif /* POP3_ENABLE */ diff --git a/fetchmail.man b/fetchmail.man index 55296cc7..730b89a1 100644 --- a/fetchmail.man +++ b/fetchmail.man @@ -238,11 +238,11 @@ the calkling user will be notified by email if this happens. .B \--plugin <command> (Keyword: plugin) The plugin option allows you to use an external program to establish the -TCP connection. This is useful if you want to use socks or need some -special firewalling setup. The program will be looked up in $PATH and -it will be passed two arguments: the name of the server and the name of -the port. Fetchmail will write to the plugin's stdin and read from -the plugin's stdout. +TCP connection. This is useful if you want to use socks, SSL, ssh, or +need some special firewalling setup. The program will be looked up in +$PATH and can optionally be passed the hostname and port as arguments +using "%h" and "%p" respectively. Fetchmail will write to the plugin's +stdin and read from the plugin's stdout. .TP .B \--plugout <command> (Keyword: plugout) @@ -1712,6 +1712,16 @@ poll mailhost.net via localhost port 1234 with proto pop3: mailhost.net sleep 20 </dev/null >/dev/null"; .fi +.PP +Here's an another example configuration using ssh and the plugin option. +The queries are made directly on the stdin and stdout of imapd via ssh. +Note that in this setup, IMAP authentication can be skipped. + +.nf +poll mailhost.net with proto imap and preauth ssh: + plugin "ssh %h /usr/sbin/imapd"; +.fi + .SH THE USE AND ABUSE OF MULTIDROP MAILBOXES Use the multiple-local-recipients feature with caution -- it can bite. Also note that all multidrop features are ineffective in ETRN mode. @@ -70,11 +70,55 @@ static int h_errno; #endif /* NET_SECURITY */ #ifdef HAVE_SOCKETPAIR +const char **parse_plugin(const char *plugin, const char *host, const char *service) +{ const char **argvec; + char *c, *p, *plugin_copy; + unsigned int s = 2 * sizeof(char*), i; + + plugin_copy = strdup(plugin); + if (!plugin_copy) + { + report(stderr, _("fetchmail: malloc failed\n")); + return NULL; + } + for (c = p = plugin_copy; *c; c++) + { if (isspace(*c) && !isspace(*p)) + s += sizeof(char*); + p = c; + } + argvec = malloc(s); + if (!argvec) + { + report(stderr, _("fetchmail: malloc failed\n")); + return NULL; + } + memset(argvec, 0, s); + for (c = p = plugin_copy, i = 0; *c; c++) + { if ((!isspace(*c)) && (c == p ? 1 : isspace(*p))) { + argvec[i] = c; + i++; + } + p = c; + } + for (c = plugin_copy; *c; c++) + { if (isspace(*c)) + *c = 0; + } + for (i = 0; argvec[i]; i++) + { if (strcmp(argvec[i], "%h") == 0) + argvec[i] = host; + if (strcmp(argvec[i], "%p") == 0) + argvec[i] = service; + } + return argvec; +} + static int handle_plugin(const char *host, const char *service, const char *plugin) /* get a socket mediated through a given external command */ { int fds[2]; + const char **argvec; if (socketpair(AF_UNIX,SOCK_STREAM,0,fds)) { report(stderr, _("fetchmail: socketpair failed\n")); @@ -98,8 +142,9 @@ static int handle_plugin(const char *host, (void) close(fds[0]); if (outlevel >= O_VERBOSE) report(stderr, _("running %s %s %s\n"), plugin, host, service); - execlp(plugin,plugin,host,service,0); - report(stderr, _("execl(%s) failed\n"), plugin); + argvec = parse_plugin(plugin,host,service); + execvp(*argvec, argvec); + report(stderr, _("execvp(%s) failed\n"), *argvec); exit(0); break; default: /* parent */ @@ -470,8 +470,10 @@ void write_saved_lists(struct query *hostlist, const char *idfile) /* if all lists are empty, nuke the file */ idcount = 0; for (ctl = hostlist; ctl; ctl = ctl->next) { - if (ctl->oldsaved) - idcount++; + for (idp = ctl->oldsaved; idp; idp = idp->next) + if (idp->val.status.mark == UID_SEEN + || idp->val.status.mark == UID_DELETED) + idcount++; } /* either nuke the file or write updated last-seen IDs */ |