aboutsummaryrefslogtreecommitdiff
path: root/example
diff options
context:
space:
mode:
authorGravatar Csaba Henk <csaba@lowlife.hu>2016-12-16 14:47:24 +0100
committerGravatar Nikolaus Rath <Nikolaus@rath.org>2016-12-23 18:14:22 -0800
commitc005ff3288238e60be5526a9bade7186a40e2147 (patch)
treec0717ef9ddd5dd1eeefd11b6e2839eafabf39fe6 /example
parent0d3a165897a0bc58ecb750474abcbd653e739dcb (diff)
Revert "Dropped example/null.c"
This reverts commit d5cdbb94a0650b0a462682cf0a84463ff1513900. null works completely fine, just the mountpoint should be a regular file -- so there is no need to dismiss it. Also: - fixing up compiler warnings - checking if the mountpoint is a regular file
Diffstat (limited to 'example')
-rw-r--r--example/.gitignore1
-rw-r--r--example/Makefile.am2
-rw-r--r--example/null.c137
3 files changed, 139 insertions, 1 deletions
diff --git a/example/.gitignore b/example/.gitignore
index 6dd5004..c5d2cdb 100644
--- a/example/.gitignore
+++ b/example/.gitignore
@@ -1,5 +1,6 @@
/passthrough
/passthrough_fh
+/null
/hello
/hello_ll
/ioctl
diff --git a/example/Makefile.am b/example/Makefile.am
index 6e267a0..81b9555 100644
--- a/example/Makefile.am
+++ b/example/Makefile.am
@@ -2,7 +2,7 @@
AM_CPPFLAGS = -I$(top_srcdir)/include -D_REENTRANT
noinst_HEADERS = ioctl.h
-noinst_PROGRAMS = passthrough passthrough_fh hello hello_ll \
+noinst_PROGRAMS = passthrough passthrough_fh null hello hello_ll \
ioctl ioctl_client poll poll_client \
passthrough_ll notify_inval_inode \
notify_store_retrieve notify_inval_entry \
diff --git a/example/null.c b/example/null.c
new file mode 100644
index 0000000..62ae3d4
--- /dev/null
+++ b/example/null.c
@@ -0,0 +1,137 @@
+/*
+ FUSE: Filesystem in Userspace
+ Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
+
+ This program can be distributed under the terms of the GNU GPL.
+ See the file COPYING.
+*/
+
+/** @file
+ *
+ * null.c - FUSE: Filesystem in Userspace
+ *
+ * \section section_compile compiling this example
+ *
+ * gcc -Wall null.c `pkg-config fuse3 --cflags --libs` -o null
+ *
+ * \section section_source the complete source
+ * \include null.c
+ */
+
+
+#define FUSE_USE_VERSION 30
+
+#include <config.h>
+
+#include <fuse.h>
+#include <fuse_lowlevel.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <errno.h>
+
+static int null_getattr(const char *path, struct stat *stbuf,
+ struct fuse_file_info *fi)
+{
+ (void) fi;
+
+ if(strcmp(path, "/") != 0)
+ return -ENOENT;
+
+ stbuf->st_mode = S_IFREG | 0644;
+ stbuf->st_nlink = 1;
+ stbuf->st_uid = getuid();
+ stbuf->st_gid = getgid();
+ stbuf->st_size = (1ULL << 32); /* 4G */
+ stbuf->st_blocks = 0;
+ stbuf->st_atime = stbuf->st_mtime = stbuf->st_ctime = time(NULL);
+
+ return 0;
+}
+
+static int null_truncate(const char *path, off_t size,
+ struct fuse_file_info *fi)
+{
+ (void) size;
+ (void) fi;
+
+ if(strcmp(path, "/") != 0)
+ return -ENOENT;
+
+ return 0;
+}
+
+static int null_open(const char *path, struct fuse_file_info *fi)
+{
+ (void) fi;
+
+ if(strcmp(path, "/") != 0)
+ return -ENOENT;
+
+ return 0;
+}
+
+static int null_read(const char *path, char *buf, size_t size,
+ off_t offset, struct fuse_file_info *fi)
+{
+ (void) buf;
+ (void) offset;
+ (void) fi;
+
+ if(strcmp(path, "/") != 0)
+ return -ENOENT;
+
+ if (offset >= (1ULL << 32))
+ return 0;
+
+ return size;
+}
+
+static int null_write(const char *path, const char *buf, size_t size,
+ off_t offset, struct fuse_file_info *fi)
+{
+ (void) buf;
+ (void) offset;
+ (void) fi;
+
+ if(strcmp(path, "/") != 0)
+ return -ENOENT;
+
+ return size;
+}
+
+static struct fuse_operations null_oper = {
+ .getattr = null_getattr,
+ .truncate = null_truncate,
+ .open = null_open,
+ .read = null_read,
+ .write = null_write,
+};
+
+int main(int argc, char *argv[])
+{
+ struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
+ struct fuse_cmdline_opts opts;
+ struct stat stbuf;
+
+ if (fuse_parse_cmdline(&args, &opts) != 0)
+ return 1;
+
+ if (!opts.mountpoint) {
+ fprintf(stderr, "missing mountpoint parameter\n");
+ return 1;
+ }
+
+ if (stat(opts.mountpoint, &stbuf) == -1) {
+ fprintf(stderr ,"failed to access mountpoint %s: %s\n",
+ opts.mountpoint, strerror(errno));
+ return 1;
+ }
+ if (!S_ISREG(stbuf.st_mode)) {
+ fprintf(stderr, "mountpoint is not a regular file\n");
+ return 1;
+ }
+
+ return fuse_main(argc, argv, &null_oper, NULL);
+}