[EMAIL PROTECTED] 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?).
May fail is exactly what I meant. As written, ioctl will accept a 3rd arg that is either a string or int. In this case, it is int. If the address fits in an int it works, but if the address (which is a long) doesn't fit it fails (gives an overflow error). Seems to be random (as well as platform dependent). -- http://mail.python.org/mailman/listinfo/python-list