[comp.sources.misc] v16i039: ECU async comm package rev 3.0, Part15/35

wht@n4hgf.uucp (Warren Tucker) (01/06/91)

Submitted-by: wht@n4hgf.uucp (Warren Tucker)
Posting-number: Volume 16, Issue 39
Archive-name: ecu3/part15

---- Cut Here and feed the following to sh ----
#!/bin/sh
# This is part 15 of ecu3
if touch 2>&1 | fgrep 'amc' > /dev/null
 then TOUCH=touch
 else TOUCH=true
fi
# ============= regexp.c ==============
echo 'x - extracting regexp.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'regexp.c' &&
X/*+-------------------------------------------------------------------------
X	regexp.c -- regular expression functions made sane
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
X
X#include <stdio.h>
X#include "stdio_lint.h"
X#include "lint_args.h"
X#include "ecuerror.h"
X#include "esd.h"
X#include "var.h"
X#include <setjmp.h>
X
X#define	CBRA	2
X#define	CCHR	4
X#define	CDOT	8
X#define	CCL	12
X#define	CDOL	20
X#define	CCEOF	22
X#define	CKET	24
X#define	CBACK	36
X
X#define	STAR	01
X#define	RNGE	03
X
X#define	NBRA	9
X
X#define	PLACE(c)	ep[c >> 3] |= bittab[c & 07]
X#define	ISTHERE(c)	(ep[c >> 3] & bittab[c & 07])
X
Xvoid getrnge();
X
Xextern int proctrace;
Xextern int proc_level;
X
Xchar *braslist[NBRA];
Xchar *braelist[NBRA];
Xint nbra,ebra;
Xchar *match_start,*match_end,*locs;
Xint sed;
Xint nodelim;
Xint circf;
Xint low;
Xint size;
X
Xchar bittab[] = { 1,2,4,8,16,32,64,128 };
X
Xjmp_buf	compile_error_jmpbuf;
X
Xvoid
Xcompile(pattern,ep,endbuf,seof)
Xregister char *ep;
Xchar *pattern,*endbuf;
X{
X	register char *sp = pattern;
X	register c;
X	register eof = seof;
X	char *lastep = pattern;
X	int cclcnt;
X	char bracket[NBRA],*bracketp;
X	int closed;
X	char neg;
X	int lc;
X	int i,cflg;
X
X	lastep = 0;
X	if((c = *sp++) == eof || c == '\n')
X	{
X		if(c == '\n')
X		{
X			--sp;
X			nodelim = 1;
X		}
X		if(*ep == 0 && !sed)
X			longjmp(compile_error_jmpbuf,41);
X		return;
X	}
X	bracketp = bracket;
X	circf = closed = nbra = ebra = 0;
X	if(c == '^')
X		circf++;
X	else
X		--sp;
X	while(1)
X	{
X		if(ep >= endbuf)
X			longjmp(compile_error_jmpbuf,50);
X		c = *sp++;
X		if(c != '*' && ((c != '\\') || (*sp != '{')))
X			lastep = ep;
X		if(c == eof)
X		{
X			*ep++ = CCEOF;
X			return;
X		}
X		switch(c)
X		{
X
X		case '.':
X			*ep++ = CDOT;
X			continue;
X
X		case '\n':
X			if(!sed)
X			{
X				--sp;
X				*ep++ = CCEOF;
X				nodelim = 1;
X				return;
X			}
X			else longjmp(compile_error_jmpbuf,36);
X		case '*':
X			if(lastep==0 || *lastep==CBRA || *lastep==CKET)
X				goto defchar;
X			*lastep |= STAR;
X			continue;
X
X		case '$':
X			if(*sp != eof && *sp != '\n')
X				goto defchar;
X			*ep++ = CDOL;
X			continue;
X
X		case '[':
X			if(&ep[17] >= endbuf)
X				longjmp(compile_error_jmpbuf,50);
X
X			*ep++ = CCL;
X			lc = 0;
X			for(i = 0; i < 16; i++)
X				ep[i] = 0;
X
X			neg = 0;
X			if((c = *sp++) == '^')
X			{
X				neg = 1;
X				c = *sp++;
X			}
X
X			do 
X			{
X				if(c == '\0' || c == '\n')
X					longjmp(compile_error_jmpbuf,49);
X				if(c == '-' && lc != 0)
X				{
X					if((c = *sp++) == ']')
X					{
X						PLACE('-');
X						break;
X					}
X					while(lc < c)
X					{
X						PLACE(lc);
X						lc++;
X					}
X				}
X				if(c == '\\')
X				{
X					switch(c = *sp++)
X					{
X					case 'n':
X						c = '\n';
X						break;
X					}
X				}
X				lc = c;
X				PLACE(c);
X			} while((c = *sp++) != ']');
X			if(neg)
X			{
X				for(cclcnt = 0; cclcnt < 16; cclcnt++)
X					ep[cclcnt] ^= -1;
X				ep[0] &= 0376;
X			}
X
X			ep += 16;
X
X			continue;
X
X		case '\\':
X			switch(c = *sp++)
X			{
X
X			case '(':
X				if(nbra >= NBRA)
X					longjmp(compile_error_jmpbuf,43);
X				*bracketp++ = nbra;
X				*ep++ = CBRA;
X				*ep++ = nbra++;
X				continue;
X
X			case ')':
X				if(bracketp <= bracket || ++ebra != nbra)
X					longjmp(compile_error_jmpbuf,42);
X				*ep++ = CKET;
X				*ep++ = *--bracketp;
X				closed++;
X				continue;
X
X			case '{':
X				if(lastep == (char *) (0))
X					goto defchar;
X				*lastep |= RNGE;
X				cflg = 0;
Xnlim:
X				c = *sp++;
X				i = 0;
X				do 
X				{
X					if('0' <= c && c <= '9')
X						i = 10 * i + c - '0';
X					else
X						longjmp(compile_error_jmpbuf,16);
X				} while(((c = *sp++) != '\\') && (c != ','));
X				if(i >= 255)
X					longjmp(compile_error_jmpbuf,11);
X				*ep++ = i;
X				if(c == ',')
X				{
X					if(cflg++)
X						longjmp(compile_error_jmpbuf,44);
X					if((c = *sp++) == '\\')
X						*ep++ = 255;
X					else 
X					{
X						--sp;
X						goto nlim;
X						/* get 2'nd number */
X					}
X				}
X				if(*sp++ != '}')
X					longjmp(compile_error_jmpbuf,45);
X				if(!cflg)	/* one number */
X					*ep++ = i;
X				else if((ep[-1] & 0377) < (ep[-2] & 0377))
X					longjmp(compile_error_jmpbuf,46);
X				continue;
X
X			case '\n':
X				longjmp(compile_error_jmpbuf,36);
X
X			case 'n':
X				c = '\n';
X				goto defchar;
X
X			default:
X				if(c >= '1' && c <= '9')
X				{
X					if((c -= '1') >= closed)
X						longjmp(compile_error_jmpbuf,25);
X					*ep++ = CBACK;
X					*ep++ = c;
X					continue;
X				}
X			}
X			/* Drop through to default to use \ to turn off special chars */
X
Xdefchar:
X		default:
X			lastep = ep;
X			*ep++ = CCHR;
X			*ep++ = c;
X		}
X	}
X}
X
Xstep(p1,p2)
Xregister char *p1,*p2;
X{
X	register c;
X
X	if(circf)
X	{
X		match_start = p1;
X		return(advance(p1,p2));
X	}
X	/* fast check for first character */
X	if(*p2==CCHR)
X	{
X		c = p2[1];
X		do 
X		{
X			if(*p1 != c)
X				continue;
X			if(advance(p1,p2))
X			{
X				match_start = p1;
X				return(1);
X			}
X		} while(*p1++);
X		return(0);
X	}
X	/* regular algorithm */
X	do 
X	{
X		if(advance(p1,p2))
X		{
X			match_start = p1;
X			return(1);
X		}
X	} while(*p1++);
X	return(0);
X}
X
Xadvance(lp,ep)
Xregister char *lp,*ep;
X{
X	register char *curlp;
X	char c;
X	char *bbeg;
X	int ct;
X
X	while(1)
X		switch(*ep++)
X		{
X
X		case CCHR:
X			if(*ep++ == *lp++)
X				continue;
X			return(0);
X
X		case CDOT:
X			if(*lp++)
X				continue;
X			return(0);
X
X		case CDOL:
X			if(*lp==0)
X				continue;
X			return(0);
X
X		case CCEOF:
X			match_end = lp;
X			return(1);
X
X		case CCL:
X			c = *lp++ & 0177;
X			if(ISTHERE(c))
X			{
X				ep += 16;
X				continue;
X			}
X			return(0);
X		case CBRA:
X			braslist[*ep++] = lp;
X			continue;
X
X		case CKET:
X			braelist[*ep++] = lp;
X			continue;
X
X		case CCHR|RNGE:
X			c = *ep++;
X			getrnge(ep);
X			while(low--)
X				if(*lp++ != c)
X					return(0);
X			curlp = lp;
X			while(size--)
X				if(*lp++ != c)
X					break;
X			if(size < 0)
X				lp++;
X			ep += 2;
X			goto star;
X
X		case CDOT|RNGE:
X			getrnge(ep);
X			while(low--)
X				if(*lp++ == '\0')
X					return(0);
X			curlp = lp;
X			while(size--)
X				if(*lp++ == '\0')
X					break;
X			if(size < 0)
X				lp++;
X			ep += 2;
X			goto star;
X
X		case CCL|RNGE:
X			getrnge(ep + 16);
X			while(low--)
X			{
X				c = *lp++ & 0177;
X				if(!ISTHERE(c))
X					return(0);
X			}
X			curlp = lp;
X			while(size--)
X			{
X				c = *lp++ & 0177;
X				if(!ISTHERE(c))
X					break;
X			}
X			if(size < 0)
X				lp++;
X			ep += 18;		/* 16 + 2 */
X			goto star;
X
X		case CBACK:
X			bbeg = braslist[*ep];
X			ct = braelist[*ep++] - bbeg;
X
X			if(ecmp(bbeg,lp,ct))
X			{
X				lp += ct;
X				continue;
X			}
X			return(0);
X
X		case CBACK|STAR:
X			bbeg = braslist[*ep];
X			ct = braelist[*ep++] - bbeg;
X			curlp = lp;
X			while(ecmp(bbeg,lp,ct))
X				lp += ct;
X
X			while(lp >= curlp)
X			{
X				if(advance(lp,ep))	return(1);
X				lp -= ct;
X			}
X			return(0);
X
X
X		case CDOT|STAR:
X			curlp = lp;
X			while(*lp++);
X			goto star;
X
X		case CCHR|STAR:
X			curlp = lp;
X			while(*lp++ == *ep);
X			ep++;
X			goto star;
X
X		case CCL|STAR:
X			curlp = lp;
X			do 
X			{
X				c = *lp++ & 0177;
X			} while(ISTHERE(c));
X			ep += 16;
X			goto star;
X
Xstar:
X			do 
X			{
X				if(--lp == locs)
X					break;
X				if(advance(lp,ep))
X					return(1);
X			} while(lp > curlp);
X			return(0);
X
X		}
X}
X
Xvoid
Xgetrnge(regexp)
Xregister char *regexp;
X{
X	low = *regexp++ & 0377;
X	size = ((*regexp & 0377) == 255) ? 20000 : (*regexp & 0377) - low;
X}
X
Xecmp(a,b,count)
Xregister char *a,*b;
Xregister count;
X{
X	while(count--)
X		if(*a++ != *b++)
X			return(0);
X	return(1);
X}
X
X/*+-------------------------------------------------------------------------
X	itmp = regexp_compile(regexp,cmpbuf,cmpbuf_size,emsg)
X
Xreturns 0 if no compile error,
Xelse error occurred (*emsg points to error message text)
X--------------------------------------------------------------------------*/
Xint
Xregexp_compile(regexp,cmpbuf,cmpbuf_size,emsg)
Xchar *regexp;
Xchar *cmpbuf;
Xint cmpbuf_size;
Xchar **emsg;
X{
X	register int itmp;
X	static char errm[40];
X
X	if(itmp = setjmp(compile_error_jmpbuf))
X	{
X		switch(itmp)
X		{
X		case 11:
X			*emsg = "Range endpoint too large";
X			break;
X		case 16:
X			*emsg = "Bad number";
X			break;
X		case 25:
X			*emsg = "\"\\digit\" out of range";
X			break;
X		case 36:
X			*emsg = "Illegal or missing delimiter";
X			break;
X		case 41:
X			*emsg = "No previous regular expression";
X			break;
X		case 42:
X			*emsg = "More \\)'s than \\('s in regular expression";
X			break;
X		case 43:
X			*emsg = "More \\('s than \\)'s in regular expression";
X			break;
X		case 44:
X			*emsg = "More than 2 numbers in \\{ \\}";
X			break;
X		case 45:
X			*emsg = "} expected after \\";
X			break;
X		case 46:
X			*emsg = "First number exceeds second in \\{ \\}";
X			break;
X		case 49:
X			*emsg = "[] imbalance";
X			break;
X		case 50:
X			*emsg = "Regular expression too complex";
X			break;
X		default:
X			sprintf(errm,"Unknown regexp compile error %d",itmp);
X			*emsg = errm;
X			break;
X		}
X		return(itmp);
X	}
X
X	compile(regexp,cmpbuf,cmpbuf + cmpbuf_size,0);
X	return(0);
X}	/* end of regexp_compile */
X
X/*+-------------------------------------------------------------------------
X	regexp_scan(cmpbuf,str_to_search,&match,&matchlen)
Xreturn 1 if string match found, else 0
Xif string matches, match receives pointer to first byte, matchlen = length
Xof matching string
X--------------------------------------------------------------------------*/
Xregexp_scan(cmpbuf,str_to_search,match,matchlen)
Xchar *cmpbuf;
Xchar *str_to_search;
Xchar **match;
Xint *matchlen;
X{
X	register int itmp = step(str_to_search,cmpbuf);
X	if(itmp)
X	{
X		*match = match_start;
X		*matchlen = (int)(match_end - match_start);
X	}
X	return(itmp);
X}	/* end of regexp_scan */
X
X#define CMPBUF_SIZE	256
Xchar cmpbuf[CMPBUF_SIZE];
X
X/*+-------------------------------------------------------------------------
X	regexp_operation(match_str,regexp_str,rtn_value)
X--------------------------------------------------------------------------*/
Xint
Xregexp_operation(match_str,regexp_str,rtn_value)
Xchar *match_str;
Xchar *regexp_str;
Xlong *rtn_value;
X{
Xchar *emsg;
Xchar *match;
Xint matchlen;
X
X	if(regexp_compile(regexp_str,cmpbuf,sizeof(cmpbuf),&emsg))
X	{
X		pprintf("compile 1 error: %s\n",emsg);
X		return(eFATAL_ALREADY);
X	}
X
X	if(regexp_scan(cmpbuf,match_str,&match,&matchlen))
X	{
X		*rtn_value = (long)(match - match_str);
X		iv[0] = (long)matchlen;
X		if(proc_level && proctrace)
X			pprintf("%match set $i00 = %ld\n",iv[0]);
X	}
X	else
X		*rtn_value = -1;
X
X	return(0);
X}	/* end of regexp_operation */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of regexp.c */
SHAR_EOF
$TOUCH -am 1224224490 'regexp.c' &&
chmod 0644 regexp.c ||
echo 'restore of regexp.c failed'
Wc_c="`wc -c < 'regexp.c'`"
test 10229 -eq "$Wc_c" ||
	echo 'regexp.c: original size 10229, current size' "$Wc_c"
