diff --git a/src/common/request.c b/src/common/request.c --- a/src/common/request.c +++ b/src/common/request.c @@ -30,6 +30,41 @@ int distren_request_free_with_data(struc return distren_request_free(req); } +int distren_request_version(struct distren_request **req, void **data, uint32_t servertype, const char *package_string) +{ + struct distren_request_version *version; + + distren_request_new(req, sizeof(struct distren_request_version), DISTREN_REQUEST_VERSION); + version = malloc(sizeof(struct distren_request_version)); + if(!version || !*req) + { + free(version); + if(*req) + distren_request_free(*req); + return 1; + } + + memset(version, 0, sizeof(struct distren_request_version)); + version->servertype = servertype; + strncpy(version->package_string, package_string, DISTREN_REQUEST_VERSION_PACKAGE_STRING_LEN); + + *data = version; + + return 0; +} + +int distren_request_parse_version(struct distren_request *req, void *data, struct distren_request_version *version) +{ + if(req->len < sizeof(struct distren_request_version)) + return 1; + + memcpy(version, data, sizeof(struct distren_request_version)); + /* there is space for another '\0' */ + version->package_string[DISTREN_REQUEST_VERSION_PACKAGE_STRING_LEN] = '\0'; + + return 0; +} + int distren_request_poing(struct distren_request **req, void **data, short is_ping, const void *poing_cookie, size_t poing_data_len) { enum distren_request_type type;