aboutsummaryrefslogtreecommitdiff
path: root/src/include/gnunet_network_lib.h
blob: 492713c464e5499e9e0c3f3059c1349046fdd0fb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
/*
     This file is part of GNUnet.
     (C) 2009 Christian Grothoff (and other contributing authors)

     GNUnet is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published
     by the Free Software Foundation; either version 2, or (at your
     option) any later version.

     GNUnet is distributed in the hope that it will be useful, but
     WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     General Public License for more details.

     You should have received a copy of the GNU General Public License
     along with GNUnet; see the file COPYING.  If not, write to the
     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
     Boston, MA 02111-1307, USA.
*/

/**
 * @file include/gnunet_network_lib.h
 * @brief basic low-level networking interface
 * @author Nils Durner
 */

#ifndef GNUNET_NETWORK_LIB_H
#define GNUNET_NETWORK_LIB_H

#ifdef __cplusplus
extern "C"
{
#if 0                           /* keep Emacsens' auto-indent happy */
}
#endif
#endif



/**
 * @brief handle to a socket
 */
struct GNUNET_NETWORK_Handle;

/**
 * @brief collection of IO descriptors
 */
struct GNUNET_NETWORK_FDSet;


#include "gnunet_disk_lib.h"
#include "gnunet_time_lib.h"

/**
 * accept a new connection on a socket
 *
 * @param desc bound socket
 * @param address address of the connecting peer, may be NULL
 * @param address_len length of address
 * @return client socket
 */
struct GNUNET_NETWORK_Handle *
GNUNET_NETWORK_socket_accept (const struct GNUNET_NETWORK_Handle *desc,
			      struct sockaddr *address,
			      socklen_t *address_len);

/**
 * Make a non-inheritable to child processes (sets the
 * close-on-exec flag).
 *
 * @param socket
 * @return GNUNET_OK on success, GNUNET_SYSERR otherwise
 * @warning Not implemented on Windows
 */
int
GNUNET_NETWORK_socket_set_inheritable (const struct GNUNET_NETWORK_Handle
                                       *desc);

/**
 * Bind to a connected socket
 * @param desc socket
 * @param address address to be bound
 * @param address_len length of address
 * @return GNUNET_OK on success, GNUNET_SYSERR otherwise
 */
int GNUNET_NETWORK_socket_bind (struct GNUNET_NETWORK_Handle *desc,
                    const struct sockaddr *address, socklen_t address_len);

/**
 * Close a socket
 * @param desc socket
 * @return GNUNET_OK on success, GNUNET_SYSERR otherwise
 */
int GNUNET_NETWORK_socket_close (struct GNUNET_NETWORK_Handle *desc);

/**
 * Connect a socket
 * @param desc socket
 * @param address peer address
 * @param length of address
 * @return GNUNET_OK on success, GNUNET_SYSERR otherwise
 */
int GNUNET_NETWORK_socket_connect (const struct GNUNET_NETWORK_Handle *desc,
                       const struct sockaddr *address, socklen_t address_len);

/**
 * Get socket options
 * @param desc socket
 * @param level protocol level of the option
 * @param optname identifier of the option
 * @param optval options
 * @param optlen length of optval
 * @return GNUNET_OK on success, GNUNET_SYSERR otherwise
 */
int GNUNET_NETWORK_socket_getsockopt(const struct GNUNET_NETWORK_Handle *desc, int level, int optname,
       void *optval, socklen_t *optlen);

/**
 * Listen on a socket
 * @param desc socket
 * @param backlog length of the listen queue
 * @return GNUNET_OK on success, GNUNET_SYSERR otherwise
 */
int GNUNET_NETWORK_socket_listen (const struct GNUNET_NETWORK_Handle *desc, int backlog);

/**
 * Read data from a connected socket
 *
 * @param desc socket
 * @param buffer buffer
 * @param length length of buffer
 * @param flags type of message reception
 * @return number of bytes read
 */
ssize_t GNUNET_NETWORK_socket_recv (const struct GNUNET_NETWORK_Handle *desc, void *buffer,
                        size_t length, int flags);

/**
 * Check if sockets meet certain conditions
 * @param rfds set of sockets to be checked for readability
 * @param wfds set of sockets to be checked for writability
 * @param efds set of sockets to be checked for exceptions
 * @param timeout relative value when to return
 * @return number of selected sockets, GNUNET_SYSERR on error
 */
int GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
    struct GNUNET_NETWORK_FDSet *wfds, struct GNUNET_NETWORK_FDSet *efds,
    struct GNUNET_TIME_Relative timeout);

/**
 * Set if a socket should use blocking or non-blocking IO.
 * @param fd socket
 * @param doBlock blocking mode
 * @return GNUNET_OK on success, GNUNET_SYSERR on error
 */
int GNUNET_NETWORK_socket_set_blocking (struct GNUNET_NETWORK_Handle *fd, 
					int doBlock);

