GNUnet  0.10.x
Data Structures | Functions
Network library

Basic low-level networking interface. More...

Data Structures

struct  GNUNET_NETWORK_FDSet
 collection of IO descriptors More...
 

Functions

int 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 (SOCKTYPE 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...
 
int 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...
 
int 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...
 
int 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...
 
int GNUNET_NETWORK_socket_getsockopt (const struct GNUNET_NETWORK_Handle *desc, int level, int optname, void *optval, socklen_t *optlen)
 Get socket options. More...
 
int 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...
 
int GNUNET_NETWORK_socket_shutdown (struct GNUNET_NETWORK_Handle *desc, int how)
 Shut down socket operations. More...
 
int 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()

int 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 78 of file network.c.

References GNUNET_ERROR_TYPE_WARNING, GNUNET_log_strerror, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, and ret.

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

79 {
80  static int cache_v4 = -1;
81  static int cache_v6 = -1;
82  static int cache_un = -1;
83  int s;
84  int ret;
85 
86  switch (pf)
87  {
88  case PF_INET:
89  if (-1 != cache_v4)
90  return cache_v4;
91  break;
92 
93  case PF_INET6:
94  if (-1 != cache_v6)
95  return cache_v6;
96  break;
97 
98 #ifdef PF_UNIX
99  case PF_UNIX:
100  if (-1 != cache_un)
101  return cache_un;
102  break;
103 #endif
104  }
105  s = socket(pf, SOCK_STREAM, 0);
106  if (-1 == s)
107  {
108  if (EAFNOSUPPORT != errno)
109  {
111  "socket");
112  return GNUNET_SYSERR;
113  }
114  ret = GNUNET_NO;
115  }
116  else
117  {
118  close(s);
119  ret = GNUNET_OK;
120  }
121  switch (pf)
122  {
123  case PF_INET:
124  cache_v4 = ret;
125  break;
126 
127  case PF_INET6:
128  cache_v6 = ret;
129  break;
130 
131 #ifdef PF_UNIX
132  case PF_UNIX:
133  cache_un = ret;
134  break;
135 #endif
136  }
137  return ret;
138 }
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static int ret
Final status code.
Definition: gnunet-arm.c:89
#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...
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
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 151 of file network.c.

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

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

152 {
153  struct sockaddr_un dummy;
154  size_t slen;
155  char *end;
156  struct GNUNET_HashCode sh;
158  size_t upm;
159 
160  upm = sizeof(dummy.sun_path);
161  slen = strlen(unixpath);
162  if (slen < upm)
163  return unixpath; /* no shortening required */
164  GNUNET_CRYPTO_hash(unixpath, slen, &sh);
165  while (16 + strlen(unixpath) >= upm)
166  {
167  if (NULL == (end = strrchr(unixpath, '/')))
168  {
170  _("Unable to shorten unix path `%s' while keeping name unique\n"),
171  unixpath);
172  GNUNET_free(unixpath);
173  return NULL;
174  }
175  *end = '\0';
176  }
178  ae.encoding[16] = '\0';
179  strcat(unixpath, (char *)ae.encoding);
180  return unixpath;
181 }
static int end
Set if we are to shutdown all services (including ARM).
Definition: gnunet-arm.c:34
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:44
static struct SolverHandle * sh
A 512-bit hashcode.
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:69
0-terminated ASCII encoding of a struct GNUNET_HashCode.
static struct in_addr dummy
Target "dummy" address of the packet we pretend to respond to.
#define GNUNET_log(kind,...)
#define GNUNET_free(ptr)
Wrapper around free.
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 194 of file network.c.

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

Referenced by create_listen_socket(), and GNUNET_NETWORK_socket_bind().

