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
42 # Launch a command with some arguments
43 init(command
: String, arguments
: String...)
45 execute
(command
, arguments
, 0)
48 # Launch a simple command without arguments
49 init init_
(command
: String)
51 execute
(command
, null, 0)
54 init from_a
(command
: String, arguments
: Array[String])
56 execute
(command
, arguments
, 0)
59 # Internal code to handle execution
60 protected init execute
(command
: String, arguments
: nullable Array[String], pipeflags
: Int)
63 var l
= 1 # Number of elements in args
65 if arguments
!= null then
72 data
= basic_exec_execute
(command
.to_cstring
, args
.to_s
.to_cstring
, l
, pipeflags
)
75 private var data
: NativeProcess
76 private fun basic_exec_execute
(p
: NativeString, av
: NativeString, ac
: Int, pf
: Int): NativeProcess is extern "exec_Process_Process_basic_exec_execute_4"
79 # stdout of the process is readable
83 var stream_in
: FDIStream
85 redef fun close
do stream_in
.close
87 redef fun read_char
do return stream_in
.read_char
89 redef fun eof
do return stream_in
.eof
91 init(command
: String, arguments
: String...)
93 execute
(command
, arguments
, 2)
94 stream_in
= new FDIStream(data
.out_fd
)
97 init init_
(command
: String)
99 execute
(command
, null, 2)
100 stream_in
= new FDIStream(data
.out_fd
)
103 init from_a
(command
: String, arguments
: Array[String])
105 execute
(command
, arguments
, 2)
106 stream_in
= new FDIStream(data
.out_fd
)
110 # stdin of the process is writable
114 var stream_out
: OStream
116 redef fun close
do stream_out
.close
118 redef fun is_writable
do return stream_out
.is_writable
120 redef fun write
(s
) do stream_out
.write
(s
)
122 init(command
: String, arguments
: String...)
124 execute
(command
, arguments
, 1)
125 stream_out
= new FDOStream(data
.in_fd
)
128 init init_
(command
: String)
130 execute
(command
, null, 1)
131 stream_out
= new FDOStream(data
.in_fd
)
134 init from_a
(command
: String, arguments
: Array[String])
136 execute
(command
, arguments
, 1)
137 stream_out
= new FDOStream(data
.in_fd
)
141 # stdin and stdout are both accessible
153 init(command
: String, arguments
: String...)
155 execute
(command
, arguments
, 3)
156 stream_in
= new FDIStream(data
.out_fd
)
157 stream_out
= new FDOStream(data
.in_fd
)
160 init init_
(command
: String)
162 execute
(command
, null, 3)
163 stream_in
= new FDIStream(data
.out_fd
)
164 stream_out
= new FDOStream(data
.in_fd
)
167 init from_a
(command
: String, arguments
: Array[String])
169 execute
(command
, arguments
, 3)
170 stream_in
= new FDIStream(data
.out_fd
)
171 stream_out
= new FDOStream(data
.in_fd
)
176 # Execute a shell command and return its error code
177 fun system
(command
: String): Int
179 return command
.to_cstring
.system
183 redef class NativeString
184 fun system
: Int is extern "string_NativeString_NativeString_system_0"
187 private extern NativeProcess
188 fun id
: Int is extern "exec_NativeProcess_NativeProcess_id_0"
189 fun is_finished
: Bool is extern "exec_NativeProcess_NativeProcess_is_finished_0"
190 fun status
: Int is extern "exec_NativeProcess_NativeProcess_status_0"
191 fun wait
is extern "exec_NativeProcess_NativeProcess_wait_0"
193 fun in_fd
: Int is extern "exec_NativeProcess_NativeProcess_in_fd_0"
194 fun out_fd
: Int is extern "exec_NativeProcess_NativeProcess_out_fd_0"
195 fun err_fd
: Int is extern "exec_NativeProcess_NativeProcess_err_fd_0"