diff options
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/kdb/db2/ChangeLog | 14 | ||||
| -rw-r--r-- | src/plugins/kdb/db2/Makefile.in | 1 | ||||
| -rw-r--r-- | src/plugins/kdb/db2/db2_exp.c | 213 | ||||
| -rw-r--r-- | src/plugins/kdb/db2/kdb_db2.h | 5 |
4 files changed, 202 insertions, 31 deletions
diff --git a/src/plugins/kdb/db2/ChangeLog b/src/plugins/kdb/db2/ChangeLog index e88e25d73..c6461f9ad 100644 --- a/src/plugins/kdb/db2/ChangeLog +++ b/src/plugins/kdb/db2/ChangeLog @@ -1,3 +1,17 @@ +2006-01-25 Ken Raeburn <raeburn@mit.edu> + + * Makefile.in (DEFINES): New variable; define macro PLUGIN. + * db2_exp.c (krb5_db2_mutex): New variable. + (wrap_*): Lots of new functions; lock the mutex, call the real + function, unlock the mutex. + (WRAP, WRAP_K, WRAP_VOID): Quick and dirty macros for implementing + the above. + (hack_init, hack_cleanup): New functions. Call the regular init + or cleanup function, but also deal with the new mutex. + (krb5_db_vftabl_db2): Use the hack/wrap functions. + + * kdb_db2.h (krb5_db2_get_policy): Delete duplicate declaration. + 2005-12-16 Ken Raeburn <raeburn@mit.edu> * Makefile.in (myfulldir, RELDIR): Updated for directory rename. diff --git a/src/plugins/kdb/db2/Makefile.in b/src/plugins/kdb/db2/Makefile.in index 6935bd467..06b037ce0 100644 --- a/src/plugins/kdb/db2/Makefile.in +++ b/src/plugins/kdb/db2/Makefile.in @@ -8,6 +8,7 @@ PROG_LIBPATH=-L$(TOPLIBD) PROG_RPATH=$(KRB5_LIBDIR) LOCALINCLUDES = -I../../../lib/kdb -I$(srcdir)/../../../lib/kdb +DEFINES = -DPLUGIN DB_VERSION = @DB_VERSION@ DB_DEPS = $(DB_DEPS-@DB_HEADER_VERSION@) diff --git a/src/plugins/kdb/db2/db2_exp.c b/src/plugins/kdb/db2/db2_exp.c index f119de3de..29eae0566 100644 --- a/src/plugins/kdb/db2/db2_exp.c +++ b/src/plugins/kdb/db2/db2_exp.c @@ -25,6 +25,168 @@ static char *_csrc = "@(#) %filespec: db2_exp.c~5 % (%full_filespec: db2_exp.c~ #include "kdb_xdr.h" #include "policy_db.h" +/* Quick and dirty wrapper functions to provide for thread safety + within the plugin, instead of making the kdb5 library do it. Eventually + these should be integrated into the real functions. + + Some of the functions wrapped here are also called directly from + within this library (e.g., create calls open), so simply dropping + locking code into the top and bottom of each referenced function + won't do. (We aren't doing recursive locks, currently.) */ + +static k5_mutex_t *krb5_db2_mutex; + +#define WRAP(NAME,TYPE,ARGLIST,ARGNAMES,ERROR_RESULT) \ + static TYPE wrap_##NAME ARGLIST \ + { \ + TYPE result; \ + int code = k5_mutex_lock (krb5_db2_mutex); \ + if (code) { return ERROR_RESULT; } \ + result = NAME ARGNAMES; \ + k5_mutex_unlock (krb5_db2_mutex); \ + return result; \ + } \ + /* hack: decl to allow a following ";" */ \ + static TYPE wrap_##NAME () + +/* Two special cases: void (can't assign result), and krb5_error_code + (return error from locking code). */ + +#define WRAP_VOID(NAME,ARGLIST,ARGNAMES) \ + static void wrap_##NAME ARGLIST \ + { \ + int code = k5_mutex_lock (krb5_db2_mutex); \ + if (code) { return; } \ + NAME ARGNAMES; \ + k5_mutex_unlock (krb5_db2_mutex); \ + } \ + /* hack: decl to allow a following ";" */ \ + static void wrap_##NAME () + +#define WRAP_K(NAME,ARGLIST,ARGNAMES) \ + WRAP(NAME,krb5_error_code,ARGLIST,ARGNAMES,code) + +WRAP_K (krb5_db2_open, + ( krb5_context kcontext, + char *conf_section, + char **db_args, + int mode ), + (kcontext, conf_section, db_args, mode)); +WRAP_K (krb5_db2_db_fini, (krb5_context ctx), (ctx)); +WRAP_K (krb5_db2_create, + ( krb5_context kcontext, char *conf_section, char **db_args ), + (kcontext, conf_section, db_args)); +WRAP_K (krb5_db2_destroy, + ( krb5_context kcontext, char *conf_section, char **db_args ), + (kcontext, conf_section, db_args)); +WRAP_K (krb5_db2_db_get_age, + (krb5_context ctx, + char *s, + time_t *t), + (ctx, s, t)); +WRAP_K (krb5_db2_db_set_option, + ( krb5_context kcontext, + int option, + void *value ), + (kcontext, option, value)); + +WRAP_K (krb5_db2_db_lock, + ( krb5_context context, + int in_mode), + (context, in_mode)); +WRAP_K (krb5_db2_db_unlock, (krb5_context ctx), (ctx)); + +WRAP_K (krb5_db2_db_get_principal, + (krb5_context ctx, + krb5_const_principal p, + krb5_db_entry *d, + int * i, + krb5_boolean *b), + (ctx, p, d, i, b)); +WRAP_K (krb5_db2_db_free_principal, + (krb5_context ctx, + krb5_db_entry *d, + int i), + (ctx, d, i)); +WRAP_K (krb5_db2_db_put_principal, + (krb5_context ctx, + krb5_db_entry *d, + int *i, + char **db_args), + (ctx, d, i, db_args)); +WRAP_K (krb5_db2_db_delete_principal, + (krb5_context context, + krb5_const_principal searchfor, + int *nentries), + (context, searchfor, nentries)); + +WRAP_K (krb5_db2_db_iterate, + (krb5_context ctx, char *s, + krb5_error_code (*f) (krb5_pointer, + krb5_db_entry *), + krb5_pointer p), + (ctx, s, f, p)); + +WRAP_K (krb5_db2_create_policy, + (krb5_context context, osa_policy_ent_t entry), + (context, entry)); +WRAP_K (krb5_db2_get_policy, + ( krb5_context kcontext, + char *name, + osa_policy_ent_t *policy, + int *cnt), + (kcontext, name, policy, cnt)); +WRAP_K (krb5_db2_put_policy, + ( krb5_context kcontext, osa_policy_ent_t policy ), + (kcontext, policy)); +WRAP_K (krb5_db2_iter_policy, + ( krb5_context kcontext, + char *match_entry, + osa_adb_iter_policy_func func, + void *data ), + (kcontext, match_entry, func, data)); +WRAP_K (krb5_db2_delete_policy, + ( krb5_context kcontext, char *policy ), + (kcontext, policy)); +WRAP_VOID (krb5_db2_free_policy, + ( krb5_context kcontext, osa_policy_ent_t entry ), + (kcontext, entry)); + +WRAP (krb5_db2_alloc, void *, + ( krb5_context kcontext, + void *ptr, + size_t size ), + (kcontext, ptr, size), NULL); +WRAP_VOID (krb5_db2_free, + ( krb5_context kcontext, void *ptr ), + (kcontext, ptr)); + +WRAP_K (krb5_db2_set_master_key_ext, + ( krb5_context kcontext, char *pwd, krb5_keyblock *key), + (kcontext, pwd, key)); +WRAP_K (krb5_db2_db_get_mkey, + ( krb5_context context, krb5_keyblock **key), + (context, key)); + +static krb5_error_code +hack_init (krb5_set_err_func_t f) +{ + krb5_error_code c; + c = krb5int_mutex_alloc (&krb5_db2_mutex); + if (c) + return c; + return krb5_db2_lib_init (f); +} + +static krb5_error_code +hack_cleanup (void) +{ + krb5int_mutex_free (krb5_db2_mutex); + krb5_db2_mutex = NULL; + return krb5_db2_lib_cleanup(); +} + + /* * Exposed API */ @@ -32,33 +194,32 @@ static char *_csrc = "@(#) %filespec: db2_exp.c~5 % (%full_filespec: db2_exp.c~ kdb_vftabl krb5_db_vftabl_db2 = { 1, /* major version number 1 */ 0, /* minor version number 0 */ - 0, /* TBD. Not sure whether thread safe. For now, its not */ - /* init_library */ krb5_db2_lib_init, - /* fini_library */ krb5_db2_lib_cleanup, - /* init_module */ krb5_db2_open, - /* fini_module */ krb5_db2_db_fini, - /* db_create */ krb5_db2_create, - /* db_destroy */ krb5_db2_destroy, - /* db_get_age */ krb5_db2_db_get_age, - /* db_set_option */ krb5_db2_db_set_option, - /* db_lock */ krb5_db2_db_lock, - /* db_unlock */ krb5_db2_db_unlock, - /* db_get_principal */ krb5_db2_db_get_principal, - /* db_free_principal */ krb5_db2_db_free_principal, - /* db_put_principal */ krb5_db2_db_put_principal, - /* db_delete_principal */ krb5_db2_db_delete_principal, - /* db_iterate */ krb5_db2_db_iterate, - /* db_create_policy */ krb5_db2_create_policy, - /* db_get_policy */ krb5_db2_get_policy, - /* db_put_policy */ krb5_db2_put_policy, - /* db_iter_policy */ krb5_db2_iter_policy, - /* db_delete_policy */ krb5_db2_delete_policy, - /* db_free_policy */ krb5_db2_free_policy, + /* init_library */ hack_init, + /* fini_library */ hack_cleanup, + /* init_module */ wrap_krb5_db2_open, + /* fini_module */ wrap_krb5_db2_db_fini, + /* db_create */ wrap_krb5_db2_create, + /* db_destroy */ wrap_krb5_db2_destroy, + /* db_get_age */ wrap_krb5_db2_db_get_age, + /* db_set_option */ wrap_krb5_db2_db_set_option, + /* db_lock */ wrap_krb5_db2_db_lock, + /* db_unlock */ wrap_krb5_db2_db_unlock, + /* db_get_principal */ wrap_krb5_db2_db_get_principal, + /* db_free_principal */ wrap_krb5_db2_db_free_principal, + /* db_put_principal */ wrap_krb5_db2_db_put_principal, + /* db_delete_principal */ wrap_krb5_db2_db_delete_principal, + /* db_iterate */ wrap_krb5_db2_db_iterate, + /* db_create_policy */ wrap_krb5_db2_create_policy, + /* db_get_policy */ wrap_krb5_db2_get_policy, + /* db_put_policy */ wrap_krb5_db2_put_policy, + /* db_iter_policy */ wrap_krb5_db2_iter_policy, + /* db_delete_policy */ wrap_krb5_db2_delete_policy, + /* db_free_policy */ wrap_krb5_db2_free_policy, /* db_supported_realms */ NULL, /* db_free_supported_realms */ NULL, /* errcode_2_string */ NULL, - /* db_alloc */ krb5_db2_alloc, - /* db_free */ krb5_db2_free, - /* set_master_key */ krb5_db2_set_master_key_ext, - /* get_master_key */ krb5_db2_db_get_mkey + /* db_alloc */ wrap_krb5_db2_alloc, + /* db_free */ wrap_krb5_db2_free, + /* set_master_key */ wrap_krb5_db2_set_master_key_ext, + /* get_master_key */ wrap_krb5_db2_db_get_mkey }; diff --git a/src/plugins/kdb/db2/kdb_db2.h b/src/plugins/kdb/db2/kdb_db2.h index ba03ea36f..77ca60c33 100644 --- a/src/plugins/kdb/db2/kdb_db2.h +++ b/src/plugins/kdb/db2/kdb_db2.h @@ -190,11 +190,6 @@ krb5_error_code krb5_db2_get_policy ( krb5_context kcontext, osa_policy_ent_t *policy, int *cnt); -krb5_error_code krb5_db2_get_policy ( krb5_context kcontext, - char *name, - osa_policy_ent_t *policy, - int *cnt); - krb5_error_code krb5_db2_put_policy ( krb5_context kcontext, osa_policy_ent_t policy ); |