195 {
196  int s;
197  int eno;
198  struct stat sbuf;
199  int ret;
200 
201  s = socket(AF_UNIX, SOCK_STREAM, 0);
202  if (-1 == s)
203  {
205  "Failed to open AF_UNIX socket");
206  return;
207  }
208  ret = connect(s,
209  (struct sockaddr *)un,
210  sizeof(struct sockaddr_un));
211  eno = errno;
212  GNUNET_break(0 == close(s));
213  if (0 == ret)
214  return; /* another process is listening, do not remove! */
215  if (ECONNREFUSED != eno)
216  return; /* some other error, likely "no such file or directory" -- all well */
217  /* should unlink, but sanity checks first */
218  if (0 != stat(un->sun_path,
219  &sbuf))
220  return; /* failed to 'stat', likely does not exist after all */
221  if (S_IFSOCK != (S_IFMT & sbuf.st_mode))
222  return; /* refuse to unlink anything except sockets */
223  /* finally, really unlink */
225  "Removing left-over `%s' from previous exeuction\n",
226  un->sun_path);
227  if (0 != unlink(un->sun_path))
229  "unlink",
230  un->sun_path);
231 }
static int ret
Final status code.
Definition: gnunet-arm.c:89
#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 &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; with the mess...
#define GNUNET_log_strerror_file(level, cmd, filename)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; with the mess...
#define GNUNET_log(kind,...)
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

Accept a new connection on a socket.

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

Definition at line 420 of file network.c.

References 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().

423 {
424  struct GNUNET_NETWORK_Handle *ret;
425  int eno;
426 
427  ret = GNUNET_new(struct GNUNET_NETWORK_Handle);
428 #if DEBUG_NETWORK
429  {
430  struct sockaddr_storage name;
431  socklen_t namelen = sizeof(name);
432 
433  int gsn = getsockname(desc->fd,
434  (struct sockaddr *)&name,
435  &namelen);
436 
437  if (0 == gsn)
439  "Accepting connection on `%s'\n",
440  GNUNET_a2s((const struct sockaddr *)&name,
441  namelen));
442  }
443 #endif
444  ret->fd = accept(desc->fd,
445  address,
446  address_len);
447  if (-1 == ret->fd)
448  {
449  eno = errno;
450  GNUNET_free(ret);
451  errno = eno;
452  return NULL;
453  }
454  if (GNUNET_OK !=
456  (NULL != address) ? address->sa_family : desc->af,
457  SOCK_STREAM))
458  {
459  return NULL;
460  }
461  return ret;
462 }
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:356
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static int ret
Final status code.
Definition: gnunet-arm.c:89
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)...
const char * name
#define LOG(kind,...)
Definition: network.c:31
handle to a socket
Definition: network.c:46
int af
Address family / domain.
Definition: network.c:52
static char * address
GNS address for this phone.
#define GNUNET_free(ptr)
Wrapper around free.
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 ( SOCKTYPE  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 624 of file network.c.

References GNUNET_NETWORK_Handle::af, GNUNET_NETWORK_Handle::fd, GNUNET_new, and ret.

Referenced by extract_handles(), and setup_service().

625 {
626  struct GNUNET_NETWORK_Handle *ret;
627 
628  if (fcntl(fd, F_GETFD) < 0)
629  return NULL; /* invalid FD */
630  ret = GNUNET_new(struct GNUNET_NETWORK_Handle);
631  ret->fd = fd;
632  ret->af = AF_UNSPEC;
633  return ret;
634 }
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static int ret
Final status code.
Definition: gnunet-arm.c:89
handle to a socket
Definition: network.c:46
int af
Address family / domain.
Definition: network.c:52
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 247 of file network.c.

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

Referenced by initialize_network_handle(), and main().

249 {
250  int flags = fcntl(fd->fd, F_GETFL);
251 
252  if (flags == -1)
253  {
255  "fcntl");
256  return GNUNET_SYSERR;
257  }
258  if (doBlock)
259  flags &= ~O_NONBLOCK;
260 
261  else
262  flags |= O_NONBLOCK;
263  if (0 != fcntl(fd->fd,
264  F_SETFL,
265  flags))
266 
267  {
269  "fcntl");
270  return GNUNET_SYSERR;
271  }
272  return GNUNET_OK;
273 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
#define LOG_STRERROR(kind, syscall)
Definition: network.c:33
Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_bind()

int 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 474 of file network.c.

