add krb5_prepend_config_files and krb5_prepend_config_files_default
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@12583 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Copyright (c) 1997 - 2002 Kungliga Tekniska H<>gskolan | ||||
|  * Copyright (c) 1997 - 2003 Kungliga Tekniska H<>gskolan | ||||
|  * (Royal Institute of Technology, Stockholm, Sweden).  | ||||
|  * All rights reserved.  | ||||
|  * | ||||
| @@ -270,14 +270,113 @@ krb5_set_config_files(krb5_context context, char **filenames) | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static krb5_error_code | ||||
| add_file(char ***pfilenames, size_t *len, char *file) | ||||
| { | ||||
|     char **pp = *pfilenames; | ||||
|     int i; | ||||
|  | ||||
|     for(i = 0; i < *len; i++) { | ||||
| 	if(strcmp(pp[i], file) == 0) { | ||||
| 	    free(file); | ||||
| 	    return 0; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|     pp = realloc(*pfilenames, (*len + 2) * sizeof(*pp)); | ||||
|     if (pp == NULL) { | ||||
| 	free(file); | ||||
| 	return ENOMEM; | ||||
|     } | ||||
|  | ||||
|     pp[*len] = file; | ||||
|     pp[*len + 1] = NULL; | ||||
|     *pfilenames = pp; | ||||
|     *len += 1; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  *  `pq' isn't free, its up the the caller | ||||
|  */ | ||||
|  | ||||
| krb5_error_code | ||||
| krb5_prepend_config_files(const char *filelist, char **pq, char ***ret_pp) | ||||
| { | ||||
|     krb5_error_code ret; | ||||
|     const char *p, *q; | ||||
|     char **pp; | ||||
|     int len; | ||||
|     char *fn; | ||||
|  | ||||
|     pp = NULL; | ||||
|  | ||||
|     len = 0; | ||||
|     p = filelist; | ||||
|     while(1) { | ||||
| 	ssize_t l; | ||||
| 	q = p; | ||||
| 	l = strsep_copy(&q, ":", NULL, 0); | ||||
| 	if(l == -1) | ||||
| 	    break; | ||||
| 	fn = malloc(l + 1); | ||||
| 	if(fn == NULL) { | ||||
| 	    krb5_free_config_files(pp); | ||||
| 	    return ENOMEM; | ||||
| 	} | ||||
| 	l = strsep_copy(&p, ":", fn, l + 1); | ||||
| 	ret = add_file(&pp, &len, fn); | ||||
| 	if (ret) { | ||||
| 	    krb5_free_config_files(pp); | ||||
| 	    return ret; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|     if (pq != NULL) { | ||||
| 	int i; | ||||
|  | ||||
| 	for (i = 0; pq[i] != NULL; i++) { | ||||
| 	    fn = strdup(pq[i]); | ||||
| 	    if (fn == NULL) { | ||||
| 		krb5_free_config_files(pp); | ||||
| 		return ENOMEM; | ||||
| 	    } | ||||
| 	    ret = add_file(&pp, &len, fn); | ||||
| 	    if (ret) { | ||||
| 		krb5_free_config_files(pp); | ||||
| 		return ret; | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|     *ret_pp = pp; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| krb5_error_code | ||||
| krb5_prepend_config_files_default(const char *filelist, char ***pfilenames) | ||||
| { | ||||
|     krb5_error_code ret; | ||||
|     char **defpp, **pp = NULL; | ||||
|      | ||||
|     ret = krb5_get_default_config_files(&defpp); | ||||
|     if (ret) | ||||
| 	return ret; | ||||
|  | ||||
|     ret = krb5_prepend_config_files(filelist, defpp, &pp); | ||||
|     krb5_free_config_files(defpp); | ||||
|     if (ret) { | ||||
| 	return ret; | ||||
|     }	 | ||||
|     *pfilenames = pp; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| krb5_error_code  | ||||
| krb5_get_default_config_files(char ***pfilenames) | ||||
| { | ||||
|     const char *p, *q; | ||||
|     char **pp; | ||||
|     int n, i; | ||||
|  | ||||
|     const char *files = NULL; | ||||
|  | ||||
|     if (pfilenames == NULL) | ||||
|         return EINVAL; | ||||
|     if(!issuid()) | ||||
| @@ -285,36 +384,7 @@ krb5_get_default_config_files(char ***pfilenames) | ||||
|     if (files == NULL) | ||||
| 	files = krb5_config_file; | ||||
|  | ||||
|     for(n = 0, p = files; strsep_copy(&p, ":", NULL, 0) != -1; n++); | ||||
|     pp = malloc((n + 1) * sizeof(*pp)); | ||||
|     if(pp == NULL) | ||||
| 	return ENOMEM; | ||||
|  | ||||
|     n = 0; | ||||
|     p = files; | ||||
|     while(1) { | ||||
| 	ssize_t l; | ||||
| 	q = p; | ||||
| 	l = strsep_copy(&q, ":", NULL, 0); | ||||
| 	if(l == -1) | ||||
| 	    break; | ||||
| 	pp[n] = malloc(l + 1); | ||||
| 	if(pp[n] == NULL) { | ||||
| 	    krb5_free_config_files(pp); | ||||
| 	    return ENOMEM; | ||||
| 	} | ||||
| 	l = strsep_copy(&p, ":", pp[n], l + 1); | ||||
| 	for(i = 0; i < n; i++) | ||||
| 	    if(strcmp(pp[i], pp[n]) == 0) { | ||||
| 		free(pp[n]); | ||||
| 		goto skip; | ||||
| 	    } | ||||
| 	n++; | ||||
|     skip:; | ||||
|     } | ||||
|     pp[n] = NULL; | ||||
|     *pfilenames = pp; | ||||
|     return 0; | ||||
|     return krb5_prepend_config_files(files, NULL, pfilenames); | ||||
| } | ||||
|  | ||||
| void | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Love Hörnquist Åstrand
					Love Hörnquist Åstrand