|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <sys/types.h> ! 3: #include <dir.h> ! 4: #include <sys/stat.h> /* mjm <stat.h> --> <sys/stat.h> */ ! 5: #include "string.h" ! 6: ! 7: /* imports */ ! 8: extern char *mktemp(); ! 9: extern long time(); ! 10: extern unsigned int sleep(); ! 11: ! 12: #define LOCKPREFIX "/tmp/L." ! 13: static char lockname[DIRSIZ+sizeof(LOCKPREFIX)] = { 0 }; ! 14: ! 15: /* Lock the given file. The parameter "file" must contain at least one '/'. */ ! 16: extern void ! 17: lock(file) ! 18: char *file; ! 19: { ! 20: # define TMPLNAME "/tmp/mlXXXXX" ! 21: # define LOCKPREFIX "/tmp/L." ! 22: char tmplname[sizeof(TMPLNAME)*2]; ! 23: struct stat stbuf; ! 24: int fd; ! 25: ! 26: /* return if we are already in the middle of a lock */ ! 27: if (*lockname != '\0') ! 28: return; ! 29: ! 30: /* create a temporary file */ ! 31: (void)strcpy(tmplname, TMPLNAME); ! 32: (void)mktemp(tmplname); ! 33: if ((fd=creat(tmplname, 0444))<0) ! 34: return; ! 35: close(fd); ! 36: ! 37: /* Make a link to it with the lock file name. This will fail only ! 38: * if it already exists. ! 39: */ ! 40: (void)strcpy(lockname, LOCKPREFIX); ! 41: (void)strcat(lockname, strrchr(file, '/')+1); ! 42: lockname[DIRSIZ+sizeof("/tmp/")-1] = '\0'; ! 43: while (link(tmplname, lockname) < 0) { ! 44: long now; ! 45: ! 46: /* File is already locked. Break it if the lock is old. */ ! 47: sleep(2); ! 48: now = time((long *)0); ! 49: if (stat(lockname, &stbuf)==0 && stbuf.st_ctime+60 < now) { ! 50: if (stat(file, &stbuf)==0 && stbuf.st_mtime+60 >= now) ! 51: continue; ! 52: fprintf(stderr, "mail: breaking lock\n"); ! 53: unlink(lockname); ! 54: } ! 55: } ! 56: unlink(tmplname); ! 57: return; ! 58: } ! 59: ! 60: extern void ! 61: unlock() ! 62: { ! 63: if (*lockname != '\0') { ! 64: unlink(lockname); ! 65: *lockname = '\0'; ! 66: } ! 67: } ! 68:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.