References GNUNET_NETWORK_Handle::addr, GNUNET_NETWORK_Handle::addrlen, GNUNET_NETWORK_Handle::af, GNUNET_NETWORK_Handle::fd, GNUNET_ERROR_TYPE_DEBUG, GNUNET_malloc, GNUNET_memcpy, GNUNET_NETWORK_unix_precheck(), GNUNET_OK, GNUNET_SYSERR, LOG_STRERROR, ret, and GNUNET_NETWORK_Handle::type.

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(), open_listen_socket(), open_socket(), run(), setup_sockets(), and unix_transport_server_start().

477 {
478  int ret;
479 
480 #ifdef IPV6_V6ONLY
481 #ifdef IPPROTO_IPV6
482  {
483  const int on = 1;
484 
485  if (AF_INET6 == desc->af)
486  if (setsockopt(desc->fd,
487  IPPROTO_IPV6,
488  IPV6_V6ONLY,
489  (const void *)&on,
490  sizeof(on)))
492  "setsockopt");
493  }
494 #endif
495 #endif
496  if (AF_UNIX == address->sa_family)
497  GNUNET_NETWORK_unix_precheck((const struct sockaddr_un *)address);
498  {
499  const int on = 1;
500 
501  /* This is required here for TCP sockets, but only on UNIX */
502  if ((SOCK_STREAM == desc->type) &&
503  (0 != setsockopt(desc->fd,
504  SOL_SOCKET,
505  SO_REUSEADDR,
506  &on, sizeof(on))))
508  "setsockopt");
509  }
510  {
511  /* set permissions of newly created non-abstract UNIX domain socket to
512  "user-only"; applications can choose to relax this later */
513  mode_t old_mask = 0; /* assigned to make compiler happy */
514  const struct sockaddr_un *un = (const struct sockaddr_un *)address;
515  int not_abstract = 0;
516 
517  if ((AF_UNIX == address->sa_family)
518  && ('\0' != un->sun_path[0])) /* Not an abstract socket */
519  not_abstract = 1;
520  if (not_abstract)
521  old_mask = umask(S_IWGRP | S_IRGRP | S_IXGRP | S_IWOTH | S_IROTH | S_IXOTH);
522 
523  ret = bind(desc->fd,
524  address,
525  address_len);
526 
527  if (not_abstract)
528  (void)umask(old_mask);
529 }
530  if (0 != ret)
531  return GNUNET_SYSERR;
532 
533  desc->addr = GNUNET_malloc(address_len);
534  GNUNET_memcpy(desc->addr, address, address_len);
535  desc->addrlen = address_len;
536 
537  return GNUNET_OK;
538 }
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static int ret
Final status code.
Definition: gnunet-arm.c:89
struct sockaddr * addr
Address we were bound to, or NULL.
Definition: network.c:67
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
socklen_t addrlen
Number of bytes in addr.
Definition: network.c:62
#define LOG_STRERROR(kind, syscall)
Definition: network.c:33
int af
Address family / domain.
Definition: network.c:52
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:194
static char * address
GNS address for this phone.
int type
Type of the socket.
Definition: network.c:57
#define GNUNET_malloc(size)
Wrapper around malloc.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_close()

int GNUNET_NETWORK_socket_close ( struct GNUNET_NETWORK_Handle desc)

Close a socket.

Parameters
descsocket to close
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise
Parameters
descsocket
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise

Definition at line 548 of file network.c.

References GNUNET_NETWORK_Handle::addr, GNUNET_NETWORK_Handle::af, DIR_SEPARATOR, GNUNET_NETWORK_Handle::fd, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log_strerror_file, GNUNET_NETWORK_socket_free_memory_only_(), GNUNET_OK, GNUNET_strndup, GNUNET_SYSERR, len, LOG_STRERROR_FILE, and ret.

