From 3c77c6e7d3f597400b3ae10dd1228aabf1ad6280 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sat, 20 Nov 2004 23:48:18 +0000 Subject: * remove autospawn lock file usage * fix some compiler warnings * implement PID file support git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@296 fefdeb5f-60dc-0310-8127-8f9354f1896f --- polyp/util.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) (limited to 'polyp/util.c') diff --git a/polyp/util.c b/polyp/util.c index 23515f03..2ad26c41 100644 --- a/polyp/util.c +++ b/polyp/util.c @@ -612,20 +612,27 @@ finish: /* Lock or unlock a file entirely. (advisory) */ int pa_lock_fd(int fd, int b) { - struct flock flock; + /* Try a R/W lock first */ + flock.l_type = b ? F_WRLCK : F_UNLCK; flock.l_whence = SEEK_SET; flock.l_start = 0; flock.l_len = 0; - if (fcntl(fd, F_SETLKW, &flock) < 0) { - pa_log(__FILE__": %slock failed: %s\n", !b ? "un" : "", strerror(errno)); - return -1; - } + if (fcntl(fd, F_SETLKW, &flock) >= 0) + return 0; - return 0; + /* Perhaps the file descriptor qas opened for read only, than try again with a read lock. */ + if (b && errno == EBADF) { + flock.l_type = F_RDLCK; + if (fcntl(fd, F_SETLKW, &flock) >= 0) + return 0; + } + + pa_log(__FILE__": %slock failed: %s\n", !b ? "un" : "", strerror(errno)); + return -1; } /* Remove trailing newlines from a string */ @@ -642,35 +649,43 @@ int pa_lock_lockfile(const char *fn) { assert(fn); if ((fd = open(fn, O_CREAT|O_RDWR, S_IRUSR|S_IWUSR)) < 0) { - pa_log(__FILE__": failed to create lock file '%s'\n", fn); + pa_log(__FILE__": failed to create lock file '%s': %s\n", fn, strerror(errno)); goto fail; } if (pa_lock_fd(fd, 1) < 0) + pa_log(__FILE__": failed to lock file '%s'.\n", fn); goto fail; return fd; fail: - if (fd >= 0) + if (fd >= 0) { + unlink(fn); close(fd); + } return -1; } /* Unlock a temporary lcok file */ -int pa_unlock_lockfile(int fd) { +int pa_unlock_lockfile(const char *fn, int fd) { int r = 0; - assert(fd >= 0); + assert(fn && fd >= 0); + if (unlink(fn) < 0) { + pa_log(__FILE__": WARNING: unable to remove lock file '%s': %s\n", fn, strerror(errno)); + r = -1; + } + if (pa_lock_fd(fd, 0) < 0) { - pa_log(__FILE__": WARNING: failed to unlock file.\n"); + pa_log(__FILE__": WARNING: failed to unlock file '%s'.\n", fn); r = -1; } if (close(fd) < 0) { - pa_log(__FILE__": WARNING: failed to close lock file.\n"); + pa_log(__FILE__": WARNING: failed to close lock file '%s': %s\n", fn, strerror(errno)); r = -1; } -- cgit