X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=libs%2Fnixio%2Fsrc%2Fsplice.c;h=c7aa817af7c7abaed92713c9084b742e513a4147;hb=04eb9de74e06b8532fcb54986442ef8a5497c0ec;hp=0519f719aaa3abc1d40cd5286d9bc7ddcc5c3e36;hpb=35f40376c36805c4a023015d4cf95f1fa8adcb04;p=project%2Fluci.git diff --git a/libs/nixio/src/splice.c b/libs/nixio/src/splice.c index 0519f719a..c7aa817af 100644 --- a/libs/nixio/src/splice.c +++ b/libs/nixio/src/splice.c @@ -25,7 +25,14 @@ #include #include #include + +#ifndef BSD #include +#else +#include +#include +#include +#endif #ifdef _GNU_SOURCE @@ -102,15 +109,31 @@ static int nixio_splice_flags(lua_State *L) { * sendfile(outfd, infd, length) */ static int nixio_sendfile(lua_State *L) { - int sockfd = nixio__checksockfd(L); + int sock = nixio__checksockfd(L); int infd = nixio__checkfd(L, 2); size_t len = luaL_checkinteger(L, 3); + off_t spliced; - long spliced = sendfile(sockfd, infd, NULL, len); +#ifndef BSD + do { + spliced = sendfile(sock, infd, NULL, len); + } while (spliced == -1 && errno == EINTR); - if (spliced < 0) { + if (spliced == -1) { return nixio__perror(L); } +#else + int r; + const off_t offset = lseek(infd, 0, SEEK_CUR); + + do { + r = sendfile(infd, sock, offset, len, NULL, &spliced, 0); + } while (r == -1 && errno == EINTR); + + if (r == -1) { + return nixio__perror(L); + } +#endif lua_pushnumber(L, spliced); return 1;