6 #include <rpm/rpmlog.h>
7 #include <rpm/rpmfileutil.h>
9 #include "lib/rpmlock.h"
13 /* Internal interface */
16 RPMLOCK_READ = 1 << 0,
17 RPMLOCK_WRITE = 1 << 1,
18 RPMLOCK_WAIT = 1 << 2,
26 static rpmlock rpmlock_new(const char *lock_path)
28 rpmlock lock = (rpmlock) malloc(sizeof(*lock));
31 mode_t oldmask = umask(022);
32 lock->fd = open(lock_path, O_RDWR|O_CREAT, 0644);
33 (void) umask(oldmask);
36 lock->fd = open(lock_path, O_RDONLY);
41 lock->openmode = RPMLOCK_READ;
44 lock->openmode = RPMLOCK_WRITE | RPMLOCK_READ;
50 static void rpmlock_free(rpmlock lock)
53 (void) close(lock->fd);
58 static int rpmlock_acquire(rpmlock lock, int mode)
61 if (lock && (mode & lock->openmode)) {
64 if (mode & RPMLOCK_WAIT)
68 if (mode & RPMLOCK_READ)
69 info.l_type = F_RDLCK;
71 info.l_type = F_WRLCK;
72 info.l_whence = SEEK_SET;
76 if (fcntl(lock->fd, cmd, &info) != -1)
82 static void rpmlock_release(rpmlock lock)
86 info.l_type = F_UNLCK;
87 info.l_whence = SEEK_SET;
91 (void) fcntl(lock->fd, F_SETLK, &info);
96 /* External interface */
98 rpmlock rpmlockAcquire(const char *lock_path, const char *descr)
100 rpmlock lock = rpmlock_new(lock_path);
102 rpmlog(RPMLOG_ERR, _("can't create %s lock on %s (%s)\n"),
103 descr, lock_path, strerror(errno));
104 } else if (!rpmlock_acquire(lock, RPMLOCK_WRITE)) {
105 if (lock->openmode & RPMLOCK_WRITE)
106 rpmlog(RPMLOG_WARNING, _("waiting for %s lock on %s\n"),
108 if (!rpmlock_acquire(lock, RPMLOCK_WRITE|RPMLOCK_WAIT)) {
109 rpmlog(RPMLOG_ERR, _("can't create %s lock on %s (%s)\n"),
110 descr, lock_path, strerror(errno));
118 rpmlock rpmlockFree(rpmlock lock)
120 rpmlock_release(lock); /* Not really needed here. */