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[]) { 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; }