Skip to content

Replaces annotations don't work with base types #1144

@agrover

Description

@agrover

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],
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions