Add netinfo support from Luke Howard <lukeh@xedoc.com.au>
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@3044 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -40,6 +40,136 @@
|
|||||||
#include "config_file.h"
|
#include "config_file.h"
|
||||||
RCSID("$Id$");
|
RCSID("$Id$");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Netinfo implementation from Luke Howard <lukeh@xedoc.com.au>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_NETINFO_NI_H
|
||||||
|
#include <netinfo/ni.h>
|
||||||
|
static ni_status
|
||||||
|
ni_proplist2binding(ni_proplist *pl, krb5_config_section **ret)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < pl->ni_proplist_len; i++) {
|
||||||
|
krb5_config_binding *b;
|
||||||
|
if (!strcmp(pl->nipl_val[i].nip_name, "name")) continue;
|
||||||
|
b = malloc(sizeof(*b));
|
||||||
|
if (b == NULL) return NI_FAILED;
|
||||||
|
if (i == pl->ni_proplist_len)
|
||||||
|
b->next = NULL;
|
||||||
|
else
|
||||||
|
b->next = *ret;
|
||||||
|
b->type = STRING;
|
||||||
|
b->name = ni_name_dup(pl->nipl_val[i].nip_name);
|
||||||
|
b->u.string = ni_name_dup(pl->nipl_val[i].nip_val.ninl_val[0]);
|
||||||
|
*ret = b;
|
||||||
|
}
|
||||||
|
return NI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ni_status
|
||||||
|
ni_idlist2binding(void *ni, ni_idlist *idlist, krb5_config_section **ret)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
ni_status nis;
|
||||||
|
krb5_config_section **next;
|
||||||
|
|
||||||
|
for (i = 0; i < idlist->ni_idlist_len; i++) {
|
||||||
|
ni_proplist pl;
|
||||||
|
ni_id nid;
|
||||||
|
ni_idlist children;
|
||||||
|
krb5_config_binding *b;
|
||||||
|
ni_index index;
|
||||||
|
|
||||||
|
nid.nii_instance = 0;
|
||||||
|
nid.nii_object = idlist->ni_idlist_val[i];
|
||||||
|
|
||||||
|
nis = ni_read(ni, &nid, &pl);
|
||||||
|
|
||||||
|
if (nis != NI_OK) {
|
||||||
|
return nis;
|
||||||
|
}
|
||||||
|
index = ni_proplist_match(pl, "name", NULL);
|
||||||
|
b = malloc(sizeof(*b));
|
||||||
|
if (b == NULL) return NI_FAILED;
|
||||||
|
|
||||||
|
if (i == 0) {
|
||||||
|
*ret = b;
|
||||||
|
} else {
|
||||||
|
*next = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
b->type = LIST;
|
||||||
|
b->name = ni_name_dup(pl.nipl_val[index].nip_val.ninl_val[0]);
|
||||||
|
b->next = NULL;
|
||||||
|
b->u.list = NULL;
|
||||||
|
nis = ni_proplist2binding(&pl, &b->u.list);
|
||||||
|
ni_proplist_free(&pl);
|
||||||
|
if (nis != NI_OK) return nis;
|
||||||
|
|
||||||
|
nis = ni_children(ni, &nid, &children);
|
||||||
|
if (nis == NI_OK) {
|
||||||
|
krb5_config_binding **node;
|
||||||
|
if (b->u.list == NULL)
|
||||||
|
node = &b->u.list;
|
||||||
|
else
|
||||||
|
node = &b->u.list->next;
|
||||||
|
nis = ni_idlist2binding(ni, &children, node);
|
||||||
|
}
|
||||||
|
next = &b->next;
|
||||||
|
}
|
||||||
|
ni_idlist_free(idlist);
|
||||||
|
return NI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
krb5_error_code
|
||||||
|
krb5_config_parse_file (const char *fname, krb5_config_section **res)
|
||||||
|
{
|
||||||
|
void *ni = NULL, *lastni = NULL;
|
||||||
|
int i;
|
||||||
|
ni_status nis;
|
||||||
|
ni_id nid;
|
||||||
|
ni_idlist children;
|
||||||
|
|
||||||
|
krb5_config_section *s;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
s = NULL;
|
||||||
|
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
if (i == 0) {
|
||||||
|
nis = ni_open(NULL, ".", &ni);
|
||||||
|
} else {
|
||||||
|
if (lastni != NULL) ni_free(lastni);
|
||||||
|
lastni = ni;
|
||||||
|
nis = ni_open(lastni, "..", &ni);
|
||||||
|
}
|
||||||
|
if (nis != NI_OK)
|
||||||
|
break;
|
||||||
|
nis = ni_pathsearch(ni, &nid, "/locations/kerberos");
|
||||||
|
if (nis == NI_OK) {
|
||||||
|
nis = ni_children(ni, &nid, &children);
|
||||||
|
if (nis != NI_OK)
|
||||||
|
break;
|
||||||
|
nis = ni_idlist2binding(ni, &children, &s);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ni != NULL) ni_free(ni);
|
||||||
|
if (ni != lastni && lastni != NULL) ni_free(lastni);
|
||||||
|
|
||||||
|
ret = (nis == NI_OK) ? 0 : -1;
|
||||||
|
if (ret == 0) {
|
||||||
|
*res = s;
|
||||||
|
} else {
|
||||||
|
*res = NULL;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#else /* !NETINFO_NI_H */
|
||||||
|
|
||||||
static int parse_section(char *p, krb5_config_section **s,
|
static int parse_section(char *p, krb5_config_section **s,
|
||||||
krb5_config_section **res);
|
krb5_config_section **res);
|
||||||
static int parse_binding(FILE *f, unsigned *lineno, char *p,
|
static int parse_binding(FILE *f, unsigned *lineno, char *p,
|
||||||
@@ -188,6 +318,8 @@ krb5_config_parse_file (const char *fname, krb5_config_section **res)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* HAVE_NETINFO_NI_H */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
free_binding (krb5_config_binding *b)
|
free_binding (krb5_config_binding *b)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user