Fix pipes in Linux with socat

This commit is contained in:
Empathic Qubit 2021-05-04 20:30:52 -04:00
parent a5b089520b
commit 123d7508d1
4 changed files with 45 additions and 35 deletions

View file

@ -7,7 +7,7 @@ See [YouTube](https://www.youtube.com/watch?v=Q69_wmEkp-k) for an example run.
## Requirements
* lsnes with **Lua 5.2** (do not try to build with 5.3, it does not work!)
* inotifywait for Linux, or a fairly recent version of Windows that has PowerShell
* socat for Linux, or a fairly recent version of Windows that has PowerShell
* A Donkey Kong Country 2 1.1 US ROM (matching hash b79c2bb86f6fc76e1fc61c62fc16d51c664c381e58bc2933be643bbc4d8b610c)
### Windows

View file

@ -22,7 +22,7 @@ local speciesId = -1
local generationIndex = nil
local inputPipeName = os.getenv("RUNNER_INPUT_PIPE")
local outputFilePath = os.getenv("RUNNER_OUTPUT_FILE")
local outputPipeName = os.getenv("RUNNER_OUTPUT_PIPE")
print('Opening input pipe '..inputPipeName)
local inputPipe = util.openReadPipe(inputPipeName)
@ -31,16 +31,13 @@ if inputPipe == nil then
end
print('Opened input pipe '..inputPipeName)
print('Opening output file '..outputFilePath)
local outputFile = nil
while outputFile == nil do
outputFile = io.open(outputFilePath, 'w')
end
print('Opened output file '..outputFilePath)
print('Opening output file '..outputPipeName)
local outputPipe = util.openReadPipeWriter(outputPipeName)
print('Opened output file '..outputPipeName)
local function writeResponse(object)
outputFile:write(serpent.dump(object).."\n")
outputFile:flush()
outputPipe:write(serpent.dump(object).."\n")
outputPipe:flush()
end
local runner = Runner(Promise)

View file

@ -7,21 +7,6 @@ local Promise = nil
local util = nil
local config = dofile(base.."/config.lua")
local serpent = dofile(base.."/serpent.lua")
local temps = {
os.getenv("TMPDIR"),
os.getenv("TEMP"),
os.getenv("TEMPDIR"),
os.getenv("TMP"),
}
local tempDir = "/tmp"
for i=1,#temps,1 do
local temp = temps[i]
if temp ~= nil and temp ~= "" then
tempDir = temps[i]
break
end
end
local pipePrefix = "donk_runner_"..
string.hex(math.floor(random.integer(0, 0xffffffff)))..
@ -77,23 +62,18 @@ local function launchChildren(_M, count)
input = nil,
}
local outputFileName = outputPrefix..i
local outputPipeName = outputPrefix..i
local inputPipeName = inputPrefix..i
local inputFileName = inputPrefix..i
if util.isWin then
outputFileName = '\\\\.\\pipe\\'..outputFileName
inputFileName = '\\\\.\\pipe\\'..inputPipeName
end
local settingsDir = nil
if util.isWin then
settingsDir = tempDir.."/donk_runner_settings_"..i
settingsDir = util.getTempDir().."/donk_runner_settings_"..i
util.mkdir(settingsDir)
end
local envs = {
RUNNER_INPUT_PIPE = inputPipeName,
RUNNER_OUTPUT_FILE = outputFileName,
RUNNER_OUTPUT_PIPE = outputPipeName,
APPDATA = settingsDir,
}
@ -104,7 +84,7 @@ local function launchChildren(_M, count)
local promise = util.promiseWrap(function()
newOne.output:read("*l")
while newOne.input == nil do
newOne.input = io.open(inputFileName, 'w')
newOne.input = util.openReadPipeWriter(inputPipeName)
end
end)
table.insert(promises, promise)

View file

@ -14,6 +14,26 @@ function _M.promiseWrap(next)
return promise:next(next)
end
function _M.getTempDir()
local temps = {
os.getenv("TMPDIR"),
os.getenv("TEMP"),
os.getenv("TEMPDIR"),
os.getenv("TMP"),
}
local tempDir = "/tmp"
for i=1,#temps,1 do
local temp = temps[i]
if temp ~= nil and temp ~= "" then
tempDir = temps[i]
break
end
end
return tempDir
end
--- Echo a command, run it, and return the file handle
--- @param cmd string The command to execute
--- @param workdir string The working directory
@ -60,10 +80,23 @@ function _M.openReadPipe(name)
print(cmd)
return io.popen(cmd, 'r')
else
error('Not implemented')
return io.popen("socat 'UNIX-LISTEN:".._M.getTempDir().."/"..name.."' -", 'r')
end
end
function _M.openReadPipeWriter(name)
local writer = nil
while writer == nil do
if _M.isWin then
writer = io.open('\\\\.\\pipe\\'..name, 'w')
else
writer = io.popen("socat 'UNIX-CONNECT:".._M.getTempDir().."/"..name.."' -", 'w')
end
end
return writer
end
--- Download a url
--- @param url string URI of resource to download
--- @param dest string File to save resource to