static void mntlist_insert(char *host, char *path) { if (!mntlist_contains(host, path)) { struct mntentry *m; m = exmalloc(sizeof (struct mntentry)); m->m_host = exstrdup(host); m->m_path = exstrdup(path); m->m_pos = rmtab_insert(host, path); (void) h_put(mntlist, m); } }
/* * Process library mappings of the form: * <library_name> <machdep_variable> <value,...:library_name,...> ... */ static void _rtld_process_mapping(Library_Xform **lib_p, const char *bp, const char *ep) { Library_Xform *hwptr = NULL; const char *ptr, *key, *ekey, *lib, *elib, *l; int i, j; dbg((" processing mapping \"%.*s\"", (int)(ep - bp), bp)); if ((ptr = getword(&bp, ep, WS)) == NULL || ptr == bp) return; dbg((" library \"%.*s\"", (int)(bp - ptr), ptr)); hwptr = xmalloc(sizeof(*hwptr)); memset(hwptr, 0, sizeof(*hwptr)); hwptr->name = exstrdup(ptr, bp); bp++; if ((ptr = getword(&bp, ep, WS)) == NULL || ptr == bp) { xwarnx("missing sysctl variable name"); goto cleanup; } dbg((" sysctl \"%.*s\"", (int)(bp - ptr), ptr)); hwptr->ctlname = exstrdup(ptr, bp); for (i = 0; bp++, (ptr = getword(&bp, ep, WS)) != NULL;) { dbg((" ptr = %.*s", (int)(bp - ptr), ptr)); if (ptr == bp) continue; if (i == RTLD_MAX_ENTRY) { no_more: xwarnx("maximum library entries exceeded `%s'", hwptr->name); goto cleanup; } if ((key = getstr(&ptr, bp, ":")) == NULL) { xwarnx("missing sysctl variable value for `%s'", hwptr->name); goto cleanup; } ekey = ptr++; if ((lib = getstr(&ptr, bp, ":")) == NULL) { xwarnx("missing sysctl library list for `%s'", hwptr->name); goto cleanup; } elib = ptr; /* No need to advance */ for (j = 0; (l = getstr(&lib, elib, ",")) != NULL; j++, lib++) { if (j == RTLD_MAX_LIBRARY) { xwarnx("maximum library entries exceeded `%s'", hwptr->name); goto cleanup; } dbg((" library \"%.*s\"", (int)(lib - l), l)); hwptr->entry[i].library[j] = exstrdup(l, lib); } if (j == 0) { xwarnx("No library map entries for `%s/%.*s'", hwptr->name, (int)(bp - ptr), ptr); goto cleanup; } j = i; for (; (l = getstr(&key, ekey, ",")) != NULL; i++, key++) { /* * Allow empty key (it is valid as string * value). Thus, we loop at least once and * `i' is incremented. */ dbg((" key \"%.*s\"", (int)(key - l), l)); if (i == RTLD_MAX_ENTRY) goto no_more; if (i != j) (void)memcpy(hwptr->entry[i].library, hwptr->entry[j].library, sizeof(hwptr->entry[j].library)); hwptr->entry[i].value = exstrdup(l, key); } } if (i == 0) { xwarnx("No library entries for `%s'", hwptr->name); goto cleanup; } hwptr->next = *lib_p; *lib_p = hwptr; return; cleanup: if (hwptr->name) xfree(hwptr->name); xfree(hwptr); }