]> git.e2factory.org Git - e2factory.git/commitdiff
eio: implement dup()
authorTobias Ulmer <tu@emlix.com>
Mon, 18 Feb 2019 17:03:15 +0000 (18:03 +0100)
committerTobias Ulmer <tu@emlix.com>
Mon, 18 Feb 2019 17:03:15 +0000 (18:03 +0100)
Signed-off-by: Tobias Ulmer <tu@emlix.com>
generic/eio.lua
generic/leio.c

index 676d193f12b7f6fe9e5fc16613d6fcd7bfee80a0..f7178b08eba477858b3fedd89339226f1190af9f 100644 (file)
@@ -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
index 6c21e367ee2192a3b3ec37379079520a38a3a00d..a55e4e731e8143490cfc64f100c614053e4d8700 100644 (file)
@@ -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 },