internal zmodem upload works
This commit is contained in:
parent
29a5f8f952
commit
9083842cbf
@ -35,7 +35,7 @@ v0.71.0 27-Oct-2004
|
||||
from the users upload directory.
|
||||
We don't reward upload time anymore, only bytes. It's more
|
||||
troubles to implement right then it's worth these days.
|
||||
Added internal zmodem download protocol.
|
||||
Added internal zmodem download and upload protocol.
|
||||
With user chat, the timeout timer wasn't refreshed.
|
||||
|
||||
mbnewusr:
|
||||
|
@ -107,7 +107,7 @@ funcs.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h ../lib/msgtex
|
||||
mail.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h ../lib/nodelist.h ../lib/msgtext.h ../lib/msg.h mail.h funcs.h input.h language.h misc.h timeout.h oneline.h exitinfo.h lineedit.h fsedit.h filesub.h msgutil.h pop3.h email.h door.h whoson.h term.h ttyio.h openport.h
|
||||
term.o: ../config.h ../lib/mbselib.h ../lib/users.h term.h ttyio.h
|
||||
ttyio.o: ../config.h ../lib/mbselib.h ttyio.h
|
||||
openport.o: ../config.h ../lib/mbselib.h ttyio.h openport.h
|
||||
openport.o: ../config.h ../lib/mbselib.h ttyio.h openport.h zmmisc.h
|
||||
newuser.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h funcs.h input.h newuser.h language.h timeout.h change.h dispfile.h term.h ttyio.h openport.h
|
||||
pinfo.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h pinfo.h input.h term.h ttyio.h
|
||||
timecheck.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h timecheck.h funcs.h bye.h exitinfo.h language.h input.h term.h ttyio.h
|
||||
@ -134,6 +134,6 @@ timestats.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h timestats
|
||||
logentry.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h logentry.h
|
||||
zmrle.o: ../config.h ../lib/mbselib.h ttyio.h zmrle.h zmmisc.h
|
||||
zmmisc.o: ../config.h ../lib/mbselib.h ttyio.h zmrle.h zmmisc.h
|
||||
zmsend.o: ../config.h ../lib/mbselib.h ttyio.h zmmisc.h zmrle.h transfer.h
|
||||
zmrecv.o: ../config.h ../lib/mbselib.h ../lib/users.h ttyio.h transfer.h zmmisc.h zmrecv.h
|
||||
zmsend.o: ../config.h ../lib/mbselib.h ttyio.h zmmisc.h zmrle.h transfer.h openport.h
|
||||
zmrecv.o: ../config.h ../lib/mbselib.h ../lib/users.h ttyio.h transfer.h zmmisc.h zmrecv.h openport.h
|
||||
# End of generated dependencies
|
||||
|
@ -328,7 +328,7 @@ void Download(void)
|
||||
* Checking the successfull sent files, they are missing from
|
||||
* the ./tag directory. Failed files are still there.
|
||||
*/
|
||||
Enter(1);
|
||||
PUTCHAR('\r');
|
||||
/* Updating download counters, please wait ... */
|
||||
pout(LIGHTCYAN, BLACK, (char *) Language(352));
|
||||
Count = Size = 0;
|
||||
|
@ -31,12 +31,77 @@
|
||||
#include "../lib/mbselib.h"
|
||||
#include "ttyio.h"
|
||||
#include "openport.h"
|
||||
#include "zmmisc.h"
|
||||
|
||||
|
||||
int hanged_up = 0;
|
||||
static int termios_saved = FALSE; /* Is termios saved */
|
||||
static struct termios savetios; /* Saved termios */
|
||||
static struct termios tios;
|
||||
static struct termios oldtty; /* Saved termios */
|
||||
static struct termios tty;
|
||||
unsigned Baudrate = 2400;
|
||||
|
||||
|
||||
#define HOWMANY 255
|
||||
|
||||
|
||||
static struct {
|
||||
unsigned baudr;
|
||||
speed_t speedcode;
|
||||
} speeds[] = {
|
||||
{110, B110},
|
||||
{300, B300},
|
||||
{600, B600},
|
||||
{1200, B1200},
|
||||
{2400, B2400},
|
||||
{4800, B4800},
|
||||
{9600, B9600},
|
||||
#ifdef B12000
|
||||
{12000, B12000},
|
||||
#endif
|
||||
#ifdef B14400
|
||||
{14400, B14400},
|
||||
#endif
|
||||
#ifdef B19200
|
||||
{19200, B19200},
|
||||
#endif
|
||||
#ifdef B38400
|
||||
{38400, B38400},
|
||||
#endif
|
||||
#ifdef B57600
|
||||
{57600, B57600},
|
||||
#endif
|
||||
#ifdef B115200
|
||||
{115200, B115200},
|
||||
#endif
|
||||
#ifdef B230400
|
||||
{230400, B230400},
|
||||
#endif
|
||||
#ifdef B460800
|
||||
{460800, B460800},
|
||||
#endif
|
||||
#ifdef B500000
|
||||
{500000, B500000},
|
||||
#endif
|
||||
#ifdef EXTA
|
||||
{19200, EXTA},
|
||||
#endif
|
||||
#ifdef EXTB
|
||||
{38400, EXTB},
|
||||
#endif
|
||||
{0, 0}
|
||||
};
|
||||
|
||||
|
||||
|
||||
unsigned getspeed(speed_t);
|
||||
unsigned getspeed(speed_t code)
|
||||
{
|
||||
int n;
|
||||
|
||||
for (n = 0; speeds[n].baudr; ++n)
|
||||
if (speeds[n].speedcode == code)
|
||||
return speeds[n].baudr;
|
||||
return 38400; /* Assume fifo if ioctl failed */
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -61,8 +126,8 @@ void hangup(void)
|
||||
|
||||
cflag = Tios.c_cflag | CLOCAL;
|
||||
|
||||
ispeed = cfgetispeed(&tios);
|
||||
ospeed = cfgetospeed(&tios);
|
||||
ispeed = cfgetispeed(&tty);
|
||||
ospeed = cfgetospeed(&tty);
|
||||
cfsetispeed(&Tios,0);
|
||||
cfsetospeed(&Tios,0);
|
||||
if ((rc = tcsetattr(0,TCSADRAIN,&Tios)))
|
||||
@ -85,59 +150,122 @@ void hangup(void)
|
||||
|
||||
|
||||
/*
|
||||
* Put the current opened tty in raw mode.
|
||||
* mode(n)
|
||||
* 3: save old tty stat, set raw mode with flow control
|
||||
* 2: set XON/XOFF for sb/sz with ZMODEM or YMODEM-g
|
||||
* 1: save old tty stat, set raw mode
|
||||
* 0: restore original tty mode
|
||||
*/
|
||||
int io_mode(int fd, int n)
|
||||
{
|
||||
static int did0 = FALSE;
|
||||
|
||||
Syslog('t', "io_mode(%d, %d)", fd, n);
|
||||
|
||||
switch(n) {
|
||||
case 2: /* Un-raw mode used by sz, sb when -g detected */
|
||||
if(!did0) {
|
||||
did0 = TRUE;
|
||||
tcgetattr(fd,&oldtty);
|
||||
}
|
||||
tty = oldtty;
|
||||
|
||||
tty.c_iflag = BRKINT|IXON;
|
||||
|
||||
tty.c_oflag = 0; /* Transparent output */
|
||||
|
||||
tty.c_cflag &= ~PARENB; /* Disable parity */
|
||||
tty.c_cflag |= CS8; /* Set character size = 8 */
|
||||
// if (Twostop)
|
||||
// tty.c_cflag |= CSTOPB; /* Set two stop bits */
|
||||
#ifdef READCHECK
|
||||
tty.c_lflag = protocol==ZM_ZMODEM ? 0 : ISIG;
|
||||
tty.c_cc[VINTR] = protocol==ZM_ZMODEM ? -1 : 030; /* Interrupt char */
|
||||
#else
|
||||
tty.c_lflag = 0;
|
||||
tty.c_cc[VINTR] = protocol==ZM_ZMODEM ? 03 : 030; /* Interrupt char */
|
||||
#endif
|
||||
#ifdef _POSIX_VDISABLE
|
||||
if (((int) _POSIX_VDISABLE)!=(-1)) {
|
||||
tty.c_cc[VQUIT] = _POSIX_VDISABLE; /* Quit char */
|
||||
} else {
|
||||
tty.c_cc[VQUIT] = -1; /* Quit char */
|
||||
}
|
||||
#else
|
||||
tty.c_cc[VQUIT] = -1; /* Quit char */
|
||||
#endif
|
||||
#ifdef NFGVMIN
|
||||
tty.c_cc[VMIN] = 1;
|
||||
#else
|
||||
tty.c_cc[VMIN] = 3; /* This many chars satisfies reads */
|
||||
#endif
|
||||
tty.c_cc[VTIME] = 1; /* or in this many tenths of seconds */
|
||||
|
||||
tcsetattr(fd,TCSADRAIN,&tty);
|
||||
|
||||
return 0;
|
||||
case 1:
|
||||
case 3:
|
||||
if(!did0) {
|
||||
did0 = TRUE;
|
||||
tcgetattr(fd,&oldtty);
|
||||
}
|
||||
tty = oldtty;
|
||||
|
||||
tty.c_iflag = IGNBRK;
|
||||
if (n==3) /* with flow control */
|
||||
tty.c_iflag |= IXOFF;
|
||||
|
||||
/* Setup raw mode: no echo, noncanonical (no edit chars),
|
||||
* no signal generating chars, and no extended chars (^V,
|
||||
* ^O, ^R, ^W).
|
||||
*/
|
||||
tty.c_lflag &= ~(ECHO | ICANON | ISIG | IEXTEN);
|
||||
tty.c_oflag = 0; /* Transparent output */
|
||||
|
||||
tty.c_cflag &= ~(PARENB); /* Same baud rate, disable parity */
|
||||
/* Set character size = 8 */
|
||||
tty.c_cflag &= ~(CSIZE);
|
||||
tty.c_cflag |= CS8;
|
||||
// if (Twostop)
|
||||
// tty.c_cflag |= CSTOPB; /* Set two stop bits */
|
||||
#ifdef NFGVMIN
|
||||
tty.c_cc[VMIN] = 1; /* This many chars satisfies reads */
|
||||
#else
|
||||
tty.c_cc[VMIN] = HOWMANY; /* This many chars satisfies reads */
|
||||
#endif
|
||||
tty.c_cc[VTIME] = 1; /* or in this many tenths of seconds */
|
||||
tcsetattr(fd,TCSADRAIN,&tty);
|
||||
Baudrate = getspeed(cfgetospeed(&tty));
|
||||
Syslog('t', "Baudrate = %d", Baudrate);
|
||||
return 0;
|
||||
case 0:
|
||||
if(!did0)
|
||||
return ERROR;
|
||||
tcdrain (fd); /* wait until everything is sent */
|
||||
tcflush (fd,TCIOFLUSH); /* flush input queue */
|
||||
tcsetattr (fd,TCSADRAIN,&oldtty);
|
||||
tcflow (fd,TCOON); /* restart output */
|
||||
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int rawport(void)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
Syslog('t', "rawport()");
|
||||
tty_status = 0;
|
||||
|
||||
if (isatty(0)) {
|
||||
if ((rc = tcgetattr(0,&savetios))) {
|
||||
WriteError("$tcgetattr(0,save) return %d",rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
termios_saved = TRUE;
|
||||
tios = savetios;
|
||||
tios.c_iflag &= ~(INLCR | ICRNL | ISTRIP | IXON ); /* IUCLC removed for FreeBSD */
|
||||
/*
|
||||
* Map CRNL modes strip control characters and flow control
|
||||
*/
|
||||
tios.c_oflag &= ~OPOST; /* Don't do ouput character translation */
|
||||
tios.c_lflag &= ~(ICANON | ECHO); /* No canonical input and no echo */
|
||||
tios.c_cc[VMIN] = 1; /* Receive 1 character at a time */
|
||||
tios.c_cc[VTIME] = 0; /* No time limit per character */
|
||||
|
||||
if ((rc = tcsetattr(0,TCSADRAIN,&tios)))
|
||||
WriteError("$tcsetattr(0,TCSADRAIN,raw) return %d",rc);
|
||||
} else {
|
||||
Syslog('t', "not at a tty");
|
||||
}
|
||||
return rc;
|
||||
return io_mode(0, 1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
int cookedport(void)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
Syslog('t', "cookedport()");
|
||||
|
||||
if (termios_saved == FALSE) {
|
||||
WriteError("Can't restore termios before it was saved");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (isatty(0)) {
|
||||
if ((rc = tcsetattr(0,TCSAFLUSH,&savetios)))
|
||||
WriteError("$tcsetattr(0,TCSAFLUSH,save) return %d", rc);
|
||||
}
|
||||
|
||||
return rc;
|
||||
return io_mode(0, 0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
int io_mode(int, int);
|
||||
void hangup(void);
|
||||
int rawport(void);
|
||||
int cookedport(void);
|
||||
|
177
mbsebbs/zmmisc.c
177
mbsebbs/zmmisc.c
@ -51,8 +51,8 @@
|
||||
*/
|
||||
|
||||
static void zputhex(int);
|
||||
static void zsbh32(int,char*,int,int);
|
||||
static void zsda32(char*,int,int);
|
||||
static void zsbh32(char*, int);
|
||||
static void zsda32(char*, int, int);
|
||||
static int zrdat32(char*,int);
|
||||
static int noxrd7(void);
|
||||
static int zrbhd32(char*);
|
||||
@ -75,11 +75,13 @@ static void garbitch(void);
|
||||
*/
|
||||
static int Rxtimeout = 10; /* Seconds to wait for something */
|
||||
|
||||
int Rxhlen; /* Length of header received */
|
||||
// int Rxhlen; /* Length of header received */
|
||||
char *txbuf=NULL;
|
||||
static int lastsent; /* Last char we sent */
|
||||
static int Not8bit; /* Seven bits seen on header */
|
||||
|
||||
extern unsigned Baudrate;
|
||||
|
||||
|
||||
char *frametypes[] = {
|
||||
(char *)"EMPTY", /* -16 */
|
||||
@ -159,12 +161,12 @@ void free_frame_buffer(void)
|
||||
/*
|
||||
* Send ZMODEM binary header hdr of type type
|
||||
*/
|
||||
void zsbhdr(int len, int type, register char *shdr)
|
||||
void zsbhdr(int type, char *shdr)
|
||||
{
|
||||
register int n;
|
||||
register unsigned short crc;
|
||||
|
||||
Syslog('z', "zsbhdr: %c %d %s %lx", Usevhdrs?'v':'f', len, frametypes[type+FTOFFSET], rclhdr(shdr));
|
||||
Syslog('z', "zsbhdr: %s %lx", frametypes[type+FTOFFSET], rclhdr(shdr));
|
||||
|
||||
BUFFER_CLEAR();
|
||||
|
||||
@ -176,20 +178,16 @@ void zsbhdr(int len, int type, register char *shdr)
|
||||
BUFFER_BYTE(ZDLE);
|
||||
|
||||
switch (Crc32t=Txfcs32) {
|
||||
case 2: zsbh32(len, shdr, type, Usevhdrs?ZVBINR32:ZBINR32);
|
||||
case 2: zsbh32(shdr, type);
|
||||
BUFFER_FLUSH();
|
||||
break;
|
||||
case 1: zsbh32(len, shdr, type, Usevhdrs?ZVBIN32:ZBIN32);
|
||||
case 1: zsbh32(shdr, type);
|
||||
break;
|
||||
default: if (Usevhdrs) {
|
||||
BUFFER_BYTE(ZVBIN);
|
||||
zsendline(len);
|
||||
} else
|
||||
BUFFER_BYTE(ZBIN);
|
||||
default: BUFFER_BYTE(ZBIN);
|
||||
zsendline(type);
|
||||
crc = updcrc16(type, 0);
|
||||
|
||||
for (n=len; --n >= 0; ++shdr) {
|
||||
for (n=4; --n >= 0; ++shdr) {
|
||||
zsendline(*shdr);
|
||||
crc = updcrc16((0377& *shdr), crc);
|
||||
}
|
||||
@ -206,19 +204,17 @@ void zsbhdr(int len, int type, register char *shdr)
|
||||
/*
|
||||
* Send ZMODEM binary header hdr of type type
|
||||
*/
|
||||
void zsbh32(int len, register char *shdr, int type, int flavour)
|
||||
void zsbh32(char *shdr, int type)
|
||||
{
|
||||
register int n;
|
||||
register unsigned long crc;
|
||||
|
||||
BUFFER_BYTE(flavour);
|
||||
if (Usevhdrs)
|
||||
zsendline(len);
|
||||
BUFFER_BYTE(ZBIN32);
|
||||
zsendline(type);
|
||||
crc = 0xFFFFFFFFL;
|
||||
crc = updcrc32(type, crc);
|
||||
|
||||
for (n=len; --n >= 0; ++shdr) {
|
||||
for (n=4; --n >= 0; ++shdr) {
|
||||
crc = updcrc32((0377 & *shdr), crc);
|
||||
zsendline(*shdr);
|
||||
}
|
||||
@ -234,33 +230,30 @@ void zsbh32(int len, register char *shdr, int type, int flavour)
|
||||
/*
|
||||
* Send ZMODEM HEX header hdr of type type
|
||||
*/
|
||||
void zshhdr(int len, int type, register char *shdr)
|
||||
void zshhdr(int type, register char *shdr)
|
||||
{
|
||||
register int n;
|
||||
register unsigned short crc;
|
||||
|
||||
Syslog('z', "zshhdr: %c %d %s %lx", Usevhdrs?'v':'f', len, frametypes[type+FTOFFSET], rclhdr(shdr));
|
||||
Syslog('z', "zshhdr: %s %lx", frametypes[type+FTOFFSET], rclhdr(shdr));
|
||||
|
||||
BUFFER_CLEAR();
|
||||
|
||||
BUFFER_BYTE(ZPAD);
|
||||
BUFFER_BYTE(ZPAD);
|
||||
BUFFER_BYTE(ZDLE);
|
||||
if (Usevhdrs) {
|
||||
BUFFER_BYTE(ZVHEX);
|
||||
zputhex(len);
|
||||
} else
|
||||
BUFFER_BYTE(ZHEX);
|
||||
zputhex(type);
|
||||
BUFFER_BYTE(ZHEX);
|
||||
zputhex(type & 0x7f);
|
||||
Crc32t = 0;
|
||||
|
||||
crc = updcrc16(type, 0);
|
||||
for (n=len; --n >= 0; ++shdr) {
|
||||
crc = updcrc16((type & 0x7f), 0);
|
||||
for (n=4; --n >= 0; ++shdr) {
|
||||
zputhex(*shdr);
|
||||
crc = updcrc16((0377 & *shdr), crc);
|
||||
}
|
||||
crc = updcrc16(0,updcrc16(0,crc));
|
||||
zputhex(((int)(crc>>8))); zputhex(crc);
|
||||
zputhex(((int)(crc>>8)));
|
||||
zputhex(crc);
|
||||
|
||||
/*
|
||||
* Make it printable on remote machine
|
||||
@ -291,24 +284,23 @@ void zsdata(register char *buf, int length, int frameend)
|
||||
|
||||
BUFFER_CLEAR();
|
||||
|
||||
switch (Crc32t) {
|
||||
case 1: zsda32(buf, length, frameend);
|
||||
break;
|
||||
case 2: zsdar32(buf, length, frameend);
|
||||
break;
|
||||
default: crc = 0;
|
||||
for (;--length >= 0; ++buf) {
|
||||
zsendline(*buf);
|
||||
crc = updcrc16((0377 & *buf), crc);
|
||||
}
|
||||
BUFFER_BYTE(ZDLE);
|
||||
BUFFER_BYTE(frameend);
|
||||
crc = updcrc16(frameend, crc);
|
||||
if (Crc32t)
|
||||
zsda32(buf, length, frameend);
|
||||
else {
|
||||
crc = 0;
|
||||
for (;--length >= 0; ++buf) {
|
||||
zsendline(*buf);
|
||||
crc = updcrc16((0377 & *buf), crc);
|
||||
}
|
||||
BUFFER_BYTE(ZDLE);
|
||||
BUFFER_BYTE(frameend);
|
||||
crc = updcrc16(frameend, crc);
|
||||
|
||||
crc = updcrc16(0,updcrc16(0,crc));
|
||||
zsendline(((int)(crc>>8)));
|
||||
zsendline(crc);
|
||||
crc = updcrc16(0,updcrc16(0,crc));
|
||||
zsendline(((int)(crc>>8)));
|
||||
zsendline(crc);
|
||||
}
|
||||
|
||||
if (frameend == ZCRCW)
|
||||
BUFFER_BYTE(XON);
|
||||
|
||||
@ -356,14 +348,10 @@ int zrdata(register char *buf, int length)
|
||||
register char *end;
|
||||
register int d;
|
||||
|
||||
Syslog('z', "zrdata: len=%d, Crc32r=%d", length, Crc32r);
|
||||
Syslog('z', "zrdata: len=%d, Crc32r=%s", length, Crc32r ? "true":"false");
|
||||
|
||||
switch (Crc32r) {
|
||||
case 1:
|
||||
return zrdat32(buf, length);
|
||||
case 2:
|
||||
return zrdatr32(buf, length);
|
||||
}
|
||||
if (Crc32r)
|
||||
return zrdat32(buf, length);
|
||||
|
||||
crc = Rxcount = 0;
|
||||
end = buf + length;
|
||||
@ -487,11 +475,10 @@ int zgethdr(char *shdr)
|
||||
{
|
||||
register int c, n, cancount;
|
||||
int Zrwindow = 1400;
|
||||
int Baudrate = 9600;
|
||||
|
||||
n = Zrwindow + Baudrate;
|
||||
Rxframeind = Rxtype = 0;
|
||||
Syslog('z', "zgethdr(%lx)", rclhdr(shdr));
|
||||
// Syslog('z', "zgethdr(%lx)", rclhdr(shdr));
|
||||
|
||||
startover:
|
||||
cancount = 5;
|
||||
@ -503,7 +490,6 @@ again:
|
||||
if (((c = GETCHAR(Rxtimeout)) < 0) && (c != TIMEOUT))
|
||||
goto fifi;
|
||||
else {
|
||||
// Syslog('z', "Zmodem: Got %c %d", c, c);
|
||||
switch(c) {
|
||||
case 021:
|
||||
case 0221: goto again;
|
||||
@ -538,13 +524,13 @@ agn2:
|
||||
#define GCOUNT (-4)
|
||||
if ( --n == 0) {
|
||||
c = GCOUNT;
|
||||
Syslog('z', "zgethdr: garbage count exceeded");
|
||||
goto fifi;
|
||||
}
|
||||
goto startover;
|
||||
case ZPAD|0200: /* This is what we want. */
|
||||
Not8bit = c;
|
||||
case ZPAD: /* This is what we want. */
|
||||
// Syslog('z', "zgethdr: got ZPAD");
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -557,77 +543,33 @@ splat:
|
||||
case TIMEOUT: goto fifi;
|
||||
default: goto agn2;
|
||||
case ZDLE: /* This is what we want. */
|
||||
// Syslog('z', "zgethdr: got ZDLE");
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Rxhlen = 4; /* Set default length */
|
||||
Rxframeind = c = noxrd7();
|
||||
Syslog('z', "zgethdr: header type %d", c);
|
||||
switch (c) {
|
||||
case ZVBIN32: if ((Rxhlen = c = zdlread()) < 0)
|
||||
goto fifi;
|
||||
if (c > ZMAXHLEN)
|
||||
goto agn2;
|
||||
Crc32r = 1;
|
||||
c = zrbhd32(shdr);
|
||||
break;
|
||||
case ZBIN32: if (Usevhdrs)
|
||||
goto agn2;
|
||||
Crc32r = 1;
|
||||
c = zrbhd32(shdr);
|
||||
break;
|
||||
case ZVBINR32: if ((Rxhlen = c = zdlread()) < 0)
|
||||
goto fifi;
|
||||
if (c > ZMAXHLEN)
|
||||
goto agn2;
|
||||
Crc32r = 2;
|
||||
c = zrbhd32(shdr);
|
||||
break;
|
||||
case ZBINR32: if (Usevhdrs)
|
||||
goto agn2;
|
||||
Crc32r = 2;
|
||||
case ZBIN32: Crc32r = 1;
|
||||
c = zrbhd32(shdr);
|
||||
break;
|
||||
case HANGUP:
|
||||
case TIMEOUT: goto fifi;
|
||||
case ZVBIN: if ((Rxhlen = c = zdlread()) < 0)
|
||||
goto fifi;
|
||||
if (c > ZMAXHLEN)
|
||||
goto agn2;
|
||||
Crc32r = 0;
|
||||
case ZBIN: Crc32r = 0;
|
||||
c = zrbhdr(shdr);
|
||||
break;
|
||||
case ZBIN: if (Usevhdrs)
|
||||
goto agn2;
|
||||
Crc32r = 0;
|
||||
c = zrbhdr(shdr);
|
||||
break;
|
||||
case ZVHEX: if ((Rxhlen = c = zgethex()) < 0)
|
||||
goto fifi;
|
||||
if (c > ZMAXHLEN)
|
||||
goto agn2;
|
||||
Crc32r = 0;
|
||||
c = zrhhdr(shdr);
|
||||
break;
|
||||
case ZHEX: if (Usevhdrs)
|
||||
goto agn2;
|
||||
Crc32r = 0;
|
||||
case ZHEX: Crc32r = 0;
|
||||
c = zrhhdr(shdr);
|
||||
break;
|
||||
case CAN: goto gotcan;
|
||||
default: goto agn2;
|
||||
}
|
||||
|
||||
for (n = Rxhlen; ++n < ZMAXHLEN; ) /* Clear unused hdr bytes */
|
||||
for (n = 4; ++n < ZMAXHLEN; ) /* Clear unused hdr bytes */
|
||||
shdr[n] = 0;
|
||||
Rxpos = shdr[ZP3] & 0377;
|
||||
Rxpos = (Rxpos<<8) + (shdr[ZP2] & 0377);
|
||||
Rxpos = (Rxpos<<8) + (shdr[ZP1] & 0377);
|
||||
Rxpos = (Rxpos<<8) + (shdr[ZP0] & 0377);
|
||||
fifi:
|
||||
Syslog('z', "Zmodem: at fifi Got %d", c);
|
||||
switch (c) {
|
||||
case GOTCAN: c = ZCAN;
|
||||
/* **** FALL THRU TO **** */
|
||||
@ -638,14 +580,13 @@ fifi:
|
||||
case HANGUP: Syslog('+', "Zmodem: Got %s", frametypes[c+FTOFFSET]);
|
||||
/* **** FALL THRU TO **** */
|
||||
default: if (c >= -FTOFFSET && c <= FRTYPES)
|
||||
Syslog('z', "zgethdr: %c %d %s %lx", Rxframeind, Rxhlen, frametypes[c+FTOFFSET], Rxpos);
|
||||
Syslog('z', "zgethdr: %c %s %lx", Rxframeind, frametypes[c+FTOFFSET], Rxpos);
|
||||
else
|
||||
Syslog('z', "zgethdr: %d %d %ld", Rxframeind, c, Rxpos);
|
||||
Syslog('z', "zgethdr: %d %d %lx", Rxframeind, c, Rxpos);
|
||||
}
|
||||
|
||||
/* Use variable length headers if we got one */
|
||||
if (c >= 0 && c <= FRTYPES && Rxframeind & 040) {
|
||||
Usevhdrs = 1;
|
||||
Syslog('z', "zgethdr: Usevhdrs");
|
||||
}
|
||||
return c;
|
||||
@ -666,7 +607,7 @@ int zrbhdr(register char *shdr)
|
||||
Rxtype = c;
|
||||
crc = updcrc16(c, 0);
|
||||
|
||||
for (n=Rxhlen; --n >= 0; ++shdr) {
|
||||
for (n=4; --n >= 0; ++shdr) {
|
||||
if ((c = zdlread()) & ~0377)
|
||||
return c;
|
||||
crc = updcrc16(c, crc);
|
||||
@ -700,7 +641,7 @@ int zrbhd32(register char *shdr)
|
||||
Rxtype = c;
|
||||
crc = 0xFFFFFFFFL; crc = updcrc32(c, crc);
|
||||
|
||||
for (n=Rxhlen; --n >= 0; ++shdr) {
|
||||
for (n=4; --n >= 0; ++shdr) {
|
||||
if ((c = zdlread()) & ~0377)
|
||||
return c;
|
||||
crc = updcrc32(c, crc);
|
||||
@ -734,7 +675,7 @@ int zrhhdr(char *shdr)
|
||||
Rxtype = c;
|
||||
crc = updcrc16(c, 0);
|
||||
|
||||
for (n=Rxhlen; --n >= 0; ++shdr) {
|
||||
for (n=4; --n >= 0; ++shdr) {
|
||||
if ((c = zgethex()) < 0)
|
||||
return c;
|
||||
crc = updcrc16(c, crc);
|
||||
@ -868,10 +809,10 @@ again:
|
||||
|
||||
switch (c) {
|
||||
case ZDLE: break;
|
||||
case 023:
|
||||
case 0223:
|
||||
case 021:
|
||||
case 0221: goto again;
|
||||
case XON:
|
||||
case XON|0200:
|
||||
case XOFF:
|
||||
case XOFF|0200: goto again;
|
||||
default: if (Zctlesc && !(c & 0140)) {
|
||||
goto again;
|
||||
}
|
||||
@ -896,10 +837,10 @@ again2:
|
||||
case ZCRCW: return (c | GOTOR);
|
||||
case ZRUB0: return 0177;
|
||||
case ZRUB1: return 0377;
|
||||
case 023:
|
||||
case 0223:
|
||||
case 021:
|
||||
case 0221: goto again2;
|
||||
case XON:
|
||||
case XON|0200:
|
||||
case XOFF:
|
||||
case XOFF|0200: goto again2;
|
||||
default: if (Zctlesc && ! (c & 0140)) {
|
||||
goto again2;
|
||||
}
|
||||
|
@ -22,14 +22,14 @@
|
||||
#define ZBIN 'A' /* Binary frame indicator (CRC-16) */
|
||||
#define ZHEX 'B' /* HEX frame indicator */
|
||||
#define ZBIN32 'C' /* Binary frame with 32 bit FCS */
|
||||
#define ZBINR32 'D' /* RLE packed Binary frame with 32 bit FCS */
|
||||
#define ZVBIN 'a' /* Binary frame indicator (CRC-16) */
|
||||
#define ZVHEX 'b' /* HEX frame indicator */
|
||||
#define ZVBIN32 'c' /* Binary frame with 32 bit FCS */
|
||||
#define ZVBINR32 'd' /* RLE packed Binary frame with 32 bit FCS */
|
||||
#define ZRESC 0176 /* RLE flag/escape character */
|
||||
// #define ZBINR32 'D' /* RLE packed Binary frame with 32 bit FCS */
|
||||
// #define ZVBIN 'a' /* Binary frame indicator (CRC-16) */
|
||||
// #define ZVHEX 'b' /* HEX frame indicator */
|
||||
// #define ZVBIN32 'c' /* Binary frame with 32 bit FCS */
|
||||
// #define ZVBINR32 'd' /* RLE packed Binary frame with 32 bit FCS */
|
||||
// #define ZRESC 0176 /* RLE flag/escape character */
|
||||
#define ZMAXHLEN 16 /* Max header information length NEVER CHANGE */
|
||||
#define ZMAXSPLEN 1024 /* Max subpacket length NEVER CHANGE */
|
||||
// #define ZMAXSPLEN 1024 /* Max subpacket length NEVER CHANGE */
|
||||
|
||||
|
||||
/* Frame types (see array "frametypes" in zm.c) */
|
||||
@ -82,27 +82,27 @@
|
||||
#define ZP3 3 /* High order 8 bits of file position */
|
||||
|
||||
/* Parameters for ZRINIT header */
|
||||
#define ZRPXWN 8 /* 9th byte in header contains window size/256 */
|
||||
#define ZRPXQQ 9 /* 10th to 14th bytes contain quote mask */
|
||||
// #define ZRPXWN 8 /* 9th byte in header contains window size/256 */
|
||||
// #define ZRPXQQ 9 /* 10th to 14th bytes contain quote mask */
|
||||
/* Bit Masks for ZRINIT flags byte ZF0 */
|
||||
#define CANFDX 01 /* Rx can send and receive true FDX */
|
||||
#define CANOVIO 02 /* Rx can receive data during disk I/O */
|
||||
#define CANBRK 04 /* Rx can send a break signal */
|
||||
#define CANRLE 010 /* Receiver can decode RLE */
|
||||
// #define CANRLE 010 /* Receiver can decode RLE */
|
||||
#define CANLZW 020 /* Receiver can uncompress */
|
||||
#define CANFC32 040 /* Receiver can use 32 bit Frame Check */
|
||||
#define ESCCTL 0100 /* Receiver expects ctl chars to be escaped */
|
||||
#define ESC8 0200 /* Receiver expects 8th bit to be escaped */
|
||||
|
||||
/* Bit Masks for ZRINIT flags byte ZF1 */
|
||||
#define CANVHDR 01 /* Variable headers OK */
|
||||
#define ZRRQWN 8 /* Receiver specified window size in ZRPXWN */
|
||||
#define ZRRQQQ 16 /* Additional control chars to quote in ZRPXQQ */
|
||||
#define ZRQNVH (ZRRQWN|ZRRQQQ) /* Variable len hdr reqd to access info */
|
||||
// #define CANVHDR 01 /* Variable headers OK */
|
||||
// #define ZRRQWN 8 /* Receiver specified window size in ZRPXWN */
|
||||
// #define ZRRQQQ 16 /* Additional control chars to quote in ZRPXQQ */
|
||||
// #define ZRQNVH (ZRRQWN|ZRRQQQ) /* Variable len hdr reqd to access info */
|
||||
|
||||
/* Parameters for ZSINIT frame */
|
||||
#define ZATTNLEN 32 /* Max length of attention string */
|
||||
#define ALTCOFF ZF1 /* Offset to alternate canit string, 0 if not used */
|
||||
// #define ALTCOFF ZF1 /* Offset to alternate canit string, 0 if not used */
|
||||
/* Bit Masks for ZSINIT flags byte ZF0 */
|
||||
#define TESCCTL 0100 /* Transmitter expects ctl chars to be escaped */
|
||||
#define TESC8 0200 /* Transmitter expects 8th bit to be escaped */
|
||||
@ -130,9 +130,9 @@
|
||||
#define ZTRLE 3 /* Run Length encoding */
|
||||
/* Extended options for ZF3, bit encoded */
|
||||
#define ZXSPARS 64 /* Encoding for sparse file operations */
|
||||
#define ZCANVHDR 01 /* Variable headers OK */
|
||||
// #define ZCANVHDR 01 /* Variable headers OK */
|
||||
/* Receiver window size override */
|
||||
#define ZRWOVR 4 /* byte position for receive window override/256 */
|
||||
// #define ZRWOVR 4 /* byte position for receive window override/256 */
|
||||
|
||||
/* Parameters for ZCOMMAND frame ZF0 (otherwise 0) */
|
||||
#define ZCACK1 1 /* Acknowledge, then do command */
|
||||
@ -154,13 +154,20 @@ char Attn[ZATTNLEN+1]; /* Attention string rx sends to tx on err */
|
||||
char *Altcan; /* Alternate canit string */
|
||||
char Zsendmask[33]; /* Additional control characters to mask */
|
||||
int Zctlesc;
|
||||
int Usevhdrs; /* Use variable length headers */
|
||||
//int Usevhdrs; /* Use variable length headers */
|
||||
|
||||
enum zm_type_enum {
|
||||
ZM_XMODEM,
|
||||
ZM_YMODEM,
|
||||
ZM_ZMODEM
|
||||
};
|
||||
|
||||
enum zm_type_enum protocol;
|
||||
|
||||
void get_frame_buffer(void);
|
||||
void free_frame_buffer(void);
|
||||
void zsbhdr(int, int, register char *);
|
||||
void zshhdr(int, int, register char *);
|
||||
void zsbhdr(int, char *);
|
||||
void zshhdr(int, char *);
|
||||
void zsdata(register char *, int, int);
|
||||
int zrdata(register char *, int);
|
||||
int zrdat32(register char *, int);
|
||||
|
@ -35,6 +35,7 @@
|
||||
#include "transfer.h"
|
||||
#include "zmmisc.h"
|
||||
#include "zmrecv.h"
|
||||
#include "openport.h"
|
||||
|
||||
|
||||
static FILE *fout = NULL;
|
||||
@ -105,6 +106,7 @@ int zmrcvfiles(void)
|
||||
secbuf = NULL;
|
||||
free_frame_buffer();
|
||||
|
||||
io_mode(0, 1);
|
||||
Syslog('z', "Zmodem: receive rc=%d",rc);
|
||||
return abs(rc);
|
||||
}
|
||||
@ -128,19 +130,19 @@ int tryz(void)
|
||||
*/
|
||||
Syslog('z', "tryz attempt %d", n);
|
||||
stohdr(0L);
|
||||
// Txhdr[ZF0] = CANFC32|CANFDX|CANOVIO;
|
||||
Txhdr[ZF0] = CANFC32;
|
||||
Txhdr[ZF0] = CANFC32|CANFDX|CANOVIO;
|
||||
// Txhdr[ZF0] = CANFC32;
|
||||
if (Zctlesc)
|
||||
Txhdr[ZF0] |= TESCCTL;
|
||||
// Txhdr[ZF0] |= CANRLE;
|
||||
Txhdr[ZF1] = CANVHDR;
|
||||
zshhdr(4, tryzhdrtype, Txhdr);
|
||||
// Txhdr[ZF1] = CANVHDR;
|
||||
zshhdr(tryzhdrtype, Txhdr);
|
||||
if (tryzhdrtype == ZSKIP) /* Don't skip too far */
|
||||
tryzhdrtype = ZRINIT; /* CAF 8-21-87 */
|
||||
again:
|
||||
switch (zgethdr(Rxhdr)) {
|
||||
case ZRQINIT: if (Rxhdr[ZF3] & 0x80)
|
||||
Usevhdrs = TRUE; /* we can var header */
|
||||
case ZRQINIT: // if (Rxhdr[ZF3] & 0x80)
|
||||
// Usevhdrs = TRUE; /* we can var header */
|
||||
continue;
|
||||
case ZEOF: continue;
|
||||
case TIMEOUT: Syslog('+', "Zmodem: tryz() timeout attempt %d", n);
|
||||
@ -148,18 +150,20 @@ again:
|
||||
case ZFILE: zconv = Rxhdr[ZF0];
|
||||
if (!zconv) {
|
||||
Syslog('z', "*** !zconv %d", zconv);
|
||||
zconv = ZCBIN;
|
||||
}
|
||||
zmanag = Rxhdr[ZF1];
|
||||
ztrans = Rxhdr[ZF2];
|
||||
if (Rxhdr[ZF3] & ZCANVHDR)
|
||||
Usevhdrs = TRUE;
|
||||
// if (Rxhdr[ZF3] & ZCANVHDR)
|
||||
// Usevhdrs = TRUE;
|
||||
tryzhdrtype = ZRINIT;
|
||||
c = zrdata(secbuf, MAXBLOCK);
|
||||
io_mode(0, 3);
|
||||
if (c == GOTCRCW) {
|
||||
Syslog('z', "tryz return ZFILE");
|
||||
return ZFILE;
|
||||
}
|
||||
zshhdr(4,ZNAK, Txhdr);
|
||||
zshhdr(ZNAK, Txhdr);
|
||||
goto again;
|
||||
case ZSINIT: /* this once was:
|
||||
* Zctlesc = TESCCTL & Rxhdr[ZF0];
|
||||
@ -173,13 +177,13 @@ again:
|
||||
Zctlesc |= TESCCTL & Rxhdr[ZF0];
|
||||
if (zrdata(Attn, ZATTNLEN) == GOTCRCW) {
|
||||
stohdr(1L);
|
||||
zshhdr(4,ZACK, Txhdr);
|
||||
zshhdr(ZACK, Txhdr);
|
||||
goto again;
|
||||
}
|
||||
zshhdr(4,ZNAK, Txhdr);
|
||||
zshhdr(ZNAK, Txhdr);
|
||||
goto again;
|
||||
case ZFREECNT: stohdr(getfree());
|
||||
zshhdr(4,ZACK, Txhdr);
|
||||
zshhdr(ZACK, Txhdr);
|
||||
goto again;
|
||||
case ZCOMMAND: cmdzack1flg = Rxhdr[ZF0];
|
||||
if (zrdata(secbuf, MAXBLOCK) == GOTCRCW) {
|
||||
@ -189,11 +193,11 @@ again:
|
||||
Syslog('+', "Zmodem: request for command \"%s\" ignored", printable(secbuf,-32));
|
||||
stohdr(0L);
|
||||
do {
|
||||
zshhdr(4,ZCOMPL, Txhdr);
|
||||
zshhdr(ZCOMPL, Txhdr);
|
||||
} while (++errors<20 && zgethdr(Rxhdr) != ZFIN);
|
||||
return ackbibi();
|
||||
}
|
||||
zshhdr(4,ZNAK, Txhdr);
|
||||
zshhdr(ZNAK, Txhdr);
|
||||
goto again;
|
||||
case ZCOMPL: goto again;
|
||||
case ZRINIT: Syslog('z', "tryz: got ZRINIT");
|
||||
@ -262,7 +266,7 @@ int rzfile(void)
|
||||
for (;;) {
|
||||
Syslog('z', "rxbytes %ld", rxbytes);
|
||||
stohdr(rxbytes);
|
||||
zshhdr(4,ZRPOS, Txhdr);
|
||||
zshhdr(ZRPOS, Txhdr);
|
||||
nxthdr:
|
||||
switch (c = zgethdr(Rxhdr)) {
|
||||
default: Syslog('z', "rzfile: Wrong header %d", c);
|
||||
@ -349,13 +353,13 @@ moredata:
|
||||
Syslog('z', "rxbytes %ld, will ACK", rxbytes);
|
||||
stohdr(rxbytes);
|
||||
PUTCHAR(XON);
|
||||
zshhdr(4,ZACK, Txhdr);
|
||||
zshhdr(ZACK, Txhdr);
|
||||
goto nxthdr;
|
||||
case GOTCRCQ: n = 20;
|
||||
putsec(secbuf, Rxcount);
|
||||
rxbytes += Rxcount;
|
||||
stohdr(rxbytes);
|
||||
zshhdr(4,ZACK, Txhdr);
|
||||
zshhdr(ZACK, Txhdr);
|
||||
goto moredata;
|
||||
case GOTCRCG: n = 20;
|
||||
putsec(secbuf, Rxcount);
|
||||
@ -445,7 +449,7 @@ int ackbibi(void)
|
||||
stohdr(0L);
|
||||
|
||||
for (n=3; --n>=0; ) {
|
||||
zshhdr(4,ZFIN, Txhdr);
|
||||
zshhdr(ZFIN, Txhdr);
|
||||
|
||||
switch ((c = GETCHAR(10))) {
|
||||
case 'O': GETCHAR(1); /* Discard 2nd 'O' */
|
||||
|
@ -50,6 +50,7 @@ extern char *Zendnames[];
|
||||
/*
|
||||
* Send data subpacket RLE encoded with 32 bit FCS
|
||||
*/
|
||||
/*
|
||||
void zsdar32(char *buf, int length, int frameend)
|
||||
{
|
||||
register int c, l, n;
|
||||
@ -87,8 +88,8 @@ void zsdar32(char *buf, int length, int frameend)
|
||||
l = c;
|
||||
break;
|
||||
}
|
||||
/* **** FALL THRU TO **** */
|
||||
default: zsendline(ZRESC); crc = updcrc32(ZRESC, crc);
|
||||
*/ /* **** FALL THRU TO **** */
|
||||
/* default: zsendline(ZRESC); crc = updcrc32(ZRESC, crc);
|
||||
if (l == 040 && n < 34) {
|
||||
n += 036;
|
||||
zsendline(n);
|
||||
@ -116,11 +117,12 @@ void zsdar32(char *buf, int length, int frameend)
|
||||
crc >>= 8;
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
* Receive data subpacket RLE encoded with 32 bit FCS
|
||||
*/
|
||||
/*
|
||||
int zrdatr32(register char *buf, int length)
|
||||
{
|
||||
register int c;
|
||||
@ -131,7 +133,7 @@ int zrdatr32(register char *buf, int length)
|
||||
crc = 0xFFFFFFFFL;
|
||||
Rxcount = 0;
|
||||
end = buf + length;
|
||||
d = 0; /* Use for RLE decoder state */
|
||||
d = 0; */ /* Use for RLE decoder state */ /*
|
||||
while (buf <= end) {
|
||||
if ((c = zdlread()) & ~0377) {
|
||||
crcfoo:
|
||||
@ -208,4 +210,5 @@ badpkt:
|
||||
Syslog('+', "Zmodem: Data subpacket too long");
|
||||
return TERROR;
|
||||
}
|
||||
*/
|
||||
|
||||
|
@ -3,7 +3,9 @@
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
void zsdar32(char *, int, int);
|
||||
int zrdatr32(register char *, int);
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
@ -34,6 +34,8 @@
|
||||
#include "zmmisc.h"
|
||||
#include "zmrle.h"
|
||||
#include "transfer.h"
|
||||
#include "openport.h"
|
||||
|
||||
|
||||
static int initsend(void);
|
||||
static int sendzfile(char*);
|
||||
@ -135,9 +137,10 @@ static int initsend(void)
|
||||
{
|
||||
Syslog('z', "Zmodem: initsend");
|
||||
|
||||
io_mode(0, 1);
|
||||
PUTSTR((char *)"rz\r");
|
||||
stohdr(0x80L); /* Show we can do var header */
|
||||
zshhdr(4, ZRQINIT, Txhdr);
|
||||
zshhdr(ZRQINIT, Txhdr);
|
||||
|
||||
if (getzrxinit()) {
|
||||
Syslog('+', "Zmodem: Unable to initiate send");
|
||||
@ -160,7 +163,7 @@ static int finsend(void)
|
||||
while (GETCHAR(1) >= 0) /*nothing*/;
|
||||
for (i = 0; i < 30; i++) {
|
||||
stohdr(0L);
|
||||
zshhdr(4, ZFIN, Txhdr);
|
||||
zshhdr(ZFIN, Txhdr);
|
||||
if ((rc = zgethdr(Rxhdr)) == ZFIN)
|
||||
PUTSTR((char *)"OO");
|
||||
if ((rc == ZFIN) || (rc == ZCAN) || (rc < 0))
|
||||
@ -241,17 +244,18 @@ int getzrxinit(void) // CHECKED BUT NOT WELL TESTED
|
||||
switch (zgethdr(Rxhdr)) {
|
||||
case ZCHALLENGE: /* Echo receiver's challenge numbr */
|
||||
stohdr(Rxpos);
|
||||
zshhdr(4, ZACK, Txhdr);
|
||||
zshhdr(ZACK, Txhdr);
|
||||
continue;
|
||||
case ZCOMMAND: /* They didn't see out ZRQINIT */
|
||||
stohdr(0L);
|
||||
zshhdr(4, ZRQINIT, Txhdr);
|
||||
zshhdr(ZRQINIT, Txhdr);
|
||||
continue;
|
||||
case ZRINIT:
|
||||
Rxflags = 0377 & Rxhdr[ZF0];
|
||||
Usevhdrs = Rxhdr[ZF1] & CANVHDR;
|
||||
// Usevhdrs = Rxhdr[ZF1] & CANVHDR;
|
||||
Txfcs32 = (Wantfcs32 && (Rxflags & CANFC32));
|
||||
Zctlesc |= Rxflags & TESCCTL;
|
||||
|
||||
Rxbuflen = (0377 & Rxhdr[ZP0])+((0377 & Rxhdr[ZP1])<<8);
|
||||
if ( !(Rxflags & CANFDX))
|
||||
Txwindow = 0;
|
||||
@ -268,9 +272,9 @@ int getzrxinit(void) // CHECKED BUT NOT WELL TESTED
|
||||
Syslog('z', "Rxbuflen=%d blklen=%d", Rxbuflen, blklen);
|
||||
Syslog('z', "Txwindow = %u Txwspac = %d", Txwindow, Txwspac);
|
||||
|
||||
if (Lztrans == ZTRLE && (Rxflags & CANRLE))
|
||||
Txfcs32 = 2;
|
||||
else
|
||||
// if (Lztrans == ZTRLE && (Rxflags & CANRLE))
|
||||
// Txfcs32 = 2;
|
||||
// else
|
||||
Lztrans = 0;
|
||||
|
||||
return (sendzsinit());
|
||||
@ -283,7 +287,7 @@ int getzrxinit(void) // CHECKED BUT NOT WELL TESTED
|
||||
if (Rxhdr[ZF0] == ZCOMMAND)
|
||||
continue;
|
||||
default:
|
||||
zshhdr(4, ZNAK, Txhdr);
|
||||
zshhdr(ZNAK, Txhdr);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -305,9 +309,9 @@ int sendzsinit(void)
|
||||
for (;;) {
|
||||
stohdr(0L);
|
||||
if (Zctlesc) {
|
||||
Txhdr[ZF0] |= TESCCTL; zshhdr(4, ZSINIT, Txhdr);
|
||||
Txhdr[ZF0] |= TESCCTL; zshhdr(ZSINIT, Txhdr);
|
||||
} else
|
||||
zsbhdr(4, ZSINIT, Txhdr);
|
||||
zsbhdr(ZSINIT, Txhdr);
|
||||
zsdata(Myattn, ZATTNLEN, ZCRCW);
|
||||
c = zgethdr(Rxhdr);
|
||||
switch (c) {
|
||||
@ -358,7 +362,7 @@ int zsendfile(char *buf, int blen)
|
||||
Txhdr[ZF1] |= ZMSKNOLOC;
|
||||
Txhdr[ZF2] = Lztrans; /* file transport request */
|
||||
Txhdr[ZF3] = 0;
|
||||
zsbhdr(4, ZFILE, Txhdr);
|
||||
zsbhdr(ZFILE, Txhdr);
|
||||
zsdata(buf, blen, ZCRCW);
|
||||
again:
|
||||
c = zgethdr(Rxhdr);
|
||||
@ -393,7 +397,7 @@ again:
|
||||
lastcrcrq = Rxpos;
|
||||
}
|
||||
stohdr(crc);
|
||||
zsbhdr(4, ZCRC, Txhdr);
|
||||
zsbhdr(ZCRC, Txhdr);
|
||||
goto again;
|
||||
case ZFERR:
|
||||
case ZSKIP:
|
||||
@ -486,7 +490,7 @@ to:
|
||||
newcnt = Rxbuflen;
|
||||
Txwcnt = 0;
|
||||
stohdr(Txpos);
|
||||
zsbhdr(4, ZDATA, Txhdr);
|
||||
zsbhdr(ZDATA, Txhdr);
|
||||
|
||||
do {
|
||||
n = zfilbuf();
|
||||
@ -555,7 +559,7 @@ to:
|
||||
|
||||
for (;;) {
|
||||
stohdr(Txpos);
|
||||
zsbhdr(4, ZEOF, Txhdr);
|
||||
zsbhdr(ZEOF, Txhdr);
|
||||
egotack:
|
||||
switch (getinsync(0)) {
|
||||
case ZACK: Syslog('z', "zsendfdata() ZACK");
|
||||
@ -628,7 +632,7 @@ int getinsync(int flag)
|
||||
case ZRINIT: return c;
|
||||
case ZSKIP: Syslog('+', "Zmodem: File skipped by receiver request");
|
||||
return c;
|
||||
default: zsbhdr(4, ZNAK, Txhdr);
|
||||
default: zsbhdr(ZNAK, Txhdr);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user