Better return values on error.

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1257 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Johan Danielsson
1997-03-06 18:05:18 +00:00
parent 7be0433bc3
commit bdd9f7b6f8

View File

@@ -130,44 +130,44 @@ value : STRING
static int yylex(void) static int yylex(void)
{ {
int c; int c;
static char save; static char save;
static char yytext[1024]; static char yytext[1024];
char *p = yytext; char *p = yytext;
int type = 0; int type = 0;
while(1){ while(1){
if(save){ if(save){
c = save; c = save;
save = 0; save = 0;
}else }else
c = getc(F); c = getc(F);
if(c == EOF) if(c == EOF)
break; break;
if(isspace(c)) if(isspace(c))
if(type) if(type)
break; /* end of token */ break; /* end of token */
else else
continue; /* eat ws */ continue; /* eat ws */
if(strchr("[]={}", c)){ if(strchr("[]={}", c)){
if(type) if(type)
save = c; save = c;
else{ else{
return c; return c;
} }
break; break;
}
*p++ = c;
type = STRING;
continue;
} }
*p++ = c; *p = 0;
type = STRING; yylval.s = strdup(yytext);
continue; return type;
}
*p = 0;
yylval.s = strdup(yytext);
return type;
} }
void yyerror(char *s) void yyerror(char *s)
{ {
printf("yyerror: %s\n", s); printf("yyerror: %s\n", s);
} }
@@ -176,10 +176,10 @@ void yyerror(char *s)
static void static void
free_config_file(k5_cfile *cf) free_config_file(k5_cfile *cf)
{ {
if(!cf) if(!cf)
return; return;
FREE(cf->filename); FREE(cf->filename);
free(cf); free(cf);
} }
static void free_config_relation(krb5_config_relation *rel); static void free_config_relation(krb5_config_relation *rel);
@@ -187,95 +187,95 @@ static void free_config_relation(krb5_config_relation *rel);
static void static void
free_config_value(krb5_config_value val) free_config_value(krb5_config_value val)
{ {
if(val.type == krb5_config_value_string) if(val.type == krb5_config_value_string)
FREE(val.data.string); FREE(val.data.string);
else if(val.type == krb5_config_value_list) else if(val.type == krb5_config_value_list)
free_config_relation(val.data.relations); free_config_relation(val.data.relations);
else else
fprintf(stderr, "free_config_value: krb5_config_value " fprintf(stderr, "free_config_value: krb5_config_value "
"with bad type passed (%d)\n", val.type); "with bad type passed (%d)\n", val.type);
} }
static void static void
free_config_relation(krb5_config_relation *rel) free_config_relation(krb5_config_relation *rel)
{ {
if(!rel) if(!rel)
return; return;
free_config_value(rel->value); free_config_value(rel->value);
free_config_relation(rel->next); free_config_relation(rel->next);
FREE(rel); FREE(rel);
} }
static void static void
free_config_section(krb5_config_section *sec) free_config_section(krb5_config_section *sec)
{ {
if(!sec) if(!sec)
return; return;
FREE(sec->name); FREE(sec->name);
free_config_relation(sec->relations); free_config_relation(sec->relations);
free_config_section(sec->next); free_config_section(sec->next);
FREE(sec); FREE(sec);
} }
void void
krb5_free_config_file(k5_cfile *cf) krb5_free_config_file(k5_cfile *cf)
{ {
free_config_file(cf); free_config_file(cf);
} }
krb5_error_code krb5_error_code
krb5_get_config_tag(k5_cfile *cf, const char *tag, char **value) krb5_get_config_tag(k5_cfile *cf, const char *tag, char **value)
{ {
char *str; char *str;
char *p; char *p;
krb5_config_section *s; krb5_config_section *s;
krb5_config_relation *r; krb5_config_relation *r;
str = strdup(tag); str = strdup(tag);
p = strtok(str, " \t"); p = strtok(str, " \t");
if(!p) if(!p)
return ENOENT; return KRB5_REALM_UNKNOWN;
for(s = cf->sections; s; s = s->next){ for(s = cf->sections; s; s = s->next){
if(!strcmp(s->name, p)){ 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"); p = strtok(NULL, " \t");
r = r->value.data.relations; for(r = s->relations; r;){
continue; 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;
}
} }
r = r->next;
}
} }
} return KRB5_REALM_UNKNOWN;
return ENOENT;
} }
krb5_error_code krb5_error_code
krb5_parse_config_file(k5_cfile **cfile, const char *filename) krb5_parse_config_file(k5_cfile **cfile, const char *filename)
{ {
krb5_error_code ret; krb5_error_code ret;
if(!filename) if(!filename)
filename = krb5_config_file; filename = krb5_config_file;
F = fopen(filename, "r"); F = fopen(filename, "r");
if(F == NULL) if(F == NULL)
return errno; return errno;
cf = ALLOC(1, k5_cfile); cf = ALLOC(1, k5_cfile);
if(!cf) if(!cf)
return ENOMEM; return ENOMEM;
ret = yyparse(); ret = yyparse();
fclose(F); fclose(F);
if(ret) if(ret)
krb5_free_config_file(cf); krb5_free_config_file(cf);
else else
*cfile = cf; *cfile = cf;
return ret; return ret;
} }