ecu - SCO XENIX V/{2,3}86 Extended CU part 31/47
Warren Tucker
wht at tridom.uucp
Thu Oct 12 05:07:59 AEST 1989
---- Cut Here and unpack ----
#!/bin/sh
# this is part 31 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file sea/ecusea.c continued
#
CurArch=31
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 sea/ecusea.c"
sed 's/^X//' << 'SHAR_EOF' >> sea/ecusea.c
X { /* if we really got anything */
X fclose(fp);
X unlink(outname); /* rename temp to proper name */
X for(onp = outname;cnvrt && *onp;onp++)
X /* find out if there's lower- */
X if(islower(*onp)) /* case letters filename */
X cnvrt = 0; /* there are, don't convert */
X if(cnvrt) /* if there aren't, make all */
X for(onp = outname;*onp;onp++) /* into uppercase */
X *onp = tolower(*onp);
X if(link(tmpname,outname) == 0)
X unlink(tmpname);
X if(blk0.secs_since_1980) /* set stamp, if known */
X set_utime_1980(outname,blk0.secs_since_1980);
X return(outname);
X }
X else
X { /* else no real file */
X fclose(fp);
X unlink(tmpname); /* discard empty file */
X report_str("end of transfer",0);
X rf_done = 1;
X return(NULL);
X }
X
XCANCEL_TRANSFER:
X fclose(fp);
X xmit_cancel();
X rf_done = 2;
X return(NULL);
X} /* end of receive_file */
X
X/*+-------------------------------------------------------------------------
X cancel_transaction(sig)
X--------------------------------------------------------------------------*/
Xcancel_transaction(sig)
Xint sig;
X{
X xmit_cancel();
X sprintf(s128,"signal %d ... exiting",sig);
X report_str(s128,1);
X/*
X report_rx_ind(0);
X report_tx_ind(0);
X*/
X report_uninit();
X if(sig == SIGQUIT)
X abort();
X exit(128+sig);
X} /* end of cancel_transaction */
X
X/*+-------------------------------------------------------------------------
X main(argc,argv,envp)
X--------------------------------------------------------------------------*/
Xmain(argc,argv,envp)
Xint argc;
Xchar **argv;
Xchar **envp;
X{
Xint ipaths;
Xint ok;
X#define MAX_PATHS 512
Xchar *paths[MAX_PATHS];
Xchar **ppaths = paths;
Xchar *cptr;
Xchar **gargv = argv;
Xint gargc = argc;
X
X while(--argc)
X {
X cptr = *++argv;
X if(*cptr == '-')
X {
X cptr++;
X switch(*cptr++)
X {
X case ',':
X log_packets = 1;
X break;
X case '/':
X if(--argc < 1)
X exit(255);
X strcpy(curr_dir,*++argv);
X break;
X case '.':
X if(--argc < 1)
X exit(255);
X iofd = atoi(*++argv);
X break;
X case 'r':
X sending_flag = 0;
X break;
X case 's':
X sending_flag = 1;
X }
X }
X else if(argc > 0)
X {
X if(npaths < MAX_PATHS)
X {
X *ppaths++ = cptr;
X npaths++;
X }
X else
X {
X printf("too many filenames to send\n");
X exit(255);
X }
X }
X }
X
X if(sending_flag == -1)
X {
X printf("no -r or -s\n");
X exit(255);
X }
X
X if((npaths < 1) && sending_flag)
X exit(253);
X
X if(npaths && !sending_flag)
X exit(255);
X
X if(log_packets)
X {
X char log_packets_name[64];
X FILE *ftmp;
X int iargv;
X sprintf(log_packets_name,"/tmp/sea%05d.plog",getpid());
X unlink(log_packets_name);
X ftmp = fopen(log_packets_name,"w");
X fclose(ftmp);
X log_packets = open(log_packets_name,O_WRONLY,0644);
X if(log_packets < 0)
X log_packets = 0;
X else
X {
X write(log_packets,"exec: ",6);
X for(iargv = 0; iargv < gargc; iargv++)
X {
X write(log_packets,gargv[iargv],strlen(gargv[iargv]));
X write(log_packets," ",1);
X }
X write(log_packets,"\n",1);
X }
X }
X
X sprintf(s128,"ecusea %s",revision);
X report_init(s128);
X signal(SIGHUP,cancel_transaction);
X signal(SIGQUIT,cancel_transaction);
X signal(SIGINT,cancel_transaction);
X signal(SIGTERM,cancel_transaction);
X
X ioctl(iofd,TCGETA,&tio);
X
X tio.c_oflag = 0;
X tio.c_cflag &= ~PARENB;
X tio.c_cflag &= ~CSIZE;
X tio.c_cflag |= CS8;
X
X ioctl(iofd,TCSETA,&tio);
X
X switch(sending_flag)
X {
X case 0: /* receive files */
X while(receive_file() != NULL)
X nap(1000L);
X ok = (rf_done == 1);
X break;
X
X case 1: /* send files */
X ipaths = 0;
X while(ipaths < npaths)
X {
X if(!(ok = send_file(paths[ipaths])))
X break;
X nap(1000L);
X ipaths++;
X }
X if(ok) /* no errors, send end marker */
X send_file("");
X break;
X }
X
X report_uninit();
X exit(ok ? 0 : 254); /* and return error status */
X
X} /* end of main */
X
SHAR_EOF
echo "File sea/ecusea.c is complete"
chmod 0644 sea/ecusea.c || echo "restore of sea/ecusea.c fails"
echo "x - extracting sea/scurses.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > sea/scurses.c &&
X/* CHK=0x804E */
X/*+-------------------------------------------------------------------------
X scurses.c -- ecu file transfer program curses interface
X
X 000000000011111111112222222222333333333344444444445555555550
X 012345678901234567890123456789012345678901234567890123456789
X00.----------------------------------------------------------.
X01| SEAlink_6____ _39____________________________________ |
X02| File ### of ###: _38__________________________________ |
X03| File position: _8______ length: _8______ |
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: CBREAK |
X08| Time started: session: HH:MM:SS this file: HH:MM:SS |
X09| elpased: HH:MM:SS time: HH:MM:SS |
X10| Error counts: this file: _4__ total: _6____ |
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 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_xfer_mode(str)
X
X------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:58-wht------------- ecu 2.00 ---------------- */
X/*:03-03-1987-19:47-wht-adapt zcurses.c */
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 "../pc_scr.h"
X#include "lint_args.h"
X
Xlong time();
Xextern char *tzname[];
Xstruct tm *localtime();
X
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 int Filcnt;
Xextern int Restricted;
Xextern int sending_flag; /* send == 1, receive == 0 */
Xextern int npaths;
Xextern long rxpos;
Xextern int log_packets;
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;
Xlong current_seconds;
Xlong start_seconds;
Xlong elapsed_seconds;
Xunsigned long total_data_chars_xfered = 0L;
X
Xchar *win_template[] =
X{
X/*00000000001111111111222222222233333333334444444444555555555 */
X/*01234567890123456789012345678901234567890123456789012345678 */
X/*.----------------------------------------------------------. */
X " SEAlink ", /* 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: _____ BINARY blklen: 128 comm mode: ______ ", /* 7 */
X " Time started: session: --:--:-- this file: --:--:-- ", /* 8 */
X " elapsed: --:--:-- current: --:--:-- ", /* 9 */
X " Error counts: this file: ____ total: ______ ", /* 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 struct timeb tp;
X
X cur_time = time((long *)0);
X lt = localtime(&cur_time);
X#if defined(M_XENIX) && defined(MESSED_UP_DST)
X ftime(&tp); /* localtime() does not know about DST */
X if(tp.dstflag) /* so we adjust with ftime, which does know */
X {
X cur_time += 3600L; /* problem in BSD too, but no ftime there */
X lt = localtime(&cur_time);
X cur_time -= 3600L;
X }
X#endif
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 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 18 length 39
X--------------------------------------------------------------------------*/
Xvoid
Xreport_top_line(topstr)
Xchar *topstr;
X{
Xchar s42[42];
X clear_area(win,1,18,39);
X if(strlen(topstr) < 39)
X waddstr(win,topstr);
X else
X {
X strncpy(s42,topstr,39);
X s42[39] = 0;
X waddstr(win,s42);
X }
X} /* end of report_top_line */
X
X/*+-------------------------------------------------------------------------
X report_protocol_crc_type(str)
X
X protocol crc type: row 1 col 10 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[6] = 0;
X str = s8;
X }
X clear_area(win,1,10,6);
X waddstr(win,str);
X wrefresh(win);
X if(log_packets)
X {
X write(log_packets,"chk: ",6);
X write(log_packets,str,strlen(str));
X write(log_packets,"\n",1);
X }
X
X} /* end of report_protocol_crc_type */
X
X/*+-------------------------------------------------------------------------
X report_uninit()
X--------------------------------------------------------------------------*/
Xvoid
Xreport_uninit()
X{
Xfloat total = (float)total_data_chars_xfered;
X
X if(curses_installed)
X {
X if((total_data_chars_xfered != 0L) && (elapsed_seconds != 0L))
X {
X sprintf(s128,"Data xfer rate ~= %6.0f chars/sec",
X total / (float)elapsed_seconds);
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--------------------------------------------------------------------------*/
Xvoid
Xreport_init(title)
Xchar *title;
X{
Xregister int itmp;
Xregister char *cptr;
Xchar buf[48];
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,3);
X waddch(win,' ');
X waddstr(win,title);
X waddch(win,' ');
X waddch(win,sHR);
X waddch(win,sHR);
X waddstr(win," dir: ");
X waddstr(win,curr_dir);
X waddch(win,' ');
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(sending_flag)
X {
X clear_area(win,2,15,3);
X sprintf(s128,"%3d",npaths);
X waddstr(win,s128);
X#if defined(FORK_DEBUG)
X sprintf(s128,"ecusz pid %d",getpid());
X#endif
X }
X else /* ecurz */
X {
X clear_area(win,2,11,8); /* clear "of ###" */
X waddstr(win,":");
X#if defined(FORK_DEBUG)
X sprintf(s128,"ecurz pid %d",getpid());
X#endif
X }
X
X#if defined(FORK_DEBUG)
X ecu_log_event(s128);
X#endif
X
X clear_area(win,1,11,47);
X report_error_count();
X clear_area(win,8,26,8); /* starting time */
X waddstr(win,get_tod(1,(char *)0));
X start_seconds = time((long *)0);
X current_seconds = start_seconds;
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 wmove(win,1,54);
X waddch(win,(status) ? 'R' : ' ');
X wmove(win,1,54);
X wrefresh(win);
X} /* end of report_rx_ind */
X
X/*+-------------------------------------------------------------------------
X report_tx_ind(status)
X--------------------------------------------------------------------------*/
Xvoid
Xreport_tx_ind(status)
Xint status;
X{
X wmove(win,1,56);
X waddch(win,(status) ? 'T' : ' ');
X wmove(win,1,56);
X wrefresh(win);
X} /* end of report_tx_ind */
X
X/*+-------------------------------------------------------------------------
X report_rx_tx_count()
X
X rx char count: row 6 col 16 length 8 unsigned long
X tx char count: row 6 col 29 length 8 unsigned long
X now time of day: row 1 col 50 length 8 hh:mm:ss
X This procedure may be counted upon to perform wrefresh(win)
X
Xelapsed time row 9 col 26 length 8
Xcurrent tod row 9 col 47 length 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 clear_area(win,9,47,8);
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 clear_area(win,9,26,8);
X waddstr(win,cptr);
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 5
X--------------------------------------------------------------------------*/
Xvoid
Xreport_mode(mode)
Xint mode;
X{
X char tmp[8];
X
X clear_area(win,7,52,6);
X switch(mode)
X {
X case 0:
X waddstr(win,"NORMAL");
X break;
X case 1:
X waddstr(win,"RAW");
X break;
X case 2:
X waddstr(win,"CBREAK");
X break;
X default:
X sprintf(tmp,"%5u",mode);
X waddstr(win,tmp);
X }
X wrefresh(win);
X
X} /* end of report_mode */
X
X/*+-------------------------------------------------------------------------
X report_rxpos(rxpos) row 3 col 19 len 8
X--------------------------------------------------------------------------*/
Xvoid
Xreport_rxpos(rxpos)
Xlong rxpos;
X{
Xchar tmp[16];
Xchar refr;
X
X if(rdchk(0))
X {
X read(0,&refr,1);
X if(refr == 0x0C || refr == 0x012) /* ^L or ^R */
X {
X write(2,"\033[2J",4);
X nap((long)60);
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 this file: row 10 col 29 len 4
X total: row 10 col 42 len 6
X--------------------------------------------------------------------------*/
Xreport_error_count()
X{
X char tmp[16];
X
X clear_area(win,10,29,4);
X sprintf(tmp,"%4d",this_file_errors);
X waddstr(win,tmp);
X
X clear_area(win,10,42,6);
X sprintf(tmp,"%6d",total_errors);
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 wrefresh(win);
X
X if(error_flag)
X {
X ++this_file_errors;
X ++total_errors;
X report_error_count();
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 wrefresh(win);
X
X if(error_flag)
X {
X ++this_file_errors;
X ++total_errors;
X report_error_count();
X }
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[56] = 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 47 length 8
X--------------------------------------------------------------------------*/
Xvoid
Xreport_file_open_tod()
X{
X clear_area(win,8,47,8);
X waddstr(win,get_tod(1,(char *)0));
X wrefresh(win);
X} /* end of report_file_open_tod */
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;
Xchar s256[256];
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#if defined(LOG_XFER)
X sprintf(s256,"sending %s",filename);
X ecu_log_event(s256);
X#endif
X
X /* length */
X report_file_open_length(filestat->st_size);
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)
X
X filename: row 2 col 7 len 50
X length: row 3 col 36 len 8 if not xmodem
X time of start of this file: row 4 col 47 length 8 hh:mm:ss
X--------------------------------------------------------------------------*/
Xreport_file_rcv_started(filename,length,last_mod_time)
Xchar *filename;
Xlong length; /* if < 0, "UNKNOWN" */
Xlong last_mod_time; /* not currently displayed */
X{
Xregister char *cptr;
Xchar s50[50];
Xchar s256[256];
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#if defined(LOG_XFER)
X sprintf(s256,"receiving %s",filename);
X ecu_log_event(s256);
X#endif
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(npaths)
X {
X clear_area(win,2,12,7); /* clear "of ###" */
X sprintf(s50,"of %3d:",npaths);
X waddstr(win,s50);
X }
X
X /* length */
X report_file_open_length(length);
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 report_str("End of file",0);
X wrefresh(win);
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 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 scurses.c */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 sea/scurses.c || echo "restore of sea/scurses.c fails"
echo "x - extracting sea/sealink.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > sea/sealink.doc &&
X SEALINK
X
X File Transfer Protocol
X
X 9 February 1987
X
X
X
X (C) COPYRIGHT 1986,87 by System Enhancement Associates, Inc.
X
X
X
X This document describes briefly the SEAlink file transfer protocol
X developers' package. SEAlink is a sliding window protocol that is
X fully backwards compatible with XMODEM in all tested implementations.
X
X The intent of SEAlink is to provide a file transfer protocol that does
X not suffer from propagation delays, such as are introduced by
X satellite relays or packet switched networks. Actual tests of the
X enclosed routines has shown that SEAlink is capable of virtually
X eliminating propagation delays and turnaround delays. File transfers
X between New Jersey and Hawaii, which normally suffer a degradation of
X 50% or more due to satellite relays, proceed as fast as local
X transfers. Even transfers within the local exchange are speeded up by
X up to 20% at 2400 baud by the elimination of turnaround delays. Large
X volume tests show that SEAlink is capable of coming to within 2% of
X the theoretical minimum time for data transfer.
X
X
X
X The developers' package contains the following files:
X
X SEALINK.DOC This document.
X SEALINK.C A set of C routines for implementing SEAlink.
X CLINK.EXE A sample TTY program that implements SEAlink.
X
X
X
X You are granted a license to use this code in your programs, and to
X adapt it to your particular situation and needs, subject only to the
X following conditions:
X
X 1) You must refer to it as the SEAlink protocol, and you must give
X credit to System Enhancement Associates.
SHAR_EOF
echo "End of part 31"
echo "File sea/sealink.doc is continued in part 32"
echo "32" > 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.
More information about the Alt.sources
mailing list