glitch in the license text detected by hyazinthe, thank you!
[oweals/gnunet.git] / src / auction / gnunet-auction-create.c
index c21e93f2600e540757a9754db6f51464718e4b5f..6e46c35ab2f7eb712db08846e1d58ebfb4ac9e7c 100644 (file)
@@ -2,20 +2,15 @@
    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.
    */
 
 /**
@@ -24,6 +19,9 @@
  * @author Markus Teich
  */
 #include "platform.h"
+
+#include <float.h>
+
 #include "gnunet_util_lib.h"
 #include "gnunet_json_lib.h"
 /* #include "gnunet_auction_service.h" */
@@ -56,6 +54,13 @@ run (void *cls,
         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)
        {
@@ -82,6 +87,53 @@ run (void *cls,
                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;
@@ -98,30 +150,49 @@ fail:
 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))