Greenbone Vulnerability Management Libraries  21.4.2
Data Structures | Macros | Typedefs | Functions | Variables
networking.c File Reference

Implementation of GVM Networking related API. More...

#include "networking.h"
#include <arpa/inet.h>
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <glib/gstdio.h>
#include <ifaddrs.h>
#include <net/if.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>

Data Structures

struct  route_entry
 

Macros

#define G_LOG_DOMAIN   "libgvm base"
 GLib log domain. More...
 

Typedefs

typedef struct route_entry route_entry_t
 

Functions

int gvm_source_iface_init (const char *iface)
 Initializes the source network interface name and related information. More...
 
int gvm_source_iface_is_set (void)
 Check if global_source global_source_iface is set. More...
 
int gvm_source_set_socket (int socket, int port, int family)
 Binds a socket to use the global source address. More...
 
void gvm_source_addr (void *addr)
 Gives the source IPv4 address. More...
 
void gvm_source_addr6 (void *addr6)
 Gives the source IPv6 address. More...
 
void gvm_source_addr_as_addr6 (struct in6_addr *addr6)
 Gives the source IPv4 mapped as an IPv6 address. eg. 192.168.20.10 would map to ::ffff:192.168.20.10. More...
 
char * gvm_source_addr_str (void)
 Gives the source IPv4 address in string format. More...
 
char * gvm_source_addr6_str (void)
 Gives the source IPv6 address in string format. More...
 
void ipv4_as_ipv6 (const struct in_addr *ip4, struct in6_addr *ip6)
 Maps an IPv4 address as an IPv6 address. eg. 192.168.10.20 would map to ::ffff:192.168.10.20. More...
 
void addr6_to_str (const struct in6_addr *addr6, char *str)
 Stringifies an IP address. More...
 
char * addr6_as_str (const struct in6_addr *addr6)
 Stringifies an IP address. More...
 
void sockaddr_as_str (const struct sockaddr_storage *addr, char *str)
 Convert an IP address to string format. More...
 
GSList * gvm_resolve_list (const char *name)
 Returns a list of addresses that a hostname resolves to. More...
 
int gvm_resolve (const char *name, void *dst, int family)
 Resolves a hostname to an IPv4 or IPv6 address. More...
 
int gvm_resolve_as_addr6 (const char *name, struct in6_addr *ip6)
 Resolves a hostname to an IPv4-mapped IPv6 or IPv6 address. More...
 
int validate_port_range (const char *port_range)
 Validate a port range string. More...
 
array_tport_range_ranges (const char *port_range)
 Create a range array from a port_range string. More...
 
int port_in_port_ranges (int pnum, port_protocol_t ptype, array_t *pranges)
 Checks if a port num is in port ranges array. More...
 
int ipv6_is_enabled ()
 Checks if IPv6 support is enabled. More...
 
gboolean ip_islocalhost (struct sockaddr_storage *storage)
 Determine if IP is localhost. More...
 
static GSList * get_routes (void)
 Get the entries of /proc/net/route as list of route_entry structs. More...
 
gchar * gvm_routethrough (struct sockaddr_storage *storage_dest, struct sockaddr_storage *storage_source)
 Get Interface which should be used for routing to destination addr. More...
 

Variables

char global_source_iface [IFNAMSIZ] = {'\0'}
 
struct in_addr global_source_addr = {.s_addr = 0}
 
struct in6_addr global_source_addr6 = {.s6_addr32 = {0, 0, 0, 0}}
 

Detailed Description

Implementation of GVM Networking related API.

Macro Definition Documentation

◆ G_LOG_DOMAIN

#define G_LOG_DOMAIN   "libgvm base"

GLib log domain.

Typedef Documentation

◆ route_entry_t

typedef struct route_entry route_entry_t

Function Documentation

◆ addr6_as_str()

char* addr6_as_str ( const struct in6_addr *  addr6)

Stringifies an IP address.

Parameters
[in]addr6IP address.
Returns
IP as string. NULL otherwise.

◆ addr6_to_str()

void addr6_to_str ( const struct in6_addr *  addr6,
char *  str 
)

Stringifies an IP address.

Parameters
[in]addr6IP address.
[out]strBuffer to output IP.

◆ get_routes()

static GSList* get_routes ( void  )
static

Get the entries of /proc/net/route as list of route_entry structs.

Returns
GSList of route_entry structs. NULL if no routes found or Error.

◆ gvm_resolve()

int gvm_resolve ( const char *  name,
void *  dst,
int  family 
)

Resolves a hostname to an IPv4 or IPv6 address.

Parameters
[in]nameHostname to resolve.
[out]dstBuffer to store resolved address. Size must be at least 4 bytes for AF_INET and 16 bytes for AF_INET6.
[in]familyEither AF_INET or AF_INET6.
Returns
-1 if error, 0 otherwise.

◆ gvm_resolve_as_addr6()

int gvm_resolve_as_addr6 ( const char *  name,
struct in6_addr *  ip6 
)

