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

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

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

---- Cut Here and feed the following to sh ----
#!/bin/sh
# This is part 03 of ecu3
if touch 2>&1 | fgrep 'amc' > /dev/null
 then TOUCH=touch
 else TOUCH=true
fi
# ============= ecufinsert.c ==============
echo 'x - extracting ecufinsert.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ecufinsert.c' &&
X#define USE_XON_XOFF
X/*+-------------------------------------------------------------------------
X	ecufinsert.c -- insert file onto comm line
X	wht@n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	expand_filename(fname,maxlen)
X	file_insert_clear_xoff()
X	file_insert_to_line(narg,arg)
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 "ecukey.h"
X
Xextern int interrupt;
Xextern char kbdintr;		/* current input INTR */
Xextern ulong colors_current;
Xextern ulong colors_alert;
Xextern ulong colors_errors;
X
X/*+-------------------------------------------------------------------------
X	expand_filename(fname) - convert fnames with shell chars
X--------------------------------------------------------------------------*/
Xexpand_filename(fname,maxlen)
Xchar *fname;
Xint maxlen;
X{
Xchar s256[256];
Xchar *expcmd;
X
X	if(!find_shell_chars(fname))
X		return(0);
X
X	sprintf(s256,"`ls %s`",fname);
X	if(expand_cmd_with_wildlist(s256,&expcmd))
X	{
X		ff(se,"\r\nNo files match\r\n");
X		return(-1);
X	}
X	strncpy(fname,expcmd,maxlen);
X	fname[maxlen - 1] = 0;
X	if(strchr(expcmd,' '))
X	{
X		fputs("\r\nToo many files:\r\n",se);
X		fputs(expcmd,se);
X		fputs("\r\n",se);
X		free(expcmd);
X		return(-1);
X	}
X	free(expcmd);
X	return(0);
X
X}	/* end of expand_filename */
X
X/*+-------------------------------------------------------------------------
X	file_insert_clear_xoff()
X--------------------------------------------------------------------------*/
Xvoid
Xfile_insert_clear_xoff()
X{
X#ifdef USE_XON_XOFF
Xulong colors_at_entry = colors_current;
X
X	lclear_xmtr_xoff();
X#ifdef SAY_CLEARED_XOFF
X	setcolor(colors_alert);
X	fputs("--> local XOFF cleared\r",se);
X	setcolor(colors_at_entry);
X#endif
X#endif
X}	/* end of file_insert_clear_xoff */
X
X/*+-------------------------------------------------------------------------
X	file_insert_to_line(narg,arg)
X--------------------------------------------------------------------------*/
Xfile_insert_to_line(narg,arg)
Xint narg;
Xchar **arg;
X{
Xregister rchar;
Xint old_ttymode = get_ttymode();
Xlong total_chars = 0L;
Xlong total_lines = 0L;
Xulong colors_at_entry = colors_current;
Xlong timeout_msecs;
XFILE *fp;
Xchar file_string[512];
Xchar s512[512];
Xchar xmit_mode;
X#ifdef USE_XON_XOFF
Xint ixon;
Xint ixoff;
X#endif
Xchar *make_char_graphic();
X
X	if(narg > 1)
X		strncpy(s512,arg[1],sizeof(s512));	
X	else
X	{
X		ff(se,"\r\n--> File to insert on comm line: ");
X		ttygets(s512,sizeof(s512),1);
X		if( (s512[0] == ESC) || (strlen(s512) == 0) )
X		{
X			ff(se,"--> no transmission\r\n");
X			return(0);
X		}
X	}
X	if(expand_filename(s512,sizeof(s512)))
X		return(-1);
X	if((fp = fopen(s512,"r")) == (FILE *)0)
X	{
X		ff(se,"--> ");
X		perror(s512);			/* print error if we get one */
X		ff(se,"\r\n");
X		return(-1);
X	}
X
X	if(narg > 1)
X		ff(se,"\r\n");
X
X	if(narg > 2)
X		xmit_mode = *arg[2];
X	else
X	{
XASK_OPTION:
X		ff(se,"--> (S)ingle line at a time\r\n");
X		ff(se,"    (E)cho pacing\r\n");
X		ff(se,"    (F)ull speed transmission\r\n");
X		ff(se,"    (P)aced transmission (20 msec/schar)\r\n");
X		ff(se,"    (Q)uit (or ESC):             ");
X		xmit_mode = ttygetc(0) & 0x7F;
X		if(xmit_mode > 0x20)
X			fputs(make_char_graphic(xmit_mode,0),se);
X		fputs("\r\n",se);
X	}
X
X	kill_rcvr_process(SIGUSR1);
X
X	switch(xmit_mode = to_lower(xmit_mode))
X	{
X		case 's':
X			setcolor(colors_alert);
X			fputs("--> press SPACE to continue or ESC/'s' to stop\r\n",se);
X			setcolor(colors_at_entry);
X			break;
X
X		case 'e':
X			/* fall through */
X
X		case 'f':
X		case 'p':
X			setcolor(colors_alert);
X			ff(se,"--> press %s to abort\r\n",make_char_graphic(kbdintr,0));
X			setcolor(colors_at_entry);
X			ttymode(2);
X			break;
X
X		case 'q':
X		case ESC:
X			setcolor(colors_alert);
X			ff(se,"--> file insertion aborted\r\n");
X			setcolor(colors_at_entry);
X			fclose(fp);
X			return(0);
X
X		default:
X			ring_bell();
X			fputs("\r\n",se);
X			goto ASK_OPTION;
X	}
X
X#ifdef USE_XON_XOFF
X	lget_xon_xoff(&ixon,&ixoff);		/* get current line xon/xoff status */
X	lxon_xoff(IXON);					/* set it for us */
X#endif
X
X	interrupt = 0;	/* reset SIGINT flag */
X	while(fgets(file_string,sizeof(file_string),fp))
X	{
X	int xmit_len = strlen(file_string);
X	int xmit_cr = xmit_len && (file_string[xmit_len - 1] == NL);
X
X		if(xmit_cr)
X		{
X			xmit_len--;
X			file_string[xmit_len] = 0;
X		}
X		total_chars += xmit_len;
X		total_lines++;
X
X/* some destinations, like BBS msg entry, take a blank line to mean
Xend of message, so do not send completely blank lines */
X		if(!xmit_len && xmit_cr)
X		{
X			lputc(' ');
X			xmit_len = 1;
X		}
X		else if(xmit_mode == 'p')
X		{
X		register char *cptr = file_string;
X			while(*cptr)
X			{
X				lputc(*cptr++);
X				nap(20L);
X				while(rdchk(shm->Liofd))
X				{
X					rchar = lgetc_xmtr();
X					process_xmtr_rcvd_char((char)rchar,1);
X				}
X			}
X		}
X		else
X			lputs(file_string);
X		if(xmit_cr)
X		{
X			if(xmit_mode == 'p')
X				nap(20L);
X			lputc('\r');
X			xmit_len++;
X		}
X
X		if(interrupt)
X			break;
X
X		switch(xmit_mode)
X		{
X			case 's':
X				while(1)
X				{
X					if(rdchk(0))
X						break;
X					rchar = lgetc_timeout(5 * 1000L);
X					if(rchar < 0)
X						file_insert_clear_xoff();
X					else
X						process_xmtr_rcvd_char((char)rchar,1);
X					if(rchar == 0x0A)
X						break;
X				}
X				rchar = to_lower(ttygetc(1));
X				if((rchar == 's') || (rchar == ESC))
X					goto INSERT_DONE;
X				break;
X
X			case 'e':
X				timeout_msecs = 5 * 1000L;
X				while(1)
X				{
X					if(interrupt)
X						break;
X					rchar = lgetc_timeout(timeout_msecs);
X					if(rchar < 0)
X					{
X						if(!xmit_len)
X							break;
X						file_insert_clear_xoff();
X						timeout_msecs = 1 * 1000L;
X					}
X					else
X					{
X						process_xmtr_rcvd_char((char)rchar,1);
X						timeout_msecs = 100L;
X						if(xmit_len)
X							xmit_len--;
X					}
X					if(rchar == 0x0A)
X						break;
X				}
X				break;
X
X			case 'f':
X			case 'p':
X				while(rdchk(shm->Liofd))
X				{
X					rchar = lgetc_xmtr();
X					process_xmtr_rcvd_char((char)rchar,1);
X				}
X				break;
X		}
X		if(interrupt)
X			break;
X	}
X
XINSERT_DONE:
X
X	if(interrupt)
X	{
X		setcolor(colors_error);
X		ff(se,"--> Interrupted\r\n");
X		setcolor(colors_at_entry);
X	}
X
X	fclose(fp);
X
X	ttymode(old_ttymode);		/* restore old console mode */
X
X	while(((rchar = lgetc_timeout(200L)) > 0) && !interrupt)
X		process_xmtr_rcvd_char((char)rchar,1);
X
X	interrupt = 0;	/* reset SIGINT flag */
X	setcolor(colors_success);
X	ff(se,"\r\n-->  done ... sent %ld lines, %ld characters\r\n",
X				total_lines,total_chars);
X	setcolor(colors_at_entry);
X	lclear_xmtr_xoff();
X#ifdef USE_XON_XOFF
X	lxon_xoff(ixon | ixoff);	/* restore old line xon/xoff status */
X#endif
X	start_rcvr_process(1);
X	return(0);
X
X}	/* end of file_insert_to_line */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of ecufinsert.c */
SHAR_EOF
$TOUCH -am 1224222890 'ecufinsert.c' &&
chmod 0644 ecufinsert.c ||
echo 'restore of ecufinsert.c failed'
Wc_c="`wc -c < 'ecufinsert.c'`"
test 6693 -eq "$Wc_c" ||
	echo 'ecufinsert.c: original size 6693, current size' "$Wc_c"
