freeswitch: Move usage description out of main() and improve cmdline option handling.

Move empty cmdline option string check and "-help/-h/-?" handling to top of loop.

Emit a proper error message for unknown options. (Just displaying the
usage description, but not telling the user which option was wrong, is bad mojo).

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
This commit is contained in:
Stefan Knoblich 2012-07-10 15:08:59 +02:00
parent d6a395b642
commit 659ea9f117
1 changed files with 56 additions and 42 deletions

View File

@ -331,6 +331,50 @@ void daemonize(int do_wait)
#endif
static const char const usage[] =
"Usage: freeswitch [OPTIONS]\n\n"
"These are the optional arguments you can pass to freeswitch:\n"
#ifdef WIN32
"\t-service [name] -- start freeswitch as a service, cannot be used if loaded as a console app\n"
"\t-install [name] -- install freeswitch as a service, with optional service name\n"
"\t-uninstall -- remove freeswitch as a service\n"
"\t-monotonic-clock -- use monotonic clock as timer source\n"
#else
"\t-nf -- no forking\n"
"\t-u [user] -- specify user to switch to\n"
"\t-g [group] -- specify group to switch to\n"
#endif
#ifdef HAVE_SETRLIMIT
"\t-waste -- allow memory waste\n"
"\t-core -- dump cores\n"
#endif
"\t-help -- this message\n"
"\t-version -- print the version and exit\n"
"\t-rp -- enable high(realtime) priority settings\n"
"\t-lp -- enable low priority settings\n"
"\t-np -- enable normal priority settings (system defaults)\n"
"\t-vg -- run under valgrind\n"
"\t-nosql -- disable internal sql scoreboard\n"
"\t-heavy-timer -- Heavy Timer, possibly more accurate but at a cost\n"
"\t-nonat -- disable auto nat detection\n"
"\t-nonatmap -- disable auto nat port mapping\n"
"\t-nocal -- disable clock calibration\n"
"\t-nort -- disable clock clock_realtime\n"
"\t-stop -- stop freeswitch\n"
"\t-nc -- do not output to a console and background\n"
#ifndef WIN32
"\t-ncwait -- do not output to a console and background but wait until the system is ready before exiting (implies -nc)\n"
#endif
"\t-c -- output to a console and stay in the foreground\n"
"\t-conf [confdir] -- specify an alternate config dir\n"
"\t-log [logdir] -- specify an alternate log dir\n"
"\t-run [rundir] -- specify an alternate run dir\n"
"\t-db [dbdir] -- specify an alternate db dir\n"
"\t-mod [moddir] -- specify an alternate mod dir\n"
"\t-htdocs [htdocsdir] -- specify an alternate htdocs dir\n"
"\t-scripts [scriptsdir] -- specify an alternate scripts dir\n";
/* the main application entry point */
int main(int argc, char *argv[])
{
@ -354,7 +398,6 @@ int main(int argc, char *argv[])
char *local_argv[1024] = { 0 };
int local_argc = argc;
char *arg_argv[128] = { 0 };
char *usageDesc;
int alt_dirs = 0, log_set = 0, run_set = 0, do_kill = 0;
int known_opt;
int priority = 0;
@ -392,46 +435,16 @@ int main(int argc, char *argv[])
nc++;
}
usageDesc = "these are the optional arguments you can pass to freeswitch\n"
#ifdef WIN32
"\t-service [name] -- start freeswitch as a service, cannot be used if loaded as a console app\n"
"\t-install [name] -- install freeswitch as a service, with optional service name\n"
"\t-uninstall -- remove freeswitch as a service\n"
"\t-monotonic-clock -- use monotonic clock as timer source\n"
#else
"\t-nf -- no forking\n"
"\t-u [user] -- specify user to switch to\n" "\t-g [group] -- specify group to switch to\n"
#endif
"\t-help -- this message\n" "\t-version -- print the version and exit\n"
#ifdef HAVE_SETRLIMIT
"\t-waste -- allow memory waste\n"
"\t-core -- dump cores\n"
#endif
"\t-rp -- enable high(realtime) priority settings\n"
"\t-lp -- enable low priority settings\n"
"\t-np -- enable normal priority settings (system defaults)\n"
"\t-vg -- run under valgrind\n"
"\t-nosql -- disable internal sql scoreboard\n"
"\t-heavy-timer -- Heavy Timer, possibly more accurate but at a cost\n"
"\t-nonat -- disable auto nat detection\n"
"\t-nonatmap -- disable auto nat port mapping\n"
"\t-nocal -- disable clock calibration\n"
"\t-nort -- disable clock clock_realtime\n"
"\t-stop -- stop freeswitch\n"
"\t-nc -- do not output to a console and background\n"
#ifndef WIN32
"\t-ncwait -- do not output to a console and background but wait until the system is ready before exiting (implies -nc)\n"
#endif
"\t-c -- output to a console and stay in the foreground\n"
"\t-conf [confdir] -- specify an alternate config dir\n"
"\t-log [logdir] -- specify an alternate log dir\n"
"\t-run [rundir] -- specify an alternate run dir\n"
"\t-db [dbdir] -- specify an alternate db dir\n"
"\t-mod [moddir] -- specify an alternate mod dir\n"
"\t-htdocs [htdocsdir] -- specify an alternate htdocs dir\n" "\t-scripts [scriptsdir] -- specify an alternate scripts dir\n";
for (x = 1; x < local_argc; x++) {
known_opt = 0;
if (switch_strlen_zero(local_argv[x]))
continue;
if (!strcmp(local_argv[x], "-help") || !strcmp(local_argv[x], "-h") || !strcmp(local_argv[x], "-?")) {
printf("%s\n", usage);
exit(EXIT_SUCCESS);
}
#ifdef WIN32
if (x == 1) {
if (local_argv[x] && !strcmp(local_argv[x], "-service")) {
@ -756,9 +769,10 @@ int main(int argc, char *argv[])
known_opt++;
}
if (!known_opt || (local_argv[x] && (!strcmp(local_argv[x], "-help") || !strcmp(local_argv[x], "-h") || !strcmp(local_argv[x], "-?")))) {
printf("%s\n", usageDesc);
exit(0);
if (!known_opt) {
fprintf(stderr, "Unknown option '%s', see '%s -help' for a list of valid options\n",
local_argv[x], local_argv[0]);
exit(EXIT_FAILURE);
}
}