Dancing With Rendezvous


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...)

While configuring it on either XP or Linux, however, I came across a few interesting issues:

  • 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.

The good news is, it works. Panther picked up on SSH and HTTP services as soon as I added them to a Rendezvous responder, and I'm currently experimenting with SMB and AppleShare services.

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 _http._tcp. services show up in the Applications/Safari Rendezous menu, and the SSH service inside Terminal.app in the "connect to..." menu.

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.