tor  0.4.2.0-alpha-dev
Macros | Functions | Variables
socket.c File Reference
#include "lib/net/socket.h"
#include "lib/net/socketpair.h"
#include "lib/net/address.h"
#include "lib/cc/compat_compiler.h"
#include "lib/err/torerr.h"
#include "lib/lock/compat_mutex.h"
#include "lib/log/log.h"
#include "lib/log/util_bug.h"
#include <stddef.h>
#include <string.h>

Go to the source code of this file.

Macros

#define SOCKET_PRIVATE
 
#define mark_socket_open(s)   ((void) (s))
 
#define mark_socket_closed(s)   ((void) (s))
 

Functions

int network_init (void)
 
void check_network_configuration (bool server_mode)
 
int get_max_sockets (void)
 
void set_max_sockets (int n)
 
static void socket_accounting_lock (void)
 
static void socket_accounting_unlock (void)
 
int tor_close_socket_simple (tor_socket_t s)
 
 MOCK_IMPL (int, tor_close_socket,(tor_socket_t s))
 
 MOCK_IMPL (tor_socket_t, tor_open_socket,(int domain, int type, int protocol))
 
 MOCK_IMPL (tor_socket_t, tor_connect_socket,(tor_socket_t sock, const struct sockaddr *address, socklen_t address_len))
 
tor_socket_t tor_open_socket_nonblocking (int domain, int type, int protocol)
 
tor_socket_t tor_open_socket_with_extensions (int domain, int type, int protocol, int cloexec, int nonblock)
 
void tor_take_socket_ownership (tor_socket_t s)
 
void tor_release_socket_ownership (tor_socket_t s)
 
tor_socket_t tor_accept_socket (tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len)
 
tor_socket_t tor_accept_socket_nonblocking (tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len)
 
tor_socket_t tor_accept_socket_with_extensions (tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len, int cloexec, int nonblock)
 
int get_n_open_sockets (void)
 
int tor_socketpair (int family, int type, int protocol, tor_socket_t fd[2])
 
 MOCK_IMPL (int, tor_getsockname,(tor_socket_t sock, struct sockaddr *address, socklen_t *address_len))
 
int tor_addr_from_getsockname (struct tor_addr_t *addr_out, tor_socket_t sock)
 
int set_socket_nonblocking (tor_socket_t sock)
 
ssize_t read_all_from_socket (tor_socket_t sock, char *buf, size_t count)
 
ssize_t write_all_to_socket (tor_socket_t fd, const char *buf, size_t count)
 

Variables

static int max_sockets = 1024
 
static int n_sockets_open = 0
 
static tor_mutex_tsocket_accounting_mutex = NULL
 

Detailed Description

Compatibility and utility functions for working with network sockets.

Definition in file socket.c.

Function Documentation

◆ check_network_configuration()

void check_network_configuration ( bool  server_mode)

Warn the user if any system network parameters should be changed.

Definition at line 70 of file socket.c.

◆ get_max_sockets()

int get_max_sockets ( void  )

Return the maximum number of allowed sockets.

Definition at line 99 of file socket.c.

◆ get_n_open_sockets()

int get_n_open_sockets ( void  )

Return the number of sockets we currently have opened.

Definition at line 441 of file socket.c.

References n_sockets_open, socket_accounting_lock(), and socket_accounting_unlock().

Referenced by tor_accept_socket_with_extensions().

◆ MOCK_IMPL() [1/4]

MOCK_IMPL ( int  ,
tor_close_socket  ,
(tor_socket_t s)   
)

As tor_close_socket_simple(), but keeps track of the number of open sockets. Returns 0 on success, -1 on failure.

Definition at line 217 of file socket.c.

References socket_accounting_lock(), and tor_close_socket_simple().

◆ MOCK_IMPL() [2/4]

MOCK_IMPL ( tor_socket_t  ,
tor_open_socket  ,
(int domain, int type, int protocol)   
)

As socket(), but counts the number of open sockets.

Definition at line 243 of file socket.c.

◆ MOCK_IMPL() [3/4]

MOCK_IMPL ( tor_socket_t  ,
tor_connect_socket  ,
(tor_socket_t sock, const struct sockaddr *address, socklen_t address_len)   
)

Mockable wrapper for connect().

Definition at line 250 of file socket.c.

◆ MOCK_IMPL() [4/4]

MOCK_IMPL ( int  ,
tor_getsockname  ,
(tor_socket_t sock, struct sockaddr *address, socklen_t *address_len)   
)

Mockable wrapper for getsockname().

Definition at line 532 of file socket.c.

◆ network_init()

int network_init ( void  )

Called before we make any calls to network-related functions. (Some operating systems require their network libraries to be initialized.)

Definition at line 42 of file socket.c.

◆ read_all_from_socket()

ssize_t read_all_from_socket ( tor_socket_t  sock,
char *  buf,
size_t  count 
)

Read from sock to buf, until we get count bytes or reach the end of the file. Return the number of bytes read, or -1 on error. Only use if fd is a blocking fd.

Definition at line 588 of file socket.c.

References SIZE_T_CEILING.

◆ set_max_sockets()

void set_max_sockets ( int  n)

Set the maximum number of allowed sockets to n

Definition at line 106 of file socket.c.

◆ set_socket_nonblocking()

int set_socket_nonblocking ( tor_socket_t  sock)

Turn socket into a nonblocking socket. Return 0 on success, -1 on failure.

Definition at line 561 of file socket.c.

◆ socket_accounting_lock()

static void socket_accounting_lock ( void  )
inlinestatic

Helper: acquire the socket accounting lock.

Definition at line 131 of file socket.c.

