* Copyright (C) 2023 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
mod auth;
mod client;
mod host_app;
mod logger;
mod parser;
mod server;
mod task;
mod translate;
mod unittest;
mod tty_utility;
use std::{
backtrace::{Backtrace, BacktraceStatus},
io::ErrorKind,
panic,
};
use hdc::common::base;
use hdc::common::base::Base;
use hdc::config;
#[cfg(feature = "host")]
extern crate ylong_runtime_static as ylong_runtime;
#[macro_use]
extern crate lazy_static;
fn setup_panic_hook() {
panic::set_hook(Box::new(move |info| {
hdc::error!("panic info: {}", info);
let backtrace = Backtrace::capture();
if backtrace.status() == BacktraceStatus::Disabled {
hdc::error!(
"backtrace: disabled. run with `RUST_BACKTRACE=1` environment variable to display a backtrace."
);
} else {
hdc::error!("backtrace: \n{}", backtrace);
}
}));
}
fn main() {
setup_panic_hook();
let _ = ylong_runtime::builder::RuntimeBuilder::new_multi_thread()
.worker_stack_size(16 * 1024 * 1024)
.worker_num(64)
.keep_alive_time(std::time::Duration::from_secs(10))
.build_global();
let parsed_cmd = match parser::parse_command(std::env::args()) {
Ok(parsed_cmd) => parsed_cmd,
Err(e) => {
println!("{}", e);
return;
}
};
logger::logger_init(
config::LOG_LEVEL_ORDER[parsed_cmd.log_level],
parsed_cmd.run_in_server,
parsed_cmd.spawned_server,
);
hdc::debug!("parsed cmd: {:#?}", parsed_cmd);
if parsed_cmd.run_in_server {
if !Base::program_mutex(base::GLOBAL_SERVER_NAME, false) {
hdc::debug!("There is already a running service, please exit directly");
return;
}
ylong_runtime::block_on(async {
let _ = server::run_server_mode(parsed_cmd.server_addr).await;
});
} else {
hdc::debug!("in client mode, cmd: {:#?}, parameter:{:#?}", parsed_cmd.command, parsed_cmd.parameters);
ylong_runtime::block_on(async {
if parsed_cmd.command.is_none() {
println!("Unknown operation command...");
println!("{}", translate::usage());
return;
}
if let Err(e) = client::run_client_mode(parsed_cmd).await {
match e.kind() {
ErrorKind::Other => println!("[Fail]{}", e),
_ => {
hdc::trace!("client exit with err: {e:?}");
}
}
}
})
}
}