diff --git a/src/client/libdistren_request.c b/src/client/libdistren_request.c --- a/src/client/libdistren_request.c +++ b/src/client/libdistren_request.c @@ -26,7 +26,7 @@ #include "common/request.h" static void handle_ping(struct remoteio *rem, struct distren_request *req, void *req_data); -static void handle_version(struct remoteio *rem, struct distren_request *req, void *req_data); +static void handle_version(distren_t distren, struct distren_request *req, void *req_data); static void handle_disconnect(distren_t distren, struct remoteio *rem, struct distren_request *req, void *req_data); size_t libdistren_remoteio_read_handle(struct remoteio *rem, void *garbage, void *buf, size_t len, distren_t distren) @@ -73,7 +73,7 @@ size_t libdistren_remoteio_read_handle(s break; case DISTREN_REQUEST_VERSION: - handle_version(rem, req, req_data); + handle_version(distren, req, req_data); break; case DISTREN_REQUEST_DISCONNECT: @@ -118,18 +118,34 @@ static void handle_ping(struct remoteio distren_request_free_with_data(pong_req, pong_req_data); } -static void handle_version(struct remoteio *rem, struct distren_request *req, void *req_data) +static void handle_version(distren_t distren, struct distren_request *req, void *req_data) { - static const char *package_string = PACKAGE_STRING; - - size_t counter; + struct distren_request_version version; + int tmp; - fprintf(stderr, "info: connected to a server running "); - for(counter = 0; counter < req->len; counter ++) - putc(((char *)req_data)[counter], stderr); - putc('\n', stderr); + tmp = distren_request_parse_version(req, req_data, &version); + if(tmp) + { + fprintf(stderr, "error: Invalid DISTREN_REQUEST_VERSION, disconnecting from server\n"); + /* + * our remoteio_close handler sets distren->rem to NULL, thus we + * don't need to return an error code. + */ + remoteio_close(distren->rem); + return; + } + distren->servertype = version.servertype; + distren->state = DISTREN_STATE_AUTH; - /* am I supposed to respond here? ;-) */ + fprintf(stderr, "info: connected to a server running %s\n", version.package_string); + if(version.servertype & DISTREN_SERVERTYPE_CLIENT) + fprintf(stderr, "\tis a client\n"); + if(version.servertype & DISTREN_SERVERTYPE_SUBMIT) + fprintf(stderr, "\taccepts frame submissions\n"); + if(version.servertype & DISTREN_SERVERTYPE_RENDER) + fprintf(stderr, "\trenders frames\n"); + if(version.servertype & DISTREN_SERVERTYPE_DISTRIBUTE) + fprintf(stderr, "\thandles file distribution\n"); } static void handle_disconnect(distren_t distren, struct remoteio *rem, struct distren_request *req, void *req_data)