On Sun, Feb 20, 2011 at 11:45:34AM +0200, Yura Kalinichenko wrote: > Michael Shigorin пишет: > > Здравствуйте. > > Пилю тут урывками свежий nut, > Аналогично. Что радует - оно уже таки нормально конфигурится под ALT >=4. > > - без указания опции "-4" upsd/upsdrvctl не стартуют при > > отсутствии ipv6, поскольку надо там аж 127.0.0.1 -- > > воткнуто по умолчанию в /etc/sysconfig/upsd, спросил апстрим > Я посмотрел как оно было сделано в 2.2.2 и повторил, вряд ли правильно - > но "чтоб работало". По крайней мере upsd поднялся. > > diff -U 2 -r nut-2.6.0.orig/server/upsd.c nut-2.6.0/server/upsd.c > --- nut-2.6.0.orig/server/upsd.c 2010-12-24 15:24:12 +0200 > +++ nut-2.6.0/server/upsd.c 2011-02-12 12:58:33 +0200 > @@ -546,10 +546,11 @@ > /* default behaviour if no LISTEN addres has been specified */ > if (!firstaddr) { > - if (opt_af != AF_INET) { > - listen_add("::1", string_const(PORT)); > - } > > - if (opt_af != AF_INET6) { > + if (opt_af == AF_INET6) { > + listen_add("::1", string_const(PORT)); > + } else if (opt_af == AF_INET) { > listen_add("127.0.0.1", string_const(PORT)); > + } else { > + listen_add("0.0.0.0", string_const(PORT)); > } > } Такой вариант явно никуда не годится - по умолчанию пропадает не только поддержка IPv6, но и привязка к localhost. Вместо этого, вероятно, надо для случая opt_af == AF_UNSPEC (опции -4 или -6 не заданы явно) перед выполнением listen_add("::1", string_const(PORT)) проверять возможность создания сокета AF_INET6. (Патч не тестировался даже gcc.) --- nut-2.6.0/server/upsd.c.alt-ipv6-optional 2010-12-24 16:24:12.000000000 +0300 +++ nut-2.6.0/server/upsd.c 2011-02-20 15:44:01.508000003 +0300 @@ -539,6 +539,19 @@ static void client_readline(ctype_t *cli return; } +static int ipv6_available(void) +{ + int sock_fd; + + if ((sock_fd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)) < 0) { + upsdebug_with_errno(3, "ipv6_available: socket"); + return 0; + } + + close(sock_fd); + return 1; +} + void server_load(void) { stype_t *server; @@ -546,7 +559,9 @@ void server_load(void) /* default behaviour if no LISTEN addres has been specified */ if (!firstaddr) { if (opt_af != AF_INET) { - listen_add("::1", string_const(PORT)); + if (opt_af == AF_INET6 || ipv6_available()) { + listen_add("::1", string_const(PORT)); + } } if (opt_af != AF_INET6) {