I'm developing a device driver module and associated user libraries to handle the ioctl()
calls. The library takes the pertinent info and puts it into a struct, which gets passed into the driver module and unpacked there and then dealt with (I'm omitting a lot of steps, but that's the overall idea).
Some of the data being passed through the struct via the ioctl()
is uint32_t
type. I've discovered that that type is defined in <stdint.h>
AND <linux/types.h>
. So far I've been using <linux/types.h>
to define that value, including down in the user libraries. But I understand it is bad form to use <linux/*.h>
libraries in user space, so if I remove those and use <stdint.h>
instead, then when my driver module includes the struct definition, it will have to be including <stdint.h>
also.
It seems to me that the point of <linux/types.h>
is to define types in kernel files, so I'm not sure if that means using <stdint.h>
is bad idea there. I also found that when trying to compile my driver module with <stdint.h>
, I get compilation errors about redefinitions that won't go away, even if I replace all instances of <linux/types.h>
with <stdint.h>
(and put it on the top of the include order).
- Is it a bad idea to use linux/*.h includes in user-space code?
- Is it a bad idea to use
<stdint.h>
in kernel-space code? - If the answers to both of those is yes, then how do I handle the situation where a structure containing
uint32_t
is shared by both the user library and the driver module?