wht@tridom.uucp (Warren Tucker) (10/09/89)
---- Cut Here and unpack ---- #!/bin/sh # this is part 12 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file ecuxenix.c continued # CurArch=12 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 ecuxenix.c" sed 's/^X//' << 'SHAR_EOF' >> ecuxenix.c Xvoid Xsend_bell_fd(fd,count,nap_msec) Xregister fd; Xregister count; Xregister nap_msec; X{ Xstatic char bellch = 0x07; X X if(count) X while(count--) X { X write(fd,&bellch,1); X nap((long)nap_msec); X } X} /* end of send_bell_fd */ X X/*+------------------------------------------------------------------------- X xbell_fd(fd,type,count) X--------------------------------------------------------------------------*/ Xvoid Xxbell_fd(fd,type,count) Xregister fd; Xregister type; Xregister count; X{ Xregister itmp; X X if(count) X while(count--) X { X switch(type) X { X case XBELL_DEEDLE: /* octaves */ X set_bell_fd(fd,1000,1); X send_bell_fd(fd,1,100); X set_bell_fd(fd,2000,1); X send_bell_fd(fd,1,100); X set_bell_fd(fd,4000,1); X send_bell_fd(fd,1,100); X break; X case XBELL_ATTENTION: /* morse .-.-.- ATTENTION */ X for(itmp = 0; itmp < 3; itmp++) X { X set_bell_fd(fd,2000,1); X send_bell_fd(fd,1,140); X set_bell_fd(fd,2000,3); X send_bell_fd(fd,1,340); X } X break; X case XBELL_C: /* morse -.-. C */ X for(itmp = 0; itmp < 2; itmp++) X { X set_bell_fd(fd,2000,3); X send_bell_fd(fd,1,320); X set_bell_fd(fd,2000,1); X send_bell_fd(fd,1,120); X } X break; X case XBELL_3T: /* 3 morse T's */ X set_bell_fd(fd,2000,3); X send_bell_fd(fd,3,460); X break; X default: X set_bell_fd(fd,2000,4); X send_bell_fd(fd,1,100); X break; X } X } X X set_bell_fd(fd,4000,1); X X} /* end of xbell_fd */ X X/*+------------------------------------------------------------------------- X morse_bell(xbell_type,count) X--------------------------------------------------------------------------*/ X#if defined(MORSE) Xmorse_bell(xbell_type,count) Xint xbell_type; Xint count; X{ Xregister morse_fd; Xint morse_ticks = 2; Xchar s64[64]; Xextern int errno; X X if((morse_fd = open("/dev/morse",O_WRONLY,0)) < 0) X return(-1); X X ioctl(morse_fd,MORSE_SET_SPEED,&morse_ticks); X switch(xbell_type) X { X case XBELL_DEEDLE: s64[0] = 'd'; break; X case XBELL_ATTENTION: s64[0] = '.'; break; X case XBELL_C: s64[0] = 'c'; break; X case XBELL_3T: s64[0] = 'o'; break; X default: s64[0] = BT; break; X } X while(count--) X write(morse_fd,s64,1); X close(morse_fd); X return(0); X} /* end of morse_bell */ X#endif X X/*+------------------------------------------------------------------------- X xbell(type,count) X--------------------------------------------------------------------------*/ Xvoid Xxbell(type,count) Xint type; Xint count; X{ X#if defined(MORSE) X if(morse_bell(type,count)) X#endif X xbell_fd(1,type,count); X} /* end of xbell */ X X/*+------------------------------------------------------------------------- X xenix_bell_alarm(xbell_type) X Under XENIX 2.2.1, ring bell on multiscreens; X if morse driver included, use it X--------------------------------------------------------------------------*/ Xint Xxenix_bell_alarm(xbell_type) Xint xbell_type; X{ Xregister notify_fd; Xregister fork_pid; Xstatic long notify_time = 0L; Xchar *ttname; Xchar devname[64]; Xint devnum; Xint ttnum; Xlong time(long *); X X/* if ECU from modem port or console in single-user mode, dont do it */ X/* 0123456789 */ X/* /dev/tty10 */ X/* /dev/tty1a */ X ttname = get_ttyname(); X if(!isdigit(ttname[strlen(ttname) - 1])) X return(0); X ttnum = atoi(ttname + 8); X X/* if happened less than 15 secs ago, forget it */ X if((time((long *)0) - notify_time) < 15L) X return(0); X X notify_time = time((long *)0); X X#if defined(MORSE) X if(morse_bell(xbell_type,1)) X { X#endif X if((fork_pid = smart_fork()) != 0) X { X#if defined(FORK_DEBUG) X sprintf(devname,"DEBUG bell notify pid %d",fork_pid); X ecu_log_event(devname); /* bell notify */ X#endif X return(fork_pid > 0); X } X X for(devnum = 1; devnum < 13; devnum++) X { X if(devnum == ttnum) /* don't bell notify ecu's tty */ X continue; X sprintf(devname,"/dev/tty%02d",devnum); X if((notify_fd = open(devname,O_WRONLY,0)) >= 0) X { X xbell_fd(notify_fd,xbell_type,1); X close(notify_fd); X } X } X X _exit(0); /* end of child tine (of the fork, naturally) */ X#if defined(MORSE) X } X#endif X} /* end of xenix_bell_alarm */ X X/*+------------------------------------------------------------------------- X xenix_bell_notify(xbell_type) X--------------------------------------------------------------------------*/ Xvoid Xxenix_bell_notify(xbell_type) Xint xbell_type; X{ X X if(want_bell_notify) X xenix_bell_alarm(xbell_type); X X} /* end of xenix_bell_notify */ X X/*+------------------------------------------------------------------------- X xenix_signal_str(sig) X--------------------------------------------------------------------------*/ Xchar * Xxenix_signal_str(sig) Xint sig; X{ Xregister char *cptr; Xstatic char sigunknown[20]; X X switch(sig) X { X case SIGHUP: cptr = "SIGHUP"; break; X case SIGINT: cptr = "SIGINT"; break; X case SIGQUIT: cptr = "SIGQUIT"; break; X case SIGILL: cptr = "SIGILL"; break; X case SIGTRAP: cptr = "SIGTRAP"; break; X case SIGIOT: cptr = "SIGIOT"; break; X case SIGEMT: cptr = "SIGEMT"; break; X case SIGFPE: cptr = "SIGFPE"; break; X case SIGKILL: cptr = "SIGKILL"; break; X case SIGBUS: cptr = "SIGBUS"; break; X case SIGSEGV: cptr = "SIGSEGV"; break; X case SIGSYS: cptr = "SIGSYS"; break; X case SIGPIPE: cptr = "SIGPIPE"; break; X case SIGALRM: cptr = "SIGALRM"; break; X case SIGTERM: cptr = "SIGTERM"; break; X case SIGUSR1: cptr = "SIGUSR1"; break; X case SIGUSR2: cptr = "SIGUSR2"; break; X case SIGCLD: cptr = "SIGCLD"; break; X case SIGPWR: cptr = "SIGPWR"; break; X default: X sprintf(sigunknown,"SIG?? (%u)",sig); X return(sigunknown); X } X return(cptr); X X} /* end of xenix_signal_str */ X X/*+------------------------------------------------------------------------- X rename(from,to) X--------------------------------------------------------------------------*/ Xrename(from,to) Xchar *from; Xchar *to; X{ Xstruct stat ss; Xextern int errno; X X if(stat(to,&ss) == 0) /* if to exists, flunk */ X { X errno = EEXIST; /* fake "file exists" error */ X return(-1); X } X if(link(from,to)) /* if cannot link, flunk */ X return(-1); X if(unlink(from)) /* if cannot unlink, flunk */ X return(-1); X return(0); X} /* end of rename */ X X/*+------------------------------------------------------------------------- X send_get_response(token,narg,arg) X--------------------------------------------------------------------------*/ Xsend_get_response(token,narg,arg) Xint token; Xint narg; Xchar **arg; X{ Xregister itmp; Xregister char *cptr; Xint iarg; Xint mode = atoi(arg[1]); XLRWT lr; Xchar buf[1024]; XFILE *fplog; Xchar *fname = "ecu.sgr.log"; Xextern int rcvr_pid; Xextern int interrupt; Xint rcvr_alive = (rcvr_pid > 0); X X if(narg < 3) X { X fputs(" usage: sgr mode cmd\r\n",se); X return; X } X if((fplog = fopen(fname,"a")) == NULL) X { X fputs("\r\n",se); X perror(fname); X fputs("\r\n",se); X return; X } X X mode &= 0x0F; X if(rcvr_alive) X kill_rcvr_process(SIGUSR1); X X lr.to1 = 10 * 1000L; X lr.to2 = 2 * 1000L; X lr.raw_flag = 0x80 + mode; /* allow interrupts */ X lr.buffer = buf; X lr.bufsize = sizeof(buf); X lr.delim = (char *)0; X lr.echo = 0; X interrupt = 0; X X fputs("\r\n",se); X X fprintf(fplog,"\nMode: %d ",mode); X fputs("Stimulus: ",fplog); X for(iarg = 2; iarg < narg; iarg++) X { X fputs(arg[iarg],fplog); X lputs_paced(20,arg[iarg]); X if(iarg != (narg - 1)) X { X fputc(' ',fplog); X lputc_paced(20,' '); X } X } X fputs("\nResponse: \n",fplog); X lputc_paced(20,'\r'); X X lgets_timeout(&lr); X itmp = lr.count; X cptr = strchr(buf,'\n') + 1; X itmp -= (int)(cptr - buf); X hex_dump_fp(fplog,cptr,itmp,(char *)0,1); X X itmp = lr.count; X cptr = buf; X while(itmp--) X { X if(*cptr == '\n') X fputc('\r',se); X fputc(*cptr++,se); X } X X fclose(fplog); X if(rcvr_alive) X start_rcvr_process(0); X} /* end of send_get_response */ X X/* end of ecuxenix.c */ X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF echo "File ecuxenix.c is complete" chmod 0644 ecuxenix.c || echo "restore of ecuxenix.c fails" echo "x - extracting ecuxfer.c (Text)" sed 's/^X//' << 'SHAR_EOF' > ecuxfer.c && X/* CHK=0x6734 */ X/*+------------------------------------------------------------------------- X ecuxfer.c X Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved X X 000000000011111111112222222222333333333344444444445555555555666666666actually X 012345678901234567890123456789012345678901234567890123456789012345678wider X00:.--[ Send ZMODEM/CRC32 ]--------------------------------------------. X01:| | X02:| File? to send: | X03:| ................................................................ | X04:| | X05:| Binary: Y (no CR/LF translation) | X06:| Overwrite destination files: Y | X07:| Send full pathnames: N | X08:| Transfer only newer files: N (if receiver supports) | X09:| | X-1:| TAB:next ^B:prev END:perform transfer ESC:abort | X-0:`-------------------------------------------------------------------' X X Defined functions: X file_xfer_done_bell() X file_xfer_start() X receive_files_from_remote(argc,argv) X report_send_status() X send_files_to_remote(argc,argv) X xfer_title_fragment() X xfrw_bot_msg(msg) X xfrw_display_cmd_line() X xfrw_get_single(nondelim_list) X xfrws_display_allvars() X xfrws_display_binary() X xfrws_display_literals() X xfrws_display_name() X xfrws_display_xfernew() X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */ X/*:06-27-1989-22:42-wht-brackets around standout status report */ X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */ X X#include <curses.h> X X#define STDIO_H_INCLUDED X#define OMIT_TERMIO_REFERENCES X#include "ecu.h" X#include "ecukey.h" X#include "ecuxkey.h" X#include "ecuerror.h" X#include "pc_scr.h" X X#define END XFend X X/* -- protocol xfer types -- */ X#define ECUSZ_X 1 X#define ECUSZ_Y 2 X#define ECUSZ_Z 3 X#define ECUSEA 4 X#define CKERMIT 5 X#define ECURZ_X 7 X#define ECURZ_Y 8 X#define ECURZ_Z 9 X X/* --------------------- send window ----------------------------------- */ X/* SNDW_LINES calculated (xfrw_lines) */ X#define SNDW_COLS 79 X#define SNDW_TLY 2 X/* SNDW_TLX calculated (xfrw_tlx) */ X X#define SNDW_FILE_LY 2 X#define SNDW_FILE_LX 3 X#define SNDW_FILE_Y 3 X#define SNDW_FILE_X 3 X#define SNDW_FILE_LEN (SNDW_COLS - SNDW_FILE_X - 2) X X#define SNDW_BIN_Y 5 X#define SNDW_BIN_LX 3 X#define SNDW_BIN_X 11 X#define SNDW_BIN_LX2 13 X X#define SNDW_OVERW_Y 6 X#define SNDW_OVERW_LX 3 X#define SNDW_OVERW_X 32 X X#define SNDW_SNDFUL_Y 7 X#define SNDW_SNDFUL_LX 3 X#define SNDW_SNDFUL_X 24 X X#define SNDW_XFRNEW_Y 8 X#define SNDW_XFRNEW_LX 3 X#define SNDW_XFRNEW_X 30 X Xextern char curr_dir[]; /* current working directory */ Xextern int protocol_log_packets; Xextern int last_child_wait_status; X Xlong file_xfer_start_time; /* time() value at beginning of file xfer */ Xchar xfertype = -1; /* file xfer type */ XWINDOW *xfrw; Xchar xfrw_cols; Xchar xfrw_lines; Xchar xfrw_tlx; X Xchar p_binary; /* xfer options -- not all apply to all protocols */ Xchar p_sendfull; Xchar p_overwrite; Xchar p_xfernew; Xchar p_filelist[80]; X X/*+------------------------------------------------------------------------- X file_xfer_start() X--------------------------------------------------------------------------*/ Xvoid Xfile_xfer_start() X{ Xlong time(); X file_xfer_start_time = time((long *)0); X} /* end of file_xfer_start */ X X/*+------------------------------------------------------------------------- X file_xfer_done_bell() X--------------------------------------------------------------------------*/ Xvoid Xfile_xfer_done_bell() X{ Xlong time(); Xlong xfer_time = time((long *)0) - file_xfer_start_time; Xint xbell_count = 0; Xextern int want_bell_notify; X X sleep(1); X xbell_count = 1; X if(xfer_time >= 3600L) /* >= one hour */ X xbell_count = 3; X else if(xfer_time >= 1800L) /* >= 1/2 hour */ X xbell_count = 2; X X if(want_bell_notify) X xenix_bell_notify(XBELL_ATTENTION); X X xbell(XBELL_DEEDLE,xbell_count); X} /* end of file_xfer_done_bell */ X X/*+------------------------------------------------------------------------- X xfrw_bot_msg(msg) X--------------------------------------------------------------------------*/ Xvoid Xxfrw_bot_msg(msg) Xchar *msg; X{ Xregister itmp; Xregister itmp2; Xstatic last_msglen = 0; Xchar msg2[80]; X X wmove(xfrw,xfrw_lines - 1,3); X X if((itmp = strlen(msg)) == 0) X { X itmp2 = last_msglen + 2; X for(itmp = 0; itmp < itmp2; itmp++) X waddch(xfrw,sHR); X last_msglen = 0; X } X else X { X waddch(xfrw,' '); X if(itmp > xfrw_cols - 3 - 2) X { X strncpy(msg2,msg,xfrw_cols - 3 - 2); X msg2[xfrw_cols - 3 - 2 + 1] = 0; X waddstr(xfrw,msg2); X itmp = strlen(msg2); X } X else X { X waddstr(xfrw,msg); X itmp = strlen(msg); X } X waddch(xfrw,' '); X if((itmp2 = last_msglen - itmp) > 0) X { X while(itmp2--) X waddch(xfrw,sHR); X } X last_msglen = itmp; /* remember last message length */ X } X wrefresh(xfrw); X} /* end of xfrw_bot_msg */ X X/*+------------------------------------------------------------------------- X xfrw_get_single(nondelim_list) Xassumes cursor is already positioned X--------------------------------------------------------------------------*/ Xint Xxfrw_get_single(nondelim_list) Xregister char *nondelim_list; X{ Xregister uint itmp; Xstatic char xfrw_nondelim_list[] = X{ X CR,NL,CTL_B,TAB,ESC,CTL_L,CTL_R,END X}; X X itmp = winget_single(xfrw,nondelim_list,xfrw_nondelim_list); X if( (itmp & 0xFF) == 0x0D) X itmp = NL | 0x1000; X return(itmp); X} /* end of xfrw_get_single */ X X/*+------------------------------------------------------------------------- X xfer_title_fragment(xfertype) X--------------------------------------------------------------------------*/ Xchar * Xxfer_title_fragment() X{ Xregister char *cptr = "UNKNOWN"; X X switch(xfertype) X { X case ECURZ_X: X case ECUSZ_X: cptr = "XMODEM/CRC"; break; X case ECURZ_Y: X case ECUSZ_Y: cptr = "YMODEM/CRC"; break; X case ECURZ_Z: X case ECUSZ_Z: cptr = "ZMODEM/CRC32"; break; X case ECUSEA: cptr = "SEAlink"; break; X case CKERMIT: cptr = "KERMIT/CRC" ;break; X } X return(cptr); X} /* end of xfer_title_fragment */ X X/*+------------------------------------------------------------------------- X xfrw_display_cmd_line() X--------------------------------------------------------------------------*/ Xvoid Xxfrw_display_cmd_line() X{ Xregister itmp; Xchar *cmd_string = "TAB:next ^B:prev END:perform transfer ESC:abort"; Xregister left_spaces = ((xfrw_cols - 2) - strlen(cmd_string)) / 2; Xint x; Xint y; X X wmove(xfrw,xfrw_lines - 2,1); X wstandout(xfrw); X for(itmp = 0; itmp < left_spaces; itmp++) X waddch(xfrw,' '); X waddstr(xfrw,cmd_string); X getyx(xfrw,y,x); X while(++x < xfrw_cols) X waddch(xfrw,' '); X wstandend(xfrw); X X} /* end of xfrw_display_cmd_line */ X X/*+------------------------------------------------------------------------- X xfrws_display_literals() X--------------------------------------------------------------------------*/ Xvoid Xxfrws_display_literals() X{ X wmove(xfrw,SNDW_FILE_LY,SNDW_FILE_LX); X if(xfertype == ECUSZ_X) X waddstr(xfrw,"File"); X else X waddstr(xfrw,"File(s)"); X waddstr(xfrw," to send:"); X X switch(xfertype) X { X case ECUSZ_Z: X wmove(xfrw,SNDW_XFRNEW_Y,SNDW_XFRNEW_LX); X waddstr(xfrw,"Transfer only newer files:"); X wmove(xfrw,SNDW_SNDFUL_Y,SNDW_SNDFUL_LX); X waddstr(xfrw,"Send full pathames:"); X case CKERMIT: X wmove(xfrw,SNDW_OVERW_Y,SNDW_OVERW_LX); X waddstr(xfrw,"Overwrite destination files:"); X case ECUSZ_Y: X case ECUSZ_X: X wmove(xfrw,SNDW_BIN_Y,SNDW_BIN_LX); X waddstr(xfrw,"Binary:"); X } X} /* end of xfrws_display_literals */ X X/*+------------------------------------------------------------------------- X xfrws_display_name() X--------------------------------------------------------------------------*/ Xvoid Xxfrws_display_name() X{ X clear_area(xfrw,SNDW_FILE_Y,SNDW_FILE_X,SNDW_FILE_LEN); X waddstr(xfrw,p_filelist); X X} /* end of xfrws_display_name */ X X/*+------------------------------------------------------------------------- X xfrws_display_binary() X--------------------------------------------------------------------------*/ Xvoid Xxfrws_display_binary() X{ X wmove(xfrw,SNDW_BIN_Y,SNDW_BIN_X); X waddch(xfrw,(p_binary) ? 'Y' : 'N'); X if(p_binary) X waddstr(xfrw," (no NL-CR/LF translation) "); X else X waddstr(xfrw," (NL-CR/LF translation enabled)"); X X} /* end of xfrws_display_binary */ X X/*+------------------------------------------------------------------------- X xfrws_display_xfernew() X--------------------------------------------------------------------------*/ Xxfrws_display_xfernew() X{ X wmove(xfrw,SNDW_XFRNEW_Y,SNDW_XFRNEW_X); X waddch(xfrw,(p_xfernew) ? 'Y' : 'N'); X if(p_xfernew) X waddstr(xfrw," (if receiver supports)"); X else X waddstr(xfrw," "); X} /* end of xfrws_display_xfernew */ X X/*+------------------------------------------------------------------------- X xfrws_display_allvars() X--------------------------------------------------------------------------*/ Xvoid Xxfrws_display_allvars() X{ X xfrws_display_name(); X switch(xfertype) X { X case ECUSZ_Z: X xfrws_display_xfernew(); X wmove(xfrw,SNDW_SNDFUL_Y,SNDW_SNDFUL_X); X waddch(xfrw,(p_sendfull) ? 'Y' : 'N'); X case CKERMIT: X wmove(xfrw,SNDW_OVERW_Y,SNDW_OVERW_X); X waddch(xfrw,(p_overwrite) ? 'Y' : 'N'); X case ECUSZ_Y: X case ECUSZ_X: X xfrws_display_binary(); X } X} /* end of xfrws_display_allvars */ X X/*+------------------------------------------------------------------------- X report_send_status() - report file transmission result Xreturns proc-type erc Xfor "ecu knowledgeable" protocols only X--------------------------------------------------------------------------*/ Xreport_send_status() X{ Xint erc = 0; Xunsigned int utmp; X X utmp = last_child_wait_status; X if((utmp & 0xFF) == 0) /* exit() called */ X { X utmp >>= 8; X if(utmp == 0) X { X stand_out(); X pputs(" [transfer successful] "); X stand_end(); X pputs("\n"); X erc = 0; X } X else if(utmp == 255) X { X stand_out(); X pputs(" [ecu error: transfer program usage error] "); X stand_end(); X pputs("\n"); X erc = eFATAL_ALREADY; X } X else if(utmp == 254) X { X stand_out(); X pputs( X " [protocol failure: bad line conditions or remote not ready] "); X stand_end(); X pputs("\n"); X erc = eFATAL_ALREADY; X } X else if(utmp == 253) X { X stand_out(); X pputs(" [no requested files exist] "); X stand_end(); X pputs("\n"); X erc = eFATAL_ALREADY; X } X else if(utmp < 128) X { X stand_out(); X if(utmp == 127) X pputs(" [127 or more files skipped] "); X else X pprintf(" [%u files rejected] ",utmp); X stand_end(); X pputs("\n"); X erc = 0; X } X else X { X stand_out(); X pprintf(" [transfer aborted by %s] ", X xenix_signal_str(utmp - 128)); X stand_end(); X pputs("\n"); X erc = eProcAttn_Interrupt; X } X } X else X { X stand_out(); X pprintf(" [transfer killed by %s] ", X xenix_signal_str(utmp - 128)); X stand_end(); X pputs("\n"); X erc = eProcAttn_Interrupt; X } X X return(erc); X X} /* end of report_send_status */ X X/*+----------------------------------------------------------------------- X send_files_to_remote(argc,argv) X------------------------------------------------------------------------*/ Xvoid Xsend_files_to_remote(argc,argv) Xint argc; Xchar **argv; X{ Xregister itmp; Xregister input_state = 0; Xregister input_state_mod; Xunsigned int utmp; Xint input_done; Xint used_argv = 0; Xchar execcmd[256]; Xchar s80[80]; Xuchar delim; /* important to be unsigned to avoid sign extension */ XWINDOW *window_create(); Xchar bottom_label[64]; X X p_binary = 1; /* assume p_binary xfer */ X p_sendfull = 0; /* assume no full pathnames */ X p_overwrite = 1; /* assume overwrite */ X p_xfernew = 0; /* assume send only newer */ X p_filelist[0] = 0; /* no filenames yet */ X X switch(to_lower(*(argv[0] + 1))) X { X case 'x': xfertype = ECUSZ_X; break; X case 'y': xfertype = ECUSZ_Y; break; X case 'z': xfertype = ECUSZ_Z; break; X case 'k': xfertype = CKERMIT; break; X case 's': xfertype = ECUSEA; break; X default: ff(se,"send command invalid\n"); X return; X } X X kill_rcvr_process(SIGUSR1); /* SIGUSR1 gives chance to close log file */ X X/* define and open window */ X input_state_mod = 0; X xfrw_tlx = (COLS - SNDW_COLS) / 2; X xfrw_cols = SNDW_COLS; X switch(xfertype) X { X case ECUSEA: X input_state_mod = 1; X xfrw_lines = 7; X break; X case ECUSZ_X: X input_state_mod = 2; X xfrw_lines = 9; X break; X case ECUSZ_Z: X input_state_mod = 5; X case CKERMIT: X if(!input_state_mod) X input_state_mod = 3; X case ECUSZ_Y: X if(!input_state_mod) X input_state_mod = 2; X xfrw_lines = input_state_mod + 7; X break; X default: X hangup(9999); X } X X windows_start(); X sprintf(execcmd,"Send %s",xfer_title_fragment()); X xfrw = window_create(execcmd,3,SNDW_TLY,(int)xfrw_tlx, X (int)xfrw_lines,(int)xfrw_cols); X xfrw_display_cmd_line(); X xfrws_display_literals(); X xfrws_display_allvars(); X wmove(xfrw,0,27); X waddstr(xfrw," dir: "); X if(strlen(curr_dir) > (xfrw_cols - 32)) X { X char s80[80]; X strncpy(s80,curr_dir,xfrw_cols - 32); X s80[xfrw_cols - 32] = 0; X waddstr(xfrw,s80); X } X else X waddstr(xfrw,curr_dir); X waddch(xfrw,' '); X XREENTER_INPUT_LOOP: X input_done = 0; X while(!input_done) X { X switch(input_state) X { X case 0: /* filename(s) */ X xfrw_bot_msg("enter file(s) to send"); XCASE_0_AGAIN: X if(used_argv || (argc == 1)) X { X itmp = wingets(xfrw,SNDW_FILE_Y,SNDW_FILE_X,s80, X SNDW_FILE_LEN + 1,&delim,(p_filelist[0] != 0)); X } X else X { X used_argv = 1; X s80[0] = 0; X utmp = 0; X for(itmp = 1; itmp < argc; itmp++) X { X if((strlen(s80) + strlen(argv[itmp]) + 1) > sizeof(s80)) X { X xfrw_bot_msg("arguments too long ... reenter list"); X ring_bell(); X goto CASE_0_AGAIN; X } X strcat(s80,argv[itmp]); X if(itmp != (argc - 1)) X strcat(s80," "); X } X delim = CR; X } X if(delim == ESC) X break; X if(strlen(s80)) X { X strcpy(p_filelist,s80); X xfrws_display_name(); X if(find_shell_chars(p_filelist)) X { X char *expcmd; X X if(expand_cmd_with_wildlist(p_filelist,&expcmd)) X { X xfrw_bot_msg(expcmd); X ring_bell(); X goto CASE_0_AGAIN; X } X expcmd[SNDW_FILE_LEN - 1] = 0; X clear_area(xfrw,SNDW_FILE_Y,SNDW_FILE_X,SNDW_FILE_LEN); X waddstr(xfrw,expcmd); X free(expcmd); X } X } X break; X case 1: /* binary */ X xfrw_bot_msg("Y: no conversion, N: NLs converted to CR/LF"); X wmove(xfrw,SNDW_BIN_Y,SNDW_BIN_X); X wrefresh(xfrw); X delim = NL; X switch(itmp = xfrw_get_single("ny")) X { X case 0: X case 1: X p_binary = itmp; X xfrws_display_binary(); X break; X default: X delim = itmp & 0xFF; X break; X } X break; X X case 2: /* overwrite */ X xfrw_bot_msg("Y: overwrite, N: protect destination files"); X wmove(xfrw,SNDW_OVERW_Y,SNDW_OVERW_X); X wrefresh(xfrw); X delim = NL; X switch(itmp = xfrw_get_single("ny")) X { X case 0: X case 1: X p_overwrite = itmp; X break; X default: X delim = itmp & 0xFF; X break; X } X break; X X case 3: /* send full pathnames */ X xfrw_bot_msg( X "Y: full pathnames, N: strip directory portion from names"); X wmove(xfrw,SNDW_SNDFUL_Y,SNDW_SNDFUL_X); X wrefresh(xfrw); X delim = NL; X switch(itmp = xfrw_get_single("ny")) X { X case 0: X case 1: X p_sendfull = itmp; X break; X default: X delim = itmp & 0xFF; X break; X } X break; X X case 4: /* resume interrupted transfer */ X X xfrw_bot_msg( X "Y: send only if source newer than destination, N send all"); X wmove(xfrw,SNDW_XFRNEW_Y,SNDW_XFRNEW_X); X wrefresh(xfrw); X delim = NL; X switch(itmp = xfrw_get_single("ny")) X { X case 0: X case 1: X p_xfernew = itmp; X xfrws_display_xfernew(); X break; X default: X delim = itmp & 0xFF; X break; X } X break; X X } X X switch(delim) X { X case CTL_B: X input_state = (input_state) ? input_state - 1 X : input_state_mod - 1; X break; X X case TAB: X case NL: X input_state++; X input_state %= input_state_mod; X break; X X case CTL_L: X case CTL_R: X clear_screen(); X touchwin(stdscr); X wrefresh(stdscr); X touchwin(xfrw); X wrefresh(xfrw); X break; X X case ESC: X xfrw_bot_msg("transfer abandoned"); X input_done = 1; X break; X X case END: X input_done = 1; X break; X } X } X X if(delim == END) X { X if(!p_filelist[0]) X { X ring_bell(); X xfrw_bot_msg("No filenames entered! Press <ENTER>"); X (void)ttygetc(1); X input_state = 0; X goto REENTER_INPUT_LOOP; X } X xfrw_bot_msg("starting file transfer"); X } X X windows_end(xfrw); X curmove(SNDW_TLY + xfrw_lines + 1,0); X X if(delim == ESC) X { X start_rcvr_process(1); X return; X } X X sprintf(bottom_label,"-C \"'Connected to %s'\" ", X (Llogical[0]) ? Llogical : "?"); X X/* we are going to do a transfer! */ X switch(xfertype) X { X case ECUSZ_X: X sprintf(execcmd,"ecusz -X -. %d ",Liofd); X strcat(execcmd,bottom_label); X if(protocol_log_packets) X strcpy(&execcmd[strlen(execcmd) ],"-, "); X if(p_binary) X strcat(execcmd,"-b "); X else X strcat(execcmd,"-a "); X strcat(execcmd,p_filelist); X break; X case ECUSZ_Y: X sprintf(execcmd,"ecusz -Y -. %d -k ",Liofd); X strcat(execcmd,bottom_label); X if(protocol_log_packets) X strcpy(&execcmd[strlen(execcmd) ],"-, "); X if(p_binary) X strcat(execcmd,"-b "); X else X strcat(execcmd,"-a "); X strcat(execcmd,p_filelist); X break; X X case ECUSZ_Z: X sprintf(execcmd,"ecusz -Z -. %d ",Liofd); X strcat(execcmd,bottom_label); X if(protocol_log_packets) X strcat(execcmd,"-, "); X if(p_overwrite) X strcat(execcmd,"-y "); X else X strcat(execcmd,"-p "); X if(p_binary) X strcat(execcmd,"-b "); X else X strcat(execcmd,"-a "); X if(p_xfernew) X strcat(execcmd,"-n "); /* overrides -y/-p choice earlier */ X if(p_sendfull) X strcat(execcmd,"-f "); X strcat(execcmd,p_filelist); X break; X X case ECUSEA: X sprintf(execcmd,"ecusea -. %d -/ %s -s ",Liofd,curr_dir); X if(protocol_log_packets) X strcat(execcmd,"-, "); X strcat(execcmd,p_filelist); X break; X X case CKERMIT: X sprintf(execcmd,"ckermit -l %d -b %u -p %c%s%s -s %s", X Liofd, X Lbaud, X (Lparity) ? Lparity : 'n', X (p_binary) ? " -i" : "", X (p_overwrite) ? "" : " -w", X p_filelist); X break; X X } X X file_xfer_start(); X X if(find_shell_chars(execcmd)) X { X char *expcmd; X X if(expand_cmd_with_wildlist(execcmd,&expcmd)) X { X ff(se,"No files match\r\n"); X return; X } X if(exec_cmd(expcmd)) X { X ff(se,"Could not execute command\r\n"); X start_rcvr_process(1); X free(expcmd); X return; X } X free(expcmd); X } X else X { X if(exec_cmd(execcmd)) X { X ff(se,"Could not execute command\r\n"); X start_rcvr_process(1); X return; X } X } X X lreset_ksr(); X X switch(xfertype) X { X case ECUSEA: X case ECUSZ_X: X case ECUSZ_Y: X case ECUSZ_Z: X xfertype = 1; /* was ecusz */ X break; X default: X xfertype = 0; X break; X } X X if(xfertype) /* ecu knowledgable */ X report_send_status(); X else X { X stand_out(); X ff(se," transfer status %04x ",last_child_wait_status); SHAR_EOF echo "End of part 12" echo "File ecuxfer.c is continued in part 13" echo "13" > 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.