2 This file is part of GNUnet.
3 (C) 2009 Christian Grothoff (and other contributing authors)
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.
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.
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.
22 * @file include/gnunet_server_lib.h
23 * @brief library for building GNUnet network servers
25 * @author Christian Grothoff
28 #ifndef GNUNET_SERVER_LIB_H
29 #define GNUNET_SERVER_LIB_H
34 #if 0 /* keep Emacsens' auto-indent happy */
39 #include "gnunet_common.h"
40 #include "gnunet_network_lib.h"
41 #include "gnunet_scheduler_lib.h"
45 * Largest supported message.
47 #define GNUNET_SERVER_MAX_MESSAGE_SIZE 65536
51 * @brief handle for a server
53 struct GNUNET_SERVER_Handle;
57 * @brief opaque handle for a client of the server
59 struct GNUNET_SERVER_Client;
63 * Functions with this signature are called whenever a message is
67 * @param server the server handling the message
68 * @param client identification of the client
69 * @param message the actual message
71 typedef void (*GNUNET_SERVER_MessageCallback) (void *cls,
72 struct GNUNET_SERVER_Handle *
74 struct GNUNET_SERVER_Client *
77 GNUNET_MessageHeader *
83 * Message handler. Each struct specifies how to handle on particular
84 * type of message received.
86 struct GNUNET_SERVER_MessageHandler
89 * Function to call for messages of "type".
91 GNUNET_SERVER_MessageCallback callback;
94 * Closure argument for "callback".
99 * Type of the message this handler covers.
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.
109 uint16_t expected_size;
115 * Create a new server.
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
127 * @return handle for the new server, NULL on error
128 * (typically, "port" already in use)
130 struct GNUNET_SERVER_Handle *GNUNET_SERVER_create (struct
131 GNUNET_SCHEDULER_Handle
133 GNUNET_NETWORK_AccessCheck
134 access, void *access_cls,
135 const struct sockaddr
139 struct GNUNET_TIME_Relative
145 * Free resources held by this server.
147 void GNUNET_SERVER_destroy (struct GNUNET_SERVER_Handle *s);
151 * Add additional handlers to an existing server.
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).
164 GNUNET_SERVER_add_handlers (struct GNUNET_SERVER_Handle *server,
165 const struct GNUNET_SERVER_MessageHandler
170 * Notify us when the server has enough space to transmit
171 * a message of the given size to the given client.
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)
184 struct GNUNET_NETWORK_TransmitHandle
185 *GNUNET_SERVER_notify_transmit_ready (struct GNUNET_SERVER_Client *client,
187 struct GNUNET_TIME_Relative timeout,
188 GNUNET_NETWORK_TransmitReadyNotify
189 callback, void *callback_cls);
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).
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
204 GNUNET_SERVER_receive_done (struct GNUNET_SERVER_Client *client, int success);
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).
213 * @param server the server receiving the message
214 * @param sender the "pretended" sender of the message
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
223 GNUNET_SERVER_inject (struct GNUNET_SERVER_Handle *server,
224 struct GNUNET_SERVER_Client *sender,
225 const struct GNUNET_MessageHeader *message);
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
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)
240 struct GNUNET_SERVER_Client *GNUNET_SERVER_connect_socket (struct
244 GNUNET_NETWORK_SocketHandle
249 * Receive data from the given connection. This function should call
250 * "receiver" asynchronously using the scheduler. It must return
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
263 typedef GNUNET_SCHEDULER_TaskIdentifier
264 (*GNUNET_SERVER_ReceiveCallback) (void *cls,
266 struct GNUNET_TIME_Relative timeout,
267 GNUNET_NETWORK_Receiver
268 receiver, void *receiver_cls);
272 * Cancel receive request.
275 * @param ti task identifier from the receive callback
277 typedef void (*GNUNET_SERVER_ReceiveCancelCallback) (void *cls,
278 GNUNET_SCHEDULER_TaskIdentifier
283 * Notify us when the connection is ready to transmit size bytes.
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
295 typedef void *(*GNUNET_SERVER_TransmitReadyCallback) (void *cls,
300 GNUNET_NETWORK_TransmitReadyNotify
306 * Cancel an earlier transmit notification request.
309 * @param ctx handle that was returned by the TransmitReadyCallback
311 typedef void (*GNUNET_SERVER_TransmitReadyCancelCallback) (void *cls,
316 * Check if connection is still valid (no fatal errors have happened so far).
319 * @return GNUNET_YES if valid, GNUNET_NO otherwise
321 typedef int (*GNUNET_SERVER_CheckCallback) (void *cls);
325 * Destroy this connection (free resources).
329 typedef void (*GNUNET_SERVER_DestroyCallback) (void *cls);
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
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)
349 struct GNUNET_SERVER_Client *GNUNET_SERVER_connect_callback (struct
353 GNUNET_SERVER_ReceiveCallback
355 GNUNET_SERVER_ReceiveCancelCallback
357 GNUNET_SERVER_TransmitReadyCallback
359 GNUNET_SERVER_TransmitReadyCancelCallback
361 GNUNET_SERVER_CheckCallback
363 GNUNET_SERVER_DestroyCallback
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).
372 * @param client the client to keep
374 void GNUNET_SERVER_client_keep (struct GNUNET_SERVER_Client *client);
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
383 * @param client the client to drop
385 void GNUNET_SERVER_client_drop (struct GNUNET_SERVER_Client *client);
389 * Obtain the network address of the other party.
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
396 int GNUNET_SERVER_client_get_address (struct GNUNET_SERVER_Client *client,
397 void **addr, size_t * addrlen);
401 * Functions with this signature are called whenever a client
402 * is disconnected on the network level.
405 * @param client identification of the client
407 typedef void (*GNUNET_SERVER_DisconnectCallback) (void *cls,
408 struct GNUNET_SERVER_Client
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
418 * @param server the server manageing the clients
419 * @param callback function to call on disconnect
420 * @param callback_cls closure for callback
422 void GNUNET_SERVER_disconnect_notify (struct GNUNET_SERVER_Handle *server,
423 GNUNET_SERVER_DisconnectCallback
424 callback, void *callback_cls);
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.
433 * @param client the client to disconnect from
435 void GNUNET_SERVER_client_disconnect (struct GNUNET_SERVER_Client *client);
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
443 struct GNUNET_SERVER_TransmitContext;
447 * Create a new transmission context for the
450 * @param client client to create the context for.
451 * @return NULL on error
453 struct GNUNET_SERVER_TransmitContext
454 *GNUNET_SERVER_transmit_context_create (struct GNUNET_SERVER_Client
459 * Append a message to the transmission context.
460 * All messages in the context will be sent by
461 * the transmit_context_run method.
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
469 GNUNET_SERVER_transmit_context_append (struct GNUNET_SERVER_TransmitContext
470 *tc, const void *data, size_t length,
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.
479 * @param tc transmission context to use
480 * @param timeout when to time out and abort the transmission
483 GNUNET_SERVER_transmit_context_run (struct GNUNET_SERVER_TransmitContext *tc,
484 struct GNUNET_TIME_Relative timeout);
488 #if 0 /* keep Emacsens' auto-indent happy */
496 /* ifndef GNUNET_SERVER_LIB_H */
498 /* end of gnunet_server_lib.h */