#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 1)."
# Contents:  Makefile README in.gate.c in.gate.conf in.gate.raw
# Wrapped by pochmara@bogart on Mon Dec 23 11:15:56 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(1907 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X#
X# Makefile for in.gate
X#
X#  John Pochmara (pochmara@cse.ogi.edu)
X#  Oregon Grauate Inistitute of Science & Technology
X#
X#
X# Copyright (c) 1991, John Pochmara, pochmara@cse.ogi.edu
X#
X# Permission is granted to copy and distribute this file in modified
X# or unmodified form, for noncommercial use, provided (a) this copyright
X# notice is preserved, (b) no attempt is made to restrict redistribution
X# of this file, and (c) this file is not distributed as part of any
X# collection whose redistribution is restricted by a compilation copyright.
X#
X
X
X#
X# CONFIG_FILE
X#
X#   Set to where in.gate's config file will live.  If not defined here defaults
X#   to /etc/in.gate.conf .
X#
XCONFIG_FILE = /etc/local/in.gate.conf
X
X#
X# DEBUG flag
X#
X#  If DEBUG is defined then in.gate logs debugging info to syslog
X#  at LOG_DEBUG level.
X#
X#DEBUG = -DDEBUG
X
X#
X# XTR_FLAGS
X#
X# Place any other flags you want to pass to CC here.
X#
XXTR_FLAGS = -O
X
X#
X# INSTALL_DIR
X#
X#  Set to directory where in.gate will live.
X#
XINSTALL_DIR = /etc/local
X
X#
X# MAN_DIR
X#
X# Set to top of man directory tree where you want
X# in.gate man-page to live.
X#
XMAN_DIR = /usr/local/man
X
X
X#####################################
X#                                   #
X#    End of config parameters       #
X#                                   #
X#####################################
X
X
XCFLAGS = $(XTR_FLAGS) $(DEBUG) -DCONFIG_FILE=\"$(CONFIG_FILE)\"
X
XSRC = in.gate.c
XOBJ = in.gate.o
X
XMAN_SRC = in.gate.raw
X
XCC = cc
X
XPROG = in.gate
X
Xall: $(PROG) $(PROG).8
X
X
X$(PROG): $(OBJ) Makefile
X	$(CC) $(CFLAGS) -o $(PROG) $(OBJ)
X
X$(PROG).8: $(MAN_SRC) Makefile
X	rm -f $(PROG).8
X	sed -e "s,_CONFIG_,$(CONFIG_FILE)," -e "s,_PROG_,$(PROG)," \
X	    -e "s,_PATH_,$(INSTALL_DIR)/$(PROG)," $(MAN_SRC) > $(PROG).8
X
Xclean:
X	rm -f $(OBJ) $(PROG) $(PROG).8
X
Xinstall: all
X	install -c -o root -m 755 $(PROG) $(INSTALL_DIR)/$(PROG)
X	install -c -m 444 $(PROG).8 $(MAN_DIR)/man8/$(PROG).8
X
X
END_OF_FILE
if test 1907 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(760 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
X
XReadme for in.gate version 1 patchlevel 0
X
X
XHow To Install
X
X	1) Edit the Makefile and set config options as needed.
X
X	2) Run make.
X
X	3) Create an in.gate.conf file for your site.  See top
X	   of example in.gate.conf file and man-page for
X	   format of in.gate.conf.
X
X	4) Do make install.
X
X	5) Copy your sites in.gate.conf file to where CONFIG_FILE
X	   in the Makefile points.
X
X	6) Edit inetd.conf and add in.gate to the services you want.
X
X	7) Have inetd reload inetd.conf
X
X	8) And now if everything went well in.gate should be
X	   working.  I would do some testing.
X
X
XNotes
X	1) Changes made to in.gate.conf take affect right away, you
X	   don't have to reload inetd.
X
X	2) in.gate does not work with RCP base services.
X
X
X	John Pochmara
X	pochmara@cse.ogi.edu
X
END_OF_FILE
if test 760 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'in.gate.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'in.gate.c'\"
else
echo shar: Extracting \"'in.gate.c'\" \(9403 characters\)
sed "s/^X//" >'in.gate.c' <<'END_OF_FILE'
X/*
X * $Id: in.gate.c,v 1.3 91/12/23 11:14:55 pochmara Exp $
X *
X * in.gate.c
X *
X *  John Pochmara (pochmara@cse.ogi.edu)
X *  Oregon Graduate Institute of Science & Technology
X *
X *
X * Copyright (c) 1991, John Pochmara, pochmara@cse.ogi.edu
X *
X * Permission is granted to copy and distribute this file in modified
X * or unmodified form, for noncommercial use, provided (a) this copyright
X * notice is preserved, (b) no attempt is made to restrict redistribution
X * of this file, and (c) this file is not distributed as part of any
X * collection whose redistribution is restricted by a compilation copyright.
X *
X */
X
X#include <sys/types.h>
X#include <sys/socket.h>
X#include <netinet/in.h>
X#include <arpa/inet.h>
X#include <sys/time.h>
X
X#include <stdio.h>
X#include <syslog.h>
X#include <strings.h>
X
Xstatic void fatal();
Xstatic int ReadLine();
Xstatic int ServiceAccess();
Xstatic int CheckAccess();
Xstatic int ConvertHostAddr();
Xstatic int CompareHost();
Xstatic int CheckTime();
Xstatic int OkTime();
Xstatic int OkMinute();
X
X#ifndef CONFIG_FILE
X#define CONFIG_FILE	"/etc/in.gate.conf"
X#endif
X
X#define TRUE		(1)
X#define FALSE		(0)
X
X#define BIGBUF		(2048)
X#define SMALLBUF	(512)
X
X#define EXACT		(0)
X#define META		(1)
X#define NOMATCH		(2)
X
X#define WILD_CARD	(-2)
X
Xstruct ip_addr {
X	int ha_oct[4];
X};
X
Xstatic char *Version = "1.0 patchlevel 0";
X
Xmain( argc, argv )
Xint argc;
Xchar *argv[];
X{
X	struct sockaddr_in from;
X	char *hostdot;
X	char *service;
X	char *path;
X	char buf[BIGBUF];
X	int fromlen;
X	int datagram = FALSE;
X
X#ifdef LOG_DAEMON
X	openlog( "in.gate", LOG_PID, LOG_AUTH );
X#else
X	openlog( "in.gate", LOG_PID );
X#endif
X
X#ifdef DEBUG
X	syslog( LOG_DEBUG, "Hello from in.gate %s", Version ); 
X	syslog( LOG_INFO, "Checking access for service '%s'", argv[1] );
X#endif
X
X	fromlen = sizeof( from );
X	if( getpeername( 0, &from, &fromlen ) < 0 ) {
X
X		/* 
X		 * maybe its a datagram... 
X		 */
X		fromlen = sizeof( from );
X		if( recvfrom( 0, buf, sizeof(buf), 
X					MSG_PEEK, &from, &fromlen ) < 0 ) {
X			syslog( LOG_NOTICE, "could not find source host!? (%m)" );
X			exit( 1 );
X		}
X		datagram = TRUE;
X	}
X
X	hostdot = inet_ntoa( from.sin_addr );
X	service = argv[1];
X
X#ifdef DEBUG
X	syslog( LOG_DEBUG, "Checking Host: %s\nService: %s\n", 
X							hostdot, service );
X#endif DEBUG
X
X	if( ServiceAccess( &from, service ) != TRUE ) {
X		syslog( LOG_WARNING, "service denied to %s for %s",
X							hostdot, service );
X		closelog();
X	
X		if( datagram == FALSE ) {
X			fatal( 0, "Access denied" );
X		} else {
X			/* consume packet */
X			recvfrom( 0, buf, sizeof(buf), 0, &from, &fromlen );
X			exit( 0 );
X		}
X	} else {
X		syslog( LOG_INFO, "service granted to %s for %s", 
X							hostdot, service );
X	}
X
X	closelog();
X
X	path = argv[0];
X	argv++;
X
X	execv( path, argv );
X
X#ifdef LOG_DAEMON
X	openlog( "in.gate", LOG_PID, LOG_DAEMON );
X#else
X	openlog( "in.gate", LOG_PID );
X#endif 
X	syslog( LOG_NOTICE, "could not execv '%s'", path );
X
X	closelog();
X
X	fatal( 0, "service fialed" );
X}
X
Xstatic void fatal( fd, msg )
Xint fd;
Xchar *msg;
X{
X	char tmp[BUFSIZ];
X
X	sprintf( tmp, "\r\n %s \r\n\r\n", msg );
X	write( fd, tmp, strlen( tmp ) );
X
X	exit( 0 );
X}
X
X/*
X * ServiceAccess( host, service )
X *
X *
X * parameters:
X *	host - sockaddr_in for the host to check
X *	service - service that people wish to use.
X *
X * returns:
X *	TRUE ( 1 ) - if the service is usable by host.
X *	FALSE ( 0 ) - if the host can not use the the service.
X *
X */
Xstatic int ServiceAccess( host, service )
Xstruct sockaddr_in *host;
Xchar *service;
X{
X	FILE *fp;
X	int ret;
X
X
X	if( ( fp = fopen( CONFIG_FILE, "r" ) ) == NULL ) {
X		/* access file missing, return TRUE then */
X		syslog( LOG_WARNING, "could not open '%s', defaulting to allowing access", CONFIG_FILE );
X		return( TRUE );
X	}
X
X	
X	ret = CheckAccess( fp, host, service );
X
X	fclose( fp );
X
X#ifdef DEBUG
X	syslog( LOG_DEBUG, "%s %s use %s.", host, ret ? "can" : "can not", 
X								service );
X#endif DEBUG
X
X	return( ret );
X}
X
X/*
X *
X *
X */
Xstatic int CheckAccess( fp, host, service )
XFILE *fp;
Xstruct sockaddr_in *host;
Xchar *service;
X{
X	struct ip_addr host_pat;
X	struct ip_addr src_host;
X	char f_service[SMALLBUF];
X	char f_use[SMALLBUF];
X	char f_times[BIGBUF];
X
X	ConvertHostAddr( host, &src_host );
X
X	while( ReadLine( fp, &host_pat, f_service, f_use, f_times ) == TRUE ) {
X
X#ifdef DEBUG
X	if( f_times[0] == NULL ) {
X		syslog( LOG_DEBUG, "Read in: %d.%d.%d.%d %s %s\n", 
X				host_pat.ha_oct[0], host_pat.ha_oct[1], 
X				host_pat.ha_oct[2], host_pat.ha_oct[3] , 
X				f_service, f_use );
X	} else {
X		syslog( LOG_DEBUG, "Read in: %d.%d.%d.%d %s %s %s\n", 
X				host_pat.ha_oct[0], host_pat.ha_oct[1], 
X				host_pat.ha_oct[2], host_pat.ha_oct[3] , 
X				f_service, f_use, f_times );
X	}
X#endif DEBUG
X
X		if( ( CompareHost( &host_pat, &src_host ) != NOMATCH ) &&
X		    ( strcmp( f_service, service ) == 0 ) ) {
X
X#ifdef DEBUG
X			syslog( LOG_DEBUG, "Host and server matched." );
X#endif DEBUG
X
X			switch( f_use[0] ) {
X
X				case 'Y':
X				case 'y':
X					if( f_times[0] != NULL ) {
X#ifdef DEBUG
X						syslog( LOG_DEBUG, 
X							"checking times..." );
X#endif DEBUG
X						return( CheckTime( f_times ) );
X					} else {
X						return( TRUE );
X					}
X					break;
X				default:
X					return( FALSE );
X			}
X
X		}
X
X	}
X
X	/* host was not listed in access file,  what to do.... */
X
X	return( TRUE );
X
X}
X
X/*
X * ConvertHostAddr( shost, ahost )
X *
X *  Converts the sin_addr form of the host address to an internal form.
X *
X * parameters:
X *	shost - sin_addr form of address.
X *	ahost - a pointer to the structure ip_addr.
X *
X * returns:
X *	TRUE - if convertion went ok.
X *	FALSE - if conversion fialed.
X *
X */
Xstatic int ConvertHostAddr( shost, ahost )
Xstruct sockaddr_in *shost;
Xstruct ip_addr *ahost;
X{
X	int n;
X	char *c;
X
X	c = (char *)&(shost->sin_addr.s_addr);
X
X	ahost->ha_oct[0] = (int)(c[0] & 0xff);
X	ahost->ha_oct[1] = (int)(c[1] & 0xff);
X	ahost->ha_oct[2] = (int)(c[2] & 0xff);
X	ahost->ha_oct[3] = (int)(c[3] & 0xff);
X
X	return( TRUE );
X}
X
X/*
X * Comparehost( patern, host )
X *
X *  Compares host to patern.
X *
X * parameters:
X *	patern - patern to compare agaist.
X *	host - host address to  compare.
X *
X * returns:
X *	EXACT - if host == patern
X *	META - if host matchs patern due to META chars.
X *	NOMATCH - if host does not match patern.
X *
X */ 
Xstatic int CompareHost( patern, host )
Xstruct ip_addr *patern;
Xstruct ip_addr *host;
X{
X
X
X	if( ( patern->ha_oct[0] == host->ha_oct[0] ) &&
X	    ( patern->ha_oct[1] == host->ha_oct[1] ) &&
X	    ( patern->ha_oct[2] == host->ha_oct[2] ) &&
X	    ( patern->ha_oct[3] == host->ha_oct[3] ) ) {
X
X		return( EXACT );
X
X	} else if( ( ( patern->ha_oct[0] == host->ha_oct[0] ) || 
X		     ( patern->ha_oct[0] == WILD_CARD ) ) &&
X		   ( ( patern->ha_oct[1] == host->ha_oct[1] ) ||
X		     ( patern->ha_oct[1] == WILD_CARD ) ) &&
X		   ( ( patern->ha_oct[2] == host->ha_oct[2] ) ||
X		     ( patern->ha_oct[2] == WILD_CARD ) ) &&
X		   ( ( patern->ha_oct[3] == host->ha_oct[3] ) ||
X		     ( patern->ha_oct[3] == WILD_CARD ) ) ) {
X
X			return( META );
X
X	} else { 
X	
X		return( NOMATCH );
X
X	}
X}
X
X
Xstatic int CheckTime( times )
Xchar *times;
X{
X	char *tmp,*pl;
X	int s_min, s_hour;
X	int e_min, e_hour;
X	struct tm *now;
X	int n;
X	long clock;
X
X
X	clock = time( (long *) 0 );
X	now = localtime( &clock );
X
X	pl = tmp = times;
X
X	while( pl != NULL ) {
X
X		tmp = index( times, ',' );
X
X		if( tmp != NULL ) {
X			*tmp = NULL;
X			tmp++;
X		}
X
X		n = sscanf( pl, "%d:%d-%d:%d", &s_hour, &s_min, 
X							&e_hour, &e_min );
X
X		if( n == 4 ) {
X
X			if( OkTime(now,s_hour,s_min,e_hour,e_min) == TRUE ) {
X				return( TRUE );
X			}
X
X		}
X
X		pl = tmp;
X
X	}
X
X	return( FALSE );
X
X}
X
Xstatic int OkTime( now, sh, sm, eh, em )
Xstruct tm *now;
Xint sh, sm;
Xint eh, em;
X{
X	if( eh < sh ) {
X
X		if( ( ( now->tm_hour >= sh ) || ( now->tm_hour <= eh ) ) &&
X		     ( OkMinute( now, sm, em ) == TRUE ) ) {
X			return( TRUE );
X		} else {
X			return( FALSE );
X		}
X
X	} else {
X
X		if( ( ( now->tm_hour >= sh ) && ( now->tm_hour <= eh ) ) &&
X		    ( OkMinute( now, sm, em ) == TRUE ) ) {
X			return( TRUE );
X		} else {
X			return( FALSE );
X		}
X
X	}
X}
X
Xstatic int OkMinute( now, sm, em ) 
Xstruct tm *now;
Xint sm, em;
X{
X	if( ( now->tm_min >= sm ) || ( now->tm_min <= em ) ) {
X		return( TRUE );
X	} else {
X		return( FALSE );
X	}
X}
X
X/*
X * ReadLine( fp, host, service, use, times )
X *
X *
X * parameters:
X *	fp - File to read from.
X *	host - filled in with the host addr
X *	service - filled in with service name
X *	use - filled in with use field
X *	times - filled in with times field
X *
X * returns: 
X *	TRUE - if got a line.
X *	FALSE - if did not get a line, I.E. EOF
X *
X */
Xstatic int ReadLine( fp, host, service, use, times )
XFILE *fp;
Xstruct ip_addr *host;
Xchar *service;
Xchar *use;
Xchar *times;
X{
X	extern int atoi();
X	char buf[BIGBUF];
X	char sh[SMALLBUF];
X	char *tmp1, *tmp2;
X	int n,i;
X
X	while( fgets( buf, BIGBUF, fp ) != NULL ) {
X
X
X		if( buf[0] == '#' ) {	/* skip comment lines */
X			continue;
X		}
X
X		n = sscanf( buf, "%s %s %s %s", sh, service, use, times );
X		switch( n ) {
X
X			case EOF:
X			case 0:
X			case 1:		/* skip bad lines */
X			case 2:
X				continue;	
X				break;
X			case 3:
X				times[0] = NULL;
X			case 4:
X				tmp2 = sh;
X				for( i = 0; i < 4; i++ ) {
X
X				  tmp1 = index( tmp2, '.' );
X				  if( tmp1 == NULL && i != 3 ) break;
X				  if( tmp1 != NULL ) {
X					 *tmp1 = NULL;
X					  tmp1++;
X				  }
X				  if( *tmp2 == '*' ) {
X					host->ha_oct[i] = WILD_CARD;
X				  } else {
X					host->ha_oct[i] = atoi( tmp2 );
X				  }
X				  tmp2 = tmp1;
X				}
X
X				return( TRUE );
X				break;
X		}
X
X	}
X
X	return( FALSE );
X
X}
END_OF_FILE
if test 9403 -ne `wc -c <'in.gate.c'`; then
    echo shar: \"'in.gate.c'\" unpacked with wrong size!
