Updating windows launcher for new-slots

db4
Slava Pestov 2008-03-06 20:45:56 -06:00
parent 62568770a9
commit c9c7548ffd
1 changed files with 43 additions and 47 deletions

View File

@ -5,7 +5,7 @@ io.windows io.windows.nt.pipes libc io.nonblocking
io.streams.duplex windows.types math windows.kernel32 windows io.streams.duplex windows.types math windows.kernel32 windows
namespaces io.launcher kernel sequences windows.errors assocs namespaces io.launcher kernel sequences windows.errors assocs
splitting system threads init strings combinators splitting system threads init strings combinators
io.backend ; io.backend new-slots accessors ;
IN: io.windows.launcher IN: io.windows.launcher
TUPLE: CreateProcess-args TUPLE: CreateProcess-args
@ -22,30 +22,25 @@ TUPLE: CreateProcess-args
stdout-pipe stdin-pipe ; stdout-pipe stdin-pipe ;
: default-CreateProcess-args ( -- obj ) : default-CreateProcess-args ( -- obj )
0 CreateProcess-args construct-empty
0 >>dwCreateFlags
"STARTUPINFO" <c-object> "STARTUPINFO" <c-object>
"STARTUPINFO" heap-size over set-STARTUPINFO-cb "STARTUPINFO" heap-size over set-STARTUPINFO-cb >>lpStartupInfo
"PROCESS_INFORMATION" <c-object> "PROCESS_INFORMATION" <c-object> >>lpProcessInformation
TRUE TRUE >>bInheritHandles ;
{
set-CreateProcess-args-dwCreateFlags
set-CreateProcess-args-lpStartupInfo
set-CreateProcess-args-lpProcessInformation
set-CreateProcess-args-bInheritHandles
} \ CreateProcess-args construct ;
: call-CreateProcess ( CreateProcess-args -- ) : call-CreateProcess ( CreateProcess-args -- )
{ {
CreateProcess-args-lpApplicationName lpApplicationName>>
CreateProcess-args-lpCommandLine lpCommandLine>>
CreateProcess-args-lpProcessAttributes lpProcessAttributes>>
CreateProcess-args-lpThreadAttributes lpThreadAttributes>>
CreateProcess-args-bInheritHandles bInheritHandles>>
CreateProcess-args-dwCreateFlags dwCreateFlags>>
CreateProcess-args-lpEnvironment lpEnvironment>>
CreateProcess-args-lpCurrentDirectory lpCurrentDirectory>>
CreateProcess-args-lpStartupInfo lpStartupInfo>>
CreateProcess-args-lpProcessInformation lpProcessInformation>>
} get-slots CreateProcess win32-error=0/f ; } get-slots CreateProcess win32-error=0/f ;
: escape-argument ( str -- newstr ) : escape-argument ( str -- newstr )
@ -54,54 +49,55 @@ TUPLE: CreateProcess-args
: join-arguments ( args -- cmd-line ) : join-arguments ( args -- cmd-line )
[ escape-argument ] map " " join ; [ escape-argument ] map " " join ;
: app-name/cmd-line ( -- app-name cmd-line ) : app-name/cmd-line ( process -- app-name cmd-line )
+command+ get [ command>> dup string? [
" " split1 " " split1
] [ ] [
+arguments+ get unclip swap join-arguments unclip swap join-arguments
] if* ; ] if ;
: cmd-line ( -- cmd-line ) : cmd-line ( process -- cmd-line )
+command+ get [ +arguments+ get join-arguments ] unless* ; command>> dup string? [ join-arguments ] unless ;
: fill-lpApplicationName : fill-lpApplicationName ( process args -- process args )
app-name/cmd-line over app-name/cmd-line
pick set-CreateProcess-args-lpCommandLine >r >>lpApplicationName
over set-CreateProcess-args-lpApplicationName ; r> >>lpCommandLine ;
: fill-lpCommandLine : fill-lpCommandLine ( process args -- process args )
cmd-line over set-CreateProcess-args-lpCommandLine ; over cmd-line >>lpCommandLine ;
: fill-dwCreateFlags : fill-dwCreateFlags ( process args -- process args )
0 0
pass-environment? [ CREATE_UNICODE_ENVIRONMENT bitor ] when over pass-environment? [ CREATE_UNICODE_ENVIRONMENT bitor ] when
+detached+ get winnt? and [ DETACHED_PROCESS bitor ] when over detached>> winnt? and [ DETACHED_PROCESS bitor ] when
over set-CreateProcess-args-dwCreateFlags ; >>dwCreateFlags ;
: fill-lpEnvironment : fill-lpEnvironment ( process args -- process args )
pass-environment? [ over pass-environment? [
[ [
get-environment over get-environment
[ "=" swap 3append string>u16-alien % ] assoc-each [ "=" swap 3append string>u16-alien % ] assoc-each
"\0" % "\0" %
] { } make >c-ushort-array ] { } make >c-ushort-array
over set-CreateProcess-args-lpEnvironment >>lpEnvironment
] when ; ] when ;
: fill-startup-info : fill-startup-info ( process args -- process args )
dup CreateProcess-args-lpStartupInfo dup lpStartupInfo>>
STARTF_USESTDHANDLES swap set-STARTUPINFO-dwFlags ; STARTF_USESTDHANDLES swap set-STARTUPINFO-dwFlags ;
HOOK: fill-redirection io-backend ( args -- args ) HOOK: fill-redirection io-backend ( process args -- process args )
M: windows-ce-io fill-redirection ; M: windows-ce-io fill-redirection ;
: make-CreateProcess-args ( -- args ) : make-CreateProcess-args ( process -- args )
default-CreateProcess-args default-CreateProcess-args
wince? [ fill-lpApplicationName ] [ fill-lpCommandLine ] if wince? [ fill-lpApplicationName ] [ fill-lpCommandLine ] if
fill-dwCreateFlags fill-dwCreateFlags
fill-lpEnvironment fill-lpEnvironment
fill-startup-info ; fill-startup-info
nip ;
M: windows-io current-process-handle ( -- handle ) M: windows-io current-process-handle ( -- handle )
GetCurrentProcessId ; GetCurrentProcessId ;
@ -112,7 +108,7 @@ M: windows-io run-process* ( desc -- handle )
make-CreateProcess-args make-CreateProcess-args
fill-redirection fill-redirection
dup call-CreateProcess dup call-CreateProcess
CreateProcess-args-lpProcessInformation <process> CreateProcess-args-lpProcessInformation
] with-descriptor ] with-descriptor
] with-destructors ; ] with-destructors ;