summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohn Carr <jfc@mit.edu>1991-05-29 22:27:40 +0000
committerJohn Carr <jfc@mit.edu>1991-05-29 22:27:40 +0000
commitb5b57a0a6b60d4978d099bb9ebed5b766ecd7141 (patch)
tree996d49ff359be4af7403b1fb1754750f0fbab43f /src
parentbc9c25ab2f72a2e2aac22f90fe63f7983f575e26 (diff)
downloadkrb5-b5b57a0a6b60d4978d099bb9ebed5b766ecd7141.tar.gz
krb5-b5b57a0a6b60d4978d099bb9ebed5b766ecd7141.tar.xz
krb5-b5b57a0a6b60d4978d099bb9ebed5b766ecd7141.zip
Use fcntl(F_SETLK) if POSIX_FILE_LOCKS is defined
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@2127 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src')
-rw-r--r--src/lib/kdb/kdb_dbm.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/src/lib/kdb/kdb_dbm.c b/src/lib/kdb/kdb_dbm.c
index f29dac649..cafca7c2f 100644
--- a/src/lib/kdb/kdb_dbm.c
+++ b/src/lib/kdb/kdb_dbm.c
@@ -22,6 +22,10 @@ static char rcsid_krb_dbm_c[] =
#include <krb5/sysincl.h>
#include <stdio.h>
+#ifdef POSIX_FILE_LOCKS
+#include <fcntl.h>
+#endif
+
#define KRB5_DBM_MAX_RETRY 5
/* exclusive or shared lock flags */
@@ -563,13 +567,29 @@ krb5_error_code
krb5_dbm_db_lock(mode)
int mode;
{
+#ifdef POSIX_FILE_LOCKS
+ struct flock fl;
+#else
int flock_mode;
-
+#endif
if (mylock && (lockmode >= mode)) {
mylock++; /* No need to upgrade lock, just return */
return(0);
}
+#ifdef POSIX_FILE_LOCKS
+ if (mode == KRB5_DBM_EXCLUSIVE)
+ fl.l_type = F_WRLCK;
+ else if (mode == KRB5_DBM_SHARED)
+ fl.l_type = F_RDLCK;
+ else
+ return KRB5_KDB_BADLOCKMODE;
+ fl.l_whence = 0;
+ fl.l_start = 0;
+ fl.l_len = 0;
+ if (fcntl(dblfd, non_blocking ? F_SETLK : F_SETLKW, &fl) == -1)
+ return errno;
+#else
switch (mode) {
case KRB5_DBM_EXCLUSIVE:
flock_mode = LOCK_EX;
@@ -583,9 +603,10 @@ int mode;
lockmode = mode;
if (non_blocking)
flock_mode |= LOCK_NB;
-
+
if (flock(dblfd, flock_mode) < 0)
return errno;
+#endif
mylock++;
return 0;
}
@@ -597,8 +618,18 @@ krb5_dbm_db_unlock()
return KRB5_KDB_NOTLOCKED;
if (--mylock == 0) {
+#ifdef POSIX_FILE_LOCKS
+ struct flock fl;
+ fl.l_type = F_UNLCK;
+ fl.l_whence = 0;
+ fl.l_start = 0;
+ fl.l_len = 0;
+ if (fcntl(dblfd, F_SETLK, &fl) == -1)
+ return errno;
+#else
if (flock(dblfd, LOCK_UN) < 0)
return errno;
+#endif
}
return 0;
}