# ============= sysdep.c ==============
echo 'x - extracting sysdep.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'sysdep.c' &&
X/*+-------------------------------------------------------------------------
X	sysdep.c -- system dependency aid
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
X
X#include <stdio.h>
X
Xchar	*defines[] =
X{
X#if defined(M_UNIX)
X	"M_UNIX",
X#undef M_XENIX		/* <---------------------- */
X#endif
X#if defined(M_XENIX)
X	"M_XENIX",
X#endif
X#if defined(M_SYS5)
X	"M_SYS5",
X#endif
X#if defined(M_I386)
X	"M_I386",
X#endif
X#if defined(M_I286)
X	"M_I286",
X#endif
X#if defined(M_I186)
X	"M_I186",
X#endif
X#if defined(M_I8086)
X	"M_I8086",
X#endif
X#if defined(M_I86)
X	"M_I86",
X#endif
X#if defined(pyr)
X	"pyr",
X#endif
X#if defined(i386)
X	"i386",
X#endif
X#if defined(sun)
X	"sun",
X#endif
X#if defined(sun2)
X	"sun2,
X#endif
X#if defined(sun3)
X	"sun3",
X#endif
X#if defined(sun4)
X	"sun4",
X#endif
X#if defined(vax)
X	"vax",
X#endif
X#if defined(pdp11)
X	"pdp11",
X#endif
X#if defined(M_INTERNAT)
X	"M_INTERNAT",
X#endif
X	(char *)0
X};
X
X/*+-------------------------------------------------------------------------
X	pos_in_ztermed_list(test,list)
X--------------------------------------------------------------------------*/
Xint
Xpos_in_ztermed_list(test,list)
Xchar	*test;
Xchar	**list;
X{
X	register int itmp = 0;
X
X	while(*list)
X	{
X		if(!strcmp(*list++,test))
X			return(itmp);
X		itmp++;
X	}
X	return(-1);
X}	/* end of pos_in_ztermed_list */
X
X/*+-------------------------------------------------------------------------
X	main(argc,argv,envp)
X--------------------------------------------------------------------------*/
Xmain(argc,argv,envp)
Xint argc;
Xchar	**argv;
Xchar	**envp;
X{
Xregister int iargv;
Xchar **cpptr;
X
X	for(iargv = 1; iargv < argc; iargv++)
X	{
X		if(*argv[iargv] == '=')
X		{
X			if(pos_in_ztermed_list(argv[iargv] + 1,defines) >= 0)
X				break;
X		}
X	}
X	if(iargv == argc)
X	{
X		fprintf(stderr,"\n\nsysdep: no system match\n\n");
X		fprintf(stderr,"On this system, I recognize:\n");
X		cpptr = defines;
X		while(*cpptr)
X			fprintf(stderr,"    %s\n",*cpptr++);
X		fputs("\n",stderr);
X		exit(1);
X	}
X
X	while(++iargv <argc)
X	{
X		if(*argv[iargv] == '=')
X			break;
X		fputs(argv[iargv],stdout);
X		fputc(' ',stdout);
X	}
X	fputs("\n",stdout);
X	exit(0);
X}	/* end of main */
X
SHAR_EOF
$TOUCH -am 1224224490 'sysdep.c' &&
chmod 0644 sysdep.c ||
echo 'restore of sysdep.c failed'
Wc_c="`wc -c < 'sysdep.c'`"
test 2206 -eq "$Wc_c" ||
	echo 'sysdep.c: original size 2206, current size' "$Wc_c"
