GNUnet  0.11.x
Data Structures | Functions
Network library

Basic low-level networking interface. More...

Data Structures

struct  GNUNET_NETWORK_FDSet
 collection of IO descriptors More...
 

Functions

enum GNUNET_GenericReturnValue GNUNET_NETWORK_test_pf (int pf)
 Test if the given protocol family is supported by this system. More...
 
char * GNUNET_NETWORK_shorten_unixpath (char *unixpath)
 Given a unixpath that is too long (larger than UNIX_PATH_MAX), shorten it to an acceptable length while keeping it unique and making sure it remains a valid filename (if possible). More...
 
void GNUNET_NETWORK_unix_precheck (const struct sockaddr_un *un)
 If services crash, they can leave a unix domain socket file on the disk. More...
 
struct GNUNET_NETWORK_HandleGNUNET_NETWORK_socket_accept (const struct GNUNET_NETWORK_Handle *desc, struct sockaddr *address, socklen_t *address_len)
 Accept a new connection on a socket. More...
 
struct GNUNET_NETWORK_HandleGNUNET_NETWORK_socket_box_native (int fd)
 Box a native socket (and check that it is a socket). More...
 
int GNUNET_NETWORK_socket_set_blocking (struct GNUNET_NETWORK_Handle *fd, int doBlock)
 Set if a socket should use blocking or non-blocking IO. More...
 
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_bind (struct GNUNET_NETWORK_Handle *desc, const struct sockaddr *address, socklen_t address_len)
 Bind a socket to a particular address. More...
 
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_close (struct GNUNET_NETWORK_Handle *desc)
 Close a socket. More...
 
void GNUNET_NETWORK_socket_free_memory_only_ (struct GNUNET_NETWORK_Handle *desc)
 Only free memory of a socket, keep the file descriptor untouched. More...
 
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_connect (const struct GNUNET_NETWORK_Handle *desc, const struct sockaddr *address, socklen_t address_len)
 Connect a socket to some remote address. More...
 
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_getsockopt (const struct GNUNET_NETWORK_Handle *desc, int level, int optname, void *optval, socklen_t *optlen)
 Get socket options. More...
 
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_listen (const struct GNUNET_NETWORK_Handle *desc, int backlog)
 Listen on a socket. More...
 
ssize_t GNUNET_NETWORK_socket_recvfrom_amount (const struct GNUNET_NETWORK_Handle *desc)
 How much data is available to be read on this descriptor? More...
 
ssize_t GNUNET_NETWORK_socket_recvfrom (const struct GNUNET_NETWORK_Handle *desc, void *buffer, size_t length, struct sockaddr *src_addr, socklen_t *addrlen)
 Read data from a socket (always non-blocking). More...
 
ssize_t GNUNET_NETWORK_socket_recv (const struct GNUNET_NETWORK_Handle *desc, void *buffer, size_t length)
 Read data from a connected socket (always non-blocking). More...
 
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)
 Check if sockets meet certain conditions. More...
 
ssize_t GNUNET_NETWORK_socket_send (const struct GNUNET_NETWORK_Handle *desc, const void *buffer, size_t length)
 Send data (always non-blocking). More...
 
ssize_t GNUNET_NETWORK_socket_sendto (const struct GNUNET_NETWORK_Handle *desc, const void *message, size_t length, const struct sockaddr *dest_addr, socklen_t dest_len)
 Send data to a particular destination (always non-blocking). More...
 
int GNUNET_NETWORK_socket_setsockopt (struct GNUNET_NETWORK_Handle *fd, int level, int option_name, const void *option_value, socklen_t option_len)
 Set socket option. More...
 
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_shutdown (struct GNUNET_NETWORK_Handle *desc, int how)
 Shut down socket operations. More...
 
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_disable_corking (struct GNUNET_NETWORK_Handle *desc)
 Disable the "CORK" feature for communication with the given socket, forcing the OS to immediately flush the buffer on transmission instead of potentially buffering multiple messages. More...
 
struct GNUNET_NETWORK_HandleGNUNET_NETWORK_socket_create (int domain, int type, int protocol)
 Create a new socket. More...
 
void GNUNET_NETWORK_fdset_zero (struct GNUNET_NETWORK_FDSet *fds)
 Reset FD set (clears all file descriptors). More...
 
void GNUNET_NETWORK_fdset_set (struct GNUNET_NETWORK_FDSet *fds, const struct GNUNET_NETWORK_Handle *desc)
 Add a socket to the FD set. More...
 
int GNUNET_NETWORK_fdset_isset (const struct GNUNET_NETWORK_FDSet *fds, const struct GNUNET_NETWORK_Handle *desc)
 Check whether a socket is part of the fd set. More...
 
void GNUNET_NETWORK_fdset_add (struct GNUNET_NETWORK_FDSet *dst, const struct GNUNET_NETWORK_FDSet *src)
 Add one fd set to another (computes the union). More...
 
void GNUNET_NETWORK_fdset_copy (struct GNUNET_NETWORK_FDSet *to, const struct GNUNET_NETWORK_FDSet *from)
 Copy one fd set to another. More...
 
int GNUNET_NETWORK_get_fd (const struct GNUNET_NETWORK_Handle *desc)
 Return file descriptor for this network handle. More...
 
struct sockaddr * GNUNET_NETWORK_get_addr (const struct GNUNET_NETWORK_Handle *desc)
 Return the sockaddr for this network handle. More...
 
socklen_t GNUNET_NETWORK_get_addrlen (const struct GNUNET_NETWORK_Handle *desc)
 Return sockaddr length for this network handle. More...
 
void GNUNET_NETWORK_fdset_copy_native (struct GNUNET_NETWORK_FDSet *to, const fd_set *from, int nfds)
 Copy a native fd set into the GNUnet representation. More...
 
void GNUNET_NETWORK_fdset_set_native (struct GNUNET_NETWORK_FDSet *to, int nfd)
 Set a native fd in a set. More...
 
int GNUNET_NETWORK_fdset_test_native (const struct GNUNET_NETWORK_FDSet *to, int nfd)
 Test native fd in a set. More...
 
void GNUNET_NETWORK_fdset_handle_set (struct GNUNET_NETWORK_FDSet *fds, const struct GNUNET_DISK_FileHandle *h)
 Add a file handle to the fd set. More...
 
void GNUNET_NETWORK_fdset_handle_set_first (struct GNUNET_NETWORK_FDSet *fds, const struct GNUNET_DISK_FileHandle *h)
 Add a file handle to the fd set On W32: ensure that the handle is first in the array. More...
 
int GNUNET_NETWORK_fdset_handle_isset (const struct GNUNET_NETWORK_FDSet *fds, const struct GNUNET_DISK_FileHandle *h)
 Check if a file handle is part of an fd set. More...
 
int GNUNET_NETWORK_fdset_overlap (const struct GNUNET_NETWORK_FDSet *fds1, const struct GNUNET_NETWORK_FDSet *fds2)
 Checks if two fd sets overlap. More...
 
struct GNUNET_NETWORK_FDSetGNUNET_NETWORK_fdset_create (void)
 Creates an fd set. More...
 
void GNUNET_NETWORK_fdset_destroy (struct GNUNET_NETWORK_FDSet *fds)
 Releases the associated memory of an fd set. More...
 