fi
# end of 'in.gate.c'
fi
if test -f 'in.gate.conf' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'in.gate.conf'\"
else
echo shar: Extracting \"'in.gate.conf'\" \(1625 characters\)
sed "s/^X//" >'in.gate.conf' <<'END_OF_FILE'
X#
X# Example configuration file for in.gate
X#
X# Format:
X#  <ip addr> <daemon> <yes/no> [<time>]
X#
X# <ip addr> should be in dot notation.  '*' can be used as a wild card
X# 	    for each octet. 
X#		Ex: 
X#			129.95.40.10 matches one machine
X#			129.95.40.*  matches the entire subnet
X#
X# <deamon>  the name of the daemon. This should match inetd.conf's
X#	    arg[0] of the server-arguments field. Ie: telnetd or in.telnetd
X#
X# <yes/no>  Should be either 'yes' or 'no'.  If yes then any ip addr
X#	    matching <ip addr> is granted access.  If no access is
X#	    denied to macthing <ip addr>s.
X#
X# <time>    Is a optional list of time when the restriction applies.
X#	    If there is no times listed then the restriction always apply.
X#	    Times are in 24 hour clock. Ex: 10:00-15:00,18:00-20:30
X#
X#  The restrictions are searched linearly.  The first match
X#  is the one applied.  If no match is found access is granted.
X#  A 'default' for a service can be made by placing a line at the 
X#  bottom with ip addr equal to '*.*.*.*' which macthes all ip address.
X#
X#  Blank lines and lines starting with '#' are ignored.
X#
X#
X# (the following ip address are random numbers)
X#
X
X#
X# Restrict access to local network
X#
X33.123.40.*	telnetd		yes
X33.123.40.*	rshd		yes
X33.123.40.*	rlogind		yes
X33.123.40.*	ftpd		yes
X33.123.40.*	rexecd		yes
X
X#
X# only allow uucpd to host 88.99.2.56
X#
X88.99.2.56	uucpd		yes
X
X#
X# Only allow tftp from network 33.123.40.0
X#
X33.123.40.*	tftpd		yes
X
X#
X# Defualt to no access
X#
X*.*.*.*		telnetd		no
X*.*.*.*		rshd		no
X*.*.*.*		rlogind		no
X*.*.*.*		tftpd		no
X*.*.*.*		ftpd		no
X*.*.*.*		rexecd		no
X*.*.*.*		uucpd		no
END_OF_FILE
if test 1625 -ne `wc -c <'in.gate.conf'`; then
    echo shar: \"'in.gate.conf'\" unpacked with wrong size!
