From 9884a834b66d7e8dd26a4a8f9676276711ef61ad Mon Sep 17 00:00:00 2001 From: Rob Swindell <rob@synchro.net> Date: Tue, 29 Dec 2020 02:59:54 -0800 Subject: [PATCH] Remove src/stp (Synchronet Transfer Protocols) This project morphed into SEXYZ a long, long time ago. --- src/stp/make.bat | 1 - src/stp/rciols.obj | Bin 8736 -> 0 bytes src/stp/stp.c | 1756 -------------------------------------------- src/stp/zmodem.c | 1644 ----------------------------------------- src/stp/zmodem.h | 248 ------- 5 files changed, 3649 deletions(-) delete mode 100755 src/stp/make.bat delete mode 100644 src/stp/rciols.obj delete mode 100644 src/stp/stp.c delete mode 100644 src/stp/zmodem.c delete mode 100644 src/stp/zmodem.h diff --git a/src/stp/make.bat b/src/stp/make.bat deleted file mode 100755 index b5599dd462..0000000000 --- a/src/stp/make.bat +++ /dev/null @@ -1 +0,0 @@ -bcc32 -I..\xpdev;..\sbbs3 stp.c zmodem.c ..\xpdev\dirwrap.c ..\xpdev\genwrap.c ..\xpdev\sockwrap.c ..\sbbs3\crc16.c ..\sbbs3\crc32.c ..\sbbs3\telnet.c diff --git a/src/stp/rciols.obj b/src/stp/rciols.obj deleted file mode 100644 index 1103dcd172d4b32820e0783ff1b1fccc9d3ee1ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8736 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 diff --git a/src/stp/stp.c b/src/stp/stp.c deleted file mode 100644 index a18fba6535..0000000000 --- a/src/stp/stp.c +++ /dev/null @@ -1,1756 +0,0 @@ -/* stp.c */ - -/* Synchronet X/Y/ZMODEM Transfer Protocols */ - -/* $Id: stp.c,v 1.7 2005/09/05 21:54:11 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/* - * ZMODEM code based on zmtx/zmrx v1.02 (C) Mattheij Computer Service 1994 - * by Jacques Mattheij <jacquesm@hacktic.nl> - */ - -#include <time.h> -#include <stdio.h> -#include <errno.h> -#include <string.h> -#include <stdlib.h> -#include <stdarg.h> -#include <sys/stat.h> - -#include "xpbeep.h" -#include "conwrap.h" -#include "genwrap.h" -#include "dirwrap.h" -#include "filewrap.h" -#include "sockwrap.h" - -#include "crc16.h" - -#include "telnet.h" - -#define MAXERRORS 10 - -#define DLE CTRL_P /* Data link escape */ -#define XON CTRL_Q /* Resume transmission */ -#define XOFF CTRL_S /* Pause transmission */ - -#define SOH CTRL_A /* Start of header */ -#define EOT CTRL_D /* End of transmission */ - -#define ACK CTRL_F /* Acknowledge */ -#define NAK CTRL_U /* Negative Acknowledge */ -#define CAN CTRL_X /* Cancel */ - -#define CPMEOF CTRL_Z /* CP/M End of file (^Z) */ -#define LOC_ABORT 0x2e03 /* Local abort key (^C) */ - -#define SEND (1<<0) /* Sending file(s) */ -#define RECV (1<<1) /* Receiving file(s) */ -#define XMODEM (1<<2) /* Use Xmodem */ -#define YMODEM (1<<3) /* Use Ymodem */ -#define ZMODEM (1<<4) /* Use Zmodem */ -#define CRC (1<<5) /* Use CRC error correction */ -#define GMODE (1<<6) /* For Qmodem-G and Ymodem-G */ -#define DIR (1<<7) /* Directory specified to download to */ -#define DEBUG (1<<8) /* Debug output */ -#define OVERWRITE (1<<9) /* Overwrite receiving files */ -#define IGNORE_DCD (1<<10) /* Ignore DCD */ -#define ALARM (1<<11) /* Alarm when starting and stopping xfer */ -#define NO_LOCAL (1<<12) /* Don't check local keyboard */ -#define PAUSE_ABEND (1<<13) /* Pause on abnormal exit */ -#define TELNET (1<<14) /* Telnet IAC escaping */ - - /* Zmodem mode bits */ -#define CTRL_ESC (1<<0) /* Escape all control chars */ -#define VAR_HDRS (1<<1) /* Use variable headers */ - -#include "zmodem.h" - -#define LOOP_NOPEN 50 - -#define MAX_FNAMES 100 /* Up to 100 filenames */ - -/************************/ -/* Remote I/O Constants */ -/************************/ - - /* i/o mode and state flags */ -#define NOINP 0x0100 /* input buffer empty (incom only) */ - -void cancel(void); - -/***************/ -/* Global Vars */ -/***************/ -long mode=PAUSE_ABEND|TELNET; /* Program mode */ -long zmode=0L; /* Zmodem mode */ -uchar block[1024]; /* Block buffer */ -uint block_size; /* Block size (128 or 1024) */ -ulong block_num; /* Block number */ -ulong last_block_num; /* Last block number sent */ -uint flows=0; /* Number of flow controls */ -time_t startall; - -FILE* errfp; -FILE* statfp; - -/**************************************/ -/* Zmodem specific, from Chuck's RZSZ */ -/**************************************/ -char Txhdr[ZMAXHLEN]; /* Zmodem transmit header */ -char Rxhdr[ZMAXHLEN]; /* Zmodem receive header */ -char attn[ZATTNLEN]; /* Attention string for sender */ -char zconv; -char zmanag; -char ztrans; -int tryzhdrtype; -int Rxtimeout = 100; /* Tenths of seconds to wait for something */ -int Rxframeind; /* ZBIN ZBIN32, or ZHEX type of frame */ -int Rxtype; /* Type of header received */ -int Rxhlen; /* Length of header received */ -int Rxcount; /* Count of data bytes received */ - -SOCKET sock; -#define DCDHIGH socket_check(sock, NULL, NULL, 0) - -#ifdef _WINSOCKAPI_ - -WSADATA WSAData; -static BOOL WSAInitialized=FALSE; - -static BOOL winsock_startup(void) -{ - int status; /* Status Code */ - - if((status = WSAStartup(MAKEWORD(1,1), &WSAData))==0) { - fprintf(statfp,"%s %s\n",WSAData.szDescription, WSAData.szSystemStatus); - WSAInitialized=TRUE; - return(TRUE); - } - - fprintf(errfp,"!WinSock startup ERROR %d\n", status); - return(FALSE); -} - -#else /* No WINSOCK */ - -#define winsock_startup() (TRUE) - -#endif - -/********/ -/* Code */ -/********/ - -void newline(void) -{ - fprintf(statfp,"\n"); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c; - - c=strlen(str); - while(c && str[c-1]<=SP) c--; - str[c]=0; -} - -/**************/ -/* Exit Point */ -/**************/ -void bail(int code) -{ - - if(mode&ALARM) { - BEEP(2000,500); - BEEP(1000,500); - } - newline(); - fprintf(statfp,"Exiting - Error level: %d",code); - if(flows) - fprintf(statfp," Flow restraint count: %u",flows); - fprintf(statfp,"\n"); - - if(/* code && */ mode&PAUSE_ABEND) { - printf("Hit enter to continue..."); - getchar(); - } - - exit(code); -} - -char *chr(uchar ch) -{ - static char str[25]; - - switch(ch) { - case SOH: - return("SOH"); - case STX: - return("STX"); - case ETX: - return("ETX"); - case EOT: - return("EOT"); - case ACK: - return("ACK"); - case NAK: - return("NAK"); - case CAN: - return("CAN"); - default: - if(ch>=' ' && ch<='~') - sprintf(str,"'%c' (%02Xh)",ch,ch); - else - sprintf(str,"%u (%02Xh)",ch,ch); - return(str); - } -} - -void send_telnet_cmd(SOCKET sock, uchar cmd, uchar opt) -{ - uchar buf[3]; - - buf[0]=TELNET_IAC; - buf[1]=cmd; - buf[2]=opt; - - fprintf(statfp,"\nSending telnet command: %s %s" - ,telnet_cmd_desc(buf[1]),telnet_opt_desc(buf[2])); - if(send(sock,buf,sizeof(buf),0)==sizeof(buf)) - fprintf(statfp,"\n"); - else - fprintf(statfp," FAILED!\n"); -} - -#define DEBUG_TELNET FALSE - -/****************************************************************************/ -/* Receive a byte from remote */ -/****************************************************************************/ -uint recv_byte(SOCKET sock, int timeout, long mode) -{ - int i; - uchar ch; - fd_set socket_set; - struct timeval tv; - static uchar telnet_cmd; - static int telnet_cmdlen; - - while(1) { - - FD_ZERO(&socket_set); - FD_SET(sock,&socket_set); - tv.tv_sec=timeout; - tv.tv_usec=0; - - if(select(sock+1,&socket_set,NULL,NULL,&tv)<1) { - if(timeout) { - newline(); - fprintf(statfp,"Input timeout\n"); - } - return(NOINP); - } - - i=recv(sock,&ch,sizeof(ch),0); - - if(i!=sizeof(ch)) { - newline(); - if(i==0) - fprintf(statfp,"No carrier\n"); - else - fprintf(statfp,"!recv error %d (%d)\n",i,ERROR_VALUE); - bail(1); - } - - if(mode&TELNET) { - if(ch==TELNET_IAC) { -#if DEBUG_TELNET - fprintf(statfp,"T<%s> ",telnet_cmd_desc(ch)); -#endif - if(telnet_cmdlen==0) { - telnet_cmdlen=1; - continue; - } - if(telnet_cmdlen==1) { - telnet_cmdlen=0; - return(TELNET_IAC); - } - } - if(telnet_cmdlen) { - telnet_cmdlen++; -#if DEBUG_TELNET - if(telnet_cmdlen==2) - fprintf(statfp,"T<%s> ",telnet_cmd_desc(ch)); - else - fprintf(statfp,"T<%s> ",telnet_opt_desc(ch)); -#endif - if(telnet_cmdlen==3 && telnet_cmd==TELNET_DO) - send_telnet_cmd(sock, TELNET_WILL,ch); - /* - else if(telnet_cmdlen==3 && telnet_cmd==TELNET_WILL) - send_telnet_cmd(sock, TELNET_DO,ch); - */ - telnet_cmd=ch; - if((telnet_cmdlen==2 && ch<TELNET_WILL) || telnet_cmdlen>2) - telnet_cmdlen=0; - continue; - } - } - return(ch); - } - - return(NOINP); -} - -#define getcom(t) recv_byte(sock,t,mode) - -/*************************/ -/* Send a byte to remote */ -/*************************/ -int send_byte(SOCKET sock, uchar ch, int timeout, long mode) -{ - uchar buf[2] = { TELNET_IAC, TELNET_IAC }; - int len=1; - int i; - fd_set socket_set; - struct timeval tv; - - FD_ZERO(&socket_set); - FD_SET(sock,&socket_set); - tv.tv_sec=timeout; - tv.tv_usec=0; - - if(select(sock+1,NULL,&socket_set,NULL,&tv)<1) - return(ERROR_VALUE); - - if(mode&TELNET && ch==TELNET_IAC) /* escape IAC char */ - len=2; - else - buf[0]=ch; - - i=send(sock,buf,len,0); - - if(i==len) - return(0); - - return(-1); -} - -#define putcom(ch) send_byte(sock,ch,10,mode) - -int send_str(SOCKET sock, char* str, int timeout, long mode) -{ - char* p; - int i; - - for(p=str;*p;p++) { - if((i=send_byte(sock,*p,timeout,mode))!=0) - return(i); - } - return(0); -} - -void xmodem_put_nak(SOCKET sock, long mode) -{ - while(getcom(1)!=NOINP && (mode&NO_LOCAL || kbhit()!=LOC_ABORT)) - ; /* wait for any trailing data */ - putcom(NAK); -} - -void xmodem_cancel(SOCKET sock, long mode) -{ - int i; - - for(i=0;i<8;i++) - putcom(CAN); - for(i=0;i<10;i++) - putcom('\b'); -} - -/****************************************************************************/ -/* Receive a X/Ymodem block (sector) from COM port */ -/* hdrblock is 1 if attempting to get Ymodem header block, 0 if data block */ -/* Returns blocknum if all went well, -1 on error or CAN, and -EOT if EOT */ -/****************************************************************************/ -int xmodem_get_block(SOCKET sock, uchar* block, uint block_size, BOOL hdrblock - ,long mode, FILE* statfp) -{ - uchar block_num; /* Block number received in header */ - uchar chksum,calc_chksum; - int i,errors,eot=0,can=0; - uint b; - ushort crc,calc_crc; - - for(errors=0;errors<MAXERRORS;errors++) { - i=getcom(10); - if(eot && i!=EOT) - eot=0; - if(can && i!=CAN) - can=0; - switch(i) { - case SOH: /* 128 byte blocks */ - block_size=128; - break; - case STX: /* 1024 byte blocks */ - block_size=1024; - break; - case EOT: - if((mode&(YMODEM|GMODE))==YMODEM && !eot) { - eot=1; - xmodem_put_nak(sock,mode); /* chuck's double EOT trick */ - continue; - } - return(-EOT); - case CAN: - newline(); - if(!can) { /* must get two CANs in a row */ - can=1; - fprintf(statfp,"Received CAN Expected SOH, STX, or EOT\n"); - continue; - } - fprintf(statfp,"Cancelled remotely\n"); - bail(-1); - break; - case NOINP: /* Nothing came in */ - continue; - default: - newline(); - fprintf(statfp,"Received %s Expected SOH, STX, or EOT\n",chr((uchar)i)); - if(hdrblock) /* Trying to get Ymodem header block */ - return(-1); - xmodem_put_nak(sock,mode); - continue; - } - i=getcom(1); - if(i==NOINP) { - xmodem_put_nak(sock,mode); - continue; - } - block_num=i; - i=getcom(1); - if(i==NOINP) { - xmodem_put_nak(sock,mode); - continue; - } - if(block_num!=(uchar)~i) { - newline(); - fprintf(statfp,"Block number error\n"); - xmodem_put_nak(sock,mode); - continue; - } - calc_crc=calc_chksum=0; - for(b=0;b<block_size;b++) { - i=getcom(1); - if(i==NOINP) - break; - block[b]=i; - if(mode&CRC) - calc_crc=ucrc16(block[b],calc_crc); - else - calc_chksum+=block[b]; - } - - if(b<block_size) { - xmodem_put_nak(sock,mode); - continue; - } - - if(mode&CRC) { - crc=getcom(1)<<8; - crc|=getcom(1); - } - else - chksum=getcom(1); - - if(mode&CRC) { - if(crc==calc_crc) - break; - newline(); - fprintf(statfp,"CRC error\n"); - } - else /* CHKSUM */ - { - if(chksum==calc_chksum) - break; - newline(); - fprintf(statfp,"Checksum error\n"); - } - - if(mode&GMODE) { /* Don't bother sending a NAK. He's not listening */ - xmodem_cancel(sock,mode); - bail(1); - } - xmodem_put_nak(sock,mode); - } - - if(errors>=MAXERRORS) { - newline(); - fprintf(statfp,"Too many errors\n"); - return(-1); - } - return(block_num); -} - -/*****************/ -/* Sends a block */ -/*****************/ -void xmodem_put_block(SOCKET sock, char* block, uint block_size, ulong block_num, long mode) -{ - uchar ch,chksum; - uint i; - ushort crc; - - if(block_size==128) - putcom(SOH); - else /* 1024 */ - putcom(STX); - ch=(block_num&0xff); - putcom(ch); - putcom((uchar)~ch); - chksum=crc=0; - for(i=0;i<block_size;i++) { - putcom(block[i]); - if(mode&CRC) - crc=ucrc16(block[i],crc); - else - chksum+=block[i]; - } - - if(mode&CRC) { - putcom((uchar)(crc >> 8)); - putcom((uchar)(crc&0xff)); - } - else - putcom(chksum); - YIELD(); -} - -/************************************************************/ -/* Gets an acknowledgement - usually after sending a block */ -/* Returns 1 if ack received, 0 otherwise. */ -/************************************************************/ -int xmodem_get_ack(int tries) -{ - int i,errors,can=0; - - for(errors=0;errors<tries;errors++) { - - if(mode&GMODE) { /* Don't wait for ACK on Ymodem-G */ - if(getcom(0)==CAN) { - newline(); - fprintf(statfp,"Cancelled remotely\n"); - xmodem_cancel(sock,mode); - bail(1); - } - return(1); - } - - i=getcom(10); - if(can && i!=CAN) - can=0; - if(i==ACK) - return(1); - if(i==CAN) { - if(can) { - newline(); - fprintf(statfp,"Cancelled remotely\n"); - xmodem_cancel(sock,mode); - bail(1); - } - can=1; - } - if(i!=NOINP) { - newline(); - fprintf(statfp,"Received %s Expected ACK\n",chr((uchar)i)); - if(i!=CAN) - return(0); - } - } - - return(0); -} - -/****************************************************************************/ -/* Returns the number of blocks required to send len bytes */ -/****************************************************************************/ -long num_blocks(long len, long block_size) -{ - long blocks; - - blocks=len/block_size; - if(len%block_size) - blocks++; - return(blocks); -} - -#if 0 - -/****************************************/ -/* Zmodem specific functions start here */ -/****************************************/ - -/**********************************************/ -/* Output single byte as two hex ASCII digits */ -/**********************************************/ -void putzhex(uchar val) -{ - char *digits="0123456789abcdef"; - - putcom(digits[(val&0xF0)>>4]); - putcom(digits[val&0xF]); -} - -/***********************/ -/* Output a hex header */ -/***********************/ -void putzhhdr(char type) -{ - uint i; - ushort crc=0; - - putcom(ZPAD); - putcom(ZPAD); - putcom(ZDLE); - if(zmode&VAR_HDRS) { - putcom(ZVHEX); - putzhex(4); - } - else - putcom(ZHEX); - putzhex(type); -/* crc=ucrc16(type,crc); */ - for(i=0;i<4;i++) { - putzhex(Txhdr[i]); - crc=ucrc16(Txhdr[i],crc); - } -/* crc=ucrc16(0,crc); */ -/* crc=ucrc16(0,crc); */ - putzhex(crc>>8); - putzhex(crc&0xff); - putcom(CR); - putcom(LF); /* Chuck's RZ.C sends LF|0x80 for some unknown reason */ - if(type!=ZFIN && type!=ZACK) - putcom(XON); -} - -/****************************************************************************/ -/* Stores a long in the Zmodem transmit header (usually position offset) */ -/****************************************************************************/ -void ltohdr(long l) -{ - - Txhdr[ZP0] = l; - Txhdr[ZP1] = l>>8; - Txhdr[ZP2] = l>>16; - Txhdr[ZP3] = l>>24; -} - -/****************************************************************************/ -/* Outputs single Zmodem character, escaping with ZDLE when appropriate */ -/****************************************************************************/ -void putzcom(uchar ch) -{ - static lastsent; - - if(ch&0x60) /* not a control char */ - putcom(lastsent=ch); - else - switch(ch) { - case DLE: - case DLE|0x80: /* even if high-bit set */ - case XON: - case XON|0x80: - case XOFF: - case XOFF|0x80: - case ZDLE: - putcom(ZDLE); - ch^=0x40; - putcom(lastsent=ch); - break; - case CR: - case CR|0x80: - if(!(zmode&CTRL_ESC) && (lastsent&0x7f)!='@') - putcom(lastsent=ch); - else { - putcom(ZDLE); - ch^=0x40; - putcom(lastsent=ch); - } - break; - default: - if(zmode&CTRL_ESC && !(ch&0x60)) { /* it's a ctrl char */ - putcom(ZDLE); - ch^=0x40; - } - putcom(lastsent=ch); - break; - } -} - -/* - * Read a byte, checking for ZMODEM escape encoding - * including CAN*5 which represents a quick abort - */ -int getzcom() -{ - int i; - - while(1) { - /* Quick check for non control characters */ - if((i=getcom(Rxtimeout))&0x60) - return(i); - if(i==ZDLE) - break; - if((i&0x7f)==XOFF || (i&0x7f)==XON) - continue; - if(zmode&CTRL_ESC && !(i&0x60)) - continue; - return(i); - } - - while(1) { /* Escaped characters */ - if((i=getcom(Rxtimeout))<0) - return(i); - if(i==CAN && (i=getcom(Rxtimeout))<0) - return(i); - if(i==CAN && (i=getcom(Rxtimeout))<0) - return(i); - if(i==CAN && (i=getcom(Rxtimeout))<0) - return(i); - switch (i) { - case CAN: - return(GOTCAN); - case ZCRCE: - case ZCRCG: - case ZCRCQ: - case ZCRCW: - return(i|GOTOR); - case ZRUB0: - return(0x7f); - case ZRUB1: - return(0xff); - case XON: - case XON|0x80: - case XOFF: - case XOFF|0x80: - continue; - default: - if (zmode&CTRL_ESC && !(i&0x60)) - continue; - if ((i&0x60)==0x40) - return(i^0x40); - break; - } - break; - } - return(ERROR); -} - - - -/* - * Read a character from the modem line with timeout. - * Eat parity, XON and XOFF characters. - */ -int getcom7() -{ - int i; - - while(1) { - i=getcom(10); - switch(i) { - case XON: - case XOFF: - continue; - case CR: - case LF: - case NOINP: - case ZDLE: - return(i); - default: - if(!(i&0x60) && zmode&CTRL_ESC) - continue; - return(i); - } - } -} - -#endif - -/************************************************/ -/* Dump the current block contents - for debug */ -/************************************************/ -void dump_block() -{ - uint l; - - for(l=0;l<block_size;l++) - fprintf(statfp,"%02X ",block[l]); - fprintf(statfp,"\n"); -} - -void send_files(char** fname, uint fnames, FILE* log) -{ - char path[MAX_PATH+1]; - int ch; - int i; - uint errors; - uint fnum; - uint cps; - glob_t g; - int gi; - BOOL can; - BOOL success; - long b,l,m; - long fsize; - uint total_files=0,sent_files=0; - ulong total_bytes=0,sent_bytes=0; - time_t t,startfile,ftime; - FILE* fp; - zmodem_t zm; - - /****************************************************/ - /* Search through all to find total files and bytes */ - /****************************************************/ - for(fnum=0;fnum<fnames;fnum++) { - if(glob(fname[fnum],0,NULL,&g)) { - fprintf(statfp,"%s not found\n",fname[fnum]); - continue; - } - for(i=0;i<(int)g.gl_pathc;i++) { - if(isdir(g.gl_pathv[i])) - continue; - total_files++; - total_bytes+=flength(g.gl_pathv[i]); - } - globfree(&g); - } - - if(fnames>1) - fprintf(statfp,"Sending %u files (%lu bytes total)\n" - ,total_files,total_bytes); - - memset(&zm,0,sizeof(zm)); - zm.sock=sock; - zm.mode=mode; - zm.n_files_remaining = total_files; - zm.n_bytes_remaining = total_bytes; - - /***********************************************/ - /* Send every file matching names or filespecs */ - /***********************************************/ - for(fnum=0;fnum<fnames;fnum++) { - if(glob(fname[fnum],0,NULL,&g)) { - fprintf(statfp,"%s not found\n",fname[fnum]); - continue; - } - for(gi=0;gi<(int)g.gl_pathc;gi++) { - SAFECOPY(path,g.gl_pathv[gi]); - if(isdir(path)) - continue; - - if((fp=fopen(path,"rb"))==NULL) { - fprintf(statfp,"!Error %d opening %s for read\n",errno,path); - continue; - } - - if(mode&ZMODEM) { - - for(errors=0;errors<MAXERRORS;errors++) { - fprintf(statfp,"\nSending ZRQINIT\n"); - i = zmodem_get_zrinit(&zm); - if(i == ZRINIT) { - zmodem_parse_zrinit(&zm); - break; - } - fprintf(statfp,"\n!RX header: %d 0x%02X\n", i, i); - } - - } else { /* X/Ymodem */ - - mode&=~GMODE; - flows=0; - for(errors=can=0;errors<MAXERRORS;errors++) { - i=getcom(10); - if(can && i!=CAN) - can=0; - if(i==NAK) { /* csum */ - mode&=~CRC; - break; - } - if(i=='C') { - mode|=CRC; - break; - } - if(i=='G') { - mode|=(GMODE|CRC); - break; - } - if(i==CAN) { - if(can) { - newline(); - fprintf(statfp,"Cancelled remotely\n"); - bail(1); - } - can=1; - } -#if 0 - rioctl(IOFB); /* flush buffers cause we have crap-o-la */ -#endif - if(i!=NOINP) { - newline(); - fprintf(statfp,"Received %s Expected NAK, C, or G\n" - ,chr((uchar)i)); - } - } - } - - if(errors==MAXERRORS) { - fprintf(statfp,"\n!Timeout waiting for receiver to start/accept file transfer\n"); - xmodem_cancel(sock,mode); - bail(1); - } - - fsize=filelength(fileno(fp)); - - fprintf(statfp,"\nSending %s (%lu bytes) via %s %s\n" - ,path,fsize - ,mode&XMODEM ? "Xmodem" : mode&YMODEM ? mode&GMODE ? "Ymodem-G" - : "Ymodem" : "Zmodem" - ,mode&ZMODEM ? (zm.can_fcs_32 ? "CRC-32" : "CRC-16") - : mode&CRC ? "CRC-16":"Checksum"); - - errors=0; - success=0; - startfile=time(NULL); - - if(mode&ZMODEM) { - if(zmodem_send_file(&zm,getfname(path),fp)==0) { - sent_files++; - sent_bytes+=fsize; - - t=time(NULL)-startfile; - if(!t) t=1; - fprintf(statfp,"\rSuccesssful - Time: %lu:%02lu CPS: %lu\n" - ,t/60,t%60,fsize/t); - success=1; - } - else { - newline(); - fprintf(statfp,"Unsuccessful!\n"); - t=time(NULL)-startfile; - if(!t) t=1; - } - - } else { /* X/Ymodem */ - - if(!(mode&XMODEM)) { - t=fdate(path); - memset(block,0,sizeof(block)); - SAFECOPY(block,getfname(path)); - sprintf(block+strlen(block)+1,"%lu %lo 0 0 %d %ld" - ,fsize,t,total_files-sent_files,total_bytes-sent_bytes); - /* - fprintf(statfp,"Sending Ymodem block '%s'\n",block+strlen(block)+1); - */ - for(errors=0;errors<MAXERRORS;errors++) { - xmodem_put_block(sock, block, 128 /* block_size */, 0 /* block_num */, mode); - if(xmodem_get_ack(1)) - break; - } - if(errors==MAXERRORS) { - newline(); - fprintf(statfp,"Failed to send header block\n"); - xmodem_cancel(sock,mode); - bail(1); - } - mode&=~GMODE; - for(errors=can=0;errors<MAXERRORS;errors++) { - i=getcom(10); - if(can && i!=CAN) - can=0; - if(i==NAK) { /* csum */ - mode&=~CRC; - break; - } - if(i=='C') { - mode|=CRC; - break; - } - if(i=='G') { - mode|=(GMODE|CRC); - break; - } - if(i==CAN) { - if(can) { - newline(); - fprintf(statfp,"Cancelled remotely\n"); - bail(1); - } - can=1; - } - #if 0 - rioctl(IOFB); - #endif - if(i!=NOINP) { - newline(); - fprintf(statfp,"Received %s Expected NAK, C, or G\n" - ,chr((uchar)i)); - } - } - if(errors==MAXERRORS) { - newline(); - fprintf(statfp,"Too many errors waiting for receiver\n"); - xmodem_cancel(sock,mode); - bail(1); - } - } - last_block_num=block_num=1; - errors=0; - while((block_num-1)*(long)block_size<fsize && errors<MAXERRORS) { - if(last_block_num==block_num) { /* block_num didn't increment */ - fseek(fp,(block_num-1)*(long)block_size,SEEK_SET); - i=fread(block,1,block_size,fp); - while(i<block_size) - block[i++]=CPMEOF; - } - last_block_num=block_num; - xmodem_put_block(sock, block, block_size, block_num, mode); - i=fread(block,1,block_size,fp); /* read next block from disk */ - while(i<block_size) - block[i++]=CPMEOF; - t=time(NULL)-startfile; - if(!t) t=1; /* t is time so far */ - cps=(uint)((block_num*(long)block_size)/t); /* cps so far */ - if(!cps) cps=1; - l=fsize/cps; /* total transfer est time */ - l-=t; /* now, it's est time left */ - if(l<0) l=0; - b=num_blocks(fsize,block_size); - fprintf(statfp,"\rBlock (%lu%s): %lu/%lu Byte: %lu " - "Time: %lu:%02lu/%lu:%02lu CPS: %u %lu%% " - ,block_size%1024L ? block_size: block_size/1024L - ,block_size%1024L ? "" : "k" - ,block_num - ,b - ,block_num*(long)block_size - ,t/60L - ,t%60L - ,l/60L - ,l%60L - ,cps - ,(long)(((float)block_num/(float)b)*100.0) - ); - if(!xmodem_get_ack(5)) - errors++; - else - block_num++; - } - fclose(fp); - if((long)(block_num-1)*(long)block_size>=fsize) { - sent_files++; - sent_bytes+=fsize; - fprintf(statfp,"\n"); - - for(i=0;i<10;i++) { - fprintf(statfp,"\rSending EOT (%d)",i+1); - #if 0 - rioctl(IOFI); - #endif - putcom(EOT); - ch=getcom(10); - if(ch==ACK) - break; - if(ch==NAK && i==0 && (mode&(YMODEM|GMODE))==YMODEM) - continue; /* chuck's double EOT trick so don't complain */ - if(ch!=NOINP) { - newline(); - fprintf(statfp,"Received %s Expected ACK\n" - ,chr((uchar)ch)); - } - } - if(i==3) - fprintf(statfp,"\rNo ACK on EOT \n"); - t=time(NULL)-startfile; - if(!t) t=1; - fprintf(statfp,"\rSuccesssful - Time: %lu:%02lu CPS: %lu\n" - ,t/60,t%60,fsize/t); - success=1; - } - else { - newline(); - fprintf(statfp,"Unsuccessful!\n"); - t=time(NULL)-startfile; - if(!t) t=1; - } - } - - if(total_files>1 && total_files-sent_files>1) - fprintf(statfp,"Remaining - Time: %lu:%02lu Files: %u Bytes: %lu\n" - ,((total_bytes-sent_bytes)/cps)/60 - ,((total_bytes-sent_bytes)/cps)%60 - ,total_files-sent_files - ,total_bytes-sent_bytes - ); - - /* DSZLOG entry */ - if(log) { - if(mode&ZMODEM) - l=fsize; - else { - l=(block_num-1)*(long)block_size; - if(l>fsize) - l=fsize; - } - fprintf(log,"%c %6lu %5u bps %4lu cps %3u errors %5u %4u " - "%s -1\n" - ,success ? (mode&ZMODEM ? 'z':'S') : 'E' - ,l - ,30000 /* baud */ - ,l/t - ,errors - ,flows - ,block_size - ,path); - } - } - } - if(mode&XMODEM) - bail(0); - if(mode&ZMODEM) - zmodem_send_zfin(&zm); - else { /* YMODEM */ - mode&=~GMODE; - i=getcom(10); - if(i==NAK) - mode&=~CRC; - else if(i=='C') - mode|=CRC; - else if(i=='G') - mode|=(GMODE|CRC); - if(i!=NOINP && i!=NAK && i!='C' && i!='G') { - newline(); - fprintf(statfp,"Received %s Expected NAK, C, or G\n",chr((uchar)i)); - } - else if(i!=NOINP) { - block[0]=0; - xmodem_put_block(sock, block, 128 /* block_size */, 0 /* block_num */, mode); - if(!xmodem_get_ack(6)) { - newline(); - fprintf(statfp,"Failed to receive ACK after terminating block\n"); - } - } - } - if(total_files>1) { - t=time(NULL)-startall; - if(!t) t=1; - newline(); - fprintf(statfp,"Overall - Time %02lu:%02lu Bytes: %lu CPS: %lu\n" - ,t/60,t%60,sent_bytes,sent_bytes/t); - } -} - -void receive_files(char** fname, uint fnames, FILE* log) -{ - char str[MAX_PATH+1]; - int i; - uint errors; - uint total_files; - uint fnum=0; - uint cps; - uint hdr_block_num; - long b,l,m; - long serial_num; - ulong file_bytes=0,file_bytes_left=0; - ulong total_bytes=0; - FILE* fp; - time_t t,startfile,ftime; - - if(fnames>1) - fprintf(statfp,"Receiving %u files\n",fnames); - while(1) { - if(mode&XMODEM) { - SAFECOPY(str,fname[0]); - file_bytes=file_bytes_left=0x7fffffff; - serial_num=-1; - } - - else if(mode&YMODEM) { - fprintf(statfp,"Fetching Ymodem header block\n"); - for(errors=0;errors<MAXERRORS;errors++) { - if(errors>3 && mode&CRC && !(mode&GMODE)) - mode&=~CRC; - if(mode&GMODE) /* G for Ymodem-G */ - putcom('G'); - else if(mode&CRC) /* C for CRC */ - putcom('C'); - else /* NAK for checksum */ - putcom(NAK); -#if 0 - for(i=60;i;i--) { - if(rioctl(RXBC)) /* no chars in-bound */ - break; - SLEEP(100); /* so wait */ - } - if(!i) { /* none after 6 secs */ - if(errors) - fprintf(statfp,"Ymodem header timeout (%d)\n",errors); - continue; - } -#endif - if(xmodem_get_block(sock, block,block_size,TRUE,mode,statfp)==0) { /* block received successfully */ - putcom(ACK); - break; - } - } - if(errors==MAXERRORS) { - fprintf(statfp,"Error fetching Ymodem header block\n"); - xmodem_cancel(sock,mode); - bail(1); - } - if(!block[0]) { - fprintf(statfp,"Received Ymodem termination block\n"); - bail(0); - } - sscanf(block+strlen(block)+1,"%ld %lo %lo %lo %d %ld" - ,&file_bytes /* file size (decimal) */ - ,&ftime /* file time (octal unix format) */ - ,&m /* file mode (not used) */ - ,&serial_num /* program serial number */ - ,&total_files /* remaining files to be sent */ - ,&total_bytes /* remaining bytes to be sent */ - ); - if(!file_bytes) - file_bytes=0x7fffffff; - file_bytes_left=file_bytes; - if(!total_files) - total_files=fnames-fnum; - if(!total_files) - total_files=1; - if(total_bytes<file_bytes) - total_bytes=file_bytes; - if(!serial_num) - serial_num=-1; - fprintf(statfp,"Incoming filename: %.64s ",block); - if(mode&DIR) - sprintf(str,"%s%s",fname[0],getfname(block)); - else { - SAFECOPY(str,getfname(block)); - for(i=0;i<fnames;i++) { - if(!fname[i][0]) /* name blank or already used */ - continue; - if(!stricmp(getfname(fname[i]),str)) { - SAFECOPY(str,fname[i]); - fname[i][0]=0; - break; - } - } - if(i==fnames) { /* Not found in list */ - if(fnames) - fprintf(statfp," - Not in receive list!"); - if(!fnames || fnum>=fnames || !fname[fnum][0]) - SAFECOPY(str,getfname(block)); /* worst case */ - else { - SAFECOPY(str,fname[fnum]); - fname[fnum][0]=0; - } - } - } - fprintf(statfp,"\n"); - } - - else { /* Zmodem */ -#if 0 - tryzhdrtype=ZRINIT; - while(1) { - Txhdr[ZF0]=(CANFC32|CANFDX|CANOVIO|CANRLE); - /* add CANBRK if we can send break signal */ - if(zmode&CTRL_ESC) - Txhdr[ZF0]|=TESCCTL; - Txhdr[ZF1]=CANVHDR; - Txhdr[ZP0]=0; - Txhdr[ZP1]=0; - putzhhdr(tryzhdrtype); - done=0; - while(!done) { - done=1; - switch(getzhdr()) { - case ZRQINIT: - if(Rxhdr[ZF3]&0x80) - zmode|=VAR_HDRS; /* we can var header */ - break; - case ZFILE: - zconv=Rxhdr[ZF0]; - zmanag=Rxhdr[ZF1]; - ztrans=Rxhdr[ZF2]; - if(Rxhdr[ZF3]&ZCANVHDR) - zmode|=VAR_HDRS; - tryzhdrtype=ZRINIT; - if(getzdata(block, 1024)==GOTCRCW) { - /* something */ - done=1; - } - putzhhdr(ZNAK); - done=0; - break; - case ZSINIT: - if(Rxhdr[ZF0]&TESCCTL) - zmode|=CTRL_ESC; - if (getzdata(attn,ZATTNLEN)==GOTCRCW) { - ltohdr(1L); - putzhhdr(ZACK); - } - else - putzhhdr(ZNAK); - done=0; - break; - case ZFREECNT: - ltohdr(0); /* should be free disk space */ - putzhhdr(ZACK); - done=0; - break; - case ZCOMMAND: -/*** - cmdzack1flg = Rxhdr[ZF0]; - if(getzdata(block,1024)==GOTCRCW) { - if (cmdzack1flg & ZCACK1) - ltohdr(0L); - else - ltohdr((long)sys2(block)); - purgeline(); /* dump impatient questions */ - do { - zshhdr(4,ZCOMPL, Txhdr); - } - while (++errors<20 && zgethdr(Rxhdr,1)!=ZFIN); - ackbibi(); - if (cmdzack1flg & ZCACK1) - exec2(block); - return ZCOMPL; - } -***/ - putzhhdr(ZNAK); - done=0; - break; - case ZCOMPL: - done=0; - break; - case ZFIN: - ackbibi(); - return ZCOMPL; - case ZCAN: - return ERROR; - } - } -#endif - } - - fnum++; - - if(!(mode&DIR) && fnames && fnum>fnames) { - newline(); - fprintf(statfp,"Attempt to send more files than specified\n"); - xmodem_cancel(sock,mode); - break; - } - - if(fexist(str) && !(mode&OVERWRITE)) { - fprintf(statfp,"%s already exists\n",str); - xmodem_cancel(sock,mode); - bail(1); - } - if((fp=fopen(str,"wb"))==NULL) { - fprintf(statfp,"Error creating %s\n",str); - xmodem_cancel(sock,mode); - bail(1); - } - setvbuf(fp,NULL,_IOFBF,8*1024); - startfile=time(NULL); - fprintf(statfp,"Receiving %s (%lu bytes) via %s %s\n" - ,str - ,mode&XMODEM ? 0 : file_bytes - ,mode&XMODEM ? "Xmodem" : mode&YMODEM ? mode&GMODE ? "Ymodem-G" - : "Ymodem" :"Zmodem" - ,mode&CRC ? "CRC-16":"Checksum"); - - errors=0; - block_num=0; - if(mode&GMODE) /* G for Ymodem-G */ - putcom('G'); - else if(mode&CRC) /* C for CRC */ - putcom('C'); - else /* NAK for checksum */ - putcom(NAK); - while(errors<MAXERRORS) { - if(block_num && !(mode&GMODE)) - putcom(ACK); - i=xmodem_get_block(sock, block,block_size,FALSE,mode,statfp); /* returns block num */ - if(i<0) { - if(i==-EOT) /* end of transfer */ - break; - /* other error */ - xmodem_cancel(sock,mode); - bail(1); - } - hdr_block_num=i; - if(file_bytes_left<=0L) { /* No more bytes to send */ - newline(); - fprintf(statfp,"Attempt to send more than header specified\n"); - break; - } - if(hdr_block_num==(uchar)((block_num+1)&0xff)) { /* correct block */ - block_num++; - if(file_bytes_left<block_size) { - if(fwrite(block,1,file_bytes_left,fp) - !=file_bytes_left) { - newline(); - fprintf(statfp,"Error writing to file\n"); - xmodem_cancel(sock,mode); - bail(1); - } - } - else { - if(fwrite(block,1,block_size,fp) - !=block_size) { - newline(); - fprintf(statfp,"Error writing to file\n"); - xmodem_cancel(sock,mode); - bail(1); - } - } - file_bytes_left-=block_size; - } - else { - newline(); - fprintf(statfp,"Block number %u instead of %u\n" - ,hdr_block_num,(block_num+1)&0xff); - /* dump_block(); */ - errors++; - } - t=time(NULL)-startfile; - if(!t) t=1; - cps=(uint)((block_num*(long)block_size)/t); /* cps so far */ - if(!cps) cps=1; - l=file_bytes/cps; /* total transfer est time */ - l-=t; /* now, it's est time left */ - if(l<0) l=0; - b=num_blocks(file_bytes, block_size); - if(mode&YMODEM) - fprintf(statfp,"\rBlock (%lu%s): %lu/%lu Byte: %lu Time: %lu:%02lu/" - "%lu:%02lu CPS: %u %lu%% " - ,block_size%1024L ? block_size: block_size/1024L - ,block_size%1024L ? "" : "k" - ,block_num - ,b - ,block_num*(long)block_size - ,t/60L - ,t%60L - ,l/60L - ,l%60L - ,cps - ,(long)(((float)block_num/(float)b)*100.0) - ); - else /* Xmodem */ - fprintf(statfp,"\rBlock (%lu%s): %lu Byte: %lu Time: %lu:%02lu " - "CPS: %u " - ,block_size%1024L ? block_size: block_size/1024L - ,block_size%1024L ? "" : "k" - ,block_num - ,block_num*(long)block_size - ,t/60L - ,t%60L - ,cps - ); - } - - putcom(ACK); - if(!(mode&XMODEM) && ftime) - setfdate(str,ftime); - /* Use correct file size */ - fflush(fp); - if(file_bytes < filelength(fileno(fp))); - chsize(fileno(fp),file_bytes); - fclose(fp); - t=time(NULL)-startfile; - if(!t) t=1; - l=(block_num-1)*(long)block_size; - if(l>file_bytes) - l=file_bytes; - newline(); - fprintf(statfp,"Successsful - Time: %lu:%02lu CPS: %lu\n" - ,t/60,t%60,l/t); - if(log) { - fprintf(log,"%c %6lu %5u bps %4lu cps %3u errors %5u %4u " - "%s %d\n" - ,mode&ZMODEM ? 'Z' : 'R' - ,l - ,30000 /* baud */ - ,l/t - ,errors - ,flows - ,block_size - ,str - ,serial_num); - } - if(mode&XMODEM) - break; - total_files--; - total_bytes-=file_bytes; - if(total_files>1 && total_bytes) - fprintf(statfp,"Remaining - Time: %lu:%02lu Files: %u Bytes: %lu\n" - ,(total_bytes/cps)/60 - ,(total_bytes/cps)%60 - ,total_files - ,total_bytes - ); - } -} - -static const char* usage= - "usage: STP <socket> [opts] <cmd> [file | path | +list]\n\n" - "where:\n\n" - "socket = TCP socket descriptor\n" - "opts = o to overwrite files when receiving\n" - " d to disable dropped carrier detection\n" - " a to sound alarm at start and stop of transfer\n" - " p to pause after abnormal exit (error)\n" - " l to disable local keyboard (Ctrl-C) checking\n" - "cmd = sx to send Xmodem rx to recv Xmodem\n" - " sX to send Xmodem-1k rc to recv Xmodem-CRC\n" - " sy to send Ymodem ry to recv Ymodem\n" - " sY to send Ymodem-1k rg to recv Ymodem-G\n" - " sz to send Zmodem rz to recv Zmodem\n" - "file = filename to send or receive\n" - "path = path to receive files into\n" - "list = name of text file with list of filenames to send or receive\n"; - -/***************/ -/* Entry Point */ -/***************/ -int main(int argc, char **argv) -{ - char str[256],tmp[256],*p,*p2,first_block - ,*fname[MAX_FNAMES],fnum; - int ch,i,j,k,last; - uint fnames=0; - ulong val; - FILE* fp; - FILE* log=NULL; - - errfp=stderr; - statfp=stdout; - - fprintf(statfp,"\nSynchronet Transfer Protocols v1.00" - " Copyright 2003 Rob Swindell\n\n"); - - fprintf(statfp,"Command line: "); - for(i=1;i<argc;i++) - fprintf(statfp,"%s ",argv[i]); - fprintf(statfp,"\n",statfp); - - if(argc<3) { - fprintf(errfp,usage); - exit(1); - } - - sock=atoi(argv[1]); - if(sock==INVALID_SOCKET || sock<1) { - fprintf(errfp,usage); - exit(1); - } - - for(i=2;i<argc;i++) { - - if(!(mode&(SEND|RECV))) { - if(toupper(argv[i][0])=='S' || toupper(argv[i][0])=='R') { /* cmd */ - if(toupper(argv[i][0])=='R') - mode|=RECV; - else - mode|=SEND; - - block_size=1024; - - switch(argv[i][1]) { - case 'c': - case 'C': - mode|=CRC; - case 'x': - block_size=128; - case 'X': - mode|=XMODEM; - break; - case 'y': - block_size=128; - case 'Y': - mode|=(YMODEM|CRC); - break; - case 'g': - case 'G': - mode|=(YMODEM|CRC|GMODE); - break; - case 'z': - case 'Z': - mode|=(ZMODEM|CRC); - break; - default: - fprintf(statfp,"Unrecognized command '%s'\n\n",argv[i]); - fprintf(statfp,usage); - exit(1); - } - } - - else if(toupper(argv[i][0])=='O') - mode|=OVERWRITE; - - else if(toupper(argv[i][0])=='D') - mode|=IGNORE_DCD; - - else if(toupper(argv[i][0])=='A') - mode|=ALARM; - - else if(toupper(argv[i][0])=='L') - mode|=NO_LOCAL; - - else if(toupper(argv[i][0])=='P') - mode|=PAUSE_ABEND; - - else if(argv[i][0]=='*') - mode|=DEBUG; - } - - else if(argv[i][0]=='+') { - if(mode&DIR) { - fprintf(statfp,"Cannot specify both directory and filename\n"); - exit(1); - } - sprintf(str,"%s",argv[i]+1); - if((fp=fopen(str,"r"))==NULL) { - fprintf(statfp,"Error %d opening filelist: %s\n",errno,str); - exit(1); - } - while(!feof(fp) && !ferror(fp) && fnames<MAX_FNAMES) { - if(!fgets(str,sizeof(str),fp)) - break; - truncsp(str); - if((fname[fnames]=(char *)malloc(strlen(str)+1))==NULL) { - fprintf(statfp,"Error allocating memory for filename\n"); - exit(1); - } - strcpy(fname[fnames++],str); - } - fclose(fp); - } - - else if(mode&(SEND|RECV)){ - if((fname[fnames]=(char *)malloc(strlen(argv[i])+1))==NULL) { - fprintf(statfp,"Error allocating memory for filename\n"); - exit(1); - } - strcpy(fname[fnames],argv[i]); - if(isdir(fname[fnames])) { /* is a directory */ - if(mode&DIR) { - fprintf(statfp,"Only one directory can be specified\n"); - exit(1); - } - if(fnames) { - fprintf(statfp,"Cannot specify both directory and filename\n"); - exit(1); - } - if(mode&SEND) { - fprintf(statfp,"Cannot send directory '%s'\n",fname[fnames]); - exit(1); - } - mode|=DIR; - } - fnames++; - } - } - - if(!(mode&(SEND|RECV))) { - fprintf(statfp,"No command specified\n"); - fprintf(statfp,usage); - exit(1); - } - - if(mode&(SEND|XMODEM) && !fnames) { /* Sending with any or recv w/Xmodem */ - fprintf(statfp,"Must specify filename or filelist\n"); - fprintf(statfp,usage); - exit(1); - } - - - if(mode&DIR) - backslash(fname[0]); - - if(mode&ALARM) { - BEEP(1000,500); - BEEP(2000,500); - } - - if(!winsock_startup()) - bail(2); -#if 0 - /* Non-blocking socket I/O */ - val=1; - ioctlsocket(sock,FIONBIO,&val); -#endif - if(!DCDHIGH) { - newline(); - fprintf(statfp,"No carrier\n"); - bail(1); - } - - p=getenv("DSZLOG"); - if(p) { - if((log=fopen(p,"w"))==NULL) { - fprintf(statfp,"Error opening DSZLOG file: %s\n",p); - bail(1); - } - } - - startall=time(NULL); - - if(mode&RECV) - receive_files(fname, fnames, log); - else - send_files(fname, fnames, log); - - bail(0); - return(0); -} - diff --git a/src/stp/zmodem.c b/src/stp/zmodem.c deleted file mode 100644 index a333302e62..0000000000 --- a/src/stp/zmodem.c +++ /dev/null @@ -1,1644 +0,0 @@ -/******************************************************************************/ -/* Project : Unite! File : zmodem general Version : 1.02 */ -/* */ -/* (C) Mattheij Computer Service 1994 */ -/* */ -/* contact us through (in order of preference) */ -/* */ -/* email: jacquesm@hacktic.nl */ -/* mail: MCS */ -/* Prinses Beatrixlaan 535 */ -/* 2284 AT RIJSWIJK */ -/* The Netherlands */ -/* voice phone: 31+070-3936926 */ -/******************************************************************************/ - -/* - * zmodem primitives and other code common to zmtx and zmrx - */ - -#include <stdio.h> -#include <sys/stat.h> /* struct stat */ - -#include "genwrap.h" -#include "sockwrap.h" - -#include "zmodem.h" -#include "crc16.h" -#include "crc32.h" - -#define UPDCRC16 ucrc16 -#define UPDCRC32 ucrc32 - -#if 1 -#define DEBUG -#endif - -#define ENDOFFRAME 2 -#define FRAMEOK 1 -#define TIMEOUT -1 /* rx routine did not receive a character within timeout */ -#define INVHDR -2 /* invalid header received; but within timeout */ -#define INVDATA -3 /* invalid data subpacket received */ -#define ZDLEESC 0x8000 /* one of ZCRCE; ZCRCG; ZCRCQ or ZCRCW was received; ZDLE escaped */ - -#define HDRLEN 5 /* size of a zmodem header */ - - -int opt_v = TRUE; /* show progress output */ -int opt_d = TRUE; /* show debug output */ - -/* - * read bytes as long as rdchk indicates that - * more data is available. - */ - -void -zmodem_rx_purge(zmodem_t* zm) - -{ - while(recv_byte(zm->sock,0,zm->mode)<=0xff); -} - -/* - * transmit a character. - * this is the raw modem interface - */ - -void -zmodem_tx_raw(zmodem_t* zm, unsigned char ch) -{ - -#ifdef DEBUG - if (zm->raw_trace) { - fprintf(stderr,"%02x ",ch); - } -#endif - - if(send_byte(zm->sock,ch,10,zm->mode)) - fprintf(stderr,"!Send error: %u\n",ERROR_VALUE); - - zm->last_sent = ch; -} - -/* - * transmit a character ZDLE escaped - */ - -void -zmodem_tx_esc(zmodem_t* zm, unsigned char c) - -{ - zmodem_tx_raw(zm, ZDLE); - /* - * exclusive or; not an or so ZDLE becomes ZDLEE - */ - zmodem_tx_raw(zm, (uchar)(c ^ 0x40)); -} - -/* - * transmit a character; ZDLE escaping if appropriate - */ - -void -zmodem_tx(zmodem_t* zm, unsigned char c) - -{ - switch (c) { - case ZDLE: - zmodem_tx_esc(zm, c); - return; - case 0x8d: - case 0x0d: - if (zm->escape_all_control_characters && (zm->last_sent&0x7f) == '@') { - zmodem_tx_esc(zm, c); - return; - } - break; - case 0x10: - case 0x90: - case 0x11: - case 0x91: - case 0x13: - case 0x93: - zmodem_tx_esc(zm, c); - return; - default: - if (zm->escape_all_control_characters && (c & 0x60) == 0) { - zmodem_tx_esc(zm, c); - return; - } - break; - } - /* - * anything that ends here is so normal we might as well transmit it. - */ - zmodem_tx_raw(zm, c); -} - -/* - * transmit a hex header. - * these routines use tx_raw because we're sure that all the - * characters are not to be escaped. - */ - -void -zmodem_tx_nibble(zmodem_t* zm, int n) - -{ - n &= 0x0f; - if (n < 10) { - n += '0'; - } - else { - n += 'a' - 10; - } - - zmodem_tx_raw(zm, (uchar)n); -} - -void -zmodem_tx_hex(zmodem_t* zm, int h) - -{ - zmodem_tx_nibble(zm, h >> 4); - zmodem_tx_nibble(zm, h); -} - -void -zmodem_tx_hex_header(zmodem_t* zm, unsigned char * p) - -{ - int i; - unsigned short int crc; - -#ifdef DEBUG - fprintf(stderr,"tx_hheader : "); -#endif - - zmodem_tx_raw(zm, ZPAD); - zmodem_tx_raw(zm, ZPAD); - zmodem_tx_raw(zm, ZDLE); - - if (zm->use_variable_headers) { - zmodem_tx_raw(zm, ZVHEX); - zmodem_tx_hex(zm, HDRLEN); - } - else { - zmodem_tx_raw(zm, ZHEX); - } - - /* - * initialise the crc - */ - - crc = 0; - - /* - * transmit the header - */ - - for (i=0;i<HDRLEN;i++) { - zmodem_tx_hex(zm, *p); - crc = UPDCRC16(*p, crc); - p++; - } - - /* - * update the crc as though it were zero - */ - -/* crc = UPDCRC16(0,crc); */ -/* crc = UPDCRC16(0,crc); */ - - /* - * transmit the crc - */ - - zmodem_tx_hex(zm, crc >> 8); - zmodem_tx_hex(zm, crc&0xff); - - /* - * end of line sequence - */ - - zmodem_tx_raw(zm, '\r'); - zmodem_tx_raw(zm, '\n'); - - zmodem_tx_raw(zm, XON); - - -#ifdef DEBUG - fprintf(stderr,"\n"); -#endif -} - -/* - * Send ZMODEM binary header hdr - */ - -void -zmodem_tx_bin32_header(zmodem_t* zm, unsigned char * p) - -{ - int i; - unsigned long crc; - -#ifdef DEBUG - fprintf(stderr,"tx binary header 32 bits crc\n"); -/* zm->raw_trace = 1; */ -#endif - - zmodem_tx_raw(zm, ZPAD); - zmodem_tx_raw(zm, ZPAD); - zmodem_tx_raw(zm, ZDLE); - - if (zm->use_variable_headers) { - zmodem_tx_raw(zm, ZVBIN32); - zmodem_tx(zm, HDRLEN); - } - else { - zmodem_tx_raw(zm, ZBIN32); - } - - crc = 0xffffffffL; - - for (i=0;i<HDRLEN;i++) { - crc = UPDCRC32(*p,crc); - zmodem_tx(zm, *p++); - } - - crc = ~crc; - - zmodem_tx(zm, (uchar)((crc ) & 0xff)); - zmodem_tx(zm, (uchar)((crc >> 8) & 0xff)); - zmodem_tx(zm, (uchar)((crc >> 16) & 0xff)); - zmodem_tx(zm, (uchar)((crc >> 24) & 0xff)); -} - -void -zmodem_tx_bin16_header(zmodem_t* zm, unsigned char * p) - -{ - int i; - unsigned int crc; - -#ifdef DEBUG - fprintf(stderr,"tx binary header 16 bits crc\n"); -#endif - - zmodem_tx_raw(zm, ZPAD); - zmodem_tx_raw(zm, ZPAD); - zmodem_tx_raw(zm, ZDLE); - - if (zm->use_variable_headers) { - zmodem_tx_raw(zm, ZVBIN); - zmodem_tx(zm, HDRLEN); - } - else { - zmodem_tx_raw(zm, ZBIN); - } - - crc = 0; - - for (i=0;i<HDRLEN;i++) { - crc = UPDCRC16(*p,crc); - zmodem_tx(zm, *p++); - } - -/* crc = UPDCRC16(0,crc); */ -/* crc = UPDCRC16(0,crc); */ - - zmodem_tx(zm, (uchar)(crc >> 8)); - zmodem_tx(zm, (uchar)(crc&0xff)); -} - - -/* - * transmit a header using either hex 16 bit crc or binary 32 bit crc - * depending on the receivers capabilities - * we dont bother with variable length headers. I dont really see their - * advantage and they would clutter the code unneccesarily - */ - -void -zmodem_tx_header(zmodem_t* zm, unsigned char * p) - -{ - if (zm->can_fcs_32) { - if (!zm->want_fcs_16) { - zmodem_tx_bin32_header(zm, p); - } - else { - zmodem_tx_bin16_header(zm, p); - } - } - else { - zmodem_tx_hex_header(zm, p); - } -} - -/* - * data subpacket transmission - */ - -void -zmodem_tx_32_data(zmodem_t* zm, uchar sub_frame_type, unsigned char * p, int l) - -{ - unsigned long crc; - -#ifdef DEBUG - fprintf(stderr,"tx_32_data\n"); -#endif - - crc = 0xffffffffl; - - while (l > 0) { - crc = UPDCRC32(*p,crc); - zmodem_tx(zm, *p++); - l--; - } - - crc = UPDCRC32(sub_frame_type, crc); - - zmodem_tx_raw(zm, ZDLE); - zmodem_tx_raw(zm, sub_frame_type); - - crc = ~crc; - - zmodem_tx(zm, (uchar) ((crc ) & 0xff)); - zmodem_tx(zm, (uchar) ((crc >> 8 ) & 0xff)); - zmodem_tx(zm, (uchar) ((crc >> 16) & 0xff)); - zmodem_tx(zm, (uchar) ((crc >> 24) & 0xff)); -} - -void -zmodem_tx_16_data(zmodem_t* zm, uchar sub_frame_type,unsigned char * p,int l) - -{ - unsigned short crc; - -#ifdef DEBUG - fprintf(stderr,"tx_16_data\n"); -#endif - - crc = 0; - - while (l > 0) { - crc = UPDCRC16(*p,crc); - zmodem_tx(zm, *p++); - l--; - } - - crc = UPDCRC16(sub_frame_type,crc); - - zmodem_tx_raw(zm, ZDLE); - zmodem_tx_raw(zm, sub_frame_type); - -/* crc = UPDCRC16(0,crc); */ -/* crc = UPDCRC16(0,crc); */ - - zmodem_tx(zm, (uchar)(crc >> 8)); - zmodem_tx(zm, (uchar)(crc&0xff)); -} - -/* - * send a data subpacket using crc 16 or crc 32 as desired by the receiver - */ - -void -zmodem_tx_data(zmodem_t* zm, uchar sub_frame_type,unsigned char * p, int l) - -{ - if (!zm->want_fcs_16 && zm->can_fcs_32) { - zmodem_tx_32_data(zm, sub_frame_type,p,l); - } - else { - zmodem_tx_16_data(zm, sub_frame_type,p,l); - } - - if (sub_frame_type == ZCRCW) { - zmodem_tx_raw(zm, XON); - } - -} - -void -zmodem_tx_pos_header(zmodem_t* zm, int type,long pos) - -{ - char header[5]; - - header[0] = type; - header[ZP0] = pos & 0xff; - header[ZP1] = (pos >> 8) & 0xff; - header[ZP2] = (pos >> 16) & 0xff; - header[ZP3] = (pos >> 24) & 0xff; - - zmodem_tx_hex_header(zm, header); -} - -void -zmodem_tx_znak(zmodem_t* zm) - -{ - fprintf(stderr,"tx_znak\n"); - - zmodem_tx_pos_header(zm, ZNAK, zm->ack_file_pos); -} - -void -zmodem_tx_zskip(zmodem_t* zm) - -{ - zmodem_tx_pos_header(zm, ZSKIP, 0L); -} - -/* - * receive any style header within timeout milliseconds - */ - -int -zmodem_rx_poll(zmodem_t* zm) -{ - int rd=0; - - socket_check(zm->sock,&rd,NULL,0); - - return(rd); -} - -/* - * rx_raw ; receive a single byte from the line. - * reads as many are available and then processes them one at a time - * check the data stream for 5 consecutive CAN characters; - * and if you see them abort. this saves a lot of clutter in - * the rest of the code; even though it is a very strange place - * for an exit. (but that was wat session abort was all about.) - */ - -int -zmodem_rx_raw(zmodem_t* zm, int to) - -{ - int n; - int c; - - if((c=recv_byte(zm->sock,to,zm->mode)) > 0xff) - return TIMEOUT; - -/* fprintf(stdout,"%02X ",c); */ - - if (c == CAN) { - zm->n_cans++; - if (zm->n_cans == 5) { - fprintf(stderr,"\nCancelled Remotely\n"); - bail(CAN); - } - } - else { - zm->n_cans = 0; - } - - return c; -} - -/* - * rx; receive a single byte undoing any escaping at the - * sending site. this bit looks like a mess. sorry for that - * but there seems to be no other way without incurring a lot - * of overhead. at least like this the path for a normal character - * is relatively short. - */ - - -int -zmodem_rx(zmodem_t* zm, int to) - -{ - int c; - - /* - * outer loop for ever so for sure something valid - * will come in; a timeout will occur or a session abort - * will be received. - */ - - while (TRUE) { - - /* - * fake do loop so we may continue - * in case a character should be dropped. - */ - - do { - c = zmodem_rx_raw(zm, to); - if (c == TIMEOUT) { - return c; - } - - switch (c) { - case ZDLE: - break; - case 0x11: - case 0x91: - case 0x13: - case 0x93: - continue; - default: - /* - * if all control characters should be escaped and - * this one wasnt then its spurious and should be dropped. - */ - if (zm->escape_all_control_characters && (c & 0x60) == 0) { - continue; - } - /* - * normal character; return it. - */ - return c; - } - } while (FALSE); - - /* - * ZDLE encoded sequence or session abort. - * (or something illegal; then back to the top) - */ - - do { - c = zmodem_rx_raw(zm, to); - - if (c == 0x11 || c == 0x13 || c == 0x91 || c == 0x93 || c == ZDLE) { - /* - * these can be dropped. - */ - continue; - } - - switch (c) { - /* - * these four are really nasty. - * for convenience we just change them into - * special characters by setting a bit outside the - * first 8. that way they can be recognized and still - * be processed as characters by the rest of the code. - */ - case ZCRCE: - case ZCRCG: - case ZCRCQ: - case ZCRCW: - return (c | ZDLEESC); - case ZRUB0: - return 0x7f; - case ZRUB1: - return 0xff; - default: - if (zm->escape_all_control_characters && (c & 0x60) == 0) { - /* - * a not escaped control character; probably - * something from a network. just drop it. - */ - continue; - } - /* - * legitimate escape sequence. - * rebuild the orignal and return it. - */ - if ((c & 0x60) == 0x40) { - return c ^ 0x40; - } - break; - } - } while (FALSE); - } - - /* - * not reached. - */ - - return 0; -} - -/* - * receive a data subpacket as dictated by the last received header. - * return 2 with correct packet and end of frame - * return 1 with correct packet frame continues - * return 0 with incorrect frame. - * return TIMEOUT with a timeout - * if an acknowledgement is requested it is generated automatically - * here. - */ - -/* - * data subpacket reception - */ - -int -zmodem_rx_32_data(zmodem_t* zm, unsigned char * p,int * l) - -{ - int c; - unsigned long rxd_crc; - unsigned long crc; - int sub_frame_type; - -#ifdef DEBUG - fprintf(stderr,"rx_32_data\n"); -#endif - - crc = 0xffffffffl; - - do { - c = zmodem_rx(zm, 1); - - if (c == TIMEOUT) { - return TIMEOUT; - } - if (c < 0x100) { - crc = UPDCRC32(c,crc); - *p++ = c; - (*l)++; - continue; - } - } while (c < 0x100); - - sub_frame_type = c & 0xff; - - crc = UPDCRC32(sub_frame_type, crc); - - crc = ~crc; - - rxd_crc = zmodem_rx(zm, 1); - rxd_crc |= zmodem_rx(zm, 1) << 8; - rxd_crc |= zmodem_rx(zm, 1) << 16; - rxd_crc |= zmodem_rx(zm, 1) << 24; - - if (rxd_crc != crc) { - return FALSE; - } - - zm->ack_file_pos += *l; - - return sub_frame_type; -} - -int -zmodem_rx_16_data(zmodem_t* zm, register unsigned char * p,int * l) - -{ - register int c; - int sub_frame_type; - register unsigned short crc; - unsigned short rxd_crc; - -#ifdef DEBUG - fprintf(stderr,"rx_16_data\n"); -#endif - - crc = 0; - - do { - c = zmodem_rx(zm, 5); - - if (c == TIMEOUT) { - return TIMEOUT; - } - if (c < 0x100) { - crc = UPDCRC16(c,crc); - *p++ = c; - (*l)++; - } - } while (c < 0x100); - - sub_frame_type = c & 0xff; - - crc = UPDCRC16(sub_frame_type,crc); - -/* crc = UPDCRC16(0,crc); */ -/* crc = UPDCRC16(0,crc); */ - - rxd_crc = zmodem_rx(zm, 1) << 8; - rxd_crc |= zmodem_rx(zm, 1); - - if (rxd_crc != crc) { - return FALSE; - } - - zm->ack_file_pos += *l; - - return sub_frame_type; -} - -int -zmodem_rx_data(zmodem_t* zm, unsigned char * p, int * l) - -{ - unsigned char zack_header[] = { ZACK, 0, 0, 0, 0 }; - int sub_frame_type; - long pos; - - /* - * fill in the file pointer in case acknowledgement is requested. - * the ack file pointer will be updated in the subpacket read routine; - * so we need to get it now - */ - - pos = zm->ack_file_pos; - - /* - * receive the right type of frame - */ - - *l = 0; - - if (zm->receive_32_bit_data) { - sub_frame_type = zmodem_rx_32_data(zm, p,l); - } - else { - sub_frame_type = zmodem_rx_16_data(zm, p,l); - } - - switch (sub_frame_type) { - case TIMEOUT: - return TIMEOUT; - /* - * frame continues non-stop - */ - case ZCRCG: - return FRAMEOK; - /* - * frame ends - */ - case ZCRCE: - return ENDOFFRAME; - /* - * frame continues; ZACK expected - */ - case ZCRCQ: - zmodem_tx_pos_header(zm, ZACK, pos); - return FRAMEOK; - /* - * frame ends; ZACK expected - */ - case ZCRCW: - zmodem_tx_pos_header(zm, ZACK, pos); - return ENDOFFRAME; - } - - return FALSE; -} - -int -zmodem_rx_nibble(zmodem_t* zm, int to) - -{ - int c; - - c = zmodem_rx(zm, to); - - if (c == TIMEOUT) { - return c; - } - - if (c > '9') { - if (c < 'a' || c > 'f') { - /* - * illegal hex; different than expected. - * we might as well time out. - */ - return TIMEOUT; - } - - c -= 'a' - 10; - } - else { - if (c < '0') { - /* - * illegal hex; different than expected. - * we might as well time out. - */ - return TIMEOUT; - } - c -= '0'; - } - - return c; -} - -int -zmodem_rx_hex(zmodem_t* zm, int to) - -{ - int n1; - int n0; - - n1 = zmodem_rx_nibble(zm, to); - - if (n1 == TIMEOUT) { - return n1; - } - - n0 = zmodem_rx_nibble(zm, to); - - if (n0 == TIMEOUT) { - return n0; - } - - return (n1 << 4) | n0; -} - -/* - * receive routines for each of the six different styles of header. - * each of these leaves zm->rxd_header_len set to 0 if the end result is - * not a valid header. - */ - -void -zmodem_rx_bin16_header(zmodem_t* zm, int to) - -{ - int c; - int n; - unsigned short int crc; - unsigned short int rxd_crc; - -#ifdef DEBUG - fprintf(stderr,"rx binary header 16 bits crc\n"); -#endif - - crc = 0; - - for (n=0;n<5;n++) { - c = zmodem_rx(zm, to); - if (c == TIMEOUT) { -#ifdef DEBUG - fprintf(stderr,"timeout\n"); -#endif - return; - } - crc = UPDCRC16(c,crc); - zm->rxd_header[n] = c; - } - -/* crc = UPDCRC16(0,crc); */ -/* crc = UPDCRC16(0,crc); */ - - rxd_crc = zmodem_rx(zm, 1) << 8; - rxd_crc |= zmodem_rx(zm, 1); - - if (rxd_crc != crc) { -#ifdef DEBUG - fprintf(stderr,"bad crc %4.4x %4.4x\n",rxd_crc,crc); -#endif - return; - } - - zm->rxd_header_len = 5; -} - -void -zmodem_rx_hex_header(zmodem_t* zm, int to) - -{ - int c; - int i; - unsigned short int crc = 0; - unsigned short int rxd_crc; - -#ifdef DEBUG - fprintf(stderr,"rx_hex_header : "); -#endif - for (i=0;i<5;i++) { - c = zmodem_rx_hex(zm, to); - if (c == TIMEOUT) { - return; - } - crc = UPDCRC16(c,crc); - - zm->rxd_header[i] = c; - } - -/* crc = UPDCRC16(0,crc); */ -/* crc = UPDCRC16(0,crc); */ - - /* - * receive the crc - */ - - c = zmodem_rx_hex(zm, to); - - if (c == TIMEOUT) { - return; - } - - rxd_crc = c << 8; - - c = zmodem_rx_hex(zm, to); - - if (c == TIMEOUT) { - return; - } - - rxd_crc |= c; - - if (rxd_crc == crc) { - zm->rxd_header_len = 5; - } -#ifdef DEBUG - else { - fprintf(stderr,"\n!BAD CRC-16: 0x%hX, expected: 0x%hX\n", rxd_crc, crc); - } -#endif - - /* - * drop the end of line sequence after a hex header - */ - c = zmodem_rx(zm, to); - if (c == CR) { - /* - * both are expected with CR - */ - zmodem_rx(zm, to); /* drop LF */ - } -} - -void -zmodem_rx_bin32_header(zmodem_t* zm, int to) - -{ - int c; - int n; - unsigned long crc; - unsigned long rxd_crc; - -#ifdef DEBUG - fprintf(stderr,"rx binary header 32 bits crc\n"); -#endif - - crc = 0xffffffffL; - - for (n=0;n<to;n++) { - c = zmodem_rx(zm, 1); - if (c == TIMEOUT) { - return; - } - crc = UPDCRC32(c,crc); - zm->rxd_header[n] = c; - } - - crc = ~crc; - - rxd_crc = zmodem_rx(zm, 1); - rxd_crc |= zmodem_rx(zm, 1) << 8; - rxd_crc |= zmodem_rx(zm, 1) << 16; - rxd_crc |= zmodem_rx(zm, 1) << 24; - - if (rxd_crc != crc) { - return; - } - - zm->rxd_header_len = 5; -} - -/* - * receive any style header - * if the errors flag is set than whenever an invalid header packet is - * received INVHDR will be returned. otherwise we wait for a good header - * also; a flag (receive_32_bit_data) will be set to indicate whether data - * packets following this header will have 16 or 32 bit data attached. - * variable headers are not implemented. - */ - -int -zmodem_rx_header_raw(zmodem_t* zm, int to,int errors) - -{ - int c; - -#ifdef DEBUG - fprintf(stderr,"rx header : "); -#endif - zm->rxd_header_len = 0; - - do { - do { - c = zmodem_rx_raw(zm, to); - if (c == TIMEOUT) { - fprintf(stderr,"\n%s %d\n",__FILE__,__LINE__); - return c; - } - } while (c != ZPAD); - - c = zmodem_rx_raw(zm, to); - if (c == TIMEOUT) { - fprintf(stderr,"\n%s %d\n",__FILE__,__LINE__); - return c; - } - - if (c == ZPAD) { - c = zmodem_rx_raw(zm, to); - if (c == TIMEOUT) { - fprintf(stderr,"\n%s %d\n",__FILE__,__LINE__); - return c; - } - } - - /* - * spurious ZPAD check - */ - - if (c != ZDLE) { -#ifdef DEBUG - fprintf(stderr,"expected ZDLE; got %c\n",c); -#endif - continue; - } - - /* - * now read the header style - */ - - c = zmodem_rx(zm, to); - - if (c == TIMEOUT) { - fprintf(stderr,"\n%s %d\n",__FILE__,__LINE__); - return c; - } - -#ifdef DEBUG - fprintf(stderr,"\n"); -#endif - switch (c) { - case ZBIN: - zmodem_rx_bin16_header(zm, to); - zm->receive_32_bit_data = FALSE; - break; - case ZHEX: - zmodem_rx_hex_header(zm, to); - zm->receive_32_bit_data = FALSE; - break; - case ZBIN32: - zmodem_rx_bin32_header(zm, to); - zm->receive_32_bit_data = TRUE; - break; - default: - /* - * unrecognized header style - */ -#ifdef DEBUG - fprintf(stderr,"unrecognized header style %c\n",c); -#endif - if (errors) { - return INVHDR; - } - - continue; - } - if (errors && zm->rxd_header_len == 0) { - return INVHDR; - } - - } while (zm->rxd_header_len == 0); - - /* - * this appears to have been a valid header. - * return its type. - */ - - if (zm->rxd_header[0] == ZDATA) { - zm->ack_file_pos = zm->rxd_header[ZP0] | (zm->rxd_header[ZP1] << 8) | - (zm->rxd_header[ZP2] << 16) | (zm->rxd_header[ZP3] << 24); - } - - if (zm->rxd_header[0] == ZFILE) { - zm->ack_file_pos = 0l; - } - -#ifdef DEBUG - fprintf(stderr,"type %d\n",zm->rxd_header[0]); -#endif - - return zm->rxd_header[0]; -} - -int -zmodem_rx_header(zmodem_t* zm, int timeout) - -{ - return zmodem_rx_header_raw(zm, timeout, FALSE); -} - -int -zmodem_rx_header_and_check(zmodem_t* zm, int timeout) - -{ - int type; - while (TRUE) { - type = zmodem_rx_header_raw(zm, timeout,TRUE); - - if (type != INVHDR) { - break; - } - - zmodem_tx_znak(zm); - } - - return type; -} - -void zmodem_parse_zrinit(zmodem_t* zm) -{ - zm->can_full_duplex = (zm->rxd_header[ZF0] & ZF0_CANFDX) != 0; - zm->can_overlap_io = (zm->rxd_header[ZF0] & ZF0_CANOVIO) != 0; - zm->can_break = (zm->rxd_header[ZF0] & ZF0_CANBRK) != 0; - zm->can_fcs_32 = (zm->rxd_header[ZF0] & ZF0_CANFC32) != 0; - zm->escape_all_control_characters = (zm->rxd_header[ZF0] & ZF0_ESCCTL) != 0; - zm->escape_8th_bit = (zm->rxd_header[ZF0] & ZF0_ESC8) != 0; - - zm->use_variable_headers = (zm->rxd_header[ZF1] & ZF1_CANVHDR) != 0; -} - -int zmodem_get_zrinit(zmodem_t* zm) -{ - unsigned char zrqinit_header[] = { ZRQINIT, 0, 0, 0, 0 }; - - zmodem_tx_raw(zm,'r'); - zmodem_tx_raw(zm,'z'); - zmodem_tx_raw(zm,'\r'); - zmodem_tx_hex_header(zm,zrqinit_header); - - return zmodem_rx_header(zm,7); -} - -int zmodem_send_zfin(zmodem_t* zm) -{ - int type; - unsigned char zfin_header[] = { ZFIN, 0, 0, 0, 0 }; - - zmodem_tx_hex_header(zm,zfin_header); - do { - type = zmodem_rx_header(zm,10); - } while (type != ZFIN && type != TIMEOUT); - - /* - * these Os are formally required; but they don't do a thing - * unfortunately many programs require them to exit - * (both programs already sent a ZFIN so why bother ?) - */ - - if (type != TIMEOUT) { - zmodem_tx_raw(zm,'O'); - zmodem_tx_raw(zm,'O'); - } - - return 0; -} - -/* - * show the progress of the transfer like this: - * zmtx: sending file "garbage" 4096 bytes ( 20%) - */ - -void -show_progress(zmodem_t* zm, FILE * fp) - -{ - time_t duration; - int cps; - int percentage; - - if (zm->current_file_size > 0) { - percentage = (ftell(fp) * 100) / zm->current_file_size; - } - else { - percentage = 100; - } - - duration = time(NULL) - zm->transfer_start; - - if (duration == 0l) { - duration = 1l; - } - - cps = ftell(fp) / duration; - - fprintf(stderr,"zmtx: %8ld bytes (%3d %%/%5d cps) \r", - ftell(fp),percentage,cps); -} - -/* - * send from the current position in the file - * all the way to end of file or until something goes wrong. - * (ZNAK or ZRPOS received) - * the name is only used to show progress - */ - -int -send_from(zmodem_t* zm, FILE * fp) - -{ - int n; - long pos; - uchar type = ZCRCG; - char zdata_frame[] = { ZDATA, 0, 0, 0, 0 }; - - /* - * put the file position in the ZDATA frame - */ - - pos = ftell(fp); - zdata_frame[ZP0] = pos & 0xff; - zdata_frame[ZP1] = (pos >> 8) & 0xff; - zdata_frame[ZP2] = (pos >> 16) & 0xff; - zdata_frame[ZP3] = (pos >> 24) & 0xff; - - zmodem_tx_header(zm, zdata_frame); - /* - * send the data in the file - */ - - while (!feof(fp)) { - if (opt_v) { - show_progress(zm, fp); - } - - /* - * read a block from the file - */ - n = fread(zm->tx_data_subpacket,1,sizeof(zm->tx_data_subpacket),fp); - - if (n == 0) { - /* - * nothing to send ? - */ - break; - } - - /* - * at end of file wait for an ACK - */ - if (ftell(fp) == zm->current_file_size) { - type = ZCRCW; - } - - zmodem_tx_data(zm, type, zm->tx_data_subpacket, n); - - if (type == ZCRCW) { - int type; - do { - type = zmodem_rx_header(zm, 10); - if (type == ZNAK || type == ZRPOS) { - return type; - } - } while (type != ZACK); - - if (ftell(fp) == zm->current_file_size) { - if (opt_d) { - fprintf(stderr,"end of file\n"); - } - return ZACK; - } - } - - /* - * characters from the other side - * check out that header - */ - - while (zmodem_rx_poll(zm)) { - int type; - int c; - c = zmodem_rx_raw(zm, 1); - if (c == ZPAD) { - type = zmodem_rx_header(zm, 1); - if (type != TIMEOUT && type != ACK) { - return type; - } - } - } - } - - /* - * end of file reached. - * should receive something... so fake ZACK - */ - - return ZACK; -} - -/* - * send a file; returns true when session is aborted. - * (using ZABORT frame) - */ - -int -zmodem_send_file(zmodem_t* zm, char* name, FILE* fp) - -{ - long pos; - struct stat s; - unsigned char * p; - char zfile_frame[] = { ZFILE, 0, 0, 0, 0 }; - char zeof_frame[] = { ZEOF, 0, 0, 0, 0 }; - int wait_for_header; - int type; - char * n; - - fstat(fileno(fp),&s); - zm->current_file_size = s.st_size; - - /* - * the file exists. now build the ZFILE frame - */ - - /* - * set conversion option - * (not used; always binary) - */ - - zfile_frame[ZF0] = ZF0_ZCBIN; - - /* - * management option - */ - - if (zm->management_protect) { - zfile_frame[ZF1] = ZF1_ZMPROT; - if (opt_d) { - fprintf(stderr,"zmtx: protecting destination\n"); - } - } - - if (zm->management_clobber) { - zfile_frame[ZF1] = ZF1_ZMCLOB; - if (opt_d) { - fprintf(stderr,"zmtx: overwriting destination\n"); - } - } - - if (zm->management_newer) { - zfile_frame[ZF1] = ZF1_ZMNEW; - if (opt_d) { - fprintf(stderr,"zmtx: overwriting destination if newer\n"); - } - } - - /* - * transport options - * (just plain normal transfer) - */ - - zfile_frame[ZF2] = ZF2_ZTNOR; - - /* - * extended options - */ - - zfile_frame[ZF3] = 0; - - /* - * now build the data subpacket with the file name and lots of other - * useful information. - */ - - /* - * first enter the name and a 0 - */ - - p = zm->tx_data_subpacket; - - strcpy(p,name); - - p += strlen(p) + 1; - - sprintf(p,"%lu %lo %lo %d %u %lu %d" - ,s.st_size - ,s.st_mtime - ,0 /* file mode */ - ,0 /* serial number */ - ,zm->n_files_remaining - ,zm->n_bytes_remaining - ,0 /* file type */ - ); - - p += strlen(p) + 1; - - do { - /* - * send the header and the data - */ - - zmodem_tx_header(zm,zfile_frame); - zmodem_tx_data(zm,ZCRCW,zm->tx_data_subpacket,p - zm->tx_data_subpacket); - - /* - * wait for anything but an ZACK packet - */ - - do { - type = zmodem_rx_header(zm,10); - } while (type == ZACK); - - if (opt_d) { - fprintf(stderr,"type : %d\n",type); - } - - if (type == ZSKIP) { - fclose(fp); - if (opt_v) { - fprintf(stderr,"zmtx: skipped file \"%s\" \n",name); - } - return -1; - } - - } while (type != ZRPOS); - - zm->transfer_start = time(NULL); - - do { - /* - * fetch pos from the ZRPOS header - */ - - if (type == ZRPOS) { - pos = zm->rxd_header[ZP0] | (zm->rxd_header[ZP1] << 8) | (zm->rxd_header[ZP2] << 16) | (zm->rxd_header[ZP3] << 24); - } - - /* - * seek to the right place in the file - */ - fseek(fp,pos,0); - - /* - * and start sending - */ - - type = send_from(zm,fp); - - if (type == ZFERR || type == ZABORT) { - fclose(fp); - return -1; - } - - } while (type == ZRPOS || type == ZNAK); - - /* - * file sent. send end of file frame - * and wait for zrinit. if it doesnt come then try again - */ - - zeof_frame[ZP0] = s.st_size & 0xff; - zeof_frame[ZP1] = (s.st_size >> 8) & 0xff; - zeof_frame[ZP2] = (s.st_size >> 16) & 0xff; - zeof_frame[ZP3] = (s.st_size >> 24) & 0xff; - - do { - zmodem_tx_hex_header(zm,zeof_frame); - type = zmodem_rx_header(zm,10); - } while (type != ZRINIT); - - /* - * and close the input file - */ - - if (opt_v) { - fprintf(stderr,"zmtx: sent file \"%s\" \n",name); - } - - fclose(fp); - - return 0; -} - -#if 0 - -zmodem_send_files(char** fname, int total_files) -{ - int i; - int fnum; - char * s; - - /* - * clear the input queue from any possible garbage - * this also clears a possible ZRINIT from an already started - * zmodem receiver. this doesn't harm because we reinvite to - * receive again below and it may be that the receiver whose - * ZRINIT we are about to wipe has already died. - */ - - zmodem_rx_purge(); - - /* - * establish contact with the receiver - */ - - if (opt_v) { - fprintf(stderr,"zmtx: establishing contact with receiver\n"); - } - - i = 0; - do { - unsigned char zrqinit_header[] = { ZRQINIT, 0, 0, 0, 0 }; - i++; - if (i > 10) { - fprintf(stderr,"zmtx: can't establish contact with receiver\n"); - bail(3); - } - - zmodem_tx_raw('r'); - zmodem_tx_raw('z'); - zmodem_tx_raw('\r'); - zmodem_tx_hex_header(zrqinit_header); - } while (zmodem_rx_header(7) != ZRINIT); - - if (opt_v) { - fprintf(stderr,"zmtx: contact established\n"); - fprintf(stderr,"zmtx: starting file transfer\n"); - } - - /* - * decode receiver capability flags - * forget about encryption and compression. - */ - - zmodem_can_full_duplex = (zm->rxd_header[ZF0] & ZF0_CANFDX) != 0; - zmodem_can_overlap_io = (zm->rxd_header[ZF0] & ZF0_CANOVIO) != 0; - zmodem_can_break = (zm->rxd_header[ZF0] & ZF0_CANBRK) != 0; - zmodem_can_fcs_32 = (zm->rxd_header[ZF0] & ZF0_CANFC32) != 0; - zmodem_escape_all_control_characters = (zm->rxd_header[ZF0] & ZF0_ESCCTL) != 0; - zmodem_escape_8th_bit = (zm->rxd_header[ZF0] & ZF0_ESC8) != 0; - - zm->use_variable_headers = (zm->rxd_header[ZF1] & ZF1_CANVHDR) != 0; - - if (opt_d) { - fprintf(stderr,"receiver %s full duplex\n" ,zmodem_can_full_duplex ? "can" : "can't"); - fprintf(stderr,"receiver %s overlap io\n" ,zmodem_can_overlap_io ? "can" : "can't"); - fprintf(stderr,"receiver %s break\n" ,zmodem_can_break ? "can" : "can't"); - fprintf(stderr,"receiver %s fcs 32\n" ,zmodem_can_fcs_32 ? "can" : "can't"); - fprintf(stderr,"receiver %s escaped control chars\n",zmodem_escape_all_control_characters ? "requests" : "doesn't request"); - fprintf(stderr,"receiver %s escaped 8th bit\n" ,zmodem_escape_8th_bit ? "requests" : "doesn't request"); - fprintf(stderr,"receiver %s use variable headers\n" ,zm->use_variable_headers ? "can" : "can't"); - } - - /* - * and send each file in turn - */ - - n_files_remaining = total_files; - - for(fnum=0;fnum<total_files;fnum++) { - if(send_file(fname[fnum])) { - if (opt_v) { - fprintf(stderr,"zmtx: remote aborted.\n"); - } - break; - } - n_files_remaining--; - } - - /* - * close the session - */ - - if (opt_v) { - fprintf(stderr,"zmtx: closing the session\n"); - } - - { - int type; - unsigned char zfin_header[] = { ZFIN, 0, 0, 0, 0 }; - - zmodem_tx_hex_header(zfin_header); - do { - type = zmodem_rx_header(10); - } while (type != ZFIN && type != TIMEOUT); - - /* - * these Os are formally required; but they don't do a thing - * unfortunately many programs require them to exit - * (both programs already sent a ZFIN so why bother ?) - */ - - if (type != TIMEOUT) { - zmodem_tx_raw('O'); - zmodem_tx_raw('O'); - } - } - - /* - * c'est fini - */ - - if (opt_d) { - fprintf(stderr,"zmtx: cleanup and exit\n"); - } - - return 0; -} - - - - - - -#endif diff --git a/src/stp/zmodem.h b/src/stp/zmodem.h deleted file mode 100644 index 4e2ef44636..0000000000 --- a/src/stp/zmodem.h +++ /dev/null @@ -1,248 +0,0 @@ -/* - * zmodem.h - * zmodem constants - * (C) Mattheij Computer Service 1994 - */ - -#ifndef _ZMODEM_H - -#define _ZMODEM_H - -/* - * ascii constants - */ - -#ifndef SOH -#define SOH 0x01 -#define STX 0x02 -#define EOT 0x04 -#define ENQ 0x05 -#define ACK 0x06 -#if 0 -#define LF 0x0a -#define CR 0x0d -#endif -#define XON 0x11 -#define XOFF 0x13 -#define NAK 0x15 -#define CAN 0x18 -#endif - -/* - * zmodem constants - */ - -#define ZMAXHLEN 0x10 /* maximum header information length */ -#define ZMAXSPLEN 0x400 /* maximum subpacket length */ - - -#define ZPAD 0x2a /* pad character; begins frames */ -#define ZDLE 0x18 /* ctrl-x zmodem escape */ -#define ZDLEE 0x58 /* escaped ZDLE */ - -#define ZBIN 0x41 /* binary frame indicator (CRC16) */ -#define ZHEX 0x42 /* hex frame indicator */ -#define ZBIN32 0x43 /* binary frame indicator (CRC32) */ -#define ZBINR32 0x44 /* run length encoded binary frame (CRC32) */ - -#define ZVBIN 0x61 /* binary frame indicator (CRC16) */ -#define ZVHEX 0x62 /* hex frame indicator */ -#define ZVBIN32 0x63 /* binary frame indicator (CRC32) */ -#define ZVBINR32 0x64 /* run length encoded binary frame (CRC32) */ - -#define ZRESC 0x7e /* run length encoding flag / escape character */ - -/* - * zmodem frame types - */ - -#define ZRQINIT 0x00 /* request receive init (s->r) */ -#define ZRINIT 0x01 /* receive init (r->s) */ -#define ZSINIT 0x02 /* send init sequence (optional) (s->r) */ -#define ZACK 0x03 /* ack to ZRQINIT ZRINIT or ZSINIT (s<->r) */ -#define ZFILE 0x04 /* file name (s->r) */ -#define ZSKIP 0x05 /* skip this file (r->s) */ -#define ZNAK 0x06 /* last packet was corrupted (?) */ -#define ZABORT 0x07 /* abort batch transfers (?) */ -#define ZFIN 0x08 /* finish session (s<->r) */ -#define ZRPOS 0x09 /* resume data transmission here (r->s) */ -#define ZDATA 0x0a /* data packet(s) follow (s->r) */ -#define ZEOF 0x0b /* end of file reached (s->r) */ -#define ZFERR 0x0c /* fatal read or write error detected (?) */ -#define ZCRC 0x0d /* request for file CRC and response (?) */ -#define ZCHALLENGE 0x0e /* security challenge (r->s) */ -#define ZCOMPL 0x0f /* request is complete (?) */ -#define ZCAN 0x10 /* pseudo frame; - other end cancelled session with 5* CAN */ -#define ZFREECNT 0x11 /* request free bytes on file system (s->r) */ -#define ZCOMMAND 0x12 /* issue command (s->r) */ -#define ZSTDERR 0x13 /* output data to stderr (??) */ - -/* - * ZDLE sequences - */ - -#define ZCRCE 0x68 /* CRC next, frame ends, header packet follows */ -#define ZCRCG 0x69 /* CRC next, frame continues nonstop */ -#define ZCRCQ 0x6a /* CRC next, frame continuous, ZACK expected */ -#define ZCRCW 0x6b /* CRC next, frame ends, ZACK expected */ -#define ZRUB0 0x6c /* translate to rubout 0x7f */ -#define ZRUB1 0x6d /* translate to rubout 0xff */ - -/* - * frame specific data. - * entries are prefixed with their location in the header array. - */ - -/* - * Byte positions within header array - */ - -#define FTYPE 0 /* frame type */ - -#define ZF0 4 /* First flags byte */ -#define ZF1 3 -#define ZF2 2 -#define ZF3 1 - -#define ZP0 1 /* Low order 8 bits of position */ -#define ZP1 2 -#define ZP2 3 -#define ZP3 4 /* High order 8 bits of file position */ - -/* - * ZRINIT frame - * zmodem receiver capability flags - */ - -#define ZF0_CANFDX 0x01 /* Receiver can send and receive true full duplex */ -#define ZF0_CANOVIO 0x02 /* receiver can receive data during disk I/O */ -#define ZF0_CANBRK 0x04 /* receiver can send a break signal */ -#define ZF0_CANCRY 0x08 /* Receiver can decrypt DONT USE */ -#define ZF0_CANLZW 0x10 /* Receiver can uncompress DONT USE */ -#define ZF0_CANFC32 0x20 /* Receiver can use 32 bit Frame Check */ -#define ZF0_ESCCTL 0x40 /* Receiver expects ctl chars to be escaped */ -#define ZF0_ESC8 0x80 /* Receiver expects 8th bit to be escaped */ - -#define ZF1_CANVHDR 0x01 /* Variable headers OK */ - -/* - * ZSINIT frame - * zmodem sender capability - */ - -#define ZF0_TESCCTL 0x40 /* Transmitter expects ctl chars to be escaped */ -#define ZF0_TESC8 0x80 /* Transmitter expects 8th bit to be escaped */ - -#define ZATTNLEN 0x20 /* Max length of attention string */ -#define ALTCOFF ZF1 /* Offset to alternate canit string, 0 if not used */ - -/* - * ZFILE frame - */ - -/* - * Conversion options one of these in ZF0 - */ - -#define ZF0_ZCBIN 1 /* Binary transfer - inhibit conversion */ -#define ZF0_ZCNL 2 /* Convert NL to local end of line convention */ -#define ZF0_ZCRESUM 3 /* Resume interrupted file transfer */ - -/* - * Management include options, one of these ored in ZF1 - */ - -#define ZF1_ZMSKNOLOC 0x80 /* Skip file if not present at rx */ -#define ZF1_ZMMASK 0x1f /* Mask for the choices below */ -#define ZF1_ZMNEWL 1 /* Transfer if source newer or longer */ -#define ZF1_ZMCRC 2 /* Transfer if different file CRC or length */ -#define ZF1_ZMAPND 3 /* Append contents to existing file (if any) */ -#define ZF1_ZMCLOB 4 /* Replace existing file */ -#define ZF1_ZMNEW 5 /* Transfer if source newer */ -#define ZF1_ZMDIFF 6 /* Transfer if dates or lengths different */ -#define ZF1_ZMPROT 7 /* Protect destination file */ -#define ZF1_ZMCHNG 8 /* Change filename if destination exists */ - -/* - * Transport options, one of these in ZF2 - */ - -#define ZF2_ZTNOR 0 /* no compression */ -#define ZF2_ZTLZW 1 /* Lempel-Ziv compression */ -#define ZF2_ZTRLE 3 /* Run Length encoding */ - -/* - * Extended options for ZF3, bit encoded - */ - -#define ZF3_ZCANVHDR 0x01 /* Variable headers OK */ - /* Receiver window size override */ -#define ZF3_ZRWOVR 0x04 /* byte position for receive window override/256 */ -#define ZF3_ZXSPARS 0x40 /* encoding for sparse file operations */ - -/* - * ZCOMMAND frame - */ - -#define ZF0_ZCACK1 0x01 /* Acknowledge, then do command */ - -typedef struct { - - SOCKET sock; /* socket descriptor */ - - unsigned char rxd_header[ZMAXHLEN]; /* last received header */ - int rxd_header_len; /* last received header size */ - - /* - * receiver capability flags - * extracted from the ZRINIT frame as received - */ - - int can_full_duplex; - int can_overlap_io; - int can_break; - int can_fcs_32; - int want_fcs_16; - int escape_all_control_characters; /* guess */ - int escape_8th_bit; - - int use_variable_headers; /* use variable length headers */ - - /* - * file management options. - * only one should be on - */ - - int management_newer; - int management_clobber; - int management_protect; - - /* from zmtx.c */ - - #define MAX_SUBPACKETSIZE 1024 - - int n_files_remaining; - int n_bytes_remaining; - unsigned char tx_data_subpacket[MAX_SUBPACKETSIZE]; - - long current_file_size; - time_t transfer_start; - - int receive_32_bit_data; - int raw_trace; - int use_crc16; - long ack_file_pos; /* file position used in acknowledgement of correctly */ - /* received data subpackets */ - - int last_sent; - - int n_cans; - - long mode; - -} zmodem_t; - -#endif - - -- GitLab