int GNUNET_NETWORK_test_port_free (int ipproto, uint16_t port)
 Test if the given port is available. More...
 

Detailed Description

Basic low-level networking interface.

Function Documentation

◆ GNUNET_NETWORK_test_pf()

enum GNUNET_GenericReturnValue GNUNET_NETWORK_test_pf ( int  pf)

Test if the given protocol family is supported by this system.

Parameters
pfprotocol family to test (PF_INET, PF_INET6, PF_UNIX)
Returns
GNUNET_OK if the PF is supported

Definition at line 1 of file network.c.

80 {
81  static int cache_v4 = -1;
82  static int cache_v6 = -1;
83  static int cache_un = -1;
84  int s;
85  int ret;
86 
87  switch (pf)
88  {
89  case PF_INET:
90  if (-1 != cache_v4)
91  return cache_v4;
92  break;
93 
94  case PF_INET6:
95  if (-1 != cache_v6)
96  return cache_v6;
97  break;
98 
99 #ifdef PF_UNIX
100  case PF_UNIX:
101  if (-1 != cache_un)
102  return cache_un;
103  break;
104 #endif
105  }
106  s = socket (pf, SOCK_STREAM, 0);
107  if (-1 == s)
108  {
109  if (EAFNOSUPPORT != errno)
110  {
112  "socket");
113  return GNUNET_SYSERR;
114  }
115  ret = GNUNET_NO;
116  }
117  else
118  {
119  GNUNET_break (0 == close (s));
120  ret = GNUNET_OK;
121  }
122  switch (pf)
123  {
124  case PF_INET:
125  cache_v4 = ret;
126  break;
127 
128  case PF_INET6:
129  cache_v6 = ret;
130  break;
131 
132 #ifdef PF_UNIX
133  case PF_UNIX:
134  cache_un = ret;
135  break;
136 #endif
137  }
138  return ret;
139 }
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
@ GNUNET_OK
Definition: gnunet_common.h:95
@ GNUNET_NO
Definition: gnunet_common.h:94
@ GNUNET_SYSERR
Definition: gnunet_common.h:93
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
#define GNUNET_log_strerror(level, cmd)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
@ GNUNET_ERROR_TYPE_WARNING

Referenced by get_server_addresses(), handle_gns_result(), parse_ip_options(), run(), tcp_address_to_sockaddr_port_only(), and udp_address_to_sockaddr().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_shorten_unixpath()

char* GNUNET_NETWORK_shorten_unixpath ( char *  unixpath)

Given a unixpath that is too long (larger than UNIX_PATH_MAX), shorten it to an acceptable length while keeping it unique and making sure it remains a valid filename (if possible).

Parameters
unixpathlong path, will be freed (or same pointer returned with moved 0-termination).
Returns
shortened unixpath, NULL on error

Definition at line 143 of file network.c.

144 {
145  struct sockaddr_un dummy;
146  size_t slen;
147  char *end;
148  struct GNUNET_HashCode sh;
150  size_t upm;
151 
152  upm = sizeof(dummy.sun_path);
153  slen = strlen (unixpath);
154  if (slen < upm)
155  return unixpath; /* no shortening required */
156  GNUNET_CRYPTO_hash (unixpath, slen, &sh);
157  while (16 + strlen (unixpath) >= upm)
158  {
159  if (NULL == (end = strrchr (unixpath, '/')))
160  {
162  _ (
163  "Unable to shorten unix path `%s' while keeping name unique\n"),
164  unixpath);
165  GNUNET_free (unixpath);
166  return NULL;
167  }
168  *end = '\0';
169  }
171  ae.encoding[16] = '\0';
172  strcat (unixpath, (char *) ae.encoding);
173  return unixpath;
174 }
static int end
Set if we are to shutdown all services (including ARM).
Definition: gnunet-arm.c:34
static struct SolverHandle * sh
static struct in_addr dummy
Target "dummy" address of the packet we pretend to respond to.
#define GNUNET_log(kind,...)
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:41
void GNUNET_CRYPTO_hash_to_enc(const struct GNUNET_HashCode *block, struct GNUNET_CRYPTO_HashAsciiEncoded *result)
Convert hash to ASCII encoding.
Definition: crypto_hash.c:55
@ GNUNET_ERROR_TYPE_ERROR
#define GNUNET_free(ptr)
Wrapper around free.
#define _(String)
GNU gettext support macro.
Definition: platform.h:177
0-terminated ASCII encoding of a struct GNUNET_HashCode.
A 512-bit hashcode.

References _, dummy, GNUNET_CRYPTO_HashAsciiEncoded::encoding, end, GNUNET_CRYPTO_hash(), GNUNET_CRYPTO_hash_to_enc(), GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, and sh.

Referenced by get_server_addresses(), LEGACY_SERVICE_get_server_addresses(), and try_unixpath().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_NETWORK_unix_precheck()

void GNUNET_NETWORK_unix_precheck ( const struct sockaddr_un *  un)

If services crash, they can leave a unix domain socket file on the disk.

This needs to be manually removed, because otherwise both bind() and connect() for the respective address will fail. In this function, we test if such a left-over file exists, and if so, remove it (unless there is a listening service at the address).

Parameters
ununix domain socket address to check

Definition at line 178 of file network.c.

179 {
180  int s;
181  int eno;
182  struct stat sbuf;
183  int ret;
184 
185  s = socket (AF_UNIX, SOCK_STREAM, 0);
186  if (-1 == s)
187  {
189  "Failed to open AF_UNIX socket");
190  return;
191  }
192  ret = connect (s,
193  (struct sockaddr *) un,
194  sizeof(struct sockaddr_un));
195  eno = errno;
196  GNUNET_break (0 == close (s));
197  if (0 == ret)
198  return; /* another process is listening, do not remove! */
199  if (ECONNREFUSED != eno)
200  return; /* some other error, likely "no such file or directory" -- all well */
201  /* should unlink, but sanity checks first */
202  if (0 != stat (un->sun_path,
203  &sbuf))
204  return; /* failed to 'stat', likely does not exist after all */
205  if (S_IFSOCK != (S_IFMT & sbuf.st_mode))
206  return; /* refuse to unlink anything except sockets */
207  /* finally, really unlink */
209  "Removing left-over `%s' from previous exeuction\n",
210  un->sun_path);
211  if (0 != unlink (un->sun_path))
213  "unlink",
214  un->sun_path);
215 }
#define GNUNET_log_strerror_file(level, cmd, filename)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
@ GNUNET_ERROR_TYPE_INFO

Referenced by create_listen_socket().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_accept()

struct GNUNET_NETWORK_Handle* GNUNET_NETWORK_socket_accept ( const struct GNUNET_NETWORK_Handle desc,
struct sockaddr *  address,
socklen_t *  address_len 
)

Accept a new connection on a socket.

Configure it for non-blocking IO and mark it as non-inheritable to child processes (set the close-on-exec flag).

Parameters
descbound socket
addressaddress of the connecting peer, may be NULL
address_lenlength of address
Returns
client socket

Definition at line 391 of file network.c.

394 {
395  struct GNUNET_NETWORK_Handle *ret;
396  int eno;
397 
399 #if DEBUG_NETWORK
400  {
401  struct sockaddr_storage name;
402  socklen_t namelen = sizeof(name);
403 
404  int gsn = getsockname (desc->fd,
405  (struct sockaddr *) &name,
406  &namelen);
407 
408  if (0 == gsn)
410  "Accepting connection on `%s'\n",
411  GNUNET_a2s ((const struct sockaddr *) &name,
412  namelen));
413  }
414 #endif
415  ret->fd = accept (desc->fd,
416  address,
417  address_len);
418  if (-1 == ret->fd)
419  {
420  eno = errno;
421  GNUNET_free (ret);
422  errno = eno;
423  return NULL;
424  }
425  if (GNUNET_OK !=
427  (NULL != address) ? address->sa_family :
428  desc->af,
429  SOCK_STREAM))
430  {
431  return NULL;
432  }
433  return ret;
434 }
static char * address
GNS address for this phone.
const char * GNUNET_a2s(const struct sockaddr *addr, socklen_t addrlen)
Convert a "struct sockaddr*" (IPv4 or IPv6 address) to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static int initialize_network_handle(struct GNUNET_NETWORK_Handle *h, int af, int type)
Perform proper canonical initialization for a network handle.
Definition: network.c:335
#define LOG(kind,...)
Definition: network.c:31
const char * name
handle to a socket
Definition: network.c:53
int af
Address family / domain.
Definition: network.c:59

References address, GNUNET_NETWORK_Handle::af, GNUNET_NETWORK_Handle::fd, GNUNET_a2s(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_new, GNUNET_OK, initialize_network_handle(), LOG, name, and ret.

Referenced by accept_client(), do_accept(), GNUNET_CONNECTION_create_from_accept(), listen_cb(), and main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_box_native()

struct GNUNET_NETWORK_Handle* GNUNET_NETWORK_socket_box_native ( int  fd)

Box a native socket (and check that it is a socket).

Parameters
fdsocket to box
Returns
NULL on error (including not supported on target platform)

Definition at line 583 of file network.c.

584 {
585  struct GNUNET_NETWORK_Handle *ret;
586 
587  if (fcntl (fd, F_GETFD) < 0)
588  return NULL; /* invalid FD */
590  ret->fd = fd;
591  ret->af = AF_UNSPEC;
592  return ret;
593 }

References GNUNET_NETWORK_Handle::fd, GNUNET_new, and ret.

Referenced by extract_handles(), libgnunet_plugin_dhtu_ip_init(), scheduler_fd_cb(), and setup_service().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_set_blocking()

int GNUNET_NETWORK_socket_set_blocking ( struct GNUNET_NETWORK_Handle fd,
int  doBlock 
)

Set if a socket should use blocking or non-blocking IO.

Parameters
fdsocket
doBlockblocking mode
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 178 of file network.c.

226 {
227  int flags = fcntl (fd->fd, F_GETFL);
228 
229  if (flags == -1)
230  {
232  "fcntl");
233  return GNUNET_SYSERR;
234  }
235  if (doBlock)
236  flags &= ~O_NONBLOCK;
237 
238  else
239  flags |= O_NONBLOCK;
240  if (0 != fcntl (fd->fd,
241  F_SETFL,
242  flags))
243 
244  {
246  "fcntl");
247  return GNUNET_SYSERR;
248  }
249  return GNUNET_OK;
250 }
#define LOG_STRERROR(kind, syscall)
Definition: network.c:37

References GNUNET_break, GNUNET_ERROR_TYPE_INFO, GNUNET_ERROR_TYPE_WARNING, GNUNET_log, GNUNET_log_strerror, GNUNET_log_strerror_file, and ret.

Referenced by initialize_network_handle(), and main().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_bind()

enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_bind ( struct GNUNET_NETWORK_Handle desc,
const struct sockaddr *  address,
socklen_t  address_len 
)

Bind a socket to a particular address.

Parameters
descsocket to bind
addressaddress to be bound
address_lenlength of address
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise

Definition at line 391 of file network.c.

441 {
442  int ret;
443 
444 #ifdef IPV6_V6ONLY
445 #ifdef IPPROTO_IPV6
446  {
447  const int on = 1;
448 
449  if (AF_INET6 == desc->af)
450  if (setsockopt (desc->fd,
451  IPPROTO_IPV6,
452  IPV6_V6ONLY,
453  (const void *) &on,
454  sizeof(on)))
456  "setsockopt");
457  }
458 #endif
459 #endif
460  if (AF_UNIX == address->sa_family)
461  GNUNET_NETWORK_unix_precheck ((const struct sockaddr_un *) address);
462 
463  {
464  const int on = 1;
465 
466  if ( (SOCK_STREAM == desc->type) &&
467  (0 != setsockopt (desc->fd,
468  SOL_SOCKET,
469  SO_REUSEADDR,
470  &on, sizeof(on))) )
472  "setsockopt");
473  }
474  {
475  /* set permissions of newly created non-abstract UNIX domain socket to
476  "user-only"; applications can choose to relax this later */
477  mode_t old_mask = 0; /* assigned to make compiler happy */
478  const struct sockaddr_un *un = (const struct sockaddr_un *) address;
479  int not_abstract = 0;
480 
481  if ((AF_UNIX == address->sa_family)
482  && ('\0' != un->sun_path[0])) /* Not an abstract socket */
483  not_abstract = 1;
484  if (not_abstract)
485  old_mask = umask (S_IWGRP | S_IRGRP | S_IXGRP | S_IWOTH | S_IROTH
486  | S_IXOTH);
487 
488  ret = bind (desc->fd,
489  address,
490  address_len);
491 
492  if (not_abstract)
493  (void) umask (old_mask);
494  }
495  if (0 != ret)
496  return GNUNET_SYSERR;
497 
498  desc->addr = GNUNET_malloc (address_len);
499  GNUNET_memcpy (desc->addr, address, address_len);
500  desc->addrlen = address_len;
501 
502  return GNUNET_OK;
503 }
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_malloc(size)
Wrapper around malloc.
void GNUNET_NETWORK_unix_precheck(const struct sockaddr_un *un)
If services crash, they can leave a unix domain socket file on the disk.
Definition: network.c:178
struct sockaddr * addr
Address we were bound to, or NULL.
Definition: network.c:74
int type
Type of the socket.
Definition: network.c:64
socklen_t addrlen
Number of bytes in addr.
Definition: network.c:69

Referenced by bind_v4(), bind_v6(), create_listen_socket(), GNUNET_NAT_AUTO_test_start(), GNUNET_NAT_test_start(), GNUNET_NETWORK_test_port_free(), GNUNET_TESTING_reserve_port(), init_socket(), open_listen_socket(), open_socket(), run(), setup_sockets(), and unix_transport_server_start().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_close()

enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_close ( struct GNUNET_NETWORK_Handle desc)

Close a socket.

Parameters
descsocket to close
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise

Definition at line 391 of file network.c.

