mod.rs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. use drstd::std as std;
  2. use std::{
  3. num,
  4. vec,
  5. vec::Vec,
  6. string::ToString
  7. };
  8. use crate::{error::SystemError, types::{pid_t, mode_t}, contants::{AF_INET6, IPV6_MIN_MTU, AF_INET, IPV4_MIN_MTU, PRIO_MAX, PRIO_MIN}};
  9. /// @brief 解析布尔值
  10. ///
  11. /// 将传入的字符串解析为布尔值
  12. /// "yes","y","1","true","t","on"均可表示true
  13. /// "no","n","0","false","f","off"均可表示false
  14. ///
  15. /// @param s 需解析的字符串
  16. ///
  17. /// @return 解析成功则返回Ok(解析后的值),否则返回Err
  18. pub fn parse_boolean(s: &str) -> Result<bool,SystemError> {
  19. let t_table: Vec<&str> = vec!["yes","y","1","true","t","on"];
  20. let f_table: Vec<&str> = vec!["no","n","0","false","f","off"];
  21. if t_table.contains(&s) {
  22. return Ok(true);
  23. }else if f_table.contains(&s) {
  24. return Ok(false);
  25. }
  26. return Err(SystemError::EINVAL);
  27. }
  28. /// @brief 解析pid
  29. ///
  30. /// 将传入的字符串解析为pid
  31. ///
  32. /// @param s 需解析的字符串
  33. ///
  34. /// @return 解析成功则返回Ok(解析后的值),否则返回Err
  35. pub fn parse_pid(s: &str) -> Result<pid_t,SystemError>{
  36. let s = s.trim();
  37. //先使用u64变换
  38. let pid_ul = match s.parse::<u64>() {
  39. Ok(val) => val,
  40. Err(_) => {
  41. return Err(SystemError::EINVAL);
  42. }
  43. };
  44. let pid: pid_t = pid_ul as pid_t;
  45. if (pid as u64) != pid_ul {
  46. //如果在从pid_t转换为u64之后与之前不等,则说明发生了截断,返回错误
  47. return Err(SystemError::ERANGE);
  48. }
  49. if pid < 0 {
  50. //pid小于0不合法
  51. return Err(SystemError::EINVAL);
  52. }
  53. return Ok(pid);
  54. }
  55. /// @brief 解析pid
  56. ///
  57. /// 将传入的字符串解析为mode_t
  58. ///
  59. /// @param s 需解析的字符串
  60. ///
  61. /// @return 解析成功则返回Ok(解析后的值),否则返回Err
  62. pub fn parse_mode(s: &str) -> Result<mode_t,SystemError> {
  63. let s = s.trim();
  64. let m = match u32::from_str_radix(s, 8) {
  65. Ok(val) => val,
  66. Err(_) => {
  67. return Err(SystemError::EINVAL);
  68. }
  69. };
  70. //如果模式大于权限的最大值则为非法权限,返回错误
  71. if m > 0o7777 {
  72. return Err(SystemError::ERANGE);
  73. }
  74. return Ok(m);
  75. }
  76. /// @brief 解析网络接口索引
  77. ///
  78. /// 将传入的字符串解析为网络接口索引具体值
  79. ///
  80. /// @param s 需解析的字符串
  81. ///
  82. /// @return 解析成功则返回Ok(解析后的值),否则返回Err
  83. pub fn parse_ifindex(s: &str) -> Result<i32,SystemError> {
  84. let s = s.trim();
  85. let ret: i32 = match s.parse::<i32>(){
  86. Ok(val) => val,
  87. Err(_) => {
  88. return Err(SystemError::EINVAL);
  89. }
  90. };
  91. if ret <= 0 {
  92. return Err(SystemError::EINVAL);
  93. }
  94. return Ok(ret);
  95. }
  96. /// @brief 解析最大传输单元(MTU)
  97. ///
  98. /// 将传入的字符串解析为具体值
  99. ///
  100. /// @param s 需解析的字符串
  101. ///
  102. /// @param family 网络地址族
  103. ///
  104. /// @return 解析成功则返回Ok(解析后的值),否则返回Err
  105. pub fn parse_mtu(s: &str,family: i32) -> Result<u32,SystemError> {
  106. let s = s.trim();
  107. let mtu = match s.parse::<u64>() {
  108. Ok(val) => val,
  109. Err(_) => {
  110. //针对非法字符出错时
  111. return Err(SystemError::EINVAL);
  112. }
  113. };
  114. //针对数据溢出时的报错
  115. if mtu > u32::MAX as u64 {
  116. return Err(SystemError::ERANGE);
  117. }
  118. let mtu: u32 = mtu as u32;
  119. let mut min_mtu: u32 = 0;
  120. //判断mtu是否合法
  121. if family == AF_INET6 {
  122. min_mtu = IPV6_MIN_MTU;
  123. }else if family == AF_INET {
  124. min_mtu = IPV4_MIN_MTU;
  125. }else {
  126. return Err(SystemError::EINVAL);
  127. }
  128. return Ok(mtu);
  129. }
  130. #[derive(PartialEq)]
  131. pub enum SizeBase {
  132. IEC,
  133. Si
  134. }
  135. struct BaseMapper<'a> {
  136. suffix: &'a str,
  137. factor: u64
  138. }
  139. // IEC表
  140. const BASE_IEC:[BaseMapper;8] = [
  141. BaseMapper{ suffix: "E", factor: 1024u64*1024u64*1024u64*1024u64*1024u64*1024u64 },
  142. BaseMapper{ suffix: "P", factor: 1024u64*1024u64*1024u64*1024u64*1024u64 },
  143. BaseMapper{ suffix: "T", factor: 1024u64*1024u64*1024u64*1024u64 },
  144. BaseMapper{ suffix: "G", factor: 1024u64*1024u64*1024u64 },
  145. BaseMapper{ suffix: "M", factor: 1024u64*1024u64 },
  146. BaseMapper{ suffix: "K", factor: 1024u64 },
  147. BaseMapper{ suffix: "B", factor: 1u64 },
  148. BaseMapper{ suffix: "", factor: 1u64 },
  149. ];
  150. // SI表
  151. const BASE_SI:[BaseMapper;8] = [
  152. BaseMapper{ suffix: "E", factor: 1000u64*1000u64*1000u64*1000u64*1000u64*1000u64 },
  153. BaseMapper{ suffix: "P", factor: 1000u64*1000u64*1000u64*1000u64*1000u64 },
  154. BaseMapper{ suffix: "T", factor: 1000u64*1000u64*1000u64*1000u64 },
  155. BaseMapper{ suffix: "G", factor: 1000u64*1000u64*1000u64 },
  156. BaseMapper{ suffix: "M", factor: 1000u64*1000u64 },
  157. BaseMapper{ suffix: "K", factor: 1000u64 },
  158. BaseMapper{ suffix: "B", factor: 1u64 },
  159. BaseMapper{ suffix: "", factor: 1u64 },
  160. ];
  161. /// @brief 解析Size
  162. ///
  163. /// 将传入的字符串解析为具体的字节数
  164. /// 可支持IEC二进制后缀,也可支持SI十进制后缀
  165. ///
  166. /// @param s 需解析的字符串
  167. ///
  168. /// @param base 设置为IEC二进制后缀或者SI十进制后缀
  169. ///
  170. /// @return 解析成功则返回Ok(解析后的值),否则返回Err
  171. pub fn parse_size(s: &str, base: SizeBase) -> Result<u64, SystemError> {
  172. let s = s.trim();
  173. //将s分解为数字和后缀部分
  174. let (number_str,suffix) = match s.find(|c: char| !c.is_digit(10) && c != '.'){
  175. Some(mid) => s.split_at(mid),
  176. None => (s,"")
  177. };
  178. //获得数字部分的整数和小数部分
  179. let (integer, fraction) = match number_str.find(".") {
  180. Some(mid) => {
  181. let (integer, fraction) = number_str.split_at(mid);
  182. let integer = integer.parse::<u64>().unwrap();
  183. let fraction = match fraction[1..].parse::<u64>() {
  184. Ok(val) => val,
  185. Err(_) => {
  186. return Err(SystemError::EINVAL);
  187. }
  188. };
  189. (integer,fraction)
  190. }
  191. None => (number_str.parse::<u64>().unwrap(),0)
  192. };
  193. //从表中查找到后缀所对应的字节倍数
  194. let mut factor: u64 = 0;
  195. if base == SizeBase::IEC {
  196. factor = match BASE_IEC.iter().find(|mapper|mapper.suffix == suffix) {
  197. Some(val) => val.factor,
  198. None => {
  199. return Err(SystemError::EINVAL);
  200. }
  201. }
  202. } else if base == SizeBase::Si {
  203. factor = match BASE_SI.iter().find(|mapper|mapper.suffix == suffix) {
  204. Some(val) => val.factor,
  205. None => {
  206. return Err(SystemError::EINVAL);
  207. }
  208. }
  209. }
  210. Ok(integer*factor + (fraction*factor)/(10u64.pow(fraction.to_string().len() as u32)))
  211. }
  212. /// @brief 解析扇区大小
  213. ///
  214. /// 将传入的字符串解析为具体的扇区大小
  215. /// 若扇区大小小于512或者大于4096,将会返回错误,若扇区大小不为2的幂,返回错误。
  216. ///
  217. /// @param s 需解析的字符串
  218. ///
  219. /// @return 解析成功则返回Ok(解析后的值),否则返回Err
  220. pub fn parse_sector_size(s: &str) -> Result<u64,SystemError> {
  221. let s = s.trim();
  222. let size: u64 = match s.parse::<u64>(){
  223. Ok(val) => val,
  224. Err(_) => {
  225. return Err(SystemError::EINVAL);
  226. }
  227. };
  228. if size < 512 || size > 4096 {
  229. return Err(SystemError::ERANGE);
  230. }
  231. //判断是否为2的幂,如果不是则报错
  232. if (size & (size - 1)) != 0 {
  233. return Err(SystemError::EINVAL);
  234. }
  235. return Ok(size);
  236. }
  237. /// @brief 解析范围
  238. ///
  239. /// 将传入的字符串解析为具体的范围
  240. ///
  241. /// @param s 需解析的字符串
  242. ///
  243. /// @return 解析成功则返回Ok(解析后的值),否则返回Err
  244. pub fn parse_range(s: &str) -> Result<(u32,u32),SystemError> {
  245. let mid = match s.find('-') {
  246. Some(val) => val,
  247. None =>{
  248. //如果字符串中没有'-'符号,则表示一个值,所以范围两端都为该值
  249. let s = s.trim();
  250. let ret = match s.parse::<u32>() {
  251. Ok(val) => val,
  252. Err(_) => {
  253. return Err(SystemError::EINVAL);
  254. }
  255. };
  256. return Ok((ret,ret));
  257. }
  258. };
  259. //若字符串中存在'-',则分别解析为u32,解析失败则报错
  260. let (l,r) = s.split_at(mid);
  261. let l = l.trim();
  262. let l = match l.parse::<u32>(){
  263. Ok(val) => val,
  264. Err(_) => {
  265. return Err(SystemError::EINVAL);
  266. }
  267. };
  268. let r = r.trim();
  269. let r = match r.parse::<u32>(){
  270. Ok(val) => val,
  271. Err(_) => {
  272. return Err(SystemError::EINVAL);
  273. }
  274. };
  275. return Ok((l,r));
  276. }
  277. /// @brief 解析文件描述符
  278. ///
  279. /// 将传入的字符串解析为文件描述符fd
  280. ///
  281. /// @param s 需解析的字符串
  282. ///
  283. /// @return 解析成功则返回Ok(解析后的值),否则返回Err
  284. pub fn parse_fd(s: &str) -> Result<i32,SystemError> {
  285. let s = s.trim();
  286. let fd = match s.parse::<i32>() {
  287. Ok(val) => val,
  288. Err(_) => {
  289. return Err(SystemError::EINVAL);
  290. }
  291. };
  292. if fd < 0 {
  293. return Err(SystemError::EBADF);
  294. }
  295. return Ok(fd);
  296. }
  297. /// @brief 解析nice
  298. ///
  299. /// 将传入的字符串解析为nice
  300. ///
  301. /// @param s 需解析的字符串
  302. ///
  303. /// @return 解析成功则返回Ok(解析后的值),否则返回Err
  304. pub fn parse_nice(s: &str) -> Result<i8,SystemError> {
  305. let s = s.trim();
  306. let nice = match s.parse::<i8>() {
  307. Ok(val) => val,
  308. Err(_) => {
  309. return Err(SystemError::EINVAL);
  310. }
  311. };
  312. if nice > PRIO_MAX || nice < PRIO_MIN {
  313. return Err(SystemError::ERANGE);
  314. }
  315. return Ok(nice);
  316. }
  317. /// @brief 解析端口号
  318. ///
  319. /// 将传入的字符串解析为端口号
  320. ///
  321. /// @param s 需解析的字符串
  322. ///
  323. /// @return 解析成功则返回Ok(解析后的值),否则返回Err
  324. pub fn parse_ip_port(s: &str) -> Result<u16,SystemError> {
  325. let s = s.trim();
  326. let port = match s.parse::<u16>() {
  327. Ok(val) => val,
  328. Err(_) => {
  329. return Err(SystemError::EINVAL);
  330. }
  331. };
  332. if port == 0 {
  333. return Err(SystemError::EINVAL);
  334. }
  335. return Ok(port);
  336. }
  337. /// @brief 解析端口范围
  338. ///
  339. /// 将传入的字符串解析为端口范围
  340. ///
  341. /// @param s 需解析的字符串
  342. ///
  343. /// @return 解析成功则返回Ok((u16,u16)),否则返回Err
  344. pub fn parse_ip_port_range(s: &str) -> Result<(u16,u16),SystemError> {
  345. let (l,h) = parse_range(s)?;
  346. let l = l as u16;
  347. let h = h as u16;
  348. if l <=0 || l >= 65535 || h <= 0 || h >= 65535 {
  349. return Err(SystemError::EINVAL);
  350. }
  351. return Ok((l,h));
  352. }
  353. /// @brief 解析OOM(Out-of-Memory)分数调整值
  354. ///
  355. /// 将传入的字符串解析为OOM(Out-of-Memory)分数调整值
  356. ///
  357. /// @param s 需解析的字符串
  358. ///
  359. /// @return 解析成功则返回Ok(u32),否则返回Err
  360. pub fn parse_ip_prefix_length(s: &str) -> Result<u32,SystemError> {
  361. let len = match s.parse::<u32>() {
  362. Ok(val) => val,
  363. Err(_) => {
  364. return Err(SystemError::EINVAL);
  365. }
  366. };
  367. if len > 128 {
  368. return Err(SystemError::ERANGE);
  369. }
  370. return Ok(len);
  371. }