summaryrefslogtreecommitdiff
path: root/src/netfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/netfs.c')
-rw-r--r--src/netfs.c203
1 files changed, 134 insertions, 69 deletions
diff --git a/src/netfs.c b/src/netfs.c
index 083ebe534..4815027e4 100644
--- a/src/netfs.c
+++ b/src/netfs.c
@@ -314,7 +314,34 @@ netfs_attempt_statfs (struct iouser *cred, struct node *node,
else if(FUSE_OP_HAVE(statfs))
{
refresh_context_struct(cred);
- err = -FUSE_OP_CALL(statfs, node->nn->path, st);
+
+ if(fuse_ops25)
+ {
+ struct statvfs stvfs;
+ err = -fuse_ops25->statfs(node->nn->path, &stvfs);
+
+ st->f_type = stvfs.__f_type;
+ st->f_bsize = stvfs.f_bsize;
+ st->f_blocks = stvfs.f_blocks;
+ st->f_bfree = stvfs.f_bfree;
+ st->f_bavail = stvfs.f_bavail;
+ st->f_files = stvfs.f_files;
+ st->f_ffree = stvfs.f_ffree;
+ st->f_fsid = stvfs.f_fsid;
+ st->f_namelen = stvfs.f_namemax;
+ st->f_favail = stvfs.f_favail;
+ st->f_frsize = stvfs.f_frsize;
+ st->f_flag = stvfs.f_flag;
+ }
+
+ else if(fuse_ops_compat22)
+ err = -fuse_ops_compat22->statfs(node->nn->path, st);
+
+ else if(fuse_ops_compat2)
+ err = -fuse_ops_compat2->statfs(node->nn->path, st);
+
+ else
+ assert(0);
}
else
@@ -417,8 +444,8 @@ netfs_check_open_permissions (struct iouser *user, struct node *node,
* into memory. */
if(! err)
{
- node->nn->info.compat22.flags = flags;
- if(flags & O_EXEC) node->nn->info.compat22.flags |= O_RDONLY;
+ NN_INFO_APPLY(node, flags = flags);
+ if(flags & O_EXEC) NN_INFO_APPLY(node, flags |= O_RDONLY);
}
out:
@@ -560,12 +587,15 @@ netfs_attempt_sync (struct iouser *cred, struct node *node, int wait)
err = EOPNOTSUPP;
goto out;
}
+
+ if(FUSE_OP_HAVE22(fsync))
+ err = -FUSE_OP_CALL22(fsync, node->nn->path, 0, NN_INFO(node));
- if(fuse_ops_compat22)
- err = -fuse_ops_compat22->fsync(node->nn->path, 0,
- &node->nn->info.compat22);
- else
+ else if(fuse_ops_compat2)
err = -fuse_ops_compat2->fsync(node->nn->path, 0);
+
+ else
+ assert(0);
if(! err)
node->nn->may_need_sync = 0;
@@ -1061,21 +1091,33 @@ error_t netfs_attempt_write (struct iouser *cred, struct node *node,
goto out;
}
- node->nn->info.compat22.writepage = 0; /* cannot distinct on the Hurd :( */
+ NN_INFO_APPLY(node, writepage = 0); /* cannot distinct on the Hurd :( */
- if(fuse_ops_compat2 && fuse_ops_compat2->open
- && (err = fuse_ops_compat2->open(node->nn->path,
- node->nn->info.compat22.flags)))
- goto out;
- else if(fuse_ops_compat22 && fuse_ops_compat22->open
- && (err = fuse_ops_compat22->open(node->nn->path,
- &node->nn->info.compat22)))
- goto out;
+ if(FUSE_OP_HAVE(open))
+ {
+ if(FUSE_OP_HAVE22(open))
+ err = FUSE_OP_CALL22(open, node->nn->path, NN_INFO(node));
+
+ else if(fuse_ops_compat2)
+ err = fuse_ops_compat2->open(node->nn->path,
+ node->nn->info.compat22.flags);
+
+ else
+ assert(0);
+
+ if(err) goto out;
+ }
+
+ int sz;
+ if(FUSE_OP_HAVE22(write))
+ sz = FUSE_OP_CALL22(write, node->nn->path, data, *len, offset,
+ NN_INFO(node));
+
+ else if(fuse_ops_compat2)
+ sz = fuse_ops_compat2->write(node->nn->path, data, *len, offset);
- int sz = fuse_ops_compat22 ?
- (fuse_ops_compat22->write(node->nn->path, data, *len,
- offset, &node->nn->info.compat22)) :
- (fuse_ops_compat2->write(node->nn->path, data, *len, offset));
+ else
+ assert(0);
/* FIXME: open, flush and release handling probably should be changed
* completely, I mean, we probably should do fuse_ops->open in
@@ -1084,15 +1126,21 @@ error_t netfs_attempt_write (struct iouser *cred, struct node *node,
*
* This way we wouldn't be able to report any errors back.
*/
- if(sz >= 0 && fuse_ops_compat22 && fuse_ops_compat22->flush)
- err = fuse_ops_compat22->flush(node->nn->path, &node->nn->info.compat22);
+ if(sz >= 0 && FUSE_OP_HAVE22(flush))
+ err = FUSE_OP_CALL22(flush, node->nn->path, NN_INFO(node));
- if(fuse_ops_compat2 && fuse_ops_compat2->open && fuse_ops_compat2->release)
- fuse_ops_compat2->release(node->nn->path, node->nn->info.compat22.flags);
+ if(FUSE_OP_HAVE(open) && FUSE_OP_HAVE(release))
+ {
+ if(FUSE_OP_HAVE22(release))
+ FUSE_OP_CALL22(release, node->nn->path, NN_INFO(node));
+
+ else if(fuse_ops_compat2)
+ fuse_ops_compat2->release(node->nn->path,
+ node->nn->info.compat22.flags);
- else if(fuse_ops_compat22 && fuse_ops_compat22->open
- && fuse_ops_compat22->release)
- fuse_ops_compat22->release(node->nn->path, &node->nn->info.compat22);
+ else
+ assert(0);
+ }
if(sz < 0)
err = -sz;
@@ -1170,19 +1218,31 @@ error_t netfs_attempt_read (struct iouser *cred, struct node *node,
goto out;
}
- if(fuse_ops_compat2 && fuse_ops_compat2->open
- && (err = fuse_ops_compat2->open(node->nn->path,
- node->nn->info.compat22.flags)))
- goto out;
- else if(fuse_ops_compat22 && fuse_ops_compat22->open
- && (err = fuse_ops_compat22->open(node->nn->path,
- &node->nn->info.compat22)))
- goto out;
+ if(FUSE_OP_HAVE(open))
+ {
+ if(FUSE_OP_HAVE22(open))
+ err = FUSE_OP_CALL22(open, node->nn->path, NN_INFO(node));
+
+ else if(fuse_ops_compat2)
+ err = fuse_ops_compat2->open(node->nn->path,
+ node->nn->info.compat22.flags);
+
+ else
+ assert(0);
+
+ if(err) goto out;
+ }
- int sz = fuse_ops_compat22 ?
- (fuse_ops_compat22->read(node->nn->path, data, *len,
- offset, &node->nn->info.compat22)) :
- (fuse_ops_compat2->read(node->nn->path, data, *len, offset));
+ int sz;
+ if(FUSE_OP_HAVE22(read))
+ sz = FUSE_OP_CALL22(read, node->nn->path, data, *len, offset,
+ NN_INFO(node));
+
+ else if(fuse_ops_compat2)
+ sz = fuse_ops_compat2->read(node->nn->path, data, *len, offset);
+
+ else
+ assert(0);
/* FIXME: open, flush and release handling probably should be changed
* completely, I mean, we probably should do fuse_ops->open in
@@ -1191,15 +1251,21 @@ error_t netfs_attempt_read (struct iouser *cred, struct node *node,
*
* This way we wouldn't be able to report any errors back.
*/
- if(sz >= 0 && fuse_ops_compat22 && fuse_ops_compat22->flush)
- err = fuse_ops_compat22->flush(node->nn->path, &node->nn->info.compat22);
+ if(sz >= 0 && FUSE_OP_HAVE22(flush))
+ err = FUSE_OP_CALL22(flush, node->nn->path, NN_INFO(node));
- if(fuse_ops_compat2 && fuse_ops_compat2->open && fuse_ops_compat2->release)
- fuse_ops_compat2->release(node->nn->path, node->nn->info.compat22.flags);
+ if(FUSE_OP_HAVE(open) && FUSE_OP_HAVE(release))
+ {
+ if(FUSE_OP_HAVE22(release))
+ FUSE_OP_CALL22(release, node->nn->path, NN_INFO(node));
+
+ else if(fuse_ops_compat2)
+ fuse_ops_compat2->release(node->nn->path,
+ node->nn->info.compat22.flags);
- else if(fuse_ops_compat22 && fuse_ops_compat22->open
- && fuse_ops_compat22->release)
- fuse_ops_compat22->release(node->nn->path, &node->nn->info.compat22);
+ else
+ assert(0);
+ }
if(sz < 0)
err = -sz;
@@ -1236,10 +1302,9 @@ fuse_get_inode(const char *name)
{
struct stat stat;
- assert(fuse_ops_compat22);
- assert(fuse_ops_compat22->getattr);
-
- fuse_ops_compat22->getattr(name, &stat);
+ assert(FUSE_OP_HAVE22(getattr));
+ FUSE_OP_CALL22(getattr, name, &stat);
+
return stat.st_ino;
}
@@ -1388,13 +1453,15 @@ get_dirents_getdir(struct node *dir, int first_entry, int num_entries,
handle->parent = dir->nn;
handle->hdrpos = (struct dirent*) *data;
- if(fuse_ops_compat22)
- fuse_ops_compat22->getdir(dir->nn->path, handle,
- get_dirents_getdir_helper);
- else
+ if(FUSE_OP_HAVE22(getdir))
+ FUSE_OP_CALL22(getdir, dir->nn->path, handle, get_dirents_getdir_helper);
+
+ else if(fuse_ops_compat2)
fuse_ops_compat2->getdir(dir->nn->path, handle,
- get_dirents_getdir_helper_compat);
-
+ get_dirents_getdir_helper_compat);
+
+ else
+ assert(0);
*data_len -= handle->size; /* subtract number of bytes left in the
* buffer from the length of the buffer we
@@ -1522,8 +1589,7 @@ get_dirents_readdir(struct node *dir, int first_entry, int num_entries,
error_t err;
FUNC_PROLOGUE_NODE("get_dirents_readdir", dir);
- if(! (fuse_ops_compat22 && fuse_ops_compat22->readdir))
- FUNC_RETURN(EOPNOTSUPP);
+ assert(FUSE_OP_HAVE22(readdir));
fuse_dirh_t handle;
if(! (handle = malloc(sizeof(struct fuse_dirhandle))))
@@ -1552,22 +1618,21 @@ get_dirents_readdir(struct node *dir, int first_entry, int num_entries,
handle->parent = dir->nn;
handle->hdrpos = (struct dirent*) *data;
- if(fuse_ops_compat22->opendir
- && (err = fuse_ops_compat22->opendir(dir->nn->path,
- &dir->nn->info.compat22)))
+ if(FUSE_OP_HAVE22(opendir)
+ && (err = FUSE_OP_CALL22(opendir, dir->nn->path, NN_INFO(dir))))
goto out;
- if((err = fuse_ops_compat22->readdir(dir->nn->path, handle,
- get_dirents_readdir_helper,
- first_entry, &dir->nn->info.compat22)))
+ if((err = FUSE_OP_CALL22(readdir, dir->nn->path, handle,
+ get_dirents_readdir_helper,
+ first_entry, NN_INFO(dir))))
{
- fuse_ops_compat22->releasedir(dir->nn->path, &dir->nn->info.compat22);
+ if(FUSE_OP_HAVE22(releasedir))
+ FUSE_OP_CALL22(releasedir, dir->nn->path, NN_INFO(dir));
goto out;
}
- if(fuse_ops_compat22->releasedir
- && (err = fuse_ops_compat22->releasedir(dir->nn->path,
- &dir->nn->info.compat22)))
+ if(FUSE_OP_HAVE22(releasedir)
+ && (err = FUSE_OP_CALL22(releasedir, dir->nn->path, NN_INFO(dir))))
goto out;
*data_len -= handle->size; /* subtract number of bytes left in the
@@ -1601,7 +1666,7 @@ netfs_get_dirents (struct iouser *cred, struct node *dir,
goto out;
- if(fuse_ops_compat22 && fuse_ops_compat22->readdir)
+ if(FUSE_OP_HAVE22(readdir))
err = get_dirents_readdir(dir, first_entry, num_entries, data, data_len,
data_entries);