os: add os.execve/3 (extracted from unix_spawn_process); use os.execvp/2 in v.util.launch_tool/3
							parent
							
								
									c943c8a16e
								
							
						
					
					
						commit
						b4f02adc32
					
				|  | @ -869,7 +869,7 @@ pub fn create(path string) ?File { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // execvp - loads and executes a new child process, in place of the current process.
 | // execvp - loads and executes a new child process, *in place* of the current process.
 | ||||||
| // The child process executable is located in `cmdpath`.
 | // The child process executable is located in `cmdpath`.
 | ||||||
| // The arguments, that will be passed to it are in `args`.
 | // The arguments, that will be passed to it are in `args`.
 | ||||||
| // NB: this function will NOT return when successfull, since
 | // NB: this function will NOT return when successfull, since
 | ||||||
|  | @ -883,6 +883,32 @@ pub fn execvp(cmdpath string, args []string) ? { | ||||||
| 	cargs << charptr(0) | 	cargs << charptr(0) | ||||||
| 	res := C.execvp(charptr(cmdpath.str), cargs.data) | 	res := C.execvp(charptr(cmdpath.str), cargs.data) | ||||||
| 	if res == -1 { | 	if res == -1 { | ||||||
| 		return error(posix_get_error_msg(C.errno)) | 		return error_with_code(posix_get_error_msg(C.errno), C.errno) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // execve - loads and executes a new child process, *in place* of the current process.
 | ||||||
|  | // The child process executable is located in `cmdpath`.
 | ||||||
|  | // The arguments, that will be passed to it are in `args`.
 | ||||||
|  | // You can pass environment variables to through `envs`.
 | ||||||
|  | // NB: this function will NOT return when successfull, since
 | ||||||
|  | // the child process will take control over execution.
 | ||||||
|  | pub fn execve(cmdpath string, args []string, envs []string) ? { | ||||||
|  | 	mut cargv := []charptr{} | ||||||
|  | 	mut cenvs := []charptr{} | ||||||
|  | 	cargv << charptr(cmdpath.str) | ||||||
|  | 	for i in 0 .. args.len { | ||||||
|  | 		cargv << charptr(args[i].str) | ||||||
|  | 	} | ||||||
|  | 	for i in 0 .. envs.len { | ||||||
|  | 		cenvs << charptr(envs[i].str) | ||||||
|  | 	} | ||||||
|  | 	cargv << charptr(0) | ||||||
|  | 	cenvs << charptr(0) | ||||||
|  | 	res := C.execve(charptr(cmdpath.str), cargv.data, cenvs.data) | ||||||
|  | 	// NB: normally execve does not return at all.
 | ||||||
|  | 	// If it returns, then something went wrong...
 | ||||||
|  | 	if res == -1 { | ||||||
|  | 		return error_with_code(posix_get_error_msg(C.errno), C.errno) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -43,22 +43,10 @@ fn (mut p Process) unix_spawn_process() int { | ||||||
| 		fd_close(pipeset[3]) | 		fd_close(pipeset[3]) | ||||||
| 		fd_close(pipeset[5]) | 		fd_close(pipeset[5]) | ||||||
| 	} | 	} | ||||||
| 	mut cargv := []charptr{} | 	execve(p.filename, p.args, p.env) or { | ||||||
| 	mut cenvs := []charptr{} | 		eprintln(err) | ||||||
| 	cargv << charptr(p.filename.str) |  | ||||||
| 	for i in 0 .. p.args.len { |  | ||||||
| 		cargv << charptr(p.args[i].str) |  | ||||||
| 	} |  | ||||||
| 	for i in 0 .. p.env.len { |  | ||||||
| 		cenvs << charptr(p.env[i].str) |  | ||||||
| 	} |  | ||||||
| 	cargv << charptr(0) |  | ||||||
| 	cenvs << charptr(0) |  | ||||||
| 	C.execve(charptr(p.filename.str), cargv.data, cenvs.data) |  | ||||||
| 	// NB: normally execve does not return at all.
 |  | ||||||
| 	// If it returns, then something went wrong...
 |  | ||||||
| 	eprintln(posix_get_error_msg(C.errno)) |  | ||||||
| 		exit(1) | 		exit(1) | ||||||
|  | 	} | ||||||
| 	return 0 | 	return 0 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -164,7 +164,7 @@ pub fn launch_tool(is_verbose bool, tool_name string, args []string) { | ||||||
| 	if is_verbose { | 	if is_verbose { | ||||||
| 		println('launch_tool running tool command: $tool_command ...') | 		println('launch_tool running tool command: $tool_command ...') | ||||||
| 	} | 	} | ||||||
| 	exit(os.system(tool_command)) | 	os.execvp(tool_exe, args) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NB: should_recompile_tool/2 compares unix timestamps that have 1 second resolution
 | // NB: should_recompile_tool/2 compares unix timestamps that have 1 second resolution
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue