gnunet-fuse

GNUnet file-sharing directory mounting via FUSE
Log | Files | Refs | Submodules | README | LICENSE

commit 877c0604ce75a2bf575db74042a375a7dbc5d3c3
parent 79536c5fdc37eca271c04a9b68c8f96ceee7aa87
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sun,  3 Jun 2012 17:46:22 +0000

-making code compile

Diffstat:
Mpo/POTFILES.in | 2+-
Msrc/fuse/Makefile.am | 2+-
Msrc/fuse/gnunet-fuse.c | 356++++++++++++++++++++++++++++++++++++-------------------------------------------
Msrc/fuse/gnunet-fuse.h | 133+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Msrc/fuse/read.c | 7++-----
Msrc/fuse/readdir.c | 12++----------
6 files changed, 242 insertions(+), 270 deletions(-)

diff --git a/po/POTFILES.in b/po/POTFILES.in @@ -1,2 +1,2 @@ # List of source files which contain translatable strings. -src/ext/gnunet-ext.c +src/fuse/gnunet-fuse.c diff --git a/src/fuse/Makefile.am b/src/fuse/Makefile.am @@ -27,7 +27,7 @@ gnunet_fuse_LDADD = \ -lgnunetutil \ -lfuse \ -lgnunetfs \ - $(INTLLIBS) + $(INTLLIBS) $(GNUNET_LIBS) gnunet_fuse_CPPFLAGS = \ -D_FILE_OFFSET_BITS=64 \ -DFUSE_USE_VERSION=26 diff --git a/src/fuse/gnunet-fuse.c b/src/fuse/gnunet-fuse.c @@ -1,128 +1,102 @@ /* - This file is part of GNUnet. - (C) + This file is part of gnunet-fuse. + (C) 2012 Christian Grothoff (and other contributing authors) + + gnunet-fuse is free software; you can redistribute it and/or + modify if under the terms of version 2 of the GNU General Public License + as published by the Free Software Foundation. + + gnunet-fuse is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - GNUnet is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3, or (at your - option) any later version. - - GNUnet is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ /** * @file fuse/gnunet-fuse.c * @brief fuse tool - * @author + * @author Christian Grothoff + * @author Mauricio Günther */ - -#define FUSE_USE_VERSION 26 -#define TESTING GNUNET_YES #include "gnunet-fuse.h" -#include <gnunet/gnunet_container_lib.h> -#include <gnunet/gnunet_crypto_lib.h> - -static int ret; - - - -/* Context for the command. */ -struct CommandContext -{ - /* Argv argument. */ - char *const *args; - - /* Name of the configuration file used, can be NULL! */ - char *cfgfile; - - /* Main function to run. */ - GNUNET_PROGRAM_Main task; - - /* Closure for task. */ - void *task_cls; - /* Configuration to use. */ - const struct GNUNET_CONFIGURATION_Handle *cfg; -}; +/** + * Return code from 'main' (0 on success). + */ +static int ret; +/** + * Flag to determine if we should run in single-threaded mode. + */ +static int single_threaded; -// calling fuse operations - -/*struct with renamed fuseoperations*/ -static struct fuse_operations fops = { - - // .mkdir = gn_mkdir, - // .mknod = gn_mknod, - // .release = gn_release, - // .rename = gn_rename, - // .rmdir = gn_rmdir, - // .truncate = gn_truncate, - // .unlink = gn_unlink, - // .utimens = gn_utimens, - // .write = gn_write, - .getattr = gn_getattr, - .readdir = gn_readdir, - .open = gn_open, - .read = gn_read, -}; +/** + * Mounted URI (as string). + */ +static char *source; +/** + * Mount point. + */ +static char *directory; +/** + * Global mapping of paths to GNUnet URIs (and file names) for + * the respective entries. + */ +struct GNUNET_CONTAINER_MultiHashMap *map; -struct GNUNET_FUSE_path_info * +struct GNUNET_FUSE_PathInfo * create_path_info (const char *path, const struct GNUNET_FS_Uri *uri) { - struct GNUNET_FUSE_path_info * pi; - - /* check if path or uri are NULL, if yes, abort */ - GNUNET_assert (NULL != path); - GNUNET_assert (NULL != uri); - - pi = GNUNET_malloc (sizeof (struct GNUNET_FUSE_path_info)); - pi->path = strdup (path); - pi->uri = GNUNET_FS_uri_dup(uri); - - return pi; + struct GNUNET_FUSE_PathInfo * pi; + pi = GNUNET_malloc (sizeof (struct GNUNET_FUSE_PathInfo)); + pi->path = GNUNET_strdup (path); + pi->uri = GNUNET_FS_uri_dup(uri); + return pi; } + void -delete_path_info (struct GNUNET_FUSE_path_info *pi) +delete_path_info (struct GNUNET_FUSE_PathInfo *pi) { - /* free path */ - GNUNET_free (pi->path); - - /* free uri */ - GNUNET_FS_uri_destroy (pi->uri); + GNUNET_free (pi->path); + GNUNET_FS_uri_destroy (pi->uri); + GNUNET_free (pi); - /* free pi */ - GNUNET_free (pi); } -int cleanup_path_info (void *cls, - const GNUNET_HashCode * key, - void *value) + +/** + * Called on each entry in our global 'map' to clean it up. + * + * @param cls closure, NULL + * @param key current key code + * @param value value in the hash map, a 'struct GNUNET_FUSE_PathInfo' + * @return GNUNET_YES (we should continue to iterate) + */ +static int +cleanup_path_info (void *cls, + const GNUNET_HashCode * key, + void *value) { - struct GNUNET_FUSE_path_info *pi = value; + struct GNUNET_FUSE_PathInfo *pi = value; - delete_path_info (pi); - return 0; + delete_path_info (pi); + return GNUNET_YES; } - - /** - * Main function that will be run by the scheduler. + * Main function that will be run (without the scheduler!) * * @param cls closure * @param args remaining command-line arguments @@ -135,100 +109,90 @@ run (void *cls, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { - int argc; - struct GNUNET_FUSE_path_info *pi; - const struct GNUNET_FS_Uri *uri; - char *emsg; - - ret = 0; - - - if (NULL == source) - { - printf("\n-s option for URI missing\n\n"); - ret = 1; - return; - } - - if (NULL == directory) - { - printf("\n-d option for mountpoint missing\n\n"); - ret = 2; - return; - } - -/* checking for muti- or singlethreading */ - - if (GNUNET_YES == TESTING) - { - argc = 5; - } - else - { - argc = 2; - } - char *a[argc]; - a[0]="gnunet-fuse"; - a[1]= directory; - if (GNUNET_YES == TESTING) - { - a[2] = "-s"; - a[3] = "-f"; - a[4] = "-d"; - } - - - /* parse source string to uri */ - uri = GNUNET_FS_uri_parse(source, &emsg); - - /* check if uri is valid entry */ - if (NULL == uri) - { - printf("\n%s\n\n", emsg); - ret = 3; - return; - } - - - - /* create MultiHashMap, setting len arbitrarily to 10 */ - map = GNUNET_CONTAINER_multihashmap_create (10); - - GNUNET_HashCode path_hash; - char*path = "/" ; - - /* create hashkey */ - GNUNET_CRYPTO_hash (path, strlen (path), &path_hash); - - /* new path */ - - /* print content of variable source, just for personal interest */ - printf("%s\n", source); - - /*check if content of uri isn't NULL, otherwise call abort... */ - GNUNET_assert (NULL != uri); - - /** Mapping path and uri. Store it in struct pi. - * fuse gives us "/" as default. - */ - pi = create_path_info (path, uri); - - /* after having used uri, you must free it */ - GNUNET_FS_uri_destroy (uri); - - /* check if your put was successfull */ - GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put(map, &path_hash, pi, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); - - /* main function of fuse */ - fuse_main(argc, a, &fops, NULL); - - /* after fuse operations iterate and destroy multihashmap map */ - GNUNET_CONTAINER_multihashmap_iterate(map, &cleanup_path_info, NULL); - GNUNET_CONTAINER_multihashmap_destroy(map); + static struct fuse_operations fops = { + // .mkdir = gn_mkdir, + // .mknod = gn_mknod, + // .release = gn_release, + // .rename = gn_rename, + // .rmdir = gn_rmdir, + // .truncate = gn_truncate, + // .unlink = gn_unlink, + // .utimens = gn_utimens, + // .write = gn_write, + .getattr = gn_getattr, + .readdir = gn_readdir, + .open = gn_open, + .read = gn_read + }; + + int argc; + struct GNUNET_FUSE_PathInfo *pi; + struct GNUNET_FS_Uri *uri; + char *emsg; + GNUNET_HashCode path_hash; + const char *path = "/"; + + ret = 0; + if (NULL == source) + { + fprintf(stderr, + _("`%s' option for URI missing\n"), + "-s"); + ret = 1; + return; + } + if (NULL == directory) + { + fprintf(stderr, + _("`%s' option for mountpoint missing\n"), + "-d"); + ret = 2; + return; + } + + /* parse source string to uri */ + if (NULL == (uri = GNUNET_FS_uri_parse(source, &emsg))) + { + fprintf(stderr, + "%s\n", emsg); + GNUNET_free (emsg); + ret = 3; + return; + } + + map = GNUNET_CONTAINER_multihashmap_create (10); + GNUNET_CRYPTO_hash (path, strlen (path), &path_hash); + pi = create_path_info (path, uri); + GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put(map, + &path_hash, pi, + GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); + + + if (GNUNET_YES == single_threaded) + argc = 5; + else + argc = 2; + { + char *a[argc+1]; + a[0]="gnunet-fuse"; + a[1]= directory; + if (GNUNET_YES == single_threaded) + { + a[2] = "-s"; + a[3] = "-f"; + a[4] = "-d"; + } + a[argc] = NULL; + fuse_main(argc, a, &fops, NULL); + } + GNUNET_CONTAINER_multihashmap_iterate(map, &cleanup_path_info, NULL); + GNUNET_CONTAINER_multihashmap_destroy(map); + GNUNET_FS_uri_destroy (uri); } + /** - * The main function to fuse. + * The main function for gnunet-fuse. * * @param argc number of arguments from the command line * @param argv command line arguments @@ -236,19 +200,19 @@ run (void *cls, */ int main (int argc, char *const *argv) -{ - - static const struct GNUNET_GETOPT_CommandLineOption options[] = { - {'s', "source", "URI", - gettext_noop ("Source you get the URI from"), 1, - &GNUNET_GETOPT_set_string, &source}, - {'d', "directory", "PATH", - gettext_noop ("path to your mountpoint"), 1, - &GNUNET_GETOPT_set_string, &directory}, - GNUNET_GETOPT_OPTION_END }; - - - +{ + static const struct GNUNET_GETOPT_CommandLineOption options[] = { + {'s', "source", "URI", + gettext_noop ("Source you get the URI from"), 1, + &GNUNET_GETOPT_set_string, &source}, + {'d', "directory", "PATH", + gettext_noop ("path to your mountpoint"), 1, + &GNUNET_GETOPT_set_string, &directory}, + {'t', "single-threaded", NULL, + gettext_noop ("run in single-threaded mode"), 0, + &GNUNET_GETOPT_set_one, &single_threaded}, + GNUNET_GETOPT_OPTION_END + }; return (GNUNET_OK == GNUNET_PROGRAM_run2(argc, argv, diff --git a/src/fuse/gnunet-fuse.h b/src/fuse/gnunet-fuse.h @@ -1,93 +1,112 @@ /* - * gnfs.h - types and stuff - * - * Created on: Mar 16, 2012 - * Author: Mauricio Günther - * - * - * - * - * This file is part of gnunet-fuse. - * - * gnunet-fuse is free software; you can redistribute it and/or - * modify if under the terms of version 2 of the GNU General Public License - * as published by the Free Software Foundation. - * - * gnunet-fuse is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - + This file is part of gnunet-fuse. + (C) 2012 Christian Grothoff (and other contributing authors) + + gnunet-fuse is free software; you can redistribute it and/or + modify if under the terms of version 2 of the GNU General Public License + as published by the Free Software Foundation. + + gnunet-fuse is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -#ifndef GNUNETFUSE_H_ -#define GNUNETFUSE_H_ +*/ +/** + * @file fuse/gnunet-fuse.h + * @brief global definitions for gnunet-fuse + * @author Christian Grothoff + * @author Mauricio Günther + */ +#ifndef GNUNET_FUSE_H +#define GNUNET_FUSE_H #include <gnunet/platform.h> -#include "gnunet/gnunet_common.h" -#include "gnunet/gnunet_configuration_lib.h" -#include "gnunet/gnunet_crypto_lib.h" -#include "gnunet/gnunet_directories.h" -#include "gnunet/gnunet_getopt_lib.h" -#include "gnunet/gnunet_os_lib.h" -#include "gnunet/gnunet_program_lib.h" -#include "gnunet/gnunet_resolver_service.h" -#include "gnunet/gnunet_fs_service.h" -#include "gnunet/gnunet_scheduler_lib.h" -#include <fuse.h> +#include <gnunet/gnunet_util_lib.h> +#include <gnunet/gnunet_directories.h> +#include <gnunet/gnunet_resolver_service.h> +#include <gnunet/gnunet_fs_service.h> +#define FUSE_USE_VERSION 26 +#include <fuse.h> -/* Variables from commandline for gnunet-fuse */ +/** + * Global mapping of paths to GNUnet URIs (and file names) for + * the respective entries. + */ +extern struct GNUNET_CONTAINER_MultiHashMap *map; -char *source; -char *directory; -struct GNUNET_CONTAINER_MultiHashMap *map; +/** + * struct containing mapped Path, with URI and other Information like Attributes etc. + */ +struct GNUNET_FUSE_PathInfo +{ + /** + * uri to corresponding path + */ + struct GNUNET_FS_Uri *uri; -/* struct containing mapped Path, with URI and other Information like Attributes etc. */ + /** + * pathname + */ + char* path; -struct GNUNET_FUSE_path_info -{ -/* uri to corresponding path */ - const struct GNUNET_FS_Uri *uri; -/* pathname */ - char* path; -/* source to corresponding path, needs to be parsed to uri */ - char* source; -/*name of temporary file */ - char* tmpfile; -/*file attributes*/ - struct stat; + /** + * name of temporary file + */ + char* tmpfile; + + /** + * file attributes + */ + struct stat attributes; }; -struct GNUNET_FUSE_path_info * + +struct GNUNET_FUSE_PathInfo * create_path_info (const char *path, const struct GNUNET_FS_Uri *uri); + void -delete_path_info (struct GNUNET_FUSE_path_info *pi); +delete_path_info (struct GNUNET_FUSE_PathInfo *pi); + /* FUSE function files */ int gn_getattr(const char *path, struct stat *stbuf); + int gn_mknod(const char *path, mode_t mode, dev_t rdev); + int gn_mkdir(const char *path, mode_t mode); + int gn_unlink(const char *path); + int gn_rmdir(const char *path); + int gn_rename(const char *from, const char *to); + int gn_truncate(const char *path, off_t size); + int gn_open(const char *path, struct fuse_file_info *fi); + int gn_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi); + int gn_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi); + int gn_release(const char *path, struct fuse_file_info *fi); + int gn_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi); + int gn_utimens(const char *path, const struct timespec ts[2]); -#endif /* GNUNETFUSE_H_ */ +#endif +/* GNUNET_FUSE_H */ diff --git a/src/fuse/read.c b/src/fuse/read.c @@ -17,11 +17,7 @@ * Changed in version 2.2 */ -//#include <string.h> -//#include <errno.h> -#include <unistd.h> -#include <fuse.h> -#include <gnunet-fuse.h> +#include "gnunet-fuse.h" @@ -71,6 +67,7 @@ if (strcmp(path, "/home/mg/gnunet-fuse2/gnunet-fuse/fuse/src/ext/monti/prueba") else return -ENOENT; */ + return -ENOENT; } diff --git a/src/fuse/readdir.c b/src/fuse/readdir.c @@ -27,15 +27,7 @@ * Introduced in version 2.3 */ -#include <sys/types.h> -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <gnunet-fuse.h> -#include <gnunet/gnunet_fs_service.h> -#include <gnunet/gnunet_container_lib.h> -#include "gnunet/gnunet_crypto_lib.h" -#include <fuse.h> +#include "gnunet-fuse.h" static int ret; @@ -67,7 +59,7 @@ struct GNUNET_FS_Uri *uri; char *emsg; -struct GNUNET_FUSE_path_info *r; +struct GNUNET_FUSE_PathInfo *r;