[ctypes] convert pointer to string?

Neal Becker ndbecker2 at gmail.com
Wed May 21 12:54:32 EDT 2008


marek.rocki at wp.pl wrote:

> Neal Becker napisał(a):
>> In an earlier post, I was interested in passing a pointer to a structure
>> to fcntl.ioctl.
>>
>> This works:
>>
>> c = create_string_buffer (...)
>> args = struct.pack("iP", len(c), cast (pointer (c), c_void_p).value)
>> err = fcntl.ioctl(eos_fd, request, args)
>>
>> Now to do the same with ctypes, I have one problem.
>>
>> class eos_dl_args_t (Structure):
>>     _fields_ = [("length", c_ulong),
>>                 ("data", c_void_p)]
>> ...
>> args = eos_dl_args_t()
>> args_p = cast(pointer(args), c_void_ptr).value
>> fcntl.ioctl(fd, request, args_p)  <<< May fail here
>>
>> That last may fail, because .value creates a long int, and ioctl needs a
>> string.
>>
>> How can I convert my ctypes structure to a string?  It _cannot_ be a
>> c-style 0-terminate string, because the structure may contain '0' values.
> 
> Hello. I'm not completely sure what your problem is ("may fail" is not
> a good description. Does it fail or does it not?). If you want a
> pointer to a structure as the third argument to ioctl, this would be
> imho the easiest way to do it with ctypes:
> 
>> class eos_dl_args_t(Structure):
>>     _fields_ = [("length", c_ulong), ("data", c_void_p)]
>> args = eos_dl_args_t()
>> fcntl.ioctl(fd, request, byref(args))
> 

Seems to be a problem with that:
---> 59 err = fcntl.ioctl(eos_fd, request, byref(args))
     60 

TypeError: an integer is required





More information about the Python-list mailing list