From 729cddb254f24bf289084e0a7fc71980a35a91bd Mon Sep 17 00:00:00 2001 From: Mark Eichin Date: Fri, 18 Nov 1994 00:27:10 +0000 Subject: [PATCH] * kdb_dbm.c (krb5_dbm_db_unlock): Use krb5_lock_file. (krb5_dbm_db_lock): Same. (Changes from jtkohl@mit.edu.) the rest of [txn 497]. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@4674 dc483132-0cff-0310-8789-dd5450dbe970 --- src/lib/kdb/ChangeLog | 5 +++ src/lib/kdb/kdb_dbm.c | 83 +++++++++++++------------------------------ 2 files changed, 30 insertions(+), 58 deletions(-) diff --git a/src/lib/kdb/ChangeLog b/src/lib/kdb/ChangeLog index a5b1d7dfe..4b5cb2aa0 100644 --- a/src/lib/kdb/ChangeLog +++ b/src/lib/kdb/ChangeLog @@ -1,3 +1,8 @@ +Thu Nov 17 19:22:16 1994 Mark Eichin (eichin@cygnus.com) + + * kdb_dbm.c (krb5_dbm_db_unlock): Use krb5_lock_file. + (krb5_dbm_db_lock): Same. (Changes from jtkohl@mit.edu.) + Thu Nov 10 17:20:42 1994 Theodore Y. Ts'o (tytso@dcl) * decrypt_key.c (krb5_kdb_decrypt_key): Set the keyblock's magic diff --git a/src/lib/kdb/kdb_dbm.c b/src/lib/kdb/kdb_dbm.c index ab836e41f..43be0ea6e 100644 --- a/src/lib/kdb/kdb_dbm.c +++ b/src/lib/kdb/kdb_dbm.c @@ -32,16 +32,13 @@ #include #include #include +#include #include #include #include #include #include -#ifdef POSIX_FILE_LOCKS -#include -#endif - #define OLD_COMPAT_VERSION_1 #ifdef OLD_COMPAT_VERSION_1 @@ -60,7 +57,8 @@ extern long krb5_dbm_db_debug; extern char *progname; #endif -static int dblfd = -1; +static FILE *dblfp = 0; +static char *dblfname = 0; static int mylock = 0; static int lockmode = 0; static int inited = 0; @@ -190,24 +188,22 @@ krb5_dbm_db_init() filename = gen_dbsuffix (current_db_name, ".ok"); if (!filename) return ENOMEM; -#ifdef POSIX_FILE_LOCKS /* - * needs be open read/write so that write locking can work with + * should be open read/write so that write locking can work with * POSIX systems */ - if ((dblfd = open(filename, O_RDWR, 0)) == -1) { + dblfp = fopen(filename, "r+"); + if ((dblfp = fopen(filename, "r+")) == 0) { if (errno == EACCES) { - if ((dblfd = open(filename, O_RDONLY, 0)) == -1) + if ((dblfp = fopen(filename, "r")) == 0) goto err_out; } else goto err_out; } -#else - if ((dblfd = open(filename, 0, 0)) == -1) - goto err_out; -#endif inited++; + dblfname = filename; errno = 0; + return 0; err_out: free(filename); @@ -235,11 +231,13 @@ krb5_dbm_db_fini() current_db_ptr = 0; } - if (close(dblfd) == -1) + if (fclose(dblfp) == EOF) retval = errno; else retval = 0; - dblfd = -1; + dblfp = 0; + free(dblfname); + dblfname = 0; inited = 0; mylock = 0; return retval; @@ -831,52 +829,32 @@ krb5_error_code krb5_dbm_db_lock(mode) int mode; { -#ifdef POSIX_FILE_LOCKS - struct flock fl; -#else - int flock_mode; -#endif + int krb5_lock_mode; + int error; 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) { - if (errno == EBADF && mode == KRB5_DBM_EXCLUSIVE) { - /* tried to exclusive-lock something we don't have write access - to. */ - return KRB5_KDB_CANTLOCK_DB; - } - return errno; - } -#else switch (mode) { case KRB5_DBM_EXCLUSIVE: - flock_mode = LOCK_EX; + krb5_lock_mode = KRB5_LOCKMODE_EXCLUSIVE; break; case KRB5_DBM_SHARED: - flock_mode = LOCK_SH; + krb5_lock_mode = KRB5_LOCKMODE_SHARED; break; default: return KRB5_KDB_BADLOCKMODE; } - lockmode = mode; if (non_blocking) - flock_mode |= LOCK_NB; + flock_mode |= KRB5_LOCKMODE_DONTBLOCK; - if (flock(dblfd, flock_mode) < 0) - return errno; -#endif + error = krb5_lock_file(dblfp, dblfname, krb5_lock_mode); + + if (error == EBADF && mode == KRB5_DBM_EXCLUSIVE) + return KRB5_KDB_CANTLOCK_DB; + if (error) + return error; mylock++; return 0; } @@ -888,18 +866,7 @@ 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 krb5_lock_file(dblfp, dblfname, KRB5_LOCKMODE_UNLOCK); } return 0; } -- 2.26.2