[alt.sources] ecu - SCO XENIX V/{2,3}86 Extended CU part 04/47

wht@tridom.uucp (Warren Tucker) (10/09/89)

---- Cut Here and unpack ----
#!/bin/sh
# this is part 4 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file ecuhayes.c continued
#
CurArch=4
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
echo "x - Continuing file ecuhayes.c"
sed 's/^X//' << 'SHAR_EOF' >> ecuhayes.c
X	interrupt = 0;
X
X}	/* end of hayes_get_result */
X
X/*+-------------------------------------------------------------------------
X	hayes_modem_init()
X--------------------------------------------------------------------------*/
Xhayes_modem_init()
X{
Xregister itmp;
Xint retries = 0;
Xchar *cmd;
Xchar *cptr;
Xchar ctmp;
X
X	if(Lmodem_already_init)
X		return(0);
X
X	interrupt = 0;
X	hayes_read_modem_init();
X
X	lputs_paced(0,"\b\b\b\b\b\b\b\b\b\r");
X	nap(200L);
X	lflush(0);
X
X	while(!Lmodem_already_init)
X	{
XINIT_LOOP:
X		if(retries > 3)
X			return(-1);
X
X		if(interrupt)
X			return(-1);
X
X		if(retries)
X		{
X			ltoggle_dtr();
X			lputs_paced(0,"AT\r");
X			nap(400L);
X			lputs_paced(0,"ATQ0V1E1\r");
X			nap(400L);
X		}
X
X		lflush(0);
X		cmd = Lmodem_init;
X		itmp = 0;
X#ifdef NEUROTIC
X		while(*cmd)
X		{
X			lputc_paced(0,*cmd++);
X			if(++itmp < 2)
X				nap(40L);
X			if((itmp = lgetc_timeout(500L)) < 0)
X			{
X				if(interrupt)
X					return(-1);
X				retries++;
X				goto INIT_LOOP;
X			}
X			pputc(itmp);
X		}
X#else
X		lputs(cmd);
X		pputs(cmd);
X#endif
X
X		pputc(NL);
X		lputc_paced(0,CR);
X
X		itmp = 0;
X		while(itmp != CR)
X		{
X			if((itmp = lgetc_timeout(500L)) < 0)
X			{
X				if(interrupt)
X					return(-1);
X				pputs("missed reading \\r\n");
X				retries++;
X				goto INIT_LOOP;
X			}
X		}
X
X		if(strcmp(cptr = hayes_get_result(1200L),"OK"))
X		{
X			if(!strcmp(cptr,interrupted_string))
X			{
X				interrupt = 1;
X				return(-1);
X			}
X			pprintf("unexpected result: '%s'\n",cptr);
X			retries++;
X			continue;
X		}
X		Lmodem_already_init = 1;
X	}
X
X	return(0);
X
X}	/* end of hayes_modem_init */
X
X/*+-------------------------------------------------------------------------
X	hayes_send_cmd(cmd)
X--------------------------------------------------------------------------*/
Xint
Xhayes_send_cmd(cmd)
Xregister char *cmd;
X{
Xregister itmp;
Xregister char_count = 0;
Xchar s32[32];
X
X	hayes_modem_init();
X	nap(600L);
X
X	lflush(0);
X#ifdef NEUROTIC
X	while(*cmd)
X	{
X		lputc_paced(20,*cmd++);
X		if(++char_count < 2)
X			nap(40L);
X		if((itmp = lgetc_timeout(500L)) < 0)
X			return(-1);
X		pputc(itmp);
X	}
X#else
X	lputs(cmd);
X	pputs(cmd);
X#endif
X	pputc(NL);
X	lputc_paced(20,CR);
X	itmp = 0;
X	while(itmp != CR)
X	{
X		if((itmp = lgetc_timeout(500L)) < 0)
X		{
X			pputs("missed reading \\r\n");
X			return(-1);
X		}
X		if(itmp == CR)
X			break;
X	}
X	return(0);
X
X}	/* end of hayes_send_cmd */
X
X/*+-------------------------------------------------------------------------
X	hayes_report_iv_set(varnum)
X--------------------------------------------------------------------------*/
Xhayes_report_iv_set(varnum)
Xint varnum;
X{
X
X	if(proctrace)
X		pprintf("modem handler set $i%02d = %ld\n",varnum,iv[varnum]);
X}	/* end of hayes_report_iv_set */
X
X/*+-----------------------------------------------------------------------
X	hayes_dial() - dial a remote or connect
X
X  returns 0 on success (CONNECT),
X          eConnectFailed if failure
X          eCONINT on interrupt
X
X  sets I0 to 0==connect,
X             1==failed to connect,
X             2==interrupted
X             3==modem error
X  sets S0 to modem result code or uucp status code string
X
X  This function has gotten quite NASTY and needs rewriting!
X------------------------------------------------------------------------*/
Xint
Xhayes_dial()
X{
Xchar s128[128];
Xint rcvr_was_alive = (rcvr_pid > 0) || (rcvr_pid == -2);
Xextern char kbdintr;		/* current input INTR */
Xint erc;
Xint s7;
Xint lerr;
Xint hack_fd;
Xchar *result = "";
Xuint connect_baud;
Xulong colors_at_entry = current_colors;
X
X	if(rcvr_was_alive && (rcvr_pid != -2))
X	{
X		kill_rcvr_process(SIGUSR1);
X		nap(500L);
X	}
X
X	if(Ldescr[0])
X	{
X		setcolor(0x07000A00L);	/* lt_green */
X		pprintf("%s %s (%u baud) on %s\n",
X			(Ltelno[0]) ? "Dialing" : "Connecting to",Ldescr,Lbaud,Lline);
X	}
X
X	setcolor(0x07000E00L);	/* yellow */
X
X	if(!Ltelno[0])	/* if no phone number, direct connect */
X	{
X		sprintf(s128,"CONNECT %u",Lbaud);
X		result = s128;
X		iv[0] = 0;
X		erc = 0;
X		goto START_RCVR_PROCESS;
X	}
X 	else
X	{
X		switch(hdb_dial(&result))
X		{
X			case 0:		/* success */
X				goto CONNECTED;
X			case 1:		/* failure -- iv[0] set by hdb_dial */
X				hayes_report_iv_set(0);
X				erc = eConnectFailed;
X				goto START_RCVR_PROCESS;
X			case 2:		/* interrupted -- iv[0] set by hdb_dial */
X				hayes_report_iv_set(0);
X				erc = eCONINT;
X				goto START_RCVR_PROCESS;
X			case 3:		/* modem error */
X				setcolor(0x07000400L);	/* red */
X				pprintf("%s\n",result);
X				goto CANNOT_TALK_TO_MODEM;
X			case 4:		/* try local */
X				break;
X		}
X
X		hayes_modem_init();
X
X#if defined(USE_S7)
X		if((s7 = hayes_get_sreg_value(7)) < 0)
X			s7 = 30;
X#else
X		s7 = 30;
X#endif
X
X		/* build and send dial command */
X		strcpy(s128,Lmodem_dial);
X		strcat(s128,Ltelno);
X		if(hayes_send_cmd(s128))
X			goto SEND_CMD_ERROR;
X
X		/* some modems (ahem, the Hayes 2400) do not accurately honor S7
X		so our timer is twice sreg 7 */
X 		pprintf("Type %s to abort ... ",make_char_graphic(kbdintr,1));
X		lflush(0);
X		result = hayes_get_result(s7 * 2 * 1000L);
X
X		if(!strcmp(result,interrupted_string))
X		{
X			setcolor(0x07000400L);	/* red */
X			pprintf("%s\n",result);
X			lputc(0);				/* make modem go on hook */
X			nap(40L);
X			lputc(0);
X			interrupt = 0;
X			hayes_get_result(2000L);	/* wait for NO CARRIER */
X			erc = eCONINT;
X			iv[0] = 2;
X			hayes_report_iv_set(0);
X			goto START_RCVR_PROCESS;
X		}
X		if(!strncmp(result,"CONNECT",7))
X		{
X			if(strlen(result) > 7)
X			{
X				if(Lbaud != (unsigned)atoi(result + 7))
X				{
X					setcolor(0x07000400L);	/* red */
X					pprintf("%s (incorrect rate)\n",result);
X					iv[0] = 2;
X					hayes_report_iv_set(0);
X					goto START_RCVR_PROCESS;
X				}
X			}
XCONNECTED:
X			setcolor(0x07000A00L);	/* lt_green */
X			pprintf("%s\n",result);
X			sprintf(s128,"CONNECT %s (%s) %u baud",Llogical,Ltelno,Lbaud);
X			ecu_log_event(s128);
X			if(isalpha(Llogical[0]))
X				if(keyset_read(Llogical) != 0)
X					keyset_init();
X			shmx_connect();
X			xmit_chars_this_connect = 0L;
X			Loff_hook_time = time((long *)0);
X			iv[0] = 0;
X			hayes_report_iv_set(0);
X			erc = 0;
X			Lmodem_off_hook = 1;
X			goto START_RCVR_PROCESS;
X		}
X		setcolor(0x07000400L);	/* red */
X		pprintf("%s\n",result);
X		iv[0] = 1;
X			hayes_report_iv_set(0);
X		erc = eConnectFailed;
X		goto START_RCVR_PROCESS;
X	}
X
XLMODEM_OFF_HOOK:
X	Lmodem_off_hook = 1;
X
XSTART_RCVR_PROCESS:	;
X	setcolor(colors_at_entry);
X	strcpy(sv[0]->pb,result);
X	sv[0]->cb = strlen(result);
X	if(rcvr_was_alive)
X		start_rcvr_process(1);
X	return(erc);
X
XSEND_CMD_ERROR: ;
X	if(interrupt || proc_interrupt)
X	{
X		result = interrupted_string;
X		iv[0] = 2;
X		hayes_report_iv_set(0);
X		erc = eCONINT;
X	}
X	else
X	{
XCANNOT_TALK_TO_MODEM:
X		setcolor(0x07000400L);	/* red */
X		pprintf("Cannot talk to modem\n");
X		result = "!Modem Error";
X		iv[0] = 3;
X		hayes_report_iv_set(0);
X		erc = eConnectFailed;
X	}
X	goto START_RCVR_PROCESS;
X
X}	/* end of hayes_dial */
X
X/*+-------------------------------------------------------------------------
X	hayes_dial_pde(tpde)
Xcurses access dial command
X--------------------------------------------------------------------------*/
Xint
Xhayes_dial_pde(tpde)
Xregister PDE *tpde;
X{
X	copy_pde_to_lvar(tpde);
X	hayes_dial();
X	
X}	/* end of hayes_dial_pde */
X
X/*+-------------------------------------------------------------------------
X	hayes_redial(arg,argc)
X--------------------------------------------------------------------------*/
Xhayes_redial(arg,argc)
Xchar **arg;
Xint argc;
X{
Xint erc;
Xint delay = 15;
Xint retries = 10;
Xint throw_away;
Xchar *pargv[2];
X
X	if(Ltelno[0] == 0)
X	{
X		pprintf("   no previous number\n");
X		return(-1);
X	}
X
X	if((argc > 1) && ((retries = atoi(arg[1])) == 0))
X	{
X		pprintf("  invalid retry count\n");
X		return(-1);
X	}
X
X	if((argc > 2) && ((delay = atoi(arg[2])) == 0))
X	{
X		pprintf("  invalid delay\n");
X		return(-1);
X	}
X/*
X	if(delay < 15)
X		delay = 15;
X*/
X
X	pprintf("  for %d retries, pause between: %d secs\n",
X				retries,delay);
X
X	kill_rcvr_process(SIGUSR1);		/* kill rcvr process */
X
X	while(retries--)
X	{
X	register itmp;
X
X#ifdef AUTO_DIAL_PROC
X		if(!isdigit(Llogical[0]) && find_procedure(Llogical))
X		{
X			pargv[0] = Llogical;
X			pargv[1] = "!REDIAL;";
X			if(!(erc = icmd_do_proc(2,pargv)))
X				return(0);
X			nap(100L);
X			kill_rcvr_process(SIGUSR1);		/* kill rcvr process */
X		}
X		else if(!(erc = hayes_dial()))
X		{
X			start_rcvr_process(1);
X			return(0);
X		}
X#else
X		if(!(erc = hayes_dial()))
X		{
X			start_rcvr_process(1);
X			return(0);
X		}
X#endif
X
X		if((retries == 0) || (erc == eCONINT))
X			break;
X
X		pprintf("%d %s left ... ",retries,(retries == 1) ? "retry" : "retries");
X		pprintf("waiting %d seconds ... press any key to abort\n",delay);
X		for(itmp = 0; itmp < delay; itmp++)
X		{
X			sleep(1);
X			if(rdchk(TTYIN))
X			{
X				throw_away = ttygetc(1);
X				retries = 0;
X				break;
X			}
X		}
X	}
X
X	start_rcvr_process(1);
X	return(-1);
X
X}	/* end of hayes_redial */
X
X/*+-------------------------------------------------------------------------
X	hayes_modem_on_hook()
X--------------------------------------------------------------------------*/
Xvoid
Xhayes_modem_on_hook()
X{
Xchar s128[128];
Xlong connect_secs;
Xlong time();
Xchar *get_elapsed_time();
X
X	if(Lmodem_off_hook)
X	{
X		connect_secs = time((long *)0) - Loff_hook_time;
X		sprintf(s128,"DISCONNECT %s (%s) %ld %s",Llogical,Ltelno,connect_secs,
X			get_elapsed_time(connect_secs));
X		ecu_log_event(s128);
X	}
X	Lmodem_off_hook = 0;
X}	/* end of hayes_modem_on_hook */
X
X/*+-------------------------------------------------------------------------
X	hayes_ATH()
X--------------------------------------------------------------------------*/
Xvoid hayes_ATH()
X{
Xint ixon;
Xint ixoff;
Xint rcvr_was_alive = (rcvr_pid > 0);
Xchar s64[64];
X
X	if(rcvr_was_alive)
X	{
X		kill_rcvr_process(SIGUSR1);
X		nap(500L);
X	}
X
X	ltoggle_dtr();
X	hayes_modem_on_hook();
X	set_default_escape_prompt();
X	if(rcvr_was_alive)
X		start_rcvr_process(0);
X
X}	/* end of hayes_ATH */
X
X/*+-------------------------------------------------------------------------
X	hayes_get_sreg_value(regnum)
X assumes rcvr process has been killed
X--------------------------------------------------------------------------*/
Xint
Xhayes_get_sreg_value(regnum)
Xint regnum;
X{
Xchar s128[128];
XLRWT	lr;
X
X	sprintf(s128,"ATS%d?",regnum);
X	hayes_send_cmd(s128);
X	lflush(0);
X	lr.to1 = 2000L;
X	lr.to2 = 140L;
X	lr.raw_flag = 0;
X	lr.buffer = s128;
X	lr.bufsize = sizeof(s128);
X	lr.delim = (char *)0;
X	lr.echo = 0;
X	lgets_timeout(&lr);
X	if(lr.count != 3)
X		return(-1);
X	return(atoi(s128));
X
X}	/* end of hayes_get_sreg_value */
X
X/*+-------------------------------------------------------------------------
X	hayes_set_sreg(regnum,value)
X assumes rcvr process has been killed
X returns 0 if no error (reads back value set),
X else -1 and error message has been printed
X--------------------------------------------------------------------------*/
Xint
Xhayes_set_sreg(regnum,value)
Xint regnum;
Xint value;
X{
Xchar s128[128];
Xint value2;
XLRWT	lr;
X
X	sprintf(s128,"ATS%d=%d",regnum,value);
X	hayes_send_cmd(s128);
X	lflush(0);
X	lr.to1 = 2000L;
X	lr.to2 = 140L;
X	lr.raw_flag = 0;
X	lr.buffer = s128;
X	lr.bufsize = sizeof(s128);
X	lr.delim = (char *)0;
X	lr.echo = 0;
X	lgets_timeout(&lr);
X	value2 = hayes_get_sreg_value(regnum);
X	if(value2 < 0)
X		pprintf("PROBLEM setting modem S%d=%d; cannot talk to modem\n",
X				regnum,value);
X	else if(value != value2)
X		pprintf("PROBLEM setting modem S%d=%d; got %d back\n",
X				regnum,value,value2);
X	return((value != value2) ? -1 : 0);
X
X}	/* end of hayes_set_sreg */
X
X/*+-------------------------------------------------------------------------
X	hayes_autoanswer()
X--------------------------------------------------------------------------*/
Xvoid
Xhayes_autoanswer()
X{
X	if(!Lmodem_autoans[0])
X		return;
X	nap(200L);
X	lputs_paced(20,"AT\r");
X	nap(100L);
X	lputs_paced(20,Lmodem_autoans); /* quiet modem */
X	lputs_paced(20,"\r");
X	nap(200L);
X	lputs_paced(20,Lmodem_autoans); /* quiet modem */
X	lputs_paced(20,"\r");
X	nap(200L);
X	lflush(0);
X}	/* end of hayes_autoanswer */
X
X/* end of ecuhayes.c */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
echo "File ecuhayes.c is complete"
chmod 0644 ecuhayes.c || echo "restore of ecuhayes.c fails"
echo "x - extracting ecuicmaux.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecuicmaux.c &&
X/* CHK=0xF521 */
X/*+-------------------------------------------------------------------------
X	ecuicmaux.c -- ecuicmd.c auxiliary functions
X	Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X  Defined functions:
X	cmd_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/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */
X
X#include "ecu.h"
X#include "ecuerror.h"
X#include "ecucmd.h"
X
X#if !defined(M_XENIX)
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 */
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	cmd_escape_str()
X--------------------------------------------------------------------------*/
Xchar *
Xcmd_escape_str()
X{
X#if defined(M_XENIX)
X	return("HOME ");
X#else
Xchar *make_char_graphic();
X	return(make_char_graphic(cmd_escape,0));
X#endif
X}	/* end of cmd_escape_str */
X
X/*+-----------------------------------------------------------------------
X	display_ascii_names()
X------------------------------------------------------------------------*/
Xvoid display_ascii_names()
X{
Xregister intval;
X
X	for(intval = 0; intval < 8; intval++)
X	{
X		ff(se,"%s %3d %03o %02x ^%c | ",hex_to_ascii_name((intval)),
X				(intval),(intval),(intval),(intval) +0x40);
X		ff(se,"%s %3d %03o %02x ^%c | ",hex_to_ascii_name(intval+8),
X				intval+8,intval+8,intval+8,intval+8+0x40);
X		ff(se,"%s %3d %03o %02x ^%c | ",hex_to_ascii_name(intval+16),
X				intval+16,intval+16,intval+16,intval+16+0x40);
X		ff(se,"%s %3d %03o %02x ^%c\r\n",hex_to_ascii_name(intval+24),
X				intval+24,intval+24,intval+24,intval+24+0x40);
X	}
X	ff(se,"\r\n");
X	for(intval = 8; intval < 32; intval++)
X	{
X		ff(se,"    %3d %03o %02x  %c | ",
X				intval,intval,intval,intval);
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		ff(se,"    %3d %03o %02x  %c\r\n",
X				intval+96,intval+96,intval+96,intval+96);
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--------------------------------------------------------------------------*/
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		icmd("log off");
X		break;
X	case CTllp:
X#if defined(M_XENIX)
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			{
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 = 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		}	/* end of if argument to command */
X
XRECORD_REPORT:
X		if(rcvr_log)
X		{
X			ff(se,"\r\n%sing received %s text to %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					cmd_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					cmd_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			Ladd_nl_incoming = yes_or_no(arg[1]);
X		ff(se,"  %sappending NL to incoming CR\r\n",
X			(Ladd_nl_incoming) ? "" : "not ");
X		break;
X	case CTnlout:
X		if(narg != 1)
X			Ladd_nl_outgoing = yes_or_no(arg[1]);
X		ff(se,"  %sappending NL to outgoing CR\r\n",
X			(Ladd_nl_outgoing) ? "" : "not ");
X		break;
X	default:
X	case CTnl:
X		ff(se,"  incoming: %s  outgoing: %s\r\n",
X			(Ladd_nl_incoming) ? "CR/LF" : "CR",
X			(Ladd_nl_outgoing) ? "CR/LF" : "CR");
X		break;
X	}
X
X	if(narg && (rcvr_pid > 0))
X		shmx_set_rcvr_nl_control();
X
X}	/* end of nlin_nlout_control */
X
X/* end of ecuicmaux.c */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 ecuicmaux.c || echo "restore of ecuicmaux.c fails"
echo "x - extracting ecuicmd.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecuicmd.c &&
X/* CHK=0x00AA */
X/*+-----------------------------------------------------------------------
X	ecuicmd.c
X	Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
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/*:09-26-1989-14:23-wht-add mkdir */
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */
X
X#include "ecu.h"
X#include "esd.h"
X#include "ecufkey.h"
X
X#define NEED_P_CMD
X#include "ecucmd.h"
X
Xchar *cmd_escape_str();
X
Xextern KDE keyset_table[];
Xextern char *revision;
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 ansi_filter;
Xextern int cmd_escape;
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 long xmit_chars;
Xextern long xmit_chars_this_connect;
Xextern ulong current_colors;
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 xenix bell notify */
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(minunique(cmd_list->cmd,cmd,cmd_list->min))
X		{
X			if(cmd_list->min)
X				break;
X			return(-1);
X		}
X		cmd_list++;
X	}
X	return(cmd_list->token);
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 = current_colors;
X
X	kill_rcvr_process(SIGUSR1);
X	ttymode(2);
X	erc = do_proc(narg,arg);
X	proc_file_reset();
X	ttymode(1);
X	setcolor(0x07000800L);	/* gray */
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();
X
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",Lline);
X			return(1);
X		case '!':
X		case '$':
X		case '>':
X			ff(se,"\r\n"); shell(cmd); return(0);
X		case '-':
X			ff(se,"\r\n"); exec_cmd(&cmd[1]); return(0);
X		case '^':
X			ff(se,"\r\n"); phrase_help(); return(0);
X		case '?':
X			icmd_help(0,(char **)0); return(0);
X		default:
X			break;
X	}
X
X/* not single character argument */
X	build_str_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,"invalid command... %s? for help\r\n",
X			cmd_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#ifndef NOMEMCHECK
X		case CTmdump:
X		_dump_malloc();
X		break;
X#endif
X
X		case CTbaud:
X		if(narg == 1)
X			ff(se,"   baud rate is %u\r\n",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",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(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(Llogical[0]) || !find_procedure(Llogical))
X					hayes_dial();
X				else
X				{
X					arg[0] = 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': Lfull_duplex = 1; ff(se,"  now "); break;
X				case 'h': 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",(Lfull_duplex) ? "full" : "half");
X		break;
X
X		case CTexit:
X		ff(se,"  disconnecting from line %s\r\n",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		hayes_ATH();
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);
SHAR_EOF
echo "End of part 4"
echo "File ecuicmd.c is continued in part 5"
echo "5" > s2_seq_.tmp
exit 0
-- 
-------------------------------------------------------------------
Warren Tucker, Tridom Corporation       ...!gatech!emory!tridom!wht 
Ker-au'-lo-phon.  An 8-foot partial flue-stop, having metal pipes
surmounted by adjustable rings, and with a hole bored near the top
of each pipe, producing a soft and "reedy" tone.