39 #include <netinfo/ni.h>
60 #define NETINFO_PROP_KEY "name"
61 #define NETINFO_PROP_VALUE "members"
62 #define NETINFO_VALUE_SEP ","
64 #define NETINFO_MAX_DOMAIN_DEPTH 100
68 static const char *dict_ni_do_lookup(
char *path,
char *key_prop,
69 const char *key_value,
char *val_prop)
71 unsigned int result_cap = 0;
72 static char *result = 0;
84 msg_info(
"ni_lookup %s %s=%s", path, key_prop, key_value);
86 r = ni_open(NULL,
".", &domain);
91 query =
mymalloc(strlen(path) + strlen(key_prop) + 3 + strlen(key_value));
92 sprintf(query,
"%s/%s=%s", path, key_prop, key_value);
99 if (ni_pathsearch(domain, &dir, query) == NI_OK
100 && ni_lookupprop(domain, &dir, val_prop, &values) == NI_OK)
101 if (values.ni_namelist_len <= 0)
102 ni_namelist_free(&values);
104 unsigned int i, l, n;
106 for (i = l = 0; i < values.ni_namelist_len; i++)
107 l += 1 + strlen(values.ni_namelist_val[i]);
108 if (result_cap < l) {
111 result_cap = l + 100;
114 for (i = l = 0; i < values.ni_namelist_len; i++) {
115 n = strlen(values.ni_namelist_val[i]);
116 memcpy(result + l, values.ni_namelist_val[i], n);
118 if (i < values.ni_namelist_len - 1)
126 if (++depth >= NETINFO_MAX_DOMAIN_DEPTH) {
127 msg_warn(
"ni_open: domain depth limit");
130 r = ni_open(domain,
"..", &next_domain);
137 domain = next_domain;
148 static const char *dict_ni_lookup(
DICT *dict,
const char *key)
150 DICT_NI *d = (DICT_NI *) dict;
163 return dict_ni_do_lookup(d->dict.name, NETINFO_PROP_KEY,
164 key, NETINFO_PROP_VALUE);
169 static void dict_ni_close(
DICT *dict)
171 DICT_NI *d = (DICT_NI *) dict;
184 d->dict.
lookup = dict_ni_lookup;
185 d->dict.close = dict_ni_close;
DICT * dict_ni_open(const char *, int, int)
#define DICT_FLAG_FOLD_FIX
VSTRING * vstring_strcpy(VSTRING *vp, const char *src)
#define DICT_OWNER_TRUSTED
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
char * lowercase(char *string)
const char *(* lookup)(struct DICT *, const char *)
#define DICT_TYPE_NETINFO
VSTRING * vstring_free(VSTRING *vp)
DICT * dict_alloc(const char *, const char *, ssize_t)
void * mymalloc(ssize_t len)
void msg_info(const char *fmt,...)