wht@gatech.edu@tridom.UUCP (Warren H. Tucker) (05/30/90)
Posting-number: Volume 13, Issue 16 Submitted-by: wht@gatech.edu@tridom.UUCP (Warren H. Tucker) Archive-name: tipx/part04 #!/bin/sh # This is part 04 of tipx if touch 2>&1 | fgrep 'mmdd' > /dev/null then TOUCH=touch else TOUCH=true fi # ============= xfer/zcurses.c ============== echo "x - extracting xfer/zcurses.c (Text)" sed 's/^X//' << 'SHAR_EOF' > xfer/zcurses.c && X/*+------------------------------------------------------------------------- X zcurses.c -- tip file transfer program curses interface X wht%n4hgf@emory.mathcs.emory.edu X X 000000000011111111112222222222333333333344444444445555555550 X 012345678901234567890123456789012345678901234567890123456789 X00.-[ prog+rev ]-- <dir> ------------------------------------. X01| ZMODEM_6____ _40_____________________________________ | X02| File ### of ###: _38__________________________________ | X03| File position: _8______ length: _8______ -rwxrwxrwx | X04| _55____________________________________________________ | transaction X05| _55____________________________________________________ | last rx/tx hdr X06| Comm I/O: rx _8______ tx _8______ bytes | X07| Baud rate: _5___ BINARY blklen: _____ comm mode: RAW-g | X08| Time: started: __:__:__ this file: __:__:__ window: | X09| __:__:__ elapsed: __:__:__ __:__:__ ________ | X10| Errors: this file: _3_ total: _4__ files skipped: _3_ | X11| _55____________________________________________________ | err str X12| _55____________________________________________________ | comment str X13| _55____________________________________________________ | remote info X14`----------------------------------------------------------' X X Defined functions: X clear_area(win,row,col,len) X clear_area_char(win,row,col,len,fillchar) X get_elapsed_time(elapsed_seconds) X get_tod(type,tod) X mode_map(mode,mode_str) X report_comm_baud_rate(baud_rate) X report_error_count() X report_file_byte_io(count) X report_file_close() X report_file_open_length(length) X report_file_open_mode(file_mode) X report_file_open_tod() X report_file_rcv_started(filename,length,last_mod_time,file_mode) X report_file_send_open(filename,filestat) X report_init(title) X report_last_rxhdr(rptstr,error_flag) X report_last_txhdr(rptstr,error_flag) X report_mode(mode) X report_protocol_crc_type(str) X report_protocol_type(str) X report_rx_ind(status) X report_rx_tx_count() X report_rxblklen(blklen) X report_rxpos(rxpos) X report_str(rptstr,error_flag) X report_top_line(topstr) X report_transaction(str) X report_tx_ind(status) X report_txblklen(blklen) X report_txpos(txpos) X report_uninit(sig) X report_window() X report_xfer_mode(str) X X------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:05-21-1990-16:00-wht@tridom-adapt ecu xfer protocols for tipwht */ X X#include <curses.h> X#include <sys/types.h> X#include <sys/stat.h> X#include <ctype.h> X#include <signal.h> X#include <time.h> X#include <sys/timeb.h> X X#include "zlint.h" X Xlong time(); Xextern char *tzname[]; Xstruct tm *localtime(); X X#ifdef IBMPC X#define sTL 0xDA X#define sTR 0xBF X#define sBL 0xC0 X#define sBR 0xD9 X#define sLT 0xC3 /* left hand T */ X#define sRT 0xB4 /* right hand T */ X#define sVR 0xB3 /* vertical rule */ X#define sHR 0xC4 /* horizontal rule */ X#else X#define sTL '.' X#define sTR '.' X#define sBL '`' X#define sBR '\'' X#define sLT '+' X#define sRT '+' X#define sVR '|' X#define sHR '-' X#endif X X#define WIN_LINES 15 X#define WIN_COLS 60 X#define WIN_TOPY 2 X#define WIN_LEFTX 8 X Xextern char curr_dir[]; Xextern char s128[]; Xextern char *bottom_label; Xextern int Filcnt; Xextern int tipsz_flag; /* tipsz == 1, tiprz == 0 */ Xextern int skip_count; Xextern int npats; Xextern long rxpos; Xextern int log_packets; Xextern long Txpos; Xextern long Rxpos; X XWINDOW *win; Xint (*original_sigint_handler)(); Xint (*original_sigquit_handler)(); Xint (*original_sigterm_handler)(); Xint curses_installed = 0; /* curses not yet active */ Xint this_file_errors; Xint total_errors; Xint show_window = 0; Xlong current_seconds = 0; Xlong start_seconds = 0; Xlong this_file_start_seconds = 0; Xlong elapsed_seconds = 0; Xunsigned long total_data_chars_xfered = 0L; Xunsigned int zcurses_baud_rate = 0; Xchar s256[256]; X Xchar *win_template[] = X{ X/*00000000001111111111222222222233333333334444444444555555555 */ X/*01234567890123456789012345678901234567890123456789012345678 */ X/*.----------------------------------------------------------. */ X " ", /* 1 */ X " File ### of ###: _____________________________________ ", /* 2 */ X " File position: ________ length: ________ ", /* 3 */ X " ", /* 4 */ X " tx: ______________________ rx: ______________________ ", /* 5 */ X " Comm I/O: rx ________ tx ________ bytes ", /* 6 */ X " Baud rate: _____ ______ blklen: _____ comm mode: ______ ", /* 7 */ X " Time: started: __:__:__ this file: __:__:__ ", /* 8 */ X " __:__:__ elapsed: __:__:__ __:__:__ ", /* 9 */ X " Errors: this file: ___ total: ____ files skipped: ___ ", /* 10 */ X " ", /* 11 */ X " ", /* 12 */ X " ", /* 13 */ X/*`----------------------------------------------------------' */ X(char *)0 X}; X X/*+----------------------------------------------------------------------- X char *get_elapsed_time(elapsed_seconds) X hh:mm:ss returned X static string address is returned X------------------------------------------------------------------------*/ Xchar *get_elapsed_time(elapsed_seconds) Xlong elapsed_seconds; X{ X static char elapsed_time_str[10]; X long hh,mm,ss; X X hh = elapsed_seconds / 3600; X elapsed_seconds -= hh * 3600; X mm = elapsed_seconds / 60L; X elapsed_seconds -= mm * 60L; X ss = elapsed_seconds; X X sprintf(elapsed_time_str,"%02ld:%02ld:%02ld",hh,mm,ss); X return(elapsed_time_str); X} /* end of get_elapsed_time */ X X/*+----------------------------------------------------------------------- X char *get_tod(type,tod) X X time of day types: X 0 hh:mm X 1 hh:mm:ss X 2 mm-dd-yyyy hh:mm X X static string address is returned X if tod != (char *)0, time is returned there too X------------------------------------------------------------------------*/ Xchar * Xget_tod(type,tod) Xint type; Xchar *tod; X{ X long cur_time = 0; X struct tm *lt; /* local time */ X static char tod_str[32]; X#if defined(M_SYS5) X struct timeb tp; X#endif X X cur_time = time((long *)0); X lt = localtime(&cur_time); X X switch(type) X { X case 0: X sprintf(tod_str,"%02d:%02d",lt->tm_hour,lt->tm_min); X break; X X default: X case 1: X sprintf(tod_str,"%02d:%02d:%02d",lt->tm_hour,lt->tm_min,lt->tm_sec); X break; X X case 2: X sprintf(tod_str,"%02d-%02d-%04d %02d:%02d", X lt->tm_mon + 1,lt->tm_mday,lt->tm_year + 1900, X lt->tm_hour,lt->tm_min); X break; X } X X if(tod != (char *)0) X strcpy(tod,tod_str); X X return(tod_str); X} /* end of get_tod */ X X/*+----------------------------------------------------------------------- X mode_map(mode,mode_str) build drwxrwxrwx string X------------------------------------------------------------------------*/ Xchar * Xmode_map(mode,mode_str) Xunsigned short mode; Xchar *mode_str; X{ Xregister unsigned ftype = mode & S_IFMT; Xregister char *rtn; Xstatic char result[12]; X X rtn = (mode_str == (char *)0) ? result : mode_str; X X /* drwxrwxrwx */ X /* 0123456789 */ X strcpy(rtn,"----------"); X X switch(ftype) X { X case S_IFIFO: *rtn = 'p'; break; /* FIFO (named pipe) */ X case S_IFDIR: *rtn = 'd'; break; /* directory */ X case S_IFCHR: *rtn = 'c'; break; /* character special */ X case S_IFBLK: *rtn = 'b'; break; /* block special */ X case S_IFREG: *rtn = '-'; break; /* regular */ X X#if defined(pyr) | defined(BSD4) X case S_IFLNK: *rtn = 'l'; break; /* symbolic link */ X case S_IFSOCK: *rtn = 's'; break; /* socket */ X#endif X X#if defined(M_SYS5) X case S_IFNAM: /* name space entry */ X if(mode & S_INSEM) /* semaphore */ X { X *rtn = 's'; X break; X } X if(mode & S_INSHD) /* shared memory */ X { X *rtn = 'm'; X break; X } X#endif X X default: *rtn = '?'; break; /* ??? */ X } X X if(mode & 000400) *(rtn + 1) = 'r'; X if(mode & 000200) *(rtn + 2) = 'w'; X if(mode & 000100) *(rtn + 3) = 'x'; X if(mode & 004000) *(rtn + 3) = 's'; X if(mode & 000040) *(rtn + 4) = 'r'; X if(mode & 000020) *(rtn + 5) = 'w'; X if(mode & 000010) *(rtn + 6) = 'x'; X if(mode & 002000) *(rtn + 6) = 's'; X if(mode & 000004) *(rtn + 7) = 'r'; X if(mode & 000002) *(rtn + 8) = 'w'; X if(mode & 000001) *(rtn + 9) = 'x'; X if(mode & 001000) *(rtn + 9) = 't'; X X return(rtn); X X} /* end of mode_map */ X X/*+------------------------------------------------------------------------- X clear_area(win,row,col,len) X--------------------------------------------------------------------------*/ Xclear_area(win,row,col,len) XWINDOW *win; Xint row; Xint col; Xint len; X{ X wmove(win,row,col); X while(len-- > 0) X waddch(win,' '); X wmove(win,row,col); X X} /* end of clear_area */ X X/*+------------------------------------------------------------------------- X clear_area_char(win,row,col,len,fillchar) X--------------------------------------------------------------------------*/ Xclear_area_char(win,row,col,len,fillchar) XWINDOW *win; Xint row; Xint col; Xint len; Xchar fillchar; X{ X wmove(win,row,col); X while(len-- > 0) X waddch(win,fillchar); X wmove(win,row,col); X X} /* end of clear_area_char */ X X/*+------------------------------------------------------------------------- X report_top_line(topstr) X top line: row 1 col 17 length 42 X--------------------------------------------------------------------------*/ Xvoid Xreport_top_line(topstr) Xchar *topstr; X{ Xchar s42[42]; X clear_area(win,1,17,42); X if(strlen(topstr) < 40) X waddstr(win,topstr); X else X { X strncpy(s42,topstr,40); X s42[40] = 0; X waddstr(win,s42); X } X} /* end of report_top_line */ X X/*+------------------------------------------------------------------------- X report_xfer_mode(modestr) BINARY/ASCII X protocol xfer type: row 7 col 20 length 6 X--------------------------------------------------------------------------*/ Xreport_xfer_mode(str) Xchar *str; X{ Xchar s10[10]; X X if(strlen(str) > 6) X { X strncpy(s10,str,6); X s10[7] = 0; X str = s10; X } X clear_area(win,7,20,6); X waddstr(win,str); X wrefresh(win); X X} /* end of report_xfer_mode */ X X/*+------------------------------------------------------------------------- X report_protocol_type(str) X X protocol type: row 1 col 3 length 6 string X--------------------------------------------------------------------------*/ Xreport_protocol_type(str) Xregister char *str; X{ Xchar s10[10]; X X if(strlen(str) > 6) X { X strncpy(s10,str,6); X s10[7] = 0; X str = s10; X } X clear_area(win,1,3,6); X waddstr(win,str); X wrefresh(win); X X} /* end of report_protocol_type */ X X/*+------------------------------------------------------------------------- X report_protocol_crc_type(str) X X protocol crc type: row 1 col 9 length 6 X--------------------------------------------------------------------------*/ Xreport_protocol_crc_type(str) Xregister char *str; X{ Xchar s8[8]; X X if(strlen(str) > 6) X { X strncpy(s8,str,6); X s8[7] = 0; X str = s8; X } X clear_area(win,1,9,6); X waddstr(win,str); X wrefresh(win); X X} /* end of report_protocol_crc_type */ X X/*+------------------------------------------------------------------------- X report_uninit(sig) X--------------------------------------------------------------------------*/ Xvoid Xreport_uninit(sig) Xint sig; /* if -1, called by normal code, else kill() value */ X{ X float rate = 0.0; X float eff = 0.0; X X if(curses_installed) X { X elapsed_seconds = current_seconds - start_seconds; X if(elapsed_seconds) X { X rate = (float)total_data_chars_xfered / (float)elapsed_seconds; X if(zcurses_baud_rate) X eff = 100 * (rate / ((float)zcurses_baud_rate / 10.0)); X } X if(rate > 0.01) X { X sprintf(s128,"Transfer rate ~= %.0f ch/sec (%.0f%%)", X rate,(eff > 0.5) ? eff : 0.0); X if(log_packets) X { X write(log_packets,"info: ",6); X write(log_packets,s128,strlen(s128)); X write(log_packets,"\n",1); X } X report_top_line(s128); X } X report_file_byte_io(0L); X report_rx_tx_count(); X wmove(win,WIN_LINES - 1,WIN_COLS - 1); X wrefresh(win); X endwin(); X fprintf(stderr,"\r\n\r\n\r\n"); X fflush(stderr); X curses_installed = 0; X } X X} /* end of report_uninit */ X X/*+------------------------------------------------------------------------- X report_init(title) X "top line": row 1 col 11 len 21 X file quan: row 2 col 15 len 3 X row 2 col 12 len 7 clear "of ###" X start time: row 8 col 21 len 8 X "window:" row 8 col 50 len 7 X--------------------------------------------------------------------------*/ Xvoid Xreport_init(title) Xchar *title; X{ X register int itmp; X register char *cptr; X char buf[80]; X X if(curses_installed) X return; X X initscr(); X crmode(); X noecho(); X nonl(); X clear(); X curses_installed = 1; X win = newwin(WIN_LINES,WIN_COLS,WIN_TOPY,WIN_LEFTX); X box(win,sVR,sHR); X wmove(win,0,0); waddch(win,sTL); X wmove(win,win->_maxy - 1,0); waddch(win,sBL); X wmove(win,win->_maxy - 1,win->_maxx - 1); waddch(win,sBR); X wmove(win,0,win->_maxx - 1); waddch(win,sTR); X wmove(win,0,2); X wstandout(win); X waddch(win,'['); X waddch(win,' '); X waddstr(win,title); X waddch(win,' '); X waddch(win,']'); X wstandend(win); X waddch(win,sHR); X waddch(win,sHR); X waddch(win,' '); X itmp = WIN_COLS - 2 - 7 - strlen(title); X curr_dir[itmp] = 0; X waddstr(win,curr_dir); X waddch(win,' '); X if(bottom_label) X { X strncpy(buf,bottom_label,WIN_COLS - 6); X buf[WIN_COLS - 6] = 0; X wmove(win,WIN_LINES - 1,2); X waddch(win,' '); X waddstr(win,buf); X waddch(win,' '); X } X X itmp = 0; X while(1) X { X if(win_template[itmp] == (char *)0) X break; X wmove(win,itmp + 1,1); X waddstr(win,win_template[itmp++]); X } X if(tipsz_flag) X { X clear_area(win,2,15,3); X sprintf(s128,"%3d",npats); X waddstr(win,s128); X } X else /* tiprz */ X { X clear_area(win,2,11,8); /* clear "of ###" */ X waddstr(win,":"); X } X X clear_area(win,1,11,21); X report_error_count(); X clear_area(win,8,21,8); /* starting time */ X waddstr(win,get_tod(1,(char *)0)); X start_seconds = time((long *)0); X current_seconds = start_seconds; X X if(show_window) X { X wmove(win,8,50); X waddstr(win,"window:"); X wmove(win,9,50); X waddstr(win,"+0"); X } X X wrefresh(win); X X} /* end of report_init */ X X/*+------------------------------------------------------------------------- X report_rx_ind(status) X--------------------------------------------------------------------------*/ Xvoid Xreport_rx_ind(status) Xint status; X{ X#if defined(M_SYS5) X wmove(win,1,54); X waddch(win,(status) ? 'R' : ' '); X wmove(win,1,54); X wrefresh(win); X#endif X} /* end of report_rx_ind */ X X/*+------------------------------------------------------------------------- X report_tx_ind(status) X--------------------------------------------------------------------------*/ Xvoid Xreport_tx_ind(status) Xint status; X{ X#if defined(M_SYS5) X wmove(win,1,56); X waddch(win,(status) ? 'T' : ' '); X wmove(win,1,56); X wrefresh(win); X#endif X} /* end of report_tx_ind */ X X/*+------------------------------------------------------------------------- X report_window() - if enable, show open widow size X--------------------------------------------------------------------------*/ Xvoid Xreport_window() X{ X if(show_window) X { X long ltmp; X wmove(win,9,50); X if((ltmp = (Txpos - Rxpos)) > 999999L) X waddstr(win,">+999999"); X else if(ltmp < -999999L) X ; X else X { X sprintf(s128,"%+-8ld",ltmp); X waddstr(win,s128); X if(log_packets) X { X write(log_packets,"window: ",8); X write(log_packets,s128,strlen(s128)); X write(log_packets,"\n",1); X } X } X } X} /* end of report_window */ X X/*+------------------------------------------------------------------------- X report_rx_tx_count() X X This procedure may be counted upon to perform wrefresh(win) X X rx char count: row 6 col 16 len 8 unsigned long X tx char count: row 6 col 29 len 8 unsigned long X session elapsed time: row 9 col 21 len 8 X this file elapsed time: row 9 col 41 len 8 X current tod: row 9 col 3 len 8 X window: row 9 col 50 len 8 X--------------------------------------------------------------------------*/ Xreport_rx_tx_count() X{ X extern unsigned long rx_char_count; X extern unsigned long tx_char_count; X X register char *cptr; X X sprintf(s128,"%8ld",rx_char_count); X wmove(win,6,16); X waddstr(win,s128); X sprintf(s128,"%8ld",tx_char_count); X wmove(win,6,29); X waddstr(win,s128); X X /* now time of day */ X wmove(win,9,3); X cptr = get_tod(1,(char *)0); X waddstr(win,cptr); X current_seconds = time((long *)0); X elapsed_seconds = current_seconds - start_seconds; X cptr = get_elapsed_time(elapsed_seconds); X wmove(win,9,21); X waddstr(win,cptr); X if(this_file_start_seconds) X elapsed_seconds = current_seconds - this_file_start_seconds; X else X elapsed_seconds = 0; X cptr = get_elapsed_time(elapsed_seconds); X wmove(win,9,41); X waddstr(win,cptr); X X report_window(); X X wrefresh(win); /* calling procs expect this to occur always */ X X} /* end of report_rx_tx_count */ X X/*+------------------------------------------------------------------------- X report_mode(mode) X X comm mode row 7 col 52 length 6 X 3: save old tty stat, set raw mode with flow control X 2: set XON/XOFF for sb/sz with ZMODEM or YMODEM-g X 1: save old tty stat, set raw mode X 0: restore original tty mode X--------------------------------------------------------------------------*/ Xvoid Xreport_mode(mode) Xint mode; X{ Xchar *cptr; Xchar tmp[8]; X X clear_area(win,7,52,6); X switch(mode) X { X case 0: X cptr = "NORMAL"; X break; X case 1: X cptr = "RAW"; X break; X case 2: X cptr = "RAW-g"; X break; X case 3: X cptr = "RAW-f"; X break; X default: X sprintf(tmp,"%5u",mode); X cptr = tmp; X } X waddstr(win,cptr); X wrefresh(win); X if(log_packets) X { X write(log_packets,"mode: ",6); X write(log_packets,cptr,strlen(cptr)); X write(log_packets,"\n",1); X } X X} /* end of report_mode */ X X/*+------------------------------------------------------------------------- X report_rxblklen(blklen) Xrow 7 col 35 5 chars X--------------------------------------------------------------------------*/ Xvoid Xreport_rxblklen(blklen) Xint blklen; X{ X char tmp[10]; X X sprintf(tmp,"%5u",blklen); X clear_area(win,7,35,5); X waddstr(win,tmp); X wrefresh(win); X} /* end of report_rxblklen */ X X/*+------------------------------------------------------------------------- X report_txblklen(blklen) Xrow 7 col 35 5 chars X--------------------------------------------------------------------------*/ Xvoid Xreport_txblklen(blklen) Xint blklen; X{ X report_rxblklen(blklen); X} /* end of report_txblklen */ X X/*+------------------------------------------------------------------------- X report_rxpos(rxpos) row 3 col 19 len 8 X--------------------------------------------------------------------------*/ Xvoid Xreport_rxpos(rxpos) Xlong rxpos; X{ Xint i; Xchar tmp[16]; Xchar rdchar; X if( X#if defined(M_SYS5) X rdchk(0) X#else X !ioctl(0,FIONREAD,&i) && i X#endif X ) X { X read(0,&rdchar,1); X rdchar &= 0x7f; X if(rdchar == 0x0C || rdchar == 0x012) /* ^L or ^R */ X { X touchwin(stdscr); X wrefresh(stdscr); X touchwin(win); X wrefresh(win); X } X } X X if((rxpos > 99999999L) || (rxpos < 0L)) X return; X X sprintf(tmp,"%8lu",rxpos); X wmove(win,3,19); X waddstr(win,tmp); X wrefresh(win); X report_rx_tx_count(); /* which will do a refresh */ X} /* end of report_rxpos */ X X/*+------------------------------------------------------------------------- X report_txpos(txpos) X--------------------------------------------------------------------------*/ Xvoid Xreport_txpos(txpos) Xlong txpos; X{ X report_rxpos(txpos); X} /* end of report_txpos */ X X/*+------------------------------------------------------------------------- X report_error_count() X DOES NOT PERFORM A REFRESH CYCLE X X this file: row 10 col 22 len 3 X total: row 10 col 33 len 4 X skipped: row 10 col 53 len 3 X--------------------------------------------------------------------------*/ Xreport_error_count() X{ X char tmp[16]; X X wmove(win,10,22); X sprintf(tmp,"%3d",this_file_errors); X if(this_file_errors) X wstandout(win); X waddstr(win,tmp); X if(this_file_errors) X wstandend(win); X X wmove(win,10,33); X sprintf(tmp,"%4d",total_errors); X if(total_errors) X wstandout(win); X waddstr(win,tmp); X if(total_errors) X wstandend(win); X X wmove(win,10,53); X sprintf(tmp,"%3d",skip_count); X waddstr(win,tmp); X wrefresh(win); X X} /* end of report_error_count */ X X/*+------------------------------------------------------------------------- X report_last_txhdr(rptstr,error_flag) X 5,7,22 X--------------------------------------------------------------------------*/ Xvoid Xreport_last_txhdr(rptstr,error_flag) Xregister char *rptstr; Xint error_flag; X{ Xchar s24[24]; X X if(log_packets) X { X write(log_packets,"tx: ",6); X write(log_packets,rptstr,strlen(rptstr)); X write(log_packets,"\n",1); X } X X if(strlen(rptstr) > 22) X { X strncpy(s24,rptstr,22); X s24[23] = 0; X rptstr = s24; X } X clear_area(win,5,7,22); X waddstr(win,rptstr); X X if(error_flag) X { X ++this_file_errors; X ++total_errors; X report_error_count(); X } X X} /* end of report_last_txhdr */ X X/*+------------------------------------------------------------------------- X report_last_rxhdr(rptstr,error_flag) X 5,35,22 X--------------------------------------------------------------------------*/ Xvoid Xreport_last_rxhdr(rptstr,error_flag) Xregister char *rptstr; Xint error_flag; X{ Xchar s24[24]; Xextern int log_packets; X X if(log_packets) X { X write(log_packets,"rx: ",6); X write(log_packets,rptstr,strlen(rptstr)); X write(log_packets,"\n",1); X } X X if(strlen(rptstr) > 22) X { X strncpy(s24,rptstr,22); X s24[23] = 0; X rptstr = s24; X } X clear_area(win,5,35,22); X waddstr(win,rptstr); X X if(error_flag) X { X ++this_file_errors; X ++total_errors; X report_error_count(); X } X report_window(); X X} /* end of report_last_rxhdr */ X X/*+------------------------------------------------------------------------- X report_str(rptstr,error_flag) row 11/12 col 3 len 55 X X error_flag == 0 for status/progress message X == 1 for bump error count, unless rptstr is null X in which case, merely clear error string area X == 2 write string on bottom line (not an error) X == 3 write string on transaction line (not an error) X == -1 use error line but do not bump error count X--------------------------------------------------------------------------*/ Xvoid Xreport_str(rptstr,error_flag) Xregister char *rptstr; Xint error_flag; X{ Xchar s60[60]; Xextern int log_packets; X X if(strlen(rptstr) > 55) X { X strncpy(s60,rptstr,55); X s60[55] = 0; X rptstr = s60; X } X X switch(error_flag) X { X case 0: X clear_area(win,12,3,55); X break; X case 1: X ++this_file_errors; X ++total_errors; X report_error_count(); X case -1: X clear_area(win,11,3,55); X break; X case 2: X clear_area(win,13,3,55); X break; X case 3: X clear_area(win,4,3,55); X break; X } X X waddstr(win,rptstr); X wrefresh(win); X X if(log_packets) X { X write(log_packets,"info: ",6); X write(log_packets,rptstr,strlen(rptstr)); X write(log_packets,"\n",1); X } X X} /* end of report_str */ X X/*+------------------------------------------------------------------------- X report_transaction() X--------------------------------------------------------------------------*/ Xvoid Xreport_transaction(str) Xchar *str; X{ X report_str(str,3); X} /* end of report_transaction */ X X/*+------------------------------------------------------------------------- X report_file_open_tod() -- time of start of this file X X this file open time: row 8 col 41 length 8 X--------------------------------------------------------------------------*/ Xvoid Xreport_file_open_tod() X{ X clear_area(win,8,41,8); X this_file_start_seconds = time((long *)0); X waddstr(win,get_tod(1,(char *)0)); X wrefresh(win); X} /* end of report_file_open_tod */ X X/*+------------------------------------------------------------------------- X report_file_open_mode(file_mode) X mode map: row 4 col 46 len 10 X--------------------------------------------------------------------------*/ Xreport_file_open_mode(file_mode) Xunsigned short file_mode; X{ X clear_area(win,3,46,10); X waddstr(win,mode_map(file_mode,(char *)0)); X wrefresh(win); X} /* end of report_file_open_mode */ X X/*+------------------------------------------------------------------------- X report_file_open_length(long_length) X length: row 3 col 36 len 8 X--------------------------------------------------------------------------*/ Xreport_file_open_length(length) Xlong length; X{ X clear_area(win,3,36,8); X if(length <= 0) X waddstr(win,"unknown"); X else X { X sprintf(s128,"%8lu",length); X waddstr(win,s128); X } X wrefresh(win); X} /* end of report_file_open_length */ X X/*+------------------------------------------------------------------------- X report_file_send_open(filename,filestat) X X filename: row 2 col 20 len 38 X number: row 2 col 8 len 3 X length: row 3 col 36 len 8 X mode: row 3 col 46 len 10 X time of start of this file: row 4 col 47 length 8 hh:mm:ss X--------------------------------------------------------------------------*/ Xvoid Xreport_file_send_open(filename,filestat) Xchar *filename; Xstruct stat *filestat; X{ Xchar s50[50]; Xregister char *cptr = filename; X X if(log_packets) X { X write(log_packets,"file: ",6); X write(log_packets,filename,strlen(filename)); X write(log_packets,"\n",1); X } X X /* number */ X clear_area(win,2,8,3); X sprintf(s50,"%3d",Filcnt); X waddstr(win,s50); X X /* filename */ X if(strlen(filename) > 38) X { X strncpy(s50,filename,38); X s50[39] = 0; X cptr = s50; X } X clear_area(win,2,20,38); X waddstr(win,cptr); X X /* length */ X report_file_open_length(filestat->st_size); X X /* mode */ X report_file_open_mode(filestat->st_mode); X X /* time of start of this file */ X report_file_open_tod(); X X this_file_errors = 0; X report_error_count(); X} /* end of report_file_send_open */ X X/*+------------------------------------------------------------------------- X report_file_rcv_started(filename,length,last_mod_time,file_mode) X X filenumber: row 2 col 8 len 3 X row 2 col 12 len 7 clear "of ###" X filename: row 2 col 20 len 38 X--------------------------------------------------------------------------*/ Xreport_file_rcv_started(filename,length,last_mod_time,file_mode) Xchar *filename; Xlong length; /* if < 0, "UNKNOWN" */ Xlong last_mod_time; /* not currently displayed */ Xunsigned short file_mode; /* UNIX file modifier or zero */ X{ Xregister char *cptr; Xchar s50[50]; X X if(log_packets) X { X write(log_packets,"file: ",6); X write(log_packets,filename,strlen(filename)); X write(log_packets,"\n",1); X } X X /* filename */ X if(strlen(filename) > 38) X { X strncpy(s50,filename,38); X s50[39] = 0; X cptr = s50; X } X else X cptr = filename; X X clear_area(win,2,20,38); X waddstr(win,cptr); X X /* file number */ X clear_area(win,2,8,3); X sprintf(s50,"%3d",Filcnt); /* rz uses as file number 1-n */ X waddstr(win,s50); X X/* if remote sender provides a file count, display it */ X if(npats) X { X clear_area(win,2,12,7); /* clear "of ###" */ X sprintf(s50,"of %3d:",npats); X waddstr(win,s50); X } X X /* length */ X report_file_open_length(length); X X /* mode */ X report_file_open_mode(file_mode); X X /* time of start of this file */ X report_file_open_tod(); X X this_file_errors = 0; X report_error_count(); X} /* end of report_file_rcv_started */ X X/*+------------------------------------------------------------------------- X report_file_close() X--------------------------------------------------------------------------*/ Xvoid report_file_close() X{ X if(show_window) X { X clear_area(win,9,50,8); X waddstr(win,"+0"); X Txpos = 0; X Rxpos = 0; X } X X report_str("End of file",0); X wrefresh(win); X this_file_start_seconds = 0; X X} /* end of report_file_close */ X X/*+------------------------------------------------------------------------- X report_comm_baud_rate(baud_rate) X X baud rate: row 7 col 14 length 5 X--------------------------------------------------------------------------*/ Xreport_comm_baud_rate(baud_rate) Xunsigned int baud_rate; X{ X char tstr8[8]; X X zcurses_baud_rate = baud_rate; X clear_area(win,7,14,5); X if(baud_rate == 0) X waddstr(win,"?"); X else X X { X sprintf(tstr8,"%5u",baud_rate); X waddstr(win,tstr8); X } X wrefresh(win); X X} /* end of report_comm_baud_rate */ X X/*+------------------------------------------------------------------------- X report_file_byte_io(count) X--------------------------------------------------------------------------*/ Xreport_file_byte_io(count) Xlong count; X{ X X total_data_chars_xfered += (long)count; X if(total_data_chars_xfered) X { X sprintf(s128,"Total file bytes transferred: %lu", X total_data_chars_xfered); X report_str(s128,-1); X } X X} /* end of report_file_byte_io */ X X/* end of zcurses.c */ X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF $TOUCH -am 0521190890 xfer/zcurses.c && chmod 0644 xfer/zcurses.c || echo "restore of xfer/zcurses.c failed" set `wc -c xfer/zcurses.c`;Wc_c=$1 if test "$Wc_c" != "28447"; then echo original size 28447, current size $Wc_c fi # ============= xfer/zdebug.c ============== echo "x - extracting xfer/zdebug.c (Text)" sed 's/^X//' << 'SHAR_EOF' > xfer/zdebug.c && X/* see zcurses.c report_lasthdr() */ X/*+:EDITS:*/ X/*:05-21-1990-16:00-wht@tridom-adapt ecu xfer protocols for tipwht */ Xint header_debug = 0; X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF $TOUCH -am 0521180090 xfer/zdebug.c && chmod 0644 xfer/zdebug.c || echo "restore of xfer/zdebug.c failed" set `wc -c xfer/zdebug.c`;Wc_c=$1 if test "$Wc_c" != "180"; then echo original size 180, current size $Wc_c fi # ============= xfer/zlint.h ============== echo "x - extracting xfer/zlint.h (Text)" sed 's/^X//' << 'SHAR_EOF' > xfer/zlint.h && X/*+----------------------------------------------------------------------- X zlint.h X------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:05-21-1990-16:00-wht@tridom-adapt ecu xfer protocols for tipwht */ X X/* zcommon.c */ Xstatic unsigned int getspeed(); Xvoid get_curr_dir(); X/* zcurses.c */ Xchar *get_elapsed_time(); Xchar *get_tod(); Xchar *mode_map(); Xvoid report_file_close(); Xvoid report_file_open_tod(); Xvoid report_file_send_open(); Xvoid report_init(); Xvoid report_last_rxhdr(); Xvoid report_last_txhdr(); Xvoid report_mode(); Xvoid report_rx_ind(); Xvoid report_rxblklen(); Xvoid report_rxpos(); Xvoid report_str(); Xvoid report_top_line(); Xvoid report_transaction(); Xvoid report_tx_ind(); Xvoid report_txblklen(); Xvoid report_txpos(); Xvoid report_uninit(); Xvoid report_window(); X/* zdebug.c */ X/* zmodem.c */ Xlong rclhdr(); X X/* vi: set ts=4 sw=4: */ X/* end of zlint.h */ SHAR_EOF $TOUCH -am 0521180190 xfer/zlint.h && chmod 0644 xfer/zlint.h || echo "restore of xfer/zlint.h failed" set `wc -c xfer/zlint.h`;Wc_c=$1 if test "$Wc_c" != "907"; then echo original size 907, current size $Wc_c fi # ============= xfer/zmodem.c ============== echo "x - extracting xfer/zmodem.c (Text)" sed 's/^X//' << 'SHAR_EOF' > xfer/zmodem.c && X/*+------------------------------------------------------------------------- X zmodem.c - ZMODEM protocol primitives X based on code by Chuck Forsberg X tip adaptation by wht%n4hgf@emory.mathcs.emory.edu X X Entry point Functions: X zsbhdr(type,hdr) send binary header X zshhdr(type,hdr) send hex header X zgethdr(hdr,eflag) receive header - binary or hex X zsdata(buf,len,frameend) send data X zrdata(buf,len) receive data X stohdr(pos) store position data in Txhdr X long rclhdr(hdr) recover position offset from header X X Defined functions: X noxrd7() X rclhdr(hdr) X stohdr(pos) X zdlread() X zgeth1() X zgethdr(hdr,eflag) X zgethex() X zputhex(c) X zrbhdr(hdr) X zrbhdr32(hdr) X zrdat32(buf,length) X zrdata(buf,length) X zrhhdr(hdr) X zsbh32(hdr,type) X zsbhdr(type,hdr) X zsda32(buf,length,frameend) X zsdata(buf,length,frameend) X zsendline(c) X zshhdr(type,hdr) X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:05-21-1990-16:00-wht@tridom-adapt ecu xfer protocols for tipwht */ X X#include "zmodem.h" /* wht */ X#include "zlint.h" X Xextern char s128[]; /* wht */ Xextern int Zctlesc; /* wht */ Xextern int Zmodem; /* wht */ Xextern long cr3tab[]; /* wht */ Xextern unsigned Baudrate; /* wht */ Xextern unsigned short crctab[]; /* wht */ X Xint Rxtimeout = 100; /* Tenths of seconds to wait for something */ X X#if !defined(UNSL) X#define UNSL X#endif X X X Xstatic lastsent; /* Last char we sent */ Xstatic evenp; /* Even parity seen on header */ X X/* Globals used by ZMODEM functions */ Xchar Attn[ZATTNLEN+1]; /* Attention string rx sends to tx on err */ Xchar Rxhdr[4]; /* Received header */ Xchar Txhdr[4]; /* Transmitted header */ Xint Crc32; /* Display flag indicating 32 bit CRC being received */ Xint Crc32t; /* Display flag indicating 32 bit CRC being sent */ Xint Rxcount; /* Count of data bytes received */ Xint Rxframeind; /* ZBIN ZBIN32,or ZHEX type of frame received */ Xint Rxtimeout; /* Tenths of seconds to wait for something */ Xint Rxtype; /* Type of header received */ Xint Txfcs32; /* TURE means send binary frames with 32 bit FCS */ Xint Zrwindow; /* RX window size (controls garbage count) */ Xlong Rxpos; /* Received file position */ Xlong Txpos; /* Transmitted file position */ X Xchar *frametypes[] = X{ X "Carrier Lost", /* -3 */ X "TIMEOUT", /* -2 */ X "ERROR", /* -1 */ X/* #define FTOFFSET 3 moved to zmodem.h */ X "ZRQINIT", X "ZRINIT", X "ZSINIT", X "ZACK ", X "ZFILE", X "ZSKIP", X "ZNAK ", X "ZABORT", X "ZFIN ", X "ZRPOS", X "ZDATA", X "ZEOF ", X "ZFERR", X "ZCRC ", X "ZCHALLENGE", X "ZCOMPL", X "ZCAN ", X "ZFREECNT", X "ZCOMMAND", X "ZSTDERR", X "xxxxx" X#define FRTYPES 22 /* Total number of frame types in this array */ X /* not including psuedo negative entries */ X}; X Xstatic char masked[] = "8 bit transparent path required"; Xstatic char badcrc[] = "Bad CRC"; X X/* Send ZMODEM binary header hdr of type type */ Xzsbhdr(type,hdr) Xregister unsigned char *hdr; X{ X register int n; X register unsigned crc; X X report_tx_ind(1); X sprintf(s128,"hdr %s %ld",frametypes[type+FTOFFSET],rclhdr(hdr)); X report_last_txhdr(s128,0); X X xsendline(ZPAD); X xsendline(ZDLE); X X if(Crc32t=Txfcs32) X zsbh32(hdr,type); X else X { X xsendline(ZBIN); X zsendline(type); X crc = updcrc(type,0); X X for(n=4; --n >= 0; ++hdr) X { X zsendline(*hdr); X crc = updcrc(*hdr,crc); X } X crc = updcrc(0,updcrc(0,crc)); X zsendline(crc>>8); X zsendline(crc); X } X if(type != ZDATA) X flushline(); X report_tx_ind(0); X} X X X/* Send ZMODEM binary header hdr of type type */ Xzsbh32(hdr,type) Xregister char *hdr; X{ X register int n; X register UNSL long crc; X X report_tx_ind(1); X xsendline(ZBIN32); X zsendline(type); X crc = 0xFFFFFFFFL; X crc = UPDC32(type,crc); X X for(n=4; --n >= 0; ++hdr) X { X crc = UPDC32((0377 & *hdr),crc); X zsendline(*hdr); X } X crc = ~crc; X for(n=4; --n >= 0;) X { X zsendline((int)crc); X crc >>= 8; X } X report_tx_ind(0); X} X X/* Send ZMODEM HEX header hdr of type type */ Xzshhdr(type,hdr) Xregister unsigned char *hdr; X{ X register int n; X register unsigned short crc; X X report_tx_ind(1); X X sprintf(s128,"hdr %s %ld",frametypes[type+FTOFFSET],rclhdr(hdr)); X report_last_txhdr(s128,0); X sendline(ZPAD); X sendline(ZPAD); X sendline(ZDLE); X sendline(ZHEX); X zputhex(type); X Crc32t = 0; X X crc = updcrc(type,0); X for(n=4; --n >= 0; ++hdr) X { X zputhex(*hdr); X crc = updcrc(*hdr,crc); X/* crc = updcrc((0377 & *hdr),crc); original - wht */ X } X crc = updcrc(0,updcrc(0,crc)); X zputhex(crc>>8); X zputhex(crc); X X /* Make it printable on remote machine */ X sendline(015); X sendline(012); X /* X * Uncork the remote in case a fake XOFF has stopped data flow X */ X if(type != ZFIN && type != ZACK) X sendline(021); X flushline(); X report_tx_ind(0); X} X X/* X * Send binary array buf of length length,with ending ZDLE sequence frameend X */ Xstatic char *Zendnames[] = { "ZCRCE","ZCRCG","ZCRCQ","ZCRCW"}; X Xzsdata(buf,length,frameend) Xregister unsigned char *buf; X{ X register unsigned short crc; X X report_tx_ind(1); X X sprintf(s128,"data %s %d bytes",Zendnames[frameend-ZCRCE&3],length); X report_last_txhdr(s128,0); X if(Crc32t) X zsda32(buf,length,frameend); X else X { X crc = 0; X for(;--length >= 0; ++buf) X { X zsendline(*buf); X crc = updcrc(*buf,crc); X } X xsendline(ZDLE); X xsendline(frameend); X crc = updcrc(frameend,crc); X X crc = updcrc(0,updcrc(0,crc)); X zsendline(crc>>8); X zsendline(crc); X } X if(frameend == ZCRCW) X { X xsendline(XON); X flushline(); X } X report_tx_ind(0); X X} X Xzsda32(buf,length,frameend) Xregister char *buf; X{ X register int c; X register UNSL long crc; X X report_tx_ind(1); X X crc = 0xFFFFFFFFL; X for(;--length >= 0; ++buf) X { X c = *buf & 0377; X if(c & 0140) X xsendline(lastsent = c); X else X zsendline(c); X crc = UPDC32(c,crc); X } X xsendline(ZDLE); X xsendline(frameend); X crc = UPDC32(frameend,crc); X X crc = ~crc; X for(length=4; --length >= 0;) X { X zsendline((int)crc); X crc >>= 8; X } X report_tx_ind(0); X} X X/* X * Receive array buf of max length with ending ZDLE sequence X * and CRC. Returns the ending character or error code. X * NB: On errors may store length+1 bytes! X */ Xzrdata(buf,length) Xregister char *buf; X{ X register int c; X register unsigned short crc; X register char *end; X register int d; X X report_rx_ind(1); X X if(Rxframeind == ZBIN32) X { X report_rx_ind(0); X return(zrdat32(buf,length)); X } X X crc = Rxcount = 0; X end = buf + length; X while(buf <= end) X { X if((c = zdlread()) & ~0377) X { Xcrcfoo: X switch(c) X { X case GOTCRCE: X case GOTCRCG: X case GOTCRCQ: X case GOTCRCW: X crc = updcrc(((d=c)&0377),crc); X if((c = zdlread()) & ~0377) X goto crcfoo; X crc = updcrc(c,crc); X if((c = zdlread()) & ~0377) X goto crcfoo; X crc = updcrc(c,crc); X if(crc & 0xFFFF) X { X report_str(badcrc,0); X report_rx_ind(0); X return(ERROR); X } X Rxcount = length - (end - buf); X report_rxblklen(Rxcount); X sprintf(s128,"data %s %d bytes", X Zendnames[d-GOTCRCE&3],Rxcount); X report_last_rxhdr(s128,0); X report_rx_ind(0); X return(d); X case GOTCAN: X report_str("Sender Cancelled",1); X report_rx_ind(0); X return(ZCAN); X case TIMEOUT: X report_str("TIMEOUT",1); X report_rx_ind(0); X return(c); X default: X report_str("Bad data subpacket",1); X report_rx_ind(0); X return(c); X } X } X *buf++ = c; X crc = updcrc(c,crc); X } X report_str("Data subpacket too long",1); X report_rx_ind(0); X return(ERROR); X} X Xzrdat32(buf,length) Xregister char *buf; X{ X register int c; X register UNSL long crc; X register char *end; X register int d; X X report_rx_ind(1); X crc = 0xFFFFFFFFL; X Rxcount = 0; X end = buf + length; X while(buf <= end) X { X if((c = zdlread()) & ~0377) X { Xcrcfoo: X switch(c) X { X case GOTCRCE: X case GOTCRCG: X case GOTCRCQ: X case GOTCRCW: X d = c; X c &= 0377; X crc = UPDC32(c,crc); X if((c = zdlread()) & ~0377) X goto crcfoo; X crc = UPDC32(c,crc); X if((c = zdlread()) & ~0377) X goto crcfoo; X crc = UPDC32(c,crc); X if((c = zdlread()) & ~0377) X goto crcfoo; X crc = UPDC32(c,crc); X if((c = zdlread()) & ~0377) X goto crcfoo; X crc = UPDC32(c,crc); X if(crc != 0xDEBB20E3) X { X report_str(badcrc,0); X report_rx_ind(0); X return(ERROR); X } X Rxcount = length - (end - buf); X report_rxblklen(Rxcount); X sprintf(s128,"data %s %d bytes", X Zendnames[d-GOTCRCE&3],Rxcount); X report_last_rxhdr(s128,0); X report_rx_ind(0); X return(d); X case GOTCAN: X report_str("Sender Canceled",1); X report_rx_ind(0); X return(ZCAN); X case TIMEOUT: X report_str("TIMEOUT",1); X report_rx_ind(0); X return(c); X default: X report_str("Bad data subpacket",1); X report_rx_ind(0); X return(c); X } X } X *buf++ = c; X crc = UPDC32(c,crc); X } X report_str("Data subpacket too long",1); X report_rx_ind(0); X return(ERROR); X} X X X/* X * Read a ZMODEM header to hdr,either binary or hex. X * eflag controls local display of non zmodem characters: X * 0: no display X * 1: display printing characters only X * 2: display all non ZMODEM characters X * On success,set Zmodem to 1,set Rxpos and return type of header. X * Otherwise return negative on error. X * Return ERROR instantly if ZCRCW sequence,for fast error recovery. X */ Xzgethdr(hdr,eflag) Xchar *hdr; X{ Xregister int c,n,cancount; X X report_rx_ind(1); X n = Zrwindow + Baudrate; /* Max bytes before start of frame */ X Rxframeind = Rxtype = 0; X Xstartover: X cancount = 5; Xagain: X /* Return immediate ERROR if ZCRCW sequence seen */ X switch(c = readline(Rxtimeout)) X { X case RCDO: X case TIMEOUT: X goto fifi; X case CAN: Xgotcan: X if(--cancount <= 0) X { X c = ZCAN; X goto fifi; X } X switch(c = readline(1)) X { X case TIMEOUT: X goto again; X case ZCRCW: X c = ERROR; X /* **** FALL THRU TO **** */ X case RCDO: X goto fifi; X default: X break; X case CAN: X if(--cancount <= 0) X { X c = ZCAN; X goto fifi; X } X goto again; X } X /* **** FALL THRU TO **** */ X default: Xagn2: X if( --n == 0) X { X report_str("Garbage count exceeded",1); X report_last_rxhdr("Noise",0); X report_rx_ind(0); X return(ERROR); X } X goto startover; X case ZPAD|0200: /* This is what we want. */ X case ZPAD: /* This is what we want. */ X evenp = c & 0200; X break; X } X cancount = 5; Xsplat: X switch(c = noxrd7()) X { X case ZPAD: X goto splat; X case RCDO: X case TIMEOUT: X goto fifi; X default: X goto agn2; X case ZDLE: /* This is what we want. */ X break; X } X X switch(c = noxrd7()) X { X case RCDO: X case TIMEOUT: X goto fifi; X case ZBIN: X Rxframeind = ZBIN; X Crc32 = FALSE; X c = zrbhdr(hdr); X break; X case ZBIN32: X Crc32 = Rxframeind = ZBIN32; X c = zrbhdr32(hdr); X break; X case ZHEX: X Rxframeind = ZHEX; X Crc32 = FALSE; X c = zrhhdr(hdr); X break; X case CAN: X goto gotcan; X default: X goto agn2; X } X Rxpos = hdr[ZP3] & 0377; X Rxpos = (Rxpos<<8) + (hdr[ZP2] & 0377); X Rxpos = (Rxpos<<8) + (hdr[ZP1] & 0377); X Rxpos = (Rxpos<<8) + (hdr[ZP0] & 0377); Xfifi: X switch(c) X { X case GOTCAN: X c = ZCAN; X /* **** FALL THRU TO **** */ X case ZNAK: X case ZCAN: X case ERROR: X case TIMEOUT: X case RCDO: X sprintf(s128,"Got %s",frametypes[c+FTOFFSET]); X report_str(s128,1); X /* **** FALL THRU TO **** */ X default: X if(c >= -3 && c <= FRTYPES) X sprintf(s128,"hdr %s %ld",frametypes[c+FTOFFSET],Rxpos); X else X sprintf(s128,"hdr 0x%02x? %ld",c,Rxpos); X report_last_rxhdr(s128,0); X } X report_rx_ind(0); X return(c); X} X X/* Receive a binary style header (type and position) */ Xzrbhdr(hdr) Xregister char *hdr; X{ X register int c,n; X register unsigned short crc; X X if((c = zdlread()) & ~0377) X return(c); X Rxtype = c; X crc = updcrc(c,0); X X for(n=4; --n >= 0; ++hdr) X { X if((c = zdlread()) & ~0377) X return(c); X crc = updcrc(c,crc); X *hdr = c; X } X if((c = zdlread()) & ~0377) X return(c); X crc = updcrc(c,crc); X if((c = zdlread()) & ~0377) X return(c); X crc = updcrc(c,crc); X if(crc & 0xFFFF) X { X if(evenp) X report_str(masked,1); X report_str(badcrc,0); X return(ERROR); X } X#if defined(ZMODEM) X Protocol = ZMODEM; X#endif X Zmodem = 1; X return(Rxtype); X} X X/* Receive a binary style header (type and position) with 32 bit FCS */ Xzrbhdr32(hdr) Xregister char *hdr; X{ X register int c,n; X register UNSL long crc; X X if((c = zdlread()) & ~0377) X return(c); X Rxtype = c; X crc = 0xFFFFFFFFL; X crc = UPDC32(c,crc); X X for(n=4; --n >= 0; ++hdr) X { X if((c = zdlread()) & ~0377) X return(c); X crc = UPDC32(c,crc); X *hdr = c; X } X for(n=4; --n >= 0;) X { X if((c = zdlread()) & ~0377) X return(c); X crc = UPDC32(c,crc); X } X if(crc != 0xDEBB20E3) X { X if(evenp) X report_str(masked,1); X report_str(badcrc,0); X return(ERROR); X } X#if defined(ZMODEM) X Protocol = ZMODEM; X#endif X Zmodem = 1; X return(Rxtype); X} X X X/* Receive a hex style header (type and position) */ Xzrhhdr(hdr) Xchar *hdr; X{ X register int c; X register unsigned short crc; X register int n; X X if((c = zgethex()) < 0) X return(c); X Rxtype = c; X crc = updcrc(c,0); X X for(n=4; --n >= 0; ++hdr) X { X if((c = zgethex()) < 0) X return(c); X crc = updcrc(c,crc); X *hdr = c; X } X if((c = zgethex()) < 0) X return(c); X crc = updcrc(c,crc); X if((c = zgethex()) < 0) X return(c); X crc = updcrc(c,crc); X if(crc & 0xFFFF) X { X report_str(badcrc,0); X return(ERROR); X } X if(readline(1) == '\r') /* Throw away possible cr/lf */ X readline(1); X#if defined(ZMODEM) X Protocol = ZMODEM; X#endif X Zmodem = 1; X return(Rxtype); X} X X/* Send a byte as two hex digits */ Xzputhex(c) Xregister int c; X{ X static char digits[] = "0123456789abcdef"; X X sendline(digits[(c&0xF0)>>4]); X sendline(digits[(c)&0xF]); X} X X/* X * Send character c with ZMODEM escape sequence encoding. X * Escape XON,XOFF. Escape CR following @ (Telenet net escape) X */ Xzsendline(c) X{ X X /* Quick check for non control characters */ X if(c & 0140) X xsendline(lastsent = c); X else X { X switch(c &= 0377) X { X case ZDLE: X xsendline(ZDLE); X xsendline(lastsent = (c ^= 0100)); X break; X case 015: X case 0215: X if(!Zctlesc && (lastsent & 0177) != '@') X goto sendit; X /* **** FALL THRU TO **** */ X case 020: X case 021: X case 023: X case 0220: X case 0221: X case 0223: X xsendline(ZDLE); X c ^= 0100; Xsendit: X xsendline(lastsent = c); X break; X default: X if(Zctlesc && ! (c & 0140)) X { X xsendline(ZDLE); X c ^= 0100; X } X xsendline(lastsent = c); X } X } X} X X/* Decode two lower case hex digits into an 8 bit byte value */ Xzgethex() X{ X register int c; X X c = zgeth1(); X return(c); X} Xzgeth1() X{ X register int c,n; X X if((c = noxrd7()) < 0) X return(c); X n = c - '0'; X if(n > 9) X n -= ('a' - ':'); X if(n & ~0xF) X return(ERROR); X if((c = noxrd7()) < 0) X return(c); X c -= '0'; X if(c > 9) X c -= ('a' - ':'); X if(c & ~0xF) X return(ERROR); X c += (n<<4); X return(c); X} X X/* X * Read a byte,checking for ZMODEM escape encoding X * including CAN*5 which represents a quick abort X */ Xzdlread() X{ X register int c; X Xagain: X /* Quick check for non control characters */ X if((c = readline(Rxtimeout)) & 0140) X return(c); X switch(c) X { X case ZDLE: X break; X case 023: X case 0223: X case 021: X case 0221: X goto again; X default: X if(Zctlesc && !(c & 0140)) X { X goto again; X } X return(c); X } Xagain2: X if((c = readline(Rxtimeout)) < 0) X return(c); X if(c == CAN && (c = readline(Rxtimeout)) < 0) X return(c); X if(c == CAN && (c = readline(Rxtimeout)) < 0) X return(c); X if(c == CAN && (c = readline(Rxtimeout)) < 0) X return(c); X switch(c) X { X case CAN: X return(GOTCAN); X case ZCRCE: X case ZCRCG: X case ZCRCQ: X case ZCRCW: X return(c | GOTOR); X case ZRUB0: X return(0177); X case ZRUB1: X return(0377); X case 023: X case 0223: X case 021: X case 0221: X goto again2; X default: X if(Zctlesc && ! (c & 0140)) X { X goto again2; X } X if((c & 0140) == 0100) X return(c ^ 0100); X break; X } X sprintf(s128,"Bad escape sequence %x",c); X report_str(s128,1); X return(ERROR); X} X X/* X * Read a character from the modem line with timeout. X * Eat parity,XON and XOFF characters. X */ Xnoxrd7() X{ X register int c; X X for(;;) X { X if((c = readline(Rxtimeout)) < 0) X return(c); X switch(c &= 0177) X { X case XON: X case XOFF: X continue; X default: X if(Zctlesc && !(c & 0140)) X continue; X case '\r': X case '\n': X case ZDLE: X return(c); X } X } X} X X/* Store long integer pos in Txhdr */ Xstohdr(pos) Xlong pos; X{ X Txhdr[ZP0] = pos; X Txhdr[ZP1] = pos>>8; X Txhdr[ZP2] = pos>>16; X Txhdr[ZP3] = pos>>24; X} X X/* Recover a long integer from a header */ Xlong Xrclhdr(hdr) Xregister char *hdr; X{ X register long l; X X l = (hdr[ZP3] & 0377); X l = (l << 8) | (hdr[ZP2] & 0377); X l = (l << 8) | (hdr[ZP1] & 0377); X l = (l << 8) | (hdr[ZP0] & 0377); X return(l); X} X X/* end of zmodem.c */ X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF $TOUCH -am 0521180190 xfer/zmodem.c && chmod 0644 xfer/zmodem.c || echo "restore of xfer/zmodem.c failed" set `wc -c xfer/zmodem.c`;Wc_c=$1 if test "$Wc_c" != "16500"; then echo original size 16500, current size $Wc_c fi # ============= xfer/zmodem.h ============== echo "x - extracting xfer/zmodem.h (Text)" sed 's/^X//' << 'SHAR_EOF' > xfer/zmodem.h && X/*+------------------------------------------------------------------------- X zmodem.h -- common include filefor tiprz/tipsz X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:05-21-1990-16:00-wht@tridom-adapt ecu xfer protocols for tipwht */ X X#if defined(pyr) X#include <sys/types.h> X#include <sys/stat.h> X#include <sgtty.h> X#define OS "BSD4.x" X#if defined(LLITOUT) X#include <strings.h> X#endif X#endif X X#if defined(M_UNIX) X#define OS "UNIX" X#undef M_XENIX X#endif X X#if !defined(OS) X#if !defined(M_XENIX) X#define XENIX X#endif X#endif X X#if defined(M_XENIX) || defined(M_UNIX) X#include <sys/types.h> X#include <sys/stat.h> X#include <termio.h> X#include <sys/ioctl.h> X#include <string.h> X#define MODE2OK X#endif X X#if defined(pyr) X#if defined(TIOCSBRK) X#define CANBREAK X#endif X#endif X#if defined(M_XENIX) || defined(M_UNIX) X#define CANBREAK X#endif X X#if !defined(READCHECK) X#if defined(FIONREAD) X#define READCHECK X#endif X#if defined(SV) X#define READCHECK X#endif X#endif X X#define ACK 6 X#define CAN ('X'&037) X#define CPMEOF 032 X#define ENQ 005 X#define EOT 4 X#define ERROR (-1) X#define ERRORMAX 5 X#define FALSE 0 X#define NAK 025 X#define OK 0 X#define PATHLEN 257 /* ready for 4.2 bsd ? */ X#define RCDO (-3) X#define SOH 1 X#define STX 2 X#define TIMEOUT (-2) X#define TRUE 1 X#define UNIXFILE 0xF000 /* The S_IFMT file mask bit for stat */ X#define WANTCRC 0103 /* send C not NAK to get crc not checksum */ X X#define WANTG 0107 /* Send G not NAK to get nonstop batch xmsn */ X#define WCEOT (-10) X#define XOFF ('s'&037) X#define XON ('q'&037) X X/* X * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. X * NOTE: First argument must be in range 0 to 255. X * Second argument is referenced twice. X * X * Programmers may incorporate any or all code into their programs, X * giving proper credit within the source. Publication of the X * source routines is permitted so long as proper credit is given X * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg, X * Omen Technology. X */ X X#define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ (cp)) X#define UPDC32(b, c) (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF)) X X X#define ZPAD '*' /* 052 Padding character begins frames */ X#define ZDLE 030 /* Ctrl-X Zmodem escape - `ala BISYNC DLE */ X#define ZDLEE (ZDLE^0100) /* Escaped ZDLE as transmitted */ X#define ZBIN 'A' /* Binary frame indicator */ X#define ZHEX 'B' /* HEX frame indicator */ X#define ZBIN32 'C' /* Binary frame with 32 bit FCS */ X X/* Frame types (see array "frametypes" in zm.c) */ X#define ZRQINIT 0 /* Request receive init */ X#define ZRINIT 1 /* Receive init */ X#define ZSINIT 2 /* Send init sequence (optional) */ X#define ZACK 3 /* ACK to above */ X#define ZFILE 4 /* File name from sender */ X#define ZSKIP 5 /* To sender: skip this file */ X#define ZNAK 6 /* Last packet was garbled */ X#define ZABORT 7 /* Abort batch transfers */ X#define ZFIN 8 /* Finish session */ X#define ZRPOS 9 /* Resume data trans at this position */ X#define ZDATA 10 /* Data packet(s) follow */ X#define ZEOF 11 /* End of file */ X#define ZFERR 12 /* Fatal Read or Write error Detected */ X#define ZCRC 13 /* Request for file CRC and response */ X#define ZCHALLENGE 14 /* Receiver's Challenge */ X#define ZCOMPL 15 /* Request is complete */ X#define ZCAN 16 /* Other end canned session with CAN*5 */ X#define ZFREECNT 17 /* Request for free bytes on filesystem */ X#define ZCOMMAND 18 /* Command from sending program */ X#define ZSTDERR 19 /* Output to standard error, data follows */ X X/* ZDLE sequences */ X#define ZCRCE 'h' /* CRC next, frame ends, header packet follows */ X#define ZCRCG 'i' /* CRC next, frame continues nonstop */ X#define ZCRCQ 'j' /* CRC next, frame continues, ZACK expected */ X#define ZCRCW 'k' /* CRC next, ZACK expected, end of frame */ X#define ZRUB0 'l' /* Translate to rubout 0177 */ X#define ZRUB1 'm' /* Translate to rubout 0377 */ X X/* zdlread return values (internal) */ X/* -1 is general error, -2 is timeout */ X#define GOTOR 0400 X#define GOTCRCE (ZCRCE|GOTOR) /* ZDLE-ZCRCE received */ X#define GOTCRCG (ZCRCG|GOTOR) /* ZDLE-ZCRCG received */ X#define GOTCRCQ (ZCRCQ|GOTOR) /* ZDLE-ZCRCQ received */ X#define GOTCRCW (ZCRCW|GOTOR) /* ZDLE-ZCRCW received */ X#define GOTCAN (GOTOR|030) /* CAN*5 seen */ X X/* Byte positions within header array */ X#define ZF0 3 /* First flags byte */ X#define ZF1 2 X#define ZF2 1 X#define ZF3 0 X#define ZP0 0 /* Low order 8 bits of position */ X#define ZP1 1 X#define ZP2 2 X#define ZP3 3 /* High order 8 bits of file position */ X X/* Bit Masks for ZRINIT flags byte ZF0 */ X#define CANFDX 01 /* Rx can send and receive true FDX */ X#define CANOVIO 02 /* Rx can receive data during disk I/O */ X#define CANBRK 04 /* Rx can send a break signal */ X#define CANCRY 010 /* Receiver can decrypt */ X#define CANLZW 020 /* Receiver can uncompress */ X#define CANFC32 040 /* Receiver can use 32 bit Frame Check */ X#define ESCCTL 0100 /* Receiver expects ctl chars to be escaped */ X#define ESC8 0200 /* Receiver expects 8th bit to be escaped */ X X/* Parameters for ZSINIT frame */ X#define ZATTNLEN 32 /* Max length of attention string */ X/* Bit Masks for ZSINIT flags byte ZF0 */ X#define TESCCTL 0100 /* Transmitter expects ctl chars to be escaped */ X#define TESC8 0200 /* Transmitter expects 8th bit to be escaped */ X X/* Parameters for ZFILE frame */ X/* Conversion options one of these in ZF0 */ X#define ZCBIN 1 /* Binary transfer - inhibit conversion */ X#define ZCNL 2 /* Convert NL to local end of line convention */ X#define ZCRESUM 3 /* Resume interrupted file transfer */ X/* Management include options, one of these ored in ZF1 */ X#define ZMSKNOLOC 0200 /* Skip file if not present at rx */ X/* Management options, one of these ored in ZF1 */ X#define ZMMASK 037 /* Mask for the choices below */ X#define ZMNEWL 1 /* Transfer if source newer or longer */ X#define ZMCRC 2 /* Transfer if different file CRC or length */ X#define ZMAPND 3 /* Append contents to existing file (if any) */ X#define ZMCLOB 4 /* Replace existing file */ X#define ZMNEW 5 /* Transfer if source newer */ X /* Number 5 is alive ... */ X#define ZMDIFF 6 /* Transfer if dates or lengths different */ X#define ZMPROT 7 /* Protect destination file */ X/* Transport options, one of these in ZF2 */ X#define ZTLZW 1 /* Lempel-Ziv compression */ X#define ZTCRYPT 2 /* Encryption */ X#define ZTRLE 3 /* Run Length encoding */ X/* Extended options for ZF3, bit encoded */ X#define ZXSPARS 64 /* Encoding for sparse file operations */ X X/* Parameters for ZCOMMAND frame ZF0 (otherwise 0) */ X#define ZCACK1 1 /* Acknowledge, then do command */ X X/* FTOFFSET is offset for frametypes array in tipzm.c */ X#define FTOFFSET 3 X Xlong rclhdr(); X X#include "zlint.h" X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF $TOUCH -am 0521180190 xfer/zmodem.h && chmod 0644 xfer/zmodem.h || echo "restore of xfer/zmodem.h failed" set `wc -c xfer/zmodem.h`;Wc_c=$1 if test "$Wc_c" != "6734"; then echo original size 6734, current size $Wc_c fi exit 0 ------------------------------------------------------------------ Warren Tucker, Tridom Corporation ...!gatech!emory!tridom!wht home address: ...!gatech!n4hgf!wht