Describe shared INI parsing and distribute its internal header
This commit is contained in:
1 parent
80eb331d6a
commit
b0f5055c31
2 files changed
+14
-8
No files matched your search
+1
-1
@@ -2,7 +2,7 @@ bin_PROGRAMS = utun
|
||||
noinst_LIBRARIES = libutun.a
|
||||
|
||||
EXTRA_DIST = lwip_tcp/COPYING dnsmasq/COPYING dnsmasq/COPYING-v3 routing_layer/address_profile.h routing_layer/route_ping_doc.md \
|
||||
stream/stream_playback_audio.h stream/stream_playback_audio.cpp
|
||||
stream/stream_playback_audio.h stream/stream_playback_audio.cpp config_ini.h
|
||||
|
||||
stream_core_files = \
|
||||
stream/stream.h \
|
||||
|
||||
@@ -10,6 +10,11 @@ INI-style парсер конфигурационного файла uTun. Чи
|
||||
|
||||
Формат: стандартные `.ini`-секции `[section]`, строки `key=value`, комментарии `#`. Именованные секции через двоеточие: `[server:main]`, `[client:peer1]`, `[network:mynet]`.
|
||||
|
||||
Файл и буфер проходят один разбор. Общие функции в `config_ini.h` удаляют пробелы
|
||||
вокруг имён секций, ключей и значений. Имена секций нечувствительны к регистру,
|
||||
имена ключей чувствительны. Встроенный NUL и физические строки длиннее 1022 байтов
|
||||
до LF запрещены; CR учитывается в этом пределе.
|
||||
|
||||
## 2. Как пользоваться
|
||||
|
||||
```c
|
||||
@@ -29,11 +34,12 @@ free_config(cfg);
|
||||
```
|
||||
|
||||
**Нюансы:**
|
||||
- `parse_config` возвращает `NULL` при ошибках открытия/парсинга — проверяй возврат.
|
||||
- Все строковые поля обрезаются по размерам буфера, переполнение логируется.
|
||||
- `parse_config` возвращает `NULL` при ошибках открытия, чтения, закрытия, памяти и обязательных проверок формата. Некоторые ошибки отдельных опций только логируются и пропускаются; ненулевой результат не гарантирует корректность всех полей.
|
||||
- Обработка длинных значений зависит от поля: часть строк обрезается, `assign_string` отклоняет значение без изменения поля.
|
||||
- Ключи клиента `link` требуют, чтобы сервер (`[server:имя]`) был объявлен выше по файлу. Иначе ошибка.
|
||||
- `tun_enabled` по умолчанию `1`; если задан `tun_ifname` или `tun_ip` — генерируется имя `tun0` при отсутствии. Если нет ни одного TUN-параметра — считается выключенным (режим без root).
|
||||
- `tun_enabled` по умолчанию `0`. При явном включении и отсутствии имени интерфейса используется `tun0`.
|
||||
- IPv6-адреса в `[server:...] addr` поддерживают префиксы `temporary_ipv6:` и `permanent_ipv6:`.
|
||||
- HEX декодируется после проверки каждого символа. Ошибочный список REALITY `short_ids` отклоняется целиком и оставляет `short_id_count=0`; ошибочный последний REALITY-ключ сбрасывает соответствующий `has_*_key`.
|
||||
|
||||
## 3. API
|
||||
|
||||
@@ -76,7 +82,7 @@ free_config(cfg);
|
||||
|
||||
| Функция | Назначение |
|
||||
|---------|------------|
|
||||
| `parse_config(filename)` | Открывает файл, парсит через `parse_config_internal`, возвращает `utun_config*`. `NULL` при ошибке. |
|
||||
| `parse_config(filename)` | Читает и закрывает файл, затем вызывает `parse_config_from_buf`. Возвращает `utun_config*` или `NULL`. |
|
||||
| `parse_config_from_buf(buf, len, filename)` | Парсит конфиг из буфера (in-memory). `filename` используется только для сообщений об ошибках. |
|
||||
| `free_config(config)` | Рекурсивно освобождает все связные списки и сам `utun_config`. Безопасен для `NULL`. |
|
||||
| `print_config(config)` | Выводит всё содержимое конфига через `DEBUG_INFO(DEBUG_CATEGORY_CONFIG, ...)`. Полезно для проверки после парсинга. |
|
||||
@@ -86,12 +92,12 @@ free_config(cfg);
|
||||
|
||||
| Функция | Назначение |
|
||||
|---------|------------|
|
||||
| `trim(str)` | Обрезает пробелы слева и справа (in-place) |
|
||||
| `parse_key_value(line, ...)` | Разбирает строку `key=value`, удаляет комментарии после `#` |
|
||||
| `config_ini_trim(str)` | Общий INI-код: удаляет пробелы слева и справа на месте, сохраняя адрес строки |
|
||||
| `config_ini_key_value(line, ...)` | Общий INI-код: разбирает `key=value`, удаляет комментарий после `#` и пробелы |
|
||||
| `parse_ip_with_netmask(str, ip, netmask)` | Парсит `1.2.3.4/24` или `::1/64` в `struct IP` |
|
||||
| `parse_sockaddr(addr, port, sockaddr)` | Преобразует адрес+порт в `sockaddr_storage` через `getaddrinfo` |
|
||||
| `parse_address_and_port(str, sockaddr)` | Разбирает строку `ip:port` → вызов `parse_sockaddr` |
|
||||
| `get_netif_index(ifname)` | Получает индекс сетевого интерфейса через `if_nametoindex` |
|
||||
| `parse_firewall_rule(rule_str, global)` | Парсит `allow=IP[:port]` или `all` |
|
||||
| `parse_control_allow(rule_str, global)` | Парсит `allow=IP[/CIDR]` |
|
||||
| `hex_to_binary(hex_str, binary, len)` | Конвертит hex-строку в бинарный массив |
|
||||
| `config_ini_hex(hex_str, binary, len)` | Общий INI-код: проверяет весь HEX до декодирования |
|
||||
Reference in new issue
Block a user