static int volicon_read_buf(const char *path, struct fuse_bufvec **bufp, size_t size, off_t offset, struct fuse_file_info *fi) { int res = 0; if (volicon_is_icon_magic_file(path)) { struct fuse_bufvec *buf; void *mem; size_t a_size; buf = malloc(sizeof(struct fuse_bufvec)); if (buf == NULL) { return -ENOMEM; } if ((offset + size) <= volicon_get()->volicon_size) { a_size = size; } else if (offset < volicon_get()->volicon_size) { a_size = volicon_get()->volicon_size - offset; } else { a_size = 0; } mem = malloc(a_size); if (mem == NULL) { free(buf); return -ENOMEM; } memcpy(mem, (char *)(volicon_get()->volicon_data) + offset, a_size); *buf = FUSE_BUFVEC_INIT(size); buf->buf[0].mem = mem; buf->buf[0].size = a_size; *bufp = buf; } else { res = fuse_fs_read_buf(volicon_get()->next, path, bufp, size, offset, fi); } return res; }
static int volicon_read(const char *path, char *buf, size_t size, off_t off, struct fuse_file_info *fi) { int res = 0; if (volicon_is_icon_magic_file(path)) { size_t a_size = size; if (off < volicon_get()->volicon_size) { if ((off + size) > volicon_get()->volicon_size) { a_size = volicon_get()->volicon_size - off; } memcpy(buf, (char *)(volicon_get()->volicon_data) + off, a_size); res = a_size; } } else { res = fuse_fs_read(volicon_get()->next, path, buf, size, off, fi); } return res; }
static int volicon_getattr(const char *path, struct stat *buf) { int res = 0; if (volicon_is_icon_magic_file(path)) { memset((void *)buf, 0, sizeof(struct stat)); buf->st_mode = S_IFREG | 0444; buf->st_nlink = 1; buf->st_uid = volicon_get()->volicon_uid; buf->st_gid = 0; buf->st_size = volicon_get()->volicon_size; buf->st_atime = buf->st_ctime = buf->st_mtime = time(NULL); } else { res = fuse_fs_getattr(volicon_get()->next, path, buf); } return res; }
static __inline__ int volicon_is_a_magic_file(const char *path) { return (volicon_is_icon_magic_file(path)); }