[alt.sources] Enhanced SYSV Getty, v1.1, part 4 of 4

paul@devon.lns.pa.us (Paul Sutcliffe Jr.) (01/17/90)

#! /bin/sh

# Make a new directory for the getty sources, cd to it, and run kits 1
# thru 4 through sh.  When all 4 kits have been run, read README.

echo "This is getty 1.1 kit 4 (of 4).  If kit 4 is complete, the line"
echo '"'"End of kit 4 (of 4)"'" will echo at the end.'
echo ""
export PATH || (echo "You didn't use sh, you clunch." ; kill $$)
mkdir man 2>/dev/null
echo Extracting Makefile.SH
sed >Makefile.SH <<'!STUFFY!FUNK!' -e 's/X//'
X:
X# $Id: Makefile.SH,v 1.1 90/01/16 16:12:10 paul Exp Locker: paul $
X#
X# Creates Makefile for getty distribution
X#
X# $Log:	Makefile.SH,v $
X# Revision 1.1  90/01/16  16:12:10  paul
X# Initial revision
X# 
X# 
X
Xcase $CONFIG in
X'')
X    if test ! -f config.sh; then
X	ln ../config.sh . || \
X	ln ../../config.sh . || \
X	ln ../../../config.sh . || \
X	(echo "Can't find config.sh."; exit 1)
X    fi
X    . config.sh
X    ;;
Xesac
Xcase "$0" in
X*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
Xesac
X
X: add necessary modules based on config.sh
Xcase "$d_getutent" in
X"$define")
X    src=""
X    obj=""
X    ;;
X"$undef")
X    src="getutent.c"
X    obj="getutent.o"
X    ;;
Xesac
Xcase "$d_strdup" in
X"$undef")
X    src="$src strdup.c"
X    obj="$obj strdup.o"
X    ;;
Xesac
Xcase "$d_putenv" in
X"$undef")
X    src="$src putenv.c"
X    obj="$obj putenv.o"
X    ;;
Xesac
X
Xecho "Extracting Makefile (with variable substitutions)"
X$spitshell >Makefile <<!GROK!THIS!
X#
X# Makefile for getty distribution
X#
X# To recreate this file, make any changes in config.sh and then
X# say "sh Makefile.SH"
X#
X
XSHELL=	/bin/sh
X
X# compiler stuff -- check these
XCC=	$cc
XCFLAGS=	-O $ccflags $small
XLFLAGS=	$ldflags $split
XLINT=	lint -abchuvx
XLLIB=	$llib_termlib
X
X# where things go
XBIN=	$bin
XUUBIN=	$bin
X
X# what libraries are needed for termcap/terminfo routines?
XTLIB=	$termlib
X
X# what are we making
XSH=	Makefile.SH config.h.SH makedep.SH
XHDRS=	config.h defaults.h extern.h funcs.h getty.h patchlevel.h \\
X	table.h tune.h
XSRC=	main.c funcs.c defaults.c table.c $src
XOBJ=	main.o funcs.o defaults.o table.o $obj
XUUSRC=	umain.c funcs.c defaults.c table.c $src
XUUOBJ=	umain.o funcs.o defaults.o table.o $obj
X
X# rules
X
Xall:	getty uugetty manpages
X
Xclist:
X	@echo $(SRC) $(UUSRC) | $tr ' ' '\012' | $sort | $uniq > .clist
X
Xhlist:
X	@echo $(HDRS) | $tr ' ' '\012' > .hlist
X
Xshlist:
X	@echo $(SH) | $tr ' ' '\012' > .shlist
X!GROK!THIS!
X$spitshell >>Makefile <<'!NO!SUBS!'
X
Xgetty:	$(OBJ)
X	$(CC) $(LFLAGS) -o $@ $(OBJ) $(TLIB) 
X
Xuugetty: $(UUOBJ)
X	$(CC) $(LFLAGS) -o $@ $(UUOBJ) $(TLIB) 
X
Xmanpages:
X	cd man; make
X
Xinstall: getty uugetty
X	-mv $(BIN)/getty $(BIN)/getty-
X	-mv $(UUBIN)/uugetty $(UUBIN)/uugetty-
X	cp getty $(BIN)
X	cp uugetty $(UUBIN)
X	chmod 700 $(BIN)/getty $(UUBIN)/uugetty
X	strip $(BIN)/getty $(UUBIN)/uugetty
X	cd man; make install
X
Xlint:	$(SRC) umain.c
X	@echo "linting getty sources..."
X	echo "GETTY" >lint.out
X	$(LINT) $(SRC) $(LLIB) >>lint.out
X	@echo "linting uugetty sources..."
X	@echo '' >>lint.out
X	echo 'UUGETTY' >>lint.out
X	$(LINT) -DUUGETTY $(UUSRC) $(LLIB) >>lint.out
X	@echo "lint output is in lint.out"
X
Xclean:
X	rm -f umain.c *.o core *.out .*list Makefile.old
X	cd man; make clean
X
Xclobber: clean
X	rm -f getty uugetty
X	cd man; make clobber
X
Xrealclean: clobber
X
Xdepend:	makedep umain.c tune.h
X	chmod +x makedep
X	./makedep
X
X# special dependancies follow
X
Xumain.c: main.c
X	-ln main.c umain.c
X
Xumain.o:
X	$(CC) $(CFLAGS) -DUUGETTY -c umain.c
X
Xtune.h:	tune.H
X	@echo "Making a tune.h from the tune.H prototype file."
X	@echo "You may wish to edit tune.h before continuing."
X	-cp tune.H tune.h
X
X# AUTOMATICALLY GENERATED MAKE DEPENDENCIES--PUT NOTHING BELOW THIS LINE
X!NO!SUBS!
Xchmod 644 Makefile
X$eunicefix Makefile
!STUFFY!FUNK!
echo Extracting man/getutent.m4
sed >man/getutent.m4 <<'!STUFFY!FUNK!' -e 's/X//'
X.\" +----------
X.\" |	$Id: getutent.m4,v 1.1 90/01/16 16:02:41 paul Exp Locker: paul $
X.\" |
X.\" |	GETUTENT man page.
X.\" |
X.\" |	Copyright 1989,1990 by Paul Sutcliffe Jr.
X.\" |
X.\" |	Permission is hereby granted to copy, reproduce, redistribute,
X.\" |	or otherwise use this software as long as: there is no monetary
X.\" |	profit gained specifically from the use or reproduction or this
X.\" |	software, it is not sold, rented, traded or otherwise marketed,
X.\" |	and this copyright notice is included prominently in any copy
X.\" |	made.
X.\" |
X.\" |	The author make no claims as to the fitness or correctness of
X.\" |	this software for any use whatsoever, and it is provided as is. 
X.\" |	Any use of this software is at the user's own risk.
X.\" |
X.\"
X.\" +----------
X.\" |	$Log:	getutent.m4,v $
X.\" |	Revision 1.1  90/01/16  16:02:41  paul
X.\" |	Initial revision
X.\" |	
X.\" |	
X.\" 
X.\" +----------
X.\" | M4 configuration
X.\"
Xinclude(config.m4).\"
X.\"
X.\" +----------
X.\" | Manpage source follows:
X.\"
X.TH GETUTENT _library_section_
X.SH NAME
Xgetutent, getutline, setutent, endutent,
Xutmpname \- access utmp file entry
X.SH SYNOPSIS
X.B \#include <utmp.h>
X
X.B struct utmp *getutent();
X
X.B struct utmp *getutline(\fIline\fB)\fR;
X.br
X.B struct utmp *\fIline\fR;
X
X.B void setutent();
X
X.B void endutent();
X
X.B void utmpname(\fIfile\fB)\fR;
X.br
X.B char *\fIfile\fR;
X.SH DESCRIPTION
X.I Getutent
Xand
X.I getutline
Xeach return a pointer to a structure of the following type:
X.nf
X
X    struct utmp {
X	    char	ut_line[8];		/* tty name */
X	    char	ut_name[8];		/* user id */
X	    long	ut_time;			/* time on */
X    };
X
X.fi
X.I Getutent
Xreads in the next entry from a \fIutmp\fR\-like file.  If the file is
Xnot already open, it opens it.  If it reaches the end of file, it
Xfails.
X.PP
X.I Getutline
Xsearches forward from the current point in the
X.I utmp
Xfile until it finds an entry which has a
X.I ut_line
Xstring matching the
X.I line\->ut_line
Xstring.  If the end of file is reached without a match, it fails.
X.PP
X.I Setutent
Xresets the input stream to the beginning of the file.  This should be
Xdone before each search for a new entry if it is desired that the
Xentire file be examined.
X.PP
X.I Endutent
Xcloses the currently open file.
X.PP
X.I Utmpname
Xallows the user to change the name of the file examined, from
X.B _utmp_
Xto any other file.  It is most often expected that this other file
Xwill be
X.B _wtmp_\fR.
XIf the file does not exist, this will not be apparent until the first
Xattempt to reference the file is made.
X.I Utmpname
Xdoes not open the file.  It just closes the old file if it is
Xcurrently open and saves the new file name.
X.SH FILES
X_utmp_
X.br
X_wtmp_
X.SH BUGS
XThe most current entry is saved in a static structure.  Multiple
Xaccesses require that it be copied before further accesses are made.
X.PP
XThese routines use buffered standard I/O for input.
X.SH "SEE ALSO"
Xutmp(_file_section_)
X.SH AUTHOR
X.nf
XPaul Sutcliffe, Jr.  <paul@devon.lns.pa.us>
XUUCP: ...!rutgers!devon!paul
!STUFFY!FUNK!
echo Extracting man/makeconfig
sed >man/makeconfig <<'!STUFFY!FUNK!' -e 's/X//'
X:
X#
X# $Id: makeconfig,v 1.1 90/01/16 16:03:33 paul Exp Locker: paul $
X#
X# $Log:	makeconfig,v $
X# Revision 1.1  90/01/16  16:03:33  paul
X# Initial revision
X# 
X#
X
Xcase $CONFIG in
X'')
X    if test ! -f config.sh; then
X	ln ../config.sh . || \
X	ln ../../config.sh . || \
X	ln ../../../config.sh . || \
X	(echo "Can't find config.sh."; exit 1)
X    fi
X    . config.sh
X    ;;
Xesac
Xcase "$0" in
X*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
Xesac
X
Xtmp=/tmp/mc$$
Xrmlist="$tmp"
Xtrap 'echo " "; $rm -f $rmlist; exit 1' 1 2 3
X
X: where is the source
Xsrc=..
Xtune=$src/tune.h
Xpatchlevel=$src/patchlevel.h
X
X: is package complete
Xif $test ! -f $tune; then
X    echo "Can't find tune.h."
X    exit 1
Xfi
X
X: things we can tell from tune.h
Xcppout=".cppout"
Xtuneout=".tune"
Xrmlist="$cppout $tuneout $rmlist"
X$cppstdin -I$src -I. $cppminus <<EOS >$cppout
X#include <$tune>
X#include <$patchlevel>
Xconsole=CONSOLE
Xdefaults=DEFAULTS
Xissue=ISSUE
Xlogin=LOGIN
X#ifdef	LOGUTMP
Xlogutmp="$define"
X#endif
X#ifdef	TRS16
Xtrs16="$define"
X#endif
X#ifdef	TRYMAIL
Xtrymail="$define"
Xnotify=NOTIFY
X#endif
X#ifdef	WARNCASE
Xwarncase="$define"
X#endif
Xrelease=RELEASE
Xdate=DATE
XEOS
X$sed 's/[ 	]//' <$cppout >$tuneout
Xchmod +x $tuneout
X. $tuneout
X
Xdefaults=`$echo $defaults | $sed 's;/\%s;;'`
X
X: things we cannot tell from tune.h
Xif $test ! -d /usr/lib/terminfo; then
X	termcap="$define"
Xfi
Xgtab=`basename $gettytab`
X
X: name the man pages
Xcase "$xenix" in
X"$define")
X    cmd=C; mcmd=M; system=S; library=S; file=F; misc=M
X    ;;
X"$undef")
X    cmd=1; mcmd=1m; system=2; library=3; file=4; misc=7
X    ;;
Xesac
X
X$cat <<EOC >config.m4
X.\" +----------
X.\" | local GETTY configurations
X.\"
X.\" define(\`_cmd_section_', $cmd)
X.\" define(\`_mcmd_section_', $mcmd)
X.\" define(\`_system_section_', $system)
X.\" define(\`_library_section_', $library)
X.\" define(\`_file_section_', $file)
X.\" define(\`_misc_section_', $misc)
X.\" define(\`_console_', $console)
X.\" define(\`_defaults_', $defaults)
X.\" define(\`_gettytab_', $gettytab)
X.\" define(\`_gtab_', $gtab)
X.\" define(\`_issue_', $issue)
X.\" define(\`_login_', $login)
X.\" define(\`_utmp_', $utmp)
X.\" define(\`_wtmp_', $wtmp)
X.\" define(\`RELEASE', $release)
X.\" define(\`DATE', $date)
X.\"
XEOC
X
Xcase "$logutmp" in
X"$define") $cat <<EOC >>config.m4
X.\" define(\`logutmp')
XEOC
X;;
Xesac
Xcase "$termcap" in
X"$define") $cat <<EOC >>config.m4
X.\" define(\`termcap')
XEOC
X;;
Xesac
Xcase "$trs16" in
X"$define") $cat <<EOC >>config.m4
X.\" define(\`trs16')
XEOC
X;;
Xesac
Xcase "$trymail" in
X"$define") $cat <<EOC >>config.m4
X.\" define(\`trymail')
X.\" define(\`_notify_', $notify)
XEOC
X;;
Xesac
Xcase "$ttytype" in
X"/*") $cat <<EOC >>config.m4
X.\" define(\`ttytype', $ttytype)
XEOC
X;;
Xesac
Xcase "$warncase" in
X"$define") $cat <<EOC >>config.m4
X.\" define(\`warncase')
XEOC
X;;
Xesac
X
X$rm -f $rmlist
X# grrr, don't ask
X$rm -f $cppout
X$rm -f $tuneout
!STUFFY!FUNK!
echo Extracting man/putenv.m4
sed >man/putenv.m4 <<'!STUFFY!FUNK!' -e 's/X//'
X.\" +----------
X.\" |	$Id: putenv.m4,v 1.1 90/01/16 16:03:53 paul Exp Locker: paul $
X.\" |
X.\" |	PUTENV man page.
X.\" |
X.\" |	Copyright 1989,1990 by Paul Sutcliffe Jr.
X.\" |
X.\" |	Permission is hereby granted to copy, reproduce, redistribute,
X.\" |	or otherwise use this software as long as: there is no monetary
X.\" |	profit gained specifically from the use or reproduction or this
X.\" |	software, it is not sold, rented, traded or otherwise marketed,
X.\" |	and this copyright notice is included prominently in any copy
X.\" |	made.
X.\" |
X.\" |	The author make no claims as to the fitness or correctness of
X.\" |	this software for any use whatsoever, and it is provided as is. 
X.\" |	Any use of this software is at the user's own risk.
X.\" |
X.\"
X.\" +----------
X.\" |	$Log:	putenv.m4,v $
X.\" |	Revision 1.1  90/01/16  16:03:53  paul
X.\" |	Initial revision
X.\" |	
X.\" |	
X.\" 
X.\" +----------
X.\" | M4 configuration
X.\"
Xinclude(config.m4).\"
X.\"
X.\" +----------
X.\" | Manpage source follows:
X.\"
X.TH PUTENV _library_section_
X.SH NAME
Xputenv \- change or add value to environment
X.SH SYNOPSIS
X.B int putenv(\fIstring\fB)\fR;
X.br
X.B char *\fIstring\fR;
X.SH DESCRIPTION
X.I String
Xpoints to a string of the form
X.I name=value.
X.I Putenv
Xmakes the value of the environment variable
X.I name
Xequal to
X.I value
Xby altering an existing variable or creating a new one.  In either
Xcase, the string pointed to by
X.I string
Xbecomes part of the environment, so altering the string changes
Xthe environment.  The space used by
X.I string
Xis no longer used once a new string\-defining
X.I name
Xis passed to
X.I putenv.
X.SH "RETURN VALUE"
X.I Putenv
Xreturns non\-zero if it was unable to obtain enough space via
X.I malloc
Xfor an expanded environment, otherwise zero.
X.SH "SEE ALSO"
Xexec(_system_section_),
Xgetenv(_library_section_),
Xmalloc(_library_section_),
Xenviron(_file_section_)
X.SH WARNINGS
X.I Putenv
Xmanipulates the environment pointed to by
X.I environ,
Xand can be used in conjunction with
X.I getenv.
XHowever,
X.I envp
X(the third argument to
X.I main\fR)
Xis not changed.
X.PP
XThis routine uses
X.I malloc(_library_section_)
Xto enlarge the environment.
X.PP
XAfter
X.I putenv
Xis called, environmental variables are not in alphabetical order.
X.PP
XA potential error is to call
X.I putenv
Xwith an automatic variable as the argument, then exit the calling
Xfunction while
X.I string
Xis still part of the environment.
X.SH AUTHOR
X.nf
XPaul Sutcliffe, Jr.  <paul@devon.lns.pa.us>
XUUCP: ...!rutgers!devon!paul
!STUFFY!FUNK!
echo Extracting getty.h
sed >getty.h <<'!STUFFY!FUNK!' -e 's/X//'
X/*
X**	$Id: getty.h,v 1.1 90/01/16 16:15:30 paul Exp Locker: paul $
X**
X**	Included by all getty modules
X*/
X
X/*
X**	Copyright 1989,1990 by Paul Sutcliffe Jr.
X**
X**	Permission is hereby granted to copy, reproduce, redistribute,
X**	or otherwise use this software as long as: there is no monetary
X**	profit gained specifically from the use or reproduction or this
X**	software, it is not sold, rented, traded or otherwise marketed,
X**	and this copyright notice is included prominently in any copy
X**	made.
X**
X**	The author make no claims as to the fitness or correctness of
X**	this software for any use whatsoever, and it is provided as is. 
X**	Any use of this software is at the user's own risk.
X*/
X
X/*
X**	$Log:	getty.h,v $
X**	Revision 1.1  90/01/16  16:15:30  paul
X**	Initial revision
X**	
X*/
X
X
X#include <stdio.h>
X#include <string.h>
X#include <sys/types.h>
X#include <termio.h>
X#ifndef	TCGETA
X#include <sys/ioctl.h>
X#endif	/* TCGETA */
X#include <utmp.h>
X
X#include "config.h"
X#include "extern.h"
X#include "funcs.h"
X
X
X/*	General purpose defines
X */
X
X#ifndef	FALSE
X#define	FALSE	(0)
X#endif	/* FALSE */
X#ifndef	TRUE
X#define	TRUE	(1)
X#endif	/* TRUE */
X
X#define OK	(0)
X
X#define SUCCESS	(0)		/* normal return */
X#define FAIL	(-1)		/* error return */
X
X#define	STDIN	fileno(stdin)
X#define	STDOUT	fileno(stdout)
X
X#define strequal(s1, s2)	(strcmp(s1, s2) == 0)
X#define strnequal(s1, s2, n)	(strncmp(s1, s2, n) == 0)
X#define	strncopy(s1, s2)	(strncpy(s1, s2, sizeof(s1)))
X
Xtypedef	struct termio	TERMIO;
X
X
X#ifdef	DEBUG
X
X/* debug levels
X */
X#define	D_OPT	0001		/* option settings */
X#define	D_DEF	0002		/* defaults file processing */
X#define	D_UTMP	0004		/* utmp/wtmp processing */
X#define	D_INIT	0010		/* line initialization (INIT) */
X#define	D_GTAB	0020		/* gettytab file processing */
X#define	D_GETL	0040		/* get login name routine */
X#define	D_RUN	0100		/* other runtime diagnostics */
X
X#ifdef	UUGETTY
X#define	D_LOCK	0200		/* uugetty lockfile processing */
X#endif	/* UUGETTY */
X
X/* debug defs
X */
X#define	debug1(a,b)		dprint(a,b)
X#define	debug2(a,b)		debug(a,b)
X#define	debug3(a,b,c)		debug(a,b,c)
X#define	debug4(a,b,c,d)		debug(a,b,c,d)
X#define	debug5(a,b,c,d,e)	debug(a,b,c,d,e)
X#define	debug6(a,b,c,d,e,f)	debug(a,b,c,d,e,f)
X
X#else	/* DEBUG */
X
X#define	debug1(a,b)		/* define to nothing, disables debugging */
X#define	debug2(a,b)
X#define	debug3(a,b,c)
X#define	debug4(a,b,c,d)
X#define	debug5(a,b,c,d,e)
X#define	debug6(a,b,c,d,e,f)
X
X#endif	/* DEBUG */
X
X
X/* end of getty.h */
!STUFFY!FUNK!
echo Extracting extern.h
sed >extern.h <<'!STUFFY!FUNK!' -e 's/X//'
X/*
X**	$Id: extern.h,v 1.1 90/01/16 16:14:05 paul Exp Locker: paul $
X**
X**	Defines all external values.
X*/
X
X/*
X**	Copyright 1989,1990 by Paul Sutcliffe Jr.
X**
X**	Permission is hereby granted to copy, reproduce, redistribute,
X**	or otherwise use this software as long as: there is no monetary
X**	profit gained specifically from the use or reproduction or this
X**	software, it is not sold, rented, traded or otherwise marketed,
X**	and this copyright notice is included prominently in any copy
X**	made.
X**
X**	The author make no claims as to the fitness or correctness of
X**	this software for any use whatsoever, and it is provided as is. 
X**	Any use of this software is at the user's own risk.
X*/
X
X/*
X**	$Log:	extern.h,v $
X**	Revision 1.1  90/01/16  16:14:05  paul
X**	Initial revision
X**	
X*/
X
X
X#ifdef	MAIN			/* define as "extern", except for MAIN,	*/
X#define EXTERN			/* which is defined only in main.c	*/
X#else
X#define EXTERN	extern
X#endif	/* MAIN */
X
X
X/*	Global variables
X */
X
X#ifdef	MAIN
XEXTERN	STDCHAR	MsgBuf[80];	/* message buffer */
X#else
XEXTERN	STDCHAR	MsgBuf[];
X#endif	/* MAIN */
X
XEXTERN	boolean	Check;		/* check a gettytab file? */
XEXTERN	char	*CheckFile;	/* gettytab-like file to check */
XEXTERN	char	*Device;	/* controlling line (minus "/dev/") */
XEXTERN	char	*GtabId;	/* current gettytab id */
XEXTERN	boolean	NoHangUp;	/* don't hangup line before setting speed */
XEXTERN	char	*LineD;		/* line discipline */
XEXTERN	char	*MyName;	/* this program name */
XEXTERN	int	Nusers;		/* number of users currently logged in */
XEXTERN	char	*Speed;		/* current baud rate (string literal) */
XEXTERN	char	*SysName;	/* nodename of system */
XEXTERN	int	TimeOut;	/* timeout value from command line */
XEXTERN	char	*Version;	/* value of VERSION */
X
X#ifdef	WARNCASE
XEXTERN	boolean	WarnCase;	/* controls display of bad case message */
X#endif	/* WARNCASE */
X
X#ifdef	DEBUG
XEXTERN	int	Debug;		/* debug value from command line */
XEXTERN	FILE	*Dfp;		/* debug output file pointer */
X#endif	/* DEBUG */
X
X
X/*	System routines
X */
X
Xextern	int	fputc();
Xextern	char	*malloc(), *ttyname();
Xextern	unsigned alarm(), sleep();
Xextern	time_t	time();
X
X#ifndef	STRDUP			/* Is There In Truth No Strdup() ? */
Xextern	char	*strdup();
X#endif	/* STRDUP */
X
X#ifndef	GETUTENT		/* How about getutent() ? */
Xextern	struct utmp	*getutent();
Xextern	void		setutent(), endutent();
X#endif	/* GETUTENT */
X
X#ifndef	PUTENV			/* putenv() ? */
Xextern	int	putenv();
X#endif	/* PUTENV */
X
X
X/* end of extern.h */
!STUFFY!FUNK!
echo Extracting sample.files
sed >sample.files <<'!STUFFY!FUNK!' -e 's/X//'
XThese examples are from the author's system.
X
XSample `/etc/issue' file:
X+---------
X| Devon Computer Services, Lancaster, PA  (@S)
X| Tandy XENIX/68000 Version @V
X+---------
X
XSample `/etc/default/getty' file:
X+---------
X| ISSUE=/etc/issue
X| VERSION=/etc/version
X+---------
X
XSample `/etc/default/uugetty' file:
X+---------
X| CLEAR=NO
X| ISSUE=Devon Computer Services - Tandy 6000  (@S)\n[@L, @B bps]\n
X| INIT=A\pA\pA\pAT\r OK\r\n-ATZ\r-OK\r\n ATZ\r OK\r\n
X| WAITCHAR=YES
X| DELAY=15
X| TIMEOUT=60
X+---------
X
XSample `/etc/gettydefs' file:
X+---------
X| #
X| # Sample /etc/gettydefs file; use at your own risk!
X| #
X| # default entry:
X| 0# B9600 CS8 # B9600 CLOCAL TAB3 ECHO SANE #login: #0
X| 
X| # to toggle between 300 and 1200 baud on a modem line:
X| #
X| 1# B300 ISTRIP CS8 CR1 # B300 HUPCL CS8 TAB3 SANE CR1 #login: #2
X| 
X| 2# B1200 ISTRIP CS8 # B1200 HUPCL CS8 TAB3 SANE #login: #1
X| 
X| # to toggle between 300, 1200 and 2400 baud on a modem line:
X| #
X| 3# B300 ISTRIP CS8 CR1 # B300 HUPCL CS8 TAB3 SANE CR1 #login: #4
X| 
X| 4# B1200 ISTRIP CS8 # B1200 HUPCL CS8 TAB3 SANE #login: #5
X| 
X| 5# B2400 ISTRIP CS8 # B2400 HUPCL CS8 TAB3 SANE #login: #3
X| 
X| # a telebit tb plus:
X| #
X| 6# B9600 ISTRIP CS8 # B9600 HUPCL CS8 TAB3 SANE #FAST login: #7
X| 
X| 7# B2400 ISTRIP CS8 # B2400 HUPCL CS8 TAB3 SANE #login: #8
X| 
X| 8# B1200 ISTRIP CS8 # B1200 HUPCL CS8 TAB3 SANE #login: #6
X| 
X| # various hard-wired speeds
X| a# B50 ISTRIP CS8 NL1 CR3 TAB2 # B50 CS8 CLOCAL SANE NL1 CR3 TAB2 #login: #a
X| 
X| b# B75 ISTRIP CS8 NL1 CR2 TAB2 # B75 CS8 CLOCAL SANE NL1 CR2 TAB2 #login: #b
X| 
X| c# B110 ISTRIP CS8 NL1 CR1 TAB1 # B110 CS8 CLOCAL SANE NL1 CR1 TAB1 #login: #c
X| 
X| d# B134 ISTRIP CS8 NL1 CR1 TAB1 # B134 CS8 CLOCAL SANE NL1 CR1 TAB1 #login: #d
X| 
X| e# B150 ISTRIP CS8 NL1 CR1 # B150 CS8 CLOCAL TAB3 SANE NL1 CR1 #login: #e
X| 
X| f# B200 ISTRIP CS8 NL1 CR1 # B200 CS8 CLOCAL TAB3 SANE NL1 CR1 #login: #f
X| 
X| g# B300 ISTRIP CS8 CR1 # B300 CS8 CLOCAL TAB3 SANE CR1 #login: #g
X| 
X| h# B600 ISTRIP CS8 # B600 CS8 CLOCAL TAB3 SANE #login: #h
X| 
X| i# B1200 ISTRIP CS8 # B1200 CS8 CLOCAL TAB3 SANE #login: #i
X| 
X| j# B1800 ISTRIP CS8 # B1800 CS8 CLOCAL TAB3 SANE #login: #j
X| 
X| k# B2400 ISTRIP CS8 # B2400 CS8 CLOCAL TAB3 SANE #login: #k
X| 
X| l# B4800 ISTRIP CS8 # B4800 CS8 CLOCAL TAB3 SANE #login: #l
X| 
X| m# B9600 ISTRIP CS8 # B9600 CS8 CLOCAL TAB3 SANE #login: #m
X| 
X+---------
!STUFFY!FUNK!
echo Extracting tune.H
sed >tune.H <<'!STUFFY!FUNK!' -e 's/X//'
X/*
X**	$Id: tune.H,v 1.1 90/01/16 16:20:41 paul Exp Locker: paul $
X**
X**	Getty tuneable parameters.
X*/
X
X/*
X**	Copyright 1989,1990 by Paul Sutcliffe Jr.
X**
X**	Permission is hereby granted to copy, reproduce, redistribute,
X**	or otherwise use this software as long as: there is no monetary
X**	profit gained specifically from the use or reproduction or this
X**	software, it is not sold, rented, traded or otherwise marketed,
X**	and this copyright notice is included prominently in any copy
X**	made.
X**
X**	The author make no claims as to the fitness or correctness of
X**	this software for any use whatsoever, and it is provided as is. 
X**	Any use of this software is at the user's own risk.
X*/
X
X/*
X**	$Log:	tune.H,v $
X**	Revision 1.1  90/01/16  16:20:41  paul
X**	Initial revision
X**	
X*/
X
X
X#define	boolean	 int			/* does your cc know about boolean? */
X
X#define	DEF_CFL	 (CS7 | PARENB)		/* default word-len/parity */
X
X
X/*  Feature selection
X */
X
X#undef	DEBUG				/* include debugging code */
X#define	LOGUTMP				/* need to update utmp/wtmp files */
X#define	MY_CANON			/* use my own ERASE and KILL chars */
X#define	RCSID				/* include RCS ID info in objects */
X#define	SETTERM				/* need to set TERM in environment */
X#define	TRYMAIL				/* mail errors if CONSOLE unavailable */
X#define	WARNCASE			/* warn user if login is UPPER case */
X
X/*  define your ERASE and KILL characters here
X */
X#ifdef	MY_CANON
X#define	MY_ERASE '\010'			/* 010 = ^H, backspace */
X#define	MY_KILL	 '\025'			/* 025 = ^U, nak */
X#endif
X
X/*  who should be notified of errors?
X */
X#ifdef	TRYMAIL
X#define	NOTIFY	 "root"
X#endif
X
X
X/*  Where to find things
X */
X
X#define	CONSOLE	 "/dev/console"		/* place to log errors */
X#define	DEFAULTS "/etc/default/%s"	/* name of defaults file */
X#define	ISSUE	 "/etc/issue"		/* name of the issue file;
X					   say "#undef ISSUE" to turn off
X					   the issue feature */
X#define	LOGIN	 "/bin/login"		/* name of login program */
X
X
X/*  Special cases
X */
X
X#undef	TRS16				/* you are a Tandy 6000 or equivilent */
X
X
X/*  You probably shouldn't fool with these
X */
X
X#define	MAXDEF	 100			/* max # lines in defaults file */
X#define	MAXLINE	 256			/* max # chars in a line */
X#define	MAXID	 12			/* max # chars in Gtab Id */
X#define	MAXLOGIN 80			/* max # chars in Gtab Login */
X
X
X/* end of tune.h */
!STUFFY!FUNK!
echo Extracting getutent.c
sed >getutent.c <<'!STUFFY!FUNK!' -e 's/X//'
X/*
X**	$Id: getutent.c,v 1.1 90/01/16 16:15:51 paul Exp Locker: paul $
X**
X**	Implements getutent(3).
X*/
X
X/*
X**	Copyright 1989,1990 by Paul Sutcliffe Jr.
X**
X**	Permission is hereby granted to copy, reproduce, redistribute,
X**	or otherwise use this software as long as: there is no monetary
X**	profit gained specifically from the use or reproduction or this
X**	software, it is not sold, rented, traded or otherwise marketed,
X**	and this copyright notice is included prominently in any copy
X**	made.
X**
X**	The author make no claims as to the fitness or correctness of
X**	this software for any use whatsoever, and it is provided as is. 
X**	Any use of this software is at the user's own risk.
X*/
X
X/*
X**	$Log:	getutent.c,v $
X**	Revision 1.1  90/01/16  16:15:51  paul
X**	Initial revision
X**	
X*/
X
X
X#include "getty.h"
X
X#if defined(RCSID) && !defined(lint)
Xstatic char *RcsId =
X"@(#)$Id: getutent.c,v 1.1 90/01/16 16:15:51 paul Exp Locker: paul $";
X#endif
X
Xtypedef	struct utmp	UTMP;
X
Xstatic	char	*utmpfil = UTMP_FILE;	/* default utmp file */
Xstatic	FILE	*ufp = (FILE *) NULL;	/* file pointer to utmp file */
X					/* NULL = no utmp file open  */
Xstatic	UTMP	ut;			/* buffer for utmp record */
X
X
X/*
X**	getutent() - get next valid utmp entry
X**
X**	Returns (UTMP*)NULL if no vaild entry found.
X*/
X
XUTMP *
Xgetutent()
X{
X	if (ufp == (FILE *) NULL)
X		if ((ufp = fopen(utmpfil, "r+")) == (FILE *) NULL)
X			return((UTMP *) NULL);
X
X	do {
X		if (fread((char *)&ut, sizeof(ut), 1, ufp) != 1)
X			return((UTMP *) NULL);
X
X	} while (ut.ut_name[0] == '\0');	/* valid entry? */
X
X	return(&ut);
X}
X
X
X/*
X**	getutline() - get utmp entry that matches line.
X**
X**	Returns (UTMP*)NULL if no match found.
X*/
X
XUTMP *
Xgetutline(line)
XReg1 UTMP *line;
X{
X	do {
X		if (strequal(ut.ut_line, line->ut_line))
X			return(&ut);	/* match! */
X
X	} while (getutent() != NULL);
X
X	return((UTMP *) NULL);
X}
X
X
X/*
X**	setutent() - rewind utmp back to beginning
X*/
X
Xvoid
Xsetutent()
X{
X	if (ufp != (FILE *) NULL)
X		rewind(ufp);
X}
X	
X
X/*
X**	endutent() - close utmp file
X*/
X
Xvoid
Xendutent()
X{
X	if (ufp != (FILE *) NULL) {
X		(void) fclose(ufp);
X		ufp = (FILE *) NULL;
X	}
X}
X
X
X/*
X**	utmpname() - change utmp file name to "file"
X*/
X
Xvoid
Xutmpname(file)
XReg1 char *file;
X{
X	endutent();
X	utmpfil = strdup(file);
X}
X
X
X/* end of getutent.c */
!STUFFY!FUNK!
echo Extracting man/Makefile.SH
sed >man/Makefile.SH <<'!STUFFY!FUNK!' -e 's/X//'
X:
X# $Id: Makefile.SH,v 1.1 90/01/16 16:01:02 paul Exp Locker: paul $
X#
X# Creates man/Makefile for getty distribution
X#
X# $Log:	Makefile.SH,v $
X# Revision 1.1  90/01/16  16:01:02  paul
X# Initial revision
X# 
X# 
X
Xcase $CONFIG in
X'')
X    if test ! -f config.sh; then
X	ln ../config.sh . || \
X	ln ../../config.sh . || \
X	ln ../../../config.sh . || \
X	(echo "Can't find config.sh."; exit 1)
X    fi
X    . config.sh
X    ;;
Xesac
Xcase "$0" in
X*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
Xesac
X
Xgtab=`basename $gettytab`
Xman="getty.man $gtab.man issue.man"
Xcase "$d_getutent" in
X"$undef")
X    man="$man getutent.man"
X    ;;
Xesac
Xcase "$d_strdup" in
X"$undef")
X    man="$man strdup.man"
X    ;;
Xesac
Xcase "$d_putenv" in
X"$undef")
X    man="$man putenv.man"
X    ;;
Xesac
X
Xecho "Extracting man/Makefile (with variable substitutions)"
X$spitshell >Makefile <<!GROK!THIS!
X#
X# Makefile for getty man pages
X#
X
XSHELL=	/bin/sh
XROFF=	nroff -man
X
XSRC=	..
XTUNE=	$(SRC)/tune.h
XPATLVL=	$(SRC)/patchlevel.h
X
X# what to make
Xall:	$man
X
Xinstall:
X	@echo "Installation must be done manually, Sorry."
X
X# how to make it
X.SUFFIXES: .m4 .3 .man
X
X.m4.3:
X	m4 \$*.m4 > \$*.3
X
X.3.man:
X	$(ROFF) \$*.3 > \$*.man
X
X# dependencies
Xconfig.m4:	$(SRC)/config.sh $(TUNE) $(PATLVL)
X	chmod +x makeconfig
X	./makeconfig
X
Xgetty.1m:	getty.m4 config.m4
X	m4 getty.m4 > getty.1m
X
Xgetty.man:	getty.1m
X	$(ROFF) getty.1m > getty.man
X
X$gtab.4:	gettytab.m4 config.m4
X	m4 gettytab.m4 > $gtab.4
X
X$gtab.man:	$gtab.4
X	$(ROFF) $gtab.4 > $gtab.man
X
Xissue.4:	issue.m4 config.m4
X	m4 issue.m4 > issue.4
X
Xissue.man:	issue.4
X	$(ROFF) issue.4 > issue.man
X
Xgetutent.3:	getutent.m4 config.m4
X
Xgetutent.man:	getutent.3
X
Xstrdup.3:	strdup.m4 config.m4
X
Xstrdup.man:	strdup.3
X
Xputenv.3:	putenv.m4 config.m4
X
Xputenv.man:	putenv.3
X
Xclean:
X	rm -f *.out config.m4 config.sh core
X
Xclobber: clean
X	rm -f *.1m *.[34] *.man
X
X!GROK!THIS!
Xchmod 644 Makefile
X$eunicefix Makefile
!STUFFY!FUNK!
echo Extracting man/issue.m4
sed >man/issue.m4 <<'!STUFFY!FUNK!' -e 's/X//'
X.\" +----------
X.\" |	$Id: issue.m4,v 1.1 90/01/16 16:03:09 paul Exp Locker: paul $
X.\" |
X.\" |	ISSUE man page.
X.\" |
X.\" |	Copyright 1989,1990 by Paul Sutcliffe Jr.
X.\" |
X.\" |	Permission is hereby granted to copy, reproduce, redistribute,
X.\" |	or otherwise use this software as long as: there is no monetary
X.\" |	profit gained specifically from the use or reproduction or this
X.\" |	software, it is not sold, rented, traded or otherwise marketed,
X.\" |	and this copyright notice is included prominently in any copy
X.\" |	made.
X.\" |
X.\" |	The author make no claims as to the fitness or correctness of
X.\" |	this software for any use whatsoever, and it is provided as is. 
X.\" |	Any use of this software is at the user's own risk.
X.\" |
X.\"
X.\" +----------
X.\" |	$Log:	issue.m4,v $
X.\" |	Revision 1.1  90/01/16  16:03:09  paul
X.\" |	Initial revision
X.\" |	
X.\" |	
X.\" 
X.\" +----------
X.\" | M4 configuration
X.\"
Xinclude(config.m4).\"
X.\"
X.\" +----------
X.\" | Manpage source follows:
X.\"
X.TH ISSUE _file_section_
X.SH NAME
Xissue \- issue identification file
X.SH DESCRIPTION
XThe file
X.B _issue_
Xcontains the
X.I issue
Xor project identification to be printed as a login prompt.  This
Xis an ASCII file which is read by the program
X.I getty
Xand then written to the terminal just prior to printing the
X.I login:
Xprompt.
X.PP
XThe line(s) may contain various
X.B @\fIchar\fR
Xand
X.B \\\\\fIchar\fR
Xparameters.  These are described in full in the
X.I getty(_mcmd_section_)
Xsection PROMPT SUBSTITUTIONS.
X.SH FILES
X_issue_
X.SH "SEE ALSO"
Xgetty(_mcmd_section_)
!STUFFY!FUNK!
echo Extracting table.h
sed >table.h <<'!STUFFY!FUNK!' -e 's/X//'
X/*
X**	$Id: table.h,v 1.1 90/01/16 16:19:26 paul Exp Locker: paul $
X**
X**	Defines the structures and functions used to parse the
X**	gettytab file.
X*/
X
X/*
X**	Copyright 1989,1990 by Paul Sutcliffe Jr.
X**
X**	Permission is hereby granted to copy, reproduce, redistribute,
X**	or otherwise use this software as long as: there is no monetary
X**	profit gained specifically from the use or reproduction or this
X**	software, it is not sold, rented, traded or otherwise marketed,
X**	and this copyright notice is included prominently in any copy
X**	made.
X**
X**	The author make no claims as to the fitness or correctness of
X**	this software for any use whatsoever, and it is provided as is. 
X**	Any use of this software is at the user's own risk.
X*/
X
X/*
X**	$Log:	table.h,v $
X**	Revision 1.1  90/01/16  16:19:26  paul
X**	Initial revision
X**	
X*/
X
X
X#ifndef	LDISC0
X#define	LDISC0	0			/* default line discipline */
X#endif	/* LDISC0 */
X
X#ifndef	GETTYTAB
X#define	GETTYTAB  "/etc/gettydefs"	/* default name of the gettytab file */
X#endif	/* GETTYTAB */
X
Xtypedef	struct Gettytab {
X	char	*cur_id;		/* current label */
X	TERMIO	itermio;		/* initial termio flags */
X	TERMIO	ftermio;		/* final termio flags */
X	char	*login;			/* login prompt */
X	char	*next_id;		/* next label */
X} GTAB;
X
Xtypedef	struct SymTab {
X	char	*symbol;		/* symbolic name */
X	ushort	value;			/* actual value */
X} SYMTAB;
X
XGTAB	*gtabvalue();
X
X
X/* end of table.h */
!STUFFY!FUNK!
echo Extracting strdup.c
sed >strdup.c <<'!STUFFY!FUNK!' -e 's/X//'
X/*
X**	$Id: strdup.c,v 1.1 90/01/16 16:18:37 paul Exp Locker: paul $
X**
X**	Implements strdup(3c) [strdup(S) for you Xenix-types].
X*/
X
X/*
X**	Copyright 1989,1990 by Paul Sutcliffe Jr.
X**
X**	Permission is hereby granted to copy, reproduce, redistribute,
X**	or otherwise use this software as long as: there is no monetary
X**	profit gained specifically from the use or reproduction or this
X**	software, it is not sold, rented, traded or otherwise marketed,
X**	and this copyright notice is included prominently in any copy
X**	made.
X**
X**	The author make no claims as to the fitness or correctness of
X**	this software for any use whatsoever, and it is provided as is. 
X**	Any use of this software is at the user's own risk.
X*/
X
X/*
X**	$Log:	strdup.c,v $
X**	Revision 1.1  90/01/16  16:18:37  paul
X**	Initial revision
X**	
X*/
X
X
X#include "getty.h"
X
X#if defined(RCSID) && !defined(lint)
Xstatic char *RcsId =
X"@(#)$Id: strdup.c,v 1.1 90/01/16 16:18:37 paul Exp Locker: paul $";
X#endif
X
X/*
X**	strdup() - duplicates string s in memory.
X**
X**	Returns a pointer to the new string, or NULL if an error occurrs.
X*/
X
Xchar *
Xstrdup(s)
XReg1 char *s;
X{
X	Reg2 char *p = (char *) NULL;
X
X	if (s != (char *) NULL)
X		if ((p = malloc((unsigned) (strlen(s)+1))) != (char *) NULL)
X			(void) strcpy(p, s);
X
X	return(p);
X}
X
X
X/* end of strdup.c */
!STUFFY!FUNK!
echo Extracting MANIFEST
sed >MANIFEST <<'!STUFFY!FUNK!' -e 's/X//'
XAfter all the getty kits are run you should have the following files:
X
XFilename		Kit Description
X--------		--- -----------
XConfigure                2 Determines system configuration.
XMANIFEST                 4 Packing list.
XMakefile.SH              4 Creates Makefile file.
XREADME                   1 The Instructions.
Xconfig.h.SH              3 Creates config.h file.
Xdefaults.c               3 Routines to access the runtime defaults file.
Xdefaults.h               4 Defines the defaults file structures.
Xextern.h                 4 Defines all external values.
Xfuncs.c                  1 Miscellaneous routines.
Xfuncs.h                  4 Definitions for miscellaneous routines.
Xgetty.h                  4 Common header for all modules.
Xgetutent.c               4 Implements getutent(3).
Xmain.c                   1 Main body of program.
Xmakedep.SH               2 Creates makedep file.
Xman/Makefile.SH          4 Creates man/Makefile file.
Xman/README               1 Notes about the manual pages.
Xman/getty.m4             3 M4 source to getty manpage.
Xman/gettytab.m4          3 M4 source to gettytab manpage.
Xman/getutent.m4          4 M4 source to getutent manpage.
Xman/issue.m4             4 M4 source to issue manpage.
Xman/makeconfig           4 Creates config.m4 file.
Xman/putenv.m4            4 M4 source to putenv manpage.
Xman/strdup.m4            1 M4 source to strdup manpage.
Xpatchlevel.h             2 Getty release/patchlevel.
Xputenv.c                 3 Implements putenv(3c).
Xsample.files             4 Sample ancillary files.
Xstrdup.c                 4 Implements strdup(3c).
Xtable.c                  3 Routines to process the gettytab file.
Xtable.h                  4 Defines the gettytab structures.
Xtune.H                   4 Sample tune.h file.
!STUFFY!FUNK!
echo Extracting defaults.h
sed >defaults.h <<'!STUFFY!FUNK!' -e 's/X//'
X/*
X**	$Id: defaults.h,v 1.1 90/01/16 16:13:44 paul Exp Locker: paul $
X**
X**	Defines the structures and functions used to read runtime
X**	defaults.
X*/
X
X/*
X**	Copyright 1989,1990 by Paul Sutcliffe Jr.
X**
X**	Permission is hereby granted to copy, reproduce, redistribute,
X**	or otherwise use this software as long as: there is no monetary
X**	profit gained specifically from the use or reproduction or this
X**	software, it is not sold, rented, traded or otherwise marketed,
X**	and this copyright notice is included prominently in any copy
X**	made.
X**
X**	The author make no claims as to the fitness or correctness of
X**	this software for any use whatsoever, and it is provided as is. 
X**	Any use of this software is at the user's own risk.
X*/
X
X/*
X**	$Log:	defaults.h,v $
X**	Revision 1.1  90/01/16  16:13:44  paul
X**	Initial revision
X**	
X*/
X
X
X/* lines in defaults file are in the form "NAME=value"
X */
X
Xtypedef struct Default {
X	char	*name;		/* name of the default */
X	char	*value;		/* value of the default */
X} DEF;
X
X
XDEF	**defbuild();		/* user-level routines */
Xchar	*defvalue();
X
XFILE	*defopen();		/* low-level routines */
XDEF	*defread();
Xint	defclose();
X
X
X/* end of defaults.h */
!STUFFY!FUNK!
echo Extracting funcs.h
sed >funcs.h <<'!STUFFY!FUNK!' -e 's/X//'
X/*
X**	$Id: funcs.h,v 1.1 90/01/16 16:14:53 paul Exp Locker: paul $
X**
X**	Defines the miscellaneous functions.
X*/
X
X/*
X**	Copyright 1989,1990 by Paul Sutcliffe Jr.
X**
X**	Permission is hereby granted to copy, reproduce, redistribute,
X**	or otherwise use this software as long as: there is no monetary
X**	profit gained specifically from the use or reproduction or this
X**	software, it is not sold, rented, traded or otherwise marketed,
X**	and this copyright notice is included prominently in any copy
X**	made.
X**
X**	The author make no claims as to the fitness or correctness of
X**	this software for any use whatsoever, and it is provided as is. 
X**	Any use of this software is at the user's own risk.
X*/
X
X/*
X**	$Log:	funcs.h,v $
X**	Revision 1.1  90/01/16  16:14:53  paul
X**	Initial revision
X**	
X*/
X
X
X/*	States for settermio()
X */
X#define	INITIAL	 0
X#define	FINAL	 1
X
X/*	Return values for getlogname()
X */
X#define	BADSPEED 1
X#define	BADCASE	 2
X#define	NONAME	 3
X
X
Xint	Fputs(), initialize(), getlogname();
Xchar	*getuname();
Xvoid	settermio(), logerr();
X
X#ifdef	DEBUG
Xvoid	debug(), dprint();
X#endif	/* DEBUG */
X
X
X/* end of funcs.h */
!STUFFY!FUNK!
echo ""
echo "End of kit 4 (of 4)"
cat /dev/null >kit4isdone
run=''
config=''
for iskit in 1 2 3 4; do
    if test -f kit${iskit}isdone; then
	run="$run $iskit"
    else
	todo="$todo $iskit"
    fi
done
case $todo in
    '')
	echo "You have run all your kits.  Please read README and then type Configure."
	chmod 755 Configure
	;;
    *)  echo "You have run$run."
	echo "You still need to run$todo."
	;;
esac
: Someone might mail this, so...
exit

INTERNET:  paul@devon.lns.pa.us        |      If life's a bitch, then
UUCP:      ...!rutgers!devon!paul      |      we must be her puppies.