gnunet-fuse

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

commit c2caf056ec49af47c7b24d5f745c97a91fb24985
parent 71ece01886980041be19240a6f1a355c8d0f7dcb
Author: Mauricio Günther <mauricio@140774ce-b5e7-0310-ab8b-a85725594a96>
Date:   Wed, 14 Mar 2012 17:28:34 +0000

somehow working--This line, and those below, will be ignored--

M    ext/gnunet-fuse.c
M    ext/Makefile.am


Diffstat:
Msrc/ext/Makefile.am | 71++++++++++++++++++++++++++++++++++++++---------------------------------
Msrc/ext/gnunet-fuse.c | 288+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 319 insertions(+), 40 deletions(-)

diff --git a/src/ext/Makefile.am b/src/ext/Makefile.am @@ -5,43 +5,48 @@ INCLUDES = \ -I$(top_srcdir) \ @GNUNET_CFLAGS@ -lib_LTLIBRARIES = libgnunetext.la -libgnunetext_la_SOURCES = \ - ext_api.c -libgnunetext_la_LIBADD = \ - -lgnunetutil -libgnunetext_la_LDFLAGS = \ - $(GNUNET_LIBS) $(WINFLAGS) \ - -version-info 0:0:0 - - -bin_PROGRAMS = gnunet-service-fuse gnunet-fuse - -gnunet_service_fuse_SOURCES = \ - gnunet-service-fuse.c -gnunet_service_fuse_LDADD = \ - -lgnunetutil -lgnunetcore\ - $(INTLLIBS) -gnunet_service_fuse_LDFLAGS = \ - -export-dynamic +bin_PROGRAMS = gnunet-fuse gnunet_fuse_SOURCES = \ gnunet-fuse.c + directory.c \ + dirent.c \ + file.c \ + getattr.c \ + main.c \ + mkdir.c \ + mknod.c \ + open.c \ + read.c \ + readdir.c \ + release.c \ + rename.c \ + rmdir.c \ + special_file.c \ + truncate.c \ + unlink.c \ + utimens.c \ + write.c \ + gnfs.h \ + gettext.h gnunet_fuse_LDADD = \ -lgnunetutil \ - $(INTLLIBS) + -lfuse \ + -lgnunetfs + $(INTLLIBS) gnunet_fuse_LDFLAGS = \ - -export-dynamic - - -check_PROGRAMS = \ - test_fuse_api - -TESTS = $(check_PROGRAMS) - -test_fuse_api_SOURCES = \ - test_fuse_api.c -test_fuse_api_LDADD = \ - $(top_builddir)/src/ext/libgnunetext.la \ - -lgnunetutil + -export-dynamic +gnunet_fuse_CPPFLAGS = \ + -D_FILE_OFFSET_BITS=64 + +#check_PROGRAMS = \ +# test_fuse_api +# +#TESTS = $(check_PROGRAMS) +# +#test_fuse_api_SOURCES = \ +# test_fuse_api.c +#test_fuse_api_LDADD = \ +# $(top_builddir)/src/ext/libgnunetext.la \ +# -lgnunetutil diff --git a/src/ext/gnunet-fuse.c b/src/ext/gnunet-fuse.c @@ -23,12 +23,276 @@ * @brief fuse tool * @author */ + +#define FUSE_USE_VERSION 26 + #include <gnunet/platform.h> #include <gnunet/gnunet_util_lib.h> -#include "gnunet_fuse_service.h" +#include <fuse.h> +#include <gnunet/gnunet_fs_service.h> + static int ret; +static char *source; + +/*struct with renamed fuseoperations*/ +static struct fuse_operations fops = {}; + + + + +#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_scheduler_lib.h" +#include <gcrypt.h> + +#define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__) + +#define LOG_STRERROR_FILE(kind,syscall,filename) GNUNET_log_from_strerror_file (kind, "util", syscall, filename) + +/** + * 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; + +}; + + +/** + * Initial task called by the scheduler for each + * program. Runs the program-specific main task. + */ +static void +program_main (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + struct CommandContext *cc = cls; + + GNUNET_RESOLVER_connect (cc->cfg); + cc->task (cc->task_cls, cc->args, cc->cfgfile, cc->cfg); +} + + +/** + * Compare function for 'qsort' to sort command-line arguments by the + * short option. + * + * @param a1 first command line option + * @param a2 second command line option + */ +static int +cmd_sorter (__const void *a1, __const void *a2) +{ + __const struct GNUNET_GETOPT_CommandLineOption *c1 = a1; + __const struct GNUNET_GETOPT_CommandLineOption *c2 = a2; + + if (toupper ((unsigned char) c1->shortName) > + toupper ((unsigned char) c2->shortName)) + return 1; + if (toupper ((unsigned char) c1->shortName) < + toupper ((unsigned char) c2->shortName)) + return -1; + if (c1->shortName > c2->shortName) + return 1; + if (c1->shortName < c2->shortName) + return -1; + return 0; +} + + +/** + * Run a standard GNUnet command startup sequence (initialize loggers + * and configuration, parse options). + * + * @param argc number of command line arguments + * @param argv command line arguments + * @param binaryName our expected name + * @param binaryHelp help text for the program + * @param options command line options + * @param task main function to run + * @param task_cls closure for task + * @return GNUNET_SYSERR on error, GNUNET_OK on success + */ +int +gnunet_fuse_run2 (int argc, char *const *argv, const char *binaryName, + const char *binaryHelp, + const struct GNUNET_GETOPT_CommandLineOption *options, + GNUNET_PROGRAM_Main task, void *task_cls, + int run_with_schedule) +{ + struct CommandContext cc; + char *path; + char *loglev; + char *logfile; + int ret; + unsigned int cnt; + unsigned long long skew_offset; + unsigned long long skew_variance; + long long clock_offset; + struct GNUNET_CONFIGURATION_Handle *cfg; + + struct GNUNET_GETOPT_CommandLineOption defoptions[] = { + GNUNET_GETOPT_OPTION_CFG_FILE (&cc.cfgfile), + GNUNET_GETOPT_OPTION_HELP (binaryHelp), + GNUNET_GETOPT_OPTION_LOGLEVEL (&loglev), + GNUNET_GETOPT_OPTION_LOGFILE (&logfile), + GNUNET_GETOPT_OPTION_VERSION (PACKAGE_VERSION) + }; + struct GNUNET_GETOPT_CommandLineOption *allopts; + const char *gargs; + char *lpfx; + char *spc; + + logfile = NULL; + gargs = getenv ("GNUNET_ARGS"); + if (gargs != NULL) + { + char **gargv; + unsigned int gargc; + int i; + char *tok; + char *cargs; + + gargv = NULL; + gargc = 0; + for (i = 0; i < argc; i++) + GNUNET_array_append (gargv, gargc, GNUNET_strdup (argv[i])); + cargs = GNUNET_strdup (gargs); + tok = strtok (cargs, " "); + while (NULL != tok) + { + GNUNET_array_append (gargv, gargc, GNUNET_strdup (tok)); + tok = strtok (NULL, " "); + } + GNUNET_free (cargs); + GNUNET_array_append (gargv, gargc, NULL); + argv = (char *const *) gargv; + argc = gargc - 1; + } + memset (&cc, 0, sizeof (cc)); + loglev = NULL; + cc.task = task; + cc.task_cls = task_cls; + cc.cfg = cfg = GNUNET_CONFIGURATION_create (); + + /* prepare */ +#if ENABLE_NLS + setlocale (LC_ALL, ""); + path = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_LOCALEDIR); + if (path != NULL) + { + BINDTEXTDOMAIN ("GNUnet", path); + GNUNET_free (path); + } + textdomain ("GNUnet"); +#endif + cnt = 0; + while (options[cnt].name != NULL) + cnt++; + allopts = + GNUNET_malloc ((cnt + + 1) * sizeof (struct GNUNET_GETOPT_CommandLineOption) + + sizeof (defoptions)); + memcpy (allopts, defoptions, sizeof (defoptions)); + memcpy (&allopts + [sizeof (defoptions) / + sizeof (struct GNUNET_GETOPT_CommandLineOption)], options, + (cnt + 1) * sizeof (struct GNUNET_GETOPT_CommandLineOption)); + cnt += sizeof (defoptions) / sizeof (struct GNUNET_GETOPT_CommandLineOption); + qsort (allopts, cnt, sizeof (struct GNUNET_GETOPT_CommandLineOption), + &cmd_sorter); + loglev = NULL; + cc.cfgfile = GNUNET_strdup (GNUNET_DEFAULT_USER_CONFIG_FILE); + lpfx = GNUNET_strdup (binaryName); + if (NULL != (spc = strstr (lpfx, " "))) + *spc = '\0'; + if ((-1 == + (ret = + GNUNET_GETOPT_run (binaryName, allopts, (unsigned int) argc, argv))) || + (GNUNET_OK != GNUNET_log_setup (lpfx, loglev, logfile))) + { + GNUNET_CONFIGURATION_destroy (cfg); + GNUNET_free_non_null (cc.cfgfile); + GNUNET_free_non_null (loglev); + GNUNET_free_non_null (logfile); + GNUNET_free (allopts); + GNUNET_free (lpfx); + return GNUNET_SYSERR; + } + (void) GNUNET_CONFIGURATION_load (cfg, cc.cfgfile); + GNUNET_free (allopts); + GNUNET_free (lpfx); + if (GNUNET_OK == + GNUNET_CONFIGURATION_get_value_number (cc.cfg, "testing", "skew_offset", + &skew_offset) && + (GNUNET_OK == + GNUNET_CONFIGURATION_get_value_number (cc.cfg, "testing", + "skew_variance", &skew_variance))) + { + clock_offset = skew_offset - skew_variance; + GNUNET_TIME_set_offset (clock_offset); + } + /* run */ + cc.args = &argv[ret]; + if (GNUNET_NO == run_with_schedule) + { + GNUNET_SCHEDULER_run (&program_main, &cc); + } + else + { + GNUNET_RESOLVER_connect (cc.cfg); + cc.task (cc.task_cls, cc.args, cc.cfgfile, cc.cfg); + } + /* clean up */ + GNUNET_CONFIGURATION_destroy (cfg); + GNUNET_free_non_null (cc.cfgfile); + GNUNET_free_non_null (loglev); + GNUNET_free_non_null (logfile); + return GNUNET_OK; +} + + +int +gnunet_fuse_run (int argc, char *const *argv, const char *binaryName, + const char *binaryHelp, + const struct GNUNET_GETOPT_CommandLineOption *options, + GNUNET_PROGRAM_Main task, void *task_cls) +{ + return gnunet_fuse_run2 (argc, argv, binaryName, binaryHelp, options, task, task_cls, GNUNET_NO); +} + + /** * Main function that will be run by the scheduler. * @@ -43,7 +307,14 @@ run (void *cls, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { - ret = 0; + ret = 0; + int c = 0; + while (args[c] != NULL) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "`%s'\n", args[c]); + c++; + } + fuse_main(c, args, &fops, NULL); } /** @@ -56,13 +327,16 @@ run (void *cls, int main (int argc, char *const *argv) { - static const struct GNUNET_GETOPT_CommandLineOption options[] = { - 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}, + GNUNET_GETOPT_OPTION_END }; + return (GNUNET_OK == - GNUNET_PROGRAM_run (argc, + gnunet_fuse_run (argc, argv, - "gnunet-fuse [options [value]]", + "gnunet-fuse -s URI [-- FUSE-OPTIONS] DIRECTORYNAME", //"gnunet-fuse [options [value]]", gettext_noop ("fuse"), options, &run, NULL)) ? ret : 1;