diff options
author | Tom Yu <tlyu@mit.edu> | 2002-10-08 20:20:29 +0000 |
---|---|---|
committer | Tom Yu <tlyu@mit.edu> | 2002-10-08 20:20:29 +0000 |
commit | 794f0d854711dbee20ca8cfb3ec2ae729c41910c (patch) | |
tree | 579a3b3f9f9c9851ec06cd8a188c7707b5ce2db4 /src/lib | |
parent | 2d59b5f412e0eacf4c89008b14df8251a92cae09 (diff) | |
download | krb5-794f0d854711dbee20ca8cfb3ec2ae729c41910c.zip krb5-794f0d854711dbee20ca8cfb3ec2ae729c41910c.tar.gz krb5-794f0d854711dbee20ca8cfb3ec2ae729c41910c.tar.bz2 |
libkadm5 should allow persistent locks
libkadm5 should have a way to persistently lock the databases to avoid
wasting time on closing and reopening. These patches implement
persistent exclusive locks for local access only.
ticket: new
target_version: 1.3
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@14914 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/kadm5/ChangeLog | 7 | ||||
-rw-r--r-- | src/lib/kadm5/adb.h | 1 | ||||
-rw-r--r-- | src/lib/kadm5/admin.h | 2 | ||||
-rw-r--r-- | src/lib/kadm5/clnt/ChangeLog | 7 | ||||
-rw-r--r-- | src/lib/kadm5/clnt/Makefile.in | 2 | ||||
-rw-r--r-- | src/lib/kadm5/clnt/client_init.c | 11 | ||||
-rw-r--r-- | src/lib/kadm5/srv/ChangeLog | 11 | ||||
-rw-r--r-- | src/lib/kadm5/srv/Makefile.in | 2 | ||||
-rw-r--r-- | src/lib/kadm5/srv/adb_openclose.c | 17 | ||||
-rw-r--r-- | src/lib/kadm5/srv/server_init.c | 28 |
10 files changed, 81 insertions, 7 deletions
diff --git a/src/lib/kadm5/ChangeLog b/src/lib/kadm5/ChangeLog index bed5188..6a91bf4 100644 --- a/src/lib/kadm5/ChangeLog +++ b/src/lib/kadm5/ChangeLog @@ -1,3 +1,10 @@ +2002-10-08 Tom Yu <tlyu@mit.edu> + + * adb.h (struct _osa_adb_db_ent_t): Add opencnt, which keeps track + of how many times an open was attempted on the adb. + + * admin.h: Add kadm5_lock and kadm5_unlock. + 2002-09-18 Ken Raeburn <raeburn@mit.edu> * admin.h (struct __krb5_realm_params): New field diff --git a/src/lib/kadm5/adb.h b/src/lib/kadm5/adb.h index 0277aba..7b49adc 100644 --- a/src/lib/kadm5/adb.h +++ b/src/lib/kadm5/adb.h @@ -47,6 +47,7 @@ typedef struct _osa_adb_db_ent_t { BTREEINFO btinfo; char *filename; osa_adb_lock_t lock; + int opencnt; } osa_adb_db_ent, *osa_adb_db_t, *osa_adb_princ_t, *osa_adb_policy_t; /* an osa_pw_hist_ent stores all the key_datas for a single password */ diff --git a/src/lib/kadm5/admin.h b/src/lib/kadm5/admin.h index 9c366ff..c2236ae 100644 --- a/src/lib/kadm5/admin.h +++ b/src/lib/kadm5/admin.h @@ -330,6 +330,8 @@ kadm5_ret_t kadm5_init_with_creds(char *client_name, krb5_ui_4 api_version, void **server_handle); #endif +kadm5_ret_t kadm5_lock(void *server_handle); +kadm5_ret_t kadm5_unlock(void *server_handle); kadm5_ret_t kadm5_flush(void *server_handle); kadm5_ret_t kadm5_destroy(void *server_handle); kadm5_ret_t kadm5_create_principal(void *server_handle, diff --git a/src/lib/kadm5/clnt/ChangeLog b/src/lib/kadm5/clnt/ChangeLog index ebee3a1..7d393c0 100644 --- a/src/lib/kadm5/clnt/ChangeLog +++ b/src/lib/kadm5/clnt/ChangeLog @@ -1,3 +1,10 @@ +2002-10-08 Tom Yu <tlyu@mit.edu> + + * Makefile.in (LIBMINOR): Bump. + + * client_init.c (kadm5_lock, kadm5_unlock): Add stubs that error + out, since these are not supported on the client side. + 2002-09-18 Ken Raeburn <raeburn@mit.edu> * client_init.c (_kadm5_init_any): If creating a new ccache, put diff --git a/src/lib/kadm5/clnt/Makefile.in b/src/lib/kadm5/clnt/Makefile.in index 2908f5c..3e4fb8c 100644 --- a/src/lib/kadm5/clnt/Makefile.in +++ b/src/lib/kadm5/clnt/Makefile.in @@ -6,7 +6,7 @@ LOCALINCLUDES = -I$(BUILDTOP)/include/kadm5 LIB=kadm5clnt LIBMAJOR=5 -LIBMINOR=0 +LIBMINOR=1 STOBJLISTS=../OBJS.ST OBJS.ST SHLIB_EXPDEPS=\ $(TOPLIBD)/libgssrpc$(SHLIBEXT) \ diff --git a/src/lib/kadm5/clnt/client_init.c b/src/lib/kadm5/clnt/client_init.c index 4e0b53f..247af87 100644 --- a/src/lib/kadm5/clnt/client_init.c +++ b/src/lib/kadm5/clnt/client_init.c @@ -605,6 +605,17 @@ kadm5_destroy(void *server_handle) return code; } +/* not supported on client */ +kadm5_ret_t kadm5_lock(void *server_handle) +{ + return EINVAL; +} + +/* not supported on client */ +kadm5_ret_t kadm5_unlock(void *server_handle) +{ + return EINVAL; +} kadm5_ret_t kadm5_flush(void *server_handle) { diff --git a/src/lib/kadm5/srv/ChangeLog b/src/lib/kadm5/srv/ChangeLog index f575d90..e7e569e 100644 --- a/src/lib/kadm5/srv/ChangeLog +++ b/src/lib/kadm5/srv/ChangeLog @@ -1,3 +1,14 @@ +2002-10-08 Tom Yu <tlyu@mit.edu> + + * adb_openclose.c (osa_adb_init_db): Reset opencnt. + (osa_adb_open_and_lock): Don't open multiple times; merely + increment opencnt if already open. + (osa_adb_close_and_unlock): Decrement opencnt instead of + unconditionaly closing. + + * server_init.c (kadm5_lock, kadm5_unlock): New functions to + support persistent exclusive locks across multiple API calls. + 2002-08-29 Ken Raeburn <raeburn@mit.edu> * Makefile.in: Revert $(S)=>/ change, for Windows support. diff --git a/src/lib/kadm5/srv/Makefile.in b/src/lib/kadm5/srv/Makefile.in index 5dc71e4..11fc1b6 100644 --- a/src/lib/kadm5/srv/Makefile.in +++ b/src/lib/kadm5/srv/Makefile.in @@ -10,7 +10,7 @@ DEFINES = @HESIOD_DEFS@ LIB=kadm5srv LIBMAJOR=5 -LIBMINOR=0 +LIBMINOR=1 STOBJLISTS=../OBJS.ST OBJS.ST SHLIB_EXPDEPS=\ $(TOPLIBD)/libgssrpc$(SHLIBEXT) \ diff --git a/src/lib/kadm5/srv/adb_openclose.c b/src/lib/kadm5/srv/adb_openclose.c index 12219cd..7bb671e 100644 --- a/src/lib/kadm5/srv/adb_openclose.c +++ b/src/lib/kadm5/srv/adb_openclose.c @@ -214,6 +214,7 @@ osa_adb_ret_t osa_adb_init_db(osa_adb_db_t *dbp, char *filename, db->lock = &lockp->lockinfo; db->lock->refcnt++; + db->opencnt = 0; db->filename = strdup(filename); db->magic = magic; @@ -369,10 +370,12 @@ osa_adb_ret_t osa_adb_open_and_lock(osa_adb_princ_t db, int locktype) ret = osa_adb_get_lock(db, locktype); if (ret != OSA_ADB_OK) return ret; - + if (db->opencnt) + goto open_ok; + db->db = dbopen(db->filename, O_RDWR, 0600, DB_BTREE, &db->btinfo); if (db->db != NULL) - return OSA_ADB_OK; + goto open_ok; switch (errno) { #ifdef EFTYPE case EFTYPE: @@ -380,18 +383,23 @@ osa_adb_ret_t osa_adb_open_and_lock(osa_adb_princ_t db, int locktype) case EINVAL: db->db = dbopen(db->filename, O_RDWR, 0600, DB_HASH, &db->info); if (db->db != NULL) - return OSA_ADB_OK; + goto open_ok; default: (void) osa_adb_release_lock(db); if (errno == EINVAL) return OSA_ADB_BAD_DB; return errno; } +open_ok: + db->opencnt++; + return OSA_ADB_OK; } osa_adb_ret_t osa_adb_close_and_unlock(osa_adb_princ_t db) { - if(db->db->close(db->db) == -1) { + if (--db->opencnt) + return osa_adb_release_lock(db); + if(db->db != NULL && db->db->close(db->db) == -1) { (void) osa_adb_release_lock(db); return OSA_ADB_FAILURE; } @@ -400,4 +408,3 @@ osa_adb_ret_t osa_adb_close_and_unlock(osa_adb_princ_t db) return(osa_adb_release_lock(db)); } - diff --git a/src/lib/kadm5/srv/server_init.c b/src/lib/kadm5/srv/server_init.c index 31dd71a..f2cbc99 100644 --- a/src/lib/kadm5/srv/server_init.c +++ b/src/lib/kadm5/srv/server_init.c @@ -306,6 +306,34 @@ kadm5_ret_t kadm5_destroy(void *server_handle) return KADM5_OK; } +kadm5_ret_t kadm5_lock(void *server_handle) +{ + kadm5_server_handle_t handle = server_handle; + kadm5_ret_t ret; + + CHECK_HANDLE(server_handle); + ret = osa_adb_open_and_lock(handle->policy_db, OSA_ADB_EXCLUSIVE); + if (ret) + return ret; + ret = krb5_db_lock(handle->context, KRB5_LOCKMODE_EXCLUSIVE); + if (ret) + return ret; +} + +kadm5_ret_t kadm5_unlock(void *server_handle) +{ + kadm5_server_handle_t handle = server_handle; + kadm5_ret_t ret; + + CHECK_HANDLE(server_handle); + ret = osa_adb_close_and_unlock(handle->policy_db); + if (ret) + return ret; + ret = krb5_db_unlock(handle->context); + if (ret) + return ret; +} + kadm5_ret_t kadm5_flush(void *server_handle) { kadm5_server_handle_t handle = server_handle; |