diff --git a/src/server/distrend.c b/src/server/distrend.c --- a/src/server/distrend.c +++ b/src/server/distrend.c @@ -89,6 +89,7 @@ int distrend_handle_request(struct distr client request handlers */ int distrend_handle_version(struct general_info *geninfo, struct distrend_client *client, size_t req_len, void *req_data); +int distrend_handle_ping(struct general_info *geninfo, struct distrend_client *client, size_t req_len, void *req_data); /* **************XML Functions**************** */ void update_general_info(struct general_info *geninfo); @@ -175,6 +176,7 @@ int main(int argc, char *argv[]) } distrend_listen_handler_add(general_info.config->listens, DISTREN_REQUEST_VERSION, &distrend_handle_version); + distrend_listen_handler_add(general_info.config->listens, DISTREN_REQUEST_PING, &distrend_handle_ping); int slaveKey = 0; // Remotio should set me on a per-slave basis /* Main Loop */ @@ -270,6 +272,24 @@ int distrend_handle_version(struct gener return 0; } +int distrend_handle_ping(struct general_info *geninfo, struct distrend_client *client, size_t req_len, void *req_data) +{ + struct distren_request *pong_req; + + if(req_len > 32) + distrend_send_disconnect(geninfo->config->listens, client, "You have tried to send a PING packet with a length longer than 32 bytes."); + + /** + respond to the client using the data he sent in his PONG + command. + */ + distren_request_new(&pong_req, req_len, DISTREN_REQUEST_PONG); + distrend_client_write_request(geninfo->config->listens, client, pong_req, req_data); + distren_request_free(pong_req); + + return 0; +} + /** Performs command stored in a client's request. @TODO: Fill stub */ diff --git a/src/server/listen.c b/src/server/listen.c --- a/src/server/listen.c +++ b/src/server/listen.c @@ -284,6 +284,7 @@ int distrend_handleread(struct distrend_ client->expectlen = 0; distrend_dispatch_request(listens, client, req, reqdata); + free(reqdata); distren_request_free(req); } return 0;