summaryrefslogtreecommitdiff
path: root/shared/utils.h
blob: 3ed1c8708eadae57b81a37b64f4d14cdba580895 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#ifndef fooutilshfoo
#define fooutilshfoo

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <linux/if_packet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>

extern unsigned debug_mask;

#define _unused_ __attribute__((__unused__))
#define _pure_ __attribute__((__pure__))
#define _const_ __attribute__((__const__))
#define _alloc_(...) __attribute__((__alloc_size__(__VA_ARGS__)))
#define _malloc_ __attribute__((__malloc__))
#define _printf_(a, b) __attribute__((__format__(printf, a, b)))
#define _alignas_(x) __attribute__((__aligned__(__alignof(x))))
#define _big_endian_ __attribute__((packed, scalar_storage_order("big-endian")))

#if __GNUC__ >= 7
#define _fallthrough_ __attribute__((__fallthrough__))
#else
#define _fallthrough_
#endif

#ifndef _noreturn_
#if __STDC_VERSION__ >= 201112L
#define _noreturn_ _Noreturn
#else
#define _noreturn_ __attribute__((__noreturn__))
#endif
#endif

#define STRLEN(x) (sizeof(""x"") - 1)

#include "list.h"
#include "debug.h"
#include "external.h"
#include "ansi-colors.h"

/* Length of longest DNS name = 253 + trailing dot */
#define FQDN_STR_LEN 254

/* Length of longest port string */
#define PORT_STR_LEN STRLEN("65535")

/* Length of longest address family string */
#define AF_STR_LEN STRLEN("AF_INETX")

/* Length of longest addrstr, format = "AF_INETX <IPADDR> <PORT> */
#define ADDRSTRLEN (AF_STR_LEN + 1 + INET6_ADDRSTRLEN + 1 + PORT_STR_LEN + 1)

struct saddr {
	union {
		struct sockaddr_storage storage;
		struct sockaddr_in in4;
		struct sockaddr_in6 in6;
		struct sockaddr_ll ll;
	};
	socklen_t addrlen;
	char addrstr[ADDRSTRLEN];
	struct list_head list;
};

void socket_set_low_latency(int sfd, bool keepalive, bool iptos, bool nodelay);

char *saddr_addr(struct saddr *saddr, char *buf, size_t len);

uint16_t saddr_port(struct saddr *saddr);

void saddr_set_ipv4(struct saddr *saddr, in_addr_t ip, in_port_t port);

void saddr_set_ipv6(struct saddr *saddr, const struct in6_addr *ip, in_port_t port);

void saddr_set_addrstr(struct saddr *saddr);

int strtou16_strict(const char *str, uint16_t *result);

static inline bool empty_str(const char *str)
{
	if (!str || str[0] == '\0')
		return true;
	else
		return false;
}

static inline bool streq(const char *a, const char *b)
{
	return strcmp(a, b) == 0;
}

static inline bool strcaseeq(const char *a, const char *b)
{
	return strcasecmp(a, b) == 0;
}

#if __BYTE_ORDER == __LITTLE_ENDIAN
#define chtobe32(x) __bswap_constant_32(x)
#else
#define chtobe32(x) (x)
#endif

#if __BYTE_ORDER == __LITTLE_ENDIAN
#define cinet_addr(a,b,c,d) ((uint32_t)((a)<<0|(b)<<8|(c)<<16|(d)<<24))
#else
#define cinet_addr(a,b,c,d) ((uint32_t)((a)<<24|(b)<<16|(c)<<8|(d)<<0))
#endif

#define PIPE_RD 0
#define PIPE_WR 1

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))

#define MAX(a, b) ((a) > (b) ? (a) : (b))

#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))

#endif