From 9b30e4623312fc27f6d94bc58ca7b71a9302b6dc Mon Sep 17 00:00:00 2001 From: Filippos Giannakos Date: Thu, 8 Aug 2013 12:15:59 +0300 Subject: [PATCH] filed: Respect req->size for copy requests --- xseg/peers/user/filed.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/xseg/peers/user/filed.c b/xseg/peers/user/filed.c index a38c28b..5e35839 100644 --- a/xseg/peers/user/filed.c +++ b/xseg/peers/user/filed.c @@ -75,6 +75,8 @@ #define WRITE 1 #define READ 2 +#define min(_a, _b) (_a < _b ? _a : _b) + /* * Globals, holding command-line arguments */ @@ -648,6 +650,7 @@ static void handle_copy(struct peerd *peer, struct peer_req *pr) char *buf = malloc(MAX_PATH_SIZE + MAX_FILENAME_SIZE); int src = -1, dst = -1, r = -1; ssize_t c = 0, bytes; + ssize_t limit = 0; XSEGLOG2(&lc, I, "Handle copy started for pr: %p, req: %p", pr, pr->req); if (!buf){ @@ -690,8 +693,10 @@ static void handle_copy(struct peerd *peer, struct peer_req *pr) } c = 0; - while (c < st.st_size) { - bytes = sendfile(dst, src, NULL, st.st_size - c); + + limit = min(req->size, st.st_size); + while (c < limit) { + bytes = sendfile(dst, src, NULL, limit - c); if (bytes < 0) { XSEGLOG2(&lc, E, "Copy failed for %s", buf); r = -1; @@ -703,6 +708,9 @@ static void handle_copy(struct peerd *peer, struct peer_req *pr) out: req->serviced = c; + if (limit && c == limit) + req->serviced = req->size; + if (src > 0) close(src); free(buf); -- 1.7.10.4