From a5effd9f1011aa319fdf432c67aec604053b8656 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Mon, 25 Apr 2011 10:46:33 -0400 Subject: [PATCH] viced: Use libcmd for command line options Change-Id: Id402dc44bce03fcf998ad5b3f6de80fae7de9539 Reviewed-on: http://gerrit.openafs.org/5075 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/dviced/Makefile.in | 7 +- src/tviced/Makefile.in | 1 + src/viced/Makefile.in | 1 + src/viced/viced.c | 1016 ++++++++++++++++++++++++------------------------ 4 files changed, 508 insertions(+), 517 deletions(-) diff --git a/src/dviced/Makefile.in b/src/dviced/Makefile.in index 3615cf8..07ef9ad 100644 --- a/src/dviced/Makefile.in +++ b/src/dviced/Makefile.in @@ -53,8 +53,11 @@ objects= ${VICEDOBJS} ${VLSERVEROBJS} ${LWPOBJS} ${LIBACLOBJS} \ SDBGOBJS = state_analyzer.o uuid.o dirpath.o fileutil.o ${TOP_LIBDIR}/util.a \ ${TOP_LIBDIR}/libopr.a -LIBS=${TOP_LIBDIR}/libafsauthent.a ${TOP_LIBDIR}/libafsrpc.a ${TOP_LIBDIR}/util.a \ - ${TOP_LIBDIR}/libopr.a +LIBS=${TOP_LIBDIR}/libafsauthent.a \ + ${TOP_LIBDIR}/libafsrpc.a \ + $(TOP_LIBDIR)/libcmd.a \ + ${TOP_LIBDIR}/libopr.a \ + ${TOP_LIBDIR}/util.a all: dafileserver state_analyzer diff --git a/src/tviced/Makefile.in b/src/tviced/Makefile.in index 8755220..337f07b 100644 --- a/src/tviced/Makefile.in +++ b/src/tviced/Makefile.in @@ -50,6 +50,7 @@ objects= ${VICEDOBJS} ${VLSERVEROBJS} ${LWPOBJS} ${LIBACLOBJS} \ LIBS=${TOP_LIBDIR}/libafsauthent.a \ ${TOP_LIBDIR}/libafsrpc.a \ + $(TOP_LIBDIR)/libcmd.a \ ${TOP_LIBDIR}/util.a all: fileserver diff --git a/src/viced/Makefile.in b/src/viced/Makefile.in index a8a4148..706433d 100644 --- a/src/viced/Makefile.in +++ b/src/viced/Makefile.in @@ -27,6 +27,7 @@ LIBS=${TOP_LIBDIR}/libacl.a \ ${TOP_LIBDIR}/librx.a \ ${TOP_LIBDIR}/libsys.a \ ${TOP_LIBDIR}/libafscom_err.a \ + ${TOP_LIBDIR}/libcmd.a \ ${TOP_LIBDIR}/liblwp.a \ ${TOP_LIBDIR}/libafsutil.a \ $(TOP_LIBDIR)/libopr.a \ diff --git a/src/viced/viced.c b/src/viced/viced.c index ce77cce..ef0fe5a 100644 --- a/src/viced/viced.c +++ b/src/viced/viced.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -129,9 +130,6 @@ extern int Statistics; int busyonrst = 1; int timeout = 30; -int SawSpare; -int SawPctSpare; -int debuglevel = 0; int printBanner = 0; int rxJumbograms = 0; /* default is to not send and receive jumbograms. */ int rxBind = 0; /* don't bind */ @@ -201,8 +199,6 @@ afs_uint32 FS_HostAddrs[ADDRSPERSITE], FS_HostAddr_cnt = 0, FS_registered = 0; /* All addresses in FS_HostAddrs are in NBO */ afsUUID FS_HostUUID; -static void FlagMsg(void); - #ifdef AFS_DEMAND_ATTACH_FS /* * demand attach fs @@ -873,84 +869,6 @@ ShutDown(void *unused) return 0; } - -static void -FlagMsg(void) -{ - /* default supports help flag */ - - fputs("Usage: fileserver ", stdout); - fputs("[-auditlog ] ", stdout); - fputs("[-audit-interface (default is file)] ", stdout); - fputs("[-d ] ", stdout); - fputs("[-p ] ", stdout); - fputs("[-spare ] ", stdout); - fputs("[-pctspare ] ", stdout); - fputs("[-b ] ", stdout); - fputs("[-l ] ", stdout); - fputs("[-s ] ", stdout); - fputs("[-vc ] ", stdout); - fputs("[-w ] ", stdout); - fputs("[-cb ] ", stdout); - fputs("[-banner (print banner every 10 minutes)] ", stdout); - fputs("[-novbc (whole volume cbs disabled)] ", stdout); - fputs("[-implicit ] ", stdout); - fputs("[-readonly (read-only file server)] ", stdout); - fputs("[-hr ] ", stdout); - fputs("[-busyat n>] ", stdout); - fputs("[-nobusy ] ", stdout); - fputs("[-rxpck ] ", stdout); - fputs("[-rxdbg (enable rx debugging)] ", stdout); - fputs("[-rxdbge (enable rxevent debugging)] ", stdout); - fputs("[-rxmaxmtu ] ", stdout); - fputs("[-rxbind (bind the Rx socket to one address)] ", stdout); - fputs("[-allow-dotted-principals (disable the rxkad principal name dot check)] ", stdout); - fputs("[-vhandle-setaside (fds reserved for non-cache io [default 128])] ", stdout); - fputs("[-vhandle-max-cachesize (max open files [default 128])] ", stdout); - fputs("[-vhandle-initial-cachesize (fds reserved for cache io [default 128])] ", stdout); -#ifdef AFS_DEMAND_ATTACH_FS - fputs("[-fs-state-dont-save (disable state save during shutdown)] ", stdout); - fputs("[-fs-state-dont-restore (disable state restore during startup)] ", stdout); - fputs("[-fs-state-verify (default is both)] ", stdout); - fputs("[-vattachpar (default is 1)] ", stdout); - fputs("[-vhashsize (default is 8)] ", stdout); - fputs("[-vlrudisable (disable VLRU functionality)] ", stdout); - fputs("[-vlruthresh (default is 2 hours)] ", stdout); - fputs("[-vlruinterval (default is 2 minutes)] ", stdout); - fputs("[-vlrumax (default is 8)] ", stdout); - fputs("[-unsafe-nosalvage (bypass volume inUse safety check on attach, bypassing salvage)] ", stdout); -#elif AFS_PTHREAD_ENV - fputs("[-vattachpar (default is 1)] ", stdout); -#endif -#ifdef AFS_AIX32_ENV - fputs("[-m ] ", stdout); -#endif -#if defined(AFS_SGI_ENV) - fputs("[-lock (keep fileserver from swapping)] ", stdout); -#endif - fputs("[-L (large server conf)] ", stdout); - fputs("[-S (small server conf)] ", stdout); - fputs("[-k ] ", stdout); - fputs("[-realm ] ", stdout); - fputs("[-udpsize ] ", stdout); - fputs("[-sendsize ] ", stdout); - fputs("[-abortthreshold ] ", stdout); - fputs("[-nojumbo (disable jumbogram network packets - deprecated)] ", stdout); - fputs("[-jumbo (enable jumbogram network packets)] ", stdout); - fputs("[-offline-timeout ]", stdout); - fputs("[-offline-shutdown-timeout ]", stdout); -/* fputs("[-enable_peer_stats] ", stdout); */ -/* fputs("[-enable_process_stats] ", stdout); */ - fputs("[-help]\n", stdout); -/* - ViceLog(0, ("%s", buffer)); -*/ - - fflush(stdout); - -} /*FlagMsg */ - - static afs_int32 ParseRights(char *arights) { @@ -1045,462 +963,535 @@ max_fileserver_thread(void) /* from ihandle.c */ extern ih_init_params vol_io_params; +enum optionsList { + OPT_large, + OPT_small, + OPT_banner, + OPT_implicit, + OPT_lock, + OPT_readonly, + OPT_saneacls, + OPT_buffers, + OPT_callbacks, + OPT_vcsize, + OPT_lvnodes, + OPT_svnodes, + OPT_sendsize, + OPT_minspare, + OPT_spare, + OPT_pctspare, + OPT_hostcpsrefresh, + OPT_vattachthreads, + OPT_abortthreshold, + OPT_busyat, + OPT_nobusy, + OPT_offline_timeout, + OPT_offline_shutdown_timeout, + OPT_vhandle_setaside, + OPT_vhandle_max_cachesize, + OPT_vhandle_initial_cachesize, + OPT_fs_state_dont_save, + OPT_fs_state_dont_restore, + OPT_fs_state_verify, + OPT_vhashsize, + OPT_vlrudisable, + OPT_vlruthresh, + OPT_vlruinterval, + OPT_vlrumax, + OPT_unsafe_nosalvage, + OPT_stack, + OPT_cbwait, + OPT_novbc, + OPT_auditlog, + OPT_auditiface, + OPT_config, + OPT_debug, + OPT_logfile, + OPT_mrafslogs, + OPT_threads, + OPT_syslog, + OPT_peer, + OPT_process, + OPT_nojumbo, + OPT_jumbo, + OPT_rxbind, + OPT_rxdbg, + OPT_rxdbge, + OPT_rxpck, + OPT_rxmaxmtu, + OPT_udpsize, + OPT_dotted, + OPT_realm +}; + static int ParseArgs(int argc, char *argv[]) { - int SawL = 0, SawS = 0, SawVC = 0; - int Sawrxpck = 0, Sawsmall = 0, Sawlarge = 0, Sawcbs = 0, Sawlwps = - 0, Sawbufs = 0; - int Sawbusy = 0; - int i; - int bufSize = 0; /* temp variable to read in udp socket buf size */ + int code; + int optval; + char *optstring; + struct cmd_item *optlist; + struct cmd_syndesc *opts; + int lwps_max; char *auditFileName = NULL; - for (i = 1; i < argc; i++) { - if (!strcmp(argv[i], "-d")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -d\n"); - return -1; - } - debuglevel = atoi(argv[++i]); - LogLevel = debuglevel; - } else if (!strcmp(argv[i], "-banner")) { - printBanner = 1; - } else if (!strcmp(argv[i], "-implicit")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -implicit\n"); - return -1; - } - implicitAdminRights = ParseRights(argv[++i]); - if (implicitAdminRights < 0) - return implicitAdminRights; - } else if (!strcmp(argv[i], "-readonly")) { - readonlyServer = 1; - } else if (!strcmp(argv[i], "-L")) { - SawL = 1; - } else if (!strcmp(argv[i], "-S")) { - SawS = 1; - } else if (!strcmp(argv[i], "-p")) { - Sawlwps = 1; - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -p\n"); - return -1; - } - lwps = atoi(argv[++i]); - } else if (!strcmp(argv[i], "-b")) { - Sawbufs = 1; - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -b\n"); - return -1; - } - buffs = atoi(argv[++i]); - } else if (!strcmp(argv[i], "-l")) { - Sawlarge = 1; - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -l\n"); - return -1; - } - large = atoi(argv[++i]); - } else if (!strcmp(argv[i], "-vc")) { - SawVC = 1; - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -vc\n"); - return -1; - } - volcache = atoi(argv[++i]); - } else if (!strcmp(argv[i], "-novbc")) { - novbc = 1; - } else if (!strcmp(argv[i], "-rxpck")) { - Sawrxpck = 1; - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -rxpck\n"); - return -1; - } - rxpackets = atoi(argv[++i]); -#ifdef AFS_PTHREAD_ENV - } else if (!strcmp(argv[i], "-vattachpar")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for %s\n", argv[i]); - return -1; - } - vol_attach_threads = atoi(argv[++i]); -#endif /* AFS_PTHREAD_ENV */ - } else if (!strcmp(argv[i], "-vhandle-setaside")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for %s\n", argv[i]); - return -1; - } - vol_io_params.fd_handle_setaside = atoi(argv[++i]); - } else if (!strcmp(argv[i], "-vhandle-max-cachesize")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for %s\n", argv[i]); - return -1; - } - vol_io_params.fd_max_cachesize = atoi(argv[++i]); - } else if (!strcmp(argv[i], "-vhandle-initial-cachesize")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for %s\n", argv[i]); - return -1; - } - vol_io_params.fd_initial_cachesize = atoi(argv[++i]); +#if defined(AFS_AIX32_ENV) + extern int aixlow_water; +#endif + + opts = cmd_CreateSyntax(NULL, NULL, NULL, NULL); + + /* fileserver options */ + cmd_AddParmAtOffset(opts, OPT_large, "-L", CMD_FLAG, + CMD_OPTIONAL, "defaults for a 'large' server"); + cmd_AddParmAtOffset(opts, OPT_small, "-S", CMD_FLAG, + CMD_OPTIONAL, "defaults for a 'small' server"); + + cmd_AddParmAtOffset(opts, OPT_banner, "-banner", CMD_FLAG, + CMD_OPTIONAL, "print regular banners to log"); + cmd_AddParmAtOffset(opts, OPT_implicit, "-implicit", CMD_SINGLE, + CMD_OPTIONAL, "implicit admin access bits"); + +#if defined(AFS_SGI_ENV) + cmd_AddParmAtOffset(opts, OPT_lock, "-lock", CMD_FLAG, + CMD_OPTIONAL, "lock filserver binary in memory"); +#endif + cmd_AddParmAtOffset(opts, OPT_readonly, "-readonly", CMD_FLAG, + CMD_OPTIONAL, "be a readonly fileserver"); + cmd_AddParmAtOffset(opts, OPT_saneacls, "-saneacls", CMD_FLAG, + CMD_OPTIONAL, "set the saneacls capability bit"); + + cmd_AddParmAtOffset(opts, OPT_buffers, "-b", CMD_SINGLE, + CMD_OPTIONAL, "buffers"); + cmd_AddParmAtOffset(opts, OPT_callbacks, "-cb", CMD_SINGLE, + CMD_OPTIONAL, "number of callbacks"); + cmd_AddParmAtOffset(opts, OPT_vcsize, "-vc", CMD_SINGLE, + CMD_OPTIONAL, "volume cachesize"); + cmd_AddParmAtOffset(opts, OPT_lvnodes, "-l", CMD_SINGLE, + CMD_OPTIONAL, "large vnodes"); + cmd_AddParmAtOffset(opts, OPT_svnodes, "-s", CMD_SINGLE, + CMD_OPTIONAL, "small vnodes"); + cmd_AddParmAtOffset(opts, OPT_sendsize, "-sendsize", CMD_SINGLE, + CMD_OPTIONAL, "size of send buffer in bytes"); + +#if defined(AFS_AIX32_ENV) + cmd_AddParmAtOffset(opts, OPT_minspare, "-m", CMD_SINGLE, + CMD_OPTIONAL, "minimum percentage spare in partition"); +#endif + + cmd_AddParmAtOffset(opts, OPT_spare, "-spare", CMD_SINGLE, + CMD_OPTIONAL, "kB overage on volume quota"); + cmd_AddParmAtOffset(opts, OPT_pctspare, "pctspare", CMD_SINGLE, + CMD_OPTIONAL, "percentage overage on volume quota"); + + cmd_AddParmAtOffset(opts, OPT_hostcpsrefresh, "-hr", CMD_SINGLE, + CMD_OPTIONAL, "hours between host CPS refreshes"); + +#if defined(AFS_PTHREAD_ENV) + cmd_AddParmAtOffset(opts, OPT_vattachthreads, "-vattachpar", CMD_SINGLE, + CMD_OPTIONAL, "# of volume attachment threads"); +#endif + + cmd_AddParmAtOffset(opts, OPT_abortthreshold, "-abortthreshold", + CMD_SINGLE, CMD_OPTIONAL, + "abort threshold"); + cmd_AddParmAtOffset(opts, OPT_busyat, "-busyat", CMD_SINGLE, CMD_OPTIONAL, + "# of queued entries after which server is busy"); + cmd_AddParmAtOffset(opts, OPT_nobusy, "-nobusy", CMD_FLAG, CMD_OPTIONAL, + "send VRESTARTING while restarting the server"); + + cmd_AddParmAtOffset(opts, OPT_offline_timeout, "-offline-timeout", + CMD_SINGLE, CMD_OPTIONAL, + "timeout for offlining volumes"); + cmd_AddParmAtOffset(opts, OPT_offline_shutdown_timeout, + "-offline-shutdown-timeout", CMD_SINGLE, CMD_OPTIONAL, + "timeout offlining volumes during shutdown"); + + cmd_AddParmAtOffset(opts, OPT_vhandle_setaside, "-vhandle-setaside", + CMD_SINGLE, CMD_OPTIONAL, + "# fds reserved for non-cache IO"); + cmd_AddParmAtOffset(opts, OPT_vhandle_max_cachesize, + "-vhandle-max-cachesize", CMD_SINGLE, CMD_OPTIONAL, + "max open files"); + cmd_AddParmAtOffset(opts, OPT_vhandle_initial_cachesize, + "-vhandle-initial-cachesize", CMD_SINGLE, + CMD_OPTIONAL, "# fds reserved for cache IO"); + #ifdef AFS_DEMAND_ATTACH_FS - } else if (!strcmp(argv[i], "-fs-state-dont-save")) { - fs_state.options.fs_state_save = 0; - } else if (!strcmp(argv[i], "-fs-state-dont-restore")) { - fs_state.options.fs_state_restore = 0; - } else if (!strcmp(argv[i], "-fs-state-verify")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for %s\n", argv[i]); - return -1; - } - i++; - if (!strcmp(argv[i], "none")) { - fs_state.options.fs_state_verify_before_save = 0; - fs_state.options.fs_state_verify_after_restore = 0; - } else if (!strcmp(argv[i], "save")) { - fs_state.options.fs_state_verify_after_restore = 0; - } else if (!strcmp(argv[i], "restore")) { - fs_state.options.fs_state_verify_before_save = 0; - } else if (!strcmp(argv[i], "both")) { - /* default */ - } else { - fprintf(stderr, "invalid argument for %s\n", argv[i-1]); - return -1; - } - } else if (!strcmp(argv[i], "-vhashsize")) { - int hashsize; - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for %s\n", argv[i]); - return -1; - } - hashsize = atoi(argv[++i]); - if (VSetVolHashSize(hashsize)) { - fprintf(stderr, "specified -vhashsize (%s) is invalid or out " - "of range\n", argv[i]); - return -1; - } - } else if (!strcmp(argv[i], "-vlrudisable")) { - VLRU_SetOptions(VLRU_SET_ENABLED, 0); - } else if (!strcmp(argv[i], "-vlruthresh")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for %s\n", argv[i]); - return -1; - } - VLRU_SetOptions(VLRU_SET_THRESH, 60*atoi(argv[++i])); - } else if (!strcmp(argv[i], "-vlruinterval")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for %s\n", argv[i]); - return -1; - } - VLRU_SetOptions(VLRU_SET_INTERVAL, atoi(argv[++i])); - } else if (!strcmp(argv[i], "-vlrumax")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for %s\n", argv[i]); - return -1; - } - VLRU_SetOptions(VLRU_SET_MAX, atoi(argv[++i])); - } else if (!strcmp(argv[i], "-unsafe-nosalvage")) { - unsafe_attach = 1; -#endif /* AFS_DEMAND_ATTACH_FS */ - } else if (!strcmp(argv[i], "-s")) { - Sawsmall = 1; - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -s\n"); - return -1; - } - nSmallVns = atoi(argv[++i]); - } else if (!strcmp(argv[i], "-abortthreshold")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -abortthreshold\n"); - return -1; - } - abort_threshold = atoi(argv[++i]); - } else if (!strcmp(argv[i], "-k")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -k\n"); - return -1; - } - stack = atoi(argv[++i]); - } + /* dafs options */ + cmd_AddParmAtOffset(opts, OPT_fs_state_dont_save, + "-fs-state-dont-save", CMD_FLAG, CMD_OPTIONAL, + "disable state save during shutdown"); + cmd_AddParmAtOffset(opts, OPT_fs_state_dont_restore, + "-fs-state-dont-restore", CMD_FLAG, CMD_OPTIONAL, + "disable state restore during startup"); + cmd_AddParmAtOffset(opts, OPT_fs_state_verify, "-fs-state-verify", + CMD_SINGLE, CMD_OPTIONAL, "none|save|restore|both"); + cmd_AddParmAtOffset(opts, OPT_vhashsize, "-vhashsize", + CMD_SINGLE, CMD_OPTIONAL, + "log(2) of # of volume hash buckets"); + cmd_AddParmAtOffset(opts, OPT_vlrudisable, "-vlrudisable", + CMD_FLAG, CMD_OPTIONAL, "disable VLRU functionality"); + cmd_AddParmAtOffset(opts, OPT_vlruthresh, "-vlruthresh", + CMD_FLAG, CMD_OPTIONAL, + "mins before unused vols become eligible for detach"); + cmd_AddParmAtOffset(opts, OPT_vlruinterval, "-vlruinterval", + CMD_FLAG, CMD_OPTIONAL, "secs between VLRU scans"); + cmd_AddParmAtOffset(opts, OPT_vlrumax, "-vlrumax", CMD_FLAG, CMD_OPTIONAL, + "max volumes to detach in one scan"); + cmd_AddParmAtOffset(opts, OPT_unsafe_nosalvage, "-unsafe-nosalvage", + CMD_FLAG, CMD_OPTIONAL, + "bybass safety checks on volume attach"); +#endif + + /* unrecommend options - should perhaps be CMD_HIDE */ + cmd_AddParmAtOffset(opts, OPT_stack, "-k", CMD_SINGLE, CMD_OPTIONAL, + "stack size"); + cmd_AddParmAtOffset(opts, OPT_cbwait, "-w", CMD_SINGLE, CMD_OPTIONAL, + "callback wait interval"); + cmd_AddParmAtOffset(opts, OPT_novbc, "-novbc", CMD_SINGLE, CMD_FLAG, + "disable callback breaks on reattach"); + + /* general options */ + cmd_AddParmAtOffset(opts, OPT_auditlog, "-auditlog", CMD_SINGLE, + CMD_OPTIONAL, "location of audit log"); + cmd_AddParmAtOffset(opts, OPT_auditiface, "-audit-interface", CMD_SINGLE, + CMD_OPTIONAL, "interface to use for audit logging"); + cmd_AddParmAtOffset(opts, OPT_config, "-config", CMD_SINGLE, CMD_OPTIONAL, + "configuration location"); + cmd_AddParmAtOffset(opts, OPT_debug, "-d", CMD_SINGLE, CMD_OPTIONAL, + "debug level"); + cmd_AddParmAtOffset(opts, OPT_logfile, "-logfile", CMD_SINGLE, + CMD_OPTIONAL, "location of logfile"); + cmd_AddParmAtOffset(opts, OPT_mrafslogs, "-mrafslogs", CMD_FLAG, + CMD_OPTIONAL, "enable MRAFS style logging"); + cmd_AddParmAtOffset(opts, OPT_threads, "-p", CMD_SINGLE, CMD_OPTIONAL, + "number of threads"); +#if !defined(AFS_NT40_ENV) + cmd_AddParmAtOffset(opts, OPT_syslog, "-syslog", CMD_SINGLE_OR_FLAG, + CMD_OPTIONAL, "log to syslog"); +#endif + + /* rx options */ + cmd_AddParmAtOffset(opts, OPT_peer, "-enable_peer_stats", CMD_FLAG, + CMD_OPTIONAL, "enable RX transport statistics"); + cmd_AddParmAtOffset(opts, OPT_process, "-enable_process_stats", CMD_FLAG, + CMD_OPTIONAL, "enable RX RPC statistics"); + cmd_AddParmAtOffset(opts, OPT_nojumbo, "-nojumbo", CMD_FLAG, + CMD_OPTIONAL, "disable jumbograms"); + cmd_AddParmAtOffset(opts, OPT_jumbo, "-jumbo", CMD_FLAG, CMD_OPTIONAL, + "enable jumbograms"); + cmd_AddParmAtOffset(opts, OPT_rxbind, "-rxbind", CMD_FLAG, CMD_OPTIONAL, + "bind only to the primary interface"); + cmd_AddParmAtOffset(opts, OPT_rxdbg, "-rxdbg", CMD_FLAG, CMD_OPTIONAL, + "enable rx debugging"); + cmd_AddParmAtOffset(opts, OPT_rxdbge, "-rxdbge", CMD_FLAG, CMD_OPTIONAL, + "enable rx event debugging"); + cmd_AddParmAtOffset(opts, OPT_rxpck, "-rxpck", CMD_SINGLE, CMD_OPTIONAL, + "# of extra rx packets"); + cmd_AddParmAtOffset(opts, OPT_rxmaxmtu, "-rxmaxmtu", CMD_SINGLE, + CMD_OPTIONAL, "maximum MTU for RX"); + cmd_AddParmAtOffset(opts, OPT_udpsize, "-udpsize", CMD_SINGLE, + CMD_OPTIONAL, "size of socket buffer in bytes"); + + /* rxkad options */ + cmd_AddParmAtOffset(opts, OPT_dotted, "-allow-dotted-principals", + CMD_FLAG, CMD_OPTIONAL, + "permit Kerberos 5 principals with dots"); + cmd_AddParmAtOffset(opts, OPT_realm, "-realm", + CMD_LIST, CMD_OPTIONAL, "local realm"); + + code = cmd_Parse(argc, argv, &opts); + if (code) + return -1; + + if (cmd_OptionPresent(opts, OPT_large) + && cmd_OptionPresent(opts, OPT_small)) { + printf("Only one of -L or -S must be specified\n"); + return -1; + } + + if (cmd_OptionPresent(opts, OPT_spare) + && cmd_OptionPresent(opts, OPT_pctspare)) { + printf("Both -spare and -pctspare specified, exiting.\n"); + return -1; + } + + if (cmd_OptionPresent(opts, OPT_large)) { + rxpackets = 200; + nSmallVns = 600; + large = 600; + numberofcbs = 64000; + lwps = 128; + buffs = 120; + volcache = 600; + } + + if (cmd_OptionPresent(opts, OPT_small)) { + rxpackets = 100; + nSmallVns = 200; + large = 200; + numberofcbs = 20000; + lwps = 6; + buffs = 70; + volcache = 200; + } + + cmd_OptionAsFlag(opts, OPT_banner, &printBanner); + + if (cmd_OptionAsString(opts, OPT_implicit, &optstring) == 0) { + implicitAdminRights = ParseRights(optstring); + free(optstring); + optstring = NULL; + if (implicitAdminRights < 0) + return implicitAdminRights; + } + #if defined(AFS_SGI_ENV) - else if (!strcmp(argv[i], "-lock")) { - SawLock = 1; - } + cmd_OptionAsFlag(opts, OPT_lock, &SawLock); #endif - else if (!strcmp(argv[i], "-spare")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -spare\n"); - return -1; - } - BlocksSpare = atoi(argv[++i]); - SawSpare = 1; - } else if (!strcmp(argv[i], "-pctspare")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -pctspare\n"); - return -1; - } - PctSpare = atoi(argv[++i]); - BlocksSpare = 0; /* has non-zero default */ - SawPctSpare = 1; - } else if (!strcmp(argv[i], "-w")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -w\n"); - return -1; - } - fiveminutes = atoi(argv[++i]); - } else if (!strcmp(argv[i], "-hr")) { - int hr; - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -hr\n"); - return -1; - } - hr = atoi(argv[++i]); - if ((hr < 1) || (hr > 36)) { - printf - ("host acl refresh interval of %d hours is invalid; hours must be between 1 and 36\n\n", - hr); - return -1; - } - hostaclRefresh = hr * 60 * 60; - } else if (!strcmp(argv[i], "-rxdbg")) - rxlog = 1; - else if (!strcmp(argv[i], "-rxdbge")) - eventlog = 1; - else if (!strcmp(argv[i], "-cb")) { - Sawcbs = 1; - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -cb\n"); - return -1; - } - numberofcbs = atoi(argv[++i]); - if ((numberofcbs < 10000) || (numberofcbs > 2147483647)) { - printf - ("number of cbs %d invalid; must be between 10000 and 2147483647\n", - numberofcbs); - return -1; - } - } else if (!strcmp(argv[i], "-busyat")) { - Sawbusy = 1; - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -busyat\n"); - return -1; - } - busy_threshold = atoi(argv[++i]); - if (busy_threshold < 10) { - printf - ("Busy threshold %d is too low, will compute default.\n", - busy_threshold); - Sawbusy = 0; - } - } else if (!strcmp(argv[i], "-nobusy")) - busyonrst = 0; -#ifdef AFS_AIX32_ENV - else if (!strcmp(argv[i], "-m")) { - extern int aixlow_water; - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -m\n"); - return -1; - } - aixlow_water = atoi(argv[++i]); - if ((aixlow_water < 0) || (aixlow_water > 30)) { - printf("space reserved %d% invalid; must be between 0-30%\n", - aixlow_water); - return -1; - } + cmd_OptionAsFlag(opts, OPT_readonly, &readonlyServer); + cmd_OptionAsFlag(opts, OPT_saneacls, &saneacls); + cmd_OptionAsInt(opts, OPT_buffers, &buffs); + + if (cmd_OptionAsInt(opts, OPT_callbacks, &numberofcbs) == 0) { + printf("number of cbs %d invalid; " + "must be between 10000 and 2147483647\n", numberofcbs); + return -1; + } + + cmd_OptionAsInt(opts, OPT_vcsize, &volcache); + cmd_OptionAsInt(opts, OPT_lvnodes, &large); + cmd_OptionAsInt(opts, OPT_svnodes, &nSmallVns); + if (cmd_OptionAsInt(opts, OPT_sendsize, &optval) == 0) { + if (optval < 16384) { + printf("Warning:sendsize %d is less than minimum %d; ignoring\n", + optval, 16384); + } else + sendBufSize = optval; + } + +#if defined(AFS_AIX32_ENV) + if (cmd_OptionAsInt(opts, OPT_minspare, &aixlow_water) == 0) { + if ((aixlow_water < 0) || (aixlow_water > 30)) { + printf("space reserved %d%% invalid; must be between 0-30%\n", + aixlow_water); + return -1; } + } #endif - else if (!strcmp(argv[i], "-nojumbo")) { - rxJumbograms = 0; - } else if (!strcmp(argv[i], "-jumbo")) { - rxJumbograms = 1; - } else if (!strcmp(argv[i], "-rxbind")) { - rxBind = 1; - } else if (!strcmp(argv[i], "-allow-dotted-principals")) { - rxkadDisableDotCheck = 1; - } else if (!strcmp(argv[i], "-rxmaxmtu")) { - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -rxmaxmtu\n"); - return -1; - } - rxMaxMTU = atoi(argv[++i]); - if ((rxMaxMTU < RX_MIN_PACKET_SIZE) || - (rxMaxMTU > RX_MAX_PACKET_DATA_SIZE)) { - printf("rxMaxMTU %d%% invalid; must be between %d-%" AFS_SIZET_FMT "\n", - rxMaxMTU, RX_MIN_PACKET_SIZE, - RX_MAX_PACKET_DATA_SIZE); - return -1; - } - } else if (!strcmp(argv[i], "-realm")) { - extern char local_realms[AFS_NUM_LREALMS][AFS_REALM_SZ]; - extern int num_lrealms; - if ((i + 1) >= argc) { - fprintf(stderr, "missing argument for -realm\n"); - return -1; - } - if (strlen(argv[++i]) >= AFS_REALM_SZ) { - printf - ("-realm argument must contain fewer than %d characters.\n", - AFS_REALM_SZ); - return -1; - } - if (num_lrealms == -1) - num_lrealms = 0; - if (num_lrealms >= AFS_NUM_LREALMS) { - printf - ("a maximum of %d -realm arguments can be specified.\n", - AFS_NUM_LREALMS); - return -1; - } - strncpy(local_realms[num_lrealms++], argv[i], AFS_REALM_SZ); - } else if (!strcmp(argv[i], "-udpsize")) { - if ((i + 1) >= argc) { - printf("You have to specify -udpsize \n"); - return -1; - } - bufSize = atoi(argv[++i]); - if (bufSize < rx_GetMinUdpBufSize()) - printf - ("Warning:udpsize %d is less than minimum %d; ignoring\n", - bufSize, rx_GetMinUdpBufSize()); - else - udpBufSize = bufSize; - } else if (!strcmp(argv[i], "-sendsize")) { - if ((i + 1) >= argc) { - printf("You have to specify -sendsize \n"); - return -1; - } - bufSize = atoi(argv[++i]); - if (bufSize < 16384) - printf - ("Warning:sendsize %d is less than minimum %d; ignoring\n", - bufSize, 16384); - else - sendBufSize = bufSize; - } else if (!strcmp(argv[i], "-enable_peer_stats")) { - rx_enablePeerRPCStats(); - } else if (!strcmp(argv[i], "-enable_process_stats")) { - rx_enableProcessRPCStats(); + + cmd_OptionAsInt(opts, OPT_spare, &BlocksSpare); + if (cmd_OptionAsInt(opts, OPT_pctspare, &PctSpare) == 0) { + BlocksSpare = 0; + } + + if (cmd_OptionAsInt(opts, OPT_hostcpsrefresh, &optval) == 0) { + if ((optval < 1) || (optval > 36)) { + printf("host acl refresh interval of %d hours is invalid; " + "hours must be between 1 and 36\n\n", optval); + return -1; } - else if (strcmp(argv[i], "-auditlog") == 0) { - auditFileName = argv[++i]; + hostaclRefresh = optval * 60 * 60; + } + +#ifdef AFS_PTHREAD_ENV + cmd_OptionAsInt(opts, OPT_vattachthreads, &vol_attach_threads); +#endif /* AFS_PTHREAD_ENV */ + + cmd_OptionAsInt(opts, OPT_abortthreshold, &abort_threshold); + + /* busyat is at the end, as rxpackets has to be set before we can use it */ + if (cmd_OptionPresent(opts, OPT_nobusy)) + busyonrst = 0; + + if (cmd_OptionAsInt(opts, OPT_offline_timeout, &offline_timeout) == 0) { +#ifndef AFS_PTHREAD_ENV + if (offline_timeout != -1) { + printf("The only valid -offline-timeout value for the LWP " + "fileserver is -1\n"); + return -1; } - else if (strcmp(argv[i], "-audit-interface") == 0) { - char *interface = argv[++i]; +#endif /* AFS_PTHREAD_ENV */ + if (offline_timeout < -1) { + printf("Invalid -offline-timeout value %d; the only valid " + "negative value is -1\n", offline_timeout); + return -1; + } + } - if (osi_audit_interface(interface)) { - printf("Invalid audit interface '%s'\n", interface); - return -1; - } + if (cmd_OptionAsInt(opts, OPT_offline_shutdown_timeout, + &offline_shutdown_timeout) == 0) { +#ifndef AFS_PTHREAD_ENV + if (offline_shutdown_timeout != -1) { + printf("The only valid -offline-shutdown-timeout value for the " + "LWP fileserver is -1\n"); + return -1; } -#ifndef AFS_NT40_ENV - else if (strcmp(argv[i], "-syslog") == 0) { - /* set syslog logging flag */ - serverLogSyslog = 1; - } else if (strncmp(argv[i], "-syslog=", 8) == 0) { - serverLogSyslog = 1; - serverLogSyslogFacility = atoi(argv[i] + 8); +#endif /* AFS_PTHREAD_ENV */ + if (offline_shutdown_timeout < -1) { + printf("Invalid -offline-timeout value %d; the only valid " + "negative value is -1\n", offline_shutdown_timeout); + return -1; } -#endif - else if (strcmp(argv[i], "-mrafslogs") == 0) { - /* set syslog logging flag */ - mrafsStyleLogs = 1; + } + + cmd_OptionAsUint(opts, OPT_vhandle_setaside, + &vol_io_params.fd_handle_setaside); + cmd_OptionAsUint(opts, OPT_vhandle_max_cachesize, + &vol_io_params.fd_max_cachesize); + cmd_OptionAsUint(opts, OPT_vhandle_initial_cachesize, + &vol_io_params.fd_initial_cachesize); + +#ifdef AFS_DEMAND_ATTACH_FS + if (cmd_OptionPresent(opts, OPT_fs_state_dont_save)) + fs_state.options.fs_state_save = 0; + if (cmd_OptionPresent(opts, OPT_fs_state_dont_restore)) + fs_state.options.fs_state_restore = 0; + if (cmd_OptionAsString(opts, OPT_fs_state_verify, &optstring) == 0) { + if (strcmp(optstring, "none") == 0) { + fs_state.options.fs_state_verify_before_save = 0; + fs_state.options.fs_state_verify_after_restore = 0; + } else if (strcmp(optstring, "save") == 0) { + fs_state.options.fs_state_verify_after_restore = 0; + } else if (strcmp(optstring, "restore") == 0) { + fs_state.options.fs_state_verify_before_save = 0; + } else if (strcmp(optstring, "both") == 0) { + /* default */ + } else { + fprintf(stderr, "invalid argument for -fs-state-verify\n"); + return -1; } - else if (strcmp(argv[i], "-saneacls") == 0) { - saneacls = 1; + } + if (cmd_OptionAsInt(opts, OPT_vhashsize, &optval) == 0) { + if (VSetVolHashSize(optval)) { + fprintf(stderr, "specified -vhashsize (%d) is invalid or out " + "of range\n", optval); + return -1; } - else if (strcmp(argv[i], "-offline-timeout") == 0) { - if (i + 1 >= argc) { - printf("You have to specify -offline-timeout \n"); - return -1; - } - offline_timeout = atoi(argv[++i]); -#ifndef AFS_PTHREAD_ENV - if (offline_timeout != -1) { - printf("The only valid -offline-timeout value for the LWP " - "fileserver is -1\n"); - return -1; - } -#endif /* AFS_PTHREAD_ENV */ - if (offline_timeout < -1) { - printf("Invalid -offline-timeout value %s; the only valid " - "negative value is -1\n", argv[i]); - return -1; - } + } + if (cmd_OptionPresent(opts, OPT_vlrudisable)) + VLRU_SetOptions(VLRU_SET_ENABLED, 0); + if (cmd_OptionAsInt(opts, OPT_vlruthresh, &optval) == 0) + VLRU_SetOptions(VLRU_SET_THRESH, 60*optval); + if (cmd_OptionAsInt(opts, OPT_vlruinterval, &optval) == 0) + VLRU_SetOptions(VLRU_SET_INTERVAL, optval); + if (cmd_OptionAsInt(opts, OPT_vlrumax, &optval) == 0) + VLRU_SetOptions(VLRU_SET_MAX, optval); + cmd_OptionAsFlag(opts, OPT_unsafe_nosalvage, &unsafe_attach); +#endif /* AFS_DEMAND_ATTACH_FS */ + + cmd_OptionAsInt(opts, OPT_stack, &stack); + cmd_OptionAsInt(opts, OPT_cbwait, &fiveminutes); + cmd_OptionAsFlag(opts, OPT_novbc, &novbc); + + /* general server options */ + cmd_OptionAsString(opts, OPT_auditlog, &auditFileName); + + if (cmd_OptionAsString(opts, OPT_auditiface, &optstring) == 0) { + if (osi_audit_interface(optstring)) { + printf("Invalid audit interface '%s'\n", optstring); + return -1; } - else if (strcmp(argv[i], "-offline-shutdown-timeout") == 0) { - if (i + 1 >= argc) { - printf("You have to specify -offline-shutdown-timeout " - "\n"); - return -1; - } - offline_shutdown_timeout = atoi(argv[++i]); -#ifndef AFS_PTHREAD_ENV - if (offline_shutdown_timeout != -1) { - printf("The only valid -offline-shutdown-timeout value for the " - "LWP fileserver is -1\n"); + free(optstring); + optstring = NULL; + } + + /* XXX - cmd_OptionAsString(opts, OPT_config, &configDir); */ + cmd_OptionAsInt(opts, OPT_debug, &LogLevel); + /* XXX - cmd_OptionAsString(opts, OPT_logfile, &logFile); */ + cmd_OptionAsFlag(opts, OPT_mrafslogs, &mrafsStyleLogs); + + if (cmd_OptionAsInt(opts, OPT_threads, &lwps) == 0) { + lwps_max = max_fileserver_thread() - FILESERVER_HELPER_THREADS; + if (lwps > lwps_max) + lwps = lwps_max; + else if (lwps <6) + lwps = 6; + } + +#ifndef AFS_NT40_ENV + if (cmd_OptionPresent(opts, OPT_syslog)) { + serverLogSyslog = 1; + cmd_OptionAsInt(opts, OPT_syslog, &serverLogSyslogFacility); + } +#endif + + if (cmd_OptionPresent(opts, OPT_peer)) + rx_enablePeerRPCStats(); + if (cmd_OptionPresent(opts, OPT_process)) + rx_enableProcessRPCStats(); + if (cmd_OptionPresent(opts, OPT_nojumbo)) + rxJumbograms = 0; + if (cmd_OptionPresent(opts, OPT_jumbo)) + rxJumbograms = 1; + cmd_OptionAsFlag(opts, OPT_rxbind, &rxBind); + cmd_OptionAsFlag(opts, OPT_rxdbg, &rxlog); + cmd_OptionAsFlag(opts, OPT_rxdbge, &eventlog); + cmd_OptionAsInt(opts, OPT_rxpck, &rxpackets); + + if (cmd_OptionAsInt(opts, OPT_rxmaxmtu, &rxMaxMTU) == 0) { + if ((rxMaxMTU < RX_MIN_PACKET_SIZE) || + (rxMaxMTU > RX_MAX_PACKET_DATA_SIZE)) { + printf("rxMaxMTU %d invalid; must be between %d-%" AFS_SIZET_FMT "\n", + rxMaxMTU, RX_MIN_PACKET_SIZE, + RX_MAX_PACKET_DATA_SIZE); + return(-1); + } + } + + if (cmd_OptionAsInt(opts, OPT_udpsize, &optval) == 0) { + if (optval < rx_GetMinUdpBufSize()) { + printf("Warning:udpsize %d is less than minimum %d; ignoring\n", + optval, rx_GetMinUdpBufSize()); + } else + udpBufSize = optval; + } + + /* rxkad options */ + cmd_OptionAsFlag(opts, OPT_dotted, &rxkadDisableDotCheck); + if (cmd_OptionAsList(opts, OPT_realm, &optlist) == 0) { + extern char local_realms[AFS_NUM_LREALMS][AFS_REALM_SZ]; + extern int num_lrealms; + + for (; optlist != NULL; optlist=optlist->next) { + if (strlen(optlist->data) >= AFS_REALM_SZ) { + printf("-realm argument must contain fewer than %d " + "characters.\n", AFS_REALM_SZ); return -1; } -#endif /* AFS_PTHREAD_ENV */ - if (offline_shutdown_timeout < -1) { - printf("Invalid -offline-timeout value %s; the only valid " - "negative value is -1\n", argv[i]); - return -1; + + if (num_lrealms == -1) + num_lrealms = 0; + if (num_lrealms >= AFS_NUM_LREALMS) { + printf("a maximum of %d -realm arguments can be " + "specified.\n", AFS_NUM_LREALMS); + return -1; } - } - else { - return (-1); + + strncpy(local_realms[num_lrealms++], optlist->data, AFS_REALM_SZ); + optlist = optlist->next; } } - if (SawS && SawL) { - printf("Only one of -L, or -S must be specified\n"); - return -1; - } - if (SawS) { - if (!Sawrxpck) - rxpackets = 100; - if (!Sawsmall) - nSmallVns = 200; - if (!Sawlarge) - large = 200; - if (!Sawcbs) - numberofcbs = 20000; - if (!Sawlwps) - lwps = 6; - if (!Sawbufs) - buffs = 70; - if (!SawVC) - volcache = 200; - } - if (SawL) { - if (!Sawrxpck) - rxpackets = 200; - if (!Sawsmall) - nSmallVns = 600; - if (!Sawlarge) - large = 600; - if (!Sawcbs) - numberofcbs = 64000; - if (!Sawlwps) - lwps = 128; - if (!Sawbufs) - buffs = 120; - if (!SawVC) - volcache = 600; - } - if (!Sawbusy) + + /* anything setting rxpackets must come before this */ + if (cmd_OptionAsInt(opts, OPT_busyat, &optval) == 0) { + if (optval < 10) { + printf("Busy threshold %d is too low, will use default.\n", + busy_threshold); + busy_threshold = 3 * rxpackets / 2; + } else { + busy_threshold = optval; + } + } else { busy_threshold = 3 * rxpackets / 2; + } + if (auditFileName) osi_audit_file(auditFileName); - lwps_max = max_fileserver_thread() - FILESERVER_HELPER_THREADS; - if (lwps > lwps_max) - lwps = lwps_max; - else if (lwps < 6) - lwps = 6; - return (0); - } /*ParseArgs */ /* Once upon a time, in a galaxy far far away, IBM AFS supported the use of @@ -1934,7 +1925,6 @@ main(int argc, char *argv[]) CheckParms(); if (ParseArgs(argc, argv)) { - FlagMsg(); exit(-1); } #ifdef AFS_PTHREAD_ENV @@ -1962,10 +1952,6 @@ main(int argc, char *argv[]) OpenLog(AFSDIR_SERVER_FILELOG_FILEPATH); SetupLogSignals(); - if (SawSpare && SawPctSpare) { - ViceLog(0, ("Both -spare and -pctspare specified, exiting.\n")); - exit(-1); - } LogCommandLine(argc, argv, "starting", "", "File server", FSLog); #if defined(AFS_PTHREAD_ENV) && !defined(AFS_NT40_ENV) -- 1.9.4