diff options
Diffstat (limited to 'lem/io/stream.c')
-rw-r--r-- | lem/io/stream.c | 60 |
1 files changed, 0 insertions, 60 deletions
diff --git a/lem/io/stream.c b/lem/io/stream.c index 204df81..0056233 100644 --- a/lem/io/stream.c +++ b/lem/io/stream.c @@ -530,63 +530,3 @@ stream_sendfile(lua_State *T) lua_settop(T, 2); return lua_yield(T, 2); } - -static int -stream_popen(lua_State *T) -{ - const char *cmd = luaL_checkstring(T, 1); - const char *mode = luaL_optstring(T, 2, "r"); - int fd[2]; - int err; - - if (mode[0] != 'r' && mode[0] != 'w') - return luaL_error(T, "invalid mode string"); - - if (pipe(fd)) - return io_strerror(T, errno); - - switch (fork()) { - case -1: /* error */ - err = errno; - close(fd[0]); - close(fd[1]); - return io_strerror(T, err); - - case 0: /* child */ - if (mode[0] == 'r') { - close(fd[0]); - dup2(fd[1], 1); - } else { - close(fd[1]); - dup2(fd[0], 0); - } - - execl("/bin/sh", "/bin/sh", "-c", cmd, NULL); - exit(EXIT_FAILURE); - } - - if (mode[0] == 'r') { - if (close(fd[1])) { - err = errno; - close(fd[0]); - return io_strerror(T, err); - } - } else { - if (close(fd[0])) { - err = errno; - close(fd[1]); - return io_strerror(T, err); - } - fd[0] = fd[1]; - } - - /* make the pipe non-blocking */ - if (fcntl(fd[0], F_SETFL, O_NONBLOCK) == -1) { - err = errno; - close(fd[0]); - return io_strerror(T, err); - } - - stream_new(T, fd[0], lua_upvalueindex(1)); - return 1; -} |