exec.rs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. use std::ffi::{CString};
  2. use crate::log::logger;
  3. pub fn shell_run_cmd(program: String) {
  4. let p = std::process::Command::new(program.clone()).spawn();
  5. let r = match p {
  6. Ok(mut ch) => {ch.wait()}
  7. Err(err) => {
  8. logger().warn("mgrsh", format!("failed exec {}: {:?}", program.as_str(), err).as_str());
  9. return;
  10. }
  11. };
  12. match r {
  13. Ok(ec) => {
  14. match ec.code() {
  15. None => {
  16. println!("exit with no code.")
  17. }
  18. Some(c) => {
  19. println!("exit with code {}.", c)
  20. }
  21. }
  22. }
  23. Err(err) => {
  24. println!("failed run command: {:?}.", err)
  25. }
  26. }
  27. }
  28. pub fn unix_execv(path: &str, args: Vec<String>) {
  29. let mut sv = Vec::<CString>::new();
  30. for i in args {
  31. let csi_r = CString::new(i.clone());
  32. let csi = match csi_r {
  33. Ok(v) => v,
  34. Err(err) => {
  35. logger().fatal("execv", format!("failed convert arg '{}' into CString: {:?}", i.as_str(), err).as_str());
  36. return;
  37. }
  38. };
  39. sv.push(csi);
  40. }
  41. let ss = sv.as_slice();
  42. let cstring_path_res = CString::new(path);
  43. let cstring_path = match cstring_path_res {
  44. Ok(v) => v,
  45. Err(err) => {
  46. logger().fatal("execv", format!("failed convert path into CString: {:?}", err).as_str());
  47. return;
  48. }
  49. };
  50. let exec_res = nix::unistd::execv(&cstring_path, ss);
  51. match exec_res {
  52. Ok(_) => {}
  53. Err(err) => {
  54. logger().fatal("execv", format!("failed execv: {:?}", err).as_str());
  55. }
  56. }
  57. }