# ============= utmpstat.c ==============
echo 'x - extracting utmpstat.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'utmpstat.c' &&
X#if defined(SHARE_DEBUG)
X#define LOG_UTMP
X#endif
X/*+-------------------------------------------------------------------------
X	utmpstat.c - utmp status for XENIX/UNIX line
X	wht@n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	strcmpi(s1,s2)
X	utmp_status(line)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:10-16-1990-20:43-wht@n4hgf-add SHARE_DEBUG */
X/*:09-19-1990-19:36-wht@n4hgf-ecu_log_event now gets pid for log from caller */
X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
X
X#include "ecu.h"
X#include "ecuhangup.h"
X#include "utmpstatus.h"
X#include "ecuungetty.h"
X#include "dialprog.h"
X#include <errno.h>
X#include <utmp.h>
X
X#if !defined(ut_name)		/* nobody can keep their mind made up; ... */
X#define ut_name ut_user		/* ... this is getting verry difficult, very old */
X#endif
X
Xextern int errno;
X
Xchar *utmp_file = "/etc/utmp";
Xstruct utmp last_utmp;
X
X/*+-------------------------------------------------------------------------
X	strcmpi(s1,s2) - case-insensitive strcmp
XIn here rather than ecuutil.c since other executables besides ecu
Xuses this module and strcmpi needed there too 
X--------------------------------------------------------------------------*/
Xint
Xstrcmpi(s1,s2)
Xregister char *s1;
Xregister char *s2;
X{
Xregister char c1,c2;
X
X	for ( ; *s1 ; s1++, s2++)
X	{
X		if(isupper(*s1))
X			c1 = tolower(*s1);
X		else
X			c1 = *s1;
X		if(isupper(*s2))
X			c2 = tolower(*s2);
X		else
X			c2 = *s2;
X		if(c1 != c2)
X			break;
X	}
X	return (*s1 - *s2);
X}	/* end of strcmpi */
X
X/*+-------------------------------------------------------------------------
X	utmp_status(line) - check line status in utmp
X'line' is "/dev/ttyxx"-style
Xreturns US_ value and global utmp struct last_utmp;
X--------------------------------------------------------------------------*/
Xint
Xutmp_status(line)
Xchar *line;
X{
Xregister ufd;
Xregister itmp;
Xregister status = US_NOTFOUND;
X#if defined(LOG_UTMP)
Xchar logstr[128];
X#endif
X
X/*
X * crock/bozo alert: 
X * ut_name ain't but EIGHT characters long, but
X * EIGHT characters are often stored, so ya don't get no null
X * ut_id ain't but FOUR characters long, but
X * FOUR characters are routinely stored, so ya don't get no null
X */
Xchar namecopy[sizeof(last_utmp.ut_name) + 1];
Xchar idcopy[sizeof(last_utmp.ut_id) + 1];
X
X	if((ufd = open(utmp_file,O_RDONLY,755)) < 0)
X	{
X		perror(utmp_file);
X		hangup(HANGUP_LINE_OPEN_ERROR);
X	}
X
X	while(read(ufd,(char *)&last_utmp,sizeof(last_utmp)) > 0)
X	{
X		strncpy(namecopy,last_utmp.ut_name,sizeof(last_utmp.ut_name));
X		namecopy[sizeof(namecopy) - 1] = 0;
X
X		strncpy(idcopy,last_utmp.ut_id,sizeof(last_utmp.ut_id));
X		idcopy[sizeof(idcopy) - 1] = 0;
X
X#if defined(M_UNIX)
X	    if((!strncmp(namecopy,"uugetty",7) ||
X	     !strncmp(namecopy,"getty",5)) &&
X		 (ulindex(idcopy,line + 8) == (strlen(idcopy) - 2)))
X		{
X			if(itmp = line_locked(line))
X				status = US_DIALOUT;
X			else
X				status = US_LOGIN;
X			break;
X		}
X	    else if((!strcmpi(last_utmp.ut_line,line + 5)) &&
X			(!kill(last_utmp.ut_pid,0) || (errno != ESRCH)))
X		{
X			status = US_LOGGEDIN;
X			break;
X		}
X#else
X	    if((!strcmpi(last_utmp.ut_line,line + 5)) &&
X			(!kill(last_utmp.ut_pid,0) || (errno != ESRCH)))
X		{
X			if(!strcmp(last_utmp.ut_name,"LOGIN"))
X				status = US_LOGIN;
X			else if(!strcmp(last_utmp.ut_name,"DIALOUT"))
X				status = US_DIALOUT;
X			else
X				status = US_LOGGEDIN;
X			break;
X		}
X#endif
X	}
X
X#if defined(LOG_UTMP)
X	if(status == US_NOTFOUND)
X		sprintf(logstr,"UTMP %s: no entry in utmp, status=%d",line,status);
X	else
X	{
X	char *ctime();
X		sprintf(logstr,"UTMP %s:%s:%s:%d:status=%d:%s", 
X		    namecopy,idcopy,last_utmp.ut_line,
X		    last_utmp.ut_pid,status, ctime(&last_utmp.ut_time));
X		logstr[strlen(logstr) - 1] = 0;	/* kill NL from ctime() */
X	}
X	ecu_log_event(getpid(),logstr);
X#endif
X
X	close(ufd);
X	return(status);
X
X}	/* end of utmp_status */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of utmpstat.c */
SHAR_EOF
$TOUCH -am 1224224490 'utmpstat.c' &&
chmod 0644 utmpstat.c ||
echo 'restore of utmpstat.c failed'
Wc_c="`wc -c < 'utmpstat.c'`"
test 3906 -eq "$Wc_c" ||
	echo 'utmpstat.c: original size 3906, current size' "$Wc_c"
