factor/extra/io/unix/launcher/launcher.factor

90 lines
2.3 KiB
Factor
Raw Normal View History

2007-11-12 23:18:42 -05:00
! Copyright (C) 2007 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
2007-09-20 18:09:08 -04:00
USING: io io.launcher io.unix.backend io.nonblocking
sequences kernel namespaces math system alien.c-types
2007-11-12 23:18:42 -05:00
debugger continuations arrays assocs combinators ;
IN: io.unix.launcher
2007-09-20 18:09:08 -04:00
! Search unix first
USE: unix
2007-11-09 03:18:37 -05:00
: with-fork ( child parent -- pid )
2007-09-20 18:09:08 -04:00
fork [ zero? -rot if ] keep ; inline
2007-11-12 23:18:42 -05:00
: get-arguments ( -- seq )
+command+ get
[ "/bin/sh" "-c" rot 3array ] [ +arguments+ get ] if* ;
: >null-term-array f add >c-void*-array ;
: prepare-execvp ( -- cmd args )
2007-09-20 18:09:08 -04:00
#! Doesn't free any memory, so we only call this word
#! after forking.
2007-11-12 23:18:42 -05:00
get-arguments
2007-09-20 18:09:08 -04:00
[ malloc-char-string ] map
2007-11-12 23:18:42 -05:00
dup first swap >null-term-array ;
2007-09-20 18:09:08 -04:00
2007-11-12 23:18:42 -05:00
: prepare-execve ( -- cmd args env )
#! Doesn't free any memory, so we only call this word
#! after forking.
prepare-execvp
get-environment
[ "=" swap 3append malloc-char-string ] { } assoc>map
>null-term-array ;
: (spawn-process) ( -- )
[
pass-environment? [
2007-11-12 23:18:42 -05:00
prepare-execve execve
] [
prepare-execvp execvp
] if io-error
] [ error. :c flush ] recover 1 exit ;
2007-09-20 18:09:08 -04:00
: wait-for-process ( pid -- )
0 <int> 0 waitpid drop ;
2007-11-12 23:18:42 -05:00
: spawn-process ( -- pid )
[ (spawn-process) ] [ ] with-fork ;
2007-09-20 18:09:08 -04:00
2007-11-12 23:18:42 -05:00
: spawn-detached ( -- )
[ spawn-process 0 exit ] [ ] with-fork wait-for-process ;
2007-09-20 18:09:08 -04:00
2007-11-12 23:18:42 -05:00
M: unix-io run-process* ( desc -- )
[
+detached+ get [
spawn-detached
] [
spawn-process wait-for-process
] if
] with-descriptor ;
2007-09-20 18:09:08 -04:00
: open-pipe ( -- pair )
2 "int" <c-array> dup pipe zero?
[ 2 c-int-array> ] [ drop f ] if ;
: setup-stdio-pipe ( stdin stdout -- )
2dup first close second close
>r first 0 dup2 drop r> second 1 dup2 drop ;
2007-11-12 23:18:42 -05:00
: spawn-process-stream ( -- in out pid )
2007-09-20 18:09:08 -04:00
open-pipe open-pipe [
setup-stdio-pipe
(spawn-process)
] [
2dup second close first close
] with-fork >r first swap second r> ;
TUPLE: pipe-stream pid ;
: <pipe-stream> ( in out pid -- stream )
pipe-stream construct-boa
-rot handle>duplex-stream over set-delegate ;
M: pipe-stream stream-close
dup delegate stream-close
pipe-stream-pid wait-for-process ;
2007-11-12 23:18:42 -05:00
M: unix-io process-stream*
[ spawn-process-stream <pipe-stream> ] with-descriptor ;