508 {
509  int ret;
510 
511  ret = close (desc->fd);
512 
513  const struct sockaddr_un *un = (const struct sockaddr_un *) desc->addr;
514 
515  /* Cleanup the UNIX domain socket and its parent directories in case of non
516  abstract sockets */
517  if ((AF_UNIX == desc->af) &&
518  (NULL != desc->addr) &&
519  ('\0' != un->sun_path[0]))
520  {
521  char *dirname = GNUNET_strndup (un->sun_path,
522  sizeof(un->sun_path));
523 
524  if (0 != unlink (dirname))
525  {
527  "unlink",
528  dirname);
529  }
530  else
531  {
532  size_t len;
533 
534  len = strlen (dirname);
535  while ((len > 0) && (dirname[len] != DIR_SEPARATOR))
536  len--;
537  dirname[len] = '\0';
538  if ((0 != len) && (0 != rmdir (dirname)))
539  {
540  switch (errno)
541  {
542  case EACCES:
543  case ENOTEMPTY:
544  case EPERM:
545  /* these are normal and can just be ignored */
546  break;
547 
548  default:
550  "rmdir",
551  dirname);
552  break;
553  }
554  }
555  }
556  GNUNET_free (dirname);
557  }
559  return (ret == 0) ? GNUNET_OK : GNUNET_SYSERR;
560 }
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
#define GNUNET_strndup(a, length)
Wrapper around GNUNET_xstrndup_.
void GNUNET_NETWORK_socket_free_memory_only_(struct GNUNET_NETWORK_Handle *desc)
Only free memory of a socket, keep the file descriptor untouched.
Definition: network.c:569
#define LOG_STRERROR_FILE(kind, syscall, filename)
Definition: network.c:32
#define DIR_SEPARATOR
Definition: platform.h:164

Referenced by accept_client(), bind_v4(), bind_v6(), cancel_aps(), cleanup_ar(), cleanup_rs(), cleanup_s5r(), connect_probe_continuation(), connection_client_destroy_impl(), create_listen_socket(), do_accept(), do_dns_read(), do_read(), do_shutdown(), do_udp_read(), finish_client_drop(), free_proto_queue(), get_lt_delete_it(), get_server_addresses(), GNUNET_CONNECTION_connect_socket(), GNUNET_CONNECTION_create_from_accept(), GNUNET_CONNECTION_create_from_connect_to_unixpath(), GNUNET_CONNECTION_destroy(), GNUNET_NAT_AUTO_test_start(), GNUNET_NAT_AUTO_test_stop(), GNUNET_NAT_test_start(), GNUNET_NAT_test_stop(), GNUNET_NETWORK_test_port_free(), GNUNET_SERVER_destroy(), GNUNET_SERVER_stop_listening(), GNUNET_TESTING_reserve_port(), init_socket(), initialize_network_handle(), kill_httpd(), LEGACY_SERVICE_get_server_addresses(), libgnunet_plugin_dhtu_ip_done(), libgnunet_plugin_transport_unix_done(), main(), mq_init(), open_listen_socket(), open_socket(), queue_destroy(), run(), server_check_ipv6_support(), setup_service(), setup_sockets(), shutdown_task(), signal_transmit_error(), stop_stun(), tcp_plugin_get_session(), tcp_send(), teardown_service(), try_connect_using_address(), try_send_tcp(), try_send_udp(), try_unixpath(), and unix_transport_server_start().

◆ GNUNET_NETWORK_socket_free_memory_only_()

void GNUNET_NETWORK_socket_free_memory_only_ ( struct GNUNET_NETWORK_Handle desc)

Only free memory of a socket, keep the file descriptor untouched.

Parameters
descsocket

Definition at line 569 of file network.c.

570 {
571  GNUNET_free (desc->addr);
572  GNUNET_free (desc);
573 }

References GNUNET_NETWORK_Handle::addr, and GNUNET_free.

Referenced by cleanup_ar(), cleanup_s5r(), destroy_task(), finish_client_drop(), and GNUNET_CONNECTION_destroy().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_connect()

enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_connect ( const struct GNUNET_NETWORK_Handle desc,
const struct sockaddr *  address,
socklen_t  address_len 
)

Connect a socket to some remote address.

Parameters
descsocket to connect
addresspeer address
address_lenof address
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise
Parameters
descsocket
addresspeer address
address_lenlength of address
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise

Definition at line 605 of file network.c.

608 {
609  int ret;
610 
611  ret = connect (desc->fd,
612  address,
613  address_len);
614 
615  return ret == 0 ? GNUNET_OK : GNUNET_SYSERR;
616 }

References address, GNUNET_NETWORK_Handle::fd, GNUNET_OK, GNUNET_SYSERR, and ret.

Referenced by GNUNET_CONNECTION_connect_socket(), GNUNET_CONNECTION_create_from_connect_to_unixpath(), main(), mq_init(), try_connect_using_address(), try_send_tcp(), and try_unixpath().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_getsockopt()

enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_getsockopt ( const struct GNUNET_NETWORK_Handle desc,
int  level,
int  optname,
void *  optval,
socklen_t *  optlen 
)

Get socket options.

Parameters
descsocket to inspect
levelprotocol level of the option
optnameidentifier of the option
optvaloptions
optlenlength of optval
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise
Parameters
descsocket
levelprotocol level of the option
optnameidentifier of the option
optvaloptions
optlenlength of optval
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise

Definition at line 630 of file network.c.

635 {
636  int ret;
637 
638  ret = getsockopt (desc->fd,
639  level,
640  optname,
641  optval, optlen);
642 
643  return ret == 0 ? GNUNET_OK : GNUNET_SYSERR;
644 }

References GNUNET_NETWORK_Handle::fd, GNUNET_OK, GNUNET_SYSERR, and ret.

Referenced by connect_probe_continuation(), select_write_cb(), and unix_plugin_get_network().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_listen()

enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_listen ( const struct GNUNET_NETWORK_Handle desc,
int  backlog 
)

Listen on a socket.

Parameters
descsocket to start listening on
backloglength of the listen queue
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise
Parameters
descsocket
backloglength of the listen queue
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise

Definition at line 655 of file network.c.

657 {
658  int ret;
659 
660  ret = listen (desc->fd,
661  backlog);
662 
663  return ret == 0 ? GNUNET_OK : GNUNET_SYSERR;
664 }

References GNUNET_NETWORK_Handle::fd, GNUNET_OK, GNUNET_SYSERR, and ret.

Referenced by create_listen_socket(), GNUNET_NAT_AUTO_test_start(), GNUNET_NAT_test_start(), init_socket(), open_listen_socket(), and run().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_recvfrom_amount()

ssize_t GNUNET_NETWORK_socket_recvfrom_amount ( const struct GNUNET_NETWORK_Handle desc)

How much data is available to be read on this descriptor?

Parameters
descsocket
Returns
GNUNET_SYSERR if no data is available, or on error!

Definition at line 674 of file network.c.

675 {
676  int error;
677 
678  /* How much is there to be read? */
679  int pending;
680 
681  error = ioctl (desc->fd,
682  FIONREAD,
683  &pending);
684  if (0 == error)
685  return (ssize_t) pending;
686  return GNUNET_SYSERR;
687 }
static unsigned int pending
The number of queries that are outstanding.

References GNUNET_NETWORK_Handle::fd, GNUNET_SYSERR, and pending.

Referenced by read_dns4(), read_dns6(), and stun_read_task().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_recvfrom()

ssize_t GNUNET_NETWORK_socket_recvfrom ( const struct GNUNET_NETWORK_Handle desc,
void *  buffer,
size_t  length,
struct sockaddr *  src_addr,
socklen_t *  addrlen 
)

Read data from a socket (always non-blocking).