# ============= var.c ==============
echo 'x - extracting var.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'var.c' &&
X/*+-------------------------------------------------------------------------
X	var.c - ecu variable routines
X	wht@n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	alloc_MKV(name)
X	build_mkvi(param)
X	build_mkvi_primitive(name)
X	build_mkvs(param)
X	build_mkvs_primitive(name,length)
X	pcmd_mkvar(param)
X	find_mkvs(name,ppesd,auto_create)
X	find_mkvi(name,pplong,auto_create)
X	free_mkvi(mkv)
X	free_mkvs(mkv)
X	get_ivptr(param,ppiv,auto_create)
X	get_subscript(param,psubscript)
X	get_svptr(param,ppsv,auto_create)
X	mkv_proc_starting(pcb)
X	mkv_proc_terminating(pcb)
X	var_init()
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
X
X#include "ecu.h"
X#include "esd.h"
X#define VDECL
X#include "var.h"
X#include "proc.h"
X#include "ecukey.h"
X#include "ecuerror.h"
X
Xextern int proc_level;
Xextern int proctrace;
X
Xtypedef union mkvu_type
X{
X	ESD	*sv;
X	long iv;
X} MKVU;
X
Xtypedef struct mkv_type
X{
X	MKVU item;				/* pointer to esd if sv or long if iv */
X	struct mkv_type *next;	/* next MKV in chain; if==NULL, no more in chain */
X	struct mkv_type *prev;	/* previous MKV in chain; if==NULL, top of chain */
X	char *name;				/* name of variable */
X} MKV;
X
XMKV *mkvi_last = (MKV *)0;
XMKV *mkvs_last = (MKV *)0;
X
X/*+-------------------------------------------------------------------------
X	var_init()
X--------------------------------------------------------------------------*/
Xvoid
Xvar_init()
X{
Xregister itmp;
X
X	for(itmp = 0; itmp < SVQUAN; itmp++)
X	{
X		if((sv[itmp] = make_esd(SVLEN)) == (ESD *)0)
X		{
X			pputs("out of memory\n");
X			exit(1);
X		}
X	}
X
X	for(itmp = 0; itmp < IVQUAN; itmp++)
X		iv[itmp] = 0;
X
X}	/* end of var_init */
X
X/*+-------------------------------------------------------------------------
X	alloc_MKV(name)
X--------------------------------------------------------------------------*/
XMKV *
Xalloc_MKV(name)
Xchar *name;
X{
XMKV *mkv;
X	if(!(mkv = (MKV *)malloc(sizeof(MKV))))
X		return((MKV *)0);
X	if(!(mkv->name = malloc(strlen(name) + 1)))
X	{
X		free((char *)mkv);
X		return((MKV *)0);
X	}
X	strcpy(mkv->name,name);
X	mkv->item.iv = 0;
X	return(mkv);
X}	/* end of alloc_MKV */
X
X/*+-------------------------------------------------------------------------
X	build_mkvi_primitive(name)
X--------------------------------------------------------------------------*/
Xbuild_mkvi_primitive(name)
Xchar *name;
X{
XMKV *mkv;
X
X	if((mkv = alloc_MKV(name)) == (MKV *)0)
X		return(eNoMemory);
X	if(mkvi_last)
X		mkvi_last->next = mkv;
X	mkv->prev = mkvi_last;
X	mkv->next = (MKV *)0;
X	mkvi_last = mkv;
X	return(0);
X}	/* end of build_mkvi_primitive */
X
X/*+-------------------------------------------------------------------------
X	build_mkvi(param)
X--------------------------------------------------------------------------*/
Xbuild_mkvi(param)
XESD *param;
X{
Xregister erc;
Xchar name[16];
X
X	if(erc = get_alphanum_zstr(param,name,sizeof(name)))
X		return(erc);
X	return(build_mkvi_primitive(name));
X
X}	/* end of build_mkvi */
X
X/*+-------------------------------------------------------------------------
X	build_mkvs_primitive(name,length)
Xtrusts caller not to exceed 5120 max size
X--------------------------------------------------------------------------*/
Xbuild_mkvs_primitive(name,length)
Xchar *name;
Xint length;
X{
XMKV *mkv;
XESD *text;
X
X	if((text = make_esd((int)length)) == (ESD *)0)
X		return(eNoMemory);
X
X	if((mkv = alloc_MKV(name)) == (MKV *)0)
X	{
X		free_esd(text);
X		return(eNoMemory);
X	}
X
X	mkv->item.sv = text;
X
X	if(mkvs_last)
X		mkvs_last->next = mkv;
X	mkv->prev = mkvs_last;
X	mkv->next = (MKV *)0;
X	mkvs_last = mkv;
X	return(0);
X
X}	/* end of build_mkvs_primitive */
X
X/*+-------------------------------------------------------------------------
X	build_mkvs(param)
X--------------------------------------------------------------------------*/
Xbuild_mkvs(param)
XESD *param;
X{
Xregister erc;
Xchar name[16];
Xulong length;
X
X	if(erc = get_alphanum_zstr(param,name,sizeof(name)))
X		return(erc);
X
X	if(erc = skip_paren(param,1))
X		return(erc);
X	if(erc = gint(param,&length))
X		return(erc);
X	if(length > 5120)
X	{
X		pprintf("max string size is 5120 ... cannot make %lu byte string\n",
X			length);
X		return(eFATAL_ALREADY);
X	}
X	if(erc = skip_paren(param,0))
X		return(erc);
X
X	return(build_mkvs_primitive(name,(int)length));
X
X}	/* end of build_mkvs */
X
X/*+-------------------------------------------------------------------------
X	pcmd_mkvar(param)
X
Xmkvar i<name>
Xmkvar s<name>(<size-int>)
X--------------------------------------------------------------------------*/
Xint
Xpcmd_mkvar(param)
XESD *param;
X{
Xregister erc;
Xchar vartype;
X
X	if(!proc_level)
X		return(eNotExecutingProc);
X
X	do {
X		if(erc = get_cmd_char(param,&vartype))
X			return(erc);
X		if(vartype == '$')
X		{
X			if(erc = get_cmd_char(param,&vartype))
X				return(erc);
X		}
X		vartype = to_lower(vartype);
X		switch(vartype)
X		{
X			case 'i':
X				erc = build_mkvi(param);
X				break;
X			case 's':
X				erc = build_mkvs(param);
X				break;
X			default:
X				return(eIllegalVarType);
X		}
X		if(erc)
X			return(erc);
X	} while(!skip_comma(param));
X
X	if(!end_of_cmd(param))
X		return(eSyntaxError);
X
X	return(0);
X
X}	/* end of pcmd_mkvar */
X
X/*+-------------------------------------------------------------------------
X	free_mkvi(mkv)
X--------------------------------------------------------------------------*/
Xvoid
Xfree_mkvi(mkv)
XMKV *mkv;
X{
X	free(mkv->name);
X	free((char *)mkv);
X}	/* end of free_mkvi */
X
X/*+-------------------------------------------------------------------------
X	free_mkvs(mkv)
X--------------------------------------------------------------------------*/
Xvoid
Xfree_mkvs(mkv)
XMKV *mkv;
X{
X	free_esd(mkv->item.sv);
X	free(mkv->name);
X	free((char *)mkv);
X}	/* end of free_mkvs */
X
X/*+-------------------------------------------------------------------------
X	mkv_proc_starting(pcb)
X--------------------------------------------------------------------------*/
Xvoid
Xmkv_proc_starting(pcb)
XPCB *pcb;
X{
X	pcb->mkvs_last = (char *)mkvs_last;
X	pcb->mkvi_last = (char *)mkvi_last;
X}	/* end of mkv_proc_starting */
X
X/*+-------------------------------------------------------------------------
X	mkv_proc_terminating(pcb)
X--------------------------------------------------------------------------*/
Xvoid
Xmkv_proc_terminating(pcb)
XPCB *pcb;
X{
XMKV *pmkv;
X
X	while(mkvi_last != (MKV *)pcb->mkvi_last)
X	{
X		pmkv = mkvi_last->prev;
X		free_mkvi(mkvi_last);
X		mkvi_last = pmkv;
X	}
X	while(mkvs_last != (MKV *)pcb->mkvs_last)
X	{
X		pmkv = mkvs_last->prev;
X		free_mkvs(mkvs_last);
X		mkvs_last = pmkv;
X	}
X
X}	/* end of mkv_proc_terminating */
X
X/*+-------------------------------------------------------------------------
X	find_mkvs(name,ppesd,auto_create)
X--------------------------------------------------------------------------*/
Xint
Xfind_mkvs(name,ppesd,auto_create)
Xchar *name;
XESD **ppesd;
Xint auto_create;
X{
Xint erc;
XMKV *mkv = mkvs_last;
X
X	while(mkv)
X	{
X		if(!strcmp(name,mkv->name))
X		{
X			*ppesd = mkv->item.sv;
X			return(0);
X		}
X		mkv = mkv->prev;
X	}
X
X	if(auto_create)
X	{
X		if(proctrace)
X			pprintf("creating $s%s(256)\n",name);
X		if(erc = build_mkvs_primitive(name,256))
X			return(erc);
X		*ppesd = mkvs_last->item.sv;
X		return(0);
X	}
X
X	return(eNoSuchVariable);
X
X}	/* end of find_mkvs */
X
X/*+-------------------------------------------------------------------------
X	find_mkvi(name,pplong,auto_create)
X--------------------------------------------------------------------------*/
Xint
Xfind_mkvi(name,pplong,auto_create)
Xchar *name;
Xlong **pplong;
Xint auto_create;
X{
Xint erc;
XMKV *mkv = mkvi_last;
X
X	while(mkv)
X	{
X		if(!strcmp(name,mkv->name))
X		{
X			*pplong = &mkv->item.iv;
X			return(0);
X		}
X		mkv = mkv->prev;
X	}
X
X	if(auto_create)
X	{
X		if(proctrace)
X			pprintf("creating $i%s\n",name);
X		if(erc = build_mkvi_primitive(name))
X			return(erc);
X		*pplong = &mkvi_last->item.iv;
X		return(0);
X	}
X
X	return(eNoSuchVariable);
X
X}	/* end of find_mkvi */
X
X/*+-------------------------------------------------------------------------
X	get_subscript(param,psubscript)
Xonly called when '[' at pb + index
X--------------------------------------------------------------------------*/
Xget_subscript(param,psubscript)
XESD *param;
Xulong *psubscript;
X{
Xregister erc;
X
X	param->index++;
X	if(erc = gint(param,psubscript))
X		return(erc);
X	if(skip_cmd_char(param,']'))
X		return(eSyntaxError);
X	return(0);
X}	/* end of get_subscript */
X
X/*+-------------------------------------------------------------------------
X	get_ivptr(param,ppiv,auto_create)
Xcalled with index set to $i.....
X                           ^
X--------------------------------------------------------------------------*/
Xget_ivptr(param,ppiv,auto_create)
XESD *param;
Xlong **ppiv;
Xint auto_create;
X{
Xregister erc;
Xulong varnum;
Xchar name[16];
X
X	if(end_of_cmd(param))
X		return(eSyntaxError);
X	else if(!get_numeric_value(param,&varnum))
X		goto TEST_VARNUM;
X	else if(*(param->pb + param->index) == '[')
X	{
X		if(erc = get_subscript(param,&varnum))
X			return(erc);
XTEST_VARNUM:
X		if(varnum >= IVQUAN)
X			return(eIllegalVarNumber);
X		*ppiv = &iv[(int)varnum];
X		return(0);
X	}
X	else if(get_alphanum_zstr(param,name,sizeof(name)))
X		return(eInvalidVarName);
X
X	return(find_mkvi(name,ppiv,auto_create));
X
X}	/* end of get_ivptr */
X
X/*+-------------------------------------------------------------------------
X	get_svptr(param,ppsv,auto_create)
Xcalled with index set to $s.....
X                           ^
X--------------------------------------------------------------------------*/
Xget_svptr(param,ppsv,auto_create)
XESD *param;
XESD **ppsv;
Xint auto_create;
X{
Xregister erc;
Xulong varnum;
Xchar name[16];
X
X	if(end_of_cmd(param))
X		return(eSyntaxError);
X	else if(!get_numeric_value(param,&varnum))
X		goto TEST_VARNUM;
X	else if(*(param->pb + param->index) == '[')
X	{
X		if(erc = get_subscript(param,&varnum))
X			return(erc);
XTEST_VARNUM:
X		if(varnum >= SVQUAN)
X			return(eIllegalVarNumber);
X		*ppsv = sv[(int)varnum];
X		return(0);
X	}
X	if(get_alphanum_zstr(param,name,sizeof(name)))
X		return(eInvalidVarName);
X	return(find_mkvs(name,ppsv,0));
X
X}	/* end of get_svptr */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of var.c */
SHAR_EOF
$TOUCH -am 1224224490 'var.c' &&
chmod 0644 var.c ||
echo 'restore of var.c failed'
Wc_c="`wc -c < 'var.c'`"
test 10027 -eq "$Wc_c" ||
	echo 'var.c: original size 10027, current size' "$Wc_c"
