Langsung ke konten utama

[TUTORIAL] FUSE

Filesystem in Userspace (FUSE) adalah Filesystem buatan kita sendiri, yang mana kita bisa menentukan aturan2 kita sendiri, dan batasan2 yang kita tentukan sendiri agar dapat menjaga keamanan data.

Intinya adalah, nanti kita bisa membuat sebuah sistem buatan kita sendiri, dibawah ini akan saya berikan source code file system pada umumnya, nanti ketika anda ingin mengedit-ngedit sendiri itu terserah anda

Sebelum anda membuat fuse, pastika di komputer / laptop anda sudah terisntal fuse terlebih dahulu.. caranya cukup mudah















#ifdef linux
#define _XOPEN_SOURCE 500
#endif
#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>

char *direction={"/home/demsy/mas_Adhipur"}; //folder sumber

static int xmp_getattr(const char *path, struct stat *stbuf)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,pathcdcd);
    int res;

    res = lstat(i, stbuf);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_readlink(const char *path, char *buf, size_t size)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,path);
    int res;

    res = readlink(i, 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)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,path);

    DIR *dp;
    struct dirent *de;
    int res = 0;

    dp = opendir(i);
    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_mknod(const char *path, mode_t mode, dev_t rdev)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,path);

    int res;

    res = mknod(i, mode, rdev);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_mkdir(const char *path, mode_t mode)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,path);

    int res;

    res = mkdir(i, mode);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_unlink(const char *path)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,path);

    int res;

    res = unlink(i);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_rmdir(const char *path)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,path);
    int res;

    res = rmdir(i);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_symlink(const char *from, const char *to)
{
    int res;

    res = symlink(from, to);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_rename(const char *from, const char *to)
{
    int res;

    res = rename(from, to);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_link(const char *from, const char *to)
{
    int res;

    res = link(from, to);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_chmod(const char *path, mode_t mode)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,path);
    int res;

    res = chmod(i, mode);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_chown(const char *path, uid_t uid, gid_t gid)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,path);

    int res;

    res = lchown(i, uid, gid);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_truncate(const char *path, off_t size)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,path);

    int res;

    res = truncate(i, size);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_utime(const char *path, struct utimbuf *buf)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,path);

    int res;

    res = utime(i, buf);
    if(res == -1)
    return -errno;

    return 0;
}


static int xmp_open(const char *path, int flags)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,path);

    int res;

    res = open(i, 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)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,path);

    int fd;
    int res;

    fd = open(i, 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)
{
    char i[2000];
    strcpy(i,direction);
    strcat(i,path);

    int fd;
    int res;

    fd = open(i, O_WRONLY);
    if(fd == -1)
        return -errno;

    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

    (void) path;
    (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

    (void) path;
    (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;
}


Source code diatas adalah sebuah file system pada umumnya. Misal anda ingin membuat sebuah sistem, jika file dicopy, maka hasil copyannya nanti akan muncul sebuah ekstensi tambahan .copy, maka anda utak-atik sendiri di fungsinya.

Berikut ini penjelasan secara garis besar tentang fungsi - fungsi yang ada di dalam fuse tersebut

getattr : memungkinkan FUSE dapat mengakses data-data yang unik seperti angka, karakter, array
getdir : mendapatkan alamat asli dari folder yang di FUSE kan
mknod : untuk membuat file baru (berkas). jika fungsi ini hilang, maka di dalam FUSE tersebut kita tidak bisa membuat file baru
mkdir : membuat folder baru
rmdir : menghapus foler
rename : mengganti nama berkas 
chmod : mengganti permisi file
chown : mengganti pemilik berkas
truncate : mengganti alokasi memory untuk setiap file 
open : membuka suatu file
read : menerima inputan dari pengguna yang nantinya disimpan di memory komputer
write : menuliskan data hasil READ yang telah disimpan di memory, ke file yang sedang dibuka.

Lalu cara menjalankan fuse tersebut adalah

Komentar

Postingan populer dari blog ini

Membuat KAK Perusahaan Ekspedisi

Kerangka Acuan Kerja Pengembangan Sistem Informasi Pengiriman Barang dan Tracking Armada GO - Logistik A. Latar Belakang Proses pengiriman barang oleh perusahaan ekspedisi merupkana proses bisnis yang paling penting saat ini. Hal ini sangat diperlukan karena dapat membantu masyarakat luas untuk menunjang bisnis atau kegiatan mereka. Maka dari itu banyak sekali pelaku bisnis yang menawarkan jasa tersebut.  Karena banyak sekali pelaku bisnis yang menawarkan jasa tersebut, perusahaan ekspedisi ini berusaha untuk memberikan fasilitas yang terbaik untuk pelanggannya, yaitu berupa aplikasi tracking lokasi arma pengiriman barang. Dengan adanya aplikasi ini, perusahaan dan pelanggan dapat memantau langsung proses ekspedisi tersebut. B. Maksud dan Tujuan Maksud dan tujuan dari aplikasi ini adalah untuk mempermudah pelanggan dalam mengetahui lokasi armada yang sedang melakukan proses ekspedisi tersebut, dan bertujuan untuk memberikan rasa percaya dan juga rasa aman lebih ...

MPPL - Pertemuan 1

MANAJEMEN PROYEK PERANGKAT LUNAK Perangkat Lunak (Software) Perangkat lunak atau software merupakan aplikasi yang terdiri dari sekumpulan kode atau instruksi, yang berisi data dan dokumentasi atau petunjuk manual untuk menyelesaikan suatu permasalahan. Proyek Proyek adalah suatu kegiatan yangn mempunyai batasan waktu (bersifat sementara), biaya dan resource untuk mencapai sebuah tujuan. Manajemen Manajemen adalah kegiatan mengatur, mengelola berupa perencanaan, pelaksanaan dan controlling. Dari tiga pengertian diatas maka dapat disimpulkan bahwa Manajemen Proyek Perangkat Lunak (MPPL) adalah aktivitas untuk perencanaan, pelaksanaan sampai pada tahap controlling terhadap pembuatan suatu perangkat lunak dengan menggunakan resource yang ada dalam jangka waktu tertentu untuk memenuhi kebutuhan guna menyelesaikan suatu permasalahan. Dalam MPPL, terdapat stakholder yang mempunyai peran masing-masing dalam manajemen proyek pernagkat lunak, yaitu: Proyek Merupakan suatu kegia...

[PWEB] Grocery CRUD

Untuk memudahkan user dalam membuat CRUD (Create Read Update Delete), dapat menggunakan grocery crud 1) Langkah pertama yaitu buka localhost/phpmyadmin dan buatlah sebuah database dan beserta tabelnya. Dibawah ini adalah contohnya 2) Lalu buka file grocery_crud pada text editor Anda (disini saya menggunakan Sublime). Buka di /application/config/database.php. Lalu ketik seperti dibawah ini <?php defined('BASEPATH') OR exit('No direct script access allowed'); /* | ------------------------------------------------------------------- | DATABASE CONNECTIVITY SETTINGS | ------------------------------------------------------------------- | This file will contain the settings needed to access your database. | | For complete instructions please consult the 'Database Connection' | page of the User Guide. | | ------------------------------------------------------------------- | EXPLANATION OF VARIABLES | ---------------...