So here I am, trying to get my home network into shape, and fiddling around with Rendezvous to figure out how it works. I've had the source code to Apple's latest mDNSResponder sitting on my hard disk for a couple of weeks now, and after setting it up on my RedHat box I decided to get it working under Cygwin.
15 minutes later, I had mDNSResponderPosix running on my XP box under Cygwin. The port mainly consists of brutally hacking out IPv6 support (by studiously removing any references to AF_INET6) and hardwiring if_nametoindex() (which I can't find inside the Cygwin libraries) to always return 1 - I have only the one interface on that box, so this wanton hack works fine for me.
(I do seem to have an outstanding issue with the XP port, since it does not advertise some services properly, but I'll check that later. It was a hack, anyway...)
- First off, the mDNSResponderPosix configuration file uses an amazingly dumb format. Sure, it's just sample code, but using ^A (Ctrl+A) to separate attributes is just too impractical to be of any real use, even for testing (mine now use semicolons as separators, at least until I find any conflicts).
- You can't, in fact, use mDNSResponderPosix to advertise services for other machines - you have to use mDNSProxyResponderPosix, which requires a separate invocation for each service you want to advertise - i.e., no pretty configuration file either, and a non-trivial bunch of RAM wasted for each service.
- Panther won't see your nice Rendezvous services if you have the firewall active. That's all well and good, until you realize there is no way to poke a UDP-based hole in your firewall using the GUI. Shame on you, Apple - users may want their firewalls simple, but definetly not dumb.
- There is no comprehensive reference of Rendezvous configuration. I had to download Network Beacon and iRoster to understand a bit more about the services I could define and the parameters available.
Here's a little sample from my Linux box:
# cat /etc/rendezvous.conf The Tao Of Mac _http._tcp. path=/ 80 Public CVS _http._tcp. path=/cgi-bin/cvs/index 80 zeus _ssh._tcp. none 22
The path attribute is the only one I know of so far, and its meaning is pretty obvious. I had to add none to the attributes line on the SSH entry to have mDNSResponderPosix parse the file at all, but your mileage may vary.
And this is the first thing I don't like about Rendezvous - the lack of an attribute reference for each standard service. The other is the lack of a comprehensive way to set up non-local services - for instance, I might want to advertise a remote file server that is on another LAN without mucking about with mDNSProxyResponderPosix. Sure, Network Beacon does that flawlessly, but I want a generic UNIX daemon I can recompile for whatever I'm running, not a GUI app.
There are some interesting possibilities I'll be exploring, like dynamically advertising URLs to the latest updated items on my blogroll. I've already discovered Python bindings for Rendezvous, and once I find the time to learn a bit more Python, I'll probably start with this Twisted-Python post.
Time will tell, I guess. Now, back to our regularly scheduled programming.