Referenced by get_n_open_sockets(), MOCK_IMPL(), tor_release_socket_ownership(), and tor_take_socket_ownership().

◆ socket_accounting_unlock()

static void socket_accounting_unlock ( void  )
inlinestatic

Helper: release the socket accounting lock.

Definition at line 140 of file socket.c.

References socket_accounting_mutex, and tor_mutex_release().

Referenced by get_n_open_sockets().

◆ tor_accept_socket()

tor_socket_t tor_accept_socket ( tor_socket_t  sockfd,
struct sockaddr *  addr,
socklen_t *  len 
)

As accept(), but counts the number of open sockets.

Definition at line 359 of file socket.c.

References tor_accept_socket_with_extensions().

◆ tor_accept_socket_nonblocking()

tor_socket_t tor_accept_socket_nonblocking ( tor_socket_t  sockfd,
struct sockaddr *  addr,
socklen_t *  len 
)

As accept(), but returns a nonblocking socket and counts the number of open sockets.

Definition at line 367 of file socket.c.

References tor_accept_socket_with_extensions().

◆ tor_accept_socket_with_extensions()

tor_socket_t tor_accept_socket_with_extensions ( tor_socket_t  sockfd,
struct sockaddr *  addr,
socklen_t *  len,
int  cloexec,
int  nonblock 
)

As accept(), but counts the number of open sockets and handles socket creation with either of SOCK_CLOEXEC and SOCK_NONBLOCK specified. cloexec and nonblock should be either 0 or 1 to indicate if the corresponding extension should be used.

Definition at line 378 of file socket.c.

References get_n_open_sockets(), and tor_socket_t.

Referenced by tor_accept_socket(), and tor_accept_socket_nonblocking().

◆ tor_addr_from_getsockname()

int tor_addr_from_getsockname ( struct tor_addr_t addr_out,
tor_socket_t  sock 
)

Find the local address associated with the socket sock, and place it in *addr_out. Return 0 on success, -1 on failure.

(As tor_getsockname, but instead places the result in a tor_addr_t.)

Definition at line 545 of file socket.c.

References tor_addr_from_sockaddr().

Referenced by client_check_address_changed().

◆ tor_close_socket_simple()

int tor_close_socket_simple ( tor_socket_t  s)

As close(), but guaranteed to work for sockets across platforms (including Windows, where close()ing a socket doesn't work. Returns 0 on success and the socket error code on failure.

Definition at line 149 of file socket.c.

Referenced by MOCK_IMPL().

◆ tor_open_socket_nonblocking()

tor_socket_t tor_open_socket_nonblocking ( int  domain,
int  type,
int  protocol 
)

As socket(), but creates a nonblocking socket and counts the number of open sockets.

Definition at line 260 of file socket.c.

Referenced by tor_tls_release_socket().

◆ tor_open_socket_with_extensions()

tor_socket_t tor_open_socket_with_extensions ( int  domain,
int  type,
int  protocol,
int  cloexec,
int  nonblock 
)

As socket(), but counts the number of open sockets and handles socket creation with either of SOCK_CLOEXEC and SOCK_NONBLOCK specified. cloexec and nonblock should be either 0 or 1 to indicate if the corresponding extension should be used.

Definition at line 270 of file socket.c.

◆ tor_release_socket_ownership()

void tor_release_socket_ownership ( tor_socket_t  s)

For socket accounting: declare that we are no longer the owner of the socket s. This will prevent us from overallocating sockets, and prevent us from asserting later when we close the socket s.

Definition at line 349 of file socket.c.

References n_sockets_open, and socket_accounting_lock().

◆ tor_socketpair()

int tor_socketpair ( int  family,
int  type,
int  protocol,
tor_socket_t  fd[2] 
)

Allocate a pair of connected sockets. (Like socketpair(family, type,protocol,fd), but works on systems that don't have socketpair.)

Currently, only (AF_UNIX, SOCK_STREAM, 0) sockets are supported.

Note that on systems without socketpair, this call will fail if localhost is inaccessible (for example, if the networking stack is down). And even if it succeeds, the socket pair will not be able to read while localhost is down later (the socket pair may even close, depending on OS-specific timeouts). The socket pair should work on IPv4-only, IPv6-only, and dual-stack systems, as long as they have the standard localhost addresses.

Returns 0 on success and -errno on failure; do not rely on the value of errno or WSAGetLastError().

Definition at line 470 of file socket.c.

◆ tor_take_socket_ownership()

void tor_take_socket_ownership ( tor_socket_t  s)

For socket accounting: remember that we are the owner of the socket s. This will prevent us from overallocating sockets, and prevent us from asserting later when we close the socket s.

Definition at line 335 of file socket.c.

References n_sockets_open, and socket_accounting_lock().

◆ write_all_to_socket()

ssize_t write_all_to_socket ( tor_socket_t  fd,
const char *  buf,
size_t  count 
)

Write count bytes from buf to sock. Return the number of bytes written, or -1 on error. Only use if fd is a blocking fd.

Definition at line 612 of file socket.c.

Variable Documentation

◆ n_sockets_open

int n_sockets_open = 0
static

Count of number of sockets currently open. (Undercounts sockets opened by eventdns and libevent.)

Definition at line 124 of file socket.c.

Referenced by get_n_open_sockets(), tor_release_socket_ownership(), and tor_take_socket_ownership().

◆ socket_accounting_mutex

tor_mutex_t* socket_accounting_mutex = NULL
static

Mutex to protect open_sockets, max_socket, and n_sockets_open.

Definition at line 127 of file socket.c.

Referenced by socket_accounting_unlock().