Добро пожаловать, Гость. Пожалуйста авторизуйтесь здесь.
FGHIGate на GaNJa NeTWoRK ST@Ti0N - Просмотр сообщения в эхоконференции RU.BINKD
Введите FGHI ссылку:


Присутствуют сообщения из эхоконференции RU.BINKD с датами от 14 Jul 13 17:53:22 до 24 Apr 24 18:49:04, всего сообщений: 1924
Ответить на сообщение К списку сообщений Предыдущее сообщение Следующее сообщение
= Сообщение: 1607 из 1924 ========================================= RU.BINKD =
От   : Nil A                            2:5015/46          04 Jun 21 06:47:56
Кому : Evgeny Chevtaev                                     04 Jun 21 06:47:56
Тема : listen и IPv6
FGHI : area://RU.BINKD?msgid=2:5015/46+60b9a4af
На   : area://RU.BINKD?msgid=2:5010/275+60b973f6
= Кодировка сообщения определена как: CP866 ==================================
Ответ: area://RU.BINKD?msgid=2:5010/275+60b9de4f
==============================================================================
Hello, Evgeny!

Friday June 04 2021 05:29, from Evgeny Chevtaev -> All:

EC> Кто-нибудь знает, в каком виде в директиве listen указывать
EC> IPv6-адрес? Это я про конфиг эхотага, конечно же...

В директиве listen адрес IPv6 пишется в квадратных скобках [], и также опционально можно задать порт через двоеточие.

EC> Если указывать как есть, то он считает, что всё после первого
EC> двоеточия есть порт:

Поэтому парсер binkd конфига и ищет '[', чтобы понять, что это IPv6, в котором двоеточие является частью адреса.

EC> Если указывать в квадратных скобках, то пытается ресолвить:
EC> ? 04 Jun 05:17:21 [1767] servmgr getaddrinfo: Name does not resolve
EC> (8)

Мой getaddrinfo() из линксового glibc отбраковывает адрес указанный вместе со скобочками [].
Я не знаю, как у других это работает.

Далее идёт мой патч, который выкидывает скобочки из адреса IPv6, и в таком виде у меня getaddrinfo() работает как ожидается.

-+- a/readcfg.c
+++ b/readcfg.c
@@ -1650,12 +1650,13 @@ static int read_listen (KEYWORD *key, int wordcount, char **words)
     new_entry.port[0] = '\0';
     if (words[i][0] == '[')
     { /* IPv6 */
-      p = strchr(words[i], ']');
-      if (p && p[1] == ':')
+      strncpy(new_entry.addr, words[i]+1, sizeof(new_entry.addr));
+      p = strchr(new_entry.addr, ']');
+      if (p)
       {
-        snprintf(new_entry.port, sizeof(new_entry.port), "%s", p + 2);
-        p = strchr(new_entry.addr, ']');
-        if (p) p[1] = '\0';
+        p[0] = '\0';
+        if (p[1] == ':')
+          snprintf(new_entry.port, sizeof(new_entry.port), "%s", p + 2);
       }
     } else if ((p = strchr(words[i], ':')) != NULL)
     {

Ещё надо бы увеличить буфер для адреса, а то IPv6 адреса могут быть длинными, особенно если ещё порт указать.

-+- a/readcfg.h
+++ b/readcfg.h
@@ -54,7 +54,7 @@ struct akachain
 struct listenchain
 {
   struct listenchain *next;
-  char addr[42];
+  char addr[256];
   char port[MAXSERVNAME + 1];
 };
 #if defined(WITH_ZLIB) || defined(WITH_BZLIB2)


Best Regards, Nil
--- GoldED+/LNX 1.1.5
* Origin: VDS-OVZ-Разминка: 1 ядро, 512Мб, 10Гб, 1 IP - 90р/мес (2:5015/46)

К главной странице гейта
Powered by NoSFeRaTU`s FGHIGate
Открытие страницы: 0.078280 секунды