Parse extensions.

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@15892 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2005-08-11 13:52:26 +00:00
parent ea0c11825c
commit f2cd11a998

View File

@@ -49,6 +49,7 @@ struct entry {
char *pw_end;
char *flags;
char *generation;
char *extensions;
};
static char *
@@ -309,6 +310,49 @@ parse_generation(char *str, GENERATION **gen)
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
@@ -353,7 +397,12 @@ doit(const char *filename, int mergep)
while(fgets(s, sizeof(s), f) != NULL) {
ret = 0;
line++;
e.principal = s;
p = s;
while (isspace((unsigned char)*p))
p++;
e.principal = p;
for(p = s; *p; p++){
if(*p == '\\')
p++;
@@ -394,6 +443,9 @@ doit(const char *filename, int mergep)
e.generation = p;
p = skip_next(p);
e.extensions = p;
p = skip_next(p);
memset(&ent, 0, sizeof(ent));
ret = krb5_parse_name(context, e.principal, &ent.principal);
if(ret) {
@@ -471,6 +523,13 @@ doit(const char *filename, int mergep)
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);
hdb_free_entry (context, &ent);
if (ret) {