On Sun, Dec 27, 2009 at 10:10 AM, Roman Yakovenko
<roman.yakove...@gmail.com> wrote:
> On Sun, Dec 27, 2009 at 2:46 AM, Nikolaus Rath <nikol...@rath.org> wrote:
>> Hi,
>>
>> Thanks for looking into this. I'm afraid the fix for the CFUNCTYPE vs
>> POINTER(CFUNCTYPE) issue is not completely working though.
>>
>> The small testcase that I send around indeed generates correct code with the
>> new version. However, if you try the same code on a more complex header
>> (like the attached one, needs fuse headers to be installed) it still
>> produces the wrong result:
>>
>>
>> fuse_lowlevel_ops._fields_ = [ #class fuse_lowlevel_ops
>>    ("init", ctypes.POINTER( ctypes.CFUNCTYPE( None, ctypes.c_void_p, 
>> ctypes.POINTER( fuse_conn_info ) ) )),
>>    ("destroy", ctypes.POINTER( ctypes.CFUNCTYPE( None, ctypes.c_void_p
>>    ) )),
>> [...]
>
> :-(. I will take a look on this today.

Nikolaus, unfortunately I can't reproduce the error. I attached the
generated file and the "source" file.

Can you investigate a little bit more?

Thanks.

-- 
Roman Yakovenko
C++ Python language binding
http://www.language-binding.net/

Attachment: fuse_ctypes.h
Description: unknown/unknown

# This file has been generated by Py++.

import ctypes

import ctypes_utils

libfuse_lib = ctypes.CDLL( r"libfuse.so" )

libfuse_lib.undecorated_names = {#mapping between decorated and undecorated names
    "extern int fuse_session_loop_mt(fuse_session * se) [free function]" : "fuse_session_loop_mt", 
    "extern int fuse_reply_statfs(fuse_req_t req, statvfs const * stbuf) [free function]" : "fuse_reply_statfs", 
    "extern int fuse_reply_iov(fuse_req_t req, iovec const * iov, int count) [free function]" : "fuse_reply_iov", 
    "extern void fuse_opt_free_args(fuse_args * args) [free function]" : "fuse_opt_free_args", 
    "extern void fuse_reply_none(fuse_req_t req) [free function]" : "fuse_reply_none", 
    "extern int fuse_reply_write(fuse_req_t req, size_t count) [free function]" : "fuse_reply_write", 
    "extern int fuse_reply_err(fuse_req_t req, int err) [free function]" : "fuse_reply_err", 
    "extern fuse_session * fuse_lowlevel_new(fuse_args * args, fuse_lowlevel_ops const * op, size_t op_size, void * userdata) [free function]" : "fuse_lowlevel_new", 
    "extern int fuse_reply_readlink(fuse_req_t req, char const * link) [free function]" : "fuse_reply_readlink", 
    "extern int fuse_opt_add_arg(fuse_args * args, char const * arg) [free function]" : "fuse_opt_add_arg", 
    "extern int fuse_req_interrupted(fuse_req_t req) [free function]" : "fuse_req_interrupted", 
    "extern void fuse_unmount(char const * mountpoint, fuse_chan * ch) [free function]" : "fuse_unmount", 
    "extern void fuse_session_remove_chan(fuse_chan * ch) [free function]" : "fuse_session_remove_chan", 
    "extern fuse_session * fuse_session_new(fuse_session_ops * op, void * data) [free function]" : "fuse_session_new", 
    "extern int fuse_chan_recv(fuse_chan * * ch, char * buf, size_t size) [free function]" : "fuse_chan_recv", 
    "extern size_t fuse_chan_bufsize(fuse_chan * ch) [free function]" : "fuse_chan_bufsize", 
    "extern int fuse_chan_fd(fuse_chan * ch) [free function]" : "fuse_chan_fd", 
    "extern void fuse_session_process(fuse_session * se, char const * buf, size_t len, fuse_chan * ch) [free function]" : "fuse_session_process", 
    "extern void fuse_session_add_chan(fuse_session * se, fuse_chan * ch) [free function]" : "fuse_session_add_chan", 
    "extern int fuse_session_loop(fuse_session * se) [free function]" : "fuse_session_loop", 
    "extern fuse_chan * fuse_mount(char const * mountpoint, fuse_args * args) [free function]" : "fuse_mount", 
    "extern int fuse_session_exited(fuse_session * se) [free function]" : "fuse_session_exited", 
    "extern void fuse_req_interrupt_func(fuse_req_t req, fuse_interrupt_func_t func, void * data) [free function]" : "fuse_req_interrupt_func", 
    "extern void fuse_remove_signal_handlers(fuse_session * se) [free function]" : "fuse_remove_signal_handlers", 
    "extern fuse_session * fuse_chan_session(fuse_chan * ch) [free function]" : "fuse_chan_session", 
    "extern int fuse_opt_add_opt(char * * opts, char const * opt) [free function]" : "fuse_opt_add_opt", 
    "extern int fuse_opt_insert_arg(fuse_args * args, int pos, char const * arg) [free function]" : "fuse_opt_insert_arg", 
    "extern int fuse_parse_cmdline(fuse_args * args, char * * mountpoint, int * multithreaded, int * foreground) [free function]" : "fuse_parse_cmdline", 
    "extern int fuse_reply_xattr(fuse_req_t req, size_t count) [free function]" : "fuse_reply_xattr", 
    "extern int fuse_reply_lock(fuse_req_t req, flock * lock) [free function]" : "fuse_reply_lock", 
    "extern void * fuse_req_userdata(fuse_req_t req) [free function]" : "fuse_req_userdata", 
    "extern int fuse_opt_parse(fuse_args * args, void * data, fuse_opt const * opts, fuse_opt_proc_t proc) [free function]" : "fuse_opt_parse", 
    "extern int fuse_lowlevel_is_lib_option(char const * opt) [free function]" : "fuse_lowlevel_is_lib_option", 
    "extern int fuse_reply_buf(fuse_req_t req, char const * buf, size_t size) [free function]" : "fuse_reply_buf", 
    "extern void * fuse_chan_data(fuse_chan * ch) [free function]" : "fuse_chan_data", 
    "extern int fuse_chan_send(fuse_chan * ch, iovec const * iov, size_t count) [free function]" : "fuse_chan_send", 
    "extern int fuse_reply_entry(fuse_req_t req, fuse_entry_param const * e) [free function]" : "fuse_reply_entry", 
    "extern void fuse_session_exit(fuse_session * se) [free function]" : "fuse_session_exit", 
    "extern int fuse_reply_attr(fuse_req_t req, stat const * attr, double attr_timeout) [free function]" : "fuse_reply_attr", 
    "extern void fuse_session_reset(fuse_session * se) [free function]" : "fuse_session_reset", 
    "extern int fuse_reply_create(fuse_req_t req, fuse_entry_param const * e, fuse_file_info const * fi) [free function]" : "fuse_reply_create", 
    "extern int fuse_reply_open(fuse_req_t req, fuse_file_info const * fi) [free function]" : "fuse_reply_open", 
    "extern size_t fuse_add_direntry(fuse_req_t req, char * buf, size_t bufsize, char const * name, stat const * stbuf, off_t off) [free function]" : "fuse_add_direntry", 
    "extern void fuse_session_destroy(fuse_session * se) [free function]" : "fuse_session_destroy", 
    "extern int fuse_set_signal_handlers(fuse_session * se) [free function]" : "fuse_set_signal_handlers", 
    "extern int fuse_opt_match(fuse_opt const * opts, char const * opt) [free function]" : "fuse_opt_match", 
    "extern void fuse_chan_destroy(fuse_chan * ch) [free function]" : "fuse_chan_destroy", 
    "extern int fuse_daemonize(int foreground) [free function]" : "fuse_daemonize", 
    "extern fuse_chan * fuse_session_next_chan(fuse_session * se, fuse_chan * ch) [free function]" : "fuse_session_next_chan", 
    "extern int fuse_version() [free function]" : "fuse_version", 
    "extern fuse_ctx const * fuse_req_ctx(fuse_req_t req) [free function]" : "fuse_req_ctx", 
    "fuse_session_loop_mt" : "extern int fuse_session_loop_mt(fuse_session * se) [free function]", 
    "fuse_reply_statfs" : "extern int fuse_reply_statfs(fuse_req_t req, statvfs const * stbuf) [free function]", 
    "fuse_reply_iov" : "extern int fuse_reply_iov(fuse_req_t req, iovec const * iov, int count) [free function]", 
    "fuse_opt_free_args" : "extern void fuse_opt_free_args(fuse_args * args) [free function]", 
    "fuse_reply_none" : "extern void fuse_reply_none(fuse_req_t req) [free function]", 
    "fuse_reply_write" : "extern int fuse_reply_write(fuse_req_t req, size_t count) [free function]", 
    "fuse_reply_err" : "extern int fuse_reply_err(fuse_req_t req, int err) [free function]", 
    "fuse_lowlevel_new" : "extern fuse_session * fuse_lowlevel_new(fuse_args * args, fuse_lowlevel_ops const * op, size_t op_size, void * userdata) [free function]", 
    "fuse_reply_readlink" : "extern int fuse_reply_readlink(fuse_req_t req, char const * link) [free function]", 
    "fuse_opt_add_arg" : "extern int fuse_opt_add_arg(fuse_args * args, char const * arg) [free function]", 
    "fuse_req_interrupted" : "extern int fuse_req_interrupted(fuse_req_t req) [free function]", 
    "fuse_unmount" : "extern void fuse_unmount(char const * mountpoint, fuse_chan * ch) [free function]", 
    "fuse_session_remove_chan" : "extern void fuse_session_remove_chan(fuse_chan * ch) [free function]", 
    "fuse_session_new" : "extern fuse_session * fuse_session_new(fuse_session_ops * op, void * data) [free function]", 
    "fuse_chan_recv" : "extern int fuse_chan_recv(fuse_chan * * ch, char * buf, size_t size) [free function]", 
    "fuse_chan_bufsize" : "extern size_t fuse_chan_bufsize(fuse_chan * ch) [free function]", 
    "fuse_chan_fd" : "extern int fuse_chan_fd(fuse_chan * ch) [free function]", 
    "fuse_session_process" : "extern void fuse_session_process(fuse_session * se, char const * buf, size_t len, fuse_chan * ch) [free function]", 
    "fuse_session_add_chan" : "extern void fuse_session_add_chan(fuse_session * se, fuse_chan * ch) [free function]", 
    "fuse_session_loop" : "extern int fuse_session_loop(fuse_session * se) [free function]", 
    "fuse_mount" : "extern fuse_chan * fuse_mount(char const * mountpoint, fuse_args * args) [free function]", 
    "fuse_session_exited" : "extern int fuse_session_exited(fuse_session * se) [free function]", 
    "fuse_req_interrupt_func" : "extern void fuse_req_interrupt_func(fuse_req_t req, fuse_interrupt_func_t func, void * data) [free function]", 
    "fuse_remove_signal_handlers" : "extern void fuse_remove_signal_handlers(fuse_session * se) [free function]", 
    "fuse_chan_session" : "extern fuse_session * fuse_chan_session(fuse_chan * ch) [free function]", 
    "fuse_opt_add_opt" : "extern int fuse_opt_add_opt(char * * opts, char const * opt) [free function]", 
    "fuse_opt_insert_arg" : "extern int fuse_opt_insert_arg(fuse_args * args, int pos, char const * arg) [free function]", 
    "fuse_parse_cmdline" : "extern int fuse_parse_cmdline(fuse_args * args, char * * mountpoint, int * multithreaded, int * foreground) [free function]", 
    "fuse_reply_xattr" : "extern int fuse_reply_xattr(fuse_req_t req, size_t count) [free function]", 
    "fuse_reply_lock" : "extern int fuse_reply_lock(fuse_req_t req, flock * lock) [free function]", 
    "fuse_req_userdata" : "extern void * fuse_req_userdata(fuse_req_t req) [free function]", 
    "fuse_opt_parse" : "extern int fuse_opt_parse(fuse_args * args, void * data, fuse_opt const * opts, fuse_opt_proc_t proc) [free function]", 
    "fuse_lowlevel_is_lib_option" : "extern int fuse_lowlevel_is_lib_option(char const * opt) [free function]", 
    "fuse_reply_buf" : "extern int fuse_reply_buf(fuse_req_t req, char const * buf, size_t size) [free function]", 
    "fuse_chan_data" : "extern void * fuse_chan_data(fuse_chan * ch) [free function]", 
    "fuse_chan_send" : "extern int fuse_chan_send(fuse_chan * ch, iovec const * iov, size_t count) [free function]", 
    "fuse_reply_entry" : "extern int fuse_reply_entry(fuse_req_t req, fuse_entry_param const * e) [free function]", 
    "fuse_session_exit" : "extern void fuse_session_exit(fuse_session * se) [free function]", 
    "fuse_reply_attr" : "extern int fuse_reply_attr(fuse_req_t req, stat const * attr, double attr_timeout) [free function]", 
    "fuse_session_reset" : "extern void fuse_session_reset(fuse_session * se) [free function]", 
    "fuse_reply_create" : "extern int fuse_reply_create(fuse_req_t req, fuse_entry_param const * e, fuse_file_info const * fi) [free function]", 
    "fuse_reply_open" : "extern int fuse_reply_open(fuse_req_t req, fuse_file_info const * fi) [free function]", 
    "fuse_add_direntry" : "extern size_t fuse_add_direntry(fuse_req_t req, char * buf, size_t bufsize, char const * name, stat const * stbuf, off_t off) [free function]", 
    "fuse_session_destroy" : "extern void fuse_session_destroy(fuse_session * se) [free function]", 
    "fuse_set_signal_handlers" : "extern int fuse_set_signal_handlers(fuse_session * se) [free function]", 
    "fuse_opt_match" : "extern int fuse_opt_match(fuse_opt const * opts, char const * opt) [free function]", 
    "fuse_chan_destroy" : "extern void fuse_chan_destroy(fuse_chan * ch) [free function]", 
    "fuse_daemonize" : "extern int fuse_daemonize(int foreground) [free function]", 
    "fuse_session_next_chan" : "extern fuse_chan * fuse_session_next_chan(fuse_session * se, fuse_chan * ch) [free function]", 
    "fuse_version" : "extern int fuse_version() [free function]", 
    "fuse_req_ctx" : "extern fuse_ctx const * fuse_req_ctx(fuse_req_t req) [free function]", 
}

class flock(ctypes.Structure):
    """class flock"""

class fuse_conn_info(ctypes.Structure):
    """class fuse_conn_info"""

class fuse_file_info(ctypes.Structure):
    """class fuse_file_info"""

class fuse_lowlevel_ops(ctypes.Structure):
    """class fuse_lowlevel_ops"""

class timespec(ctypes.Structure):
    """class timespec"""

class stat(ctypes.Structure):
    """class stat"""

class fuse_req(ctypes.Structure):
    """class declaration fuse_req"""
    _fields_  = []

flock._fields_ = [ #class flock
    ("l_type", ctypes.c_short),
    ("l_whence", ctypes.c_short),
    ("l_start", ctypes.c_longlong),
    ("l_len", ctypes.c_longlong),
    ("l_pid", ctypes.c_int),
]

fuse_conn_info._fields_ = [ #class fuse_conn_info
    ("proto_major", ctypes.c_uint),
    ("proto_minor", ctypes.c_uint),
    ("async_read", ctypes.c_uint),
    ("max_write", ctypes.c_uint),
    ("max_readahead", ctypes.c_uint),
    ("reserved", ( ctypes.c_uint * 27 )),
]

fuse_file_info._fields_ = [ #class fuse_file_info
    ("flags", ctypes.c_int),
    ("fh_old", ctypes.c_ulong),
    ("writepage", ctypes.c_int),
    ("direct_io", ctypes.c_uint, 1),
    ("keep_cache", ctypes.c_uint, 1),
    ("flush", ctypes.c_uint, 1),
    ("padding", ctypes.c_uint, 29),
    ("fh", ctypes.c_ulonglong),
    ("lock_owner", ctypes.c_ulonglong),
]

fuse_lowlevel_ops._fields_ = [ #class fuse_lowlevel_ops
    ("init", ctypes.CFUNCTYPE( None, ctypes.c_void_p, ctypes.POINTER( fuse_conn_info ) )),
    ("destroy", ctypes.CFUNCTYPE( None, ctypes.c_void_p )),
    ("lookup", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_char_p )),
    ("forget", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_ulong )),
    ("getattr", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.POINTER( fuse_file_info ) )),
    ("setattr", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.POINTER( stat ), ctypes.c_int, ctypes.POINTER( fuse_file_info ) )),
    ("readlink", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong )),
    ("mknod", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_char_p, ctypes.c_uint, ctypes.c_ulonglong )),
    ("mkdir", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_char_p, ctypes.c_uint )),
    ("unlink", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_char_p )),
    ("rmdir", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_char_p )),
    ("symlink", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_char_p, ctypes.c_ulong, ctypes.c_char_p )),
    ("rename", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_char_p, ctypes.c_ulong, ctypes.c_char_p )),
    ("link", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_ulong, ctypes.c_char_p )),
    ("open", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.POINTER( fuse_file_info ) )),
    ("read", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_uint, ctypes.c_longlong, ctypes.POINTER( fuse_file_info ) )),
    ("write", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_char_p, ctypes.c_uint, ctypes.c_longlong, ctypes.POINTER( fuse_file_info ) )),
    ("flush", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.POINTER( fuse_file_info ) )),
    ("release", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.POINTER( fuse_file_info ) )),
    ("fsync", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_int, ctypes.POINTER( fuse_file_info ) )),
    ("opendir", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.POINTER( fuse_file_info ) )),
    ("readdir", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_uint, ctypes.c_longlong, ctypes.POINTER( fuse_file_info ) )),
    ("releasedir", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.POINTER( fuse_file_info ) )),
    ("fsyncdir", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_int, ctypes.POINTER( fuse_file_info ) )),
    ("statfs", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong )),
    ("setxattr", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_uint, ctypes.c_int )),
    ("getxattr", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_char_p, ctypes.c_uint )),
    ("listxattr", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_uint )),
    ("removexattr", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_char_p )),
    ("access", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_int )),
    ("create", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_char_p, ctypes.c_uint, ctypes.POINTER( fuse_file_info ) )),
    ("getlk", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.POINTER( fuse_file_info ), ctypes.POINTER( flock ) )),
    ("setlk", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.POINTER( fuse_file_info ), ctypes.POINTER( flock ), ctypes.c_int )),
    ("bmap", ctypes.CFUNCTYPE( None, ctypes.POINTER( fuse_req ), ctypes.c_ulong, ctypes.c_uint, ctypes.c_ulonglong )),
]

timespec._fields_ = [ #class timespec
    ("tv_sec", ctypes.c_long),
    ("tv_nsec", ctypes.c_long),
]

stat._fields_ = [ #class stat
    ("st_dev", ctypes.c_ulonglong),
    ("__pad1", ctypes.c_ushort),
    ("__st_ino", ctypes.c_ulong),
    ("st_mode", ctypes.c_uint),
    ("st_nlink", ctypes.c_uint),
    ("st_uid", ctypes.c_uint),
    ("st_gid", ctypes.c_uint),
    ("st_rdev", ctypes.c_ulonglong),
    ("__pad2", ctypes.c_ushort),
    ("st_size", ctypes.c_longlong),
    ("st_blksize", ctypes.c_long),
    ("st_blocks", ctypes.c_longlong),
    ("st_atim", timespec),
    ("st_mtim", timespec),
    ("st_ctim", timespec),
    ("st_ino", ctypes.c_ulonglong),
]
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to