[comp.sys.handhelds] pf-bootstrap-v1.1a part 4 of 9

dan@i10s7.ira.uka.de (Dan Mosedale) (05/17/91)

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 4 (of 9)."
# Contents:  pf-bootstrap-v1.1a/tipx-p1/libacu/courier.c
#   pf-bootstrap-v1.1a/tipx-p1/libacu/hayes.c
#   pf-bootstrap-v1.1a/tipx-p1/libacu/sm2400.c
#   pf-bootstrap-v1.1a/tipx-p1/libacu/telebit.c
#   pf-bootstrap-v1.1a/tipx-p1/page.c pf-bootstrap-v1.1a/tipx-p1/tip.h
#   pf-bootstrap-v1.1a/xmodem-3.9/xmodem.c
# Wrapped by dan@nostromo on Fri May 17 02:31:41 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'pf-bootstrap-v1.1a/tipx-p1/libacu/courier.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'pf-bootstrap-v1.1a/tipx-p1/libacu/courier.c'\"
else
echo shar: Extracting \"'pf-bootstrap-v1.1a/tipx-p1/libacu/courier.c'\" \(6421 characters\)
sed "s/^X//" >'pf-bootstrap-v1.1a/tipx-p1/libacu/courier.c' <<'END_OF_FILE'
X/*
X * Copyright (c) 1986 The Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that the above copyright notice and this paragraph are
X * duplicated in all such forms and that any documentation,
X * advertising materials, and other materials related to such
X * distribution and use acknowledge that the software was developed
X * by the University of California, Berkeley.  The name of the
X * University may not be used to endorse or promote products derived
X * from this software without specific prior written permission.
X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X */
X
X#ifndef lint
Xstatic char sccsid[] = "@(#)courier.c	5.3 (Berkeley) 9/13/88";
X#endif /* not lint */
X
X#define write cour_write
X/*
X * Routines for calling up on a Courier modem.
X * Derived from Hayes driver.
X */
X#include "tip.h"
X#include <stdio.h>
X
X#define	MAXRETRY	5
X
Xstatic	int sigALRM();
Xstatic	int timeout = 0;
Xstatic	int connected = 0;
Xstatic	jmp_buf timeoutbuf, intbuf;
Xstatic	int (*osigint)();
X
Xcour_dialer(num, acu)
X	register char *num;
X	char *acu;
X{
X	register char *cp;
X#ifdef ACULOG
X	char line[80];
X#endif
X	if (boolean(value(VERBOSE)))
X		printf("Using \"%s\"\n", acu);
X
X	ioctl(FD, TIOCHPCL, 0);
X	/*
X	 * Get in synch.
X	 */
X	if (!coursync()) {
Xbadsynch:
X		printf("can't synchronize with courier\n");
X#ifdef ACULOG
X		logent(value(HOST), num, "courier", "can't synch up");
X#endif
X		return (0);
X	}
X	write(FD, "AT E0\r", 6);	/* turn off echoing */
X	sleep(1);
X#ifdef DEBUG
X	if (boolean(value(VERBOSE)))
X		verbose_read();
X#endif
X	ioctl(FD, TIOCFLUSH, 0);	/* flush any clutter */
X	write(FD, "AT C1 E0 H0 Q0 X6 V1\r", 21);
X	if (!cour_swallow("\r\nOK\r\n"))
X		goto badsynch;
X	fflush(stdout);
X	write(FD, "AT D", 4);
X	for (cp = num; *cp; cp++)
X		if (*cp == '=')
X			*cp = ',';
X	write(FD, num, strlen(num));
X	write(FD, "\r", 1);
X	connected = cour_connect();
X#ifdef ACULOG
X	if (timeout) {
X		sprintf(line, "%d second dial timeout",
X			number(value(DIALTIMEOUT)));
X		logent(value(HOST), num, "cour", line);
X	}
X#endif
X	if (timeout)
X		cour_disconnect();
X	return (connected);
X}
X
Xcour_disconnect()
X{
X	 /* first hang up the modem*/
X	ioctl(FD, TIOCCDTR, 0);
X	sleep(1);
X	ioctl(FD, TIOCSDTR, 0);
X	coursync();				/* reset */
X	close(FD);
X}
X
Xcour_abort()
X{
X	write(FD, "\r", 1);	/* send anything to abort the call */
X	cour_disconnect();
X}
X
Xstatic int
XsigALRM()
X{
X	printf("\07timeout waiting for reply\n");
X	timeout = 1;
X	longjmp(timeoutbuf, 1);
X}
X
Xstatic int
Xcour_swallow(match)
Xregister char *match;
X{
X	char c;
X	sigfunc_t (*f)();
X
X	f = signal(SIGALRM, sigALRM);
X	timeout = 0;
X	do {
X		if (*match =='\0') {
X			signal(SIGALRM, f);
X			return (1);
X		}
X		if (setjmp(timeoutbuf)) {
X			signal(SIGALRM, f);
X			return (0);
X		}
X		alarm(number(value(DIALTIMEOUT)));
X		read(FD, &c, 1);
X		alarm(0);
X		c &= 0177;
X#ifdef DEBUG
X		if (boolean(value(VERBOSE)))
X			putchar(c);
X#endif
X	} while (c == *match++);
X#ifdef DEBUG
X	if (boolean(value(VERBOSE)))
X		fflush(stdout);
X#endif
X	signal(SIGALRM, SIG_DFL);
X	return (0);
X}
X
Xstruct baud_msg {
X	char *msg;
X	int baud;
X} baud_msg[] = {
X	"",		B300,
X	" 1200",	B1200,
X	" 2400",	B2400,
X	0,		0,
X};
X
Xstatic int
Xcour_connect()
X{
X	char c;
X	int nc, nl, n;
X	struct sgttyb sb;
X	char dialer_buf[64];
X	struct baud_msg *bm;
X	sigfunc_t (*f)();
X
X	if (cour_swallow("\r\n") == 0)
X		return (0);
X	f = signal(SIGALRM, sigALRM);
Xagain:
X	nc = 0; nl = sizeof(dialer_buf)-1;
X	bzero(dialer_buf, sizeof(dialer_buf));
X	timeout = 0;
X	for (nc = 0, nl = sizeof(dialer_buf)-1 ; nl > 0 ; nc++, nl--) {
X		if (setjmp(timeoutbuf))
X			break;
X		alarm(number(value(DIALTIMEOUT)));
X		n = read(FD, &c, 1);
X		alarm(0);
X		if (n <= 0)
X			break;
X		c &= 0x7f;
X		if (c == '\r') {
X			if (cour_swallow("\n") == 0)
X				break;
X			if (!dialer_buf[0])
X				goto again;
X			if (strcmp(dialer_buf, "RINGING") == 0 &&
X			    boolean(value(VERBOSE))) {
X#ifdef DEBUG
X				printf("%s\r\n", dialer_buf);
X#endif
X				goto again;
X			}
X			if (strncmp(dialer_buf, "CONNECT",
X				    sizeof("CONNECT")-1) != 0)
X				break;
X			for (bm = baud_msg ; bm ; bm++)
X				if (strcmp(bm->msg,
X				    dialer_buf+sizeof("CONNECT")-1) == 0) {
X					if (ioctl(FD, TIOCGETP, &sb) < 0) {
X						perror("TIOCGETP");
X						goto error;
X					}
X					sb.sg_ispeed = sb.sg_ospeed = bm->baud;
X					if (ioctl(FD, TIOCSETP, &sb) < 0) {
X						perror("TIOCSETP");
X						goto error;
X					}
X					signal(SIGALRM, f);
X#ifdef DEBUG
X					if (boolean(value(VERBOSE)))
X						printf("%s\r\n", dialer_buf);
X#endif
X					return (1);
X				}
X			break;
X		}
X		dialer_buf[nc] = c;
X#ifdef notdef
X		if (boolean(value(VERBOSE)))
X			putchar(c);
X#endif
X	}
Xerror1:
X	printf("%s\r\n", dialer_buf);
Xerror:
X	signal(SIGALRM, f);
X	return (0);
X}
X
X/*
X * This convoluted piece of code attempts to get
X * the courier in sync.
X */
Xstatic int
Xcoursync()
X{
X	int already = 0;
X	int len;
X	char buf[40];
X
X	while (already++ < MAXRETRY) {
X		ioctl(FD, TIOCFLUSH, 0);	/* flush any clutter */
X		write(FD, "\rAT Z\r", 6);	/* reset modem */
X		bzero(buf, sizeof(buf));
X		sleep(1);
X		ioctl(FD, FIONREAD, &len);
X		if (len) {
X			len = read(FD, buf, sizeof(buf));
X#ifdef DEBUG
X			buf[len] = '\0';
X			printf("coursync: (\"%s\")\n\r", buf);
X#endif
X			if (index(buf, '0') || 
X		   	   (index(buf, 'O') && index(buf, 'K')))
X				return(1);
X		}
X		/*
X		 * If not strapped for DTR control,
X		 * try to get command mode.
X		 */
X		sleep(1);
X		write(FD, "+++", 3);
X		sleep(1);
X		/*
X		 * Toggle DTR to force anyone off that might have left
X		 * the modem connected.
X		 */
X		ioctl(FD, TIOCCDTR, 0);
X		sleep(1);
X		ioctl(FD, TIOCSDTR, 0);
X	}
X	write(FD, "\rAT Z\r", 6);
X	return (0);
X}
X
X#undef write
X
Xcour_write(fd, cp, n)
Xint fd;
Xchar *cp;
Xint n;
X{
X	struct sgttyb sb;
X#ifdef notdef
X	if (boolean(value(VERBOSE)))
X		write(1, cp, n);
X#endif
X	ioctl(fd, TIOCGETP, &sb);
X	ioctl(fd, TIOCSETP, &sb);
X	cour_nap();
X	for ( ; n-- ; cp++) {
X		write(fd, cp, 1);
X		ioctl(fd, TIOCGETP, &sb);
X		ioctl(fd, TIOCSETP, &sb);
X		cour_nap();
X	}
X}
X
X#ifdef DEBUG
Xverbose_read()
X{
X	int n = 0;
X	char buf[BUFSIZ];
X
X	if (ioctl(FD, FIONREAD, &n) < 0)
X		return;
X	if (n <= 0)
X		return;
X	if (read(FD, buf, n) != n)
X		return;
X	write(1, buf, n);
X}
X#endif
X
X#include <sys/time.h>
X
Xcour_nap()
X{
X	struct timeval tv;
X
X	tv.tv_sec = 0;
X	tv.tv_usec = 50000;	/* 50 msec */
X	select(0, NULL, NULL, NULL, &tv);
X}
END_OF_FILE
if test 6421 -ne `wc -c <'pf-bootstrap-v1.1a/tipx-p1/libacu/courier.c'`; then
    echo shar: \"'pf-bootstrap-v1.1a/tipx-p1/libacu/courier.c'\" unpacked with wrong size!
