This file is part of GNUnet.
Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2009 GNUnet e.V.
- GNUnet 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 Foundation; either version 3, or (at your
- option) any later version.
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
GNUnet is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
+ Affero General Public License for more details.
*/
/**
* @author Markus Teich
*/
#include "platform.h"
+
+#include <float.h>
+
#include "gnunet_util_lib.h"
+#include "gnunet_json_lib.h"
/* #include "gnunet_auction_service.h" */
#define FIRST_PRICE 0
const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
+ unsigned int i;
+ double cur, prev = DBL_MAX;
+ json_t *pmap;
+ json_t *parray;
+ json_t *pnode;
+ json_error_t jerr;
+
/* cmdline parsing */
if (GNUNET_TIME_UNIT_ZERO.rel_value_us == dstart.rel_value_us)
{
goto fail;
}
+ /* parse and check pricemap validity */
+ if (!(pmap = json_load_file (fnprices, JSON_DECODE_INT_AS_REAL, &jerr)))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "parsing pricemap json at %d:%d: %s\n",
+ jerr.line, jerr.column, jerr.text);
+ goto fail;
+ }
+ if (-1 == json_unpack_ex (pmap, &jerr, JSON_VALIDATE_ONLY,
+ "{s:s, s:[]}", "currency", "prices"))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "validating pricemap: %s\n", jerr.text);
+ goto fail;
+ }
+ if (!(parray = json_object_get (pmap, "prices")) || !json_is_array (parray))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "could not get `prices` array node from pricemap\n");
+ goto fail;
+ }
+ if (0 == json_array_size (parray))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "empty pricemap array\n");
+ goto fail;
+ }
+ json_array_foreach (parray, i, pnode)
+ {
+ if (-1 == json_unpack_ex (pnode, &jerr, 0, "F", &cur))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "validating pricearray index %d: %s\n", i, jerr.text);
+ goto fail;
+ }
+ if (prev <= cur)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "validating pricearray index %d: "
+ "prices must be strictly monotonically decreasing\n",
+ i);
+ goto fail;
+ }
+ prev = cur;
+ }
+
+ return;
+
fail:
ret = 1;
return;
int
main (int argc, char *const *argv)
{
- static const struct GNUNET_GETOPT_CommandLineOption options[] = {
- {'d', "description", "FILE",
- gettext_noop ("description of the item to be sold"),
- 1, &GNUNET_GETOPT_set_filename, &fndesc},
- {'p', "pricemap", "FILE",
- gettext_noop ("mapping of possible prices"),
- 1, &GNUNET_GETOPT_set_filename, &fnprices},
- {'r', "roundtime", "DURATION",
- gettext_noop ("max duration per round"),
- 1, &GNUNET_GETOPT_set_relative_time, &dround},
- {'s', "regtime", "DURATION",
- gettext_noop ("duration until auction starts"),
- 1, &GNUNET_GETOPT_set_relative_time, &dstart},
- {'m', "m", "NUMBER",
- gettext_noop ("number of items to sell\n"
- "0 for first price auction\n"
- ">0 for vickrey/M+1st price auction"),
- 1, &GNUNET_GETOPT_set_uint, &m},
- {'u', "public", NULL,
- gettext_noop ("public auction outcome"),
- 0, &GNUNET_GETOPT_set_one, &outcome},
- {'i', "interactive", NULL,
- gettext_noop ("keep running in foreground until auction completes"),
- 0, &GNUNET_GETOPT_set_one, &interactive},
+ struct GNUNET_GETOPT_CommandLineOption options[] = {
+
+ GNUNET_GETOPT_option_filename ('d',
+ "description",
+ "FILE",
+ gettext_noop ("description of the item to be sold"),
+ &fndesc),
+
+ GNUNET_GETOPT_option_filename ('p',
+ "pricemap",
+ "FILE",
+ gettext_noop ("mapping of possible prices"),
+ &fnprices),
+
+ GNUNET_GETOPT_option_relative_time ('r',
+ "roundtime",
+ "DURATION",
+ gettext_noop ("max duration per round"),
+ &dround),
+
+ GNUNET_GETOPT_option_relative_time ('s',
+ "regtime",
+ "DURATION",
+ gettext_noop ("duration until auction starts"),
+ &dstart),
+ GNUNET_GETOPT_option_uint ('m',
+ "m",
+ "NUMBER",
+ gettext_noop ("number of items to sell\n"
+ "0 for first price auction\n"
+ ">0 for vickrey/M+1st price auction"),
+ &m),
+
+ GNUNET_GETOPT_option_flag ('u',
+ "public",
+ gettext_noop ("public auction outcome"),
+ &outcome),
+
+ GNUNET_GETOPT_option_flag ('i',
+ "interactive",
+ gettext_noop ("keep running in foreground until auction completes"),
+ &interactive),
+
GNUNET_GETOPT_OPTION_END
};
if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))