Referenced by accept_client(), bind_v4(), bind_v6(), cancel_aps(), cleanup_rs(), cleanup_s5r(), connect_probe_continuation(), connection_client_destroy_impl(), create_listen_socket(), do_dns_read(), do_read(), do_shutdown(), do_udp_read(), finish_client_drop(), free_proto_queue(), 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(), initialize_network_handle(), kill_httpd(), LEGACY_SERVICE_get_server_addresses(), libgnunet_plugin_transport_udp_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().

549 {
550  int ret;
551 
552  ret = close(desc->fd);
553 
554  const struct sockaddr_un *un = (const struct sockaddr_un *)desc->addr;
555 
556  /* Cleanup the UNIX domain socket and its parent directories in case of non
557  abstract sockets */
558  if ((AF_UNIX == desc->af) &&
559  (NULL != desc->addr) &&
560  ('\0' != un->sun_path[0]))
561  {
562  char *dirname = GNUNET_strndup(un->sun_path,
563  sizeof(un->sun_path));
564 
565  if (0 != unlink(dirname))
566  {
568  "unlink",
569  dirname);
570  }
571  else
572  {
573  size_t len;
574 
575  len = strlen(dirname);
576  while ((len > 0) && (dirname[len] != DIR_SEPARATOR))
577  len--;
578  dirname[len] = '\0';
579  if ((0 != len) && (0 != rmdir(dirname)))
580  {
581  switch (errno)
582  {
583  case EACCES:
584  case ENOTEMPTY:
585  case EPERM:
586  /* these are normal and can just be ignored */
587  break;
588 
589  default:
591  "rmdir",
592  dirname);
593  break;
594  }
595  }
596  }
597  GNUNET_free(dirname);
598  }
600  return (ret == 0) ? GNUNET_OK : GNUNET_SYSERR;
601 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static int ret
Final status code.
Definition: gnunet-arm.c:89
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:610
#define GNUNET_log_strerror_file(level, cmd, filename)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; with the mess...
#define LOG_STRERROR_FILE(kind, syscall, filename)
Definition: network.c:32
struct sockaddr * addr
Address we were bound to, or NULL.
Definition: network.c:67
#define DIR_SEPARATOR
Definition: platform.h:167
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
#define GNUNET_strndup(a, length)
Wrapper around GNUNET_xstrndup_.
int af
Address family / domain.
Definition: network.c:52
#define GNUNET_free(ptr)
Wrapper around free.
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
Here is the call graph for this function:

◆ 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 610 of file network.c.

References GNUNET_NETWORK_Handle::addr, GNUNET_free, and GNUNET_free_non_null.

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

611 {
612  GNUNET_free_non_null(desc->addr);
613  GNUNET_free(desc);
614 }
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
struct sockaddr * addr
Address we were bound to, or NULL.
Definition: network.c:67
#define GNUNET_free(ptr)
Wrapper around free.
Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_connect()

int 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 646 of file network.c.

References 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().