fi
# end of 'pf-bootstrap-v1.1a/tipx-p1/libacu/courier.c'
fi
if test -f 'pf-bootstrap-v1.1a/tipx-p1/libacu/hayes.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'pf-bootstrap-v1.1a/tipx-p1/libacu/hayes.c'\"
else
echo shar: Extracting \"'pf-bootstrap-v1.1a/tipx-p1/libacu/hayes.c'\" \(6469 characters\)
sed "s/^X//" >'pf-bootstrap-v1.1a/tipx-p1/libacu/hayes.c' <<'END_OF_FILE'
X/*
X * Copyright (c) 1983 The Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that the above copyright notice and this paragraph are
X * duplicated in all such forms and that any documentation,
X * advertising materials, and other materials related to such
X * distribution and use acknowledge that the software was developed
X * by the University of California, Berkeley.  The name of the
X * University may not be used to endorse or promote products derived
X * from this software without specific prior written permission.
X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X */
X
X#ifndef lint
Xstatic char sccsid[] = "@(#)hayes.c	5.2 (Berkeley) 9/13/88";
X#endif /* not lint */
X
X/*
X * Routines for calling up on a Hayes Modem
X * (based on the old VenTel driver).
X * The modem is expected to be strapped for "echo".
X * Also, the switches enabling the DTR and CD lines
X * must be set correctly.
X * NOTICE:
X * The easy way to hang up a modem is always simply to
X * clear the DTR signal. However, if the +++ sequence
X * (which switches the modem back to local mode) is sent
X * before modem is hung up, removal of the DTR signal
X * has no effect (except that it prevents the modem from
X * recognizing commands).
X * (by Helge Skrivervik, Calma Company, Sunnyvale, CA. 1984) 
X */
X/*
X * TODO:
X * It is probably not a good idea to switch the modem
X * state between 'verbose' and terse (status messages).
X * This should be kicked out and we should use verbose 
X * mode only. This would make it consistent with normal
X * interactive use thru the command 'tip dialer'.
X */
X#include "tip.h"
X
X#define	min(a,b)	((a < b) ? a : b)
X
Xstatic	int sigALRM();
Xstatic	int timeout = 0;
Xstatic	jmp_buf timeoutbuf;
Xstatic 	char gobble();
X#define DUMBUFLEN	40
Xstatic char dumbuf[DUMBUFLEN];
X
X#define	DIALING		1
X#define IDLE		2
X#define CONNECTED	3
X#define	FAILED		4
Xstatic	int state = IDLE;
X
Xhay_dialer(num, acu)
X	register char *num;
X	char *acu;
X{
X	register char *cp;
X	register int connected = 0;
X	char dummy;
X#ifdef ACULOG
X	char line[80];
X#endif
X	if (hay_sync() == 0)		/* make sure we can talk to the modem */
X		return(0);
X	if (boolean(value(VERBOSE)))
X		printf("\ndialing...");
X	fflush(stdout);
X	ioctl(FD, TIOCHPCL, 0);
X	ioctl(FD, TIOCFLUSH, 0);	/* get rid of garbage */
X	write(FD, "ATV0E0\r", 7);	/* tell modem to use short status codes */
X	if (gobble("A\r") == 'A') {
X		gobble("\r");	/* echo is on, need 2 swallows */
X		gobble("\r");
X	}
X	write(FD, "ATDT", 4);	/* send dial command */
X	write(FD, num, strlen(num));
X	state = DIALING;
X	write(FD, "\r", 1);
X	connected = 0;
X	if ((dummy = gobble("012345678")) != '1')
X		error_rep(dummy);
X	else
X		connected = 1;
X	if (connected)
X		state = CONNECTED;
X	else {
X		state = FAILED;
X		return (connected);	/* lets get out of here.. */
X	}
X	ioctl(FD, TIOCFLUSH, 0);
X#ifdef ACULOG
X	if (timeout) {
X		sprintf(line, "%d second dial timeout",
X			number(value(DIALTIMEOUT)));
X		logent(value(HOST), num, "hayes", line);
X	}
X#endif
X	if (timeout)
X		hay_disconnect();	/* insurance */
X	return (connected);
X}
X
X
Xhay_disconnect()
X{
X	char c;
X	int len, rlen;
X
X	/* first hang up the modem*/
X#ifdef DEBUG
X	printf("\rdisconnecting modem....\n\r");
X#endif
X	ioctl(FD, TIOCCDTR, 0);
X	sleep(1);
X	ioctl(FD, TIOCSDTR, 0);
X	goodbye();
X}
X
Xhay_abort()
X{
X
X	char c;
X
X	write(FD, "\r", 1);	/* send anything to abort the call */
X	hay_disconnect();
X}
X
Xstatic int
XsigALRM()
X{
X
X	printf("\07timeout waiting for reply\n\r");
X	timeout = 1;
X	longjmp(timeoutbuf, 1);
X}
X
Xstatic char
Xgobble(match)
X	register char *match;
X{
X	char c;
X	int (*f)();
X	int i, status = 0;
X
X	signal(SIGALRM, sigALRM);
X	timeout = 0;
X#ifdef DEBUG
X	printf("\ngobble: waiting for %s\n", match);
X#endif
X	do {
X		if (setjmp(timeoutbuf)) {
X			signal(SIGALRM, f);
X			return (0);
X		}
X		alarm(number(value(DIALTIMEOUT)));
X		read(FD, &c, 1);
X		alarm(0);
X		c &= 0177;
X#ifdef DEBUG
X		printf((c>' ' && c<0177)?"%c ":"0x%x ", c);
X#endif
X		for (i = 0; i < strlen(match); i++)
X			if (c == match[i])
X				status = c;
X	} while (status == 0);
X	signal(SIGALRM, SIG_DFL);
X#ifdef DEBUG
X	printf("\n");
X#endif
X	return (status);
X}
X
Xerror_rep(c)
X	register char c;
X{
X	printf("\n\r");
X	switch (c) {
X
X	case '0':
X		printf("OK");
X		break;
X
X	case '1':
X		printf("CONNECT");
X		break;
X	
X	case '2':
X		printf("RING");
X		break;
X	
X	case '3':
X		printf("NO CARRIER");
X		break;
X	
X	case '4':
X		printf("ERROR in input");
X		break;
X	
X	case '5':
X		printf("CONNECT 1200");
X		break;
X	
X	case '6':
X		printf("NO DIALTONE");
X		break;
X
X	case '7':
X		printf("BUSY");
X		break;
X
X	case '8':
X		printf("NO ANSWER");
X		break;
X
X	default:
X		printf("Unknown Modem error: %c (0x%x)", c, c);
X	}
X	printf("\n\r");
X	return;
X}
X
X/*
X * set modem back to normal verbose status codes.
X */
Xgoodbye()
X{
X	int len, rlen;
X	char c;
X
X	ioctl(FD, TIOCFLUSH, &len);	/* get rid of trash */
X	if (hay_sync()) {
X		sleep(1);
X#ifndef DEBUG
X		ioctl(FD, TIOCFLUSH, 0);
X#endif
X		write(FD, "ATH0V0\r", 7);		/* insurance */
X#ifndef DEBUG
X		number(value(DIALTIMEOUT)) = 10;	/* shorten timeout */
X		c = gobble("03");
X		if (c != '0' && c != '3') {
X			printf("cannot hang up modem\n\r");
X			printf("please use 'tip dialer' to make sure the line is hung up\n\r");
X		}
X#endif
X		sleep(1);
X		ioctl(FD, FIONREAD, &len);
X#ifdef DEBUG
X		printf("goodbye1: len=%d -- ", len);
X		rlen = read(FD, dumbuf, min(len, DUMBUFLEN));
X		dumbuf[rlen] = '\0';
X		printf("read (%d): %s\r\n", rlen, dumbuf);
X#endif
X		write(FD, "ATV1E1\r", 7);
X		sleep(1);
X#ifdef DEBUG
X		ioctl(FD, FIONREAD, &len);
X		printf("goodbye2: len=%d -- ", len);
X		rlen = read(FD, dumbuf, min(len, DUMBUFLEN));
X		dumbuf[rlen] = '\0';
X		printf("read (%d): %s\r\n", rlen, dumbuf);
X#endif
X	}
X	ioctl(FD, TIOCFLUSH, 0);	/* clear the input buffer */
X	ioctl(FD, TIOCCDTR, 0);		/* clear DTR (insurance) */
X	close(FD);
X}
X
X#define MAXRETRY	5
X
Xhay_sync()
X{
X	int len, retry = 0;
X
X	while (retry++ <= MAXRETRY) {
X		write(FD, "\rAT\r", 4);
X		sleep(1);
X		ioctl(FD, FIONREAD, &len);
X		if (len) {
X			len = read(FD, dumbuf, min(len, DUMBUFLEN));
X			if (index(dumbuf, '0') || 
X		   	(index(dumbuf, 'O') && index(dumbuf, 'K')))
X				return(1);
X#ifdef DEBUG
X			dumbuf[len] = '\0';
X			printf("hay_sync: (\"%s\") %d\n\r", dumbuf, retry);
X#endif
X		}
X		ioctl(FD, TIOCCDTR, 0);
X		ioctl(FD, TIOCSDTR, 0);
X	}
X	printf("Cannot synchronize with hayes...\n\r");
X	return(0);
X}
END_OF_FILE
if test 6469 -ne `wc -c <'pf-bootstrap-v1.1a/tipx-p1/libacu/hayes.c'`; then
    echo shar: \"'pf-bootstrap-v1.1a/tipx-p1/libacu/hayes.c'\" unpacked with wrong size!
