GNUnet 0.22.2
network.c File Reference

basic, low-level networking interface More...

#include "platform.h"
#include "gnunet_common.h"
#include "disk.h"
Include dependency graph for network.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_NETWORK_Handle
 handle to a socket More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "util-network", __VA_ARGS__)
 
#define LOG_STRERROR_FILE(kind, syscall, filename)
 
#define LOG_STRERROR(kind, syscall)
 
#define DEBUG_NETWORK   GNUNET_EXTRA_LOGGING
 
#define INVALID_SOCKET   -1
 
#define FD_COPY(s, d)   do { GNUNET_memcpy ((d), (s), sizeof(fd_set)); } while (0)
 

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...
 
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_set_blocking (struct GNUNET_NETWORK_Handle *fd, int doBlock)
 Set if a socket should use blocking or non-blocking IO. More...
 
static int socket_set_inheritable (const struct GNUNET_NETWORK_Handle *h)
 Make a socket non-inheritable to child processes. More...
 
static void socket_set_nodelay (const struct GNUNET_NETWORK_Handle *h)
 Disable delays when sending data via the socket. More...
 
static int initialize_network_handle (struct GNUNET_NETWORK_Handle *h, int af, int type)
 Perform proper canonical initialization for a network handle. 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...
 
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...
 
struct GNUNET_NETWORK_HandleGNUNET_NETWORK_socket_box_native (int fd)
 Box a native socket (and check that it is a socket). 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...
 
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...
 
struct GNUNET_NETWORK_HandleGNUNET_NETWORK_socket_create (int domain, int type, int protocol)
 Create a new socket. 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...
 
void GNUNET_NETWORK_fdset_zero (struct GNUNET_NETWORK_FDSet *fds)
 Reset FD set. 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. 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 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. 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. 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 ()
 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...
 
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 or pipes meet certain conditions. More...
 

Detailed Description

basic, low-level networking interface

Author
Nils Durner
Christian Grothoff

Definition in file network.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "util-network", __VA_ARGS__)

Definition at line 31 of file network.c.

◆ LOG_STRERROR_FILE

#define LOG_STRERROR_FILE (   kind,
  syscall,
  filename 
)
Value:
"util-network", \
syscall, \
static char * filename
#define GNUNET_log_from_strerror_file(level, component, cmd, filename)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...

Definition at line 32 of file network.c.

◆ LOG_STRERROR

#define LOG_STRERROR (   kind,
  syscall 
)
Value:
"util-network", \
syscall)
#define GNUNET_log_from_strerror(level, component, cmd)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...

Definition at line 37 of file network.c.

◆ DEBUG_NETWORK

#define DEBUG_NETWORK   GNUNET_EXTRA_LOGGING

Definition at line 41 of file network.c.

◆ INVALID_SOCKET

#define INVALID_SOCKET   -1

Definition at line 45 of file network.c.

◆ FD_COPY

#define FD_COPY (   s,
  d 
)    do { GNUNET_memcpy ((d), (s), sizeof(fd_set)); } while (0)

Definition at line 219 of file network.c.

Function Documentation

◆ socket_set_inheritable()

static int socket_set_inheritable ( const struct GNUNET_NETWORK_Handle h)
static

Make a socket non-inheritable to child processes.

Parameters
hthe socket to make non-inheritable
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise
Warning
Not implemented on Windows

Definition at line 261 of file network.c.

262{
263 int i;
264 i = fcntl (h->fd, F_GETFD);
265 if (i < 0)
266 return GNUNET_SYSERR;
267 if (i == (i | FD_CLOEXEC))
268 return GNUNET_OK;
269 i |= FD_CLOEXEC;
270 if (fcntl (h->fd, F_SETFD, i) < 0)
271 return GNUNET_SYSERR;
272
273 return GNUNET_OK;
274}
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:98
@ GNUNET_OK
@ GNUNET_SYSERR