# ============= dialprog.h ==============
echo 'x - extracting dialprog.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'dialprog.h' &&
X/*+-------------------------------------------------------------------------
X	dialprog.h - HDB UUCP dialer program return code error codes
X	wht@n4hgf.Mt-Park.GA.US
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:08-14-1990-20:39-wht@n4hgf-ecu3.00-flush old edit history */
X
X#define	RC_FAIL		0x80	/* 1 = failed to connect */
X#define	RCE_NULL	0		/* general purpose or unknown error code */
X#define	RCE_INUSE	1		/* line in use */
X#define	RCE_SIG		2		/* signal aborted dialer */
X#define	RCE_ARGS	3		/* invalid arguments */
X#define	RCE_PHNO	4		/* invalid phone number */
X#define	RCE_SPEED	5		/* invalid baud rate -or- bad connect baud */
X#define	RCE_OPEN	6		/* can't open line */
X#define	RCE_IOCTL	7		/* ioctl error */
X#define	RCE_TIMOUT	8		/* timeout */
X#define	RCE_NOTONE	9		/* no dial tone */
X#define	RCE_BUSY	13		/* phone is busy */
X#define	RCE_NOCARR	14		/* no carrier */
X#define	RCE_ANSWER	15		/* no answer */
X
X/* code writing aid */
X#ifdef NEVER
X		case RCE_NULL:		/* general purpose or unknown error code */
X		case RCE_INUSE:		/* line in use */
X		case RCE_SIG:		/* signal aborted dialer */
X		case RCE_ARGS:		/* invalid arguments */
X		case RCE_PHNO:		/* invalid phone number */
X		case RCE_SPEED:		/* invalid baud rate -or- bad connect baud */
X		case RCE_OPEN:		/* can't open line */
X		case RCE_IOCTL:		/* ioctl error */
X		case RCE_TIMOUT:	/* timeout */
X		case RCE_NOTONE:	/* no dial tone */
X		case RCE_BUSY:		/* phone is busy */
X		case RCE_NOCARR:	/* no carrier */
X		case RCE_ANSWER:	/* no answer */
X#endif
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of dialprog.h */
SHAR_EOF
$TOUCH -am 1224222690 'dialprog.h' &&
chmod 0644 dialprog.h ||
echo 'restore of dialprog.h failed'
Wc_c="`wc -c < 'dialprog.h'`"
test 1616 -eq "$Wc_c" ||
	echo 'dialprog.h: original size 1616, current size' "$Wc_c"
# ============= dlent.h ==============
echo 'x - extracting dlent.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'dlent.h' &&
X/*+-------------------------------------------------------------------------
X	dlent.h - HDB UUCP Dialers file entry (a la pwent.h)
X	wht@n4hgf.Mt-Park.GA.US
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:08-14-1990-20:39-wht@n4hgf-ecu3.00-flush old edit history */
X
Xstruct dlent
X{
X	char *name;		/* Dialer name */
X	char *tlate;	/* translate string */
X	char *script;	/* expect-respond script */
X};
X
Xstruct dlent *getdlent();
Xvoid enddlent();
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of dlent.h */
SHAR_EOF
$TOUCH -am 1224222690 'dlent.h' &&
chmod 0644 dlent.h ||
echo 'restore of dlent.h failed'
Wc_c="`wc -c < 'dlent.h'`"
test 545 -eq "$Wc_c" ||
	echo 'dlent.h: original size 545, current size' "$Wc_c"
# ============= dvent.h ==============
echo 'x - extracting dvent.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'dvent.h' &&
X/*+-------------------------------------------------------------------------
X	dvent.h - HDB UUCP Devices file entry (a la pwent.h)
X	wht@n4hgf.Mt-Park.GA.US
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:08-14-1990-20:39-wht@n4hgf-ecu3.00-flush old edit history */
X
Xstruct dvent
X{
X	char *type;		/* ACU or Direct */
X	char *line;		/* tty  name "ttyxx"-style */
X	char *dialer;	/* "801" dialer line */
X	uint low_baud;	/* lowest baud rate */
X	uint high_baud;	/* highest baud rate */
X	char *dialprog;	/* dialer program */
X};
X
Xstruct dvent *getdvent();
Xstruct dvent *getdvbaud();
Xstruct dvent *getdvline();
Xvoid enddvent();
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of dvent.h */
SHAR_EOF
$TOUCH -am 1224222690 'dvent.h' &&
chmod 0644 dvent.h ||
echo 'restore of dvent.h failed'
Wc_c="`wc -c < 'dvent.h'`"
test 722 -eq "$Wc_c" ||
	echo 'dvent.h: original size 722, current size' "$Wc_c"