fi
# end of 'pf-bootstrap-v1.1a/tipx-p1/libacu/hayes.c'
fi
if test -f 'pf-bootstrap-v1.1a/tipx-p1/libacu/sm2400.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'pf-bootstrap-v1.1a/tipx-p1/libacu/sm2400.c'\"
else
echo shar: Extracting \"'pf-bootstrap-v1.1a/tipx-p1/libacu/sm2400.c'\" \(7112 characters\)
sed "s/^X//" >'pf-bootstrap-v1.1a/tipx-p1/libacu/sm2400.c' <<'END_OF_FILE'
X/*
X * Dialer support for Hayes Smartmodem(tm) 2400 modem.
X */
X
X#ifndef lint
Xstatic char *RCSid = "$Header: sm2400.c,v 1.11 86/06/24 19:47:12 rayan Exp $";
X#endif
X
X#undef DEBUG 1
X
X#ifdef	DEBUG
Xint debug = 1;
X#define STATIC
X#else
X#define STATIC static
X#endif
X
X#include "tip.h"
X#include <sys/time.h>
X
X	/* commands */
XSTATIC char	NAME[] =		"sm2400";
XSTATIC char	WARMUP[] =		"\rat\r";
XSTATIC char	RESULT_CODES[] =	"\ratq0\r";
XSTATIC char	DONT_ANSWER[] =		"\rats0=0\r";
XSTATIC char	IGN_ESCAPE[] =		"\rats2=128\r";
XSTATIC char	CODES_4[] =		"\ratx4\r";
XSTATIC char	DIAL_PREFIX[] =		"\ratdt";
X
X	/* result codes */;
XSTATIC char	MDM_OK[] =		"\r\nOK\r\n";
XSTATIC char	RING[] =		"\r\nRING\r\n";
XSTATIC char	NO_CARRIER[] =		"\r\nNO CARRIER\r\n";
XSTATIC char	ERROR[] =		"\r\nERROR\r\n";
XSTATIC char	CONNECT[] =		"\r\nCONNECT\r\n";
XSTATIC char	CONNECT_600[] =		"\r\nCONNECT 0600\r\n";
XSTATIC char	CONNECT_1200[] =	"\r\nCONNECT 1200\r\n";
XSTATIC char	CONNECT_2400[] =	"\r\nCONNECT 2400\r\n";
XSTATIC char	NO_DIALTONE[] =		"\r\nNO DIALTONE\r\n";
XSTATIC char	NO_ANSWER[] =		"\r\nNO ANSWER\r\n";
XSTATIC char	BUSY[] =		"\r\nBUSY\r\n";
X
XSTATIC char	*nosm24con[] =	{	BUSY,
X					NO_DIALTONE,
X					NO_ANSWER,
X					ERROR,
X					RING,
X					NO_CARRIER,
X					0
X				};
X
X/* The baudrate starts at 300, and doubles for next element of array */
XSTATIC char	*sm24con[] =	{	CONNECT,
X					CONNECT_600,
X					CONNECT_1200,
X					CONNECT_2400,
X					0
X				};
X#ifdef	USG
XSTATIC struct termio termio;		/* needed on USG to set HUPCL */
X#endif	/* USG */
X
X#define	CMD_DELAY	5	/* number of seconds to wait for response
X					while in command mode */
X#define DIAL_DELAY	120	/* number of seconds to wait for response
X					after sending dial string */
X#define	MAXSTR	100
X
Xstatic jmp_buf	jmpbuf;
X
Xint 	sm24read(), sm24write();
X
Xsm24_dialer(num, acu)
Xregister char	*num;
Xchar	*acu;
X{
X	int	ret;
X	int	i, j;
X	char	buf1[MAXSTR], buf2[MAXSTR], buf3[MAXSTR];
X#ifdef ACULOG
X	char	line[MAXSTR];
X#endif
X
X	/*
X	 * wake up the modem if it's listening...
X	 */
X	if (boolean(value(VERBOSE)))
X		printf("diddling dialer...");
X
X	sleep(1);	/* Give modem time to settle down after reset */
X	if ((!sm24set(RESULT_CODES, buf1, num, "is naughty")
X		     && !sm24set(RESULT_CODES, buf1, num, "not listening"))
X	    || !sm24set(DONT_ANSWER, buf1, num, "auto-answer not turned off")
X	    || !sm24set(IGN_ESCAPE, buf1, num, "escape code not turned off")
X	    || !sm24set(CODES_4, buf1, num, "result codes not set"))
X		return 0;
X
X	/* insurance ? */
X#ifdef	USG
X	if (ioctl(FD, TCGETA, &termio) < 0)
X		perror("tip: TCGETA ioctl");
X	termio.c_cflag |= HUPCL;
X	if (ioctl(FD, TCSETA, &termio) < 0)
X		perror("tip: TCSETA ioctl");
X#else	/* USG */
X	if (ioctl(FD, TIOCHPCL, 0) < 0)
X		perror("tip: TIOCHPCL ioctl");
X#endif	/* USG */
X
X	buf2[0] = '\0';
X	for (i = 0, j = 300; sm24con[i] != (char *)0; i++, j*=2) {
X		if (BR == j) {
X			strcpy(buf2, sm24con[i]);
X			break;
X		}
X	}
X	if (buf2[0] == '\0') {
X		sprintf(buf2, "unsupported baud rate (%d)", BR);
X		goto error;
X	}
X
X	/* Is it safe to just say ATD and let the options setting rule? */
X	sm24write(DIAL_PREFIX);
X	sm24write(num);
X	sm24write("\r");
X	if (boolean(value(VERBOSE)))
X		printf(" dialing... ");
X	if (ret = sm24read(buf1, DIAL_DELAY, (u_int) strlen(buf2)) == 0) {
X		strcpy(buf2, "TIMEOUT on dial");
X		goto error;
X	}
X	if (ret == -1) {
X		strcpy(buf2, "ioctl failed");
X		goto error;
X	}
X	if (strncmp(buf1, buf2, strlen(buf2)) != 0) {
X		for (i = 0, j = 300; sm24con[i] != (char *)0; i++, j *= 2) {
X			if (!strncmp(buf1, sm24con[i], strlen(sm24con[i]))) {
X				/* This should never fail */
X				if ((i = speed(j)) != NULL) {
X					BR = j;
X					ttysetup(i);
X				} else {
X					printf("speed(%d) failed\n", j);
X					return 0;
X				}
X				goto ok;
X			}
X		}
X		for (i = 0; nosm24con[i] != (char *)0; i++) {
X			if (!strncmp(buf1, nosm24con[i], strlen(nosm24con[i]))){
X				char	*bp, *cp;
X				for (bp = buf2, cp = nosm24con[i]; *cp; cp++) {
X					if (*cp != '\r' && *cp != '\n')
X						*bp++ = *cp;
X				}
X				*bp = '\0';
X				goto error;
X			}
X		}
X		(void) strcpy(buf2, "UNKNOWN ERROR");
Xerror:
X		printf("dial failed (%s)\n", buf2);
X		sprintf(buf3, "dial failed (%s)", buf2);
X#ifdef ACULOG
X		logent(value(HOST), num, NAME, buf3);
X#endif
X		return 0;
X	}
Xok:
X	if (boolean(value(VERBOSE)))
X		printf("(%d baud) ", BR);
X	i = 2;
X#ifdef	USG
X	if (ioctl(FD, TCFLSH, i) < 0)
X		perror("tip: TCFLSH ioctl");
X#else	/* USG */
X	if (ioctl(FD, TIOCFLUSH, &i) < 0)
X		perror("tip: TIOCFLUSH ioctl");
X#endif	/* USG */
X	return 1;
X}
X
X
Xsm24_disconnect()
X{
X#ifdef	USG
X	if (ioctl(FD, TCGETA, &termio) < 0)
X		perror("tip: TCGETA ioctl");
X	termio.c_cflag &= (CBAUD & B0);
X	if (ioctl(FD, TCSETA, &termio) < 0)
X		perror("tip: TCSETA ioctl");
X	sleep(2);
X#endif	/* USG */
X	(void) close(FD);
X}
X
X
Xsm24_abort()
X{
X	sm24_disconnect();
X}
X
XSTATIC
Xsm24write(cp)
Xregister char	*cp;
X{
X	struct timeval t;
X
X	for (; *cp != '\0' ; cp++) {
X		if (write(FD, cp, 1) != 1) {
X			perror("tip: sm24write: write error");
X			return;
X		}
X#ifdef	DEBUG
X		if (debug) {
X			fprintf(stderr, "written '%c'\n", *cp);
X		}
X#endif
X		t.tv_sec = 0;
X		t.tv_usec = (10 * 1000000)/BR;
X		(void) select(32, 0, 0, 0, &t);
X	}
X}
X
XSTATIC
Xsm24read(buf, timeout, max)
Xregister char	*buf;
Xunsigned int timeout, max;
X{
X	int	alarmtr();
X	struct timeval t;
X	register char	*rp;
X	unsigned int numread, numprev = 0, numpndg = 0;
X	unsigned int toread;
X
X#ifdef	DEBUG
X	if (debug)
X		fprintf(stderr, "\n---------\nentering sm24read(): timeout is: %d, max is: %d\n", timeout, max);
X#endif
X	rp = buf;
X	*rp = '\0';
X	(void) signal(SIGALRM, alarmtr);
X	if (setjmp(jmpbuf)) {
X		*rp = '\0';
X		return 0;
X	}
X	(void) alarm(timeout);
X		/* wait till modem says something or until timeout */
X	while (numpndg == 0 || numpndg != numprev) {
X		numprev = numpndg;
X		if (ioctl(FD, FIONREAD, &numpndg) == -1) {
X			perror("tip: FIONREAD ioctl");
X			return -1;
X		}
X		t.tv_sec = 0;
X		t.tv_usec = (5 * 10 * 1000000)/BR;
X		(void) select(32, 0, 0, 0, &t);
X	}
X	(void) alarm(0);
X#ifdef	DEBUG
X	if (debug)
X		fprintf(stderr, "number of chars waiting is: %d\n", numpndg);
X#endif
X	toread = ((numpndg > max) ? max : numpndg);
X  	if ((numread = read(FD, rp, toread)) < toread)
X		perror("read error");
X#ifdef	DEBUG
X	if (debug) {
X		int i; char *p;
X		fprintf(stderr, "read %d chars:", numread);
X		for (i=0, p=rp; i<numread; i++, p++)
X			fprintf(stderr, "%0.2x ", *p);
X		fprintf(stderr, "\n");
X		fflush(stderr);
X	}
X#endif
X	rp += numread;
X	*rp = '\0';
X#ifdef	DEBUG
X	if (debug) {
X		fprintf(stderr, "\nbuf contains: ->%s<-\n", buf);
X		fprintf(stderr, "leaving sm24read()\n-----------\n");
X		fflush(stderr);
X	}
X#endif
X	return 1;
X}
X
X
XSTATIC
Xaccept(baudrate)
Xint	baudrate;
X{
X	int i;
X
X	BR = baudrate;
X	if ((i = speed(baudrate)) != NULL)
X		ttysetup(i);
X}
X
X
XSTATIC
Xalarmtr()
X{
X#ifdef	DEBUG
X	if (debug)
X		fprintf(stderr, "alarm went off!\n");
X#endif
X	longjmp(jmpbuf, 1);
X}
X
XSTATIC int
Xsm24set(tosend, buf, num, errmsg)
Xchar	*tosend, *buf, *num, *errmsg;
X{
X	sm24write(tosend);
X	sm24read(buf, CMD_DELAY, (u_int) (sizeof MDM_OK) - 1);
X	if (strncmp(buf, MDM_OK, (sizeof MDM_OK) - 1) != 0) {
X		printf(" %s modem %s\n", NAME, errmsg);
X#ifdef ACULOG
X		logent(value(HOST), num, NAME, errmsg);
X#endif
X		return 0;
X	}
X	return 1;
X}
END_OF_FILE
if test 7112 -ne `wc -c <'pf-bootstrap-v1.1a/tipx-p1/libacu/sm2400.c'`; then
    echo shar: \"'pf-bootstrap-v1.1a/tipx-p1/libacu/sm2400.c'\" unpacked with wrong size!
