The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Loading...
Searching...
No Matches
Functions
fd_open.c File Reference

BIO abstractions for opening file descriptors. More...

#include <freeradius-devel/bio/fd_priv.h>
#include <freeradius-devel/util/file.h>
#include <freeradius-devel/util/cap.h>
#include <sys/stat.h>
#include <net/if.h>
#include <fcntl.h>
#include <libgen.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
+ Include dependency graph for fd_open.c:

Go to the source code of this file.

Functions

int fr_bio_fd_check_config (fr_bio_fd_config_t const *cfg)
 Checks the configuration without modifying anything.
 
static int fr_bio_fd_common_datagram (int fd, UNUSED fr_socket_t const *sock, fr_bio_fd_config_t const *cfg)
 Initialize common datagram information.
 
static int fr_bio_fd_common_tcp (int fd, UNUSED fr_socket_t const *sock, fr_bio_fd_config_t const *cfg)
 Initialize common datagram information.
 
static void fr_bio_fd_name (fr_bio_fd_t *my)
 
int fr_bio_fd_open (fr_bio_t *bio, fr_bio_fd_config_t const *cfg)
 Opens a socket and updates sock->fd.
 
int fr_bio_fd_reopen (fr_bio_t *bio)
 Reopen a file BIO.
 
static int fr_bio_fd_server_ipv4 (int fd, fr_socket_t const *sock, fr_bio_fd_config_t const *cfg)
 Initialize an IPv4 server socket.
 
static int fr_bio_fd_server_ipv6 (int fd, fr_socket_t const *sock, fr_bio_fd_config_t const *cfg)
 Initialize an IPv6 server socket.
 
static int fr_bio_fd_server_tcp (int fd, UNUSED fr_socket_t const *sock)
 Initialize a TCP server socket.
 
static int fr_bio_fd_server_udp (int fd, fr_socket_t const *sock, fr_bio_fd_config_t const *cfg)
 Initialize a UDP server socket.
 
static int fr_bio_fd_socket_bind (fr_bio_fd_t *my, fr_bio_fd_config_t const *cfg)
 
static int fr_bio_fd_socket_bind_to_device (fr_bio_fd_t *my, fr_bio_fd_config_t const *cfg)
 This system is missing SO_BINDTODEVICE, IP_BOUND_IF, IPV6_BOUND_IF.
 
static int fr_bio_fd_socket_bind_unix (fr_bio_fd_t *my, fr_bio_fd_config_t const *cfg)
 Bind to a Unix domain socket.
 
static int fr_bio_fd_socket_unix_mkdir (int *dirfd, char const **filename, fr_bio_fd_config_t const *cfg)
 
static int fr_bio_fd_socket_unix_verify (int dirfd, char const *filename, fr_bio_fd_config_t const *cfg)
 Verify or clean up a pre-existing domain socket.
 
static void fr_bio_fd_unix_shutdown (fr_bio_t *bio)
 

Detailed Description

BIO abstractions for opening file descriptors.

Id
fb066f596fa48d1282bbc88589d861cd8856275c

Definition in file fd_open.c.

Function Documentation

◆ fr_bio_fd_check_config()

int fr_bio_fd_check_config ( fr_bio_fd_config_t const *  cfg)

Checks the configuration without modifying anything.

Definition at line 834 of file fd_open.c.

+ Here is the caller graph for this function:

◆ fr_bio_fd_common_datagram()

static int fr_bio_fd_common_datagram ( int  fd,
UNUSED fr_socket_t const *  sock,
fr_bio_fd_config_t const *  cfg 
)
static

Initialize common datagram information.

Definition at line 83 of file fd_open.c.

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

◆ fr_bio_fd_common_tcp()

static int fr_bio_fd_common_tcp ( int  fd,
UNUSED fr_socket_t const *  sock,
fr_bio_fd_config_t const *  cfg 
)
static

Initialize common datagram information.

Definition at line 39 of file fd_open.c.

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

◆ fr_bio_fd_name()

static void fr_bio_fd_name ( fr_bio_fd_t my)
static

Definition at line 732 of file fd_open.c.

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

