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.