References GNUNET_OK, GNUNET_SYSERR, and h.

Referenced by initialize_network_handle().

Here is the caller graph for this function:

◆ socket_set_nodelay()

static void socket_set_nodelay ( const struct GNUNET_NETWORK_Handle h)
static

Disable delays when sending data via the socket.

(GNUnet makes sure that messages are as big as possible already).

Parameters
hthe socket to make non-delaying

Definition at line 308 of file network.c.

309{
310 int value = 1;
311
312 if (0 !=
313 setsockopt (h->fd,
314 IPPROTO_TCP,
315 TCP_NODELAY,
316 &value, sizeof(value)))
318 "setsockopt");
319}
static char * value
Value of the record to add/remove.
@ GNUNET_ERROR_TYPE_WARNING
#define LOG_STRERROR(kind, syscall)
Definition: network.c:37

References GNUNET_ERROR_TYPE_WARNING, h, LOG_STRERROR, and value.

Referenced by initialize_network_handle().

Here is the caller graph for this function:

◆ initialize_network_handle()

static int initialize_network_handle ( struct GNUNET_NETWORK_Handle h,
int  af,
int  type 
)
static

Perform proper canonical initialization for a network handle.

Set it to non-blocking, make it non-inheritable to child processes, disable SIGPIPE, enable "nodelay" (if non-UNIX stream socket) and check that it is smaller than FD_SETSIZE.

Parameters
hsocket to initialize
afaddress family of the socket
typesocket type
Returns
GNUNET_OK on success, GNUNET_SYSERR if initialization failed and the handle was destroyed

Definition at line 335 of file network.c.

338{
339 int eno;
340
341 h->af = af;
342 h->type = type;
343 if (h->fd == INVALID_SOCKET)
344 {
345 eno = errno;
346 GNUNET_free (h);
347 errno = eno;
348 return GNUNET_SYSERR;
349 }
350
351 if (h->fd >= FD_SETSIZE)
352 {
355 errno = EMFILE;
356 return GNUNET_SYSERR;
357 }
358
361 "socket_set_inheritable");
362
364 {
365 eno = errno;
366 GNUNET_break (0);
368 errno = eno;
369 return GNUNET_SYSERR;
370 }
371#ifdef DARWIN
372 if (GNUNET_SYSERR == socket_set_nosigpipe (h))
373 {
374 eno = errno;
375 GNUNET_break (0);
377 errno = eno;
378 return GNUNET_SYSERR;
379 }
380#endif
381 if ((type == SOCK_STREAM)
382#ifdef AF_UNIX
383 && (af != AF_UNIX)
384#endif
385 )
387 return GNUNET_OK;
388}
static uint32_t type
Type string converted to DNS type value.
@ GNUNET_NO
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_BULK
#define GNUNET_free(ptr)
Wrapper around free.
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_close(struct GNUNET_NETWORK_Handle *desc)
Close a socket.
Definition: network.c:508
enum GNUNET_GenericReturnValue GNUNET_NETWORK_socket_set_blocking(struct GNUNET_NETWORK_Handle *fd, int doBlock)
Set if a socket should use blocking or non-blocking IO.
Definition: network.c:224
#define INVALID_SOCKET
Definition: network.c:45
static void socket_set_nodelay(const struct GNUNET_NETWORK_Handle *h)
Disable delays when sending data via the socket.
Definition: network.c:308
static int socket_set_inheritable(const struct GNUNET_NETWORK_Handle *h)
Make a socket non-inheritable to child processes.
Definition: network.c:261

References GNUNET_break, GNUNET_ERROR_TYPE_BULK, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_NETWORK_socket_close(), GNUNET_NETWORK_socket_set_blocking(), GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, h, INVALID_SOCKET, LOG_STRERROR, socket_set_inheritable(), socket_set_nodelay(), and type.

Referenced by GNUNET_NETWORK_socket_accept(), and GNUNET_NETWORK_socket_create().

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