Tuesday 29 June 2021

How can I set the file descriptors for a new Process in Haxe to use it with a socket?

I am translating some code to Haxe from Python so that I can target more platforms. But I'm having trouble with the following snippet.

import socket
from subprocess import Popen

host='127.0.0.1'
port=8080
file='handle.sh'

handler = socket.socket()
handler.bind((host, port))
handler.listen(5)


conn, address = handler.accept() # Wait for something to connect to the socket
proc = Popen(['bash', file], stdout=conn.makefile('wb'), stdin=conn.makefile('rb'))
proc.wait()
conn.shutdown(socket.SHUT_RDWR)
conn.close()

In Python, I can set stdin and stdout to the relevant file descriptors of the socket. But by the time I call shutdown, all the data to be sent is in the right buffer and nothing blocks me.

But I can't do this in Haxe as far as I can tell because input and output from the socket and, stdin and stdout from the process are all read-only.

I seem to get a deadlock with whatever I try. Currently I'm trying with a thread but it still gets stuck at reading from the socket.

#!/usr/bin/haxe --interp
import sys.net.Host;
import sys.net.Socket;
import sys.io.Process;
import sys.thread.Thread;

class HaxeServer {
    static function main() {
        var socket = new Socket();

        var fname = 'handle.sh';
        var host = '127.0.0.1';
        var port = 8080;

        socket.bind(new Host(host), port);
        socket.listen(5);
        while (true) {
            var conn = socket.accept();
            var proc = new Process('bash', [fname]);
            exchange(conn, proc);
            conn.output.write(proc.stdout.readAll());
            proc.close();
            conn.shutdown(true, true);
            conn.close();
        }
    }
    static function exchange(conn:Socket, proc:Process):Void {
        #if (target.threaded)
        Thread.create(() -> {
            while (true) {
                var drip = conn.input.readByte();
                proc.stdin.writeByte(drip);
            }
        });
        #end
    }
}


from How can I set the file descriptors for a new Process in Haxe to use it with a socket?

No comments:

Post a Comment