fi
# end of 'pf-bootstrap-v1.1a/tipx-p1/libacu/sm2400.c'
fi
if test -f 'pf-bootstrap-v1.1a/tipx-p1/libacu/telebit.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'pf-bootstrap-v1.1a/tipx-p1/libacu/telebit.c'\"
else
echo shar: Extracting \"'pf-bootstrap-v1.1a/tipx-p1/libacu/telebit.c'\" \(8131 characters\)
sed "s/^X//" >'pf-bootstrap-v1.1a/tipx-p1/libacu/telebit.c' <<'END_OF_FILE'
X/*
X * Dialer support for Telebit Trailblazer Plus modem.
X */
X
X#ifndef lint
Xstatic char *RCSid = "$Header: telebit.c,v 1.13 88/05/25 19:48:06 rayan Exp $";
X#endif
X
X#undef DEBUG 1
X
X#ifdef	DEBUG
Xint debug = 1;
X#define STATIC
X#else
X#define STATIC static
X#endif
X
X#include "tip.h"
X#include <sys/time.h>
X
X/*
X * The following is the Telebit register setup used here with this code, with
X * the TB+ attached to a fixed-speed interface on a remote terminal server.
X * When attaching to a computer the appropriate register should be set so
X * the TB+ interface speed matches the connect baud rate.
X *
XE0 F1 M1 Q1 P V1 X1     Version BA4.00
XS00=001 S01=000 S02=043 S03=013 S04=010 S05=008 S06=002 S07=040 S08=002 S09=006
XS10=007 S11=070 S12=050 
XS45=255 S47=004 S48=000 S49=000
XS50=000 S51=005 S52=002 S53=004 S54=003 S55=000 S56=017 S57=019 S58=000 S59=000
XS60=000 S61=000 S62=003 S63=001 S64=000 S65=000 S66=000 S67=000 S68=255 
XS90=000 S91=000 S92=000 S95=000 
XS100=000 S101=000 S102=000 S104=000 
XS110=001 S111=030 S112=001 
XS121=000 
X *
X */
X
X	/* commands */
XSTATIC char	NAME[] =		"telebit";
XSTATIC char	WARMUP[] =		"\rat\r";
XSTATIC char	RESULT_CODES[] =	"\ratq0\r";
XSTATIC char	DONT_ANSWER[] =		"\rats0=0\r";
XSTATIC char	IGN_ESCAPE[] =		"\rats55=3\r";
XSTATIC char	CODES_4[] =		"\ratx1\r";
XSTATIC char	DIAL_PREFIX[] =		"\ratdt";
X
X	/* result codes */;
XSTATIC char	MDM_OK[] =		"\r\nOK\r\n";
XSTATIC char	RING[] =		"\r\nRING\r\n";
XSTATIC char	RRING[] =		"\r\nRRING\r\n";
XSTATIC char	NO_CARRIER[] =		"\r\nNO CARRIER\r\n";
XSTATIC char	ERROR[] =		"\r\nERROR\r\n";
XSTATIC char	CONNECT[] =		"\r\nCONNECT 300\r\n";
XSTATIC char	CONNECT_1200[] =	"\r\nCONNECT 1200\r\n";
XSTATIC char	CONNECT_2400[] =	"\r\nCONNECT 2400\r\n";
XSTATIC char	CONNECT_FAST[] =	"\r\nCONNECT FAST\r\n";
XSTATIC char	NO_DIALTONE[] =		"\r\nNO DIALTONE\r\n";
XSTATIC char	NO_ANSWER[] =		"\r\nNO ANSWER\r\n";
XSTATIC char	BUSY[] =		"\r\nBUSY\r\n";
X
XSTATIC char	*notbcon[] =	{	BUSY,
X					NO_DIALTONE,
X					NO_ANSWER,
X					ERROR,
X					RING,
X					NO_CARRIER,
X					0
X				};
X
X/* The baudrate starts at 300, and doubles for next element of array */
XSTATIC char	*tbcon[] =	{	CONNECT,
X					"ignore",
X					CONNECT_1200,
X					CONNECT_2400,
X					"ignore",
X					"ignore",
X					CONNECT_FAST,
X					0
X				};
X#ifdef	USG
XSTATIC struct termio termio;		/* needed on USG to set HUPCL */
X#endif	/* USG */
X
X#define	CMD_DELAY	5	/* number of seconds to wait for response
X					while in command mode */
X#define DIAL_DELAY	120	/* number of seconds to wait for response
X					after sending dial string */
X#define	MAXSTR	100
X
Xstatic jmp_buf	jmpbuf;
X
Xint 	tbread(), tbwrite();
X
Xtb_dialer(num, acu)
Xregister char	*num;
Xchar	*acu;
X{
X	int	ret;
X	int	i, j;
X	char	buf1[MAXSTR], buf2[MAXSTR], buf3[MAXSTR];
X#ifdef ACULOG
X	char	line[MAXSTR];
X#endif
X
X	/*
X	 * wake up the modem if it's listening...
X	 */
X	if (boolean(value(VERBOSE)))
X		printf("diddling dialer...");
X#ifdef DEBUG
X	if (debug)
X		fprintf(stderr, "BR=%d\n", BR);
X#endif
X
X	sleep(1);	/* Give modem time to settle down after reset */
X	if ((!tbset(RESULT_CODES, buf1, num, "is naughty")
X		     && !tbset(RESULT_CODES, buf1, num, "not listening"))
X	    || !tbset(DONT_ANSWER, buf1, num, "auto-answer not turned off")
X	    || !tbset(IGN_ESCAPE, buf1, num, "escape code not turned off")
X	    || !tbset(CODES_4, buf1, num, "result codes not set"))
X		return 0;
X
X	/* insurance ? */
X#ifdef	USG
X	if (ioctl(FD, TCGETA, &termio) < 0)
X		perror("tip: TCGETA ioctl");
X	termio.c_cflag |= HUPCL;
X	if (ioctl(FD, TCSETA, &termio) < 0)
X		perror("tip: TCSETA ioctl");
X#else	/* USG */
X	if (ioctl(FD, TIOCHPCL, 0) < 0)
X		perror("tip: TIOCHPCL ioctl");
X#endif	/* USG */
X
X	buf2[0] = '\0';
X	for (i = 0, j = 300; tbcon[i] != (char *)0; i++, j*=2) {
X		if (BR == j) {
X			strcpy(buf2, tbcon[i]);
X			break;
X		}
X	}
X	if (buf2[0] == '\0') {
X		sprintf(buf2, "unsupported baud rate (%d)", BR);
X		goto error;
X	}
X
X	/* Is it safe to just say ATD and let the options setting rule? */
X	tbwrite(DIAL_PREFIX);
X	tbwrite(num);
X	tbwrite("\r");
X	if (boolean(value(VERBOSE)))
X		printf(" dialing... ");
X	do {
X		if (ret = tbread(buf1, DIAL_DELAY, (u_int) strlen(buf2)) == 0) {
X			strcpy(buf2, "TIMEOUT on dial");
X			goto error;
X		}
X		if (ret == -1) {
X			strcpy(buf2, "ioctl failed");
X			goto error;
X		}
X	} while (strncmp(buf1, RRING, strlen(RRING)) == 0
X		&& (!boolean(value(VERBOSE)) || (printf("rrring... "), 1)));
X	if (strncmp(buf1, buf2, strlen(buf2)) != 0) {
X		for (i = 0, j = 300; tbcon[i] != (char *)0; i++, j *= 2) {
X			if (!strncmp(buf1, tbcon[i], strlen(tbcon[i]))) {
X				/* This should never fail */
X				if ((i = speed(j)) != NULL) {
X					BR = j;
X					ttysetup(i);
X				} else {
X					printf("speed(%d) failed\n", j);
X					return 0;
X				}
X				goto ok;
X			}
X		}
X		for (i = 0; notbcon[i] != (char *)0; i++) {
X			if (!strncmp(buf1, notbcon[i], strlen(notbcon[i]))){
X				char	*bp, *cp;
X				for (bp = buf2, cp = notbcon[i]; *cp; cp++) {
X					if (*cp != '\r' && *cp != '\n')
X						*bp++ = *cp;
X				}
X				*bp = '\0';
X				goto error;
X			}
X		}
X		(void) strcpy(buf2, "UNKNOWN ERROR [");
X		(void) strcat(buf2, buf1);
X		(void) strcat(buf2, "]");
Xerror:
X		printf("dial failed (%s)\n", buf2);
X		sprintf(buf3, "dial failed (%s)", buf2);
X#ifdef ACULOG
X		logent(value(HOST), num, NAME, buf3);
X#endif
X		return 0;
X	}
Xok:
X	if (boolean(value(VERBOSE)))
X		printf("(%d baud) ", BR);
X	i = 2;
X#ifdef	USG
X	if (ioctl(FD, TCFLSH, i) < 0)
X		perror("tip: TCFLSH ioctl");
X#else	/* USG */
X	if (ioctl(FD, TIOCFLUSH, &i) < 0)
X		perror("tip: TIOCFLUSH ioctl");
X#endif	/* USG */
X	return 1;
X}
X
X
Xtb_disconnect()
X{
X#ifdef	USG
X	if (ioctl(FD, TCGETA, &termio) < 0)
X		perror("tip: TCGETA ioctl");
X	termio.c_cflag &= (CBAUD & B0);
X	if (ioctl(FD, TCSETA, &termio) < 0)
X		perror("tip: TCSETA ioctl");
X	sleep(2);
X#endif	/* USG */
X	(void) close(FD);
X}
X
X
Xtb_abort()
X{
X	tb_disconnect();
X}
X
XSTATIC
Xtbwrite(cp)
Xregister char	*cp;
X{
X	struct timeval t;
X
X	for (; *cp != '\0' ; cp++) {
X		if (write(FD, cp, 1) != 1) {
X			perror("tip: tbwrite: write error");
X			return;
X		}
X#ifdef	DEBUG
X		if (debug) {
X			fprintf(stderr, "written '%c'\n", *cp);
X		}
X#endif
X		t.tv_sec = 0;
X		t.tv_usec = (20 * 10 * 1000000)/BR;
X		(void) select(32, 0, 0, 0, &t);
X	}
X}
X
XSTATIC
Xtbread(buf, timeout, max)
Xregister char	*buf;
Xunsigned int timeout, max;
X{
X	int	alarmtr();
X	struct timeval t;
X	register char	*rp;
X	unsigned int numread, numprev = 0, numpndg = 0;
X	unsigned int toread;
X
X#ifdef	DEBUG
X	if (debug)
X		fprintf(stderr, "\n---------\nentering tbread(): timeout is: %d, max is: %d\n", timeout, max);
X#endif
X	rp = buf;
X	*rp = '\0';
X	(void) signal(SIGALRM, alarmtr);
X	if (setjmp(jmpbuf)) {
X		*rp = '\0';
X		return 0;
X	}
X	(void) alarm(timeout);
X		/* wait till modem says something or until timeout */
X	while (numpndg == 0 || numpndg != numprev) {
X		numprev = numpndg;
X		if (ioctl(FD, FIONREAD, &numpndg) == -1) {
X			perror("tip: FIONREAD ioctl");
X			return -1;
X		}
X		t.tv_sec = 0;
X		t.tv_usec = (100 * 10 * 1000000)/BR;
X		(void) select(32, 0, 0, 0, &t);
X	}
X	(void) alarm(0);
X#ifdef	DEBUG
X	if (debug)
X		fprintf(stderr, "number of chars waiting is: %d\n", numpndg);
X#endif
X	toread = ((numpndg > max) ? max : numpndg);
X  	if ((numread = read(FD, rp, toread)) < toread)
X		perror("read error");
X#ifdef	DEBUG
X	if (debug) {
X		int i; char *p;
X		fprintf(stderr, "read %d chars:", numread);
X		for (i=0, p=rp; i<numread; i++, p++)
X			fprintf(stderr, "%0.2x ", *p);
X		fprintf(stderr, "\n");
X		fflush(stderr);
X	}
X#endif
X	rp += numread;
X	*rp = '\0';
X#ifdef	DEBUG
X	if (debug) {
X		fprintf(stderr, "\nbuf contains: ->%s<-\n", buf);
X		fprintf(stderr, "leaving tbread()\n-----------\n");
X		fflush(stderr);
X	}
X#endif
X	return 1;
X}
X
X
XSTATIC
Xaccept(baudrate)
Xint	baudrate;
X{
X	int i;
X
X	BR = baudrate;
X	if ((i = speed(baudrate)) != NULL)
X		ttysetup(i);
X}
X
X
XSTATIC
Xalarmtr()
X{
X#ifdef	DEBUG
X	if (debug)
X		fprintf(stderr, "alarm went off!\n");
X#endif
X	longjmp(jmpbuf, 1);
X}
X
XSTATIC int
Xtbset(tosend, buf, num, errmsg)
Xchar	*tosend, *buf, *num, *errmsg;
X{
X	tbwrite(tosend);
X	tbread(buf, CMD_DELAY, (u_int) (sizeof MDM_OK) - 1);
X	if (strncmp(buf, MDM_OK, (sizeof MDM_OK) - 1) != 0) {
X		printf(" %s modem %s\n", NAME, errmsg);
X#ifdef ACULOG
X		logent(value(HOST), num, NAME, errmsg);
X#endif
X		return 0;
X	}
X	return 1;
X}
END_OF_FILE
if test 8131 -ne `wc -c <'pf-bootstrap-v1.1a/tipx-p1/libacu/telebit.c'`; then
    echo shar: \"'pf-bootstrap-v1.1a/tipx-p1/libacu/telebit.c'\" unpacked with wrong size!
