aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fuse_lowlevel.c
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2005-10-26 15:29:06 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2005-10-26 15:29:06 +0000
commitd9079a75b14b73e7953adf4958709b1e5ab3804c (patch)
tree6c20aef91825f2d4d62e18080579be7a1d54f62e /lib/fuse_lowlevel.c
parent2c650415ef3e655dbe1c6d39b8fc65c3a6efe998 (diff)
downloadlibfuse-d9079a75b14b73e7953adf4958709b1e5ab3804c.tar.gz
atomic open+create added
Diffstat (limited to 'lib/fuse_lowlevel.c')
-rw-r--r--lib/fuse_lowlevel.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index 22dc41d..9379968 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -70,6 +70,7 @@ static const char *opname(enum fuse_opcode opcode)
case FUSE_RELEASEDIR: return "RELEASEDIR";
case FUSE_FSYNCDIR: return "FSYNCDIR";
case FUSE_ACCESS: return "ACCESS";
+ case FUSE_CREATE: return "CREATE";
default: return "???";
}
}
@@ -265,6 +266,20 @@ int fuse_reply_entry(fuse_req_t req, const struct fuse_entry_param *e)
return send_reply_ok(req, &arg, sizeof(arg));
}
+int fuse_reply_create(fuse_req_t req, const struct fuse_entry_param *e,
+ const struct fuse_file_info *f)
+{
+ struct {
+ struct fuse_entry_out e;
+ struct fuse_open_out o;
+ } arg;
+
+ memset(&arg, 0, sizeof(arg));
+ fill_entry(&arg.e, e);
+ fill_open(&arg.o, f);
+ return send_reply_ok(req, &arg, sizeof(arg));
+}
+
int fuse_reply_attr(fuse_req_t req, const struct stat *attr,
double attr_timeout)
{
@@ -443,6 +458,20 @@ static void do_link(fuse_req_t req, fuse_ino_t nodeid,
fuse_reply_err(req, ENOSYS);
}
+static void do_create(fuse_req_t req, fuse_ino_t nodeid,
+ struct fuse_open_in *arg)
+{
+ if (req->f->op.create) {
+ struct fuse_file_info fi;
+
+ memset(&fi, 0, sizeof(fi));
+ fi.flags = arg->flags;
+
+ req->f->op.create(req, nodeid, PARAM(arg), arg->mode, &fi);
+ } else
+ fuse_reply_err(req, ENOSYS);
+}
+
static void do_open(fuse_req_t req, fuse_ino_t nodeid,
struct fuse_open_in *arg)
{
@@ -825,6 +854,10 @@ static void fuse_ll_process(void *data, const char *buf, size_t len,
do_access(req, in->nodeid, (struct fuse_access_in *) inarg);
break;
+ case FUSE_CREATE:
+ do_create(req, in->nodeid, (struct fuse_open_in *) inarg);
+ break;
+
default:
fuse_reply_err(req, ENOSYS);
}