Parameters
descsocket
bufferbuffer
lengthlength of buffer
src_addreither the source to recv from, or all zeroes to be filled in by recvfrom
addrlenlength of the addr
descsocket
bufferbuffer
lengthlength of buffer
src_addreither the source to recv from, or all zeroes to be filled in by recvfrom
addrlenlength of the src_addr

Definition at line 701 of file network.c.

706 {
707  int flags = 0;
708 
709 #ifdef MSG_DONTWAIT
710  flags |= MSG_DONTWAIT;
711 #endif
712  return recvfrom (desc->fd,
713  buffer,
714  length,
715  flags,
716  src_addr,
717  addrlen);
718 }

References GNUNET_NETWORK_Handle::addrlen, and GNUNET_NETWORK_Handle::fd.

Referenced by do_dns_read(), read_dns4(), read_dns6(), select_read_cb(), sock_read(), stun_read_task(), udp_select_read(), and unix_plugin_do_read().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_recv()

ssize_t GNUNET_NETWORK_socket_recv ( const struct GNUNET_NETWORK_Handle desc,
void *  buffer,
size_t  length 
)

Read data from a connected socket (always non-blocking).

Parameters
descsocket
bufferbuffer
lengthlength of buffer
Returns
number of bytes read
Parameters
descsocket
bufferbuffer
lengthlength of buffer
Returns
number of bytes received, -1 on error

Definition at line 730 of file network.c.

733 {
734  int ret;
735  int flags;
736 
737  flags = 0;
738 
739 #ifdef MSG_DONTWAIT
740  flags |= MSG_DONTWAIT;
741 #endif
742  ret = recv (desc->fd,
743  buffer,
744  length,
745  flags);
746  return ret;
747 }

References GNUNET_NETWORK_Handle::fd, and ret.

Referenced by do_read(), do_s5r_read(), do_udp_read(), GNUNET_MST_read(), proto_read_kx(), queue_read(), queue_read_kx(), and receive_ready().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_select()

int GNUNET_NETWORK_socket_select ( struct GNUNET_NETWORK_FDSet rfds,
struct GNUNET_NETWORK_FDSet wfds,
struct GNUNET_NETWORK_FDSet efds,
const struct GNUNET_TIME_Relative  timeout 
)

Check if sockets meet certain conditions.

Parameters
rfdsset of sockets to be checked for readability
wfdsset of sockets to be checked for writability
efdsset of sockets to be checked for exceptions
timeoutrelative value when to return
Returns
number of selected sockets, GNUNET_SYSERR on error

Check if sockets meet certain conditions.

Parameters
rfdsset of sockets or pipes to be checked for readability
wfdsset of sockets or pipes to be checked for writability
efdsset of sockets or pipes to be checked for exceptions
timeoutrelative value when to return
Returns
number of selected sockets or pipes, GNUNET_SYSERR on error

Definition at line 1282 of file network.c.

1286 {
1287  int nfds;
1288  struct timeval tv;
1289 
1290  if (NULL != rfds)
1291  nfds = rfds->nsds;
1292  else
1293  nfds = 0;
1294  if (NULL != wfds)
1295  nfds = GNUNET_MAX (nfds,
1296  wfds->nsds);
1297  if (NULL != efds)
1298  nfds = GNUNET_MAX (nfds,
1299  efds->nsds);
1300  if ((0 == nfds) &&
1302  {
1303  GNUNET_break (0);
1305  _ (
1306  "Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"),
1307  "select");
1308  }
1309  if (timeout.rel_value_us / GNUNET_TIME_UNIT_SECONDS.rel_value_us > (unsigned
1310  long long)
1311  LONG_MAX)
1312  {
1313  tv.tv_sec = LONG_MAX;
1314  tv.tv_usec = 999999L;
1315  }
1316  else
1317  {
1318  tv.tv_sec = (long) (timeout.rel_value_us
1319  / GNUNET_TIME_UNIT_SECONDS.rel_value_us);
1320  tv.tv_usec =
1322  - (tv.tv_sec * GNUNET_TIME_UNIT_SECONDS.rel_value_us));
1323  }
1324  return select (nfds,
1325  (NULL != rfds) ? &rfds->sds : NULL,
1326  (NULL != wfds) ? &wfds->sds : NULL,
1327  (NULL != efds) ? &efds->sds : NULL,
1328  (timeout.rel_value_us ==
1329  GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us) ? NULL : &tv);
1330 }
static struct GNUNET_TIME_Relative timeout
Desired timeout for the lookup (default is no timeout).
Definition: gnunet-abd.c:61
#define GNUNET_MAX(a, b)
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
#define GNUNET_TIME_UNIT_SECONDS
One second.
int nsds
Maximum number of any socket descriptor in the set (plus one)
fd_set sds
Bitset with the descriptors.
uint64_t rel_value_us
The actual value.

References _, GNUNET_break, GNUNET_ERROR_TYPE_ERROR, GNUNET_MAX, GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_TIME_UNIT_SECONDS, LOG, GNUNET_NETWORK_FDSet::nsds, GNUNET_TIME_Relative::rel_value_us, GNUNET_NETWORK_FDSet::sds, and timeout.

Referenced by main(), and select_loop().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_send()

ssize_t GNUNET_NETWORK_socket_send ( const struct GNUNET_NETWORK_Handle desc,
const void *  buffer,
size_t  length 
)

Send data (always non-blocking).

Parameters
descsocket
bufferdata to send
lengthsize of the buffer
Returns
number of bytes sent, GNUNET_SYSERR on error
Parameters
descsocket
bufferdata to send
lengthsize of the buffer
Returns
number of bytes sent, GNUNET_SYSERR on error

Definition at line 759 of file network.c.

762 {
763  int ret;
764  int flags;
765 
766  flags = 0;
767 #ifdef MSG_DONTWAIT
768  flags |= MSG_DONTWAIT;
769 #endif
770 #ifdef MSG_NOSIGNAL
771  flags |= MSG_NOSIGNAL;
772 #endif
773  ret = send (desc->fd,
774  buffer,
775  length,
776  flags);
777  return ret;
778 }

References GNUNET_NETWORK_Handle::fd, and ret.

Referenced by do_send(), do_write(), main(), queue_write(), tcp_send(), and transmit_ready().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_sendto()

ssize_t GNUNET_NETWORK_socket_sendto ( const struct GNUNET_NETWORK_Handle desc,
const void *  message,
size_t  length,
const struct sockaddr *  dest_addr,
socklen_t  dest_len 
)

Send data to a particular destination (always non-blocking).

This function only works for UDP sockets.

Parameters
descsocket
messagedata to send
lengthsize of the data in message
dest_addrdestination address
dest_lenlength of dest_addr
Returns
number of bytes sent, GNUNET_SYSERR on error

This function only works for UDP sockets.

Parameters
descsocket
messagedata to send
lengthsize of the message
dest_addrdestination address
dest_lenlength of address
Returns
number of bytes sent, GNUNET_SYSERR on error

Definition at line 793 of file network.c.

798 {
799  int flags = 0;
800 
801 #ifdef MSG_DONTWAIT
802  flags |= MSG_DONTWAIT;
803 #endif
804 #ifdef MSG_NOSIGNAL
805  flags |= MSG_NOSIGNAL;
806 #endif
807  return sendto (desc->fd,
808  message,
809  length,
810  flags,
811  dest_addr,
812  dest_len);
813 }