# ============= ecu.h ==============
echo 'x - extracting ecu.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ecu.h' &&
X/*+-----------------------------------------------------------------------
X	ecu.h -- TuckerWare Extended Calling Unit
X	wht@n4hgf.Mt-Park.GA.US
X------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:08-14-1990-20:39-wht@n4hgf-ecu3.00-flush old edit history */
X
X#define ECULIBDIR "/usr/local/lib/ecu"
X
X#if defined(__STDC__)	/* sigh ... malloc and such types */
X#define VTYPE void
X#else
X#define VTYPE char
X#endif
X
X#if defined(M_UNIX)
X#undef M_XENIX		/* we don't want this defined in UNIX world */
X#undef NO_SELECT	/* UNIX select(S) works */
X#endif
X
X#if defined(M_I286) && !defined(NO_SELECT)
X#define NO_SELECT	/* the last 286 XENIX I saw (2.2.1) had no select */
X#endif
X
X#ifndef ECULIBDIR
X#define ECULIBDIR "/usr/lib/ecu"
X#endif
X
X#if !defined(STDIO_H_INCLUDED)
X#include <stdio.h>
X#endif
X#include <signal.h>
X#include <ctype.h>
X#include <sys/types.h>
X#include <errno.h>
X#include <sys/timeb.h>
X
X#include <memory.h>
X#include <sys/stat.h>
X#include <string.h>
X#include <fcntl.h>
X#if !defined(OMIT_TERMIO_REFERENCES)
X#include <termio.h>
X#endif
X
X#include "ecuhangup.h"
X#include "ecushm.h"
X
X/* already in ecushm.h */
X/* #if !defined(ushort) */
X/* #define ushort unsigned short */
X/* #endif */
X/* #if !defined(uchar) */
X/* #define uchar unsigned char */
X/* #endif */
X/* #if !defined(uint) */
X/* #define uint unsigned int */
X/* #endif */
X/* #if !defined(ulong) */
X/* #define ulong unsigned long */
X/* #endif */
X
X#define MALLOC_3X
X#if defined(MALLOC_3X)
X#include <malloc.h>
X#endif
X
X/* for better source line utilization, frequent use of 'fprintf' and 'stderr'
X   warrants the following */
X#define pf	printf
X#define	ff	fprintf
X#define se	stderr
X#define so	stdout
X
X#define DEFAULT_BAUD_RATE	2400
X#define DEFAULT_PARITY		0		/* 0=none, else 'e' or 'o' */
X#define TTYIN	0
X#define TTYOUT  1				/* ditto tty output */
X#define TTYERR  2				/* ditty tty output error channel */
X
X/* xbell codes */
X#if defined(M_XENIX) || defined(M_UNIX)
X#define  XBELL_DONE 		1		/* octaves or morse 'd' */
X#define  XBELL_ATTENTION	2		/* morse .-.-.- ATTENTION */
X#define  XBELL_C			3		/* morse -.-. C */
X#define  XBELL_3T			4		/* --- really 'o' */
X#endif
X
X/* lopen() and related routines error codes */
X#define LOPEN_INVALID			-1		/* for invalid tty name */
X#define LOPEN_UNKPID			-2		/* unknown pid using line */
X#define LOPEN_LCKERR			-3		/* lock file open error */
X#define LOPEN_NODEV				-4		/* device does not exist */
X#define LOPEN_OPNFAIL			-5		/* could not open line */
X#define LOPEN_ALREADY			-6		/* line already open */
X#define LOPEN_ENABLED			-7		/* line enabled for login */
X#define LOPEN_ENABLED_IN_USE	-8		/* line in use by incoming login */
X#define LOPEN_DIALOUT_IN_USE	-9		/* line in use by another dial out */
X#define LOPEN_NOPTY				-10		/* pty not supported */
X
Xextern int errno;
Xextern char *sys_errlist[];
Xextern int sys_nerr;
X
X#if defined(DECLARE_LINEVARS_PUBLIC)
Xchar LLCKname[128];			/* lock file name */
X#if !defined(OMIT_TERMIO_REFERENCES)
Xstruct termio Ltermio;		/* attributes for the line to remote */
X#endif
Xuchar Lmodem_sreg[20];		/* allow for more later */
X#else
Xextern char LLCKname[];
X#if !defined(OMIT_TERMIO_REFERENCES)
Xextern struct termio Ltermio;
X#endif
Xextern uchar Lmodem_sreg[];
X#endif
X/* setcolor variables - see setcolor() */
Xextern ulong colors_current;
Xextern ulong colors_normal;
Xextern ulong colors_success;
Xextern ulong colors_alert;
Xextern ulong colors_error;
Xextern ulong colors_notify;
X
Xtypedef struct lrwt /* param to lgets_timeout in eculine.c */
X{
X	ulong to1;		/* timeout for 1st character (granularity 20) */
X	ulong to2;		/* timeout for each next char (granularity 20) */
X	int raw_flag;	/* !=0, rtn full buffer, ==0, rtn filtered hayes result */
X	char *buffer;	/* buffer to fill */
X	int bufsize;	/* size of buffer */
X	int count;		/* from proc, count rcvd */
X	char *delim;	/* ending string for lgets_timeout_or_delim */
X	int echo;		/* echo incdoming chars to screen */
X}	LRWT;
X
X#include "stdio_lint.h"
X#include "lint_args.h"
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
$TOUCH -am 1224222690 'ecu.h' &&
chmod 0644 ecu.h ||
echo 'restore of ecu.h failed'
Wc_c="`wc -c < 'ecu.h'`"
test 4010 -eq "$Wc_c" ||
	echo 'ecu.h: original size 4010, current size' "$Wc_c"
