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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user