/* SPDX-License-Identifier: GPL-2.0 */ #ifndef fooutilshfoo #define fooutilshfoo #include #include #include #include #include #include #include #include #include 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 */ #define ADDRSTRLEN (AF_STR_LEN + 1 + INET6_ADDRSTRLEN + 1 + PORT_STR_LEN + 1) struct saddr { union { struct sockaddr_storage st; struct sockaddr_in in4; struct sockaddr_in6 in6; struct sockaddr_ll ll; }; socklen_t addrlen; char addrstr[ADDRSTRLEN]; struct list_head list; }; void enable_colors(); void free_password(char **password); 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_any_to_loopback(struct saddr *saddr); void saddr_set_addrstr(struct saddr *saddr); int strtou16_strict(const char *str, uint16_t *result); char *xsprintf(size_t *rlen, const char *fmt, ...) _printf_(2, 3); 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)) #define _cleanup_(x) __attribute__((cleanup(x))) static inline void closep(int *fd) { if (*fd && *fd >= 0) close(*fd); } #define _cleanup_close_ _cleanup_(closep) static inline void freep(void *p) { xfree(*(void**)p); } #define _cleanup_free_ _cleanup_(freep) #endif