References GNUNET_NETWORK_Handle::fd.

Referenced by ifc_broadcast(), ip_send(), mq_send_d(), mq_send_kx(), select_write_cb(), send_response(), send_UDPRekey(), stun_dns_callback(), transmit_query(), try_send_udp(), udp_ipv4_broadcast_send(), udp_ipv6_broadcast_send(), udp_select_send(), and unix_plugin_get_network().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_setsockopt()

int GNUNET_NETWORK_socket_setsockopt ( struct GNUNET_NETWORK_Handle fd,
int  level,
int  option_name,
const void *  option_value,
socklen_t  option_len 
)

Set socket option.

Parameters
fdsocket
levelprotocol level of the option
option_nameoption identifier
option_valuevalue to set
option_lensize of option_value
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise

Definition at line 827 of file network.c.

832 {
833  return (0 == setsockopt (fd->fd,
834  level,
835  option_name,
836  option_value,
837  option_len))
838  ? GNUNET_OK
839  : GNUNET_SYSERR;
840 }

References GNUNET_NETWORK_Handle::fd, GNUNET_OK, and GNUNET_SYSERR.

Referenced by bi_destroy(), create_listen_socket(), iface_proc(), ifc_broadcast(), libgnunet_plugin_transport_tcp_init(), select_write_cb(), setup_broadcast(), tcp_plugin_get_session(), and unix_plugin_get_network().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_shutdown()

enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_shutdown ( struct GNUNET_NETWORK_Handle desc,
int  how 
)

Shut down socket operations.

Parameters
descsocket
howtype of shutdown
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise

Definition at line 882 of file network.c.

884 {
885  int ret;
886 
887  ret = shutdown (desc->fd, how);
888 
889  return (0 == ret) ? GNUNET_OK : GNUNET_SYSERR;
890 }

References GNUNET_NETWORK_Handle::fd, GNUNET_OK, GNUNET_SYSERR, and ret.

Referenced by GNUNET_CONNECTION_create_from_accept(), GNUNET_CONNECTION_destroy(), signal_transmit_error(), and tcp_send().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_disable_corking()

enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_disable_corking ( struct GNUNET_NETWORK_Handle desc)

Disable the "CORK" feature for communication with the given socket, forcing the OS to immediately flush the buffer on transmission instead of potentially buffering multiple messages.

Essentially reduces the OS send buffers to zero.

Parameters
descsocket
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise

Definition at line 903 of file network.c.

904 {
905  int ret = 0;
906 
907 #ifdef __linux__
908  int value = 0;
909 
910  if (0 !=
911  (ret =
912  setsockopt (desc->fd,
913  SOL_SOCKET,
914  SO_SNDBUF,
915  &value,
916  sizeof(value))))
918  "setsockopt");
919  if (0 !=
920  (ret =
921  setsockopt (desc->fd,
922  SOL_SOCKET,
923  SO_RCVBUF,
924  &value,
925  sizeof(value))))
927  "setsockopt");
928 #endif
929  return ret == 0 ? GNUNET_OK : GNUNET_SYSERR;
930 }
static char * value
Value of the record to add/remove.

References GNUNET_NETWORK_Handle::fd, GNUNET_ERROR_TYPE_WARNING, GNUNET_OK, GNUNET_SYSERR, LOG_STRERROR, ret, and value.

Referenced by GNUNET_CONNECTION_disable_corking().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_create()

struct GNUNET_NETWORK_Handle* GNUNET_NETWORK_socket_create ( int  domain,
int  type,
int  protocol 
)

Create a new socket.

Configure it for non-blocking IO and mark it as non-inheritable to child processes (set the close-on-exec flag).

Parameters
domaindomain of the socket
typesocket type
protocolnetwork protocol
Returns
new socket, NULL on error

Definition at line 854 of file network.c.

857 {
858  struct GNUNET_NETWORK_Handle *ret;
859  int fd;
860 
861  fd = socket (domain, type, protocol);
862  if (-1 == fd)
863  return NULL;
865  ret->fd = fd;
866  if (GNUNET_OK !=
868  domain,
869  type))
870  return NULL;
871  return ret;
872 }
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model

References GNUNET_NETWORK_Handle::fd, GNUNET_new, GNUNET_OK, initialize_network_handle(), ret, and type.

Referenced by bind_v4(), bind_v6(), create_listen_socket(), get_server_addresses(), GNUNET_CONNECTION_create_from_connect_to_unixpath(), GNUNET_CONNECTION_create_from_sockaddr(), GNUNET_NAT_AUTO_test_start(), GNUNET_NAT_test_start(), GNUNET_NETWORK_test_port_free(), GNUNET_TESTING_reserve_port(), init_socket(), LEGACY_SERVICE_get_server_addresses(), main(), mq_init(), open_listen_socket(), open_socket(), run(), server_check_ipv6_support(), setup_sockets(), tcp_plugin_get_session(), try_connect_using_address(), try_send_tcp(), try_send_udp(), try_unixpath(), and unix_transport_server_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_NETWORK_fdset_zero()

void GNUNET_NETWORK_fdset_zero ( struct GNUNET_NETWORK_FDSet fds)

Reset FD set (clears all file descriptors).

Parameters
fdsfd set to clear

Reset FD set (clears all file descriptors).

Parameters
fdsfd set

Definition at line 939 of file network.c.

940 {
941  FD_ZERO (&fds->sds);
942  fds->nsds = 0;
943 }

References GNUNET_NETWORK_FDSet::nsds, and GNUNET_NETWORK_FDSet::sds.

Referenced by GNUNET_NETWORK_fdset_create(), GNUNET_SCHEDULER_do_work(), main(), and select_loop().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_fdset_set()

void GNUNET_NETWORK_fdset_set ( struct GNUNET_NETWORK_FDSet fds,
const struct GNUNET_NETWORK_Handle desc 
)

Add a socket to the FD set.

Parameters
fdsfd set
descsocket to add

Definition at line 953 of file network.c.

955 {
956  FD_SET (desc->fd,
957  &fds->sds);
958  fds->nsds = GNUNET_MAX (fds->nsds,
959  desc->fd + 1);
960 }

References GNUNET_NETWORK_Handle::fd, GNUNET_MAX, GNUNET_NETWORK_FDSet::nsds, and GNUNET_NETWORK_FDSet::sds.

Referenced by GNUNET_SERVER_resume(), main(), and schedule_read().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_fdset_isset()

int GNUNET_NETWORK_fdset_isset ( const struct GNUNET_NETWORK_FDSet fds,
const struct GNUNET_NETWORK_Handle desc 
)

Check whether a socket is part of the fd set.

Parameters
fdsfd set
descsocket
Returns
GNUNET_YES if the socket is in the set
Parameters
fdsfd set
descsocket
Returns
0 if the FD is not set

Definition at line 971 of file network.c.

973 {
974  return FD_ISSET (desc->fd,
975  &fds->sds);
976 }

References GNUNET_NETWORK_Handle::fd, and GNUNET_NETWORK_FDSet::sds.

Referenced by do_read(), do_s5r_read(), do_udp_read(), main(), process_listen_socket(), read_response(), receive_ready(), tcp_send(), transmit_ready(), udp_plugin_select_v4(), and udp_plugin_select_v6().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_fdset_add()

