When pidptr was passed as NULL to pidfile_open(3), we were returning
EAGAIN/EWOULDBLOCK when another daemon was running and had the pidfile open. We should return EEXIST in that case, fix it. Reported by: Dirk Engling <erdgeist@erdgeist.org> Reviewed by: jhb, Dirk Engling <erdgeist@erdgeist.org> MFC after: 1 week
This commit is contained in:
parent
e8a4a618cf
commit
36a00a3f38
@ -126,20 +126,25 @@ pidfile_open(const char *path, mode_t mode, pid_t *pidptr)
|
|||||||
fd = flopen(pfh->pf_path,
|
fd = flopen(pfh->pf_path,
|
||||||
O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_NONBLOCK, mode);
|
O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_NONBLOCK, mode);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
if (errno == EWOULDBLOCK && pidptr != NULL) {
|
if (errno == EWOULDBLOCK) {
|
||||||
count = 20;
|
if (pidptr == NULL) {
|
||||||
rqtp.tv_sec = 0;
|
|
||||||
rqtp.tv_nsec = 5000000;
|
|
||||||
for (;;) {
|
|
||||||
errno = pidfile_read(pfh->pf_path, pidptr);
|
|
||||||
if (errno != EAGAIN || --count == 0)
|
|
||||||
break;
|
|
||||||
nanosleep(&rqtp, 0);
|
|
||||||
}
|
|
||||||
if (errno == EAGAIN)
|
|
||||||
*pidptr = -1;
|
|
||||||
if (errno == 0 || errno == EAGAIN)
|
|
||||||
errno = EEXIST;
|
errno = EEXIST;
|
||||||
|
} else {
|
||||||
|
count = 20;
|
||||||
|
rqtp.tv_sec = 0;
|
||||||
|
rqtp.tv_nsec = 5000000;
|
||||||
|
for (;;) {
|
||||||
|
errno = pidfile_read(pfh->pf_path,
|
||||||
|
pidptr);
|
||||||
|
if (errno != EAGAIN || --count == 0)
|
||||||
|
break;
|
||||||
|
nanosleep(&rqtp, 0);
|
||||||
|
}
|
||||||
|
if (errno == EAGAIN)
|
||||||
|
*pidptr = -1;
|
||||||
|
if (errno == 0 || errno == EAGAIN)
|
||||||
|
errno = EEXIST;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
free(pfh);
|
free(pfh);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user