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