/**
 * Send data
 * @param desc socket
 * @param buffer data to send
 * @param length size of the buffer
 * @param flags type of message transmission
 * @return number of bytes sent, GNUNET_SYSERR on error
 */
ssize_t GNUNET_NETWORK_socket_send (const struct GNUNET_NETWORK_Handle *desc,
                        const void *buffer, size_t length, int flags);

/**
 * Send data
 * @param desc socket
 * @param message data to send
 * @param length size of the data
 * @param flags type of message transmission
 * @param dest_addr destination address
 * @param dest_len length of address
 * @return number of bytes sent, GNUNET_SYSERR on error
 */
ssize_t GNUNET_NETWORK_socket_sendto (const struct GNUNET_NETWORK_Handle *desc,
                          const void *message, size_t length, int flags,
                          const struct sockaddr *dest_addr,
                          socklen_t dest_len);

/**
 * Set socket option
 * @param fd socket
 * @param level protocol level of the option
 * @param option_name option identifier
 * @param option_value value to set
 * @param option_len size of option_value
 * @return GNUNET_OK on success, GNUNET_SYSERR otherwise
 */
int GNUNET_NETWORK_socket_setsockopt(struct GNUNET_NETWORK_Handle *fd, int level, int option_name,
       const void *option_value, socklen_t option_len);

/**
 * Shut down socket operations
 * @param desc socket
 * @param how type of shutdown
 * @return GNUNET_OK on success, GNUNET_SYSERR otherwise
 */
int GNUNET_NETWORK_socket_shutdown (struct GNUNET_NETWORK_Handle *desc, int how);

/**
 * Create a new socket
 * @param domain domain of the socket
 * @param type socket type
 * @param protocol network protocol
 * @return new socket, NULL on error
 */
struct GNUNET_NETWORK_Handle *GNUNET_NETWORK_socket_socket (int domain, int type, int protocol);

/**
 * Reset FD set (clears all file descriptors).
 *
 * @param fds fd set to clear
 */
void GNUNET_NETWORK_fdset_zero(struct GNUNET_NETWORK_FDSet *fds);

/**
 * Add a socket to the FD set
 * @param fds fd set
 * @param desc socket to add
 */
void GNUNET_NETWORK_fdset_set(struct GNUNET_NETWORK_FDSet *fds,
			      const struct GNUNET_NETWORK_Handle *desc);


/**
 * Check whether a socket is part of the fd set
 * @param fds fd set
 * @param desc socket
 */
int GNUNET_NETWORK_fdset_isset(const struct GNUNET_NETWORK_FDSet *fds,
			       const struct GNUNET_NETWORK_Handle *desc);

/**
 * Add one fd set to another
 * @param dst the fd set to add to
 * @param src the fd set to add from
 */
void GNUNET_NETWORK_fdset_add (struct GNUNET_NETWORK_FDSet *dst,
			       const struct GNUNET_NETWORK_FDSet *src);

/**
 * Copy one fd set to another
 * @param to destination
 * @param from source
 */
void GNUNET_NETWORK_fdset_copy(struct GNUNET_NETWORK_FDSet *to,
			       const struct GNUNET_NETWORK_FDSet *from);

/**
 * Copy a native fd set
 * @param to destination
 * @param from native source set
 * @param the biggest socket number in from + 1
 */
void GNUNET_NETWORK_fdset_copy_native (struct GNUNET_NETWORK_FDSet *to, 
				       const fd_set *from,
				       int nfds);

/**
 * Add a file handle to the fd set
 * @param fds fd set
 * @param h the file handle to add
 */
void GNUNET_NETWORK_fdset_handle_set (struct GNUNET_NETWORK_FDSet *fds,
				      const struct GNUNET_DISK_FileHandle *h);

/**
 * Check if a file handle is part of an fd set
 * @param fds fd set
 * @param h file handle
 * @return GNUNET_YES if the file handle is part of the set
 */
int GNUNET_NETWORK_fdset_handle_isset (const struct GNUNET_NETWORK_FDSet *fds,
				       const struct GNUNET_DISK_FileHandle *h);

/**
 * Checks if two fd sets overlap
 * @param fds1 first fd set
 * @param fds2 second fd set
 * @return GNUNET_YES if they do overlap, GNUNET_NO otherwise
 */
int GNUNET_NETWORK_fdset_overlap (const struct GNUNET_NETWORK_FDSet *fds1, 
				  const struct GNUNET_NETWORK_FDSet *fds2);

/**
 * Creates an fd set
 * @return a new fd set
 */
struct GNUNET_NETWORK_FDSet *GNUNET_NETWORK_fdset_create (void);

/**
 * Releases the associated memory of an fd set
 * @param fds fd set
 */
void GNUNET_NETWORK_fdset_destroy (struct GNUNET_NETWORK_FDSet *fds);


#if 0                           /* keep Emacsens' auto-indent happy */
{
#endif
#ifdef __cplusplus
}
#endif

#endif /* GNUNET_NETWORK_LIB_H */