Listing 3: Partial listing of the socloc server module socloc.c
// file socloc.c #ifdef OS_WIN32 WSADATA wsaData; #endif int server_port = 0; char s_log_file[128]; struct sloc_entry { char *service_name; char *host_name; int port_number; char *ip_addr; struct sloc_entry *next; }; struct sloc_entry *sloc_base; void main(void) { char localHost[128]; int isterm; if (!srv_initialize()) exit(4); if (!ipc_init(localHost, server_port)) exit(6); while(1) { if (ipc_server_wait()) { isterm = process_request(); (void)ipc_close_client(); } if (isterm) break; } #ifdef OS_WIN32 WSACleanup(); #endif exit(0); } int srv_initialize(void) { char localhost[128], hname[128], ip_ad[128]; char *thelist; int i, ret, nentries, port_num; if ((ret = sl_config_read(SL_CONFIG_FILE_NAME)) != SL_OK) return(FALSE); #ifdef OS_WIN32 if (WSAStartup(WINSOCK_VERSION, &wsaData)) { WSACleanup(); return(FALSE); } #endif if (gethostname(localhost, 127)) { #ifdef OS_WIN32 WSACleanup(); #endif return(FALSE); } if ((ret = sl_config_get_nentries(&nentries)) != SL_OK) return(FALSE); for(i = 1; i <= nentries; i++) { if ((ret = sl_config_get_nth(i, hname, &port_num, ip_ad)) != SL_OK) return(FALSE); if (!strcmp(hname, localhost)) server_port = port_num; } if (server_port == 0) return(FALSE); if ((ret = sl_config_set_ils(server_port, TRUE)) != SL_OK) return(FALSE); sloc_base = SLOC_NULL; if ((ret = sloc_find_first_active()) != SL_OK) ; else { (void)sloc_bcast_config_add(localhost, server_port, (char *)NULL); if ((thelist = (char *)malloc(SL_MAXCOMMAND)) == (char *)NULL) return(FALSE); if ((ret = sloc_config_get_list(thelist)) != SL_OK) { free(thelist); return(FALSE); } if ((ret = sl_config_put_list(thelist)) != SL_OK) { free(thelist); return(FALSE); } if ((ret = sl_config_set_ils(server_port, TRUE)) != SL_OK) { free(thelist); return(FALSE); } if ((ret = sloc_get_list(thelist)) != SL_OK) if (ret == SL_NOT_FOUND) ; else { free(thelist); return(FALSE); } if (ret == SL_OK) if ((ret = s_ll_put_list(thelist)) != SL_OK) { free(thelist); return(FALSE); } free(thelist); } sl_config_debug(); s_ll_debug(); strcpy(s_log_file, SL_LOG_FILE); return(TRUE); }