Wednesday, October 20, 2010
If you read this, and find it useful or not, please leave a comment below. Thank you.
I don't usually post something non surveillance related, but I had to do the steps below and thought it was too painstaking to not share with the world. So here goes my post on how to port Apple's Bonjour service to uClinux. I just happened to be using a Coldfire 5272 processor, but I'm sure this is similar for other processors using uClinux:
Thanks to Rob Brown for his post on this subject back in 2007. This includes
some of his instructions mixed with my own instructions and experiences to
address the newer version of Apple's BONJOUR.
Step 1. Download the Bonjour for Posix package from the Apple site. Make sure
the Bonjour version matches 214.3.2. If the latest version is newer than
214.3.2, goto the archives and get the 214.3.2 version. If you'd rather port the
newer version than the steps below may not cover everything that is needed.
Step 2. Create an empty "mDNSResponder" directory and place that directory in
the same place as all the other Linux applications for your device. In my case
that directory was USR\SRC\C\.
Step 3. Copy only the following files from the Apple package (most are in the
POSIX source directory) into the empty mDNSResponder directory:
makefile (from template below)
Step 4. Copy the makefile template from below, then modify it (as well as any
parent makefiles) to accomadate your particular device and uclinux structure. As
a tip, take the other makefiles for your other device applications and look at
how they are created. You will likely have to change your paths for the OBJSDIR,
INCLUDEDIR, SCRIPTDIR, etc.
Step 5. Once you have your 'make' building without issues, and your image file
running on your device, you should be able to call 'mDNSResponder'from your
Step 6. Usage: From the linux command prompt on your device, call mDNSResponder.
Use the flags to customize the way that your device will be displayed on the
Bonjour client app or IE plugin. See example below:
mDNSResponder -n MyDEvice -t _http._tcp. -p 80 &
I included the line above in my linux /etc/RC file. This allows bonjour to begin
at startup and is called with the following flags.
-n = The name that will be displayed in the Bonjour client app or IE plugin
-t = This is the 'type' that Bonjour uses. This is important because the Bonjour
IE plugin only sees devices with the '_http._tcp.' type. Most printers use this
type. If you want your device to be seen with the IE plugin, use this type...not
the default type that mDNSResponder starts with.
-p = This is the port that Bonjour binds to. I did a bind to port 80 to allow me
to click on the name in the IE Plugin and pull up the configuration webpage on
my device. My device runs BOA webserver on port 80, so this allows me to
configure my device's IP without having to know what the IP is initially.
& = If you don't know linux, you need to add the '&' to make the process run in
the background. I tried using the flag to make mDNSResponder run as a deamon,
but it failed every time within my uclinux build, so this works well enough for
Usage: I start the IE Bonjour plugin ; power up my device and it appears as
'MyDevice' in the Bonjour window of IE. I then click on it to instantly take me
to the device's configuration page. I can then set the IP, view the IP, or
configure my device in whatever way I want. This is the end goal! Enjoy!
Hope this helps someone. Feel free to post questions and comments.
Cut and paste the text below to generate the makefile that goes into the
mDNSResponder folder above.
# makefile writen to produce mDNSResponder app for uClinux
OBJSDIR = ../../../build/user_obj
INCLUDEDIR = ../../include
SCRIPTDIR = ../../scripts
EXEC = mDNSResponder
OBJS = $(OBJSDIR)/$(EXEC)/mDNSPosix.o $(OBJSDIR)/$(EXEC)/GenLinkedList.o
OBJS += $(OBJSDIR)/$(EXEC)/mDNS.o $(OBJSDIR)/$(EXEC)/DNSCommon.o
OBJS += $(OBJSDIR)/$(EXEC)/DNSDigest.o $(OBJSDIR)/$(EXEC)/Responder.o
CFILES = mDNSPosix.c GenLinkedList.c mDNSUNP.c mDNS.c DNSCommon.c mDNSDebug.c
uDNS.c DNSDigest.c Responder.c PlatformCommon.c
OBJSCALL = $(OBJS)
CFLAGS_OS = -DNOT_HAVE_SA_LEN -DUSES_NETLINK -DHAVE_LINUX -DTARGET_OS_LINUX
CFLAGS += -DPID_FILE=\"/var/run/mdnsd.pid\"
CFLAGS += -DNOT_HAVE_SA_LEN -DUSES_NETLINK -DHAVE_LINUX -DNOT_HAVE_DAEMON
CFLAGS += -Wall
CFLAGS += -I$(INCLUDEDIR)
$(OBJSDIR)/$(EXEC)/%.o : %.c
$(CC) -c $(CFLAGS) $< -o $@
$(CC) $(LDFLAGS) -o $(OBJSDIR)/$(EXEC)/$@ $(OBJS) $(LDLIBS)
$(ROMFSINST) $(OBJSDIR)/$(EXEC)/$(EXEC) /bin/$(EXEC)
-rm -f $(OBJSDIR)/$(EXEC)/$(EXEC) $(OBJSDIR)/$(EXEC)/*.elf