diff --git a/eval-server.sld b/eval-server.sld index 6c46218..ec6fed0 100644 --- a/eval-server.sld +++ b/eval-server.sld @@ -30,6 +30,18 @@ (proc entry) (loop))))) + (define (parse-null-terminated-strings bytes) + (let loop ((a 0) (b 0) (strings '())) + (if (= b (bytevector-length bytes)) + (if (= a b) + (reverse strings) + (error "Missing final null terminator")) + (if (zero? (bytevector-u8-ref bytes b)) + (loop (+ b 1) (+ b 1) (cons (utf8->string + (bytevector-copy bytes a b)) + strings)) + (loop a (+ b 1) strings))))) + (define (handle-the-scheme-implementation impl) (let ((cmdline #f) (environ #f) @@ -46,11 +58,11 @@ (equal? "proc/self/fd/" name)) #f) ((equal? "proc/self/cmdline" name) - (set! cmdline bytes)) + (set! cmdline (parse-null-terminated-strings bytes))) ((equal? "proc/self/environ" name) - (set! stdin bytes)) + (set! stdin (parse-null-terminated-strings bytes))) ((equal? "proc/self/cwd" name) - (set! stdin bytes)) + (set! stdin (utf8->string bytes))) ((equal? "proc/self/fd/0" name) (set! stdin bytes)) ((string-prefix? "proc/self/fd/" name)