lib.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. mod raw_fn;
  2. pub mod error;
  3. pub mod afs;
  4. pub mod bep_ovfs;
  5. use std::sync::OnceLock;
  6. use std::env;
  7. use crate::error::MkdirError;
  8. #[no_mangle]
  9. pub extern "C" fn auto_mount() -> i32 {
  10. AUTO_MOUNT_HANDLER.get().unwrap()()
  11. }
  12. type AutoMountHandler = fn() -> i32;
  13. pub static AUTO_MOUNT_HANDLER: OnceLock<AutoMountHandler> = OnceLock::new();
  14. pub fn set_auto_mount_handler(handler: AutoMountHandler) {
  15. AUTO_MOUNT_HANDLER.set(handler).unwrap();
  16. }
  17. /// Get API version
  18. /// returns the Major Version, Minor Version and Patch Version
  19. pub fn api_ver_get() -> (i32, i32, i32) {
  20. let mut maj: i32 = 0;
  21. let mut min: i32 = 0;
  22. let mut pat: i32 = 0;
  23. unsafe {
  24. raw_fn::api_ver_get(&mut maj, &mut min, &mut pat);
  25. }
  26. (maj, min, pat)
  27. }
  28. /// Check if key exists in exkv
  29. pub fn exkv_has_key(key: &str) -> bool {
  30. let ret = unsafe {
  31. raw_fn::exkv_get_len(key.as_ptr(), key.len())
  32. };
  33. ret >= 0
  34. }
  35. /// Get value of key in exkv
  36. pub fn exkv_get(key: &str) ->Result<Vec<u8>, error::GetKeyError> {
  37. let ret = unsafe {
  38. raw_fn::exkv_get_len(key.as_ptr(), key.len())
  39. };
  40. let len: usize = match ret {
  41. -2 => return Err(error::GetKeyError::KeyNotExists),
  42. -1 => return Err(error::GetKeyError::InternalError(
  43. String::from("exkv_get_len: reading key from memory out of bounds")
  44. )),
  45. v if v > 0 => v.try_into().unwrap(),
  46. _ => return Err(error::GetKeyError::InternalError(
  47. format!("exkv_get_len: unknown error: code = {}", ret)
  48. )),
  49. };
  50. let mut buf = vec![0; len as usize];
  51. let ret = unsafe {
  52. raw_fn::exkv_get_val(key.as_ptr(), key.len(), buf.as_mut_ptr(), len)
  53. };
  54. match ret {
  55. -3 => Err(error::GetKeyError::InternalError(
  56. String::from("exkv_get_val: reading key from memory out of bounds")
  57. )),
  58. -2 => Err(error::GetKeyError::KeyNotExists),
  59. -1 => Err(error::GetKeyError::InternalError(
  60. String::from("exkv_get_val: writing value to buffer memory out of bounds")
  61. )),
  62. 0 => Err(error::GetKeyError::InternalError(
  63. String::from("exkv_get_val: buffer length <= 0")
  64. )),
  65. v if v >= 0 => if <i32 as TryInto<usize>>::try_into(v).unwrap() == len { Ok(buf) } else{
  66. Err(error::GetKeyError::InternalError(
  67. format!("exkv_get_val: length not match: value len={}, write to buffer {} bytes", len, v)
  68. ))
  69. },
  70. _ => Err(error::GetKeyError::InternalError(
  71. format!("exkv_get_val: unknown error: code = {}", ret)
  72. ))
  73. }
  74. }
  75. /// Create directory for prepare mount point. Works like `mkdir -p`.
  76. pub fn vfs_mkdir(path: &str, mode: i32) -> Result<(), MkdirError> {
  77. let r = unsafe {
  78. raw_fn::vfs_mkdir(path.as_ptr(), path.len(), mode)
  79. };
  80. match r {
  81. 0 => Ok(()),
  82. -1 => Err(MkdirError::InternalError(
  83. String::from("vfs_mkdir: reading path from memory out of bounds")
  84. )),
  85. -2 => Err(MkdirError::InternalError(
  86. String::from("vfs_mkdir: failed create directory: see logs.")
  87. )),
  88. _ => Err(MkdirError::InternalError(
  89. format!("vfs_mkdir: unknown error: code = {}", r)
  90. )),
  91. }
  92. }
  93. /// Get app name form env variable 'NAGAE_APP_NAME'
  94. pub fn get_app_name() -> String {
  95. let key = "NAGAE_APP_NAME";
  96. match env::var(key) {
  97. Ok(val) => val,
  98. Err(e) => match e {
  99. std::env::VarError::NotPresent => String::new(),
  100. std::env::VarError::NotUnicode(v) => {
  101. panic!("env variable {} is not unicode: {:?}", key, v)
  102. }
  103. },
  104. }
  105. }
  106. /// Get nagae rov root path from env variable 'NAGAE_ROV_ROOT'
  107. pub fn get_nagae_rov_root() -> String {
  108. let key = "NAGAE_ROV_ROOT";
  109. match env::var(key) {
  110. Ok(val) => val,
  111. Err(e) => match e {
  112. std::env::VarError::NotPresent => String::new(),
  113. std::env::VarError::NotUnicode(v) => {
  114. panic!("env variable {} is not unicode: {:?}", key, v)
  115. }
  116. },
  117. }
  118. }