Getting SunOS 4.1 to use DNS -and- /etc/hosts (long)

Roger Gonzalez rg at msel.unh.edu
Sun Mar 10 03:13:31 AEST 1991


Sun, for some strange reason, ships their host resolver routines linked
to routines that -only- use /etc/hosts.  I wrestled with this for a
while, until a helpful soul at Boeing sent me a recipe that walked me
through unarchiving some shared object libraries, and rebuilding them
with a different version of a particular routine that uses -only- DNS
instead of /etc/hosts.  This works fine, except that someone in charge
of the name server has removed 'localhost', so that I keep getting
"localhost != 127.0.0.1" messages in the error logs.  Not horrible, but
certainly irritating.  Also, there are a few host addresses that the
nameserver doesn't know that I used to have in /etc/hosts. 

I just thought of an idea that I'd like to bounce off the more experienced.
Keep in mind that I have no source, just the .so files:
- slurp the DNS lookup routine and the /etc/hosts routine out of the .so files
- hack the object files so that the two versions have unique names
- write my own routine that first calls the DNS version, and then /etc/hosts
- make my routine's name and interface look the same as the originals
- rearchive them into their .so's

If this would work, I suspect that there would be a lot of happy SunOS 4.1
sysadmins out there.  In fact, I'm surprised that it hasn't been done
already!  

Am I overlooking something?

-Roger



I've enclosed the recipe here for your viewing pleasure:


	Building the SunOS 4.1 resolver library to access DNS

1. Ensure that the resolver library is built "PIC" by doing the
   following:

		% su root
		% cd /usr/lib/shlib.etc
	        % mkdir tmp
		% cd tmp
		% ar xv /usr/lib/shlib.etc/libresolv.a
		% ls -assert pure-text *.o

	The last command will tell you if there are non-PIC constructs.
	Evidently, there shouldn't be or the resolver can't be made to
	work.

2. Extract contents of libc_pic.a  and /usr/lib/libresolv.a 

	% cd  tmp
	% ar x /usr/lib/shlib.etc/libc_pic.a
	% ar x /usr/lib/libresolv.a

3. Remove the __.SYMDEF file and restore filenames truncated by "ar"

	% rm __.SYMDEF         (note: name begins with 2 underscore char's)
	% mv rpc_dtablesize. rpc_dtablesize.o
	% mv rpc_commondata. rpc_commondata.o
	% mv xccs.multibyte. xccs.multibyte.o

4. Remove the old routine to do the hostname/addr resolution

	% rm gethostent.o

5. Move the libresolv module that contains the redundant 'strncasecmp'

	% rm strncasecmp.o

6. Edit the 'lorder-sparc'

	% cd ..      (assuming you are still in the tmp)
	% cp lorder-sparc lorder-sparc.orig
	% vi lorder-sparc
           ....
	   gethostent.o	      		<< delete this line >>
           ....
           getnetgrent.o
           gethostnamadr.o		<< add this line >>
	   sethostent.o			<<         "   "       >>
           res_query.o			<<         "   "       >>
	   res_mkquero.o		<<         "   "       >>
	   res_send.o			<<         "   "       >>
	   res_debug.o			<<         "   "       >>
	   res_comp.o			<<         "   "       >>
	   res_init.o			<<         "   "       >>

7. Create the new library.

	% make libc.so

8. Test the library before final installation.

	% setenv LD_LIBRARY_PATH `pwd`
   	% your_favorite_test_cmd  (e.g.  telnet, ftp)
	
	If everything appears normal, do the installation.

	% cp libc.so.x.y.z.  /usr/lib      # ensure that libc.so.x.y.z will be
					   # the highest version and does not
					   #  overwrite any existing version
	% /usr/etc/ldconfig
	% unsetenv LD_LIBRARY_PATH

9. Verify that you running with the new library.

	% trace date

 	the first line of output should read:
   			
	open ("usr/lib/ld.so",  ........
 
-- 
"The question of whether a computer can think is no more interesting
 than the question of whether a submarine can swim" - Edsgar W. Dijkstra 
rg@[msel|unhd].unh.edu        |  UNH Marine Systems Engineering Laboratory
r_gonzalez at unhh.bitnet        |  Durham, NH  03824-3525



More information about the Comp.unix.admin mailing list