diff options
author | Steven Barth <steven@midlink.org> | 2009-02-14 10:42:48 +0000 |
---|---|---|
committer | Steven Barth <steven@midlink.org> | 2009-02-14 10:42:48 +0000 |
commit | aa0cee169fd72fd3c76495e89561598ab723de3c (patch) | |
tree | db8f90eff56639fe514541ad03fc8ba01233f017 /libs/nixio/src/splice.c | |
parent | 5ff898e6248b668430f5f2e7d70de243f191eb04 (diff) |
nixio: added sendfile(), return false instead of nil for EWOULDBLOCK
Diffstat (limited to 'libs/nixio/src/splice.c')
-rw-r--r-- | libs/nixio/src/splice.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/libs/nixio/src/splice.c b/libs/nixio/src/splice.c index 37849751a..2b2837060 100644 --- a/libs/nixio/src/splice.c +++ b/libs/nixio/src/splice.c @@ -20,6 +20,7 @@ #include "nixio.h" #include <fcntl.h> +#include <sys/sendfile.h> /* guess what sucks... */ #ifdef __UCLIBC__ @@ -29,8 +30,7 @@ ssize_t splice(int __fdin, __off64_t *__offin, int __fdout, __off64_t *__offout, size_t __len, unsigned int __flags) { return syscall(__NR_splice, __fdin, __offin, __fdout, __offout, __len, __flags); } -#endif - +#endif /* __UCLIBC__ */ /** * Checks whether a flag is set in the table and translates it into a bitmap @@ -60,6 +60,9 @@ static int nixio_splice_flags(lua_State *L) { return 1; } +/** + * splice(fd_in, fd_out, length, flags) + */ static int nixio_splice(lua_State *L) { int fd_in = nixio__checkfd(L, 1); int fd_out = nixio__checkfd(L, 2); @@ -77,12 +80,29 @@ static int nixio_splice(lua_State *L) { return 1; } +/** + * sendfile(outfd, infd, length) + */ +static int nixio_sendfile(lua_State *L) { + int sockfd = nixio__checksockfd(L); + int infd = nixio__checkfd(L, 2); + size_t len = luaL_checkinteger(L, 3); + + long spliced = sendfile(sockfd, infd, NULL, len); + if (spliced < 0) { + return nixio__perror(L); + } + + lua_pushnumber(L, spliced); + return 1; +} /* module table */ static const luaL_reg R[] = { {"splice", nixio_splice}, {"splice_flags", nixio_splice_flags}, + {"sendfile", nixio_sendfile}, {NULL, NULL} }; |