|
1 | 1 | #[cfg(test)] |
2 | 2 | use std::time::{SystemTime, UNIX_EPOCH}; |
3 | | -use std::{ffi::CStr, os::raw::c_char, path::PathBuf}; |
| 3 | +use std::{ |
| 4 | + ffi::{CStr, OsString}, |
| 5 | + os::{raw::c_char, unix::ffi::OsStringExt}, |
| 6 | + path::PathBuf, |
| 7 | +}; |
4 | 8 |
|
5 | 9 | use serde::Serialize; |
6 | 10 |
|
7 | | -use fact_ebpf::{event_t, file_activity_type_t, inode_key_t, PATH_MAX}; |
| 11 | +use fact_ebpf::{event_t, file_activity_type_t, inode_key_t}; |
8 | 12 |
|
9 | 13 | use crate::host_info; |
10 | 14 | use process::Process; |
11 | 15 |
|
12 | 16 | pub(crate) mod process; |
13 | 17 |
|
| 18 | +fn slice_to_pathbuf(s: &[c_char]) -> PathBuf { |
| 19 | + #[cfg(target_arch = "x86_64")] |
| 20 | + let v = s.iter().map(|c| *c as u8).collect::<Vec<u8>>(); |
| 21 | + #[cfg(not(target_arch = "x86_64"))] |
| 22 | + let v = s.to_vec(); |
| 23 | + OsString::from_vec(v).into() |
| 24 | +} |
| 25 | + |
14 | 26 | fn slice_to_string(s: &[c_char]) -> anyhow::Result<String> { |
15 | 27 | Ok(unsafe { CStr::from_ptr(s.as_ptr()) }.to_str()?.to_owned()) |
16 | 28 | } |
@@ -85,7 +97,9 @@ impl TryFrom<&event_t> for Event { |
85 | 97 | fn try_from(value: &event_t) -> Result<Self, Self::Error> { |
86 | 98 | let process = Process::try_from(value.process)?; |
87 | 99 | let timestamp = host_info::get_boot_time() + value.timestamp; |
88 | | - let file = FileData::new(value.type_, value.filename, value.inode)?; |
| 100 | + let filename_len = value.filename_len as usize; |
| 101 | + let (filename, _) = value.filename.as_slice().split_at(filename_len - 1); |
| 102 | + let file = FileData::new(value.type_, filename, value.inode)?; |
89 | 103 |
|
90 | 104 | Ok(Event { |
91 | 105 | timestamp, |
@@ -128,7 +142,7 @@ pub enum FileData { |
128 | 142 | impl FileData { |
129 | 143 | pub fn new( |
130 | 144 | event_type: file_activity_type_t, |
131 | | - filename: [c_char; PATH_MAX as usize], |
| 145 | + filename: &[c_char], |
132 | 146 | inode: inode_key_t, |
133 | 147 | ) -> anyhow::Result<Self> { |
134 | 148 | let inner = BaseFileData::new(filename, inode)?; |
@@ -185,8 +199,8 @@ pub struct BaseFileData { |
185 | 199 | } |
186 | 200 |
|
187 | 201 | impl BaseFileData { |
188 | | - pub fn new(filename: [c_char; PATH_MAX as usize], inode: inode_key_t) -> anyhow::Result<Self> { |
189 | | - let filename = slice_to_string(&filename)?.into(); |
| 202 | + pub fn new(filename: &[c_char], inode: inode_key_t) -> anyhow::Result<Self> { |
| 203 | + let filename = slice_to_pathbuf(filename); |
190 | 204 |
|
191 | 205 | Ok(BaseFileData { |
192 | 206 | filename, |
|
0 commit comments