xref: /onnv-gate/usr/src/lib/krb5/plugins/kdb/db2/db2_exp.c (revision 7934:6aeeafc994de)
14960Swillf /*
25916Swillf  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
34960Swillf  * Use is subject to license terms.
44960Swillf  */
54960Swillf 
64960Swillf 
74960Swillf /*
84960Swillf  * Copyright 2006 by the Massachusetts Institute of Technology.
94960Swillf  * All Rights Reserved.
104960Swillf  *
114960Swillf  * Export of this software from the United States of America may
124960Swillf  *   require a specific license from the United States Government.
134960Swillf  *   It is the responsibility of any person or organization contemplating
144960Swillf  *   export to obtain such a license before exporting.
154960Swillf  *
164960Swillf  * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
174960Swillf  * distribute this software and its documentation for any purpose and
184960Swillf  * without fee is hereby granted, provided that the above copyright
194960Swillf  * notice appear in all copies and that both that copyright notice and
204960Swillf  * this permission notice appear in supporting documentation, and that
214960Swillf  * the name of M.I.T. not be used in advertising or publicity pertaining
224960Swillf  * to distribution of the software without specific, written prior
234960Swillf  * permission.  Furthermore if you modify this software you must label
244960Swillf  * your software as modified software and not distribute it in such a
254960Swillf  * fashion that it might be confused with the original M.I.T. software.
264960Swillf  * M.I.T. makes no representations about the suitability of
274960Swillf  * this software for any purpose.  It is provided "as is" without express
284960Swillf  * or implied warranty.
294960Swillf  */
304960Swillf 
314960Swillf /**********************************************************************
324960Swillf *
334960Swillf *	C %name:		db2_exp.c %
344960Swillf *	Instance:		idc_sec_2
354960Swillf *	Description:
364960Swillf *	%created_by:	spradeep %
374960Swillf *	%date_created:	Tue Apr  5 11:44:00 2005 %
384960Swillf *
394960Swillf **********************************************************************/
404960Swillf #ifndef lint
414960Swillf static char *_csrc = "@(#) %filespec: db2_exp.c~5 %  (%full_filespec: db2_exp.c~5:csrc:idc_sec#2 %)";
424960Swillf #endif
434960Swillf 
444960Swillf #include "k5-int.h"
454960Swillf 
464960Swillf #if HAVE_UNISTD_H
474960Swillf #include <unistd.h>
484960Swillf #endif
494960Swillf 
504960Swillf #include <db.h>
514960Swillf #include <stdio.h>
524960Swillf #include <errno.h>
534960Swillf #include <utime.h>
544960Swillf #include <kdb/kdb5.h>
554960Swillf #include "kdb_db2.h"
564960Swillf #include "kdb_xdr.h"
574960Swillf #include "policy_db.h"
584960Swillf 
594960Swillf /* Quick and dirty wrapper functions to provide for thread safety
604960Swillf    within the plugin, instead of making the kdb5 library do it.  Eventually
614960Swillf    these should be integrated into the real functions.
624960Swillf 
634960Swillf    Some of the functions wrapped here are also called directly from
644960Swillf    within this library (e.g., create calls open), so simply dropping
654960Swillf    locking code into the top and bottom of each referenced function
664960Swillf    won't do.  (We aren't doing recursive locks, currently.)  */
674960Swillf 
684960Swillf static k5_mutex_t *krb5_db2_mutex;
694960Swillf 
704960Swillf #define WRAP(NAME,TYPE,ARGLIST,ARGNAMES,ERROR_RESULT)	\
714960Swillf 	static TYPE wrap_##NAME ARGLIST			\
724960Swillf 	{						\
734960Swillf 	    TYPE result;				\
744960Swillf 	    int code = k5_mutex_lock (krb5_db2_mutex);	\
754960Swillf 	    if (code) { return ERROR_RESULT; }		\
764960Swillf 	    result = NAME ARGNAMES;			\
774960Swillf 	    k5_mutex_unlock (krb5_db2_mutex);		\
784960Swillf 	    return result;				\
794960Swillf 	}						\
804960Swillf 	/* hack: decl to allow a following ";" */	\
814960Swillf 	static TYPE wrap_##NAME ()
824960Swillf 
834960Swillf /* Two special cases: void (can't assign result), and krb5_error_code
844960Swillf    (return error from locking code).  */
854960Swillf 
864960Swillf #define WRAP_VOID(NAME,ARGLIST,ARGNAMES)		\
874960Swillf 	static void wrap_##NAME ARGLIST			\
884960Swillf 	{						\
894960Swillf 	    int code = k5_mutex_lock (krb5_db2_mutex);	\
904960Swillf 	    if (code) { return; }			\
914960Swillf 	    NAME ARGNAMES;				\
924960Swillf 	    k5_mutex_unlock (krb5_db2_mutex);		\
934960Swillf 	}						\
944960Swillf 	/* hack: decl to allow a following ";" */	\
954960Swillf 	static void wrap_##NAME ()
964960Swillf 
974960Swillf #define WRAP_K(NAME,ARGLIST,ARGNAMES)			\
984960Swillf 	WRAP(NAME,krb5_error_code,ARGLIST,ARGNAMES,code)
994960Swillf 
1004960Swillf WRAP_K (krb5_db2_open,
1014960Swillf 	( krb5_context kcontext,
1024960Swillf 	  char *conf_section,
1034960Swillf 	  char **db_args,
1044960Swillf 	  int mode ),
1054960Swillf 	(kcontext, conf_section, db_args, mode));
1064960Swillf WRAP_K (krb5_db2_db_fini, (krb5_context ctx), (ctx));
1074960Swillf WRAP_K (krb5_db2_create,
1084960Swillf 	( krb5_context kcontext, char *conf_section, char **db_args ),
1094960Swillf 	(kcontext, conf_section, db_args));
1104960Swillf WRAP_K (krb5_db2_destroy,
1114960Swillf 	( krb5_context kcontext, char *conf_section, char **db_args ),
1124960Swillf 	(kcontext, conf_section, db_args));
1134960Swillf WRAP_K (krb5_db2_db_get_age,
1144960Swillf 	(krb5_context ctx,
1154960Swillf 		   char *s,
1164960Swillf 	 time_t *t),
1174960Swillf 	(ctx, s, t));
1184960Swillf WRAP_K (krb5_db2_db_set_option,
1194960Swillf 	( krb5_context kcontext,
1204960Swillf 	  int option,
1214960Swillf 	  void *value ),
1224960Swillf 	(kcontext, option, value));
1234960Swillf 
1244960Swillf WRAP_K (krb5_db2_db_lock,
1254960Swillf 	( krb5_context 	  context,
1264960Swillf 	  int 	 	  in_mode),
1274960Swillf 	(context, in_mode));
1284960Swillf WRAP_K (krb5_db2_db_unlock, (krb5_context ctx), (ctx));
1294960Swillf 
1304960Swillf WRAP_K (krb5_db2_db_get_principal,
1314960Swillf 	(krb5_context ctx,
1324960Swillf 		   krb5_const_principal p,
1334960Swillf 		   krb5_db_entry *d,
1344960Swillf 		   int * i,
1354960Swillf 	 krb5_boolean *b),
1364960Swillf 	(ctx, p, d, i, b));
1374960Swillf WRAP_K (krb5_db2_db_free_principal,
1384960Swillf 	(krb5_context ctx,
1394960Swillf 		   krb5_db_entry *d,
1404960Swillf 	 int i),
1414960Swillf 	(ctx, d, i));
1424960Swillf WRAP_K (krb5_db2_db_put_principal,
1434960Swillf 	(krb5_context ctx,
1444960Swillf 	 krb5_db_entry *d,
1454960Swillf 	 int *i,
1464960Swillf 	 char **db_args),
1474960Swillf 	(ctx, d, i, db_args));
1484960Swillf WRAP_K (krb5_db2_db_delete_principal,
1494960Swillf 	(krb5_context context,
1504960Swillf 	 krb5_const_principal searchfor,
1514960Swillf 	 int *nentries),
1524960Swillf 	(context, searchfor, nentries));
1534960Swillf 
1545916Swillf /* Solaris Kerberos: adding support for db_args */
1554960Swillf WRAP_K (krb5_db2_db_iterate,
1564960Swillf 	(krb5_context ctx, char *s,
1574960Swillf 	 krb5_error_code (*f) (krb5_pointer,
1584960Swillf 			      krb5_db_entry *),
1595916Swillf 	 krb5_pointer p,
1605916Swillf 	 char **db_args),
1615916Swillf 	(ctx, s, f, p, db_args));
1624960Swillf 
1634960Swillf WRAP_K (krb5_db2_create_policy,
1644960Swillf 	(krb5_context context, osa_policy_ent_t entry),
1654960Swillf 	(context, entry));
1664960Swillf WRAP_K (krb5_db2_get_policy,
1674960Swillf 	( krb5_context kcontext,
1684960Swillf 	  char *name,
1694960Swillf 	  osa_policy_ent_t *policy,
1704960Swillf 	  int *cnt),
1714960Swillf 	(kcontext, name, policy, cnt));
1724960Swillf WRAP_K (krb5_db2_put_policy,
1734960Swillf 	( krb5_context kcontext, osa_policy_ent_t policy ),
1744960Swillf 	(kcontext, policy));
1754960Swillf WRAP_K (krb5_db2_iter_policy,
1764960Swillf 	( krb5_context kcontext,
1774960Swillf 	  char *match_entry,
1784960Swillf 	  osa_adb_iter_policy_func func,
1794960Swillf 	  void *data ),
1804960Swillf 	(kcontext, match_entry, func, data));
1814960Swillf WRAP_K (krb5_db2_delete_policy,
1824960Swillf 	( krb5_context kcontext, char *policy ),
1834960Swillf 	(kcontext, policy));
1844960Swillf WRAP_VOID (krb5_db2_free_policy,
1854960Swillf 	   ( krb5_context kcontext, osa_policy_ent_t entry ),
1864960Swillf 	   (kcontext, entry));
1874960Swillf 
1884960Swillf WRAP (krb5_db2_alloc, void *,
1894960Swillf       ( krb5_context kcontext,
1904960Swillf 	void *ptr,
1914960Swillf 	size_t size ),
1924960Swillf       (kcontext, ptr, size), NULL);
1934960Swillf WRAP_VOID (krb5_db2_free,
1944960Swillf 	   ( krb5_context kcontext, void *ptr ),
1954960Swillf 	   (kcontext, ptr));
1964960Swillf 
1974960Swillf WRAP_K (krb5_db2_set_master_key_ext,
1984960Swillf 	( krb5_context kcontext, char *pwd, krb5_keyblock *key),
1994960Swillf 	(kcontext, pwd, key));
2004960Swillf WRAP_K (krb5_db2_db_get_mkey,
2014960Swillf 	( krb5_context context, krb5_keyblock **key),
2024960Swillf 	(context, key));
2034960Swillf WRAP_K (krb5_db2_promote_db,
2044960Swillf 	( krb5_context kcontext, char *conf_section, char **db_args ),
2054960Swillf 	(kcontext, conf_section, db_args));
2064960Swillf 
2074960Swillf static krb5_error_code
hack_init()2084960Swillf hack_init ()
2094960Swillf {
2104960Swillf     krb5_error_code c;
2114960Swillf     c = krb5int_mutex_alloc (&krb5_db2_mutex);
2124960Swillf     if (c)
2134960Swillf 	return c;
2144960Swillf     return krb5_db2_lib_init ();
2154960Swillf }
2164960Swillf 
2174960Swillf static krb5_error_code
hack_cleanup(void)2184960Swillf hack_cleanup (void)
2194960Swillf {
2204960Swillf     krb5int_mutex_free (krb5_db2_mutex);
2214960Swillf     krb5_db2_mutex = NULL;
2224960Swillf     return krb5_db2_lib_cleanup();
2234960Swillf }
2244960Swillf 
2254960Swillf 
2264960Swillf /*
2274960Swillf  *      Exposed API
2284960Swillf  */
2294960Swillf 
2304960Swillf kdb_vftabl kdb_function_table = {
2314960Swillf   /* major version number 1 */		       1,
2324960Swillf   /* minor version number 0 */		       0,
2334960Swillf   /* Solaris Kerberos: iprop support */
2344960Swillf   /* iprop_supported, yes for db2 */	       1,
2354960Swillf   /* init_library */			       hack_init,
2364960Swillf   /* fini_library */			       hack_cleanup,
2374960Swillf   /* init_module */			       wrap_krb5_db2_open,
2384960Swillf   /* fini_module */			       wrap_krb5_db2_db_fini,
2394960Swillf   /* db_create */			       wrap_krb5_db2_create,
2404960Swillf   /* db_destroy */			       wrap_krb5_db2_destroy,
2414960Swillf   /* db_get_age */                             wrap_krb5_db2_db_get_age,
2424960Swillf   /* db_set_option */			       wrap_krb5_db2_db_set_option,
2434960Swillf   /* db_lock */				       wrap_krb5_db2_db_lock,
2444960Swillf   /* db_unlock */			       wrap_krb5_db2_db_unlock,
2454960Swillf   /* db_get_principal */		       wrap_krb5_db2_db_get_principal,
2464960Swillf   /* Solaris Kerberos: need a nolock for iprop */
2474960Swillf   /* db_get_principal_nolock */		       krb5_db2_db_get_principal,
2484960Swillf   /* db_free_principal */		       wrap_krb5_db2_db_free_principal,
2494960Swillf   /* db_put_principal */		       wrap_krb5_db2_db_put_principal,
2504960Swillf   /* db_delete_principal */		       wrap_krb5_db2_db_delete_principal,
2514960Swillf   /* db_iterate */			       wrap_krb5_db2_db_iterate,
2524960Swillf   /* db_create_policy */                       wrap_krb5_db2_create_policy,
2534960Swillf   /* db_get_policy */                          wrap_krb5_db2_get_policy,
2544960Swillf   /* db_put_policy */                          wrap_krb5_db2_put_policy,
2554960Swillf   /* db_iter_policy */                         wrap_krb5_db2_iter_policy,
2564960Swillf   /* db_delete_policy */                       wrap_krb5_db2_delete_policy,
2574960Swillf   /* db_free_policy */                         wrap_krb5_db2_free_policy,
2584960Swillf   /* db_supported_realms */		       NULL,
2594960Swillf   /* db_free_supported_realms */	       NULL,
2606426Smp153739   /* errcode_2_string */                       krb5_db2_errcode_2_string,
2616426Smp153739   /* release_errcode_string */		       krb5_db2_release_errcode_string,
2624960Swillf   /* db_alloc */                               wrap_krb5_db2_alloc,
2634960Swillf   /* db_free */                                wrap_krb5_db2_free,
2644960Swillf   /* set_master_key */			       wrap_krb5_db2_set_master_key_ext,
2654960Swillf   /* get_master_key */			       wrap_krb5_db2_db_get_mkey,
266*7934SMark.Phalan@Sun.COM   /* blah blah blah */ 0,0,0,0,0,0,
2674960Swillf   /* promote_db */			       wrap_krb5_db2_promote_db,
2684960Swillf };
269