FAR void *dlsym(FAR void *handle, FAR const char *name) { #if defined(CONFIG_BUILD_FLAT) /* In the FLAT build, a shared library is essentially the same as a kernel * module. */ return (FAR void *)modsym(handle, name); #elif defined(CONFIG_BUILD_PROTECTED) /* The PROTECTED build is equivalent to the FLAT build EXCEPT that there * must be two copies of the module logic: One residing in kernel * space and using the kernel symbol table and one residing in user space * using the user space symbol table. * * dlgetsem() is essentially a clone of modsym(). */ return (FAR void *)dlgetsym(handle, name); #else /* if defined(CONFIG_BUILD_KERNEL) */ /* The KERNEL build is considerably more complex: In order to be shared, * the .text portion of the module must be (1) build for PIC/PID operation * and (2) must like in a shared memory region accessible from all * processes. The .data/.bss portion of the module must be allocated in * the user space of each process, but must lie at the same virtual address * so that it can be referenced from the one copy of the text in the shared * memory region. */ #warning Missing logic return NULL; #endif }
void connect_server() { struct Client *client = make_client(NULL); struct Server *server = make_server(client); struct Module *protomod; char modes[MODEBUFLEN+1] = ""; int i, j = 0; protomod = find_module(Connect.protocol, NO); if(protomod == NULL) { ilog(L_CRIT, "Unable to connect to uplink, protocol module %s not found.", Connect.protocol); services_die("Connect error", NO); } ServerModeList = (struct ModeList *)modsym(protomod->handle, "ModeList"); for(i = 0; ServerModeList[i].letter != '\0'; i++) { modes[j++] = ServerModeList[i].letter; if(j > MODEBUFLEN) break; } modes[j] = '\0'; ilog(L_DEBUG, "Loaded server mode list %p %s %d", ServerModeList, modes, j); strlcpy(server->pass, Connect.password, sizeof(server->pass)); strlcpy(client->name, Connect.name, sizeof(client->name)); strlcpy(client->host, Connect.host, sizeof(client->host)); SetConnecting(client); client->from = client; dlinkAdd(client, &client->node, &global_client_list); if(comm_open(&server->fd, AF_INET, SOCK_STREAM, 0, NULL) < 0) { ilog(L_CRIT, "connect_server: Could not open socket"); exit(1); } comm_connect_tcp(&server->fd, Connect.host, Connect.port, NULL, 0, serv_connect_callback, client, AF_INET, CONNECTTIMEOUT); eventAdd("Server connection check", try_reconnect, NULL, 60); }