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.