v15i026: Alternate getty front-end, with speed detection

Rich Salz rsalz at bbn.com
Fri Jun 3 05:00:56 AEST 1988


Submitted-by: michael at stb.UUCP (Michael Gersten)
Posting-number: Volume 15, Issue 26
Archive-name: newgetty

[  This plays around with the inside of the FILE structure.
   I wrote the Makefile and edited Michael's manual page.  -r$  ]

This is an alternative front end to getty. It does not replace getty;
it will call getty if needed (assumed to be placed in /etc/lib/getty).

It does have the following features:
1. Automatic recognition of 300/1200/2400/9600 baud
2. The ability to run any program or shell script, not just /etc/login.
3. Variable prompting.

Here I have a public access BBS on the same line. Most of my users wouldn't
know what to do if told "Login:" (even though bbs, help, and "?" all work).

If an upper case letter is given, this program sets the LCASE bit before
going to the next program.

: Michael Gersten
:				 ihnp4!hermix!ucla-an!denwa!stb!michael
:				sdcsvax!crash!gryphon!denwa!stb!michael
: "A hacker lives forever, but not so his free time"

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  Makefile newgetty.man newgetty.c
# Wrapped by rsalz at fig.bbn.com on Thu Jun  2 14:59:18 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(240 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X##
X##
X
X# Apparently this is needed for Xenix:
X#LIBS=-lx
CFLAGS=-O
X
all:		newgetty newgetty.man
install:	all
X	@echo Install according to local convention
X
newgetty:	newgetty.c
X	@rm -f newgetty
X	$(CC) -o newgetty $(CFLAGS) newgetty.c $(LIBS)
END_OF_FILE
if test 240 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'newgetty.man' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'newgetty.man'\"
else
echo shar: Extracting \"'newgetty.man'\" \(1700 characters\)
sed "s/^X//" >'newgetty.man' <<'END_OF_FILE'
X.TH NEWGETTY 8 
X.SH NAME
newgetty \- baud rate detecting version of getty (and more)
X.SH SYNTAX
X.B "getty b"
X.br
X.B "getty <anything else>"
X.SH DESCRIPTION
X.I newgetty
is a front end to
X.IR /etc/getty .
It assumes that the old system supplied getty is in
X.IR /etc/lib/getty ; if the argument is anything other than
X.B b
it calls that program with the argument.
X.PP
If the argument is
X.BR b ,
it trys to open
X.IR /etc/default/getty ,
which must contain a line like:
X.RS
prompt=Any string that you want to output
X.RE
X.PP
XFor example,
X.RS
prompt=<b>bs or <u>nix
X.RE
It will then wait for a character (with a timeout, currently of 3 seconds),
at which point it will change baud rates (currently 9600/2400/1200/300),
and try again.
X.PP
XEventually it will get a character, which it will then try to find a
line for in
X.IR /etc/default/getty .
This line should contain the name of the program or shell script to execute.
As an example:
X.RS
X.nf
prompt=<b>bs or <u>nix
b=/bbs/login
B=/bbs/login
u=/etc/login
U=/etc/login
x=/etc/login
XX=/etc/login
X.fi
X.RE
X.PP
X.I Newgetty
is smart enough to set the uppercase flag if an uppercase letter comes in;
other than that it assumes a normal (return/newline exchange, etc) terminal.
It does not do as much checking as the standard getty, but it's only looking
at one character.
X.PP
X.I Newgetty
assumes a fairly standard stdio, and uses one nonportable call.
The routine
X.IR finkey ()
returns a single character from a standard I/O FILE; it uses
X.IR rdchk ()
to see if a character is available.
BSD users can substitute FIONREAD; pure System\-5 users will have to change
the terminal codes used anyways, so they can put the timeout codes in.
V7 should just forget this.
END_OF_FILE
if test 1700 -ne `wc -c <'newgetty.man'`; then
    echo shar: \"'newgetty.man'\" unpacked with wrong size!
fi
# end of 'newgetty.man'
fi
if test -f 'newgetty.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'newgetty.c'\"
else
echo shar: Extracting \"'newgetty.c'\" \(2660 characters\)
sed "s/^X//" >'newgetty.c' <<'END_OF_FILE'
X/* @(#)newgetty.c	2.2 4/18/88 17:55:29 ( 4/18/88 17:33:01 ) */
X/* New getty program. If called with an argument other than 'b', it invokes
X	the old getty program (assumed to be at /etc/lib/getty), otherwise
X	it reads the default file (/etc/defaults/getty) for 'prompt=',
X	displays the result, reads a character, loops if non-ascii, checks
X	the default file for <char>=, executes that program if found, otherwise
X	loops. */
X
X/* 0.4 Sys 3 mods: set echo, cooked */
X/* Gave up on getting it to work with the sys3 structures. Will work fine
for BSD systems, or Xenix systems. If you are pure USG, either link for
version 7 mode (the kernel still has the version 7 stuff hidden inside
for compatibility), or convert it yourself.
X*/
X
X#include <ctype.h>
X#include <stdio.h>
X#include <sgtty.h>
X
X/* 0.3 Does not actually pass arg to next program */
X/* Will not work at 2400 */
X#define SPEED	(term.sg_ispeed >= B1200 ? "3":"5")
X#define fnsleep(x)  (3)	/* Return time for sleep */
X
char *defread(), *mkstr();
main(argc, argv)
char *argv[];
X{
X	int c;
X	char *x;
X	struct sgttyb term;
X	if (argc != 2 || strcmp (argv[1], "b") != 0)
error:		execv ("/etc/lib/getty", argv);
X	if (defopen("/etc/default/getty") != 0)
X	{
X		perror("new getty:");
X		goto error;
X	}
X	ioctl (1, TIOCGETP, &term);  
X	term.sg_ispeed = term.sg_ospeed = B9600;
X	term.sg_flags |= CBREAK | ECHO | CRMOD;
X	term.sg_flags &= ~RAW;
X	ioctl (1, TIOCNXCL);
X	for (;;)
X	{
X		ioctl (1, TIOCSETP, &term);
X		puts ("\r");
X		fputs(defread("prompt="), stdout);
X		/* Flush input */
X		while ((c=finkey(stdin)) != '\0' && c!= EOF)
X			;
X		sleep(fnsleep(term.sg_ispeed));
X		if (isalpha(c=finkey(stdin)) && (x=defread(mkstr(c))) !=NULL)
X		{
X			putchar('\n');
X			term.sg_flags = term.sg_flags &~ CBREAK;
X			if (isupper(c))
X				term.sg_flags |= LCASE;
X			ioctl (1, TIOCSETP, &term);
X			/* No more alarm clock */
X			execlp (x, x, NULL);
X	/* Speed is no longer passed */
X			perror (x);
X			term.sg_flags |= CBREAK;
X		}
X		term.sg_ispeed = term.sg_ospeed = nextspeed (term.sg_ispeed);
X					/* Change speed & try again */
X	}
X}
X
char *mkstr(c)
char c;
X{
X	static char chr[]="x=";
X	chr[0]=c;
X	return chr;
X}
X
nextspeed(oldspeed)
X{
X	switch (oldspeed)
X	{	case B300: return B9600;
X		case B1200: return B300;
X		case B2400: return B1200;
X		case B9600: return B2400;
X	}
X}
X
X/* @(#)inkey.c	1.1 4/18/88 17:57:48 ( 10/2/86 18:51:54 ) */
X# include <stdio.h>
inkey(fd)
int fd;
X{
X	char c;
X	int temp;
X	if (temp=rdchk(fd) > 0)
X		if (read (fd, &c, 1) >0)
X			return c;
X		else return (char) -1;
X	else return (temp == 0 ? 0 : -1);
X}
X
finkey(fp)
XFILE *fp;
X{
X	if ((fp->_cnt > 0) || rdchk(fileno(fp)) > 0)
X		return getc (fp);
X	if feof(fp)
X		return EOF;
X	return 0;
X}
END_OF_FILE
if test 2660 -ne `wc -c <'newgetty.c'`; then
    echo shar: \"'newgetty.c'\" unpacked with wrong size!
fi
# end of 'newgetty.c'
fi
echo shar: End of shell archive.
exit 0
-- 
Please send comp.sources.unix-related mail to rsalz at uunet.uu.net.



More information about the Comp.sources.unix mailing list