# ============= ecufkey.c ==============
echo 'x - extracting ecufkey.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ecufkey.c' &&
X/*+-----------------------------------------------------------------
X	ecufkey.c -- function key definition
X	wht@n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	keyset_display()
X	keyset_idnum(keystr)
X	keyset_idstr(KDEt)
X	keyset_init()
X	keyset_read(keyset_name)
X	xf_to_KDEt(xf)
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 "ecukey.h"
X#include "ecufkey.h"
X#include "ecuxkey.h"
X#include "ecufork.h"
X
Xextern char kbdintr;	/* current input INTR */
Xextern char curr_dir[];	/* current working key defns */
X
XKDE		keyset_table[KDE_COUNT];
Xchar keyset_name[32] = "";
X
XXF_KDE_NAME xf_kde_name[] =
X{
X	{ XFcurup,	KDEk_CUU,	"CUU" },
X	{ XFcurdn,	KDEk_CUD,	"CUD" },
X	{ XFcurrt,	KDEk_CUR,	"CUR" },
X	{ XFcurlf,	KDEk_CUL,	"CUL" },
X	{ XFcur5,	KDEk_CU5,	"CU5" },
X	{ XFend,	KDEk_END,	"End" },
X	{ XFpgdn,	KDEk_PGDN,	"PgDn" },
X	{ XFhome,	KDEk_HOME,	"Home" },
X	{ XFpgup,	KDEk_PGUP,	"PgUp" },
X	{ XFins,	KDEk_INS,	"Ins" },
X	{ XF1,		KDEk_F1,	"F1" },
X	{ XF2,		KDEk_F2,	"F2" },
X	{ XF3,		KDEk_F3,	"F3" },
X	{ XF4,		KDEk_F4,	"F4" },
X	{ XF5,		KDEk_F5,	"F5" },
X	{ XF6,		KDEk_F6,	"F6" },
X	{ XF7,		KDEk_F7,	"F7" },
X	{ XF8,		KDEk_F8,	"F8" },
X	{ XF9,		KDEk_F9,	"F9" },
X	{ XF10,		KDEk_F10,	"F10" },
X	{ XF11,		KDEk_F11,	"F11" },
X	{ XF12,		KDEk_F12,	"F12" },
X	{ XFbktab,	KDEk_BKTAB,	"BkTab" },
X	{ 0,0,"" }
X};
X
X/*+-------------------------------------------------------------------------
X	keyset_init()
X--------------------------------------------------------------------------*/
Xvoid
Xkeyset_init()
X{
Xregister itmp;
Xregister KDE *tkde;
Xchar *make_char_graphic();
X
X	for(itmp = 0; itmp < KDE_COUNT; itmp++)
X	{
X		tkde = &keyset_table[itmp];
X		tkde->logical[0] = 0;
X		tkde->count = 0;
X		tkde->KDEt = (uchar)itmp;
X	}
X
X	keyset_name[0] = 0;
X
X	tkde = &keyset_table[KDEk_BKTAB];
X	strcpy(tkde->logical,"redisplay");
X	tkde->count = KACT_REDISPLAY;
X
X	tkde = &keyset_table[KDEk_HOME];
X	strcpy(tkde->logical,"ecu cmd");
X	tkde->count = KACT_COMMAND;
X
X	tkde = &keyset_table[KDEk_INS];
X	strcpy(tkde->logical,"local shell");
X	tkde->count = KACT_LOCAL_SHELL;
X
X	tkde = &keyset_table[KDEk_CU5];
X	strcpy(tkde->logical,"screen dump");
X	tkde->str[0] = 0x7F;	/* this key is intercepted by kbd read routine */
X	tkde->count = 0;
X
X}	/* end of keyset_init */
X
X/*+-------------------------------------------------------------------------
X	kde_fgets(buf,bufsize,fp)
X--------------------------------------------------------------------------*/
Xint
Xkde_fgets(buf,bufsize,fp)
Xchar *buf;
Xint bufsize;
XFILE *fp;
X{
Xregister itmp;
Xregister char *cptr;
X
X	if(!fgets(buf,bufsize,fp))
X	{
X		return(KDEt_EOF);
X	}
X
X	if(!(itmp = strlen(buf)))
X		return(KDEt_COMMENT);
X	if(buf[itmp - 1] == '\n')
X	{
X		buf[itmp - 1] = 0;
X		itmp--;
X	}
X	if(!itmp)
X		return(KDEt_COMMENT);
X
X	cptr = buf;
X	itmp = (strchr(" \t",*cptr)) ? KDEt_ENTRY : KDEt_NAME;
X	while(*cptr && ((*cptr == SPACE) || (*cptr == TAB)))
X		cptr++;
X
X	if(!*cptr || (*cptr == '#'))
X		return(KDEt_COMMENT);
X
X	return(itmp);
X	
X}	/* end of kde_fgets */
X
X/*+-------------------------------------------------------------------------
X	keyset_idnum(keystr)
X--------------------------------------------------------------------------*/
Xint
Xkeyset_idnum(keystr)
Xchar *keystr;
X{
Xstruct XF_KDE_NAME *xkn = xf_kde_name;
X	while(xkn->xf != 0)
X	{
X		if(!strcmpi(xkn->name,keystr))
X			return((int)xkn->kde);
X		xkn++;
X	}
X	return(-1);
X}	/* end of keyset_idnum */
X
X/*+-------------------------------------------------------------------------
X	keyset_idstr(KDEt)
X--------------------------------------------------------------------------*/
Xchar *
Xkeyset_idstr(KDEt)
Xint KDEt;
X{
Xstruct XF_KDE_NAME *xkn = xf_kde_name;
X
X	while(xkn->xf)
X	{
X		if((int)xkn->kde == KDEt)
X			return(xkn->name);
X		xkn++;
X	}
X	return((char *)0);
X}	/* end of keyset_idstr */
X
X/*+-------------------------------------------------------------------------
X	xf_to_KDEt(xf)
X--------------------------------------------------------------------------*/
Xint
Xxf_to_KDEt(xf)
Xuchar xf;
X{
Xstruct XF_KDE_NAME *xkn = xf_kde_name;
X
X	while(xkn->xf)
X	{
X		if(xkn->xf == xf)
X			return((int)xkn->kde & 0xFF);
X		xkn++;
X	}
X	return(-1);
X}	/* end of xf_to_KDEt */
X
X/*+-------------------------------------------------------------------------
X	keyset_define_key(bufptr)
X--------------------------------------------------------------------------*/
Xint
Xkeyset_define_key(bufptr)
Xchar *bufptr;
X{
Xregister itmp;
Xregister token_number;
Xregister KDE *tkde;
Xint KDEt;
Xchar token_separator[2];
Xchar *token;
Xchar *str_token();
X
X	if(itmp = strlen(bufptr))	/* itmp = len; if > 0 ... */
X		bufptr[--itmp] = 0;		/* ... strip trailing NL */
X	if(!itmp)
X		return(0);
X
X	if(bufptr[0] == '#')		/* comment? */
X		return(0);
X	if((*bufptr != 0x20) && (*bufptr != TAB))	/* if no leading space */
X		return(1);
X	if(*bufptr == 0)					/* if line all blank, break */
X		return(1);
X
X	while((*bufptr == 0x20) || (*bufptr == TAB))	/* strip lding sp/tab */
X		bufptr++;
X
X	token_number = 0;
X	strcpy(token_separator,":");
X	while(token = str_token(bufptr,token_separator))
X	{
X		bufptr = (char *)0;	/* further calls to str_token need NULL */
X		switch(token_number)
X		{
X			case 0:		/* first field is key identifier */
X				if((KDEt = keyset_idnum(token)) < 0)
X				{
X					ff(se,"  %s is not a legal key identifier\r\n",token);
X					return(0);
X				}
X				if(KDEt == KDEk_HOME)
X				{
X					ff(se,"  HOME cannot be redefined!\r\n");
X					return(0);
X				}
X				if(KDEt == KDEk_CU5)
X				{
X					ff(se,"  CUR5 cannot be redefined!\r\n");
X					return(0);
X				}
X				if(KDEt == KDEk_BKTAB)
X				{
X					ff(se,"  BkTab cannot be redefined!\r\n");
X					return(0);
X				}
X				tkde = &keyset_table[KDEt];
X				tkde->logical[0] = 0;
X				tkde->count = 0;
X				break;
X
X			case 1:		/* second field is logical key name */
X				strncpy(tkde->logical,token,sizeof(tkde->logical));
X				tkde->logical[sizeof(tkde->logical) - 1] = 0;
X				strcpy(token_separator," \t"); /* whitespace is tok sep now */
X				break;
X
X			default:	/* third and subsequent to define key */
X				if(!strlen(token))
X					continue;
X				if(tkde->count == sizeof(tkde->str))
X				{
X					ff(se,"  %s: output count too long",
X						keyset_idstr(KDEt));
X					return(0);
X				}
X				if((itmp = ascii_to_hex(token)) < 0)
X				{
X					ff(se,"  %s: '%s' invalid\r\n",
X						keyset_idstr(KDEt),token);
X					return(0);
X				}
X				tkde->str[tkde->count] = itmp;
X				tkde->count++;
X				break;
X		}	/* end of switch(token_number) */
X		token_number++;
X	}		/* end while not end of record */
X
X	return(0);
X}	/* end of keyset_define_key */
X
X/*+-------------------------------------------------------------------------
X	keyset_read(name)
Xreturns 0 on success, -1 if no .ecu/keys, -2 if no 'name'
X--------------------------------------------------------------------------*/
Xint
Xkeyset_read(name)
Xchar *name;
X{
Xregister itmp;
Xregister char *cptr;
Xstatic char ecukeys_name[128];
Xchar readkde_buf[128];
XFILE *fp_keys;
X
X	if(!ecukeys_name[0])
X	{
X		get_home_dir(ecukeys_name);
X		strcat(ecukeys_name,"/.ecu/keys");
X	}
X
X	if((fp_keys = fopen(ecukeys_name,"r")) == NULL)
X		return(-1);
X
X/* find keyset name */
X	while(fgets(readkde_buf,sizeof(readkde_buf),fp_keys) != NULL)
X	{
X		if(readkde_buf[0] == '#')		/* comment? */
X			continue;
X		if(itmp = strlen(readkde_buf))	/* itmp = len; if > 0 ... */
X			readkde_buf[--itmp] = 0;	/* ... strip trailing NL */
X		if(!itmp)
X			continue;
X		if(strcmp(readkde_buf,name) == 0)
X		{
X			itmp = 1;		/* indicate success */
X			break;
X		}
X		itmp = 0;			/* if loop terminates w/o find, failure */
X	}
X	if(!itmp)
X	{
X		fclose(fp_keys);
X		return(-2);
X	}
X
X	keyset_init();	/* clear any previous key defns */
X
X/* read past any other keyset names matching this set */
X	while(fgets(readkde_buf,sizeof(readkde_buf),fp_keys) != NULL)
X	{
X		cptr = readkde_buf;				/* first call to str_token, -> buff */
X		if((*cptr == 0x20) || (*cptr == TAB))	/* if leading space */
X		{
X			(void)keyset_define_key(cptr);
X			break;
X		}
X	}
X
X/* we found the definition ... read it */
X	while(fgets(readkde_buf,sizeof(readkde_buf),fp_keys) != NULL)
X	{
X		if(keyset_define_key(readkde_buf))
X			break;
X	}
X
X	strncpy(keyset_name,name,sizeof(keyset_name));
X	keyset_name[sizeof(keyset_name) - 1] = 0;
X	fclose(fp_keys);
X	return(0);
X}	/* end of keyset_read */
X
X/*+-------------------------------------------------------------------------
X	ffso(str)
X--------------------------------------------------------------------------*/
Xvoid
Xffso(str)
Xchar *str;
X{
X	tcap_stand_out();
X	fputs(str,se);
X	tcap_stand_end();
X}	/* end of ffso */
X
X/*+-------------------------------------------------------------------------
X	keyset_display()
X
X F1  xxxxx  F2   xxxxx   HOME xxxxx  PGUP xxxxx
X F3  xxxxx  F4   xxxxx   END  xxxxx  PGDN xxxxx
X F5  xxxxx  F6   xxxxx   INS  xxxxx  CUR5 xxxxx
X F7  xxxxx  F8   xxxxx   BkTab xxxxx
X F9  xxxxx  F10  xxxxx   CUR^ xxxxx  CUR> xxxxx
X F11 xxxxx  F12  xxxxx   CUR< xxxxx  CURv xxxxx
X--------------------------------------------------------------------------*/
Xvoid
Xkeyset_display()
X{
Xregister itmp;
Xregister itmp2;
Xint clen1 = 0;
Xchar cfmt1[32];
Xint clen2 = 0;
Xchar cfmt2[32];
Xint clen3 = 0;
Xchar cfmt3[32];
Xchar cfmt4[8];
X
X	if(!keyset_name[0])
X	{
X		keyset_init();
X		ff(se,"   no key definition active\r\n\r\n");
X		ff(se,"HOME - command prefix\r\n");
X		ff(se,"BkTab  - redisplay receiver screen\r\n");
X		ff(se,"cursor down - local shell in %s\r\n",curr_dir);
X		fputs("\r\n",se);
X	}
X	else
X	{
X		for(itmp = 0; itmp < KDE_COUNT; itmp++)
X		{
X		register KDE *tkde = &keyset_table[itmp];
X			itmp2 = strlen(tkde->logical);
X			switch(itmp)
X			{
X				case KDEk_F1: case KDEk_F3: case KDEk_F5: case KDEk_F7:
X				case KDEk_F9: case KDEk_F11:
X					if(clen1 < itmp2)
X						clen1 = itmp2;
X					break;
X
X				case KDEk_F2: case KDEk_F4: case KDEk_F6: case KDEk_F8:
X				case KDEk_F10: case KDEk_F12:
X					if(clen2 < itmp2)
X						clen2 = itmp2;
X					break;
X
X				case KDEk_HOME: case KDEk_END: case KDEk_INS:
X				case KDEk_CUU: case KDEk_CUL:
X					if(clen3 < itmp2)
X						clen3 = itmp2;
X					break;
X			}
X		}
X		sprintf(cfmt1," %%-%d.%ds",clen1,clen1);
X		sprintf(cfmt2," %%-%d.%ds",clen2,clen2);
X		sprintf(cfmt3," %%-%d.%ds",clen3,clen3);
X		strcpy(cfmt4," %s");
X		ff(se,"   key definition: %s\r\n\r\n",keyset_name);
X
X		ffso(" F1  ");ff(se,cfmt1,keyset_table[KDEk_F1].logical);
X		fputs("  ",se);
X		ffso(" F2  ");ff(se,cfmt2,keyset_table[KDEk_F2].logical);
X		fputs("  ",se);
X		ffso(" Home ");ff(se,cfmt3,keyset_table[KDEk_HOME].logical);
X		fputs("  ",se);
X		ffso(" PgUp ");ff(se,cfmt4,keyset_table[KDEk_PGUP].logical);
X		fputs("\r\n",se);
X
X		ffso(" F3  ");ff(se,cfmt1,keyset_table[KDEk_F3].logical);
X		fputs("  ",se);
X		ffso(" F4  ");ff(se,cfmt2,keyset_table[KDEk_F4].logical);
X		fputs("  ",se);
X		ffso(" End  ");ff(se,cfmt3,keyset_table[KDEk_END].logical);
X		fputs("  ",se);
X		ffso(" PgDn ");ff(se,cfmt4,keyset_table[KDEk_PGDN].logical);
X		fputs("\r\n",se);
X
X		ffso(" F5  ");ff(se,cfmt1,keyset_table[KDEk_F5].logical);
X		fputs("  ",se);
X		ffso(" F6  ");ff(se,cfmt2,keyset_table[KDEk_F6].logical);
X		fputs("  ",se);
X		ffso(" Ins  ");ff(se,cfmt3,keyset_table[KDEk_INS].logical);
X		fputs("  ",se);
X		ffso(" CUR5 ");ff(se,cfmt4,keyset_table[KDEk_CU5].logical);
X		fputs("\r\n",se);
X
X		ffso(" F7  ");ff(se,cfmt1,keyset_table[KDEk_F7].logical);
X		fputs("  ",se);
X		ffso(" F8  ");ff(se,cfmt2,keyset_table[KDEk_F8].logical);
X		fputs("  ",se);
X		ffso(" BkTab");ff(se,cfmt3,keyset_table[KDEk_BKTAB].logical);
X		fputs("\r\n",se);
X
X		ffso(" F9  ");ff(se,cfmt1,keyset_table[KDEk_F9].logical);
X		fputs("  ",se);
X		ffso(" F10 ");ff(se,cfmt2,keyset_table[KDEk_F10].logical);
X		fputs("  ",se);
X		ffso(" CUR^ ");ff(se,cfmt3,keyset_table[KDEk_CUU].logical);
X		fputs("  ",se);
X		ffso(" CUR> ");ff(se,cfmt4,keyset_table[KDEk_CUR].logical);
X		fputs("\r\n",se);
X
X		ffso(" F11 ");ff(se,cfmt1,keyset_table[KDEk_F11].logical);
X		fputs("  ",se);
X		ffso(" F12 ");ff(se,cfmt2,keyset_table[KDEk_F12].logical);
X		fputs("  ",se);
X		ffso(" CUR< ");ff(se,cfmt3,keyset_table[KDEk_CUL].logical);
X		fputs("  ",se);
X		ffso(" CURv ");ff(se,cfmt4,keyset_table[KDEk_CUD].logical);
X		fputs("\r\n\r\n",se);
X	}
X
X}	/* end of keyset_display */
X
X/* end of ecufkey.c */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
$TOUCH -am 1224222890 'ecufkey.c' &&
chmod 0644 ecufkey.c ||
echo 'restore of ecufkey.c failed'
Wc_c="`wc -c < 'ecufkey.c'`"
test 12100 -eq "$Wc_c" ||
	echo 'ecufkey.c: original size 12100, current size' "$Wc_c"
