1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
/*
Copyright (c) 2024-present, Alessandro Gario
All rights reserved.
This source code is licensed in accordance with the terms specified in
the LICENSE file found in the root directory of this source tree.
*/
use crate::btf::{
parse_string, Error as BTFError, ErrorKind as BTFErrorKind, FileHeader, Header, Kind,
Result as BTFResult, Type,
};
use crate::define_type;
use crate::utils::Reader;
/// Fwd data
#[derive(Debug, Clone)]
struct Data {
/// The fwd type name
name: Option<String>,
/// The forwarded type id
tid: u32,
}
impl Data {
/// The size of the extra data
pub fn size(_type_header: &Header) -> usize {
0
}
/// Creates a new `Data` object
pub fn new(
reader: &mut Reader,
file_header: &FileHeader,
type_header: &Header,
) -> BTFResult<Self> {
let name = if type_header.name_offset() != 0 {
Some(parse_string(
reader,
file_header,
type_header.name_offset(),
)?)
} else {
None
};
Ok(Self {
name,
tid: type_header.size_or_type(),
})
}
}
define_type!(Fwd, Data,
name: Option<String>,
tid: u32);
#[cfg(test)]
mod tests {
use super::Fwd;
use crate::btf::{FileHeader, Header};
use crate::utils::{ReadableBuffer, Reader};
#[test]
fn test_fwd() {
let readable_buffer = ReadableBuffer::new(&[
//
// BTF header
//
0x9F, 0xEB, // magic
0x01, // version
0x00, // flags
0x18, 0x00, 0x00, 0x00, // hdr_len
0x00, 0x00, 0x00, 0x00, // type_off
0x0C, 0x00, 0x00, 0x00, // type_len
0x0C, 0x00, 0x00, 0x00, // str_off
0x06, 0x00, 0x00, 0x00, // str_len
//
// Type section
//
0x01, 0x00, 0x00, 0x00, // type header: name_offset
0x00, 0x00, 0x00, 0x07, // type header: info_flags
0x03, 0x00, 0x00, 0x00, // type header: size_or_type
//
// String section
//
0x00, // mandatory null string
0x65, 0x78, 0x69, 0x74, 0x00, // "exit"
]);
let mut reader = Reader::new(&readable_buffer);
let file_header = FileHeader::new(&mut reader).unwrap();
let type_header = Header::new(&mut reader, &file_header).unwrap();
let fwd = Fwd::new(&mut reader, &file_header, type_header).unwrap();
assert_eq!(fwd.name().as_deref(), Some("exit"));
}
}