649 {
650  int ret;
651 
652  ret = connect(desc->fd,
653  address,
654  address_len);
655 
656  return ret == 0 ? GNUNET_OK : GNUNET_SYSERR;
657 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static int ret
Final status code.
Definition: gnunet-arm.c:89
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static char * address
GNS address for this phone.
Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_getsockopt()

int 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 671 of file network.c.

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

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

676 {
677  int ret;
678 
679  ret = getsockopt(desc->fd,
680  level,
681  optname,
682  optval, optlen);
683 
684  return ret == 0 ? GNUNET_OK : GNUNET_SYSERR;
685 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static int ret
Final status code.
Definition: gnunet-arm.c:89
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_listen()

int 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 696 of file network.c.

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(), open_listen_socket(), and run().

698 {
699  int ret;
700 
701  ret = listen(desc->fd,
702  backlog);
703 
704  return ret == 0 ? GNUNET_OK : GNUNET_SYSERR;
705 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static int ret
Final status code.
Definition: gnunet-arm.c:89
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
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 715 of file network.c.

References GNUNET_NETWORK_Handle::fd, GNUNET_SYSERR, and pending.

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

716 {
717  int error;
718 
719  /* How much is there to be read? */
720  int pending;
721 
722  error = ioctl(desc->fd,
723  FIONREAD,
724  &pending);
725  if (0 == error)
726  return (ssize_t)pending;
727  return GNUNET_SYSERR;
728 }
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static unsigned int pending
The number of queries that are outstanding.
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 742 of file network.c.

References GNUNET_NETWORK_Handle::fd, and ret.

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().

747 {
748  int ret;
749  int flags;
750 
751  flags = 0;
752 
753 #ifdef MSG_DONTWAIT
754  flags |= MSG_DONTWAIT;
755 #endif
756  ret = recvfrom(desc->fd,
757  buffer,
758  length,
759  flags,
760  src_addr,
761  addrlen);
762  return ret;
763 }
static int ret
Final status code.
Definition: gnunet-arm.c:89
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 775 of file network.c.

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().

778 {
779  int ret;
780  int flags;
781 
782  flags = 0;
783 
784 #ifdef MSG_DONTWAIT
785  flags |= MSG_DONTWAIT;
786 #endif
787  ret = recv(desc->fd,
788  buffer,
789  length,
790  flags);
791  return ret;
792 }
static int ret
Final status code.
Definition: gnunet-arm.c:89
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 1328 of file network.c.

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, and GNUNET_NETWORK_FDSet::sds.

Referenced by main(), select_loop(), and short_wait().

1332 {
1333  int nfds;
1334  struct timeval tv;
1335 
1336  if (NULL != rfds)
1337  nfds = rfds->nsds;
1338  else
1339  nfds = 0;
1340  if (NULL != wfds)
1341  nfds = GNUNET_MAX(nfds,
1342  wfds->nsds);
1343  if (NULL != efds)
1344  nfds = GNUNET_MAX(nfds,
1345  efds->nsds);
1346  if ((0 == nfds) &&
1347  (timeout.rel_value_us == GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us))
1348  {
1349  GNUNET_break(0);
1351  _("Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"),
1352  "select");
1353  }
1354  if (timeout.rel_value_us / GNUNET_TIME_UNIT_SECONDS.rel_value_us > (unsigned long long)LONG_MAX)
1355  {
1356  tv.tv_sec = LONG_MAX;
1357  tv.tv_usec = 999999L;
1358  }
1359  else
1360  {
1361  tv.tv_sec = (long)(timeout.rel_value_us / GNUNET_TIME_UNIT_SECONDS.rel_value_us);
1362  tv.tv_usec =
1363  (timeout.rel_value_us -
1364  (tv.tv_sec * GNUNET_TIME_UNIT_SECONDS.rel_value_us));
1365  }
1366  return select(nfds,
1367  (NULL != rfds) ? &rfds->sds : NULL,
1368  (NULL != wfds) ? &wfds->sds : NULL,
1369  (NULL != efds) ? &efds->sds : NULL,
1370  (timeout.rel_value_us ==
1371  GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us) ? NULL : &tv);
1372 }
int nsds
Maximum number of any socket descriptor in the set (plus one)
uint64_t rel_value_us
The actual value.
#define GNUNET_TIME_UNIT_SECONDS
One second.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
#define GNUNET_MAX(a, b)
Definition: gnunet_common.h:82
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
fd_set sds
Bitset with the descriptors.
#define LOG(kind,...)
Definition: network.c:31
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 804 of file network.c.

References GNUNET_NETWORK_Handle::fd, and ret.

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

807 {
808  int ret;
809  int flags;
810 
811  flags = 0;
812 #ifdef MSG_DONTWAIT
813  flags |= MSG_DONTWAIT;
814 #endif
815 #ifdef MSG_NOSIGNAL
816  flags |= MSG_NOSIGNAL;
817 #endif
818  ret = send(desc->fd,
819  buffer,
820  length,
821  flags);
822  return ret;
823 }
static int ret
Final status code.
Definition: gnunet-arm.c:89
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 838 of file network.c.

References GNUNET_NETWORK_Handle::fd, and ret.

Referenced by ifc_broadcast(), mq_send(), select_write_cb(), send_response(), stun_dns_callback(), transmit_query(), try_send_udp(), udp_ipv4_broadcast_send(), udp_ipv6_broadcast_send(), udp_select_send(), and unix_real_send().

843 {
844  int ret;
845  int flags;
846 
847  flags = 0;
848 
849 #ifdef MSG_DONTWAIT
850  flags |= MSG_DONTWAIT;
851 #endif
852 #ifdef MSG_NOSIGNAL
853  flags |= MSG_NOSIGNAL;
854 #endif
855  ret = sendto(desc->fd, message, length, flags, dest_addr, dest_len);
856  return ret;
857 }
static int ret
Final status code.
Definition: gnunet-arm.c:89
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 871 of file network.c.

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

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

876 {
877  int ret;
878 
879  ret = setsockopt(fd->fd,
880  level,
881  option_name,
882  option_value,
883  option_len);
884 
885  return ret == 0 ? GNUNET_OK : GNUNET_SYSERR;
886 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static int ret
Final status code.
Definition: gnunet-arm.c:89
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_shutdown()

int 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 928 of file network.c.

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().

930 {
931  int ret;
932 
933  ret = shutdown(desc->fd, how);
934 
935  return (0 == ret) ? GNUNET_OK : GNUNET_SYSERR;
936 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static int ret
Final status code.
Definition: gnunet-arm.c:89
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
Here is the caller graph for this function:

◆ GNUNET_NETWORK_socket_disable_corking()

int 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 949 of file network.c.

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

Referenced by GNUNET_CONNECTION_disable_corking().

950 {
951  int ret = 0;
952 
953 #if LINUX
954  int value = 0;
955 
956  if (0 !=
957  (ret =
958  setsockopt(desc->fd,
959  SOL_SOCKET,
960  SO_SNDBUF,
961  &value,
962  sizeof(value))))
964  "setsockopt");
965  if (0 !=
966  (ret =
967  setsockopt(desc->fd,
968  SOL_SOCKET,
969  SO_RCVBUF,
970  &value,
971  sizeof(value))))
973  "setsockopt");
974 #endif
975  return ret == 0 ? GNUNET_OK : GNUNET_SYSERR;
976 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static int ret
Final status code.
Definition: gnunet-arm.c:89
static char * value
Value of the record to add/remove.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
#define LOG_STRERROR(kind, syscall)
Definition: network.c:33
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 900 of file network.c.

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

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(), 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().

903 {
904  struct GNUNET_NETWORK_Handle *ret;
905  int fd;
906 
907  fd = socket(domain, type, protocol);
908  if (-1 == fd)
909  return NULL;
910  ret = GNUNET_new(struct GNUNET_NETWORK_Handle);
911  ret->fd = fd;
912  if (GNUNET_OK !=
914  domain,
915  type))
916  return NULL;
917  return ret;
918 }
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:356
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static int ret
Final status code.
Definition: gnunet-arm.c:89
handle to a socket
Definition: network.c:46
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
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 985 of file network.c.

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

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

986 {
987  FD_ZERO(&fds->sds);
988  fds->nsds = 0;
989 }
int nsds
Maximum number of any socket descriptor in the set (plus one)
fd_set sds
Bitset with the descriptors.
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 999 of file network.c.

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().

1001 {
1002  FD_SET(desc->fd,
1003  &fds->sds);
1004  fds->nsds = GNUNET_MAX(fds->nsds,
1005  desc->fd + 1);
1006 }
int nsds
Maximum number of any socket descriptor in the set (plus one)
#define GNUNET_MAX(a, b)
Definition: gnunet_common.h:82
fd_set sds
Bitset with the descriptors.
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 1017 of file network.c.

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().

1019 {
1020  return FD_ISSET(desc->fd,
1021  &fds->sds);
1022 }
fd_set sds
Bitset with the descriptors.
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 1032 of file network.c.

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

1034 {
1035  int nfds;
1036 
1037  for (nfds = src->nsds; nfds >= 0; nfds--)
1038  if (FD_ISSET(nfds, &src->sds))
1039  FD_SET(nfds, &dst->sds);
1040  dst->nsds = GNUNET_MAX(dst->nsds,
1041  src->nsds);
1042 }
int nsds
Maximum number of any socket descriptor in the set (plus one)
#define GNUNET_MAX(a, b)
Definition: gnunet_common.h:82
fd_set sds
Bitset with the descriptors.

◆ 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 1052 of file network.c.

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

1054 {
1055  FD_COPY(&from->sds,
1056  &to->sds);
1057  to->nsds = from->nsds;
1058 }
int nsds
Maximum number of any socket descriptor in the set (plus one)
fd_set sds
Bitset with the descriptors.
#define FD_COPY(s, d)
Definition: network.c:235

◆ 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 1068 of file network.c.

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(), mhd_connection_cb(), run(), setup_data_transfer(), and start_process().

1069 {
1070  return desc->fd;
1071 }
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 1081 of file network.c.

References GNUNET_NETWORK_Handle::addr.

Referenced by do_accept(), and setup_data_transfer().

1082 {
1083  return desc->addr;
1084 }
struct sockaddr * addr
Address we were bound to, or NULL.
Definition: network.c:67
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 1094 of file network.c.

References GNUNET_NETWORK_Handle::addrlen.

Referenced by do_accept(), and setup_data_transfer().

1095 {
1096  return desc->addrlen;
1097 }
socklen_t addrlen
Number of bytes in addr.
Definition: network.c:62
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 1108 of file network.c.

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().

1111 {
1112  FD_COPY(from,
1113  &to->sds);
1114  to->nsds = nfds;
1115 }
int nsds
Maximum number of any socket descriptor in the set (plus one)
fd_set sds
Bitset with the descriptors.
#define FD_COPY(s, d)
Definition: network.c:235
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 1125 of file network.c.

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().

1127 {
1128  GNUNET_assert((nfd >= 0) && (nfd < FD_SETSIZE));
1129  FD_SET(nfd, &to->sds);
1130  to->nsds = GNUNET_MAX(nfd + 1,
1131  to->nsds);
1132 }
int nsds
Maximum number of any socket descriptor in the set (plus one)
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_MAX(a, b)
Definition: gnunet_common.h:82
fd_set sds
Bitset with the descriptors.
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 1143 of file network.c.

References GNUNET_NO, GNUNET_YES, and GNUNET_NETWORK_FDSet::sds.

Referenced by extract_handles(), and select_loop().

1145 {
1146  if ((-1 == nfd) ||
1147  (NULL == to))
1148  return GNUNET_NO;
1149  return FD_ISSET(nfd, &to->sds) ? GNUNET_YES : GNUNET_NO;
1150 }
#define GNUNET_NO
Definition: gnunet_common.h:78
fd_set sds
Bitset with the descriptors.
#define GNUNET_YES
Definition: gnunet_common.h:77
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 1159 of file network.c.

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

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

1161 {
1162  int fd;
1163 
1166  &fd,
1167  sizeof(int)));
1168  FD_SET(fd,
1169  &fds->sds);
1170  fds->nsds = GNUNET_MAX(fd + 1,
1171  fds->nsds);
1172 }
int nsds
Maximum number of any socket descriptor in the set (plus one)
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_MAX(a, b)
Definition: gnunet_common.h:82
int GNUNET_DISK_internal_file_handle_(const struct GNUNET_DISK_FileHandle *fh, void *dst, size_t dst_len)
Retrieve OS file handle.
Definition: disk.c:1769
fd_set sds
Bitset with the descriptors.
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 1181 of file network.c.

