diff --git a/src/common/protocol.c b/src/common/protocol.c --- a/src/common/protocol.c +++ b/src/common/protocol.c @@ -114,6 +114,58 @@ int distren_request_new_fromdata(struct return 0; } +size_t distren_request_handle(size_t *expectlen, + void *buf, + size_t len, + struct distren_request **req, + void **req_data, + short *err) +{ + size_t dead_expectlen; + + *err = 0; + *req = NULL; + + if(!expectlen) + { + dead_expectlen = 0; + expectlen = &dead_expectlen; + } + + if(!*expectlen) + { + if(len < sizeof(struct distren_request)) + return 0; + + if(distren_request_new_fromdata(req, buf, len)) + { + fprintf(stderr, "Error trying to handle packet\n"); + *err = 1; + return 0; + } + + *expectlen = sizeof(struct distren_request) + (*req)->len; + } + + if(!*expectlen + || len < *expectlen) + { + if(*req) + { + distren_request_free(*req); + *req = NULL; + } + + return 0; + } + + if(!*req) + distren_request_new_fromdata(req, buf, len); + *req_data = buf + sizeof(struct distren_request); + + return sizeof(struct distren_request) + (*req)->len; +} + int distren_request_free(struct distren_request *req) { free(req);