# ============= ecucmd.h ==============
echo 'x - extracting ecucmd.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ecucmd.h' &&
X/*+-------------------------------------------------------------------------
X	ecucmd.h -- command definitions
X	wht@n4hgf.Mt-Park.GA.US
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
X
X/* interactive command tokens */
X
X#define CTax             1
X#define CTbaud           2
X#define CTbn             3
X#define CTbreak          4
X#define CTcd             5
X#define CTclrx           6
X#define CTda             7
X#define CTdial           8
X#define CTdo             9
X#define CTduplex        10
X#define CTexit          11
X#define CTfi            12
X#define CTfkey          13
X#define CTgetf          14
X#define CThangup        15
X#define CThelp          16
X#define CTllp           17
X#define CTloff          18
X#define CTlog           19
X#define CTnl            21
X#define CTnlin          22
X#define CTnlout         23
X#define CToa            24
X#define CTparity        25
X#define CTpcmd          26
X#define CTpid           27
X#define CTplog          28
X#define CTptrace        29
X#define CTputf          30
X#define CTpwd           31
X#define CTredial        32
X#define CTrev           33
X#define CTrk            34
X#define CTrs            35
X#define CTrtscts        36
X#define CTrx            37
X#define CTry            38
X#define CTrz            39
X#define CTsdname        40
X#define CTsgr           41
X#define CTsk            43
X#define CTss            44
X#define CTstat          45
X#define CTsx            46
X#define CTsy            47
X#define CTsz            48
X#define CTtime          50
X#define CTts            51
X#define CTtty           52
X#define CTxa            53
X#define CTxlog          54
X#define CTxon           55
X#if	defined(ESIO_IN_USE)
X#define CTesio          56
X#endif
X
X#define CTdummy1       120
X#define CTdummy2       121
X#define CTdummy3       122
X#define CTdummy4       123
X
X#define TOKEN_QUAN	128		/* for help package */
X
Xtypedef int (*PFI)();
X
X#if defined(HELPGEN)
X#define Z {;}
X#else
X#define Z ;
X#endif
X
Xint pcmd_baud() Z
Xint pcmd_break() Z
Xint pcmd_cd() Z
Xint pcmd_clrx() Z
Xint pcmd_cls() Z
Xint pcmd_color() Z
Xint pcmd_continue() Z
Xint pcmd_cursor() Z
Xint pcmd_delline() Z
Xint pcmd_dial() Z
Xint pcmd_do() Z
Xint pcmd_duplex() Z
Xint pcmd_echo() Z
Xint pcmd_eeol() Z
Xint pcmd_else() Z
X#if	defined(ESIO_IN_USE)
Xint pcmd_esio() Z
X#endif
Xint pcmd_exit() Z
Xint pcmd_expresp() Z
Xint pcmd_getf() Z
Xint pcmd_fchmod() Z
Xint pcmd_fclose() Z
Xint pcmd_fgetc() Z
Xint pcmd_fgets() Z
Xint pcmd_fkey() Z
Xint pcmd_flush() Z
Xint pcmd_fopen() Z
Xint pcmd_fputc() Z
Xint pcmd_fputs() Z
Xint pcmd_fread() Z
Xint pcmd_fseek() Z
Xint pcmd_fdel() Z
Xint pcmd_fwrite() Z
Xint pcmd_gosub() Z
Xint pcmd_gosubb() Z
Xint pcmd_goto() Z
Xint pcmd_gotob() Z
Xint pcmd_hangup() Z
Xint pcmd_hexdump() Z
Xint pcmd_home() Z
Xint pcmd_icolor() Z
Xint pcmd_insline() Z
Xint pcmd_ifge() Z
Xint pcmd_ifgt() Z
Xint pcmd_ifi() Z
Xint pcmd_ifle() Z
Xint pcmd_iflt() Z
Xint pcmd_ifnz() Z
Xint pcmd_ifs() Z
Xint pcmd_ifz() Z
Xint pcmd_lbreak() Z
Xint pcmd_lgets() Z
Xint pcmd_logevent() Z
Xint pcmd_lookfor() Z
X/* int pcmd_mkdir() Z */
Xint pcmd_mkvar() Z
Xint pcmd_nap() Z
Xint pcmd_parity() Z
Xint pcmd_pclose() Z
Xint pcmd_plog() Z
Xint pcmd_popen() Z
Xint pcmd_prompt() Z
Xint pcmd_ptrace() Z
Xint pcmd_putf() Z
Xint pcmd_return() Z
Xint pcmd_rk() Z
Xint pcmd_rname() Z
Xint pcmd_rs() Z
Xint pcmd_rx() Z
Xint pcmd_ry() Z
Xint pcmd_rz() Z
Xint pcmd_scrdump() Z
Xint pcmd_send() Z
Xint pcmd_set() Z
Xint pcmd_sk() Z
Xint pcmd_ss() Z
Xint pcmd_sx() Z
Xint pcmd_sy() Z
Xint pcmd_system() Z
Xint pcmd_sz() Z
Xint pcmd_vidcolor() Z
Xint pcmd_vidnorm() Z
Xint pcmd_vidrev() Z
Xint pcmd_whilei() Z
Xint pcmd_whiles() Z
Xint pcmd_xon() Z
X
X/* command classification */
X#define ccG  1	/* general command */
X#define ccC  2	/* comm command */
X#define ccT  3	/* transfer command */
X#define ccP  4	/* procedure-related command */
X
Xtypedef struct p_cmd
X{ 
X	char *cmd;		/* command string */
X	short min;		/* min chars for match (0 if not interactive) */
X	short token;	/* command number (if interactive) */
X	char *descr;	/* command description (if interactive) */
X	PFI proc;		/* procedure cmd handler (or 0) */
X	short cmdclass;	/* cc{C,G,P,X} or 0 (for help processor) */
X}	P_CMD;
X
X#if !defined(DECLARE_P_CMD)
X#if defined(NEED_P_CMD)
Xextern P_CMD icmd_cmds[];
X#endif
X#else
XP_CMD icmd_cmds[] =
X{
X	{ "ax",		2,CTax,		"ascii char to hex/oct/dec",	0,			ccG},
X	{ "baud",	2,CTbaud,	"set/display line baud rate",	pcmd_baud,	ccC},
X	{ "bn",		2,CTbn,		"all console event alarm",		0,			ccG},
X	{ "break",	2,CTbreak,	"send break to remote",			pcmd_break,	ccC},
X	{ "cd",		2,CTcd,		"change current directory",		pcmd_cd,	ccG},
X	{ "clrx",	2,CTclrx,	"simulate XON from remote",		pcmd_clrx,	ccC},
X	{ "cls",	0,0,		"",								pcmd_cls,	0  },
X	{ "color",	0,0,		"",								pcmd_color,	0  },
X	{ "continue",0,0,		"",								pcmd_continue,0 },
X	{ "cursor",	0,0,		"",								pcmd_cursor, 0  },
X	{ "da",		2,CTda,		"decimal to ascii char",		0,          ccG},
X	{ "dial",	1,CTdial,	"dial remote destination",		pcmd_dial,  ccC},
X	{ "delline",0,0,		"",								pcmd_delline,0  },
X	{ "do",		2,CTdo,		"perform procedure",			pcmd_do,    ccP},
X	{ "duplex",	2,CTduplex,	"set/display duplex",			pcmd_duplex,ccC},
X	{ "echo",	0,0,		"",								pcmd_echo,   0  },
X	{ "eeol",	0,0,		"",								pcmd_eeol,   0  },
X	{ "else",	0,0,		"",								pcmd_else,   0  },
X#if	defined(ESIO_IN_USE)
X	{ "esio",	2,CTesio,	"ESIO/FAS driver control",		pcmd_esio,	ccC},
X#endif
X	{ "exit",	2,CTexit,	"hang up, exit program",		pcmd_exit,  ccG},
X	{ "expresp",0,0,		"",								pcmd_expresp,0  },
X	{ "fchmod",	0,0,		"",								pcmd_fchmod, 0  },
X	{ "fclose",	0,0,		"",								pcmd_fclose, 0  },
X	{ "fdel",	0,0,		"",								pcmd_fdel,   0  },
X	{ "fgetc",	0,0,		"",								pcmd_fgetc,  0  },
X	{ "fgets",	0,0,		"",								pcmd_fgets,  0  },
X	{ "fi",		2,CTfi,		"send text file to line",		0,          ccG},
X	{ "fkey",	2,CTfkey,	"function key definition",		pcmd_fkey,  ccG},
X	{ "flush",	0,0,		"",								pcmd_flush,  0  },
X	{ "fopen",	0,0,		"",								pcmd_fopen,  0  },
X	{ "fputc",	0,0,		"",								pcmd_fputc,  0  },
X	{ "fputs",	0,0,		"",								pcmd_fputs,  0  },
X	{ "fread",	0,0,		"",								pcmd_fread,  0  },
X	{ "fseek",	0,0,		"",								pcmd_fseek,  0  },
X	{ "fwrite",	0,0,		"",								pcmd_fwrite, 0  },
X	{ "getf",	0,0,		"",								pcmd_getf,   0  },
X	{ "gosub",	0,0,		"",								pcmd_gosub,  0  },
X	{ "gosubb",	0,0,		"",								pcmd_gosubb, 0  },
X	{ "goto",	0,0,		"",								pcmd_goto,   0  },
X	{ "gotob",	0,0,		"",								pcmd_gotob,  0  },
X	{ "hangup",	2,CThangup,	"hang up modem",				pcmd_hangup,ccC},
X	{ "help",	2,CThelp,	"invoke help",					0,          ccG},
X	{ "hexdump",0,0,		"",								pcmd_hexdump,0  },
X	{ "home",	0,0,		"",								pcmd_home,   0  },
X	{ "icolor",	0,0,		"",								pcmd_icolor, 0  },
X	{ "ifge",	0,0,		"",								pcmd_ifge,   0  },
X	{ "ifgt",	0,0,		"",								pcmd_ifgt,   0  },
X	{ "ifi",	0,0,		"",								pcmd_ifi,    0  },
X	{ "ifle",	0,0,		"",								pcmd_ifle,   0  },
X	{ "iflt",	0,0,		"",								pcmd_iflt,   0  },
X	{ "ifnz",	0,0,		"",								pcmd_ifnz,   0  },
X	{ "ifs",	0,0,		"",								pcmd_ifs,    0  },
X	{ "ifz",	0,0,		"",								pcmd_ifz,    0  },
X	{ "insline",0,0,		"",								pcmd_insline,0  },
X	{ "lbreak",	0,0,		"",								pcmd_lbreak, 0  },
X	{ "llp",	2,CTllp,	"set session log to /dev/lp",	0,          ccG},
X	{ "lgets",	0,0,		"",								pcmd_lgets,  0  },
X	{ "loff",	3,CTloff,	"turn off session logging",		0,          ccG},
X	{ "log",	3,CTlog,	"session logging control",		0,          ccG},
X	{ "logevent",0,0,		"",								pcmd_logevent,0 },
X	{ "lookfor",0,0,		"",								pcmd_lookfor,0  },
X/*	{ "mkdir",	3,CTmkdir,	"mkdir <dirname>",				pcmd_mkdir, ccG}, */
X	{ "mkvar",	0,0,		"",								pcmd_mkvar,  0  },
X	{ "nap",	0,0,		"",								pcmd_nap,    0  },
X	{ "nl",		2,CTnl,		"display CR/LF mapping",		0,          ccC},
X	{ "nlin",	3,CTnlin,	"set receive CR/LF mapping",	0,          ccC},
X	{ "nlout",	3,CTnlout,	"set transmit CR/LF mapping",	0,          ccC},
X	{ "oa",		2,CToa,		"octal to ascii char",			0,          ccG},
X	{ "parity",	3,CTparity,	"set/display line parity",		pcmd_parity, ccC},
X	{ "pclose",	0,0,		"",								pcmd_pclose, 0  },
X	{ "pcmd",	2,CTpcmd,	"execute a procedure command",	0,          ccP},
X	{ "pid",	2,CTpid,	"display process ids",			0,          ccG},
X	{ "plog",	2,CTplog,	"control procedure logging",	pcmd_plog,   ccP},
X	{ "popen",	0,0,		"",								pcmd_popen,  0  },
X	{ "prompt",	0,0,		"",								pcmd_prompt, 0  },
X	{ "ptrace",	2,CTptrace,	"control procedure trace",		pcmd_ptrace,ccP},
X	{ "putf",	0,0,		"",								pcmd_putf,   0  },
X	{ "pwd",	2,CTpwd,	"print working directory",		0,          ccG},
X	{ "redial",	3,CTredial,	"redial last number",			0,          ccC},
X	{ "return",	0,0,		"",								pcmd_return, 0  },
X	{ "rev",	3,CTrev,	"ecu revision/make date",		0,          ccG},
X	{ "rk",		2,CTrk,		"receive via C-Kermit",			pcmd_rk,    ccT},
X	{ "rname",	0,0,		"",								pcmd_rname,  0  },
X	{ "rs",		2,CTrs,		"receive via SEAlink",			pcmd_rs,    ccT},
X	{ "rtscts",	3,CTrtscts,	"control RTS/CTS flow control",	0,          ccC},
X	{ "rx",		2,CTrx,		"receive via XMODEM/CRC",		pcmd_rx,    ccT},
X	{ "ry",		2,CTry,		"receive via YMODEM Batch",		pcmd_ry,    ccT},
X	{ "rz",		2,CTrz,		"receive via ZMODEM/CRC32",		pcmd_rz,    ccT},
X	{ "scrdump",0,0,		"",								pcmd_scrdump,0  },
X	{ "sdname",	3,CTsdname,	"select screen dump name",		0,          ccC},
X	{ "send",	0,0,		"",								pcmd_send,   0  },
X	{ "set",	0,0,		"",								pcmd_set,    0  },
X	{ "sgr",	2,CTsgr,	"send command/get response",	0,          ccC},
X	{ "sk",		2,CTsk,		"send via C-Kermit",			pcmd_sk,    ccT},
X	{ "ss",		2,CTss,		"send via SEAlink",				pcmd_ss,    ccT},
X	{ "stat",	2,CTstat,	"general status",				0,          ccG},
X	{ "sx",		2,CTsx,		"send via XMODEM/CRC",			pcmd_sx,    ccT},
X	{ "sy",		2,CTsy,		"send via YMODEM Batch",		pcmd_sy,    ccT},
X	{ "system",	0,CTsy,		"",								pcmd_system, 0  },
X	{ "sz",		2,CTsz,		"send via ZMODEM/CRC32",		pcmd_sz,    ccT},
X	{ "time",	2,CTtime,	"time of day",					0,          ccG},
X	{ "ts",		2,CTts,		"termio display",				0,          ccC},
X	{ "tty",	2,CTtty,	"console tty name",				0,          ccG},
X	{ "vidcolor",0,0,		"",								pcmd_vidcolor,0 },
X	{ "vidnorm",0,0,		"",								pcmd_vidnorm,0  },
X	{ "vidrev",	0,0,		"",								pcmd_vidrev, 0  },
X	{ "whilei",	0,0,		"",								pcmd_whilei, 0  },
X	{ "whiles",	0,0,		"",								pcmd_whiles, 0  },
X	{ "xa",		2,CTxa,		"hex to ascii char",			0,          ccG},
X	{ "xlog",	2,CTxlog,	"protocol packet logging",		0,          ccT},
X	{ "xon",	2,CTxon,	"control xon/xoff flow control",pcmd_xon,   ccC},
X/* these cmds are interecepted by special code in ecucmd.h and appear
X * here only so they will be picked up by the help system.
X */
X	{ "!",		1,CTdummy1,	"execute shell (tty)",			0,          ccG},
X	{ "$",		1,CTdummy2,	"execute shell (comm line)",	0,          ccG},
X	{ "-",		1,CTdummy3,	"execute program",				0,          ccG},
X	{ "?",		1,CTdummy4,	"get help",						0,          ccG},
X	{ "",		0,-1,"",0,0 }	/* list ends with token value of -1 */
X};
X#endif
X
X/* end of ecucmd.h */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
$TOUCH -am 1224223090 'ecucmd.h' &&
chmod 0644 ecucmd.h ||
echo 'restore of ecucmd.h failed'
Wc_c="`wc -c < 'ecucmd.h'`"
test 11044 -eq "$Wc_c" ||
	echo 'ecucmd.h: original size 11044, current size' "$Wc_c"
