Тема: listen и IPv6
Показать сообщение отдельно
  #2  
Старый 04.06.2021, 08:03
Nil A
Guest
 
Сообщений: n/a
По умолчанию listen и IPv6

Nil A написал(а) к Evgeny Chevtaev в Jun 21 06:47:56 по местному времени:

Нello, 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(newentry.addr, words[i]+1, sizeof(newentry.addr));
+ p = strchr(new_entry.addr, ']');
+ if (p)
{
- snprintf(newentry.port, sizeof(newentry.port), "%s", p + 2);
- p = strchr(new_entry.addr, ']');
- if (p) p[1] = '\0';
+ p[0] = '\0';
+ if (p[1] == ':')
+ snprintf(newentry.port, sizeof(newentry.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(WITНZLIB) || defined(WITНBZLIB2)


Best Regards, Nil
--- GoldED+/LNX 1.1.5
Ответить с цитированием