summaryrefslogtreecommitdiffstats
path: root/src/lib/kdb
diff options
context:
space:
mode:
authorTheodore Tso <tytso@mit.edu>1990-10-15 16:53:21 +0000
committerTheodore Tso <tytso@mit.edu>1990-10-15 16:53:21 +0000
commitb7b73bc0c09f1b1d321c7aad3583b4b366207c7a (patch)
treeb253dc416e8f4833f1e43c1392f30983ec18a613 /src/lib/kdb
parent2547fa8a7a2902c9f99e4f24b2211f837c3a9ef2 (diff)
downloadkrb5-b7b73bc0c09f1b1d321c7aad3583b4b366207c7a.tar.gz
krb5-b7b73bc0c09f1b1d321c7aad3583b4b366207c7a.tar.xz
krb5-b7b73bc0c09f1b1d321c7aad3583b4b366207c7a.zip
Changes to export kdb5_db_lock and kdb5_db_unlock to the API.... changed
the locking routines to allow recursive locks. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@1252 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/kdb')
-rw-r--r--src/lib/kdb/kdb_dbm.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/lib/kdb/kdb_dbm.c b/src/lib/kdb/kdb_dbm.c
index 964074af4a..bc2fd26b04 100644
--- a/src/lib/kdb/kdb_dbm.c
+++ b/src/lib/kdb/kdb_dbm.c
@@ -38,6 +38,7 @@ extern int errno;
static int dblfd = -1;
static int mylock = 0;
+static int lockmode = 0;
static int inited = 0;
static char default_db_name[] = DEFAULT_DBM_FILE;
@@ -234,7 +235,7 @@ time_t *age;
if (!okname)
return ENOMEM;
if (stat (okname, &st) < 0)
- *age = 0;
+ *age = -1;
else
*age = st.st_mtime;
@@ -543,9 +544,10 @@ int mode;
{
int flock_mode;
- if (mylock) /* Detect lock call when lock already
- * locked */
- return KRB5_KDB_RECURSIVELOCK;
+ if (mylock && (lockmode >= mode)) {
+ mylock++; /* No need to upgrade lock, just return */
+ return(0);
+ }
switch (mode) {
case KRB5_DBM_EXCLUSIVE:
@@ -557,6 +559,7 @@ int mode;
default:
return KRB5_KDB_BADLOCKMODE;
}
+ lockmode = mode;
if (non_blocking)
flock_mode |= LOCK_NB;
@@ -572,9 +575,10 @@ krb5_dbm_db_unlock()
if (!mylock) /* lock already unlocked */
return KRB5_KDB_NOTLOCKED;
- if (flock(dblfd, LOCK_UN) < 0)
- return errno;
- mylock = 0;
+ if (--mylock) {
+ if (flock(dblfd, LOCK_UN) < 0)
+ return errno;
+ }
return 0;
}