fixing -h and -v command line tool options

This commit is contained in:
Christian Grothoff 2015-04-13 13:49:42 +02:00
parent 9e9bad8dad
commit 2310a3f474
7 changed files with 204 additions and 32 deletions

View File

@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.
#
# This file is part of TALER
# Copyright (C) 2014 GNUnet e.V.
# Copyright (C) 2014, 2015 GNUnet e.V.
#
# TALER is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
@ -187,6 +187,40 @@ AC_ARG_ENABLE([logging],
], [])
AC_DEFINE_UNQUOTED([GNUNET_EXTRA_LOGGING],[$extra_logging],[1 if extra logging is enabled, 2 for very verbose extra logging, 0 otherwise])
# gcov compilation
AC_MSG_CHECKING(whether to compile with support for code coverage analysis)
AC_ARG_ENABLE([coverage],
AS_HELP_STRING([--enable-coverage],
[compile the library with code coverage support]),
[use_gcov=${enableval}],
[use_gcov=no])
AC_MSG_RESULT($use_gcov)
AM_CONDITIONAL([USE_COVERAGE], [test "x$use_gcov" = "xyes"])
# version info
AC_PATH_PROG(gitcommand, git)
AC_MSG_CHECKING(for source being under a VCS)
gitsvn_version=
AS_IF([test ! "X$gitcommand" = "X"],
[
gitsvn_version=$(cd $srcdir ; git log -1 2>/dev/null | grep "git-svn-id" | sed -e 's/.*@\([[0-9]]\+\) .*/\1/')
])
AS_IF([test "X$gitsvn_version" = "X"],
[
vcs_name="no"
vcs_version="\"release\""
],
[
vcs_name="yes, git-svn"
vcs_version="\"svn-r$gitsvn_version\""
])
AC_MSG_RESULT($vcs_name)
AC_MSG_CHECKING(VCS version)
AC_MSG_RESULT($vcs_version)
AC_DEFINE_UNQUOTED(VCS_VERSION, [$vcs_version], [VCS revision/hash or tarball version])
# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_PID_T
AC_TYPE_SIZE_T

View File

@ -111,4 +111,28 @@ char *
TALER_os_installation_get_path (enum GNUNET_OS_InstallationPathKind dirkind);
/**
* Print out details on command line options (implements --help).
*
* @param ctx command line processing context
* @param scls additional closure (points to about text)
* @param option name of the option
* @param value not used (NULL)
* @return #GNUNET_NO (do not continue, not an error)
*/
int
TALER_GETOPT_format_help_ (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
void *scls,
const char *option,
const char *value);
/**
* Macro defining the option to print the command line
* help text (-h option).
*
* @param about string with brief description of the application
*/
#define TALER_GETOPT_OPTION_HELP(about) \
{ 'h', "help", (const char *) NULL, gettext_noop("print this help"), 0, &TALER_GETOPT_format_help_, (void *) about }
#endif

View File

@ -54,10 +54,11 @@ main (int argc,
char *const *argv)
{
static const struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_OPTION_HELP ("gnunet-mint-dbinit OPTIONS"),
{'d', "mint-dir", "DIR",
"mint directory", 1,
&GNUNET_GETOPT_set_filename, &mint_base_dir},
GNUNET_GETOPT_OPTION_HELP ("Initialize Taler Mint database"),
GNUNET_GETOPT_OPTION_VERSION (VERSION "-" VCS_VERSION,)
GNUNET_GETOPT_OPTION_END
};

View File

@ -867,16 +867,17 @@ main (int argc,
char *const *argv)
{
static const struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_OPTION_HELP ("gnunet-mint-keyup OPTIONS"),
{'m', "master-key", "FILE",
"master key file (private key)", 1,
&GNUNET_GETOPT_set_filename, &masterkeyfile},
{'d', "mint-dir", "DIR",
"mint directory with keys to update", 1,
&GNUNET_GETOPT_set_filename, &mint_directory},
TALER_GETOPT_OPTION_HELP ("Setup signing and denomination keys for a Taler mint"),
{'m', "master-key", "FILE",
"master key file (private key)", 1,
&GNUNET_GETOPT_set_filename, &masterkeyfile},
{'t', "time", "TIMESTAMP",
"pretend it is a different time for the update", 0,
&GNUNET_GETOPT_set_string, &pretend_time_str},
GNUNET_GETOPT_OPTION_VERSION (VERSION "-" VCS_VERSION),
GNUNET_GETOPT_OPTION_END
};
struct GNUNET_TIME_Relative lookahead_sign;

