Skip to content

Instantly share code, notes, and snippets.

@jplitza
Created December 20, 2015 23:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jplitza/6deda1a1e19ddf3ebbf8 to your computer and use it in GitHub Desktop.
Save jplitza/6deda1a1e19ddf3ebbf8 to your computer and use it in GitHub Desktop.
local function timeout_popen(timeout, ...)
local outerpiper, outerpipew = nixio.pipe()
if nixio.fork() == 0 then
outerpiper:close()
local innerpiper, innerpipew = nixio.pipe()
local pid = nixio.fork()
if pid == 0 then
outerpipew:close()
innerpiper:close()
nixio.dup(innerpipew, nixio.stdout)
innerpipew:close()
local ret, errno, errstr = nixio.exec(...)
local cmd = ...
io.stderr:write("exec(\"" .. table.concat({...}, "\", \"") .. "\"): " .. errstr .. " (" .. errno .. ")\n")
os.exit(1)
end
innerpipew:close()
local endtime = os.time() + timeout
while true do
local fdnum, fds = nixio.poll({{fd = innerpiper, events = nixio.poll_flags("in")}}, os.difftime(endtime, os.time())*1000)
if fdnum == false then
if os.difftime(endtime, os.time()) <= 0 then
nixio.kill(pid, 15)
break
end
else
if nixio.poll_flags(fds[1].revents)["in"] then
nixio.splice(innerpiper, outerpipew, 4096, nixio.splice_flags("nonblock"))
else
if nixio.waitpid(pid, "nohang") == pid then
-- child exited
break
end
end
end
end
innerpiper:close()
outerpipew:close()
os.exit()
end
outerpipew:close()
return outerpiper
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment