1 /*
2 * Copyright (C) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #![allow(missing_docs)]
16 use crate::common::sendmsg::send_msg;
17 use crate::common::uds::{PollNode, UdsAddr, UdsServer};
18 use crate::config::ErrCode;
19 use crate::config::HdcCommand;
20 use crate::config::TaskMessage;
21 use crate::daemon_lib::sys_para::set_dev_item;
22 use crate::{transfer, utils};
23 use crate::utils::hdc_log::*;
24 use libc::{POLLERR, POLLHUP, POLLIN, POLLNVAL, POLLRDHUP, SOCK_STREAM};
25
26 use std::collections::HashMap;
27 use std::sync::{Arc, Once};
28 #[cfg(feature = "host")]
29 extern crate ylong_runtime_static as ylong_runtime;
30 use ylong_runtime::sync::waiter::Waiter;
31 use ylong_runtime::sync::Mutex;
32
33 const JPID_SOCKET_PATH: &str = "ohjpid-control";
34 const PATH_LEN: usize = JPID_SOCKET_PATH.as_bytes().len() + 1;
35
36 #[allow(unused)]
37 #[derive(Clone, Debug, PartialEq)]
38 pub enum DisplayType {
39 AllApp = 0,
40 DebugApp = 1,
41 ReleaseApp = 2,
42 AllAppWithType = 3,
43 }
44
45 type NodeMap = Arc<Mutex<HashMap<i32, PollNode>>>;
46 type SocketPairVec = Arc<Mutex<Vec<(i32, i32)>>>;
47 type SocketpairMap = Arc<Mutex<HashMap<u32, SocketPairVec>>>;
48 type Trackers = Arc<Mutex<Vec<(u32, u32, DisplayType)>>>;
49
50 pub trait JdwpBase: Send + Sync + 'static {}
51 pub struct Jdwp {
52 poll_node_map: NodeMap,
53 socketpair_map: SocketpairMap,
54 new_process_waiter: Arc<Waiter>,
55 trackers: Trackers,
56 await_fd: i32,
57 }
58
59 impl JdwpBase for Jdwp {}
60
61 type JdWpShare = Arc<Jdwp>;
62
63 impl Default for Jdwp {
default() -> Self64 fn default() -> Self {
65 Self::new()
66 }
67 }
68
69 impl Jdwp {
get_instance() -> JdWpShare70 pub fn get_instance() -> JdWpShare {
71 static mut INSTANCE: Option<JdWpShare> = None;
72 unsafe {
73 INSTANCE
74 .get_or_insert_with(|| Arc::new(Jdwp::new()))
75 .clone()
76 }
77 }
78
new() -> Self79 pub fn new() -> Self {
80 Self {
81 poll_node_map: Arc::new(Mutex::new(HashMap::default())),
82 socketpair_map: Arc::new(Mutex::new(HashMap::default())),
83 new_process_waiter: Arc::new(Waiter::new()),
84 trackers: Arc::new(Mutex::new(Vec::new())),
85 await_fd: UdsServer::wrap_event_fd(),
86 }
87 }
88 }
89
90 impl Jdwp {
put_socketpair(&self, target_pid: u32, fd: i32, fd2: i32)91 async fn put_socketpair(&self, target_pid: u32, fd: i32, fd2: i32) {
92 let socketpair_map = self.socketpair_map.clone();
93 let mut socketpair_map_lock = socketpair_map.lock().await;
94 if let Some(vec) = socketpair_map_lock.get(&target_pid) {
95 let mut lock = vec.lock().await;
96 lock.push((fd, fd2));
97 } else {
98 let vec = vec![(fd, fd2)];
99 socketpair_map_lock.insert(target_pid, Arc::new(Mutex::new(vec)));
100 }
101 }
102
send_fd_to_target(&self, target_pid: u32, fd: i32, fd2: i32, parameter: &str) -> bool103 pub async fn send_fd_to_target(&self, target_pid: u32, fd: i32, fd2: i32, parameter: &str) -> bool {
104 let map = self.poll_node_map.clone();
105 let map = map.lock().await;
106 let keys = map.keys();
107 for k in keys {
108 let v = map.get(k);
109 if let Some(node) = v {
110 if node.ppid == target_pid {
111 crate::info!("send_fd_to_target pid:{target_pid}, fd:({fd}, {fd2})");
112 self.put_socketpair(target_pid, fd, fd2).await;
113
114 let bytes = fd.to_be_bytes();
115 let fd_bytes = bytes.as_slice();
116 let param_bytes = parameter.as_bytes();
117 let param_bytes = [fd_bytes, param_bytes].concat();
118 let param_bytes = param_bytes.as_slice();
119 let ret = send_msg(node.fd, fd, param_bytes);
120 crate::info!("send_fd_to_target ret:{}", ret);
121 return ret > 0;
122 }
123 }
124 }
125 false
126 }
127
send_process_list(trackers: Trackers, node_map: NodeMap)128 async fn send_process_list(trackers: Trackers, node_map: NodeMap) {
129 let trackers = trackers.lock().await;
130 for (channel_id2, session_id2, display) in trackers.iter() {
131 let message = Self::get_process_list_with_pkg_name(node_map.clone(), display.clone()).await;
132 let len = message.as_bytes().len();
133 let len_str = format!("{:04x}\n", len);
134 let mut header = len_str.as_bytes().to_vec();
135 let mut buffer = Vec::<u8>::new();
136 buffer.append(&mut header);
137 buffer.append(&mut message.as_str().as_bytes().to_vec());
138
139 let data = TaskMessage {
140 channel_id: *channel_id2,
141 command: HdcCommand::KernelEchoRaw,
142 payload: buffer.to_vec(),
143 };
144 transfer::put(*session_id2, data).await;
145 }
146 }
147
add_tracker(&self, channel_id: u32, session_id: u32, display: DisplayType)148 pub async fn add_tracker(&self, channel_id: u32, session_id: u32, display: DisplayType) {
149 let mut trackers_lock = self.trackers.lock().await;
150 trackers_lock.push((channel_id, session_id, display));
151 drop(trackers_lock);
152
153 let node_map = self.poll_node_map.clone();
154 Self::send_process_list(self.trackers.clone(), node_map).await;
155 }
156
get_process_list(&self) -> String157 pub async fn get_process_list(&self) -> String {
158 let mut result = String::from("");
159 let map = self.poll_node_map.clone();
160 let map = map.lock().await;
161 let keys = map.keys();
162 for key in keys {
163 let value = map.get(key);
164 if let Some(v) = value {
165 result.push_str((v.ppid.to_string() + "\n").as_str());
166 }
167 }
168 result
169 }
170
get_process_list_with_pkg_name(map: NodeMap, display: DisplayType) -> String171 pub async fn get_process_list_with_pkg_name(map: NodeMap, display: DisplayType) -> String {
172 let mut result = String::from("");
173 let map = map.lock().await;
174 let keys = map.keys();
175 for key in keys {
176 let value = map.get(key);
177 if let Some(v) = value {
178 if display == DisplayType::AllApp {
179 result.push_str((v.ppid.to_string() + " " + v.pkg_name.as_str() + "\n").as_str());
180 } else if display == DisplayType::DebugApp {
181 if v.is_debug {
182 result.push_str((v.ppid.to_string() + " " + v.pkg_name.as_str() + "\n").as_str());
183 }
184 } else if display == DisplayType::AllAppWithType {
185 let mut apptype = String::from("release");
186 if v.is_debug {
187 apptype = String::from("debug");
188 }
189 result.push_str((
190 v.ppid.to_string() + " "
191 + v.pkg_name.as_str() + " "
192 + apptype.as_str() + "\n").as_str());
193 }
194 }
195 }
196 result
197 }
198
chang_item_once()199 fn chang_item_once() {
200 static ONCE: Once = Once::new();
201 ONCE.call_once(|| {
202 let result = set_dev_item("persist.hdc.jdwp", "0");
203 crate::info!("set persist.hdc.jdwp to 0 result: {}", result);
204 }
205 );
206 }
207
handle_client(fd: i32, waiter: Arc<Waiter>, node_map: NodeMap)208 pub async fn handle_client(fd: i32, waiter: Arc<Waiter>, node_map: NodeMap) {
209 crate::info!("handle_client start...");
210 let mut buffer: [u8; 1024] = [0; 1024];
211 let size = UdsServer::wrap_recv(fd, &mut buffer);
212 let u32_size = std::mem::size_of::<u32>();
213 if size > u32_size as isize {
214 let len = u32::from_le_bytes(buffer[0..u32_size].try_into().unwrap_or_default());
215 let pid = u32::from_le_bytes(buffer[u32_size..2 * u32_size].try_into().unwrap_or_default());
216 if pid == 0 || len == 0 {
217 crate::warn!("Data parsing exception. pid {pid}, len {len}");
218 return;
219 }
220 crate::info!("pid:{}", pid);
221 let is_debug = u32::from_le_bytes(buffer[u32_size * 2..3 * u32_size].try_into().unwrap_or_default()) == 1;
222 crate::info!("debug:{}", is_debug);
223 let pkg_name = String::from_utf8(buffer[u32_size * 3..len as usize].to_vec()).unwrap_or_default();
224 crate::info!("pkg name:{}", pkg_name);
225 Self::chang_item_once();
226
227 let node_map = node_map.clone();
228 let mut map = node_map.lock().await;
229 let node = PollNode::new(fd, pid, pkg_name.clone(), is_debug);
230 let mut key_ = -1;
231 for (key, value) in map.iter() {
232 if value.pkg_name == pkg_name {
233 key_ = *key;
234 UdsServer::wrap_close(value.fd);
235 break;
236 }
237 }
238 if key_ != -1 {
239 map.remove(&key_);
240 }
241 map.insert(fd, node);
242 drop(map);
243
244 waiter.wake_one();
245 } else if size <= u32_size as isize {
246 crate::info!("The data length is too short, size = {size}");
247 }
248 }
249
jdwp_listen(&self) -> bool250 pub fn jdwp_listen(&self) -> bool {
251 let fd = UdsServer::wrap_socket(SOCK_STREAM);
252 let name = JPID_SOCKET_PATH.as_bytes();
253 let socket_name = &mut [0u8; PATH_LEN];
254 socket_name[0] = b'\0';
255 socket_name[1..].copy_from_slice(name);
256 let addr = UdsAddr::parse_abstract(&socket_name[1..]);
257 if let Ok(addr_obj) = &addr {
258 if let Err(ret) = UdsServer::wrap_bind(fd, addr_obj) {
259 crate::error!("bind fail. {ret:?}");
260 return false;
261 }
262 let ret = UdsServer::wrap_listen(fd);
263 if ret < 0 {
264 crate::error!("listen fail, ret = {ret}");
265 return false;
266 }
267 let node_map = self.poll_node_map.clone();
268 let waiter = self.new_process_waiter.clone();
269 ylong_runtime::spawn(async move {
270 loop {
271 let client_fd = UdsServer::wrap_accept(fd);
272 if client_fd == -1 {
273 crate::error!("wrap_accept failed");
274 break;
275 }
276 let map = node_map.clone();
277 let w = waiter.clone();
278 utils::spawn(Self::handle_client(client_fd, w, map));
279 }
280 });
281 true
282 } else {
283 crate::info!("parse addr fail ");
284 false
285 }
286 }
287
start_data_looper(&self)288 pub fn start_data_looper(&self) {
289 let node_map = self.poll_node_map.clone();
290 let socketpair_map = self.socketpair_map.clone();
291 let trackers = self.trackers.clone();
292 let await_fd = self.await_fd;
293 utils::spawn(async move {
294 loop {
295 let mut poll_nodes = Vec::<PollNode>::new();
296 let mut fd_node = PollNode::new(await_fd, 0, "".to_string(), false);
297 fd_node.revents = 0;
298 fd_node.events = POLLIN;
299 poll_nodes.push(fd_node);
300
301 let node_map_value = node_map.lock().await;
302 let keys = node_map_value.keys();
303 for k in keys {
304 if let Some(n) = node_map_value.get(k) {
305 poll_nodes.push(n.clone());
306 }
307 }
308 let size = poll_nodes.len();
309
310 drop(node_map_value);
311 UdsServer::wrap_poll(poll_nodes.as_mut_slice(), size.try_into().unwrap_or_default(), -1);
312 let mut node_map_value = node_map.lock().await;
313 for pnode in &poll_nodes {
314 if pnode.revents & (POLLNVAL | POLLRDHUP | POLLHUP | POLLERR) != 0 {
315 crate::info!("start_data_looper remove node:{}", pnode.pkg_name);
316 node_map_value.remove(&pnode.fd);
317 UdsServer::wrap_close(pnode.fd);
318
319 let pid = pnode.ppid;
320 let mut socketpair_map_lock = socketpair_map.lock().await;
321 if let Some(vec) = socketpair_map_lock.remove(&pid) {
322 let lock = vec.lock().await;
323 for (fd0, fd1) in lock.iter() {
324 //此处close socketpair,会导致hdcd和aa之间的pipe异常,hdcd读取不到aa force-stop的返回结果
325 crate::info!("start_data_looper close pid:{}, socketpair_fd:({},{})", pid, fd0, fd1);
326 }
327 }
328 } else if pnode.fd == await_fd && pnode.revents & POLLIN != 0 {
329 UdsServer::wrap_read_fd(await_fd);
330 }
331 }
332 drop(node_map_value);
333 let trackers = trackers.clone();
334 let node_map = node_map.clone();
335 Self::send_process_list(trackers, node_map).await;
336 }
337 });
338 }
339
create_fd_event_poll(&self)340 pub async fn create_fd_event_poll(&self) {
341 loop {
342 let waiter = self.new_process_waiter.clone();
343 waiter.wait().await;
344
345 UdsServer::wrap_write_fd(self.await_fd);
346 }
347 }
348
init(&self) -> ErrCode349 pub async fn init(&self) -> ErrCode {
350 if !self.jdwp_listen() {
351 crate::info!("jdwp_listen failed");
352 return ErrCode::ModuleJdwpFailed;
353 }
354
355 self.start_data_looper();
356 set_dev_item("persist.hdc.jdwp", "0");
357 let result = set_dev_item("persist.hdc.jdwp", "1");
358 crate::info!("init set persist.hdc.jdwp to 1 result: {}", result);
359 self.create_fd_event_poll().await;
360 ErrCode::Success
361 }
362 }
363
stop_session_task(session_id: u32)364 pub async fn stop_session_task(session_id: u32) {
365 let jdwp = Jdwp::get_instance();
366 let mut trackers = jdwp.trackers.lock().await;
367 trackers.retain(|x| x.1 != session_id);
368 }
369
stop_task(session_id: u32, channel_id: u32)370 pub async fn stop_task(session_id: u32, channel_id: u32) {
371 let jdwp = Jdwp::get_instance();
372 let mut trackers = jdwp.trackers.lock().await;
373 trackers.retain(|x| x.1 != session_id || x.0 != channel_id);
374 }
375