fi
# end of 'pf-bootstrap-v1.1a/tipx-p1/libacu/telebit.c'
fi
if test -f 'pf-bootstrap-v1.1a/tipx-p1/page.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'pf-bootstrap-v1.1a/tipx-p1/page.c'\"
else
echo shar: Extracting \"'pf-bootstrap-v1.1a/tipx-p1/page.c'\" \(5957 characters\)
sed "s/^X//" >'pf-bootstrap-v1.1a/tipx-p1/page.c' <<'END_OF_FILE'
X#ifndef lint
Xstatic char *sccsid = "@(#)page.c	1.4	MS/ACF	89/05/08";
X#endif
X
X/*
X *	tip/page.c	(Douglas Kingston, Morgan Stanley & Co.)
X *
X *	This file contains code to send alphanumeric pages via
X *	dialup paging services that support "Remote Entry Device
X *	Protocol" (aka "IXO").  These services typically send to
X *	devices like the Motorola PMR-2000 pager.
X *
X *	This module is designed to use the ACK/NAK packet protocol
X *	to ensure the highest likelyhood of correct delivery of the
X *	message.  The packets are checksummed and all messages are
X *	acknowledged by the receiver.
X *
X *	To use this facility, tip must be called with the -p option,
X *	a system name (what system to dial up) and finally a data
X *	string which contains 3 items:  A login code/password, a list
X *	pager id's to receive the message, and the message text.
X *	The three fields are separated by tabs.  The pager id field
X *	is further subdivided into a list of pager ids by commas.
X *
X *	For example:
X *	tip -p metro "12345678\t20001,20002\tPlease call the office."
X *
X *	Would call the system called "metro" as listed in /etc/remote
X *	and login with the ID 12345678.  The message "Please call
X *	the office." would be sent to pagers 20001 and 20002.
X *
X *	This code has been tested only on the Metromedia Paging Services
X *	system around New York City, though it should work on other
X *	similiar systems.
X *
X *	Douglas Kingston
X *	Morgan Stanley & Co. (19th Floor)
X *	1251 Avenue of the Americas
X *	NY, NY, 10020
X */
X
X#include <stdio.h>
X#include <ctype.h>
X#include <signal.h>
X#include <sys/time.h>
X#include "tip.h"
X
X#define STX	002
X#define	ETX	003
X#define	EOT	004
X#define	ACK	006
X#define	NAK	025
X#define	ETB	027
X#define	ESC	033
X#define	RS	036
X
Xextern int vflag, FD;
Xextern jmp_buf	jmpbuf;
X
Xextern char *strchr();
Xextern int recvtimeout();
X
Xchar	inbuf[270];
Xchar	mbuf[32];
Xchar	packet[270];
X
Xstatic char *addstr();
X
Xsendpage(data)
Xchar *data;
X{
X	int ret = 1;
X	int trys, i;
X	char *cp, *pager, *message;
X
X	if (boolean(value(VERBOSE)))
X		vflag++;
X	if (vflag)
X		fputs("[Connected]\n", stderr);
X
X	cp = data;
X	if (pager = strchr(data, '\t')) {
X		*pager = 0;
X		pager++;
X	} else {
X		fprintf(stderr, "Bad paging data: '%s'\n", data);
X		return(1);
X	}
X
X	trys = 0;
X	do {
X		if (trys++ > 3) {
X			fprintf(stderr, "ID= retries failed\n");
X			goto done;
X		}
X		if (pgsend("\r"))
X			return(1);
X	} while (pgrecv("ID=", 5) < 3);
X
X	trys = 0;
Xlogin_again:
X
X	if (pgsend("\033") || pgsend(cp) || pgsend("\r"))
X		return(1);
X
X	/* Wait for ACK, NAK, EOT or Ready(?) */
X	if (pgrecv("\r", 10) <= 0) {
X		fprintf(stderr, "login timeout\n");
X		goto done;
X	}
X	switch(inbuf[0]) {
X	default:	if (trys++ < 4) goto login_again; else goto done;
X	case ACK:	break;
X	case NAK:	if (trys++ < 4) goto login_again; else goto done;
X	case RS:	fprintf(stderr, "login got RS\n"); goto done;
X	case ESC:
X		switch(inbuf[1]) {
X		case EOT:	goto done;
X		case '[':	if(inbuf[2] == 'p') break;
X		default:	fprintf(stderr, "got unknown ESC code\n");
X				goto login_again;
X		}
X	}
X	pgrecv("\r", 10);	/* Swallow Go Ahead <ESC>[p */
X
X	if (message = strchr(pager, '\t')) {
X		*message = 0;
X		message++;
X	} else
X		message = "[Message not specified]";
Xnext_pager:
X	if (cp = strchr(pager, ','))
X		*cp++ = 0;
X	buildpkt(pager, message);
X
X	trys = 0;
Xresend:
X	if (pgsend(packet))
X		return(1);
X	pgrecv("^C\r\n", 10);	/* ^C\r\n */
X
X	/* Wait for ACK, NAK, EOT or Ready(?) */
X	if ((i = pgrecv("\r", 10)) <= 0) {
X		fprintf(stderr, "page send no reply\n");
X		goto done;
X	}
X	switch(inbuf[i-2]) {
X	default:	fprintf(stderr, "page send reply error\n");
X			goto done;
X	case ACK:	ret = 0; goto sent;
X	case NAK:	if (trys++ < 4) goto resend; else goto done;
X	case RS:	fprintf(stderr, "page send got RS\n"); goto done;
X	case ESC:
X		switch(inbuf[1]) {
X		case EOT:	goto done;
X		case '[':	if(inbuf[2] == 'p') { ret = 1; goto sent; }
X		default:	fprintf(stderr, "got unknown ESC code\n");
X				goto done;
X		}
X	}
Xsent:
X	if(cp) {
X		pager = cp;
X		goto next_pager;
X	}
X
Xdone:
X	/* Logout: EOT CR */
X	if (pgsend("\004\r"))
X		return(ret);
X	pgrecv("\r", 3);
X	fputs(ret ? "[Error in delivery]\n" : inbuf, stderr);
X	pgrecv("\r", 3);
X	return(ret);
X}
X
Xpgsend(cp)
Xchar *cp;
X{
X	int	i, len = strlen(cp);
X
X	nap(40);
X	if(vflag)
X		fprintf(stderr, "sending: ");
X	for (i = 0; i < len; i++) {
X		nap(75);
X		if(vflag)
X			show(cp, 1, stderr);
X		if (write(FD, cp, 1) != 1) {
X			fprintf(stderr, "pgsend error\n");
X			return(-1);
X		}
X		cp++;
X	}
X	if(vflag)
X		fputc('\n', stderr);
X	return(0);
X}
X
Xpgrecv(want, secs)
Xchar *want;
Xint secs;
X{
X	jmp_buf savebuf;
X	int i, size;
X	char *cp, *endcp;
X	
X	bcopy(jmpbuf, savebuf, sizeof(jmpbuf));
X	if (setjmp(jmpbuf)) {
X		if(vflag)
X			fprintf(stderr, "\nrecv: timeout\n");
X		bcopy(savebuf, jmpbuf, sizeof(jmpbuf));
X		return(0);
X	}
X	signal(SIGALRM, recvtimeout);
X	alarm(secs);
X
X	size = strlen(want);
X	if(vflag) {
X		fprintf(stderr, "recv (want ");
X		show(want, size, stderr);
X		fprintf(stderr, "/%d): ", size);
X	}
X	i = size-1;
X
X	cp = inbuf; endcp = inbuf+sizeof(inbuf)-1;
X	*cp = 0;
X	mbuf[0] = 0;
X	while (strncmp(mbuf, want, size) != 0 && cp < endcp) {
X		bcopy(mbuf+1, mbuf, size);
X		if (read(FD, &mbuf[i], 1) != 1)
X			goto readerror;
X		mbuf[i] &= 0177;
X		*cp++ = mbuf[i];
X		*cp = 0;
X		if(vflag)
X			show(&mbuf[i], 1, stderr);
X	}
X	alarm(0);
X	bcopy(savebuf, jmpbuf, sizeof(jmpbuf));
X	if (vflag)
X		fputs(" -- got it\n", stderr);
X	return(cp - inbuf);
Xreaderror:
X	alarm(0);
X	bcopy(savebuf, jmpbuf, sizeof(jmpbuf));
X	return(-1);
X}
X
Xbuildpkt(pager, message)
Xchar *pager, *message;
X{
X	char	*cp = &packet[0];
X	int	sum;
X
X	*cp++ = STX;
X	sum = STX;
X
X	cp = addstr(pager, &sum, cp);
X	cp = addstr(message, &sum, cp);
X
X	*cp++ = ETX;
X	sum += ETX;
X	*cp++ = '0' + ((sum>>8)&0xf);
X	*cp++ = '0' + ((sum>>4)&0xf);
X	*cp++ = '0' + (sum&0xf);
X	*cp++ = '\r';
X	*cp = 0;
X}
X
Xstatic char *
Xaddstr(s, sump, cp)
Xchar *s, *cp;
Xint *sump;
X{
X	char c;
X	int sum = *sump;
X
X	while(c = *s++) {
X		*cp = (isprint(c) ? c : '?');
X		sum += *cp;
X		cp++;
X	}
X	*cp++ = '\r';
X	sum += '\r';
X
X	*sump = sum;
X	return(cp);
X}
END_OF_FILE
if test 5957 -ne `wc -c <'pf-bootstrap-v1.1a/tipx-p1/page.c'`; then
    echo shar: \"'pf-bootstrap-v1.1a/tipx-p1/page.c'\" unpacked with wrong size!
