#define FUSE_USE_VERSION 31
#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <stddef.h>
#include <assert.h>
static struct options {
        const char *filename;
        const char *contents;
        int show_help;
} options;
#define OPTION(t, p)                           \
    { t, offsetof(struct options, p), 1 }
static const struct fuse_opt option_spec[] = {
         OPTION("--name=%s", filename),
        OPTION("--contents=%s", contents),
        OPTION("-h", show_help),
        OPTION("--help", show_help),
};
{
        (void) conn;
        return NULL;
}
static int hello_getattr(const char *path, struct stat *stbuf,
{
        (void) fi;
        int res = 0;
        memset(stbuf, 0, sizeof(struct stat));
        if (strcmp(path, "/") == 0) {
                stbuf->st_mode = S_IFDIR | 0755;
                stbuf->st_nlink = 2;
        } else if (strcmp(path+1, options.filename) == 0) {
                stbuf->st_mode = S_IFREG | 0444;
                stbuf->st_nlink = 1;
                stbuf->st_size = strlen(options.contents);
        } else
                res = -ENOENT;
        return res;
}
static int hello_readdir(
const char *path, 
void *buf, 
fuse_fill_dir_t filler,
 {
        (void) offset;
        (void) fi;
        (void) flags;
        if (strcmp(path, "/") != 0)
                return -ENOENT;
        filler(buf, ".", NULL, 0, 0);
        filler(buf, "..", NULL, 0, 0);
        filler(buf, options.filename, NULL, 0, 0);
        return 0;
}
{
        if (strcmp(path+1, options.filename) != 0)
                return -ENOENT;
        if ((fi->
flags & O_ACCMODE) != O_RDONLY)
                 return -EACCES;
        return 0;
}
static int hello_read(const char *path, char *buf, size_t size, off_t offset,
{
        size_t len;
        (void) fi;
        if(strcmp(path+1, options.filename) != 0)
                return -ENOENT;
        len = strlen(options.contents);
        if (offset < len) {
                if (offset + size > len)
                memcpy(buf, options.contents + offset, size);
        } else
                size = 0;
        return size;
}
        .getattr        = hello_getattr,
        .readdir        = hello_readdir,
        .open           = hello_open,
        .read           = hello_read,
};
static void show_help(const char *progname)
{
        printf("usage: %s [options] <mountpoint>\n\n", progname);
        printf("File-system specific options:\n"
               "    --name=<s>          Name of the \"hello\" file\n"
               "                        (default: \"hello\")\n"
               "    --contents=<s>      Contents \"hello\" file\n"
               "                        (default \"Hello, World!\\n\")\n"
               "\n");
}
int main(int argc, char *argv[])
{
        int ret;
        
        options.filename = strdup("hello");
        options.contents = strdup("Hello World!\n");
        
                return 1;
        
        if (options.show_help) {
                show_help(argv[0]);
        }
        return ret;
}