Bug fixes, cleanup, compiler warnings, restructure code.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@17700 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -26,22 +26,14 @@ | ||||
|  *	$FreeBSD: src/lib/libgssapi/gss_mech_switch.c,v 1.2 2006/02/04 09:40:21 dfr Exp $ | ||||
|  */ | ||||
|  | ||||
| #include <gssapi/gssapi.h> | ||||
| #include <dlfcn.h> | ||||
| #include <errno.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "mech_switch.h" | ||||
| #include "utils.h" | ||||
| #include "mech_locl.h" | ||||
| RCSID("$Id$"); | ||||
|  | ||||
| #ifndef _PATH_GSS_MECH | ||||
| #define _PATH_GSS_MECH	"/etc/gss/mech" | ||||
| #endif | ||||
|  | ||||
| struct _gss_mech_switch_list _gss_mechs = | ||||
| 	SLIST_HEAD_INITIALIZER(&_gss_mechs); | ||||
| struct _gss_mech_switch_list _gss_mechs = { NULL } ; | ||||
| gss_OID_set _gss_mech_oids; | ||||
|  | ||||
| /* | ||||
| @@ -155,8 +147,8 @@ _gss_string_to_oid(const char* s, gss_OID oid) | ||||
|  | ||||
| #define SYM(name)							\ | ||||
| do {									\ | ||||
| 	m->gm_ ## name = dlsym(so, "gss_" #name);			\ | ||||
| 	if (!m->gm_ ## name) {						\ | ||||
| 	m->gm_mech.gm_ ## name = dlsym(so, "gss_" #name);		\ | ||||
| 	if (!m->gm_mech.gm_ ## name) {					\ | ||||
| 		fprintf(stderr, "can't find symbol gss_" #name "\n");	\ | ||||
| 		goto bad;						\ | ||||
| 	}								\ | ||||
| @@ -164,13 +156,29 @@ do {									\ | ||||
|  | ||||
| #define OPTSYM(name)							\ | ||||
| do {									\ | ||||
| 	m->gm_ ## name = dlsym(so, "gss_" #name);			\ | ||||
| 	m->gm_mech.gm_ ## name = dlsym(so, "gss_" #name);			\ | ||||
| } while (0) | ||||
|  | ||||
| #define OPTSYM2(symname, ourname)					\ | ||||
| do {									\ | ||||
| 	m->ourname = dlsym(so, #symname);			\ | ||||
| } while (0) | ||||
| /* | ||||
|  * | ||||
|  */ | ||||
| static int | ||||
| add_builtin(gssapi_mech_interface mech) | ||||
| { | ||||
|     struct _gss_mech_switch *m; | ||||
|     OM_uint32 minor_status; | ||||
|  | ||||
|     m = malloc(sizeof(*m)); | ||||
|     if (m == NULL) | ||||
| 	return 1; | ||||
|     m->gm_so = NULL; | ||||
|     m->gm_mech = *mech; | ||||
|     gss_add_oid_set_member(&minor_status, | ||||
| 			   &m->gm_mech.gm_mech_oid, &_gss_mech_oids); | ||||
|  | ||||
|     SLIST_INSERT_HEAD(&_gss_mechs, m, gm_link); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Load the mechanisms file (/etc/gss/mech). | ||||
| @@ -184,8 +192,6 @@ _gss_load_mech(void) | ||||
| 	char		*p; | ||||
| 	char		*name, *oid, *lib, *kobj; | ||||
| 	struct _gss_mech_switch *m; | ||||
| 	int		count; | ||||
| 	char		**pp; | ||||
| 	void		*so; | ||||
|  | ||||
| 	if (SLIST_FIRST(&_gss_mechs)) | ||||
| @@ -196,13 +202,15 @@ _gss_load_mech(void) | ||||
| 	if (major_status) | ||||
| 		return; | ||||
|  | ||||
| 	add_builtin(__gss_krb5_initialize()); | ||||
| 	add_builtin(__gss_spnego_initialize()); | ||||
|  | ||||
| 	fp = fopen(_PATH_GSS_MECH, "r"); | ||||
| 	if (!fp) { | ||||
| 		perror(_PATH_GSS_MECH); | ||||
| /*		perror(_PATH_GSS_MECH); */ | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	count = 0; | ||||
| 	while (fgets(buf, sizeof(buf), fp)) { | ||||
| 		if (*buf == '#') | ||||
| 			continue; | ||||
| @@ -219,23 +227,23 @@ _gss_load_mech(void) | ||||
|  | ||||
| 		so = dlopen(lib, RTLD_LOCAL); | ||||
| 		if (!so) { | ||||
| 			fprintf(stderr, "dlopen: %s\n", dlerror()); | ||||
| /*			fprintf(stderr, "dlopen: %s\n", dlerror()); */ | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		m = malloc(sizeof(struct _gss_mech_switch)); | ||||
| 		m = malloc(sizeof(*m)); | ||||
| 		if (!m) | ||||
| 			break; | ||||
| 		m->gm_so = so; | ||||
| 		if (_gss_string_to_oid(oid, &m->gm_mech_oid)) { | ||||
| 		if (_gss_string_to_oid(oid, &m->gm_mech.gm_mech_oid)) { | ||||
| 			free(m); | ||||
| 			continue; | ||||
| 		} | ||||
| 		 | ||||
| 		major_status = gss_add_oid_set_member(&minor_status, | ||||
| 		    &m->gm_mech_oid, &_gss_mech_oids); | ||||
| 		    &m->gm_mech.gm_mech_oid, &_gss_mech_oids); | ||||
| 		if (major_status) { | ||||
| 			free(m->gm_mech_oid.elements); | ||||
| 			free(m->gm_mech.gm_mech_oid.elements); | ||||
| 			free(m); | ||||
| 			continue; | ||||
| 		} | ||||
| @@ -269,17 +277,14 @@ _gss_load_mech(void) | ||||
| 		SYM(inquire_mechs_for_name); | ||||
| 		SYM(canonicalize_name); | ||||
| 		SYM(duplicate_name); | ||||
| 		OPTSYM2(gsskrb5_register_acceptor_identity, | ||||
| 			gm_krb5_register_acceptor_identity); | ||||
| 		OPTSYM(krb5_copy_ccache); | ||||
| 		OPTSYM(krb5_compat_des3_mic); | ||||
| 		OPTSYM(inquire_cred_by_oid); | ||||
| 		OPTSYM(inquire_sec_context_by_oid); | ||||
|  | ||||
| 		SLIST_INSERT_HEAD(&_gss_mechs, m, gm_link); | ||||
| 		count++; | ||||
| 		continue; | ||||
|  | ||||
| 	bad: | ||||
| 		free(m->gm_mech_oid.elements); | ||||
| 		free(m->gm_mech.gm_mech_oid.elements); | ||||
| 		free(m); | ||||
| 		dlclose(so); | ||||
| 		continue; | ||||
| @@ -287,15 +292,15 @@ _gss_load_mech(void) | ||||
| 	fclose(fp); | ||||
| } | ||||
|  | ||||
| struct _gss_mech_switch * | ||||
| _gss_find_mech_switch(gss_OID mech) | ||||
| gssapi_mech_interface | ||||
| __gss_get_mechanism(gss_OID mech) | ||||
| { | ||||
| 	struct _gss_mech_switch *m; | ||||
|         struct _gss_mech_switch	*m; | ||||
|  | ||||
| 	_gss_load_mech(); | ||||
| 	SLIST_FOREACH(m, &_gss_mechs, gm_link) { | ||||
| 		if (_gss_oid_equal(&m->gm_mech_oid, mech)) | ||||
| 			return m; | ||||
| 		if (gss_oid_equal(&m->gm_mech.gm_mech_oid, mech)) | ||||
| 			return &m->gm_mech; | ||||
| 	} | ||||
| 	return (0); | ||||
| 	return NULL; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Love Hörnquist Åstrand
					Love Hörnquist Åstrand