References GNUNET_NETWORK_fdset_handle_set().

1183 {
1185 }
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:1159
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 1196 of file network.c.

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

Referenced by cmd_read().

1198 {
1199  return FD_ISSET(h->fd,
1200  &fds->sds);
1201 }
fd_set sds
Bitset with the descriptors.
int fd
File handle on Unix-like systems.
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 1212 of file network.c.

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

1214 {
1215  int nfds;
1216 
1217  nfds = GNUNET_MIN(fds1->nsds,
1218  fds2->nsds);
1219  while (nfds > 0)
1220  {
1221  nfds--;
1222  if ((FD_ISSET(nfds,
1223  &fds1->sds)) &&
1224  (FD_ISSET(nfds,
1225  &fds2->sds)))
1226  return GNUNET_YES;
1227  }
1228  return GNUNET_NO;
1229 }
int nsds
Maximum number of any socket descriptor in the set (plus one)
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_MIN(a, b)
Definition: gnunet_common.h:80
fd_set sds
Bitset with the descriptors.
#define GNUNET_YES
Definition: gnunet_common.h:77

◆ 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 1238 of file network.c.

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().

1239 {
1240  struct GNUNET_NETWORK_FDSet *fds;
1241 
1242  fds = GNUNET_new(struct GNUNET_NETWORK_FDSet);
1244  return fds;
1245 }
#define GNUNET_new(type)
Allocate a struct or union of the given type.
collection of IO descriptors
void GNUNET_NETWORK_fdset_zero(struct GNUNET_NETWORK_FDSet *fds)
Reset FD set.
Definition: network.c:985
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 1254 of file network.c.

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().

