From: samuel.gallard <sam...@ve...> - 2009-07-31 09:22:05
|
Hello, I am facing a problem when using my wrapper C++ for fuse. It is based on this one : http://www.prism.uvsq.fr/~ode/in115/references/fuse/fusexmp_8c-source.html fusexmp When I test it in C, it is working. When I used it in C++, i obtained an input/output error when I tried to access to the directory. So Fuse it is working but I can't access it. This is the code that I used. It is separated in three files + the main : fusexx.hpp : namespace fusexx { /* * fuse * Manages all the fuse operations. A very simple interface to the C fuse_ops struct. */ template <class T> class fuse { /* * Public Methods */ public: /* * Main function of fusexx::fuse. * * Calls the fuse 'fuse_main' macro. * * @param argc the argument counter passed to the main() function * @param argv the argument vector passed to the main() function * @param user_data user data set in context for init() method * @return 0 on success, nonzero on failure */ static int main (int argc, char **argv, void *user_data, T *t) { // Zero the operations struct memset (&T::operations, 0, sizeof (struct fuse_operations)); // Load the operations struct w/ pointers to the respective member functions T::loadOperations (); // The 'self' variable will be the equivalent of the 'this' pointer if (t == NULL){ return -1; } T::self = t; // Execute fuse_main return fuse_main (argc, argv, &T::operations, user_data); } static struct fuse_operations operations; /* * Overload these functions */ public: static int int_getattr(const char *, struct stat *){ return 0; } static int int_fgetattr(const char *, struct stat *, struct fuse_file_info *){ return 0; } static int int_access(const char *, int ){ return 0; } static int int_readlink(const char *, char *, size_t ){ return 0; } static int int_opendir(const char *, struct fuse_file_info *){ return 0; } static int int_readdir(const char *, void *, fuse_fill_dir_t , off_t, struct fuse_file_info *){ return 0; } static int int_releasedir(const char *, struct fuse_file_info *){ return 0; } static int int_mknod(const char *, mode_t , dev_t ){ return 0; } static int int_mkdir(const char *, mode_t ){ return 0; } static int int_unlink(const char *){ return 0; } static int int_rmdir(const char *){ return 0; } static int int_symlink(const char *, const char *){ return 0; } static int int_rename(const char *, const char *){ return 0; } static int int_link(const char *, const char *){ return 0; } static int int_chmod(const char *, mode_t ){ return 0; } static int int_chown(const char *, uid_t , gid_t ){ return 0; } static int int_truncate(const char *, off_t ){ return 0; } static int int_ftruncate(const char *, off_t , struct fuse_file_info *){ return 0; } static int int_utimens(const char *, const struct timespec ts[2] ){ return 0; } static int int_create(const char *, mode_t , struct fuse_file_info *){ return 0; } static int int_open(const char *, struct fuse_file_info *){ return 0; } static int int_read(const char *, char *, size_t , off_t , struct fuse_file_info *){ return 0; } static int int_write(const char *, const char *, size_t , off_t , struct fuse_file_info *){ return 0; } static int int_statfs(const char *, struct statvfs *){ return 0; } static int int_flush(const char *, struct fuse_file_info *){ return 0; } static int int_release(const char *, struct fuse_file_info *){ return 0; } static int int_fsync(const char *, int , struct fuse_file_info *){ return 0; } static int int_setxattr(const char *, const char *, const char *, size_t , int ){ return 0; } static int int_getxattr(const char *, const char *, char *, size_t ){ return 0; } static int int_listxattr(const char *, char *, size_t ){ return 0; } static int int_removexattr(const char *, const char *){ return 0; } static int int_lock(const char *, struct fuse_file_info *, int ,struct flock *){ return 0; } static void loadOperations () { operations.getattr = int_getattr; operations.fgetattr = int_fgetattr; operations.access = int_access; operations.readlink = int_readlink; operations.opendir = int_opendir; operations.readdir = int_readdir; operations.releasedir = int_releasedir; operations.mknod = int_mknod; operations.mkdir = int_mkdir; operations.symlink = int_symlink; operations.unlink = int_unlink; operations.rmdir = int_rmdir; operations.rename = int_rename; operations.link = int_link; operations.chmod = int_chmod; operations.chown = int_chown; operations.truncate = int_truncate; operations.ftruncate = int_ftruncate; operations.utimens = int_utimens; operations.create = int_create; operations.open = int_open; operations.read = int_read; operations.write = int_write; operations.statfs = int_statfs; operations.flush = int_flush; operations.release = int_release; operations.fsync = int_fsync; #ifdef HAVE_SETXATTR operations.setxattr = int_setxattr; operations.getxattr = int_getxattr; operations.listxattr = int_listxattr; operations.removexattr = int_removexattr; #endif operations.lock = int_lock; } /* * Protected variables */ protected: // allow static methods to access object methods/ variables using 'self' instead of 'this' static T *self; }; IntegrityFS.h : class IntegrityFS : public fusexx::fuse<IntegrityFS>{ public: IntegrityFS (); virtual ~IntegrityFS (); //For FUSE static int int_getattr(const char *path, struct stat *stbuf); static int int_fgetattr(const char *path, struct stat *stbuf, struct fuse_file_info *fi); static int int_access(const char *path, int mask); static int int_readlink(const char *path, char *buf, size_t size); static int int_opendir(const char *path, struct fuse_file_info *fi); static int int_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi); static int int_releasedir(const char *path, struct fuse_file_info *fi); static int int_mknod(const char *path, mode_t mode, dev_t rdev); static int int_mkdir(const char *path, mode_t mode); static int int_unlink(const char *path); static int int_rmdir(const char *path); static int int_symlink(const char *from, const char *to); static int int_rename(const char *from, const char *to); static int int_link(const char *from, const char *to); static int int_chmod(const char *path, mode_t mode); static int int_chown(const char *path, uid_t uid, gid_t gid); static int int_truncate(const char *path, off_t size); static int int_ftruncate(const char *path, off_t size, struct fuse_file_info *fi); static int int_utimens(const char *path, const struct timespec ts[2]); static int int_create(const char *path, mode_t mode, struct fuse_file_info *fi); static int int_open(const char *path, struct fuse_file_info *fi); static int int_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi); static int int_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi); static int int_statfs(const char *path, struct statvfs *stbuf); static int int_flush(const char *path, struct fuse_file_info *fi); static int int_release(const char *path, struct fuse_file_info *fi); static int int_fsync(const char *path, int isdatasync, struct fuse_file_info *fi); static int int_setxattr(const char *path, const char *name, const char *value, size_t size, int flags); static int int_getxattr(const char *path, const char *name, char *value, size_t size); static int int_listxattr(const char *path, char *list, size_t size); static int int_removexattr(const char *path, const char *name); static int int_lock(const char *path, struct fuse_file_info *fi, int cmd,struct flock *lock); static int main(int argc, char ** argv); } IntegrityFS.cpp : int IntegrityFS::main(int argc, char ** argv){ return fusexx::fuse<IntegrityFS>::main(argc,argv,NULL,self); } int IntegrityFS::int_getattr(const char *path, struct stat *stbuf){ int res; stbuf->st_blksize= 4096; res = lstat(path, stbuf); if (res == -1) return -errno; return 0; } int IntegrityFS::int_fgetattr(const char *path, struct stat *stbuf, struct fuse_file_info *fi){ int res; (void) path; res = fstat(fi->fh, stbuf); if (res == -1) return -errno; return 0; } int IntegrityFS::int_access(const char *path, int mask){ int res; res = access(path, mask); if (res == -1) return -errno; return 0; } int IntegrityFS::int_readlink(const char *path, char *buf, size_t size){ int res; res = readlink(path, buf, size - 1); if (res == -1) return -errno; buf[res] = '\0'; return 0; } int IntegrityFS::int_opendir(const char *path, struct fuse_file_info *fi){ DIR *dp = opendir(path); if (dp == NULL) return -errno; fi->fh = (unsigned long) dp; return 0; } int IntegrityFS::int_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi){ DIR *dp = get_dirp(fi); struct dirent *de; (void) path; seekdir(dp, offset); while ((de = readdir(dp)) != NULL) { struct stat st; memset(&st, 0, sizeof(st)); st.st_ino = de->d_ino; st.st_mode = de->d_type << 12; if (filler(buf, de->d_name, &st, telldir(dp))) break; } return 0; } int IntegrityFS::int_releasedir(const char *path, struct fuse_file_info *fi){ DIR *dp = get_dirp(fi); (void) path; closedir(dp); return 0; } int IntegrityFS::int_mknod(const char *path, mode_t mode, dev_t rdev){ int res; if (S_ISFIFO(mode)) res = mkfifo(path, mode); else res = mknod(path, mode, rdev); if (res == -1) return -errno; return 0; } int IntegrityFS::int_mkdir(const char *path, mode_t mode){ int res; res = mkdir(path, mode); if (res == -1) return -errno; return 0; } int IntegrityFS::int_unlink(const char *path){ int res; res = unlink(path); if (res == -1) return -errno; return 0; } int IntegrityFS::int_rmdir(const char *path){ int res; res = rmdir(path); if (res == -1) return -errno; return 0; } int IntegrityFS::int_symlink(const char *from, const char *to){ int res; res = symlink(from, to); if (res == -1) return -errno; return 0; } int IntegrityFS::int_rename(const char *from, const char *to){ int res; res = rename(from, to); if (res == -1) return -errno; return 0; } int IntegrityFS::int_link(const char *from, const char *to){ int res; res = link(from, to); if (res == -1) return -errno; return 0; } int IntegrityFS::int_chmod(const char *path, mode_t mode){ int res; res = chmod(path, mode); if (res == -1) return -errno; return 0; } int IntegrityFS::int_chown(const char *path, uid_t uid, gid_t gid){ int res; res = lchown(path, uid, gid); if (res == -1) return -errno; return 0; } int IntegrityFS::int_truncate(const char *path, off_t size){ int res; res = truncate(path, size); if (res == -1) return -errno; return 0; } int IntegrityFS::int_ftruncate(const char *path, off_t size, struct fuse_file_info *fi){ int res; (void) path; res = ftruncate(fi->fh, size); if (res == -1) return -errno; return 0; } int IntegrityFS::int_utimens(const char *path, const struct timespec ts[2]){ int res; struct timeval tv[2]; tv[0].tv_sec = ts[0].tv_sec; tv[0].tv_usec = ts[0].tv_nsec / 1000; tv[1].tv_sec = ts[1].tv_sec; tv[1].tv_usec = ts[1].tv_nsec / 1000; res = utimes(path, tv); if (res == -1) return -errno; return 0; } int IntegrityFS::int_create(const char *path, mode_t mode, struct fuse_file_info *fi){ int fd; fd = open(path, fi->flags, mode); if (fd == -1) return -errno; fi->fh = fd; return 0; } int IntegrityFS::int_open(const char *path, struct fuse_file_info *fi){ int fd; fd = open(path, fi->flags); if (fd == -1) return -errno; fi->fh = fd; return 0; } int IntegrityFS::int_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi){ int res; (void) path; res = pread(fi->fh, buf, size, offset); if (res == -1) res = -errno; return res; } int IntegrityFS::int_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi){ int res; (void) path; res = pwrite(fi->fh, buf, size, offset); if (res == -1) res = -errno; return res; } int IntegrityFS::int_statfs(const char *path, struct statvfs *stbuf){ int res; res = statvfs(path, stbuf); if (res == -1) return -errno; return 0; } int IntegrityFS::int_flush(const char *path, struct fuse_file_info *fi){ int res; (void) path; /* This is called from every close on an open file, so call the close on the underlying filesystem. But since flush may be called multiple times for an open file, this must not really close the file. This is important if used on a network filesystem like NFS which flush the data/metadata on close() */ res = close(dup(fi->fh)); if (res == -1) return -errno; return 0; } int IntegrityFS::int_release(const char *path, struct fuse_file_info *fi){ (void) path; close(fi->fh); return 0; } int IntegrityFS::int_fsync(const char *path, int isdatasync, struct fuse_file_info *fi){ int res; (void) path; #ifndef HAVE_FDATASYNC (void) isdatasync; #else if (isdatasync) res = fdatasync(fi->fh); else #endif res = fsync(fi->fh); if (res == -1) return -errno; return 0; } #ifdef HAVE_SETXATTR /* xattr operations are optional and can safely be left unimplemented */ int IntegrityFS::int_setxattr(const char *path, const char *name, const char *value, size_t size, int flags){ int res = lsetxattr(path, name, value, size, flags); if (res == -1) return -errno; return 0; } int IntegrityFS::int_getxattr(const char *path, const char *name, char *value, size_t size){ int res = lgetxattr(path, name, value, size); if (res == -1) return -errno; return res; } int IntegrityFS::int_listxattr(const char *path, char *list, size_t size){ int res = llistxattr(path, list, size); if (res == -1) return -errno; return res; } int IntegrityFS::int_removexattr(const char *path, const char *name){ int res = lremovexattr(path, name); if (res == -1) return -errno; return 0; } #endif /* HAVE_SETXATTR */ int IntegrityFS::int_lock(const char *path, struct fuse_file_info *fi, int cmd,struct flock *lock){ (void) path; return ulockmgr_op(fi->fh, cmd, lock, &fi->lock_owner, sizeof(fi->lock_owner)); } When I running it with the debug mode, it seems to block after a few operations and do not check every sub files and sub directories. opendir flags: 0x98800 / opendir[0] flags: 0x98800 / unique: 2, success, outsize: 32 unique: 3, opcode: GETATTR (3), nodeid: 1, insize: 56 getattr / unique: 3, success, outsize: 120 unique: 4, opcode: RELEASEDIR (29), nodeid: 1, insize: 64 releasedir[0] flags: 0x0 unique: 4, success, outsize: 16 Could you someone help me about this? i need to have this working in order to include some personal C++ classes. Any help will be useful Thanks you Regards Samuel -- View this message in context: http://www.nabble.com/Wrapper-C%2B%2B-not-working-%3A-input-output-error-tp24753503p24753503.html Sent from the Fuse - Dev mailing list archive at Nabble.com. |