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