Почему этот клиентский код Avahi не работает для добавления псевдонима CNAME на мою Linux-машину? - PullRequest
2 голосов
/ 19 октября 2010

Я пытаюсь написать небольшую программу, которая добавит псевдонимы mDNS CNAME на мое устройство Linux, чтобы к нему можно было получить доступ более чем через один файл "thing.local ". доменное имя.

Функция, предназначенная для этой программы, аналогична сценарию Python *1003* avahi-aliases, но во избежание зависимости от Python я пытаюсь реализовать ее в C ++.

Мой код (на данный момент) основан на примере client-publish-service.c, который включен в исходный дистрибутив Avahi. Когда я запускаю этот пример без изменений, он работает, как и ожидалось: в частности, я вижу, как «MegaPrinter» отображается в Bonjour Browser на моем Mac и т. Д.

Мой следующий шаг - изменить пример кода, чтобы добавить запись CNAME вместо добавления служб. Поэтому я #ifdef вызываю вызовы avahi_entry_group_add_service () и вставляю это вместо:

 const int TTL = 60;

 char rdata[] = "\0msli-10135114\0local";   // "msli10135114.local." is the device's normal FQDN, which I want to make aliases to
 rdata[0]   = 13;
 rdata[14]  = 5;

 printf("rdata=[%s] _moduleName=[%s]\n", rdata, _moduleName);
 printf("add_record: %s\n", avahi_strerror(avahi_entry_group_add_record (group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, (AvahiPublishFlags)0, "TestX", 0x01, 0x10, 120, "\5booya", 6)));

 if ((ret = avahi_entry_group_add_record(
    group,                 //AvahiEntryGroup *group,
    AVAHI_IF_UNSPEC,       //AvahiIfIndex interface,
    AVAHI_PROTO_UNSPEC,    //AvahiProtocol protocol,
    (AvahiPublishFlags)0,  //AvahiPublishFlags flags,
    _moduleName,           //const char *name,
    AVAHI_DNS_CLASS_IN,    //uint16_t clazz,
    AVAHI_DNS_TYPE_CNAME,  //uint16_t type,
    TTL,                   //uint32_t ttl,
    rdata,                 //const void *rdata,
    sizeof(rdata)          //size_t size
    )) < 0)
 {
    if (ret == AVAHI_ERR_COLLISION) goto collision;
    fprintf(stderr, "Failed to add module record: %s\n", avahi_strerror(ret));
    goto fail;
 }

.... но это не работает; в частности, выполнение подпрограммы дает мне только такой вывод:

msli-10135114local] _moduleName=[Wild-Tracks-1]
add_record: Not supported 
Failed to add module record: Not supported

Что странно, не только мой собственный вызов avahi_entry_group_add_record () завершается ошибкой с кодом AVAHI_ERR_NOT_SUPPORTED, но и мой тестовый вызов одноразового использования (внутри printf ("add_record")) также завершается с тем же кодом ошибки. Но этот вызов дословно копируется из файла avahi-client / client-test.c, поставляемого с Avahi, поэтому кажется, что это должен быть допустимый вызов.

Кто-нибудь может подсказать, почему эти звонки могут быть неудачными или что я здесь не так делаю?

Если это поможет, полный исходный код теста здесь .

1 Ответ

6 голосов
/ 04 июня 2011

Я наконец понял это ... проблема была в том, что аргумент (AvahiPublishFlags) для avahi_entry_group_add_record должен был включать бит AVAHI_PUBLISH_USE_MULTICAST, а не просто быть нулем.Как ни странно, скрипт Python, который я использовал в качестве примера, не включал этот бит.

В любом случае, рабочая версия исходного кода - здесь , на случай, если кому-то будет интересно.

...