- use tunnel encryption state to select decryption key
[oweals/gnunet.git] / src / dv / gnunet-dv.c
1 /*
2      This file is part of GNUnet.
3      (C) 2013 Christian Grothoff (and other contributing authors)
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20 /**
21  * @file dv/gnunet-dv.c
22  * @brief DV monitoring command line tool
23  * @author Christian Grothoff
24  */
25 #include "platform.h"
26 #include "gnunet_util_lib.h"
27 #include "gnunet_dv_service.h"
28
29 /**
30  * Handle to DV service.
31  */
32 static struct GNUNET_DV_ServiceHandle *sh;
33
34 /**
35  * Was verbose specified?
36  */
37 static int verbose;
38
39
40 /**
41  * Function called if DV starts to be able to talk to a peer.
42  *
43  * @param cls closure
44  * @param peer newly connected peer
45  * @param distance distance to the peer
46  * @param network the network the next hop is located in
47  */
48 static void
49 connect_cb (void *cls,
50             const struct GNUNET_PeerIdentity *peer,
51             uint32_t distance,
52             enum GNUNET_ATS_Network_Type network)
53 {
54   fprintf (stderr, "Connect: %s at %u\n",
55            GNUNET_i2s (peer),
56            (unsigned int) distance);
57 }
58
59
60 /**
61  * Function called if DV distance to a peer is changed.
62  *
63  * @param cls closure
64  * @param peer connected peer
65  * @param distance new distance to the peer
66  * @param network network used on first hop to peer
67  */
68 static void
69 change_cb (void *cls,
70            const struct GNUNET_PeerIdentity *peer,
71            uint32_t distance,
72            enum GNUNET_ATS_Network_Type network)
73 {
74   fprintf (stderr, "Change: %s at %u\n",
75            GNUNET_i2s (peer),
76            (unsigned int) distance);
77 }
78
79
80 /**
81  * Function called if DV is no longer able to talk to a peer.
82  *
83  * @param cls closure
84  * @param peer peer that disconnected
85  */
86 static void
87 disconnect_cb (void *cls,
88                const struct GNUNET_PeerIdentity *peer)
89 {
90   fprintf (stderr, "Disconnect: %s\n",
91            GNUNET_i2s (peer));
92 }
93
94
95 /**
96  * Function called if DV receives a message for this peer.
97  *
98  * @param cls closure
99  * @param sender sender of the message
100  * @param distance how far did the message travel
101  * @param msg actual message payload
102  */
103 static void
104 message_cb (void *cls,
105             const struct GNUNET_PeerIdentity *sender,
106             uint32_t distance,
107             const struct GNUNET_MessageHeader *msg)
108 {
109   if (verbose)
110     fprintf (stderr, "Message: %s at %u sends %u bytes of type %u\n",
111              GNUNET_i2s (sender),
112              (unsigned int) distance,
113              (unsigned int) ntohs (msg->size),
114              (unsigned int) ntohs (msg->type));
115 }
116
117
118 /**
119  * Task run on shutdown.
120  *
121  * @param cls NULL
122  * @param tc unused
123  */
124 static void
125 shutdown_task (void *cls,
126                const struct GNUNET_SCHEDULER_TaskContext *tc)
127 {
128   GNUNET_DV_service_disconnect (sh);
129   sh = NULL;
130 }
131
132
133 /**
134  * Main function that will be run by the scheduler.
135  *
136  * @param cls closure
137  * @param args remaining command-line arguments
138  * @param cfgfile name of the configuration file used (for saving, can be NULL!)
139  * @param cfg configuration
140  */
141 static void
142 run (void *cls, char *const *args, const char *cfgfile,
143      const struct GNUNET_CONFIGURATION_Handle *cfg)
144 {
145   sh = GNUNET_DV_service_connect (cfg, NULL,
146                                   &connect_cb,
147                                   &change_cb,
148                                   &disconnect_cb,
149                                   &message_cb);
150   GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
151                                 &shutdown_task, NULL);
152 }
153
154
155 /**
156  * The main function.
157  *
158  * @param argc number of arguments from the command line
159  * @param argv command line arguments
160  * @return 0 ok, 1 on error
161  */
162 int
163 main (int argc, char *const *argv)
164 {
165   int res;
166
167   static const struct GNUNET_GETOPT_CommandLineOption options[] = {
168     {'V', "verbose", NULL,
169      gettext_noop ("verbose output"),
170      0, &GNUNET_GETOPT_set_one, &verbose},
171     GNUNET_GETOPT_OPTION_END
172   };
173
174   if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
175     return 2;
176
177   res = GNUNET_PROGRAM_run (argc, argv, "gnunet-dv",
178                             gettext_noop ("Print information about DV state"),
179                             options, &run,
180                             NULL);
181   GNUNET_free ((void *) argv);
182
183   if (GNUNET_OK != res)
184     return 1;
185   return 0;
186 }
187
188 /* end of gnunet-dv.c */