# ============= ecufork.c ==============
echo 'x - extracting ecufork.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ecufork.c' &&
X/*+-------------------------------------------------------------------------
X	ecufork.c -- ecu spawning ground
X	wht@n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	exec_cmd(cmdstr)
X	expand_cmd_with_wildlist(cmd,expcmd)
X	find_executable(progname)
X	is_executable(progname)
X	shell(shellcmd)
X	smart_fork()
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
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 "ecufork.h"
X
Xextern int rcvr_pid;
Xextern int last_child_wait_status;
Xextern int last_child_wait_pid;
X
X/*+-------------------------------------------------------------------------
X	smart_fork()
X--------------------------------------------------------------------------*/
Xint
Xsmart_fork()
X{
Xregister int count = 5;
Xregister int pid;
X
X	while(count--)
X	{
X		if((pid = fork()) >= 0)
X			return(pid);
X		if(count)
X			nap(40L);
X	}
X	return(-1);
X}	/* end of smart_fork */
X
X/*+-----------------------------------------------------------------------
X	shell(shellcmd)
X
X  param 'shellcmd' is a shell command prefixed with either
X  a '!', '$', '>' character.
X
X  '!' causes the command to run as a normal subshell of a process.
X  '$' causes the communications line to be stdin and stdout
X      for the spawned shell
X  '>' causes spawned shell to receive exactly sames files as ecu
X------------------------------------------------------------------------*/
Xvoid
Xshell(shellcmd)
Xchar *shellcmd;
X{
Xregister shellpid;
Xregister itmp;
Xregister char *cptr;
Xchar s40[40];
Xint wait_status;
X
Xint rcvr_alive = (rcvr_pid > 0);
Xchar *getenv();
X
X	if(rcvr_alive)
X		kill_rcvr_process(SIGUSR1);		/* stop receiver process gracefully */
X
X	signal(SIGINT,SIG_IGN);
X	signal(SIGTERM,SIG_IGN);
X	signal(SIGUSR1,SIG_IGN);
X	signal(SIGUSR2,SIG_IGN);
X	signal(SIGCLD,SIG_DFL);
X
X	if((shellpid = smart_fork()) < 0)
X	{
X		ff(se,"Cannot fork\r\n");
X		if(rcvr_alive)
X			start_rcvr_process(1);
X		xmtr_signals();
X		return;
X	}
X
X	ttymode(0);  	     		/* set canonical tty mode */
X	if(shellpid == 0)			/* we are the spawned (going to call shell) */
X	{
X		if(*shellcmd != '>')	/* '>' prefix means leave fd's alone! */
X		{
X			/* Hook-up our "standard output" to either the tty or
X			 * the line as appropriate for '!' or '$' */
X			close(TTYOUT);
X			fcntl(((*shellcmd == '$') ? shm->Liofd : TTYERR),F_DUPFD,TTYOUT);
X			if(*shellcmd == '$')
X			{
X				close(TTYIN);
X				fcntl(shm->Liofd,F_DUPFD,TTYIN);
X			}
X			close(shm->Liofd);
X		}
X
X		child_signals();		/* signals for child */
X
X		if(*shellcmd == '!')
X		{
X			cptr = getenv("SHELL");
X			if(cptr == (char *)0)
X				cptr = "/bin/csh";
X		}
X		else
X			cptr = "/bin/sh";
X
X		shellcmd++;
X		child_signals();
X		if(ulindex(cptr,"csh") > -1)
X		{
X			if(*shellcmd == '\0')
X				execl(cptr,"csh",(char *)0);
X			else
X				execl(cptr,"csh","-c",shellcmd,(char *)0);
X		}
X		else
X		{
X			if(*shellcmd == '\0')
X				execl(cptr,"sh",(char *)0);
X			else
X				execl(cptr,"sh","-c",shellcmd,(char *)0);
X		}
X
X		ff(se,"cannot execute %s\r\n",cptr);	/* should not get here */
X		_exit(255);								/* end of spawned process */
X	}	/* end of if child process */
X
X#if defined(FORK_DEBUG)
X	sprintf(s40,"DEBUG fork shell pid %d",shellpid);
X	ecu_log_event(getpid(),s40); /* shell */
X#endif
X
X	while(((itmp = wait(&wait_status)) != shellpid) && (itmp != -1))
X		;
X	last_child_wait_status = wait_status;
X	last_child_wait_pid = shellpid;
X
X	xmtr_signals();			/* restore standard xmtr signals */
X	ttymode(1);				/* control tty back to raw mode */
X
X/* any comm program will probably doodle with the line characteristics. */
X/* we want to make sure they are restored to normal */
X	lreset_ksr();			/* restore comm line params */
X
X	if(rcvr_alive)
X		start_rcvr_process(1);
X
X}	/* end of shell */
X
X/*+-------------------------------------------------------------------------
X	is_executable(progname)
X--------------------------------------------------------------------------*/
Xis_executable(progname)
Xchar *progname;
X{
Xstruct stat ss;
X
X	if(stat(progname,&ss) < 0)			/* if cannot stat, flunk */
X		return(0);
X	if((ss.st_mode & 0111) == 0)		/* if no --x--x--x, flunk */
X		return(0);
X	return(1);	/* whew, this OUGHT to work */
X
X}	/* end of is_executable */
X
X/*+-------------------------------------------------------------------------
X	find_executable(progname)
XPATH=':/usr/wht/bin:/bin:/usr/bin:/usr/wht/bin:/etc/tuckerware' len=56
X--------------------------------------------------------------------------*/
Xchar *
Xfind_executable(progname)
Xchar *progname;
X{
Xregister itmp;
Xstatic char *path_buf = (char *)0;
X#define PATHNAME_QUAN 32
Xstatic char *path_name[PATHNAME_QUAN + 1];
Xstatic char rtn_path[256];
Xstatic int path_count = 0;
Xchar *cptr;
Xchar *getenv();
X
X	if(path_buf == (char *)0)
X	{
X		if((cptr = getenv("PATH")) == (char *)0)
X			return(cptr);
X		if(!(path_buf = malloc(strlen(cptr) + 1)))
X			return((char *)0);
X		strcpy(path_buf,cptr);
X		path_name[PATHNAME_QUAN + 1] = (char *)0;
X		cptr = path_buf;
X		for(path_count = 0; path_count < PATHNAME_QUAN; path_count++)
X		{
X			if(*cptr == 0)
X				break;
X			path_name[path_count] = cptr;
X			while((*cptr != ':') && (*cptr != 0))
X				cptr++;
X			if(*cptr == ':')
X				*cptr++ = 0;
X		}
X	}	/* end of get and process path env variable */
X
X/* look for executable */
X	for(itmp = 0; itmp < path_count; itmp++)
X	{
X		if(*path_name[itmp] == 0)	/* if null path (./) */
X			strcpy(rtn_path,"./");
X		else
X			sprintf(rtn_path,"%s/",path_name[itmp]);
X		strcat(rtn_path,progname);
X		if(is_executable(rtn_path))
X			return(rtn_path);
X	}
X	return((char *)0);
X}	/* end of find_executable */
X
X/*+-------------------------------------------------------------------------
X	exec_cmd(cmdstr) - execute an arbitrary program with arguments
Xkills rcvr process if alive and restarts it when done if was alive
X--------------------------------------------------------------------------*/
Xexec_cmd(cmdstr)
Xchar *cmdstr;
X{
Xchar *cmdpath;
X#define MAX_EXEC_ARG 512
Xchar *cmdargv[MAX_EXEC_ARG];
Xint itmp;
Xint execpid;
Xint rcvr_alive = (rcvr_pid > 0);
Xint old_ttymode = get_ttymode();
Xint wait_status = 0;
Xextern int errno;
Xchar *strrchr();
X
X#if defined(FORK_DEBUG)
Xchar s80[80];
X	strcpy(s80,"DEBUG exec ");
X	strncat(s80,cmdstr,sizeof(s80)-12);
X	s80[sizeof(s80)-12] = 0;
X	ecu_log_event(getpid(),s80);
X#endif
X
X	build_arg_array(cmdstr,cmdargv,MAX_EXEC_ARG,&itmp);
X	if(itmp == MAX_EXEC_ARG)
X	{
X		ff(se,"Too many arguments to command\r\n");
X		return(-1);
X	}
X	else if(!itmp)
X	{
X		ff(se,"null command\r\n");
X		return(-1);
X	}
X
X	if(*cmdargv[0] == '/')
X	{
X		cmdpath = cmdargv[0];
X		cmdargv[0] = strrchr(cmdargv[0],'/') + 1;
X	}
X	else
X	{
X		if((cmdpath = find_executable(cmdargv[0])) == (char *)0)
X		{
X			ff(se,"Cannot find %s\r\n",cmdargv[0]);
X			return(-1);
X		}
X	}
X
X	if(rcvr_alive)
X		kill_rcvr_process(SIGUSR1);		/* stop receiver process gracefully */
X
X/* this code executed by the father (forking) process */
X/* wait on death of child (morbid in life, but ok here) */
X
X	signal(SIGINT,SIG_IGN);
X	signal(SIGTERM,SIG_IGN);
X	signal(SIGUSR1,SIG_IGN);
X	signal(SIGUSR2,SIG_IGN);
X	signal(SIGCLD,SIG_DFL);
X
X	if((execpid = smart_fork()) < 0)
X	{
X		ff(se,"Cannot fork\r\n");
X		if(rcvr_alive)
X			start_rcvr_process(1);
X		xmtr_signals();
X		return(-1);
X	}
X
X	if(execpid == 0)			/* we are the spawned (going to call exec) */
X	{
X		ttymode(0);  	     	/* set canonical tty mode */
X		child_signals();
X		execv(cmdpath,cmdargv);
X		perror(cmdpath);
X		exit(255);				/* end of spawned process */
X	}	/* end of if child process */
X
X	wait_status = 0;
X	while(((itmp = wait(&wait_status)) != execpid) && (itmp != -1))
X		;
X	last_child_wait_status = wait_status;
X	last_child_wait_pid = execpid;
X
X/* resume our normally scheduled program */
X	lreset_ksr();				/* restore comm line params */
X	ttymode(old_ttymode);		/* control tty back to original */
X	if(rcvr_alive)
X		start_rcvr_process(1);
X	xmtr_signals();
X	return(last_child_wait_status);
X
X}	/* end of exec_cmd */
X
X/*+-------------------------------------------------------------------------
X	expand_cmd_with_wildlist(cmd,&expcmd)
Xif return -1, error, expcmd has error message (static message)
Xif return 0, cmd has been expanded, expcmd must be free()'d when done
X--------------------------------------------------------------------------*/
Xexpand_cmd_with_wildlist(cmd,expcmd)
Xchar *cmd;
Xchar **expcmd;
X{
Xregister char *cptr;
X#define P_READ 0
X#define P_WRITE 1
Xint pipe_pid;
Xint stdout_pipe[2];
Xint stderr_pipe[2];
Xint count;
Xint itmp;
Xint wait_status;
Xint rcvr_alive = (rcvr_pid > 0);
Xchar *echo_cmd;
Xstatic char s132[132];
Xextern int errno;
Xextern char *sys_errlist[];
Xchar *strchr();
Xstatic char *pipe_err_msg = "system error: no pipe";
Xstatic char *mem_err_msg = "system error: no memory";
X
X	if(strchr(cmd,'<') || strchr(cmd,'>') || strchr(cmd,'&'))
X	{
X		*expcmd = "illegal characters: '<', '>' or '&'";
X		return(-1);
X	}
X
X	if(pipe(stdout_pipe) < 0)
X	{
X		*expcmd = pipe_err_msg;
X		return(-1);
X	}
X	if(pipe(stderr_pipe) < 0)
X	{
X		close(stdout_pipe[P_READ]);
X		close(stdout_pipe[P_WRITE]);
X		*expcmd = pipe_err_msg;
X		return(-1);
X	}
X	if(!(echo_cmd = malloc(strlen(cmd) + 10)))
X	{
X		close(stdout_pipe[P_READ]);
X		close(stdout_pipe[P_WRITE]);
X		close(stderr_pipe[P_READ]);
X		close(stderr_pipe[P_WRITE]);
X		*expcmd = mem_err_msg;
X		return(-1);
X	}
X
X	strcpy(echo_cmd,"echo ");
X	strcat(echo_cmd,cmd);
X
X
X	if(rcvr_alive)
X		kill_rcvr_process(SIGUSR1);		/* stop receiver process gracefully */
X
X	signal(SIGINT,SIG_IGN);
X	signal(SIGTERM,SIG_IGN);
X	signal(SIGUSR1,SIG_IGN);
X	signal(SIGUSR2,SIG_IGN);
X	signal(SIGCLD,SIG_DFL);
X
X	if((pipe_pid = smart_fork()) == 0)
X	{
X	int null = open("/dev/null",O_WRONLY,0);
X
X		close(stdout_pipe[P_READ]);
X		close(TTYOUT);
X		dup(stdout_pipe[P_WRITE]);
X		close(stdout_pipe[P_WRITE]);
X		close(TTYERR);
X		dup(stderr_pipe[P_WRITE]);
X		close(stderr_pipe[P_WRITE]);
X		close(null);
X		child_signals();
X		execl("/bin/csh","csh","-e","-f","-c",echo_cmd,(char *)0);
X		_exit(255);
X	}
X#if defined(FORK_DEBUG)
X	sprintf(s132,"DEBUG expand pid %d",pipe_pid);
X	ecu_log_event(getpid(),s132);		/* expand_cmd_with_wildlist */
X#endif
X
X	free(echo_cmd);
X
X	close(stdout_pipe[P_WRITE]);
X	close(stderr_pipe[P_WRITE]);
X	if(pipe_pid == -1)
X	{
X		close(stdout_pipe[P_READ]);
X		close(stderr_pipe[P_READ]);
X		*expcmd = "could not fork";
X		if(rcvr_alive)
X			start_rcvr_process(0);
X		xmtr_signals();
X		return(-1);
X	}
X
X	if(!(*expcmd = malloc(5120)))
X	{
X		close(stdout_pipe[P_READ]);
X		close(stderr_pipe[P_READ]);
X		kill(pipe_pid,SIGKILL);
X		*expcmd = mem_err_msg;
X		if(rcvr_alive)
X			start_rcvr_process(0);
X		return(-1);
X	}
X
X	cptr = *expcmd;
X	while((count = read(stdout_pipe[P_READ],cptr,64)) != 0)
X	{
X		if(count < 0)
X		{
X			if(errno == EINTR)
X			{
X				errno = 0;
X				continue;
X			}
X			free(*expcmd);
X			kill(pipe_pid,SIGKILL);
X			close(stdout_pipe[P_READ]);
X			close(stderr_pipe[P_READ]);
X			*expcmd = "error reading wild list expansion";
X			if(rcvr_alive)
X				start_rcvr_process(0);
X			return(-1);
X		}
X		cptr += count;
X		*cptr = 0;
X		if(*(cptr - 1) == '\n')
X		{
X			*(cptr - 1) = 0;
X			break;
X		}
X	}
X	close(stdout_pipe[P_READ]);
X	if(!strlen(*expcmd))
X	{
X		free(*expcmd);
X		count = read(stderr_pipe[P_READ],s132,sizeof(s132) - 1);
X		if(count < 0)
X			strcpy(s132,sys_errlist[errno]);
X		else
X			s132[count] = 0;
X		if(s132[count - 1] == '\n')
X			s132[count - 1] = 0;
X		close(stderr_pipe[P_READ]);
X		if(strncmp(s132,"echo: ",6))
X			*expcmd = s132;
X		else
X			*expcmd = s132 + 6;
X		if(rcvr_alive)
X			start_rcvr_process(0);
X		return(-1);
X	}
X
X	wait_status = 0;
X	while(((itmp = wait(&wait_status)) != pipe_pid) && (itmp != -1))
X		;
X
X	xmtr_signals();
X	if(wait_status)
X	{
X		free(*expcmd);
X		count = read(stderr_pipe[P_READ],s132,sizeof(s132) - 1);
X		if(count < 0)
X			strcpy(s132,sys_errlist[errno]);
X		else
X			s132[count] = 0;
X		if(s132[count - 1] == '\n')
X			s132[count - 1] = 0;
X		close(stderr_pipe[P_READ]);
X		if(strncmp(s132,"echo: ",6))
X			*expcmd = s132;
X		else
X			*expcmd = s132 + 6;
X		if(rcvr_alive)
X			start_rcvr_process(0);
X		return(-1);
X	}
X	close(stderr_pipe[P_READ]);
X
X	if(rcvr_alive)
X		start_rcvr_process(0);
X	return(0);
X}	/* end of expand_cmd_with_wildlist */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
$TOUCH -am 1224222990 'ecufork.c' &&
chmod 0644 ecufork.c ||
echo 'restore of ecufork.c failed'
Wc_c="`wc -c < 'ecufork.c'`"
test 12087 -eq "$Wc_c" ||
	echo 'ecufork.c: original size 12087, current size' "$Wc_c"
