2024-05-11 18:39:50 +08:00
|
|
|
From cc090b31139bb9aa0158e50a8a620fc41b23231c Mon Sep 17 00:00:00 2001
|
2024-04-19 16:03:21 +08:00
|
|
|
From: renoseven <dev@renoseven.net>
|
|
|
|
|
Date: Tue, 16 Apr 2024 12:44:11 +0800
|
2024-05-11 18:39:50 +08:00
|
|
|
Subject: [PATCH 08/20] common: impl CStr::from_bytes_with_next_nul()
|
2024-04-19 16:03:21 +08:00
|
|
|
|
|
|
|
|
Signed-off-by: renoseven <dev@renoseven.net>
|
|
|
|
|
---
|
|
|
|
|
syscare-common/src/ffi/c_str.rs | 14 ++++++++++++--
|
|
|
|
|
1 file changed, 12 insertions(+), 2 deletions(-)
|
|
|
|
|
|
|
|
|
|
diff --git a/syscare-common/src/ffi/c_str.rs b/syscare-common/src/ffi/c_str.rs
|
|
|
|
|
index 060149a..4f3f26d 100644
|
|
|
|
|
--- a/syscare-common/src/ffi/c_str.rs
|
|
|
|
|
+++ b/syscare-common/src/ffi/c_str.rs
|
|
|
|
|
@@ -13,7 +13,7 @@
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
use std::{
|
|
|
|
|
- ffi::{CStr, OsStr, OsString},
|
|
|
|
|
+ ffi::{CStr, CString, FromBytesWithNulError, OsStr, OsString},
|
|
|
|
|
os::unix::{ffi::OsStringExt, prelude::OsStrExt},
|
|
|
|
|
path::{Path, PathBuf},
|
|
|
|
|
};
|
|
|
|
|
@@ -34,9 +34,19 @@ pub trait CStrExt: AsRef<CStr> {
|
|
|
|
|
fn to_path_buf(&self) -> PathBuf {
|
|
|
|
|
PathBuf::from(self.to_os_string())
|
|
|
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ fn from_bytes_with_next_nul(bytes: &[u8]) -> Result<&CStr, FromBytesWithNulError> {
|
|
|
|
|
+ let nul_pos = bytes.iter().position(|b| b == &b'\0').unwrap_or(0);
|
|
|
|
|
+ let cstr_bytes = &bytes[..=nul_pos];
|
|
|
|
|
+
|
|
|
|
|
+ CStr::from_bytes_with_nul(cstr_bytes)
|
|
|
|
|
+ }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-impl<T: AsRef<CStr>> CStrExt for T {}
|
|
|
|
|
+impl CStrExt for CStr {}
|
|
|
|
|
+impl CStrExt for &CStr {}
|
|
|
|
|
+impl CStrExt for CString {}
|
|
|
|
|
+impl CStrExt for &CString {}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_cstr() {
|
|
|
|
|
--
|
2024-05-11 18:39:50 +08:00
|
|
|
2.34.1
|
2024-04-19 16:03:21 +08:00
|
|
|
|