BSD 4 development
[unix-history] / usr / src / cmd / ucbmail / lock.c
CommitLineData
c8eb690c
BJ
1#
2
3/*
4 * A mailing program.
5 *
6 * Stuff to do version 7 style locking.
7 */
8
9#include "rcv.h"
10#include <sys/stat.h>
11
12char *maillock = ".lock"; /* Lock suffix for mailname */
13char *lockname = "/usr/spool/mail/tmXXXXXX";
14char locktmp[30]; /* Usable lock temporary */
15static char curlock[50]; /* Last used name of lock */
16static int locked; /* To note that we locked it */
17
18/*
19 * Lock the specified mail file by setting the file mailfile.lock.
20 * We must, of course, be careful to remove the lock file by a call
21 * to unlock before we stop. The algorithm used here is to see if
22 * the lock exists, and if it does, to check its modify time. If it
23 * is older than 30 seconds, we assume error and set our own file.
24 * Otherwise, we wait for 5 seconds and try again.
25 */
26
27lock(file)
28char *file;
29{
30 register int f;
31 struct stat sbuf;
32 long curtime;
33
34 if (file == NOSTR) {
35 printf("Locked = %d\n", locked);
36 return(0);
37 }
38 if (locked)
39 return(0);
40 strcpy(curlock, file);
41 strcat(curlock, maillock);
42 strcpy(locktmp, lockname);
43 mktemp(locktmp);
44 remove(locktmp);
45 for (;;) {
46 f = lock1(locktmp, curlock);
47 if (f == 0) {
48 locked = 1;
49 return(0);
50 }
51 if (stat(curlock, &sbuf) < 0)
52 return(0);
53 time(&curtime);
54 if (curtime < sbuf.st_ctime + 30) {
55 sleep(5);
56 continue;
57 }
58 remove(curlock);
59 }
60}
61
62/*
63 * Remove the mail lock, and note that we no longer
64 * have it locked.
65 */
66
67unlock()
68{
69
70 remove(curlock);
71 locked = 0;
72}
73
74/*
75 * Attempt to set the lock by creating the temporary file,
76 * then doing a link/unlink. If it fails, return -1 else 0
77 */
78
79lock1(tempfile, name)
80 char tempfile[], name[];
81{
82 register int fd;
83
84 fd = creat(tempfile, 0);
85 if (fd < 0)
86 return(-1);
87 close(fd);
88 if (link(tempfile, name) < 0) {
89 remove(tempfile);
90 return(-1);
91 }
92 remove(tempfile);
93 return(0);
94}