On Sun, Dec 27, 2009 at 10:10 AM, Roman Yakovenko <[email protected]> wrote: > On Sun, Dec 27, 2009 at 2:46 AM, Nikolaus Rath <[email protected]> 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/
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 [email protected] http://mail.python.org/mailman/listinfo/cplusplus-sig
