X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fnixio%2Flua%2Fnixio%2Futil.lua;fp=libs%2Fnixio%2Flua%2Fnixio%2Futil.lua;h=6f929519b73057c06b2a9d9def4bc6adbe585d81;hp=2c9fc93a3eef98bff3c44acdbe7f4a25a47b8f07;hb=8c4f847ea5b95aaf0e716beaf736b4e2b67655ae;hpb=0ad58e38b42dca2f46bc492b7f889b5031a9c6a1 diff --git a/libs/nixio/lua/nixio/util.lua b/libs/nixio/lua/nixio/util.lua index 2c9fc93a3..6f929519b 100644 --- a/libs/nixio/lua/nixio/util.lua +++ b/libs/nixio/lua/nixio/util.lua @@ -14,7 +14,7 @@ $Id$ local table = require "table" local nixio = require "nixio" -local getmetatable, assert, pairs = getmetatable, assert, pairs +local getmetatable, assert, pairs, type = getmetatable, assert, pairs, type module "nixio.util" @@ -106,7 +106,7 @@ function meta.linesource(self, limit) if flush then line = buffer:sub(bpos + 1) - buffer = "" + buffer = type(flush) == "string" and flush or "" bpos = 0 return line end @@ -189,8 +189,11 @@ end function meta.copyz(self, fd, size) local sent, lsent, code, msg = 0 + local splicable + if self:is_file() then - if nixio.sendfile and fd:is_socket() and self:stat("type") == "reg" then + local ftype = self:stat("type") + if nixio.sendfile and fd:is_socket() and ftype == "reg" then repeat lsent, code, msg = nixio.sendfile(fd, self, size or ZIOBLKSIZE) if lsent then @@ -202,7 +205,27 @@ function meta.copyz(self, fd, size) code ~= nixio.const.ENOSYS and code ~= nixio.const.EINVAL) then return lsent and sent, code, msg, sent end - end + elseif nixio.splice and not fd:is_tls_socket() and ftype == "fifo" then + splicable = true + end + end + + if nixio.splice and fd:is_file() and not splicable then + splicable = not self:is_tls_socket() and fd:stat("type") == "fifo" + end + + if splicable then + repeat + lsent, code, msg = nixio.splice(self, fd, size or ZIOBLKSIZE) + if lsent then + sent = sent + lsent + size = size and (size - lsent) + end + until (not lsent or lsent == 0 or (size and size == 0)) + if lsent or (not lsent and sent == 0 and + code ~= nixio.const.ENOSYS and code ~= nixio.const.EINVAL) then + return lsent and sent, code, msg, sent + end end return self:copy(fd, size) @@ -212,6 +235,24 @@ function tls_socket.close(self) return self.socket:close() end +function tls_socket.getsockname(self) + return self.socket:getsockname() +end + +function tls_socket.getpeername(self) + return self.socket:getpeername() +end + +function tls_socket.getsockopt(self, ...) + return self.socket:getsockopt(...) +end +tls_socket.getopt = tls_socket.getsockopt + +function tls_socket.setsockopt(self, ...) + return self.socket:setsockopt(...) +end +tls_socket.setopt = tls_socket.setsockopt + for k, v in pairs(meta) do file[k] = v socket[k] = v