At 5:20 PM -0700 9/25/01, Gregory Hicks wrote: >Good call Randall... Were these in place for popper v3.0.2? Yes, these have been there as long as I can recall. Years and years. I'm concerned that you've lost mail, but from looking at the code I don't see it happening per your theory. There may be something else going on. I'd strongly suggest upgrading to Qpopper 4.0.3 anyway, since it has fixed some bugs. > >Regards, >Gregory Hicks > >> Date: Tue, 25 Sep 2001 15:32:36 -0700 >> To: "Dan Harkless" <[EMAIL PROTECTED]>, Subscribers of Qpopper ><[EMAIL PROTECTED]> >> From: Randall Gellens <[EMAIL PROTECTED]> >> Subject: Re: I lose email when our server crashes due to lack of O_EXCL use >> >> At 8:31 PM -0700 9/24/01, Dan Harkless wrote: >> >> >It looks to me like what's happening is that my scripts do a POP3 connect >> >(which I do more often than anyone else, explaining why only _I_ have >> >noticed mail loss), my spool is emptied out of /var/mail/<user> into >> >/var/mail/.<user>.pop, the machine crashes, and then after the machine's >> >back up again, my spool is zero-length and the temp_drop is overwritten by >> >the first check. >> > >> >I didn't pore through the code exhaustively, but I couldn't find any code >> >that would prevent this. Shouldn't there be code that would check for the >> >pre-existence of the temp_drop file and merge its messages back into the >> >spool before doing anything else?? >> >> There is such code, and has been for as long as I can recall. I've >> hit it many times in testing. >> >> An popper/pop_dropcopy.c:1532, we revert to non-server mode if the >> temp drop isn't empty: >> >> /* >> * If the temporary popdrop is not empty, revert to regular mode. >> */ >> if ( mybuf.st_size != 0 ) >> p->server_mode = 0; >> >> >> Then at line 1604 we deal with any left-over mail in the temp drop: >> >> if ( mybuf.st_size != 0 ) { /* Mostly this is for regular mode. */ >> DEBUG_LOG2 ( p, "Temp drop %s not empty (%u octets)", >> p->temp_drop, (unsigned) mybuf.st_size ); >> if ( init_dropinfo ( p, p->temp_drop, p->drop, time(0) ) != >POP_SUCCESS ) { >> /* Occurs on temp_drop corruption */ >> flock ( dfd, LOCK_UN ); >> close ( dfd ); >> return ( POP_FAILURE ); >> } >> >> At this point, the file pointer is at the end of the temp drop, >> following any left-over mail. We then lock the spool, append mail >> from it to the temp drop (after any left-over mail), zero the spool, >> and work out of the temp drop. >> >> >> >As I understand things, the only way to prevent any possibility of >> >overwriting an existing temp_drop file would be to do it atomically, with >> >O_EXCL specified along with O_CREAT on the open() call. >> >> I'm not sure why O_EXCL is needed. Qpopper always locks the temp >> drop before doing anything, to make sure only one Qpopper process is >> active for the user. It then checks if the file is non-empty, and >> processes any left-over mail. >> >> -- > >--------------------------------------------------------------------- >Gregory Hicks | Principal Systems Engineer >Cadence Design Systems | Direct: 408.576.3609 >555 River Oaks Pkwy M/S 6B1 | Fax: 408.894.3479 >San Jose, CA 95134 | Internet: [EMAIL PROTECTED] > >Tired of BSODs, My Computer, and Code Red? >http://www.sun.com/solaris/binaries/ --