diff options
author | Dmitry Marakasov <amdmi3@FreeBSD.org> | 2009-03-15 13:37:45 +0000 |
---|---|---|
committer | Dmitry Marakasov <amdmi3@FreeBSD.org> | 2009-03-15 13:37:45 +0000 |
commit | caf91f941a81a03a9c3b136fa19fb7e2dcb37d3c (patch) | |
tree | f087dcc0e77427efdc3fc58a5b436e8255daa68b /sysutils | |
parent | eab26b112d93330036a786337434ff394afb90b1 (diff) | |
download | ports-caf91f941a81a03a9c3b136fa19fb7e2dcb37d3c.tar.gz ports-caf91f941a81a03a9c3b136fa19fb7e2dcb37d3c.zip |
Notes
Diffstat (limited to 'sysutils')
-rw-r--r-- | sysutils/Makefile | 1 | ||||
-rw-r--r-- | sysutils/fusefs-afuse/Makefile | 40 | ||||
-rw-r--r-- | sysutils/fusefs-afuse/distinfo | 3 | ||||
-rw-r--r-- | sysutils/fusefs-afuse/files/patch-afuse.1 | 98 | ||||
-rw-r--r-- | sysutils/fusefs-afuse/files/patch-src_afuse.c | 229 | ||||
-rw-r--r-- | sysutils/fusefs-afuse/files/pkg-message.in | 7 | ||||
-rw-r--r-- | sysutils/fusefs-afuse/pkg-descr | 16 |
7 files changed, 394 insertions, 0 deletions
diff --git a/sysutils/Makefile b/sysutils/Makefile index 27b83c729e0a..3b4d5f9460cd 100644 --- a/sysutils/Makefile +++ b/sysutils/Makefile @@ -235,6 +235,7 @@ SUBDIR += fstyp SUBDIR += ftrace SUBDIR += ftwin + SUBDIR += fusefs-afuse SUBDIR += fusefs-chironfs SUBDIR += fusefs-cryptofs SUBDIR += fusefs-curlftpfs 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/ |