# ============= ecuerror.h ==============
echo 'x - extracting ecuerror.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ecuerror.h' &&
X/*+-------------------------------------------------------------------------
X	ecuerror.h
X	wht@n4hgf.Mt-Park.GA.US
X
Xe_... values must not be changed without careful looking through code
Xerror numbers should be <= 0x7FFF to avoid problems with M_I286 versions
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
X
X#define e_USER				0x1000	/* user error differentiation */
X
X/* warning errors - do not stop proc execution */
X#define e_WARNING			0x3000
X#define eProcEmpty			0x3001  /* empty procedure */
X#define eWARNING_ALREADY	0x3002  /* warning already printed */
X#define eConnectFailed		0x3003	/* failed to connect */
X#define eNoSwitches			0x3004	/* no switch(es) to command */
X
X/* fatal errors - stop proc execution */
X#define e_FATAL				0x4000
X#define eIllegalCommand		0x4003  /* invalid command */
X#define eNoMemory			0x4004  /* no more memory available */
X#define eSyntaxError		0x4005  /* syntax error */
X#define eIllegalVarNumber	0x4006  /* variable number is invalid or out of range */
X#define eIllegalVarType		0x4007  /* unrecognized variable type */
X#define eNotInteger			0x4008  /* integer expected and not found */
X#define eFATAL_ALREADY		0x4011  /* fatal to proc, info already printed */
X#define eCONINT				0x4012  /* abort due to interrupt */
X#define eInvalidFunction	0x4013  /* invalid function name */
X#define eMissingLeftParen	0x4014  /* did not find expected left paren */
X#define eMissingRightParen	0x4015  /* did not find expected right paren */
X#define eCommaExpected		0x4016  /* expected comma not found */
X#define eProcStackTooDeep	0x4017  /* procedure stack depth exceeded */
X#define eInvalidRelOp		0x4018  /* invalid relational operator */
X#define eInvalidIntOp		0x4019  /* invalid integer operator */
X#define eInvalidStrOp		0x4020  /* invalid string operator */
X#define eNotExecutingProc	0x4022  /* not executing DO at this time */
X#define eInvalidLabel		0x4023  /* invalid label */
X#define eInternalLogicError	0x4025  /* internal logic error ... whoops */
X#define eEOF				0x4026  /* end of file or read error */
X#define eBufferTooSmall		0x4027  /* string too long */
X#define eNoParameter		0x4028  /* expected parameter not found */
X#define eBadParameter		0x4029  /* bad parameter */
X#define eInvalidHexNumber	0x402A	/* invalid hexadecimal digit */
X#define eInvalidDecNumber	0x402B	/* invalid decimal digit */
X#define eInvalidOctNumber	0x402C	/* invalid octal digit */
X#define eInteractiveCmd		0x402E	/* interactive command */
X#define eNoLineAttached		0x402F	/* no line (modem) attached */
X#define eBadFileNumber		0x4030	/* file number out of range */
X#define eNotImplemented		0x4031	/* not implemented */
X#define eDuplicateMatch		0x4032	/* more than one condition matches */
X#define eColonExpected		0x4033  /* expected colon not found */
X#define eLabelInvalidHere	0x4034  /* label not allowed on this statement */
X#define eNoCloseFrame		0x4035  /* missing '}' for '{' */
X#define eNoFrame			0x4036  /* missing command or command group after 'while' or 'if' */
X#define eMissingCommand		0x4037  /* expected command not found */
X#define eBreakCommand		0x4038  /* 'break' outside 'while' */
X#define eContinueCommand	0x4039  /* 'continue' outside 'while' */
X#define eElseCommand		0x403A  /* 'else' without matching 'if' */
X#define eInvalidVarName		0x403B  /* invalid variable name */
X#define eNoSuchVariable		0x403C  /* variable by this name not defined */
X#define eInvalidLogicOp		0x403D  /* invalid logical operator */
X#define eExpectRespondFail	0x403E  /* expect-respond failed */
X
X/* DO attention getter */
X#define e_ProcAttn			0x7000
X#define eProcAttn_GOTO		0x7000  /* GOTO detected */
X#define eProcAttn_GOTOB		0x7001  /* GOTOB detected */
X#define eProcAttn_RETURN	0x7002  /* RETURN detected */
X#define eProcAttn_ESCAPE	0x7003  /* ESCAPE detected */
X#define eProcAttn_Interrupt	0x7004  /* procedure interrupted */
X
SHAR_EOF
$TOUCH -am 1224222890 'ecuerror.h' &&
chmod 0644 ecuerror.h ||
echo 'restore of ecuerror.h failed'
Wc_c="`wc -c < 'ecuerror.h'`"
test 3939 -eq "$Wc_c" ||
	echo 'ecuerror.h: original size 3939, current size' "$Wc_c"
# ============= ecufkey.h ==============
echo 'x - extracting ecufkey.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ecufkey.h' &&
X/*+-------------------------------------------------------------------------
X	ecufkey.h -- AT XENIX/UNIX function key phrases
X	wht@n4hgf.Mt-Park.GA.US
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
X
X/*
X * indices to key mapping tables
X *
X * these are close to being magic numbers - don't change w/o looking
X * at KDEk_to_XF in ecutty.c
X */
X#define KDEk_F1		0
X#define KDEk_F2		1
X#define KDEk_F3		2
X#define KDEk_F4		3
X#define KDEk_F5		4
X#define KDEk_F6		5
X#define KDEk_F7		6
X#define KDEk_F8		7
X#define KDEk_F9		8
X#define KDEk_F10	9
X#define KDEk_F11	10
X#define KDEk_F12	11
X#define KDEk_CUU	12
X#define KDEk_CUD	13
X#define KDEk_CUL	14
X#define KDEk_CUR	15
X#define KDEk_CU5	16
X#define KDEk_PGUP	17
X#define KDEk_PGDN	18
X#define KDEk_END	19
X#define KDEk_INS	20
X#define KDEk_BKTAB	21
X#define KDEk_HOME	22
X
X#define KDE_COUNT	23
X
X#define KDE_LOGICAL_MAX		12
X#define KDE_OUTSTR_MAX		10
X
X#define KDEt_NAME		1
X#define KDEt_ENTRY		2
X#define KDEt_COMMENT	3
X#define KDEt_EOF		4
X
Xtypedef struct kde
X{
X	char logical[KDE_LOGICAL_MAX];
X	uchar KDEt;
X	char count;
X	char str[KDE_OUTSTR_MAX];
X}	KDE;
X
X/* when an count is not a count but an action: */
X#define KACT_COMMAND			-1
X#define KACT_LOCAL_SHELL		-2
X#define KACT_REDISPLAY			-3
X
Xtypedef struct XF_KDE_NAME
X{
X	uchar xf;
X	char kde;
X	char *name;
X}	XF_KDE_NAME;
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of ecufkey.h */
SHAR_EOF
$TOUCH -am 1224222890 'ecufkey.h' &&
chmod 0644 ecufkey.h ||
echo 'restore of ecufkey.h failed'
Wc_c="`wc -c < 'ecufkey.h'`"
test 1457 -eq "$Wc_c" ||
	echo 'ecufkey.h: original size 1457, current size' "$Wc_c"
true || echo 'restore of ecufork.h failed'
echo End of part 15, continue with part 16
exit 0
--------------------------------------------------------------------
Warren Tucker, TuckerWare emory!n4hgf!wht or wht@n4hgf.Mt-Park.GA.US
Hacker Extraordinaire  d' async PADs,  pods,  proteins and protocols

exit 0 # Just in case...
-- 
Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
Sterling Software, IMD           UUCP:     uunet!sparky!kent
Phone:    (402) 291-8300         FAX:      (402) 291-4362
Please send comp.sources.misc-related mail to kent@uunet.uu.net.