◆ fr_bio_fd_open()

int fr_bio_fd_open ( fr_bio_t bio,
fr_bio_fd_config_t const *  cfg 
)

Opens a socket and updates sock->fd.

If the socket is asynchronous, it also calls connect()

Definition at line 908 of file fd_open.c.

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

◆ fr_bio_fd_reopen()

int fr_bio_fd_reopen ( fr_bio_t bio)

Reopen a file BIO.

e.g. for log files.

Definition at line 1255 of file fd_open.c.

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

◆ fr_bio_fd_server_ipv4()

static int fr_bio_fd_server_ipv4 ( int  fd,
fr_socket_t const *  sock,
fr_bio_fd_config_t const *  cfg 
)
static

Initialize an IPv4 server socket.

Definition at line 185 of file fd_open.c.

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

◆ fr_bio_fd_server_ipv6()

static int fr_bio_fd_server_ipv6 ( int  fd,
fr_socket_t const *  sock,
fr_bio_fd_config_t const *  cfg 
)
static

Initialize an IPv6 server socket.

Definition at line 225 of file fd_open.c.

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

◆ fr_bio_fd_server_tcp()

static int fr_bio_fd_server_tcp ( int  fd,
UNUSED fr_socket_t const *  sock 
)
static

Initialize a TCP server socket.

Definition at line 170 of file fd_open.c.

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

◆ fr_bio_fd_server_udp()

static int fr_bio_fd_server_udp ( int  fd,
fr_socket_t const *  sock,
fr_bio_fd_config_t const *  cfg 
)
static

Initialize a UDP server socket.

Definition at line 149 of file fd_open.c.

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

◆ fr_bio_fd_socket_bind()

static int fr_bio_fd_socket_bind ( fr_bio_fd_t my,
fr_bio_fd_config_t const *  cfg 
)
static

Definition at line 696 of file fd_open.c.

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

◆ fr_bio_fd_socket_bind_to_device()

static int fr_bio_fd_socket_bind_to_device ( fr_bio_fd_t my,
fr_bio_fd_config_t const *  cfg 
)
static

This system is missing SO_BINDTODEVICE, IP_BOUND_IF, IPV6_BOUND_IF.

@todo - FreeBSD IP_RECVIF and IP_SENDIF

Except that has to be done in recvmsg() and sendmsg().  And it only works on datagram sockets.

cmsg_len = sizeof(struct sockaddr_dl)
cmsg_level = IPPROTO_IP
cmsg_type = IP_RECVIF

Definition at line 685 of file fd_open.c.

+ Here is the caller graph for this function:

◆ fr_bio_fd_socket_bind_unix()

static int fr_bio_fd_socket_bind_unix ( fr_bio_fd_t my,
fr_bio_fd_config_t const *  cfg 
)
static

Bind to a Unix domain socket.

Todo:
  • this function only does a tiny bit of what fr_server_domain_socket_peercred() and fr_server_domain_socket_perm() do. Those functions do a lot more sanity checks.

The main question is whether or not those checks are useful. In many cases, fchmod() and fchown() are not possible on Unix sockets, so we shouldn't bother doing them,

Note that the listeners generally call these functions with wrappers of fr_suid_up() and fr_suid_down(). So these functions are running as "root", and will create files owned as "root".

Definition at line 493 of file fd_open.c.

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

◆ fr_bio_fd_socket_unix_mkdir()

static int fr_bio_fd_socket_unix_mkdir ( int *  dirfd,
char const **  filename,
fr_bio_fd_config_t const *  cfg 
)
static

Definition at line 319 of file fd_open.c.

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

◆ fr_bio_fd_socket_unix_verify()

static int fr_bio_fd_socket_unix_verify ( int  dirfd,
char const *  filename,
fr_bio_fd_config_t const *  cfg 
)
static

Verify or clean up a pre-existing domain socket.

Definition at line 252 of file fd_open.c.

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

◆ fr_bio_fd_unix_shutdown()

static void fr_bio_fd_unix_shutdown ( fr_bio_t bio)
static

Definition at line 460 of file fd_open.c.

+ Here is the caller graph for this function: