From 1a1901f459a9b330b9e29df5f56828821a8365d5 Mon Sep 17 00:00:00 2001 From: Tobias Ulmer Date: Mon, 18 Feb 2019 18:03:15 +0100 Subject: [PATCH] eio: implement dup() Signed-off-by: Tobias Ulmer --- generic/eio.lua | 16 ++++++++++++++++ generic/leio.c | 19 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/generic/eio.lua b/generic/eio.lua index 676d193..f7178b0 100644 --- a/generic/eio.lua +++ b/generic/eio.lua @@ -407,6 +407,22 @@ function eio.setunbuffered(file) end end +--- Duplicate a file descriptor. See dup(2) for details. +-- @param oldfd File descriptor to duplicate. +-- @return New file descriptor or false on error. +-- @return Error object on failure. +function eio.dup(oldfd) + local rc, errstring + + rc, errstring = leio.dup(oldfd) + if not rc then + return false, + err.new("duplicating file descriptor failed: %s", errstring) + end + return rc +end + + --- Duplicate a file descriptor. See dup(2) for details. -- @param oldfd File descriptor to duplicate. -- @param newfd Duplicated file descritor. If the file descriptor was open diff --git a/generic/leio.c b/generic/leio.c index 6c21e36..a55e4e7 100644 --- a/generic/leio.c +++ b/generic/leio.c @@ -409,6 +409,24 @@ eio_setunbuffered(lua_State *lua) return 1; } +static int +eio_dup(lua_State *lua) +{ + int oldfd, rc; + + oldfd = luaL_checkinteger(lua, 1); + + rc = dup(oldfd); + if (rc < 0) { + lua_pushboolean(lua, 0); + lua_pushstring(lua, strerror(errno)); + return 2; + } + + lua_pushnumber(lua, rc); + return 1; +} + static int eio_dup2(lua_State *lua) { @@ -475,6 +493,7 @@ eio_cloexec(lua_State *lua) static luaL_Reg lib[] = { { "cloexec", eio_cloexec }, { "close", eio_close }, + { "dup", eio_dup }, { "dup2", eio_dup2 }, { "fclose", eio_fclose }, { "fdopen", eio_fdopen }, -- 2.39.5