2010-10-18 20 views
1

J'essaye d'écrire un petit programme qui ajoutera des alias de mDNS CNAME à mon périphérique de Linux, de sorte qu'il soit accessible par plus d'un "quelque chose.local". nom de domaine.Pourquoi ce code client Avahi ne fonctionne-t-il pas pour ajouter un alias CNAME à ma machine Linux?

La fonction prévue pour ce programme est la même que la avahi-aliases Python script, mais pour éviter une dépendance Python, j'essaye de l'implémenter en C++.

J'ai basé mon code (pour l'instant) sur l'exemple client-publish-service.c inclus dans la distribution de source Avahi. Quand je cours cet exemple inchangé, cela fonctionne comme prévu: en particulier, je vois "MegaPrinter" apparaître dans le navigateur Bonjour sur mon Mac, etc

L'étape suivante consiste à modifier l'exemple de code pour ajouter un enregistrement CNAME d'ajouter des services. Donc, je #IFDEF le avahi_entry_group_add_service() appels et mis cela à la place:

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; 
} 

.... mais il ne fonctionne pas; en particulier, en cours d'exécution de la routine ne me donne que cette sortie:

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

Ce qui est étrange est, non seulement mon appel à avahi_entry_group_add_record() échouer avec le code AVAHI_ERR_NOT_SUPPORTED, mais aussi mon appel de test jetable (à l'intérieur du printf ("add_record")) échoue également avec le même code d'erreur. Mais cet appel est copié verbatim à partir du fichier avahi-client/client-test.c qui vient avec Avahi, donc il semble que ce devrait être un appel valide.

Quelqu'un peut-il suggérer pourquoi ces appels pourraient échouer, ou ce que je fais mal ici? Dans le cas où cela serait utile, le code source complet pour le test est here.

Répondre

6

J'ai finalement trouvé celui-ci ... le problème était que l'argument (AvahiPublishFlags) à avahi_entry_group_add_record devait inclure le bit AVAHI_PUBLISH_USE_MULTICAST, et pas seulement être zéro. Assez curieusement, le script Python que j'ai utilisé comme exemple n'incluait pas ce bit.

Dans tous les cas, une version de travail du code source est here, au cas où quelqu'un serait intéressé.

+0

Merci de partager le code! Je l'utilise. – benzado

+0

après avoir compilé et exécuté 'publish_cnames www.bunsen.local fairplay.bunsen.local', j'ai essayé d'envoyer un ping à' www.bunsen.local' depuis un autre système sur le réseau mais je n'ai pas réussi. – neckTwi

+0

Je peux 'ping bunsen.local' – neckTwi