void GNUNET_NETWORK_fdset_add ( struct GNUNET_NETWORK_FDSet dst,
const struct GNUNET_NETWORK_FDSet src 
)

Add one fd set to another (computes the union).

Parameters
dstthe fd set to add to
srcthe fd set to add from

Add one fd set to another (computes the union).

Parameters
dstthe fd set to add to
srcthe fd set to add from

Definition at line 986 of file network.c.

988 {
989  int nfds;
990 
991  for (nfds = src->nsds; nfds >= 0; nfds--)
992  if (FD_ISSET (nfds, &src->sds))
993  FD_SET (nfds, &dst->sds);
994  dst->nsds = GNUNET_MAX (dst->nsds,
995  src->nsds);
996 }

References GNUNET_MAX, GNUNET_NETWORK_FDSet::nsds, and GNUNET_NETWORK_FDSet::sds.

◆ GNUNET_NETWORK_fdset_copy()

void GNUNET_NETWORK_fdset_copy ( struct GNUNET_NETWORK_FDSet to,
const struct GNUNET_NETWORK_FDSet from 
)

Copy one fd set to another.

Parameters
todestination
fromsource

Definition at line 1006 of file network.c.

1008 {
1009  FD_COPY (&from->sds,
1010  &to->sds);
1011  to->nsds = from->nsds;
1012 }
#define FD_COPY(s, d)
Definition: network.c:219

References FD_COPY, GNUNET_NETWORK_FDSet::nsds, and GNUNET_NETWORK_FDSet::sds.

◆ GNUNET_NETWORK_get_fd()

int GNUNET_NETWORK_get_fd ( const struct GNUNET_NETWORK_Handle desc)

Return file descriptor for this network handle.

Parameters
descwrapper to process
Returns
POSIX file descriptor

Definition at line 1022 of file network.c.

1023 {
1024  return desc->fd;
1025 }

References GNUNET_NETWORK_Handle::fd.

Referenced by add_without_sets(), do_accept(), do_dns_read(), GNUNET_CONNECTION_create_from_accept(), GNUNET_SCHEDULER_add_net_with_priority(), init_fd_info(), init_socket(), mhd_connection_cb(), queue_destroy(), read_cb(), run(), setup_data_transfer(), and start_process().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_get_addr()

struct sockaddr* GNUNET_NETWORK_get_addr ( const struct GNUNET_NETWORK_Handle desc)

Return the sockaddr for this network handle.

Parameters
descwrapper to process
Returns
POSIX file descriptor

Return the sockaddr for this network handle.

Parameters
descwrapper to process
Returns
sockaddr

Definition at line 1035 of file network.c.

1036 {
1037  return desc->addr;
1038 }

References GNUNET_NETWORK_Handle::addr.

Referenced by do_accept(), and setup_data_transfer().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_get_addrlen()

socklen_t GNUNET_NETWORK_get_addrlen ( const struct GNUNET_NETWORK_Handle desc)

Return sockaddr length for this network handle.

Parameters
descwrapper to process
Returns
socklen_t for sockaddr

Definition at line 1048 of file network.c.

1049 {
1050  return desc->addrlen;
1051 }

References GNUNET_NETWORK_Handle::addrlen.

Referenced by do_accept(), and setup_data_transfer().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_fdset_copy_native()

void GNUNET_NETWORK_fdset_copy_native ( struct GNUNET_NETWORK_FDSet to,
const fd_set *  from,
int  nfds 
)

Copy a native fd set into the GNUnet representation.

Parameters
todestination
fromnative source set
nfdsthe biggest socket number in from + 1

Copy a native fd set into the GNUnet representation.

Parameters
todestination
fromnative source set
nfdsthe biggest socket number in from + 1

Definition at line 1062 of file network.c.

1065 {
1066  FD_COPY (from,
1067  &to->sds);
1068  to->nsds = nfds;
1069 }

References FD_COPY, GNUNET_NETWORK_FDSet::nsds, and GNUNET_NETWORK_FDSet::sds.

Referenced by client_schedule(), context_task(), curl_download_prepare(), download_prepare(), prepare_daemon(), run_httpd(), schedule_httpd(), and server_schedule().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_fdset_set_native()

void GNUNET_NETWORK_fdset_set_native ( struct GNUNET_NETWORK_FDSet to,
int  nfd 
)

Set a native fd in a set.

Parameters
todestination
nfdnative FD to set

Definition at line 1079 of file network.c.

1081 {
1082  GNUNET_assert ((nfd >= 0) && (nfd < FD_SETSIZE));
1083  FD_SET (nfd, &to->sds);
1084  to->nsds = GNUNET_MAX (nfd + 1,
1085  to->nsds);
1086 }
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.

References GNUNET_assert, GNUNET_MAX, GNUNET_NETWORK_FDSet::nsds, and GNUNET_NETWORK_FDSet::sds.

Referenced by GNUNET_SCHEDULER_do_work(), listen_stdio(), and select_loop().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_fdset_test_native()

int GNUNET_NETWORK_fdset_test_native ( const struct GNUNET_NETWORK_FDSet to,
int  nfd 
)

Test native fd in a set.

Parameters
toset to test, NULL for empty set
nfdnative FD to test, -1 for none
Returns
GNUNET_YES if to contains nfd
Parameters
toset to test, NULL for empty set
nfdnative FD to test, or -1 for none
Returns
GNUNET_YES if FD is set in the set

Definition at line 1097 of file network.c.

1099 {
1100  if ((-1 == nfd) ||
1101  (NULL == to))
1102  return GNUNET_NO;
1103  return FD_ISSET (nfd, &to->sds) ? GNUNET_YES : GNUNET_NO;
1104 }
@ GNUNET_YES
Definition: gnunet_common.h:97

References GNUNET_NO, GNUNET_YES, and GNUNET_NETWORK_FDSet::sds.

Referenced by extract_handles(), and select_loop().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_fdset_handle_set()

void GNUNET_NETWORK_fdset_handle_set ( struct GNUNET_NETWORK_FDSet fds,
const struct GNUNET_DISK_FileHandle h 
)

Add a file handle to the fd set.

Parameters
fdsfd set
hthe file handle to add

Definition at line 1113 of file network.c.

1115 {
1116  int fd;
1117 
1120  &fd,
1121  sizeof(int)));
1122  FD_SET (fd,
1123  &fds->sds);
1124  fds->nsds = GNUNET_MAX (fd + 1,
1125  fds->nsds);
1126 }
enum GNUNET_GenericReturnValue GNUNET_DISK_internal_file_handle_(const struct GNUNET_DISK_FileHandle *fh, void *dst, size_t dst_len)
Retrieve OS file handle.
Definition: disk.c:1633
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99

References GNUNET_assert, GNUNET_DISK_internal_file_handle_(), GNUNET_MAX, GNUNET_OK, h, GNUNET_NETWORK_FDSet::nsds, and GNUNET_NETWORK_FDSet::sds.

Referenced by GNUNET_NETWORK_fdset_handle_set_first(), GNUNET_SCHEDULER_driver_init(), and main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_NETWORK_fdset_handle_set_first()

void GNUNET_NETWORK_fdset_handle_set_first ( struct GNUNET_NETWORK_FDSet fds,
const struct GNUNET_DISK_FileHandle h 
)

