aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fuse_lowlevel.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/fuse_lowlevel.c')
-rw-r--r--lib/fuse_lowlevel.c46
1 files changed, 35 insertions, 11 deletions
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index f6342b2..43b0364 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -149,12 +149,10 @@ static void free_req(fuse_req_t req)
destroy_req(req);
}
-static int send_reply(fuse_req_t req, int error, const void *arg,
- size_t argsize)
+static int send_reply_iov(fuse_req_t req, int error, struct iovec *iov,
+ int count)
{
struct fuse_out_header out;
- struct iovec iov[2];
- size_t count;
int res;
if (error <= -1000 || error > 0) {
@@ -164,19 +162,14 @@ static int send_reply(fuse_req_t req, int error, const void *arg,
out.unique = req->unique;
out.error = error;
- count = 1;
iov[0].iov_base = &out;
iov[0].iov_len = sizeof(struct fuse_out_header);
- if (argsize && !error) {
- count++;
- iov[1].iov_base = (void *) arg;
- iov[1].iov_len = argsize;
- }
out.len = iov_length(iov, count);
if (req->f->debug) {
printf(" unique: %llu, error: %i (%s), outsize: %i\n",
- out.unique, out.error, strerror(-out.error), out.len);
+ (unsigned long long) out.unique, out.error,
+ strerror(-out.error), out.len);
fflush(stdout);
}
res = fuse_chan_send(req->ch, iov, count);
@@ -185,6 +178,37 @@ static int send_reply(fuse_req_t req, int error, const void *arg,
return res;
}
+static int send_reply(fuse_req_t req, int error, const void *arg,
+ size_t argsize)
+{
+ struct iovec iov[2];
+ int count = 1;
+ if (argsize) {
+ iov[1].iov_base = (void *) arg;
+ iov[1].iov_len = argsize;
+ count++;
+ }
+ return send_reply_iov(req, error, iov, count);
+}
+
+int fuse_reply_iov(fuse_req_t req, const struct iovec *iov, int count)
+{
+ int res;
+ struct iovec *padded_iov;
+
+ padded_iov = malloc((count + 1) * sizeof(struct iovec));
+ if (padded_iov == NULL)
+ return fuse_reply_err(req, -ENOMEM);
+
+ memcpy(padded_iov + 1, iov, count * sizeof(struct iovec));
+ count++;
+
+ res = send_reply_iov(req, 0, padded_iov, count);
+ free(padded_iov);
+
+ return res;
+}
+
size_t fuse_dirent_size(size_t namelen)
{
return FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + namelen);