aboutsummaryrefslogtreecommitdiff
path: root/sysutils/fusefs-afuse
diff options
context:
space:
mode:
authorDmitry Marakasov <amdmi3@FreeBSD.org>2009-03-15 13:37:45 +0000
committerDmitry Marakasov <amdmi3@FreeBSD.org>2009-03-15 13:37:45 +0000
commitcaf91f941a81a03a9c3b136fa19fb7e2dcb37d3c (patch)
treef087dcc0e77427efdc3fc58a5b436e8255daa68b /sysutils/fusefs-afuse
parenteab26b112d93330036a786337434ff394afb90b1 (diff)
downloadports-caf91f941a81a03a9c3b136fa19fb7e2dcb37d3c.tar.gz
ports-caf91f941a81a03a9c3b136fa19fb7e2dcb37d3c.zip
Afuse is an automounting file system implemented in user-space using
FUSE. Afuse currently implements the most basic functionality that can be expected by an automounter; that is it manages a directory of virtual directories. If one of these virtual directories is accessed and is not already automounted, afuse will attempt to mount a filesystem onto that directory. If the mount succeeds the requested access proceeds as normal, otherwise it will fail with an error. The advantage of using afuse over traditional automounters is that afuse is designed to run entirely in user-space by individual users. This way an automounting action can take advantage of the invoking users environment, for example allowing access to an ssh-agent for password-less sshfs mounts, or allowing access to a graphical environment to get user input to complete a mount (i.e. popping up a window asking for a password). WWW: http://afuse.sourceforge.net/ PR: 132309 Submitted by: Alexander Logvinov <ports at logvinov dot com>
Notes
Notes: svn path=/head/; revision=230123
Diffstat (limited to 'sysutils/fusefs-afuse')
-rw-r--r--sysutils/fusefs-afuse/Makefile40
-rw-r--r--sysutils/fusefs-afuse/distinfo3
-rw-r--r--sysutils/fusefs-afuse/files/patch-afuse.198
-rw-r--r--sysutils/fusefs-afuse/files/patch-src_afuse.c229
-rw-r--r--sysutils/fusefs-afuse/files/pkg-message.in7
-rw-r--r--sysutils/fusefs-afuse/pkg-descr16
6 files changed, 393 insertions, 0 deletions
diff --git a/sysutils/fusefs-afuse/Makefile b/sysutils/fusefs-afuse/Makefile
new file mode 100644
index 000000000000..f713619e53fe
--- /dev/null
+++ b/sysutils/fusefs-afuse/Makefile
@@ -0,0 +1,40 @@
+# New ports collection makefile for: afuse
+# Date created: 03 March 2009
+# Whom: Alexander Logvinov <ports@logvinov.com>
+# $FreeBSD$
+#
+
+PORTNAME= afuse
+PORTVERSION= 0.2
+CATEGORIES= sysutils
+MASTER_SITES= SF
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= ports@logvinov.com
+COMMENT= An automounting file system implemented in user-space using FUSE
+
+RUN_DEPENDS= ${LOCALBASE}/modules/fuse.ko:${PORTSDIR}/sysutils/fusefs-kmod
+LIB_DEPENDS= fuse.2:${PORTSDIR}/sysutils/fusefs-libs
+
+GNU_CONFIGURE= yes
+
+PORTDOCS= AUTHORS ChangeLog README
+PLIST_FILES= bin/${PORTNAME}
+
+MAN1= afuse.1
+
+.if !defined(NOPORTDOCS)
+SUB_FILES= pkg-message
+.endif
+
+post-install:
+ ${INSTALL_MAN} ${WRKSRC}/${MAN1} ${MAN1PREFIX}/man/man1
+.if !defined(NOPORTDOCS)
+ @${MKDIR} ${DOCSDIR}
+.for i in ${PORTDOCS}
+ ${INSTALL_DATA} ${WRKSRC}/${i} ${DOCSDIR}
+.endfor
+ @${CAT} ${PKGMESSAGE}
+.endif
+
+.include <bsd.port.mk>
diff --git a/sysutils/fusefs-afuse/distinfo b/sysutils/fusefs-afuse/distinfo
new file mode 100644
index 000000000000..c1943df37818
--- /dev/null
+++ b/sysutils/fusefs-afuse/distinfo
@@ -0,0 +1,3 @@
+MD5 (afuse-0.2.tar.gz) = 97b58a768ecb30696fb6c33dd8435b83
+SHA256 (afuse-0.2.tar.gz) = 92faa853bfeaa1446b80edbc6bb29a29f8dcf07149958be5eafc2da0679342d2
+SIZE (afuse-0.2.tar.gz) = 100568
diff --git a/sysutils/fusefs-afuse/files/patch-afuse.1 b/sysutils/fusefs-afuse/files/patch-afuse.1
new file mode 100644
index 000000000000..b316e0a1197e
--- /dev/null
+++ b/sysutils/fusefs-afuse/files/patch-afuse.1
@@ -0,0 +1,98 @@
+--- afuse.1.orig
++++ afuse.1
+@@ -0,0 +1,95 @@
++.TH AFUSE 1 "October 12, 2006"
++.SH NAME
++AFUSE \- automounting file system implemented in user-space using FUSE
++.SH DESCRIPTION
++usage: afuse mountpoint [options]
++.SS "general options:"
++.TP
++\fB\-o\fR opt,[opt...]
++mount options
++.TP
++\fB\-h\fR \fB\-\-help\fR
++print help
++.TP
++\fB\-V\fR \fB\-\-version\fR
++print FUSE version information
++.SS "AFUSE options:"
++.TP
++\fB\-o\fR \fB\ mount_template=CMD\fR
++template for CMD to execute to mount (*)
++.TP
++\fB\-o\fR \fB\ unmount_template=CMD\fR
++template for CMD to execute to unmount (*) (**)
++.TP
++(*) - When executed, %r and %m are expanded in templates to the root
++directory name for the new mount point, and the actual directory to
++mount onto respectively to mount onto. Both templates are REQUIRED.
++.TP
++(**)- The unmount command must perform a lazy unmount operation. E.g. the
++\-u \-z options to fusermount, or \-l for regular mount.
++.SS "FUSE options:"
++.TP
++\fB\-d\fR \fB\-o\fR debug
++enable debug output (implies \fB\-f\fR)
++.TP
++\fB\-f\fR
++foreground operation
++.TP
++\fB\-s\fR
++disable multi\-threaded operation
++.TP
++\fB\-o\fR allow_other
++allow access to other users
++.TP
++\fB\-o\fR allow_root
++allow access to root
++.TP
++\fB\-o\fR nonempty
++allow mounts over non\-empty file/dir
++.HP
++\fB\-o\fR default_permissions enable permission checking by kernel
++.TP
++\fB\-o\fR fsname=NAME
++set filesystem name
++.TP
++\fB\-o\fR large_read
++issue large read requests (2.4 only)
++.TP
++\fB\-o\fR max_read=N
++set maximum size of read requests
++.TP
++\fB\-o\fR hard_remove
++immediate removal (don't hide files)
++.TP
++\fB\-o\fR use_ino
++let filesystem set inode numbers
++.TP
++\fB\-o\fR readdir_ino
++try to fill in d_ino in readdir
++.TP
++\fB\-o\fR direct_io
++use direct I/O
++.TP
++\fB\-o\fR kernel_cache
++cache files in kernel
++.TP
++\fB\-o\fR umask=M
++set file permissions (octal)
++.TP
++\fB\-o\fR uid=N
++set file owner
++.TP
++\fB\-o\fR gid=N
++set file group
++.TP
++\fB\-o\fR entry_timeout=T
++cache timeout for names (1.0s)
++.TP
++\fB\-o\fR negative_timeout=T
++cache timeout for deleted names (0.0s)
++.TP
++\fB\-o\fR attr_timeout=T
++cache timeout for attributes (1.0s)
++.SH AUTHOR
++This manual page was written by Varun Hiremath <varunhiremath@gmail.com>,
++for the Debian project (but may be used by others).
diff --git a/sysutils/fusefs-afuse/files/patch-src_afuse.c b/sysutils/fusefs-afuse/files/patch-src_afuse.c
new file mode 100644
index 000000000000..fb15d842bc6d
--- /dev/null
+++ b/sysutils/fusefs-afuse/files/patch-src_afuse.c
@@ -0,0 +1,229 @@
+--- src/afuse.c.orig 2009-03-03 13:17:22.000000000 +0900
++++ src/afuse.c 2009-03-03 13:17:27.000000000 +0900
+@@ -36,7 +36,6 @@
+ #include <string.h>
+ #include <stddef.h>
+ #include <unistd.h>
+-#include <alloca.h>
+ #include <fcntl.h>
+ #include <dirent.h>
+ #include <errno.h>
+@@ -280,14 +280,19 @@
+ }
+
+
+-// !!FIXME!! allow escaping of %'s
+ // Note: this method strips out quotes and applies them itself as should be appropriate
+-char *expand_template(const char *template, const char *mount_point, const char *root_name)
++bool run_template(const char *template, const char *mount_point, const char *root_name)
+ {
+ int len = 0;
++ int nargs = 1;
+ int i;
+- char *expanded_name;
+- char *expanded_name_start;
++ char *buf;
++ char *p;
++ char **args;
++ char **arg;
++ bool quote = false;
++ pid_t pid;
++ int status;
+
+ // calculate length
+ for(i = 0; template[i]; i++)
+@@ -295,53 +300,100 @@
+ switch(template[i + 1])
+ {
+ case 'm':
+- len += strlen(mount_point) + 2;
++ len += strlen(mount_point);
+ i++;
+ break;
+ case 'r':
+- len += strlen(root_name) + 2;
++ len += strlen(root_name);
++ i++;
++ break;
++ case '%':
++ len++;
+ i++;
+ break;
+ }
+- } else if(template[i] != '"')
++ } else if(template[i] == ' ' && !quote) {
++ len++;
++ nargs++;
++ } else if(template[i] == '"')
++ quote = !quote;
++ else if(template[i] == '\\' && template[i + 1])
++ len++, i++;
++ else
+ len++;
+
+- expanded_name_start = expanded_name = my_malloc(len + 1);
++ buf = my_malloc(len + 1);
++ args = my_malloc((nargs + 1) * sizeof(*args));
++
++ p = buf;
++ arg = args;
++ *arg++ = p;
+
+ for(i = 0; template[i]; i++)
+ if(template[i] == '%') {
+- int j = 0;
+ switch(template[i + 1])
+ {
+ case 'm':
+- *expanded_name++ = '"';
+- while(mount_point[j])
+- *expanded_name++ = mount_point[j++];
+- *expanded_name++ = '"';
++ strcpy(p, mount_point);
++ p += strlen(mount_point);
+ i++;
+ break;
+ case 'r':
+- *expanded_name++ = '"';
+- while(root_name[j])
+- *expanded_name++ = root_name[j++];
+- *expanded_name++ = '"';
++ strcpy(p, root_name);
++ p += strlen(root_name);
++ i++;
++ break;
++ case '%':
++ *p++ = '%';
+ i++;
+ break;
+ }
+- } else if(template[i] != '"')
+- *expanded_name++ = template[i];
+-
+- *expanded_name = '\0';
+-
+- return expanded_name_start;
++ } else if(template[i] == ' ' && !quote) {
++ *p++ = '\0';
++ *arg++ = p;
++ } else if(template[i] == '"')
++ quote = !quote;
++ else if(template[i] == '\\' && template[i + 1])
++ *p++ = template[++i];
++ else
++ *p++ = template[i];
++
++ *p = '\0';
++ *arg = NULL;
++
++ pid = fork();
++ if(pid == -1) {
++ fprintf(stderr, "Failed to fork (%s)\n", strerror(errno));
++ free(args);
++ free(buf);
++ return false;
++ }
++ if(pid == 0) {
++ execvp(args[0], args);
++ abort();
++ }
++ pid = waitpid(pid, &status, 0);
++ if(pid == -1) {
++ fprintf(stderr, "Failed to waitpid (%s)\n", strerror(errno));
++ free(args);
++ free(buf);
++ return false;
++ }
++ if(!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
++ fprintf(stderr, "Failed to invoke command: %s\n", args[0]);
++ free(args);
++ free(buf);
++ return false;
++ }
++ free(args);
++ free(buf);
++ return true;
+ }
+
+ mount_list_t *do_mount(const char *root_name)
+ {
+ char *mount_point;
+- char *mount_command;
+ mount_list_t *mount;
+- int sysret;
+
+ fprintf(stderr, "Mounting: %s\n", root_name);
+
+@@ -351,57 +403,33 @@
+ return NULL;
+ }
+
+- mount_command = expand_template(user_options.mount_command_template,
+- mount_point, root_name);
+- sysret = system(mount_command);
+-
+- fprintf(stderr, "sysret: %.8x\n", sysret);
+-
+- if(sysret) {
+- fprintf(stderr, "Failed to invoke mount command: '%s' (%s)\n",
+- mount_command, sysret != -1 ?
+- "Error executing mount" :
+- strerror(errno));
+-
++ if(!run_template(user_options.mount_command_template,
++ mount_point, root_name)) {
+ // remove the now unused directory
+ if( rmdir(mount_point) == -1 )
+ fprintf(stderr, "Failed to remove mount point dir: %s (%s)",
+ mount_point, strerror(errno));
+
+- free(mount_command);
+ free(mount_point);
+ return NULL;
+ }
+
+ mount = add_mount(root_name, mount_point);
+-
+- free(mount_command);
+ return mount;
+ }
+
+ int do_umount(mount_list_t *mount)
+ {
+- char *unmount_command;
+- int sysret;
+-
+ fprintf(stderr, "Unmounting: %s\n", mount->root_name);
+
+- unmount_command = expand_template(user_options.unmount_command_template,
+- mount->mount_point, mount->root_name);
+- sysret = system(unmount_command);
+- if(sysret) {
+- fprintf(stderr, "Failed to invoke unmount command: '%s' (%s)\n",
+- unmount_command, sysret != -1 ?
+- "Error executing mount" :
+- strerror(errno));
+- /* Still unmount anyway */
+- }
++ run_template(user_options.unmount_command_template,
++ mount->mount_point, mount->root_name);
++ /* Still unmount anyway */
+
+ if( rmdir(mount->mount_point) == -1 )
+ fprintf(stderr, "Failed to remove mount point dir: %s (%s)",
+ mount->mount_point, strerror(errno));
+ remove_mount(mount);
+- free(unmount_command);
+ return 1;
+ }
+
+@@ -1504,7 +1504,8 @@
+ fuse_opt_add_arg(&args, "-s");
+
+ // Adjust user specified timeout from seconds to microseconds as required
+- user_options.auto_unmount_delay *= 1000000;
++ if(user_options.auto_unmount_delay != UINT64_MAX)
++ user_options.auto_unmount_delay *= 1000000;
+
+ auto_unmount_ph_init(&auto_unmount_ph);
+
diff --git a/sysutils/fusefs-afuse/files/pkg-message.in b/sysutils/fusefs-afuse/files/pkg-message.in
new file mode 100644
index 000000000000..c5e420f09692
--- /dev/null
+++ b/sysutils/fusefs-afuse/files/pkg-message.in
@@ -0,0 +1,7 @@
+
+===============================================================================
+
+Additional info about program usage can be found at
+%%DOCSDIR%%/README.
+
+===============================================================================
diff --git a/sysutils/fusefs-afuse/pkg-descr b/sysutils/fusefs-afuse/pkg-descr
new file mode 100644
index 000000000000..c66582b84981
--- /dev/null
+++ b/sysutils/fusefs-afuse/pkg-descr
@@ -0,0 +1,16 @@
+Afuse is an automounting file system implemented in user-space using
+FUSE. Afuse currently implements the most basic functionality that can
+be expected by an automounter; that is it manages a directory of virtual
+directories. If one of these virtual directories is accessed and is not
+already automounted, afuse will attempt to mount a filesystem onto that
+directory. If the mount succeeds the requested access proceeds as normal,
+otherwise it will fail with an error.
+
+The advantage of using afuse over traditional automounters is that afuse
+is designed to run entirely in user-space by individual users. This way an
+automounting action can take advantage of the invoking users environment,
+for example allowing access to an ssh-agent for password-less sshfs
+mounts, or allowing access to a graphical environment to get user input
+to complete a mount (i.e. popping up a window asking for a password).
+
+WWW: http://afuse.sourceforge.net/