-nicer logging
[oweals/gnunet.git] / src / include / gnunet_dns_service.h
1 /*
2       This file is part of GNUnet
3       Copyright (C) 2012 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 /**
22  * @file include/gnunet_dns_service.h
23  * @brief API to access the DNS service.
24  * @author Christian Grothoff
25  */
26 #ifndef GNUNET_DNS_SERVICE_H
27 #define GNUNET_DNS_SERVICE_H
28
29 #include "gnunet_util_lib.h"
30
31
32 /**
33  * Opaque DNS handle
34  */
35 struct GNUNET_DNS_Handle;
36
37 /**
38  * Handle to identify an individual DNS request.
39  */
40 struct GNUNET_DNS_RequestHandle;
41
42 /**
43  * Flags that specify when to call the client's handler.
44  */
45 enum GNUNET_DNS_Flags
46 {
47
48   /**
49    * Useless option: never call the client.
50    */
51   GNUNET_DNS_FLAG_NEVER = 0,
52
53   /**
54    * Set this flag to see all requests first prior to resolution
55    * (for monitoring).  Clients that set this flag must then
56    * call "GNUNET_DNS_request_forward" when they process a request
57    * for the first time.  Caling "GNUNET_DNS_request_answer" is
58    * not allowed for MONITOR peers.
59    */
60   GNUNET_DNS_FLAG_REQUEST_MONITOR = 1,
61
62   /**
63    * This client should be called on requests that have not
64    * yet been resolved as this client provides a resolution
65    * service.  Note that this does not guarantee that the
66    * client will see all requests as another client might be
67    * called first and that client might have already done the
68    * resolution, in which case other pre-resolution clients
69    * won't see the request anymore.
70    */
71   GNUNET_DNS_FLAG_PRE_RESOLUTION = 2,
72
73   /**
74    * This client wants to be called on the results of a DNS resolution
75    * (either resolved by PRE-RESOLUTION clients or the global DNS).
76    * The client then has a chance to modify the answer (or cause it to
77    * be dropped).  There is no guarantee that other POST-RESOLUTION
78    * client's won't modify (or drop) the answer afterwards.
79    */
80   GNUNET_DNS_FLAG_POST_RESOLUTION = 4,
81
82   /**
83    * Set this flag to see all requests just before they are
84    * returned to the network.  Clients that set this flag must then
85    * call "GNUNET_DNS_request_forward" when they process a request
86    * for the last time.  Caling "GNUNET_DNS_request_answer" is
87    * not allowed for MONITOR peers.
88    */
89   GNUNET_DNS_FLAG_RESPONSE_MONITOR = 8
90
91 };
92
93
94
95 /**
96  * Signature of a function that is called whenever the DNS service
97  * encounters a DNS request and needs to do something with it.  The
98  * function has then the chance to generate or modify the response by
99  * calling one of the three "GNUNET_DNS_request_*" continuations.
100  *
101  * When a request is intercepted, this function is called first to
102  * give the client a chance to do the complete address resolution;
103  * "rdata" will be NULL for this first call for a DNS request, unless
104  * some other client has already filled in a response.
105  *
106  * If multiple clients exist, all of them are called before the global
107  * DNS.  The global DNS is only called if all of the clients'
108  * functions call GNUNET_DNS_request_forward.  Functions that call
109  * GNUNET_DNS_request_forward will be called again before a final
110  * response is returned to the application.  If any of the clients'
111  * functions call GNUNET_DNS_request_drop, the response is dropped.
112  *
113  * @param cls closure
114  * @param rh request handle to user for reply
115  * @param request_length number of bytes in request
116  * @param request udp payload of the DNS request
117  */
118 typedef void (*GNUNET_DNS_RequestHandler)(void *cls,
119                                           struct GNUNET_DNS_RequestHandle *rh,
120                                           size_t request_length,
121                                           const char *request);
122
123
124 /**
125  * If a GNUNET_DNS_RequestHandler calls this function, the client
126  * has no desire to interfer with the request and it should
127  * continue to be processed normally.
128  *
129  * @param rh request that should now be forwarded
130  */
131 void
132 GNUNET_DNS_request_forward (struct GNUNET_DNS_RequestHandle *rh);
133
134
135 /**
136  * If a GNUNET_DNS_RequestHandler calls this function, the request is
137  * to be dropped and no response should be generated.
138  *
139  * @param rh request that should now be dropped
140  */
141 void
142 GNUNET_DNS_request_drop (struct GNUNET_DNS_RequestHandle *rh);
143
144
145 /**
146  * If a GNUNET_DNS_RequestHandler calls this function, the request is
147  * supposed to be answered with the data provided to this call (with
148  * the modifications the function might have made).  The reply given
149  * must always be a valid DNS reply and not a mutated DNS request.
150  *
151  * @param rh request that should now be answered
152  * @param reply_length size of reply (uint16_t to force sane size)
153  * @param reply reply data
154  */
155 void
156 GNUNET_DNS_request_answer (struct GNUNET_DNS_RequestHandle *rh,         
157                            uint16_t reply_length,
158                            const char *reply);
159
160
161 /**
162  * Connect to the service-dns
163  *
164  * @param cfg configuration to use
165  * @param flags when to call rh
166  * @param rh function to call with DNS requests
167  * @param rh_cls closure to pass to rh
168  * @return DNS handle
169  */
170 struct GNUNET_DNS_Handle *
171 GNUNET_DNS_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
172                     enum GNUNET_DNS_Flags flags,
173                     GNUNET_DNS_RequestHandler rh,
174                     void *rh_cls);
175
176
177 /**
178  * Disconnect from the DNS service.
179  *
180  * @param dh DNS handle
181  */
182 void
183 GNUNET_DNS_disconnect (struct GNUNET_DNS_Handle *dh);
184
185 #endif