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
Notes
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/