Resolves a hostname to an IPv4-mapped IPv6 or IPv6 address.

Parameters
[in]nameHostname to resolve.
[out]ip6Buffer to store resolved address.
Returns
-1 if error, 0 otherwise.

◆ gvm_resolve_list()

GSList* gvm_resolve_list ( const char *  name)

Returns a list of addresses that a hostname resolves to.

Parameters
[in]nameHostname to resolve.
Returns
List of addresses, NULL otherwise.

◆ gvm_routethrough()

gchar* gvm_routethrough ( struct sockaddr_storage *  storage_dest,
struct sockaddr_storage *  storage_source 
)

Get Interface which should be used for routing to destination addr.

This function should be used sparingly as it parses /proc/net/route for every call.

Parameters
[in]storage_destDestination address.
[out]storage_sourceSource address. Is set to either address of the interface we use or global source address if set. Only gets filled if storage_source != NULL.
Returns
Interface name of interface used for routing to destination address. NULL if no interface found or Error.

◆ gvm_source_addr()

void gvm_source_addr ( void *  addr)

Gives the source IPv4 address.

Parameters
[out]addrBuffer of at least 4 bytes.

◆ gvm_source_addr6()

void gvm_source_addr6 ( void *  addr6)

Gives the source IPv6 address.

Parameters
[out]addr6Buffer of at least 16 bytes.

◆ gvm_source_addr6_str()

char* gvm_source_addr6_str ( void  )

Gives the source IPv6 address in string format.

Returns
Source IPv6 string. Free with g_free().

◆ gvm_source_addr_as_addr6()

void gvm_source_addr_as_addr6 ( struct in6_addr *  addr6)

Gives the source IPv4 mapped as an IPv6 address. eg. 192.168.20.10 would map to ::ffff:192.168.20.10.

Parameters
[out]addr6Buffer of at least 16 bytes.

◆ gvm_source_addr_str()

char* gvm_source_addr_str ( void  )

Gives the source IPv4 address in string format.

Returns
Source IPv4 string. Free with g_free().

◆ gvm_source_iface_init()

int gvm_source_iface_init ( const char *  iface)

Initializes the source network interface name and related information.

Parameters
[in]ifaceName of network interface to use as source interface.
Returns
0 if success. If error, return 1 and reset source values to default.

◆ gvm_source_iface_is_set()

int gvm_source_iface_is_set ( void  )

Check if global_source global_source_iface is set.

Returns
1 if set, 0 otherwise.

◆ gvm_source_set_socket()

int gvm_source_set_socket ( int  socket,
int  port,
int  family 
)

Binds a socket to use the global source address.

Parameters
[in]socketSocket to set source address for.
[in]portNetwork port for socket.
[in]familyFamily of socket. AF_INET or AF_INET6.
Returns
0 if success, -1 if error.

◆ ip_islocalhost()

gboolean ip_islocalhost ( struct sockaddr_storage *  storage)

Determine if IP is localhost.

Returns
True if IP is localhost, else false.

◆ ipv4_as_ipv6()

void ipv4_as_ipv6 ( const struct in_addr *  ip4,
struct in6_addr *  ip6 
)

Maps an IPv4 address as an IPv6 address. eg. 192.168.10.20 would map to ::ffff:192.168.10.20.

Parameters
[in]ip4IPv4 address to map.
[out]ip6Buffer to store the IPv6 address.

◆ ipv6_is_enabled()

int ipv6_is_enabled ( )

Checks if IPv6 support is enabled.

Returns
1 if IPv6 is enabled, 0 if disabled.

◆ port_in_port_ranges()

int port_in_port_ranges ( int  pnum,
port_protocol_t  ptype,
array_t pranges 
)

Checks if a port num is in port ranges array.

Parameters
[in]pnumPort number.
[in]ptypePort type.
[in]prangesArray of port ranges.
Returns
1 if port in port ranges, 0 otherwise.

◆ port_range_ranges()

array_t* port_range_ranges ( const char *  port_range)

Create a range array from a port_range string.

Parameters
[in]port_rangeValid port_range string.
Returns
Range array or NULL if port_range invalid or NULL.

◆ sockaddr_as_str()

void sockaddr_as_str ( const struct sockaddr_storage *  addr,
char *  str 
)

Convert an IP address to string format.

Parameters
[in]addrAddress to convert.
[out]strBuffer of INET6_ADDRSTRLEN size.

◆ validate_port_range()

int validate_port_range ( const char *  port_range)

Validate a port range string.

Accepts ranges in form of "103,U:200-1024,3000-4000,T:3-4,U:7".

Parameters
[in]port_rangeA port range.
Returns
0 success, 1 failed.

Variable Documentation

◆ global_source_addr

struct in_addr global_source_addr = {.s_addr = 0}

◆ global_source_addr6

struct in6_addr global_source_addr6 = {.s6_addr32 = {0, 0, 0, 0}}

◆ global_source_iface

char global_source_iface[IFNAMSIZ] = {'\0'}