aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorTom Yu <tlyu@mit.edu>2002-10-08 20:20:29 +0000
committerTom Yu <tlyu@mit.edu>2002-10-08 20:20:29 +0000
commit794f0d854711dbee20ca8cfb3ec2ae729c41910c (patch)
tree579a3b3f9f9c9851ec06cd8a188c7707b5ce2db4 /src/lib
parent2d59b5f412e0eacf4c89008b14df8251a92cae09 (diff)
downloadkrb5-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/ChangeLog7
-rw-r--r--src/lib/kadm5/adb.h1
-rw-r--r--src/lib/kadm5/admin.h2
-rw-r--r--src/lib/kadm5/clnt/ChangeLog7
-rw-r--r--src/lib/kadm5/clnt/Makefile.in2
-rw-r--r--src/lib/kadm5/clnt/client_init.c11
-rw-r--r--src/lib/kadm5/srv/ChangeLog11
-rw-r--r--src/lib/kadm5/srv/Makefile.in2
-rw-r--r--src/lib/kadm5/srv/adb_openclose.c17
-rw-r--r--src/lib/kadm5/srv/server_init.c28
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;