2018-07-21 03:51:49 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
2018-07-22 12:50:51 +02:00
|
|
|
/* must be included before including <fuse.h> */
|
|
|
|
#define FUSE_USE_VERSION 26
|
|
|
|
#include <fuse.h>
|
|
|
|
|
2018-07-21 03:51:49 +02:00
|
|
|
#include "network.h"
|
|
|
|
#include "fuse_local.h"
|
|
|
|
|
2018-07-22 12:50:51 +02:00
|
|
|
static const char *hello_str = "Hello World!\n";
|
|
|
|
static const char *hello_path = "/hello";
|
|
|
|
|
2018-07-22 05:26:22 +02:00
|
|
|
static struct fuse_operations fs_oper = {
|
2018-07-21 03:51:49 +02:00
|
|
|
.getattr = fs_getattr,
|
|
|
|
.readdir = fs_readdir,
|
|
|
|
.open = fs_open,
|
|
|
|
.read = fs_read,
|
|
|
|
};
|
2018-07-22 05:26:22 +02:00
|
|
|
|
2018-07-22 12:50:51 +02:00
|
|
|
/** \brief return the attributes for a single file indicated by path */
|
2018-07-22 05:26:22 +02:00
|
|
|
static int fs_getattr(const char *path, struct stat *stbuf)
|
|
|
|
{
|
|
|
|
int res = 0;
|
|
|
|
|
|
|
|
memset(stbuf, 0, sizeof(struct stat));
|
|
|
|
if (strcmp(path, "/") == 0) {
|
|
|
|
stbuf->st_mode = S_IFDIR | 0755;
|
2018-07-22 12:50:51 +02:00
|
|
|
stbuf->st_nlink = 100;
|
|
|
|
} else if (strcmp(path, fs_path) == 0) {
|
2018-07-22 05:26:22 +02:00
|
|
|
stbuf->st_mode = S_IFREG | 0444;
|
2018-07-22 12:50:51 +02:00
|
|
|
stbuf->st_nlink = 100;
|
|
|
|
stbuf->st_size = strlen(fs_str);
|
2018-07-22 05:26:22 +02:00
|
|
|
} else
|
|
|
|
res = -ENOENT;
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
2018-07-22 12:50:51 +02:00
|
|
|
|
|
|
|
/** \brief read the directory indicated by the path*/
|
|
|
|
static int fs_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
|
|
|
|
off_t offset, struct fuse_file_info *fi)
|
|
|
|
{
|
|
|
|
(void) offset;
|
|
|
|
(void) fi;
|
|
|
|
|
|
|
|
if (strcmp(path, "/") != 0)
|
|
|
|
return -ENOENT;
|
|
|
|
|
|
|
|
filler(buf, ".", NULL, 0);
|
|
|
|
filler(buf, "..", NULL, 0);
|
|
|
|
filler(buf, fs_path + 1, NULL, 0);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** \brief open a file indicated by the path */
|
|
|
|
static int fs_open(const char *path, struct fuse_file_info *fi)
|
|
|
|
{
|
|
|
|
if (strcmp(path, fs_path) != 0)
|
|
|
|
return -ENOENT;
|
|
|
|
|
|
|
|
if ((fi->flags & 3) != O_RDONLY)
|
|
|
|
return -EACCES;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** \brief read a file */
|
|
|
|
static int fs_read(const char *path, char *buf, size_t size, off_t offset,
|
|
|
|
struct fuse_file_info *fi)
|
|
|
|
{
|
|
|
|
size_t len;
|
|
|
|
(void) fi;
|
|
|
|
if(strcmp(path, fs_path) != 0)
|
|
|
|
return -ENOENT;
|
|
|
|
|
|
|
|
len = strlen(fs_str);
|
|
|
|
if (offset < len) {
|
|
|
|
if (offset + size > len)
|
|
|
|
size = len - offset;
|
|
|
|
memcpy(buf, fs_str + offset, size);
|
|
|
|
} else
|
|
|
|
size = 0;
|
|
|
|
|
|
|
|
return size;
|
|
|
|
}
|