]> Pileus Git - ~andy/fetchmail/blobdiff - pop3.c
Ready to ship.
[~andy/fetchmail] / pop3.c
diff --git a/pop3.c b/pop3.c
index 0238fc3573bf19e5c380af2b092871d36778af02..bf91bc9206c7dcbb1867b89202f993e06847ef6f 100644 (file)
--- a/pop3.c
+++ b/pop3.c
@@ -21,6 +21,8 @@
 
 #define PROTOCOL_ERROR {error(0, 0, "protocol error"); return(PS_ERROR);}
 
+extern char *strstr(); /* needed on sysV68 R3V7.1. */
+
 static int last;
 
 int pop3_ok (FILE *sockfp, char *argbuf)
@@ -30,14 +32,8 @@ int pop3_ok (FILE *sockfp, char *argbuf)
     char buf [POPBUFSIZE+1];
     char *bufp;
 
-    if (SockGets(buf, sizeof(buf), sockfp)) {
-       if (buf[strlen(buf)-1] == '\n')
-           buf[strlen(buf)-1] = '\0';
-       if (buf[strlen(buf)-1] == '\r')
-           buf[strlen(buf)-1] = '\r';
-       if (outlevel == O_VERBOSE)
-           error(0, 0, "POP3< %s", buf);
-
+    if ((ok = gen_recv(sockfp, buf, sizeof(buf))) == 0)
+    {
        bufp = buf;
        if (*bufp == '+' || *bufp == '-')
            bufp++;
@@ -58,8 +54,6 @@ int pop3_ok (FILE *sockfp, char *argbuf)
        if (argbuf != NULL)
            strcpy(argbuf,bufp);
     }
-    else 
-       ok = PS_SOCKET;
 
     return(ok);
 }
@@ -68,7 +62,7 @@ int pop3_getauth(FILE *sockfp, struct query *ctl, char *greeting)
 /* apply for connection authorization */
 {
     /* build MD5 digest from greeting timestamp + password */
-    if (ctl->protocol == P_APOP) 
+    if (ctl->server.protocol == P_APOP) 
     {
        char *start,*end;
        char *msg;
@@ -100,9 +94,9 @@ int pop3_getauth(FILE *sockfp, struct query *ctl, char *greeting)
        free(msg);
     }
 
-    switch (ctl->protocol) {
+    switch (ctl->server.protocol) {
     case P_POP3:
-       if ((gen_transact(sockfp,"USER %s", ctl->remotename)) != 0)
+       if ((gen_transact(sockfp, "USER %s", ctl->remotename)) != 0)
            PROTOCOL_ERROR
 
        if ((gen_transact(sockfp, "PASS %s", ctl->password)) != 0)
@@ -115,6 +109,14 @@ int pop3_getauth(FILE *sockfp, struct query *ctl, char *greeting)
            PROTOCOL_ERROR
        break;
 
+    case P_RPOP:
+       if ((gen_transact(sockfp,"USER %s", ctl->remotename)) != 0)
+           PROTOCOL_ERROR
+
+       if ((gen_transact(sockfp, "RPOP %s", ctl->password)) != 0)
+           PROTOCOL_ERROR
+       break;
+
     default:
        error(0, 0, "Undefined protocol request in POP3_auth");
     }
@@ -169,14 +171,8 @@ static int pop3_getrange(FILE *sockfp, struct query *ctl, int*countp, int*newp)
                int     num;
 
                *newp = 0;
-               while (SockGets(buf, sizeof(buf), sockfp))
+               while ((ok = gen_recv(sockfp, buf, sizeof(buf))) == 0)
                {
-                   if (buf[strlen(buf)-1] == '\n')
-                       buf[strlen(buf)-1] = '\0';
-                   if (buf[strlen(buf)-1] == '\r')
-                       buf[strlen(buf)-1] = '\r';
-                   if (outlevel == O_VERBOSE)
-                       error(0, 0, "POP3< %s", buf);
                    if (buf[0] == '.')
                        break;
                    else if (sscanf(buf, "%d %s", &num, id) == 2)
@@ -206,16 +202,10 @@ static int pop3_getsizes(FILE *sockfp, int count, int *sizes)
     {
        char buf [POPBUFSIZE+1];
 
-       while (SockGets(buf, sizeof(buf), sockfp))
+       while ((ok = gen_recv(sockfp, buf, sizeof(buf))) == 0)
        {
            int num, size;
 
-           if (buf[strlen(buf)-1] == '\n')
-               buf[strlen(buf)-1] = '\0';
-           if (buf[strlen(buf)-1] == '\r')
-               buf[strlen(buf)-1] = '\r';
-           if (outlevel == O_VERBOSE)
-               error(0, 0, "POP3< %s", buf);
            if (buf[0] == '.')
                break;
            else if (sscanf(buf, "%d %d", &num, &size) == 2)
@@ -224,7 +214,7 @@ static int pop3_getsizes(FILE *sockfp, int count, int *sizes)
                sizes[num - 1] = -1;
        }
 
-       return(0);
+       return(ok);
     }
 }
 
@@ -239,7 +229,7 @@ static int pop3_is_old(FILE *sockfp, struct query *ctl, int num)
                            str_find (&ctl->newsaved, num)));
 }
 
-static int pop3_fetch(FILE *sockfp, int number, int *lenp)
+static int pop3_fetch(FILE *sockfp, struct query *ctl, int number, int *lenp)
 /* request nth message */
 {
     int ok;
@@ -253,9 +243,9 @@ static int pop3_fetch(FILE *sockfp, int number, int *lenp)
        *lenp = 0;
     else
     {
-       while (--cp > buf && isdigit(*cp))
+       while (--cp >= buf && isdigit(*cp))
            continue;
-       *lenp = atoi(cp);
+       *lenp = atoi(++cp);
     }
     return(0);
 }
@@ -280,14 +270,13 @@ const static struct method pop3 =
     pop3_fetch,                /* request given message */
     NULL,              /* no message trailer */
     pop3_delete,       /* how to delete a message */
-    NULL,              /* no POP3 expunge command */
     "QUIT",            /* the POP3 exit command */
 };
 
 int doPOP3 (struct query *ctl)
 /* retrieve messages using POP3 */
 {
-    if (ctl->mailbox[0]) {
+    if (ctl->mailbox) {
        fprintf(stderr,"Option --remote is not supported with POP3\n");
        return(PS_SYNTAX);
     }