[net.bugs.4bsd] /bin/mail times out on lock files too quickly

mp@allegra.UUCP (Mark Plotnick) (02/22/86)

<>
Index:	bin/mail 4.2BSD Fix

Description:
	/bin/mail tries to create a lock file for only 30 seconds.
	Since /usr/ucb/Mail can take longer than this to rewrite
	a mailbox, /bin/mail may append a message to the mailbox
	only to have it overwritten (or otherwise gotten rid of by the
	ftruncate that Mail performs) a few seconds (or minutes) later.
Repeat-By:
	Have a large mailbox.  Read mail on a loaded machine (fire up
	a couple of uucico's, troff's, and vlsi simulators to test this
	out; this will make you popular with the system staff, one way
	or the other).  Edit or delete some messages, and type q.
	If someone tries to send you mail before the mailbox
	is completely rewritten, you'll get a biff message and that's
	the last you'll ever see of the mail.

	Actually, all is not lost; you can take advantage of
	the fact that ftruncate doesn't zero out the last partial
	block of a file (this is documented in the BUGS (4.2BSD)
	or RESTRICTIONS (Ultrix) section of the man page) and write
	a program to seek past the end of the file and write a character,
	then pull the mailbox into an editor and hopefully
	extract the newly unearthed message.
Fix:
	I also increased the number of times that it will
	tolerate a disappearing lock file.  ../ucb/Mail/lock.c
	should probably also be fixed in this regard, since it
	only tries once.

	RCS file: mail.c,v
	retrieving revision 1.1
	diff -c -r1.1 mail.c
	*** /tmp/,RCSt1005526	Sat Feb 22 07:09:01 1986
	--- mail.c	Fri Aug  9 09:03:40 1985
	***************
	*** 725,731
				return(0);
			}
			if (stat(curlock, &sbuf) < 0) {
	! 			if (statfailed++ > 5)
					return(-1);
				sleep(5);
				continue;

	--- 725,731 -----
				return(0);
			}
			if (stat(curlock, &sbuf) < 0) {
	! 			if (statfailed++ > 200)
					return(-1);
				sleep(5);
				continue;
	***************
	*** 732,738
			}
			statfailed = 0;
			time(&curtime);
	! 		if (curtime < sbuf.st_ctime + 30) {
				sleep(5);
				continue;
			}

	--- 732,738 -----
			}
			statfailed = 0;
			time(&curtime);
	! 		if (curtime < sbuf.st_ctime + 1800) {
				sleep(5);
				continue;
			}

	Mark Plotnick
	Society for the Prevention of Mail Bugs
	allegra!mp