home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / comp / sources / misc / 3883 < prev    next >
Encoding:
Text File  |  1992-09-02  |  19.9 KB  |  610 lines

  1. Newsgroups: comp.sources.misc
  2. Path: sparky!kent
  3. From: wietse@wzv.win.tue.nl (Wietse Venema)
  4. Subject:  v31i134:  log_tcp - TCP/IP daemon wrapper, Patch02
  5. Message-ID: <1992Sep2.213551.27770@sparky.imd.sterling.com>
  6. Followup-To: comp.sources.d
  7. X-Md4-Signature: d65a4b5d2b47259b133263889e1474b9
  8. Sender: kent@sparky.imd.sterling.com (Kent Landfield)
  9. Organization: Eindhoven University of Technology, The Netherlands
  10. Date: Wed, 2 Sep 1992 21:35:51 GMT
  11. Approved: kent@sparky.imd.sterling.com
  12. Lines: 596
  13.  
  14. Submitted-by: wietse@wzv.win.tue.nl (Wietse Venema)
  15. Posting-number: Volume 31, Issue 134
  16. Archive-name: log_tcp/patch02
  17. Patch-To: log_tcp: Volume 30, Issue 79-80
  18. Environment: UNIX
  19.  
  20. This is an interim patch that takes care of some rough edges that were
  21. left in last June's release. The patch does not introduce any new
  22. features or changes to installation and/or configuration procedures.
  23.  
  24. A fully-patched source kit can be found on ftp.win.tue.nl in the file
  25. /pub/security/log_tcp.shar.Z.  The archives on cert.org (in directory
  26. /pub/tools/wrappers) and on ftp.uu.net (in /pub/security) will be
  27. updated ASAP.
  28.  
  29.     - Some sites reported that connections would be rejected because
  30.     localhost != localhost.domain. The host name checking code now
  31.     special-cases localhost (problem reported by several sites).
  32.  
  33.     - The programs now report an error if an existing access control
  34.     file cannot be opened (e.g. due to lack of privileges).  Until now,
  35.     the programs would just pretend that the access control file does
  36.     not exist (reported by Darren Reed, avalon@coombs.anu.edu.au).
  37.  
  38.     - The timeout period for remote userid lookups was upped to 30
  39.     seconds, in order to cope with slow hosts or networks.  If this is
  40.     too long for you, adjust the TIMEOUT definition in file rfc931.c
  41.     (problem reported by several sites).
  42.  
  43.     - On hosts with more than one IP network interface, remote userid
  44.     lookups could use the IP address of the "wrong" local interface.
  45.     The problem and its solution were discussed on the rfc931-users
  46.     mailing list.  Scott Schwartz (schwartz@cs.psu.edu) folded the fix
  47.     into the rfc931.c module.
  48.  
  49.     - The result of % expansion (in shell commands) is now checked for
  50.     stuff that may confuse the shell; it is replaced by underscores
  51.     (problem reported by Icarus Sparry, I.Sparry@gdr.bath.ac.uk).
  52.  
  53.     - A portability problem was fixed that caused compile-time problems
  54.     on a CRAY (problem reported by Michael Barnett, mikeb@rmit.edu.au).
  55.  
  56. Finally, a caveat for those who use the optional remote username lookup
  57. feature (RFC 931 protocol).  On some systems, these lookups may trigger
  58. a kernel bug.  When a client host connects to your system, and the RFC
  59. 931 connection to that client is rejected by a router, some kernels
  60. drop all connections with that client.  The bug is not in the log_tcp
  61. programs: complain to your vendor and don't enable remote user name
  62. lookups until the bug has been fixed.
  63.  
  64. The following example can be used (from outside the tue.nl domain) to
  65. find out if you have the bug:
  66.  
  67.     % ftp 131.155.70.100
  68.  
  69. Then, when the connection has been established, run the following
  70. command on the same machine:
  71.  
  72.     % telnet 131.155.70.100 111
  73.  
  74. The telnet command should fail with: "host not reachable". If this
  75. causes you to lose the ftp connection, you have the bug (please report
  76. OS and hardware type). If the telnet command does not fail, please let
  77. me know, too :-)
  78.  
  79.     Wietse Venema (wietse@wzv.win.tue.nl),
  80.     Department of Mathematics and Computing Science,
  81.     Eindhoven University of Technology,
  82.     The Netherlands.
  83.  
  84. Prereq: 1.7
  85. *** ./README-    Thu Jun 11 22:21:20 1992
  86. --- ./README    Mon Aug 31 22:54:43 1992
  87. ***************
  88. *** 1,4 ****
  89. ! @(#) README 1.7 92/06/11 22:21:17
  90.   
  91.   General description
  92.   -------------------
  93. --- 1,4 ----
  94. ! @(#) README 1.8 92/08/31 22:54:40
  95.   
  96.   General description
  97.   -------------------
  98. ***************
  99. *** 44,49 ****
  100. --- 44,70 ----
  101.   This makes it impossible for the daemon front ends to look up the
  102.   remote host address (and hence, the name) in case of UDP connections.
  103.   
  104. + On some systems, the optional RFC 931 remote username lookups may
  105. + trigger a kernel bug.  When a client host connects to your system, and
  106. + the RFC 931 connection to that client is rejected by a router, some
  107. + kernels drop all connections with that client.  This is not a bug in
  108. + the log_tcp programs: complain to your vendor, and don't enable
  109. + remote user name lookups until the bug has been fixed.
  110. + The following example can be used (from outside the tue.nl domain) to
  111. + find out if you have the bug:
  112. +     % ftp 131.155.70.100
  113. + Then, when the connection has been established, run the following
  114. + command on the same machine:
  115. +     % telnet 131.155.70.100 111
  116. + The telnet command should fail with: "host not reachable". If you lose
  117. + the ftp connection, you have the bug (please report OS and harware
  118. + type). If the telnet command does not fail, please let me know, too...
  119.   Access control
  120.   --------------
  121.   
  122. ***************
  123. *** 129,136 ****
  124.   servers provided with the authutil package (comp.sources.unix volume
  125.   22) by Dan Bernstein. This one relies on RFC 931.
  126.   
  127. ! Source for a reasonably fast and portable RFC 931 daemon by Peter
  128. ! Eriksson is available from ftp.lysator.liu.se:/pub/net/pauthd*.tar.Z.
  129.   
  130.   Some TCP/IP implementations come without syslog library. A replacement
  131.   can be found in ftp.win.tue.nl:/pub/security/surrogate-syslog.tar.Z.
  132. --- 150,157 ----
  133.   servers provided with the authutil package (comp.sources.unix volume
  134.   22) by Dan Bernstein. This one relies on RFC 931.
  135.   
  136. ! Source for a portable RFC 931-compatible daemon by Peter Eriksson is
  137. ! available from ftp.lysator.liu.se:/pub/ident/servers.
  138.   
  139.   Some TCP/IP implementations come without syslog library. A replacement
  140.   can be found in ftp.win.tue.nl:/pub/security/surrogate-syslog.tar.Z.
  141. Prereq: 1.5
  142. *** ./fromhost.c-    Thu Jun 11 22:21:25 1992
  143. --- ./fromhost.c    Mon Aug 24 21:46:16 1992
  144. ***************
  145. *** 15,21 ****
  146.     */
  147.   
  148.   #ifndef lint
  149. ! static char sccsid[] = "@(#) fromhost.c 1.5 92/06/11 22:21:24";
  150.   #endif
  151.   
  152.   /* System libraries. */
  153. --- 15,21 ----
  154.     */
  155.   
  156.   #ifndef lint
  157. ! static char sccsid[] = "@(#) fromhost.c 1.6 92/08/24 21:46:14";
  158.   #endif
  159.   
  160.   /* System libraries. */
  161. ***************
  162. *** 154,161 ****
  163.   
  164.       /* Look up the remote host name. */
  165.   
  166. !     if ((hp = gethostbyaddr((char *) &sin->sin_addr.s_addr,
  167. !                 sizeof(sin->sin_addr.s_addr),
  168.                   AF_INET)) == 0) {
  169.       return (0);
  170.       }
  171. --- 154,161 ----
  172.   
  173.       /* Look up the remote host name. */
  174.   
  175. !     if ((hp = gethostbyaddr((char *) &sin->sin_addr,
  176. !                 sizeof(sin->sin_addr),
  177.                   AF_INET)) == 0) {
  178.       return (0);
  179.       }
  180. ***************
  181. *** 199,205 ****
  182.   
  183.       } else {
  184.   
  185. !     if (strcasecmp(remotehost, hp->h_name)) {
  186.           syslog(LOG_ERR, "host name/name mismatch: %s != %s",
  187.              remotehost, hp->h_name);
  188.           return (BAD);
  189. --- 199,214 ----
  190.   
  191.       } else {
  192.   
  193. !     /*
  194. !      * Make sure that gethostbyname() returns the "correct" host name.
  195. !      * Unfortunately, gethostbyname("localhost") sometimes yields
  196. !      * "localhost.domain". Since the latter host name comes from the
  197. !      * local DNS, we just have to trust it (all bets are off if the local
  198. !      * DNS is perverted). We always check the address list, though.
  199. !      */
  200. !     if (strcasecmp(remotehost, hp->h_name)
  201. !         && strcasecmp(remotehost, "localhost")) {
  202.           syslog(LOG_ERR, "host name/name mismatch: %s != %s",
  203.              remotehost, hp->h_name);
  204.           return (BAD);
  205. Prereq: 1.2
  206. *** ./rfc931.c-    Mon Jun 22 16:32:15 1992
  207. --- ./rfc931.c    Mon Aug 31 22:54:47 1992
  208. ***************
  209. *** 11,17 ****
  210.     */
  211.   
  212.   #ifndef lint
  213. ! static char sccsid[] = "@(#) rfc931.c 1.2 92/06/22 16:32:14";
  214.   #endif
  215.   
  216.   #include <stdio.h>
  217. --- 11,17 ----
  218.     */
  219.   
  220.   #ifndef lint
  221. ! static char sccsid[] = "@(#) rfc931.c 1.3 92/08/31 22:54:46";
  222.   #endif
  223.   
  224.   #include <stdio.h>
  225. ***************
  226. *** 25,31 ****
  227.   #include "log_tcp.h"
  228.   
  229.   #define    RFC931_PORT    113        /* Semi-well-known port */
  230. ! #define    TIMEOUT        10        /* wait for at most 10 seconds */
  231.   
  232.   extern char *strchr();
  233.   
  234. --- 25,31 ----
  235.   #include "log_tcp.h"
  236.   
  237.   #define    RFC931_PORT    113        /* Semi-well-known port */
  238. ! #define    TIMEOUT        30        /* wait for at most 30 seconds */
  239.   
  240.   extern char *strchr();
  241.   
  242. ***************
  243. *** 55,61 ****
  244.       char   *cp;
  245.       char   *result = FROM_UNKNOWN;
  246.   
  247. !     /* Find out local port number of our stdin. */
  248.   
  249.       length = sizeof(here);
  250.       if (getsockname(0, (struct sockaddr *) & here, &length) == -1) {
  251. --- 55,61 ----
  252.       char   *cp;
  253.       char   *result = FROM_UNKNOWN;
  254.   
  255. !     /* Find out local address and port number of stdin. */
  256.   
  257.       length = sizeof(here);
  258.       if (getsockname(0, (struct sockaddr *) & here, &length) == -1) {
  259. ***************
  260. *** 62,71 ****
  261.       syslog(LOG_ERR, "getsockname: %m");
  262.       return (result);
  263.       }
  264. -     /* Set up timer so we won't get stuck. */
  265.   
  266.       if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  267.       return (result);
  268.       signal(SIGALRM, timeout);
  269.       if (setjmp(timebuf)) {
  270.       close(s);                /* not: fclose(fp) */
  271. --- 62,86 ----
  272.       syslog(LOG_ERR, "getsockname: %m");
  273.       return (result);
  274.       }
  275.   
  276. +     /*
  277. +      * The socket that will be used for user name lookups should be bound to
  278. +      * the same local IP address as stdin. This will automagically happen on
  279. +      * hosts that have only one IP network interface. When the local host has
  280. +      * more than one IP network interface we must do an explicit bind() call.
  281. +      */
  282.       if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  283.       return (result);
  284. +     sin = here;
  285. +     sin.sin_port = 0;
  286. +     if (bind(s, (struct sockaddr *) & sin, sizeof sin) < 0) {
  287. +     syslog(LOG_ERR, "bind: %s: %m", inet_ntoa(here.sin_addr));
  288. +     return (result);
  289. +     }
  290. +     /* Set up timer so we won't get stuck. */
  291.       signal(SIGALRM, timeout);
  292.       if (setjmp(timebuf)) {
  293.       close(s);                /* not: fclose(fp) */
  294. Prereq: 1.1
  295. *** ./percent_x.c-    Thu Jun 11 22:21:50 1992
  296. --- ./percent_x.c    Mon Aug 24 21:46:23 1992
  297. ***************
  298. *** 2,8 ****
  299.     * percent_x() takes a string and performs %a (host address), %c (client
  300.     * info), %h (host name or address), %d (daemon name), %p (process id) and
  301.     * %u (user name) substitutions. It aborts the program when the result of
  302. !   * expansion would overflow the output buffer.
  303.     * 
  304.     * Diagnostics are reported through syslog(3).
  305.     * 
  306. --- 2,10 ----
  307.     * percent_x() takes a string and performs %a (host address), %c (client
  308.     * info), %h (host name or address), %d (daemon name), %p (process id) and
  309.     * %u (user name) substitutions. It aborts the program when the result of
  310. !   * expansion would overflow the output buffer. Because the result of %<char>
  311. !   * expansion is typically passed on to a shell process, characters that may
  312. !   * confuse the shell are replaced by underscores.
  313.     * 
  314.     * Diagnostics are reported through syslog(3).
  315.     * 
  316. ***************
  317. *** 10,16 ****
  318.     */
  319.   
  320.   #ifndef lint
  321. ! static char sccsid[] = "@(#) percent_x.c 1.1 92/06/11 22:21:49";
  322.   #endif
  323.   
  324.   /* System libraries. */
  325. --- 12,18 ----
  326.     */
  327.   
  328.   #ifndef lint
  329. ! static char sccsid[] = "@(#) percent_x.c 1.2 92/08/24 21:46:22";
  330.   #endif
  331.   
  332.   /* System libraries. */
  333. ***************
  334. *** 19,24 ****
  335. --- 21,27 ----
  336.   #include <syslog.h>
  337.   
  338.   extern char *strncpy();
  339. + extern char *strchr();
  340.   extern void exit();
  341.   
  342.   /* Local stuff. */
  343. ***************
  344. *** 39,44 ****
  345. --- 42,51 ----
  346.       char   *expansion;
  347.       int     expansion_len;
  348.       char    pid_buf[10];
  349. +     static char ok_chars[] = "1234567890!@%-_=+\\:,./\
  350. + abcdefghijklmnopqrstuvwxyz\
  351. + ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  352. +     char   *cp;
  353.   
  354.       /*
  355.        * %a becomes the client address; %c all user and host information we
  356. ***************
  357. *** 45,51 ****
  358.        * have about the client; %d the daemon process name; %h the client host
  359.        * name or address; %p the daemon process id; %u the remote user name; %%
  360.        * becomes a %, and %other is ignored. We terminate with a diagnostic if
  361. !      * we would overflow the result buffer.
  362.        */
  363.   
  364.       while (*str) {
  365. --- 52,59 ----
  366.        * have about the client; %d the daemon process name; %h the client host
  367.        * name or address; %p the daemon process id; %u the remote user name; %%
  368.        * becomes a %, and %other is ignored. We terminate with a diagnostic if
  369. !      * we would overflow the result buffer. Characters that may confuse the
  370. !      * shell are mapped to underscores.
  371.        */
  372.   
  373.       while (*str) {
  374. ***************
  375. *** 61,66 ****
  376. --- 69,77 ----
  377.           *str == '%' ? (str++, "%") :
  378.           *str == 0 ? "" : (str++, "");
  379.           expansion_len = strlen(expansion);
  380. +         for (cp = expansion; *cp; cp++)
  381. +         if (strchr(ok_chars, *cp) == 0)
  382. +             *cp = '_';
  383.       } else {
  384.           expansion = str++;
  385.           expansion_len = 1;
  386. Prereq: 1.9
  387. *** ./hosts_access.5-    Thu Jun 11 22:21:39 1992
  388. --- ./hosts_access.5    Mon Aug 24 21:46:19 1992
  389. ***************
  390. *** 112,117 ****
  391. --- 112,119 ----
  392.   .IP %%
  393.   expands to a single `%\' character.
  394.   .PP
  395. + Characters in % expansions that may confuse the shell are replaced by
  396. + underscores.
  397.   The result is executed by a \fI/bin/sh\fR child process with standard
  398.   input, output and error connected to \fI/dev/null\fR.  Specify an `&\'
  399.   at the end of the command if you do not want to wait until it has
  400. ***************
  401. *** 216,219 ****
  402.   Department of Mathematics and Computing Science
  403.   Eindhoven University of Technology
  404.   Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands
  405. ! \" @(#) hosts_access.5 1.9 92/06/11 22:21:37
  406. --- 218,221 ----
  407.   Department of Mathematics and Computing Science
  408.   Eindhoven University of Technology
  409.   Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands
  410. ! \" @(#) hosts_access.5 1.10 92/08/24 21:46:17
  411. Prereq: 1.8
  412. *** ./hosts_access.c-    Fri Jun 12 15:56:29 1992
  413. --- ./hosts_access.c    Mon Aug 24 21:46:21 1992
  414. ***************
  415. *** 12,18 ****
  416.     */
  417.   
  418.   #ifndef lint
  419. ! static char sccsid[] = "@(#) hosts_access.c 1.8 92/06/12 15:55:52";
  420.   #endif
  421.   
  422.    /* System libraries. */
  423. --- 12,18 ----
  424.     */
  425.   
  426.   #ifndef lint
  427. ! static char sccsid[] = "@(#) hosts_access.c 1.9 92/08/24 21:46:19";
  428.   #endif
  429.   
  430.    /* System libraries. */
  431. ***************
  432. *** 24,29 ****
  433. --- 24,30 ----
  434.   #include <stdio.h>
  435.   #include <syslog.h>
  436.   #include <ctype.h>
  437. + #include <errno.h>
  438.   
  439.   extern char *fgets();
  440.   extern char *strchr();
  441. ***************
  442. *** 136,141 ****
  443. --- 137,144 ----
  444.           }
  445.       }
  446.       (void) fclose(fp);
  447. +     } else if (errno != ENOENT) {
  448. +     syslog(LOG_ERR, "cannot open %s: %m", table);
  449.       }
  450.       match = (sv_match == YES && cl_match == YES);
  451.       if (match && sh_cmd)
  452. Prereq: 1.5
  453. *** ./BLURB-    Thu Jun 11 22:21:41 1992
  454. --- ./BLURB    Mon Aug 31 22:54:45 1992
  455. ***************
  456. *** 1,4 ****
  457. ! @(#) BLURB 1.5 92/06/11 22:21:40
  458.   
  459.   This package provides a couple of tiny programs that monitor incoming
  460.   requests for IP services such as TFTP, EXEC, FTP, RSH, TELNET, RLOGIN,
  461. --- 1,4 ----
  462. ! @(#) BLURB 1.6 92/08/31 22:54:43
  463.   
  464.   This package provides a couple of tiny programs that monitor incoming
  465.   requests for IP services such as TFTP, EXEC, FTP, RSH, TELNET, RLOGIN,
  466. ***************
  467. *** 13,33 ****
  468.   host name and then invoke the real network daemon. No information is
  469.   exchanged with the remote client process.
  470.   
  471. ! Enhancements over the previous release are: 
  472.   
  473. !     1 - network daemons no longer have to live within a common directory
  474. !     2 - the access control code now uses both the host address and name
  475. !     3 - an access control pattern that supports netmasks
  476. !     4 - additional protection against forged host names
  477. !     5 - a pattern that matches hosts whose name or address lookup fails
  478. !     6 - an operator that prevents hosts or services from being matched
  479. !     7 - optional remote username lookup with the RFC 931 protocol
  480. !     8 - an optional umask to prevent the creation of world-writable files
  481. !     9 - hooks for access control language extensions
  482. !    10 - last but not least, thoroughly revised documentation.
  483.   
  484. ! Except for the change described under (2) the present version should be
  485. ! backwards compatible with earlier ones.
  486.   
  487.       Wietse Venema (wietse@wzv.win.tue.nl),
  488.       Department of Mathematics and Computing Science,
  489. --- 13,71 ----
  490.   host name and then invoke the real network daemon. No information is
  491.   exchanged with the remote client process.
  492.   
  493. ! This is an interim release that takes care of some rough edges that
  494. ! were left in last June's release. It does not introduce any new
  495. ! features or changes to installation and/or configuration procedures.
  496.   
  497. !     - Some sites reported that connections would be rejected because
  498. !     localhost != localhost.domain. The host name checking code now
  499. !     special-cases localhost (problem reported by several sites).
  500.   
  501. !     - The programs now report an error if an existing access control
  502. !     file cannot be opened (e.g. due to lack of privileges).  Until now,
  503. !     the programs would just pretend that the access control file does
  504. !     not exist (reported by Darren Reed, avalon@coombs.anu.edu.au).
  505. !     - The timeout period for remote userid lookups was upped to 30
  506. !     seconds, in order to cope with slow hosts or networks.  If this is
  507. !     too long for you, adjust the TIMEOUT definition in file rfc931.c
  508. !     (problem reported by several sites).
  509. !     - On hosts with more than one IP network interface, remote userid
  510. !     lookups could use the IP address of the "wrong" local interface.
  511. !     The problem and its solution were discussed on the rfc931-users
  512. !     mailing list.  Scott Schwartz (schwartz@cs.psu.edu) folded the fix
  513. !     into the rfc931.c module.
  514. !     - The result of % expansion (in shell commands) is now checked for
  515. !     stuff that may confuse the shell; it is replaced by underscores
  516. !     (problem reported by Icarus Sparry, I.Sparry@gdr.bath.ac.uk).
  517. !     - A portability problem was fixed that caused compile-time problems
  518. !     on a CRAY (problem reported by Michael Barnett, mikeb@rmit.edu.au).
  519. ! Finally, a caveat for those who use the optional remote username lookup
  520. ! feature (RFC 931 protocol).  On some systems, these lookups may trigger
  521. ! a kernel bug.  When a client host connects to your system, and the RFC
  522. ! 931 connection to that client is rejected by a router, some kernels
  523. ! drop all connections with that client.  The bug is not in the log_tcp
  524. ! programs: complain to your vendor and don't enable remote user name
  525. ! lookups until the bug has been fixed.
  526. ! The following example can be used (from outside the tue.nl domain) to
  527. ! find out if you have the bug:
  528. !         % ftp 131.155.70.100
  529. ! Then, when the connection has been established, run the following
  530. ! command on the same machine:
  531. !         % telnet 131.155.70.100 111
  532. ! The telnet command should fail with: "host not reachable". If this
  533. ! causes you to lose the ftp connection, you have the bug (please report
  534. ! OS and hardware type). If the telnet command does not fail, please let
  535. ! me know, too :-)
  536.   
  537.       Wietse Venema (wietse@wzv.win.tue.nl),
  538.       Department of Mathematics and Computing Science,
  539. Prereq: 1.5
  540. *** ./Makefile-    Thu Jun 11 22:21:37 1992
  541. --- ./Makefile    Thu Jul  2 13:00:56 1992
  542. ***************
  543. *** 1,4 ****
  544. ! # @(#) Makefile 1.5 92/06/11 22:21:35
  545.   
  546.   ##############################
  547.   ## Begin configuration options
  548. --- 1,4 ----
  549. ! # @(#) Makefile 1.6 92/07/02 13:00:55
  550.   
  551.   ##############################
  552.   ## Begin configuration options
  553. ***************
  554. *** 113,128 ****
  555.       $(RANLIB) $(LIB)
  556.   
  557.   tcpd:    tcpd.o fromhost.o $(LIB)
  558. !     $(CC) $(CFLAGS) -o $@ tcpd.o fromhost.o $(LIB)
  559.   
  560.   miscd:    miscd.o fromhost.o $(LIB)
  561. !     $(CC) $(CFLAGS) -o $@ miscd.o fromhost.o $(LIB)
  562.   
  563.   try:    try.o $(LIB)
  564. !     $(CC) $(CFLAGS) -o $@ try.o $(LIB)
  565.   
  566.   fromhost: fromhost.c log_tcp.h Makefile $(LIB)
  567. !     $(CC) $(CFLAGS) -DTEST -o fromhost fromhost.c $(LIB)
  568.       rm -f fromhost.o
  569.   
  570.   shar:    
  571. --- 113,128 ----
  572.       $(RANLIB) $(LIB)
  573.   
  574.   tcpd:    tcpd.o fromhost.o $(LIB)
  575. !     $(CC) $(CFLAGS) -o $@ tcpd.o fromhost.o $(LIB) $(LIBS)
  576.   
  577.   miscd:    miscd.o fromhost.o $(LIB)
  578. !     $(CC) $(CFLAGS) -o $@ miscd.o fromhost.o $(LIB) $(LIBS)
  579.   
  580.   try:    try.o $(LIB)
  581. !     $(CC) $(CFLAGS) -o $@ try.o $(LIB) $(LIBS)
  582.   
  583.   fromhost: fromhost.c log_tcp.h Makefile $(LIB)
  584. !     $(CC) $(CFLAGS) -DTEST -o fromhost fromhost.c $(LIB) $(LIBS)
  585.       rm -f fromhost.o
  586.   
  587.   shar:    
  588.  
  589. exit 0 # Just in case...
  590.