summaryrefslogtreecommitdiff
path: root/src/auction/gnunet-auction-create.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/auction/gnunet-auction-create.c')
-rw-r--r--src/auction/gnunet-auction-create.c225
1 files changed, 114 insertions, 111 deletions
diff --git a/src/auction/gnunet-auction-create.c b/src/auction/gnunet-auction-create.c
index 42ab14aca..90c1d5f10 100644
--- a/src/auction/gnunet-auction-create.c
+++ b/src/auction/gnunet-auction-create.c
@@ -54,10 +54,10 @@ static int interactive; /** keep running in foreground */
54 * @param cfg configuration 54 * @param cfg configuration
55 */ 55 */
56static void 56static void
57run(void *cls, 57run (void *cls,
58 char *const *args, 58 char *const *args,
59 const char *cfgfile, 59 const char *cfgfile,
60 const struct GNUNET_CONFIGURATION_Handle *cfg) 60 const struct GNUNET_CONFIGURATION_Handle *cfg)
61{ 61{
62 unsigned int i; 62 unsigned int i;
63 double cur, prev = DBL_MAX; 63 double cur, prev = DBL_MAX;
@@ -68,72 +68,72 @@ run(void *cls,
68 68
69 /* cmdline parsing */ 69 /* cmdline parsing */
70 if (GNUNET_TIME_UNIT_ZERO.rel_value_us == dstart.rel_value_us) 70 if (GNUNET_TIME_UNIT_ZERO.rel_value_us == dstart.rel_value_us)
71 { 71 {
72 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 72 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
73 "required argument --regtime missing or invalid (zero)\n"); 73 "required argument --regtime missing or invalid (zero)\n");
74 goto fail; 74 goto fail;
75 } 75 }
76 if (GNUNET_TIME_UNIT_ZERO.rel_value_us == dround.rel_value_us) 76 if (GNUNET_TIME_UNIT_ZERO.rel_value_us == dround.rel_value_us)
77 { 77 {
78 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 78 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
79 "required argument --roundtime missing or invalid (zero)\n"); 79 "required argument --roundtime missing or invalid (zero)\n");
80 goto fail; 80 goto fail;
81 } 81 }
82 if (!fndesc) 82 if (! fndesc)
83 { 83 {
84 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 84 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
85 "required argument --description missing\n"); 85 "required argument --description missing\n");
86 goto fail; 86 goto fail;
87 } 87 }
88 if (!fnprices) 88 if (! fnprices)
89 { 89 {
90 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 90 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
91 "required argument --pricemap missing\n"); 91 "required argument --pricemap missing\n");
92 goto fail; 92 goto fail;
93 } 93 }
94 94
95 /* parse and check pricemap validity */ 95 /* parse and check pricemap validity */
96 if (!(pmap = json_load_file(fnprices, JSON_DECODE_INT_AS_REAL, &jerr))) 96 if (! (pmap = json_load_file (fnprices, JSON_DECODE_INT_AS_REAL, &jerr)))
97 { 97 {
98 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 98 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
99 "parsing pricemap json at %d:%d: %s\n", 99 "parsing pricemap json at %d:%d: %s\n",
100 jerr.line, jerr.column, jerr.text); 100 jerr.line, jerr.column, jerr.text);
101 goto fail; 101 goto fail;
102 } 102 }
103 if (-1 == json_unpack_ex(pmap, &jerr, JSON_VALIDATE_ONLY, 103 if (-1 == json_unpack_ex (pmap, &jerr, JSON_VALIDATE_ONLY,
104 "{s:s, s:[]}", "currency", "prices")) 104 "{s:s, s:[]}", "currency", "prices"))
105 { 105 {
106 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 106 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
107 "validating pricemap: %s\n", jerr.text); 107 "validating pricemap: %s\n", jerr.text);
108 goto fail; 108 goto fail;
109 } 109 }
110 if (!(parray = json_object_get(pmap, "prices")) || !json_is_array(parray)) 110 if (! (parray = json_object_get (pmap, "prices")) || ! json_is_array (parray))
111 {
112 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
113 "could not get `prices` array node from pricemap\n");
114 goto fail;
115 }
116 if (0 == json_array_size (parray))
117 {
118 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "empty pricemap array\n");
119 goto fail;
120 }
121 json_array_foreach (parray, i, pnode)
122 {
123 if (-1 == json_unpack_ex (pnode, &jerr, 0, "F", &cur))
111 { 124 {
112 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 125 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
113 "could not get `prices` array node from pricemap\n"); 126 "validating pricearray index %d: %s\n", i, jerr.text);
114 goto fail; 127 goto fail;
115 } 128 }
116 if (0 == json_array_size(parray)) 129 if (prev <= cur)
117 { 130 {
118 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "empty pricemap array\n"); 131 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
132 "validating pricearray index %d: "
133 "prices must be strictly monotonically decreasing\n",
134 i);
119 goto fail; 135 goto fail;
120 } 136 }
121 json_array_foreach(parray, i, pnode)
122 {
123 if (-1 == json_unpack_ex(pnode, &jerr, 0, "F", &cur))
124 {
125 GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
126 "validating pricearray index %d: %s\n", i, jerr.text);
127 goto fail;
128 }
129 if (prev <= cur)
130 {
131 GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
132 "validating pricearray index %d: "
133 "prices must be strictly monotonically decreasing\n",
134 i);
135 goto fail;
136 }
137 prev = cur; 137 prev = cur;
138 } 138 }
139 139
@@ -153,64 +153,67 @@ fail:
153 * @return 0 ok, 1 on error 153 * @return 0 ok, 1 on error
154 */ 154 */
155int 155int
156main(int argc, char *const *argv) 156main (int argc, char *const *argv)
157{ 157{
158 struct GNUNET_GETOPT_CommandLineOption options[] = { 158 struct GNUNET_GETOPT_CommandLineOption options[] = {
159 GNUNET_GETOPT_option_filename('d', 159 GNUNET_GETOPT_option_filename ('d',
160 "description", 160 "description",
161 "FILE", 161 "FILE",
162 gettext_noop("description of the item to be sold"), 162 gettext_noop (
163 &fndesc), 163 "description of the item to be sold"),
164 164 &fndesc),
165 GNUNET_GETOPT_option_filename('p', 165
166 "pricemap", 166 GNUNET_GETOPT_option_filename ('p',
167 "FILE", 167 "pricemap",
168 gettext_noop("mapping of possible prices"), 168 "FILE",
169 &fnprices), 169 gettext_noop ("mapping of possible prices"),
170 170 &fnprices),
171 GNUNET_GETOPT_option_relative_time('r', 171
172 "roundtime", 172 GNUNET_GETOPT_option_relative_time ('r',
173 "DURATION", 173 "roundtime",
174 gettext_noop("max duration per round"), 174 "DURATION",
175 &dround), 175 gettext_noop ("max duration per round"),
176 176 &dround),
177 GNUNET_GETOPT_option_relative_time('s', 177
178 "regtime", 178 GNUNET_GETOPT_option_relative_time ('s',
179 "DURATION", 179 "regtime",
180 gettext_noop("duration until auction starts"), 180 "DURATION",
181 &dstart), 181 gettext_noop (
182 GNUNET_GETOPT_option_uint('m', 182 "duration until auction starts"),
183 "m", 183 &dstart),
184 "NUMBER", 184 GNUNET_GETOPT_option_uint ('m',
185 gettext_noop("number of items to sell\n" 185 "m",
186 "0 for first price auction\n" 186 "NUMBER",
187 ">0 for vickrey/M+1st price auction"), 187 gettext_noop ("number of items to sell\n"
188 &m), 188 "0 for first price auction\n"
189 189 ">0 for vickrey/M+1st price auction"),
190 GNUNET_GETOPT_option_flag('u', 190 &m),
191 "public", 191
192 gettext_noop("public auction outcome"), 192 GNUNET_GETOPT_option_flag ('u',
193 &outcome), 193 "public",
194 194 gettext_noop ("public auction outcome"),
195 GNUNET_GETOPT_option_flag('i', 195 &outcome),
196 "interactive", 196
197 gettext_noop("keep running in foreground until auction completes"), 197 GNUNET_GETOPT_option_flag ('i',
198 &interactive), 198 "interactive",
199 gettext_noop (
200 "keep running in foreground until auction completes"),
201 &interactive),
199 202
200 GNUNET_GETOPT_OPTION_END 203 GNUNET_GETOPT_OPTION_END
201 }; 204 };
202 205
203 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args(argc, argv, &argc, &argv)) 206 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
204 return 2; 207 return 2;
205 208
206 ret = (GNUNET_OK == 209 ret = (GNUNET_OK ==
207 GNUNET_PROGRAM_run(argc, argv, 210 GNUNET_PROGRAM_run (argc, argv,
208 "gnunet-auction-create", 211 "gnunet-auction-create",
209 gettext_noop("create a new auction and " 212 gettext_noop ("create a new auction and "
210 "start listening for bidders"), 213 "start listening for bidders"),
211 options, 214 options,
212 &run, 215 &run,
213 NULL)) ? ret : 1; 216 NULL)) ? ret : 1;
214 GNUNET_free((void*)argv); 217 GNUNET_free ((void*) argv);
215 return ret; 218 return ret;
216} 219}