removed
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1972 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -1,283 +0,0 @@ | ||||
| %{ | ||||
|  | ||||
| #include <string.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <ctype.h> | ||||
|  | ||||
| #include "krb5_locl.h" | ||||
| #include "config_file.h" | ||||
|  | ||||
| RCSID("$Id$"); | ||||
|  | ||||
| static char section[128]; | ||||
| static FILE *F; | ||||
|  | ||||
| static k5_cfile *cf; | ||||
|  | ||||
| static krb5_config_section *csec; | ||||
|  | ||||
| static krb5_config_relation **crel; | ||||
| static krb5_config_relation **rels[16]; | ||||
| static int relp; | ||||
|  | ||||
| static void yyerror (char *); | ||||
| static int yylex (void); | ||||
|  | ||||
| %} | ||||
|  | ||||
| %union { | ||||
| 	int	i; | ||||
| 	char   *s; | ||||
| } | ||||
|  | ||||
| %token <s> STRING | ||||
|  | ||||
| %% | ||||
|  | ||||
| file	:  section_list | ||||
| 	; | ||||
|  | ||||
| section_list : /* empty */ | ||||
| 	| section rel_list section_list  | ||||
| 		{  | ||||
| #ifdef DEBUG | ||||
| 			printf("section_list\n");  | ||||
| #endif | ||||
| 		} | ||||
| 	; | ||||
|  | ||||
| section | ||||
| 	: '[' STRING ']'  | ||||
| 	{ | ||||
| 		krb5_config_section *p; | ||||
| 		p = ALLOC(1, krb5_config_section); | ||||
| 		p->next = NULL; | ||||
| 		p->name = $2; | ||||
| 		p->relations = NULL; | ||||
| 		if(cf->sections) | ||||
| 			p->next = cf->sections; | ||||
| 		cf->sections = p; | ||||
| 		csec = p; | ||||
| 		crel = &p->relations; | ||||
| #ifdef DEBUG | ||||
| 		printf("section\n"); | ||||
| #endif | ||||
| 		strcpy(section, $2);  | ||||
| 	} | ||||
| 	; | ||||
|  | ||||
| rel_list  | ||||
| 	: relation rel_sub | ||||
| 	; | ||||
|  | ||||
| rel_sub	: /* empty */  | ||||
| 	| relation rel_sub  | ||||
| 	; | ||||
|  | ||||
| relation | ||||
| 	: tag '=' value  | ||||
| 	{  | ||||
| #ifdef DEBUG | ||||
| 		printf("relation\n"); | ||||
| #endif | ||||
| 	} | ||||
| 	; | ||||
|  | ||||
| tag	: STRING  | ||||
| 	{	 | ||||
| 		krb5_config_relation *p; | ||||
| 		if(!crel){ | ||||
| 			fprintf(stderr, "error\n"); | ||||
| 			return -17; | ||||
| 		} | ||||
| 		p = ALLOC(1, krb5_config_relation); | ||||
| 		p->tag = $1; | ||||
| 		if(*crel){ | ||||
| 			p->next = NULL; | ||||
| 			(*crel)->value.data.relations = p; | ||||
| 			rels[relp++] = crel; | ||||
| 			crel = &p; | ||||
| 		}else{ | ||||
| 			p->next = *crel; | ||||
| 			*crel = p; | ||||
| 		} | ||||
| #ifdef DEBUG | ||||
| 		printf("tag\n");  | ||||
| #endif | ||||
| 	} | ||||
| 	; | ||||
|  | ||||
| value	: STRING | ||||
| 	{ | ||||
| 		(*crel)->value.type = krb5_config_value_string; | ||||
| 		(*crel)->value.data.string = $1; | ||||
| 		crel = &(*crel)->next; | ||||
| #ifdef DEBUG | ||||
| 		printf("value/string\n"); | ||||
| #endif | ||||
| 	} | ||||
| 	| '{' rel_list '}' | ||||
| 	{ | ||||
| 		crel = rels[--relp]; | ||||
| 		(*crel)->value.type = krb5_config_value_list; | ||||
| 		crel = &(*crel)->next; | ||||
| #ifdef DEBUG | ||||
| 		printf("value/list\n"); | ||||
| #endif | ||||
| 	} | ||||
| 	; | ||||
|  | ||||
| %% | ||||
|  | ||||
| static int yylex(void) | ||||
| { | ||||
|     int c; | ||||
|     static char save; | ||||
|     static char yytext[1024]; | ||||
|     char *p = yytext; | ||||
|     int type = 0; | ||||
|     while(1){ | ||||
| 	if(save){ | ||||
| 	    c = save; | ||||
| 	    save = 0; | ||||
| 	}else | ||||
| 	    c = getc(F); | ||||
| 	if(c == EOF) | ||||
| 	    break; | ||||
| 	if(isspace(c)) | ||||
| 	    if(type) | ||||
| 		break; /* end of token */ | ||||
| 	    else  | ||||
| 		continue; /* eat ws */ | ||||
| 	if(strchr("[]={}", c)){ | ||||
| 	    if(type) | ||||
| 		save = c; | ||||
| 	    else{ | ||||
| 		return c; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	} | ||||
| 	*p++ = c; | ||||
| 	type = STRING; | ||||
| 	continue; | ||||
|     } | ||||
|     *p = 0; | ||||
|     yylval.s = strdup(yytext); | ||||
|     return type; | ||||
| } | ||||
|  | ||||
| void yyerror(char *s) | ||||
| { | ||||
|     printf("yyerror: %s\n", s); | ||||
| } | ||||
|  | ||||
|  | ||||
| /*----------------------------------------*/ | ||||
|  | ||||
| static void | ||||
| free_config_file(k5_cfile *cf) | ||||
| { | ||||
|     if(!cf) | ||||
| 	return; | ||||
|     FREE(cf->filename); | ||||
|     free(cf); | ||||
| } | ||||
|  | ||||
| static void free_config_relation(krb5_config_relation *rel); | ||||
|  | ||||
| static void | ||||
| free_config_value(krb5_config_value val) | ||||
| { | ||||
|     if(val.type == krb5_config_value_string) | ||||
| 	FREE(val.data.string); | ||||
|     else if(val.type == krb5_config_value_list) | ||||
| 	free_config_relation(val.data.relations); | ||||
|     else | ||||
| 	fprintf(stderr, "free_config_value: krb5_config_value " | ||||
| 		"with bad type passed (%d)\n", val.type); | ||||
| } | ||||
|  | ||||
| static void | ||||
| free_config_relation(krb5_config_relation *rel) | ||||
| { | ||||
|     if(!rel) | ||||
| 	return; | ||||
|     free_config_value(rel->value); | ||||
|     free_config_relation(rel->next); | ||||
|     FREE(rel); | ||||
| } | ||||
|  | ||||
| static void | ||||
| free_config_section(krb5_config_section *sec) | ||||
| { | ||||
|     if(!sec) | ||||
| 	return; | ||||
|     FREE(sec->name); | ||||
|     free_config_relation(sec->relations); | ||||
|     free_config_section(sec->next); | ||||
|     FREE(sec); | ||||
| } | ||||
|  | ||||
|  | ||||
| void | ||||
| krb5_free_config_file(k5_cfile *cf) | ||||
| { | ||||
|     free_config_file(cf); | ||||
| } | ||||
|  | ||||
| krb5_error_code | ||||
| krb5_get_config_tag(k5_cfile *cf, const char *tag, char **value) | ||||
| { | ||||
|     char *str; | ||||
|     char *p; | ||||
|     krb5_config_section *s; | ||||
|     krb5_config_relation *r; | ||||
|    | ||||
|     str = strdup(tag); | ||||
|     p = strtok(str, " \t"); | ||||
|     if(!p) | ||||
| 	return KRB5_REALM_UNKNOWN; | ||||
|     for(s = cf->sections; s; s = s->next){ | ||||
| 	if(!strcmp(s->name, p)){ | ||||
| 	    p = strtok(NULL, " \t"); | ||||
| 	    for(r = s->relations; r;){ | ||||
| 		if(!strcmp(r->tag, p)){ | ||||
| 		    if(r->value.type == krb5_config_value_string){ | ||||
| 			*value = strdup(r->value.data.string); | ||||
| 			free(str); | ||||
| 			return 0; | ||||
| 		    }else{ | ||||
| 			p = strtok(NULL, " \t"); | ||||
| 			r = r->value.data.relations; | ||||
| 			continue; | ||||
| 		    } | ||||
| 		} | ||||
| 		r = r->next; | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
|     return KRB5_REALM_UNKNOWN; | ||||
| } | ||||
|  | ||||
| krb5_error_code | ||||
| krb5_parse_config_file(k5_cfile **cfile, const char *filename) | ||||
| { | ||||
|     krb5_error_code ret; | ||||
|     if(!filename) | ||||
| 	filename = krb5_config_file; | ||||
|     F = fopen(filename, "r"); | ||||
|     if(F == NULL) | ||||
| 	return errno; | ||||
|     cf = ALLOC(1, k5_cfile); | ||||
|     if(!cf) | ||||
| 	return ENOMEM; | ||||
|     ret = yyparse(); | ||||
|  | ||||
|     fclose(F); | ||||
|     if(ret) | ||||
| 	krb5_free_config_file(cf); | ||||
|     else | ||||
| 	*cfile = cf; | ||||
|     return ret; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Assar Westerlund
					Assar Westerlund