# ============= ecuicmaux.c ==============
echo 'x - extracting ecuicmaux.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ecuicmaux.c' &&
X/*+-------------------------------------------------------------------------
X	ecuicmaux.c -- ecuicmd.c auxiliary functions
X	wht@n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	icmd_escape_str()
X	display_ascii_names()
X	nlin_nlout_control(token,narg,arg)
X	icmd_conversion(token,narg,arg)
X	icmd_log(token,narg,arg)
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 "ecuerror.h"
X#include "ecucmd.h"
X
X#if !defined(M_XENIX) || defined(M_UNIX)
Xextern int cmd_escape;		/* icmd escape */
X#endif
Xextern int rcvr_pid;
X
Xchar rcvr_log_file[256];	/* if rcvr_log!= 0,log filename */
Xint rcvr_log = 0;			/* rcvr log active if != 0 */
Xint rcvr_log_gen_title = 0;	/* gen log header on next open (rcvr process) */
XFILE *rcvr_log_fp;			/* rcvr log file */
Xint rcvr_log_append = 1;
Xint rcvr_log_raw = 0;
Xint rcvr_log_flusheach = 0;
X
X/*+-------------------------------------------------------------------------
X	icmd_escape_str()
X--------------------------------------------------------------------------*/
Xchar *
Xicmd_escape_str()
X{
X#if defined(M_XENIX) || defined(M_UNIX)
X	return("HOME ");
X#else
Xchar *make_char_graphic();
X	return(make_char_graphic(cmd_escape,0));
X#endif
X}	/* end of icmd_escape_str */
X
X/*+-----------------------------------------------------------------------
X	display_ascii_names()
X------------------------------------------------------------------------*/
Xvoid
Xdisplay_ascii_names()
X{
Xregister intval;
X
X	for(intval = 0; intval < 32; intval++)
X	{
X		ff(se,"%s %3d %03o %02x ^%c | ",hex_to_ascii_name((intval)),
X				(intval),(intval),(intval),(intval) |0x40);
X		ff(se,"    %3d %03o %02x  %c | ",
X				intval+32,intval+32,intval+32,intval+32);
X		ff(se,"    %3d %03o %02x  %c | ",
X				intval+64,intval+64,intval+64,intval+64);
X		if(intval != 31)
X		{
X			ff(se,"    %3d %03o %02x  %c\r\n",
X					intval+96,intval+96,intval+96,intval+96);
X		}
X		else
X		{
X			ff(se,"    %3d %03o %02x  ^?\r\n",
X					intval+96,intval+96,intval+96);
X		}
X	}
X
X}	/* end of display_ascii_names */
X
X/*+-------------------------------------------------------------------------
X	icmd_conversion(token,narg,arg)
X--------------------------------------------------------------------------*/
Xvoid
Xicmd_conversion(token,narg,arg)
Xint token;
Xint narg;
Xchar **arg;
X{
Xregister itmp;
X
X	switch(token)
X	{
X	case CTxa:
X	case CToa:
X	case CTda:
X		if(narg > 1)
X		{
X		int result;
X		char format[4];
X			sprintf(format,"%%%c",to_lower(*arg[0]));
X			if(sscanf(arg[1],format,&result) == 0)
X			{
X				ff(se,"  invalid argument\r\n");
X				return;
X			}
X			result &= 0xFF;
X			if(result == ' ')
X				ff(se," == ' ' 0x20\r\n",make_char_graphic(result,1));
X			else
X				ff(se," == %s\r\n",make_char_graphic(result,1));
X		}
X		else
X		{
X			ff(se,"\r\n");
X			display_ascii_names();
X		}
X		break;
X	case CTax:
X		if(arg[1] == (char *)0)
X		{
X			ff(se,"\r\n");
X			display_ascii_names();
X			break;
X		}
X		switch(strlen(arg[1]))
X		{
X			case 1:
X				ff(se," == 0x%02x\r\n",*arg[1]);
X				break;
X			case 2:
X				if(*arg[1] == '^')
X				{
X					itmp = to_upper(*(arg[1] + 1));
X					if((itmp < '@') || (itmp > '_'))
X					{
X						ff(se,"  not a valid control character\r\n");
X						return;
X					}
X					itmp &= 0x1F;
X					ff(se," == 0x%02x %s\r\n",itmp,make_char_graphic(itmp,1));
X					break;
X				}	/* else fall thru */
X			case 3:
X				if((itmp = ascii_name_to_hex(arg[1])) > -1)
X				{
X					ff(se," == 0x%02x %s\r\n",itmp,make_char_graphic(itmp,1));
X					break;
X				}	/* else fall thru */
X			default:
X				ff(se,"  invalid ... examples of valid parameters:\r\n");
X				ff(se,"        ^A ETX  or  printable character\r\n");
X				break;
X		}
X		break;
X	default:
X		ff(se,"  invalid command\r\n");
X	}
X}	/* end of icmd_conversion */
X
X/*+-------------------------------------------------------------------------
X	icmd_log(token,narg,arg)
X--------------------------------------------------------------------------*/
Xint
Xicmd_log(token,narg,arg)
Xint token;
Xint narg;
Xchar **arg;
X{
Xregister itmp;
Xregister itmp2;
X
X	switch(token)
X	{
X	case CTloff:
X		goto LOG_OFF;
X		break;
X#if defined(M_XENIX) || defined(M_UNIX)
X	case CTllp:
X		icmd("log /dev/lp1");
X#endif
X		break;
X	case CTlog:
X		if(narg > 1)
X		{
X			if(minunique("off",arg[1],3))
X			{
XLOG_OFF:
X				if(rcvr_log == 0)	/* "off",but not logging */
X					goto RECORD_REPORT;
X				ff(se,"\r\nlogging concluded (file %s)\r\n",rcvr_log_file);
X				shmx_set_rcvr_log("",0,0,0);
X				rcvr_log = 0;
X				rcvr_log_file[0] = 0;
X				return(0);
X			}
X/* turning logging on */
X			itmp2 = -1;
X			rcvr_log_append = 1;
X			rcvr_log_raw = 0;
X			for(itmp = 1; itmp < narg; itmp++)
X			{
X				if(*arg[itmp] == '-')
X				{
X					switch(arg[itmp][1])
X					{
X						case 's': rcvr_log_append = 0; break;
X						case 'r': rcvr_log_raw = 1; break;
X						case 'f': rcvr_log_flusheach = 1; break;
X						default:
X							ff(se,"   unrecognized switch -%c\r\n",
X										arg[itmp][1]);
X							log_cmd_usage();
X							return(eFATAL_ALREADY);
X					}
X				}
X				else
X				{
X					if(itmp2 > 0)
X					{
X						ff(se,"   too many positional arguments\r\n");
X						log_cmd_usage();
X						return(eFATAL_ALREADY);
X					}
X					itmp2 = itmp;
X				}
X			}
X			if(itmp2 < 0)
X			{
X				ff(se,"   no log file name specified\r\n");
X				log_cmd_usage();
X				return(eFATAL_ALREADY);
X			}
X			if(arg[itmp2][0] != '/')	/* if log file not full path, ... */
X			{							/* ... supply current directory */
X				get_curr_dir(rcvr_log_file,
X					sizeof(rcvr_log_file) - strlen(arg[itmp2]) - 2);
X				strcat(rcvr_log_file,"/");
X				strcat(rcvr_log_file,arg[itmp2]);
X			}
X			else
X				strcpy(rcvr_log_file,arg[itmp2]);
X
X			/* try to open the file if we can */
X			rcvr_log_fp = fopen(rcvr_log_file,"a");
X			if(rcvr_log_fp != NULL)		/* if success */
X			{
X				fclose(rcvr_log_fp);
X				rcvr_log_fp = NULL;
X				rcvr_log = 1;
X				shmx_set_rcvr_log(rcvr_log_file,rcvr_log_append,rcvr_log_raw,
X					rcvr_log_flusheach);
X			}
X			else		/* xmtr() could not open file */
X			{
X				ff(se,"   could not open ");
X				perror(rcvr_log_file);
X				ff(se,"\r\n");
X				return(eFATAL_ALREADY);
X			}
X			rcvr_log_append = 1;
X		}	/* end of if argument to command */
X
XRECORD_REPORT:
X		if(rcvr_log)
X		{
X			ff(se,"\r\n%sing received %s text to\r\n%s\r\n",
X				(rcvr_log_append) ? "append" : "writ",
X				(rcvr_log_raw)    ? "raw"    : "filtered",
X				rcvr_log_file);
X			ff(se,"use \"%slog off\" to stop logging\r\n",
X					icmd_escape_str());
X		}
X		else
X		{
X			ff(se,"   not logging.\r\n");
X			ff(se,"use \"%slog <filename>\" to start logging\r\n",
X					icmd_escape_str());
X		}
X		break;
X	default:
X		ff(se,"  invalid command\r\n");
X		return(eFATAL_ALREADY);
X	}
X	return(0);
X}	/* end of icmd_log */
X
X/*+-------------------------------------------------------------------------
X	nlin_nlout_control(token,narg,arg)
X--------------------------------------------------------------------------*/
Xvoid
Xnlin_nlout_control(token,narg,arg)
Xint token;
Xint narg;
Xchar **arg;
X{
X	switch(token)
X	{
X	case CTnlin:
X		if(narg != 1)
X			shm->Ladd_nl_incoming = yes_or_no(arg[1]);
X		ff(se,"  %sappending NL to incoming CR\r\n",
X			(shm->Ladd_nl_incoming) ? "" : "not ");
X		break;
X	case CTnlout:
X		if(narg != 1)
X			shm->Ladd_nl_outgoing = yes_or_no(arg[1]);
X		ff(se,"  %sappending NL to outgoing CR\r\n",
X			(shm->Ladd_nl_outgoing) ? "" : "not ");
X		break;
X	default:
X	case CTnl:
X		ff(se,"  incoming: %s  outgoing: %s\r\n",
X			(shm->Ladd_nl_incoming) ? "CR/LF" : "CR",
X			(shm->Ladd_nl_outgoing) ? "CR/LF" : "CR");
X		break;
X	}
X
X}	/* end of nlin_nlout_control */
X
X/* end of ecuicmaux.c */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
$TOUCH -am 1224224790 'ecuicmaux.c' &&
chmod 0644 ecuicmaux.c ||
echo 'restore of ecuicmaux.c failed'
Wc_c="`wc -c < 'ecuicmaux.c'`"
test 7552 -eq "$Wc_c" ||
	echo 'ecuicmaux.c: original size 7552, current size' "$Wc_c"
