|
|
1.1 root 1: /* @(#)ulockf 2.3 5/18/79 11:52:11 */
2: #include "uucp.h"
3: #include <sys/types.h>
4: #include <sys/stat.h>
5:
6: char Sulockf[] = "@(#)ulockf 2.3";
7:
8:
9: /*******
10: * ulockf(file, atime)
11: * char *file;
12: * time_t atime;
13: *
14: * ulockf - this routine will create a lock file (file).
15: * If one already exists, the create time is checked for
16: * older than the age time (atime).
17: * If it is older, an attempt will be made to unlink it
18: * and create a new one.
19: *
20: * return codes: 0 | FAIL
21: */
22:
23: ulockf(file, atime)
24: char *file;
25: time_t atime;
26: {
27: struct stat stbuf;
28: time_t ptime;
29: int ret;
30: static int pid = -1;
31: static char tempfile[NAMESIZE];
32:
33: if (pid < 0) {
34: pid = getpid();
35: sprintf(tempfile, "LTMP.%d", pid);
36: }
37: if (onelock(pid, tempfile, file) == -1) {
38: /* lock file exists */
39: /* get status to check age of the lock file */
40: ret = stat(file, &stbuf);
41: if (ret != -1) {
42: time(&ptime);
43: if ((ptime - stbuf.st_ctime) < atime) {
44: /* file not old enough to delete */
45: return(FAIL);
46: }
47: }
48: ret = unlink(file);
49: ret = onelock(pid, tempfile, file);
50: if (ret != 0)
51: return(FAIL);
52: }
53: stlock(file);
54: return(0);
55: }
56:
57:
58: #define MAXLOCKS 10 /* maximum number of lock files */
59: char *Lockfile[MAXLOCKS];
60: int Nlocks = 0;
61:
62: /***
63: * stlock(name) put name in list of lock files
64: * char *name;
65: *
66: * return codes: none
67: */
68:
69: stlock(name)
70: char *name;
71: {
72: char *p;
73: extern char *calloc();
74: int i;
75:
76: for (i = 0; i < Nlocks; i++) {
77: if (Lockfile[i] == NULL)
78: break;
79: }
80: ASSERT(i < MAXLOCKS, "TOO MANY LOCKS %d", i);
81: if (i >= Nlocks)
82: i = Nlocks++;
83: p = calloc(strlen(name) + 1, sizeof (char));
84: ASSERT(p != NULL, "CAN NOT ALLOCATE FOR %s", name);
85: strcpy(p, name);
86: Lockfile[i] = p;
87: return;
88: }
89:
90:
91: /***
92: * rmlock(name) remove all lock files in list
93: * char *name; or name
94: *
95: * return codes: none
96: */
97:
98: rmlock(name)
99: char *name;
100: {
101: int i;
102:
103: for (i = 0; i < Nlocks; i++) {
104: if (Lockfile[i] == NULL)
105: continue;
106: if (name == NULL
107: || strcmp(name, Lockfile[i]) == SAME) {
108: unlink(Lockfile[i]);
109: free(Lockfile[i]);
110: Lockfile[i] = NULL;
111: }
112: }
113: return;
114: }
115:
116:
117: /* this stuff from pjw */
118: /* /usr/pjw/bin/recover - check pids to remove unnecessary locks */
119: /* isalock(name) returns 0 if the name is a lock */
120: /* unlock(name) unlocks name if it is a lock*/
121: /* onelock(pid,tempfile,name) makes lock a name
122: on behalf of pid. Tempfile must be in the same
123: file system as name. */
124: /* lock(pid,tempfile,names) either locks all the
125: names or none of them */
126: isalock(name) char *name;
127: {
128: struct stat xstat;
129: if(stat(name,&xstat)<0) return(0);
130: if(xstat.st_size!=sizeof(int)) return(0);
131: return(1);
132: }
133: unlock(name) char *name;
134: {
135: if(isalock(name)) return(unlink(name));
136: else return(-1);
137: }
138: onelock(pid,tempfile,name) char *tempfile,*name;
139: { int fd;
140: fd=creat(tempfile,0444);
141: if(fd<0) return(-1);
142: write(fd,&pid,sizeof(int));
143: close(fd);
144: if(link(tempfile,name)<0)
145: { unlink(tempfile);
146: return(-1);
147: }
148: unlink(tempfile);
149: return(0);
150: }
151: lock(pid,tempfile,names) char *tempfile,**names;
152: { int i,j;
153: for(i=0;names[i]!=0;i++)
154: { if(onelock(pid,tempfile,names[i])==0) continue;
155: for(j=0;j<i;j++) unlink(names[j]);
156: return(-1);
157: }
158: return(0);
159: }
160:
161: #define LOCKPRE "LCK."
162:
163: /***
164: * delock(s) remove a lock file
165: * char *s;
166: *
167: * return codes: 0 | FAIL
168: */
169:
170: delock(s)
171: char *s;
172: {
173: char ln[30];
174:
175: sprintf(ln, "%s.%s", LOCKPRE, s);
176: rmlock(ln);
177: }
178:
179:
180: /***
181: * mlock(sys) create system lock
182: * char *sys;
183: *
184: * return codes: 0 | FAIL
185: */
186:
187: mlock(sys)
188: char *sys;
189: {
190: char lname[30];
191: sprintf(lname, "%s.%s", LOCKPRE, sys);
192: return(ulockf(lname, (time_t) 5400 ) < 0 ? FAIL : 0);
193: }
194:
195:
196:
197: /***
198: * ultouch() update access and modify times for lock files
199: *
200: * return code - none
201: */
202:
203: ultouch()
204: {
205: time_t time(), ptime;
206: int i;
207: struct ut {
208: time_t actime;
209: time_t modtime;
210: } ut;
211:
212: ut.actime = time(&ut.modtime);
213: for (i = 0; i < Nlocks; i++) {
214: if (Lockfile[i] == NULL)
215: continue;
216: utime(Lockfile[i], &ut);
217: }
218: return;
219: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.