1255 {
1256  GNUNET_free(fds);
1257 }
#define GNUNET_free(ptr)
Wrapper around free.
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 (i.e. IPPROTO_TCP)
portport number to test
Returns
GNUNET_OK if the port is available, GNUNET_NO if not

Definition at line 1268 of file network.c.

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

1270 {
1271  struct GNUNET_NETWORK_Handle *socket;
1272  int bind_status;
1273  int socktype;
1274  char open_port_str[6];
1275  struct addrinfo hint;
1276  struct addrinfo *ret;
1277  struct addrinfo *ai;
1278 
1279  GNUNET_snprintf(open_port_str,
1280  sizeof(open_port_str),
1281  "%u",
1282  (unsigned int)port);
1283  socktype = (IPPROTO_TCP == ipproto) ? SOCK_STREAM : SOCK_DGRAM;
1284  ret = NULL;
1285  memset(&hint, 0, sizeof(hint));
1286  hint.ai_family = AF_UNSPEC; /* IPv4 and IPv6 */
1287  hint.ai_socktype = socktype;
1288  hint.ai_protocol = ipproto;
1289  hint.ai_addrlen = 0;
1290  hint.ai_addr = NULL;
1291  hint.ai_canonname = NULL;
1292  hint.ai_next = NULL;
1293  hint.ai_flags = AI_PASSIVE | AI_NUMERICSERV; /* Wild card address */
1294  GNUNET_assert(0 == getaddrinfo(NULL,
1295  open_port_str,
1296  &hint,
1297  &ret));
1298  bind_status = GNUNET_NO;
1299  for (ai = ret; NULL != ai; ai = ai->ai_next)
1300  {
1301  socket = GNUNET_NETWORK_socket_create(ai->ai_family,
1302  ai->ai_socktype,
1303  ai->ai_protocol);
1304  if (NULL == socket)
1305  continue;
1306  bind_status = GNUNET_NETWORK_socket_bind(socket,
1307  ai->ai_addr,
1308  ai->ai_addrlen);
1310  if (GNUNET_OK != bind_status)
1311  break;
1312  }
1313  freeaddrinfo(ret);
1314  return bind_status;
1315 }
#define AI_NUMERICSERV
AI_NUMERICSERV not defined in windows.
Definition: platform.h:226
int GNUNET_snprintf(char *buf, size_t size, const char *format,...)
Like snprintf, just aborts if the buffer is of insufficient size.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
int 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:474
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static int ret
Final status code.
Definition: gnunet-arm.c:89
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
static uint16_t port
Port number.
Definition: gnunet-bcd.c:81
handle to a socket
Definition: network.c:46
int GNUNET_NETWORK_socket_close(struct GNUNET_NETWORK_Handle *desc)
Close a socket.
Definition: network.c:548
struct GNUNET_NETWORK_Handle * GNUNET_NETWORK_socket_create(int domain, int type, int protocol)
Create a new socket.
Definition: network.c:900
Here is the call graph for this function: