@@ -172,6 +172,37 @@ func Chown(path string, uid, gid int) (err error) {
172
172
return
173
173
}
174
174
175
+ func Fork () (err error ) {
176
+ fail := int (libc_fork ())
177
+ if fail < 0 {
178
+ err = getErrno ()
179
+ }
180
+ return
181
+ }
182
+
183
+ func Execve (pathname string , argv []string , envv []string ) (err error ) {
184
+ argv0 := cstring (pathname )
185
+
186
+ // transform argv and envv into the format expected by execve
187
+ argv1 := make ([]* byte , len (argv )+ 1 )
188
+ for i , arg := range argv {
189
+ argv1 [i ] = & cstring (arg )[0 ]
190
+ }
191
+ argv1 [len (argv )] = nil
192
+
193
+ env1 := make ([]* byte , len (envv )+ 1 )
194
+ for i , env := range envv {
195
+ env1 [i ] = & cstring (env )[0 ]
196
+ }
197
+ env1 [len (envv )] = nil
198
+
199
+ fail := int (libc_execve (& argv0 [0 ], & argv1 [0 ], & env1 [0 ]))
200
+ if fail < 0 {
201
+ err = getErrno ()
202
+ }
203
+ return
204
+ }
205
+
175
206
func Faccessat (dirfd int , path string , mode uint32 , flags int ) (err error )
176
207
177
208
func Kill (pid int , sig Signal ) (err error ) {
@@ -410,3 +441,13 @@ func libc_readlink(path *byte, buf *byte, count uint) int
410
441
//
411
442
//export unlink
412
443
func libc_unlink (pathname * byte ) int32
444
+
445
+ // pid_t fork(void);
446
+ //
447
+ //export fork
448
+ func libc_fork () int32
449
+
450
+ // int execve(const char *filename, char *const argv[], char *const envp[]);
451
+ //
452
+ //export execve
453
+ func libc_execve (filename * byte , argv * * byte , envp * * byte ) int
0 commit comments