aboutsummaryrefslogtreecommitdiff
path: root/src/include/gnunet_server_lib.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/gnunet_server_lib.h')
-rw-r--r--src/include/gnunet_server_lib.h498
1 files changed, 498 insertions, 0 deletions
diff --git a/src/include/gnunet_server_lib.h b/src/include/gnunet_server_lib.h
new file mode 100644
index 000000000..4e4f35e26
--- /dev/null
+++ b/src/include/gnunet_server_lib.h
@@ -0,0 +1,498 @@
1/*
2 This file is part of GNUnet.
3 (C) 2009 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 2, 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_server_lib.h
23 * @brief library for building GNUnet network servers
24 *
25 * @author Christian Grothoff
26 */
27
28#ifndef GNUNET_SERVER_LIB_H
29#define GNUNET_SERVER_LIB_H
30
31#ifdef __cplusplus
32extern "C"
33{
34#if 0 /* keep Emacsens' auto-indent happy */
35}
36#endif
37#endif
38
39#include "gnunet_common.h"
40#include "gnunet_network_lib.h"
41#include "gnunet_scheduler_lib.h"
42
43
44/**
45 * Largest supported message.
46 */
47#define GNUNET_SERVER_MAX_MESSAGE_SIZE 65536
48
49
50/**
51 * @brief handle for a server
52 */
53struct GNUNET_SERVER_Handle;
54
55
56/**
57 * @brief opaque handle for a client of the server
58 */
59struct GNUNET_SERVER_Client;
60
61
62/**
63 * Functions with this signature are called whenever a message is
64 * received.
65 *
66 * @param cls closure
67 * @param server the server handling the message
68 * @param client identification of the client
69 * @param message the actual message
70 */
71typedef void (*GNUNET_SERVER_MessageCallback) (void *cls,
72 struct GNUNET_SERVER_Handle *
73 server,
74 struct GNUNET_SERVER_Client *
75 client,
76 const struct
77 GNUNET_MessageHeader *
78 message);
79
80
81
82/**
83 * Message handler. Each struct specifies how to handle on particular
84 * type of message received.
85 */
86struct GNUNET_SERVER_MessageHandler
87{
88 /**
89 * Function to call for messages of "type".
90 */
91 GNUNET_SERVER_MessageCallback callback;
92
93 /**
94 * Closure argument for "callback".
95 */
96 void *callback_cls;
97
98 /**
99 * Type of the message this handler covers.
100 */
101 uint16_t type;
102
103 /**
104 * Expected size of messages of this type. Use 0 for
105 * variable-size. If non-zero, messages of the given
106 * type will be discarded (and the connection closed)
107 * if they do not have the right size.
108 */
109 uint16_t expected_size;
110
111};
112
113
114/**
115 * Create a new server.
116 *
117 * @param sched scheduler to use
118 * @param access function for access control
119 * @param access_cls closure for access
120 * @param serverAddr address to listen on (including port), use NULL
121 * for internal server (no listening)
122 * @param socklen length of serverAddr
123 * @param maxbuf maximum write buffer size for accepted sockets
124 * @param idle_timeout after how long should we timeout idle connections?
125 * @param require_found if YES, connections sending messages of unknown type
126 * will be closed
127 * @return handle for the new server, NULL on error
128 * (typically, "port" already in use)
129 */
130struct GNUNET_SERVER_Handle *GNUNET_SERVER_create (struct
131 GNUNET_SCHEDULER_Handle
132 *sched,
133 GNUNET_NETWORK_AccessCheck
134 access, void *access_cls,
135 const struct sockaddr
136 *serverAddr,
137 socklen_t socklen,
138 size_t maxbuf,
139 struct GNUNET_TIME_Relative
140 idle_timeout,
141 int require_found);
142
143
144/**
145 * Free resources held by this server.
146 */
147void GNUNET_SERVER_destroy (struct GNUNET_SERVER_Handle *s);
148
149
150/**
151 * Add additional handlers to an existing server.
152 *
153 * @param server the server to add handlers to
154 * @param handlers array of message handlers for
155 * incoming messages; the last entry must
156 * have "NULL" for the "callback"; multiple
157 * entries for the same type are allowed,
158 * they will be called in order of occurence.
159 * These handlers can be removed later;
160 * the handlers array must exist until removed
161 * (or server is destroyed).
162 */
163void
164GNUNET_SERVER_add_handlers (struct GNUNET_SERVER_Handle *server,
165 const struct GNUNET_SERVER_MessageHandler
166 *handlers);
167
168
169/**
170 * Notify us when the server has enough space to transmit
171 * a message of the given size to the given client.
172 *
173 * @param client client to transmit message to
174 * @param size requested amount of buffer space
175 * @param timeout after how long should we give up (and call
176 * notify with buf NULL and size 0)?
177 * @param callback function to call when space is available
178 * @param callback_cls closure for callback
179 * @return non-NULL if the notify callback was queued; can be used
180 * to cancel the request using
181 * GNUNET_NETWORK_notify_transmit_ready_cancel.
182 * NULL if we are already going to notify someone else (busy)
183 */
184struct GNUNET_NETWORK_TransmitHandle
185 *GNUNET_SERVER_notify_transmit_ready (struct GNUNET_SERVER_Client *client,
186 size_t size,
187 struct GNUNET_TIME_Relative timeout,
188 GNUNET_NETWORK_TransmitReadyNotify
189 callback, void *callback_cls);
190
191
192/**
193 * Resume receiving from this client, we are done processing the
194 * current request. This function must be called from within each
195 * GNUNET_SERVER_MessageCallback (or its respective continuations).
196 *
197 * @param client client we were processing a message of
198 * @param success GNUNET_OK to keep the connection open and
199 * continue to receive
200 * GNUNET_SYSERR to close the connection (signal
201 * serious error)
202 */
203void
204GNUNET_SERVER_receive_done (struct GNUNET_SERVER_Client *client, int success);
205
206
207/**
208 * Inject a message into the server, pretend it came
209 * from the specified client. Delivery of the message
210 * will happen instantly (if a handler is installed;
211 * otherwise the call does nothing).
212 *
213 * @param server the server receiving the message
214 * @param sender the "pretended" sender of the message
215 * can be NULL!
216 * @param message message to transmit
217 * @return GNUNET_OK if the message was OK and the
218 * connection can stay open
219 * GNUNET_SYSERR if the connection to the
220 * client should be shut down
221 */
222int
223GNUNET_SERVER_inject (struct GNUNET_SERVER_Handle *server,
224 struct GNUNET_SERVER_Client *sender,
225 const struct GNUNET_MessageHeader *message);
226
227
228/**
229 * Add a TCP socket-based connection to the set of handles managed by
230 * this server. Use this function for outgoing (P2P) connections that
231 * we initiated (and where this server should process incoming
232 * messages).
233 *
234 * @param server the server to use
235 * @param connection the connection to manage (client must
236 * stop using this connection from now on)
237 * @return the client handle (client should call
238 * "client_drop" on the return value eventually)
239 */
240struct GNUNET_SERVER_Client *GNUNET_SERVER_connect_socket (struct
241 GNUNET_SERVER_Handle
242 *server,
243 struct
244 GNUNET_NETWORK_SocketHandle
245 *connection);
246
247
248/**
249 * Receive data from the given connection. This function should call
250 * "receiver" asynchronously using the scheduler. It must return
251 * "immediately".
252 *
253 * @param cls closure
254 * @param sched scheduler to use
255 * @param max maximum number of bytes to read
256 * @param timeout maximum amount of time to wait (use -1 for "forever")
257 * @param receiver function to call with received data
258 * @param receiver_cls closure for receiver
259 * @return task identifier that can be used to cancel the receive,
260 * GNUNET_SCHEDULER_NO_PREREQUISITE_TASK should be returned
261 * if the receiver function was already called
262 */
263typedef GNUNET_SCHEDULER_TaskIdentifier
264 (*GNUNET_SERVER_ReceiveCallback) (void *cls,
265 size_t max,
266 struct GNUNET_TIME_Relative timeout,
267 GNUNET_NETWORK_Receiver
268 receiver, void *receiver_cls);
269
270
271/**
272 * Cancel receive request.
273 *
274 * @param cls closure
275 * @param ti task identifier from the receive callback
276 */
277typedef void (*GNUNET_SERVER_ReceiveCancelCallback) (void *cls,
278 GNUNET_SCHEDULER_TaskIdentifier
279 ti);
280
281
282/**
283 * Notify us when the connection is ready to transmit size bytes.
284 *
285 * @param cls closure
286 * @param size number of bytes to be ready for sending
287 * @param timeout after how long should we give up (and call
288 * notify with buf NULL and size 0)?
289 * @param notify function to call
290 * @param notify_cls closure for notify
291 * @return a handle that can be used to cancel
292 * the transmission request or NULL if
293 * queueing a transmission request failed
294 */
295typedef void *(*GNUNET_SERVER_TransmitReadyCallback) (void *cls,
296 size_t size,
297 struct
298 GNUNET_TIME_Relative
299 timeout,
300 GNUNET_NETWORK_TransmitReadyNotify
301 notify,
302 void *notify_cls);
303
304
305/**
306 * Cancel an earlier transmit notification request.
307 *
308 * @param cls closure
309 * @param ctx handle that was returned by the TransmitReadyCallback
310 */
311typedef void (*GNUNET_SERVER_TransmitReadyCancelCallback) (void *cls,
312 void *ctx);
313
314
315/**
316 * Check if connection is still valid (no fatal errors have happened so far).
317 *
318 * @param cls closure
319 * @return GNUNET_YES if valid, GNUNET_NO otherwise
320 */
321typedef int (*GNUNET_SERVER_CheckCallback) (void *cls);
322
323
324/**
325 * Destroy this connection (free resources).
326 *
327 * @param cls closure
328 */
329typedef void (*GNUNET_SERVER_DestroyCallback) (void *cls);
330
331
332/**
333 * Add an arbitrary connection to the set of handles managed by this
334 * server. This can be used if a sending and receiving does not
335 * really go over the network (internal transmission) or for servers
336 * using UDP.
337 *
338 * @param server the server to use
339 * @param chandle opaque handle for the connection
340 * @param creceive receive function for the connection
341 * @param creceive_cancel cancel receive function for the connection
342 * @param cnotify transmit notification function for the connection
343 * @param cnotify_cancel transmit notification cancellation function for the connection
344 * @param ccheck function to test if the connection is still up
345 * @param cdestroy function to close and free the connection
346 * @return the client handle (client should call
347 * "client_drop" on the return value eventually)
348 */
349struct GNUNET_SERVER_Client *GNUNET_SERVER_connect_callback (struct
350 GNUNET_SERVER_Handle
351 *server,
352 void *chandle,
353 GNUNET_SERVER_ReceiveCallback
354 creceive,
355 GNUNET_SERVER_ReceiveCancelCallback
356 ccancel,
357 GNUNET_SERVER_TransmitReadyCallback
358 cnotify,
359 GNUNET_SERVER_TransmitReadyCancelCallback
360 cnotify_cancel,
361 GNUNET_SERVER_CheckCallback
362 ccheck,
363 GNUNET_SERVER_DestroyCallback
364 cdestroy);
365
366
367/**
368 * Notify the server that the given client handle should
369 * be kept (keeps the connection up if possible, increments
370 * the internal reference counter).
371 *
372 * @param client the client to keep
373 */
374void GNUNET_SERVER_client_keep (struct GNUNET_SERVER_Client *client);
375
376
377/**
378 * Notify the server that the given client handle is no
379 * longer required. Decrements the reference counter. If
380 * that counter reaches zero an inactive connection maybe
381 * closed.
382 *
383 * @param client the client to drop
384 */
385void GNUNET_SERVER_client_drop (struct GNUNET_SERVER_Client *client);
386
387
388/**
389 * Obtain the network address of the other party.
390 *
391 * @param client the client to get the address for
392 * @param addr where to store the address
393 * @param addrlen where to store the length of the address
394 * @return GNUNET_OK on success
395 */
396int GNUNET_SERVER_client_get_address (struct GNUNET_SERVER_Client *client,
397 void **addr, size_t * addrlen);
398
399
400/**
401 * Functions with this signature are called whenever a client
402 * is disconnected on the network level.
403 *
404 * @param cls closure
405 * @param client identification of the client
406 */
407typedef void (*GNUNET_SERVER_DisconnectCallback) (void *cls,
408 struct GNUNET_SERVER_Client
409 * client);
410
411
412/**
413 * Ask the server to notify us whenever a client disconnects.
414 * This function is called whenever the actual network connection
415 * is closed; the reference count may be zero or larger than zero
416 * at this point.
417 *
418 * @param server the server manageing the clients
419 * @param callback function to call on disconnect
420 * @param callback_cls closure for callback
421 */
422void GNUNET_SERVER_disconnect_notify (struct GNUNET_SERVER_Handle *server,
423 GNUNET_SERVER_DisconnectCallback
424 callback, void *callback_cls);
425
426
427/**
428 * Ask the server to disconnect from the given client.
429 * This is the same as returning GNUNET_SYSERR from a message
430 * handler, except that it allows dropping of a client even
431 * when not handling a message from that client.
432 *
433 * @param client the client to disconnect from
434 */
435void GNUNET_SERVER_client_disconnect (struct GNUNET_SERVER_Client *client);
436
437
438/**
439 * The tansmit context is the key datastructure for a conveniance API
440 * used for transmission of complex results to the client followed
441 * ONLY by signaling receive_done with success or error
442 */
443struct GNUNET_SERVER_TransmitContext;
444
445
446/**
447 * Create a new transmission context for the
448 * given client.
449 *
450 * @param client client to create the context for.
451 * @return NULL on error
452 */
453struct GNUNET_SERVER_TransmitContext
454 *GNUNET_SERVER_transmit_context_create (struct GNUNET_SERVER_Client
455 *client);
456
457
458/**
459 * Append a message to the transmission context.
460 * All messages in the context will be sent by
461 * the transmit_context_run method.
462 *
463 * @param tc context to use
464 * @param data what to append to the result message
465 * @param length length of data
466 * @param type type of the message
467 */
468void
469GNUNET_SERVER_transmit_context_append (struct GNUNET_SERVER_TransmitContext
470 *tc, const void *data, size_t length,
471 uint16_t type);
472
473/**
474 * Execute a transmission context. If there is
475 * an error in the transmission, the receive_done
476 * method will be called with an error code (GNUNET_SYSERR),
477 * otherwise with GNUNET_OK.
478 *
479 * @param tc transmission context to use
480 * @param timeout when to time out and abort the transmission
481 */
482void
483GNUNET_SERVER_transmit_context_run (struct GNUNET_SERVER_TransmitContext *tc,
484 struct GNUNET_TIME_Relative timeout);
485
486
487
488#if 0 /* keep Emacsens' auto-indent happy */
489{
490#endif
491#ifdef __cplusplus
492}
493#endif
494
495
496/* ifndef GNUNET_SERVER_LIB_H */
497#endif
498/* end of gnunet_server_lib.h */