CUSE IOCTL使用包含指向字符数组的指针的结构进行回复

时间:2015-09-08 19:56:42

标签: python pointers ctypes fuse

我在ctypesCUSE FUSE部分的帮助下,在python的用户空间中实现了一个设备驱动程序。这不是我的第一个CUSE驱动程序,过去我能够执行以下操作来返回结构。

class tvStruct(Structure):
    _fields_ = [("tv_sec",c_long),
                ("tv_usec",c_long)]

timeval结构可以传递回使用具有适当数字的IOCTL调用的应用程序。以下是CUSE驱动程序的IOCTL文件操作。

def ioctl(self, req, cmd, arg_p, file_info, uflags, in_buff_p, in_bufsz, out_bufsz):
    ioctl = DECODE_IOC(cmd)
    if ioctl == IOC_READ_TIMEVAL:
        if not in_buff_p:
            PyCuse.fuse_reply_ioctl_retry(req,
                                          pointer(PyCuse.iovec(cast(arg_p,c_void_p),
                                          sizeof(tvStruct))),1,
                                          pointer(PyCuse.iovec(cast(arg_p,c_void_p),
                                          sizeof(tvStruct))),1)
        else:
            tvPtr = cast(in_buff_p,POINTER(tvStruct))
            PyCuse.fuse_reply_ioctl(req, 0, tvPtr, sizeof(tvStruct))
    else:
        print("%s Unrecognized IOCTL #...\n",self.devname)
        PyCuse.fuse_reply_err(req,1)

我正在开发的当前驱动程序需要返回一个包含指向字符数组的指针的结构。

# C++ Struct
typedef struct {
    __u16 addr;
    __u16 length;
    __u8* pBuf;
} EEPromData;

# Python Class
class EEPromDataStruct(Structure):
    _fields_ = [("addr",c_ushort),
                ("length",c_ushort),
                ("pBuf",POINTER(c_char))] # I have tried several other ctypes types 
                                          # for `pBuf`, but to no avail yet

据我所知,我无法将指针从Python分配给pBuf,因为它与内存上下文不同。我也明白,使用copy_to_user从内核空间来看这有点容易。我受限于这是一个python应用程序的要求,因为它附加到python GUI。我感谢任何和所有的帮助。

更新1

我知道这可以通过fuse_reply_ioctl_retry方法解决。此方法允许我从应用程序复制数据和向应用程序复制数据。现在的问题是,在第二次调用fuse_reply_ioctl_retry时,FUSE会向应用程序返回错误代码。我会继续尝试解决这个问题,但同时也会感谢任何帮助。感谢。

0 个答案:

没有答案