* kdb_dbm.c (krb5_dbm_db_unlock): Use krb5_lock_file.
authorMark Eichin <eichin@mit.edu>
Fri, 18 Nov 1994 00:27:10 +0000 (00:27 +0000)
committerMark Eichin <eichin@mit.edu>
Fri, 18 Nov 1994 00:27:10 +0000 (00:27 +0000)
(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
src/lib/kdb/kdb_dbm.c

index a5b1d7dfe5ecadb2dcd2145b9ca8ed2c6b1a1a88..4b5cb2aa06203b5afba0922d99feb1518d93a0da 100644 (file)
@@ -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
index ab836e41fb4050c97dda787bac8b00543d16a792..43be0ea6edcc17d24be85038534eb2506c18d2a0 100644 (file)
 #include <krb5/kdb_dbm.h>
 #include <krb5/ext-proto.h>
 #include <krb5/sysincl.h>
+#include <krb5/libos.h>
 #include <stdio.h>
 #include <errno.h>
 #include <sys/types.h>
 #include <utime.h>
 #include <krb5/config.h>
 
-#ifdef POSIX_FILE_LOCKS
-#include <fcntl.h>
-#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;
 }