Linux デバイスに mDNS CNAME エイリアスを追加して、複数の「something.local」経由でアクセスできるようにする小さなプログラムを作成しようとしています。ドメイン名。
このプログラムの意図する機能はavahi-aliases Python scriptと同じですが、Python への依存を避けるために、代わりに C++ で実装しようとしています。
コードは (今のところ) Avahi ソース配布に含まれている client-publish-service.c の例に基づいています。この例を変更せずに実行すると、期待どおりに動作します。特に、Mac の Bonjour ブラウザに「MegaPrinter」が表示されるなどの現象が見られます。
次のステップは、サンプル コードを変更して、サービスを追加する代わりに CNAME レコードを追加することです。そこで、avahi_entry_group_add_service() 呼び出しを #ifdef して、代わりにこれを入れます。
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 に付属の avahi-client/client-test.c ファイルからそのままコピーされているため、有効な呼び出しであるように思われます。
これらの呼び出しが失敗する理由、またはここで私が間違っていることを誰かが提案できますか?
テストの完全なソース コードはこちらにあります。