Hi
I'm using FUSE + Cap'n Proto to build a distributed filesystem. Everything
seems to be fine, but when i try get the data field, on the client side,
using the getBuf method, i get a segmentation fault error.
This is the code that i made. What am i doing wrong?
/*
* Capnp source file
*/
interface FilesystemOps {
...
read @16 (request :ReadRequest) -> (reply :ReadReply);
...
}
struct ReadRequest {
path @0 :Text;
size @1 :UInt64;
offset @2 :Int64;
}
struct ReadReply {
result @0 :Int32;
buf @1 :Data;
}
/*
* Client side
*/
int FilesystemOpsClient::rpc_read(const char *path, char *buf, size_t size,
off_t offset, struct fuse_file_info *fi) {
std::cout << "rpc_read begin " << size << std::endl;
int res;
auto clientData = getClient();
auto request = clientData->cap_.readRequest();
auto builder = request.getRequest();
builder.setPath(path);
builder.setSize(size);
builder.setOffset(offset);
auto reply = request.send().wait(clientData->waitScope_).getReply();
res = reply.getResult();
if (res != -1) {
std::memcpy(buf, reply.getBuf().begin(), res);
}
return res;
}
/*
* Server side
*/
kj::Promise<void> FilesystemOpsImpl::read(FilesystemOps::Server::ReadContext
context) {
int res;
auto request = context.getParams().getRequest();
auto reply = context.getResults().getReply();
std::string path = root_path_ + request.getPath().cStr();
size_t size = request.getSize();
off_t offset = request.getOffset();
int fd = ::open(path.c_str(), O_RDONLY);
if (fd == -1) {
res = -1;
} else {
res = pread(fd, reply.initBuf(size).begin(), size, offset);
close(fd);
}
reply.setResult(res);
return kj::READY_NOW;
}
Appreciate your help. Thank you.
--
You received this message because you are subscribed to the Google Groups
"Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/capnproto/ee51e0ec-819c-4962-9245-41cafcd03862%40googlegroups.com.