1use std::env;
2use std::fs::File;
3use std::io::Read;
4use std::io::Write;
5use std::process;
6
7use crate::web_server::ChiteyError;
8
9pub fn save_pid() {
10 let mut tmp_dir = env::temp_dir();
11 tmp_dir.push("chitey_api_server_pid.txt");
12 let mut file = File::create(tmp_dir.clone()).expect("create failed");
13 let pid = process::id().to_string();
14 file.write_all(pid.as_bytes()).expect("write failed");
15}
16
17pub fn load_pid() -> u32 {
18 let mut tmp_dir = env::temp_dir();
19 tmp_dir.push("chitey_api_server_pid.txt");
20 let mut file = File::open(tmp_dir).expect("open failed");
21 let mut contents = String::new();
22 file.read_to_string(&mut contents).expect("load failed");
23 let pid: u32 = contents.parse().unwrap();
24 pid
26}
27
28pub fn kill_server() -> Result<(), ChiteyError>{
29 let pid = load_pid();
30 #[cfg(target_os = "windows")]
31 {
32 use winapi::um::handleapi::CloseHandle;
33 use winapi::um::processthreadsapi::OpenProcess;
34 use winapi::um::processthreadsapi::TerminateProcess;
35 use winapi::um::winnt::PROCESS_ALL_ACCESS;
36
37 unsafe {
38 let process_handle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
39 let mut ret: Result<(), ChiteyError> = Ok(());
40 if process_handle.is_null() {
41 ret = Err(ChiteyError::ServerKillError("Process does not exist".to_string()
42 ));
43 }
44
45 if TerminateProcess(process_handle, 1) == 0 {
46 ret = Err(ChiteyError::ServerKillError(format!(
47 "プロセスを終了できません。エラーコード: {}",
48 std::io::Error::last_os_error()
49 )));
50 } else {
51 ret = Ok(());
52 }
53
54 if !process_handle.is_null() {
56 CloseHandle(process_handle);
57 }
58 return ret;
59 }
60 }
61
62 #[cfg(not(target_os = "windows"))]
63 {
64 if let Err(err) = nix::sys::signal::kill(
65 nix::unistd::Pid::from_raw(pid as i32),
66 nix::sys::signal::SIGKILL,
67 ) {
68 return Err(ChiteyError::ServerKillError(format!("Failed to kill process: {}", err)));
69 }
70 }
71 Ok(())
73}