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

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

---- Cut Here and unpack ----
#!/bin/sh
# this is part 5 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file ecuicmd.c continued
#
CurArch=5
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 ecuicmd.c"
sed 's/^X//' << 'SHAR_EOF' >> ecuicmd.c
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					Lparity = 0; break;
X				case 'e':
X				case 'o':
X					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			(Lparity) ? to_upper(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		stand_out();
X		ff(se," %s ",curr_dir);
X		stand_end();
X		fputs("\r\n",se);
X		break;
X
X		case CTredial:
X		(void)hayes_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",revision);
X		break;
X
X#if !defined(M_XENIX)
X		case CTte:
X		if(narg > 1)
X		{
X			if(sscanf(arg[1],"%x",&cmd_escape) && (cmd_escape < 0x7F))
X				ff(se,"   tty escape set to "); 
X			else
X			{
X				ff(se,"  invalid parameter must be 01 to 7E: setting to ");
X				cmd_escape = '%';
X			}
X		}
X		else
X			ff(se,"   tty escape is ");
X
X		ff(se,"0x%02x (%s)\r\n",cmd_escape,make_char_graphic(cmd_escape,1));
X		break;
X#endif
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 termio (ttymode=%d)",current_ttymode);
X		disp_line_termio(TTYIN,s80);
X		ff(se,"\r\n");
X		disp_line_termio(Liofd,"comm line termio");
X		break;
X
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 CTansi:
X		if(narg > 1)
X			shmx_set_rcvr_ansi(ansi_filter = yes_or_no(arg[1]));
X		ff(se,"  ansi filter %s%s\r\n",(ansi_filter) ? "on" : "off",
X					(ansi_filter == 2) ? ": log unknown" : "");
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 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		icmd("time");
X		ff(se,"Console: %s  communications line: %s  ",get_ttyname(),Lline);
X		ff(se,"%u-%c-1\r\n",Lbaud,(Lparity) ? to_upper(Lparity) : 'N');
X		if(Lmodem_off_hook)
X		{
X			ff(se,"Connected to %s (%s) at %s (elapsed %s)\r\n",
X				Ldescr,Ltelno,epoch_secs_to_str(Loff_hook_time,1,s80),
X				get_elapsed_time(time((long *)0) - Loff_hook_time));
X		}
X		ff(se,"Current directory: %s\r\n",curr_dir);
X		ff(se,"Total chars transmitted: %ld",xmit_chars);
X		if(Lmodem_off_hook)
X			ff(se," (since CONNECT %ld)\r\n",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(Lmodem_off_hook)
X			ff(se," (since CONNECT %ld)\r\n",rcvr_chars_this_connect);
X		else
X			fputs("\r\n",se);
X		ff(se,"Ansi filter %s\r\n",(ansi_filter) ? "on" : "off");
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",(Lfull_duplex) ? "full" : "half");
X		ff(se,"CR conversion:  incoming %s  outgoing %s\r\n",
X			(Ladd_nl_incoming) ? "CR/LF" : "CR",
X			(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 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		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
echo "File ecuicmd.c is complete"
chmod 0644 ecuicmd.c || echo "restore of ecuicmd.c fails"
echo "x - extracting ecuicmhelp.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecuicmhelp.c &&
X/* CHK=0xBDC0 */
X/*+-------------------------------------------------------------------------
X	ecuicmhelp.c -- help for icmd commands
X	Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X  Defined functions:
X	calculate_help_right_column()
X	display_help_screen()
X	display_help_stderr(cmd)
X	help_cmd_line_setup(prompt)
X	help_get_cmd()
X	icmd_help(narg,arg)
X	search_cmd_list_pcmd(cmd)
X	show_cmds()
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 <curses.h>
X#define OMIT_TERMIO_REFERENCES
X#define STDIO_H_INCLUDED
X#include "ecu.h"
X#define NEED_P_CMD
X#include "ecucmd.h"
X#include "ecukey.h"
X#include "pc_scr.h"
X
X#include "stdio_lint.h"
X
X#define PDAT	"/usr/lib/ecu/ecuhelp.data"
X
Xextern int rcvr_pid;
X
Xlong start_pos[TOKEN_QUAN];
Xint start_pos_has_been_read = 0;
Xchar help_filename[256] = "";
XFILE *fpdat;		/* help data file */
Xint help_right_column = 0;	/* right column for show_cmds */
Xint help_longest_cmd = 0;
Xint help_longest_descr = 0;
X
X/*+-------------------------------------------------------------------------
X	search_cmd_list_pcmd(cmd)
X--------------------------------------------------------------------------*/
XP_CMD *
Xsearch_cmd_list_pcmd(cmd)
Xregister char *cmd;
X{
Xregister P_CMD *cmd_list = icmd_cmds;
X
X	while(cmd_list->token != -1)
X	{
X		if(minunique(cmd_list->cmd,cmd,cmd_list->min))
X			break;
X		cmd_list++;
X	}
X	if(cmd_list->token == -1)
X		return((P_CMD *)0);
X	else
X		return(cmd_list);
X
X}	/* end of search_cmd_list_pcmd */
X
X/*+-------------------------------------------------------------------------
X	display_help_stderr(cmd)
X--------------------------------------------------------------------------*/
Xdisplay_help_stderr(cmd)
Xchar *cmd;
X{
Xregister itmp;
XP_CMD *pcmd;
Xchar buf[128];
X
X	if(! (pcmd = search_cmd_list_pcmd(cmd)))
X	{
X		ff(se,"'%s' is not a valid command\r\n",cmd);
X		return;
X	}
X
X	if(!start_pos[pcmd->token])
X	{
X		ff(se,"no help available for '%s'\r\n",cmd);
X		return;
X	}
X
X	fseek(fpdat,start_pos[pcmd->token],0);
X	ff(se,"\r\n");
X	while(fgets(buf,sizeof(buf),fpdat) != NULL)
X	{
X		itmp = strlen(buf);
X		buf[--itmp] = 0;
X		if(itmp == 0)
X			break;
X		ff(se,"%s\r\n",buf);
X	}
X
X}	/* end of display_help_stderr */
X
X/*+-------------------------------------------------------------------------
X	calculate_help_right_column()
X--------------------------------------------------------------------------*/
Xvoid
Xcalculate_help_right_column()
X{
Xregister itmp;
Xregister P_CMD *pcmd = icmd_cmds;
X
X	if(help_right_column)	/* already bee thru here? */
X		return;				/* ... seems so */
X
X	while(pcmd->token != -1)
X	{
X		if(!*pcmd->descr)
X		{
X			pcmd++;
X			continue;
X		}
X		itmp = strlen(pcmd->cmd);
X		if(itmp > help_longest_cmd)
X			help_longest_cmd = itmp;
X		itmp = strlen(pcmd->descr);
X		if(itmp > help_longest_descr)
X			help_longest_descr = itmp;
X		pcmd++;
X	}
X	help_right_column = 1 + help_longest_cmd + 2 + help_longest_descr + 3;
X
X}	/* end of calculate_help_right_column */
X
X/*+-------------------------------------------------------------------------
X	help_cmd_line_setup(prompt)
X--------------------------------------------------------------------------*/
Xvoid
Xhelp_cmd_line_setup(prompt)
Xchar *prompt;
X{
Xregister icol;
Xint y;
Xint x;
X
X	wmove(stdscr,LINES - 1,0);
X	wstandout(stdscr);
X	waddch(stdscr,' ');
X	waddch(stdscr,' ');
X	waddstr(stdscr,prompt);
X	getyx(stdscr,y,x);
X	for(icol = x; icol < COLS-1; icol++)
X		waddch(stdscr,' ');
X	wmove(stdscr,y,x);
X	wstandend(stdscr);
X	wrefresh(stdscr);
X}	/* end of help_cmd_line_setup */
X
X/*+-------------------------------------------------------------------------
X	char *help_get_cmd()
X--------------------------------------------------------------------------*/
Xchar *
Xhelp_get_cmd()
X{
Xregister y;
Xregister x;
Xstatic char cmd[15];
Xchar delim;
X
X	help_cmd_line_setup("Enter command name (ESC to quit):  ");
X	wstandout(stdscr);
X	getyx(stdscr,y,x);
X	wingets(stdscr,y,x,cmd,sizeof(cmd) - 1,&delim,0);
X	wstandend(stdscr);
X	if((delim == ESC) || (cmd[0] == 0))
X		return((char *)0);
X	else
X		return(cmd);
X}	/* end of help_get_cmd */
X
X
X/*+-------------------------------------------------------------------------
X	display_help_screen()
X--------------------------------------------------------------------------*/
Xdisplay_help_screen()
X{
Xregister itmp;
Xregister P_CMD *pcmd = icmd_cmds;
Xregister y = 1;
Xregister x = 0;
Xchar s80[80];
X
X	wclear(stdscr);
X	wmove(stdscr,0,0);
X	wstandout(stdscr);
X	waddstr(stdscr,
X" ecu command list    (capitalized portion sufficient for cmd recognition)");
X	getyx(stdscr,y,x);
X	for(itmp = x; itmp < COLS-1; itmp++)
X		waddch(stdscr,' ');
X	wstandend(stdscr);
X
X	pcmd = icmd_cmds;
X	y = 1;
X	x = 0;
X	while(pcmd->token != -1)
X	{
X		if(!*pcmd->descr)
X		{
X			pcmd++;
X			continue;
X		}
X		wmove(stdscr,y,x);
X		strcpy(s80,pcmd->cmd);
X		pad_zstr_to_len(s80,help_longest_cmd + 2);
X		for(itmp = 0; itmp < pcmd->min; itmp++)
X			s80[itmp] = to_upper(s80[itmp]);
X		waddstr(stdscr,s80);
X
X		strcpy(s80,pcmd->descr);
X		pad_zstr_to_len(s80,help_longest_descr + 1);
X		waddstr(stdscr,s80);
X
X		if(!x)
X			waddch(stdscr,sVR);
X		y++;
X		if(y >= LINES - 2)
X		{
X			y = 1;
X			x = help_right_column;
X		}
X		pcmd++;
X	}
X
X}	/* end of display_help_screen */
X
X/*+-------------------------------------------------------------------------
X	show_cmds()
Xcommands with null descriptions are "undocumented"
X--------------------------------------------------------------------------*/
Xshow_cmds()
X{
Xregister char *cptr;
Xint rcvr_active = (rcvr_pid > 0) || (rcvr_pid == -2);
X
X	if(rcvr_active && (rcvr_pid != -2))
X		kill_rcvr_process(SIGUSR1);
X
X	calculate_help_right_column();
X	windows_start();
X	scrollok(stdscr,0);
X	display_help_screen();
X	while(cptr = help_get_cmd())
X	{
X		curmove(LINES - 1,0);
X		wclrtoeol(stdscr);
X		wrefresh(stdscr);
X		display_help_stderr(cptr);
X		ff(se,"press return:  ");
X		ttygetc(1);
X		display_help_screen();
X	}
X	wmove(stdscr,LINES - 1,0);
X	wclrtoeol(stdscr);
X	windows_end(stdscr);
X	curmove(LINES - 1,0);
X	if(rcvr_active)
X		start_rcvr_process(0);
X
X}	/* end of show_cmds */
X
X/*+-------------------------------------------------------------------------
X	icmd_help(narg,arg)
X--------------------------------------------------------------------------*/
Xvoid
Xicmd_help(narg,arg)
Xint narg;
Xchar **arg;
X{
Xregister char *cptr;
Xint src_line = 0;
Xchar *getenv();
X
X	ff(se,"\r\n");
X	if(!help_filename[0])
X	{
X		if((cptr = getenv("ECUHELP")) == NULL)
X			cptr = PDAT;
X		strcpy(help_filename,cptr);
X	}
X
X	if((fpdat = fopen(help_filename,"r")) == NULL)
X	{
X		perror(help_filename); fputc('\r',se);
X		return;
X	}
X
X	if(!start_pos_has_been_read)
X	{
X		fread((char *)start_pos,sizeof(long),TOKEN_QUAN,fpdat);
X		start_pos_has_been_read = 1;
X	}
X
X	if(narg > 1)
X		display_help_stderr(arg[1]);
X	else
X		show_cmds();
X
X	fclose(fpdat);
X}	/* end of icmd_help */
X
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 ecuicmhelp.c || echo "restore of ecuicmhelp.c fails"
echo "x - extracting eculine.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > eculine.c &&
X/* CHK=0x8562 */
X
X#define NO_SELECT
X
X#if defined(M_I286) && !defined(NO_SELECT)
X#define NO_SELECT
X#endif
X
X/*+-----------------------------------------------------------------------
X	eculine.c -- line related procedures
X Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X  Defined functions:
X	lbreak()
X	lclear_xmtr_xoff()
X	lclose()
X	lget_xon_xoff(ixon,ixoff)
X	lgetc_timeout(msec)
X	lgetc_xmtr()
X	lgets_timeout(lrwt)
X	lflush(flush_type)
X	llookfor(lookfor,msecs,echo_flag)
X	lnew_baud_rate(new_baud)
X	lopen()
X	lopen_err_text(lerr)
X	lputc(lchar)
X	lputc_paced(pace_msec,lchar)
X	lputs(string)
X	lputs_paced(pace_msec,string)
X	lquiet(msecs,echo_flag)
X	lrdchk_xmtr()
X	lreset_ksr()
X	lset_baud_rate(ioctl_flag)
X	lset_parity(ioctl_flag)
X	ltoggle_dtr()
X	lxon_xoff(flag)
X	valid_baud_rate(baud)
X
X------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-30-1989-00:32-wht-ltoggle_dtr no longer lopen/lclose, but open/close */
X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */
X
X#include "ecu.h"
X#include "ecukey.h"
X#include "ecuhangup.h"
X
Xextern int errno;
Xextern long xmit_chars;
Xextern long xmit_chars_this_connect;
Xextern int xenix_lgetc_count;
Xextern int xenix_vmin;
Xextern int interrupt;		/* SIGINT flag: see xmtr_SIGINT_handler */
X
X#define LPUTS_NAP_COUNT	20
X
X#if defined(M_I386)
X#if defined(NO_SELECT)
Xchar *select_rev_modifier = "-386n";
X#else
Xchar *select_rev_modifier = "-386s";
X#include <sys/select.h>
X#endif
X#else
Xchar *select_rev_modifier = "-286n";
X#endif
X
X/*+-------------------------------------------------------------------------
X	lgetc_xmtr() -- xmtr version of get char from line
Xalso called by rcvr code when xenix_lgetc_buf empty and xenix_vmin == 1
X--------------------------------------------------------------------------*/
Xuchar
Xlgetc_xmtr()
X{
Xint itmp;
Xextern int errno;
Xuchar char_rtnd;
X
XREAD_AGAIN:
X	if((itmp = read(Liofd,&char_rtnd,1)) < 1)
X	{
X		if(!itmp)
X		{
X			pperror("lgetc_xmtr: zero length read\n");
X			hangup(HANGUP_LINE_READ_ERROR);
X		}
X		if(errno == EINTR)			/* if signal interrupted, ... */
X		{
X			if(interrupt)
X				return(0);
X			goto READ_AGAIN;
X		}
X		hangup(HANGUP_LINE_READ_ERROR);
X	}
X	shmr_rcvd_chars(1);
X	if(Lparity)
X		char_rtnd &= 0x7F;
X	return(char_rtnd);
X
X}	/* end of lgetc_xmtr */
X
X/*+-------------------------------------------------------------------------
X	lrdchk_xmtr() -- rdchk(Liofd) for xmtr
X--------------------------------------------------------------------------*/
Xint
Xlrdchk_xmtr()
X{
X	return(rdchk(Liofd));
X}	/* end of lrdchk_xmtr */
X
X/*+-------------------------------------------------------------------------
X	char *lgets_timeout(LRWT *) - may be called by xmtr only
X
Xto1 and to2 are unsigned long values in milliseconds (not
Xcurrently supported well under BSD4); to1 is the time to wait
Xfor the first character, to2 the time to wait for subsequent
Xcharacters.
X
Xif raw_flag 0,     non-printables are stripped from beginning
X                   and end of received characters (i.e., modem
X                   response reads); NULs discarded, parity stripped
Xif raw_flag 1,     full raw read buffer returned
X
X0x80 in raw_flag indicates console interrupts should be enabled.
Xif interrupt thus detected, the procedure returns "!Interrupted"
Xwithout reseting variable 'interrupt'
X
Xbuffer is address to read chars into
X
Xbufsize is buffer max size (allowing room for terminating null)
Xwhich should be at least 2 if raw_size includes 0x80 bit,
Xelse at least 12 characters if 0x80 omitted.
X
Xcount is a int which, at return, receives the actual count read
X
X--------------------------------------------------------------------------*/
Xchar *
Xlgets_timeout(lrwt)
XLRWT *lrwt;
X{
X/**********************/
X#if defined(NO_SELECT)
X/**********************/
X
Xregister actual_count = 0;
Xregister char *cptr = lrwt->buffer;
Xint max_count = lrwt->bufsize;
Xchar *rtn_val;
Xint timeout_counter;
Xint qc1;
Xint qc2;
Xint raw_mode = lrwt->raw_flag & 0x0F;
Xint check_sigint = (lrwt->raw_flag & 0x80);
Xint old_ttymode = get_ttymode();	/* save original tty mode */
Xint delim_len;
Xlong quantum;
Xlong ltmp;
Xlong nap(long);
X
X	delim_len = (lrwt->delim) ? strlen(lrwt->delim) : 0;
X
X	if((Lbaud < 300) && lrwt->to2)
X		if(lrwt->to2 < 300L) lrwt->to2 = 300L;
X	else if((Lbaud < 1200) && lrwt->to2)
X		if(lrwt->to2 < 200L) lrwt->to2 = 100L;
X
X/* shortest interval */
X	ltmp = (lrwt->to1 < lrwt->to2) ? lrwt->to1 : lrwt->to2;
X
X/* calculate wait quantum */
X	quantum = ltmp / 10L;				/* try for ten ticks */
X
X#if defined(M_I386)
X	if(quantum < 40L)
X		quantum = 40L;
X#else
X	if(quantum < 20L)
X		quantum = 20L;
X#endif
X	qc1 = lrwt->to1 / quantum;
X	if(!qc1) qc1 = 1L;
X	qc2 = lrwt->to2 / quantum;
X	if(!qc2) qc2 = 1L;
X
X/* perform the lrtw function using nap() and rdchk()
X   input: qc1 is first nap count (for first charcters) 
X          qc2 is 2nd nap count (for subsequent characters) 
X          quantum is the nap period in milliseconds
X          cptr is char* to receive read string
X          max_count is max number of characters incl null
X          lrwt->raw_flag as described above
X
X  output: lrwt->count is actual count of return result
X          lrwt->buffer is return read buffer
X*/
X	max_count--;				/* leave room for null */
X
X	if(check_sigint)
X		ttymode(2);				/* let console interrupt long timeouts */
X
X	timeout_counter = qc1;		/* first timeout */ 
X	*cptr = 0;					/* init result string */
X	while(timeout_counter--)
X	{
X		nap(quantum);
X
X		if(check_sigint && interrupt)
X			goto INTERRUPTED;
X
X		while(lrdchk_xmtr())
X		{
X			*cptr = lgetc_xmtr();
X
X			if(check_sigint && interrupt)
X				goto INTERRUPTED;
X
X			if(*cptr == 0)
X				continue;
X
X			if(!raw_mode && (*cptr == CR))
X					continue;
X
X			if(lrwt->echo)
X				pputc(*cptr);
X
X			*++cptr = 0;
X			if(++actual_count == 1)
X			{
X				if(!lrwt->to2)
X					break;
X				timeout_counter = qc2;
X			}
X
X			if(--max_count == 0)
X				goto BOTTOM;
X
X			if(delim_len && (actual_count >= delim_len) &&
X					!strncmp(lrwt->delim,cptr - delim_len,delim_len))
X				goto BOTTOM;
X		}
X	}
X
X/******************************/
X#else /* other than NO_SELECT */
X/******************************/
X/* --- use select --- */
Xregister actual_count = 0;
Xregister char *cptr = lrwt->buffer;
Xregister max_count = lrwt->bufsize;
Xregister raw_mode = lrwt->raw_flag & 0x0F;
Xint check_sigint = (lrwt->raw_flag & 0x80);
Xint old_ttymode = get_ttymode();	/* save original tty mode */
Xint fdmask;
Xint delim_len;
Xstruct timeval tval;
Xchar *rtn_val;
X
X	delim_len = (lrwt->delim) ? strlen(lrwt->delim) : 0;
X
X	if((Lbaud < 300) && lrwt->to2)
X		if(lrwt->to2 < 300L) lrwt->to2 = 300L;
X	else if((Lbaud < 1200) && lrwt->to2)
X		if(lrwt->to2 < 200L) lrwt->to2 = 100L;
X
X	tval.tv_sec = lrwt->to1 / 1000L;
X	tval.tv_usec = (lrwt->to1 % 1000L) * 1000L;
X
X/* perform the lrtw function
X
X  output: lrwt->count is actual count of return result
X          lrwt->buffer is return read buffer
X*/
X	max_count--;				/* leave room for null */
X
X	if(check_sigint)
X		ttymode(2);				/* let console interrupt long timeouts */
X
X	*cptr = 0;					/* init result string */
X	while(1)
X	{
XCHECK_INTERRUPT:
X		if(check_sigint && interrupt)
X			goto INTERRUPTED;
X
X		errno = 0;
X		fdmask = 1 << Liofd;
X		if(select(32,&fdmask,(int *)0,(int *)0,&tval) != 1)
X		{
X			if(errno == EINTR)
X				continue;
X			break;
X		}
X
X		while(rdchk(Liofd))
X		{
X			*cptr = lgetc_xmtr();
X
X			if(check_sigint && interrupt)
X				goto INTERRUPTED;
X
X			if(lrwt->echo)
X				pputc(*cptr);
X
X			if(*cptr == 0)
X				continue;
X
X			if(!raw_mode && (*cptr == CR))
X					continue;
X
X			*++cptr = 0;
X
X			if(actual_count++ == 0)
X			{
X				if(!lrwt->to2)
X					break;
X				tval.tv_sec = lrwt->to2 / 1000L;
X				tval.tv_usec = (lrwt->to2 % 1000L) * 1000L;
X			}
X
X			if(--max_count == 0)
X				goto BOTTOM;
X
X			if(delim_len && (actual_count >= delim_len) &&
X					!strncmp(lrwt->delim,cptr - delim_len,delim_len))
X				goto BOTTOM;
X		}
X	}
X
X#endif	/* NO_SELECT */
X
X/********* common post processing for select() / no select() ************/
XBOTTOM:
X	if(check_sigint)
X		ttymode(old_ttymode);
X	if(raw_mode)
X	{
X		lrwt->count = actual_count;
X		return(lrwt->buffer);
X	}
X	cptr = lrwt->buffer;
X	while(((*cptr > 0) && (*cptr < SPACE)) || (*cptr >= DEL))
X		cptr++;
X	rtn_val = cptr;
X	actual_count = 0;
X	while(((*cptr &= 0x7F) >= SPACE) && (*cptr < DEL))
X	{
X		cptr++;
X		actual_count++;
X	}
X	*cptr = 0;
X	strcpy(lrwt->buffer,rtn_val);
X	lrwt->count = actual_count;
X	return(lrwt->buffer);
X
XINTERRUPTED:
X	ttymode(old_ttymode);
X	strcpy(lrwt->buffer,"!Interrupted");
X	lrwt->count = strlen(lrwt->buffer);
X	return((char *)0);
X
X}	/* end of lgets_timeout */
X
X/*+-------------------------------------------------------------------------
X	lgetc_timeout(msec) - may be called by xmtr only
X
X reads one character from line unless msec passes with no receipt.
X return char if received, else -1 if timeout
X--------------------------------------------------------------------------*/
Xint
Xlgetc_timeout(msec)
Xlong msec;
X{
Xuchar rtn_char;
X#if defined(NO_SELECT)
Xlong nap();
Xlong count;
X
XAGAIN:
X	count = msec;
X	while(!lrdchk_xmtr())
X	{
X		if(interrupt)
X			return(-1);
X		if((count -= nap(20L)) <= 0)
X			return(-1);
X	}
X
X#else
X
Xint fdmask;
Xstruct timeval tval;
X
XAGAIN:
X	tval.tv_sec = msec / 1000L;
X	tval.tv_usec = (msec % 1000L) * 1000L;
X	fdmask = 1 << Liofd;
X	if(select(32,&fdmask,(int *)0,(int *)0,&tval) < 1)
X		return(-1);
X	if(!lrdchk_xmtr())
X		return(-1);
X	if(interrupt)
X		return(-1);
X#endif
X
X	rtn_char = lgetc_xmtr();
X	if(!rtn_char)
X		goto AGAIN;
X	return(rtn_char);
X
X}	/* end of lgetc_timeout */
X
X/*+-------------------------------------------------------------------------
X	llookfor(lookfor,msecs,echo_flag)
Xreturn 1 if successful, else 0 if no match
X--------------------------------------------------------------------------*/
Xint
Xllookfor(lookfor,msecs,echo_flag)
Xchar *lookfor;
Xulong msecs;
Xint echo_flag;
X{
Xregister lookfor_len = strlen(lookfor);
Xregister lchar;
Xchar *lastfew = malloc(lookfor_len);
Xint success_flag = 0;
Xint old_ttymode = get_ttymode();
X
X	if(!lastfew)
X	{
X		pputs("memory exhausted\n");
X		return(0);
X	}
X
X	ttymode(2);
X
X	memset(lastfew,0,lookfor_len);
X	while((lchar = lgetc_timeout(msecs)) >= 0)
X	{
X		if(!lchar)		/* skip nulls */
X			continue;
X		if(echo_flag)
X			pputc(lchar);
X		memcpy(lastfew,lastfew + 1,lookfor_len - 1);
X		*(lastfew + lookfor_len - 1) = lchar;
X		if(!strncmp(lastfew,lookfor,lookfor_len))
X		{
X			success_flag = 1;
X			break;
X		}
X	}
X	free(lastfew);
X	ttymode(old_ttymode);
X	return(success_flag);
X}	/* end of llookfor */
X
X/*+-------------------------------------------------------------------------
X	lquiet(msecs,echo_flag)
X--------------------------------------------------------------------------*/
Xvoid
Xlquiet(msecs,echo_flag)
Xulong msecs;
Xint echo_flag;
X{
Xregister lchar;
Xint old_ttymode = get_ttymode();
X
X	ttymode(2);
X	while((lchar = lgetc_timeout(msecs)) >= 0)
X	{
X		if(interrupt)	/* if interrupt, return */
X			break;
X		if(!lchar)		/* skip nulls */
X			continue;
X		if(echo_flag)
X			pputc(lchar);
X	}
X	ttymode(old_ttymode);
X
X}	/* end of lquiet */
X
X/*+-------------------------------------------------------------------------
X	lflush(flush_type) -- flush line driver input &/or output buffers
X
X0 == input buffer
X1 == output buffer
X2 == both buffers
X--------------------------------------------------------------------------*/
Xvoid
Xlflush(flush_type)
Xint flush_type;
X{
X	xenix_lgetc_count = 0;
X	switch(flush_type)
X	{
X		case 0:
X			ioctl(TTYIN,TCFLSH,(char *)0); break;
X		case 1:
X			ioctl(TTYIN,TCFLSH,(char *)1); break;
X		case 2:
X			ioctl(TTYIN,TCFLSH,(char *)2); break;
X	}
X}	/* end of lflush */
X
X/*+-------------------------------------------------------------------------
X	lreset_ksr()
X
X  This procedure restores the termio for the
X  comm line to the values in Ltermio
X--------------------------------------------------------------------------*/
Xvoid
Xlreset_ksr()
X{
X	ioctl(Liofd,TCSETA,(char *)&Ltermio);
X
X}	/* end of lreset_ksr */
X
X/*+-----------------------------------------------------------------------
X	lputc(lchar) -- write lchar to comm line
X------------------------------------------------------------------------*/
Xvoid
Xlputc(lchar)
Xchar lchar;
X{
X	while(write(Liofd,&lchar,1) < 0)
X	{
X		if(errno == EINTR)
X			continue;
X		pperror("lputc write error");
X		hangup(HANGUP_XMTR_WRITE_ERROR);
X	}
X	xmit_chars++;
X	xmit_chars_this_connect++;
X}	/* end of lputc */
X
X/*+-----------------------------------------------------------------------
X	lputc_paced(pace_msec,lchar) -- write lchar to comm line
X  with time between each character 
X------------------------------------------------------------------------*/
Xvoid
Xlputc_paced(pace_msec,lchar)
Xregister pace_msec;
Xchar lchar;
X{
X
X	lputc(lchar);	
X	nap((long)(pace_msec ? pace_msec : LPUTS_NAP_COUNT));
X
X}	/* end of lputc_paced */
X
X/*+-----------------------------------------------------------------------
X	lputs(string) -- write string to comm line
X------------------------------------------------------------------------*/
Xvoid
Xlputs(string)
Xregister char *string;
X{
X	while(*string)
X		lputc(*string++);
X}
X
X/*+-----------------------------------------------------------------------
X	lputs_paced(pace_msec,string) -- write string to comm line
X  with time between each character 
X------------------------------------------------------------------------*/
Xvoid
Xlputs_paced(pace_msec,string)
Xregister pace_msec;
Xregister char *string;
X{
X	while(*string)
X		lputc_paced(pace_msec,*string++);
X
X}	/* end of lputs_paced */
X
X/*+-------------------------------------------------------------------------
X	valid_baud_rate(baud) -- returns (positive) baud rate selector
Xor -1 if invalid baud rate
X--------------------------------------------------------------------------*/
Xvalid_baud_rate(baud)
Xuint baud;
X{
X	switch(baud)
X	{
X		case 110: return(B110);
X		case 300: return(B300);
X		case 600: return(B600);
X		case 1200: return(B1200);
X		case 2400: return(B2400);
X		case 4800: return(B4800);
X		case 9600: return(B9600);
X		case 19200: return(EXTA);
X		case 38400: return(EXTB);
X		default: return(-1);
X	}
X
X}	/* end of valid_baud_rate */
X
X/*+-----------------------------------------------------------------------
X	lset_baud_rate(ioctl_flag)
X
X  If 'ioctl_flag' is set, then perform ioctl call
X  is executed after setting baud rate
X------------------------------------------------------------------------*/
Xlset_baud_rate(ioctl_flag)
Xint ioctl_flag;
X{
Xint baud_selector = valid_baud_rate(Lbaud);
X
X	if(baud_selector == -1)
X		baud_selector = valid_baud_rate(Lbaud = DEFAULT_BAUD_RATE);
X
X	Ltermio.c_cflag &= ~CBAUD;
X	Ltermio.c_cflag |= baud_selector;
X
X#if defined(HO_HUM)
X	if(ioctl_flag)
X#endif
X		 ioctl(Liofd,TCSETA,(char *)&Ltermio);
X	return(0);
X
X}	/* end of lset_baud_rate */
X
X/*+-------------------------------------------------------------------------
X	lnew_baud_rate(new_baud)
X--------------------------------------------------------------------------*/
Xint
Xlnew_baud_rate(new_baud)
Xuint new_baud;
X{
X	if(valid_baud_rate(new_baud) < 0)
X		return(-1);
X	if(Lbaud != new_baud)
X		Lmodem_already_init = 0;
X	Lbaud = new_baud;
X	lset_baud_rate(1);
X	return(0);
X}	/* end of lnew_baud_rate */
X
X/*+-----------------------------------------------------------------------
X	lset_parity(ioctl_flag)
X
X  If 'ioctl_flag' is set, then perform ioctl call
X  is executed after setting parity
X------------------------------------------------------------------------*/
Xvoid
Xlset_parity(ioctl_flag)
Xint ioctl_flag;
X{
X	Ltermio.c_cflag &= ~(CS8 | PARENB | PARODD);
X	switch(to_lower(Lparity))
X	{
X		case 'e':
X			Ltermio.c_cflag |= CS7 | PARENB;
X			Ltermio.c_iflag |= ISTRIP;
X			break;
X		case 'o':
SHAR_EOF
echo "End of part 5"
echo "File eculine.c is continued in part 6"
echo "6" > 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.