aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--fetchmail.h5
-rw-r--r--options.c7
-rw-r--r--pop3.c20
-rw-r--r--rcfile_l.l1
-rw-r--r--rcfile_y.y6
6 files changed, 33 insertions, 9 deletions
diff --git a/NEWS b/NEWS
index 49113bd5..54195632 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,8 @@
Release Notes:
+fetchmail-4.5.6 ():
+* SDPS support, experimental version 2. Requires configure --enable-SDPS.
+
fetchmail-4.5.5 (Mon Aug 3 16:08:14 EDT 1998):
* Brendan Cully's FAQ entry on GSSAPI.
* Andrew Cagney's improvement to Received-line parsing.
diff --git a/fetchmail.h b/fetchmail.h
index 7b1e7300..aa1c1215 100644
--- a/fetchmail.h
+++ b/fetchmail.h
@@ -142,7 +142,10 @@ struct hostdata /* shared among all user connections to given server */
flag skip; /* suppress poll in implicit mode? */
flag dns; /* do DNS lookup on multidrop? */
flag uidl; /* use RFC1725 UIDLs? */
- flag checkalias; /* try to resolve aliases by comparing IPs ?*/
+#ifdef SDPS_ENABLE
+ flag sdps; /* use Demon Internet SDPS *ENV */
+#endif /* SDPS_ENABLE */
+ flag checkalias; /* resolve aliases by comparing IPs? */
#ifdef linux
diff --git a/options.c b/options.c
index 8b77ddb7..6ae2f61e 100644
--- a/options.c
+++ b/options.c
@@ -285,6 +285,13 @@ struct query *ctl; /* option record to be initialized */
/* XXX -- should probably use a table lookup here */
if (strcasecmp(optarg,"pop2") == 0)
ctl->server.protocol = P_POP2;
+#ifdef SDPS_ENABLE
+ else if (strcasecmp(optarg,"sdps") == 0)
+ {
+ ctl->server.protocol = P_POP3;
+ ctl->server.sdps = TRUE;
+ }
+#endif /* SDPS_ENABLE */
else if (strcasecmp(optarg,"pop3") == 0)
ctl->server.protocol = P_POP3;
else if (strcasecmp(optarg,"apop") == 0)
diff --git a/pop3.c b/pop3.c
index 2514c1e8..6b595fe6 100644
--- a/pop3.c
+++ b/pop3.c
@@ -120,7 +120,14 @@ int pop3_getauth(int sock, struct query *ctl, char *greeting)
* If we see either, and we're in multidrop mode, try to use
* the SDPS *ENV extension.
*/
- sdps_enable = MULTIDROP(ctl) && strstr(greeting, "demon.");
+ sdps_enable = (MULTIDROP(ctl) && strstr(greeting, "demon."));
+ /*
+ * Use SDPS if configured, regardless of the greeting string
+ * returned from the POP server. (Users accessing demon by a
+ * POP3 proxy may need this)
+ */
+ if (ctl->server.sdps)
+ sdps_enable = ctl->server.sdps;
#endif /* SDPS_ENABLE */
switch (ctl->server.protocol) {
@@ -543,22 +550,21 @@ static int pop3_fetch(int sock, struct query *ctl, int number, int *lenp)
if (sdps_enable)
{
int linecount = 0;
-
sdps_envto = (char *)NULL;
gen_send(sock, "*ENV %d", number);
do {
if (gen_recv(sock, buf, sizeof(buf)))
+ {
break;
+ }
linecount++;
- if (buf[0] == '-' || strncmp(buf , "+OK", 3))
- break;
- if (linecount == 4)
+ if (linecount == 5)
{
- sdps_envto = strdup(buf);
+ sdps_envto = strdup(buf);
error(0, 0, "*ENV returned envelope address %s");
}
} while
- (buf[0] != '.' && (buf[1] == '\r' || buf[1] == '\n'));
+ (buf[0] !='.');
}
#endif /* SDPS_ENABLE */
diff --git a/rcfile_l.l b/rcfile_l.l
index 90fc2230..f10190f3 100644
--- a/rcfile_l.l
+++ b/rcfile_l.l
@@ -97,6 +97,7 @@ options {/* EMPTY */}
(auto)|(AUTO) { yylval.proto = P_AUTO; return PROTO; }
(pop2)|(POP2) { yylval.proto = P_POP2; return PROTO; }
+(sdps)|(SDPS) { return SDPS; }
(pop3)|(POP3) { yylval.proto = P_POP3; return PROTO; }
(imap-k4)|(IMAP-K4) { yylval.proto = P_IMAP_K4; return PROTO; }
(imap-gss)|(IMAP-GSS) { yylval.proto = P_IMAP_GSS; return PROTO; }
diff --git a/rcfile_y.y b/rcfile_y.y
index d03820b3..aa4e715f 100644
--- a/rcfile_y.y
+++ b/rcfile_y.y
@@ -58,7 +58,7 @@ extern char * yytext;
}
%token DEFAULTS POLL SKIP VIA AKA LOCALDOMAINS PROTOCOL
-%token AUTHENTICATE TIMEOUT KPOP KERBEROS4 KERBEROS5 KERBEROS
+%token AUTHENTICATE TIMEOUT KPOP SDPS KERBEROS4 KERBEROS5 KERBEROS
%token ENVELOPE QVIRTUAL USERNAME PASSWORD FOLDER SMTPHOST MDA SMTPADDRESS
%token SPAMRESPONSE PRECONNECT POSTCONNECT LIMIT
%token NETSEC INTERFACE MONITOR
@@ -139,6 +139,10 @@ serv_option : AKA alias_list
current.server.port = KPOP_PORT;
#endif /* INET6 */
}
+ | SDPS {
+ current.server.protocol = P_POP3;
+ current.server.sdps = TRUE;
+ }
| UIDL {current.server.uidl = FLAG_TRUE;}
| NO UIDL {current.server.uidl = FLAG_FALSE;}
| CHECKALIAS {current.server.checkalias = FLAG_TRUE;}