svn commit: r248281 - head/lib/libutil
Pawel Jakub Dawidek
pjd at FreeBSD.org
Thu Mar 14 20:22:52 UTC 2013
Author: pjd
Date: Thu Mar 14 20:22:52 2013
New Revision: 248281
URL: http://svnweb.freebsd.org/changeset/base/248281
Log:
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 at erdgeist.org>
Reviewed by: jhb, Dirk Engling <erdgeist at erdgeist.org>
MFC after: 1 week
Modified:
head/lib/libutil/pidfile.c
Modified: head/lib/libutil/pidfile.c
==============================================================================
--- head/lib/libutil/pidfile.c Thu Mar 14 20:18:12 2013 (r248280)
+++ head/lib/libutil/pidfile.c Thu Mar 14 20:22:52 2013 (r248281)
@@ -126,20 +126,25 @@ pidfile_open(const char *path, mode_t mo
fd = flopen(pfh->pf_path,
O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_NONBLOCK, mode);
if (fd == -1) {
- if (errno == EWOULDBLOCK && pidptr != NULL) {
- 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)
+ if (errno == EWOULDBLOCK) {
+ if (pidptr == NULL) {
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);
return (NULL);
More information about the svn-src-head
mailing list