Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 106544 Details for
Bug 161530
x11-plugins/wmpop3lb fixes
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
full recv and STAT if LAST fail patch
wmpop3lb-2.4.2-corect-recv-response-from-server-and-try-STAT-if-LAST-wont-work.patch (text/plain), 5.54 KB, created by
roma1390
on 2007-01-11 12:53:29 UTC
(
hide
)
Description:
full recv and STAT if LAST fail patch
Filename:
MIME Type:
Creator:
roma1390
Created:
2007-01-11 12:53:29 UTC
Size:
5.54 KB
patch
obsolete
>--- wmpop3lb2.4.2/wmpop3/Pop3Client.c 2002-06-27 16:04:42.000000000 +0200 >+++ wmpop3lb2.4.2-pathed/wmpop3/Pop3Client.c 2007-01-11 14:39:12.000000000 +0200 >@@ -27,6 +27,49 @@ > > #include "Pop3Client.h" > >+/* receive full responce */ >+int do_recv(int s, void *ibuf, size_t len, int flags) >+{ >+ size_t ret, total; >+ char *p, *buf = ibuf; >+ >+ total = 0; >+ while (1) >+ { >+ /* left one byte for null termination */ >+ ret = recv(s, buf + total, len - 1 - total, flags); >+ /* if we got error or close, then brea */ >+ if (ret <= 0) >+ { >+ break; >+ } >+ /* increase size of received data */ >+ total += ret; >+ /* null terminating received data */ >+ buf[total] = 0; >+ /* left one byte for null termination >+ * if out of buffer, return */ >+ if (len - total <= 1) >+ { >+ break; >+ } >+ /* if we found end of line signal, then stop */ >+ p = strstr(buf, "\r\n"); >+ printf("p == %p\n", p); >+ if (p != 0) >+ { >+ break; >+ } >+ } >+ >+ /* if there wasn't any data, then return error code */ >+ if (total == 0) >+ { >+ return ret; >+ } >+ return total; >+} >+ > /* return size if all goes well, -1 if not expected answer */ > int send_command(char *exp_answer, char **retour, Pop3 pc) > { >@@ -61,18 +104,29 @@ > return (pc); > } > int pop3MakeConnection(Pop3 pc, char *serverName, int port){ >+ struct timeval t; > > pc->s = socket(AF_INET, SOCK_STREAM, 0 ); > memset( &(pc->server), 0 , sizeof(pc->server)); > pc->server.sin_family = AF_INET; > pc->hp = gethostbyname(serverName); > if( pc->hp == 0) >+ { >+ close(pc->s); > return -1; >+ } > memcpy( &(pc->server.sin_addr), pc->hp->h_addr, pc->hp->h_length); > pc->server.sin_port = htons(port); > if ( connect(pc->s, (struct sockaddr *)&(pc->server) > , sizeof(pc->server)) < 0 ) >+ { >+ close(pc->s); > return -1; >+ } >+ t.tv_sec = 60; >+ t.tv_usec = 0; >+ setsockopt(pc->s, SOL_SOCKET, SO_RCVTIMEO, &t, sizeof(t)); >+ setsockopt(pc->s, SOL_SOCKET, SO_SNDTIMEO, &t, sizeof(t)); > pc->connected = CONNECTED; > return 0; > } >@@ -94,7 +148,7 @@ > return -1; > } > >- size = recv(pc->s,&pc->inBuf,1024,0); >+ size = do_recv(pc->s,&pc->inBuf,1024,0); > memset(temp,0,1024); > memcpy(temp,pc->inBuf,size); > if( temp[0] != '+' ){ >@@ -104,10 +158,10 @@ > > sprintf(pc->outBuf,"USER %s\r\n",name); > send(pc->s, &pc->outBuf,strlen(pc->outBuf),0); >- size =recv(pc->s,pc->inBuf,1024,0); >+ size = do_recv(pc->s,pc->inBuf,1024,0); > memset(temp,0,1024); > memcpy(temp,pc->inBuf,size); >- if( temp[0] != '+' ){ >+ if( temp[0] != '+' && temp[0] != '\r' ){ > fprintf(stderr,"Invalid User Name\n"); > return -1; > } >@@ -115,10 +169,10 @@ > memset(pc->outBuf,0,1024); > sprintf(pc->outBuf,"PASS %s\r\n",pass); > send(pc->s, pc->outBuf, strlen(pc->outBuf),0 ); >- size =recv(pc->s,&pc->inBuf,1024,0); >+ size = do_recv(pc->s,&pc->inBuf,1024,0); > memset(temp,0,1024); > memcpy(temp,pc->inBuf,size); >- if( temp[0] != '+' ){ >+ if( temp[0] != '+' && temp[0] != '\r'){ > fprintf(stderr,"Incorrect Password\n"); > return -1; > } >@@ -213,7 +267,7 @@ > /* Find total number of messages in mail box */ > sprintf(pc->outBuf,"STAT\r\n"); > send(pc->s, pc->outBuf, strlen(pc->outBuf),0 ); >- size = recv(pc->s,pc->inBuf,1024,0); >+ size = do_recv(pc->s,pc->inBuf,1024,0); > if( pc->inBuf[0] != '+' ){ > perror("Error Receiving Stats"); > return (-1); >@@ -266,7 +320,7 @@ > /* Find total number of messages in mail box */ > sprintf(pc->outBuf,"STAT\r\n"); > send(pc->s, pc->outBuf, strlen(pc->outBuf),0 ); >- size = recv(pc->s,pc->inBuf,1024,0); >+ size = do_recv(pc->s,pc->inBuf,1024,0); > pc->inBuf[size] = '\0'; > #ifdef _DEBUG > printf(" pop3CheckMail, stat received buf (size=%d): [%s]\n", >@@ -313,7 +367,7 @@ > > sprintf(pc->outBuf,"LAST\r\n"); > send(pc->s, pc->outBuf, strlen(pc->outBuf),0 ); >- size = recv(pc->s,pc->inBuf,1024,0); >+ size = do_recv(pc->s,pc->inBuf,1024,0); > pc->inBuf[size] = '\0'; > #ifdef _DEBUG > printf(" pop3CheckMail, last received buf (size=%d): [%s]\n", >@@ -325,9 +379,25 @@ > #ifdef _DEBUG > printf(" Error Receiving LAST: [%s]\n", temp); > #endif >- pc->numOfUnreadMessages = pc->numOfMessages; >+ /* TRY STAT instead LAST */ >+ sprintf(pc->outBuf,"STAT\r\n"); >+ send(pc->s, pc->outBuf, strlen(pc->outBuf),0 ); >+ size = do_recv(pc->s,pc->inBuf,1024,0); >+ pc->inBuf[size] = '\0'; >+#ifdef _DEBUG >+ printf(" pop3CheckMail, last received buf (size=%d): [%s]\n", >+ size, pc->inBuf); >+#endif >+ memset(temp,0,1024); >+ memcpy(temp,pc->inBuf,size); >+ if( temp[0] != '+' ){ >+#ifdef _DEBUG >+ printf(" Error Receiving STAT: [%s]\n", temp); >+#endif >+ pc->numOfUnreadMessages = pc->numOfMessages; >+ } > } >- else { >+ if( temp[0] != '+' ){ > ptr = strtok(temp, " "); > ptr = strtok( 0," "); > pc->numOfUnreadMessages = pc->numOfMessages - atoi(ptr); >@@ -545,7 +615,7 @@ > printf(" %s\n", pc->outBuf); > #endif > send(pc->s, pc->outBuf, strlen(pc->outBuf), 0); >- size = recv(pc->s, pc->inBuf, 4096, 0); >+ size = do_recv(pc->s, pc->inBuf, 4096, 0); > if ('+' != pc->inBuf[0]) { > perror("error while deleting mail"); > return (1); >@@ -579,7 +649,7 @@ > if( pc->connected == NOT_CONNECTED ) > return -1; > send(pc->s, "quit\r\n", 6,0 ); >- size =recv(pc->s,&pc->inBuf,1024,0); >+ size = do_recv(pc->s,&pc->inBuf,1024,0); > pc->connected = NOT_CONNECTED; > if(pc->s != 0) > close(pc->s);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 161530
: 106544