more LOG macros
[oweals/gnunet.git] / src / cadet / gnunet-service-cadet-new_hello.c
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2014, 2017 GNUnet e.V.
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., 51 Franklin Street, Fifth Floor,
18      Boston, MA 02110-1301, USA.
19 */
20 /**
21  * @file cadet/gnunet-service-cadet-new_hello.c
22  * @brief spread knowledge about how to contact other peers from PEERINFO
23  * @author Bartlomiej Polot
24  * @author Christian Grothoff
25  *
26  * TODO:
27  * - is most of this necessary/helpful?
28  * - should we not simply restrict this to OUR hello?
29  */
30 #include "platform.h"
31 #include "gnunet_util_lib.h"
32
33 #include "gnunet_statistics_service.h"
34 #include "gnunet_peerinfo_service.h"
35 #include "cadet_protocol.h"
36 #include "gnunet-service-cadet-new.h"
37 #include "gnunet-service-cadet-new_hello.h"
38 #include "gnunet-service-cadet-new_peer.h"
39
40 #define LOG(level, ...) GNUNET_log_from(level,"cadet-hll",__VA_ARGS__)
41
42 /**
43  * Hello message of local peer.
44  */
45 static struct GNUNET_HELLO_Message *mine;
46
47 /**
48  * Handle to peerinfo service.
49  */
50 static struct GNUNET_PEERINFO_Handle *peerinfo;
51
52 /**
53  * Iterator context.
54  */
55 static struct GNUNET_PEERINFO_NotifyContext *nc;
56
57
58 /**
59  * Process each hello message received from peerinfo.
60  *
61  * @param cls Closure (unused).
62  * @param peer Identity of the peer.
63  * @param hello Hello of the peer.
64  * @param err_msg Error message.
65  */
66 static void
67 got_hello (void *cls,
68            const struct GNUNET_PeerIdentity *id,
69            const struct GNUNET_HELLO_Message *hello,
70            const char *err_msg)
71 {
72   struct CadetPeer *peer;
73
74   if ( (NULL == id) ||
75        (NULL == hello) )
76     return;
77   if (0 == memcmp (id,
78                    &my_full_id,
79                    sizeof (struct GNUNET_PeerIdentity)))
80   {
81     GNUNET_free_non_null (mine);
82     mine = (struct GNUNET_HELLO_Message *) GNUNET_copy_message (&hello->header);
83     return;
84   }
85
86   LOG (GNUNET_ERROR_TYPE_DEBUG,
87        "Hello for %s (%d bytes), expires on %s\n",
88        GNUNET_i2s (id),
89        GNUNET_HELLO_size (hello),
90        GNUNET_STRINGS_absolute_time_to_string (GNUNET_HELLO_get_last_expiration (hello)));
91   peer = GCP_get (id,
92                   GNUNET_YES);
93   GCP_set_hello (peer,
94                  hello);
95 }
96
97
98 /**
99  * Initialize the hello subsystem.
100  *
101  * @param c Configuration.
102  */
103 void
104 GCH_init (const struct GNUNET_CONFIGURATION_Handle *c)
105 {
106   GNUNET_assert (NULL == nc);
107   peerinfo = GNUNET_PEERINFO_connect (c);
108   nc = GNUNET_PEERINFO_notify (c,
109                                GNUNET_NO,
110                                &got_hello,
111                                NULL);
112 }
113
114
115 /**
116  * Shut down the hello subsystem.
117  */
118 void
119 GCH_shutdown ()
120 {
121   if (NULL != nc)
122   {
123     GNUNET_PEERINFO_notify_cancel (nc);
124     nc = NULL;
125   }
126   if (NULL != peerinfo)
127   {
128     GNUNET_PEERINFO_disconnect (peerinfo);
129     peerinfo = NULL;
130   }
131   if (NULL != mine)
132   {
133     GNUNET_free (mine);
134     mine = NULL;
135   }
136 }
137
138
139 /**
140  * Get own hello message.
141  *
142  * @return Own hello message.
143  */
144 const struct GNUNET_HELLO_Message *
145 GCH_get_mine (void)
146 {
147   return mine;
148 }
149
150 /* end of gnunet-service-cadet-new_hello.c */