aboutsummaryrefslogtreecommitdiffstats
path: root/fusexmp.c
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2001-11-07 12:09:43 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2001-11-07 12:09:43 +0000
commit97c61e98b4cb4115c5d1191edefdab125a9e16fd (patch)
treeb67b00056e2bf76ef5019b81817b3e1817e99427 /fusexmp.c
parent2df1c04f30802df9a23a19e22042884430c429d2 (diff)
downloadlibfuse-97c61e98b4cb4115c5d1191edefdab125a9e16fd.tar.gz
build with automake
Diffstat (limited to 'fusexmp.c')
-rw-r--r--fusexmp.c410
1 files changed, 0 insertions, 410 deletions
diff --git a/fusexmp.c b/fusexmp.c
deleted file mode 100644
index b00039d..0000000
--- a/fusexmp.c
+++ /dev/null
@@ -1,410 +0,0 @@
-#ifdef linux
-/* For pread()/pwrite() */
-#define _XOPEN_SOURCE 500
-#endif
-
-/* For setgroups() */
-#define _BSD_SOURCE
-
-#include <fuse.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <errno.h>
-#include <signal.h>
-#include <utime.h>
-#include <fcntl.h>
-#include <grp.h>
-#include <sys/fsuid.h>
-
-static struct fuse *xmp_fuse;
-
-static int set_creds(struct fuse_cred *cred)
-{
- int res;
-
- res = setfsuid(cred->uid);
- if(res == -1)
- return -errno;
-
- res = setfsgid(cred->gid);
- if(res == -1)
- return -errno;
-
- return 0;
-}
-
-static void restore_creds()
-{
- setfsuid(getuid());
- setfsgid(getgid());
-}
-
-static int xmp_getattr(struct fuse_cred *cred, const char *path,
- struct stat *stbuf)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = lstat(path, stbuf);
- restore_creds();
- if(res == -1)
- return -errno;
-
- return 0;
-}
-
-static int xmp_readlink(struct fuse_cred *cred, const char *path, char *buf,
- size_t size)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = readlink(path, buf, size - 1);
- restore_creds();
- if(res == -1)
- return -errno;
-
- buf[res] = '\0';
- return 0;
-}
-
-
-static int xmp_getdir(struct fuse_cred *cred, const char *path, fuse_dirh_t h,
- fuse_dirfil_t filler)
-{
- DIR *dp;
- struct dirent *de;
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- dp = opendir(path);
- restore_creds();
- 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(struct fuse_cred *cred, const char *path, mode_t mode,
- dev_t rdev)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = mknod(path, mode, rdev);
- restore_creds();
- if(res == -1)
- return -errno;
-
- return 0;
-}
-
-static int xmp_mkdir(struct fuse_cred *cred, const char *path, mode_t mode)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = mkdir(path, mode);
- restore_creds();
- if(res == -1)
- return -errno;
-
- return 0;
-}
-
-static int xmp_unlink(struct fuse_cred *cred, const char *path)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = unlink(path);
- restore_creds();
- if(res == -1)
- return -errno;
-
- return 0;
-}
-
-static int xmp_rmdir(struct fuse_cred *cred, const char *path)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = rmdir(path);
- restore_creds();
- if(res == -1)
- return -errno;
-
- return 0;
-}
-
-static int xmp_symlink(struct fuse_cred *cred, const char *from,
- const char *to)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = symlink(from, to);
- restore_creds();
- if(res == -1)
- return -errno;
-
- return 0;
-}
-
-static int xmp_rename(struct fuse_cred *cred, const char *from, const char *to)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = rename(from, to);
- restore_creds();
- if(res == -1)
- return -errno;
-
- return 0;
-}
-
-static int xmp_link(struct fuse_cred *cred, const char *from, const char *to)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = link(from, to);
- restore_creds();
- if(res == -1)
- return -errno;
-
- return 0;
-}
-
-static int xmp_chmod(struct fuse_cred *cred, const char *path, mode_t mode)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = chmod(path, mode);
- restore_creds();
- if(res == -1)
- return -errno;
-
- return 0;
-}
-
-static int xmp_chown(struct fuse_cred *cred, const char *path, uid_t uid,
- gid_t gid)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = lchown(path, uid, gid);
- restore_creds();
- if(res == -1)
- return -errno;
-
- return 0;
-}
-
-static int xmp_truncate(struct fuse_cred *cred, const char *path, off_t size)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = truncate(path, size);
- restore_creds();
- if(res == -1)
- return -errno;
-
- return 0;
-}
-
-static int xmp_utime(struct fuse_cred *cred, const char *path,
- struct utimbuf *buf)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = utime(path, buf);
- restore_creds();
- if(res == -1)
- return -errno;
-
- return 0;
-}
-
-
-static int xmp_open(struct fuse_cred *cred, const char *path, int flags)
-{
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- res = open(path, flags);
- restore_creds();
- if(res == -1)
- return -errno;
-
- close(res);
- return 0;
-}
-
-static int xmp_read(struct fuse_cred *cred, const char *path, char *buf,
- size_t size, off_t offset)
-{
- int fd;
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- fd = open(path, O_RDONLY);
- restore_creds();
- if(fd == -1)
- return -errno;
-
- res = pread(fd, buf, size, offset);
- if(res == -1)
- res = -errno;
-
- close(fd);
- return res;
-}
-
-static int xmp_write(struct fuse_cred *cred, const char *path, const char *buf,
- size_t size, off_t offset)
-{
- int fd;
- int res;
-
- res = set_creds(cred);
- if(res)
- return res;
- fd = open(path, O_WRONLY);
- restore_creds();
- if(fd == -1)
- return -errno;
-
- res = pwrite(fd, buf, size, offset);
- if(res == -1)
- res = -errno;
-
- close(fd);
- return res;
-}
-
-static void exit_handler()
-{
- exit(0);
-}
-
-static void set_signal_handlers()
-{
- struct sigaction sa;
-
- sa.sa_handler = exit_handler;
- sigemptyset(&(sa.sa_mask));
- sa.sa_flags = 0;
-
- if (sigaction(SIGHUP, &sa, NULL) == -1 ||
- sigaction(SIGINT, &sa, NULL) == -1 ||
- sigaction(SIGTERM, &sa, NULL) == -1) {
-
- perror("Cannot set exit signal handlers");
- exit(1);
- }
-
- sa.sa_handler = SIG_IGN;
-
- if(sigaction(SIGPIPE, &sa, NULL) == -1) {
- perror("Cannot set ignored signals");
- exit(1);
- }
-}
-
-static void cleanup()
-{
- fuse_unmount(xmp_fuse);
- fuse_destroy(xmp_fuse);
-}
-
-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,
-};
-
-int main(int argc, char *argv[])
-{
- int res;
- if(argc != 2) {
- fprintf(stderr, "usage: %s mount_dir\n", argv[0]);
- exit(1);
- }
-
- set_signal_handlers();
- atexit(cleanup);
- setgroups(0, NULL);
-
- xmp_fuse = fuse_new(0,0);
- res = fuse_mount(xmp_fuse, argv[1]);
- if(res == -1)
- exit(1);
-
- fuse_set_operations(xmp_fuse, &xmp_oper);
-
- fuse_loop(xmp_fuse);
-
- return 0;
-}