int main(int argc,char **argv) { char *wrkdir; int ch; int32_t nicelevel; struct rlimit rls; exiting = 0; strerr_init(); set_signal_handlers(); if (initialize()) { if (getrlimit(RLIMIT_NOFILE,&rls)==0) { syslog(LOG_NOTICE,"open files limit: %lu",(unsigned long)(rls.rlim_cur)); } if (initialize_late()) { mainloop(); ch=0; } else { ch=1; } } else { fprintf(stderr,"error occured during initialization - exiting\n"); ch=1; } destruct(); free_all_registered_entries(); strerr_term(); return ch; }
int main(int argc, char *argv[]) { int res; int mt,fg; char *mountpoint; struct fuse_args args = FUSE_ARGS_INIT(argc, argv); struct fuse_args defaultargs = FUSE_ARGS_INIT(0, NULL); #if defined(SIGPIPE) && defined(SIG_IGN) signal(SIGPIPE,SIG_IGN); #endif strerr_init(); mycrc32_init(); mfsopts.masterhost = NULL; mfsopts.masterport = NULL; mfsopts.bindhost = NULL; mfsopts.proxyhost = NULL; mfsopts.subfolder = NULL; mfsopts.password = NULL; mfsopts.md5pass = NULL; mfsopts.preferedlabels = NULL; mfsopts.nofile = 0; mfsopts.nice = -19; #ifdef MFS_USE_MEMLOCK mfsopts.memlock = 0; #endif #ifdef MFS_USE_MALLOPT mfsopts.limitarenas = 8; #endif mfsopts.nostdmountoptions = 0; mfsopts.meta = 0; mfsopts.debug = 0; mfsopts.delayedinit = 0; #ifdef __linux__ mfsopts.mkdircopysgid = 1; #else mfsopts.mkdircopysgid = 0; #endif mfsopts.sugidclearmodestr = NULL; mfsopts.donotrememberpassword = 0; // mfsopts.xattraclsupport = 0; mfsopts.cachefiles = 0; mfsopts.noxattrs = 0; mfsopts.noposixlocks = 0; mfsopts.nobsdlocks = 0; mfsopts.cachemode = NULL; mfsopts.writecachesize = 0; mfsopts.readaheadsize = 0; mfsopts.readaheadleng = 0; mfsopts.readaheadtrigger = 0; mfsopts.ioretries = 30; mfsopts.passwordask = 0; mfsopts.attrcacheto = 1.0; mfsopts.xattrcacheto = 30.0; mfsopts.entrycacheto = 0.0; mfsopts.direntrycacheto = 1.0; mfsopts.negentrycacheto = 1.0; mfsopts.groupscacheto = 300.0; mfsopts.fsyncbeforeclose = 0; custom_cfg = 0; // dump_args("input_args",&args); fuse_opt_add_arg(&defaultargs,"fakeappname"); if (fuse_opt_parse(&args, &defaultargs, mfs_opts_stage1, mfs_opt_proc_stage1)<0) { exit(1); } if (custom_cfg==0) { int cfgfd; char *cfgfile; cfgfile=strdup(ETC_PATH "/mfs/mfsmount.cfg"); if ((cfgfd = open(cfgfile,O_RDONLY))<0 && errno==ENOENT) { free(cfgfile); cfgfile=strdup(ETC_PATH "/mfsmount.cfg"); if ((cfgfd = open(cfgfile,O_RDONLY))>=0) { fprintf(stderr,"default sysconf path has changed - please move mfsmount.cfg from "ETC_PATH"/ to "ETC_PATH"/mfs/\n"); } } if (cfgfd>=0) { close(cfgfd); } mfs_opt_parse_cfg_file(cfgfile,1,&defaultargs); free(cfgfile); } // dump_args("parsed_defaults",&defaultargs); // dump_args("changed_args",&args); if (fuse_opt_parse(&defaultargs, &mfsopts, mfs_opts_stage2, mfs_opt_proc_stage2)<0) { exit(1); } if (fuse_opt_parse(&args, &mfsopts, mfs_opts_stage2, mfs_opt_proc_stage2)<0) { exit(1); } // dump_args("args_after_parse",&args); if (mfsopts.cachemode!=NULL && mfsopts.cachefiles) { fprintf(stderr,"mfscachemode and mfscachefiles options are exclusive - use only mfscachemode\nsee: %s -h for help\n",argv[0]); return 1; } if (mfsopts.cachemode==NULL) { mfsopts.keepcache=(mfsopts.cachefiles)?1:0; } else if (strcasecmp(mfsopts.cachemode,"AUTO")==0) { mfsopts.keepcache=0; } else if (strcasecmp(mfsopts.cachemode,"YES")==0 || strcasecmp(mfsopts.cachemode,"ALWAYS")==0) { mfsopts.keepcache=1; } else if (strcasecmp(mfsopts.cachemode,"NO")==0 || strcasecmp(mfsopts.cachemode,"NONE")==0 || strcasecmp(mfsopts.cachemode,"NEVER")==0) { mfsopts.keepcache=2; } else { fprintf(stderr,"unrecognized cachemode option\nsee: %s -h for help\n",argv[0]); return 1; } if (mfsopts.sugidclearmodestr==NULL) { #if defined(DEFAULT_SUGID_CLEAR_MODE_EXT) mfsopts.sugidclearmode = SUGID_CLEAR_MODE_EXT; #elif defined(DEFAULT_SUGID_CLEAR_MODE_BSD) mfsopts.sugidclearmode = SUGID_CLEAR_MODE_BSD; #elif defined(DEFAULT_SUGID_CLEAR_MODE_OSX) mfsopts.sugidclearmode = SUGID_CLEAR_MODE_OSX; #else mfsopts.sugidclearmode = SUGID_CLEAR_MODE_NEVER; #endif } else if (strcasecmp(mfsopts.sugidclearmodestr,"NEVER")==0) { mfsopts.sugidclearmode = SUGID_CLEAR_MODE_NEVER; } else if (strcasecmp(mfsopts.sugidclearmodestr,"ALWAYS")==0) { mfsopts.sugidclearmode = SUGID_CLEAR_MODE_ALWAYS; } else if (strcasecmp(mfsopts.sugidclearmodestr,"OSX")==0) { mfsopts.sugidclearmode = SUGID_CLEAR_MODE_OSX; } else if (strcasecmp(mfsopts.sugidclearmodestr,"BSD")==0) { mfsopts.sugidclearmode = SUGID_CLEAR_MODE_BSD; } else if (strcasecmp(mfsopts.sugidclearmodestr,"EXT")==0) { mfsopts.sugidclearmode = SUGID_CLEAR_MODE_EXT; } else if (strcasecmp(mfsopts.sugidclearmodestr,"XFS")==0) { mfsopts.sugidclearmode = SUGID_CLEAR_MODE_XFS; } else { fprintf(stderr,"unrecognized sugidclearmode option\nsee: %s -h for help\n",argv[0]); return 1; } if (mfsopts.masterhost==NULL) { mfsopts.masterhost = strdup(DEFAULT_MASTERNAME); } if (mfsopts.masterport==NULL) { mfsopts.masterport = strdup(DEFAULT_MASTER_CLIENT_PORT); } if (mfsopts.proxyhost==NULL) { mfsopts.proxyhost = strdup("127.0.0.1"); } if (mfsopts.subfolder==NULL) { mfsopts.subfolder = strdup("/"); } if (mfsopts.nofile==0) { mfsopts.nofile=100000; } if (mfsopts.writecachesize==0) { mfsopts.writecachesize=256; } if (mfsopts.writecachesize<16) { fprintf(stderr,"write cache size too low (%u MiB) - increased to 16 MiB\n",mfsopts.writecachesize); mfsopts.writecachesize=16; } if (mfsopts.writecachesize>2048) { fprintf(stderr,"write cache size too big (%u MiB) - decresed to 2048 MiB\n",mfsopts.writecachesize); mfsopts.writecachesize=2048; } if (mfsopts.readaheadsize==0) { mfsopts.readaheadsize=256; } if (mfsopts.readaheadsize<16) { fprintf(stderr,"read ahead size too low (%u MiB) - increased to 16 MiB\n",mfsopts.readaheadsize); mfsopts.readaheadsize=16; } if (mfsopts.readaheadsize>2048) { fprintf(stderr,"read ahead size too big (%u MiB) - decresed to 2048 MiB\n",mfsopts.readaheadsize); mfsopts.readaheadsize=2048; } if (mfsopts.readaheadleng==0) { mfsopts.readaheadleng=0x100000; } if (mfsopts.readaheadleng<0x20000) { fprintf(stderr,"read ahead length too low (%u B) - increased to 128 KiB\n",mfsopts.readaheadleng); mfsopts.readaheadleng=0x20000; } if (mfsopts.readaheadleng>0x200000) { fprintf(stderr,"read ahead length too big (%u B) - decresed to 2 MiB\n",mfsopts.readaheadleng); mfsopts.readaheadleng=0x200000; } if (mfsopts.readaheadtrigger==0) { mfsopts.readaheadtrigger=mfsopts.readaheadleng*10; } if (mfsopts.nostdmountoptions==0) { fuse_opt_add_arg(&args, "-o" DEFAULT_OPTIONS); } if (csorder_init(mfsopts.preferedlabels)<0) { fprintf(stderr,"error parsing prefered labels expression\nsee: %s -h for help\n",argv[0]); return 1; } make_fsname(&args); remove_mfsmount_magic(&args); // dump_args("args_before_fuse_parse_cmdline",&args); if (fuse_parse_cmdline(&args,&mountpoint,&mt,&fg)<0) { fprintf(stderr,"see: %s -h for help\n",argv[0]); return 1; } if (!mountpoint) { if (defaultmountpoint) { mountpoint = defaultmountpoint; } else { fprintf(stderr,"no mount point\nsee: %s -h for help\n",argv[0]); return 1; } } res = mainloop(&args,mountpoint,mt,fg); fuse_opt_free_args(&args); free(mfsopts.masterhost); free(mfsopts.masterport); if (mfsopts.bindhost) { free(mfsopts.bindhost); } if (mfsopts.proxyhost) { free(mfsopts.proxyhost); } free(mfsopts.subfolder); if (defaultmountpoint) { free(defaultmountpoint); } stats_term(); strerr_term(); return res; }
int main(int argc,char **argv) { char *logappname; // char *lockfname; char *wrkdir; char *cfgfile; char *appname; int ch; uint8_t runmode; int rundaemon,logundefined; int lockmemory; int32_t nicelevel; uint32_t locktimeout; int fd; uint8_t movewarning; struct rlimit rls; strerr_init(); mycrc32_init(); movewarning = 0; cfgfile=strdup(ETC_PATH "/mfs/" STR(APPNAME) ".cfg"); passert(cfgfile); if ((fd = open(cfgfile,O_RDONLY))<0 && errno==ENOENT) { free(cfgfile); cfgfile=strdup(ETC_PATH "/" STR(APPNAME) ".cfg"); passert(cfgfile); if ((fd = open(cfgfile,O_RDONLY))>=0) { movewarning = 1; } } if (fd>=0) { close(fd); } locktimeout = 1800; rundaemon = 1; runmode = RM_RESTART; logundefined = 0; lockmemory = 0; appname = argv[0]; while ((ch = getopt(argc, argv, "uvdfsc:t:h?")) != -1) { switch(ch) { case 'v': printf("version: %u.%u.%u\n",VERSMAJ,VERSMID,VERSMIN); return 0; case 'd': rundaemon=0; break; case 'f': runmode=RM_START; break; case 's': runmode=RM_STOP; break; case 't': locktimeout=strtoul(optarg,NULL,10); break; case 'c': free(cfgfile); cfgfile = strdup(optarg); passert(cfgfile); movewarning = 0; break; case 'u': logundefined=1; break; default: usage(appname); return 1; } } argc -= optind; argv += optind; if (argc==1) { if (strcasecmp(argv[0],"start")==0) { runmode = RM_START; } else if (strcasecmp(argv[0],"stop")==0) { runmode = RM_STOP; } else if (strcasecmp(argv[0],"restart")==0) { runmode = RM_RESTART; } else if (strcasecmp(argv[0],"reload")==0) { runmode = RM_RELOAD; } else if (strcasecmp(argv[0],"test")==0) { runmode = RM_TEST; } else if (strcasecmp(argv[0],"kill")==0) { runmode = RM_KILL; } else { usage(appname); return 1; } } else if (argc!=0) { usage(appname); return 1; } if (movewarning) { mfs_syslog(LOG_WARNING,"default sysconf path has changed - please move " STR(APPNAME) ".cfg from "ETC_PATH"/ to "ETC_PATH"/mfs/"); } if ((runmode==RM_START || runmode==RM_RESTART) && rundaemon) { makedaemon(); } else { if (runmode==RM_START || runmode==RM_RESTART) { set_signal_handlers(0); } } if (cfg_load(cfgfile,logundefined)==0) { fprintf(stderr,"can't load config file: %s - using defaults\n",cfgfile); } free(cfgfile); logappname = cfg_getstr("SYSLOG_IDENT",STR(APPNAME)); if (rundaemon) { if (logappname[0]) { openlog(logappname, LOG_PID | LOG_NDELAY , LOG_DAEMON); } else { openlog(STR(APPNAME), LOG_PID | LOG_NDELAY , LOG_DAEMON); } } else { #if defined(LOG_PERROR) if (logappname[0]) { openlog(logappname, LOG_PID | LOG_NDELAY | LOG_PERROR, LOG_USER); } else { openlog(STR(APPNAME), LOG_PID | LOG_NDELAY | LOG_PERROR, LOG_USER); } #else if (logappname[0]) { openlog(logappname, LOG_PID | LOG_NDELAY, LOG_USER); } else { openlog(STR(APPNAME), LOG_PID | LOG_NDELAY, LOG_USER); } #endif } if (runmode==RM_START || runmode==RM_RESTART) { rls.rlim_cur = MFSMAXFILES; rls.rlim_max = MFSMAXFILES; if (setrlimit(RLIMIT_NOFILE,&rls)<0) { syslog(LOG_NOTICE,"can't change open files limit to %u",MFSMAXFILES); } lockmemory = cfg_getnum("LOCK_MEMORY",0); #ifdef MFS_USE_MEMLOCK if (lockmemory) { rls.rlim_cur = RLIM_INFINITY; rls.rlim_max = RLIM_INFINITY; setrlimit(RLIMIT_MEMLOCK,&rls); } #endif nicelevel = cfg_getint32("NICE_LEVEL",-19); setpriority(PRIO_PROCESS,getpid(),nicelevel); } changeugid(); wrkdir = cfg_getstr("DATA_PATH",DATA_PATH); if (runmode==RM_START || runmode==RM_RESTART) { fprintf(stderr,"working directory: %s\n",wrkdir); } if (chdir(wrkdir)<0) { mfs_arg_syslog(LOG_ERR,"can't set working directory to %s",wrkdir); if (rundaemon) { fputc(0,stderr); close_msg_channel(); } closelog(); free(logappname); return 1; } free(wrkdir); umask(cfg_getuint32("FILE_UMASK",027)&077); /* for upgrading from previous versions of MFS */ if (check_old_locks(runmode,locktimeout)<0) { if (rundaemon) { fputc(0,stderr); close_msg_channel(); } closelog(); free(logappname); wdunlock(); return 1; } if (wdlock(runmode,locktimeout)<0) { if (rundaemon) { fputc(0,stderr); close_msg_channel(); } closelog(); free(logappname); wdunlock(); return 1; } remove_old_wdlock(); if (runmode==RM_STOP || runmode==RM_KILL || runmode==RM_RELOAD || runmode==RM_TEST) { if (rundaemon) { close_msg_channel(); } closelog(); free(logappname); wdunlock(); return 0; } #ifdef MFS_USE_MEMLOCK if (lockmemory) { if (getrlimit(RLIMIT_MEMLOCK,&rls)<0) { mfs_errlog(LOG_WARNING,"error getting memory lock limits"); } else { if (rls.rlim_cur!=RLIM_INFINITY && rls.rlim_max==RLIM_INFINITY) { rls.rlim_cur = RLIM_INFINITY; rls.rlim_max = RLIM_INFINITY; if (setrlimit(RLIMIT_MEMLOCK,&rls)<0) { mfs_errlog(LOG_WARNING,"error setting memory lock limit to unlimited"); } } if (getrlimit(RLIMIT_MEMLOCK,&rls)<0) { mfs_errlog(LOG_WARNING,"error getting memory lock limits"); } else { if (rls.rlim_cur!=RLIM_INFINITY) { mfs_errlog(LOG_WARNING,"can't set memory lock limit to unlimited"); } else { if (mlockall(MCL_CURRENT|MCL_FUTURE)<0) { mfs_errlog(LOG_WARNING,"memory lock error"); } else { mfs_syslog(LOG_NOTICE,"process memory was successfully locked in RAM"); } } } } } #else if (lockmemory) { mfs_syslog(LOG_WARNING,"memory lock not supported !!!"); } #endif fprintf(stderr,"initializing %s modules ...\n",logappname); if (initialize()) { if (getrlimit(RLIMIT_NOFILE,&rls)==0) { syslog(LOG_NOTICE,"open files limit: %lu",(unsigned long)(rls.rlim_cur)); } fprintf(stderr,"%s daemon initialized properly\n",logappname); if (rundaemon) { close_msg_channel(); } if (initialize_late()) { mainloop(); ch=0; } else { ch=1; } } else { fprintf(stderr,"error occured during initialization - exiting\n"); if (rundaemon) { fputc(0,stderr); close_msg_channel(); } ch=1; } destruct(); free_all_registered_entries(); signal_cleanup(); cfg_term(); strerr_term(); closelog(); free(logappname); wdunlock(); return ch; }
int main(int argc, char *argv[]) { int res; int mt,fg; int i; char *mountpoint; struct fuse_args args = FUSE_ARGS_INIT(argc, argv); struct fuse_args defaultargs = FUSE_ARGS_INIT(0, NULL); #if defined(SIGPIPE) && defined(SIG_IGN) signal(SIGPIPE,SIG_IGN); #endif strerr_init(); mycrc32_init(); setenv("FUSE_THREAD_STACK","524288",0); // works good with 262144 but not 131072, so for safety we will use 524288 mfsopts.masterhost = NULL; mfsopts.masterport = NULL; mfsopts.bindhost = NULL; mfsopts.proxyhost = NULL; mfsopts.subfolder = NULL; mfsopts.password = NULL; mfsopts.md5pass = NULL; mfsopts.preferedlabels = NULL; mfsopts.nofile = 0; mfsopts.nice = -19; #ifdef MFS_USE_MEMLOCK mfsopts.memlock = 0; #endif #ifdef MFS_USE_MALLOPT mfsopts.limitarenas = 2; #endif #if defined(__linux__) && defined(OOM_DISABLE) mfsopts.oomdisable = 1; #endif mfsopts.nostdmountoptions = 0; mfsopts.meta = 0; mfsopts.flattrash = 0; mfsopts.debug = 0; mfsopts.delayedinit = 0; #ifdef __linux__ mfsopts.mkdircopysgid = 1; #else mfsopts.mkdircopysgid = 0; #endif mfsopts.sugidclearmodestr = NULL; mfsopts.donotrememberpassword = 0; // mfsopts.xattraclsupport = 0; mfsopts.cachefiles = 0; mfsopts.noxattrs = 0; mfsopts.noposixlocks = 0; mfsopts.nobsdlocks = 0; mfsopts.cachemode = NULL; mfsopts.writecachesize = 0; mfsopts.readaheadsize = 0; mfsopts.readaheadleng = 0; mfsopts.readaheadtrigger = 0; mfsopts.ioretries = 30; mfsopts.timeout = 0; mfsopts.logretry = 5; mfsopts.passwordask = 0; mfsopts.attrcacheto = 1.0; mfsopts.xattrcacheto = 30.0; mfsopts.entrycacheto = 0.0; mfsopts.direntrycacheto = 1.0; mfsopts.negentrycacheto = 0.0; mfsopts.groupscacheto = 300.0; mfsopts.fsyncbeforeclose = 0; mfsopts.fsyncmintime = 0.0; custom_cfg = 0; // dump_args("input_args",&args); if (args.argc>1) { uint32_t hostlen,portlen,colons; char *c,*portbegin; int optpos; // skip options in format '-o XXXX' and '-oXXXX' optpos = 1; while (optpos<args.argc) { c = args.argv[optpos]; if (c[0]=='-' && c[1]=='o') { if (c[2]) { optpos++; } else { optpos+=2; } } else { break; } } if (optpos<args.argc) { // check if next arg matches to HOST[:PORT]:[PATH] c = args.argv[optpos]; colons = 0; for (i=0 ; c[i] ; i++) { if (c[i]==':') { colons++; } } if (colons>0) { hostlen = 0; portlen = 0; portbegin = NULL; while (((*c)>='a' && (*c)<='z') || ((*c)>='A' && (*c)<='Z') || ((*c)>='0' && (*c)<='9') || (*c)=='-' || (*c)=='.') { // DNS chars c++; hostlen++; } if (hostlen>0) { if ((*c)==':' && colons>1) { c++; portbegin = c; while ((*c)>='0' && ((*c)<='9')) { c++; portlen++; } } if ((*c)==':') { // match found c++; if (*c) { mfsopts.subfolder = strdup(c); } mfsopts.masterhost = malloc(hostlen+1); memcpy(mfsopts.masterhost,args.argv[optpos],hostlen); mfsopts.masterhost[hostlen]=0; if (portbegin!=NULL && portlen>0) { mfsopts.masterport = malloc(portlen+1); memcpy(mfsopts.masterport,portbegin,portlen); mfsopts.masterport[portlen]=0; } for (i=optpos+1 ; i<args.argc ; i++) { args.argv[i-1] = args.argv[i]; } args.argc--; } } } } } // dump_args("after_first_filter",&args); if (fuse_opt_parse(&args, &defaultargs, mfs_opts_stage1, mfs_opt_proc_stage1)<0) { exit(1); } if (custom_cfg==0) { int cfgfd; char *cfgfile; cfgfile=strdup(ETC_PATH "/mfs/mfsmount.cfg"); if ((cfgfd = open(cfgfile,O_RDONLY))<0 && errno==ENOENT) { free(cfgfile); cfgfile=strdup(ETC_PATH "/mfsmount.cfg"); if ((cfgfd = open(cfgfile,O_RDONLY))>=0) { fprintf(stderr,"default sysconf path has changed - please move mfsmount.cfg from "ETC_PATH"/ to "ETC_PATH"/mfs/\n"); } } if (cfgfd>=0) { close(cfgfd); } mfs_opt_parse_cfg_file(cfgfile,1,&defaultargs); free(cfgfile); } // dump_args("parsed_defaults",&defaultargs); // dump_args("changed_args",&args); for (i=0 ; i<defaultargs.argc ; i++) { fuse_opt_add_arg(&args,defaultargs.argv[i]); } // dump_args("combined_args",&args); if (fuse_opt_parse(&args, &mfsopts, mfs_opts_stage2, mfs_opt_proc_stage2)<0) { exit(1); } // dump_args("combined_args_after_parse",&args); if (mfsopts.cachemode!=NULL && mfsopts.cachefiles) { fprintf(stderr,"mfscachemode and mfscachefiles options are exclusive - use only mfscachemode\nsee: %s -h for help\n",argv[0]); return 1; } if (mfsopts.cachemode==NULL) { #if defined(__FreeBSD__) || defined(__APPLE__) mfsopts.keepcache = 3; #else mfsopts.keepcache = (mfsopts.cachefiles)?1:0; #endif } else if (strcasecmp(mfsopts.cachemode,"AUTO")==0) { mfsopts.keepcache=0; } else if (strcasecmp(mfsopts.cachemode,"YES")==0 || strcasecmp(mfsopts.cachemode,"ALWAYS")==0) { mfsopts.keepcache=1; } else if (strcasecmp(mfsopts.cachemode,"NO")==0 || strcasecmp(mfsopts.cachemode,"NONE")==0 || strcasecmp(mfsopts.cachemode,"NEVER")==0) { mfsopts.keepcache=2; } else if (strcasecmp(mfsopts.cachemode,"DIRECT")==0) { mfsopts.keepcache=3; } else { fprintf(stderr,"unrecognized cachemode option\nsee: %s -h for help\n",argv[0]); return 1; } if (mfsopts.sugidclearmodestr==NULL) { #if defined(DEFAULT_SUGID_CLEAR_MODE_EXT) mfsopts.sugidclearmode = SUGID_CLEAR_MODE_EXT; #elif defined(DEFAULT_SUGID_CLEAR_MODE_BSD) mfsopts.sugidclearmode = SUGID_CLEAR_MODE_BSD; #elif defined(DEFAULT_SUGID_CLEAR_MODE_OSX) mfsopts.sugidclearmode = SUGID_CLEAR_MODE_OSX; #else mfsopts.sugidclearmode = SUGID_CLEAR_MODE_NEVER; #endif } else if (strcasecmp(mfsopts.sugidclearmodestr,"NEVER")==0) { mfsopts.sugidclearmode = SUGID_CLEAR_MODE_NEVER; } else if (strcasecmp(mfsopts.sugidclearmodestr,"ALWAYS")==0) { mfsopts.sugidclearmode = SUGID_CLEAR_MODE_ALWAYS; } else if (strcasecmp(mfsopts.sugidclearmodestr,"OSX")==0) { mfsopts.sugidclearmode = SUGID_CLEAR_MODE_OSX; } else if (strcasecmp(mfsopts.sugidclearmodestr,"BSD")==0) { mfsopts.sugidclearmode = SUGID_CLEAR_MODE_BSD; } else if (strcasecmp(mfsopts.sugidclearmodestr,"EXT")==0) { mfsopts.sugidclearmode = SUGID_CLEAR_MODE_EXT; } else if (strcasecmp(mfsopts.sugidclearmodestr,"XFS")==0) { mfsopts.sugidclearmode = SUGID_CLEAR_MODE_XFS; } else { fprintf(stderr,"unrecognized sugidclearmode option\nsee: %s -h for help\n",argv[0]); return 1; } if (mfsopts.masterhost==NULL) { mfsopts.masterhost = strdup(DEFAULT_MASTERNAME); } if (mfsopts.masterport==NULL) { mfsopts.masterport = strdup(DEFAULT_MASTER_CLIENT_PORT); } if (mfsopts.proxyhost==NULL) { mfsopts.proxyhost = strdup("127.0.0.1"); } if (mfsopts.subfolder==NULL) { mfsopts.subfolder = strdup("/"); } if (mfsopts.nofile==0) { mfsopts.nofile=100000; } if (mfsopts.writecachesize==0) { mfsopts.writecachesize=256; } if (mfsopts.writecachesize<16) { fprintf(stderr,"write cache size too low (%u MiB) - increased to 16 MiB\n",mfsopts.writecachesize); mfsopts.writecachesize=16; } if (mfsopts.writecachesize>2048) { fprintf(stderr,"write cache size too big (%u MiB) - decresed to 2048 MiB\n",mfsopts.writecachesize); mfsopts.writecachesize=2048; } if (mfsopts.readaheadsize==0) { mfsopts.readaheadsize=256; } if (mfsopts.readaheadsize<16) { fprintf(stderr,"read ahead size too low (%u MiB) - increased to 16 MiB\n",mfsopts.readaheadsize); mfsopts.readaheadsize=16; } if (mfsopts.readaheadsize>2048) { fprintf(stderr,"read ahead size too big (%u MiB) - decresed to 2048 MiB\n",mfsopts.readaheadsize); mfsopts.readaheadsize=2048; } if (mfsopts.readaheadleng==0) { mfsopts.readaheadleng=0x100000; } if (mfsopts.readaheadleng<0x20000) { fprintf(stderr,"read ahead length too low (%u B) - increased to 128 KiB\n",mfsopts.readaheadleng); mfsopts.readaheadleng=0x20000; } if (mfsopts.readaheadleng>0x200000) { fprintf(stderr,"read ahead length too big (%u B) - decresed to 2 MiB\n",mfsopts.readaheadleng); mfsopts.readaheadleng=0x200000; } if (mfsopts.readaheadtrigger==0) { mfsopts.readaheadtrigger=mfsopts.readaheadleng*10; } if (mfsopts.nostdmountoptions==0) { fuse_opt_add_arg(&args, "-o" DEFAULT_OPTIONS); } if (mfsopts.fsyncbeforeclose) { mfsopts.fsyncmintime=0.0; } if (csorder_init(mfsopts.preferedlabels)<0) { fprintf(stderr,"error parsing preferred labels expression\nsee: %s -h for help\n",argv[0]); return 1; } make_fsname(&args); remove_mfsmount_magic(&args); // dump_args("combined_args_before_fuse_parse_cmdline",&args); if (fuse_parse_cmdline(&args,&mountpoint,&mt,&fg)<0) { fprintf(stderr,"see: %s -h for help\n",argv[0]); return 1; } if (!mountpoint) { if (defaultmountpoint) { mountpoint = defaultmountpoint; } else { fprintf(stderr,"no mount point\nsee: %s -h for help\n",argv[0]); return 1; } } res = mainloop(&args,mountpoint,mt,fg); fuse_opt_free_args(&defaultargs); fuse_opt_free_args(&args); free(mfsopts.masterhost); free(mfsopts.masterport); if (mfsopts.bindhost) { free(mfsopts.bindhost); } if (mfsopts.proxyhost) { free(mfsopts.proxyhost); } free(mfsopts.subfolder); if (defaultmountpoint) { free(defaultmountpoint); } stats_term(); strerr_term(); return res; }