diff -Nur netqmail-1.05/netqmail-1.05/qmail-pop3d.c netqmail-1.05-fix/netqmail-1.05/qmail-pop3d.c --- netqmail-1.05/netqmail-1.05/qmail-pop3d.c 2006-11-20 11:45:13.000000000 +0100 +++ netqmail-1.05-fix/netqmail-1.05/qmail-pop3d.c 2006-11-20 11:45:57.000000000 +0100 @@ -114,6 +114,7 @@ struct message { int flagdeleted; + int flagseen; unsigned long size; char *fn; } *m; @@ -139,6 +140,7 @@ prioq_delmin(&pq); m[i].fn = filenames.s + pe.id; m[i].flagdeleted = 0; + m[i].flagseen = 0; if (stat(m[i].fn,&st) == -1) m[i].size = 0; else @@ -164,7 +166,10 @@ void pop3_rset(arg) char *arg; { int i; - for (i = 0;i < numm;++i) m[i].flagdeleted = 0; + for (i = 0;i < numm;++i) { + m[i].flagdeleted = 0; + m[i].flagseen = 0; + } last = 0; okay(0); } @@ -180,18 +185,33 @@ void pop3_quit(arg) char *arg; { int i; + char *dt; + for (i = 0;i < numm;++i) if (m[i].flagdeleted) { if (unlink(m[i].fn) == -1) err_nounlink(); } - else + else { if (str_start(m[i].fn,"new/")) { if (!stralloc_copys(&line,"cur/")) die_nomem(); if (!stralloc_cats(&line,m[i].fn + 4)) die_nomem(); - if (!stralloc_cats(&line,":2,")) die_nomem(); + if (m[i].flagseen == 0) { + if (!stralloc_cats(&line,":2,")) die_nomem(); + } else { + if (!stralloc_cats(&line,":2,S")) die_nomem(); + } if (!stralloc_0(&line)) die_nomem(); rename(m[i].fn,line.s); /* if it fails, bummer */ + } else { + dt = m[i].fn + str_rchr(m[i].fn, ':'); + if (m[i].flagseen == 1 && (*(dt + str_chr(dt, 'S')) != 'S')) { + if (!stralloc_copys(&line,m[i].fn)) die_nomem(); + if (!stralloc_cats(&line,"S")) die_nomem(); + if (!stralloc_0(&line)) die_nomem(); + rename(m[i].fn,line.s); + } } + } okay(0); die(); } @@ -271,6 +291,7 @@ substdio_fdbuf(&ssmsg,read,fd,ssmsgbuf,sizeof(ssmsgbuf)); blast(&ssmsg,limit); close(fd); + m[i].flagseen = 1; } struct commands pop3commands[] = {