int muxia_init(char *in_addr, int port) { journal_ftrace(__func__); int ret; /* * s_tk: current token * a_tk: begin a token * z_tk: end a token */ char *s_tk, *z_tk, *a_tk = in_addr; event_register(EVENT_EXIT, "muxia:muxia_fini()", muxia_fini, PRIO_AGNOSTIC); while ((s_tk = x_strtok(&a_tk, &z_tk, ','))) { ret = netbus_newserv(trim(s_tk), port, NULL, NULL, muxia); if (ret < 0) { journal_notice("netbus_newserv failed :: %s:%i\n", __FILE__, __LINE__); return -1; } } return 0; }
extern int hooklet_init(char *hooklet_list, const char *hooklet_path) { hooklet_t *hk = NULL; char fullname[PATHLEN]; /* * s_tk: current token * a_tk: begin a token * z_tk: end a token */ char *s_tk, *z_tk, *a_tk = hooklet_list; if (hooklet_list == NULL) { jlog(L_NOTICE, "hooklet]> The hooklet list is empty. :: %s:%i", __FILE__, __LINE__); return -1; } if (hooklet_path == NULL) { jlog(L_NOTICE, "hooklet]> The hooklet path is empty. :: %s:%i", __FILE__, __LINE__); return -1; } while ((s_tk = x_strtok(&a_tk, &z_tk, ','))) { if (hk == NULL) hk = calloc(1, sizeof(hooklet_t)); if (hk == NULL) { jlog(L_NOTICE, "hooklet]> calloc() %s :: %s:%i", strerror(errno), __FILE__, __LINE__); return -1; } hk->name = strdup(trim(s_tk)); snprintf(fullname, PATHLEN, "%s/%s.so", hooklet_path, hk->name); jlog(L_DEBUG, "hooklet]> opening %s", fullname); hk->handle = dlopen(fullname, RTLD_GLOBAL|RTLD_NOW); if (hk->handle == NULL) { jlog(L_NOTICE, "hooklet]> Can't load `%s` from `%s`, dlopen() : %s :: %s:%i", \ hk->name, fullname, dlerror(), __FILE__, __LINE__); continue; } hk->hookin = dlsym(hk->handle, "hookin"); if (hk->hookin == NULL) { jlog(L_NOTICE, "hooklet]> `%s` failed to return any hookin callback. %s :: %s:%i", \ hk->name, dlerror(), __FILE__, __LINE__); continue; } hooklets[hk->hookin()] = hk; hk = NULL; } if (hk != NULL) { free(hk->name); free(hk); } return 0; }