You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.3 KiB
4.3 KiB
platform_compat — Cross-platform compatibility layer
1. Назначение
Унифицирует различия между POSIX (Linux/FreeBSD) и Windows (MSYS2 UCRT64) на уровне системных вызовов и типов. Предоставляет единый API для байтового порядка, строковых функций, энтропии, работы с сетевыми интерфейсами и времени. Полностью заголовочный (inline) для макросов и тривиальных обёрток, .c только для нетривиальных реализаций.
2. Как пользоваться
Подключить "platform_compat.h" — всё остальное разрешается автоматически в зависимости от _WIN32.
Байтовый порядок
uint16_t v16 = htobe16(x); // host → big-endian
uint32_t v32 = be32toh(x); // big-endian → host
uint64_t v64 = be64toh(x); // big-endian → host
// На Linux использует <endian.h>, на Windows — _byteswap_*
Криптостойкий random
uint8_t salt[8];
if (random_bytes(salt, sizeof(salt)) != 0) { /* ошибка */ }
// Linux: /dev/urandom, Windows: BCryptGenRandom
Сетевые интерфейсы
// Определить интерфейс маршрута по умолчанию
uint32_t ifidx = get_default_route_netif_index(AF_INET); // или AF_INET6
// Получить IPv4 адрес интерфейса по индексу
uint32_t ipv4 = get_interface_ip_by_index(ifidx); // network byte order
// Получить IPv6 адрес (постоянный или временный)
uint8_t ipv6[16];
if (get_interface_ipv6_by_index(ifidx, 1, ipv6) == 0) { // temporary=1
// ipv6 содержит 16 байт адреса
}
Windows: get_interface_ip_by_index, get_interface_ipv6_by_index, get_default_route_netif_index — заглушки (возвращают 0/-1).
Время
struct timeval tv;
utun_gettimeofday(&tv, NULL); // макрос: на Linux → gettimeofday, на Windows → inline-реализация
Прочее
strcasecmp/strncasecmp— на Windows_stricmp/_strnicmpmemmem— на Windows inline-реализацияcompat_memmempipe— на Windows_pipeс_O_BINARYpoll— на WindowsWSAPoll, флагиPOLLIN/POLLOUTи т.д. определены если отсутствуютssize_t— определён если отсутствуетfcntl— на Windows упрощённая реализация только дляF_SETFL/O_NONBLOCKutun_mkdir— кроссплатформенныйmkdir
Ограничения
- Функции сетевых интерфейсов работают только на POSIX, на Windows — заглушки
get_default_route_netif_indexсоздаёт временный UDP-сокет к8.8.8.8(IPv4) или2001:4860:4860::8888(IPv6) для определения интерфейса- Только IPv4/IPv6;
familyтолькоAF_INETилиAF_INET6
3. API
Байтовый порядок
| Макрос | Назначение |
|---|---|
htobe16(x) / be16toh(x) |
16-bit host ↔ big-endian |
htobe32(x) / be32toh(x) |
32-bit host ↔ big-endian |
htobe64(x) / be64toh(x) |
64-bit host ↔ big-endian |
Основные функции
| Функция | Назначение |
|---|---|
random_bytes(buffer, len) |
Криптостойкие случайные байты. 0 — успех, -1 — ошибка |
get_interface_ip_by_index(ifindex) |
IPv4 адрес интерфейса в network byte order, 0 при ошибке |
get_interface_ipv6_by_index(ifindex, temporary, out) |
IPv6 адрес (temporary=1 — временный privacy-адрес), 0 — успех |
get_default_route_netif_index(family) |
ifindex дефолтного маршрута через connect() к внешнему IP |
Макросы-заменители (условные)
| Макрос | Назначение |
|---|---|
utun_gettimeofday(tv, tz) |
gettimeofday (inline на Windows) |
utun_mkdir(path, mode) |
mkdir |