fi
# end of 'in.gate.conf'
fi
if test -f 'in.gate.raw' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'in.gate.raw'\"
else
echo shar: Extracting \"'in.gate.raw'\" \(2840 characters\)
sed "s/^X//" >'in.gate.raw' <<'END_OF_FILE'
X.TH IN.GATE 8 "16 August 1991"
X.SH NAME
X_PROG_ \- security gate for inetd
X.SH SYNOPSIS
X.B _PROG_ server-program server-arguments
X.SH DESCRIPTION
X.B _PROG_
Xallows control over which hosts are allowed to 
Xuse services provided from 
X.BR inetd(8C).
X.LP
X.B _PROG_
Xworks by sitting between 
X.BR inetd(8C)
Xand the server programs.
X.BR inetd(8C)
Xstarts 
X.B _PROG_
Xwhich then checks to see if the requesting host has permissions
Xto use the service.  If the host
Xdoes have permissions then 
X.B _PROG_ 
Xstarts up the requested server, otherwise 
X.B _PROG_
Xreports
X.I `Access denied'
Xto the requesting host and exits.
X.LP
XA
X.BR syslog(8)
Xentry is made for every request consisting of the 
Xhost IP address who requested
Xthe service, the service requested, and whether or not
Xaccess was granted. 
X.LP
XThe access list for
X.B _PROG_
Xis stored in
X.B _CONFIG_ .
X.SH CONFIG FILE
XThe access list for
X.B _PROG_
Xconsists of lines of the from:
X.IP
X.I
Xip-addr\ \ \ service-name\ \ \ access-status\ \ \ times
X.LP
XFields can be separated by either spaces or
X.SM TAB
Xcharacters.  Blank lines and lines starting with a
X.RB ` # '
Xare ignored. 
X.B _CONFIG_
Xis searched linearly for host matching and the first 
Xmatch found is the one used.
XIf an entry in 
X.B _CONFIG_
Xdoes match the host then access is granted.
X.TP 20
X.I ip-addr
Xis the IP address in dot notation of the host the
Xcurrent line applies to.  The IP address can contain
X.RB ` * '
Xas one or more of the octets in the IP address. This
Xmatches all numbers for that octet.
X.TP
X.I service-name
Xis the service for which the current config line applies.
XThis must match argument 0 of the server-arguments field
Xin inetd.conf.
X.TP
X.I access-status
Xis either
X.I yes
Xor
X.I no .
XIf set to
X.I yes
Xthen 
X.I ip-addr
Xis allowed to use the service otherwise access is denied.
X.TP
X.I times
Xis a optional comma separated list of times in which access is granted.
XThis field only applies if 
X.I access-status
Xis 
X.I yes .
XTimes are in 24 hour clock.
X.SH EXAMPLE CONFIG
X.LP
XTo allow telnet access to any host 
Xon network 123.45.0.0 you would use:
X.RS 10
X123.45.*.*\ \ \ in.telnetd\ \ \ yes
X.RE
X.LP
XTo disable rsh for host 92.33.1.2 use:
X.RS 10
X92.333.1.2\ \ \ in.rshelld\ \ \ \ no
X.RE
X.LP
XAllow finger use by network 45.678.0.0
Xbetween 8am and 5pm.
X.RS 10
X45.678.*.*\ \ \ in.fingerd\ \ \ \ yes\ \ \ 08:00-17:00
X.RE
X.LP
XTo limit telnet access to 9am-11am and 2pm-4pm
Xuse:
X.RS 5
X*.*.*.*\ \ \ \ \ \ in.telnetd\ \ \ yes\ \ \ 09:00-11:00,14:00-16:00
X.RE
X.LP
XTo limit use of rlogin to 34.56.3.12
Xuse:
X.RS 10
X34.56.3.12\ \ \ in.rlogind\ \ \ \ yes
X*.*.*.*\ \ \ \ \ \ in.rlogind\ \ \ no
X.RE
X.SH FILES
X.B _PATH_
X.br
X.B _CONFIG_
X.SH "SEE ALSO"
Xinetd (8C)
X.br
Xinetd.conf (5)
X.SH AUTHOR
XJohn Pochmara <pochmara@cse.ogi.edu>
X.LP
X.SH BUGS
XThe
X.I times
Xoption has not been tested completely.  
X.B _PROG_
Xdoes not work for RPC based services.
END_OF_FILE
if test 2840 -ne `wc -c <'in.gate.raw'`; then
    echo shar: \"'in.gate.raw'\" unpacked with wrong size!
fi
# end of 'in.gate.raw'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have the archive.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
