Return to BSD News archive
Newsgroups: comp.bugs.2bsd
Path: euryale.cc.adfa.oz.au!newshost.carno.net.au!harbinger.cc.monash.edu.au!news.mira.net.au!news.netspace.net.au!news.mel.connect.com.au!munnari.OZ.AU!spool.mu.edu!uwm.edu!chi-news.cic.net!feed1.news.erols.com!howland.erols.net!news.mathworks.com!uunet!in3.uu.net!nntp.netrex.net!wlbr!moe.2bsd.com!sms
From: sms@moe.2bsd.com (Steven M. Schultz)
Subject: inetd(8) with tcpmux support (#343)
Organization: 2BSD, Simi Valley CA USA
Message-ID: <E0wAxv.9oA@moe.2bsd.com>
Date: Fri, 15 Nov 1996 04:53:55 GMT
Lines: 2280
Subject: inetd(8) with tcpmux support (#343)
Index: usr.sbin/inetd 2.11BSD
Description:
The version of inetd(8) in 2.11BSD is the old 4.3BSD version
which lacks 'tcpmux' support.
Repeat-By:
Observation.
Or by enabling tcpmux (tcp port 1) service in /etc/inetd.conf (and
adding 'tcpmux' to /etc/services) and noting the errors.
Fix:
The fix was to simply port over the 4.4BSD inetd program from the
4.4-Lite2 CDrom. Very few changes were needed - just a couple
tweeks to compensate for the normal long.vs.int and lack of function
prototypes. Register declarations were also added (which reduced
the size of the program by quite a bit).
Since this is a complete replacement this is a good time to move
'inetd' out of /etc (one less program to worry about later on). This
means that /etc/rc needs to be updated.
To install the new version of inetd, cut where indicated and save
to a file (/tmp/343). Then:
cd /tmp
sh 343
sh 343.shar
patch -p0 < 343.patch
cd /usr/src/usr.sbin/inetd
make
make install
make clean
NOTE: The patch to inetd.conf may not succeed if your inetd.conf
is too different from mine.
It is possible to 'frontend' tcpmux service with the TCP-
wrapper program ('tcpd') on a per tcpmux service basis.
Then kill the currently running 'inetd' process. Start the new
one by:
/usr/sbin/inetd
Finally clean up by running the provided shell script or executing
the commands manually:
sh /tmp/343.sh
(this removes the old executable, manpage and source file).
You're all done. All that's left is to enable 'tcpmux' service if
you wish to do so. The manpage provides good examples on how to
do this.
As always this and previous updates to 2.11BSD are available via
anonymous FTP to either FTP.IIPO.GTEGSC.COM or MOE.2BSD.COM in the
directory /pub/2.11BSD.
==============================cut here======================
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# 343.sh
# 343.shar
# 343.patch
# This archive created: Thu Nov 14 20:15:49 1996
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f '343.sh'
then
echo shar: "will not over-write existing file '343.sh'"
else
sed 's/^Z//' << \SHAR_EOF > '343.sh'
Z#!/bin/sh
Z
Zrm /etc/inetd
Zrm /usr/src/man/man8/inetd.8
Zrm /usr/src/etc/inetd.c
SHAR_EOF
fi
if test -f '343.shar'
then
echo shar: "will not over-write existing file '343.shar'"
else
sed 's/^Z//' << \SHAR_EOF > '343.shar'
Z#! /bin/sh
Z# This is a shell archive, meaning:
Z# 1. Remove everything above the #! /bin/sh line.
Z# 2. Save the resulting text in a file.
Z# 3. Execute the file with /bin/sh (not csh) to create:
Z# /usr/src/usr.sbin/inetd
Z# This archive created: Wed Nov 13 21:53:16 1996
Zexport PATH; PATH=/bin:/usr/bin:$PATH
Zif test ! -d '/usr/src/usr.sbin/inetd'
Zthen
Z mkdir '/usr/src/usr.sbin/inetd'
Zfi
Zcd '/usr/src/usr.sbin/inetd'
Zif test -f 'Makefile'
Zthen
Z echo shar: "will not over-write existing file 'Makefile'"
Zelse
Zsed 's/^X//' << \SHAR_EOF > 'Makefile'
ZX#
ZX# Public Domain. 1996/11/6 - Steven Schultz
ZX#
ZX# @(#)Makefile 1.1 (2.11BSD) 1996/11/13
ZX#
ZXCFLAGS= -O
ZXSEPFLAG= -i
ZXSRCS= inetd.c
ZXOBJS= inetd.o
ZXMAN= inetd.0
ZXMANSRC= inetd.8
ZX
ZXall: inetd inetd.0
ZX
ZXinetd: ${OBJS}
ZX ${CC} ${CFLAGS} ${SEPFLAG} -o $@ ${OBJS}
ZX
ZXinetd.0: ${MANSRC}
ZX /usr/man/manroff ${MANSRC} > ${MAN}
ZX
ZXclean:
ZX rm -f ${OBJS} ${MAN} inetd tags
ZX
ZXdepend: ${SRCS}
ZX mkdep ${CFLAGS} ${SRCS}
ZX
ZXinstall: inetd
ZX install -c -o bin -g bin -m 444 ${MAN} ${DESTDIR}/usr/man/cat8
ZX install -s -o root -g bin -m 755 inetd ${DESTDIR}/usr/sbin/inetd
ZX
ZXlint: ${SRCS}
ZX lint -hax ${SRCS}
ZX
ZXtags: ${SRCS}
ZX ctags ${SRCS}
ZX# DO NOT DELETE THIS LINE -- mkdep uses it.
ZX# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
ZSHAR_EOF
Zchmod 644 'Makefile'
Zfi
Zif test -f 'inetd.8'
Zthen
Z echo shar: "will not over-write existing file 'inetd.8'"
Zelse
Zsed 's/^X//' << \SHAR_EOF > 'inetd.8'
ZX.\" Copyright (c) 1985, 1991, 1993, 1994
ZX.\" The Regents of the University of California. All rights reserved.
ZX.\"
ZX.\" Redistribution and use in source and binary forms, with or without
ZX.\" modification, are permitted provided that the following conditions
ZX.\" are met:
ZX.\" 1. Redistributions of source code must retain the above copyright
ZX.\" notice, this list of conditions and the following disclaimer.
ZX.\" 2. Redistributions in binary form must reproduce the above copyright
ZX.\" notice, this list of conditions and the following disclaimer in the
ZX.\" documentation and/or other materials provided with the distribution.
ZX.\" 3. All advertising materials mentioning features or use of this software
ZX.\" must display the following acknowledgement:
ZX.\" This product includes software developed by the University of
ZX.\" California, Berkeley and its contributors.
ZX.\" 4. Neither the name of the University nor the names of its contributors
ZX.\" may be used to endorse or promote products derived from this software
ZX.\" without specific prior written permission.
ZX.\"
ZX.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ZX.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
ZX.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ZX.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
ZX.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ZX.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
ZX.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
ZX.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
ZX.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
ZX.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
ZX.\" SUCH DAMAGE.
ZX.\"
ZX.\" @(#)inetd.8 8.4.1 (2.11BSD) 1996/11/7
ZX.\"
ZX.TH INETD 8 "November 7, 1996"
ZX.UC 7
ZX.SH NAME
ZX\fBinetd\fP \- internet ``super-server''
ZX.SH SYNOPSIS
ZX.B inetd
ZX[\fB\-d\fP]
ZX[\fB\-R\fP \fIrate\fP]
ZX[\fIconfiguration file\fP]
ZX.SH DESCRIPTION
ZXThe
ZX.B inetd
ZXprogram
ZXshould be run at boot time by
ZX.I /etc/rc
ZX(see rc(8)).
ZXIt then listens for connections on certain
ZXinternet sockets. When a connection is found on one
ZXof its sockets, it decides what service the socket
ZXcorresponds to, and invokes a program to service the request.
ZXThe server program is invoked with the service socket
ZXas its standard input, output and error descriptors.
ZXAfter the program is
ZXfinished,
ZX.B inetd
ZXcontinues to listen on the socket (except in some cases which
ZXwill be described below). Essentially,
ZX.B inetd
ZXallows running one daemon to invoke several others,
ZXreducing load on the system.
ZX.PP
ZXThe options available for
ZX.B inetd:
ZX.TP 10
ZX.B \-d
ZXTurns on debugging.
ZX.TP 10
ZX\fB\-R\fP \fIrate\fP
ZXSpecifies the maximum number of times a service can be invoked
ZXin one minute; the default is 1000.
ZX.PP
ZXUpon execution,
ZX.B inetd
ZXreads its configuration information from a configuration
ZXfile which, by default, is
ZX\fI/etc/inetd.conf\fP.
ZXThere must be an entry for each field of the configuration
ZXfile, with entries for each field separated by a tab or
ZXa space. Comments are denoted by a ``#'' at the beginning
ZXof a line. There must be an entry for each field. The
ZXfields of the configuration file are as follows:
ZX.PP
ZX.in +0.5i
ZX.nf
ZXservice name
ZXsocket type
ZXprotocol
ZXwait/nowait
ZXuser
ZXserver program
ZXserver program arguments
ZX.br
ZX.fi
ZX.in -0.5i
ZX.PP
ZXThere are two types of services that
ZX.B inetd
ZXcan start: standard and TCPMUX.
ZXA standard service has a well-known port assigned to it;
ZXit may be a service that implements an official Internet standard or is a
ZXBSD-specific service.
ZXAs described in
ZXRFC 1078,
ZXTCPMUX services are nonstandard services that do not have a
ZXwell-known port assigned to them.
ZXThey are invoked from
ZX.B inetd
ZXwhen a program connects to the
ZX``tcpmux''
ZXwell-known port and specifies
ZXthe service name.
ZXThis feature is useful for adding locally-developed servers.
ZX.PP
ZXThe
ZX.I service-name
ZXentry is the name of a valid service in
ZXthe file
ZX.IR /etc/services .
ZXFor
ZX``internal''
ZXservices (discussed below), the service
ZXname
ZX.B must
ZXbe the official name of the service (that is, the first entry in
ZX.IR /etc/services ).
ZXFor TCPMUX services, the value of the
ZX.I service-name
ZXfield consists of the string
ZX``tcpmux''
ZXfollowed by a slash and the
ZXlocally-chosen service name.
ZXThe service names listed in
ZX.I /etc/services
ZXand the name
ZX``help''
ZXare reserved.
ZXTry to choose unique names for your TCPMUX services by prefixing them with
ZXyour organization's name and suffixing them with a version number.
ZX.PP
ZXThe
ZX.I socket-type
ZXshould be one of
ZX``stream'',
ZX``dgram'',
ZX``raw'',
ZX``rdm'',
ZXor
ZX``seqpacket'',
ZXdepending on whether the socket is a stream, datagram, raw,
ZXreliably delivered message, or sequenced packet socket.
ZXTCPMUX services must use
ZX``stream''.
ZX.sp
ZX\fBNOTE:\fP
ZX``rdm'' and ``seqpacket'' are not supported in 2.11BSD.
ZX.br
ZX.PP
ZXThe
ZX.I protocol
ZXmust be a valid protocol as given in
ZX.IR /etc/protocols .
ZXExamples might be
ZX``tcp''
ZXor
ZX``udp''.
ZXTCPMUX services must use
ZX``tcp''.
ZX.PP
ZXThe
ZX.I wait/nowait
ZXentry specifies whether the server that is invoked by inetd will take over
ZXthe socket associated with the service access point, and thus whether
ZX.B inetd
ZXshould wait for the server to exit before listening for new service
ZXrequests.
ZXDatagram servers must use
ZX``wait'',
ZXas they are always invoked with the original datagram socket bound
ZXto the specified service address.
ZXThese servers must read at least one datagram from the socket
ZXbefore exiting.
ZXIf a datagram server connects
ZXto its peer, freeing the socket so
ZX.B inetd
ZXcan received further messages on the socket, it is said to be
ZXa
ZX``multi-threaded''
ZXserver;
ZXit should read one datagram from the socket and create a new socket
ZXconnected to the peer.
ZXIt should fork, and the parent should then exit
ZXto allow
ZX.B inetd
ZXto check for new service requests to spawn new servers.
ZXDatagram servers which process all incoming datagrams
ZXon a socket and eventually time out are said to be
ZX``single-threaded''.
ZXComsat(8), biff(1) and talkd(8)
ZXare examples of the latter type of
ZXdatagram server.
ZXTftpd(8)
ZXis an example of a multi-threaded datagram server.
ZX.PP
ZXServers using stream sockets generally are multi-threaded and
ZXuse the
ZX``nowait''
ZXentry.
ZXConnection requests for these services are accepted by
ZX.B inetd ,
ZXand the server is given only the newly-accepted socket connected
ZXto a client of the service.
ZXMost stream-based services operate in this manner.
ZXStream-based servers that use
ZX``wait''
ZXare started with the listening service socket, and must accept
ZXat least one connection request before exiting.
ZXSuch a server would normally accept and process incoming connection
ZXrequests until a timeout.
ZXTCPMUX services must use
ZX``nowait''.
ZX.PP
ZXThe
ZX.I user
ZXentry should contain the user name of the user as whom the server
ZXshould run. This allows for servers to be given less permission
ZXthan root.
ZX.PP
ZXThe
ZX.I server-program
ZXentry should contain the pathname of the program which is to be
ZXexecuted by
ZX.B inetd
ZXwhen a request is found on its socket. If
ZX.B inetd
ZXprovides this service internally, this entry should
ZXbe
ZX``internal''.
ZX.PP
ZXThe
ZX.I server program arguments
ZXshould be just as arguments
ZXnormally are, starting with argv[0], which is the name of
ZXthe program. If the service is provided internally, the
ZXword
ZX``internal''
ZXshould take the place of this entry.
ZX.PP
ZXThe
ZX.B inetd
ZXprogram
ZXprovides several
ZX``trivial''
ZXservices internally by use of
ZXroutines within itself. These services are
ZX``echo'',
ZX``discard'',
ZX``chargen''
ZX(character generator),
ZX``daytime''
ZX(human readable time), and
ZX``time''
ZX(machine readable time,
ZXin the form of the number of seconds since midnight, January
ZX1, 1900). All of these services are tcp based. For
ZXdetails of these services, consult the appropriate
ZXRFC
ZXfrom the Network Information Center.
ZX.PP
ZXThe
ZX.B inetd
ZXprogram
ZXrereads its configuration file when it receives a hangup signal,
ZXSIGHUP.
ZXServices may be added, deleted or modified when the configuration file
ZXis reread.
ZX.SH TCPMUX
ZX.PP
ZXRFC 1078
ZXdescribes the TCPMUX protocol:
ZX``A TCP client connects to a foreign host on TCP port 1. It sends the
ZXservice name followed by a carriage-return line-feed <CRLF>. The
ZXservice name is never case sensitive. The server replies with a
ZXsingle character indicating positive (+) or negative (\-)
ZXacknowledgment, immediately followed by an optional message of
ZXexplanation, terminated with a <CRLF>. If the reply was positive,
ZXthe selected protocol begins; otherwise the connection is closed.''
ZXThe program is passed the TCP connection as file descriptors 0 and 1.
ZX.PP
ZXIf the TCPMUX service name begins with a ``+'',
ZX.B inetd
ZXreturns the positive reply for the program.
ZXThis allows you to invoke programs that use stdin/stdout
ZXwithout putting any special server code in them.
ZX.PP
ZXThe special service name
ZX``help''
ZXcauses
ZX.B inetd
ZXto list TCPMUX services in
ZX.IR inetd.conf .
ZX.SH "EXAMPLES"
ZX.PP
ZXHere are several example service entries for the various types of services:
ZX.sp
ZX.nf
ZXftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
ZXntalk dgram udp wait root /usr/libexec/ntalkd ntalkd
ZXtcpmux/+date stream tcp nowait guest /bin/date date
ZXtcpmux/phonebook stream tcp nowait guest /usr/local/phonebook phonebook
ZX.br
ZX.fi
ZX.SH "ERROR MESSAGES"
ZXThe
ZX.B inetd
ZXserver
ZXlogs error messages using
ZXsyslog(3).
ZXImportant error messages and their explanations are:
ZX.sp
ZX\fIservice\fP/\fIprotocol\fP server failing (looping), service terminated.
ZX.br
ZXThe number of requests for the specified service in the past minute
ZXexceeded the limit. The limit exists to prevent a broken program
ZXor a malicious user from swamping the system.
ZXThis message may occur for several reasons:
ZX1) there are lots of hosts requesting the service within a short time period,
ZX2) a 'broken' client program is requesting the service too frequently,
ZX3) a malicious user is running a program to invoke the service in
ZXa 'denial of service' attack, or
ZX4) the invoked service program has an error that causes clients
ZXto retry quickly.
ZXUse the
ZX\fB\-R\fP
ZXoption,
ZXas described above, to change the rate limit.
ZXOnce the limit is reached, the service will be
ZXreenabled automatically in 10 minutes.
ZX.sp
ZX\fIservice\fP/\fIprotocol\fP: No such user '\fIuser\fP', service ignored
ZX.br
ZX\fIservice\fP/\fIprotocol\fP: getpwnam: \fIuser\fP: No such user
ZX.br
ZXNo entry for
ZX.I user
ZXexists in the
ZX.I passwd
ZXfile. The first message
ZXoccurs when
ZX.B inetd
ZX(re)reads the configuration file. The second message occurs when the
ZXservice is invoked.
ZX.sp
ZX\fIservice\fP: can't set uid \fInumber\fP
ZX.br
ZX\fIservice\fP: can't set gid \fInumber\fP
ZX.br
ZXThe user or group ID for the entry's
ZX.I user
ZXis invalid.
ZX.SH SEE ALSO
ZXcomsat(8),
ZXfingerd(8),
ZXftpd(8),
ZXrexecd(8),
ZXrlogind(8),
ZXrshd(8),
ZXtelnetd(8),
ZXtftpd(8)
ZX.SH HISTORY
ZXThe
ZX.B inetd
ZXcommand appeared in
ZX4.3BSD.
ZXTCPMUX is based on code and documentation by Mark Lottor.
ZSHAR_EOF
Zchmod 644 'inetd.8'
Zfi
Zif test -f 'inetd.c'
Zthen
Z echo shar: "will not over-write existing file 'inetd.c'"
Zelse
Zsed 's/^X//' << \SHAR_EOF > 'inetd.c'
ZX/*
ZX * Copyright (c) 1983, 1991, 1993, 1994
ZX * The Regents of the University of California. All rights reserved.
ZX *
ZX * Redistribution and use in source and binary forms, with or without
ZX * modification, are permitted provided that the following conditions
ZX * are met:
ZX * 1. Redistributions of source code must retain the above copyright
ZX * notice, this list of conditions and the following disclaimer.
ZX * 2. Redistributions in binary form must reproduce the above copyright
ZX * notice, this list of conditions and the following disclaimer in the
ZX * documentation and/or other materials provided with the distribution.
ZX * 3. All advertising materials mentioning features or use of this software
ZX * must display the following acknowledgement:
ZX * This product includes software developed by the University of
ZX * California, Berkeley and its contributors.
ZX * 4. Neither the name of the University nor the names of its contributors
ZX * may be used to endorse or promote products derived from this software
ZX * without specific prior written permission.
ZX *
ZX * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ZX * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
ZX * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ZX * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
ZX * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ZX * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
ZX * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
ZX * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
ZX * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
ZX * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
ZX * SUCH DAMAGE.
ZX */
ZX
ZX#if !defined(lint) && defined(DOSCCS)
ZXstatic char copyright[] =
ZX"@(#) Copyright (c) 1983, 1991, 1993, 1994\n\
ZX The Regents of the University of California. All rights reserved.\n";
ZX
ZXstatic char sccsid[] = "@(#)inetd.c 8.4.1 (2.11BSD) 1996/10/30";
ZX#endif /* not lint */
ZX
ZX/*
ZX * Inetd - Internet super-server
ZX *
ZX * This program invokes all internet services as needed. Connection-oriented
ZX * services are invoked each time a connection is made, by creating a process.
ZX * This process is passed the connection as file descriptor 0 and is expected
ZX * to do a getpeername to find out the source host and port.
ZX *
ZX * Datagram oriented services are invoked when a datagram
ZX * arrives; a process is created and passed a pending message
ZX * on file descriptor 0. Datagram servers may either connect
ZX * to their peer, freeing up the original socket for inetd
ZX * to receive further messages on, or ``take over the socket'',
ZX * processing all arriving datagrams and, eventually, timing
ZX * out. The first type of server is said to be ``multi-threaded'';
ZX * the second type of server ``single-threaded''.
ZX *
ZX * Inetd uses a configuration file which is read at startup
ZX * and, possibly, at some later time in response to a hangup signal.
ZX * The configuration file is ``free format'' with fields given in the
ZX * order shown below. Continuation lines for an entry must being with
ZX * a space or tab. All fields must be present in each entry.
ZX *
ZX * service name must be in /etc/services or must
ZX * name a tcpmux service
ZX * socket type stream/dgram/raw/rdm/seqpacket
ZX * protocol must be in /etc/protocols
ZX * wait/nowait single-threaded/multi-threaded
ZX * user user to run daemon as
ZX * server program full path name
ZX * server program arguments maximum of MAXARGS (20)
ZX *
ZX * TCP services without official port numbers are handled with the
ZX * RFC1078-based tcpmux internal service. Tcpmux listens on port 1 for
ZX * requests. When a connection is made from a foreign host, the service
ZX * requested is passed to tcpmux, which looks it up in the servtab list
ZX * and returns the proper entry for the service. Tcpmux returns a
ZX * negative reply if the service doesn't exist, otherwise the invoked
ZX * server is expected to return the positive reply if the service type in
ZX * inetd.conf file has the prefix "tcpmux/". If the service type has the
ZX * prefix "tcpmux/+", tcpmux will return the positive reply for the
ZX * process; this is for compatibility with older server code, and also
ZX * allows you to invoke programs that use stdin/stdout without putting any
ZX * special server code in them. Services that use tcpmux are "nowait"
ZX * because they do not have a well-known port and hence cannot listen
ZX * for new requests.
ZX *
ZX * Comment lines are indicated by a `#' in column 1.
ZX */
ZX#include <sys/param.h>
ZX#include <sys/stat.h>
ZX#include <sys/ioctl.h>
ZX#include <sys/socket.h>
ZX#include <sys/wait.h>
ZX#include <sys/time.h>
ZX#include <sys/resource.h>
ZX
ZX#include <netinet/in.h>
ZX#include <arpa/inet.h>
ZX
ZX#include <errno.h>
ZX#include <fcntl.h>
ZX#include <netdb.h>
ZX#include <pwd.h>
ZX#include <signal.h>
ZX#include <stdio.h>
ZX#include <stdlib.h>
ZX#include <string.h>
ZX#include <syslog.h>
ZX#include <unistd.h>
ZX
ZX#include "pathnames.h"
ZX
ZX#define TOOMANY 40 /* don't start more than TOOMANY */
ZX#define CNT_INTVL 60 /* servers in CNT_INTVL sec. */
ZX#define RETRYTIME (60*10) /* retry after bind or server fail */
ZX
ZX#define SIGBLOCK (sigmask(SIGCHLD)|sigmask(SIGHUP)|sigmask(SIGALRM))
ZX
ZX
ZXint debug = 0;
ZXint nsock, maxsock;
ZXfd_set allsock;
ZXint options;
ZXint timingout;
ZXint toomany = TOOMANY;
ZXstruct servent *sp;
ZX
ZXstruct servtab {
ZX char *se_service; /* name of service */
ZX int se_socktype; /* type of socket to use */
ZX char *se_proto; /* protocol used */
ZX short se_wait; /* single threaded server */
ZX short se_checked; /* looked at during merge */
ZX char *se_user; /* user name to run as */
ZX struct biltin *se_bi; /* if built-in, description */
ZX char *se_server; /* server program */
ZX#define MAXARGV 20
ZX char *se_argv[MAXARGV+1]; /* program arguments */
ZX int se_fd; /* open descriptor */
ZX int se_type; /* type */
ZX struct sockaddr_in se_ctrladdr;/* bound address */
ZX int se_count; /* number started since se_time */
ZX struct timeval se_time; /* start of se_count */
ZX struct servtab *se_next;
ZX} *servtab;
ZX
ZX#define NORM_TYPE 0
ZX#define MUX_TYPE 1
ZX#define MUXPLUS_TYPE 2
ZX#define ISMUX(sep) (((sep)->se_type == MUX_TYPE) || \
ZX ((sep)->se_type == MUXPLUS_TYPE))
ZX#define ISMUXPLUS(sep) ((sep)->se_type == MUXPLUS_TYPE)
ZX
ZX/*
ZX * These four definitions are not present (yet) in 2.11BSD.
ZX * Adding 'register' declarations, using a long 'ltmpint' and declaring a
ZX * couple signal functions 'int' rather than 'void' were the only changes
ZX * necessary to port the program.
ZX*/
ZX#define __P(x) ()
ZX#define memmove(dst,src,len) bcopy(src,dst,len)
ZX#define SEEK_SET 0 /* L_SET */
ZX#define LINE_MAX 1024 /* we don't have this in syslimits.h */
ZX
ZXvoid chargen_dg __P((int, struct servtab *));
ZXvoid chargen_stream __P((int, struct servtab *));
ZXvoid close_sep __P((struct servtab *));
ZXint config __P((int));
ZXvoid daytime_dg __P((int, struct servtab *));
ZXvoid daytime_stream __P((int, struct servtab *));
ZXvoid discard_dg __P((int, struct servtab *));
ZXvoid discard_stream __P((int, struct servtab *));
ZXvoid echo_dg __P((int, struct servtab *));
ZXvoid echo_stream __P((int, struct servtab *));
ZXvoid endconfig __P((void));
ZXstruct servtab *enter __P((struct servtab *));
ZXvoid freeconfig __P((struct servtab *));
ZXstruct servtab *getconfigent __P((void));
ZXvoid machtime_dg __P((int, struct servtab *));
ZXvoid machtime_stream __P((int, struct servtab *));
ZXchar *newstr __P((char *));
ZXchar *nextline __P((FILE *));
ZXvoid print_service __P((char *, struct servtab *));
ZXint reapchild __P((int));
ZXint retry __P((int));
ZXint setconfig __P((void));
ZXvoid setup __P((struct servtab *));
ZXchar *sskip __P((char **));
ZXchar *skip __P((char **));
ZXstruct servtab *tcpmux __P((int));
ZX
ZXstruct biltin {
ZX char *bi_service; /* internally provided service name */
ZX int bi_socktype; /* type of socket supported */
ZX short bi_fork; /* 1 if should fork before call */
ZX short bi_wait; /* 1 if should wait for child */
ZX void (*bi_fn)(); /* function which performs it */
ZX} biltins[] = {
ZX /* Echo received data */
ZX { "echo", SOCK_STREAM, 1, 0, echo_stream },
ZX { "echo", SOCK_DGRAM, 0, 0, echo_dg },
ZX
ZX /* Internet /dev/null */
ZX { "discard", SOCK_STREAM, 1, 0, discard_stream },
ZX { "discard", SOCK_DGRAM, 0, 0, discard_dg },
ZX
ZX /* Return 32 bit time since 1970 */
ZX { "time", SOCK_STREAM, 0, 0, machtime_stream },
ZX { "time", SOCK_DGRAM, 0, 0, machtime_dg },
ZX
ZX /* Return human-readable time */
ZX { "daytime", SOCK_STREAM, 0, 0, daytime_stream },
ZX { "daytime", SOCK_DGRAM, 0, 0, daytime_dg },
ZX
ZX /* Familiar character generator */
ZX { "chargen", SOCK_STREAM, 1, 0, chargen_stream },
ZX { "chargen", SOCK_DGRAM, 0, 0, chargen_dg },
ZX
ZX { "tcpmux", SOCK_STREAM, 1, 0, (void (*)())tcpmux },
ZX
ZX { NULL }
ZX};
ZX
ZX#define NUMINT (sizeof(intab) / sizeof(struct inent))
ZXchar *CONFIG = _PATH_INETDCONF;
ZXchar **Argv;
ZXchar *LastArg;
ZX
ZXint
ZXmain(argc, argv, envp)
ZX int argc;
ZX char *argv[], *envp[];
ZX{
ZX register struct servtab *sep;
ZX register struct passwd *pwd;
ZX struct sigvec sv;
ZX int tmpint, ch, dofork;
ZX long ltmpint;
ZX pid_t pid;
ZX char buf[50];
ZX
ZX Argv = argv;
ZX if (envp == 0 || *envp == 0)
ZX envp = argv;
ZX while (*envp)
ZX envp++;
ZX LastArg = envp[-1] + strlen(envp[-1]);
ZX
ZX openlog("inetd", LOG_PID | LOG_NOWAIT, LOG_DAEMON);
ZX
ZX while ((ch = getopt(argc, argv, "dR:")) != EOF)
ZX switch(ch) {
ZX case 'd':
ZX debug = 1;
ZX options |= SO_DEBUG;
ZX break;
ZX case 'R': { /* invocation rate */
ZX char *p;
ZX
ZX ltmpint = strtol(optarg, &p, 0);
ZX if (ltmpint < 1 || ltmpint > 32767L || *p)
ZX syslog(LOG_ERR,
ZX "-R %s: bad value for service invocation rate",
ZX optarg);
ZX else
ZX toomany = (int)ltmpint;
ZX break;
ZX }
ZX case '?':
ZX default:
ZX syslog(LOG_ERR,
ZX "usage: inetd [-d] [-R rate] [conf-file]");
ZX exit(1);
ZX }
ZX argc -= optind;
ZX argv += optind;
ZX
ZX if (argc > 0)
ZX CONFIG = argv[0];
ZX if (debug == 0) {
ZX daemon(0, 0);
ZX }
ZX memset(&sv, 0, sizeof(sv));
ZX sv.sv_mask = SIGBLOCK;
ZX sv.sv_handler = retry;
ZX sigvec(SIGALRM, &sv, (struct sigvec *)0);
ZX config(SIGHUP);
ZX sv.sv_handler = config;
ZX sigvec(SIGHUP, &sv, (struct sigvec *)0);
ZX sv.sv_handler = reapchild;
ZX sigvec(SIGCHLD, &sv, (struct sigvec *)0);
ZX
ZX {
ZX /* space for daemons to overwrite environment for ps */
ZX#define DUMMYSIZE 100
ZX char dummy[DUMMYSIZE];
ZX
ZX (void)memset(dummy, 'x', sizeof(DUMMYSIZE) - 1);
ZX dummy[DUMMYSIZE - 1] = '\0';
ZX (void)setenv("inetd_dummy", dummy, 1);
ZX }
ZX
ZX for (;;) {
ZX int n, ctrl;
ZX fd_set readable;
ZX
ZX if (nsock == 0) {
ZX (void) sigblock(SIGBLOCK);
ZX while (nsock == 0)
ZX sigpause(0L);
ZX (void) sigsetmask(0L);
ZX }
ZX readable = allsock;
ZX if ((n = select(maxsock + 1, &readable, (fd_set *)0,
ZX (fd_set *)0, (struct timeval *)0)) <= 0) {
ZX if (n < 0 && errno != EINTR)
ZX syslog(LOG_WARNING, "select: %m");
ZX sleep(1);
ZX continue;
ZX }
ZX for (sep = servtab; n && sep; sep = sep->se_next)
ZX if (sep->se_fd != -1 && FD_ISSET(sep->se_fd, &readable)) {
ZX n--;
ZX if (debug)
ZX fprintf(stderr, "someone wants %s\n",
ZX sep->se_service);
ZX if (!sep->se_wait && sep->se_socktype == SOCK_STREAM) {
ZX ctrl = accept(sep->se_fd, (struct sockaddr *)0,
ZX (int *)0);
ZX if (debug)
ZX fprintf(stderr, "accept, ctrl %d\n", ctrl);
ZX if (ctrl < 0) {
ZX if (errno != EINTR)
ZX syslog(LOG_WARNING,
ZX "accept (for %s): %m",
ZX sep->se_service);
ZX continue;
ZX }
ZX /*
ZX * Call tcpmux to find the real service to exec.
ZX */
ZX if (sep->se_bi &&
ZX sep->se_bi->bi_fn == (void (*)()) tcpmux) {
ZX sep = tcpmux(ctrl);
ZX if (sep == NULL) {
ZX close(ctrl);
ZX continue;
ZX }
ZX }
ZX } else
ZX ctrl = sep->se_fd;
ZX (void) sigblock(SIGBLOCK);
ZX pid = 0;
ZX dofork = (sep->se_bi == 0 || sep->se_bi->bi_fork);
ZX if (dofork) {
ZX if (sep->se_count++ == 0)
ZX (void)gettimeofday(&sep->se_time,
ZX (struct timezone *)0);
ZX else if (sep->se_count >= toomany) {
ZX struct timeval now;
ZX
ZX (void)gettimeofday(&now, (struct timezone *)0);
ZX if (now.tv_sec - sep->se_time.tv_sec >
ZX CNT_INTVL) {
ZX sep->se_time = now;
ZX sep->se_count = 1;
ZX } else {
ZX syslog(LOG_ERR,
ZX "%s/%s server failing (looping), service terminated",
ZX sep->se_service, sep->se_proto);
ZX close_sep(sep);
ZX sigsetmask(0L);
ZX if (!timingout) {
ZX timingout = 1;
ZX alarm(RETRYTIME);
ZX }
ZX continue;
ZX }
ZX }
ZX pid = fork();
ZX }
ZX if (pid < 0) {
ZX syslog(LOG_ERR, "fork: %m");
ZX if (!sep->se_wait &&
ZX sep->se_socktype == SOCK_STREAM)
ZX close(ctrl);
ZX sigsetmask(0L);
ZX sleep(1);
ZX continue;
ZX }
ZX if (pid && sep->se_wait) {
ZX sep->se_wait = pid;
ZX if (sep->se_fd >= 0) {
ZX FD_CLR(sep->se_fd, &allsock);
ZX nsock--;
ZX }
ZX }
ZX sigsetmask(0L);
ZX if (pid == 0) {
ZX#ifndef pdp11
ZX if (debug && dofork)
ZX setsid();
ZX#endif
ZX if (dofork) {
ZX if (debug)
ZX fprintf(stderr, "+ Closing from %d\n",
ZX maxsock);
ZX for (tmpint = maxsock; tmpint > 2; tmpint--)
ZX if (tmpint != ctrl)
ZX close(tmpint);
ZX }
ZX if (sep->se_bi)
ZX (*sep->se_bi->bi_fn)(ctrl, sep);
ZX else {
ZX if (debug)
ZX fprintf(stderr, "%d execl %s\n",
ZX getpid(), sep->se_server);
ZX dup2(ctrl, 0);
ZX close(ctrl);
ZX dup2(0, 1);
ZX dup2(0, 2);
ZX if ((pwd = getpwnam(sep->se_user)) == NULL) {
ZX syslog(LOG_ERR,
ZX "%s/%s: %s: No such user",
ZX sep->se_service, sep->se_proto,
ZX sep->se_user);
ZX if (sep->se_socktype != SOCK_STREAM)
ZX recv(0, buf, sizeof (buf), 0);
ZX _exit(1);
ZX }
ZX if (pwd->pw_uid) {
ZX if (setgid(pwd->pw_gid) < 0) {
ZX syslog(LOG_ERR,
ZX "%s: can't set gid %d: %m",
ZX sep->se_service, pwd->pw_gid);
ZX _exit(1);
ZX }
ZX (void) initgroups(pwd->pw_name,
ZX pwd->pw_gid);
ZX if (setuid(pwd->pw_uid) < 0) {
ZX syslog(LOG_ERR,
ZX "%s: can't set uid %d: %m",
ZX sep->se_service, pwd->pw_uid);
ZX _exit(1);
ZX }
ZX }
ZX execv(sep->se_server, sep->se_argv);
ZX if (sep->se_socktype != SOCK_STREAM)
ZX recv(0, buf, sizeof (buf), 0);
ZX syslog(LOG_ERR,
ZX "cannot execute %s: %m", sep->se_server);
ZX _exit(1);
ZX }
ZX }
ZX if (!sep->se_wait && sep->se_socktype == SOCK_STREAM)
ZX close(ctrl);
ZX }
ZX }
ZX}
ZX
ZXint
ZXreapchild(signo)
ZX int signo;
ZX{
ZX int status;
ZX pid_t pid;
ZX register struct servtab *sep;
ZX
ZX for (;;) {
ZX pid = wait3(&status, WNOHANG, (struct rusage *)0);
ZX if (pid <= 0)
ZX break;
ZX if (debug)
ZX fprintf(stderr, "%d reaped, status %#x\n",
ZX pid, status);
ZX for (sep = servtab; sep; sep = sep->se_next)
ZX if (sep->se_wait == pid) {
ZX if (status)
ZX syslog(LOG_WARNING,
ZX "%s: exit status 0x%x",
ZX sep->se_server, status);
ZX if (debug)
ZX fprintf(stderr, "restored %s, fd %d\n",
ZX sep->se_service, sep->se_fd);
ZX FD_SET(sep->se_fd, &allsock);
ZX nsock++;
ZX sep->se_wait = 1;
ZX }
ZX }
ZX}
ZX
ZXint
ZXconfig(signo)
ZX int signo;
ZX{
ZX register struct servtab *sep, *cp;
ZX struct servtab **sepp;
ZX long omask;
ZX
ZX if (!setconfig()) {
ZX syslog(LOG_ERR, "%s: %m", CONFIG);
ZX return;
ZX }
ZX for (sep = servtab; sep; sep = sep->se_next)
ZX sep->se_checked = 0;
ZX while (cp = getconfigent()) {
ZX if (getpwnam(cp->se_user) == NULL) {
ZX syslog(LOG_ERR,
ZX "%s/%s: No such user '%s', service ignored",
ZX cp->se_service, cp->se_proto, cp->se_user);
ZX continue;
ZX }
ZX for (sep = servtab; sep; sep = sep->se_next)
ZX if (strcmp(sep->se_service, cp->se_service) == 0 &&
ZX strcmp(sep->se_proto, cp->se_proto) == 0)
ZX break;
ZX if (sep != 0) {
ZX int i;
ZX
ZX omask = sigblock(SIGBLOCK);
ZX /*
ZX * sep->se_wait may be holding the pid of a daemon
ZX * that we're waiting for. If so, don't overwrite
ZX * it unless the config file explicitly says don't
ZX * wait.
ZX */
ZX if (cp->se_bi == 0 &&
ZX (sep->se_wait == 1 || cp->se_wait == 0))
ZX sep->se_wait = cp->se_wait;
ZX#define SWAP(a, b) { char *c = a; a = b; b = c; }
ZX if (cp->se_user)
ZX SWAP(sep->se_user, cp->se_user);
ZX if (cp->se_server)
ZX SWAP(sep->se_server, cp->se_server);
ZX for (i = 0; i < MAXARGV; i++)
ZX SWAP(sep->se_argv[i], cp->se_argv[i]);
ZX sigsetmask(omask);
ZX freeconfig(cp);
ZX if (debug)
ZX print_service("REDO", sep);
ZX } else {
ZX sep = enter(cp);
ZX if (debug)
ZX print_service("ADD ", sep);
ZX }
ZX sep->se_checked = 1;
ZX if (ISMUX(sep)) {
ZX sep->se_fd = -1;
ZX continue;
ZX }
ZX sp = getservbyname(sep->se_service, sep->se_proto);
ZX if (sp == 0) {
ZX syslog(LOG_ERR, "%s/%s: unknown service",
ZX sep->se_service, sep->se_proto);
ZX sep->se_checked = 0;
ZX continue;
ZX }
ZX if (sp->s_port != sep->se_ctrladdr.sin_port) {
ZX sep->se_ctrladdr.sin_family = AF_INET;
ZX sep->se_ctrladdr.sin_port = sp->s_port;
ZX if (sep->se_fd >= 0)
ZX close_sep(sep);
ZX }
ZX if (sep->se_fd == -1)
ZX setup(sep);
ZX }
ZX endconfig();
ZX /*
ZX * Purge anything not looked at above.
ZX */
ZX omask = sigblock(SIGBLOCK);
ZX sepp = &servtab;
ZX while (sep = *sepp) {
ZX if (sep->se_checked) {
ZX sepp = &sep->se_next;
ZX continue;
ZX }
ZX *sepp = sep->se_next;
ZX if (sep->se_fd >= 0)
ZX close_sep(sep);
ZX if (debug)
ZX print_service("FREE", sep);
ZX freeconfig(sep);
ZX free((char *)sep);
ZX }
ZX (void) sigsetmask(omask);
ZX}
ZX
ZXint
ZXretry(signo)
ZX int signo;
ZX{
ZX register struct servtab *sep;
ZX
ZX timingout = 0;
ZX for (sep = servtab; sep; sep = sep->se_next)
ZX if (sep->se_fd == -1)
ZX setup(sep);
ZX}
ZX
ZXvoid
ZXsetup(sep)
ZX register struct servtab *sep;
ZX{
ZX int on = 1;
ZX
ZX if ((sep->se_fd = socket(AF_INET, sep->se_socktype, 0)) < 0) {
ZX if (debug)
ZX fprintf(stderr, "socket failed on %s/%s: %s\n",
ZX sep->se_service, sep->se_proto,
ZX strerror(errno));
ZX syslog(LOG_ERR, "%s/%s: socket: %m",
ZX sep->se_service, sep->se_proto);
ZX return;
ZX }
ZX#define turnon(fd, opt) \
ZXsetsockopt(fd, SOL_SOCKET, opt, (char *)&on, sizeof (on))
ZX if (strcmp(sep->se_proto, "tcp") == 0 && (options & SO_DEBUG) &&
ZX turnon(sep->se_fd, SO_DEBUG) < 0)
ZX syslog(LOG_ERR, "setsockopt (SO_DEBUG): %m");
ZX if (turnon(sep->se_fd, SO_REUSEADDR) < 0)
ZX syslog(LOG_ERR, "setsockopt (SO_REUSEADDR): %m");
ZX#undef turnon
ZX if (bind(sep->se_fd, (struct sockaddr *)&sep->se_ctrladdr,
ZX sizeof (sep->se_ctrladdr)) < 0) {
ZX if (debug)
ZX fprintf(stderr, "bind failed on %s/%s: %s\n",
ZX sep->se_service, sep->se_proto,
ZX strerror(errno));
ZX syslog(LOG_ERR, "%s/%s: bind: %m",
ZX sep->se_service, sep->se_proto);
ZX (void) close(sep->se_fd);
ZX sep->se_fd = -1;
ZX if (!timingout) {
ZX timingout = 1;
ZX alarm(RETRYTIME);
ZX }
ZX return;
ZX }
ZX if (sep->se_socktype == SOCK_STREAM)
ZX listen(sep->se_fd, 10);
ZX FD_SET(sep->se_fd, &allsock);
ZX nsock++;
ZX if (sep->se_fd > maxsock)
ZX maxsock = sep->se_fd;
ZX if (debug) {
ZX fprintf(stderr, "registered %s on %d\n",
ZX sep->se_server, sep->se_fd);
ZX }
ZX}
ZX
ZX/*
ZX * Finish with a service and its socket.
ZX */
ZXvoid
ZXclose_sep(sep)
ZX register struct servtab *sep;
ZX{
ZX if (sep->se_fd >= 0) {
ZX nsock--;
ZX FD_CLR(sep->se_fd, &allsock);
ZX (void) close(sep->se_fd);
ZX sep->se_fd = -1;
ZX }
ZX sep->se_count = 0;
ZX /*
ZX * Don't keep the pid of this running deamon: when reapchild()
ZX * reaps this pid, it would erroneously increment nsock.
ZX */
ZX if (sep->se_wait > 1)
ZX sep->se_wait = 1;
ZX}
ZX
ZXstruct servtab *
ZXenter(cp)
ZX struct servtab *cp;
ZX{
ZX register struct servtab *sep;
ZX long omask;
ZX
ZX sep = (struct servtab *)malloc(sizeof (*sep));
ZX if (sep == (struct servtab *)0) {
ZX syslog(LOG_ERR, "Out of memory.");
ZX exit(-1);
ZX }
ZX *sep = *cp;
ZX sep->se_fd = -1;
ZX omask = sigblock(SIGBLOCK);
ZX sep->se_next = servtab;
ZX servtab = sep;
ZX sigsetmask(omask);
ZX return (sep);
ZX}
ZX
ZXFILE *fconfig = NULL;
ZXstruct servtab serv;
ZXchar line[LINE_MAX];
ZX
ZXint
ZXsetconfig()
ZX{
ZX
ZX if (fconfig != NULL) {
ZX fseek(fconfig, 0L, SEEK_SET);
ZX return (1);
ZX }
ZX fconfig = fopen(CONFIG, "r");
ZX return (fconfig != NULL);
ZX}
ZX
ZXvoid
ZXendconfig()
ZX{
ZX if (fconfig) {
ZX (void) fclose(fconfig);
ZX fconfig = NULL;
ZX }
ZX}
ZX
ZXstruct servtab *
ZXgetconfigent()
ZX{
ZX register struct servtab *sep = &serv;
ZX int argc;
ZX char *cp, *arg;
ZX static char TCPMUX_TOKEN[] = "tcpmux/";
ZX#define MUX_LEN (sizeof(TCPMUX_TOKEN)-1)
ZX
ZXmore:
ZX while ((cp = nextline(fconfig)) && (*cp == '#' || *cp == '\0'))
ZX ;
ZX if (cp == NULL)
ZX return ((struct servtab *)0);
ZX /*
ZX * clear the static buffer, since some fields (se_ctrladdr,
ZX * for example) don't get initialized here.
ZX */
ZX memset((caddr_t)sep, 0, sizeof *sep);
ZX arg = skip(&cp);
ZX if (cp == NULL) {
ZX /* got an empty line containing just blanks/tabs. */
ZX goto more;
ZX }
ZX if (strncmp(arg, TCPMUX_TOKEN, MUX_LEN) == 0) {
ZX char *c = arg + MUX_LEN;
ZX if (*c == '+') {
ZX sep->se_type = MUXPLUS_TYPE;
ZX c++;
ZX } else
ZX sep->se_type = MUX_TYPE;
ZX sep->se_service = newstr(c);
ZX } else {
ZX sep->se_service = newstr(arg);
ZX sep->se_type = NORM_TYPE;
ZX }
ZX arg = sskip(&cp);
ZX if (strcmp(arg, "stream") == 0)
ZX sep->se_socktype = SOCK_STREAM;
ZX else if (strcmp(arg, "dgram") == 0)
ZX sep->se_socktype = SOCK_DGRAM;
ZX else if (strcmp(arg, "rdm") == 0)
ZX sep->se_socktype = SOCK_RDM;
ZX else if (strcmp(arg, "seqpacket") == 0)
ZX sep->se_socktype = SOCK_SEQPACKET;
ZX else if (strcmp(arg, "raw") == 0)
ZX sep->se_socktype = SOCK_RAW;
ZX else
ZX sep->se_socktype = -1;
ZX sep->se_proto = newstr(sskip(&cp));
ZX arg = sskip(&cp);
ZX sep->se_wait = strcmp(arg, "wait") == 0;
ZX if (ISMUX(sep)) {
ZX /*
ZX * Silently enforce "nowait" for TCPMUX services since
ZX * they don't have an assigned port to listen on.
ZX */
ZX sep->se_wait = 0;
ZX
ZX if (strcmp(sep->se_proto, "tcp")) {
ZX syslog(LOG_ERR,
ZX "%s: bad protocol for tcpmux service %s",
ZX CONFIG, sep->se_service);
ZX goto more;
ZX }
ZX if (sep->se_socktype != SOCK_STREAM) {
ZX syslog(LOG_ERR,
ZX "%s: bad socket type for tcpmux service %s",
ZX CONFIG, sep->se_service);
ZX goto more;
ZX }
ZX }
ZX sep->se_user = newstr(sskip(&cp));
ZX sep->se_server = newstr(sskip(&cp));
ZX if (strcmp(sep->se_server, "internal") == 0) {
ZX struct biltin *bi;
ZX
ZX for (bi = biltins; bi->bi_service; bi++)
ZX if (bi->bi_socktype == sep->se_socktype &&
ZX strcmp(bi->bi_service, sep->se_service) == 0)
ZX break;
ZX if (bi->bi_service == 0) {
ZX syslog(LOG_ERR, "internal service %s unknown",
ZX sep->se_service);
ZX goto more;
ZX }
ZX sep->se_bi = bi;
ZX sep->se_wait = bi->bi_wait;
ZX } else
ZX sep->se_bi = NULL;
ZX argc = 0;
ZX for (arg = skip(&cp); cp; arg = skip(&cp))
ZX if (argc < MAXARGV)
ZX sep->se_argv[argc++] = newstr(arg);
ZX while (argc <= MAXARGV)
ZX sep->se_argv[argc++] = NULL;
ZX return (sep);
ZX}
ZX
ZXvoid
ZXfreeconfig(cp)
ZX register struct servtab *cp;
ZX{
ZX int i;
ZX
ZX if (cp->se_service)
ZX free(cp->se_service);
ZX if (cp->se_proto)
ZX free(cp->se_proto);
ZX if (cp->se_user)
ZX free(cp->se_user);
ZX if (cp->se_server)
ZX free(cp->se_server);
ZX for (i = 0; i < MAXARGV; i++)
ZX if (cp->se_argv[i])
ZX free(cp->se_argv[i]);
ZX}
ZX
ZX
ZX/*
ZX * Safe skip - if skip returns null, log a syntax error in the
ZX * configuration file and exit.
ZX */
ZXchar *
ZXsskip(cpp)
ZX char **cpp;
ZX{
ZX register char *cp;
ZX
ZX cp = skip(cpp);
ZX if (cp == NULL) {
ZX syslog(LOG_ERR, "%s: syntax error", CONFIG);
ZX exit(-1);
ZX }
ZX return (cp);
ZX}
ZX
ZXchar *
ZXskip(cpp)
ZX char **cpp;
ZX{
ZX register char *cp = *cpp;
ZX char *start;
ZX
ZXagain:
ZX while (*cp == ' ' || *cp == '\t')
ZX cp++;
ZX if (*cp == '\0') {
ZX int c;
ZX
ZX c = getc(fconfig);
ZX (void) ungetc(c, fconfig);
ZX if (c == ' ' || c == '\t')
ZX if (cp = nextline(fconfig))
ZX goto again;
ZX *cpp = (char *)0;
ZX return ((char *)0);
ZX }
ZX start = cp;
ZX while (*cp && *cp != ' ' && *cp != '\t')
ZX cp++;
ZX if (*cp != '\0')
ZX *cp++ = '\0';
ZX *cpp = cp;
ZX return (start);
ZX}
ZX
ZXchar *
ZXnextline(fd)
ZX FILE *fd;
ZX{
ZX register char *cp;
ZX
ZX if (fgets(line, sizeof (line), fd) == NULL)
ZX return ((char *)0);
ZX cp = strchr(line, '\n');
ZX if (cp)
ZX *cp = '\0';
ZX return (line);
ZX}
ZX
ZXchar *
ZXnewstr(cp)
ZX register char *cp;
ZX{
ZX if (cp = strdup(cp ? cp : ""))
ZX return (cp);
ZX syslog(LOG_ERR, "strdup: %m");
ZX exit(-1);
ZX /* NOTREACHED */
ZX}
ZX
ZXvoid
ZXsetproctitle(a, s)
ZX char *a;
ZX int s;
ZX{
ZX int size;
ZX register char *cp;
ZX struct sockaddr_in sin;
ZX char buf[80];
ZX
ZX cp = Argv[0];
ZX size = sizeof(sin);
ZX if (getpeername(s, (struct sockaddr *)&sin, &size) == 0)
ZX (void) sprintf(buf, "-%s [%s]", a, inet_ntoa(sin.sin_addr));
ZX else
ZX (void) sprintf(buf, "-%s", a);
ZX strncpy(cp, buf, LastArg - cp);
ZX cp += strlen(cp);
ZX while (cp < LastArg)
ZX *cp++ = ' ';
ZX}
ZX
ZX/*
ZX * Internet services provided internally by inetd:
ZX */
ZX#define BUFSIZE 8192
ZX
ZX/* ARGSUSED */
ZXvoid
ZXecho_stream(s, sep) /* Echo service -- echo data back */
ZX int s;
ZX struct servtab *sep;
ZX{
ZX char buffer[BUFSIZE];
ZX int i;
ZX
ZX setproctitle(sep->se_service, s);
ZX while ((i = read(s, buffer, sizeof(buffer))) > 0 &&
ZX write(s, buffer, i) > 0)
ZX ;
ZX exit(0);
ZX}
ZX
ZX/* ARGSUSED */
ZXvoid
ZXecho_dg(s, sep) /* Echo service -- echo data back */
ZX int s;
ZX struct servtab *sep;
ZX{
ZX char buffer[BUFSIZE];
ZX int i, size;
ZX struct sockaddr sa;
ZX
ZX size = sizeof(sa);
ZX if ((i = recvfrom(s, buffer, sizeof(buffer), 0, &sa, &size)) < 0)
ZX return;
ZX (void) sendto(s, buffer, i, 0, &sa, sizeof(sa));
ZX}
ZX
ZX/* ARGSUSED */
ZXvoid
ZXdiscard_stream(s, sep) /* Discard service -- ignore data */
ZX int s;
ZX struct servtab *sep;
ZX{
ZX int ret;
ZX char buffer[BUFSIZE];
ZX
ZX setproctitle(sep->se_service, s);
ZX while (1) {
ZX while ((ret = read(s, buffer, sizeof(buffer))) > 0)
ZX ;
ZX if (ret == 0 || errno != EINTR)
ZX break;
ZX }
ZX exit(0);
ZX}
ZX
ZX/* ARGSUSED */
ZXvoid
ZXdiscard_dg(s, sep) /* Discard service -- ignore data */
ZX int s;
ZX struct servtab *sep;
ZX{
ZX char buffer[BUFSIZE];
ZX
ZX (void) read(s, buffer, sizeof(buffer));
ZX}
ZX
ZX#include <ctype.h>
ZX#define LINESIZ 72
ZXchar ring[128];
ZXchar *endring;
ZX
ZXvoid
ZXinitring()
ZX{
ZX register int i;
ZX
ZX endring = ring;
ZX
ZX for (i = 0; i <= 128; ++i)
ZX if (isprint(i))
ZX *endring++ = i;
ZX}
ZX
ZX/* ARGSUSED */
ZXvoid
ZXchargen_stream(s, sep) /* Character generator */
ZX int s;
ZX struct servtab *sep;
ZX{
ZX int len;
ZX char *rs, text[LINESIZ+2];
ZX
ZX setproctitle(sep->se_service, s);
ZX
ZX if (!endring) {
ZX initring();
ZX rs = ring;
ZX }
ZX
ZX text[LINESIZ] = '\r';
ZX text[LINESIZ + 1] = '\n';
ZX for (rs = ring;;) {
ZX if ((len = endring - rs) >= LINESIZ)
ZX memmove(text, rs, LINESIZ);
ZX else {
ZX memmove(text, rs, len);
ZX memmove(text + len, ring, LINESIZ - len);
ZX }
ZX if (++rs == endring)
ZX rs = ring;
ZX if (write(s, text, sizeof(text)) != sizeof(text))
ZX break;
ZX }
ZX exit(0);
ZX}
ZX
ZX/* ARGSUSED */
ZXvoid
ZXchargen_dg(s, sep) /* Character generator */
ZX int s;
ZX struct servtab *sep;
ZX{
ZX struct sockaddr sa;
ZX static char *rs;
ZX int len, size;
ZX char text[LINESIZ+2];
ZX
ZX if (endring == 0) {
ZX initring();
ZX rs = ring;
ZX }
ZX
ZX size = sizeof(sa);
ZX if (recvfrom(s, text, sizeof(text), 0, &sa, &size) < 0)
ZX return;
ZX
ZX if ((len = endring - rs) >= LINESIZ)
ZX memmove(text, rs, LINESIZ);
ZX else {
ZX memmove(text, rs, len);
ZX memmove(text + len, ring, LINESIZ - len);
ZX }
ZX if (++rs == endring)
ZX rs = ring;
ZX text[LINESIZ] = '\r';
ZX text[LINESIZ + 1] = '\n';
ZX (void) sendto(s, text, sizeof(text), 0, &sa, sizeof(sa));
ZX}
ZX
ZX/*
ZX * Return a machine readable date and time, in the form of the
ZX * number of seconds since midnight, Jan 1, 1900. Since gettimeofday
ZX * returns the number of seconds since midnight, Jan 1, 1970,
ZX * we must add 2208988800 seconds to this figure to make up for
ZX * some seventy years Bell Labs was asleep.
ZX */
ZX
ZXlong
ZXmachtime()
ZX{
ZX struct timeval tv;
ZX
ZX if (gettimeofday(&tv, (struct timezone *)0) < 0) {
ZX if (debug)
ZX fprintf(stderr, "Unable to get time of day\n");
ZX return (0L);
ZX }
ZX#define OFFSET ((u_long)25567 * 24*60*60)
ZX return (htonl((long)(tv.tv_sec + OFFSET)));
ZX#undef OFFSET
ZX}
ZX
ZX/* ARGSUSED */
ZXvoid
ZXmachtime_stream(s, sep)
ZX int s;
ZX struct servtab *sep;
ZX{
ZX long result;
ZX
ZX result = machtime();
ZX (void) write(s, (char *) &result, sizeof(result));
ZX}
ZX
ZX/* ARGSUSED */
ZXvoid
ZXmachtime_dg(s, sep)
ZX int s;
ZX struct servtab *sep;
ZX{
ZX long result;
ZX struct sockaddr sa;
ZX int size;
ZX
ZX size = sizeof(sa);
ZX if (recvfrom(s, (char *)&result, sizeof(result), 0, &sa, &size) < 0)
ZX return;
ZX result = machtime();
ZX (void) sendto(s, (char *) &result, sizeof(result), 0, &sa, sizeof(sa));
ZX}
ZX
ZX/* ARGSUSED */
ZXvoid
ZXdaytime_stream(s, sep) /* Return human-readable time of day */
ZX int s;
ZX struct servtab *sep;
ZX{
ZX char buffer[256];
ZX time_t clock;
ZX
ZX clock = time((time_t *) 0);
ZX
ZX (void) sprintf(buffer, "%.24s\r\n", ctime(&clock));
ZX (void) write(s, buffer, strlen(buffer));
ZX}
ZX
ZX/* ARGSUSED */
ZXvoid
ZXdaytime_dg(s, sep) /* Return human-readable time of day */
ZX int s;
ZX struct servtab *sep;
ZX{
ZX char buffer[256];
ZX time_t clock;
ZX struct sockaddr sa;
ZX int size;
ZX
ZX clock = time((time_t *) 0);
ZX
ZX size = sizeof(sa);
ZX if (recvfrom(s, buffer, sizeof(buffer), 0, &sa, &size) < 0)
ZX return;
ZX (void) sprintf(buffer, "%.24s\r\n", ctime(&clock));
ZX (void) sendto(s, buffer, strlen(buffer), 0, &sa, sizeof(sa));
ZX}
ZX
ZX/*
ZX * print_service:
ZX * Dump relevant information to stderr
ZX */
ZXvoid
ZXprint_service(action, sep)
ZX char *action;
ZX struct servtab *sep;
ZX{
ZX fprintf(stderr,
ZX "%s: %s proto=%s, wait=%d, user=%s builtin=%x server=%s\n",
ZX action, sep->se_service, sep->se_proto,
ZX sep->se_wait, sep->se_user, (int)sep->se_bi, sep->se_server);
ZX}
ZX
ZX/*
ZX * Based on TCPMUX.C by Mark K. Lottor November 1988
ZX * sri-nic::ps:<mkl>tcpmux.c
ZX */
ZX
ZX
ZXstatic int /* # of characters upto \r,\n or \0 */
ZXgetline(fd, buf, len)
ZX int fd;
ZX register char *buf;
ZX int len;
ZX{
ZX int count = 0;
ZX register int n;
ZX
ZX do {
ZX n = read(fd, buf, len-count);
ZX if (n == 0)
ZX return (count);
ZX if (n < 0)
ZX return (-1);
ZX while (--n >= 0) {
ZX if (*buf == '\r' || *buf == '\n' || *buf == '\0')
ZX return (count);
ZX count++;
ZX buf++;
ZX }
ZX } while (count < len);
ZX return (count);
ZX}
ZX
ZX#define MAX_SERV_LEN (256+2) /* 2 bytes for \r\n */
ZX
ZX#define strwrite(fd, buf) (void) write(fd, buf, sizeof(buf)-1)
ZX
ZXstruct servtab *
ZXtcpmux(s)
ZX int s;
ZX{
ZX register struct servtab *sep;
ZX char service[MAX_SERV_LEN+1];
ZX int len;
ZX
ZX /* Get requested service name */
ZX if ((len = getline(s, service, MAX_SERV_LEN)) < 0) {
ZX strwrite(s, "-Error reading service name\r\n");
ZX return (NULL);
ZX }
ZX service[len] = '\0';
ZX
ZX if (debug)
ZX fprintf(stderr, "tcpmux: someone wants %s\n", service);
ZX
ZX /*
ZX * Help is a required command, and lists available services,
ZX * one per line.
ZX */
ZX if (!strcasecmp(service, "help")) {
ZX for (sep = servtab; sep; sep = sep->se_next) {
ZX if (!ISMUX(sep))
ZX continue;
ZX (void)write(s,sep->se_service,strlen(sep->se_service));
ZX strwrite(s, "\r\n");
ZX }
ZX return (NULL);
ZX }
ZX
ZX /* Try matching a service in inetd.conf with the request */
ZX for (sep = servtab; sep; sep = sep->se_next) {
ZX if (!ISMUX(sep))
ZX continue;
ZX if (!strcasecmp(service, sep->se_service)) {
ZX if (ISMUXPLUS(sep)) {
ZX strwrite(s, "+Go\r\n");
ZX }
ZX return (sep);
ZX }
ZX }
ZX strwrite(s, "-Service not available\r\n");
ZX return (NULL);
ZX}
ZSHAR_EOF
Zchmod 644 'inetd.c'
Zfi
Zif test -f 'pathnames.h'
Zthen
Z echo shar: "will not over-write existing file 'pathnames.h'"
Zelse
Zsed 's/^X//' << \SHAR_EOF > 'pathnames.h'
ZX/*
ZX * Copyright (c) 1989, 1993
ZX * The Regents of the University of California. All rights reserved.
ZX *
ZX * Redistribution and use in source and binary forms, with or without
ZX * modification, are permitted provided that the following conditions
ZX * are met:
ZX * 1. Redistributions of source code must retain the above copyright
ZX * notice, this list of conditions and the following disclaimer.
ZX * 2. Redistributions in binary form must reproduce the above copyright
ZX * notice, this list of conditions and the following disclaimer in the
ZX * documentation and/or other materials provided with the distribution.
ZX * 3. All advertising materials mentioning features or use of this software
ZX * must display the following acknowledgement:
ZX * This product includes software developed by the University of
ZX * California, Berkeley and its contributors.
ZX * 4. Neither the name of the University nor the names of its contributors
ZX * may be used to endorse or promote products derived from this software
ZX * without specific prior written permission.
ZX *
ZX * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ZX * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
ZX * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ZX * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
ZX * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ZX * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
ZX * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
ZX * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
ZX * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
ZX * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
ZX * SUCH DAMAGE.
ZX *
ZX * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
ZX */
ZX
ZX#include <paths.h>
ZX
ZX#define _PATH_INETDCONF "/etc/inetd.conf"
ZSHAR_EOF
Zchmod 644 'pathnames.h'
Zfi
Zchmod 755 .
Zcd ..
Zexit 0
Z# End of shell archive
SHAR_EOF
fi
if test -f '343.patch'
then
echo shar: "will not over-write existing file '343.patch'"
else
sed 's/^Z//' << \SHAR_EOF > '343.patch'
Z*** /etc/rc.old Sun Oct 27 21:53:36 1996
Z--- /etc/rc Wed Nov 13 21:48:50 1996
Z***************
Z*** 143,149 ****
Z if [ "${named-NO}" != NO ]; then
Z /etc/named; echo -n ' named'>/dev/console 2>&1
Z fi
Z! /etc/inetd; echo -n ' inetd' >/dev/console 2>&1
Z
Z # $rwhod is imported from /etc/netstart;
Z # if $rwhod is set to something other than NO, rwhod is run.
Z--- 143,149 ----
Z if [ "${named-NO}" != NO ]; then
Z /etc/named; echo -n ' named'>/dev/console 2>&1
Z fi
Z! /usr/sbin/inetd; echo -n ' inetd'>/dev/console 2>&1
Z
Z # $rwhod is imported from /etc/netstart;
Z # if $rwhod is set to something other than NO, rwhod is run.
Z*** /etc/services.old Mon May 10 21:35:54 1993
Z--- /etc/services Wed Nov 13 21:43:02 1996
Z***************
Z*** 1,7 ****
Z! # @(#)services 1.16 (Berkeley) 86/04/20
Z #
Z # Network services, Internet style
Z #
Z echo 7/tcp
Z echo 7/udp
Z discard 9/tcp sink null
Z--- 1,8 ----
Z! # @(#)services 1.16.1 (2.11BSD) 1996/11/13
Z #
Z # Network services, Internet style
Z #
Z+ tcpmux 1/tcp # TCP port multiplexer (RFC1078)
Z echo 7/tcp
Z echo 7/udp
Z discard 9/tcp sink null
Z*** /etc/inetd.conf.old Fri Nov 1 19:11:45 1996
Z--- /etc/inetd.conf Wed Nov 13 21:45:19 1996
Z***************
Z*** 17,22 ****
Z--- 17,24 ----
Z discard stream tcp nowait root internal
Z #chargen stream tcp nowait root internal
Z #daytime stream tcp nowait root internal
Z+ #tcpmux stream tcp nowait root internal
Z+ #tcpmux/+date stream tcp nowait nobody /bin/date date
Z #time stream tcp nowait root internal
Z echo dgram udp wait root internal
Z #discard dgram udp wait root internal
Z*** /usr/src/sys/pdpdist/inetd.conf.old Fri Nov 1 19:25:03 1996
Z--- /usr/src/sys/pdpdist/inetd.conf Wed Nov 13 21:47:24 1996
Z***************
Z*** 17,22 ****
Z--- 17,24 ----
Z #discard stream tcp nowait root internal
Z #chargen stream tcp nowait root internal
Z #daytime stream tcp nowait root internal
Z+ #tcpmux stream tcp nowait root internal
Z+ #tcpmux/+date stream tcp nowait nobody /bin/date date
Z #time stream tcp nowait root internal
Z echo dgram udp wait root internal
Z #discard dgram udp wait root internal
Z*** /usr/src/sys/pdpdist/services.old Mon Aug 27 14:29:49 1990
Z--- /usr/src/sys/pdpdist/services Wed Nov 13 21:46:45 1996
Z***************
Z*** 1,7 ****
Z! # @(#)services 1.16 (Berkeley) 86/04/20
Z #
Z # Network services, Internet style
Z #
Z echo 7/tcp
Z echo 7/udp
Z discard 9/tcp sink null
Z--- 1,8 ----
Z! # @(#)services 1.16.1 (2.11BSD) 1996/11/13
Z #
Z # Network services, Internet style
Z #
Z+ tcpmux 1/tcp # TCP port multiplexer (RFC1078)
Z echo 7/tcp
Z echo 7/udp
Z discard 9/tcp sink null
Z*** /usr/src/sys/pdpdist/rc.old Wed Oct 23 15:28:48 1996
Z--- /usr/src/sys/pdpdist/rc Wed Nov 13 21:48:20 1996
Z***************
Z*** 1,5 ****
Z HOME=/; export HOME
Z! PATH=/etc:/bin:/usr/ucb:/usr/bin; export PATH
Z
Z # If you have a ram disk configured into your system which is listed in
Z # /etc/fstab, you'll have to do a mkfs on it here and probably change the
Z--- 1,5 ----
Z HOME=/; export HOME
Z! PATH=/etc:/bin:/sbin:/usr/sbin:/usr/ucb:/usr/bin; export PATH
Z
Z # If you have a ram disk configured into your system which is listed in
Z # /etc/fstab, you'll have to do a mkfs on it here and probably change the
Z***************
Z*** 127,133 ****
Z if [ "${named-NO}" != NO ]; then
Z named; echo -n ' named'>/dev/console 2>&1
Z fi
Z! inetd; echo -n ' inetd' >/dev/console 2>&1
Z
Z # $rwhod is imported from /etc/netstart;
Z # if $rwhod is set to something other than NO, rwhod is run.
Z--- 127,133 ----
Z if [ "${named-NO}" != NO ]; then
Z named; echo -n ' named'>/dev/console 2>&1
Z fi
Z! /usr/sbin/inetd; echo -n ' inetd'>/dev/console 2>&1
Z
Z # $rwhod is imported from /etc/netstart;
Z # if $rwhod is set to something other than NO, rwhod is run.
Z*** /usr/src/etc/Makefile.old Sat Oct 26 23:06:23 1996
Z--- /usr/src/etc/Makefile Wed Nov 13 21:49:44 1996
Z***************
Z*** 3,9 ****
Z # All rights reserved. The Berkeley software License Agreement
Z # specifies the terms and conditions for redistribution.
Z #
Z! # @(#)Makefile 5.14.7 (2.11BSD GTE) 1996/10/21
Z #
Z DESTDIR=
Z CFLAGS= -O
Z--- 3,9 ----
Z # All rights reserved. The Berkeley software License Agreement
Z # specifies the terms and conditions for redistribution.
Z #
Z! # @(#)Makefile 5.14.8 (2.11BSD GTE) 1996/11/13
Z #
Z DESTDIR=
Z CFLAGS= -O
Z***************
Z*** 24,30 ****
Z #
Z STD= ac accton arff bad144 badsect catman chown clri comsat \
Z cron dcheck diskpart dumpfs edquota flcopy \
Z! gettable ifconfig icheck inetd init newfs mkfs mknod \
Z mkproto ncheck quotaon reboot renice \
Z repquota rexecd rmt route rwhod rxformat sa savecore \
Z shutdown slattach swapon syslogd telnetd tunefs update
Z--- 24,30 ----
Z #
Z STD= ac accton arff bad144 badsect catman chown clri comsat \
Z cron dcheck diskpart dumpfs edquota flcopy \
Z! gettable ifconfig icheck init newfs mkfs mknod \
Z mkproto ncheck quotaon reboot renice \
Z repquota rexecd rmt route rwhod rxformat sa savecore \
Z shutdown slattach swapon syslogd telnetd tunefs update
Z*** /usr/src/man/man8/Makefile.old Fri May 24 20:36:36 1996
Z--- /usr/src/man/man8/Makefile Wed Nov 13 21:55:11 1996
Z***************
Z*** 14,20 ****
Z # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
Z # WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
Z #
Z! # @(#)Makefile 5.4.4 (2.11BSD) 1996/5/24
Z #
Z MDIR= /usr/man/cat8
Z SRCS= XNSrouted.8 ac.8 adduser.8 arff.8 arp.8 autoconfig.8 bad144.8 \
Z--- 14,20 ----
Z # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
Z # WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
Z #
Z! # @(#)Makefile 5.4.5 (2.11BSD) 1996/11/13
Z #
Z MDIR= /usr/man/cat8
Z SRCS= XNSrouted.8 ac.8 adduser.8 arff.8 arp.8 autoconfig.8 bad144.8 \
Z***************
Z*** 23,29 ****
Z cron.8 dcheck.8 diskpart.8 dmesg.8 drtest.8 dump.8 dumpdir.8 \
Z dumpfs.8 edquota.8 format.8 fsck.8 fstat.8 \
Z gettable.8 getty.8 htable.8 icheck.8 ifconfig.8 implog.8 \
Z! implogd.8 inetd.8 init.8 intro.8 kgmon.8 lpc.8 lpd.8 makedev.8 \
Z makekey.8 mkfs.8 mkhosts.8 mklost+found.8 mknod.8 mkproto.8 \
Z named.8 ncheck.8 newfs.8 pac.8 pstat.8 quot.8 \
Z quotaon.8 rc.8 rdump.8 reboot.8 renice.8 repquota.8 \
Z--- 23,29 ----
Z cron.8 dcheck.8 diskpart.8 dmesg.8 drtest.8 dump.8 dumpdir.8 \
Z dumpfs.8 edquota.8 format.8 fsck.8 fstat.8 \
Z gettable.8 getty.8 htable.8 icheck.8 ifconfig.8 implog.8 \
Z! implogd.8 init.8 intro.8 kgmon.8 lpc.8 lpd.8 makedev.8 \
Z makekey.8 mkfs.8 mkhosts.8 mklost+found.8 mknod.8 mkproto.8 \
Z named.8 ncheck.8 newfs.8 pac.8 pstat.8 quot.8 \
Z quotaon.8 rc.8 rdump.8 reboot.8 renice.8 repquota.8 \
Z***************
Z*** 38,44 ****
Z cron.0 dcheck.0 diskpart.0 dmesg.0 drtest.0 dump.0 dumpdir.0 \
Z dumpfs.0 edquota.0 format.0 fsck.0 fstat.0 \
Z gettable.0 getty.0 htable.0 icheck.0 ifconfig.0 implog.0 \
Z! implogd.0 inetd.0 init.0 intro.0 kgmon.0 lpc.0 lpd.0 makedev.0 \
Z makekey.0 mkfs.0 mkhosts.0 mklost+found.0 mknod.0 mkproto.0 \
Z named.0 ncheck.0 newfs.0 pac.0 pstat.0 quot.0 \
Z quotaon.0 rc.0 rdump.0 reboot.0 renice.0 repquota.0 \
Z--- 38,44 ----
Z cron.0 dcheck.0 diskpart.0 dmesg.0 drtest.0 dump.0 dumpdir.0 \
Z dumpfs.0 edquota.0 format.0 fsck.0 fstat.0 \
Z gettable.0 getty.0 htable.0 icheck.0 ifconfig.0 implog.0 \
Z! implogd.0 init.0 intro.0 kgmon.0 lpc.0 lpd.0 makedev.0 \
Z makekey.0 mkfs.0 mkhosts.0 mklost+found.0 mknod.0 mkproto.0 \
Z named.0 ncheck.0 newfs.0 pac.0 pstat.0 quot.0 \
Z quotaon.0 rc.0 rdump.0 reboot.0 renice.0 repquota.0 \
Z*** /usr/src/usr.sbin/Makefile.old Thu Oct 24 21:25:01 1996
Z--- /usr/src/usr.sbin/Makefile Wed Nov 13 21:41:05 1996
Z***************
Z*** 1,13 ****
Z #
Z # Public domain - 1996/10/24 - sms
Z #
Z! # @(#)Makefile 1.0 (2.11BSD) 1996/10/24
Z #
Z DESTDIR=
Z CFLAGS= -O
Z SEPFLAG= -i
Z
Z! SUBDIR= lpr makewhatis sendmail
Z
Z all: ${SUBDIR}
Z
Z--- 1,13 ----
Z #
Z # Public domain - 1996/10/24 - sms
Z #
Z! # @(#)Makefile 1.1 (2.11BSD) 1996/11/13
Z #
Z DESTDIR=
Z CFLAGS= -O
Z SEPFLAG= -i
Z
Z! SUBDIR= inetd lpr makewhatis sendmail
Z
Z all: ${SUBDIR}
Z
Z*** /usr/src/new/nntp/doc/config.sh.old Thu Oct 15 21:24:00 1987
Z--- /usr/src/new/nntp/doc/config.sh Thu Nov 14 20:01:03 1996
Z***************
Z*** 10,17 ****
Z # ------------- SITE DEPENDENT STUFF ---------------------------
Z # (modify these lines to suit your system)
Z #
Z! # the location of inetd on your system (usually /etc/inetd)
Z! MINETD=/etc/inetd
Z # the location of the inetd configuration file (usually /etc/inetd.conf)
Z MINETDCONFIG=/etc/inetd.conf
Z # the location of nntpd following installation (usually /etc/nntpd)
Z--- 10,17 ----
Z # ------------- SITE DEPENDENT STUFF ---------------------------
Z # (modify these lines to suit your system)
Z #
Z! # the location of inetd on your system (usually /usr/sbin/inetd)
Z! MINETD=/usr/sbin/inetd
Z # the location of the inetd configuration file (usually /etc/inetd.conf)
Z MINETDCONFIG=/etc/inetd.conf
Z # the location of nntpd following installation (usually /etc/nntpd)
Z*** /usr/src/usr.bin/uucp/uucp.h.old Thu Oct 24 11:17:02 1996
Z--- /usr/src/usr.bin/uucp/uucp.h Thu Nov 14 20:07:04 1996
Z***************
Z*** 140,151 ****
Z /*#define BSD2_9 /**/
Z
Z /*
Z! * If you are using /etc/inetd with 4.2bsd, define BSDINETD
Z */
Z /* #define BSDINETD /**/
Z
Z /*
Z! * If you are running 4.3bsd or BRL 4.2, you are running the inetd
Z */
Z
Z #if (defined(BSD4_3) || defined(BRL4_2)) && !defined(BSDINETD)
Z--- 140,151 ----
Z /*#define BSD2_9 /**/
Z
Z /*
Z! * If you are using 'inetd' with 4.2bsd, define BSDINETD
Z */
Z /* #define BSDINETD /**/
Z
Z /*
Z! * If you are running 4.3bsd, 2.11bsd or BRL 4.2, you are running 'inetd'
Z */
Z
Z #if (defined(BSD4_3) || defined(BRL4_2)) && !defined(BSDINETD)
Z*** /usr/src/usr.sbin/sendmail.MX/adm/TODO.old Wed Mar 13 18:07:14 1985
Z--- /usr/src/usr.sbin/sendmail.MX/adm/TODO Thu Nov 14 20:08:48 1996
Z***************
Z*** 42,48 ****
Z cleanqueue -- return expired messages; basic consistency
Z checking.
Z smtpserver -- process smtp connections, pass to queueup -- this
Z! can probably become a simple service a la /etc/inetd.
Z addrtest -- essentially "-bt" mode.
Z verifyaddr -- verify an address list -- "-bv" mode -- needs a
Z "noisy" and a "silent" mode (exit status only). This
Z--- 42,48 ----
Z cleanqueue -- return expired messages; basic consistency
Z checking.
Z smtpserver -- process smtp connections, pass to queueup -- this
Z! can probably become a simple service a la 'inetd'.
Z addrtest -- essentially "-bt" mode.
Z verifyaddr -- verify an address list -- "-bv" mode -- needs a
Z "noisy" and a "silent" mode (exit status only). This
Z*** /usr/src/usr.sbin/sendmail/adm/TODO.old Wed Feb 18 01:11:05 1987
Z--- /usr/src/usr.sbin/sendmail/adm/TODO Thu Nov 14 20:09:43 1996
Z***************
Z*** 42,48 ****
Z cleanqueue -- return expired messages; basic consistency
Z checking.
Z smtpserver -- process smtp connections, pass to queueup -- this
Z! can probably become a simple service a la /etc/inetd.
Z addrtest -- essentially "-bt" mode.
Z verifyaddr -- verify an address list -- "-bv" mode -- needs a
Z "noisy" and a "silent" mode (exit status only). This
Z--- 42,48 ----
Z cleanqueue -- return expired messages; basic consistency
Z checking.
Z smtpserver -- process smtp connections, pass to queueup -- this
Z! can probably become a simple service a la 'inetd'.
Z addrtest -- essentially "-bt" mode.
Z verifyaddr -- verify an address list -- "-bv" mode -- needs a
Z "noisy" and a "silent" mode (exit status only). This
Z*** /usr/doc/2.10/setup.2.11/5.t.old Thu Oct 24 21:40:43 1996
Z--- /usr/doc/2.10/setup.2.11/5.t Thu Nov 14 19:54:04 1996
Z***************
Z*** 2,8 ****
Z .\" All rights reserved. The Berkeley software License Agreement
Z .\" specifies the terms and conditions for redistribution.
Z .\"
Z! .\" @(#)5.t 2.3 (2.11BSD GTE) 1996/10/24
Z .\"
Z .ds lq ``
Z .ds rq ''
Z--- 2,8 ----
Z .\" All rights reserved. The Berkeley software License Agreement
Z .\" specifies the terms and conditions for redistribution.
Z .\"
Z! .\" @(#)5.t 2.4 (2.11BSD GTE) 1996/11/14
Z .\"
Z .ds lq ``
Z .ds rq ''
Z***************
Z*** 352,358 ****
Z .PP
Z In \*(2B most of the server programs are started up by a
Z ``super server'', the Internet daemon. The Internet
Z! daemon, \fI/etc/inetd\fP, acts as a master server for
Z programs specified in its configuration file, \fI/etc/inetd.conf\fP,
Z listening for service requests for these servers, and starting
Z up the appropriate program whenever a request is received.
Z--- 352,358 ----
Z .PP
Z In \*(2B most of the server programs are started up by a
Z ``super server'', the Internet daemon. The Internet
Z! daemon, \fI/usr/sbin/inetd\fP, acts as a master server for
Z programs specified in its configuration file, \fI/etc/inetd.conf\fP,
Z listening for service requests for these servers, and starting
Z up the appropriate program whenever a request is received.
Z*** /usr/doc/smm/01.setup/5.t.old Thu Oct 24 22:05:50 1996
Z--- /usr/doc/smm/01.setup/5.t Thu Nov 14 19:57:00 1996
Z***************
Z*** 2,8 ****
Z .\" All rights reserved. The Berkeley software License Agreement
Z .\" specifies the terms and conditions for redistribution.
Z .\"
Z! .\" @(#)5.t 6.1.1 (2.11BSD) 1996/10/24
Z .\"
Z .ds lq ``
Z .ds rq ''
Z--- 2,8 ----
Z .\" All rights reserved. The Berkeley software License Agreement
Z .\" specifies the terms and conditions for redistribution.
Z .\"
Z! .\" @(#)5.t 6.1.2 (2.11BSD) 1996/11/14
Z .\"
Z .ds lq ``
Z .ds rq ''
Z***************
Z*** 327,333 ****
Z .PP
Z In \*(4B most of the server programs are started up by a
Z ``super server'', the Internet daemon. The Internet
Z! daemon, \fI/etc/inetd\fP, acts as a master server for
Z programs specified in its configuration file, \fI/etc/inetd.conf\fP,
Z listening for service requests for these servers, and starting
Z up the appropriate program whenever a request is received.
Z--- 327,333 ----
Z .PP
Z In \*(4B most of the server programs are started up by a
Z ``super server'', the Internet daemon. The Internet
Z! daemon, \fI/usr/sbin/inetd\fP, acts as a master server for
Z programs specified in its configuration file, \fI/etc/inetd.conf\fP,
Z listening for service requests for these servers, and starting
Z up the appropriate program whenever a request is received.
Z*** /VERSION.old Sun Nov 3 17:00:54 1996
Z--- /VERSION Wed Nov 13 21:38:20 1996
Z***************
Z*** 1,4 ****
Z! Current Patch Level: 342
Z
Z 2.11 BSD
Z ============
Z--- 1,4 ----
Z! Current Patch Level: 343
Z
Z 2.11 BSD
Z ============
SHAR_EOF
fi
exit 0
# End of shell archive