1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2004-2008 Jean Privat <jean@pryen.org>
4 # Copyright 2008 Floréal Morandat <morandat@lirmm.fr>
6 # This file is free software, which comes along with NIT. This software is
7 # distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8 # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
9 # PARTICULAR PURPOSE. You can modify it is you want, provided this header
10 # is kept unaltered, and a notification of the changes is added.
11 # You are allowed to redistribute it and sell it, alone or is a part of
14 # Invocation and management of operating system sub-processes.
15 # Standard input and output can be handled through streams.
22 # The pid of the process
23 fun id
: Int do return data
.id
25 # Is the process finished?
26 fun is_finished
: Bool do return data
.is_finished
28 # Wait the termination of the process
35 # The status once finished
43 # Is a filepath, or a executable found in PATH
46 # The arguments of the command
47 # Starts with the first real arguments---ie. does not include the progname (`argv[0]`, in C)
48 var arguments
: nullable Array[String]
50 # Launch a command with some arguments
51 init(command
: String, arguments
: String...) is old_style_init
do
52 self.command
= command
53 self.arguments
= arguments
57 # Launch a simple command with arguments passed as an array
58 init from_a
(command
: String, arguments
: nullable Array[String])
60 self.command
= command
61 self.arguments
= arguments
65 # flags used internally to know whith pipe to open
66 private fun pipeflags
: Int do return 0
68 # Internal code to handle execution
71 # The pass the arguments as a big C string where elements are separated with '\0'
72 var args
= new FlatBuffer
73 var l
= 1 # Number of elements in args
75 if arguments
!= null then
83 data
= basic_exec_execute
(command
.to_cstring
, args
.to_s
.to_cstring
, l
, pipeflags
)
86 private var data
: NativeProcess
87 private fun basic_exec_execute
(p
: NativeString, av
: NativeString, ac
: Int, pf
: Int): NativeProcess is extern "exec_Process_Process_basic_exec_execute_4"
90 # `Process` on which the `stdout` is readable like a `Reader`
95 # File Descriptor used for the input.
96 var stream_in
: FileReader is noinit
98 redef fun close
do stream_in
.close
100 redef fun read_char
do return stream_in
.read_char
102 redef fun read_byte
do return stream_in
.read_byte
104 redef fun eof
do return stream_in
.eof
106 redef fun pipeflags
do return 2
111 stream_in
= new FileReader.from_fd
(data
.out_fd
)
115 # `Process` on which `stdin` is writable like a `Writer`
120 # File Descriptor used for the output.
121 var stream_out
: Writer is noinit
123 redef fun close
do stream_out
.close
125 redef fun is_writable
do return stream_out
.is_writable
127 redef fun write
(s
) do stream_out
.write
(s
)
129 redef fun pipeflags
do return 1
134 var out
= new FileWriter.from_fd
(data
.in_fd
)
135 out
.set_buffering_mode
(0, sys
.buffer_mode_none
)
140 # `Process` on which stdout can be read and stdin can be written to like a `Duplex`
152 redef fun pipeflags
do return 3
161 # Execute a shell command and return its error code
162 fun system
(command
: String): Int
164 return command
.to_cstring
.system
168 redef class NativeString
169 # Execute self as a shell command.
171 # See the posix function system(3).
172 fun system
: Int is extern "string_NativeString_NativeString_system_0"
175 private extern class NativeProcess
176 fun id
: Int is extern "exec_NativeProcess_NativeProcess_id_0"
177 fun is_finished
: Bool is extern "exec_NativeProcess_NativeProcess_is_finished_0"
178 fun status
: Int is extern "exec_NativeProcess_NativeProcess_status_0"
179 fun wait
is extern "exec_NativeProcess_NativeProcess_wait_0"
181 fun in_fd
: Int is extern "exec_NativeProcess_NativeProcess_in_fd_0"
182 fun out_fd
: Int is extern "exec_NativeProcess_NativeProcess_out_fd_0"
183 fun err_fd
: Int is extern "exec_NativeProcess_NativeProcess_err_fd_0"