diff --git a/src/server/distrend.c b/src/server/distrend.c --- a/src/server/distrend.c +++ b/src/server/distrend.c @@ -83,7 +83,7 @@ struct general_info int distrend_do(); int distrend_do_config(int argc, char *argv[], struct distrend_config **config); int distrend_config_free(struct distrend_config *config); -int distrend_handle_request(struct distrend_client *client, struct distren_request *req, void *reqdata, struct general_info *geninfo); +int distrend_handle_request(struct distrend_listens *listens, struct distrend_client *client, struct distren_request *req, void *reqdata, struct general_info *geninfo); /* **************XML Functions**************** */ @@ -100,8 +100,8 @@ int main(int argc, char *argv[]) /* Parse arguments */ int counter; int test = 0; /*< Interactive mode if 1 */ + int tmp; struct general_info general_info; - struct distrend_clientset *clients; enum clientstatus { @@ -154,19 +154,30 @@ int main(int argc, char *argv[]) /** Execute test function */ interactiveTest(test, &general_info); - if(distrend_listen(general_info.config, &clients)) + general_info.config->listens = distrend_listens_new(&general_info); + if(!general_info.config->listens) { - fprintf(stderr, "error listening\n"); + fprintf(stderr, "error initializing listens\n"); return 1; } + for(counter = 0; general_info.config->listen_ports[counter]; counter ++) + { + tmp = distrend_listen_add(general_info.config->listens, general_info.config->listen_ports[counter]); + if(tmp) + { + fprintf(stderr, "Error listening on port %d\n", general_info.config->listen_ports[counter]); + return 1; + } + } int slaveKey = 0; // Remotio should set me on a per-slave basis /* Main Loop */ + general_info.config->die = 0; while(!general_info.config->die) { int clientrequest = 0; /*< temporary example variable, will be replaced when we can handle messages */ - distrend_accept(general_info.config, clients, (distrend_handle_request_t)&distrend_handle_request, (void *)&general_info); + distrend_accept(general_info.config->listens); /* Run the watchdog, @TODO: like every 10 mins or something */ frame_watchdog(general_info.conn); @@ -194,7 +205,7 @@ int main(int argc, char *argv[]) distrenjob_free(&job); } - distrend_unlisten(general_info.config->listens, clients); + distrend_listen_free(general_info.config->listens); distrend_config_free(general_info.config); xmlcleanup(); @@ -208,7 +219,7 @@ int main(int argc, char *argv[]) /* ********************** Functions ************************* */ -int distrend_handle_request(struct distrend_client *client, struct distren_request *req, void *reqdata, struct general_info *geninfo) +int distrend_handle_request(struct distrend_listens *listens, struct distrend_client *client, struct distren_request *req, void *reqdata, struct general_info *geninfo) { size_t counter; char *tmp_str; @@ -246,11 +257,11 @@ int distrend_handle_request(struct distr fixedbuf[req->len] = '\0'; _distren_asprintf(&tmp_str, "You have tried to connect to a %s server when your client claims to be running %s. Bye ;-)\n", PACKAGE_STRING, fixedbuf); - distrend_send_disconnect(client, tmp_str); + distrend_send_disconnect(listens, client, tmp_str); } distren_request_new(&newreq, strlen(VERSION), DISTREN_REQUEST_VERSION); - distrend_client_write_request(client, newreq, VERSION); + distrend_client_write_request(listens, client, newreq, VERSION); distren_request_free(newreq); break; } @@ -308,26 +319,29 @@ int distrend_do_config(int argc, char *a /** grab listen blocks: */ - (*config)->listens = malloc(sizeof(struct distrend_listen) * (cfg_size((*config)->mycfg, "listen") + 1)); + (*config)->listen_ports = malloc(sizeof(int) * (cfg_size((*config)->mycfg, "listen") + 1)); for(counter = 0; counter < cfg_size((*config)->mycfg, "listen"); counter ++) { cfg_listen = cfg_getnsec((*config)->mycfg, "listen", counter); - (*config)->listens[counter].port = cfg_getint(cfg_listen, "port"); - (*config)->listens[counter].sock = -1; + (*config)->listen_ports[counter] = cfg_getint(cfg_listen, "port"); } - memset(&(*config)->listens[counter], '\0', sizeof(struct distrend_listen)); + (*config)->listen_ports[counter] = 0; fprintf(stderr, "using %s as datadir\n", (*config)->datadir); return 0; } + int distrend_config_free(struct distrend_config *config) { + distrend_listen_free(config->listens); options_free(config->options); + free(config->listen_ports); free(config); return 0; } + /* ************************** XML Functions ************************* */ // writes the general_info.xml file which is a copy of the general_info structure @@ -482,7 +496,6 @@ int interactiveTest(int test, struct gen int32_t frameNum = 0; int32_t newPriority = 0; int tmp = 0; - struct distrend_clientset *clients; fprintf(stderr,"Hello!\n"); @@ -557,14 +570,9 @@ int interactiveTest(int test, struct gen break; case 5: - if(distrend_listen(geninfo->config, &clients)) - { - fprintf(stderr, "error listening\n"); - return 1; - } while(1) { - distrend_accept(geninfo->config, clients, (distrend_handle_request_t)&distrend_handle_request, (void *)geninfo); + distrend_accept(geninfo->config->listens); /* code for reading data from clients either goes here or in distrend_accept(). it might make sense for us to just pass the distrend_accept() function a