fi
# end of 'pf-bootstrap-v1.1a/tipx-p1/page.c'
fi
if test -f 'pf-bootstrap-v1.1a/tipx-p1/tip.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'pf-bootstrap-v1.1a/tipx-p1/tip.h'\"
else
echo shar: Extracting \"'pf-bootstrap-v1.1a/tipx-p1/tip.h'\" \(7981 characters\)
sed "s/^X//" >'pf-bootstrap-v1.1a/tipx-p1/tip.h' <<'END_OF_FILE'
X/*
X * Copyright (c) 1983 The Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that the above copyright notice and this paragraph are
X * duplicated in all such forms and that any documentation,
X * advertising materials, and other materials related to such
X * distribution and use acknowledge that the software was developed
X * by the University of California, Berkeley.  The name of the
X * University may not be used to endorse or promote products derived
X * from this software without specific prior written permission.
X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X *
X *	@(#)tip.h	5.4 (Berkeley) 9/2/88
X */
X
X/*
X * tip - terminal interface program
X */
X
X#include <sys/types.h>
X#include <sys/file.h>
X
X#include <sgtty.h>
X#include <signal.h>
X#include <stdio.h>
X#include <pwd.h>
X#include <ctype.h>
X#include <setjmp.h>
X#include <errno.h>
X#include <netdb.h>
X#include <string.h>
X
X#if	defined(SUNOS4) || defined(__ANSI__) || defined(sparc)
Xtypedef void sigfunc_t;
X#else
Xtypedef int sigfunc_t;
X#endif
X
X/*
X * Remote host attributes
X */
Xchar	*DV;			/* UNIX device(s) to open */
Xchar	*EL;			/* chars marking an EOL */
Xchar	*CM;			/* initial connection message */
Xchar	*IE;			/* EOT to expect on input */
Xchar	*OE;			/* EOT to send to complete FT */
Xchar	*CU;			/* call unit if making a phone call */
Xchar	*AT;			/* acu type */
Xchar	*PN;			/* phone number(s) */
Xchar	*DI;			/* disconnect string */
Xchar	*PA;			/* parity to be generated */
X
Xchar	*PH;			/* phone number file */
Xchar	*RM;			/* remote file name */
Xchar	*HO;			/* host name */
X
Xchar	*SA;			/* local slip address */
Xchar	*DA;			/* destination slip address */
Xchar	*SM;			/* netmask for slip */
Xchar	*ST;			/* slip type */
Xchar	*LS;			/* login script file */
X
Xint	BR;			/* line speed for conversation */
Xint	FS;			/* frame size for transfers */
X
Xchar	DU;			/* this host is dialed up */
Xchar	HW;			/* this device is hardwired, see hunt.c */
Xchar	*ES;			/* escape character */
Xchar	*EX;			/* exceptions */
Xchar	*FO;			/* force (literal next) char*/
Xchar	*RC;			/* raise character */
Xchar	*RE;			/* script record file */
Xchar	*PR;			/* remote prompt */
Xint	DL;			/* line delay for file transfers to remote */
Xint	CL;			/* char delay for file transfers to remote */
Xint	ET;			/* echocheck timeout */
Xchar	HD;			/* this host is half duplex - do local echo */
X
X/*
X * String value table
X */
Xtypedef
X	struct {
X		char	*v_name;	/* whose name is it */
X		char	v_type;		/* for interpreting set's */
X		char	v_access;	/* protection of touchy ones */
X		char	*v_abrev;	/* possible abreviation */
X		char	*v_value;	/* casted to a union later */
X	}
X	value_t;
X
X#define STRING	01		/* string valued */
X#define BOOL	02		/* true-false value */
X#define NUMBER	04		/* numeric value */
X#define CHAR	010		/* character value */
X
X#define WRITE	01		/* write access to variable */
X#define	READ	02		/* read access */
X
X#define CHANGED	01		/* low bit is used to show modification */
X#define PUBLIC	1		/* public access rights */
X#define PRIVATE	03		/* private to definer */
X#define ROOT	05		/* root defined */
X
X#define	TRUE	1
X#define FALSE	0
X
X#define ENVIRON	020		/* initialize out of the environment */
X#define IREMOTE	040		/* initialize out of remote structure */
X#define INIT	0100		/* static data space used for initialization */
X#define TMASK	017
X
X/*
X * Definition of ACU line description
X */
Xtypedef
X	struct {
X		char	*acu_name;
X		int	(*acu_dialer)();
X		int	(*acu_disconnect)();
X		int	(*acu_abort)();
X	}
X	acu_t;
X
X#define	equal(a, b)	(strcmp(a,b)==0)/* A nice function to string compare */
X
X/*
X * variable manipulation stuff --
X *   if we defined the value entry in value_t, then we couldn't
X *   initialize it in vars.c, so we cast it as needed to keep lint
X *   happy.
X */
Xtypedef
X	union {
X		int	zz_number;
X		short	zz_boolean[2];
X		char	zz_character[4];
X		int	*zz_address;
X	}
X	zzhack;
X
X#define value(v)	vtable[v].v_value
X
X#define number(v)	((((zzhack *)(&(v))))->zz_number)
X#ifdef vax
X#define boolean(v)	((((zzhack *)(&(v))))->zz_boolean[0])
X#define character(v)	((((zzhack *)(&(v))))->zz_character[0])
X#else
X#define boolean(v)	((((zzhack *)(&(v))))->zz_boolean[1])
X#define character(v)	((((zzhack *)(&(v))))->zz_character[3])
X#endif
X#define address(v)	((((zzhack *)(&(v))))->zz_address)
X
X/*
X * Escape command table definitions --
X *   lookup in this table is performed when ``escapec'' is recognized
X *   at the begining of a line (as defined by the eolmarks variable).
X*/
X
Xtypedef
X	struct {
X		char	e_char;		/* char to match on */
X		char	e_flags;	/* experimental, priviledged */
X		char	*e_help;	/* help string */
X		int 	(*e_func)();	/* command */
X	}
X	esctable_t;
X
X#define NORM	00		/* normal protection, execute anyone */
X#define EXP	01		/* experimental, mark it with a `*' on help */
X#define PRIV	02		/* priviledged, root execute only */
X
Xextern int	vflag;		/* verbose during reading of .tiprc file */
Xextern value_t	vtable[];	/* variable table */
X
X#ifndef ACULOG
X#define logent(a, b, c, d)
X#define loginit()
X#endif
X
X/*
X * Definition of indices into variable table so
X *  value(DEFINE) turns into a static address.
X */
X
X#define BEAUTIFY	0
X#define BAUDRATE	1
X#define DIALTIMEOUT	2
X#define EOFREAD		3
X#define EOFWRITE	4
X#define EOL		5
X#define ESCAPE		6
X#define EXCEPTIONS	7
X#define FORCE		8
X#define FRAMESIZE	9
X#define HOST		10
X#define LOG		11
X#define PHONES		12
X#define PROMPT		13
X#define RAISE		14
X#define RAISECHAR	15
X#define RECORD		16
X#define REMOTE		17
X#define SCRIPT		18
X#define TABEXPAND	19
X#define VERBOSE		20
X#define SHELL		21
X#define HOME		22
X#define ECHOCHECK	23
X#define DISCONNECT	24
X#define TAND		25
X#define LDELAY		26
X#define CDELAY		27
X#define ETIMEOUT	28
X#define RAWFTP		29
X#define HALFDUPLEX	30
X#define	LECHO		31
X#define	PARITY		32
X#define	SLIPADDR	33
X#define SLIPDSTADDR	34
X#define	SLIPMASK	35
X#define	SLIPTYPE	36
X#define LOGINSCRIPT	37
X#define	SETROUTE	38
X#define LINESYNC        39
X#define DTRHUP		40
X
X#define NOVAL	((value_t *)NULL)
X#define NOACU	((acu_t *)NULL)
X#define NOSTR	((char *)NULL)
X#define NOFILE	((FILE *)NULL)
X#define NOPWD	((struct passwd *)0)
X
Xstruct sgttyb	arg;		/* current mode of local terminal */
Xstruct sgttyb	defarg;		/* initial mode of local terminal */
Xstruct tchars	tchars;		/* current state of terminal */
Xstruct tchars	defchars;	/* initial state of terminal */
Xstruct ltchars	ltchars;	/* current local characters of terminal */
Xstruct ltchars	deflchars;	/* initial local characters of terminal */
X
XFILE	*fscript;		/* FILE for scripting */
X
Xint	fildes[2];		/* file transfer synchronization channel */
Xint	repdes[2];		/* read process sychronization channel */
Xint	FD;			/* open file descriptor to remote host */
Xint	AC;			/* open file descriptor to dialer (v831 only) */
Xint	vflag;			/* print .tiprc initialization sequence */
Xint	sfd;			/* for ~< operation */
Xint	pid;			/* pid of tipout */
Xuid_t	uid, euid;		/* real and effective user id's */
Xgid_t	gid, egid;		/* real and effective group id's */
Xint	stop;			/* stop transfer session flag */
Xint	quit;			/* same; but on other end */
Xint	stoprompt;		/* for interrupting a prompt session */
Xint	timedout;		/* ~> transfer timedout */
Xint	cumode;			/* simulating the "cu" program */
Xint	slip;			/* bring up SLIP on the line */
X
Xchar	fname[80];		/* file name buffer for ~< */
Xchar	copyname[80];		/* file name buffer for ~> */
Xchar	ccc;			/* synchronization character */
Xchar	uucplock[];		/* name of lock file for uucp's */
X
Xint	odisc;				/* initial tty line discipline */
Xextern	int disc;			/* current tty discpline */
X
Xextern	char *ctrl();
Xextern	char *ctime();
Xextern	long time();
Xextern	struct passwd *getpwuid();
Xextern	char *getlogin();
Xextern	char *vinterp();
Xextern	char *getenv();
Xextern	char *rindex();
Xextern	char *index();
Xextern	char *malloc();
Xextern	char *lconnect();
X
X#undef CTRL
X#define	CTRL(c)	((c)&037)
END_OF_FILE
if test 7981 -ne `wc -c <'pf-bootstrap-v1.1a/tipx-p1/tip.h'`; then
    echo shar: \"'pf-bootstrap-v1.1a/tipx-p1/tip.h'\" unpacked with wrong size!
