X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmesh%2Fgnunet-mesh.c;h=77bb7317f906f0ad2baedbf9292eee6a1e1606a4;hb=0f6d24a229e9149db26a4e667ed25032d19f533a;hp=c339c60b34fad5c9c6106bf48e6fe393db728a46;hpb=84d88f3ddc67f50c4493a20f33883c9242fd0d57;p=oweals%2Fgnunet.git diff --git a/src/mesh/gnunet-mesh.c b/src/mesh/gnunet-mesh.c index c339c60b3..77bb7317f 100644 --- a/src/mesh/gnunet-mesh.c +++ b/src/mesh/gnunet-mesh.c @@ -24,10 +24,8 @@ * @author Bartlomiej Polot */ #include "platform.h" -#include "gnunet_configuration_lib.h" -#include "gnunet_getopt_lib.h" +#include "gnunet_util_lib.h" #include "gnunet_mesh_service.h" -#include "gnunet_program_lib.h" /** @@ -35,12 +33,20 @@ */ static int monitor_connections; +/** + * Option -t + */ +static char *tunnel_id; /** * Mesh handle. */ static struct GNUNET_MESH_Handle *mh; +/** + * Shutdown task handle. + */ +GNUNET_SCHEDULER_TaskIdentifier sd; /** * Task run in monitor mode when the user presses CTRL-C to abort. @@ -65,50 +71,87 @@ shutdown_task (void *cls, * Method called to retrieve information about each tunnel the mesh peer * is aware of. * - * @param cls Closure (unused). - * @param initiator Peer that started the tunnel (owner). + * @param cls Closure. * @param tunnel_number Tunnel number. - * @param peers Array of peer identities that participate in the tunnel. - * @param npeers Number of peers in peers. + * @param origin that started the tunnel (owner). + * @param target other endpoint of the tunnel */ static void -monitor_callback (void *cls, - const struct GNUNET_PeerIdentity *initiator, - unsigned int tunnel_number, - const struct GNUNET_PeerIdentity *peers, - unsigned int npeers) +tunnels_callback (void *cls, + uint32_t tunnel_number, + const struct GNUNET_PeerIdentity *origin, + const struct GNUNET_PeerIdentity *target) { - unsigned int i; - - fprintf (stdout, "Tunnel %s [%u]: %u peers\n", - GNUNET_i2s_full (initiator), tunnel_number, npeers); - for (i = 0; i < npeers; i++) - fprintf (stdout, " * %s\n", GNUNET_i2s_full (&peers[i])); + fprintf (stdout, "Tunnel %s [%u]\n", + GNUNET_i2s_full (origin), tunnel_number); fprintf (stdout, "\n"); } /** - * Call MESH's monitor API, start monitoring process + * Method called to retrieve information about each tunnel the mesh peer + * is aware of. + * + * @param cls Closure. + * @param peer Peer in the tunnel's tree. + * @param parent Parent of the current peer. All 0 when peer is root. + * + */ +static void +tunnel_callback (void *cls, + const struct GNUNET_PeerIdentity *peer, + const struct GNUNET_PeerIdentity *parent) +{ +} + + +/** + * Call MESH's monitor API, get all tunnels known to peer. * * @param cls Closure (unused). * @param tc TaskContext */ static void -monitor (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +get_tunnels (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) { return; } - GNUNET_MESH_monitor (mh, &monitor_callback, NULL); - if (GNUNET_YES == monitor_connections) + GNUNET_MESH_get_tunnels (mh, &tunnels_callback, NULL); + if (GNUNET_YES != monitor_connections) { - /* keep open */ + GNUNET_SCHEDULER_shutdown(); } } +/** + * Call MESH's monitor API, get info of one tunnel. + * + * @param cls Closure (unused). + * @param tc TaskContext + */ +static void +show_tunnel (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + struct GNUNET_PeerIdentity pid; + + if (GNUNET_OK != + GNUNET_CRYPTO_eddsa_public_key_from_string (tunnel_id, + strlen (tunnel_id), + &pid.public_key)) + { + fprintf (stderr, + _("Invalid tunnel owner `%s'\n"), + tunnel_id); + GNUNET_SCHEDULER_shutdown(); + return; + } + GNUNET_MESH_show_tunnel (mh, &pid, 0, tunnel_callback, NULL); +} + + /** * Main function that will be run by the scheduler. * @@ -124,7 +167,7 @@ run (void *cls, char *const *args, const char *cfgfile, static const struct GNUNET_MESH_MessageHandler handlers[] = { {NULL, 0, 0} /* FIXME add option to monitor msg types */ }; - GNUNET_MESH_ApplicationType apps = 0; /* FIXME add option to monitor apps */ + /* FIXME add option to monitor apps */ if (args[0] != NULL) { @@ -133,16 +176,20 @@ run (void *cls, char *const *args, const char *cfgfile, } mh = GNUNET_MESH_connect (cfg, NULL, /* cls */ - NULL, /* nt */ + NULL, /* new tunnel */ NULL, /* cleaner */ handlers, - &apps); + NULL); if (NULL == mh) GNUNET_SCHEDULER_add_now (shutdown_task, NULL); else - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, - shutdown_task, NULL); - GNUNET_SCHEDULER_add_now (&monitor, NULL); + sd = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, + shutdown_task, NULL); + + if (NULL != tunnel_id) + GNUNET_SCHEDULER_add_now (&show_tunnel, NULL); + else + GNUNET_SCHEDULER_add_now (&get_tunnels, NULL); } @@ -159,15 +206,17 @@ main (int argc, char *const *argv) int res; static const struct GNUNET_GETOPT_CommandLineOption options[] = { {'m', "monitor", NULL, - gettext_noop ("provide inthe 'struct GNUNET_TRANSPORT_PeerIterateContextformation about all tunnels (continuously)"), - 0, &GNUNET_GETOPT_set_one, &monitor_connections}, + gettext_noop ("provide information about all tunnels (continuously) NOT IMPLEMENTED"), /* FIXME */ + GNUNET_NO, &GNUNET_GETOPT_set_one, &monitor_connections}, + {'t', "tunnel", "OWNER_ID:TUNNEL_ID", + gettext_noop ("provide information about a particular tunnel"), + GNUNET_YES, &GNUNET_GETOPT_set_string, &tunnel_id}, GNUNET_GETOPT_OPTION_END }; if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) return 2; - res = GNUNET_PROGRAM_run (argc, argv, "gnunet-mesh", gettext_noop ("Print information about mesh tunnels and peers."),