int main(int argc, char** argv) { struct fuse_args args = FUSE_ARGS_INIT(argc, argv); char* mountpoint; int multithreaded; int foreground; if (fuse_opt_parse(&args, NULL, tfs_opts, tfs_opt_proc) == -1) return 1; if (fuse_parse_cmdline(&args, &mountpoint, &multithreaded, &foreground) == -1) return 1; struct fuse_chan *ch = fuse_mount(mountpoint, &args); if (!ch) return 1; struct fuse *fuse = fuse_new(ch, &args, &tfs_oper, sizeof(struct fuse_operations), NULL); if (!fuse) { fuse_unmount(mountpoint, ch); return 1; } if (options.debug == 1 || foreground == 1) { if (fuse_daemonize(foreground) != -1) return 1; } if (fuse_set_signal_handlers(fuse_get_session(fuse)) == -1) { fuse_unmount(mountpoint, ch); fuse_destroy(fuse); return 1; } initMultiCastListener(); if (multithreaded) return fuse_loop_mt(fuse); if (!options.debug) fprintf(stderr, "Running single threaded and we are not debugging, your performance may suffer.\n"); return fuse_loop(fuse); };
void _cachefs_fuse_free(struct cachefs *fs) { if (fs->fuse == NULL) { return; } /* free hash table */ GHashTableIter iter; gpointer key, value; g_hash_table_iter_init(&iter, fs->file_locks); while (g_hash_table_iter_next (&iter, &key, &value)) { g_hash_table_remove(fs->file_locks, (gchar* )key); _cachefs_cond_free((struct cachefs_cond *)value); } /* Normally the filesystem will already have been unmounted. Try to make sure. */ fuse_unmount(fs->mountpoint, fs->chan); g_hash_table_destroy(fs->file_locks); fuse_destroy(fs->fuse); g_free(fs->cache_root); g_free(fs->uri_root); g_free(fs->redis_ip); g_free(fs->redis_req_channel); g_free(fs->redis_res_channel); rmdir(fs->mountpoint); g_free(fs->mountpoint); }
int fuse_main_real(int argc, char* argv[], const struct fuse_operations* op, size_t opSize, void* userData) { printf("fuse_main_real(%d, %p, %p, %ld, %p)\n", argc, argv, op, opSize, userData); // Note: We use the fuse_*() functions here to initialize and run the // file system, although some of them are merely dummies. struct fuse_args args = FUSE_ARGS_INIT(argc, argv); int result = 1; // create the kernel channel struct fuse_chan* channel = fuse_mount("/dummy", &args); if (channel != NULL) { // create the FUSE handle struct fuse* fuseHandle = fuse_new(channel, &args, op, opSize, userData); if (fuseHandle != NULL) { // run the main loop result = fuse_loop_mt(fuseHandle); fuse_destroy(fuseHandle); } fuse_unmount("/dummy", channel); } fuse_opt_free_args(&args); return result; }
int intern_fuse_destroy(struct intern_fuse *inf){ //you have to take care, that fuse is unmounted yourself! if(inf->fuse) fuse_destroy(inf->fuse); free(inf); return 0; }
void guestfs_int_free_fuse (guestfs_h *g) { if (g->fuse) fuse_destroy (g->fuse); /* also closes the channel */ g->fuse = NULL; free_dir_caches (g); }
struct fuse *fuse_setup_common(int argc, char *argv[], const struct fuse_operations *op, size_t op_size, char **mountpoint, int *multithreaded, int *fd, void *user_data, int compat) { struct fuse_args args = FUSE_ARGS_INIT(argc, argv); struct fuse_chan *ch; struct fuse *fuse; int foreground; int res; res = fuse_parse_cmdline(&args, mountpoint, multithreaded, &foreground); if (res == -1) return NULL; #ifdef __APPLE__ if (!*mountpoint) { fprintf(stderr, "fuse: no mount point\n"); return NULL; } #endif ch = fuse_mount_common(*mountpoint, &args); if (!ch) { fuse_opt_free_args(&args); goto err_free; } fuse = fuse_new_common(ch, &args, op, op_size, user_data, compat); fuse_opt_free_args(&args); if (fuse == NULL) goto err_unmount; res = fuse_daemonize(foreground); if (res == -1) goto err_unmount; res = fuse_set_signal_handlers(fuse_get_session(fuse)); if (res == -1) goto err_unmount; if (fd) *fd = fuse_chan_fd(ch); return fuse; err_unmount: fuse_unmount_common(*mountpoint, ch); if (fuse) fuse_destroy(fuse); err_free: free(*mountpoint); return NULL; }
static void fuse_teardown_common(struct fuse *fuse, char *mountpoint) { struct fuse_session *se = fuse_get_session(fuse); struct fuse_chan *ch = fuse_session_next_chan(se, NULL); fuse_remove_signal_handlers(se); fuse_unmount_common(mountpoint, ch); fuse_destroy(fuse); free(mountpoint); }
static void exit_handler(int sig) { if(fuse_instance) { fuse_exit(fuse_instance); fuse_unmount(fuse_mountpoint, fuse_chan); fuse_destroy(fuse_instance); } _exit(0); }
void fuse_teardown(struct fuse *fuse, char *mountpoint) { struct fuse_session *se = fuse_get_session(fuse); struct fuse_chan *ch = se->ch; if (fuse->conf.setsignals) fuse_remove_signal_handlers(se); fuse_unmount(mountpoint, ch); fuse_destroy(fuse); free(mountpoint); }
int fusefs_unmount() { if (fuse_instance) fuse_destroy(fuse_instance); fuse_instance = NULL; if (mounted_at) fuse_unmount(mounted_at); free(mounted_at); fusefd = -1; }
int voole_net_create() { int ret = 0; pthread_t pthread_net; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ret = pthread_create(&pthread_net,&attr,net_handler,NULL); if( ret!=0 ) { fuse_unmount(voolefs.mountpoint, voolefs.ch); fuse_destroy(voolefs.fuse); exit(2); } return 0; }
struct fuse *fuse_setup(int argc, char *argv[], const struct fuse_operations *op, size_t op_size, char **mountpoint, int *multithreaded, void *user_data) { struct fuse_args args = FUSE_ARGS_INIT(argc, argv); struct fuse_chan *ch=NULL; struct fuse *fuse; int foreground; int res; res = fuse_parse_cmdline(&args, mountpoint, multithreaded, &foreground); rDebug("res=%i", res); if (res == -1) return NULL; ch = fuse_mount(*mountpoint, &args); fuse = fuse_new(ch, &args, op, op_size, user_data); fuse_opt_free_args(&args); if (fuse == NULL || ch==NULL) goto err_unmount; res = fuse_daemonize(foreground); rDebug("res=%i", res); if (res == -1) goto err_unmount; if (fuse->conf.setsignals) { res = fuse_set_signal_handlers(fuse_get_session(fuse)); rDebug("res=%i", res); if (res == -1) goto err_unmount; } return fuse; err_unmount: fuse_unmount(*mountpoint, ch); if (fuse) fuse_destroy(fuse); free(*mountpoint); return NULL; }
int fusefs_setup(char *mountpoint, const struct fuse_operations *op, char *opts) { char fuse_new_opts[1024]; char fuse_mount_opts[1024]; char nopts[1024]; char *cur; char *ptr; fuse_new_opts[0] = '\0'; fuse_mount_opts[0] = '\0'; for (cur=opts;cur;cur = ptr) { ptr = strchr(cur,','); if (ptr) *(ptr++) = '\0'; if (fuse_is_lib_option(cur)) { if (fuse_new_opts[0]) { strcpy(nopts,fuse_new_opts); snprintf(fuse_new_opts,1024,"%s,%s",nopts,cur); } else { snprintf(fuse_new_opts,1024,"%s",cur); } } else { if (fuse_mount_opts[0]) { strcpy(nopts,fuse_mount_opts); snprintf(fuse_mount_opts,1024,"%s,%s",nopts,cur); } else { snprintf(fuse_mount_opts,1024,"%s",cur); } } } fusefd = -1; if (fuse_instance != NULL) { return 0; } if (mounted_at != NULL) { return 0; } /* First, mount us */ fusefd = fuse_mount(mountpoint, fuse_mount_opts[0] ? fuse_mount_opts : NULL); if (fusefd == -1) return 0; fuse_instance = fuse_new(fusefd, fuse_new_opts[0] ? fuse_new_opts : NULL, op, sizeof(*op)); if (fuse_instance == NULL) goto err_unmount; /* Set signal handlers */ if (set_one_signal_handler(SIGHUP, fusefs_ehandler) == -1 || set_one_signal_handler(SIGINT, fusefs_ehandler) == -1 || set_one_signal_handler(SIGTERM, fusefs_ehandler) == -1 || set_one_signal_handler(SIGPIPE, SIG_IGN) == -1) return 0; atexit(fusefs_ehandler); /* We've initialized it! */ mounted_at = strdup(mountpoint); return 1; err_destroy: fuse_destroy(fuse_instance); err_unmount: fuse_unmount(mountpoint); return 0; }
void fuse_teardown(struct fuse *fuse, char *mp) { fuse_unmount(mp, fuse->fc); fuse_destroy(fuse); }
int main(int argc, char *argv[]) { char c; int did_explicit_auth = 0; char *tickets = NULL; struct fuse_args fa; fa.argc = 0; fa.argv = string_array_new(); fa.allocated = 1; debug_config(argv[0]); while((c = getopt(argc, argv, "a:b:d:Dfhi:m:o:t:v")) != -1) { switch (c) { case 'd': debug_flags_set(optarg); break; case 'D': enable_small_file_optimizations = 0; break; case 'b': chirp_reli_blocksize_set(atoi(optarg)); break; case 'i': tickets = xxstrdup(optarg); break; case 'm': fa.argc += 1; fa.argv = string_array_append(fa.argv, optarg); break; case 'o': debug_config_file(optarg); break; case 'a': auth_register_byname(optarg); did_explicit_auth = 1; break; case 't': chirp_fuse_timeout = string_time_parse(optarg); break; case 'f': run_in_foreground = 1; break; case 'v': cctools_version_print(stdout, argv[0]); return 0; break; case 'h': default: show_help(argv[0]); return 1; break; } } cctools_version_debug(D_DEBUG, argv[0]); if((argc - optind) != 1) { show_help(argv[0]); return 1; } fuse_mountpoint = argv[optind]; if(!did_explicit_auth) auth_register_all(); if(tickets) { auth_ticket_load(tickets); free(tickets); } else if(getenv(CHIRP_CLIENT_TICKETS)) { auth_ticket_load(getenv(CHIRP_CLIENT_TICKETS)); } else { auth_ticket_load(NULL); } file_table = itable_create(0); signal(SIGHUP, exit_handler); signal(SIGINT, exit_handler); signal(SIGTERM, exit_handler); fuse_chan = fuse_mount(fuse_mountpoint, &fa); if(!fuse_chan) { fprintf(stderr, "chirp_fuse: couldn't access %s\n", fuse_mountpoint); return 1; } fuse_instance = fuse_new(fuse_chan, &fa, &chirp_fuse_operations, sizeof(chirp_fuse_operations), 0); if(!fuse_instance) { fuse_unmount(fuse_mountpoint, fuse_chan); fprintf(stderr, "chirp_fuse: couldn't access %s\n", fuse_mountpoint); return 1; } printf("chirp_fuse: mounted chirp on %s\n", fuse_mountpoint); #ifdef CCTOOLS_OPSYS_DARWIN printf("chirp_fuse: to unmount: umount %s\n", fuse_mountpoint); #else printf("chirp_fuse: to unmount: fusermount -u %s\n", fuse_mountpoint); #endif fflush(0); if(!run_in_foreground) daemon(0, 0); fuse_loop(fuse_instance); fuse_unmount(fuse_mountpoint, fuse_chan); fuse_destroy(fuse_instance); free(fa.argv); return 0; }
int main( int argc, char * const argv[] ) #endif { libregf_error_t *error = NULL; system_character_t *mount_point = NULL; system_character_t *option_codepage = NULL; system_character_t *option_extended_options = NULL; system_character_t *source = NULL; char *program = "regfmount"; system_integer_t option = 0; int result = 0; int verbose = 0; #if defined( HAVE_LIBFUSE ) || defined( HAVE_LIBOSXFUSE ) struct fuse_operations regfmount_fuse_operations; struct fuse_args regfmount_fuse_arguments = FUSE_ARGS_INIT(0, NULL); struct fuse_chan *regfmount_fuse_channel = NULL; struct fuse *regfmount_fuse_handle = NULL; #elif defined( HAVE_LIBDOKAN ) DOKAN_OPERATIONS regfmount_dokan_operations; DOKAN_OPTIONS regfmount_dokan_options; #endif libcnotify_stream_set( stderr, NULL ); libcnotify_verbose_set( 1 ); if( libclocale_initialize( "regftools", &error ) != 1 ) { fprintf( stderr, "Unable to initialize locale values.\n" ); goto on_error; } if( regftools_output_initialize( _IONBF, &error ) != 1 ) { fprintf( stderr, "Unable to initialize output settings.\n" ); goto on_error; } regftools_output_version_fprint( stdout, program ); while( ( option = regftools_getopt( argc, argv, _SYSTEM_STRING( "c:hvVX:" ) ) ) != (system_integer_t) -1 ) { switch( option ) { case (system_integer_t) '?': default: fprintf( stderr, "Invalid argument: %" PRIs_SYSTEM "\n", argv[ optind - 1 ] ); usage_fprint( stdout ); return( EXIT_FAILURE ); case (system_integer_t) 'c': option_codepage = optarg; break; case (system_integer_t) 'h': usage_fprint( stdout ); return( EXIT_SUCCESS ); case (system_integer_t) 'v': verbose = 1; break; case (system_integer_t) 'V': regftools_output_copyright_fprint( stdout ); return( EXIT_SUCCESS ); case (system_integer_t) 'X': option_extended_options = optarg; break; } } if( optind == argc ) { fprintf( stderr, "Missing source file.\n" ); usage_fprint( stdout ); return( EXIT_FAILURE ); } source = argv[ optind++ ]; if( optind == argc ) { fprintf( stderr, "Missing mount point.\n" ); usage_fprint( stdout ); return( EXIT_FAILURE ); } mount_point = argv[ optind ]; libcnotify_verbose_set( verbose ); libregf_notify_set_stream( stderr, NULL ); libregf_notify_set_verbose( verbose ); if( mount_handle_initialize( ®fmount_mount_handle, &error ) != 1 ) { fprintf( stderr, "Unable to initialize mount handle.\n" ); goto on_error; } if( option_codepage != NULL ) { result = mount_handle_set_ascii_codepage( regfmount_mount_handle, option_codepage, &error ); if( result == -1 ) { fprintf( stderr, "Unable to set ASCII codepage in mount handle.\n" ); goto on_error; } else if( result == 0 ) { fprintf( stderr, "Unsupported ASCII codepage defaulting to: windows-1252.\n" ); } } if( mount_handle_open( regfmount_mount_handle, source, &error ) != 1 ) { fprintf( stderr, "Unable to open source file\n" ); goto on_error; } #if defined( HAVE_LIBFUSE ) || defined( HAVE_LIBOSXFUSE ) if( option_extended_options != NULL ) { /* This argument is required but ignored */ if( fuse_opt_add_arg( ®fmount_fuse_arguments, "" ) != 0 ) { fprintf( stderr, "Unable add fuse arguments.\n" ); goto on_error; } if( fuse_opt_add_arg( ®fmount_fuse_arguments, "-o" ) != 0 ) { fprintf( stderr, "Unable add fuse arguments.\n" ); goto on_error; } if( fuse_opt_add_arg( ®fmount_fuse_arguments, option_extended_options ) != 0 ) { fprintf( stderr, "Unable add fuse arguments.\n" ); goto on_error; } } if( memory_set( ®fmount_fuse_operations, 0, sizeof( struct fuse_operations ) ) == NULL ) { fprintf( stderr, "Unable to clear fuse operations.\n" ); goto on_error; } regfmount_fuse_operations.open = &mount_fuse_open; regfmount_fuse_operations.read = &mount_fuse_read; regfmount_fuse_operations.release = &mount_fuse_release; regfmount_fuse_operations.opendir = &mount_fuse_opendir; regfmount_fuse_operations.readdir = &mount_fuse_readdir; regfmount_fuse_operations.releasedir = &mount_fuse_releasedir; regfmount_fuse_operations.getattr = &mount_fuse_getattr; regfmount_fuse_operations.destroy = &mount_fuse_destroy; regfmount_fuse_channel = fuse_mount( mount_point, ®fmount_fuse_arguments ); if( regfmount_fuse_channel == NULL ) { fprintf( stderr, "Unable to create fuse channel.\n" ); goto on_error; } regfmount_fuse_handle = fuse_new( regfmount_fuse_channel, ®fmount_fuse_arguments, ®fmount_fuse_operations, sizeof( struct fuse_operations ), regfmount_mount_handle ); if( regfmount_fuse_handle == NULL ) { fprintf( stderr, "Unable to create fuse handle.\n" ); goto on_error; } if( verbose == 0 ) { if( fuse_daemonize( 0 ) != 0 ) { fprintf( stderr, "Unable to daemonize fuse.\n" ); goto on_error; } } result = fuse_loop( regfmount_fuse_handle ); if( result != 0 ) { fprintf( stderr, "Unable to run fuse loop.\n" ); goto on_error; } fuse_destroy( regfmount_fuse_handle ); fuse_opt_free_args( ®fmount_fuse_arguments ); return( EXIT_SUCCESS ); #elif defined( HAVE_LIBDOKAN ) if( memory_set( ®fmount_dokan_operations, 0, sizeof( DOKAN_OPERATIONS ) ) == NULL ) { fprintf( stderr, "Unable to clear dokan operations.\n" ); goto on_error; } if( memory_set( ®fmount_dokan_options, 0, sizeof( DOKAN_OPTIONS ) ) == NULL ) { fprintf( stderr, "Unable to clear dokan options.\n" ); goto on_error; } regfmount_dokan_options.Version = DOKAN_VERSION; regfmount_dokan_options.ThreadCount = 0; regfmount_dokan_options.MountPoint = mount_point; if( verbose != 0 ) { regfmount_dokan_options.Options |= DOKAN_OPTION_STDERR; #if defined( HAVE_DEBUG_OUTPUT ) regfmount_dokan_options.Options |= DOKAN_OPTION_DEBUG; #endif } /* This will only affect the drive properties regfmount_dokan_options.Options |= DOKAN_OPTION_REMOVABLE; */ #if ( DOKAN_VERSION >= 600 ) && ( DOKAN_VERSION < 800 ) regfmount_dokan_options.Options |= DOKAN_OPTION_KEEP_ALIVE; regfmount_dokan_operations.CreateFile = &mount_dokan_CreateFile; regfmount_dokan_operations.OpenDirectory = &mount_dokan_OpenDirectory; regfmount_dokan_operations.CreateDirectory = NULL; regfmount_dokan_operations.Cleanup = NULL; regfmount_dokan_operations.CloseFile = &mount_dokan_CloseFile; regfmount_dokan_operations.ReadFile = &mount_dokan_ReadFile; regfmount_dokan_operations.WriteFile = NULL; regfmount_dokan_operations.FlushFileBuffers = NULL; regfmount_dokan_operations.GetFileInformation = &mount_dokan_GetFileInformation; regfmount_dokan_operations.FindFiles = &mount_dokan_FindFiles; regfmount_dokan_operations.FindFilesWithPattern = NULL; regfmount_dokan_operations.SetFileAttributes = NULL; regfmount_dokan_operations.SetFileTime = NULL; regfmount_dokan_operations.DeleteFile = NULL; regfmount_dokan_operations.DeleteDirectory = NULL; regfmount_dokan_operations.MoveFile = NULL; regfmount_dokan_operations.SetEndOfFile = NULL; regfmount_dokan_operations.SetAllocationSize = NULL; regfmount_dokan_operations.LockFile = NULL; regfmount_dokan_operations.UnlockFile = NULL; regfmount_dokan_operations.GetFileSecurity = NULL; regfmount_dokan_operations.SetFileSecurity = NULL; regfmount_dokan_operations.GetDiskFreeSpace = NULL; regfmount_dokan_operations.GetVolumeInformation = &mount_dokan_GetVolumeInformation; regfmount_dokan_operations.Unmount = &mount_dokan_Unmount; #else regfmount_dokan_operations.ZwCreateFile = &mount_dokan_ZwCreateFile; regfmount_dokan_operations.Cleanup = NULL; regfmount_dokan_operations.CloseFile = &mount_dokan_CloseFile; regfmount_dokan_operations.ReadFile = &mount_dokan_ReadFile; regfmount_dokan_operations.WriteFile = NULL; regfmount_dokan_operations.FlushFileBuffers = NULL; regfmount_dokan_operations.GetFileInformation = &mount_dokan_GetFileInformation; regfmount_dokan_operations.FindFiles = &mount_dokan_FindFiles; regfmount_dokan_operations.FindFilesWithPattern = NULL; regfmount_dokan_operations.SetFileAttributes = NULL; regfmount_dokan_operations.SetFileTime = NULL; regfmount_dokan_operations.DeleteFile = NULL; regfmount_dokan_operations.DeleteDirectory = NULL; regfmount_dokan_operations.MoveFile = NULL; regfmount_dokan_operations.SetEndOfFile = NULL; regfmount_dokan_operations.SetAllocationSize = NULL; regfmount_dokan_operations.LockFile = NULL; regfmount_dokan_operations.UnlockFile = NULL; regfmount_dokan_operations.GetFileSecurity = NULL; regfmount_dokan_operations.SetFileSecurity = NULL; regfmount_dokan_operations.GetDiskFreeSpace = NULL; regfmount_dokan_operations.GetVolumeInformation = &mount_dokan_GetVolumeInformation; regfmount_dokan_operations.Unmounted = NULL; regfmount_dokan_operations.FindStreams = NULL; regfmount_dokan_operations.Mounted = NULL; #endif /* ( DOKAN_VERSION >= 600 ) && ( DOKAN_VERSION < 800 ) */ result = DokanMain( ®fmount_dokan_options, ®fmount_dokan_operations ); switch( result ) { case DOKAN_SUCCESS: break; case DOKAN_ERROR: fprintf( stderr, "Unable to run dokan main: generic error\n" ); break; case DOKAN_DRIVE_LETTER_ERROR: fprintf( stderr, "Unable to run dokan main: bad drive letter\n" ); break; case DOKAN_DRIVER_INSTALL_ERROR: fprintf( stderr, "Unable to run dokan main: unable to load driver\n" ); break; case DOKAN_START_ERROR: fprintf( stderr, "Unable to run dokan main: driver error\n" ); break; case DOKAN_MOUNT_ERROR: fprintf( stderr, "Unable to run dokan main: unable to assign drive letter\n" ); break; case DOKAN_MOUNT_POINT_ERROR: fprintf( stderr, "Unable to run dokan main: mount point error\n" ); break; default: fprintf( stderr, "Unable to run dokan main: unknown error: %d\n", result ); break; } return( EXIT_SUCCESS ); #else fprintf( stderr, "No sub system to mount REGF format.\n" ); return( EXIT_FAILURE ); #endif on_error: if( error != NULL ) { libcnotify_print_error_backtrace( error ); libcerror_error_free( &error ); } #if defined( HAVE_LIBFUSE ) || defined( HAVE_LIBOSXFUSE ) if( regfmount_fuse_handle != NULL ) { fuse_destroy( regfmount_fuse_handle ); } fuse_opt_free_args( ®fmount_fuse_arguments ); #endif if( regfmount_mount_handle != NULL ) { mount_handle_free( ®fmount_mount_handle, NULL ); } return( EXIT_FAILURE ); }
// run fskit with fuse int fskit_fuse_main( struct fskit_fuse_state* state, int argc, char** argv ) { int rc = 0; // set up FUSE struct fuse_args args = FUSE_ARGS_INIT(argc, argv); struct fuse_chan* ch = NULL; struct fuse* fs = NULL; int multithreaded = 1; int foreground = 0; char* mountpoint = NULL; // parse command-line... rc = fuse_parse_cmdline( &args, &mountpoint, &multithreaded, &foreground ); if( rc < 0 ) { fskit_error("fuse_parse_cmdline rc = %d\n", rc ); fuse_opt_free_args(&args); return rc; } if( mountpoint == NULL ) { fskit_error("%s", "No mountpoint given\n"); fuse_opt_free_args(&args); return rc; } state->mountpoint = strdup( mountpoint ); // mount ch = fuse_mount( mountpoint, &args ); if( ch == NULL ) { rc = -errno; fskit_error("fuse_mount failed, errno = %d\n", rc ); fuse_opt_free_args(&args); if( rc == 0 ) { rc = -EPERM; } return rc; } // create the filesystem fs = fuse_new( ch, &args, &state->ops, sizeof(state->ops), state ); fuse_opt_free_args(&args); if( fs == NULL ) { // failed rc = -errno; fskit_error("fuse_new failed, errno = %d\n", rc ); fuse_unmount( mountpoint, ch ); if( rc == 0 ) { rc = -EPERM; } return rc; } // daemonize if running in the background fskit_debug("FUSE daemonize: foreground=%d\n", foreground); rc = fuse_daemonize( foreground ); if( rc != 0 ) { // failed fskit_error("fuse_daemonize(%d) rc = %d\n", foreground, rc ); fuse_unmount( mountpoint, ch ); fuse_destroy( fs ); return rc; } // set up FUSE signal handlers rc = fuse_set_signal_handlers( fuse_get_session(fs) ); if( rc < 0 ) { // failed fskit_error("fuse_set_signal_handlers rc = %d\n", rc ); fuse_unmount( mountpoint, ch ); fuse_destroy( fs ); return rc; } // if we have a post-mount callback, call it now, since FUSE is ready to receive requests if( state->postmount != NULL ) { rc = (*state->postmount)( state, state->postmount_cls ); if( rc != 0 ) { fskit_error("fskit postmount callback rc = %d\n", rc ); fuse_unmount( mountpoint, ch ); fuse_destroy( fs ); return rc; } } // run the filesystem--start processing requests fskit_debug("%s", "FUSE main loop entered\n"); if( multithreaded ) { rc = fuse_loop_mt( fs ); } else { rc = fuse_loop( fs ); } fskit_debug("%s", "FUSE main loop finished\n"); fuse_teardown( fs, mountpoint ); return rc; }
int main(int argc, char* argv[]) { struct fuse_args mount_args = FUSE_ARGS_INIT(0, NULL); struct fuse_args newfs_args = FUSE_ARGS_INIT(0, NULL); const char* spec = NULL; const char* mount_point = NULL; char* mount_options; int debug = 0; struct fuse_chan* fc = NULL; struct fuse* fh = NULL; int opt; printf("FUSE exfat %u.%u.%u\n", EXFAT_VERSION_MAJOR, EXFAT_VERSION_MINOR, EXFAT_VERSION_PATCH); mount_options = strdup(default_options); if (mount_options == NULL) { exfat_error("failed to allocate options string"); return 1; } while ((opt = getopt(argc, argv, "dno:Vv")) != -1) { switch (opt) { case 'd': debug = 1; break; case 'n': break; case 'o': mount_options = add_option(mount_options, optarg, NULL); if (mount_options == NULL) return 1; break; case 'V': free(mount_options); puts("Copyright (C) 2010-2014 Andrew Nayenko"); return 0; case 'v': break; default: free(mount_options); usage(argv[0]); break; } } if (argc - optind != 2) { free(mount_options); usage(argv[0]); } spec = argv[optind]; mount_point = argv[optind + 1]; if (exfat_mount(&ef, spec, mount_options) != 0) { free(mount_options); return 1; } if (ef.ro == -1) /* read-only fallback was used */ { mount_options = add_option(mount_options, "ro", NULL); if (mount_options == NULL) { exfat_unmount(&ef); return 1; } } mount_options = add_fuse_options(mount_options, spec); if (mount_options == NULL) { exfat_unmount(&ef); return 1; } /* create arguments for fuse_mount() */ if (fuse_opt_add_arg(&mount_args, "exfat") != 0 || fuse_opt_add_arg(&mount_args, "-o") != 0 || fuse_opt_add_arg(&mount_args, mount_options) != 0) { exfat_unmount(&ef); free(mount_options); return 1; } free(mount_options); /* create FUSE mount point */ fc = fuse_mount(mount_point, &mount_args); fuse_opt_free_args(&mount_args); if (fc == NULL) { exfat_unmount(&ef); return 1; } /* create arguments for fuse_new() */ if (fuse_opt_add_arg(&newfs_args, "") != 0 || (debug && fuse_opt_add_arg(&newfs_args, "-d") != 0)) { fuse_unmount(mount_point, fc); exfat_unmount(&ef); return 1; } /* create new FUSE file system */ fh = fuse_new(fc, &newfs_args, &fuse_exfat_ops, sizeof(struct fuse_operations), NULL); fuse_opt_free_args(&newfs_args); if (fh == NULL) { fuse_unmount(mount_point, fc); exfat_unmount(&ef); return 1; } /* exit session on HUP, TERM and INT signals and ignore PIPE signal */ if (fuse_set_signal_handlers(fuse_get_session(fh)) != 0) { fuse_unmount(mount_point, fc); fuse_destroy(fh); exfat_unmount(&ef); exfat_error("failed to set signal handlers"); return 1; } /* go to background (unless "-d" option is passed) and run FUSE main loop */ if (fuse_daemonize(debug) == 0) { if (fuse_loop(fh) != 0) exfat_error("FUSE loop failure"); } else exfat_error("failed to daemonize"); fuse_remove_signal_handlers(fuse_get_session(fh)); /* note that fuse_unmount() must be called BEFORE fuse_destroy() */ fuse_unmount(mount_point, fc); fuse_destroy(fh); return 0; }
/* * Class: org_catacombae_jfuse_FUSE * Method: mountNative26 * Signature: (Lorg/catacombae/jfuse/FUSE26FileSystem;Ljava/lang/String;[Ljava/lang/String;Lorg/catacombae/jfuse/FUSE26Capabilities;Lorg/catacombae/jfuse/MacFUSE20Capabilities;)Z */ JNIEXPORT jboolean JNICALL Java_org_catacombae_jfuse_FUSE_mountNative26( JNIEnv *env, jclass cls, jobject fileSystem, jstring mountPoint, jobjectArray optionStrings, jobject fuseCapabilities, jobject macFuseCapabilities) { #define _FNAME_ "Java_org_catacombae_jfuse_FUSE_mountNative26" CSLogTraceEnter(_FNAME_ "(%p, %p, %p, %p, %p, %p, %p)", env, cls, fileSystem, mountPoint, optionStrings, fuseCapabilities, macFuseCapabilities); jboolean res = JNI_FALSE; jFUSEContext *context = new jFUSEContext(env, fileSystem); if(!fillFUSE26Operations(env, fuseCapabilities, &jfuse_operations)) CSPanicWithMessage("Could not fill FUSE 2.6 operations!"); else CSLogDebug("Filled FUSE 2.6 operations."); if(jfuse_operations.init != NULL) { context->setInitEnabled(true); } #if defined(__APPLE__) || defined(__DARWIN__) #if (__FreeBSD__ >= 10) if(macFuseCapabilities != NULL) { if(!fillMacFUSE20Operations(env, macFuseCapabilities, &jfuse_operations)) CSPanicWithMessage("Could not fill MacFUSE 2.0 operations!"); else { CSLogDebug("Filled MacFUSE 2.0 operations."); if(jfuse_operations.getxtimes != NULL || jfuse_operations.setbkuptime != NULL || jfuse_operations.setcrtime != NULL || jfuse_operations.setchgtime != NULL) { CSLogDebug("Requesting enabling of xtimes."); context->setXtimesEnabled(true); if(jfuse_operations.init == NULL) { CSLogDebug("Adding operation 'init' to fuse_operations for " "support enabling of xtimes..."); jfuse_operations.init = jfuse_init; } } } } else CSLogDebug("No MacFUSE 2.0 operations to fill."); #endif /*__FreeBSD__ >= 10 */ #endif /* defined(__APPLE__) || defined(__DARWIN__) */ /* Read mountpoint. */ jboolean isCopy; const char *utf8MountPoint = env->GetStringUTFChars(mountPoint, &isCopy); /* Read options. */ struct fuse_args args = FUSE_ARGS_INIT(0, NULL); if(fuse_opt_add_arg(&args, utf8MountPoint) != 0) CSPanicWithMessage("fuse_opt_add_arg failed unexpectedly."); jsize optionStringsLength = env->GetArrayLength(optionStrings); CSLogDebug("Reading option strings (length=%ld)...", (long)optionStringsLength); for(int i = 0; i < optionStringsLength; ++i) { jstring cur = (jstring)env->GetObjectArrayElement(optionStrings, i); const char *utfChars = env->GetStringUTFChars(cur, NULL); CSLogDebug(" Adding option %d: \"%s\"", i, utfChars); int addArgRetval = fuse_opt_add_arg(&args, utfChars); if(addArgRetval != 0) CSPanicWithMessage("fuse_opt_add_arg failed unexpectedly with " "retval=%d, errno: %d (%s)", addArgRetval, errno, strerror(errno)); env->ReleaseStringUTFChars(cur, utfChars); env->DeleteLocalRef(cur); } if(fuse_parse_cmdline(&args, NULL, NULL, NULL) != 0) CSLogError("fuse_parse_cmdline didn't return 0."); else { /* * FUSE regular mount procedure: * * Init: * - fuse_mount: * (char *mountpoint, struct fuse_args *args)-> (struct fuse_chan*) * - fuse_new: * (struct fuse_chan *ch, struct fuse_args *args, * struct fuse_operations *op, size_t op_size, void *user_data) * ->(struct fuse*) * Running: * - fuse_loop / fuse_loop_mt: * (struct fuse*)->(int) * Main loop, running until file system is unmounted. * Cleanup: * - fuse_unmount: * (char *mountpoint, struct fuse_chan *ch)->(void) * - fuse_destroy: * (struct fuse* f)->(void) * * * FUSE lowlevel mount procedure: * * Init: * - fuse_mount: * (char *mountpoint, struct fuse_args *args)->(struct fuse_chan*) * - fuse_lowlevel_new: * (struct fuse_args *args, struct fuse_lowlevel_ops *op, * size_t op_size, void *userdata) -> (struct fuse_session*) * - fuse_session_add_chan: * (struct fuse_session *se, struct fuse_chan *ch)->(void) * Running: * - fuse_session_loop / fuse_session_loop_mt: * (struct fuse_session *se)->(int) * Cleanup: * - fuse_session_remove_chan: * (struct fuse_chan *ch)->(void) * - fuse_session_destroy: * (struct fuse_session *se)->(void) * - fuse_unmount: * (char *mountpoint, struct fuse_chan *ch)->(void) */ fuse_chan *chan = NULL; fuse *fh = NULL; CSLogDebug("Invoking fuse_mount..."); chan = fuse_mount(utf8MountPoint, &args); CSLogDebug(" done. result=%p", chan); if(chan != NULL) { CSLogDebug("Invoking fuse_new..."); fh = fuse_new(chan, &args, &jfuse_operations, sizeof (jfuse_operations), context); CSLogDebug(" done. result=%p", fh); if(fh != NULL) { #if defined(__NetBSD__) int sighandler_res = 0; #else int sighandler_res = fuse_set_signal_handlers(fuse_get_session(fh)); #endif /* defined(__NetBSD__) */ if(sighandler_res == 0) { CSLogDebug("Invoking fuse_loop..."); int fuseLoopRetval = fuse_loop(fh); CSLogDebug(" done. result=%d", fuseLoopRetval); if(fuseLoopRetval != 0) CSLogError("fuse_loop exited with a non-zero value: %d " "(errno is %d (%s)", fuseLoopRetval, errno, strerror(errno)); else res = JNI_TRUE; #if !defined(__NetBSD__) fuse_remove_signal_handlers(fuse_get_session(fh)); #endif } else CSLogError("Couldn't set signal handlers!"); } else CSLogError("fuse_new exited with an error. (errno is %d (%s))", errno, strerror(errno)); } else CSLogError("fuse_mount exited with an error. (errno is %d (%s))", errno, strerror(errno)); fuse_opt_free_args(&args); if(chan != NULL) { CSLogDebug("Unmounting \"%s\"... (chan=%p)", utf8MountPoint, chan); fuse_unmount(utf8MountPoint, chan); } if(fh != NULL) { CSLogDebug("Destroying fuse filehandle %p...", fh); fuse_destroy(fh); } delete context; } CSLogTraceLeave(_FNAME_ "(%p, %p, %p, %p, %p, %p, %p): %d", env, cls, fileSystem, mountPoint, optionStrings, fuseCapabilities, macFuseCapabilities, res); return res; #undef _FNAME_ }
int main(int argc, char *argv[]) { int ret = -1; int lockfd = -1; gboolean foreground = FALSE; gboolean force_local_mode = FALSE; gboolean wrote_pidfile = FALSE; memdb_t *memdb = NULL; dfsm_t *dcdb = NULL; dfsm_t *status_fsm = NULL; qb_log_init("pmxcfs", LOG_DAEMON, LOG_DEBUG); /* remove default filter */ qb_log_filter_ctl(QB_LOG_SYSLOG, QB_LOG_FILTER_REMOVE, QB_LOG_FILTER_FILE, "*", LOG_DEBUG); qb_log_tags_stringify_fn_set(log_tags_stringify); qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_ENABLED, QB_TRUE); update_qb_log_settings(); g_set_print_handler(glib_print_handler); g_set_printerr_handler(glib_print_handler); g_log_set_default_handler(glib_log_handler, NULL); GOptionContext *context; GOptionEntry entries[] = { { "debug", 'd', 0, G_OPTION_ARG_NONE, &cfs.debug, "Turn on debug messages", NULL }, { "foreground", 'f', 0, G_OPTION_ARG_NONE, &foreground, "Do not daemonize server", NULL }, { "local", 'l', 0, G_OPTION_ARG_NONE, &force_local_mode, "Force local mode (ignore cluster.conf, force quorum)", NULL }, { NULL }, }; context = g_option_context_new (""); g_option_context_add_main_entries (context, entries, NULL); GError *err = NULL; if (!g_option_context_parse (context, &argc, &argv, &err)) { cfs_critical("option parsing failed: %s", err->message); g_error_free (err); qb_log_fini(); exit (1); } g_option_context_free(context); if (optind < argc) { cfs_critical("too many arguments"); qb_log_fini(); exit(-1); } if (cfs.debug) { update_qb_log_settings(); } struct utsname utsname; if (uname(&utsname) != 0) { cfs_critical("Unable to read local node name"); qb_log_fini(); exit (-1); } for (int i=0; i < sizeof(utsname.nodename); i++) { if (utsname.nodename[i] =='.') utsname.nodename[i] = 0; } cfs.nodename = g_strdup(utsname.nodename); if (!(cfs.ip = lookup_node_ip(cfs.nodename))) { cfs_critical("Unable to get local IP address"); qb_log_fini(); exit(-1); } struct group *www_data = getgrnam("www-data"); if (!www_data) { cfs_critical("Unable to get www-data group ID"); qb_log_fini(); exit (-1); } cfs.gid = www_data->gr_gid; g_thread_init(NULL); umask(027); mkdir(VARLIBDIR, 0755); if ((lockfd = open(LOCKFILE, O_RDWR|O_CREAT|O_APPEND)) == -1) { cfs_critical("unable to create lock '%s': %s", LOCKFILE, strerror (errno)); goto err; } for (int i = 10; i >= 0; i--) { if (flock(lockfd, LOCK_EX|LOCK_NB) != 0) { if (!i) { cfs_critical("unable to aquire pmxcfs lock: %s", strerror (errno)); goto err; } if (i == 10) cfs_message("unable to aquire pmxcfs lock - trying again"); sleep(1); } } cfs_status_init(); gboolean create = !g_file_test(DBFILENAME, G_FILE_TEST_EXISTS); if (!(memdb = memdb_open (DBFILENAME))) { cfs_critical("memdb_open failed - unable to open database '%s'", DBFILENAME); goto err; } // automatically import cluster.conf from host if (create && !force_local_mode) { char *cdata = NULL; gsize clen = 0; if (g_file_get_contents(HOST_CLUSTER_CONF_FN, &cdata, &clen, NULL)) { guint32 mtime = time(NULL); memdb_create(memdb, "/cluster.conf", 0, mtime); if (memdb_write(memdb, "/cluster.conf", 0, mtime, cdata, clen, 0, 1) < 0) { cfs_critical("memdb_write failed - unable to import cluster.conf"); goto err; } } } // does cluster.conf exist? gpointer conf_data = NULL; int len = memdb_read(memdb, "cluster.conf", &conf_data); if (len >= 0) { if (force_local_mode) { cfs_message("forcing local mode (althought cluster.conf exists)"); cfs_set_quorate(1, TRUE); } else { if (!(dcdb = dcdb_new(memdb))) goto err; dcdb_sync_cluster_conf(memdb, 1); } } else { cfs_debug("using local mode (cluster.conf does not exist)"); cfs_set_quorate(1, TRUE); } if (conf_data) g_free(conf_data); cfs_plug_memdb_t *config = cfs_plug_memdb_new("memdb", memdb, dcdb); cfs_plug_base_t *bplug = cfs_plug_base_new("", (cfs_plug_t *)config); create_symlinks(bplug, cfs.nodename); root_plug = (cfs_plug_t *)bplug; system("umount -f " CFSDIR " >/dev/null 2>&1"); char *fa[] = { "-f", "-odefault_permissions", "-oallow_other", NULL}; struct fuse_args fuse_args = FUSE_ARGS_INIT(sizeof (fa)/sizeof(gpointer) - 1, fa); struct fuse_chan *fuse_chan = fuse_mount(CFSDIR, &fuse_args); if (!fuse_chan) { cfs_critical("fuse_mount error: %s", strerror(errno)); goto err; } if (!(fuse = fuse_new(fuse_chan, &fuse_args, &fuse_ops, sizeof(fuse_ops), NULL))) { cfs_critical("fuse_new error: %s", strerror(errno)); goto err; } fuse_set_signal_handlers(fuse_get_session(fuse)); if (!foreground) { pid_t cpid = fork(); if (cpid == -1) { cfs_critical("failed to daemonize program - %s", strerror (errno)); goto err; } else if (cpid) { write_pidfile(cpid); qb_log_fini(); _exit (0); } else { int nullfd; chroot("/"); if ((nullfd = open("/dev/null", O_RDWR, 0)) != -1) { dup2(nullfd, 0); dup2(nullfd, 1); dup2(nullfd, 2); if (nullfd > 2) close (nullfd); } // do not print to the console after this point qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_ENABLED, QB_FALSE); setsid(); } } else { write_pidfile(getpid()); } wrote_pidfile = TRUE; cfs_loop_t *corosync_loop = cfs_loop_new(fuse); cfs_service_t *service_quorum = NULL; cfs_service_t *service_confdb = NULL; cfs_service_t *service_dcdb = NULL; cfs_service_t *service_status = NULL; if (dcdb) { service_quorum = service_quorum_new(); cfs_loop_add_service(corosync_loop, service_quorum, QB_LOOP_HIGH); service_confdb = service_confdb_new(); cfs_loop_add_service(corosync_loop, service_confdb, QB_LOOP_MED); service_dcdb = service_dfsm_new(dcdb); cfs_service_set_timer(service_dcdb, DCDB_VERIFY_TIME); cfs_loop_add_service(corosync_loop, service_dcdb, QB_LOOP_MED); status_fsm = cfs_status_dfsm_new(); service_status = service_dfsm_new(status_fsm); cfs_loop_add_service(corosync_loop, service_status, QB_LOOP_LOW); } cfs_loop_start_worker(corosync_loop); server_start(memdb); ret = fuse_loop_mt(fuse); cfs_message("teardown filesystem"); server_stop(); fuse_unmount(CFSDIR, fuse_chan); fuse_destroy(fuse); cfs_debug("set stop event loop flag"); cfs_loop_stop_worker(corosync_loop); cfs_loop_destroy(corosync_loop); cfs_debug("worker finished"); if (service_dcdb) service_dfsm_destroy(service_dcdb); if (service_confdb) service_confdb_destroy(service_confdb); if (service_quorum) service_quorum_destroy(service_quorum); if (service_status) service_dfsm_destroy(service_status); sleep(1); /* do not restart too fast */ ret: if (status_fsm) dfsm_destroy(status_fsm); if (dcdb) dfsm_destroy(dcdb); if (memdb) memdb_close(memdb); if (wrote_pidfile) unlink(CFS_PID_FN); cfs_message("exit proxmox configuration filesystem (%d)", ret); cfs_status_cleanup(); qb_log_fini(); exit(ret); err: goto ret; }