WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Affero General Public License for more details.
-
+
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
SPDX-License-Identifier: AGPL3.0-or-later
-*/
+ */
/**
* @file testbed/generate-underlay-topology.c
#include "testbed_api_topology.h"
#include "sqlite3.h"
-#define LOG(type, ...) GNUNET_log (type, __VA_ARGS__)
+#define LOG(type, ...) GNUNET_log(type, __VA_ARGS__)
-#define LOG_ERROR(...) LOG (GNUNET_ERROR_TYPE_ERROR, __VA_ARGS__)
+#define LOG_ERROR(...) LOG(GNUNET_ERROR_TYPE_ERROR, __VA_ARGS__)
/**
* Log an error message at log-level 'level' that indicates
*/
#define LOG_SQLITE(db, msg, level, cmd) \
do \
- { \
- GNUNET_log_from (level, \
- "sqlite", \
- _ ("`%s' failed at %s:%d with error: %s\n"), \
- cmd, \
- __FILE__, \
- __LINE__, \
- sqlite3_errmsg (db)); \
- if (msg != NULL) \
+ { \
+ GNUNET_log_from(level, \
+ "sqlite", \
+ _("`%s' failed at %s:%d with error: %s\n"), \
+ cmd, \
+ __FILE__, \
+ __LINE__, \
+ sqlite3_errmsg(db)); \
+ if (msg != NULL) \
GNUNET_asprintf (msg, \
- _ ("`%s' failed at %s:%u with error: %s"), \
+ _("`%s' failed at %s:%u with error: %s"), \
cmd, \
__FILE__, \
__LINE__, \
- sqlite3_errmsg (db)); \
- } while (0)
+ sqlite3_errmsg(db)); \
+ } while (0)
/**
* @return GNUNET_OK to continue processing; GNUNET_SYSERR to abort
*/
static int
-link_processor (void *cls,
- unsigned int A,
- unsigned int B,
- unsigned int bandwidth,
- unsigned int latency,
- unsigned int loss)
+link_processor(void *cls,
+ unsigned int A,
+ unsigned int B,
+ unsigned int bandwidth,
+ unsigned int latency,
+ unsigned int loss)
{
- if ((SQLITE_OK != sqlite3_bind_int (stmt_insert, 1, A)) ||
- (SQLITE_OK != sqlite3_bind_int (stmt_insert, 2, B)) ||
- (SQLITE_OK != sqlite3_bind_int (stmt_insert, 3, bandwidth)) ||
- (SQLITE_OK != sqlite3_bind_int (stmt_insert, 4, latency)) ||
- (SQLITE_OK != sqlite3_bind_int (stmt_insert, 5, loss)))
- {
- LOG_SQLITE (db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_bind_int");
- return GNUNET_SYSERR;
- }
- if (SQLITE_DONE != sqlite3_step (stmt_insert))
- {
- LOG_SQLITE (db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_step");
- return GNUNET_SYSERR;
- }
- fprintf (stdout, "%u -> %u\n", A, B);
- GNUNET_break (SQLITE_OK == sqlite3_reset (stmt_insert));
+ if ((SQLITE_OK != sqlite3_bind_int(stmt_insert, 1, A)) ||
+ (SQLITE_OK != sqlite3_bind_int(stmt_insert, 2, B)) ||
+ (SQLITE_OK != sqlite3_bind_int(stmt_insert, 3, bandwidth)) ||
+ (SQLITE_OK != sqlite3_bind_int(stmt_insert, 4, latency)) ||
+ (SQLITE_OK != sqlite3_bind_int(stmt_insert, 5, loss)))
+ {
+ LOG_SQLITE(db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_bind_int");
+ return GNUNET_SYSERR;
+ }
+ if (SQLITE_DONE != sqlite3_step(stmt_insert))
+ {
+ LOG_SQLITE(db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_step");
+ return GNUNET_SYSERR;
+ }
+ fprintf(stdout, "%u -> %u\n", A, B);
+ GNUNET_break(SQLITE_OK == sqlite3_reset(stmt_insert));
//GNUNET_break (SQLITE_OK == sqlite3_clear_bindings (stmt_insert));
- if ((SQLITE_OK != sqlite3_bind_int (stmt_insert, 1, B)) ||
- (SQLITE_OK != sqlite3_bind_int (stmt_insert, 2, A)))
- {
- LOG_SQLITE (db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_bind_int");
- return GNUNET_SYSERR;
- }
- if (SQLITE_DONE != sqlite3_step (stmt_insert))
- {
- LOG_SQLITE (db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_step");
- return GNUNET_SYSERR;
- }
- fprintf (stdout, "%u -> %u\n", B, A);
- GNUNET_break (SQLITE_OK == sqlite3_reset (stmt_insert));
+ if ((SQLITE_OK != sqlite3_bind_int(stmt_insert, 1, B)) ||
+ (SQLITE_OK != sqlite3_bind_int(stmt_insert, 2, A)))
+ {
+ LOG_SQLITE(db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_bind_int");
+ return GNUNET_SYSERR;
+ }
+ if (SQLITE_DONE != sqlite3_step(stmt_insert))
+ {
+ LOG_SQLITE(db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_step");
+ return GNUNET_SYSERR;
+ }
+ fprintf(stdout, "%u -> %u\n", B, A);
+ GNUNET_break(SQLITE_OK == sqlite3_reset(stmt_insert));
return GNUNET_OK;
}
* to be printed)
*/
static int
-setup_db (const char *dbfile)
+setup_db(const char *dbfile)
{
const char *query_create = "CREATE TABLE whitelist ("
"id INTEGER,"
int ret;
ret = GNUNET_SYSERR;
- if (SQLITE_OK != sqlite3_open (dbfile, &db))
- {
- LOG_SQLITE (db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_open");
- goto err_ret;
- }
- if (0 != sqlite3_exec (db, query_create, NULL, NULL, NULL))
- {
- LOG_SQLITE (db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_exec");
- fprintf (stderr,
- "Error: %d. Perhaps the database `%s' already exits.\n",
- sqlite3_errcode (db),
- dbfile);
- goto err_ret;
- }
- GNUNET_break (0 ==
- sqlite3_exec (db, "PRAGMA synchronous = 0;", NULL, NULL, NULL));
+ if (SQLITE_OK != sqlite3_open(dbfile, &db))
+ {
+ LOG_SQLITE(db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_open");
+ goto err_ret;
+ }
+ if (0 != sqlite3_exec(db, query_create, NULL, NULL, NULL))
+ {
+ LOG_SQLITE(db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_exec");
+ fprintf(stderr,
+ "Error: %d. Perhaps the database `%s' already exits.\n",
+ sqlite3_errcode(db),
+ dbfile);
+ goto err_ret;
+ }
+ GNUNET_break(0 ==
+ sqlite3_exec(db, "PRAGMA synchronous = 0;", NULL, NULL, NULL));
if (SQLITE_OK !=
- sqlite3_prepare_v2 (db, query_insert, -1, &stmt_insert, NULL))
- {
- LOG_SQLITE (db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_prepare_v2");
- goto err_ret;
- }
+ sqlite3_prepare_v2(db, query_insert, -1, &stmt_insert, NULL))
+ {
+ LOG_SQLITE(db, NULL, GNUNET_ERROR_TYPE_ERROR, "sqlite3_prepare_v2");
+ goto err_ret;
+ }
ret = GNUNET_OK;
err_ret:
* @param cfg the configuration file handle
*/
static void
-run (void *cls,
- char *const *args,
- const char *cfgfile,
- const struct GNUNET_CONFIGURATION_Handle *config)
+run(void *cls,
+ char *const *args,
+ const char *cfgfile,
+ const struct GNUNET_CONFIGURATION_Handle *config)
{
const char *dbfile;
const char *topology_string;
arg_uint1 = 0; /* make compilers happy */
arg_uint2 = 0; /* make compilers happy */
if (NULL == args)
- {
- LOG_ERROR (_ ("Need at least 2 arguments\n"));
- return;
- }
+ {
+ LOG_ERROR(_("Need at least 2 arguments\n"));
+ return;
+ }
if (NULL == (dbfile = args[argc++]))
- {
- LOG_ERROR (_ ("Database filename missing\n"));
- return;
- }
- if (GNUNET_OK != setup_db (dbfile))
- return;
- if (NULL == (topology_string = args[argc++]))
- {
- LOG_ERROR (_ ("Topology string missing\n"));
- return;
- }
- if (GNUNET_YES != GNUNET_TESTBED_topology_get_ (&topology, topology_string))
- {
- LOG_ERROR (_ ("Invalid topology: %s\n"), topology_string);
- return;
- }
- arg_str1 = NULL;
- /* parse for first TOPOOPT. This can either be arg_uint1 or arg_str1 */
- switch (topology)
- {
- case GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI:
- case GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD_RING:
- case GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD:
- case GNUNET_TESTBED_TOPOLOGY_SCALE_FREE:
- if (NULL == (value = args[argc++]))
{
- LOG_ERROR (_ ("An argument is missing for given topology `%s'\n"),
- topology_string);
+ LOG_ERROR(_("Database filename missing\n"));
return;
}
- if (-1 == sscanf (value, "%u", &arg_uint1))
+ if (GNUNET_OK != setup_db(dbfile))
+ return;
+ if (NULL == (topology_string = args[argc++]))
{
- LOG_ERROR (_ ("Invalid argument `%s' given as topology argument\n"),
- value);
+ LOG_ERROR(_("Topology string missing\n"));
return;
}
- break;
- case GNUNET_TESTBED_TOPOLOGY_FROM_FILE:
- if (NULL == (arg_str1 = args[argc++]))
+ if (GNUNET_YES != GNUNET_TESTBED_topology_get_(&topology, topology_string))
{
- LOG_ERROR (_ ("Filename argument missing for topology `%s'\n"),
- topology_string);
+ LOG_ERROR(_("Invalid topology: %s\n"), topology_string);
return;
}
- break;
- default:
- break;
- }
- /* parse for second TOPOOPT. Only required for SCALE_FREE topology */
+ arg_str1 = NULL;
+ /* parse for first TOPOOPT. This can either be arg_uint1 or arg_str1 */
switch (topology)
- {
- case GNUNET_TESTBED_TOPOLOGY_SCALE_FREE:
- if (NULL == (value = args[argc++]))
{
- LOG_ERROR (_ ("Second argument for topology `%s' is missing\n"),
- topology_string);
- return;
+ case GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI:
+ case GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD_RING:
+ case GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD:
+ case GNUNET_TESTBED_TOPOLOGY_SCALE_FREE:
+ if (NULL == (value = args[argc++]))
+ {
+ LOG_ERROR(_("An argument is missing for given topology `%s'\n"),
+ topology_string);
+ return;
+ }
+ if (-1 == sscanf(value, "%u", &arg_uint1))
+ {
+ LOG_ERROR(_("Invalid argument `%s' given as topology argument\n"),
+ value);
+ return;
+ }
+ break;
+
+ case GNUNET_TESTBED_TOPOLOGY_FROM_FILE:
+ if (NULL == (arg_str1 = args[argc++]))
+ {
+ LOG_ERROR(_("Filename argument missing for topology `%s'\n"),
+ topology_string);
+ return;
+ }
+ break;
+
+ default:
+ break;
}
- if (-1 == sscanf (value, "%u", &arg_uint2))
+ /* parse for second TOPOOPT. Only required for SCALE_FREE topology */
+ switch (topology)
{
- LOG_ERROR (_ ("Invalid argument `%s'; expecting unsigned int\n"), value);
- return;
+ case GNUNET_TESTBED_TOPOLOGY_SCALE_FREE:
+ if (NULL == (value = args[argc++]))
+ {
+ LOG_ERROR(_("Second argument for topology `%s' is missing\n"),
+ topology_string);
+ return;
+ }
+ if (-1 == sscanf(value, "%u", &arg_uint2))
+ {
+ LOG_ERROR(_("Invalid argument `%s'; expecting unsigned int\n"), value);
+ return;
+ }
+ break;
+
+ default:
+ break;
}
- break;
- default:
- break;
- }
/* contruct topologies */
switch (topology)
- {
- case GNUNET_TESTBED_TOPOLOGY_LINE:
- case GNUNET_TESTBED_TOPOLOGY_RING:
- case GNUNET_TESTBED_TOPOLOGY_STAR:
- case GNUNET_TESTBED_TOPOLOGY_CLIQUE:
- case GNUNET_TESTBED_TOPOLOGY_2D_TORUS:
- GNUNET_TESTBED_underlay_construct_ (num_peers,
- link_processor,
- NULL,
- topology);
- break;
- case GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI:
- case GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD_RING:
- case GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD:
- GNUNET_TESTBED_underlay_construct_ (num_peers,
- link_processor,
- NULL,
- topology,
- arg_uint1);
- break;
- case GNUNET_TESTBED_TOPOLOGY_FROM_FILE:
- GNUNET_TESTBED_underlay_construct_ (num_peers,
- link_processor,
- NULL,
- topology,
- arg_str1);
- break;
- case GNUNET_TESTBED_TOPOLOGY_SCALE_FREE:
- GNUNET_TESTBED_underlay_construct_ (num_peers,
- link_processor,
- NULL,
- topology,
- arg_uint1,
- arg_uint2);
- break;
- default:
- GNUNET_assert (0);
- }
+ {
+ case GNUNET_TESTBED_TOPOLOGY_LINE:
+ case GNUNET_TESTBED_TOPOLOGY_RING:
+ case GNUNET_TESTBED_TOPOLOGY_STAR:
+ case GNUNET_TESTBED_TOPOLOGY_CLIQUE:
+ case GNUNET_TESTBED_TOPOLOGY_2D_TORUS:
+ GNUNET_TESTBED_underlay_construct_(num_peers,
+ link_processor,
+ NULL,
+ topology);
+ break;
+
+ case GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI:
+ case GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD_RING:
+ case GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD:
+ GNUNET_TESTBED_underlay_construct_(num_peers,
+ link_processor,
+ NULL,
+ topology,
+ arg_uint1);
+ break;
+
+ case GNUNET_TESTBED_TOPOLOGY_FROM_FILE:
+ GNUNET_TESTBED_underlay_construct_(num_peers,
+ link_processor,
+ NULL,
+ topology,
+ arg_str1);
+ break;
+
+ case GNUNET_TESTBED_TOPOLOGY_SCALE_FREE:
+ GNUNET_TESTBED_underlay_construct_(num_peers,
+ link_processor,
+ NULL,
+ topology,
+ arg_uint1,
+ arg_uint2);
+ break;
+
+ default:
+ GNUNET_assert(0);
+ }
}
* Main
*/
int
-main (int argc, char *const argv[])
+main(int argc, char *const argv[])
{
struct GNUNET_GETOPT_CommandLineOption option[] = {
-
- GNUNET_GETOPT_option_uint ('p',
- "num-peers",
- "COUNT",
- gettext_noop ("create COUNT number of peers"),
- &num_peers),
- GNUNET_GETOPT_OPTION_END};
+ GNUNET_GETOPT_option_uint('p',
+ "num-peers",
+ "COUNT",
+ gettext_noop("create COUNT number of peers"),
+ &num_peers),
+ GNUNET_GETOPT_OPTION_END
+ };
int ret;
exit_result = GNUNET_SYSERR;
- ret = GNUNET_PROGRAM_run (
+ ret = GNUNET_PROGRAM_run(
argc,
argv,
"gnunet-underlay-topology",
- _ (
+ _(
"Generates SQLite3 database representing a given underlay topology.\n"
"Usage: gnunet-underlay-topology [OPTIONS] db-filename TOPO [TOPOOPTS]\n"
"The following options are available for TOPO followed by TOPOOPTS if applicable:\n"
&run,
NULL);
if (NULL != stmt_insert)
- sqlite3_finalize (stmt_insert);
+ sqlite3_finalize(stmt_insert);
if (NULL != db)
- GNUNET_break (SQLITE_OK == sqlite3_close (db));
+ GNUNET_break(SQLITE_OK == sqlite3_close(db));
if ((GNUNET_OK != ret) || (GNUNET_OK != exit_result))
return 1;
return 0;