mirror of
https://bitbucket.org/jsuto/piler.git
synced 2024-12-25 18:40:11 +01:00
fix an imap import bug
This commit is contained in:
parent
886b8162a6
commit
1b6ad16700
39
src/imap.c
39
src/imap.c
@ -69,10 +69,17 @@ int get_message_length_from_imap_answer(char *s, int *_1st_line_bytes){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int is_last_complete_packet(char *s, int len, char *tagok, char *tagbad){
|
int is_last_complete_packet(char *s, int len, char *tagok, char *tagbad, int *pos){
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
*pos = 0;
|
||||||
|
|
||||||
if(*(s+len-2) == '\r' && *(s+len-1) == '\n'){
|
if(*(s+len-2) == '\r' && *(s+len-1) == '\n'){
|
||||||
if(strstr(s, tagok)) return 1;
|
if((p = strstr(s, tagok))){
|
||||||
|
*pos = p - s;
|
||||||
|
if(*pos > 3) *pos -= 2;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
if(strstr(s, tagbad)) return 1;
|
if(strstr(s, tagbad)) return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,7 +88,7 @@ int is_last_complete_packet(char *s, int len, char *tagok, char *tagbad){
|
|||||||
|
|
||||||
|
|
||||||
int process_imap_folder(int sd, int *seq, char *folder, struct session_data *sdata, struct __data *data, struct __config *cfg){
|
int process_imap_folder(int sd, int *seq, char *folder, struct session_data *sdata, struct __data *data, struct __config *cfg){
|
||||||
int rc=ERR, i, n, pos, messages=0, len, readlen, fd, lastpos, nreads, processed_messages=0;
|
int rc=ERR, i, n, pos, endpos, messages=0, len, readlen, fd, lastpos, nreads, nwrites, processed_messages=0;
|
||||||
char *p, tag[SMALLBUFSIZE], tagok[SMALLBUFSIZE], tagbad[SMALLBUFSIZE], buf[MAXBUFSIZE], filename[SMALLBUFSIZE];
|
char *p, tag[SMALLBUFSIZE], tagok[SMALLBUFSIZE], tagbad[SMALLBUFSIZE], buf[MAXBUFSIZE], filename[SMALLBUFSIZE];
|
||||||
char aggrbuf[3*MAXBUFSIZE];
|
char aggrbuf[3*MAXBUFSIZE];
|
||||||
|
|
||||||
@ -112,8 +119,8 @@ int process_imap_folder(int sd, int *seq, char *folder, struct session_data *sda
|
|||||||
if(messages <= 0) return rc;
|
if(messages <= 0) return rc;
|
||||||
|
|
||||||
for(i=1; i<=messages; i++){
|
for(i=1; i<=messages; i++){
|
||||||
printf("processed: %7d\r", processed_messages); fflush(stdout);
|
|
||||||
processed_messages++;
|
processed_messages++;
|
||||||
|
printf("processed: %7d\r", processed_messages); fflush(stdout);
|
||||||
|
|
||||||
snprintf(tag, sizeof(tag)-1, "A%d", *seq);
|
snprintf(tag, sizeof(tag)-1, "A%d", *seq);
|
||||||
snprintf(tagok, sizeof(tagok)-1, "\r\nA%d OK", (*seq)++);
|
snprintf(tagok, sizeof(tagok)-1, "\r\nA%d OK", (*seq)++);
|
||||||
@ -137,6 +144,8 @@ int process_imap_folder(int sd, int *seq, char *folder, struct session_data *sda
|
|||||||
pos = 0;
|
pos = 0;
|
||||||
len = 0;
|
len = 0;
|
||||||
nreads = 0;
|
nreads = 0;
|
||||||
|
nwrites = 0;
|
||||||
|
endpos = 0;
|
||||||
|
|
||||||
memset(aggrbuf, 0, sizeof(aggrbuf));
|
memset(aggrbuf, 0, sizeof(aggrbuf));
|
||||||
lastpos = 0;
|
lastpos = 0;
|
||||||
@ -156,7 +165,13 @@ int process_imap_folder(int sd, int *seq, char *folder, struct session_data *sda
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(lastpos + n + sizeof(buf) > sizeof(aggrbuf)){
|
if(lastpos + n + sizeof(buf) > sizeof(aggrbuf)){
|
||||||
|
nwrites++;
|
||||||
|
|
||||||
|
if(nwrites == 1)
|
||||||
|
write(fd, aggrbuf+pos, lastpos-pos);
|
||||||
|
else
|
||||||
write(fd, aggrbuf, lastpos);
|
write(fd, aggrbuf, lastpos);
|
||||||
|
|
||||||
memset(aggrbuf, 0, sizeof(aggrbuf));
|
memset(aggrbuf, 0, sizeof(aggrbuf));
|
||||||
lastpos = 0;
|
lastpos = 0;
|
||||||
}
|
}
|
||||||
@ -164,12 +179,24 @@ int process_imap_folder(int sd, int *seq, char *folder, struct session_data *sda
|
|||||||
memcpy(aggrbuf+lastpos, buf, n);
|
memcpy(aggrbuf+lastpos, buf, n);
|
||||||
lastpos += n;
|
lastpos += n;
|
||||||
|
|
||||||
if(is_last_complete_packet(aggrbuf, lastpos, tagok, tagbad) == 1){
|
if(is_last_complete_packet(aggrbuf, lastpos, tagok, tagbad, &endpos) == 1){
|
||||||
write(fd, aggrbuf, lastpos);
|
nwrites++;
|
||||||
|
if(nwrites == 1)
|
||||||
|
write(fd, aggrbuf+pos, lastpos-(lastpos-endpos)-pos);
|
||||||
|
else
|
||||||
|
write(fd, aggrbuf, lastpos-(lastpos-endpos));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
nwrites++;
|
||||||
|
if(nwrites == 1){
|
||||||
|
if(lastpos-n-pos > 0) write(fd, aggrbuf+pos, lastpos-n-pos); else nwrites--;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
write(fd, aggrbuf, lastpos-n);
|
write(fd, aggrbuf, lastpos-n);
|
||||||
|
}
|
||||||
|
|
||||||
memmove(aggrbuf, aggrbuf+lastpos-n, n);
|
memmove(aggrbuf, aggrbuf+lastpos-n, n);
|
||||||
lastpos = n;
|
lastpos = n;
|
||||||
memset(aggrbuf+lastpos, 0, sizeof(aggrbuf)-lastpos);
|
memset(aggrbuf+lastpos, 0, sizeof(aggrbuf)-lastpos);
|
||||||
|
Loading…
Reference in New Issue
Block a user