fi
# end of 'pf-bootstrap-v1.1a/tipx-p1/tip.h'
fi
if test -f 'pf-bootstrap-v1.1a/xmodem-3.9/xmodem.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'pf-bootstrap-v1.1a/xmodem-3.9/xmodem.c'\"
else
echo shar: Extracting \"'pf-bootstrap-v1.1a/xmodem-3.9/xmodem.c'\" \(8438 characters\)
sed "s/^X//" >'pf-bootstrap-v1.1a/xmodem-3.9/xmodem.c' <<'END_OF_FILE'
X/*
X *  XMODEM -- Implements the Christensen XMODEM protocol, 
X *            for packetized file up/downloading.    
X *
X *	See the README file for some notes on SYS V adaptations.
X *	The program has been successfully run on VAXes (4.3BSD) and SUN-3/4s
X *	(SunOS 3.x) against MEX-PC and ZCOMM/DSZ.
X *
X *  See the README and update.doc files for history and change notes.
X *
X *  Please send bug fixes, additions and comments to:
X *	grandi@noao.edu
X */
X
X#include "xmodem.h"
X
Xmain(argc, argv)
Xint argc;
Xchar **argv;
X{
X	char *getenv();
X	FILE *fopen();
X	char *unix_cpm();
X	char *strcpy();
X	char *strcat();
X	char *prtype();
X	
X	char *fname = filename;		/* convenient place to stash file names */
X	char *logfile = "xmodem.log";	/* Name of LOG File */
X	
X	char *stamptime();		/* for timestamp */
X
X	char *defname = "xmodem.in";	/* default file name if none given */
X
X	struct stat filestatbuf;	/* file status info */
X
X	int index;
X	char flag;
X	long expsect;
X	int fd;
X
X	/* initialize option flags */
X
X	XMITTYPE = 't';		/* assume text transfer */
X	DEBUG = FALSE;		/* keep debugging info in log */
X	RECVFLAG = FALSE;	/* not receive */
X	SENDFLAG = FALSE;	/* not send either */
X	BATCH = FALSE;		/* nor batch */
X	CRCMODE = FALSE;	/* use checksums for now */
X	DELFLAG = FALSE;	/* don't delete old log file */
X	LOGFLAG = FALSE;	/* keep log */
X	LONGPACK = FALSE; 	/* do not use long packets on transmit */
X	MDM7BAT = FALSE;	/* no MODEM7 batch mode */
X	YMDMBAT = FALSE;	/* no YMODEM batch mode */
X	TOOBUSY = FALSE;	/* not too busy for sleeping in packet read */
X	TIPFLAG = FALSE;	/* no special logging on stderr */
X	DELAYFLAG = FALSE;	/* don't delay startup for a while */
X	NOEOT = FALSE;		/* don't suppress EOT verification */
X	CANCAN = FALSE;		/* don't allow CAN-CAN aborts in mid-transfer */
X	YMODEMG = FALSE;	/* no YMODEM-G */
X
X	fprintf(stderr, "XMODEM Version %s", VERSION);
X	fprintf(stderr, " -- UNIX-Microcomputer File Transfer Facility\n");
X
X	if (argc == 1)
X		{
X		help();
X		exit(-1);
X		}
X
X	index = 0;		/* set index for flag loop */
X
X	stopsig();		/* suppress keyboard stop signal */
X
X	while ((flag = argv[1][index++]) != '\0')
X	    switch (flag) {
X		case '-' : break;
X		case 'X' :
X		case 'x' : DEBUG = TRUE;  /* turn on debugging log */
X			   break;
X		case 'C' :
X		case 'c' : CRCMODE = TRUE; /* enable CRC on receive */
X			   break;
X		case 'D' :
X		case 'd' : DELFLAG = TRUE;  /* delete log file */
X			   break;
X		case 'L' :
X		case 'l' : LOGFLAG = FALSE;  /* turn off log  */
X			   break;
X		case 'm' :
X		case 'M' : MDM7BAT = TRUE;  /* turn on MODEM7 batch protocol */
X			   BATCH   = TRUE;
X			   break;
X		case 'y' :
X		case 'Y' : YMDMBAT = TRUE;  /* turn on YMODEM batch protocol */
X			   BATCH   = TRUE;
X			   break;
X		case 'k' :
X		case 'K' : LONGPACK = TRUE;  /* use 1K packets on transmit */
X			   break;
X		case 't' :
X		case 'T' : TOOBUSY = TRUE;  /* turn off sleeping */
X			   break;
X		case 'p' :
X		case 'P' : TIPFLAG = TRUE;  /* turn on special handling for SunOS tip */
X			   break;
X		case 'w' :
X		case 'W' : DELAYFLAG = TRUE;  /* delay startup */
X			   break;
X		case 'e' :
X		case 'E' : NOEOT = TRUE;  /* turn off EOT verification */
X			   break;
X		case 'n' :
X		case 'N' : CANCAN = TRUE;  /* allow mid-transfer CAN-CAN */
X			   break;
X		case 'g' :
X		case 'G' : YMODEMG = TRUE;  /* YMODEM-G mode */
X			   CANCAN = TRUE;
X			   CRCMODE = TRUE;
X			   YMDMBAT = TRUE;
X			   break;
X		case 'R' :
X		case 'r' : RECVFLAG = TRUE;  /* receive file */
X			   XMITTYPE = gettype(argv[1][index++]);  /* get t/b */
X			   break;
X		case 'S' :
X		case 's' : SENDFLAG = TRUE;  /* send file */
X			   XMITTYPE = gettype(argv[1][index++]);
X			   break;
X		default  : fprintf(stderr, "Invalid Flag %c ignored\n", flag);
X			   break;
X	   }
X
X	if (DEBUG)
X		LOGFLAG = TRUE;
X
X	if (LOGFLAG)
X	   { 
X	     if ((fname = getenv("HOME")) == 0)	/* Get HOME variable */
X		error("XMODEM Fatal Error- Can't get Environment!", FALSE);
X	     fname = strcat(fname, "/");
X	     fname = strcat(fname, logfile);
X	     if (!DELFLAG)
X		LOGFP = fopen(fname, "a");  /* append to LOG file */
X	     else
X		LOGFP = fopen(fname, "w");  /* new LOG file */
X	     if (!LOGFP)
X		error("XMODEM Fatal Error- Can't Open Log File", FALSE);
X
X	     fprintf(LOGFP,"\n++++++++  %s", stamptime());
X	     fprintf(LOGFP,"XMODEM Version %s\n", VERSION);
X	     fprintf(LOGFP,"Command line: %s %s", argv[0], argv[1]);
X	     for (index=2; index<argc; ++index)
X		fprintf(LOGFP, " %s", argv[index]);
X	     fprintf(LOGFP, "\n");
X	   }
X
X	getspeed();		/* get tty-speed for time estimates */
X
X	if (RECVFLAG && SENDFLAG)
X		error("XMODEM Fatal Error- Both Send and Receive Functions Specified", FALSE);
X
X	if (MDM7BAT && (YMDMBAT || YMODEMG))
X		error("XMODEM Fatal Error - Both YMODEM and MODEM7 Batch Protocols Specified", FALSE);
X
X	if (!RECVFLAG && !SENDFLAG)
X		error("XMODEM Fatal Error - Either Send or Receive Function must be chosen!",FALSE);
X	
X	if (SENDFLAG && argc==2)
X		error("XMODEM Fatal Error - No file specified to send",FALSE);
X
X	if (RECVFLAG && argc==2)
X		{
X		/* assume we really want CRC-16 in batch, unless we specify MODEM7 mode, unless we explicitly set CRCMODE */ 
X		if (!CRCMODE)
X			CRCMODE = MDM7BAT ? FALSE : TRUE;
X		fprintf(stderr, "Ready for BATCH RECEIVE");
X		fprintf(stderr, " in %s mode\n", prtype(XMITTYPE));
X		if (!TIPFLAG)
X			fprintf(stderr, "Send several Control-X characters to cancel\n");
X		logit("Batch Receive Started");
X		logitarg(" in %s mode\n", prtype(XMITTYPE));
X		strcpy(fname, defname);
X		}
X
X	if (RECVFLAG && argc>2)
X		{
X		if(open(argv[2], 0) != -1)  /* check for overwriting */
X			{
X			logit("Warning -- Target File Exists and is Being Overwritten\n");
X			fprintf(stderr, "Warning -- Target File Exists and is Being Overwritten\n");
X			}
X		fprintf(stderr, "Ready to RECEIVE File %s", argv[2]);
X		fprintf(stderr, " in %s mode\n", prtype(XMITTYPE));
X		if (!TIPFLAG)
X			fprintf(stderr, "Send several Control-X characters to cancel\n");
X		logitarg("Receiving in %s mode\n", prtype(XMITTYPE));
X		strcpy(fname,argv[2]);
X		}
X
X	if (RECVFLAG)
X		{  
X		if (DELAYFLAG)		/* delay if -w requested */
X			sleep(TIPDELAY);
X		setmodes();		/* set tty modes for transfer */
X
X		while(rfile(fname) != FALSE);  /* receive files */
X
X		flushin();
X		restoremodes(FALSE);	/* restore normal tty modes */
X
X		sleep(2);		/* give other side time to return to terminal mode */
X		exit(0);
X		}
X
X	if (SENDFLAG && BATCH) 
X		{
X		if (YMDMBAT)
X			{
X			ytotleft = 0l;
X			yfilesleft = 0;
X			for (index=2; index<argc; index++) {
X				if (stat(argv[index], &filestatbuf) == 0) {
X					yfilesleft++;
X					ytotleft += filestatbuf.st_size;
X					if (XMITTYPE == 't') {
X						if((fd=open(argv[index],0)) >= 0) {
X							ytotleft += countnl(fd);
X							close(fd);
X							}
X						}
X					}
X				}
X			if (DEBUG)
X				fprintf(LOGFP, "DEBUG YMODEM file count: %d, %ld bytes\n", yfilesleft, ytotleft);
X
X			fprintf(stderr, "Ready to YMODEM BATCH SEND");
X			fprintf(stderr, " in %s mode\n", prtype(XMITTYPE));
X			logit("YMODEM Batch Send Started");
X			logitarg(" in %s mode\n", prtype(XMITTYPE));
X			}
X		else if (MDM7BAT)
X			{
X			fprintf(stderr, "Ready to MODEM7 BATCH SEND");
X			fprintf(stderr, " in %s mode\n", prtype(XMITTYPE));
X			logit("MODEM7 Batch Send Started");
X			logitarg(" in %s mode\n", prtype(XMITTYPE));
X			}
X		if (!TIPFLAG)
X			fprintf(stderr, "Send several Control-X characters to cancel\n");
X
X		if (DELAYFLAG)		/* delay if -w requested */
X			sleep(TIPDELAY);
X		setmodes();
X		for (index=2; index<argc; index++) {
X			if (stat(argv[index], &filestatbuf) < 0) {
X				logitarg("\nFile %s not found\n", argv[index]);
X				tlogitarg("\nFile %s not found\n", argv[index]);
X				continue;
X			}
X			sfile(argv[index]);
X		}
X		sfile("");
X		flushin();
X		restoremodes(FALSE);
X
X		logit("Batch Send Complete\n");
X		tlogit("Batch Send Complete\n");
X		sleep(2);
X		exit (0);
X		}
X
X	if (SENDFLAG && !BATCH) 
X		{
X		if (stat(argv[2], &filestatbuf) < 0)
X			error("Can't find requested file", FALSE);
X		expsect = (filestatbuf.st_size/128)+1;
X			
X		fprintf(stderr, "File %s Ready to SEND", argv[2]);
X		fprintf(stderr, " in %s mode\n", prtype(XMITTYPE));
X		fprintf(stderr, "Estimated File Size %ldK, %ld Sectors, %ld Bytes\n",
X	    	  (filestatbuf.st_size/1024)+1, expsect,
X	  	  filestatbuf.st_size);
X		projtime(expsect, stdout);
X		if (!TIPFLAG)
X			fprintf(stderr, "Send several Control-X characters to cancel\n");
X		logitarg("Sending in %s mode\n", prtype(XMITTYPE));
X
X		setmodes();
X		sfile(argv[2]);
X		flushin();
X		restoremodes(FALSE);
X
X		sleep(2);
X		exit(0);
X		}
X}
END_OF_FILE
if test 8438 -ne `wc -c <'pf-bootstrap-v1.1a/xmodem-3.9/xmodem.c'`; then
    echo shar: \"'pf-bootstrap-v1.1a/xmodem-3.9/xmodem.c'\" unpacked with wrong size!
fi
# end of 'pf-bootstrap-v1.1a/xmodem-3.9/xmodem.c'
fi
echo shar: End of archive 4 \(of 9\).
cp /dev/null ark4isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 9 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0