From 9083842cbfd0b2f690086a5a5348d636ba48d2be Mon Sep 17 00:00:00 2001 From: Michiel Broek Date: Sat, 20 Nov 2004 13:30:13 +0000 Subject: [PATCH] internal zmodem upload works --- ChangeLog | 2 +- mbsebbs/Makefile | 6 +- mbsebbs/file.c | 2 +- mbsebbs/openport.c | 222 +++++++++++++++++++++++++++++++++++---------- mbsebbs/openport.h | 1 + mbsebbs/zmmisc.c | 179 ++++++++++++------------------------ mbsebbs/zmmisc.h | 47 ++++++---- mbsebbs/zmrecv.c | 40 ++++---- mbsebbs/zmrle.c | 11 ++- mbsebbs/zmrle.h | 2 + mbsebbs/zmsend.c | 36 ++++---- 11 files changed, 319 insertions(+), 229 deletions(-) diff --git a/ChangeLog b/ChangeLog index 473ef982..0ae8a7fd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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: diff --git a/mbsebbs/Makefile b/mbsebbs/Makefile index b15abda4..45b6f173 100644 --- a/mbsebbs/Makefile +++ b/mbsebbs/Makefile @@ -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 diff --git a/mbsebbs/file.c b/mbsebbs/file.c index 3c6854f3..9869d667 100644 --- a/mbsebbs/file.c +++ b/mbsebbs/file.c @@ -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; diff --git a/mbsebbs/openport.c b/mbsebbs/openport.c index 86932052..76e27f76 100644 --- a/mbsebbs/openport.c +++ b/mbsebbs/openport.c @@ -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); } diff --git a/mbsebbs/openport.h b/mbsebbs/openport.h index cd351ab8..281cd7ac 100644 --- a/mbsebbs/openport.h +++ b/mbsebbs/openport.h @@ -3,6 +3,7 @@ /* $Id$ */ +int io_mode(int, int); void hangup(void); int rawport(void); int cookedport(void); diff --git a/mbsebbs/zmmisc.c b/mbsebbs/zmmisc.c index 3ea6ee40..a1f46eaf 100644 --- a/mbsebbs/zmmisc.c +++ b/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 @@ -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; } diff --git a/mbsebbs/zmmisc.h b/mbsebbs/zmmisc.h index e72b6e24..062a862d 100644 --- a/mbsebbs/zmmisc.h +++ b/mbsebbs/zmmisc.h @@ -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); diff --git a/mbsebbs/zmrecv.c b/mbsebbs/zmrecv.c index 9511fa46..59345d76 100644 --- a/mbsebbs/zmrecv.c +++ b/mbsebbs/zmrecv.c @@ -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' */ diff --git a/mbsebbs/zmrle.c b/mbsebbs/zmrle.c index aa206b10..284d169f 100644 --- a/mbsebbs/zmrle.c +++ b/mbsebbs/zmrle.c @@ -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; } +*/ diff --git a/mbsebbs/zmrle.h b/mbsebbs/zmrle.h index 42f29410..bf4d8fb7 100644 --- a/mbsebbs/zmrle.h +++ b/mbsebbs/zmrle.h @@ -3,7 +3,9 @@ /* $Id$ */ +/* void zsdar32(char *, int, int); int zrdatr32(register char *, int); +*/ #endif diff --git a/mbsebbs/zmsend.c b/mbsebbs/zmsend.c index c8bbc1f5..ffc6913d 100644 --- a/mbsebbs/zmsend.c +++ b/mbsebbs/zmsend.c @@ -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; } }