kali ini gue akan menjelaskan pengertian dari FUSE.
Apa itu FUSE?
Filesystem in Userspace (FUSE)
FUSE sendiri memungkinkan pengguna untuk menciptakan file system mereka sendiri tanpa mengubah kode kernel.
Ini adalah struktur FUSE
Cara Kerja FUSE:
- fuse_main() (lib/helper.c) = sebagian fungsi main (userspace), program user memanggil fungsi fuse_main() kemudian fungsi fuse_mount() dipanggil.
- fuse_mount() (lib/mount.c) = menciptakan UNIX domain socket, kemudian di fork dan menciptakan child process yang menjalankan fusermount
- fusermount() (util/fusermount.c) = untuk mengecek apakah modul FUSE sudah di load. Kemudian membuka /dev/fuse dan mengirim file handle melalu UNIX domain socket kembali ke fungsi fuse_mount()
- fuse_new() (lib/fuse.c) = menciptakan struktur data yang berisi ruang yang digukanan untuk menyimpan data file system
- fuse_loop() (lib/fuse.c) = membaca file system calls dari /dev/fuse
- int (*getattr) (const char *, struct stat *);
Get file attributes. - int (*readlink) (const char *, char *, size_t);
Read the target of a symbolic link - int (*mknod) (const char *, mode_t, dev_t);
Create a file node. - int (*mkdir) (const char *, mode_t);
Create a directory. - int (*unlink) (const char *);
Remove a file - int (*rmdir) (const char *);
Remove a directory - int (*rename) (const char *, const char *);
Rename a file - int (*chmod) (const char *, mode_t);
Change the permission bits of a file - int (*chown) (const char *, uid_t, gid_t);
Change the owner and group of a file - int (*truncate) (const char *, off_t);
Change the size of a file - int (*open) (const char *, struct fuse_file_info *);
File open operation. - int (*readdir) (const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *);
Read directory - int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *);
Read data from an open file - int (*write) (const char *, const char *, size_t, off_t, struct fuse_file_info *);
Write data to an open file
#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>
#include <sys/statfs.h>
static const char *dirpath = "/home/glleen/Downloads";
static int xmp_getattr(const char *path, struct stat *stbuf)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
res = lstat(fpath, stbuf);
if(res == -1)
{
return -errno;
}
return 0;
}
static int xmp_getdir(const char *path, fuse_dirh_t h, fuse_dirfil_t filler)
{
char fpath[1000];
if(strcmp(path,"/") == 0)
{
path=dirpath;
sprintf(fpath,"%s",path);
}
else sprintf(fpath, "%s%s",dirpath,path);
int res = 0;
DIR *dp;
struct dirent *de;
dp = opendir(fpath);
if(dp==NULL)
{
return -errno;
}
while((de = readdir(dp))!=NULL)
{
res = filler(h, de->d_name, de->d_type);
if(res!=0) break;
}
system("notify-send hello");
closedir(dp);
return res;
}
static struct fuse_operations xmp_oper =
{
.getattr = xmp_getattr,
//.readlink = xmp_readlink,
.getdir = xmp_getdir,
//.mknod = xmp_mknod,
//.mkdir = xmp_mkdir,
//.symlink = xmp_symlink,
//.unlink = xmp_unlink,
//.rmdir = xmp_rmdir,
//.rename = xmp_rename,
//.link = xmp_link,
//.chmod = xmp_chmod,
//.chown = xmp_chown,
//.truncate = xmp_truncate,
//.utime = xmp_utime,
//.open = xmp_open,
//.read = xmp_read,
//.write = xmp_write,
//.release = xmp_release,
//.fsync = xmp_fsync,
//.readdir = hello_readdir
};
int main(int argc, char *argv[])
{
return fuse_main(argc, argv, &xmp_oper);
}
catatan : ubah dirpath ini sesuai dengan yang directory yang ingin di mount const char *dirpath = "/home/glleen/Downloads";

No comments:
Post a Comment