Lines Matching refs:fd

98 static void fuse_reply(const fuse_data* fd, uint64_t unique, const void* data, size_t len) {
110 int res = writev(fd->ffd, vec, 2);
116 static int handle_init(void* data, fuse_data* fd, const fuse_in_header* hdr) {
147 fuse_reply(fd, hdr->unique, &out, fuse_struct_size);
152 static void fill_attr(fuse_attr* attr, const fuse_data* fd, uint64_t nodeid, uint64_t size,
156 attr->uid = fd->uid;
157 attr->gid = fd->gid;
166 static int handle_getattr(void* /* data */, const fuse_data* fd, const fuse_in_header* hdr) {
171 fill_attr(&(out.attr), fd, hdr->nodeid, 4096, S_IFDIR | 0555);
173 fill_attr(&(out.attr), fd, PACKAGE_FILE_ID, fd->file_size, S_IFREG | 0444);
175 fill_attr(&(out.attr), fd, EXIT_FLAG_ID, 0, S_IFREG | 0);
180 fuse_reply(fd, hdr->unique, &out, sizeof(out));
184 static int handle_lookup(void* data, const fuse_data* fd, const fuse_in_header* hdr) {
195 fill_attr(&(out.attr), fd, PACKAGE_FILE_ID, fd->file_size, S_IFREG | 0444);
199 fill_attr(&(out.attr), fd, EXIT_FLAG_ID, 0, S_IFREG | 0);
204 fuse_reply(fd, hdr->unique, &out, sizeof(out));
208 static int handle_open(void* /* data */, const fuse_data* fd, const fuse_in_header* hdr) {
214 fuse_reply(fd, hdr->unique, &out, sizeof(out));
218 static int handle_flush(void* /* data */, fuse_data* /* fd */, const fuse_in_header* /* hdr */) {
222 static int handle_release(void* /* data */, fuse_data* /* fd */, const fuse_in_header* /* hdr */) {
226 // Fetch a block from the host into fd->curr_block and fd->block_data.
228 static int fetch_block(fuse_data* fd, uint32_t block) {
229 if (block == fd->curr_block) {
233 if (block >= fd->file_blocks) {
234 memset(fd->block_data, 0, fd->block_size);
235 fd->curr_block = block;
239 size_t fetch_size = fd->block_size;
240 if (block * fd->block_size + fetch_size > fd->file_size) {
243 fetch_size = fd->file_size - (block * fd->block_size);
244 memset(fd->block_data + fetch_size, 0, fd->block_size - fetch_size);
247 int result = fd->vtab.read_block(block, fd->block_data, fetch_size);
250 fd->curr_block = block;
260 SHA256(fd->block_data, fd->block_size, hash.data());
262 const SHA256Digest& blockhash = fd->hashes[block];
269 fd->curr_block = -1;
274 fd->hashes[block] = hash;
278 static int handle_read(void* data, fuse_data* fd, const fuse_in_header* hdr) {
302 uint32_t block = offset / fd->block_size;
303 int result = fetch_block(fd, block);
314 uint32_t block_offset = offset - (block * fd->block_size);
317 if (size + block_offset <= fd->block_size) {
320 vec[1].iov_base = fd->block_data + block_offset;
326 memcpy(fd->extra_block, fd->block_data + block_offset, fd->block_size - block_offset);
327 vec[1].iov_base = fd->extra_block;
328 vec[1].iov_len = fd->block_size - block_offset;
330 result = fetch_block(fd, block + 1);
332 vec[2].iov_base = fd->block_data;
337 if (writev(fd->ffd, vec, vec_used) == -1) {
359 fuse_data fd = {};
360 fd.vtab = vtab;
361 fd.file_size = file_size;
362 fd.block_size = block_size;
363 fd.file_blocks = (file_size == 0) ? 0 : (((file_size - 1) / block_size) + 1);
366 if (fd.file_blocks > (1 << 18)) {
367 fprintf(stderr, "file has too many blocks (%u)\n", fd.file_blocks);
373 fd.hashes.resize(fd.file_blocks);
374 fd.uid = getuid();
375 fd.gid = getgid();
377 fd.curr_block = -1;
378 fd.block_data = static_cast<uint8_t*>(malloc(block_size));
379 if (fd.block_data == nullptr) {
384 fd.extra_block = static_cast<uint8_t*>(malloc(block_size));
385 if (fd.extra_block == nullptr) {
391 fd.ffd.reset(open("/dev/fuse", O_RDWR));
392 if (!fd.ffd) {
400 "fd=%d,user_id=%d,group_id=%d,max_read=%u,allow_other,rootmode=040000", fd.ffd.get(),
401 fd.uid, fd.gid, block_size);
413 ssize_t len = TEMP_FAILURE_RETRY(read(fd.ffd, request_buffer, sizeof(request_buffer)));
435 result = handle_init(data, &fd, hdr);
439 result = handle_lookup(data, &fd, hdr);
443 result = handle_getattr(data, &fd, hdr);
447 result = handle_open(data, &fd, hdr);
451 result = handle_read(data, &fd, hdr);
455 result = handle_flush(data, &fd, hdr);
459 result = handle_release(data, &fd, hdr);
477 TEMP_FAILURE_RETRY(write(fd.ffd, &outhdr, sizeof(outhdr)));
482 fd.vtab.close();
488 free(fd.block_data);
489 free(fd.extra_block);