internal zmodem upload works

This commit is contained in:
Michiel Broek 2004-11-20 13:30:13 +00:00
parent 29a5f8f952
commit 9083842cbf
11 changed files with 319 additions and 229 deletions

View File

@ -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:

View File

@ -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

View File

@ -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;

View File

@ -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);
}

View File

@ -3,6 +3,7 @@
/* $Id$ */
int io_mode(int, int);
void hangup(void);
int rawport(void);
int cookedport(void);

View File

@ -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
@ -290,25 +283,24 @@ void zsdata(register char *buf, int length, int frameend)
Syslog('z', "zsdata: %d %s", length, Zendnames[(frameend-ZCRCE)&3]);
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;
}

View File

@ -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);

View File

@ -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' */

View File

@ -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;
}
*/

View File

@ -3,7 +3,9 @@
/* $Id$ */
/*
void zsdar32(char *, int, int);
int zrdatr32(register char *, int);
*/
#endif

View File

@ -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;
}
}