From ceb1c8680df3cfa175351b4e243a4cad91389b8c Mon Sep 17 00:00:00 2001 From: Tobias Ulmer Date: Tue, 21 Jan 2014 20:02:33 +0100 Subject: [PATCH] eio: add read, write and close, return file descriptor from pipe() Signed-off-by: Tobias Ulmer --- generic/eio.lua | 86 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 70 insertions(+), 16 deletions(-) diff --git a/generic/eio.lua b/generic/eio.lua index 5b8c382..f66a80f 100644 --- a/generic/eio.lua +++ b/generic/eio.lua @@ -139,6 +139,21 @@ function eio.fclose(file) return true end +--- Close a file descriptor. +-- @param fd File descriptor. +-- @return True on success, false on error. +-- @return Error object on failure. +function eio.close(fd) + local rc, errstring + + rc, errstring = leio.close(fd) + if not rc then + return false, err.new("close failed: %s", errstring) + end + + return true +end + --- Read a file. -- @param file File object. -- @param size Positive number specifying how many bytes to read. @@ -169,6 +184,36 @@ function eio.fread(file, size) return buffer end +--- Read from a file descriptor +-- @param fd File descriptor. +-- @param size Number of bytes to read in one go. +-- @return File data as a string, or false on error. May be *up to* 'size' bytes +-- large and contain embedded zero's. On EOF the empty string is returned. +-- @return Error object on failure. +-- @return Errno number on failure. +function eio.read(fd, size) + local data, errstring, errno + + if type(size) ~= "number" then + return false, err.new("eio.read: size argument has wrong type") + end + + if size <= 0 or size > 2147483648 --[[2GB]] then + return false, err("eio.read: size argument out of range") + end + + if type(fd) ~= "number" or fd < 0 then + return false, err.new("eio.read: fd argument has wrong type or range") + end + + data, errstring, errno = leio.read(fd, size) + if not data then + return false, err.new("read error on fd %d: %s", fd, errstring), errno + end + + return data +end + --- Read character from file. -- @param file File object. -- @return Character as a string, string of length 0 on EOF, or false on error. @@ -212,6 +257,27 @@ function eio.fwrite(file, buffer) return true end +--- Write buffer to a file descriptor. +-- @param fd File descriptor. +-- @param buffer Data string to be written. May contain embedded zero's. +-- @return Number of bytes written or false on error. +-- @return Error object on failure. +-- @return Errno number on failure. +function eio.write(fd, buffer) + local rc, errstring, errno + + if type(fd) ~= "number" or fd < 0 then + return false, err.new("eio.read: fd argument has wrong type or range") + end + + rc, errstring, errno = leio.write(fd, buffer) + if not rc then + return false, err.new("write error: %s", errstring), errno + end + + return rc +end + --- Read line from a file. -- @param file File object. -- @return Line of data, potentially including a new-line character at the end @@ -342,28 +408,16 @@ end --- Create a new UNIX pipe(2) between two file objects. --- @return File object in read mode, or false on error. --- @return File object in write mode, or error object on failure. +-- @return File descriptor in read mode, or false on error. +-- @return File descriptor in write mode, or error object on failure. function eio.pipe() - local fd1, fd2, fr, fw, re + local fd1, fd2 fd1, fd2 = leio.pipe() if not fd1 then return false, err.new("failed creating pipe: %s", fd2) end - - fr, re = eio.fdopen(fd1, "r") - if not fr then - return false, re - end - - fw,re = eio.fdopen(fd2, "w") - if not fw then - return false, re - end - eio.setunbuffered(fw) - - return fr, fw + return fd1, fd2 end -- 2.39.5