You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
5.5 KiB
191 lines
5.5 KiB
--- 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);
|