[ctypes] convert pointer to string?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Neal Becker

    [ctypes] convert pointer to string?

    In an earlier post, I was interested in passing a pointer to a structure to
    fcntl.ioctl.

    This works:

    c = create_string_b uffer (...)
    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(ar gs), c_void_ptr).val ue
    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.

  • marek.rocki@wp.pl

    #2
    Re: [ctypes] convert pointer to string?

    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_b uffer (...)
    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(ar gs), c_void_ptr).val ue
    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(S tructure):
    _fields_ = [("length", c_ulong), ("data", c_void_p)]
    args = eos_dl_args_t()
    fcntl.ioctl(fd, request, byref(args))
    Regards,
    Marek

    Comment

    • Thomas Heller

      #3
      Re: [ctypes] convert pointer to string?

      Neal Becker schrieb:
      In an earlier post, I was interested in passing a pointer to a structure to
      fcntl.ioctl.
      >
      This works:
      >
      c = create_string_b uffer (...)
      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(ar gs), c_void_ptr).val ue
      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.
      >
      ctypes instances support the buffer interface, and you can convert the buffer
      contents into a string:
      >>from ctypes import *
      >>c_int(42)
      c_long(42)
      >>buffer(c_int( 42))
      <read-only buffer for 0x00AE7260, size -1, offset 0 at 0x00B06040>
      >>buffer(c_int( 42))[:]
      '*\x00\x00\x00'
      >>>
      Thomas

      Comment

      • Neal Becker

        #4
        Re: [ctypes] convert pointer to string?

        marek.rocki@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_b uffer (...)
        >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(ar gs), c_void_ptr).val ue
        >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).


        Comment

        • Neal Becker

          #5
          Re: [ctypes] convert pointer to string?

          marek.rocki@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_b uffer (...)
          >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(ar gs), c_void_ptr).val ue
          >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(S tructure):
          > _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


          Comment

          Working...