From c3bfd97890acf046cbc2e7090f7fd7d65be89f9b Mon Sep 17 00:00:00 2001 From: Tobias Ulmer Date: Wed, 15 Jan 2014 19:29:34 +0100 Subject: [PATCH] Add eio.setunbuffered() Signed-off-by: Tobias Ulmer --- generic/eio.lua | 18 ++++++++++++++++++ generic/leio.c | 19 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/generic/eio.lua b/generic/eio.lua index 46545b5..9e4f6e3 100644 --- a/generic/eio.lua +++ b/generic/eio.lua @@ -304,6 +304,24 @@ function eio.setlinebuf(file) end end +--- Turn line and block buffering off. See setbuf(3) for details. setunbuffered +-- has no error conditions. If an invalid file object is passed, it calls +-- e2lib.abort() terminating the process. +-- @param file File object +function eio.setunbuffered(file) + local errstring, rc, re + + rc, re = is_eio_object(file) + if not rc then + e2lib.abort(re) + end + + rc, errstring = leio.setunbuffered(file.handle) + if not rc then + e2lib.abort(err.new("%s", errstring)) + end +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 e44cbe5..d6d7101 100644 --- a/generic/leio.c +++ b/generic/leio.c @@ -297,6 +297,24 @@ eio_setlinebuf(lua_State *lua) return 1; } +static int +eio_setunbuffered(lua_State *lua) +{ + FILE *f; + + f = lua_touserdata(lua, 1); + if (!f) { + lua_pushboolean(lua, 0); + lua_pushstring(lua, "eio_setunbuffered: one or more arguments " + "of wrong type/missing"); + return 2; + } + + setbuf(f, NULL); + lua_pushboolean(lua, 1); + return 1; +} + static int eio_dup2(lua_State *lua) { @@ -373,6 +391,7 @@ static luaL_Reg lib[] = { { "fwrite", eio_fwrite }, { "pipe", eio_pipe }, { "setlinebuf", eio_setlinebuf }, + { "setunbuffered", eio_setunbuffered }, { NULL, NULL } }; -- 2.39.5