Parse extensions.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@15892 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -49,6 +49,7 @@ struct entry { | |||||||
|     char *pw_end; |     char *pw_end; | ||||||
|     char *flags; |     char *flags; | ||||||
|     char *generation; |     char *generation; | ||||||
|  |     char *extensions; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static char * | static char * | ||||||
| @@ -309,6 +310,49 @@ parse_generation(char *str, GENERATION **gen) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int | ||||||
|  | parse_extensions(char *str, HDB_extensions **e) | ||||||
|  | { | ||||||
|  |     char *p; | ||||||
|  |     int ret; | ||||||
|  |  | ||||||
|  |     if(strcmp(str, "-") == 0 || *str == '\0') { | ||||||
|  | 	*e = NULL; | ||||||
|  | 	return 0; | ||||||
|  |     } | ||||||
|  |     *e = calloc(1, sizeof(**e)); | ||||||
|  |  | ||||||
|  |     p = strsep(&str, ":"); | ||||||
|  |  | ||||||
|  |     while (p) { | ||||||
|  | 	HDB_extension ext; | ||||||
|  | 	ssize_t len; | ||||||
|  | 	void *d; | ||||||
|  |  | ||||||
|  | 	len = strlen(p); | ||||||
|  | 	d = malloc(len); | ||||||
|  |  | ||||||
|  | 	len = hex_decode(p, d, len); | ||||||
|  | 	if (len < 0) | ||||||
|  | 	    return -1; | ||||||
|  |  | ||||||
|  | 	ret = decode_HDB_extension(d, len, &ext, NULL); | ||||||
|  | 	free(d); | ||||||
|  | 	if (ret) | ||||||
|  | 	    return -1; | ||||||
|  | 	d = realloc((*e)->val, ((*e)->len + 1) * sizeof((*e)->val[0])); | ||||||
|  | 	if (d == NULL) | ||||||
|  | 	    abort(); | ||||||
|  | 	(*e)->val = d; | ||||||
|  | 	(*e)->val[(*e)->len] = ext; | ||||||
|  | 	(*e)->len++; | ||||||
|  |  | ||||||
|  | 	p = strsep(&str, ":"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Parse the dump file in `filename' and create the database (merging |  * Parse the dump file in `filename' and create the database (merging | ||||||
| @@ -353,7 +397,12 @@ doit(const char *filename, int mergep) | |||||||
|     while(fgets(s, sizeof(s), f) != NULL) { |     while(fgets(s, sizeof(s), f) != NULL) { | ||||||
| 	ret = 0; | 	ret = 0; | ||||||
| 	line++; | 	line++; | ||||||
| 	e.principal = s; |  | ||||||
|  | 	p = s; | ||||||
|  | 	while (isspace((unsigned char)*p)) | ||||||
|  | 	    p++; | ||||||
|  |  | ||||||
|  | 	e.principal = p; | ||||||
| 	for(p = s; *p; p++){ | 	for(p = s; *p; p++){ | ||||||
| 	    if(*p == '\\') | 	    if(*p == '\\') | ||||||
| 		p++; | 		p++; | ||||||
| @@ -394,6 +443,9 @@ doit(const char *filename, int mergep) | |||||||
| 	e.generation = p; | 	e.generation = p; | ||||||
| 	p = skip_next(p); | 	p = skip_next(p); | ||||||
|  |  | ||||||
|  | 	e.extensions = p; | ||||||
|  | 	p = skip_next(p); | ||||||
|  |  | ||||||
| 	memset(&ent, 0, sizeof(ent)); | 	memset(&ent, 0, sizeof(ent)); | ||||||
| 	ret = krb5_parse_name(context, e.principal, &ent.principal); | 	ret = krb5_parse_name(context, e.principal, &ent.principal); | ||||||
| 	if(ret) { | 	if(ret) { | ||||||
| @@ -471,6 +523,13 @@ doit(const char *filename, int mergep) | |||||||
| 	    continue; | 	    continue; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if(parse_extensions(e.extensions, &ent.extensions) == -1) { | ||||||
|  | 	    fprintf (stderr, "%s:%d:error parsing extension (%s)\n", | ||||||
|  | 		     filename, line, e.extensions); | ||||||
|  | 	    hdb_free_entry (context, &ent); | ||||||
|  | 	    continue; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	ret = db->hdb_store(context, db, HDB_F_REPLACE, &ent); | 	ret = db->hdb_store(context, db, HDB_F_REPLACE, &ent); | ||||||
| 	hdb_free_entry (context, &ent); | 	hdb_free_entry (context, &ent); | ||||||
| 	if (ret) { | 	if (ret) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Love Hörnquist Åstrand
					Love Hörnquist Åstrand