View File

@ -212,16 +212,17 @@ main (int argc, char *const *argv)
static char *reserve_pub_str;
static char *add_str;
static const struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_OPTION_HELP ("gnunet-mint-reservemod OPTIONS"),
{'d', "mint-dir", "DIR",
"mint directory with keys to update", 1,
&GNUNET_GETOPT_set_filename, &mint_directory},
{'R', "reserve", "KEY",
"reserve (public key) to modify", 1,
&GNUNET_GETOPT_set_string, &reserve_pub_str},
{'a', "add", "DENOM",
"value to add", 1,
&GNUNET_GETOPT_set_string, &add_str},
{'d', "mint-dir", "DIR",
"mint directory with keys to update", 1,
&GNUNET_GETOPT_set_filename, &mint_directory},
TALER_GETOPT_OPTION_HELP ("Deposit funds into a Taler reserve"),
{'R', "reserve", "KEY",
"reserve (public key) to modify", 1,
&GNUNET_GETOPT_set_string, &reserve_pub_str},
GNUNET_GETOPT_OPTION_VERSION (VERSION "-" VCS_VERSION),
GNUNET_GETOPT_OPTION_END
};
char *connection_cfg_str;

View File

@ -247,7 +247,7 @@ mint_serve_process_config (const char *mint_directory)
{
fprintf (stderr,
"Failed to load mint configuration\n");
return 1;
return GNUNET_SYSERR;
}
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg,
@ -257,7 +257,7 @@ mint_serve_process_config (const char *mint_directory)
{
fprintf (stderr,
"No currency given in mint configuration.");
return GNUNET_NO;
return GNUNET_SYSERR;
}
if (strlen (TMH_mint_currency_string) >= TALER_CURRENCY_LEN)
{
@ -265,7 +265,7 @@ mint_serve_process_config (const char *mint_directory)
"Currency `%s' longer than the allowed limit of %u characters.",
TMH_mint_currency_string,
(unsigned int) TALER_CURRENCY_LEN);
return GNUNET_NO;
return GNUNET_SYSERR;
}
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg,
@ -275,7 +275,7 @@ mint_serve_process_config (const char *mint_directory)
{
fprintf (stderr,
"No wireformat given in mint configuration.");
return GNUNET_NO;
return GNUNET_SYSERR;
}
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg,
@ -285,7 +285,7 @@ mint_serve_process_config (const char *mint_directory)
{
fprintf (stderr,
"No master public key given in mint configuration.");
return GNUNET_NO;
return GNUNET_SYSERR;
}
if (GNUNET_OK !=
GNUNET_CRYPTO_eddsa_public_key_from_string (TMH_master_public_key_str,
@ -295,7 +295,7 @@ mint_serve_process_config (const char *mint_directory)
fprintf (stderr,
"Invalid master public key given in mint configuration.");
GNUNET_free (TMH_master_public_key_str);
return GNUNET_NO;
return GNUNET_SYSERR;
}
GNUNET_free (TMH_master_public_key_str);
@ -303,8 +303,8 @@ mint_serve_process_config (const char *mint_directory)
(TMH_plugin = TALER_MINTDB_plugin_load (cfg)))
{
fprintf (stderr,
"failed to initialize DB subsystem\n");
return GNUNET_NO;
"Failed to initialize DB subsystem\n");
return GNUNET_SYSERR;
}
if (GNUNET_OK !=
@ -315,7 +315,7 @@ mint_serve_process_config (const char *mint_directory)
{
fprintf (stderr,
"Missing or invalid configuration for the port of the mint\n");
return GNUNET_NO;
return GNUNET_SYSERR;
}
if ( (0 == port) ||
@ -324,7 +324,7 @@ mint_serve_process_config (const char *mint_directory)
fprintf (stderr,
"Invalid configuration (value out of range): %llu is not a valid port\n",
port);
return GNUNET_NO;
return GNUNET_SYSERR;
}
serve_port = (uint16_t) port;
@ -343,44 +343,46 @@ int
main (int argc, char *const *argv)
{
static const struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_OPTION_HELP ("gnunet-mint-keyup OPTIONS"),
{'d', "mint-dir", "DIR",
"mint directory", 1,
&GNUNET_GETOPT_set_filename, &TMH_mint_directory},
TALER_GETOPT_OPTION_HELP ("HTTP server providing a RESTful API to access a Taler mint"),
GNUNET_GETOPT_OPTION_VERSION (VERSION "-" VCS_VERSION),
GNUNET_GETOPT_OPTION_END
};
int ret;
GNUNET_assert (GNUNET_OK ==
GNUNET_log_setup ("taler-mint-serve",
GNUNET_log_setup ("taler-mint-httpd",
"INFO",
NULL));
if (GNUNET_GETOPT_run ("taler-mint-serve",
if (0 >=
GNUNET_GETOPT_run ("taler-mint-httpd",
options,
argc, argv) < 0)
argc, argv))
return 1;
if (NULL == TMH_mint_directory)
{
fprintf (stderr,
"no mint dir given\n");
"Mint directory not specified\n");
return 1;
}
if (GNUNET_OK != mint_serve_process_config (TMH_mint_directory))
if (GNUNET_OK !=
mint_serve_process_config (TMH_mint_directory))
return 1;
mydaemon = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY | MHD_USE_DEBUG,
serve_port,
NULL, NULL,
&handle_mhd_request, NULL,
MHD_OPTION_NOTIFY_COMPLETED, &handle_mhd_completion_callback,
MHD_OPTION_NOTIFY_COMPLETED, &handle_mhd_completion_callback, NULL,
MHD_OPTION_END);
if (NULL == mydaemon)
{
fprintf (stderr,
"Failed to start MHD.\n");
"Failed to start HTTP server.\n");
return 1;
}