Add a file handle to the fd set On W32: ensure that the handle is first in the array.

Parameters
fdsfd set
hthe file handle to add

Add a file handle to the fd set On W32: ensure that the handle is first in the array.

Parameters
fdsfd set
hthe file handle to add

Definition at line 1135 of file network.c.

1137 {
1139 }
void GNUNET_NETWORK_fdset_handle_set(struct GNUNET_NETWORK_FDSet *fds, const struct GNUNET_DISK_FileHandle *h)
Add a file handle to the fd set.
Definition: network.c:1113

References GNUNET_NETWORK_fdset_handle_set(), and h.

Here is the call graph for this function:

◆ GNUNET_NETWORK_fdset_handle_isset()

int GNUNET_NETWORK_fdset_handle_isset ( const struct GNUNET_NETWORK_FDSet fds,
const struct GNUNET_DISK_FileHandle h 
)

Check if a file handle is part of an fd set.

Parameters
fdsfd set
hfile handle
Returns
GNUNET_YES if the file handle is part of the set

Definition at line 1150 of file network.c.

1152 {
1153  return FD_ISSET (h->fd,
1154  &fds->sds);
1155 }

References h, and GNUNET_NETWORK_FDSet::sds.

Referenced by cmd_read().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_fdset_overlap()

int GNUNET_NETWORK_fdset_overlap ( const struct GNUNET_NETWORK_FDSet fds1,
const struct GNUNET_NETWORK_FDSet fds2 
)

Checks if two fd sets overlap.

Parameters
fds1first fd set
fds2second fd set
Returns
GNUNET_YES if they do overlap, GNUNET_NO otherwise

Definition at line 1166 of file network.c.

1168 {
1169  int nfds;
1170 
1171  nfds = GNUNET_MIN (fds1->nsds,
1172  fds2->nsds);
1173  while (nfds > 0)
1174  {
1175  nfds--;
1176  if ((FD_ISSET (nfds,
1177  &fds1->sds)) &&
1178  (FD_ISSET (nfds,
1179  &fds2->sds)))
1180  return GNUNET_YES;
1181  }
1182  return GNUNET_NO;
1183 }
#define GNUNET_MIN(a, b)

References GNUNET_MIN, GNUNET_NO, GNUNET_YES, GNUNET_NETWORK_FDSet::nsds, and GNUNET_NETWORK_FDSet::sds.

◆ GNUNET_NETWORK_fdset_create()

struct GNUNET_NETWORK_FDSet* GNUNET_NETWORK_fdset_create ( void  )

Creates an fd set.

Returns
a new fd set

Definition at line 1192 of file network.c.

1193 {
1194  struct GNUNET_NETWORK_FDSet *fds;
1195 
1196  fds = GNUNET_new (struct GNUNET_NETWORK_FDSet);
1198  return fds;
1199 }
void GNUNET_NETWORK_fdset_zero(struct GNUNET_NETWORK_FDSet *fds)
Reset FD set.
Definition: network.c:939
collection of IO descriptors

References GNUNET_NETWORK_fdset_zero(), and GNUNET_new.

Referenced by client_schedule(), context_task(), curl_download_prepare(), download_prepare(), GNUNET_SCHEDULER_driver_init(), GNUNET_SERVER_resume(), listen_stdio(), main(), prepare_daemon(), run_httpd(), schedule_httpd(), schedule_read(), select_loop(), and server_schedule().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_NETWORK_fdset_destroy()

void GNUNET_NETWORK_fdset_destroy ( struct GNUNET_NETWORK_FDSet fds)

Releases the associated memory of an fd set.

Parameters
fdsfd set

Definition at line 1208 of file network.c.

1209 {
1210  GNUNET_free (fds);
1211 }

References GNUNET_free.

Referenced by client_schedule(), context_task(), curl_download_prepare(), download_prepare(), GNUNET_SCHEDULER_driver_done(), GNUNET_SERVER_resume(), listen_stdio(), prepare_daemon(), run_httpd(), schedule_httpd(), schedule_read(), select_loop(), and server_schedule().

Here is the caller graph for this function:

◆ GNUNET_NETWORK_test_port_free()

int GNUNET_NETWORK_test_port_free ( int  ipproto,
uint16_t  port 
)

Test if the given port is available.

Parameters
ipprototransport protocol to test (e.g. IPPROTO_TCP)
portport number to test
Returns
GNUNET_OK if the port is available, GNUNET_NO if not

Definition at line 1222 of file network.c.

1224 {
1225  struct GNUNET_NETWORK_Handle *socket;
1226  int bind_status;
1227  int socktype;
1228  char open_port_str[6];
1229  struct addrinfo hint;
1230  struct addrinfo *ret;
1231  struct addrinfo *ai;
1232 
1233  GNUNET_snprintf (open_port_str,
1234  sizeof(open_port_str),
1235  "%u",
1236  (unsigned int) port);
1237  socktype = (IPPROTO_TCP == ipproto) ? SOCK_STREAM : SOCK_DGRAM;
1238  ret = NULL;
1239  memset (&hint, 0, sizeof(hint));
1240  hint.ai_family = AF_UNSPEC; /* IPv4 and IPv6 */
1241  hint.ai_socktype = socktype;
1242  hint.ai_protocol = ipproto;
1243  hint.ai_addrlen = 0;
1244  hint.ai_addr = NULL;
1245  hint.ai_canonname = NULL;
1246  hint.ai_next = NULL;
1247  hint.ai_flags = AI_PASSIVE | AI_NUMERICSERV; /* Wild card address */
1248  GNUNET_assert (0 == getaddrinfo (NULL,
1249  open_port_str,
1250  &hint,
1251  &ret));
1252  bind_status = GNUNET_NO;
1253  for (ai = ret; NULL != ai; ai = ai->ai_next)
1254  {
1255  socket = GNUNET_NETWORK_socket_create (ai->ai_family,
1256  ai->ai_socktype,
1257  ai->ai_protocol);
1258  if (NULL == socket)
1259  continue;
1260  bind_status = GNUNET_NETWORK_socket_bind (socket,
1261  ai->ai_addr,
1262  ai->ai_addrlen);
1263  GNUNET_NETWORK_socket_close (socket);
1264  if (GNUNET_OK != bind_status)
1265  break;
1266  }
1267  freeaddrinfo (ret);
1268  return bind_status;
1269 }
static uint16_t port
Port number.
Definition: gnunet-bcd.c:147
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_close(struct GNUNET_NETWORK_Handle *desc)
Close a socket.
Definition: network.c:507
struct GNUNET_NETWORK_Handle * GNUNET_NETWORK_socket_create(int domain, int type, int protocol)
Create a new socket.
Definition: network.c:854
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_bind(struct GNUNET_NETWORK_Handle *desc, const struct sockaddr *address, socklen_t address_len)
Bind a socket to a particular address.
Definition: network.c:438
#define AI_NUMERICSERV
AI_NUMERICSERV not defined in windows.
Definition: platform.h:218

References ai, AI_NUMERICSERV, GNUNET_assert, GNUNET_NETWORK_socket_bind(), GNUNET_NETWORK_socket_close(), GNUNET_NETWORK_socket_create(), GNUNET_NO, GNUNET_OK, GNUNET_snprintf(), port, and ret.

Here is the call graph for this function: