diff options
| author | Theodore Tso <tytso@mit.edu> | 1990-10-15 16:53:21 +0000 |
|---|---|---|
| committer | Theodore Tso <tytso@mit.edu> | 1990-10-15 16:53:21 +0000 |
| commit | b7b73bc0c09f1b1d321c7aad3583b4b366207c7a (patch) | |
| tree | b253dc416e8f4833f1e43c1392f30983ec18a613 /src/lib/kdb | |
| parent | 2547fa8a7a2902c9f99e4f24b2211f837c3a9ef2 (diff) | |
| download | krb5-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.c | 18 |
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; } |