# ============= ecuicmd.c ==============
echo 'x - extracting ecuicmd.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ecuicmd.c' &&
X/*+-----------------------------------------------------------------------
X	ecuicmd.c - ECU interactive command handler
X	wht@n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	icmd(icmd_cmd)
X	icmd_do_proc(narg,arg)
X	search_cmd_list(cmd_list,cmd)
X
X------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:12-24-1990-04:31-wht@n4hgf-experimental esio driver command */
X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
X
X#include "ecu.h"
X#include "esd.h"
X#include "ecufkey.h"
X#include "patchlevel.h"
X
X#define NEED_P_CMD
X#include "ecucmd.h"
X
Xchar *icmd_escape_str();
X
Xextern KDE keyset_table[];
Xextern char *makedate;
Xextern char curr_dir[];
Xextern char hello_str[];
Xextern char keyset_name[];
Xextern char rcvr_log_file[];	/* if rcvr_log!= 0,log filename */
Xextern int interrupt;
Xextern int current_ttymode;
Xextern int errno;
Xextern int proc_level;
Xextern int proctrace;
Xextern int rcvr_log;			/* rcvr log active if != 0 */
Xextern int rcvr_log_append;	/* if true, append, else scratch */
Xextern int rcvr_log_raw;		/* if true, log all, else filter ctl chrs */
Xextern int rcvr_pid;
Xextern ulong colors_current;
Xextern FILE *plog_fp;
Xextern ESD  *plog_name;
Xextern char screen_dump_file_name[];
X
Xint protocol_log_packets = 0;
Xint want_bell_notify = 1;	/* want bell notify */
Xint cmd_escape;
X
X/*+-------------------------------------------------------------------------
X	search_cmd_list(cmd_list,cmd)
Xreturns -1 if cmd not found or insufficient chars for match
Xelse token value for command
Xproc-only commands have 'min' values 0
X--------------------------------------------------------------------------*/
Xsearch_cmd_list(cmd_list,cmd)
Xregister P_CMD *cmd_list;
Xregister char *cmd;
X{
X	while(cmd_list->token != -1)
X	{
X		if(cmd_list->min && minunique(cmd_list->cmd,cmd,cmd_list->min))
X			return(cmd_list->token);
X		cmd_list++;
X	}
X	return(-1);
X
X}	/* end of search_cmd_list */
X
X/*+-------------------------------------------------------------------------
X	icmd_do_proc(narg,arg)
X--------------------------------------------------------------------------*/
Xicmd_do_proc(narg,arg)
Xint narg;
Xchar **arg;
X{
Xregister erc;
Xulong colors_at_entry = colors_current;
X
X	kill_rcvr_process(SIGUSR1);
X	ttymode(2);
X	erc = do_proc(narg,arg);
X	proc_file_reset();
X	ttymode(1);
X	interrupt = 0;
X	setcolor(colors_notify);
X	ff(se,"[procedure finished]");
X	setcolor(colors_at_entry);
X	ff(se,"\r\n");
X	start_rcvr_process(0);
X	return(erc);
X}	/* end of icmd_do_proc */
X
X/*+-----------------------------------------------------------------------
X	icmd(cmd)
X This function implements the built in commands
X It returns non-zero if program should terminate
X------------------------------------------------------------------------*/
Xint
Xicmd(icmd_cmd)
Xregister char *icmd_cmd;
X{
X
X#define ARG_MAX_QUAN 40
Xchar *arg[ARG_MAX_QUAN];
Xchar cmd[128];
Xint itmp;
Xint token;
Xint narg = 0;
XESD *tesd;
Xchar s80[80];
Xchar *epoch_secs_to_str();
Xlong atol();
Xlong rcvr_chars;
Xlong rcvr_chars_this_connect;
Xchar *find_procedure();
Xchar *xon_status();
X
X	icmd_history_add(icmd_cmd);		/* add to history list */
X	strcpy(cmd,icmd_cmd);			/* get local copy of cmd string */
X	switch(cmd[0]) 
X	{
X		case '.':		/* exit xmtr() (generally program too) */
X			ff(se,"  disconnecting from line %s\r\n",shm->Lline);
X			return(1);
X		case '!':
X		case '$':
X		case '>':
X			ff(se,"\r\n");
X			shell(cmd);
X			return(0);
X		case '-':
X			ff(se,"\r\n");
X			exec_cmd(&cmd[1]);
X			return(0);
X		case '^':
X			ff(se,"\r\n");
X			phrase_help();
X			return(0);
X		case '?':
X			icmd_help(0,(char **)0);
X			return(0);
X#ifdef DEBUG_SHM_SCREEN
X		case '@':
X			{
X			FILE *fp = fopen("/tmp/screen","w");
X			int y,x;
X			char *cptr = (char *)shm->screen;
X				for(y = 0; y < 43; y++)
X				{
X					for(x = 0; x < 80; x++)
X						fputc(*cptr++,fp);
X					fputc('\n',fp);
X				}
X				fclose(fp);
X			}
X			break;
X#endif
X		default:
X			break;
X	}
X
X/* not single character argument */
X	build_arg_array(cmd,arg,ARG_MAX_QUAN,&narg);
X
X/* handle phrases */
X	if(isdigit(*arg[0]))
X	{
X		phrases(narg,arg);
X		return(0);
X	}
X
X/* search command list */
X	if((token = search_cmd_list(icmd_cmds,arg[0])) < 0)
X	{
X		ff(se,"\r\n");
X		if(find_procedure(arg[0]))
X		{
X			icmd_do_proc(narg,arg);
X			return(0);
X		}
X		ff(se,"no such command or procedure ... %s? for help\r\n",
X			icmd_escape_str());
X		return(0);
X	}
X
X	switch(token)
X	{					/* keep alphabetized PLEASE */
X		case CTrx:
X		case CTry:
X		case CTrz:
X		case CTrk:
X		case CTrs:
X		receive_files_from_remote(narg,arg);
X		break;
X
X		case CTsx:
X		case CTsy:
X		case CTsz:
X		case CTsk:
X		case CTss:
X		send_files_to_remote(narg,arg);
X		break;
X
X		case CTbaud:
X		if(narg == 1)
X			ff(se,"   baud rate is %u\r\n",shm->Lbaud);
X		else
X		{
X			itmp = atoi(arg[1]);
X			if(!lnew_baud_rate(itmp))
X				ff(se,"   baud rate set to %u\r\n",shm->Lbaud);
X			else
X			{
X				ff(se,"   invalid baud rate: %u\r\n",itmp);
X				ff(se,"valid rates: 110,300,600,1200,2400,4800,9600,19200\r\n");
X			}
X		}
X		break;
X
X		case CTbreak:
X		lbreak();
X		ff(se,"   break sent\r\n");
X		break;
X
X		case CTcd:
X		change_directory(arg[1],(narg == 1) ? 0 : 1);
X		break;
X
X		case CTclrx:
X		lclear_xmtr_xoff();
X		break;
X
X		case CTdial:
X		if(narg > 1)
X		{
X			ff(se,"\r\n");
X			strcpy(shm->Llogical,arg[1]);
X			if(!lookup_logical_telno())
X				ff(se,"No such entry. Try 'dial' with no arguments\r\n");
X			else
X			{
X				if(isdigit(shm->Llogical[0]) ||
X					!find_procedure(shm->Llogical))
X					DCE_dial();
X				else
X				{
X					arg[0] = shm->Llogical;
X					arg[1] = "!INTERACTIVE";
X					icmd_do_proc(2,arg);
X				}
X			}
X		}
X		else
X		{
X			pde_list_manager();
X		}
X		break;
X
X		case CTdo:
X		ff(se,"\r\n");
X		icmd_do_proc(narg - 1,&arg[1]);
X		break;
X
X		case CTptrace:
X		if(narg > 1)
X			proctrace = yes_or_no(arg[1]);
X		ff(se,"  procedure trace %s", proctrace ? "on" : "off");
X		if(proctrace > 1)
X			ff(se," (%d)",proctrace);
X		ff(se,"\r\n");
X		break;
X
X		case CTpcmd:
X		itmp = strlen(arg[0]);
X		if((tesd = make_esd(256)) == (ESD *)0)
X		{
X			ff(se,"  no memory!!?!\r\n");
X			break;
X		}
X		strcpy(tesd->pb,icmd_cmd + itmp + 1);
X		tesd->cb = strlen(tesd->pb);
X		ff(se,"\r\n");
X		kill_rcvr_process(SIGUSR1);
X		ttymode(2);
X		if(itmp = execute_esd(tesd))
X		{
X			proc_error(itmp);
X			show_esd(tesd,"");
X		}
X		free_esd(tesd);
X		ttymode(1);
X		start_rcvr_process(0);
X		break;
X
X		case CTplog:
X		fputs("  ",se);
X		if(narg > 1)
X		{
X			if(!strcmp(arg[1],"off"))
X				plog_control((char *)0);
X			else
X				plog_control(arg[1]);
X		}
X		
X		if(plog_fp)
X			ff(se,"procedure logging: %s\r\n",plog_name->pb);
X		else
X			fputs("procedure logging off\r\n",se);
X		break;
X
X		case CTduplex:
X		if(narg > 1)
X		{
X			switch(to_lower(*arg[1]))
X			{
X				case 'f': shm->Lfull_duplex = 1; ff(se,"  now "); break;
X				case 'h': shm->Lfull_duplex = 0; ff(se,"  now "); break;
X				default: ff(se,
X"\r\nfirst argument character must be F or H for full or half duplex\r\n");
X					break;
X			}
X		}
X		else		/* no argument */
X			ff(se,"  currently ");
X
X		ff(se,"%s duplex\r\n",(shm->Lfull_duplex) ? "full" : "half");
X		break;
X
X		case CTexit:
X		ff(se,"  disconnecting from line %s\r\n",shm->Lline);
X		return(1);
X
X		case CTfi:
X		file_insert_to_line(narg,arg);
X		break;
X
X		case CThangup:
X		ff(se,"   hanging up ... ");
X		DCE_hangup();
X		ff(se,"done\r\n");
X		break;
X
X		case CThelp:
X		icmd_help(narg,arg);
X		break;
X
X		case CTsdname:
X		if(narg > 1)
X		{
X		char *new_file_name;
X
X			itmp = 0;	/* do not need to free(new_file_name) */
X			if(find_shell_chars(arg[1]))
X			{
X
X				if(expand_cmd_with_wildlist(arg[1],&new_file_name))
X				{
X					ff(se,"  %s\r\n",new_file_name);
X					break;
X				}
X				itmp = 1;	/* need to free(new_file_name) */
X			}
X			else
X				new_file_name = arg[1];
X
X			screen_dump_file_name[0] = 0;
X			if(*new_file_name != '/')
X			{
X				strcpy(screen_dump_file_name,curr_dir);
X				strcat(screen_dump_file_name,"/");
X			}
X			strcat(screen_dump_file_name,arg[1]);
X			if(itmp)
X				free(new_file_name);
X		}
X		ff(se,"\r\nscreen dump name: %s\r\n",screen_dump_file_name);
X		break;
X
X		case CTlog:
X		case CTloff:
X		case CTllp:
X		icmd_log(token,narg,arg);
X		break;
X
X		case CTnl:
X		case CTnlin:
X		case CTnlout:
X		nlin_nlout_control(token,narg,arg);
X		break;
X
X		case CTparity:
X		if(narg > 1)
X		{
X			switch(to_lower(*arg[1]))
X			{
X				case 'n':
X					shm->Lparity = 0; break;
X				case 'e':
X				case 'o':
X					shm->Lparity = to_lower(*arg[1]); break;
X				default:
X					ff(se,"   unrecognized parity: %c\r\n",*arg[1]);
X					goto PARITY_DONE;
X			}
X			lset_parity(1);
X		}
X		ff(se,"   parity set to %c\r\n",
X			(shm->Lparity) ? to_upper(shm->Lparity) : 'N');
XPARITY_DONE: ;
X		break;
X
X		case CTpid:
X		ff(se,": xmtr %d, rcvr: %d, parent: %d, group: %d\r\n",
X			getpid(0),rcvr_pid,getppid(0),getpgrp(0));
X		break;
X
X		case CTpwd:
X		fputs(" ",se);
X		tcap_stand_out();
X		ff(se," %s ",curr_dir);
X		tcap_stand_end();
X		fputs("\r\n",se);
X		break;
X
X		case CTredial:
X		(void)DCE_redial(arg,narg);
X		break;
X
X		case CTrev:
X		fputs("\r\n",se);
X		fputs(hello_str,se);
X		fputs("\r\n",se);
X		ff(se,"%s\r\n",makedate);
X		break;
X
X		case CTtime:
X		get_tod(4,cmd);
X		ff(se,": %s\r\n",cmd);
X		break;
X
X		case CTts:
X		ff(se,"\r\n");
X		sprintf(s80,"TTYIN %s (ttymode=%d)",get_ttyname(),current_ttymode);
X		disp_line_termio(TTYIN,s80);
X		ff(se,"\r\n");
X		sprintf(s80,"comm line %s",shm->Lline);
X		disp_line_termio(shm->Liofd,s80);
X		break;
X
X#if	defined(ESIO_IN_USE)
X		case CTesio:
X		icmd_esio(narg,arg);
X		break;
X#endif
X		case CTtty:
X		ff(se,"   %s\r\n",get_ttyname());
X		break;
X
X		case CTda:
X		case CToa:
X		case CTxa:
X		case CTax:
X		icmd_conversion(token,narg,arg);
X		break;
X
X		case CTbn:
X		if(narg > 1)
X		{
X			want_bell_notify = yes_or_no(arg[1]);
X			shmx_set_rcvr_bn(want_bell_notify);
X		}
X		ff(se,"  bell notify %s%s\r\n",
X					want_bell_notify ? "on" : "off",
X					(want_bell_notify == 2) ? ": ring on incoming char" : "");
X		break;
X
X		case CTrtscts:
X		if(narg > 1)
X		{
X			lRTSCTS_control(yes_or_no(arg[1]));
X		}
X		ff(se,"  RTS %s CTS %s\r\n",
X			(Ltermio.c_cflag & RTSFLOW) ? "on" : "off",
X			(Ltermio.c_cflag & CTSFLOW) ? "on" : "off");
X		break;
X
X		case CTfkey:
X		if(narg < 2)
X			keyset_display();
X		else
X		{
X			switch(keyset_read(arg[1]))
X			{
X				case  0: keyset_display(); break;
X				case -1: ff(se," cannot find ~/.ecu/keys\r\n"); break;
X				case -2: ff(se," not found in ~/.ecu/keys\r\n"); break;
X			}
X		}
X		break;
X
X		case CTstat:
X		ff(se,"\r\n\r\nDate/time");
X		get_tod(4,cmd);
X		ff(se,": %s\r\n",cmd);
X		ff(se,"Console: %s  communications line: %s  ",
X			get_ttyname(),shm->Lline);
X		ff(se,"%u-%c-1\r\n",shm->Lbaud,
X			(shm->Lparity) ? to_upper(shm->Lparity) : 'N');
X		if(shm->Lmodem_off_hook)
X		{
X			ff(se,"Connected to %s: %s (%s)\r\n",
X				shm->Lrname,shm->Ldescr,shm->Ltelno);
X			ff(se,"at %s (elapsed %s)\r\n",
X				epoch_secs_to_str(shm->Loff_hook_time,1,s80),
X				get_elapsed_time(time((long *)0) - shm->Loff_hook_time));
X		}
X		ff(se,"Current directory: %s\r\n",curr_dir);
X		ff(se,"Total chars transmitted: %ld",shm->xmit_chars);
X		if(shm->Lmodem_off_hook)
X			ff(se," (since CONNECT %ld)\r\n",
X				shm->xmit_chars_this_connect);
X		else
X			fputs("\r\n",se);
X		shmx_rc_report(&rcvr_chars,&rcvr_chars_this_connect);
X		ff(se,"Total chars received:    %ld",rcvr_chars);
X		if(shm->Lmodem_off_hook)
X			ff(se," (since CONNECT %ld)\r\n",rcvr_chars_this_connect);
X		else
X			fputs("\r\n",se);
X		if(keyset_name[0])
X			ff(se,"Function key set '%s' loaded\r\n",keyset_name);
X		else
X			ff(se,"No function key set loaded\r\n");
X		if(rcvr_log)
X			ff(se,"Session log open: %s (%s mode)\r\n",
X				rcvr_log_file,(rcvr_log_raw) ? "raw" : "filtered");
X		else
X			ff(se,"Session logging not active\r\n");
X		ff(se,"Bell notify is %s\r\n",(want_bell_notify) ? "on" : "off");
X		ff(se,"Duplex: %s\r\n",(shm->Lfull_duplex) ? "full" : "half");
X		ff(se,"CR conversion:  incoming %s  outgoing %s\r\n",
X			(shm->Ladd_nl_incoming) ? "CR/LF" : "CR",
X			(shm->Ladd_nl_outgoing) ? "CR/LF" : "CR");
X		fputs("\r\n",se);
X		break;
X
X		case CTxlog:
X		if(narg > 1)
X		{
X			protocol_log_packets = yes_or_no(arg[1]);
X		}
X		ff(se,"  protocol packet logging %s\r\n",
X			(protocol_log_packets) ? "on" : "off");
X		break;
X
X		case CTxon:
X		if(narg > 1)
X		{
X			if(set_xon_xoff_by_arg(arg[1]))
X				ff(se,"  argument error\r\n");
X			else
X				ff(se,"\r\n");
X			break;
X		}
X		ff(se,"  xon/xoff flow control: %s\r\n",xon_status());
X		break;
X
X		case CTsgr:
X		send_get_response(token,narg,arg);
X		break;
X
X/*
X		case CTmkdir:
X		if(narg < 2)
X			ff(se,"  no argument\r\n");
X		if(mkdir(arg[2],0755))
X		{
X			ff(se,"  ");
X			pperror(arg[2]);
X		}
X		else
X			ff(se,"  made directory %s\r\n",arg[2]);
X		break;
X*/
X
X		case 0:
X		ff(se,"   procedure command not allowed in interactive mode\r\n");
X		break;
X
X		default:
X		do_proc(narg,arg);
X		interrupt = 0;
X		break;
X
X	}
X	return(0);		/* 0 == do not end program */
X
X}	/* end of icmd */
X
X/* end of ecuicmd.c */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
$TOUCH -am 1224224790 'ecuicmd.c' &&
chmod 0644 ecuicmd.c ||
echo 'restore of ecuicmd.c failed'
Wc_c="`wc -c < 'ecuicmd.c'`"
test 12735 -eq "$Wc_c" ||
	echo 'ecuicmd.c: original size 12735, current size' "$Wc_c"
true || echo 'restore of ecuicmhelp.c failed'
echo End of part 3, continue with part 4
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.