Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
static __inline__ int
volicon_is_a_magic_file(const char *path)
{
    return (volicon_is_icon_magic_file(path));
}