Nil A
unread,Jun 4, 2021, 12:00:01 AM6/4/21You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to
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