-
Notifications
You must be signed in to change notification settings - Fork 781
Open
Description
I use bindgen on the data structure shown, and then I'm left with signed char arrays that require a transmute to treat as bytes. for example:
fn hdr_set_name(hdr: &mut dmi::dm_ioctl, name: &str) -> () {
let name_dest: &mut [u8; DM_NAME_LEN] = unsafe { transmute(&mut hdr.name) };
let bytes = name.as_bytes();
name_dest[..bytes.len()].clone_from_slice(bytes);
}It would be great if bindgen could optionally translate these as unsigned chars instead of signed chars (the default). Or, maybe I'm going about this all wrong??? 😃
Input C/C++ Header
#define DM_NAME_LEN 128
#define DM_UUID_LEN 129
struct dm_ioctl {
char name[DM_NAME_LEN]; /* device name */
char uuid[DM_UUID_LEN]; /* unique identifier for
* the block device */
char data[7]; /* padding or data */
};Bindgen Invocation
let bindings = bindgen::Builder::default()
.header("wrapper.h")
.derive_default(true)
.impl_debug(true)
.generate()
.expect("Unable to generate bindings");Actual Results
# [ repr ( C ) ]
# [ derive ( Copy , Clone ) ]
pub struct dm_ioctl {
pub name: [::std::os::raw::c_char; 128usize],
pub uuid: [::std::os::raw::c_char; 129usize],
pub data: [::std::os::raw::c_char; 7usize],
}Desired results
# [ repr ( C ) ]
# [ derive ( Copy , Clone ) ]
pub struct dm_ioctl {
pub name: [::std::os::raw::c_uchar; 128usize],
pub uuid: [::std::os::raw::c_uchar; 129usize],
pub data: [::std::os::raw::c_uchar; 7usize],
}