83 |
|
persistfd = open(pfn, O_WRONLY|O_CREAT|O_EXCL, 0644); |
84 |
|
if (persistfd >= 0) { |
85 |
|
persistfname = pfn; |
86 |
– |
/* put something there for faulty lock daemons */ |
87 |
– |
write(persistfd, "Initializing...\n", 16); |
86 |
|
pflock(1); |
87 |
|
return; |
88 |
|
} |
122 |
|
goto createrr; |
123 |
|
sprintf(buf, "%s %d\n%s\n%s\n%s\n", progname, getpid(), |
124 |
|
inpname, outpname, errname); |
127 |
– |
if (lseek(persistfd, 0L, 0) < 0) |
128 |
– |
error(SYSTEM, "seek error on persist file"); |
125 |
|
n = strlen(buf); |
126 |
|
if (write(persistfd, buf, n) < n) |
127 |
|
error(SYSTEM, "error writing persist file"); |
132 |
– |
ftruncate(persistfd, (long)n); |
133 |
– |
fsync(persistfd); /* shouldn't be necessary, but.... */ |
128 |
|
/* wait TIMELIM for someone to signal us */ |
129 |
|
got_io = 0; |
130 |
|
signal(SIGIO, sig_io); |
131 |
|
oldalrm = (int (*)())signal(SIGALRM, sig_alrm); |
132 |
|
alarm(TIMELIM); |
133 |
< |
pflock(0); |
133 |
> |
pflock(0); /* unlock persist file for attach */ |
134 |
|
while (!got_io) |
135 |
< |
pause(); |
136 |
< |
alarm(0); |
135 |
> |
pause(); /* wait for attach */ |
136 |
> |
pflock(1); /* grab persist file right back! */ |
137 |
> |
alarm(0); /* turn off alarm */ |
138 |
|
signal(SIGALRM, oldalrm); |
139 |
|
signal(SIGIO, SIG_DFL); |
140 |
< |
pflock(1); |
140 |
> |
if (lseek(persistfd, 0L, 0) < 0 || ftruncate(persistfd, 0L) < 0) |
141 |
> |
error(SYSTEM, "seek/truncate error on persist file"); |
142 |
|
/* someone wants us; reopen stdin and stdout */ |
143 |
|
if (freopen(inpname, "r", stdin) == NULL) |
144 |
|
goto openerr; |
168 |
|
register int nr, n; |
169 |
|
char buf[512], *pfin, *pfout, *pferr; |
170 |
|
int pid, pid2 = -1; |
171 |
< |
/* load and close persist file */ |
172 |
< |
errno = 0; |
173 |
< |
nr = read(persistfd, buf, sizeof(buf)-1); |
174 |
< |
pfdetach(); |
175 |
< |
if (nr <= 0) |
171 |
> |
/* load persist file */ |
172 |
> |
while ((nr = read(persistfd, buf, sizeof(buf)-1)) == 0) { |
173 |
> |
pflock(0); |
174 |
> |
sleep(15); /* wait until ready */ |
175 |
> |
pflock(1); |
176 |
> |
} |
177 |
> |
pfdetach(); /* close persist file */ |
178 |
> |
if (nr < 0) |
179 |
|
error(SYSTEM, "error reading persist file"); |
180 |
|
buf[nr] = '\0'; |
181 |
|
if ((cp = index(buf, ' ')) == NULL) |