View File

@ -85,4 +85,113 @@ TALER_config_load (const char *base_dir)
return cfg;
}
/**
* At what offset does the help text start?
*/
#define BORDER 29
/**
* Print out details on command line options (implements --help).
*
* @param ctx command line processing context
* @param scls additional closure (points to about text)
* @param option name of the option
* @param value not used (NULL)
* @return #GNUNET_NO (do not continue, not an error)
*/
int
TALER_GETOPT_format_help_ (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
void *scls,
const char *option,
const char *value)
{
const char *about = scls;
size_t slen;
unsigned int i;
int j;
size_t ml;
size_t p;
char *scp;
const char *trans;
const struct GNUNET_GETOPT_CommandLineOption *opt;
if (NULL != about)
{
printf ("%s\n%s\n",
ctx->binaryOptions,
gettext (about));
printf (_("Arguments mandatory for long options are also mandatory for short options.\n"));
}
opt = ctx->allOptions;
for (i=0;NULL != opt[i].description;i++)
{
if (opt[i].shortName == '\0')
printf (" ");
else
printf (" -%c, ", opt[i].shortName);
printf ("--%s", opt[i].name);
slen = 8 + strlen (opt[i].name);
if (opt[i].argumentHelp != NULL)
{
printf ("=%s", opt[i].argumentHelp);
slen += 1 + strlen (opt[i].argumentHelp);
}
if (slen > BORDER)
{
printf ("\n%*s", BORDER, "");
slen = BORDER;
}
if (slen < BORDER)
{
printf ("%*s", (int) (BORDER - slen), "");
slen = BORDER;
}
if (0 < strlen (opt[i].description))
trans = gettext (opt[i].description);
else
trans = "";
ml = strlen (trans);
p = 0;
OUTER:
while (ml - p > 78 - slen)
{
for (j = p + 78 - slen; j > p; j--)
{
if (isspace ((unsigned char) trans[j]))
{
scp = GNUNET_malloc (j - p + 1);
memcpy (scp, &trans[p], j - p);
scp[j - p] = '\0';
printf ("%s\n%*s", scp, BORDER + 2, "");
GNUNET_free (scp);
p = j + 1;
slen = BORDER + 2;
goto OUTER;
}
}
/* could not find space to break line */
scp = GNUNET_malloc (78 - slen + 1);
memcpy (scp, &trans[p], 78 - slen);
scp[78 - slen] = '\0';
printf ("%s\n%*s", scp, BORDER + 2, "");
GNUNET_free (scp);
slen = BORDER + 2;
p = p + 78 - slen;
}
/* print rest */
if (p < ml)
printf ("%s\n", &trans[p]);
if (strlen (trans) == 0)
printf ("\n");
}
printf ("Report bugs to taler@gnu.org.\n"
"Taler home page: http://www.gnu.org/software/taler/\n"
"General help using GNU software: http://www.gnu.org/gethelp/\n");
return GNUNET_NO;
}
/* end of util.c */