Fix PAL library command arguments not follow convention
This commit is contained in:
parent
153a6fcd61
commit
7ac917aa1a
@ -58,6 +58,7 @@ int main(int argc, char *argv[]) {
|
|||||||
snprintf(buf_ptr_str, sizeof buf_ptr_str, "%lu", (unsigned long) shared_buf);
|
snprintf(buf_ptr_str, sizeof buf_ptr_str, "%lu", (unsigned long) shared_buf);
|
||||||
snprintf(buf_size_str, sizeof buf_size_str, "%lu", sizeof shared_buf);
|
snprintf(buf_size_str, sizeof buf_size_str, "%lu", sizeof shared_buf);
|
||||||
const char *cmd_args[] = {
|
const char *cmd_args[] = {
|
||||||
|
cmd_path,
|
||||||
buf_ptr_str, // buf_ptr
|
buf_ptr_str, // buf_ptr
|
||||||
buf_size_str, // buf_size
|
buf_size_str, // buf_size
|
||||||
total_bytes_str, // total_bytes
|
total_bytes_str, // total_bytes
|
||||||
|
@ -27,6 +27,7 @@ use signal_hook::iterator::Signals;
|
|||||||
use signal_hook::{SIGINT, SIGKILL, SIGQUIT, SIGTERM, SIGUSR1};
|
use signal_hook::{SIGINT, SIGKILL, SIGQUIT, SIGTERM, SIGUSR1};
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::env;
|
use std::env;
|
||||||
|
use std::path::Path;
|
||||||
use std::os::unix::net::UnixListener;
|
use std::os::unix::net::UnixListener;
|
||||||
use std::process;
|
use std::process;
|
||||||
use std::process::{Command, Stdio};
|
use std::process::{Command, Stdio};
|
||||||
@ -297,7 +298,7 @@ fn main() -> Result<(), i32> {
|
|||||||
stop_server(&client, stop_time);
|
stop_server(&client, stop_time);
|
||||||
println!("server stopped.");
|
println!("server stopped.");
|
||||||
} else if let Some(ref matches) = matches.subcommand_matches("exec") {
|
} else if let Some(ref matches) = matches.subcommand_matches("exec") {
|
||||||
let cmd_args: Vec<&str> = match matches
|
let mut cmd_args: Vec<&str> = match matches
|
||||||
.values_of("args")
|
.values_of("args")
|
||||||
.map(|vals| vals.collect::<Vec<_>>())
|
.map(|vals| vals.collect::<Vec<_>>())
|
||||||
{
|
{
|
||||||
@ -306,7 +307,9 @@ fn main() -> Result<(), i32> {
|
|||||||
_ => panic!(),
|
_ => panic!(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let (cmd, args) = cmd_args.split_first().unwrap();
|
let cmd = cmd_args[0];
|
||||||
|
// Change cmd_args[0] from path name to program name
|
||||||
|
cmd_args[0] = Path::new(cmd_args[0]).file_name().unwrap().to_str().unwrap();
|
||||||
let env: Vec<&str> = env.iter().map(|string| string.as_str()).collect();
|
let env: Vec<&str> = env.iter().map(|string| string.as_str()).collect();
|
||||||
|
|
||||||
// Create the signal handler
|
// Create the signal handler
|
||||||
@ -330,7 +333,7 @@ fn main() -> Result<(), i32> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
match exec_command(&client, cmd, args, &env) {
|
match exec_command(&client, cmd, &cmd_args, &env) {
|
||||||
Ok(process_id) => {
|
Ok(process_id) => {
|
||||||
// the signal thread exit if server finished execution or user kill the client
|
// the signal thread exit if server finished execution or user kill the client
|
||||||
signal_thread.join().unwrap();
|
signal_thread.join().unwrap();
|
||||||
|
@ -225,18 +225,8 @@ fn parse_arguments(
|
|||||||
.map_err(|e| errno!(EINVAL, "path contains valid utf-8 data"))?;
|
.map_err(|e| errno!(EINVAL, "path contains valid utf-8 data"))?;
|
||||||
Path::new(&path_string).to_path_buf()
|
Path::new(&path_string).to_path_buf()
|
||||||
};
|
};
|
||||||
let program_cstring = {
|
|
||||||
let program_osstr = path_buf
|
|
||||||
.file_name()
|
|
||||||
.ok_or_else(|| errno!(EINVAL, "invalid path"))?;
|
|
||||||
let program_str = program_osstr
|
|
||||||
.to_str()
|
|
||||||
.ok_or_else(|| errno!(EINVAL, "invalid path"))?;
|
|
||||||
CString::new(program_str).map_err(|e| errno!(e))?
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut args = clone_cstrings_safely(argv)?;
|
let mut args = clone_cstrings_safely(argv)?;
|
||||||
args.insert(0, program_cstring);
|
|
||||||
|
|
||||||
let env_merged = merge_env(env)?;
|
let env_merged = merge_env(env)?;
|
||||||
trace!(
|
trace!(
|
||||||
|
@ -64,7 +64,8 @@ struct occlum_pal_create_process_args {
|
|||||||
|
|
||||||
// Argments array pass to new process.
|
// Argments array pass to new process.
|
||||||
//
|
//
|
||||||
// The arguments to the command. The array must be NULL terminated.
|
// The arguments to the command. By convention, the argv[0] should be the program name.
|
||||||
|
// And the array must be NULL terminated.
|
||||||
//
|
//
|
||||||
// Mandatory field. Must not be NULL.
|
// Mandatory field. Must not be NULL.
|
||||||
const char **argv;
|
const char **argv;
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <libgen.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <occlum_pal_api.h>
|
#include <occlum_pal_api.h>
|
||||||
@ -13,10 +15,17 @@ int main(int argc, char *argv[]) {
|
|||||||
fprintf(stderr, "Usage: occlum-run <executable> [<args>]\n");
|
fprintf(stderr, "Usage: occlum-run <executable> [<args>]\n");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
const char *cmd_path = (const char *) argv[1];
|
|
||||||
const char **cmd_args = (const char **) &argv[2];
|
char **cmd_args = &argv[1];
|
||||||
|
char *cmd_path = strdup(argv[1]);
|
||||||
extern const char **environ;
|
extern const char **environ;
|
||||||
|
|
||||||
|
// Change cmd_args[0] from program path to program name in place (e.g., "/bin/abc" to "abc")
|
||||||
|
char *cmd_path_tmp = strdup(cmd_path);
|
||||||
|
const char *program_name = (const char *) basename(cmd_path_tmp);
|
||||||
|
memset(cmd_args[0], 0, strlen(cmd_args[0]));
|
||||||
|
memcpy(cmd_args[0], program_name, strlen(program_name));
|
||||||
|
|
||||||
// Check Occlum PAL version
|
// Check Occlum PAL version
|
||||||
int pal_version = occlum_pal_get_version();
|
int pal_version = occlum_pal_get_version();
|
||||||
if (pal_version <= 0) {
|
if (pal_version <= 0) {
|
||||||
@ -39,8 +48,8 @@ int main(int argc, char *argv[]) {
|
|||||||
int exit_status = 0;
|
int exit_status = 0;
|
||||||
int libos_tid = 0;
|
int libos_tid = 0;
|
||||||
struct occlum_pal_create_process_args create_process_args = {
|
struct occlum_pal_create_process_args create_process_args = {
|
||||||
.path = cmd_path,
|
.path = (const char *) cmd_path,
|
||||||
.argv = cmd_args,
|
.argv = (const char **) cmd_args,
|
||||||
.env = environ,
|
.env = environ,
|
||||||
.stdio = (const struct occlum_stdio_fds *) &io_fds,
|
.stdio = (const struct occlum_stdio_fds *) &io_fds,
|
||||||
.pid = &libos_tid,
|
.pid = &libos_tid,
|
||||||
|
Loading…
Reference in New Issue
Block a user