diff options
author | Eric S. Raymond <esr@thyrsus.com> | 1996-10-01 06:23:07 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 1996-10-01 06:23:07 +0000 |
commit | 9822112a35d7962b08730668ea2aa2355315ea42 (patch) | |
tree | 1f3c3d697b1cb5ecafc2fc05f6685997e854726a | |
parent | 62de2ec3f7d426a042992c33f38607149d2d2e70 (diff) | |
download | fetchmail-9822112a35d7962b08730668ea2aa2355315ea42.tar.gz fetchmail-9822112a35d7962b08730668ea2aa2355315ea42.tar.bz2 fetchmail-9822112a35d7962b08730668ea2aa2355315ea42.zip |
Fix broken response parsing.
svn path=/trunk/; revision=184
-rw-r--r-- | imap.c | 81 |
1 files changed, 46 insertions, 35 deletions
@@ -74,43 +74,54 @@ int imap_ok (argbuf,socket) char *argbuf; int socket; { - int ok; - char buf [POPBUFSIZE+1]; - char *bufp; - int n; - - do { - if (SockGets(socket, buf, sizeof(buf)) < 0) - return(PS_SOCKET); - - if (outlevel == O_VERBOSE) - fprintf(stderr,"%s\n",buf); - - /* interpret untagged status responses */ - if (strstr(buf, "EXISTS")) - exists = atoi(buf+2); - if (strstr(buf, "RECENT")) - recent = atoi(buf+2); - if (sscanf(buf + 2, "OK [UNSEEN %d]", &n) == 1) - unseen = n; - - } while - (tag[0] != '\0' && strncmp(buf, tag, strlen(tag))); - - if (tag[0] == '\0') { - strcpy(argbuf, buf); - return(0); - } - else { - if (strncmp(buf + TAGLEN + 1, "OK", 2) == 0) { - strcpy(argbuf, buf + TAGLEN); - return(0); + int ok; + char buf [POPBUFSIZE+1]; + char *bufp; + int n; + + do { + if (SockGets(socket, buf, sizeof(buf)) < 0) + return(PS_SOCKET); + + if (outlevel == O_VERBOSE) + fprintf(stderr,"%s\n",buf); + + /* interpret untagged status responses */ + if (strstr(buf, "EXISTS")) + exists = atoi(buf+2); + if (strstr(buf, "RECENT")) + recent = atoi(buf+2); + if (sscanf(buf + 2, "OK [UNSEEN %d]", &n) == 1) + unseen = n; + + } while + (tag[0] != '\0' && strncmp(buf, tag, strlen(tag))); + + if (tag[0] == '\0') + { + strcpy(argbuf, buf); + return(0); } - else if (strncmp(buf + TAGLEN + 1, "BAD", 2) == 0) - return(PS_ERROR); else - return(PS_PROTOCOL); - } + { + char *cp; + + /* skip the tag */ + for (cp = buf; !isspace(*cp); cp++) + continue; + while (isspace(*cp)) + cp++; + + if (strncmp(cp, "OK", 2) == 0) + { + strcpy(argbuf, cp); + return(0); + } + else if (strncmp(cp, "BAD", 2) == 0) + return(PS_ERROR); + else + return(PS_PROTOCOL); + } } int imap_getauth(socket, queryctl, buf) |