home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3233 < prev    next >
Internet Message Format  |  1991-04-22  |  55KB

  1. From: wisner@ims.alaska.edu (Bill Wisner)
  2. Newsgroups: alt.sources
  3. Subject: resolv+ -- improved resolver library -- part01/02
  4. Message-ID: <1991Apr23.024655.21043@ims.alaska.edu>
  5. Date: 23 Apr 91 02:46:55 GMT
  6.  
  7. It really pains me to admit that there's anything good in Ultrix, but I'm
  8. afraid I have to: they've added a facility that allows the administrator to
  9. choose what facility is to be used for looking up hostname (and address)
  10. queries -- BIND, the host table, or YP.
  11.  
  12. I've long wanted to be able to do something similar, so today in a fit of
  13. envy (or something similar) I hacked up the standard resolver library from
  14. the BIND 4.8.3 distribution and made it possible to choose between BIND and
  15. /etc/hosts lookups.  I didn't bother with YP, since if it's set up properly
  16. it'll use both methods anyway.
  17.  
  18. Here it is.
  19.  
  20. Note: Yellow Pages is a registered trademark of British Telecom plc, but I
  21. don't care.
  22.  
  23. Bill Wisner <wisner@ims.alaska.edu> Gryphon Gang Fairbanks AK 99775
  24. /* you are not expected to understand this */
  25.  
  26. #! /bin/sh
  27. # This is a shell archive.  Remove anything before this line, then unpack
  28. # it by saving it into a file and typing "sh file".  To overwrite existing
  29. # files, type "sh file -c".  You can also feed this as standard input via
  30. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  31. # will see the following message at the end:
  32. #        "End of archive 1 (of 2)."
  33. # Contents:  MANIFEST Makefile README SUN4.1 herror.c include
  34. #   include/arpa include/arpa/inet.h include/netdb.h include/resolv.h
  35. #   mktemp.c named named/sethostent.c res_comp.c res_init.c
  36. #   res_mkquery.c strcasecmp.c strerror.c strpbrk.c
  37. # Wrapped by wisner@hayes on Mon Apr 22 18:43:57 1991
  38. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  39. if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  40.   echo shar: Will not clobber existing file \"'MANIFEST'\"
  41. else
  42. echo shar: Extracting \"'MANIFEST'\" \(0 characters\)
  43. sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
  44. END_OF_FILE
  45. if test 0 -ne `wc -c <'MANIFEST'`; then
  46.     echo shar: \"'MANIFEST'\" unpacked with wrong size!
  47. fi
  48. # end of 'MANIFEST'
  49. fi
  50. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  51.   echo shar: Will not clobber existing file \"'Makefile'\"
  52. else
  53. echo shar: Extracting \"'Makefile'\" \(1639 characters\)
  54. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  55. X#
  56. X# Copyright (c) 1988 Regents of the University of California.
  57. X# All rights reserved.
  58. X#
  59. X# Redistribution and use in source and binary forms are permitted
  60. X# provided that this notice is preserved and that due credit is given
  61. X# to the University of California at Berkeley. The name of the University
  62. X# may not be used to endorse or promote products derived from this
  63. X# software without specific prior written permission. This software
  64. X# is provided ``as is'' without express or implied warranty.
  65. X#
  66. X#    from @(#)Makefile    5.16.1 (Berkeley) 3/14/88
  67. X#
  68. XSRCS=    herror.c res_comp.c res_debug.c res_init.c res_mkquery.c res_query.c \
  69. X    res_send.c named/gethostnamadr.c named/sethostent.c \
  70. X    mktemp.c strcasecmp.c strpbrk.c strerror.c
  71. XOBJS=    herror.o res_comp.o res_debug.o res_init.o res_mkquery.o res_query.o \
  72. X    res_send.o gethostnamadr.o sethostent.o \
  73. X    mktemp.o strcasecmp.o strpbrk.o strerror.o
  74. XDEFS=    -DDEBUG
  75. XCFLAGS=    -O ${DEFS} -Iinclude
  76. X
  77. Xlibresolv.a: ${OBJS}
  78. X    ar cru libresolv.a ${OBJS}
  79. X    ranlib libresolv.a
  80. X
  81. Xinstall: libresolv.a
  82. X    install -o bin -g bin -m 644 libresolv.a ${DESTDIR}/usr/lib
  83. X    ranlib ${DESTDIR}/usr/lib/libresolv.a
  84. X
  85. X.c.o:
  86. X    ${CC} ${CFLAGS} -c $*.c
  87. X    -ld -x -r $*.o
  88. X    mv a.out $*.o
  89. X
  90. Xgethostnamadr.o: named/gethostnamadr.c
  91. X    ${CC} -c ${CFLAGS} named/gethostnamadr.c
  92. X    -ld -x -r gethostnamadr.o
  93. X    mv a.out gethostnamadr.o
  94. X
  95. Xsethostent.o: named/sethostent.c
  96. X    ${CC} -c ${CFLAGS} named/sethostent.c
  97. X    -ld -x -r sethostent.o
  98. X    mv a.out sethostent.o
  99. X
  100. Xclean: FRC
  101. X    rm -f *.o errs a.out core libresolv.a tags
  102. X
  103. Xdepend: FRC
  104. X    mkdep ${CFLAGS} ${SRCS}
  105. X
  106. XFRC:
  107. X
  108. X# DO NOT DELETE THIS LINE -- mkdep uses it.
  109. X# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
  110. END_OF_FILE
  111. if test 1639 -ne `wc -c <'Makefile'`; then
  112.     echo shar: \"'Makefile'\" unpacked with wrong size!
  113. fi
  114. # end of 'Makefile'
  115. fi
  116. if test -f 'README' -a "${1}" != "-c" ; then 
  117.   echo shar: Will not clobber existing file \"'README'\"
  118. else
  119. echo shar: Extracting \"'README'\" \(2480 characters\)
  120. sed "s/^X//" >'README' <<'END_OF_FILE'
  121. XThis is a modified version of the resolver library from BIND 4.8.3.
  122. XIn this version, you can configure whether hostname lookups are done
  123. Xwith BIND, the host table, or both, and in what order.  This is an
  124. Xidea that I stole shamelessly from Ultrix.
  125. X
  126. XTo configure hostname lookups, edit /etc/resolv.conf.  Add an "order"
  127. Xline to the file.  The order line should contain "bind" and/or "local"
  128. Xseperated by commas.  The methods listed will be used in their given order.
  129. X
  130. Xorder        bind        - Use BIND only.  This is the default.
  131. Xorder        bind,local    - If BIND lookup fails, resort to the host
  132. X                  table.
  133. Xorder        local,bind    - Look at the host table before trying BIND.
  134. Xorder        local        - If you run your system like Fred Flintstone.
  135. X
  136. XOther than this change, this resolver library functions exactly like that
  137. Xin BIND 4.8.3.
  138. X
  139. XNo site-specific configuration should be necessary before compiling; just
  140. Xrun make.  Once the library is compiled it can be installed in a few
  141. Xdifferent ways.
  142. X
  143. XYou can copy libresolv.a into /usr/lib/libresolv.a and compile all your
  144. Xnetworking programs with -lresolv.  This is the low-impact method, though
  145. Xit does require a bit of extra work when compiling things later.
  146. X
  147. XYou can incorporate the modules in libresolv.a into your system's C library.
  148. XHow to do this is left as an exercise for the reader.  (If you're clever
  149. Xenough to do this you don't need me to tell you how.  If you're not, you're
  150. Xbetter off not mucking about with things you don't understand.)
  151. X
  152. XIf you're running SunOS 4.1, you can incorporate this resolver library into
  153. Xyour system's shared library.  If you do this, all of your networking
  154. Xprograms will be able to use the resolver library without having to be
  155. Xrecompiled.  This is especially handy if you don't use NIS.  Instructions
  156. Xfor this method are in the file SUN4.1.  If you choose this method you must
  157. Xadd -pic to CFLAGFS before compiling.
  158. X
  159. XUnless you've chosen the last installation method, you will have to recompile
  160. Xyour networking programs before you see much of a benefit in using this
  161. Xpackage.  If you don't have a source code license, don't feel bad: you're
  162. Xexactly like most of the rest of us.  Fortunately, the source code for the
  163. XBerkeley networking software is publically available from many anonymous FTP
  164. Xsites.
  165. X
  166. XIf your system runs a particularly crummy version of UNIX, you may have
  167. Xto copy some of the headers in the include subdirectory into /usr/include,
  168. Xparticularly netdb.h.
  169. X
  170. XBill Wisner <wisner@ims.alaska.edu>
  171. X22 April 1991
  172. END_OF_FILE
  173. if test 2480 -ne `wc -c <'README'`; then
  174.     echo shar: \"'README'\" unpacked with wrong size!
  175. fi
  176. # end of 'README'
  177. fi
  178. if test -f 'SUN4.1' -a "${1}" != "-c" ; then 
  179.   echo shar: Will not clobber existing file \"'SUN4.1'\"
  180. else
  181. echo shar: Extracting \"'SUN4.1'\" \(2342 characters\)
  182. sed "s/^X//" >'SUN4.1' <<'END_OF_FILE'
  183. XTo build a resolver library suitable for inclusion in a SunOS 4.1 shared
  184. Xlibrary, edit the Makefile before compiling.  It contains three "ld"
  185. Xcommands, each of which is followed by a "mv" command.  Remove all three
  186. X"ld"s and all three "mv"s.
  187. X
  188. XThe following instructions for incorporating a resolver library into the
  189. Xstandard SunOS 4.1 shared library were originally posted to USENET by Greg
  190. XEarle of Sun (if memory serves -- unfortunately, I didn't save the headers).
  191. X
  192. XTo get complete instructions, append the remainder of this file to
  193. X/usr/lib/shlib.etc/README.  Then, color by numbers.
  194. X
  195. X(I shouldn't have to point out that instead of /usr/lib/libresolv.a, you
  196. Xshould use the libresolv.a built from this package.)
  197. X
  198. X----------------------------------------------------------------------
  199. X
  200. XSupplemental instructions for building a shared libc.so that uses the resolver
  201. Xfor hostname/addr resolution:
  202. X
  203. X10. Extract the contents of libc_pic.a and /usr/lib/libresolv.a into the
  204. X    tmp directory:
  205. X    % cd tmp
  206. X    % ar x ../libc_pic.a
  207. X    % ar x /usr/lib/libresolv.a
  208. X
  209. X    The libresolv.a (apparently) contains object modules that are position
  210. X    independant, so they can be added to the libc_pic modules without fear.
  211. X
  212. X11. Remove the old routine to do the hostname/addr resolution:
  213. X    % rm gethostent.o
  214. X
  215. X12. Remove the libresolv module that contains `strncasecmp' (which is now
  216. X    in the main C library, so it is redundant):
  217. X    % rm strcasecmp.o
  218. X
  219. X13. Remove the libresolv module that contains mktemp and mkstemp, since
  220. X    the SunOS versions will do just as well.
  221. X    % rm mktemp.o
  222. X
  223. X14. Now put the SunOS version of mktemp back into place.
  224. X    % ar x ../libc_pic.a mktemp.o
  225. X
  226. X15. As mentioned in step 5 above, edit the file `lorder-sparc' in the ..
  227. X    directory.  Remove the reference to `gethostent.o' and add the
  228. X    references to the resolver library routines by applying this patch:
  229. X
  230. X    % diff -rc2 lorder-sparc.orig lorder-sparc
  231. X    *** lorder-sparc.orig   Thu Feb  8 05:27:46 1990
  232. X    --- lorder-sparc    Mon Apr  9 12:58:59 1990
  233. X    ***************
  234. X    *** 150,154 ****
  235. X      getwd.o
  236. X      getnetgrent.o
  237. X    ! gethostent.o
  238. X      ypxdr.o
  239. X      ttyname.o
  240. X    --- 150,161 ----
  241. X      getwd.o
  242. X      getnetgrent.o
  243. X    ! gethostnamadr.o
  244. X    ! sethostent.o
  245. X    ! res_query.o
  246. X    ! res_mkquery.o
  247. X    ! res_send.o
  248. X    ! res_debug.o
  249. X    ! res_comp.o
  250. X    ! res_init.o
  251. X      ypxdr.o
  252. X      ttyname.o
  253. X
  254. X14. Continue as above, from steps 6 to 9.
  255. X
  256. END_OF_FILE
  257. if test 2342 -ne `wc -c <'SUN4.1'`; then
  258.     echo shar: \"'SUN4.1'\" unpacked with wrong size!
  259. fi
  260. # end of 'SUN4.1'
  261. fi
  262. if test -f 'herror.c' -a "${1}" != "-c" ; then 
  263.   echo shar: Will not clobber existing file \"'herror.c'\"
  264. else
  265. echo shar: Extracting \"'herror.c'\" \(1961 characters\)
  266. sed "s/^X//" >'herror.c' <<'END_OF_FILE'
  267. X/*
  268. X * Copyright (c) 1987 Regents of the University of California.
  269. X * All rights reserved.
  270. X *
  271. X * Redistribution and use in source and binary forms are permitted
  272. X * provided that: (1) source distributions retain this entire copyright
  273. X * notice and comment, and (2) distributions including binaries display
  274. X * the following acknowledgement:  ``This product includes software
  275. X * developed by the University of California, Berkeley and its contributors''
  276. X * in the documentation or other materials provided with the distribution
  277. X * and in all advertising materials mentioning features or use of this
  278. X * software. Neither the name of the University nor the names of its
  279. X * contributors may be used to endorse or promote products derived
  280. X * from this software without specific prior written permission.
  281. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  282. X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  283. X * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  284. X */
  285. X
  286. X#if defined(LIBC_SCCS) && !defined(lint)
  287. Xstatic char sccsid[] = "@(#)herror.c    6.5 (Berkeley) 6/1/90";
  288. X#endif /* LIBC_SCCS and not lint */
  289. X
  290. X#include <sys/types.h>
  291. X#include <sys/uio.h>
  292. X
  293. Xchar    *h_errlist[] = {
  294. X    "Error 0",
  295. X    "Unknown host",                /* 1 HOST_NOT_FOUND */
  296. X    "Host name lookup failure",        /* 2 TRY_AGAIN */
  297. X    "Unknown server error",            /* 3 NO_RECOVERY */
  298. X    "No address associated with name",    /* 4 NO_ADDRESS */
  299. X};
  300. Xint    h_nerr = { sizeof(h_errlist)/sizeof(h_errlist[0]) };
  301. X
  302. Xextern int    h_errno;
  303. X
  304. X/*
  305. X * herror --
  306. X *    print the error indicated by the h_errno value.
  307. X */
  308. Xherror(s)
  309. X    char *s;
  310. X{
  311. X    struct iovec iov[4];
  312. X    register struct iovec *v = iov;
  313. X
  314. X    if (s && *s) {
  315. X        v->iov_base = s;
  316. X        v->iov_len = strlen(s);
  317. X        v++;
  318. X        v->iov_base = ": ";
  319. X        v->iov_len = 2;
  320. X        v++;
  321. X    }
  322. X    v->iov_base = (u_int)h_errno < h_nerr ?
  323. X        h_errlist[h_errno] : "Unknown error";
  324. X    v->iov_len = strlen(v->iov_base);
  325. X    v++;
  326. X    v->iov_base = "\n";
  327. X    v->iov_len = 1;
  328. X    writev(2, iov, (v - iov) + 1);
  329. X}
  330. END_OF_FILE
  331. if test 1961 -ne `wc -c <'herror.c'`; then
  332.     echo shar: \"'herror.c'\" unpacked with wrong size!
  333. fi
  334. # end of 'herror.c'
  335. fi
  336. if test ! -d 'include' ; then
  337.     echo shar: Creating directory \"'include'\"
  338.     mkdir 'include'
  339. fi
  340. if test ! -d 'include/arpa' ; then
  341.     echo shar: Creating directory \"'include/arpa'\"
  342.     mkdir 'include/arpa'
  343. fi
  344. if test -f 'include/arpa/inet.h' -a "${1}" != "-c" ; then 
  345.   echo shar: Will not clobber existing file \"'include/arpa/inet.h'\"
  346. else
  347. echo shar: Extracting \"'include/arpa/inet.h'\" \(1612 characters\)
  348. sed "s/^X//" >'include/arpa/inet.h' <<'END_OF_FILE'
  349. X/*
  350. X * Copyright (c) 1983 Regents of the University of California.
  351. X * All rights reserved.
  352. X *
  353. X * Redistribution and use in source and binary forms are permitted
  354. X * provided that: (1) source distributions retain this entire copyright
  355. X * notice and comment, and (2) distributions including binaries display
  356. X * the following acknowledgement:  ``This product includes software
  357. X * developed by the University of California, Berkeley and its contributors''
  358. X * in the documentation or other materials provided with the distribution
  359. X * and in all advertising materials mentioning features or use of this
  360. X * software. Neither the name of the University nor the names of its
  361. X * contributors may be used to endorse or promote products derived
  362. X * from this software without specific prior written permission.
  363. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  364. X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  365. X * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  366. X *
  367. X *    @(#)inet.h    5.4 (Berkeley) 6/1/90
  368. X */
  369. X
  370. X/* External definitions for functions in inet(3) */
  371. X
  372. X#ifdef __STDC__
  373. Xextern unsigned long inet_addr(const char *);
  374. Xextern char *inet_ntoa(struct in_addr);
  375. Xextern struct in_addr inet_makeaddr(int , int);
  376. Xextern unsigned long inet_network(const char *);
  377. Xextern unsigned long inet_lnaof(struct in_addr);
  378. Xextern unsigned long inet_netof(struct in_addr);
  379. X#else
  380. Xextern unsigned long inet_addr();
  381. Xextern char *inet_ntoa();
  382. Xextern struct in_addr inet_makeaddr();
  383. Xextern unsigned long inet_network();
  384. Xextern unsigned long inet_lnaof();
  385. Xextern unsigned long inet_netof();
  386. X#endif
  387. END_OF_FILE
  388. if test 1612 -ne `wc -c <'include/arpa/inet.h'`; then
  389.     echo shar: \"'include/arpa/inet.h'\" unpacked with wrong size!
  390. fi
  391. # end of 'include/arpa/inet.h'
  392. fi
  393. if test -f 'include/netdb.h' -a "${1}" != "-c" ; then 
  394.   echo shar: Will not clobber existing file \"'include/netdb.h'\"
  395. else
  396. echo shar: Extracting \"'include/netdb.h'\" \(3034 characters\)
  397. sed "s/^X//" >'include/netdb.h' <<'END_OF_FILE'
  398. X/*-
  399. X * Copyright (c) 1980, 1983, 1988 Regents of the University of California.
  400. X * All rights reserved.
  401. X *
  402. X * Redistribution and use in source and binary forms are permitted
  403. X * provided that: (1) source distributions retain this entire copyright
  404. X * notice and comment, and (2) distributions including binaries display
  405. X * the following acknowledgement:  ``This product includes software
  406. X * developed by the University of California, Berkeley and its contributors''
  407. X * in the documentation or other materials provided with the distribution
  408. X * and in all advertising materials mentioning features or use of this
  409. X * software. Neither the name of the University nor the names of its
  410. X * contributors may be used to endorse or promote products derived
  411. X * from this software without specific prior written permission.
  412. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  413. X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  414. X * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  415. X *
  416. X *    @(#)netdb.h    5.11 (Berkeley) 5/21/90
  417. X */
  418. X
  419. X#define    _PATH_HEQUIV    "/etc/hosts.equiv"
  420. X#define    _PATH_HOSTS    "/etc/hosts"
  421. X#define    _PATH_NETWORKS    "/etc/networks"
  422. X#define    _PATH_PROTOCOLS    "/etc/protocols"
  423. X#define    _PATH_SERVICES    "/etc/services"
  424. X
  425. X/*
  426. X * Structures returned by network data base library.  All addresses are
  427. X * supplied in host order, and returned in network order (suitable for
  428. X * use in system calls).
  429. X */
  430. Xstruct    hostent {
  431. X    char    *h_name;    /* official name of host */
  432. X    char    **h_aliases;    /* alias list */
  433. X    int    h_addrtype;    /* host address type */
  434. X    int    h_length;    /* length of address */
  435. X    char    **h_addr_list;    /* list of addresses from name server */
  436. X#define    h_addr    h_addr_list[0]    /* address, for backward compatiblity */
  437. X};
  438. X
  439. X/*
  440. X * Assumption here is that a network number
  441. X * fits in 32 bits -- probably a poor one.
  442. X */
  443. Xstruct    netent {
  444. X    char        *n_name;    /* official name of net */
  445. X    char        **n_aliases;    /* alias list */
  446. X    int        n_addrtype;    /* net address type */
  447. X    unsigned long    n_net;        /* network # */
  448. X};
  449. X
  450. Xstruct    servent {
  451. X    char    *s_name;    /* official service name */
  452. X    char    **s_aliases;    /* alias list */
  453. X    int    s_port;        /* port # */
  454. X    char    *s_proto;    /* protocol to use */
  455. X};
  456. X
  457. Xstruct    protoent {
  458. X    char    *p_name;    /* official protocol name */
  459. X    char    **p_aliases;    /* alias list */
  460. X    int    p_proto;    /* protocol # */
  461. X};
  462. X
  463. Xstruct hostent    *gethostbyname(), *gethostbyaddr(), *gethostent();
  464. Xstruct netent    *getnetbyname(), *getnetbyaddr(), *getnetent();
  465. Xstruct servent    *getservbyname(), *getservbyport(), *getservent();
  466. Xstruct protoent    *getprotobyname(), *getprotobynumber(), *getprotoent();
  467. X
  468. X/*
  469. X * Error return codes from gethostbyname() and gethostbyaddr()
  470. X * (left in extern int h_errno).
  471. X */
  472. X
  473. X#define    HOST_NOT_FOUND    1 /* Authoritative Answer Host not found */
  474. X#define    TRY_AGAIN    2 /* Non-Authoritive Host not found, or SERVERFAIL */
  475. X#define    NO_RECOVERY    3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */
  476. X#define    NO_DATA        4 /* Valid name, no data record of requested type */
  477. X#define    NO_ADDRESS    NO_DATA        /* no address, look for MX record */
  478. END_OF_FILE
  479. if test 3034 -ne `wc -c <'include/netdb.h'`; then
  480.     echo shar: \"'include/netdb.h'\" unpacked with wrong size!
  481. fi
  482. # end of 'include/netdb.h'
  483. fi
  484. if test -f 'include/resolv.h' -a "${1}" != "-c" ; then 
  485.   echo shar: Will not clobber existing file \"'include/resolv.h'\"
  486. else
  487. echo shar: Extracting \"'include/resolv.h'\" \(3099 characters\)
  488. sed "s/^X//" >'include/resolv.h' <<'END_OF_FILE'
  489. X/*
  490. X * Copyright (c) 1983, 1987, 1989 The Regents of the University of California.
  491. X * All rights reserved.
  492. X *
  493. X * Redistribution and use in source and binary forms are permitted
  494. X * provided that: (1) source distributions retain this entire copyright
  495. X * notice and comment, and (2) distributions including binaries display
  496. X * the following acknowledgement:  ``This product includes software
  497. X * developed by the University of California, Berkeley and its contributors''
  498. X * in the documentation or other materials provided with the distribution
  499. X * and in all advertising materials mentioning features or use of this
  500. X * software. Neither the name of the University nor the names of its
  501. X * contributors may be used to endorse or promote products derived
  502. X * from this software without specific prior written permission.
  503. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  504. X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  505. X * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  506. X *
  507. X *    @(#)resolv.h    5.10.1 (Berkeley) 6/1/90
  508. X */
  509. X
  510. X/*
  511. X * Resolver configuration file.
  512. X * Normally not present, but may contain the address of the
  513. X * inital name server(s) to query and the domain search list.
  514. X */
  515. X
  516. X#ifndef _PATH_RESCONF
  517. X#define _PATH_RESCONF        "/etc/resolv.conf"
  518. X#endif
  519. X
  520. X/*
  521. X * Global defines and variables for resolver stub.
  522. X */
  523. X#define    MAXNS        3        /* max # name servers we'll track */
  524. X#define    MAXDFLSRCH    3        /* # default domain levels to try */
  525. X#define    MAXDNSRCH    6        /* max # domains in search path */
  526. X#define    LOCALDOMAINPARTS 2        /* min levels in name that is "local" */
  527. X#define MAXSERVICES    2        /* max # of services to search */
  528. X
  529. X#define    RES_TIMEOUT    5        /* min. seconds between retries */
  530. X
  531. Xstruct state {
  532. X    int    retrans;         /* retransmition time interval */
  533. X    int    retry;            /* number of times to retransmit */
  534. X    long    options;        /* option flags - see below. */
  535. X    int    nscount;        /* number of name servers */
  536. X    struct    sockaddr_in nsaddr_list[MAXNS];    /* address of name server */
  537. X#define    nsaddr    nsaddr_list[0]        /* for backward compatibility */
  538. X    u_short    id;            /* current packet id */
  539. X    char    defdname[MAXDNAME];    /* default domain */
  540. X    char    *dnsrch[MAXDNSRCH+1];    /* components of domain to search */
  541. X    u_short    order[MAXSERVICES+1];    /* search service order */
  542. X};
  543. X
  544. X#define RES_SERVICE_NONE    0
  545. X#define RES_SERVICE_BIND    1
  546. X#define RES_SERVICE_LOCAL    2
  547. X
  548. X/*
  549. X * Resolver options
  550. X */
  551. X#define RES_INIT    0x0001        /* address initialized */
  552. X#define RES_DEBUG    0x0002        /* print debug messages */
  553. X#define RES_AAONLY    0x0004        /* authoritative answers only */
  554. X#define RES_USEVC    0x0008        /* use virtual circuit */
  555. X#define RES_PRIMARY    0x0010        /* query primary server only */
  556. X#define RES_IGNTC    0x0020        /* ignore trucation errors */
  557. X#define RES_RECURSE    0x0040        /* recursion desired */
  558. X#define RES_DEFNAMES    0x0080        /* use default domain name */
  559. X#define RES_STAYOPEN    0x0100        /* Keep TCP socket open */
  560. X#define RES_DNSRCH    0x0200        /* search up local domain tree */
  561. X
  562. X#define RES_DEFAULT    (RES_RECURSE | RES_DEFNAMES | RES_DNSRCH)
  563. X
  564. Xextern struct state _res;
  565. Xextern char *p_cdname(), *p_rr(), *p_type(), *p_class(), *p_time();
  566. END_OF_FILE
  567. if test 3099 -ne `wc -c <'include/resolv.h'`; then
  568.     echo shar: \"'include/resolv.h'\" unpacked with wrong size!
  569. fi
  570. # end of 'include/resolv.h'
  571. fi
  572. if test -f 'mktemp.c' -a "${1}" != "-c" ; then 
  573.   echo shar: Will not clobber existing file \"'mktemp.c'\"
  574. else
  575. echo shar: Extracting \"'mktemp.c'\" \(2503 characters\)
  576. sed "s/^X//" >'mktemp.c' <<'END_OF_FILE'
  577. X/*
  578. X * Copyright (c) 1987 Regents of the University of California.
  579. X * All rights reserved.
  580. X *
  581. X * Redistribution and use in source and binary forms are permitted
  582. X * provided that the above copyright notice and this paragraph are
  583. X * duplicated in all such forms and that any documentation,
  584. X * advertising materials, and other materials related to such
  585. X * distribution and use acknowledge that the software was developed
  586. X * by the University of California, Berkeley.  The name of the
  587. X * University may not be used to endorse or promote products derived
  588. X * from this software without specific prior written permission.
  589. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  590. X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  591. X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  592. X */
  593. X
  594. X#if defined(LIBC_SCCS) && !defined(lint)
  595. Xstatic char sccsid[] = "@(#)mktemp.c    5.8 (Berkeley - modified) 10/16/89";
  596. X#endif /* LIBC_SCCS and not lint */
  597. X
  598. X#include <sys/types.h>
  599. X#include <sys/file.h>
  600. X#include <sys/stat.h>
  601. X#include <errno.h>
  602. X#include <stdio.h>
  603. X#include <ctype.h>
  604. X
  605. X#ifndef S_ISDIR
  606. X#define S_ISDIR(m)    ((m & 0170000) == 0040000)
  607. X#endif
  608. X
  609. Xmkstemp(path)
  610. X    char *path;
  611. X{
  612. X    int fd;
  613. X
  614. X    return (_gettemp(path, &fd) ? fd : -1);
  615. X}
  616. X
  617. Xchar *
  618. Xmktemp(path)
  619. X    char *path;
  620. X{
  621. X    return(_gettemp(path, (int *)NULL) ? path : (char *)NULL);
  622. X}
  623. X
  624. Xstatic
  625. X_gettemp(path, doopen)
  626. X    char *path;
  627. X    register int *doopen;
  628. X{
  629. X    extern int errno;
  630. X    register char *start, *trv;
  631. X    struct stat sbuf;
  632. X    u_int pid;
  633. X
  634. X    pid = getpid();
  635. X    for (trv = path; *trv; ++trv);        /* extra X's get set to 0's */
  636. X    while (*--trv == 'X') {
  637. X        *trv = (pid % 10) + '0';
  638. X        pid /= 10;
  639. X    }
  640. X
  641. X    /*
  642. X     * check the target directory; if you have six X's and it
  643. X     * doesn't exist this runs for a *very* long time.
  644. X     */
  645. X    for (start = trv + 1;; --trv) {
  646. X        if (trv <= path)
  647. X            break;
  648. X        if (*trv == '/') {
  649. X            *trv = '\0';
  650. X            if (stat(path, &sbuf))
  651. X                return(0);
  652. X            if (!S_ISDIR(sbuf.st_mode)) {
  653. X                errno = ENOTDIR;
  654. X                return(0);
  655. X            }
  656. X            *trv = '/';
  657. X            break;
  658. X        }
  659. X    }
  660. X
  661. X    for (;;) {
  662. X        if (doopen) {
  663. X            if ((*doopen =
  664. X                open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0)
  665. X                return(1);
  666. X            if (errno != EEXIST)
  667. X                return(0);
  668. X        }
  669. X        else if (stat(path, &sbuf))
  670. X            return(errno == ENOENT ? 1 : 0);
  671. X
  672. X        /* tricky little algorithm for backward compatibility */
  673. X        for (trv = start;;) {
  674. X            if (!*trv)
  675. X                return(0);
  676. X            if (*trv == 'z')
  677. X                *trv++ = 'a';
  678. X            else {
  679. X                if (isdigit(*trv))
  680. X                    *trv = 'a';
  681. X                else
  682. X                    ++*trv;
  683. X                break;
  684. X            }
  685. X        }
  686. X    }
  687. X    /*NOTREACHED*/
  688. X}
  689. END_OF_FILE
  690. if test 2503 -ne `wc -c <'mktemp.c'`; then
  691.     echo shar: \"'mktemp.c'\" unpacked with wrong size!
  692. fi
  693. # end of 'mktemp.c'
  694. fi
  695. if test ! -d 'named' ; then
  696.     echo shar: Creating directory \"'named'\"
  697.     mkdir 'named'
  698. fi
  699. if test -f 'named/sethostent.c' -a "${1}" != "-c" ; then 
  700.   echo shar: Will not clobber existing file \"'named/sethostent.c'\"
  701. else
  702. echo shar: Extracting \"'named/sethostent.c'\" \(1290 characters\)
  703. sed "s/^X//" >'named/sethostent.c' <<'END_OF_FILE'
  704. X/*
  705. X * Copyright (c) 1985 Regents of the University of California.
  706. X * All rights reserved.
  707. X *
  708. X * Redistribution and use in source and binary forms are permitted
  709. X * provided that the above copyright notice and this paragraph are
  710. X * duplicated in all such forms and that any documentation,
  711. X * advertising materials, and other materials related to such
  712. X * distribution and use acknowledge that the software was developed
  713. X * by the University of California, Berkeley.  The name of the
  714. X * University may not be used to endorse or promote products derived
  715. X * from this software without specific prior written permission.
  716. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  717. X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  718. X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  719. X */
  720. X
  721. X#if defined(LIBC_SCCS) && !defined(lint)
  722. Xstatic char sccsid[] = "@(#)sethostent.c    6.5 (Berkeley) 6/27/88";
  723. X#endif /* LIBC_SCCS and not lint */
  724. X
  725. X#include <sys/types.h>
  726. X#include <arpa/nameser.h>
  727. X#include <netinet/in.h>
  728. X#include <resolv.h>
  729. X
  730. Xsethostent(stayopen)
  731. X{
  732. X    if (stayopen)
  733. X        _res.options |= RES_STAYOPEN | RES_USEVC;
  734. X}
  735. X
  736. Xendhostent()
  737. X{
  738. X    _res.options &= ~(RES_STAYOPEN | RES_USEVC);
  739. X    _res_close();
  740. X}
  741. X
  742. Xsethostfile(name)
  743. Xchar *name;
  744. X{
  745. X#ifdef lint
  746. Xname = name;
  747. X#endif
  748. X}
  749. END_OF_FILE
  750. if test 1290 -ne `wc -c <'named/sethostent.c'`; then
  751.     echo shar: \"'named/sethostent.c'\" unpacked with wrong size!
  752. fi
  753. # end of 'named/sethostent.c'
  754. fi
  755. if test -f 'res_comp.c' -a "${1}" != "-c" ; then 
  756.   echo shar: Will not clobber existing file \"'res_comp.c'\"
  757. else
  758. echo shar: Extracting \"'res_comp.c'\" \(7310 characters\)
  759. sed "s/^X//" >'res_comp.c' <<'END_OF_FILE'
  760. X/*
  761. X * Copyright (c) 1985 Regents of the University of California.
  762. X * All rights reserved.
  763. X *
  764. X * Redistribution and use in source and binary forms are permitted provided
  765. X * that: (1) source distributions retain this entire copyright notice and
  766. X * comment, and (2) distributions including binaries display the following
  767. X * acknowledgement:  ``This product includes software developed by the
  768. X * University of California, Berkeley and its contributors'' in the
  769. X * documentation or other materials provided with the distribution and in
  770. X * all advertising materials mentioning features or use of this software.
  771. X * Neither the name of the University nor the names of its contributors may
  772. X * be used to endorse or promote products derived from this software without
  773. X * specific prior written permission.
  774. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  775. X * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  776. X * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  777. X */
  778. X
  779. X#if defined(LIBC_SCCS) && !defined(lint)
  780. Xstatic char sccsid[] = "@(#)res_comp.c    6.18 (Berkeley) 6/27/90";
  781. X#endif /* LIBC_SCCS and not lint */
  782. X
  783. X#include <sys/types.h>
  784. X#include <stdio.h>
  785. X#include <arpa/nameser.h>
  786. X
  787. Xstatic dn_find();
  788. X
  789. X/*
  790. X * Expand compressed domain name 'comp_dn' to full domain name.
  791. X * 'msg' is a pointer to the begining of the message,
  792. X * 'eomorig' points to the first location after the message,
  793. X * 'exp_dn' is a pointer to a buffer of size 'length' for the result.
  794. X * Return size of compressed name or -1 if there was an error.
  795. X */
  796. Xdn_expand(msg, eomorig, comp_dn, exp_dn, length)
  797. X    u_char *msg, *eomorig, *comp_dn, *exp_dn;
  798. X    int length;
  799. X{
  800. X    register u_char *cp, *dn;
  801. X    register int n, c;
  802. X    u_char *eom;
  803. X    int len = -1, checked = 0;
  804. X
  805. X    dn = exp_dn;
  806. X    cp = comp_dn;
  807. X    eom = exp_dn + length;
  808. X    /*
  809. X     * fetch next label in domain name
  810. X     */
  811. X    while (n = *cp++) {
  812. X        /*
  813. X         * Check for indirection
  814. X         */
  815. X        switch (n & INDIR_MASK) {
  816. X        case 0:
  817. X            if (dn != exp_dn) {
  818. X                if (dn >= eom)
  819. X                    return (-1);
  820. X                *dn++ = '.';
  821. X            }
  822. X            if (dn+n >= eom)
  823. X                return (-1);
  824. X            checked += n + 1;
  825. X            while (--n >= 0) {
  826. X                if ((c = *cp++) == '.') {
  827. X                    if (dn + n + 2 >= eom)
  828. X                        return (-1);
  829. X                    *dn++ = '\\';
  830. X                }
  831. X                *dn++ = c;
  832. X                if (cp >= eomorig)    /* out of range */
  833. X                    return(-1);
  834. X            }
  835. X            break;
  836. X
  837. X        case INDIR_MASK:
  838. X            if (len < 0)
  839. X                len = cp - comp_dn + 1;
  840. X            cp = msg + (((n & 0x3f) << 8) | (*cp & 0xff));
  841. X            if (cp < msg || cp >= eomorig)    /* out of range */
  842. X                return(-1);
  843. X            checked += 2;
  844. X            /*
  845. X             * Check for loops in the compressed name;
  846. X             * if we've looked at the whole message,
  847. X             * there must be a loop.
  848. X             */
  849. X            if (checked >= eomorig - msg)
  850. X                return (-1);
  851. X            break;
  852. X
  853. X        default:
  854. X            return (-1);            /* flag error */
  855. X        }
  856. X    }
  857. X    *dn = '\0';
  858. X    if (len < 0)
  859. X        len = cp - comp_dn;
  860. X    return (len);
  861. X}
  862. X
  863. X/*
  864. X * Compress domain name 'exp_dn' into 'comp_dn'.
  865. X * Return the size of the compressed name or -1.
  866. X * 'length' is the size of the array pointed to by 'comp_dn'.
  867. X * 'dnptrs' is a list of pointers to previous compressed names. dnptrs[0]
  868. X * is a pointer to the beginning of the message. The list ends with NULL.
  869. X * 'lastdnptr' is a pointer to the end of the arrary pointed to
  870. X * by 'dnptrs'. Side effect is to update the list of pointers for
  871. X * labels inserted into the message as we compress the name.
  872. X * If 'dnptr' is NULL, we don't try to compress names. If 'lastdnptr'
  873. X * is NULL, we don't update the list.
  874. X */
  875. Xdn_comp(exp_dn, comp_dn, length, dnptrs, lastdnptr)
  876. X    u_char *exp_dn, *comp_dn;
  877. X    int length;
  878. X    u_char **dnptrs, **lastdnptr;
  879. X{
  880. X    register u_char *cp, *dn;
  881. X    register int c, l;
  882. X    u_char **cpp, **lpp, *sp, *eob;
  883. X    u_char *msg;
  884. X
  885. X    dn = exp_dn;
  886. X    cp = comp_dn;
  887. X    eob = cp + length;
  888. X    if (dnptrs != NULL) {
  889. X        if ((msg = *dnptrs++) != NULL) {
  890. X            for (cpp = dnptrs; *cpp != NULL; cpp++)
  891. X                ;
  892. X            lpp = cpp;    /* end of list to search */
  893. X        }
  894. X    } else
  895. X        msg = NULL;
  896. X    for (c = *dn++; c != '\0'; ) {
  897. X        /* look to see if we can use pointers */
  898. X        if (msg != NULL) {
  899. X            if ((l = dn_find(dn-1, msg, dnptrs, lpp)) >= 0) {
  900. X                if (cp+1 >= eob)
  901. X                    return (-1);
  902. X                *cp++ = (l >> 8) | INDIR_MASK;
  903. X                *cp++ = l % 256;
  904. X                return (cp - comp_dn);
  905. X            }
  906. X            /* not found, save it */
  907. X            if (lastdnptr != NULL && cpp < lastdnptr-1) {
  908. X                *cpp++ = cp;
  909. X                *cpp = NULL;
  910. X            }
  911. X        }
  912. X        sp = cp++;    /* save ptr to length byte */
  913. X        do {
  914. X            if (c == '.') {
  915. X                c = *dn++;
  916. X                break;
  917. X            }
  918. X            if (c == '\\') {
  919. X                if ((c = *dn++) == '\0')
  920. X                    break;
  921. X            }
  922. X            if (cp >= eob) {
  923. X                if (msg != NULL)
  924. X                    *lpp = NULL;
  925. X                return (-1);
  926. X            }
  927. X            *cp++ = c;
  928. X        } while ((c = *dn++) != '\0');
  929. X        /* catch trailing '.'s but not '..' */
  930. X        if ((l = cp - sp - 1) == 0 && c == '\0') {
  931. X            cp--;
  932. X            break;
  933. X        }
  934. X        if (l <= 0 || l > MAXLABEL) {
  935. X            if (msg != NULL)
  936. X                *lpp = NULL;
  937. X            return (-1);
  938. X        }
  939. X        *sp = l;
  940. X    }
  941. X    if (cp >= eob) {
  942. X        if (msg != NULL)
  943. X            *lpp = NULL;
  944. X        return (-1);
  945. X    }
  946. X    *cp++ = '\0';
  947. X    return (cp - comp_dn);
  948. X}
  949. X
  950. X/*
  951. X * Skip over a compressed domain name. Return the size or -1.
  952. X */
  953. Xdn_skipname(comp_dn, eom)
  954. X    u_char *comp_dn, *eom;
  955. X{
  956. X    register u_char *cp;
  957. X    register int n;
  958. X
  959. X    cp = comp_dn;
  960. X    while (cp < eom && (n = *cp++)) {
  961. X        /*
  962. X         * check for indirection
  963. X         */
  964. X        switch (n & INDIR_MASK) {
  965. X        case 0:        /* normal case, n == len */
  966. X            cp += n;
  967. X            continue;
  968. X        default:    /* illegal type */
  969. X            return (-1);
  970. X        case INDIR_MASK:    /* indirection */
  971. X            cp++;
  972. X        }
  973. X        break;
  974. X    }
  975. X    return (cp - comp_dn);
  976. X}
  977. X
  978. X/*
  979. X * Search for expanded name from a list of previously compressed names.
  980. X * Return the offset from msg if found or -1.
  981. X * dnptrs is the pointer to the first name on the list,
  982. X * not the pointer to the start of the message.
  983. X */
  984. Xstatic
  985. Xdn_find(exp_dn, msg, dnptrs, lastdnptr)
  986. X    u_char *exp_dn, *msg;
  987. X    u_char **dnptrs, **lastdnptr;
  988. X{
  989. X    register u_char *dn, *cp, **cpp;
  990. X    register int n;
  991. X    u_char *sp;
  992. X
  993. X    for (cpp = dnptrs; cpp < lastdnptr; cpp++) {
  994. X        dn = exp_dn;
  995. X        sp = cp = *cpp;
  996. X        while (n = *cp++) {
  997. X            /*
  998. X             * check for indirection
  999. X             */
  1000. X            switch (n & INDIR_MASK) {
  1001. X            case 0:        /* normal case, n == len */
  1002. X                while (--n >= 0) {
  1003. X                    if (*dn == '.')
  1004. X                        goto next;
  1005. X                    if (*dn == '\\')
  1006. X                        dn++;
  1007. X                    if (*dn++ != *cp++)
  1008. X                        goto next;
  1009. X                }
  1010. X                if ((n = *dn++) == '\0' && *cp == '\0')
  1011. X                    return (sp - msg);
  1012. X                if (n == '.')
  1013. X                    continue;
  1014. X                goto next;
  1015. X
  1016. X            default:    /* illegal type */
  1017. X                return (-1);
  1018. X
  1019. X            case INDIR_MASK:    /* indirection */
  1020. X                cp = msg + (((n & 0x3f) << 8) | *cp);
  1021. X            }
  1022. X        }
  1023. X        if (*dn == '\0')
  1024. X            return (sp - msg);
  1025. X    next:    ;
  1026. X    }
  1027. X    return (-1);
  1028. X}
  1029. X
  1030. X/*
  1031. X * Routines to insert/extract short/long's. Must account for byte
  1032. X * order and non-alignment problems. This code at least has the
  1033. X * advantage of being portable.
  1034. X *
  1035. X * used by sendmail.
  1036. X */
  1037. X
  1038. Xu_short
  1039. X_getshort(msgp)
  1040. X    u_char *msgp;
  1041. X{
  1042. X    register u_char *p = (u_char *) msgp;
  1043. X#ifdef vax
  1044. X    /*
  1045. X     * vax compiler doesn't put shorts in registers
  1046. X     */
  1047. X    register u_long u;
  1048. X#else
  1049. X    register u_short u;
  1050. X#endif
  1051. X
  1052. X    u = *p++ << 8;
  1053. X    return ((u_short)(u | *p));
  1054. X}
  1055. X
  1056. Xu_long
  1057. X_getlong(msgp)
  1058. X    u_char *msgp;
  1059. X{
  1060. X    register u_char *p = (u_char *) msgp;
  1061. X    register u_long u;
  1062. X
  1063. X    u = *p++; u <<= 8;
  1064. X    u |= *p++; u <<= 8;
  1065. X    u |= *p++; u <<= 8;
  1066. X    return (u | *p);
  1067. X}
  1068. X
  1069. X
  1070. Xputshort(s, msgp)
  1071. X    register u_short s;
  1072. X    register u_char *msgp;
  1073. X{
  1074. X
  1075. X    msgp[1] = s;
  1076. X    msgp[0] = s >> 8;
  1077. X}
  1078. X
  1079. Xputlong(l, msgp)
  1080. X    register u_long l;
  1081. X    register u_char *msgp;
  1082. X{
  1083. X
  1084. X    msgp[3] = l;
  1085. X    msgp[2] = (l >>= 8);
  1086. X    msgp[1] = (l >>= 8);
  1087. X    msgp[0] = l >> 8;
  1088. X}
  1089. END_OF_FILE
  1090. if test 7310 -ne `wc -c <'res_comp.c'`; then
  1091.     echo shar: \"'res_comp.c'\" unpacked with wrong size!
  1092. fi
  1093. # end of 'res_comp.c'
  1094. fi
  1095. if test -f 'res_init.c' -a "${1}" != "-c" ; then 
  1096.   echo shar: Will not clobber existing file \"'res_init.c'\"
  1097. else
  1098. echo shar: Extracting \"'res_init.c'\" \(6340 characters\)
  1099. sed "s/^X//" >'res_init.c' <<'END_OF_FILE'
  1100. X/*-
  1101. X * Copyright (c) 1985, 1989 Regents of the University of California.
  1102. X * All rights reserved.
  1103. X *
  1104. X * Redistribution and use in source and binary forms are permitted provided
  1105. X * that: (1) source distributions retain this entire copyright notice and
  1106. X * comment, and (2) distributions including binaries display the following
  1107. X * acknowledgement:  ``This product includes software developed by the
  1108. X * University of California, Berkeley and its contributors'' in the
  1109. X * documentation or other materials provided with the distribution and in
  1110. X * all advertising materials mentioning features or use of this software.
  1111. X * Neither the name of the University nor the names of its contributors may
  1112. X * be used to endorse or promote products derived from this software without
  1113. X * specific prior written permission.
  1114. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  1115. X * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  1116. X * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1117. X */
  1118. X
  1119. X#if defined(LIBC_SCCS) && !defined(lint)
  1120. Xstatic char sccsid[] = "@(#)res_init.c    6.14.1 (Berkeley) 6/27/90";
  1121. X#endif /* LIBC_SCCS and not lint */
  1122. X
  1123. X#include <sys/types.h>
  1124. X#include <sys/socket.h>
  1125. X#include <netinet/in.h>
  1126. X#include <stdio.h>
  1127. X#include <arpa/nameser.h>
  1128. X#include <resolv.h>
  1129. X
  1130. X/*
  1131. X * Resolver state default settings
  1132. X */
  1133. X
  1134. Xstruct state _res = {
  1135. X    RES_TIMEOUT,                   /* retransmition time interval */
  1136. X    4,                             /* number of times to retransmit */
  1137. X    RES_DEFAULT,            /* options flags */
  1138. X    1,                             /* number of name servers */
  1139. X};
  1140. X
  1141. X/*
  1142. X * Set up default settings.  If the configuration file exist, the values
  1143. X * there will have precedence.  Otherwise, the server address is set to
  1144. X * INADDR_ANY and the default domain name comes from the gethostname().
  1145. X *
  1146. X * The configuration file should only be used if you want to redefine your
  1147. X * domain or run without a server on your machine.
  1148. X *
  1149. X * Return 0 if completes successfully, -1 on error
  1150. X */
  1151. Xres_init()
  1152. X{
  1153. X    register FILE *fp;
  1154. X    register char *cp, *dp, **pp;
  1155. X    register int n;
  1156. X    char buf[BUFSIZ];
  1157. X    extern u_long inet_addr();
  1158. X    extern char *index();
  1159. X    extern char *strcpy(), *strncpy();
  1160. X    extern char *getenv();
  1161. X    int nserv = 0;    /* number of nameserver records read from file */
  1162. X    int norder = 0;
  1163. X    int haveenv = 0;
  1164. X    int havesearch = 0;
  1165. X
  1166. X    _res.nsaddr.sin_addr.s_addr = INADDR_ANY;
  1167. X    _res.nsaddr.sin_family = AF_INET;
  1168. X    _res.nsaddr.sin_port = htons(NAMESERVER_PORT);
  1169. X    _res.nscount = 1;
  1170. X
  1171. X    /* Allow user to override the local domain definition */
  1172. X    if ((cp = getenv("LOCALDOMAIN")) != NULL) {
  1173. X        (void)strncpy(_res.defdname, cp, sizeof(_res.defdname));
  1174. X        haveenv++;
  1175. X    }
  1176. X
  1177. X    if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) {
  1178. X        /* read the config file */
  1179. X        while (fgets(buf, sizeof(buf), fp) != NULL) {
  1180. X        /* read default domain name */
  1181. X        if (!strncmp(buf, "domain", sizeof("domain") - 1)) {
  1182. X            if (haveenv)    /* skip if have from environ */
  1183. X                continue;
  1184. X            cp = buf + sizeof("domain") - 1;
  1185. X            while (*cp == ' ' || *cp == '\t')
  1186. X                cp++;
  1187. X            if ((*cp == '\0') || (*cp == '\n'))
  1188. X                continue;
  1189. X            (void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1);
  1190. X            if ((cp = index(_res.defdname, '\n')) != NULL)
  1191. X                *cp = '\0';
  1192. X            havesearch = 0;
  1193. X            continue;
  1194. X        }
  1195. X        /* set search list */
  1196. X        if (!strncmp(buf, "search", sizeof("search") - 1)) {
  1197. X            if (haveenv)    /* skip if have from environ */
  1198. X                continue;
  1199. X            cp = buf + sizeof("search") - 1;
  1200. X            while (*cp == ' ' || *cp == '\t')
  1201. X                cp++;
  1202. X            if ((*cp == '\0') || (*cp == '\n'))
  1203. X                continue;
  1204. X            (void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1);
  1205. X            if ((cp = index(_res.defdname, '\n')) != NULL)
  1206. X                *cp = '\0';
  1207. X            /*
  1208. X             * Set search list to be blank-separated strings
  1209. X             * on rest of line.
  1210. X             */
  1211. X            cp = _res.defdname;
  1212. X            pp = _res.dnsrch;
  1213. X            *pp++ = cp;
  1214. X            for (n = 0; *cp && pp < _res.dnsrch + MAXDNSRCH; cp++) {
  1215. X                if (*cp == ' ' || *cp == '\t') {
  1216. X                    *cp = 0;
  1217. X                    n = 1;
  1218. X                } else if (n) {
  1219. X                    *pp++ = cp;
  1220. X                    n = 0;
  1221. X                }
  1222. X            }
  1223. X            /* null terminate last domain if there are excess */
  1224. X            while (*cp != '\0' && *cp != ' ' && *cp != '\t')
  1225. X                cp++;
  1226. X            *cp = '\0';
  1227. X            *pp++ = 0;
  1228. X            havesearch = 1;
  1229. X            continue;
  1230. X        }
  1231. X        /* read nameservers to query */
  1232. X        if (!strncmp(buf, "nameserver", sizeof("nameserver") - 1) &&
  1233. X           nserv < MAXNS) {
  1234. X            cp = buf + sizeof("nameserver") - 1;
  1235. X            while (*cp == ' ' || *cp == '\t')
  1236. X                cp++;
  1237. X            if ((*cp == '\0') || (*cp == '\n'))
  1238. X                continue;
  1239. X            if ((_res.nsaddr_list[nserv].sin_addr.s_addr =
  1240. X            inet_addr(cp)) == (unsigned)-1) {
  1241. X                _res.nsaddr_list[nserv].sin_addr.s_addr
  1242. X                = INADDR_ANY;
  1243. X                continue;
  1244. X            }
  1245. X            _res.nsaddr_list[nserv].sin_family = AF_INET;
  1246. X            _res.nsaddr_list[nserv].sin_port = htons(NAMESERVER_PORT);
  1247. X            nserv++;
  1248. X            continue;
  1249. X        }
  1250. X        /* read service order */
  1251. X        if (!strncmp(buf, "order", sizeof("order") - 1)) {
  1252. X            cp = buf + sizeof("order") - 1;
  1253. X            while (*cp == ' ' || *cp == '\t')
  1254. X            cp++;
  1255. X            if ((*cp == '\0') || (*cp == '\n'))
  1256. X            continue;
  1257. X            norder = 0;
  1258. X            do {
  1259. X            if ((dp = index(cp, ',')) != NULL)
  1260. X                *dp = '\0';
  1261. X            if (norder >= MAXSERVICES)
  1262. X                continue;
  1263. X            if (!strncmp(cp, "bind", sizeof("bind") - 1))
  1264. X                _res.order[norder++] = RES_SERVICE_BIND;
  1265. X            else if (!strncmp(cp, "local", sizeof("local") - 1))
  1266. X                _res.order[norder++] = RES_SERVICE_LOCAL;
  1267. X            cp = dp + 1;
  1268. X            } while (dp != NULL);
  1269. X            _res.order[norder] = RES_SERVICE_NONE;
  1270. X            continue;
  1271. X        }
  1272. X        }
  1273. X        if (nserv > 1) 
  1274. X        _res.nscount = nserv;
  1275. X        (void) fclose(fp);
  1276. X    }
  1277. X    if (_res.defdname[0] == 0) {
  1278. X        if (gethostname(buf, sizeof(_res.defdname)) == 0 &&
  1279. X           (cp = index(buf, '.')))
  1280. X            (void)strcpy(_res.defdname, cp + 1);
  1281. X    }
  1282. X
  1283. X    /* find components of local domain that might be searched */
  1284. X    if (havesearch == 0) {
  1285. X        pp = _res.dnsrch;
  1286. X        *pp++ = _res.defdname;
  1287. X        for (cp = _res.defdname, n = 0; *cp; cp++)
  1288. X            if (*cp == '.')
  1289. X                n++;
  1290. X        cp = _res.defdname;
  1291. X        for (; n >= LOCALDOMAINPARTS && pp < _res.dnsrch + MAXDFLSRCH;
  1292. X            n--) {
  1293. X            cp = index(cp, '.');
  1294. X            *pp++ = ++cp;
  1295. X        }
  1296. X        *pp++ = 0;
  1297. X    }
  1298. X    /* default search order to bind only */
  1299. X    if (norder == 0) {
  1300. X        _res.order[0] = RES_SERVICE_BIND;
  1301. X        _res.order[1] = RES_SERVICE_NONE;
  1302. X    }
  1303. X    _res.options |= RES_INIT;
  1304. X    return (0);
  1305. X}
  1306. END_OF_FILE
  1307. if test 6340 -ne `wc -c <'res_init.c'`; then
  1308.     echo shar: \"'res_init.c'\" unpacked with wrong size!
  1309. fi
  1310. # end of 'res_init.c'
  1311. fi
  1312. if test -f 'res_mkquery.c' -a "${1}" != "-c" ; then 
  1313.   echo shar: Will not clobber existing file \"'res_mkquery.c'\"
  1314. else
  1315. echo shar: Extracting \"'res_mkquery.c'\" \(5295 characters\)
  1316. sed "s/^X//" >'res_mkquery.c' <<'END_OF_FILE'
  1317. X/*
  1318. X * Copyright (c) 1985 Regents of the University of California.
  1319. X * All rights reserved.
  1320. X *
  1321. X * Redistribution and use in source and binary forms are permitted
  1322. X * provided that: (1) source distributions retain this entire copyright
  1323. X * notice and comment, and (2) distributions including binaries display
  1324. X * the following acknowledgement:  ``This product includes software
  1325. X * developed by the University of California, Berkeley and its contributors''
  1326. X * in the documentation or other materials provided with the distribution
  1327. X * and in all advertising materials mentioning features or use of this
  1328. X * software. Neither the name of the University nor the names of its
  1329. X * contributors may be used to endorse or promote products derived
  1330. X * from this software without specific prior written permission.
  1331. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1332. X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1333. X * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1334. X */
  1335. X
  1336. X#if defined(LIBC_SCCS) && !defined(lint)
  1337. Xstatic char sccsid[] = "@(#)res_mkquery.c    6.12 (Berkeley) 6/1/90";
  1338. X#endif /* LIBC_SCCS and not lint */
  1339. X
  1340. X#include <stdio.h>
  1341. X#include <sys/types.h>
  1342. X#include <netinet/in.h>
  1343. X#include <arpa/nameser.h>
  1344. X#include <resolv.h>
  1345. X
  1346. X/*
  1347. X * Form all types of queries.
  1348. X * Returns the size of the result or -1.
  1349. X */
  1350. Xres_mkquery(op, dname, class, type, data, datalen, newrr, buf, buflen)
  1351. X    int op;            /* opcode of query */
  1352. X    char *dname;        /* domain name */
  1353. X    int class, type;    /* class and type of query */
  1354. X    char *data;        /* resource record data */
  1355. X    int datalen;        /* length of data */
  1356. X    struct rrec *newrr;    /* new rr for modify or append */
  1357. X    char *buf;        /* buffer to put query */
  1358. X    int buflen;        /* size of buffer */
  1359. X{
  1360. X    register HEADER *hp;
  1361. X    register char *cp;
  1362. X    register int n;
  1363. X    char *dnptrs[10], **dpp, **lastdnptr;
  1364. X    extern char *index();
  1365. X
  1366. X#ifdef DEBUG
  1367. X    if (_res.options & RES_DEBUG)
  1368. X        printf("res_mkquery(%d, %s, %d, %d)\n", op, dname, class, type);
  1369. X#endif DEBUG
  1370. X    /*
  1371. X     * Initialize header fields.
  1372. X     */
  1373. X    if ((buf == NULL) || (buflen < sizeof(HEADER)))
  1374. X        return(-1);
  1375. X    bzero(buf, sizeof(HEADER));
  1376. X    hp = (HEADER *) buf;
  1377. X    hp->id = htons(++_res.id);
  1378. X    hp->opcode = op;
  1379. X    hp->pr = (_res.options & RES_PRIMARY) != 0;
  1380. X    hp->rd = (_res.options & RES_RECURSE) != 0;
  1381. X    hp->rcode = NOERROR;
  1382. X    cp = buf + sizeof(HEADER);
  1383. X    buflen -= sizeof(HEADER);
  1384. X    dpp = dnptrs;
  1385. X    *dpp++ = buf;
  1386. X    *dpp++ = NULL;
  1387. X    lastdnptr = dnptrs + sizeof(dnptrs)/sizeof(dnptrs[0]);
  1388. X    /*
  1389. X     * perform opcode specific processing
  1390. X     */
  1391. X    switch (op) {
  1392. X    case QUERY:
  1393. X        if ((buflen -= QFIXEDSZ) < 0)
  1394. X            return(-1);
  1395. X        if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
  1396. X            return (-1);
  1397. X        cp += n;
  1398. X        buflen -= n;
  1399. X        putshort(type, cp);
  1400. X        cp += sizeof(u_short);
  1401. X        putshort(class, cp);
  1402. X        cp += sizeof(u_short);
  1403. X        hp->qdcount = htons(1);
  1404. X        if (op == QUERY || data == NULL)
  1405. X            break;
  1406. X        /*
  1407. X         * Make an additional record for completion domain.
  1408. X         */
  1409. X        buflen -= RRFIXEDSZ;
  1410. X        if ((n = dn_comp(data, cp, buflen, dnptrs, lastdnptr)) < 0)
  1411. X            return (-1);
  1412. X        cp += n;
  1413. X        buflen -= n;
  1414. X        putshort(T_NULL, cp);
  1415. X        cp += sizeof(u_short);
  1416. X        putshort(class, cp);
  1417. X        cp += sizeof(u_short);
  1418. X        putlong(0, cp);
  1419. X        cp += sizeof(u_long);
  1420. X        putshort(0, cp);
  1421. X        cp += sizeof(u_short);
  1422. X        hp->arcount = htons(1);
  1423. X        break;
  1424. X
  1425. X    case IQUERY:
  1426. X        /*
  1427. X         * Initialize answer section
  1428. X         */
  1429. X        if (buflen < 1 + RRFIXEDSZ + datalen)
  1430. X            return (-1);
  1431. X        *cp++ = '\0';    /* no domain name */
  1432. X        putshort(type, cp);
  1433. X        cp += sizeof(u_short);
  1434. X        putshort(class, cp);
  1435. X        cp += sizeof(u_short);
  1436. X        putlong(0, cp);
  1437. X        cp += sizeof(u_long);
  1438. X        putshort(datalen, cp);
  1439. X        cp += sizeof(u_short);
  1440. X        if (datalen) {
  1441. X            bcopy(data, cp, datalen);
  1442. X            cp += datalen;
  1443. X        }
  1444. X        hp->ancount = htons(1);
  1445. X        break;
  1446. X
  1447. X#ifdef ALLOW_UPDATES
  1448. X    /*
  1449. X     * For UPDATEM/UPDATEMA, do UPDATED/UPDATEDA followed by UPDATEA
  1450. X     * (Record to be modified is followed by its replacement in msg.)
  1451. X     */
  1452. X    case UPDATEM:
  1453. X    case UPDATEMA:
  1454. X
  1455. X    case UPDATED:
  1456. X        /*
  1457. X         * The res code for UPDATED and UPDATEDA is the same; user
  1458. X         * calls them differently: specifies data for UPDATED; server
  1459. X         * ignores data if specified for UPDATEDA.
  1460. X         */
  1461. X    case UPDATEDA:
  1462. X        buflen -= RRFIXEDSZ + datalen;
  1463. X        if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
  1464. X            return (-1);
  1465. X        cp += n;
  1466. X        putshort(type, cp);
  1467. X                cp += sizeof(u_short);
  1468. X                putshort(class, cp);
  1469. X                cp += sizeof(u_short);
  1470. X        putlong(0, cp);
  1471. X        cp += sizeof(u_long);
  1472. X        putshort(datalen, cp);
  1473. X                cp += sizeof(u_short);
  1474. X        if (datalen) {
  1475. X            bcopy(data, cp, datalen);
  1476. X            cp += datalen;
  1477. X        }
  1478. X        if ( (op == UPDATED) || (op == UPDATEDA) ) {
  1479. X            hp->ancount = htons(0);
  1480. X            break;
  1481. X        }
  1482. X        /* Else UPDATEM/UPDATEMA, so drop into code for UPDATEA */
  1483. X
  1484. X    case UPDATEA:    /* Add new resource record */
  1485. X        buflen -= RRFIXEDSZ + datalen;
  1486. X        if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
  1487. X            return (-1);
  1488. X        cp += n;
  1489. X        putshort(newrr->r_type, cp);
  1490. X                cp += sizeof(u_short);
  1491. X                putshort(newrr->r_class, cp);
  1492. X                cp += sizeof(u_short);
  1493. X        putlong(0, cp);
  1494. X        cp += sizeof(u_long);
  1495. X        putshort(newrr->r_size, cp);
  1496. X                cp += sizeof(u_short);
  1497. X        if (newrr->r_size) {
  1498. X            bcopy(newrr->r_data, cp, newrr->r_size);
  1499. X            cp += newrr->r_size;
  1500. X        }
  1501. X        hp->ancount = htons(0);
  1502. X        break;
  1503. X
  1504. X#endif ALLOW_UPDATES
  1505. X    }
  1506. X    return (cp - buf);
  1507. X}
  1508. END_OF_FILE
  1509. if test 5295 -ne `wc -c <'res_mkquery.c'`; then
  1510.     echo shar: \"'res_mkquery.c'\" unpacked with wrong size!
  1511. fi
  1512. # end of 'res_mkquery.c'
  1513. fi
  1514. if test -f 'strcasecmp.c' -a "${1}" != "-c" ; then 
  1515.   echo shar: Will not clobber existing file \"'strcasecmp.c'\"
  1516. else
  1517. echo shar: Extracting \"'strcasecmp.c'\" \(3766 characters\)
  1518. sed "s/^X//" >'strcasecmp.c' <<'END_OF_FILE'
  1519. X/*
  1520. X * Copyright (c) 1987 Regents of the University of California.
  1521. X * All rights reserved.
  1522. X *
  1523. X * Redistribution and use in source and binary forms are permitted
  1524. X * provided that the above copyright notice and this paragraph are
  1525. X * duplicated in all such forms and that any documentation,
  1526. X * advertising materials, and other materials related to such
  1527. X * distribution and use acknowledge that the software was developed
  1528. X * by the University of California, Berkeley.  The name of the
  1529. X * University may not be used to endorse or promote products derived
  1530. X * from this software without specific prior written permission.
  1531. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1532. X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1533. X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1534. X */
  1535. X
  1536. X#if defined(LIBC_SCCS) && !defined(lint)
  1537. Xstatic char sccsid[] = "@(#)strcasecmp.c    5.7 (Berkeley) 2/7/89";
  1538. X#endif /* LIBC_SCCS and not lint */
  1539. X
  1540. X#include <sys/types.h>
  1541. X
  1542. X/*
  1543. X * This array is designed for mapping upper and lower case letter
  1544. X * together for a case independent comparison.  The mappings are
  1545. X * based upon ascii character sequences.
  1546. X */
  1547. Xstatic u_char charmap[] = {
  1548. X    '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
  1549. X    '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
  1550. X    '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
  1551. X    '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
  1552. X    '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
  1553. X    '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
  1554. X    '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
  1555. X    '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
  1556. X    '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
  1557. X    '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
  1558. X    '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
  1559. X    '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
  1560. X    '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
  1561. X    '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
  1562. X    '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
  1563. X    '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
  1564. X    '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
  1565. X    '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
  1566. X    '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
  1567. X    '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
  1568. X    '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
  1569. X    '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
  1570. X    '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
  1571. X    '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
  1572. X    '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
  1573. X    '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
  1574. X    '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
  1575. X    '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
  1576. X    '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
  1577. X    '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
  1578. X    '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
  1579. X    '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
  1580. X};
  1581. X
  1582. Xstrcasecmp(s1, s2)
  1583. X    char *s1, *s2;
  1584. X{
  1585. X    register u_char    *cm = charmap,
  1586. X            *us1 = (u_char *)s1,
  1587. X            *us2 = (u_char *)s2;
  1588. X
  1589. X    while (cm[*us1] == cm[*us2++])
  1590. X        if (*us1++ == '\0')
  1591. X            return(0);
  1592. X    return(cm[*us1] - cm[*--us2]);
  1593. X}
  1594. X
  1595. Xstrncasecmp(s1, s2, n)
  1596. X    char *s1, *s2;
  1597. X    register int n;
  1598. X{
  1599. X    register u_char    *cm = charmap,
  1600. X            *us1 = (u_char *)s1,
  1601. X            *us2 = (u_char *)s2;
  1602. X
  1603. X    while (--n >= 0 && cm[*us1] == cm[*us2++])
  1604. X        if (*us1++ == '\0')
  1605. X            return(0);
  1606. X    return(n < 0 ? 0 : cm[*us1] - cm[*--us2]);
  1607. X}
  1608. END_OF_FILE
  1609. if test 3766 -ne `wc -c <'strcasecmp.c'`; then
  1610.     echo shar: \"'strcasecmp.c'\" unpacked with wrong size!
  1611. fi
  1612. # end of 'strcasecmp.c'
  1613. fi
  1614. if test -f 'strerror.c' -a "${1}" != "-c" ; then 
  1615.   echo shar: Will not clobber existing file \"'strerror.c'\"
  1616. else
  1617. echo shar: Extracting \"'strerror.c'\" \(1446 characters\)
  1618. sed "s/^X//" >'strerror.c' <<'END_OF_FILE'
  1619. X/*
  1620. X * Copyright (c) 1988 Regents of the University of California.
  1621. X * All rights reserved.
  1622. X *
  1623. X * Redistribution and use in source and binary forms are permitted provided
  1624. X * that: (1) source distributions retain this entire copyright notice and
  1625. X * comment, and (2) distributions including binaries display the following
  1626. X * acknowledgement:  ``This product includes software developed by the
  1627. X * University of California, Berkeley and its contributors'' in the
  1628. X * documentation or other materials provided with the distribution and in
  1629. X * all advertising materials mentioning features or use of this software.
  1630. X * Neither the name of the University nor the names of its contributors may
  1631. X * be used to endorse or promote products derived from this software without
  1632. X * specific prior written permission.
  1633. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  1634. X * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  1635. X * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1636. X */
  1637. X
  1638. X#if defined(LIBC_SCCS) && !defined(lint)
  1639. Xstatic char sccsid[] = "@(#)strerror.c    5.4 (Berkeley) 6/24/90";
  1640. X#endif /* LIBC_SCCS and not lint */
  1641. X
  1642. X#include <string.h>
  1643. X
  1644. Xchar *
  1645. Xstrerror(errnum)
  1646. X    int errnum;
  1647. X{
  1648. X    extern int sys_nerr;
  1649. X    extern char *sys_errlist[];
  1650. X    static char ebuf[40];        /* 64-bit number + slop */
  1651. X
  1652. X    if ((unsigned int)errnum < sys_nerr)
  1653. X        return(sys_errlist[errnum]);
  1654. X    (void)sprintf(ebuf, "Unknown error: %d", errnum);
  1655. X    return(ebuf);
  1656. X}
  1657. END_OF_FILE
  1658. if test 1446 -ne `wc -c <'strerror.c'`; then
  1659.     echo shar: \"'strerror.c'\" unpacked with wrong size!
  1660. fi
  1661. # end of 'strerror.c'
  1662. fi
  1663. if test -f 'strpbrk.c' -a "${1}" != "-c" ; then 
  1664.   echo shar: Will not clobber existing file \"'strpbrk.c'\"
  1665. else
  1666. echo shar: Extracting \"'strpbrk.c'\" \(1162 characters\)
  1667. sed "s/^X//" >'strpbrk.c' <<'END_OF_FILE'
  1668. X/*
  1669. X * Copyright (c) 1985 Regents of the University of California.
  1670. X * All rights reserved.
  1671. X *
  1672. X * Redistribution and use in source and binary forms are permitted
  1673. X * provided that the above copyright notice and this paragraph are
  1674. X * duplicated in all such forms and that any documentation,
  1675. X * advertising materials, and other materials related to such
  1676. X * distribution and use acknowledge that the software was developed
  1677. X * by the University of California, Berkeley.  The name of the
  1678. X * University may not be used to endorse or promote products derived
  1679. X * from this software without specific prior written permission.
  1680. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1681. X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1682. X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1683. X */
  1684. X
  1685. X#if defined(LIBC_SCCS) && !defined(lint)
  1686. Xstatic char sccsid[] = "@(#)strpbrk.c    5.5 (Berkeley) 5/10/89";
  1687. X#endif /* LIBC_SCCS and not lint */
  1688. X
  1689. Xchar *
  1690. Xstrpbrk(s1, s2)
  1691. X    register char *s1, *s2;
  1692. X{
  1693. X    register int c, sc;
  1694. X    register char *scanp;
  1695. X
  1696. X    for (; c = *s1; ++s1)
  1697. X        for (scanp = s2; sc = *scanp++;)
  1698. X            if (sc == c)
  1699. X                return(s1);
  1700. X    return(0);
  1701. X}
  1702. END_OF_FILE
  1703. if test 1162 -ne `wc -c <'strpbrk.c'`; then
  1704.     echo shar: \"'strpbrk.c'\" unpacked with wrong size!
  1705. fi
  1706. # end of 'strpbrk.c'
  1707. fi
  1708. echo shar: End of archive 1 \(of 2\).
  1709. cp /dev/null ark1isdone
  1710. MISSING=""
  1711. for I in 1 2 ; do
  1712.     if test ! -f ark${I}isdone ; then
  1713.     MISSING="${MISSING} ${I}"
  1714.     fi
  1715. done
  1716. if test "${MISSING}" = "" ; then
  1717.     echo You have unpacked both archives.
  1718.     rm -f ark[1-9]isdone
  1719. else
  1720.     echo You still need to unpack the following archives:
  1721.     echo "        " ${MISSING}
  1722. fi
  1723. ##  End of shell archive.
  1724. exit 0
  1725.