add support for having several default realms
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@7048 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -40,35 +40,99 @@ | ||||
|  | ||||
| RCSID("$Id$"); | ||||
|  | ||||
| /* | ||||
|  * Convert the config binding in `b' (consisting of strings) to a | ||||
|  * NULL-terminated list of strings in `list'.  All memory is | ||||
|  * dynamically allocated.  Return an error code. | ||||
|  */ | ||||
|  | ||||
| static krb5_error_code | ||||
| config_binding_to_list (const krb5_config_binding *b, | ||||
| 			krb5_realm **list) | ||||
| { | ||||
|     int n, i, j; | ||||
|     const krb5_config_binding *p; | ||||
|  | ||||
|     for (n = 1, p = b; p != NULL; p = p->next) | ||||
| 	++n; | ||||
|     *list = malloc (n * sizeof(**list)); | ||||
|     if (*list == NULL) | ||||
| 	return ENOMEM; | ||||
|     for (i = 0, p = b; i < n ; ++i, p = p->next) | ||||
| 	(*list)[i] = NULL; | ||||
|     for (i = 0, p = b; p != NULL; ++i, p = p->next) { | ||||
| 	if (p->type != krb5_config_string) | ||||
| 	    continue; | ||||
| 	(*list)[i] = strdup(p->u.string); | ||||
| 	if ((*list)[i] == NULL) { | ||||
| 	    for (j = 0; j < i; ++j) | ||||
| 		free ((*list)[j]); | ||||
| 	    free (*list); | ||||
| 	    return ENOMEM; | ||||
| 	} | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Convert the simple string `s' into a NULL-terminated and freshly allocated  | ||||
|  * list in `list'.  Return an error code. | ||||
|  */ | ||||
|  | ||||
| static krb5_error_code | ||||
| string_to_list (const char *s, krb5_realm **list) | ||||
| { | ||||
|  | ||||
|     *list = malloc (2 * sizeof(**list)); | ||||
|     if (*list == NULL) | ||||
| 	return ENOMEM; | ||||
|     (*list)[0] = strdup (s); | ||||
|     if ((*list)[0] == NULL) { | ||||
| 	free (*list); | ||||
| 	return ENOMEM; | ||||
|     } | ||||
|     (*list)[1] = NULL; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Set the knowledge of the default realm(s) in `context'. | ||||
|  * If realm != NULL, that's the new default realm. | ||||
|  * Otherwise, the realm(s) are figured out from configuration or DNS.   | ||||
|  */ | ||||
|  | ||||
| krb5_error_code | ||||
| krb5_set_default_realm(krb5_context context, | ||||
| 		       char *realm) | ||||
| { | ||||
|     const char *foo; | ||||
|     char *tmp; | ||||
|     krb5_error_code ret; | ||||
|     const char *tmp; | ||||
|     krb5_realm *realms = NULL; | ||||
|     const krb5_config_binding *b; | ||||
|  | ||||
|     if (realm == NULL){ | ||||
| 	foo = krb5_config_get_string (context, NULL, | ||||
|     if (realm == NULL) { | ||||
| 	tmp = krb5_config_get_string (context, NULL, | ||||
| 				      "libdefaults", | ||||
| 				      "default_realm", | ||||
| 				      NULL); | ||||
| 	if(foo == NULL){ | ||||
| 	    krb5_error_code ret; | ||||
| 	    ret = krb5_get_host_realm(context, NULL, &realms); | ||||
| 	    if(ret) | ||||
| 		return ret; | ||||
| 	    foo = realms[0]; | ||||
| 	if (tmp == NULL) { | ||||
| 	    b = krb5_config_get_list (context, NULL, | ||||
| 				      "libdefaults", | ||||
| 				      "default_realm", | ||||
| 				      NULL); | ||||
| 	    if (b == NULL) | ||||
| 		ret = krb5_get_host_realm(context, NULL, &realms); | ||||
| 	    else | ||||
| 		ret = config_binding_to_list (b, &realms); | ||||
| 	} else { | ||||
| 	    ret = string_to_list (tmp, &realms); | ||||
| 	} | ||||
|     } else | ||||
| 	foo = realm; | ||||
|  | ||||
|     tmp = strdup (foo); | ||||
|     krb5_free_host_realm(context, realms); | ||||
| 	 | ||||
|     if (tmp == NULL) | ||||
| 	return ENOMEM; | ||||
|     free(context->default_realm); | ||||
|     context->default_realm = tmp; | ||||
|     } else { | ||||
| 	ret = string_to_list (realm, &realms); | ||||
|     } | ||||
|     if (ret) | ||||
| 	return ret; | ||||
|     krb5_free_host_realm (context, context->default_realms); | ||||
|     context->default_realms = realms; | ||||
|     return 0; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Assar Westerlund
					Assar Westerlund