diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index 8125419..fe3300a 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -55,7 +55,7 @@ /* Create a lock file */ static int make_lock(pmhandle_t *handle) { - int fd; + int fd, lock; char *dir, *ptr; /* create the dir of the lockfile first */ @@ -69,11 +69,20 @@ static int make_lock(pmhandle_t *handle) return -1; } FREE(dir); - do { - fd = open(handle->lockfile, O_WRONLY | O_CREAT | O_EXCL, 0000); + fd = open(handle->lockfile, O_WRONLY | O_CREAT, 0000); } while (fd == -1 && errno == EINTR); if(fd > 0) { + do { + lock = flock(fd, LOCK_EX | LOCK_NB); + } while (lock == -1 && errno == EINTR); + if(lock == -1 && errno == EWOULDBLOCK) { + _alpm_log(PM_LOG_WARNING, + _("wait for database lock to be released\n")); + do { + lock = flock(fd, LOCK_EX | LOCK_NB); + } while (lock == -1 && (errno == EWOULDBLOCK || errno == EINTR)); + } FILE *f = fdopen(fd, "w"); fprintf(f, "%ld\n", (long)getpid()); fflush(f);