Untuk menggunakan fuse, kita harus menginstallnya terlebih dahulu, kalian bisa mendownload file untuk fuse di
1. http://fuse.sourceforge.net/
2. Extract ke folder yang kalian inginkan.
3. Masuk ke folder hasil extraction melalui terminal
4. Ganti hak ases super user
5. ketik ./configure
6. ketik make
7. ketik make install
setelah itu fuse dapat digunakan.
Jadi bagaimana kita memodifikasi dalam fuse?
Didalam fuse terdapat beberapa fungsi dimana fungsi tersebut berguna untuk mengatur hal hal yang berhubungan dengan filesystem buatan kita sendiri ini.
fungsi yang bisa dimodifikasi yang tersedia di fuse ada dibawah ini:
struct fuse_operations {
int (*getattr) (const char *, struct stat *);
int (*readlink) (const char *, char *, size_t);
int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
int (*mknod) (const char *, mode_t, dev_t);
int (*mkdir) (const char *, mode_t);
int (*unlink) (const char *);
int (*rmdir) (const char *);
int (*symlink) (const char *, const char *);
int (*rename) (const char *, const char *);
int (*link) (const char *, const char *);
int (*chmod) (const char *, mode_t);
int (*chown) (const char *, uid_t, gid_t);
int (*truncate) (const char *, off_t);
int (*utime) (const char *, struct utimbuf *);
int (*open) (const char *, struct fuse_file_info *);
int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *);
int (*write) (const char *, const char *, size_t, off_t,struct fuse_file_info *);
int (*statfs) (const char *, struct statfs *);
int (*flush) (const char *, struct fuse_file_info *);
int (*release) (const char *, struct fuse_file_info *);
int (*fsync) (const char *, int, struct fuse_file_info *);
int (*setxattr) (const char *, const char *, const char *, size_t, int);
int (*getxattr) (const char *, const char *, char *, size_t);
int (*listxattr) (const char *, char *, size_t);
int (*removexattr) (const char *, const char *);
};
Berikut ini adalah contoh penggunaan fuse untuk filesystem yang apabila suatu file dicopy maka file asli akan di lock (tidak dapat dibuka atau di copy lagi)
#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>
#include <stdlib.h>
static const char *dirpath = "/home/ariobimo/Documents";
char simpen[1000];
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_readlink(const char *path, char *buf, size_t size)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
res = readlink(fpath, buf, size - 1);
if(res == -1)
return -errno;
buf[res] = '\0';
return 0;
}
static int xmp_getdir(const char *path, fuse_dirh_t h, fuse_dirfil_t filler)
{
DIR *dp;
struct dirent *de;
int res = 0;
char fpath[1000];
if(strcmp(path,"/") == 0)
{
path=dirpath;
sprintf(fpath,"%s",path);
}
else sprintf(fpath, "%s%s",dirpath,path);
dp = opendir(path);
if(dp == NULL)
return -errno;
while((de = readdir(dp)) != NULL) {
res = filler(h, de->d_name, de->d_type);
if(res != 0)
break;
}
closedir(dp);
return res;
}
static int xmp_mkdir(const char *path, mode_t mode)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
res = mkdir(fpath, mode);
if(res == -1)
return -errno;
return 0;
}
static int xmp_unlink(const char *path)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
res = unlink(fpath);
if(res == -1)
return -errno;
return 0;
}
static int xmp_rmdir(const char *path)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
res = rmdir(fpath);
if(res == -1)
return -errno;
return 0;
}
static int xmp_symlink(const char *from, const char *to)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,from);
char fpath2[1000];
sprintf(fpath2,"%s%s",dirpath,to);
res = symlink(from, to);
if(res == -1)
return -errno;
return 0;
}
static int xmp_rename(const char *from, const char *to)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,from);
char fpath2[1000];
sprintf(fpath2,"%s%s",dirpath,to);
res = rename(fpath, fpath2);
if(res == -1)
return -errno;
return 0;
}
static int xmp_mknod(const char *path, mode_t mode, dev_t rdev)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
res = mknod(fpath,mode,rdev);
if(res == -1)
return -errno;
return 0;
}
static int xmp_link(const char *from, const char *to)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,from);
char fpath2[1000];
sprintf(fpath2,"%s%s",dirpath,to);
res = link(fpath, fpath2);
if(res == -1)
return -errno;
return 0;
}
static int xmp_chmod(const char *path, mode_t mode)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
res = chmod(fpath, mode);
if(res == -1)
return -errno;
return 0;
}
static int xmp_chown(const char *path, uid_t uid, gid_t gid)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
res = lchown(fpath, uid, gid);
if(res == -1)
return -errno;
return 0;
}
static int xmp_truncate(const char *path, off_t size)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
res = truncate(fpath, size);
if(res == -1)
return -errno;
return 0;
}
static int xmp_utime(const char *path, struct utimbuf *buf)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
res = utime(fpath, buf);
if(res == -1)
return -errno;
return 0;
}
static int xmp_open(const char *path, int flags)
{
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
res = open(fpath, flags);
if(res == -1)
return -errno;
close(res);
return 0;
}
static int xmp_read(const char *path, char *buf, size_t size, off_t offset)
{
int fd;
int res;
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
strcpy(simpen,path);
fd = open(fpath, O_RDONLY);
if(fd == -1)
return -errno;
res = pread(fd, buf, size, offset);
if(res == -1)
res = -errno;
close(fd);
return res;
}
static int xmp_write(const char *path, const char *buf, size_t size,
off_t offset)
{
int fd;
int res;
char fpath[1000];
char something[1000];
sprintf(fpath,"%s%s",dirpath,path);
fd = open(fpath, O_WRONLY);
if(fd == -1)
return -errno;
sprintf(something,"%s%s",dirpath,simpen);
chmod(something,0000);
res = pwrite(fd, buf, size, offset);
if(res == -1)
res = -errno;
close(fd);
return res;
}
/*static int xmp_statfs(struct fuse_statfs *fst)
{
struct statfs st;
int rv = statfs("/",&st);
if(!rv) {
fst->block_size = st.f_bsize;
fst->blocks = st.f_blocks;
fst->blocks_free = st.f_bavail;
fst->files = st.f_files;
fst->files_free = st.f_ffree;
fst->namelen = st.f_namelen;
}
return rv;
}*/
static int xmp_release(const char *path, int flags)
{
/* Just a stub. This method is optional and can safely be left
unimplemented */
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
(void) fpath;
(void) flags;
return 0;
}
static int xmp_fsync(const char *path, int isdatasync)
{
/* Just a stub. This method is optional and can safely be left
unimplemented */
char fpath[1000];
sprintf(fpath,"%s%s",dirpath,path);
(void) fpath;
(void) isdatasync;
return 0;
}
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,
//.statfs = xmp_statfs,
.release = xmp_release,
.fsync = xmp_fsync
};
int main(int argc, char *argv[])
{
fuse_main(argc, argv, &xmp_oper);
return 0;
}
Bisa dilihat dikodingan diatas yang dimodify adalah fungsi write dan fungsi read, dimana saat kita mengcopy sebuah file, pastiya file yang akan dicopy akan di read terlebih dahulu, sehingga saat di read, kita menyimpan file pathnya (dengan menggunakan strcpy).
Kemudian saat di write, kita akan melakukan chmod untuk melakukan lock pada file source tersebut.
Setelah koding diatas selesai, simpan dalam bentuk .c . kemudian kalian bisa mengcompile .c tersebut dengan cara:
gcc -Wall [nama file].c `pkg-config fuse --cflags --libs` -o [nama file]setelah berhasil di compile kita dapat run file kita dengan cara:
./file /tmp/fuse
Diatas menunjukan bahwa kita akan melakukan mount pada folder /tmp/fuse .
Anda harus memastikan bahwa folder yang anda gunakan untuk mount adalah folder kosong.
Silakan mencoba hehe.
No comments:
Post a Comment