E~ XMODEMVMS.BCK= XMODEMVMS.BCK,BACKUP/LOG/VER *.*;* XMODEMVMS.BCK/SAV/NOLOG BERNARD [' T5.3 _PRSSOS::  _$1$DUA26: V5.3 ~ &*[BERNARD.SYSTEM.XMODEM]$README.FIRST;7+,~./ 4P-l0123KPWO56ंpʑ7pʑ89GHJ,How to use the VMS-ified version of XMODEM :IDefine the logical name XMODEM$DIR to point to the directory in which youMunpacked your Xmodem files. Then execute the command procedure to define thePXmodem commands in DCL. An example is given below. You may want to add this toyour LOGIN.COM file. )$ DEFINE XMODEM$DIR disk:[directory_spec]$ @XMODEM$DIR:XMODEMPPlease read the help file (especially before sendin me mail)!?!?! You can do so by typing : $ XMHELP!*[BERNARD.SYSTEM.XMODEM]BATCH.C;13+,~. / 4L -l0123KPWO 56}7n&189GHJ/*' * Various routines for batch transfer */#include "xmodem.h"G/* make sure filename sent or received in YMODEM batch is canonical. */void vaxify(name) char *name;{ char *ptr;int period_count;for (ptr=name; *ptr; ++ptr) { if (*ptr == '/') *ptr = ':'; if (isupper (*ptr)) *ptr |= 040; }$/* remove trailing dot if present */ptr--;if (*ptr == '.') *ptr = '\0';'/* added this code for VMS filenames *///* change all '.' after the first one to '_' */ period_count = 0; for (ptr=name; *ptr; ++ptr) { if (*ptr == '.') ++period_count; if (period_count > 1) { *ptr = '_'; --period_count; } }} G/* make sure filename sent or received in YMODEM batch is canonical. */L/* Outgoing: Turn ':' into '/' (for symmetry!) and turn into all lower case.I * Remove everything before last '/'. Use "filename" to hold final name. */char *cpmify (name) char *name;{char *ptr, *slash , *semic ; slash = name;ptr = &filename ;while( *slash ) if ( *slash++ == ']' ) break ;if ( !*slash ) return( "FunnyFileName" ) ;while( *slash ) if ( *slash != ';' ) *ptr++ = *slash++ ; else break ; *ptr = '\0' ;if ( strlen( &filename ) > 30 ) filename[ 30 ] = '\0' ;return (&filename);} ?/* convert a CP/M file name received in a MODEM7 batch transfer * into a vax file name  */char *cpm_vax(string)unsigned char *string;{int i;unsigned char *iptr, temp; char *optr;if (*string == '\0'): error("Null file name in MODEM7 batch receive", TRUE);$for (iptr=string; (temp = *iptr) ; ) {' temp &= 0x7F ; /* strips bit 7 */ if (temp == '/') temp='_'; *iptr++ = temp; }/* put in main part of name */ iptr=string;optr=filename;for (i=0; i<8; i++) { if (*iptr != ' ') *optr++ = *iptr++; }/* add dot if necessary */>if (string[8] != ' ' || string[9] != ' ' || string[10] != ' ') *optr++ = '.';/* put in extension */iptr = &string[8];for (i=0; i<3; i++) { if (*iptr != ' ') *optr++ = *iptr++; }*optr++ = '\000';return (filename);} @/* Send 11 character CP/M filename for MODEM7 batch transmission3 * Returns -1 for a protocol error; 0 if successful2 * NOTE: we tromp a little on the argument string!1 * code stolen from D. Thompson's (IRTF) xmodem.c */int send_name(name) char *name;{ int cksum; char *ptr;xmdebug("send_name");/* append cp/m EOF */name[NAMSIZ] = CTRLZ;name[NAMSIZ+1] = '\000';/* create checksum */ ptr = name; cksum = 0; while (*ptr) cksum += *ptr++;cksum &= 0x00FF;/* send filename */sendbyte(ACK); ptr = name;sendbyte(*ptr++); while (*ptr) { switch (readbyte(15)) { case ACK: break; case TIMEOUT:6 logit("Timeout while sending MODEM7 filename\n"); sendbyte(BAD_NAME); return (-1); default:4 logit("Error while sending MODEM7 filename\n"); sendbyte(BAD_NAME); return (-1); }  sendbyte (*ptr++); }</* Check checksum returned by other side against my value */if (readbyte(16) != cksum) {: logit("Bad checksum while sending MODEM7 filename\n"); sendbyte(BAD_NAME); return (-1); }sendbyte(ACK); return (0);} D/* Convert VAX filename to 11 character CP/M file name (8 char name,5 * 3 char extension, dot in between is not included). */char *vax_cpm(string) char *string;{char *iptr, *optr, temp;int i;char *strrchr();char *strcpy();/* blank 11 character name */ strcpy (filename," ");/* strip off any path name */!if ((iptr = strrchr(string,']'))) iptr++;else iptr=string;/* copy main part of name */optr = filename;i = 8;*while ((i--) && (*iptr) && (*iptr != '.')) *optr++ = *iptr++;2/* advance to VAX extension, or end of VAX name */!while ((*iptr != '.') && (*iptr)) iptr++;%if ( *iptr ) /* skip over the '.' */ { iptr++; /* copy extension */ optr = &filename[8]; i=3;0 while ( (i--) && (*iptr) && (*iptr != ';') ) *optr++ = *iptr++; } filename[NAMSIZ] = '\000';/* Fuss with name */%for (iptr=filename; (temp = *iptr) ;) {3 temp &= 0x7F ; /* strip bit 7 (parity bit) */ if (islower(temp))% temp &= ~040; /* make upper case */ *iptr++ = temp; } if (DEBUG)E fprintf (LOGFP, "DEBUG: File %s sent as %s\n", string, filename);return(filename);}!*[BERNARD.SYSTEM.XMODEM]COMP.TXT;2+,~./ 4O-l0123KPWO56Ñ7189GHJLFrom: CVG::CAMPANELLA "Michael Campanella, DTN 261-2595" 22-NOV-1988 13:40To: LEDS::COHENSubj: V5 problems compilingAHere's a compile I tried on my system... got a clue on this one?%CC /NOLIST/OBJECT=XMODEM.OBJ XMODEM.CB Status = CmpTime( &FileTime , &(FileFab.fab$l_xab->xab$q_cdt) ) ;O%CC-I-QUALNOTSTRUCT, The qualifier for "xab$q_cdt" is not a structure or union.% &(FileFab.fab$l_xab->xab$q_cdt) ) ;O%CC-I-QUALNOTSTRUCT, The qualifier for "xab$q_cdt" is not a structure or union.B Status = CmpTime( &FileTime , &(FileFab.fab$l_xab->xab$q_cdt) ) ;O%CC-I-QUALNOTSTRUCT, The qualifier for "xab$q_cdt" is not a structure or union.% &(FileFab.fab$l_xab->xab$q_cdt) ) ;O%CC-I-QUALNOTSTRUCT, The qualifier for "xab$q_cdt" is not a structure or union.%*[BERNARD.SYSTEM.XMODEM]DESCRIP.MMS;17+,~./ 4:-l0123KPWO56Y%7nV189GHJxmodem : xmodem.obj - getput_tty.obj - misc.obj - send.obj - receive.obj - batch.obj - vaxsupp.obj9 $ define/user lnk$library sys$library:vaxcrtl.olb: $(link) /NOTRACE/EXEC=XMODEM.EXE/NOMAP $(mms$source_list) puXMODEM.OBJ : XMODEM.C -VAXSUPP.OBJ : VAXSUPP.C &getput_tty.obj : getput_tty.c xmodem.hmisc.obj : misc.c xmodem.hsend.obj : send.c xmodem.h receive.obj : receive.c xmodem.hbatch.obj : batch.c xmodem.h&*[BERNARD.SYSTEM.XMODEM]GETPUT_TTY.C;10+,~.$/ 4j$$-l0123KPWO%56F7`189GHJH#include descrip #include rms #include stdio #include "vmodem.h" #include "xmodem.h";#include ssdef /* Define system service status values */5#include iodef /* QIO function code definitions */0#include ttdef /* terminal characteristics */9#include tt2def /* extended terminal characteristics */ #define TRUE 1 #define FALSE 0  static char tt_name[] = "TT"; =static short tt_chan = -1; /* Terminal channel number */  /struct tt_io_iosb /* Terminal I/O IOSB */ {  short status;  short byte_count;  short terminator;  short terminator_size; };   3struct tt_io_tacf /* Terminal I/O type ahead */ {  short byte_count;  char firstchar;  char something;  short whatever; };  /* & * Terminator mask for PASSALL reads. 3 * Permits reads of all possible 8-bit characters.  */ int t_mask[32] = { ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };  struct terminator_mask {  short size ;  short unused ; int *mask ; }  !termin_mask = { 32, 0, t_mask };  /* /*G * Contains system routines to get and put bytes, change tty modes, etc! * Sys V version. UNTESTED!!!!!! */static int seconds =30; static int* mode; /* mode of operation */ (static int oterm_attr[3],nterm_attr[3]; static char termstr[256]; static struct { short status;' unsigned char xmit_baud;& unsigned char rcv_baud;$ unsigned char crfill;$ unsigned char lffill;$ unsigned char parity;$ unsigned char unused; } sensemode_iosb; static struct { short status; short offset; short termlen; short term; } input_iosb;/* *C * Get a byte from the specified file. Buffer the read so we don't0 * have to use a system call for each character. * *//getbyte(fildes, ch) /* Buffered disk read */ int fildes; char *ch; {/ static char buf[BUFSIZ]; /* Remember buffer */? static char *bufp = buf; /* Remember where we are in buffer */ 8 if (nbchr == 0) /* Buffer exausted; read some more */ {. if ((nbchr = read(fildes, buf, BUFSIZ)) < 0)" error("File Read Error", TRUE);2 bufp = buf; /* Set pointer to start of array */ } if (--nbchr >= 0) { *ch = *bufp++; return(0); } else { return(EOF); } } J/* Count the number of newlines in a file so we know the REAL file size */long countnl(fd)int fd;{ char buf[BUFSIZ]; char *bufp; long nltot = 0; int numchar; long lseek();B while (numchar = read(fd, buf, BUFSIZ)) /* cycle through file */# for (bufp=buf; numchar--; bufp++) if (*bufp == '\n') nltot++;. (void) lseek (fd, 0l, 0); /* rewind file */ if (DEBUG)B fprintf(LOGFP, "DEBUG: countnl--%ld newlines counted\n", nltot); return (nltot);} /* CRC-16 constant array...F from Usenet contribution by Mark G. Mendel, Network Systems Corp. (ihnp4!umn-cs!hyper!mark)*/*/* crctab as calculated by initcrctab() */ unsigned short crctab[1< register unsigned short chksm; /* working copy of checksum */1 register int bfctr; /* working copy of bufctr */ int j; /* loop index */ char *sectdisp(); chksm = 0; bfctr = 0;" for (left = bufsize; left > 0;) {+ /* read however many chars are waiting */? if((numread = raw_read(left, inbuf, seconds)) == SS$_TIMEOUT) return(TIMEOUT); left -= numread; if (DEBUG)C fprintf(LOGFP, "DEBUG: readbuf--read %d characters\n", numread);/ /* now process part of packet we just read */! for (j = 0; j < numread; j++)  { & buff[bfctr] = c = inbuf[j] & 0xff; fileread++; if (CRCMODE) /* CRC */5 chksm = (chksm<>(W-B)) ^ c]; else /* checksum */' chksm = ((chksm+c) & 0xff);> if (CHECKLENGTH && fileread > filelength) /* past EOF ? */ continue;+ if (tmode) /* text mode processing */ {* buff[bfctr] &= 0x7f; /* nuke bit 8 */4 if (c == CR || c == 0) /* skip CRs and nulls */ continue;- else if (c == CTRLZ) /* CP/M EOF char */ {  recfin = TRUE; continue; }? else if (!recfin) /* don't increment if past EOF */ bfctr++; }? else if (amode) /* Apple macintosh text mode processing */ {* buff[bfctr] &= 0x7f; /* nuke bit 8 */" if (c == 0) /* skip nulls */ continue;/ else if (c == CR) /* translate CR to LF */ buff[bfctr] = LF;- else if (c == CTRLZ) /* CP/M EOF char */ {  recfin = TRUE; continue; }: if (!recfin) /* don't increment if past EOF */ bfctr++; } else /* binary */ bfctr++; } : /* go to sleep to save uneeded system calls while kernel@ is reading data from serial line, fudge constant from 10 to! 9 to avoid sleeping too long  if (left && !TOOBUSY)8 sleep ((left= filelength)> logitarg("File end from YMODEM length found in sector %s\n",% sectdisp(recvsectcnt,bufsize,1)); *checksum = chksm; *bufctr = bfctr; return(0);} /* send a byte to data stream */sendbyte(data) char data; { int stat; if (DEBUG)9 fprintf(LOGFP, "DEBUG: sendbyte %02xh\n", data & 0xff);j if ((stat = raw_write(data)) != SS$_NORMAL) /*write the byte (assume it goes NOW; no flushing needed) */( error ("Write error on stream", TRUE); return; }"/* send a buffer to data stream */writebuf(buffer, nbytes) char *buffer; int nbytes; { int stat; if (DEBUG)9 fprintf(LOGFP, "DEBUG: writebuf (%d bytes)\n", nbytes);h if ((stat = raw_wbuf(nbytes, buffer)) !=SS$_NORMAL) /* write the buffer (assume no TIOCFLUSH needed) */( error ("Write error on stream", TRUE); return; } 4/* set and restore tty modes for XMODEM transfers */set_passall (tpichan) int tpichan; { int curstat,i;- /* read terminal characteristic bits */ curstat = SYS$QIOW ( 0, /* efn */ tpichan, /* chan */" IO$_SENSEMODE, /* func */$ &sensemode_iosb, /* iosb */ 0, /* astadr */ 0, /* astprm */ oterm_attr, /* p1 */& 12, /* p2 */ 0, /* p3 */ 0, 0, 0 ); if (curstat != SS$_NORMAL) { fprintf (stderr,? "\n%% Problem reading command terminal characteristics."); exit (curstat); }> /* modify terminal characteristics to include PASSALL */: for (i = 0; i < 3; i++) nterm_attr[i] = oterm_attr[i];" nterm_attr[1] |= TT$M_PASSALL;# nterm_attr[1] |= TT$M_EIGHTBIT;# nterm_attr[1] |= TT$M_NOBRDCST;D nterm_attr[1] &= ~(TT$M_HOSTSYNC | TT$M_READSYNC | TT$M_TTSYNC);# nterm_attr[2] |= TT2$M_PASTHRU;, /* set terminal characteristic bits */ curstat = SYS$QIOW( 0, /* efn */ tpichan, /* chan */ IO$_SETMODE, /* func */ &input_iosb, /* iosb */ 0, /* astadr */ 0, /* astprm */ nterm_attr, /* p1 */& 12, /* p2 */ 0, 0, 0, 0 ); if (curstat != SS$_NORMAL) { fprintf (stderr,? "\n%% Problem setting command terminal characteristics."); set_nopassall(tpichan); exit (curstat); }) /* now fix up the sensed baud rate */' switch (sensemode_iosb.xmit_baud) {+ case TT$C_BAUD_110: ttyspeed = 110; break;- case TT$C_BAUD_1200: ttyspeed = 1200; break;+ case TT$C_BAUD_134: ttyspeed = 134; break;+ case TT$C_BAUD_150: ttyspeed = 150; break;- case TT$C_BAUD_1800: ttyspeed = 1800; break;/ case TT$C_BAUD_19200: ttyspeed = 19200; break;- case TT$C_BAUD_2000: ttyspeed = 2000; break;- case TT$C_BAUD_2400: ttyspeed = 2400; break;+ case TT$C_BAUD_300: ttyspeed = 300; break;- case TT$C_BAUD_3600: ttyspeed = 3600; break;- case TT$C_BAUD_4800: ttyspeed = 4800; break;) case TT$C_BAUD_50: ttyspeed = 50; break;+ case TT$C_BAUD_600: ttyspeed = 600; break;- case TT$C_BAUD_7200: ttyspeed = 7200; break;) case TT$C_BAUD_75: ttyspeed = 75; break;- case TT$C_BAUD_9600: ttyspeed = 9600; break;" default: ttyspeed = 2400; break; }( } /* end of routine set_passall */set_nopassall (tpichan) int tpichan; { int curstat;, /* set terminal characteristic bits */ curstat = SYS$QIOW ( 0, /* efn */ tpichan, /* chan */ IO$_SETMODE, /* func */ &input_iosb, /* iosb */ 0, /* astadr */ 0, /* astprm */ oterm_attr, /* p1 */& 12, /* p2 */ 0, 0, 0, 0 ); if (curstat != SS$_NORMAL) { fprintf (stderr,? "\n%% Problem setting command terminal characteristics."); exit (curstat); }* } /* end of routine set_nopassall */ setmodes() { int curstat; assign_channel();  set_passall(tt_chan); } /* restore normal tty modes */restoremodes(errcall) int errcall; { set_nopassall(tt_chan); return; } 1/* create string with a timestamp for log file */char *stamptime(){/ char *asctime(); /* stuff to get timestamp */ struct tm *localtime(), *tp; long now; time(&now); tp = localtime(&now); return(asctime(tp));}&/* get tty speed for time estimates */ getspeed() {: logitarg ("Line speed = %d bits per second\n", ttyspeed); }/* * VMODEM 2 * VMS support for UMODEM and vvrb/vvsb programs  * = * Defined herein are some utility routines to make the UNIX ' * program UMODEM run under VAX/VMS C:  * 8 * assign_channel Calls the VMS System Service $ASSIGN ' * to assign a channel to a device. + * The routine currently has the device  * "TT" hardwired into it. 0 * raw_read Reads characters from the terminal , * without any echoing or interpretation + * and with an optional timeout period. 1 * raw_write Writes a character to the terminal " * without any interpretation. - * raw_wbuf Writes a buffer to the terminal " * without any interpretation.  * ? * Some of the ideas used here were obtained from code written ( * by Max Benson and Robert Bruccoleri.  *  * Walter Reiher  * Harvard University  * Department of Chemistry  * 12 Oxford Street  * Cambridge, MA 02138  * March 11, 1983  * 9 * Modified 4-20-88 Chuck Forsberg, Omen Technology INC 7 * 17505-V NW Sauvie IS RD Portland OR 97231 omen!caf * * Added primitives for for ZMODEM use.  */ =/* ASSIGN a channel to the logical name TT, which is usually  * the terminal.  */ assign_channel() { int status; & $DESCRIPTOR(tt_descriptor, tt_name);   if (tt_chan == -1) 7 status = sys$assign(&tt_descriptor, &tt_chan, 0, 0);  else  status = SS$_NORMAL;  , if (status != SS$_NORMAL || tt_chan == -1) 6 error("ASSIGN_CHANNEL: error in SYS$ASSIGN",TRUE);  return; }  /* ? * Return the number of characters waiting in TTY input buffer  */ rdchk() {  int status;  struct tt_io_iosb iosb;  struct tt_io_tacf typeahead;  > status = SYS$QIOW(0, tt_chan, IO$_SENSEMODE|IO$M_TYPEAHDCNT,  &iosb, NULL, 0,  &typeahead, 0,  0, 0, 0, 0);   return(typeahead.byte_count); }  /* > * Read NCHAR characters from the terminal without echoing or  * interpretation. 8 * If the argument SECONDS is non-zero, use that as the + * timeout period in seconds for the read.  * : * Returns SS$_TIMEOUT in case of timeout or other error. 7 * Otherwise, returns the number of characters read.  */ "raw_read(nchar, charbuf, seconds) char *charbuf; int nchar; unsigned seconds; {  short function;  int status;  struct tt_io_iosb iosb; e s if (tt_chan == -1)  assign_channel();  u7 function = IO$_READVBLK | IO$M_NOECHO | IO$M_NOFILTR; * e if (seconds) 7 status = SYS$QIOW(0, tt_chan, function | IO$M_TIMED, c &iosb, NULL, 0,  charbuf, nchar, seconds, a &termin_mask, NULL, 0);  else * status = SYS$QIOW(0, tt_chan, function,  &iosb, NULL, 0,  charbuf, nchar, 0, t &termin_mask, NULL, 0);  c if (iosb.byte_count)  return iosb.byte_count;  return SS$_TIMEOUT; i}  //* r9 * Writes a character to the terminal without echoing or n * interpretation. o */ raw_write(c) ochar c; {  int status; t struct tt_io_iosb iosb; O p if (tt_chan == -1)  assign_channel();  i status = SYS$QIOW(0, tt_chan, s2 IO$_WRITEVBLK | IO$M_CANCTRLO | IO$M_NOFORMAT,  &iosb, NULL, 0,  &c, 1, 0, 0, 0, 0); o b8 if (status != SS$_NORMAL || iosb.status != SS$_NORMAL) 5 error("RAW_WRITE: write QIO error return.",TRUE);   return(status); 0}  0/* 6 * Writes a buffer to the terminal without echoing or  * interpretation. s */ raw_wbuf(nchar, charbuf) achar *charbuf; int nchar; {  int status;  struct tt_io_iosb iosb; t r if (tt_chan == -1)  assign_channel();   status = SYS$QIOW(0, tt_chan, !2 IO$_WRITEVBLK | IO$M_CANCTRLO | IO$M_NOFORMAT,  &iosb, NULL, 0, charbuf, nchar, 0, 0, 0, 0);  t8 if (status != SS$_NORMAL || iosb.status != SS$_NORMAL) 5 error("RAW_WRITE: write QIO error return.",TRUE); t a return(status); }  e'*[BERNARD.SYSTEM.XMODEM]HOWTOUSEIT.TXT;1+,~./ 4J-l0123KPWO567u189GHJ,How to use the VMS-ified version of XMODEM :=copy the XMODEM.EXE file to someplace you'de like to keep it.+copy the XMODEM.CLD file to the same place.+copy the XMODEM.HLB file to the same place.+copy the XMODEM.COM file to the same place.(add these lines to your LOGIN.COM file :J $ define XMODEM$DIR the_complete_path_of_the_dir_you_put_XMODEM.EXE_in $ @XMODEM$DIR:XMODEM.COM &you can get help on XMODEM by typing : $ XMHELP*[BERNARD.SYSTEM.XMODEM]MISC.C;9+,~. / 4_ -l0123KPWO 56٣7`=189GHJ#include "xmodem.h"/* Print Help Message */help() {* fprintf(stderr, "\nUsage: \n\txmodem ");= fprintf(stderr, "-[rb!rt!ra!sb!st!sa][options] filename\n");( fprintf(stderr, "\nMajor Commands --");. fprintf(stderr, "\n\trb <-- Receive Binary");, fprintf(stderr, "\n\trt <-- Receive Text");< fprintf(stderr, "\n\tra <-- Receive Apple macintosh text");+ fprintf(stderr, "\n\tsb <-- Send Binary");) fprintf(stderr, "\n\tst <-- Send Text");9 fprintf(stderr, "\n\tsa <-- Send Apple macintosh text");! fprintf(stderr, "\nOptions --");A fprintf(stderr, "\n\ty <-- Use YMODEM Batch Mode on transmit");A fprintf(stderr, "\n\tm <-- Use MODEM7 Batch Mode on transmit");: fprintf(stderr, "\n\tk <-- Use 1K packets on transmit");: fprintf(stderr, "\n\tc <-- Select CRC mode on receive");F fprintf(stderr, "\n\td <-- Delete xmodem.log file before starting");? fprintf(stderr, "\n\tl <-- (ell) Turn OFF Log File Entries");I fprintf(stderr, "\n\tx <-- Include debugging information in log file"); fprintf(stderr, "\n"); } 9/* get type of transmission requested (text or binary) */gettype(ichar) char ichar; {" if (ichar == 't' || ichar == 'T') return('t');' else if (ichar == 'b' || ichar == 'B') return('b');' else if (ichar == 'a' || ichar == 'A') return('a'); else> error("Invalid Send/Receive Parameter - not t or b", FALSE); return('\0'); }2/* return a string containing transmission type */char * prtype(ichar) char ichar; {" if (ichar == 't' || ichar == 'T') return("text");' else if (ichar == 'b' || ichar == 'B') return("binary");' else if (ichar == 'a' || ichar == 'A') return("apple"); else return(""); } M/* print error message and exit; if mode == TRUE, restore normal tty modes */error(msg, mode) char *msg; int mode; { if (mode)6 restoremodes(TRUE); /* put back normal tty modes */" fprintf(stderr, "\r\n%s\n", msg);+ if ((LOGFLAG || DEBUG) && (LOGFP != NULL)) { 3 fprintf(LOGFP, "XMODEM Fatal Error: %s\n", msg); fclose(LOGFP); } exit(-1); } @/* Construct a proper (i.e. pretty) sector count for messages */char&*sectdisp(recvsectcnt, bufsize, plus1)long recvsectcnt;int bufsize, plus1; { static char string[20]; if (plus1)* recvsectcnt += (bufsize == 128) ? 1 : 8;( if (bufsize == 128 || recvsectcnt == 0)& sprintf (string, "%d", recvsectcnt); else8 sprintf (string, "%d-%d", recvsectcnt-7, recvsectcnt); return(string); } /* type out debugging info */ xmdebug(str) char *str; { if (DEBUG && (LOGFP != NULL))% fprintf(LOGFP,"DEBUG: '%s'\n",str); } 8/* print elapsed time and rate of transfer in logfile */int quant[] = { 60, 60, 24}; 1char sep[3][10] = { "second", "minute", "hour" };prtime (numsect, seconds) long numsect;time_t seconds;{ register int i; register int Seconds; int nums[3]; int rate; if (!LOGFLAG || numsect == 0) return(0); Seconds = (int)seconds;' Seconds = (Seconds > 0) ? Seconds : 0;3 rate = (Seconds != 0) ? 128 * numsect/Seconds : 0; for (i=0; i<3; i++) {! nums[i] = (Seconds % quant[i]); Seconds /= quant[i]; }8 fprintf (LOGFP, "%ld Sectors Transfered in ", numsect); if (rate == 0) fprintf (LOGFP, "0 seconds"); else while (--i >= 0) if (nums[i])4 fprintf (LOGFP, "%d %s%c ", nums[i], &sep[i][0], nums[i] == 1 ? ' ' : 's'); fprintf (LOGFP, "\n"); if (rate != 0)F fprintf (LOGFP, "Transfer Rate = %d Characters per Second\n", ratepD{~ XMODEMVMS.BCK~l[BERNARD.SYSTEM.XMODEM]MISC.C;9_ ?); return(0);} !/* Print elapsed time estimate */projtime (numsect, fd) long numsect; FILE *fd; { register int i; register int seconds; int nums[3]; if (numsect == 0) return (0);_/* constant below should really be 1280; reduced to 90% to account for time lost in overhead */) seconds = 1422 * numsect / ttyspeed + 1; for (i=0; i<3; i++) {! nums[i] = (seconds % quant[i]); seconds /= quant[i]; }. fprintf (fd, "Estimated transmission time "); while (--i >= 0) if (nums[i])0 fprintf (fd, "%d %s%c ", nums[i], &sep[i][0], nums[i] == 1 ? ' ' : 's'); fprintf (fd, "\n"); return (0); }#*[BERNARD.SYSTEM.XMODEM]NEWCLD.CLD;1+,~./ 4Q>-l0123KPWO56.Ñ7189GHJDEFINE VERB XMODEMIMAGE "XMODEM$DIR:XMODEM.EXE"= PARAMETER P1, LABEL = FILENAME, VALUE( LIST , TYPE = $FILE ) QUALIFIER DEBUG  QUALIFIER CRC , DEFAULT QUALIFIER APPEND_LOG , DEFAULTQ QUALIFIER LOG , DEFAULT , VALUE( DEFAULT = SYS$LOGIN:XMODEM.LOG , TYPE = $FILE ) QUALIFIER MODEM7 QUALIFIER YMODEM QUALIFIER ONEK QUALIFIER BUSY0 QUALIFIER RECEIVE , VALUE( TYPE = XMODEMTYPES )- QUALIFIER SEND , VALUE( TYPE = XMODEMTYPES )C QUALIFIER SINCE , VALUE( TYPE = $DATETIME , DEFAULT = 00:00:00.00)C QUALIFIER BEFORE, VALUE( TYPE = $DATETIME , DEFAULT = 23:59:59:98) DISALLOW MODEM7 AND YMODEM DISALLOW RECEIVE AND SEND& DISALLOW (NOT RECEIVE) AND (NOT SEND)$ DISALLOW MODEM7 AND ( CRC OR ONEK ) DEFINE TYPE XMODEMTYPES KEYWORD BINARY , DEFAULT  KEYWORD TEXT KEYWORD APPLE_TEXT *[BERNARD.SYSTEM.XMODEM]README.;7+,~. / 4P -l0123KPWO 56S`^7@mg189GHJIThis is version 3.6 converted for use in the VMS environment. Several i/oGroutines were borrowed from the ZMODEM program by Chuck Forsberg, Omen FTechnoligies, and the original XMODEM program by Peter Sichel and Dave&Wecker. jerry lindsey (SMAUG::LINDSEY)P--------------------------------------------------------------------------------JThis is version 3.6 (finished 4/88) of the xmodem program which includes aAfew bugfixes and some enhancements (requested by Macintosh users)Istimulated by the xmodem release through comp.sources.unix. See the fileupdate.doc for details. P--------------------------------------------------------------------------------KThis is version 3.4 (finished 10/87) of the xmodem program, a full-featuredFXMODEM implementation for 4.3BSD. Since the previous release (versionF3.2, see volume 7 of the archives), substantial improvements have beenGmade. See the file update.doc for details. Also, some attempt has been-made to support SysV Unix systems; see below.LAs far as I am concerned, this program has reached the end of its evolution.MNewer protocols (such as ZMODEM) will not be incorporated into xmodem. CheckDout Chuck Forsberg's rz/sz programs if you are interested in ZMODEM.BTo answer one oft-asked question: No, I don't know how to tie thisKfull-featured xmodem program into tip or cu for file transfers when callingGout from a 4.3BSD system. 4.3BSD tip does have some undocumented hooksJfor tying into other programs through redirecting file descriptors, but myFminimal attempts to utilize these hooks have failed. However, severalGyears back, I built a VERY early version of xmodem (lacking XMODEM/CRC,IXMODEM-1K, MODEM7 batch or YMODEM) directly into 4.2BSD tip. The changesEworked unmodified in 4.3BSD; the diff files are contained in the file tip.diffs.P--------------------------------------------------------------------------------DThe xmodem program implements the Christensen (XMODEM) file transferMprotocol for moving files between 4.2/4.3BSD Unix systems and microcomputers.AThe XMODEM/CRC protocol, the MODEM7 batch protocol, the XMODEM-1KIblock protocol and the YMODEM batch protocol are all supported by xmodem.NFor details of the protocols, see the document edited by Chuck Forsberg titledFXMODEM/YMODEM Protocol Reference (the latest version is dated 8-4-87).JThis program runs on 4.2/4.3BSD systems ONLY. It has been tested on VAXesKand Suns against the MEX-PC program from Niteowl Software and the ZCOMM and"DSZ programs from Omen Technology.OI have tried to keep the 4.2isms (select system call, 4.2BSD/v7 tty structures,Lgettimeofday system call, etc.) confined to the source file getput.c; but I Imake no guarantees. Also, I have made no attempt to keep variable names Funder 7 characters. A version of getput.c that MAY work on Sys V Unixsystems is included.P--------------------------------------------------------------------------------BThanks to Emmet Gray (ihnp4!uiucuxc!fthood!egray) and John Rupley O(arizona!rupley!root) for the following notes about converting xmodem to Sys V.LSince I don't have a Sys V system to test a Sys V version, I won't even try.@1) Change the includes in xmodem.h from to # and from to :2) Convert the occurrences of rindex to strrchr in batch.c(3) Substitute getput.sysv.c for getput.cP--------------------------------------------------------------------------------Program history:HDescended from UMODEM 3.5 by Lauren Weinstein, Richard Conn, and others.KBased on XMODEM Version 1.0 by Brian Kantor, UCSD (3/84) (Don't blame him for what follows....):Version 2.0 (CRC-16 and Modem7 batch file transfer) (5/85)Version 2.1 (1K packets) (7/85)IVersion 2.2 (general clean-ups and multi-character read speed-ups) (9/85)OVersion 2.3 (nap while reading packets; split into several source files) (1/86)=Version 3.0 (Ymodem batch receive; associated changes) (2/86):Version 3.1 (Ymodem batch send; associated changes) (8/86)&Version 3.2 (general cleanups) (9/86) (Released to the world 1/87)?Version 3.3 (general fixes and cleanups; see update.doc) (5/87)AVersion 3.4 (general fixes and cleanups; see update.doc) (10/87) (Released to the world 3/88)?Version 3.5 (general fixes and cleanups; see update.doc) (3/88)HVersion 3.6 (general fixes and cleanups; text file translation for Mac;  see update.doc) (4/88) (Released to the world 4/88)P--------------------------------------------------------------------------------1Please send bug fixes, additions and comments to:HSteve Grandi, National Optical Astronomy Observatories (Tucson, Arizona)> {ihnp4,ncar,arizona,...}!noao!grandi grandi@noao.arizona.edu#*[BERNARD.SYSTEM.XMODEM]RECEIVE.C;11+,~./ 4]-l0123KPWO56vh,7`)&189GHJ6#include "xmodem.h"/** receive a file **/6/* returns TRUE if in the midst of a batch transfer *///* returns FALSE if no more files are coming */K/* This routine is one HUGE do-while loop with far to many indented levels.H * I chose this route to facilitate error processing and to avoid GOTOs.I * Given the troubles I've had keeping the nested IF statements straight, * I was probably mistaken... */ rfile(name) char *name;{char *sectdisp();char *cpm_vax();char *strcpy();char *ctime();time_t time();0int fd ; /* file descriptor for created file */$int checksum ; /* packet checksum */1int firstchar ; /* first character of a packet */?int sectnum ; /* number of last received packet (modulo 128) */Mint sectcurr ; /* second byte of packet--should be packet number (mod 128) */Kint sectcomp ; /* third byte of packet--should be complement of sectcurr */$int tmode ; /* text mode if true */%int amode ; /* apple mode if true */2int errors ; /* count of errors for each packet */=int sterrors ; /* count of errors during startup handshake */Xint errorflag ; /* set true when packet (or first char of putative packet) is invalid */Rint fatalerror ; /* set within main "read-packet" Do-While when bad error found *//int inchecksum ; /* incoming checksum or CRC */=int expsect ; /* expected number of sectors (YMODEM batch) */Eint firstwait ; /* seconds to wait for first character in a packet */,int bufsize; /* packet size (128 or 1024) */?long recvsectcnt; /* running sector count (128 byte sectors) */?long modtime; /* Unix style file mod time from YMODEM header */Aint filemode; /* Unix style file mode from YMODEM header */Along readbackup; /* "backup" value for characters read in file */@time_t timep[2]; /* used in setting mod time of received file */char *p; /* generic pointer */6int bufctr; /* number of real chars in read packet */Aunsigned char *nameptr; /* ptr in filename for MODEM7 protocol */.time_t start; /* starting time of transfer */7int openflag = FALSE; /* is file open for writing? */.logit("----\nXMODEM File Receive Function\n"); if (CRCMODE)" logit("CRC mode requested\n");FBATCH = FALSE; /* don't know if really are in batch mode ! */fatalerror = FALSE;@firstwait = WAITFIRST; /* For first packet ; wait short time */#sectnum = errors = recvsectcnt = 0;bufsize = 128;modtime = 0l; filemode = 0;filelength = 0l; fileread =0l; CHECKLENGTH = FALSE;)tmode = (XMITTYPE == 't') ? TRUE : FALSE;)amode = (XMITTYPE == 'a') ? TRUE : FALSE;/* start up transfer */ sterrors = 0;*flushin(); /* flush input queue */if (CRCMODE)  { sendbyte(CRCCHR); if (LONGPACK && !MDM7BAT) sendbyte(KCHR); }else sendbyte(NAK);Edo /* start of MAIN Do-While loop to read packets */ {  errorflag = FALSE;? do /* start by reading first byte in packet */ {! firstchar = readbyte(firstwait); }  while ((firstchar != SOH)  && (firstchar != STX)  && (firstchar != EOT) . && (firstchar != ACK || recvsectcnt > 0)  && (firstchar != TIMEOUT) / && (firstchar != CAN || recvsectcnt > 0));< if (firstchar == EOT) /* check for REAL EOT */ { flushin();. sendbyte(NAK); /* NAK the EOT */C if ((firstchar = readbyte(3)) != EOT) /* check next character */ {/ logit("Spurious EOT detected, ignored\n"); 4 if ((firstchar == SOH) || (firstchar == STX) ||0 (firstchar == ACK && recvsectcnt == 0) ||0 (firstchar == CAN && recvsectcnt == 0) || (firstchar == TIMEOUT)) break; else { firstchar = 0; errorflag = TRUE; } } }2 if (firstchar == TIMEOUT) /* timeout? */ {  if (recvsectcnt > 0)I logitarg("Timeout on Sector %s\n", sectdisp(recvsectcnt,bufsize,1)); errorflag = TRUE; }J if (firstchar == CAN) /* bailing out? (only at beginning) */ {! if ((readbyte(3) & 0x7f) == CAN)8 error("Reception canceled at user's request",TRUE); else { errorflag = TRUE;. logit("Received single CAN character\n"); } }K if (firstchar == ACK) /* MODEM7 batch? (only at beginning) */ { int i,c; " logit("MODEM7 Batch Protocol\n"); nameptr = buff; checksum = 0; for (i=0; i= ERRORMAX) /* over error limit? */ fatalerror = TRUE;A else /* flush input and NAK the packet */ { flushin();B while (readbyte(1) != TIMEOUT) /* wait for line to settle */ ; sendbyte(NAK); } }Z if (recvsectcnt == 0 && errorflag && firstchar != EOT) /* handle startup handshake */ { sterrors++; if (sterrors >= STERRORMAX) fatalerror = TRUE; else 5 if (CRCMODE && sterrors == CRCSWMAX && !YMDMBAT) { CRCMODE = FALSE;D logit("Sender not accepting CRC request, changing to checksum\n"); sendbyte(NAK); } else 3 if (!CRCMODE && sterrors == CRCSWMAX && !YMDMBAT) { CRCMODE = TRUE;H logit("Sender not accepting checksum request, changing to CRC\n"); sendbyte(CRCCHR); if (LONGPACK && !MDM7BAT) sendbyte(KCHR); } else  if (CRCMODE) { sendbyte(CRCCHR); if (LONGPACK && !MDM7BAT) sendbyte(KCHR); } else sendbyte(NAK); } }Gwhile ((firstchar != EOT) && !fatalerror); /* end of MAIN Do-While */:if ((firstchar == EOT) && !fatalerror) /* normal exit? */ {, if (openflag) /* close the file */ close(fd);) sendbyte(ACK); /* ACK the EOT */ logit("Receive Complete\n");5 prtime (recvsectcnt, time((time_t *) 0) - start);? if (openflag && modtime) /* set file modification time */ { timep[0] = time((time_t *) 0); timep[1] = modtime; }: if (BATCH) /* send appropriate return code */ return(TRUE); else return(FALSE); }(else /* no, error exit */ {  if (openflag) {K sendbyte(CAN); sendbyte(CAN); sendbyte(CAN); sendbyte(CAN); sendbyte(CAN); close(fd);: error("ABORTED -- Too Many Errors--deleting file", TRUE); } else  if (recvsectcnt != 0)/ error("ABORTED -- Too Many Errors", TRUE); else? error("ABORTED -- Remote system is not responding", TRUE); }return(FALSE);} *[BERNARD.SYSTEM.XMODEM]SEND.C;13+,~./ 4e-l0123KPWO56E۸7nz189GHJ&/** send a file **//*E * Operation of this routine depends on on MDM7BAT and YMDMBAT flags. */ * If "name" is NULL; close out the BATCH send. */#include "xmodem.h"void sfile(name) char *name;{char *sectdisp();time_t time();char *strcpy();char *vax_cpm();char *cpmify();long countnl();Nextern unsigned short crctab[1<amode = (XMITTYPE == 'a') ? TRUE : FALSE; /* set apple mode */closeout = FALSE;7if (strcmp(name,"") == 0) /* Check on NULL file name */ if (BATCH) closeout = TRUE; else { sendbyte(CAN); sendbyte(CAN); sendbyte(CAN);' error("NULL file name in send", TRUE); }0if (!closeout) /* Are we closing down batch? */# { /* no; let's send a file */* logit("----\nXMODEM Send Function\n");* if ((fd = open(name, O_RDWR, 0)) < 0)  {  sendbyte(CAN); sendbyte(CAN); sendbyte(CAN);) error("Can't open file for send", TRUE); } : stat(name, &filestatbuf); /* get file status bytes */ % if (tmode) /* count up NLs */$ filestatbuf.st_size += countnl(fd);, expsect = (filestatbuf.st_size/128) + 1;  if (LOGFLAG) { ) fprintf(LOGFP, "File Name: %s\n", name);: fprintf(LOGFP,"File Size %ldK, %ld Records, %ld Bytes\n",? (filestatbuf.st_size/1024)+1, expsect, filestatbuf.st_size); projtime(expsect, LOGFP); } }else {* logit("----\nXMODEM Send Function\n");/ logit("Closing down Batch Transmission\n"); }6bufsize = buf1024 ? 1024 : 128; /* set sector size */if (buf1024 && !closeout)% logit("1K packet mode chosen\n");sendfin = nlflag = FALSE; attempts = 0;2restart: /* wait for and read startup character */do {/ while (((firstchar=readbyte(1)) != NAK) && 1 (firstchar != CRCCHR) && (firstchar != CAN)) if (++attempts > NAKMAX) { if (MDM7BAT && startup) { sendbyte(ACK);  sendbyte(EOT); } 1 error("Remote System Not Responding", TRUE); }" if ((firstchar & 0x7f) == CAN) if (readbyte(3) == CAN)4 error("Send cancelled at user's request",TRUE); if (firstchar == CRCCHR) { CRCMODE = TRUE; if (!closeout)# logit("CRC mode requested\n"); if (readbyte(1) == KCHR) { buf1024 = TRUE;0 logit("Receiver invoked 1K packet mode\n"); } } }0while (firstchar != NAK && firstchar != CRCCHR);5if (MDM7BAT && closeout) /* close out MODEM7 batch */ { sendbyte(ACK);  sendbyte (EOT); flushin(); " readbyte(2); /* flush junk */ return; }4if (MDM7BAT && startup) /* send MODEM7 file name */ {' if (send_name(vax_cpm(name)) == -1) { attempts = 0; goto restart; } startup = FALSE; attempts = 0;  goto restart; } sectnum = 1;Bif (YMDMBAT) /* Fudge for YMODEM transfer (to send name packet) */ { sectnum = 0; bufsize = 128; filepack = TRUE; }attempts = sentsect = 0;start = time((time_t *) 0);Ldo /* outer packet building/sending loop; loop till whole file is sent */ { C if (closeout && YMDMBAT && sectnum == 1) /* close out YMODEM */ return;L if (YMDMBAT && sectnum == 1) /* get set to send YMODEM data packets */ { bufsize = buf1024 ? 1024 : 128;& do /* establish handshaking again */ {I while (((firstchar=readbyte(2)) != CRCCHR) && (firstchar != NAK) &&  (firstchar != CAN)) if (++attempts > ERRORMAX)7 error("YMODEM protocol botch, C expected", TRUE); if ((firstchar&0x7f) == CAN) if (readbyte(3) == CAN)3 error("Send cancelled at User's request", TRUE); }5 while ((firstchar != CRCCHR) && (firstchar != NAK)); attempts = 0; }1 if ((bufsize == 1024) && (attempts > KSWMAX)) {@ logit("Reducing packet size to 128 due to excessive errors\n"); bufsize = 128; }8 if ((bufsize == 1024) && ((expsect - sentsect) < 8)) {= logit("Reducing packet size to 128 for tail end of file\n"); bufsize = 128; }& if (sectnum > 0) /* data packet */ {" for (bufctr=0; bufctr < bufsize;) { if (nlflag) { . buff[bufctr++] = LF; /* leftover newline */ nlflag = FALSE; } if (getbyte(fd, &c) == EOF) { 0 sendfin = TRUE; /* this is the last sector *// if (!bufctr) /* if EOF on sector boundary */. break; /* avoid sending extra sector */X buff[bufctr++] = CTRLZ; /* pad with Ctrl-Z for CP/M EOF (even do for binary files) */ continue; } ; if (tmode && c == LF) /* text mode & Unix newline? */ {4 buff[bufctr++] = CR; /* insert carriage return */ if (bufctr < bufsize)+ buff[bufctr++] = LF; /* insert LF */ else1 nlflag = TRUE; /* insert on next sector */ } else : if (amode && c == LF) /* Apple mode & Unix newline? */. buff[bufctr++] = CR; /* substitute CR */ else= buff[bufctr++] = c; /* copy the char without change */ }. if (!bufctr) /* if EOF on sector boundary */- break; /* avoid sending empty sector */ } & else /* YMODEM filename packet */ {< for (bufctr=0; bufctr> 8) & 0xff); } }7 bbufcnt = 0; /* start building block to be sent */V blockbuf[bbufcnt++] = (bufsize == 1024) ? STX : SOH; /* start of packet char */= blockbuf[bbufcnt++] = sectnum; /* current sector # */> blockbuf[bbufcnt++] = ~sectnum; /* and its complement */, checksum = 0; /* initialize checksum */. for (bufctr=0; bufctr < bufsize; bufctr++) {$ blockbuf[bbufcnt++] = buff[bufctr]; if (CRCMODE)I checksum = (checksum<>(W-B)) ^ buff[bufctr]]; else1 checksum = ((checksum+buff[bufctr]) & 0xff); }" if (CRCMODE) /* put in CRC */ { checksum &= 0xffff;0 blockbuf[bbufcnt++] = ((checksum >> 8) & 0xff);) blockbuf[bbufcnt++] = (checksum & 0xff); } else /* put in checksum */ blockbuf[bbufcnt++] = checksum; attempts = 0; ! do /* inner packet loop */ {3 writebuf(blockbuf, bbufcnt); /* write the block */D flushin(); /* purge anything in input queue */ if (DEBUG)Y fprintf (LOGFP, "DEBUG: %d byte Packet %02xh (%02xh) sent, checksum %02xh %02xh\n", e bbufcnt, blockbuf[1]&0xff, blockbuf[2]&0xff, blockbuf[bufsize+3]&0xff, blockbuf[bufsize+4]&0xff); attempts++;9 sendresp = readbyte(10); /* get response from remote */ if (sendresp != ACK) { if (sendresp == TIMEOUT) {B logitarg("Timeout on sector %s\n",sectdisp(sentsect,bufsize,1)); } else  if (sendresp == NAK) {B logitarg("NAK on sector %s\n",sectdisp(sentsect,bufsize,1)); } else {F logitarg("Non-ACK on sector %s\n",sectdisp(sentsect,bufsize,1)); } } }P while((sendresp != ACK) && (attempts < ERRORMAX)); /* close of inner loop */5 sectnum++; /* increment to next sector number */ if (!filepack)& sentsect += (bufsize == 128) ? 1 : 8; filepack = FALSE; }Cwhile (!sendfin && ( attempts < ERRORMAX)); /* end of outer loop */if (attempts >= ERRORMAX) { sendbyte(CAN);  sendbyte(CAN);  sendbyte(CAN);  sendbyte(CAN);  sendbyte(CAN);4 error ("Too many errors in transmission", TRUE); } attempts = 0;9sendbyte(EOT); /* send 1st EOT to close down ~ XMODEMVMS.BCK~l [BERNARD.SYSTEM.XMODEM]SEND.C;13eRtransfer */ Qwhile ((readbyte(15) != ACK) && (attempts++ < EOTMAX)) /* wait for ACK of EOT */ { if (attempts > 1)/ logitarg("EOT not ACKed, try %d\n", attempts); sendbyte(EOT); }if (attempts >= RETRYMAX)> error("Remote System Not Responding on Completion", TRUE); close(fd);logit("Send Complete\n");-prtime(sentsect, time((time_t *) 0) - start);}"*[BERNARD.SYSTEM.XMODEM]UNIXIO.H;10+,~./ 4B`-l0123KPWO56>7@189GHJ8/* UNIXIO.H definitions for unix emulation functions */#include stdio struct stat { unsigned st_dev; unsigned short st_ino[3]; unsigned short st_mode; int st_nlink; unsigned st_uid; unsigned short st_gid; char *st_rdev; unsigned st_size; unsigned st_atime, st_mtime, st_ctime; char st_fab_rfm, st_fab_rat, st_fab_fsz; unsigned short st_fab_mrs; };typedef struct stat stat_t; #ifndef size_t# define size_t int#endifint close (int file_desc);4int creat (char *file_spec, unsigned int mode, ...);int dup (int file_desc);*int dup2 (int file_desc1, int file_desc2);>int open (char *file_spec, int flags, unsigned int mode, ...);6int read (int file_desc, void *buffer, size_t nbytes);7int write (int file_desc, void *buffer, size_t nbytes);5int lseek (int file_desc, int offset, int direction);*int fstat (int file_desc, stat_t *buffer);,int stat (char *file_spec, stat_t *buffer);1char *getname (int file_desc, char *buffer, ...);int isapipe (int file_desc);int isatty (int file_desc);char *ttyname (void);#int delete (const char *file_spec);#int remove (const char *file_spec);Bint rename (const char *old_file_spec, const char *new_file_spec);char *mktemp (char *template);'int access (char *file_spec, int mode);#*[BERNARD.SYSTEM.XMODEM]UPDATE.DOC;5+,~./ 4P-l0123KPWO56`Xtp7v189GHJ&Changes leading to version 3.3=1) "Better" handshaking for MODEM7 batch transfers (5/19/87).J2) If reception of a file is aborted due to errors, delete incomplete file (5/19/87).G3) If an "impossible" tty speed is detected, assume 1200 bps (5/19/87).L4) Disallow CAN-CAN abort during file send or receive except at beginning ofLfile transfer (during batch transfers, CAN-CAN abort is allowed at beginning!of each file transfer) (5/19/87).I5) Uncouple total allowed errors during the reception of a single packet rO(ERRORMAX, now made 10) and errors allowed when starting transfer (STERRORMAX, Iset to 10) (5/19/87).sK6) Fix some bugs when receiving an empty file and when a phase error occursb"during a file reception (5/19/87).H7) Portability fix in prtime and projtime; they also handle pathologicalcases better (5/19/87).iJ8) During file reception an EOT is not believed unless it is sent again inresponse to a NAK (5/25/87).L9) Modified cpm_unix and unixify so a filename without an extension will notGhave a trailing dot in its filename after being received in a MODEM7 orR YMODEM batch transfer (5/25/87).F10) Allowable errors during transmission of a single packet now set toERRORMAX (5/27/87).eK11) When transferring a binary file, the YMODEM file length field is filledlGin on transmit and (if present) used to truncate the file on reception.OOA new truncate function (truncfile) added to getput.c to do the deed (5/28/87).MAThe file mode field is also set but is ignored on file reception.lM12) In a batch receive (xmodem -rt), program can be forced into checksum modeMBby specifying the "M" flag indicating a MODEM7 transfer (5/30/87).L13) Changed the "B" option to "M" to indicate MODEM7 batch. Made all optionEflags case insensitive. Command line is now recorded in the log filem (5/30/87).M14) The "KND/IMP" convention of using "CK" to invoke 1K packets during YMODEMiNbatch transfers was installed. This code will be sent during a batch receive Mif "K" is included on the command line unless "M" is also present. This codeoBwill be recognized when sending under all circumstances (5/30/87).N------------------------------------------------------------------------------Changes leading to version 3.41) Fix usage message (10/2/87).dL2) Sender will now try up to 10 times (EOTMAX) to send an EOT to terminate aJtransmission. Used to be 5 times, but Chuck Forsberg's "official" minimum-requirements for YMODEM mandate 10 (10/2/87). M3) Handle YMODEM file modification times if present in header on reception ofsGboth binary and text files (10/2/87). Retracted when can't seem to get.Gproper times whn playing with dsz (10/3/87). Found bug and reinstalled-/feature (10/16/87). Found REAL bug (10/21/87).FL4) Null bytes are now stripped out of files when received as text files (MEXDdoesn't seem to want to put in the terminating control-Z) (10/3/87).K5) Slightly modified terminal parameter setting to explicitly turn of CRMOD)Kand to flush read queue; ideas stolen from Kermit. Will it fly on Pyramid?i (10/3/87).H6) Decreased time between "startup" characters sent when starting a fileHreceive operation. This should increase perceived response. Now waits CWAITFIRST seconds (set to 1) instead of 6 (waits for 5 seconds for t:subsequent packets. STERRORMAX now 60, CRCSWMAX now 30. ;Timeouts on 1st sector no longer reported in log (10/5/87)..D7) Once again played with kernel sleeps in readbuf() (packet readingLroutine). On busy system could cause real problems. Now supply flag (t) toPsuppress sleeping on Too Busy systems. No longer suppress sleep when speeds areIover 4800 bps. Sleep kludge DOES help: on an empty 750 running 4.3BSD, a.Kfile reception at 2400 bps used 6% of the CPU with the sleep kludge and 24%f=without it (data transfer rates were the the same) (10/5/87). I8) Actually count characters as they are being read for a file reception.iJWhen YMODEM file length is set, stop writing characters when reach length.BThis will allow YMODEM file lengths to work for text files and theGelimination of truncfile() in getput.c (which was impossible for SYS V) (10/5/87).L9) Another attempt at tty modes. Now do nothing but set speeds, set mode to/raw, and turn off echoing and tandem (10/6/87).gN------------------------------------------------------------------------------Changes leading to version 3.5K1) Following the suggestion of Bill Carpenter (ho5cad!wjc), I changed everyiMprintf("") to fprintf(stderr, "") so one can use xmodem on either end of unixoto unix link. (3/24/88).D2) Again, thanks to Bill Carpenter, corrected typo in stamptime() ingetput.sysv.c (3/24/88).M3) Thanks to Steve Lebowitz (prcpto!pdvshl), fixed a && that should have been a & in getput.sysv.c (3/25/88).M4) Thanks to Leo Pilachowski, who managed to fool xmodem by "preplacing" ACKSIin the VAX's input queue (improves throughput by 20%, says Leo, but makesnEerror recovery a tad dicey...!). Implemented a flushin() function inoKgetput.c to flush any pending characters. flushin is called in send.c justaLafter sending a packet to make sure a proper ACK or NAK is received (I hope Cfast machines don't beat me to it and get their ACKS flushed!). In Hreceive.c, flushin is called prior to the "startup" characters, prior toHsending the packet acknowledgment ACK and prior to the NAK prompting forJconfirming EOT. Now how does one implement flushin() on Sys V? (3/25/88).G5) Fixed pair of bugs in send.c: YMODEM test enforcing CRC was testing Inumber of attempts against STERRORMAX instead of ERRORMAX (also shorteneddItimeout interval on this read) and a "timeout" during packet send was notcLnoticed (due to a > instead of a >=) thus program started sending EOTs which further delayed abort (3/28/88).M6) Modified send.c and cpmify function in batch.c to strip path names on fileK4names transmitted as part of YMODEM batch (3/28/88).F7) Hacked receive.c to make end of loop processing clearer and improve4garbage flushing when errors are detected (3/28/88).O8) Pulled out of decision restricting YMODEM batch send to use CRC only. Will hJnow gladly use checksum if told to and will respond to NAK as well as the Oproper C when starting up data transfer (3/28/88). Turns out this patch fixes 2!problem with Red Ryder (4/10/88).mK9) Tested MODEM7 batch against MEX-PC. Confirmation of EOT during filename Ktransmission was not working, so xmodem wasn't shutting down a MODEM7 batchiJreceive. Removed code to NAK first EOT and wait for second EOT (3/28/88).L10) Added code to count number of newlines in a text file to get an accurateJfile size. I thought it would take too long; but seems to be quite nimbleG(see countnl in getput.c). We now transmit YMODEM file length and modep7information for text as well as binary files (3/29/88).sM11) After a YMODEM file name packet was received, forgot to reset "wait" timeiDfor receiving first character of data packet which definitely slowedAperceived performance. (See note 6 for v. 3.4). Fixed (4/7/88)./N------------------------------------------------------------------------------Changes leading to version 3.6J1) Added two new major commands (sa and ra) to send and receive text filesKfor Apple Macintoshs which use CR as EOL character instead of the MS/DOS CRaHLF pair. Thanks to Dave Nowak (djnowak@iseesun.DPL.SCG.HAC.COM) for theinspiration (4/11/88).L2) Experiences with Red Ryder 10.3. Fixed botch in receive.c that led to anJinfinite loop when a checksum failed on YMODEM file name packet. Now haveJseperate variables for packet errors and "startup" errors. Prevent CRC toMchecksum switch during receive startup if YMDMBAT flag is true. This insuresnIthat no such transition will ever take place on second or subsequent filerMtransfer; can be set on first file by including Y option on command line. No.Ilonger print "0" expected sectors if both YMODEM file length and KMD fileelength are both 0 (4/12/88).H3) Cleaned up ifs in readbuf. Removed void declaration on flushin (willFbreak 4.2BSD compiler?). Corrected "number of sent sectors" on YMODEM2transfer (was counting filename packet) (4/12/88).K4) More experiences with Red Ryder. Removed line flush before every CRCCHRlKor NAK trying to start a receive (RR YMODEM batch send to the VAX now seems Hto work). Fixed KMD "1K reception flag" to work properly on a receive. IAdded a flushin just before program exits in a futile effort to eliminate/BRR's nasty habit of sending a final EOT down the line. ReaarangedDvariables in send.c so longpackets requested by the KMD flag are notL"sticky" from file to file in a batch. RR is a real DOG: ony gets about 133?cps when downloading to a Mac over a 9600 bps line! (4/14/88). HN------------------------------------------------------------------------------;Thanks to Keith Peterson (w8sdz@simtel20.arpa), John RupleyrL(arizona!rupley!root), Emmet Gray (ihnp4!uiucuxc!fthood!egray), Bob BickfordG(lll-crg!well!rab), Doug Moore (moore@svax.cs.cornell.edu), David BrowndM(jdb@ncsc.arpa), Bill Carpenter (ho5cad!wjc), Steve Lebowitz (prcpto!pdvshl),"GLeo Pilachowski, Dave Nowak (djnowak@iseesun.DPL.SCG.HAC.COM) and Chuck LForsberg's documents and his ZCOMM/DSZ/rz/sz programs for ideas, suggestionsand comments. #*[BERNARD.SYSTEM.XMODEM]VAXSUPP.C;25+,~. / 4P -l0123KPWO 56nҴϑ7`189GHJ#include stdio#include string#include stdlib#include iodef#include descrip#include climsgdef #include rms#include unixio #include file#include ssdef#include libdeflong CvtTime( Where , There )char *Where ; char *There ;{ long Count ;struct dsc$descriptor R_Descr ;5for ( Count = 0 ; Count < strlen( Where ) ; Count++ )0 Where[ Count ] = toupper( Where[ Count ] ) ;(R_Descr.dsc$w_length = strlen( Where ) ;%R_Descr.dsc$b_dtype = DSC$K_DTYPE_T ;%R_Descr.dsc$b_class = DSC$K_CLASS_S ;R_Descr.dsc$a_pointer = Where ;*return( SYS$BINTIM( &R_Descr , There ) ) ;}long CmpTime( Time1 , Time2 ) long *Time1 ; long *Time2 ;{if ( Time1[ 1 ] > Time2[ 1 ] ) return( 1 ) ;if ( Time1[ 1 ] < Time2[ 1 ] ) return( -1 ) ;>if ( (unsigned long) Time1[ 0 ] > (unsigned long) Time2[ 0 ] ) return( 1 ) ;>if ( (unsigned long) Time1[ 0 ] < (unsigned long) Time2[ 0 ] ) return( -1 ) ; return( 0 ) ;}/*++ *//* *//* **-Present *//* */G/* Builds appropriate descriptor from passed argument, and calls */2/* CLI$PRESENT(), returning CLI$_ABSENT *//* CLI$_PRESENT */!/* CLI$_DEFAULTED *//* CLI$_NEGATED *//* *//*-- */long Present( Label ) char *Label ;{struct dsc$descriptor R_Label ;(R_Label.dsc$w_length = strlen( Label ) ;%R_Label.dsc$b_dtype = DSC$K_DTYPE_T ;%R_Label.dsc$b_class = DSC$K_CLASS_S ;R_Label.dsc$a_pointer = Label ;#return( CLI$PRESENT( &R_Label ) ) ;}/*++ *//* *//* **-GetValue *//* */G/* Builds appropriate descriptor from passed argument and calls */L/* CLI$GET_VALUE(), returning value returned by that call to A_Value, */L/* limited to a maximum of L_MaxChar characters. returns CLI$_ABSENT *//* CLI$_PRESENT *//* *//*-- */.long GetValue( A_Label , A_Value , L_MaxChar )char *A_Label ;char *A_Value ;long L_MaxChar ;{long L_Status ;short W_RetLen ; char T_RetStr[ 255 ] ;struct dsc$descriptor R_Label ;$$DESCRIPTOR( R_Return , T_RetStr ) ;!R_Label.dsc$a_pointer = A_Label ;*R_Label.dsc$w_length = strlen( A_Label ) ;%R_Label.dsc$b_dtype = DSC$K_DTYPE_T ;%R_Label.dsc$b_class = DSC$K_CLASS_S ; *if ( (L_Status = CLI$GET_VALUE( &R_Label , &R_Return ,! &W_RetLen )) == CLI$_ABSENT ) { *A_Value = '\0' ; return( CLI$_ABSENT ) ; }T_RetStr[ W_RetLen ] = '\0' ;+strncpy( A_Value , T_RetStr , L_MaxChar ) ;if ( W_RetLen > L_MaxChar )! A_Value[ L_MaxChar ] = '\0' ; return( CLI$_PRESENT ) ;}/*++ *//* *//* **-ParseFile *//* */N/* Parses filename (applying defaults from A_Default ) into FAB and NAM. *//* *//*-- */7long ParseFile( A_FileName , A_Default , A_FabBlk )4char *A_FileName ; /* Name of file to parse */Hchar *A_Default ; /* Default file string to apply when parsing */Estruct FAB *A_FabBlk ; /* address of an File Allocation Block */{#define StrSize 255long L_Status ;if ( A_FabBlk->fab$l_nam ) {- cfree( A_FabBlk->fab$l_nam->nam$l_esa ) ;- cfree( A_FabBlk->fab$l_nam->nam$l_rsa ) ;" cfree( A_FabBlk->fab$l_nam ) ;" cfree( A_FabBlk->fab$l_xab ) ; }*A_FabBlk = cc$rms_fab ;!A_FabBlk->fab$l_fop = FAB$M_NAM ;:A_FabBlk->fab$l_nam = calloc( 1 , sizeof( struct NAM ) ) ;=A_FabBlk->fab$l_xab = calloc( 1 , sizeof( struct XABDAT ) ) ;;*((struct XABDAT *)(A_FabBlk->fab$l_xab)) = cc$rms_xabdat ;%*(A_FabBlk->fab$l_nam) = cc$rms_nam ;"A_FabBlk->fab$l_fna = A_FileName ;,A_FabBlk->fab$b_fns = strlen( A_FileName ) ;8A_FabBlk->fab$l_nam->nam$l_esa = calloc( 1 , StrSize ) ;*A_FabBlk->fab$l_nam->nam$b_ess = StrSize ;8A_FabBlk->fab$l_nam->nam$l_rsa = calloc( 1 , StrSize ) ;*A_FabBlk->fab$l_nam->nam$b_rss = StrSize ;1A_FabBlk->fab$l_nam->nam$b_nop = NAM$M_SRCHXABS ;'if ( A_Default && strlen( A_Default ) ) {% A_FabBlk->fab$l_dna = A_Default ;/ A_FabBlk->fab$b_dns = strlen( A_Default ) ; } !return( sys$parse( A_FabBlk ) ) ;}/*++ *//* *//* **-SearchFile *//* */K/* Searches filename using previously initialized and parsed FAB/NAM */;/* puts successfully parsed filename in A_FileName *//* *//*-- */,long SearchFile( A_FabBlk , A_FileName )struct FAB *A_FabBlk ;char *A_FileName ;{long L_Status ;#L_Status = sys$search( A_FabBlk ) ;0if ( A_FileName && ( L_Status == RMS$_NORMAL ) ) {: strncpy( A_FileName , A_FabBlk->fab$l_nam->nam$l_rsa ,( A_FabBlk->fab$l_nam->nam$b_rsl ) ;9 A_FileName[ A_FabBlk->fab$l_nam->nam$b_rsl ] = '\0' ; } return( L_Status ) ;}/*++ *//* *//* **-CheckParse *//* */N/* looks to see if parsed file name had wildcards or search lists in it *//* *//*-- */(long CheckParse( A_FabBlk , L_Mask )struct FAB *A_FabBlk ;long L_Mask ;{.if ( A_FabBlk->fab$l_nam->nam$l_fnb & L_Mask ) return( TRUE ) ;else return( FALSE ) ;}/* *//* *//* */(void CopyFileName( A_Where , A_Fab )char *A_Where ;struct FAB *A_Fab ;{Pstrncpy( A_Where , A_Fab->fab$l_nam->nam$l_esa , A_Fab->fab$l_nam->nam$b_esl ) ;/A_Where[ A_Fab->fab$l_nam->nam$b_esl ] = '\0' ;}!*[BERNARD.SYSTEM.XMODEM]VMODEM.H;6+,~./ 4-l0123KPWO56ಙ7G189GHJ/* * VMODEM.H * VMS support for UMODEM program * * #INCLUDE files defining structures associated with terminal * information structure TT_INFO. * Information about the terminal is passed around in UMODEM in a * STRUCT TT_INFO. * * Walter Reiher * Harvard University * Department of Chemistry * 12 Oxford Street * Cambridge, MA 02138 * March 10, 1983 */ struct tt_mode /* Info for a IO$_SETMODE call */ { char class; char type; short page_width; char bcharacteristics[3]; char page_length; int echaracteristics; }; struct tt_mode_iosb /* Terminal IO$_SENSEMODE IOSB */ { short status; char t_speed; char r_speed; char CR_fill; char LF_fill; char parity_flags; char unused2; }; struct tt_info /* Summary of terminal infomation */ { struct tt_mode dev_characteristics; struct tt_mode_iosb dev_modes; }; "*[BERNARD.SYSTEM.XMODEM]WRONG.TXT;1+,~./ 4Mj-l0123KPWO56s Α7189GHJMFrom: SSDEVO::BATES "Ken Bates DTN 522-2039" 3-DEC-1988 08:21:46.46To: CVG::CAMPANELLACC: Subj: XModem bugMike,MI just tried your new XMODEM program, and am having some trouble with it. Thescenario is as follows: 1. I'm in directory [BATES]> 2. I issue the command "xm/send=app/one/ym [.sim]*.genral"; 3. I receive the first file "DUAL_70.GENRAL" (correct).? 4. The next file is called "DUAL_70.GENRAL #1" (Incorrect).B 5. The transfer ends with 8 more files left to be transferred.@Any idea what I could be doing wrong or what the problem may be? - Ken*[BERNARD.SYSTEM.XMODEM]XAB.H;3+,~./ 4^-l0123KPWO56ZtÑ7189GHJ(H/* XABALL -- Allocation Controll Extended Attribute Block Definitions */struct XABALL {! unsigned char xab$b_cod; .#define XAB$C_ALL 20 /* XABALL type code */! unsigned char xab$b_bln; A#define XAB$C_ALLLEN 0x20 /* XABALL block length (32 bytes) */#define XAB$K_ALLLEN 0x20 unsigned : 16; /* spare */- char *xab$l_nxt; /* Next XAB in chain */: unsigned char xab$b_aop; /* allocation options */I#define XAB$V_HRD 0 /* fail if requestd alignmt cannot be performed */$#define XAB$M_HRD (1 << XAB$V_HRD)>#define XAB$V_ONC 1 /* locate space on cylinder boundary */$#define XAB$M_ONC (1 << XAB$V_ONC)<#define XAB$V_CBT 5 /* contiguous allocation, best try */$#define XAB$M_CBT (1 << XAB$V_CBT)2#define XAB$V_CTG 7 /* contiguous allocation */$#define XAB$M_CTG (1 << XAB$V_CTG)? unsigned char xab$b_aln; /* alignment boundary type */3#define XAB$C_ANY 0 /* any type of allocation */B#define XAB$C_CYL 1 /* alignment starts at cylinder boundary */G#define XAB$C_LBN 2 /* allocate at specified logical block number */I#define XAB$C_VBN 3 /* allocate near specified virtual block number */7#define XAB$C_RFI 4 /* allocate near related file */? unsigned short xab$w_vol; /* relative volume number */; unsigned long xab$l_loc; /* allocation location */; unsigned long xab$l_alq; /* allocation quantity */C unsigned short xab$w_deq; /* default extension quantity */\ unsigned char xab$b_bkz; /* bucket size used with the relative and indexed files */B unsigned char xab$b_aid; /* area identification number */( /* related file identification */5 unsigned short xab$w_rfi0; /* file number */#define xab$w_rfi xab$w_rfi04 unsigned short xab$w_rfi2; /* seq number */4 unsigned short xab$w_rfi4; /* rev number */ unsigned : 16; /* spare */ };Zglobalref struct XABALL cc$rms_xaball; /* Declare initialized prototype data structures */M/* struct representing a 64-bit binary value expressing the date and time */8#define XAB_DATE_TIME { unsigned : 32; unsigned : 32; }B/* XABDAT -- Date and Time Extended Attribute Block Definitions */struct XABDAT {" unsigned char xab$b_cod; -#define XAB$C_DAT 18 /* XABDAT type code */" unsigned char xab$b_bln; N#define XAB$C_DATLEN 0x2C /* XABDAT block length constant - V3 (44 bytes) */#define XAB$K_DATLEN 0x2CF#define XAB$C_DATLEN_V2 0x24 /* XABDAT block length constant - V2 */#define XAB$K_DATLEN_V2 0x24 unsigned : 16; /* spare */+ char *xab$l_nxt; /* Next XAB in chain */7 unsigned short xab$w_rvn; /* revision number */ unsigned : 16; /* spare */@ struct XAB_DATE_TIME xab$q_rdt; /* revision date and time */@ struct XAB_DATE_TIME xab$q_cdt; /* creation date and time */B struct XAB_DATE_TIME xab$q_edt; /* expiration date and time */> struct XAB_DATE_TIME xab$q_bdt; /* backup date and time */ };Zglobalref struct XABDAT cc$rms_xabdat; /* Declare initialized prototype data structures */P/* XABFHC -- File Header Characteristics Extended Attribute Block Definitions */struct XABFHC {" unsigned char xab$b_cod; -#define XAB$C_FHC 29 /* XABFHC type code */" unsigned char xab$b_bln; @#define XAB$C_FHCLEN 0x2C /* XABFHC block length (44 bytes) */#define XAB$K_FHCLEN 0x2C unsigned : 16; /* spare */0 char *xab$l_nxt; /* Next XAB in chain */J unsigned char xab$b_rfo; /* record format and file organization */8 unsigned char xab$b_atr; /* record attributes */? unsigned short xab$w_lrl; /* longest record's length */E unsigned long xab$l_hbk; /* high virtual block in the file */8 unsigned long xab$l_ebk; /* end-of-file block */L unsigned short xab$w_ffb; /* first free byte in end-of-file block */2 unsigned char xab$b_bkz; /* bucket size */G unsigned char xab$b_hsz; /* fixed length control header size */; unsigned short xab$w_mrz; /* maximun record size */G unsigned short xab$w_dxq; /* default file extension quantity */C unsigned short xab$w_gbc; /* default global buffer count */ unsigned : 32; /* spare */ unsigned : 32; /* spare */G unsigned short xab$w_verlimit; /* version limit for the file */R unsigned long xab$l_sbn; /* starting logical block number if contiguous */ };Zglobalref struct XABFHC cc$rms_xabfhc; /* Declare initialized prototype data structures */C/* XABKEY -- Key Definition Extended Attribute Block Definitions */struct XABKEY {! unsigned char xab$b_cod; .#define XAB$C_KEY 21 /* XABKEY type code */! unsigned char xab$b_bln; A#define XAB$C_KEYLEN 0x4C /* XABKEY block length (76 bytes) */#define XAB$K_KEYLEN 0x4C#define XAB$C_KEYLEN_V2 0x40#define XAB$K_KEYLEN_V2 0x40 unsigned : 16; /* spare */4 char *xab$l_nxt; /* Next XAB address in chain */? unsigned char xab$b_ian; /* index level area number */I unsigned char xab$b_lan; /* lowest level of index area number */? unsigned char xab$b_dan; /* data bucket area number */< unsigned char xab$b_lvl; /* level of root bucket */K unsigned char xab$b_ibs; /* index bucket size in virtual blocks */J unsigned char xab$b_dbs; /* data bucket size in virtual blocks */N unsigned long xab$l_rvb; /* root bucket start virtual block number */9 unsigned char xab$b_flg; /* key option flag byte */9#define XAB$V_DUP 0 /* duplicate key value allowed */$#define XAB$M_DUP (1 << XAB$V_DUP)H#define XAB$V_CHG 1 /* may change on update (alternate keys only) */$#define XAB$M_CHG (1 << XAB$V_CHG)I#define XAB$V_NUL 2 /* null key value enable (alternate keys only) */$#define XAB$M_NUL (1 << XAB$V_NUL)N#define XAB$V_IDX_NCMPR 3 /* indicates index records are not compressed */0#define XAB$M_IDX_NCMPR (1 << XAB$V_IDX_NCMPR)K#define XAB$V_KEY_NCMPR 6 /* indicates primary key is not compressed */0#define XAB$M_KEY_NCMPR (1 << XAB$V_KEY_NCMPR)K#define XAB$V_DAT_NCMPR 7 /* indicated data record is not compressed */0#define XAB$M_DAT_NCMPR (1 << XAB$V_DAT_NCMPR); unsigned char xab$b_dtp; /* key field data type */D#define XAB$C_STG 0 /* left-justified string of unsigned bytes */<#define XAB$C_IN2 1 /* signed 15 bit integer (2 bytes) */3#define XAB$C_BN2 2 /* unsigned 2-byte binary */<#define XAB$C_IN4 3 /* signed 31 bit integer (4 bytes) */3#define XAB$C_BN4 4 /* unsigned 4-byte binary */?#define XAB$C_PAC 5 /* packed decimal string (1-16 bytes) */2#define XAB$C_IN8 6 /* signed 63 bit integer */*#define XAB$C_BN8 7 /* 8 byte binary */7#define XAB$C_MAXDTP 7 /* maximun legal data type */> unsigned char xab$b_nsg; /* number of key segments */@ unsigned char xab$b_nul; /* null key character value */D unsigned char xab$b_tks; /* total key field size (bytes) */^ unsigned char xab$b_ref; /* key of reference (0=primary key, 1-254=alternate keys) */> unsigned short xab$w_mrl; /* minimun record length */G unsigned short xab$w_ifl; /* index bucket fill size (bytes) */F unsigned short xab$w_dfl; /* data bucket fill size (bytes) */K unsigned short xab$w_pos0; /* key field record offset positions */#define xab$w_pos xab$w_pos0! unsigned short xab$w_pos1;! unsigned short xab$w_pos2;! unsigned short xab$w_pos3;! unsigned short xab$w_pos4;! unsigned short xab$w_pos5;! unsigned short xab$w_pos6;! unsigned short xab$w_pos7;H unsigned char xab$b_siz0; /* key field segment sizes (bytes) */"#define xab$b_siz xab$b_siz0 unsigned char xab$b_siz1; unsigned char xab$b_siz2; unsigned char xab$b_siz3; unsigned char xab$b_siz4; unsigned char xab$b_siz5; unsigned char xab$b_siz6; unsigned char xab$b_siz7;% unsigned : 16; /* spare */i2 char *xab$l_knm; /* key name buffer address */N unsigned long xab$l_dvb; /* first data bucket virtual block number */@ unsigned char xab$b_typ0; /* key field segment types */!#define xab$b_typ xab$b_typ0 _ unsigned char xab$b_typ1; unsigned char xab$b_typ2; unsigned char xab$b_typ3; unsigned char xab$b_typ4; unsigned char xab$b_typ5; unsigned char xab$b_typ6; unsigned char xab$b_typ7;9 unsigned char xab$b_prolog; /* prologue level */o(#define XAB$C_PRG1 1 /* prologue 1 */(#define XAB$C_PRG2 2 /* prologue 2 */(#define XAB$C_PRG3 3 /* prologue 3 */ unsigned : 24; /* spare */ };Zglobalref struct XABKEY cc$rms_xabkey; /* Declare initialized prototype data structures */;#define XAB_PROT_FIELDS { unsigned : 32; unsigned : 32; }eD/* XABPRO -- File Protection Extended Attribute Block Definitions */struct XABPRO {m" unsigned char xab$b_cod; -#define XAB$C_PRO 19 /* XABPRO type code */ " unsigned char xab$b_bln; S#define XAB$C_PROLEN_V3 0x10 /* XABPRO block length (16 bytes) version 3.0 VMS */ #define XAB$K_PROLEN_V3 0x10@#define XAB$C_PROLEN 0x58 /* XABPRO block length (88 bytes) */#define XAB$K_PROLEN 0x58b unsigned : 16; /* spare */*+ char *xab$l_nxt; /* Next XAB in chain */t4 unsigned short xab$w_pro; /* protection mask */$#define XAB$V_SYS 0 /* system */#define XAB$S_SYS 4z##define XAB$V_OWN 4 /* owner */t#define XAB$S_OWN 4/##define XAB$V_GRP 8 /* group */*#define XAB$S_GRP 4m$#define XAB$V_WLD 12 /* world */#define XAB$S_WLD 4s1#define XAB$V_NOREAD 0 /* deny read access */n*#define XAB$M_NOREAD (1 << XAB$V_NOREAD)3#define XAB$V_NOWRITE 1 /* deny write access */ ,#define XAB$M_NOWRITE (1 << XAB$V_NOWRITE)5#define XAB$V_NOEXE 2 /* deny execution access */B/#define XAB$M_NOEXE (1 << XAB$V_NOEXE)p2@~ ~ XMODEMVMS.BCK~l[BERNARD.SYSTEM.XMODEM]XAB.H;3^#define XAB$V_NODEL 3 /* deny delete access */(#define XAB$M_NODEL (1 << XAB$V_NODEL)D unsigned char xab$b_mtacc; /* magnetic tape accessibility */@ unsigned char xab$b_prot_opt; /* XABPRO options field */U#define XAB$V_PROPOGATE 0 /* propogate security attributes on $ENTER and $RENAME */A0#define XAB$M_PROPOGATE (1 << XAB$V_PROPOGATE)) unsigned long xab$l_uic; /* uic code */ L struct XAB_PROT_FIELDS xab$q_prot_mode; /* RWED/mode protection for file */9 char *xab$l_aclbuf; /* address of users ACL buffer */ /D unsigned short xab$w_aclsiz; /* size of user's ACL buffer */G unsigned short xab$w_acllen; /* return lecngth of entire ACL */_; unsigned long xab$l_aclctx; /* ACL context field */A unsigned long xab$l_aclsts; /* ACL return error status *// unsigned : 32; unsigned : 32; unsigned : 32; unsigned : 32; unsigned : 32; unsigned : 32; unsigned : 32; unsigned : 32; unsigned : 32; unsigned : 32; unsigned : 32; unsigned : 32; };struct { unsigned : 32;l unsigned : 32;r unsigned : 32;c= unsigned short xab$w_mbm; /* member number of file owner */t< unsigned short xab$w_grp; /* group number of file owner */I unsigned char xab$b_prot_mode; /* first byte of protection mode field */  };sZglobalref struct XABPRO cc$rms_xabpro; /* Declare initialized prototype data structures */#undef XAB_PROT_FIELDSK/* XABRDT -- Revision Date and Time Extended Attribute Block Definitions */ struct XABRDT { " unsigned char xab$b_cod; -#define XAB$C_RDT 30 /* XABRDT type code */b" unsigned char xab$b_bln; @#define XAB$C_RDTLEN 0x14 /* XABRDT block length (20 bytes) */#define XAB$K_RDTLEN 0x14/ unsigned : 16; /* spare */*+ char *xab$l_nxt; /* Next XAB in chain */f7 unsigned short xab$w_rvn; /* revision number */f unsigned : 16; /* spare */@ struct XAB_DATE_TIME xab$q_rdt; /* revision date and time */ };Zglobalref struct XABRDT cc$rms_xabrdt; /* Declare initialized prototype data structures */#undef XAB_DATE_TIME</* XABSUM -- Summary Extended Attribute Block Definitions */struct XABSUM {h! unsigned char xab$b_cod; u-#define XAB$C_SUM 22 /* XABSUM type code */! unsigned char xab$b_bln; @#define XAB$C_SUMLEN 0x0C /* XABSUM block length (12 bytes) */#define XAB$K_SUMLEN 0x0Cb s unsigned : 16; /* spare */n+ char *xab$l_nxt; /* Next XAB in chain */uV unsigned char xab$b_noa; /* number of allocation areas defined for the file */J unsigned char xab$b_nok; /* number of keys defined for the file */@ unsigned short xab$w_pvn; /* prologue version number */ };Zglobalref struct XABSUM cc$rms_xabsum; /* Declare initialized prototype data structures */5/* XABTRM - Terminal Control XAB field definitions */struct XABTRM {L unsigned char xab$b_cod;V-#define XAB$C_TRM 31 /* XABSUM type code */h unsigned char xab$b_bln;s6#define XAB$C_TRMLEN 36 /* length of XABTRM block */6#define XAB$K_TRMLEN 36 /* length of XABTRM block */ unsigned : 16; /* spare */u/ char *xab$l_nxt; /* address of next block */ . char *xab$l_itmlst; /* item list address */A unsigned short xab$w_itmlst_len; /* length of item list */s unsigned : 16;i unsigned : 32;s unsigned : 32;e unsigned : 32;  unsigned : 32;  unsigned : 32;/ }; Yglobalref struct XABTRM cc$rms_xabtrm; /* declare initialized prototype data structure */r"*[BERNARD.SYSTEM.XMODEM]XMODEM.C;65+,~./ 4W-l0123KPWO56-pbܑ7K189GHJ*/*: * XMODEM -- Implements the Christensen XMODEM protocol, 5 * for packetized file up/downloading.  *; * See the README file for some notes on SYS V adaptations.G * The program has been successfully run on VAXes (4.3BSD) and SUN-3/4s, * (SunOS 3.x) against MEX-PC and ZCOMM/DSZ. *E * See the README and update.doc files for history and change notes. *5 * Please send bug fixes, additions and comments to:5 * {ihnp4,ncar}!noao!grandi grandi@noao.arizona.edu * *//* *//* *//* */4/* VAX support added 15-OCT-1988 R. Cohen *//* */7/* Search for "RSC" to find VMS dependent code *//* *//* */6/* following includes added 15-OCT-1988 RSC. *//* */$#include rms /* RMS Definitions */+#include climsgdef /* CLI$_ Definitions */'#include ssdef /* SS$_ Definitions */#include ctype #include descrip/* */ /* end of additions *//* */#include "xmodem.h" long main(){'char *stamptime(); /* for timestamp */ /struct stat filestatbuf; /* file status info */ int index; char flag; long expsect;/* */&/* Changed 16-OCT-1988 RSC *//* */ long Status ;struct FAB LogFab ;struct FAB FileFab ;struct FAB ExtraFab ;struct XABDAT ExtDatXab ;char *OpenStr ;char ParamBuf[ 255 ] ;char StringBuf[ 255 ] ;char LogFile[ 255 ] ;char FileName[ 255 ] ;char Format[ 16 ] ;char DefOutFile[ 255 ] ;!char *DefLogFile = "XMODEM.LOG" ;char *DefRxFile = "XMODEM.IN" ;long SinceTime[ 2 ] ;long BeforeTime[ 2 ] ;long SinceFlag ;long BeforeFlag ;long AutoFlag ;long NothingSent ;short TimLen ;#$DESCRIPTOR( RetStr , StringBuf ) ;/* *//* End Changes *//* */@fprintf(stderr, "XMODEM Version %d.%d", VERSION/10, VERSION%10);Ifprintf(stderr, " -- VMS-Microcomputer Remote File Transfer Facility\n");/* */&/* Changed 16-OCT-1988 RSC *//* */JLOGFLAG = GetValue( "LOG" , &LogFile , sizeof( LogFile ) ) & SS$_NORMAL ;2DELFLAG = Present( "APPEND_LOG" ) & SS$_NORMAL ;/AutoFlag = Present( "AUTOSEND" ) & SS$_NORMAL ;Tif ( SinceFlag = GetValue( "SINCE" , &ParamBuf , sizeof( ParamBuf ) ) & SS$_NORMAL ): if ( CvtTime( &ParamBuf , &SinceTime ) != SS$_NORMAL ) return( SS$_IVTIME ) ;Vif ( BeforeFlag = GetValue( "BEFORE" , &ParamBuf , sizeof( ParamBuf ) ) & SS$_NORMAL ); if ( CvtTime( &ParamBuf , &BeforeTime ) != SS$_NORMAL ) return( SS$_IVTIME ) ;2if ( DEBUG = ( Present( "DEBUG" ) & SS$_NORMAL ) ) LOGFLAG = TRUE ;,YMDMBAT = Present( "YMODEM" ) & SS$_NORMAL ;,MDM7BAT = Present( "MODEM7" ) & SS$_NORMAL ;BATCH = YMDMBAT || MDM7BAT ;)CRCMODE = Present( "CRC" ) & SS$_NORMAL ;+LONGPACK = Present( "ONEK" ) & SS$_NORMAL ;*TOOBUSY = Present( "BUSY" ) & SS$_NORMAL ;/* */3/* if no receive present, assume transmit *//* */,if ( ( Present( "RECEIVE" ) & SS$_NORMAL ) ) {8 GetValue( "RECEIVE" , &Format , sizeof( Format ) ) ; RECVFLAG = TRUE ; }else {5 GetValue( "SEND" , &Format , sizeof( Format ) ) ; SENDFLAG = TRUE ; }#XMITTYPE = tolower( Format[ 0 ] ) ;*if ( !YMDMBAT || ( YMDMBAT && SENDFLAG ) ) {R if ( GetValue( "FILENAME" , &FileName , sizeof( FileName ) ) != CLI$_PRESENT )5 error( "Fatal - No File Name Specified\n", FALSE ) ; }else# strcpy( &FileName , "DUMMY" ) ; if ( LOGFLAG ) { LogFab = cc$rms_fab ; S if ( ( Status = ParseFile( &LogFile , DefLogFile , &LogFab ) ) != RMS$_NORMAL ) LIB$STOP( Status ) ;H if ( ( Status = SearchFile( &LogFab , &ParamBuf ) ) != RMS$_NORMAL ) if ( Status != RMS$_FNF )  {5 fprintf( stderr , "Error in log file name\n" ) ; LIB$STOP( Status ) ; } else* CopyFileName( &ParamBuf , &LogFab ) ;? if ( !( LOGFP = fopen( &ParamBuf, DELFLAG ? "a" : "w" ) ) ) {B fprintf( stderr , "Error in Log file name \"%s\"\n", &ParamBuf );- error("Fatal - Can't Open Log File", FALSE); }> fprintf( LOGFP , "\n++++++++ %s XMODEM Version %d.%d\n" , stamptime() , VERSION / 10 , VERSION % 10 );: GetValue( "$LINE" , &ParamBuf , sizeof( ParamBuf ) ) ;> fprintf( LOGFP , "Command Line : \"%s\"\n" , &ParamBuf ) ;  if ( SinceFlag && DEBUG ) {6 SYS$ASCTIM( &TimLen , &RetStr , &SinceTime , NULL ) ; StringBuf[ TimLen ] = '\0' ;4 fprintf( LOGFP , "Files After %s\n" , StringBuf ) ; } if ( BeforeFlag && DEBUG ) {7 SYS$ASCTIM( &TimLen , &RetStr , &BeforeTime , NULL ) ; StringBuf[ TimLen ] = '\0' ;5 fprintf( LOGFP , "Files Before %s\n" , StringBuf ) ; } }if ( RECVFLAG ) { if ( BATCH ) {A CRCMODE = MDM7BAT ? FALSE : TRUE; /* CLD should disallow this */D fprintf(stderr, "Ready for BATCH RECEIVE, in %s mode\n", &Format );B fprintf(stderr, "Type several Control-X characters to cancel\n");: logitarg("Batch Receive Started in %s mode\n", &Format ); } else {B fprintf(stderr, "Ready to RECEIVE File %s, in %s mode\n" , &FileName , &Format );I fprintf(stderr, "Type several Control-X characters to cancel\n");0 logitarg("Receiving %s," , &FileName ) ;& logitarg(" in %s mode\n" , &Format ); } FileFab = cc$rms_fab ; V if ( ( Status = ParseFile( &FileName , "XMODEM.IN" , &FileFab ) ) != RMS$_NORMAL ) return( Status ) ;I if ( ( Status = SearchFile( &FileFab , &ParamBuf ) ) != RMS$_NORMAL ) if ( Status != RMS$_FNF )  { restoremodes(FALSE); 9 fprintf( stderr , "Error in receive file name\n" ) ; LIB$STOP( Status ) ; } else+ CopyFileName( &ParamBuf , &FileFab ) ; if ( DEBUG )F fprintf( LOGFP , "DEBUG: Parsed filename is \"%s\"\n" , &ParamBuf ) ;1 setmodes(); /* set tty modes for transfer */7 getspeed(); /* get tty-speed for time estimates */? while( rfile( &ParamBuf ) != FALSE ) /* receive files */ ; flushin();7 restoremodes(FALSE); /* restore normal tty modes */7 sleep(2); /* give other side time to return to */ /* terminal mode */ return( SS$_NORMAL ) ; }if ( SENDFLAG ) if ( BATCH )  { if (YMDMBAT) {K fprintf(stderr, "Ready to YMODEM BATCH SEND, in %s mode\n", &Format );C logitarg("YMODEM Batch Send Started, in %s mode\n", &Format ); } if (MDM7BAT) {K fprintf(stderr, "Ready to MODEM7 BATCH SEND, in %s mode\n", &Format );C logitarg("MODEM7 Batch Send Started, in %s mode\n", &Format ); }B fprintf(stderr, "Send several Control-X characters to cancel\n"); DefOutFile[ 0 ] = '\0' ; FileFab = cc$rms_fab ; NothingSent = TRUE ;  do {W if ( ( Status = ParseFile( &FileName , &DefOutFile , &FileFab ) ) != RMS$_NORMAL ) return( Status ) ; setmodes();8 getspeed(); /* get tty-speed for time estimates */L if ( CheckParse( &FileFab , ( NAM$M_SEARCH_LIST | NAM$M_WILDCARD ) ) ) > while ( ( Status = SYS$SEARCH( &FileFab ) ) == RMS$_NORMAL ) { ExtraFab = cc$rms_fab ;! ExtDatXab = cc$rms_xabdat ;9 ExtraFab.fab$l_fna = FileFab.fab$l_nam->nam$l_rsa ;9 ExtraFab.fab$b_fns = FileFab.fab$l_nam->nam$b_rsl ;' ExtraFab.fab$l_xab = &ExtDatXab ;> if ( ( Status = SYS$OPEN( &ExtraFab ) ) != RMS$_NORMAL ) break ; else= if ( ( Status = SYS$CLOSE( &ExtraFab ) ) != RMS$_NORMAL )  break ; else if ( ( SinceFlag && = ( CmpTime( &SinceTime , &ExtDatXab.xab$q_cdt) <= 0) ) || ( BeforeFlag && > ( CmpTime( &BeforeTime , &ExtDatXab.xab$q_cdt) >= 0) ) ||$ ( !SinceFlag && !BeforeFlag ) ) {7 strncpy( &ParamBuf , FileFab.fab$l_nam->nam$l_rsa ,& FileFab.fab$l_nam->nam$b_rsl ) ;5 ParamBuf[ FileFab.fab$l_nam->nam$b_rsl ] = '\0' ; sfile( &ParamBuf ) ; NothingSent = FALSE ; } } else {( CopyFileName( &ParamBuf , &FileFab ) ; ExtraFab = cc$rms_fab ; ExtDatXab = cc$rms_xabdat ;# ExtraFab.fab$l_xab = &ExtDatXab ; 5 ExtraFab.fab$l_fna = FileFab.fab$l_nam->nam$l_esa ;5 ExtraFab.fab$b_fns = FileFab.fab$l_nam->nam$b_esl ;: if ( ( Status = SYS$OPEN( &ExtraFab ) ) == RMS$_NORMAL )@ if ( ( Status = SYS$CLOSE( &ExtraFab ) ) == RMS$_NORMAL )  if ( ( SinceFlag && A ( CmpTime( &SinceTime , &ExtDatXab.xab$q_cdt) <= 0 ) ) || ( BeforeFlag && B ( CmpTime( &BeforeTime , &ExtDatXab.xab$q_cdt) >= 0 ) ) ||' ( !SinceFlag && !BeforeFlag ) ) { sfile( &ParamBuf ) ; NothingSent = FALSE ; } else Status = RMS$_NMF ; } if ( Status != RMS$_NMF )  { restoremodes( FALSE ) ; LIB$STOP( Status ) ; } ( strcpy( &DefOutFile , &FileName ) ; }T while ( GetValue( "FILENAME" , &FileName , sizeof( FileName ) ) == CLI$_PRESENT ) ; if ( !NothingSent ) { sfile(""); flushin(); }  restoremodes(FALSE); logit("Batch Send Complete\n"); return( SS$_NORMAL ) ; } else { FileFab = cc$rms_fab ; T if ( ( Status = ParseFile( &FileName , "XMODEM.OUT" , &FileFab ) ) != RMS$_NORMAL ) return( Status ) ;M if ( ( Status = SearchFile( &FileFab , &ParamBuf ) ) != RMS$_NORMAL ) {6 fprintf( stderr , "Error in send file name\n" ) ; LIB$STOP( Status ) ; }, if ( stat( &ParamBuf , &filestatbuf ) < 0 ) {6 fprintf( stderr , "Error in send file name\n" ) ; if ( LOGFP )2 fprintf( LOGFP , "Error in send file name\n" ) ; LIB$SIGNAL( RMS$_FNF ) ; } setmodes();4 getspeed(); /* get tty-speed for time estimates */' expsect = (filestatbuf.st_size/128)+1; 8 fprintf(stderr, "File %s Ready to SEND, in %s mode\n",  &ParamBuf , &Format );B fprintf(stderr, "Send several Control-X characters to cancel\n");, logitarg("Sending in %s mode\n", &Format ); if ( AutoFlag ) { sendbyte( ESC ) ; sendbyte( 'A' ) ; }  sfile( &ParamBuf ); flushin(); restoremodes(FALSE); sleep(2); return( SS$_NORMAL ) ; }elseL error( "Fatal - Oops, no receive or transmit mode specified" , FALSE ) ;return( SS$_NORMAL ) ;}$*[BERNARD.SYSTEM.XMODEM]XMODEM.CLD;20+,~./ 4QX-l0123KPWO56|bܑ7T189GHJDEFINE VERB XMODEMIMAGE "XMODEM$DIR:XMODEM.EXE"= PARAMETER P1, LABEL = FILENAME, VALUE( LIST , TYPE = $FILE ) QUALIFIER DEBUG  QUALIFIER CRC , DEFAULT QUALIFIER APPEND_LOG , DEFAULTQ QUALIFIER LOG , DEFAULT , VALUE( DEFAULT = SYS$LOGIN:XMODEM.LOG , TYPE = $FILE ) QUALIFIER MODEM7 QUALIFIER YMODEM QUALIFIER AUTOSEND QUALIFIER ONEK QUALIFIER BUSY0 QUALIFIER RECEIVE , VALUE( TYPE = XMODEMTYPES )- QUALIFIER SEND , VALUE( TYPE = XMODEMTYPES )F QUALIFIER SINCE , VALUE( TYPE = $DATETIME , DEFAULT = "-- 00:00:00" )F QUALIFIER BEFORE, VALUE( TYPE = $DATETIME , DEFAULT = "-- 23:59:59" ) DISALLOW MODEM7 AND YMODEM DISALLOW RECEIVE AND SEND& DISALLOW (NOT RECEIVE) AND (NOT SEND)$ DISALLOW MODEM7 AND ( CRC OR ONEK ) DEFINE TYPE XMODEMTYPES KEYWORD BINARY , DEFAULT  KEYWORD TEXT KEYWORD APPLE_TEXT#*[BERNARD.SYSTEM.XMODEM]XMODEM.COM;5+,~./ 4*j-l0123KPWO56J47|189GHJ$ ! XMODEM setup file#$ set command XMODEM$DIR:XMODEM.CLD*$ define HLP$LIBRARY XMODEM$DIR:XMODEM.HLB$*[BERNARD.SYSTEM.XMODEM]XMODEM.EXE;30+,~./ 4-l0123 KPWO56Y^h,7D189GHJ80DX0205( Yh,NXMODEMV1.0 Yh,05-02 ^'(  ?B!d FORRTL_001! LIBRTL_001Y       N *.*;*.*;*.*;*/sys$disk...*;*.*;*.*;*DIR.DIRP`D ,,dX $@Kg| ((((( DDDDDDDDDDAAAAAABBBBBB XMODEM.LOGXMODEM.INXMODEM Version %d.%d -- VMS-Microcomputer Remote File Transfer Facility LOGAPPEND_LOGAUTOSENDSINCEBEFOREDEBUGYMODEMMODEM7CRCONEKBUSYRECEIVERECEIVESENDFILENAMEFatal - No File Name Specified DUMMYError in log file name waError in Log file name "%s" Fatal - Can't Open Log File ++++++++ %s XMODEM Version %d.%d $LINECommand Line : "%s" Files After %s Files Before %s Ready for BATCH RECEIVE, in %s mode Type several Control-X characters to cancel Batch Receive Started in %s mode Ready to RECEIVE File %s, in %s mode Type several Control-X characters to cancel Receiving %s, in %s mode XMODEM.INError in receive file name DEBUG: Parsed filename is "%s" Ready to YMODEM BATCH SEND, in %s mode YMODEM Batch Send Started, in %s mode Ready to MODEM7 BATCH SEND, in %s mode MODEM7 Batch Send Started, in %s mode Send several Control-X characters to cancel FILENAMEBatch Send Complete XMODEM.OUTError in send file name Error in send file name Error in send file name File %s Ready to SEND, in %s mode Send several Control-X characters to cancel Sending in %s mode Fatal - Oops, no receive or transmit mode specifiedFile Read ErrorDEBUG: countnl--%ld newlines counted DEBUG: readbyte %02xh DEBUG: readbuf--read %d characters File end from YMODEM length found in sector %s DEBUG: sendbyte %02xh Write error on streamDEBUG: writebuf (%d bytes) Write error on stream %% Problem reading command terminal characteristics. %% Problem setting command terminal characteristics. %% Problem setting command terminal characteristics.Line speed = %d bits per second ASSIGN_CHANNEL: error in SYS$ASSIGNRAW_WRITE: write QIO error return.RAW_WRITE: write QIO error return. Usage: xmodem -[rb!rt!ra!sb!st!sa][options] filename Major Commands -- rb <-- Receive Binary rt <-- Receive Text ra <-- Receive Apple macintosh text sb <-- Send Binary st <-- Send Text sa <-- Send Apple macintosh text Options -- y <-- Use YMODEM Batch Mode on transmit m <-- Use MODEM7 Batch Mode on transmit k <-- Use 1K packets on transmit c <-- Select CRC mode on receive d <-- Delete xmodem.log file before starting l <-- (ell) Turn OFF Log File Entries x <-- Include debugging information in log file Invalid Send/Receive Parameter - not t or btextbinaryapple %s XMODEM Fatal Error: %s %d%d-%dDEBUG: '%s' %ld Sectors Transfered in 0 seconds%d %s%c Transfer Rate = %d Characters per Second Estimated transmission time %d %s%c NULL file name in send---- XMODEM Send Function Can't open file for sendFile Name: %s File Size %ldK, %ld Records, %ld Bytes ---- XMODEM Send Function Closing down Batch Transmission 1K packet mode chosen Remote System Not RespondingSend cancelled at user's requestCRC mode requested Receiver invoked 1K packet mode YMODEM protocol botch, C expectedSend cancelled at User's requestReducing packet size to 128 due to excessive errors Reducing packet size to 128 for tail end of file %lu %lo %oDEBUG: YMODEM header information: %s DEBUG: %d byte Packet %02xh (%02xh) sent, checksum %02xh %02xh Timeout on sector %s NAK on sector %s Non-ACK on sector %s Too many errors in transmissionEOT not ACKed, try %d Remote System Not Responding on CompletionSend Complete ---- XMODEM File Receive Function CRC mode requested Spurious EOT detected, ignored Timeout on Sector %s Reception canceled at user's requestReceived single CAN character MODEM7 Batch Protocol Program Canceled by UserReceived single CAN character in MODEM7 filename MODEM7 Batch Receive Complete Timeout waiting for MODEM7 filename character Error during MODEM7 filename transfer MODEM7 file name OKMODEM7 file name: %s Checksum error in MODEM7 filename Length error in MODEM7 filename 1K packet mode chosen DEBUG: packet %d started checksum okrfm=fixmrs=128Can't create file for receiveFile Name: %s File Write ErrorChecksum Error on Sector %s: sent=%x recvd=%x Timeout while reading sector %s YMODEM Batch Protocol checksum okYMODEM Batch Receive Complete %ld%lo%oYMODEM file name: %s YMODEM file size: %ld YMODEM estimated file length %d sectors YMODEM file date: %sYMODEM file mode: %ochecksum error on filename sector Timeout while reading filename packet Duplicate sector %s flushed Phase Error - Expected packet is %s Header Sector Number Error on Sector %s Sender not accepting CRC request, changing to checksum Sender not accepting checksum request, changing to CRC Receive Complete ABORTED -- Too Many Errors--deleting fileABORTED -- Too Many ErrorsABORTED -- Remote system is not respondingFunnyFileNameNull file name in MODEM7 batch receivesend_nameTimeout while sending MODEM7 filename Error while sending MODEM7 filename Bad checksum while sending MODEM7 filename DEBUG: File %s sent as %s DCLMCRSHELLerror 0not ownerno such file or directoryno such processinterrupted system calli/o errorno such device or addressarg list too longexec format errorbad file numberno childrenno more processesnot enough corepermission deniedbad addressblock device requiredmount device busyfile existscross-device linkno such devicenot a directoryis a directoryinvalid argumentfile table overflowtoo many open filesnot a typewritertext file busyfile too largeno space left on deviceillegal seekread-only file systemtoo many linksbroken pipemath argumentresult too largeI/O stream emptySYS$LOGINSYS$COMMANDSYS$DISKLNM$FILE_DEVVAXC$PATHPATH=HOME=TERM=USER=PATHHOMETERMUSERPATHPATH=HOME=TERM=USER=PATHft1-132ft1-80ft1ft2-132ft2-80ft2ft3-132ft3-80ft3ft4-132ft4-80ft4ft5-132ft5-80ft5ft6-132ft6-80ft6ft7-132ft7-80ft7ft8-132ft8-80ft8la12-132la12-80la12la120-132la120-80la120la24-132la24-80la24la34-132la34-80la34la36-132la36-80la36la38-132la38-80la38unknown-132unknown-80unknownvk100-132vk100-80vk100vt05-132vt05-80vt05vt100-132vt100-80vt100vt101-132vt101-80vt101vt102-132vt102-80vt102vt105-132vt105-80vt105vt125-132vt125-80vt125vt131-132vt131-80vt131vt132-132vt132-80vt132vt173-132vt173-80vt173vt52-132vt52-80vt52vt55-132vt55-80vt55vt200-132vt200-80vt200undefinedLNM$FILE_DEVTT5`k~ XMODEMVMS.BCK~l$[BERNARD.SYSTEM.XMODEM]XMODEM.EXE;30|$|T8 d8LNM$PROCESSSHELL$FILE_ 8LNM$PROCESS888 H9LNM$PROCESS(/,/0/ 1 11 1 1$ 5 J̄*55Q$5d,5 |Ą45<5DD5L5 T5  \5 D  Ԅ  d5 $  l5 t5|5l@AHr555  5(5555Ā5̀5Ԁ5܀5PD55\555 !!!!!̂!! 5!""Ă"5"5# 4!B c0@P`p)Jk1s2R"RBrb9{ZӜb$C4 dtDTjK( ōS6r&0vfVF[z8׼HXhx@a(#8َHi +ZJzjqP 3:*˿yX;l|L\",<` A* hI~n^N>2.Qp:Yxʱ -No0 P%@Fpg`ڳ=^"25BRwbVr˥nO, 4$ftGd$TDۧ_~<&6WfvvF4VLm/ș鉊DXeHx'h8(}\?؛uJTZ7jz *:.lMͪɍ&|ld\EL<, >]|ߛُn6~UNt^.><<secondminutehour8888/@/J/d/t////////00$000F0X0d0v000000000 1$111G1V1b1p11# L|^5V͎͌͏͐͡bDOD~͢-ˏPZt-ˏP-[-ˏPn~͠p-ˏP߭͠B,P<P~͠7-ˏP߭͠ ,P<Ph,RbˏPIbˏP;bˏPwS fSSj,RbˏPbˏP&bˏPbP͓C,͓&,͓~fyP75/~ͣ+P"qͣsv]1(PkkV͢A,P P͠k-PRR9R!EARPk͠- SSS͠X@P&͠dA& Pl6ASc~͠*͠=cծ7/߭͌?H2RB͡͡cծ;3߭͌?H2RB͡͡@1m_SPSSr͓SL@Rbbb_|͓tQbg͓ͣ}@Rbjbͣb͓?(P|ͣ)P͠+PRRBR* >J?R5P͠Z+;͠E?( { ͠P͠P mP110\6͓>͓p>6͓Q>w͓i2>>͔(Pn[HZYX&VPr aW͔ͣ'P0 < ~)P1jP\\1(Pۮ(,Ѷ͟CRТCR͟iP\\16hP\\1 ծͳ߭fPծͳ߭fP ծ0ծ+CR~ݢ͠CRRB͠͠g[jP\\101͠((P(,͟͟CRТ CR iP\\VhP\\Cծͳ߭fPծͳ߭fP ծծ ͠g[Џʂ\\ʂ7\͔ͣp~ͣO%P1[- ;P(PѬuͣ%P͠&PRRJ%;R͠(jP;5v:!3:ݏǶ<͓͠%:Rb#b͓5bnA~͠ {!iPP ^US"Rc.<~8ݬFPc88c8Q8aPP<^US<~ެTd[FPR9QRPRPPa SQRPRP<~d"FPR|~ݬr>eSߥt=9SP^*RݬTP,PPP2P~ߢ6$8PP2PP^^^ZXY|SЬn1 ݬݮP[[,P[n[k8W[1PChVGPPRRUUfjSFn6N^fv~V1P?PndP<dPdPdP<dP<KdP<dP<` dP<,dP<dP<dP2d[Sx RRC*X[TTTXSX CXSXҮ RRC:U[XXRXETdB%<:RxRSxRQdPPQ6ci ÍhjC~LlDhK~LPLVծ(1Vpծ(kծ  ݮji hQRnP~ݮPwծ խ0RPЭiPPծ ; Rbbbbbݮg#PծL P ^eSЬRbb/:bbPPP@c bRbr.bQЬP``.QQ_`QP`^TЬRdSb ]bb(PbPb;bcdNPdP|^VP ߦ ЬQaSSPPSSPP/_SSaSSPЬR/TUbPP PPUЬRPP  PP  PP .PRSbPP PPSP|^ASVUߣ5/ЬP PQTa PPTaʏTЬPPQPRa~b}P>>>>>>,?P@Pf ߣ?eu~Pf ߣfeu~yP~kb~PT f Ëeu~=P0P^XWџVȷgL]~ݬNPRRЬRgTSbb.SPSP bb.b.b PRb.bb*RUTbb;PTPTP bb;딧 gScQQQPPP@f QQcQgݬgP ^ݬKѭP@PЭR޼SЭP޼Q@aPPKNPPPBcRRݬeKѭPݬUKPRRЬݬXPP^ЬQЬPѡPЬQЬPѡЏP޼Q޼Pa`P޼Q޼Pa`ЏPP ^ݬJPPPЬluPP^PPЬݬqJPPP?TuPѭ޼P`ЏP2P@ݬ ݬSJ2PP  Ь P޼Q@aЏP<^Ь Rբ(@Ь RТ(Rݢ = Ь RТ(Rݢ+ Ь Rݢ( Ь Rݢ$ ޼ R(PφbЬ RRЏbЬ Rݏ`P(Ь R,P$Ь R޲$R(,bЬ R޲(R(`tbЬ RЬ,Ь Sݬ(IPRR4Ь RТ(RݏQP Ь RТ(R Ь RТ(Rݏ)PЬ RТ(RЬ RТ(R@լ,ݬHPЬ RЬ0Ь SݬHPRR5ݬ 0PP^ݬHPլDѭ:ЬPР(PPPPPЬPР(PݠݬzHЬPР(PQ޼PA`ЭP^ЬPР(PҠ4PPPPPPP^ЬPР(P PPPPЬPР(Pݠ ݬHЬPР(P Q޼PA`JanFebMarAprMayJunJulAugSepOctNovDecSunMonTueWedThuFriSat|(^EV($ݬ_($ئfP^XZV<UnYW 7S޼[kTSTK3SUZzUP{PQPPzUP{dPQPPzUP{PQPP QSWSTЬRb3bUZzUP{PQPPzUP{dPQPPzUP{PQPPWÏUSď3SŏQWRRSSTWUZzUP{PQPPzUP{dPQPPzUP{PQPPWÏUSď3SŏQWRRSSTWZ[zUP{PQPPzUP{dPQPPzUP{PQPP[[SCPxVRPRŏQbRYRRT8xVRPRbnVRVxRRPRŏQbRRYxVRPRŏQbRYRRTÏlU.V*YTǏQTRR&&nRR66ZRRzRP{PQPP2zTP{QPQPPTǏT"zTP{PQPPTP^P ALQ  BLS < DEQ  DNA 0FOP CTG CBT TEF CIF SUP SCF SPL TMD TMP NEF RCK WCK DLT MXV RWO POS RWC FSZ ?  MRS 6@*RAT CR BLK FTN PRN ?RFM FIX VAR VFC UDF STM STMLFSTMCR?SHR GET PUT DEL UPD NIL UPI MSE  MBC 7 MBF 6?ROP ASY TMO RRL NLK RLK RAH WBH TMO  1CTX @STM BIN NOCVTREC XPLCTfop=cif  SYS$ERRORRUN SYS$INPUTSYS$OUTPUT_NLA0:SYS$DISK0VM^^Z00NP|~߮~~^Y|~i P<UTDoTTPUT'TiTTUT TTPP0""0#0g 0PPʏ0ЬWP0\ 0P1E 0P֧gʏ0gV0%ѧ> ЏzP P֧g0Pʏ0ЬWP0P6RǕSlլ 3 1P'ﬨRcRS(Sbc~PP!PPeЬPЬWP0P 0P1TЬZ ЩS<TЧ$STSTSçUSjTUʏ0PЬ WP01 0P1ЬZЬ[ZZ~QgV0`: VPPVVZ VnVZVZ 0 ֧g 0 Zn0nZkЬPʏ0ЏL5P0\[ߔʏ0PЬWP0g0 Pg֧PЬWP00PP֧g0P߬ l~n ߬l~n01 ЬUЬRSVSrVSw Sa1b+VR~bb< nRVb+VP0bHYSaȏ@0﷦ЭZ Э\0i1HSwhP#SaЧ>g-  ӏ00ЬPʏ0ѧ>%Ч>çPxPQʏPP,Q$(Q:ЬPʏ0ЬWP0G 0P1Ь[ЏZ:Zk Џ5P0[QZ0P ЏL5P0tʏ0ЬWP08> 0P1wЬ[Ь ~լЬZ0AnÎ Pʏ0ʏ0PЬ WW2P0 ~[PԼ l PЎWPW`g`WPPЬWP0P 0P1߬ ݬݬKʏ0ЬWP0v}~ ~PPЬWP0T1g0Z0Z0 Z00"ЬZjS<TSTRS(T,Ч$Ч,i ipRP Pz; gԧ:S$}S~0%<PPPg0 }SSTPPЬWP0 ~ ~ЬWP0q= 0P1Ь[Ь ~ЬZ00nʏ0Ь Pʏ0PЬWP0#iPP06ݵW10Zn6RǕSlլ 3 *P'r R]RS(SbcPPP ̡ЬP[WP0}1 0P1 Ь[ЏZZ~gV0HV: VPPVVZ VnVZVZ 0 ֧g 0 Zn0AnZ{ʏ0ЬP[锼ʏ0PЬWP0, 0P1 Z~n[0 ʏ0ЎPʏ0P0 P@P0 P@P0 0P1 0 Z [1Ѭ jѧ0 00{?Ч<gˏ@Vя@V)ݩnՎϬ YhЏ5P0"PPʏ0լ(çQgQ0agQЬPPQR RgPPʏ00O[1V0g0[Zլ1V0t$.0h([,Z[(Z, ʏ0P0g Z[[ ʏ0P[PZPiP`ԩ1V[Z[(Z,Ч$Ч,i ipVяzPяPP 0ʏ01|0Ϭ 3Џ5P0ʏ0[Ч$PPP[çUUZ([,ZxZPP[ʏZ[ʏ0PЏ5P0hʏ0ç$[V[(Z, 0110x [[Z[x (Z<,PPZZ[ç>V<ZVZZ[[Z,gZ>S>Z[2<PP0),gV<Z6$Z[0Z[[>ç>[<P[PgЧ>ˏ[Zԧ:[ x[[[:$[0?0 VV:000[$ԧ:0Vx VQZQ<PQPgQ0S[Z[x [[Z[Pʏ0ʏ0<PP^^Vݩ,ݩ(ݩRЧ(S<,TSTV$V,iPz^P^ЩS<T<"URiPzP7?VUVVVVVTxTPʏTPSPRЎЎ(Ў,<QQ^PS(T,STUPP$:PP(ç>PЧ>Pg00jЧ($ԧ:0A<,PPЧ><QPQg00=iPP00!ЬUVP0 ՎYЬPPPP0Ш,045ǒVЦ  h0PJӏ4 ӏ4 Џ5P1E:Tæ HUUTЦ U}T~^R~l>n~l>nYY~l> nRGqP0 ЎP0,P0V}UʏVP0 l;Ь P IPY0Yl@0lZZެ\0 @hP>ˏQя Q Џ5P1ӏQhP)P0`ЎP0яPӏ Џ5P1N漢h01-.Z ZnPZP0■WP0P 0P1^^[Wݏ߬ݬ[w<}P~QZ0 }Pʏ0ʏ0P[W1=OWP0mJ 0P1Ь[ЏZ:Zk Џ5P0l [QZ0[Z0~Pʏ0ZЬWP0# 0P1OЬ~^[0KЬPʏ00C  0P1#0P0 0Z P0ʏ0TWЬR:b1RQSј~3RYP3﹘礼P1TRSR~~S~^SЬU:e1UQV~UDYP3M<1SW*U'VU~~V~^SnPT SW UЎPPPT SЏ5PPEPЬWP0w0 |~ ~4WP0VP 0P1߬ݬ.?ʏ0ЬWP0 0P1\ լ QЧЧլ! çPЬPl ЧЧgЧl  լ  ʏ01fP|~ݏ߬ ݬݬ<9ЬQ@aP^^WgЬЬݬ$PgA ^~^W߬ ݬW><PЬWP0AP 01D 0)ЧQQQPQקgQQPʏ0ʏ0ЬWP05^^[Wݏݬ ݬ[Z8P QZ0ЎPPOWP0m5^^[ύWݏݬݬ[8P QZ0ЎPP|~ݏݬ ݬݬ7ЬQ@aP0d  0P1D0P0g2@U0 [<4QU|~|~|~<(~P1@@@; ,h0ȏ@0h0<6R)@< ȏ0@16Ǖ~^P|~?4`Pю^^RǕb6~? ݏ^S|~cb<~P 01  ȏ0^@0i0U,ȏ0BB V V 0:eUQQ4Џ5P0k^ Ќ[X0@=k6V0zP)VY" ZҺ ^ A 0uЏ5P0[0PkVFV<UUV(WhWP[ kQkR0R R QRQPVFV<UUV "ӏQQfӏQQfQfPP[0] V0P&UEU<TTUSSe,kPkP[0' V0iPUEU<TTUePkPWXV k[k),k$=k?WWUaU zUUUW vWP-Wh  fPPVPPQAcQQ iPQAQQQiPQA?QQiQiQяzPW# 0QPP9QW QP0WZѬZ1|k[ZZJ[kWާBXYZ~PQ{ PPQ0Q~PP0P 0 ֧gZgV0Aç>V ЏzP0ZVZV(VkQVgS[VZ 0PЧV0 ЩPSP*UЧ,V$iP@P  ȏ0&ʏ0<"UP 0PT1Џ5P021&@- RS TT TTRT <SREfSU1 EfU1XЧTФXhXX~dP=UX(UfhЎP1XVXU f E ExUXU(UhЎUЧVЎX1 P xPxPhPUU fm|PfT2T+-P QT #T$T0T1 Q QEfU6PPU(U@fVSUQQfT$T EfUT0Q ?TTUЧVUgVUV>P0թQFЏzP:$ѧ$(g,bЧ$8Ч$"iPGя Pȏ0Џ5P2ʏ0Ч<g<"QQ>QxQQQ:P§:$0W01@Ч<gP00L(Ч<g 0 00} Ч(,Pg+004$Ч<g 00:$ԧ:Ч>PZP10 00Zӏ0 : ZkQ[QZgV0CcZVZV0(VkVgSQ[VnVZ09 0  ӏ0 0nZѧ>Ч>PՎPgV0:ZVZV0(VkSS>S>çSPxP:VgQ[VZPЧVVU0W PЧ<gP0<P$6QQ(ç>PP"Ч(Ч$8iя P i0}U~ 0F?TV,TVTU ЏP1TP 0 111N EU1B~T^, EUn1(U1f f Aӏ@0'ʏ@0 ~}U~ޮVU0}UT}U~1f  ȏ@01vPf P1Q+Qӏ@0 Qʏ@0E  ȏ@0U}Uя P i03)0 P` çPP6P ,nPSէ$:$ԧ:çPxPQQʏP$QQ( n:Q(,P, P,Ч>ЎQSYS$ERRORRUN SYS$INPUTSYS$OUTPUT_NLA0:VAXC$EXECMBXSYS$DISKVAXC$PATH:|~߮~~^P|~`  P߬ݬϠЬR:bRQV VSSSS^^W( g(VcG߬WelP@l߬ݬQ ݬݬ=ЬR:bRQV VSSSS^^W( ,g(VcݬW:BìQ~2[>AP[~ZjP[j@ݬ ݬݬϵЏ5P1nѭ  ЏL5P1]~>nYЫXYP0C^^SYR0i Џ~|~S~~P~~߮~~^QQ ~^Tad~^ZǀЬTЭU~~ TAPTUf P TU^TUVV^(Ud(nnV~^T ~^R|~߮~~^V|~fb<~PяBnS1zbRS^Xϵ~~~~ZS~T VPU^G ~^TdUPPЫ PЏ\5P10^^U nR^S0P1Z[k[1WnSZGV5.4RUeUTVDRTU[TW R, 'XZ[P(ƕPP(P6c^SR^S0kP1W1r1yYP76РР[nkZZR^S0#PCZn[kkךZЬ [0@PZЬ[03P nR^S0o~Pf~P ШPRR^nSЬT|~|~Rc|~<1~< ~ ~ʏ< ~T~ |~ݏݏݏ?`PPPը ߨ]P[P0{{{`P{Р P] ^]Pc{P`Y{ݠݠPMЎPРPlЏL5P1+{[k9kZ Z[l լЪݪjkZЎPЏT5P1\PPP|~߮S~ ~@~^T|~dԭ|~|~ݭPRR ݭx߭KMRRP?ݬM^w\sݬݬPQPQQPzig~~|~P ЬPP$PΜ^wVϦЬRR7PRfRP p(PA(`Cfͪͩ0PXXRRZHPXXRRSF(f fݬݬPp$f fPf fnPf f[RBͪͪP͸ͺͻͪͼqps4t6v8x~ͨ~Ͱ ͜>ͤ͠ԭ@# |0PX|~?ͦ͸PPWWP|~|~2<ͦ~ PWW ͨԭ|~|~<ͦ~PWWW<ͦ~PަS<ͨRRSsަ<ͦ~ЬTtvx pwͤ<ͤRQRPR RP Q{RPQPQRQRPRRRPRQPQ{RPPQQXxP[<ͤRQRPЏR RP Q{RPQPQRQRPRRRPRQPQ{RPPQQxPZ<ͤRQRPЏR RP Q{RPQPQRQRPRRRPRQPQ{RPPQQPY[ZRYRR ͠@  < SS Ԥ ͜Q͜PЏR RP Q{RPQPQԤԭİԭ>ԭа԰ޭ>ܰޭ>ޭ>ԭe= ep(ЭPФRb<RRR|~?oPP)|~|~2o~ѽ؏Bo 22~PRRԤRSRPc֤Հ 1P %P`%PݴߧNZP ߧSLФ RPߧX:Ф RPߧ](Ф RP 1<~lPԭİԭ>ԭа԰ޭ>ܰޭ>ޭ>ԭc- ck(ЭPТ\l<\\\|~?jPP)|~|~2j~ѽ؏BjޢH ޢ\TT UTPTTƁPWWTWPT1TW (P%ݢ$Ty< \LdTϴ< \\\TZ2\LdTϛ2\\TTޢ\\\T\\!\\?PPT<\LdTX<\\\TWPWȟ0(PUТ \TYTPTT(PUU%ݢT<\LdT<\\\T2\LdTϽ2\\\TТ \TZTXPTѽ؏BݽݽT& ƆT.TPPTТ \T [T PTTТ xf?XPWT<\Q\P\ \P Q{\PQPQc cЏzcԭߐV燐!P|~|~쟭|~PP2P@dЬRdPbdbԢ PԭЬTTPSPkPFa>aRb3STbPbSQa=QPQP`=QPRbͰSЬސܐ<~ロPRRڟ"ZP2P@bRRPR⟭⟭$P RWЭVf*:QfQRhPg(RWVPP<`^,n䐏Pݬ^|VX^,n䐏Qݬf^PRݬ4l$լ ݬf  RP|VD^,nȐSȞ7؞+ܕlլݬfЬ̑lլ  lլ,n䞭l լ Ь l լЬlլ ݬf^<`^,n䐏Tl լЬ^<`^,n䐏UL@ݬ^YX$^,n$ ЬV:fQVQV,nnn(iPW1&HC>,nPPƐϞPVܞX:fQVQ<,nPPƐϞPVܞ:fQVQ,n`P`PR,TZP\0PWhP hGRHP.SP@,S,iP RPPşhRPP|RVP^,nPPƐϞPЬܞ8:QQ,n`P`PZf\0PRR[P@fn\ RfPPЬQС(Pՠ04Q0RW^,n$܈:QìQЬ,nnn;PV/V&g:fQVQQQ (QfgPVPP ЬPР RSbcՠb'!P*PJcPQcccbP. .b0bbQ.bbP/bQPP ^Ь R]> .b/brPbPPnnb~P/bSn:.nQQS/cSbPPnSbbS:]ncQQb :>ncQQbPЬXШ W[gVЬZZYZ/gY1ZZ Z.ШYZk( gkkkk/cZ ШYkk k/g.BZ@1ШYkkk k/g.g.gYk k0gPPgPYPPI(YYgZ!g*VQQgYY:%YfQQ?aQVPPYQVZkPPЬ P/`.`.`PЬ PQaa/`.`.`.`aP\_\S\G\ ;\@~-\<~\ P`P P`P< [^,n$0,n0lլ|YЬZPѬPPYЬVTWS|QP.PPPSR/P/PQQ1+RSЬVTW, |$$$(ЏЏЏ04Q8W<P7 88P1   1[,,$T$PTP-   .,,$T$PTPH,U- -e$-.e,VW.,,dT1    Z,PPX  ..`[`,  .,,( ,<PP,],,Y~,nPPƐϞP؞ܞPP,,n`P`PRPTZP\0PR R,$k1IX, 1,P.,],,  Z  $k1,,nPPƐϞP؞ܞPP,,n`P`PRPTZP\0PRRRR$kRPVW .,,VW ,P% .,, I ',Q.,,PQPa* *,,.,,VW$G   1,nPPƐϞP؞ܞPP,,n`P`PRPTZP\0P$kd1  #,$k6PWHP|SP(PTnSP@PYYY W~P*.RZWR PP P'WRPݬPSP(PnT1f$kWPPlXWά^,n0nT, |n$$$(ЏЏЏ,n$004:QìQ8ЬS8SSQ[5Q%ܑQ?׊QQSVVVTXRdPdTVRXQQWWQQ]ȑQ-#QӑQ]S-QSSW͑SQ QQSQQ]1W}PP}Q{PPQPe^e ZPa.;Y.;O ::"":[<]>.-q*.]>.$-O]&>"-?.]>.U]>[<]@>8j.&-".]>D.--.]>*d- -*<%Bp//h#.N;r"n.\ ;T@ !"".( ./*- -*?[]-Э PР P{`PeVAXCMSG@@8@H`H@( x0HP  @FORRTLLIBRTL"*[BERNARD.SYSTEM.XMODEM]XMODEM.H;13+,~. / 4[ -l0123KPWO 56 ʹ7@ 189GHJ#include #include #include #include #include "unixio.h"#include #include 1/* define macros to print messages in log file */7#define logit(string) if(LOGFLAG)fprintf(LOGFP,string)L#define logitarg(string,argument) if(LOGFLAG)fprintf(LOGFP,string,argument),#define VERSION 36 /* Version Number */#define FALSE 0#define TRUE 1/* ASCII Constants */#define SOH 001 #define STX 002#define ETX 003#define EOT 004#define ENQ 005#define ACK 006'#define LF 012 /* Unix LF/NL */#define CR 015 #define NAK 025#define SYN 026#define CAN 030#define ESC 033/* XMODEM Constants */#define TIMEOUT -1X#define ERRORMAX 10 /* maximum errors tolerated while transferring a packet */N#define WAITFIRST 5 /* seconds between startup characters in read */N#define STERRORMAX 60 /* maximum "errors" tolerated in read startup */O#define CRCSWMAX 30 /* maximum time to try CRC mode before switching */R#define NAKMAX 120 /* maximum times to wait for initial NAK when sending */[#define RETRYMAX 5 /* maximum retries to be made certain handshaking routines */S#define KSWMAX 5 /* maximum errors before switching to 128 byte packets */U#define EOTMAX 10 /* maximum times sender will send an EOT to end transfer */[#define SLEEPNUM 100 /* target number of characters to collect during sleepy time */,#define BBUFSIZ 1024 /* buffer size */A#define NAMSIZ 11 /* length of a CP/M file name string */;#define CTRLZ 032 /* CP/M EOF for text (usually!) */5#define CRCCHR 'C' /* CRC request character */8#define KCHR 'K' /* 1K block request character */8#define BAD_NAME 'u' /* Bad filename indicator */9#define CREATMODE 0644 /* mode for created files *//* GLOBAL VARIABLES */0int ttyspeed; /* tty speed (bits per second) */2unsigned char buff[BBUFSIZ]; /* buffer for data */?int nbchr; /* number of chars read so far for buffered read */8long filelength; /* length specified in YMODEM header */=long fileread; /* characters actually read so far in file */6char filename[256]; /* place to construct filenames */+FILE *LOGFP; /* descriptor for LOG file */&/* option flags and state variables */$char XMITTYPE; /* text or binary? */-int DEBUG; /* keep debugging info in log? */int RECVFLAG; /* receive? */int SENDFLAG; /* send? */7int BATCH; /* batch? (Now used as a state variable) */$int CRCMODE; /* CRC or checksums? */-int DELFLAG; /* don't delete old log file? */int LOGFLAG; /* keep log? */9int LONGPACK; /* do not use long packets on transmit? */(int MDM7BAT; /* MODEM7 batch protocol */(int YMDMBAT; /* YMODEM batch protocol */;int TOOBUSY; /* turn off sleeping in packet read routine */Cint CHECKLENGTH; /* Are we truncating a file to a YMODEM length? */D/* CRC-16 constants. From Usenet contribution by Mark G. Mendel, 5 Network Systems Corp. (ihnp4!umn-cs!hyper!mark)*/ /* the CRC polynomial. */#define P 0x1021 /* number of bits in CRC */ #define W 16% /* the number of bits per char */ #define B 8#*[BERNARD.SYSTEM.XMODEM]XMODEM.HLB;6+,~.0/ 400-l0123 KPWO156ÝÑ7 ݬ189GHJ% VAX-11 Librarian V04-00mVÑ5đ/ 0#5 XMODEM@N5đ COHEN XMODEM ( XMODEM [ file_name ] [ /qualifiers ]!2 Parameters! FILENAMED The name of a file that will be received from, or sent to, aD remote system. The file specification may include wildcards orD searchlists. Multiple filenames may be specified, separated byD commas. VMS "Sticky" defaults apply when multiple filenames areD specified, so that elements of a filespec, such as an extension,D that are missing from a filespec, will utilize defaults appliedD N@~ XMODEMVMS.BCK~l#[BERNARD.SYSTEM.XMODEM]XMODEM.HLB;60}N from any previous filespec specfied (if you specifyD "FOO.STUFFIT,BAR,.BIN", XMODEM will search for the filesD FOO.STUFFIT, BAR.STUFFIT, and BAR.BIN). Filenames are requiredD when the /SEND qualifier is specified, and when the /RECEIVED qualifier is specified without the /YMODEM qualifier. FilenamesD are not required for /RECEIVE/YMODEM operations. Note that sinceD Macintosh filenames are limited to 32 characters, XMODEM willD automatically t runcate any VMS filespec transmitted to 32> characters before sending the filespec to the remote system.!2 Qualifiers!!/SINCE! /SINCE=VMS_date_time_specD Qualifies the transmission of files with the /YMODEM protocol, soD that only those files that satisfy the file specification, andD have creation dates greater than or equal to the time specified, will be transmitted.!/BEFORE! /BEFORE=VMS_date_time_specD Qualifies the transmission of files with the /YMODEM protocol, soD that only those files that satisfy the file specification, andD have creation dates less than or equal to the time specified, will be transmitted.!/DEBUG! /DEBUG /NODEBUG (D)D Enables the generation of a .LOG file, and the insertion ofD program debug messages into that file. Unless specified with theD /LOG=logfilename qualifier, the default file specification$ SYS$LOGIN:XMODEM.LOG will be used.!/CRC! /CRC (D) /NOCRCD Select the CRC-16 error-checking protocol on receive. CRC mode isD better at catching transmission errors that occur than theD alternative checksum protocol. CRC mode is automatically selectedC for file transmission if the receiving modem program requests it.! /APPEND_LOG! /APPEND_LOG (D) /NOAPPEND_LOGD Controls whether log information is written to a new version ofD the .LOG file for each invokation of XMODEM, or appended to theD most recent version. Unless specified with the /LOG=logfilenameD qualifier, the default file specification SYS$LOGIN:XMODEM.LOG will be used. !/LOG! /LOG=logfilename /LOG=SYS$LOGIN:XMODEM.LOG (D) /NOLOGD Enables the generation, and specifies the filename, of the .LOG file produced by XMODEM.!/MODEM7! /NOMODEM7 (D) /MODEM7D Select the MODEM7 batch protocol for sending files. The fileD specification may include wildcards or searchlists. MultipleD filenames may be specified, separated by commas. VMS "Sticky"D defaults apply when multiple filenames are specified, so thatD elements of a filespec, such as an extension, that are missingE from a filespec, will utilize defaults applied from any previous D filespec specfied (if you specify "FOO.STUFFIT,BAR,.BIN", XMODEMD will search for the files FOO.STUFFIT, BAR.STUFFIT, and BAR.BIN).D The MODEM7 batch protocol is used automatically for file receptionD if the sending program requests it. If this flag is specified forD a batch receive, ( XMODEM filename/RECEIVE=BINARY/MODEM7, forD example ), the transfer starts in checksum mode rather than CRC mode.!/YMODEM! /NOYMODEM (D) /YMODEMD Select the YMODEM batch protocol for sending files. The fileD specification may include wildcards or searchlists. MultipleD filenames may be specified, separated by commas. VMS "Sticky"D defaults apply when multiple filenames are specified, so thatD elements of a filespec, such as an extension, that are missingE from a filespec, will utilize defaults applied from any previous D filespec specfied (if you specify "FOO.STUFFIT,BAR,.BIN", XMODEMD will search for the files FOO.STUFFIT, BAR.STUFFIT, and BAR.BIN).D The YMODEM batch protocol is used automatically for file receptionD if the sending program requests it. When /YMODEM is specified withD the /RECEIVE qualifier, the filename parameter is not required. IfD this qualifier is specified for a batch receive, (D XMODEM/RECEIVE=TEXT/YMODEM , for example ), the transfer will5 never attempt to switch from CRC to checksum mode. !/ONEK! /NOONEK (D) /ONEKD Select the /ONEK file transfer mode for sending files. Use of 1KD packets on low-error lines increases throughput. However, overD direct connections at 9600 bps to a busy host, 1K packets mayD cause data overflows generating excessive retries. 1K packets areD automatically used for file reception if the sending programD requests it. If this flag is specified with the YMODEM flag in aD batch receive (XMODEM/RECEIVE=BINARY/YMODEM/ONEK, for example),D the program will attempt to use the "KMD/IMP" convention to invoke 1K file transfers.!/BUSY! /NOBUSY (D) /BUSYD Indicates the VMS system is Too Busy and XMODEM should fall back to a simpler I/O strategy.!/RECEIVE! /RECEIVE=BINARY (D) /RECEIVE=TEXT /RECEIVE=APPLE_TEXTD /RECEIVE=BINARY places received data into the VMS file withoutD conversion. /RECEIVE=TEXT converts from the CP/M and MS-DOS formatD of CR-LF pairs to the VMS STREAM_LF convention of newlineD characters only between lines. Null bytes are ignored and bit 8 ofD each character is stripped (which makes Wordstar files much moreD readable). A CTRL-Z character is deemed to indicate the EOFD location in the incoming file. The resulting file is acceptable toD VMS editors, and is usually slightly smaller than the originalD file. /RECEIVE=APPLE_TEXT behaves the same as /RECEIVE=TEXT exceptD that CR characters in the incoming file are translated into VMS STREAM_LF newline characters. !/SEND! /SEND=BINARY (D) /SEND=TEXT /SEND=APPLE_TEXTD /SEND=BINARY transmits data without conversion, as it exists inD the original VMS file. /SEND=TEXT converts newline characters inD the file to CR-LF pairs in accord with the CP/M and MS-DOSD conventions for text files. The file "grows" in this process.D /SEND=APPLE_TEXT behaves the same as /SEND=TEXT, except thatD newline characters are converted into CR characters in accord with. Apple Macintosh conventions for text files. !2 Additional_information!D While waiting for the beginning of a file transfer, XMODEM treatsD two CAN (CTRL-X) characters that are received within 3 seconds asD a request to abort. CAN characters will not cause an abort ifD received during a file transfer. If 10 or more errors are detectedD during the transmission or reception of any one packet, theD transfer is aborted. Squeezed, compressed or ARCed files must beD transferred in binary mode, even if they contain text. If anD unexpected error occurs before a file is completely received, theD incomplete file is deleted. Files received using both binary andD text mode in a YMODEM batch transfer will be truncated to the fileD size specified in the YMODEM header (extra CR characters in theD incoming file are correctly handled). File sizes are included inD the YMODEM header when sending both binary and text files. ThusD files transferred via YMODEM should preserve their exact length.D File modification times are set for received files if present inD the YMODEM header; they are included in the headers forD transmitted files. The "KMD/IMP" record count field in the YMODEM header is both set and read. ! 2 Examples!D To receive a text file transmitted from a micro (using CRC-16D error-checking) and store it under the name file.name , use the command line :+ $ XMODEM file.name/RECEIVE=TEXT/CRCD Note that if the transmitting program on the micro uses the 1KD packet protocol or either batch protocol, XMODEM detects thisD automatically and takes appropriate action. Further note that ifD one of the batch protocols is used, the received file(s) will beD stored under their own names and the name on the command line (if any) will be ignored. D To send a set of text files to a microcomputer using 1K packets7 and the YMODEM batch protocol, use the command line :8 $ XMODEM FOO*.TXT,BAR*.TXT/SEND=TEXT/YMODEM/ONEK! 2 Known_BUGS!D Batch mode could be smarter about bad file-names in the midst of aD batch transmit/receive. Batch mode could allow a mixture of binaryD and text files. Bare Carriage Return characters (i.e., those notE immediately followed by a Line Feed character) are mishandled in D a received file when using text mode. A file with ``overstruck''D lines will thus come out looking funny. YMODEM header packets areD only sent as 128 byte packets. Thus VERY long file names will not be handled properly. ww 5đ1 XMODEM!H The XMODEM program implements the Christensen (XMODEM) fileH transfer protocol for moving files between VAX/VMS systems andH microcomputers. The XMODEM/CRC protocol, the MODEM7 batch protocol,H the XMODEM-1K block protocol and the YMODEM batch protocol are allH supported by XMODEM . For details of the protocols, see theH document edited by Chuck Forsberg titled XMODEM/YMODEM Protocol Reference. Syntax:( XMODEM [ file_name ] [ /qualifiers ]!2 Parameters! FILENAMED The name of a file that will be received from, or sent to, aD remote system. The file specification may include wildcards orD searchlists. Multiple filenames may be specified, separated byD commas. VMS "Sticky" defaults apply when multiple filenames areD specified, so that elements of a filespec, such as an extension,D that are missing from a filespec, will utilize defaults appliedD from any previous filespec specfied (if you specifyD "FOO.STUFFIT,BAR,.BIN", XMODEM will search for the filesD FOO.STUFFIT, BAR.STUFFIT, and BAR.BIN). Filenames are requiredD when the /SEND qualifier is specified, and when the /RECEIVED qualifier is specified without the /YMODEM qualifier. FilenamesD are not required for /RECEIVE/YMODEM operations. Note that sinceD Macintosh filenames are limited to 32 characters, XMODEM willD automatically truncate any VMS filespec transmitted to 32> characters before sending the filespec to the remote system.!2 Qualifiers!!/SINCE! /SINCE /SINCE[=VMS_date_time_spec]D Qualifies the transmission of files with the /YMODEM protocol, soD that only those files that satisfy the file specification, andD have creation dates greater than or equal to the time specified,8 will be transmitted. /SINCE defaults to /SINCE=TODAY.!/BEFORE! /BEFORE /BEF ORE[=VMS_date_time_spec]D Qualifies the transmission of files with the /YMODEM protocol, soD that only those files that satisfy the file specification, andD have creation dates less than or equal to the time specified, will8 be transmitted. /BEFORE defaults to /BEFORE=TOMORROW.!/DEBUG! /DEBUG /NODEBUG (D)D Enables the generation of a .LOG file, and the insertion ofD program debug messages into that file. Unless specified with theD /LOG=logfilename qua!lifier, the default file specification$ SYS$LOGIN:XMODEM.LOG will be used.!/CRC! /CRC (D) /NOCRCD Select the CRC-16 error-checking protocol on receive. CRC mode isD better at catching transmission errors that occur than theD alternative checksum protocol. CRC mode is automatically selectedC for file transmission if the receiving modem program requests it.! /APPEND_LOG! /APPEND_LOG (D) /NOAPPEND_LOGD Controls whether log information is w"ritten to a new version ofD the .LOG file for each invokation of XMODEM, or appended to theD most recent version. Unless specified with the /LOG=logfilenameD qualifier, the default file specification SYS$LOGIN:XMODEM.LOG will be used. !/LOG! /LOG=logfilename /LOG=SYS$LOGIN:XMODEM.LOG (D) /NOLOGD Enables the generation, and specifies the filename, of the .LOG file produced by XMODEM.!/MODEM7! /NOMODEM7 (D) /MODEM7D Select the MODEM7 # batch protocol for sending files. The fileD specification may include wildcards or searchlists. MultipleD filenames may be specified, separated by commas. VMS "Sticky"D defaults apply when multiple filenames are specified, so thatD elements of a filespec, such as an extension, that are missingE from a filespec, will utilize defaults applied from any previous D filespec specfied (if you specify "FOO.STUFFIT,BAR,.BIN", XMODEMD will search for the files FOO.STUF$FIT, BAR.STUFFIT, and BAR.BIN).D The MODEM7 batch protocol is used automatically for file receptionD if the sending program requests it. If this flag is specified forD a batch receive, ( XMODEM filename/RECEIVE=BINARY/MODEM7, forD example ), the transfer starts in checksum mode rather than CRC mode.!/YMODEM! /NOYMODEM (D) /YMODEMD Select the YMODEM batch protocol for sending files. The fileD specification may include wildcards or searchlists. Mu %ltipleD filenames may be specified, separated by commas. VMS "Sticky"D defaults apply when multiple filenames are specified, so thatD elements of a filespec, such as an extension, that are missingE from a filespec, will utilize defaults applied from any previous D filespec specfied (if you specify "FOO.STUFFIT,BAR,.BIN", XMODEMD will search for the files FOO.STUFFIT, BAR.STUFFIT, and BAR.BIN).D The YMODEM batch protocol is used automatically for file receptionD if t &he sending program requests it. When /YMODEM is specified withD the /RECEIVE qualifier, the filename parameter is not required. IfD this qualifier is specified for a batch receive, (D XMODEM/RECEIVE=TEXT/YMODEM , for example ), the transfer will5 never attempt to switch from CRC to checksum mode. !/ONEK! /NOONEK (D) /ONEKD Select the /ONEK file transfer mode for sending files. Use of 1KD packets on low-error lines increases throughput. However,' overD direct connections at 9600 bps to a busy host, 1K packets mayD cause data overflows generating excessive retries. 1K packets areD automatically used for file reception if the sending programD requests it. If this flag is specified with the YMODEM flag in aD batch receive (XMODEM/RECEIVE=BINARY/YMODEM/ONEK, for example),D the program will attempt to use the "KMD/IMP" convention to invoke 1K file transfers.!/BUSY! /NOBUSY (D) /BUSYD Indicates (the VMS system is Too Busy and XMODEM should fall back to a simpler I/O strategy.!/RECEIVE! /RECEIVE=BINARY (D) /RECEIVE=TEXT /RECEIVE=APPLE_TEXTD /RECEIVE=BINARY places received data into the VMS file withoutD conversion. /RECEIVE=TEXT converts from the CP/M and MS-DOS formatD of CR-LF pairs to the VMS STREAM_LF convention of newlineD characters only between lines. Null bytes are ignored and bit 8 ofD each character is stripped (which makes Wordstar) files much moreD readable). A CTRL-Z character is deemed to indicate the EOFD location in the incoming file. The resulting file is acceptable toD VMS editors, and is usually slightly smaller than the originalD file. /RECEIVE=APPLE_TEXT behaves the same as /RECEIVE=TEXT exceptD that CR characters in the incoming file are translated into VMS STREAM_LF newline characters. !/SEND! /SEND=BINARY (D) /SEND=TEXT /SEND=APPLE_TEXTD /SEND=BINARY transmits data wi *thout conversion, as it exists inD the original VMS file. /SEND=TEXT converts newline characters inD the file to CR-LF pairs in accord with the CP/M and MS-DOSD conventions for text files. The file "grows" in this process.D /SEND=APPLE_TEXT behaves the same as /SEND=TEXT, except thatD newline characters are converted into CR characters in accord with. Apple Macintosh conventions for text files. !2 Additional_information!D While waiting for the beginni+ng of a file transfer, XMODEM treatsD two CAN (CTRL-X) characters that are received within 3 seconds asD a request to abort. CAN characters will not cause an abort ifD received during a file transfer. If 10 or more errors are detectedD during the transmission or reception of any one packet, theD transfer is aborted. Squeezed, compressed or ARCed files must beD transferred in binary mode, even if they contain text. If anD unexpected error occurs before a file is compl,etely received, theD incomplete file is deleted. Files received using both binary andD text mode in a YMODEM batch transfer will be truncated to the fileD size specified in the YMODEM header (extra CR characters in theD incoming file are correctly handled). File sizes are included inD the YMODEM header when sending both binary and text files. ThusD files transferred via YMODEM should preserve their exact length.D File modification times are set for received files if presen-t inD the YMODEM header; they are included in the headers forD transmitted files. The "KMD/IMP" record count field in the YMODEM header is both set and read. ! 2 Examples!D To receive a text file transmitted from a micro (using CRC-16D error-checking) and store it under the name file.name , use the command line :+ $ XMODEM file.name/RECEIVE=TEXT/CRCD Note that if the transmitting program on the micro uses the 1KD packet protocol or ei.ther batch protocol, XMODEM detects thisD automatically and takes appropriate action. Further note that ifD one of the batch protocols is used, the received file(s) will beD stored under their own names and the name on the command line (if any) will be ignored. D To send a set of text files to a microcomputer using 1K packets7 and the YMODEM batch protocol, use the command line :8 $ XMODEM FOO*.TXT,BAR*.TXT/SEND=TEXT/YMODEM/ONEK! 2 Known_BUGS!D Batch mode / could be smarter about bad file-names in the midst of aD batch transmit/receive. Batch mode could allow a mixture of binaryD and text files. Bare Carriage Return characters (i.e., those notE immediately followed by a Line Feed character) are mishandled in D a received file when using text mode. A file with ``overstruck''D lines will thus come out looking funny. YMODEM header packets areD only sent as 128 byte packets. Thus VERY long file names will not be handled properly. ww$*[BERNARD.SYSTEM.XMODEM]XMODEM.HLP;16+,~./ 4Hx-l0123KPWO56\Ñ7 K189GHJ(!1 XMODEM!H The XMODEM program implements the Christensen (XMODEM) fileH transfer protocol for moving files between VAX/VMS systems andH microcomputers. The XMODEM/CRC protocol, the MODEM7 batch protocol,H the XMODEM-1K block protocol and the YMODEM batch protocol are allH supported by XMODEM . For details of the protocols, see theH document edited by Chuck Forsberg titled XMODEM/YMODEM Protocol Reference. Syntax:( XMODEM [ file_name ] [ /qualifiers ]!2 Parameters! FILENAMED The name of a file that will be received from, or sent to, aD remote system. The file specification may include wildcards orD searchlists. Multiple filenames may be specified, separated byD commas. VMS "Sticky" defaults apply when multiple filenames areD specified, so that elements of a filespec, such as an extension,D that are missing from a filespec, will utilize defaults appliedD from any previous filespec specfied (if you specifyD "FOO.STUFFIT,BAR,.BIN", XMODEM will search for the filesD FOO.STUFFIT, BAR.STUFFIT, and BAR.BIN). Filenames are requiredD when the /SEND qualifier is specified, and when the /RECEIVED qualifier is specified without the /YMODEM qualifier. FilenamesD are not required for /RECEIVE/YMODEM operations. Note that sinceD Macintosh filenames are limited to 32 characters, XMODEM willD automatically truncate any VMS filespec transmitted to 32> characters before sending the filespec to the remote system.!2 Qualifiers!!/SINCE! /SINCE /SINCE[=VMS_date_time_spec]D Qualifies the transmission of files with the /YMODEM protocol, soD that only those files that satisfy the file specification, andD have creation dates greater than or equal to the time specified,8 will be transmitted. /SINCE defaults to /SINCE=TODAY.!/BEFORE! /BEFORE /BEFORE[=VMS_date_time_spec]D Qualifies the transmission of files with the /YMODEM protocol, soD that only those files that satisfy the file specification, andD have creation dates less than or equal to the time specified, will8 be transmitted. /BEFORE defaults to /BEFORE=TOMORROW.!/DEBUG! /DEBUG /NODEBUG (D)D Enables the generation of a .LOG file, and the insertion ofD program debug messages into that file. Unless specified with theD /LOG=logfilename qualifier, the default file specification$ SYS$LOGIN:XMODEM.LOG will be used.!/CRC! /CRC (D) /NOCRCD Select the CRC-16 error-checking protocol on receive. CRC mode isD better at catching transmission errors that occur than theD alternative checksum protocol. CRC mode is automatically selectedC for file transmission if the receiving modem program requests it.! /APPEND_LOG! /APPEND_LOG (D) /NOAPPEND_LOGD Controls whether log information is written to a new version ofD the .LOG file for each invokation of XMODEM, or appended to theD most recent version. Unless specified with the /LOG=logfilenameD qualifier, the default file specification SYS$LOGIN:XMODEM.LOG will be used. !/LOG! /LOG=logfilename /LOG=SYS$LOGIN:XMODEM.LOG (D) /NOLOGD Enables the generation, and specifies the filename, of the .LOG file produced by XMODEM.!/MODEM7! /NOMODEM7 (D) /MODEM7D Select the MODEM7 batch protocol for sending files. The fileD specification may include wildcards or searchlists. MultipleD filenames may be specified, separated by commas. VMS "Sticky"D defaults apply when multiple filenames are specified, so thatD elements of a filespec, such as an extension, that are missingE from a filespec, will utilize defaults applied from any previous D filespec specfied (if you specify "FOO.STUFFIT,BAR,.BIN", XMODEMD will search for the files FOO.STUFFIT, BAR.STUFFIT, and BAR.BIN).D The MODEM7 batch protocol is used automatically for file receptionD if the sending program requests it. If this flag is specified forD a batch receive, ( XMODEM filename/RECEIVE=BINARY/MODEM7, forD example ), the transfer starts in checksum mode rather than CRC mode.!/YMODEM! /NOYMODEM (D) /YMODEMD Select the YMODEM batch protocol for sending files. The fileD specification may include wildcards or searchlists. MultipleD filenames may be specified, separated by commas. VMS "Sticky"D defaults apply when multiple filenames are specified, so thatD elements of a filespec, such as an extension, that are missingE from a filespec, will utilize defaults applied from any previous D filespec specfied (if you specify "FOO.STUFFIT,BAR,.BIN", XMODEMD will search for the files FOO.STUFFIT, BAR.STUFFIT, and BAR.BIN).D The YMODEM batch protocol is used automatically for file receptionD if the sending program requests it. When /YMODEM is specified withD the /RECEIVE qualifier, the filename parameter is not required. IfD this qualifier is specified for a batch receive, (D XMODEM/RECEIVE=TEXT/YMODEM , for example ), the transfer will5 never attempt to switch from CRC to checksum mode. !/ONEK! /NOONEK (D) /ONEKD Select the /ONEK file transfer mode for sending files. Use of 1KD packets on low-error lines increases throughput. However, overD direct connections at 9600 bps to a busy host, 1K packets mayD cause data overflows generating excessive retries. 1K packets areD automatically used for file reception if the sending programD requests it. If this flag is specified with the YMODEM flag in aD batch receive (XMODEM/RECEIVE=BINARY/YMODEM/ONEK, for example),D the program will attempt to use the "KMD/IMP" convention to invoke 1K file transfers.!/BUSY! /NOBUSY (D) /BUSYD Indicates the VMS system is Too Busy and XMODEM should fall back to a simpler I/O strategy.!/RECEIVE! /RECEIVE=BINARY (D) /RECEIVE=TEXT /RECEIVE=APPLE_TEXTD /RECEIVE=BINARY places received data into the VMS file withoutD conversion. /RECEIVE=TEXT converts from the CP/M and MS-DOS formatD of CR-LF pairs to the VMS STREAM_LF convention of newlineD characters only between lines. Null bytes are ignored and bit 8 ofD each character is stripped (which makes Wordstar files much moreD readable). A CTRL-Z character is deemed to indicate the EOFD location in the incoming file. The resulting file is acceptable toD VMS editors, and is usually slightly smaller than the originalD file. /RECEIVE=APPLE_TEXT behaves the same as /RECEIVE=TEXT exceptD that CR characters in the incoming file are translated into VMS STREAM_LF newline characters. !/SEND! /SEND=BINARY (D) /SEND=TEXT /SEND=APPLE_TEXTD /SEND=BINARY transmits data without conversion, as it exists inD the original VMS file. /SEND=TEXT converts newline characters inD the file to CR-LF pairs in accord with the CP/M and MS-DOSD conventions for text files. The file "grows" in this process.D /SEND=APPLE_TEXT behaves the same as /SEND=TEXT, except thatD newline characters are converted into CR characters in accord with. Apple Macintosh conventions for text files. !2 Additional_information!D While waiting for the beginning of a file transfer, XMODEM treatsD two CAN (CTRL-X) characters that are received within 3 seconds asD a request to abort. CAN characters will not cause an abort ifD received during a file transfer. If 10 or more errors are detectedD during the transmission or reception of any one packet, theD transfer is aborted. Squeezed, compressed or ARCed files must beD transferred in binary mode, even if they contain text. If anD unexpected error occurs before a file is completely received, theD incomplete file is deleted. Files received using both binary andD text mode in a YMODEM batch transfer will be truncated to the fileD size specified in the YMODEM header (extra CR characters in theD incoming file are correctly handled). File sizes are included inD the YMODEM header when sending both binary and text files. ThusD files transferred via YMODEM should preserve their exact length.D File modification times are set for received files if present inD the YMODEM header; they are included in the headers forD transmitted files. The "KMD/IMP" record count field in the YMODEM header is both set and read. ! 2 Examples!D To receive a text file transmitted from a micro (using CRC-16D error-checking) and store it under the name file.name , use the command line :+ $ XMODEM file.name/RECEIVE=TEXT/CRCD Note that if the transmitting program on the micro uses the 1KD packet protocol or either batch protocol, XMODEM detects thisD automatically and takes appropriate action. Further note that ifD one of the batch protocols is used, the received file(s) will beD stored under their own names and the name on the command line (if any) will be ignored. D To send a set of text files to a microcomputer using 1K packets7 and the YMODEM batch protocol, use the command line :8 $ XMODEM FOO*.TXT,BAR*.TXT/SEND=TEXT/YMODEM/ONEK! 2 Known_BUGS!D Batch mode could be smarter about bad file-names in the midst of aD batch transmit/receive. Batch mode could allow a mixture of binaryD and text files. Bare Carriage Return characters (i.e., those notE immediately followed by a Line Feed character) are mishandled in D a received file when using text mode. A file with ``overstruck''D lines will thus come out looking funny. YMODEM header packets areD only sent as 128 byte packets. Thus VERY long file names will not be handled properly. #*[BERNARD.SYSTEM.XMODEM]XMODEM.LOG;1+,~./ 4-l0123KPWO56Uϑ7189GHJ ++++++++ Wed Dec 7 09:25:38 1988 XMODEM Version 3.6 Command Line : "XM/SE/Y *.*/LOG=[]" YMODEM Batch Send Started, in BINARY mode Line speed = 9600 bits per second ++++++++ Wed Dec 7 09:27:41 1988 XMODEM Version 3.6 Command Line : "XM/SE/Y *.*/LOG=[]" YMODEM Batch Send Started, in BINARY mode Line speed = 9600 bits per second ---- XMODEM Send Function File Name: USER8:[COHEN.MACINTOSH.XMODEM]BATCH.C;1 File Size 5K, 38 Records, 4774 Bytes Estimated transmission time 6 seconds CRC mode requested Non-ACK on sector 1 Non-ACK on sector 1 Non-ACK on sector 1 Non-ACK on sector 1 Non-ACK on sector 1 Non-ACK on sector 1 Non-ACK on sector 1 Non-ACK on sector 1 Non-ACK on sector 1 Non-ACK on sector 1 XMODEM Fatal Error: Too many errors in transmission sf ~ XMODEMVMS.BCK~l#[BERNARD.SYSTEM.XMODEM]XMODEM.TXT;1M A#*[BERNARD.SYSTEM.XMODEM]XMODEM.TXT;1+,~./ 4M-l0123KPWO56N^)7^189GHJIFrom: LEDS::RT128::BATES "The Right Stuff" 31-MAR-1989 16:43:10.70To: LEDS::COHENCC: 9Subj: Here it is...it would be GREAT if you could fix it! MCheck RMS File Integrity 31-MAR-1989 16:37:49.81 Page 16DIR$MAIN:[WORKING_STORAGE]MULTIFINDER_V6_1_B7.BINARY;1 FILE HEADERB File Spec: DIR$MAIN:[WORKING_STORAGE]MULTIFINDER_V6_1_B7.BINARY;1 File ID: (599,4,0) Owner UIC: [BATES]8 Protection: System: RWE, Owner: RWED, Group: , World: ) Creation Date: 28-MAR-1989 20:12:16.004 Revision Date: 31-MAR-1989 16:37:11.00, Number: 4 Expiration Date: none specified Backup Date: none posted Contiguity Options: none Performance Options: none Reliability Options: none Journaling Enabled: noneRMS FILE ATTRIBUTES File Organization: sequential Record Format: fixed Record Attributes:  Maximum Record Size: 128 Longest Record: 128. Blocks Allocated: 120, Default Extend Size: 0' End-of-File VBN: 119, Offset: %X'0180' File Monitoring: disabled Global Buffer Count: 0!The analysis uncovered NO errors..ANA/RMS/OUT=FOO.FOO MULTIFINDER_V6_1_B7.BINARY$*[BERNARD.SYSTEM.XMODEM]XMODEM2.TXT;1+,~./ 4I-l0123KPWO56xa)7189GHJIFrom: LEDS::RT128::BATES "The Right Stuff" 31-MAR-1989 17:12:34.41To: LEDS::RDSENG::COHENCC: =Subj: RE: Here it is...it would be GREAT if you could fix it!BError on the Mac end is unexpected character (SOH). Transfer can't get started.HRight now it seems to be creating a sequential stream file. It should be sequential fixed, 128byte recordHope this helps,-Joer z~l![BERNARD.SYSTEM.XMODEM]FM_)H;3')1yF$< k(~qxs4}|i`&(7@ Fd7~~x2G?0L45LR rE!f`^ʴ(!<&w5q,ӄ.1.YF^cIz5jJpUY,TG/;[v狼&6+")ҀFWi(8Lǭ'HT=y oWB4gB teiCI e7OC%XDl4P'A98p~+LX*,'/4 3AoOMO % uT9:L p'SyE ǖZsq [P-l,Jۘ1.6O`mj5w;]aihQbÁ!9~T}j/"k[z<-af]\3aZ '+tNmy /kyA5N$Tx '=,,ķ~/Ѳ\o+\W!Ed&'Y ;|zdLs|3rM3J5ZR\~ (]O xKI񱳃,wLz)9&/rf'L"X1FKXm'H-*%|ς+ ~; 6C [@ ?栓Zp+{[7[-n3&if?y}KóF:dD=5߁=x.CeG* ]wrK(LX'lT{[Յ}5hE3*IT*d![G'Ks[f}P#1N sR`ݵ=&7Oyߓ"ɯ\U-:t<6QYLkFg: ' J.I % _^]| (%rFco.I~vW'vUcr8] C_@w qJ)naޢ|T!7D.Es.DDeܠk\19ųzyY>xiUH* = B&NlxE4O9< VŤ)i0+$gRHόP.sM:9σքU2RG-643 G667*:lk#4z^ 6bvNqMto;D஧}Eno. pI]T)j#;o4<@B%4it6y7#j䡍=[BWBJersGxHIWsa9  "eOrb)Չ hs>MRzoGL0~9#@d4:PZTF+Hmގ \FؕR_\,V"h %d4[`&VJ"gg0x(LDz;QȬ ś>z!zXasP&?L-~E4lTVF9y88+K]“ \t7:R b1e> i9,7sxOT vT=h{h!3 #V6mn?M&X$V(D2etTlE'낒3jT+ $&M?YrxPrsp@O\滌:Anix#izUőQ !v$XuicXGE'Yb~Wr4Tu1Pb"^bm2t"Fv pRR|]mTuѹDF(^pVQ%sIV6>Y3tҫRۖd1YsFn t"rR3+X_  C>jqJp\/}`6²:bS2h0V8Hp9U3V sHڀg up_ 4A;F z #So 1W./D9]ml#h8G\.tNn!wWZ1R2 E"5^6;[*jx 6 ȞӚ0gF8z=KʍBNbmySp%$/h0a\2+"_OZ8jsk "KR'$6 ,k=uSX:>&Sp5atچ=bh>r7 FQ|@)y_O}|"#Lv)a $M]JYW7= mஎ0z>0;8_ \|3`~;jtcr P2H0GW{S {-'aJF--.eC_ tO?Ll쁢щ] M!Oة7BeX䝴R9C&'Z  (^`}LxCOQ}Iq(H t'2(+~D)"Q&)UM&6"ZKxr)v+bn\6uW*P$q<q KY1 >-'ii@ƊzW$*lkCg@4T)y?k -|GLQWWђFkicl"X9uf7n@p]^Xwt<'D׃0,I-Hznf4nIV~ C@=qm{.oTR7[9@l'<W֝@`elo-)K z-.NPyIx[yEmUļSU2@*@G YLuq#Xl,ۙO:$;)ߢ.pyrҜK)4hztl!$A<|W>U"mtFIާ|C-0.* S2*d) ZF\v#4\r&:R,BEIwC(n)~ QU?̸8phc: +BWQ}C͋oێ7N1+rcҰeު40mक़+Zr&@MFom W>=: io<@K=_J[:AX¦ݹо 러4 @.{4BL6$q- ]gXB# rLwS 7  1;HמWJx+⬷˴!Sߴ9~{$|o(-_k݆5♦ ˝Ӛڄm؀&-ΟˉQơ쯈Ǹ^+P\ٵR=尒O m6r+OszB C[gvNL}VѪl;ߛ/4+AE'Gb3i&, ݮRKP,S~61QuZ 7-BQ- uE 4^(䅆 5c~1]z5|q!͗X "yTmrQ1O .ݥsuK/J܀ƥ]{)5AjX4suԬc޳'dkQt&5M( K⺒[DޣHW5ڀ Zjbm<7ʐQ @<;sS}a14f"7~dDsAN6cS~a&hʈcY0wE M9 (50V'I5?&ٛeӽ# 6I{B+;AlB'/1B~cN -à_GւOq!) #hW?]OD GzEr> 8mz3J4l+<lI  bCAo琩9 ')fe,S-l=)"?}L-n8!~6:BARՋ{ ɄYstK&D4@=R6|%tQQ k utEsʼPq]u?: 6p0_jUq)~k^ K'4t0dk'v_=v`۔9XmY*'Py01{N$58D<_bO|-ukFk8dހ2RQ cYqBC%:L} |,<&|=vP]z➚)`N7NDvzf?j9\?E [-)P&r*[P@ܞd pa =(XJ"r{[-u'p8njzJAx:@nf3""},3gBdSehS' p\ 1q^b㉐aC2p 8ڮ+Q,ms7 ޻{{@Ed1v{fC"63Kgh41o3?H柑{hwr_9ij+U$b>Ao,3 ! Cu5pJ82BO?;cit 3YsW37T@zY ,P&LxJ=Y{+ ?⃐9Ʌ% &Νhl*̫O!_PjV.mID~ur"<7&64 .`bLK ʭVgb8$,ZXx\Psi=#tϵ̰5k{վ^'F [1>AcT]H wGsIW4q~7'5c>SċK^U}4sk#%KSI)u\H*\L<Ad '?<'H,~}Ќb>¼jT`N0zR~ Jl{wE$}@oqKU9ɗ(MJhb͟mSXO+ 'Mģ?>ZB7Zݐ%kk顤|hlٞw{UUReD' 7,E -FǮփq)akS}Gg,Xڬ( ݞ;AE uk_0aV4'W '"\נ3)#/s}eEGA{$SA" J B1 EBj+QCyL_e9 ~JXm% p)~FYbXcO>hIu,#ρ!^pW&Y) P fH dKѡVtYeΜ r,D Fs#')Y_8 Vd0 ]]rp `zhX<|dEoYMڢf{Ii' ޸y`L K%;"&12o3K. CNxIL؇Iv?-7>QUX3bN Ut"`V@Fڝ73 YJpwDL'W98DA8ݦuQKl,0w', z#K4LʸpgjJ>qќ*okJq8]{l#yw~RcW@a^)L*pCn0A;HW^3R*˰ 1J{b! ֢$bw'3uTCezX ?b/12qE^_*9Z}/wmG視 M)$DD3ay"e9֊AW Ɇگktjx 1U}c\Z07e)g ,e)'l j\l܀.Z7'(mT~Z_wV!}Œ\"_?K#^as0znFS FqGh3Vƛ\Lz{'GbIp+x5us& 䲈 Ql{(1ć8AM5L'usG\fقt `E(19`7lule( mVjiA >+a;u*Bk9|2“ndV^́lOڸv L*}[GJM@:Q;0 ˘'ʼ=0Bcb1}aISv\;1 ǣV펬`2B#Om`v.Bb%@M) pFLa`v ֥ 6\Ժ>h1uw9OS͇VɭaBn ZK/"f5/3f~K&= %WxU]~Q7mxe1lk (vΨd_q%x&cWLsE~7+LKM ,>k*5aSwzFyw8?;}Ok'Er֖cñ~j9sjh#W7A^K38o žWWr:ayg@2TxmsVuغL+A#fN| n*zs!0 |>&s\Yɀrbo7}p`Ë FԀ`+C1bV ^Ny(ZO i{UA|Ro!K,Ӣ|=>@HW}e_r` uSwm ?)ix]U!],WLU_Rm4'$r9g?f.rߏiOLƠ$/-oSx=tTLblטQ9gZ'NVLz F5{M^W1𶌀ϸ׈w\,`l!)1lڀ҂[U{럙 J2gu]KFV'| $\^QVfqX[6RHyX<Ꭲ/mtex$^#&ɹ+ BʩWF?# bȈe ΍t?`>~t !_iQlJG!+,M]AKB1=%$a`|#!\Qz*N@Ank,buV~($ܰ9VE?hY'4qqOgAK%jxɮUVԷ:^ \M`{ҘNr/Y?Z2}jhDvbC,R#Y?k%TOx C?S*qM`%Nm+n ?'i)IA8u} 78ӕPlwǗt?WcBB+:&&Isc3PtllB2#i3!Ov&Ǖ&xYW@;=[{**94B;)ۺrKb]yBD m6GūZ'[+N G\& ^=fAtfMkQEgU Eq&OÁ;Ql2pG*xpA$oؤ4c2;Ԛ#B;0Rc_(2`Q~wJ/Ԍ ^kA$Ma~xY4=xr' :,Jp9j74y!(5;Xk clXs?H~0 %ˇN뵏gK>yVwG=DEe.K~X)CeID^͌tբÇB!eR(t'&WtoeǤiPS$F2aO,| ]CGCH :U5R Sk8> 10YNz#f'_-`{~vƫy9ֻ*!ZU9証tp.EIB_H%xS cwj7t7gET*ͯr  v_˻L״_B]&ڈ80ݻcfXΔa56â垦RECZӜDYzXm-r_Ť1j,/Ec9RS_;/S s*[9#]T%Jڌ0AK< gy%e#l9c0\#eY{" Hyu;+l+ ?Tc8/مX ۵r焔үO̼t +.649O?[VF؜4 CeCK1'E4^Rz5 Հ ?Pa-tNd˗֟_GCH~ǬGb6*xLOӎ;y*H2TOoziHڤܠߵK|aB~H&|y/@%Z?Z-" Z͸fy-~۩IC2mubbՠ |AkH~m/#L7~ќO^u<\W`ZO1e`v4/{{X^W -4k#ِkG`VݝXbsZ3~gd]xe~ѫG0W"(GK)<&+֗c@ bf|9k)0s-Lh%;xsw_\ Z|.0\VzEz(3?R['ѶU襡"Piʭ"g4G1O?nS&vl؆+/g:e *%cmmDFZKJ&s pHݬFX yJ?Qt 7[/da|#TEGyD3g<E-|1~zK{:4ͳ,E֊i.3U)ؔ6PʖlFѶMܲ$HG'6P^EkHW-]#)%՞ (Fl+1wJH`Vnq^"@hF"x`lTztSLnѼ2LԢ)ƒ+P<HY͠|3(iH= QS`'&ΖVMB:V H AM>?D~: Wi#͆!;¾mI!K[ :CTg~[Fy|_lr}U'e-K>:8^dd Hʻhl ..,E#Z?|O@z1}l՘FuaJcKxK2srUHqKz#V tZDp f;E]Wu3|r9wG k 8?fgF19@-1", PeeO_ܧfQp+x!&KhѰi!1Im!RETL@KcF\Z*fN^a #c"L(I#Tyzv^钔mǏ\-N{ p7sgXVp 3ā=oU4'*(2Jrn5 U4T|'cOJirSMPT< 7iG- :G5;$L:JZ75R RʦutE_vwNVGr\gz CeaUO6N7`1avbL0Ì`yَuhżr #ns0ƞJDTC$Mhټ:dv{9PD8sI)$x愄(p1xp^&{>bR! x7 yJ8LFݚ)ШcWaw`ȯDyi|qj(.\S5]ͮ wjɏ|-b.`Ҿ%K4Eh?cS ;j*mmY z\~$Q-= -2fr\% u6q{4~C99k*ظZakڠK}b¹hwW;cvax;.>cgoyQY$%W䰛r.Zu|t>yz6gT75&y,>گaK%7}2*!VM u"SjA Ub\ooVmkLlM3 ?✙_h+1݄^6=OB׾p'Ne94TቝzEWm7Z& -B59gBj&a庰@(W\cv#-xi|HJ`blܱC3x+5&{"M@*Lz#hUu D >/i6H8Ӕc͊T{V2#=]˟0'0ǟ"齍6fxBʿ1ؔMWym?kbfͅ#,Twv"Č+>*vx#l׃}_C"7`dSyEMD끱;@w "&ixr4g X'd~]g_[t?Ǿ谸?ZaIid2&: Bͥ)‡Ǯ[mN?vn!˭&6VM&uݭ]e'^a@. `?YKId}VGz[yQFQnI5 $1'`OU|K%wZċo$Li8X"YaI9OѿZф$L^H MG: E2L{):;yoMkS+_$ y gy8gWlL& 5s/6,{ 2'|@p1zk"6^ [[UVVxIe#g~O;8fW )9/V>[^>$$YlBeTD \wĬdewtD3">PN1E 5[Aogdkn%S㜓+:N'-petL!?<1UO 2zA2r<=*-BU3?lDJ Z}݃Mu'BPPdg?x<@. Bwm ] pSq$N}{j-FlDOI֠vo(.OEup-dS.$׶NCj-v!wV~`ɻst9Ev (RG-xGkP΀_{L YdM{ahDb)JVAcoPE QıGm5ruv|pJ}[D:?{utBoZAGi, Z^i(!¾Iga]Y&n3:$ Q\j/ezëlpPw-eL1p `lgLJM2Dt~Ķ 8_~I6v!:va2YWO7鮯t6{⸽%WG8S^Q^7d"!?_Au Y~ "[y[^ie& %sBT疿5BOtnFH_K,SDd' K)^'6A=XR}\t DРe%Br`J s N%씼'\7##׾;B8R 9+o"Hͬv)sVTNNyv#՜ ZA肭,#aKnT3!pA]oֲPiy eR)ԀwҠXǎ/1)﵎n('hVtTEs2*q5 'vL rJ'0oKL5[KPl*˲ kEm S$:tĿw@O{CvPf?8Rt}F.~ 88@76+ 5nP?R=Jdt.!_\W$?qBϱsMݿt`I+}+f!uHMdw12*h3T?HbpiYhҢv0&&zDNBF?:2鲔_` !s&Fbu[A{9CJ*P՛+Xp*7˞gI(Qz s^+)@̼#S;]w*0`:~4AF7ac ;xcxkuqiY 6!}\>j-יn4 '+AjjJi> k~{e K}t=.]nYup7tq59U?C4xTHNي- kuZ#^5g$ي<>|ñ+3}mll, |#5~~vOՖ#Dl7$18kѸak&XVʔ{8P)5ASW*zROTM%cZR|qv屧l" 4^pa8'3TYVBo D3OkóZHᥔrxfl_"u E9-vNGeB{x?5\lJLZLnjT(YWJEglJʫ up J| _2kg= +T!mZq(Ǎ_<T.+-)ߓ?Fw_Z>'۹pu^- fBcƠF~Bπ+]<6+o>Rg5c }8B\T K P#zGo.`80w'D5aR4&`2vVnsgiR5pVOn?NGk|KB#e Li xBWX8WôFl89I^i:ܵ0韬Yj84U_7 $?gZp5BG.fֆ:ptŘq$"T12j!7I<ʮnnIq vV1QKAs6 `_-_7d+\av% ޿9X_K 7u$U%i '<+͡5Ò{\ty>ߦ*nQ6gȑy5. tjKK _k&oz&%uիb!mq͹7~Q^lmf4kw8xu !w7$L 9OK7caQ;bwIhk좠Y4#rE!m$ZY[ vvsU/noaHWҜd R y8#dL^{WpLgZz}vƻMW㥎 bbz)DLaZ$ި}d?jg6_Wבakw 3/kj= A7L;q?X+ Ȝg<`҃c "&X/Ļ NDⷵR.Z7aA4dV~Qs@`dlpTɂ*04 I>F.3 3>l ;9?2\H2Wz"C֙!I+x1kS ai@dLf[B?Ž=#ƄlEq,YDk=z8!Zq,UQ(u%񤈞c gC,oD=/BXsA P pck-$a4I8=c%ڀ!~x5a7U01"mF:[[7ta /Mq= A%!_x[u8֨L9ي1&z)Q CH *N#n^ l.{CL)~Ts:`"t<Kjt4*ܗ~/s(jRrpwi#I \9( kX L"3Ho ,=cVe*ݺƨuv9 ,v~|g1Gkovͬ +[z$nPy[kz_3q33R/uKUq?ĬR{o܎P+h\/e-EjlkkF4os1}o] X` m x>Ky}'+L  G#240S[SME>Oۆ8BȘO>ncJ<&SNFNc>ω Ҝ5忓7X ]a,OʗGg ;P5 7J!;l H<V^ػ~O>p^nnI$ /fzv.c6_/Pޛ8i 8!t!I4RVGp T\S.sUpI~8;GxD^+Z&@¯M@fSjS v: K+J#:b?yJwq}kC* h6l$a\h?XJ1no#ހZ*eGOW@t58p!,Pկj o&0p=P  /)30jMA0o\XE.&TڇR3"u)u쳬Gdݔs͡zYs`{! ,$F.>pŧRf" =$ג[~ >^7URw3)d¦׬1y)av ^ܣsx7.E5AX.qj ||&b82vGiR*G/,x= U'39|. èyLL/ChF[YO$_SGD[!Altr:vo@Q\SKiVz v7WF -*Vq~ZG9KTIW -k. .7嬹YMhzVBX9}z8qAq(GӠ@:^`Sm^\/8pn(8yV38dvnXF55e#:3g[L6H0gb! R6h{Ny++OT"p-d%f:q–5*a회j2hZx~X\AF`s:I?>|Iґph}E 5k`P*4JtUpiW":?FP6NRKVg'3l;.CwN^E|~AL:GAZLH#vÉnCA~*aS$d|Q3Zb|]BJtWA4B zRdL{e3WSBV$K\n&XEsbenX!f.Jv.Lq*5P:X^[fKA'̓XsVirf 1[d;k'7Pc rKQi8uixmBdnZe~] OI{jLa>+Fx~J h:+Q<0] ߞ5"&M4V X̥j WH&DrWzTBN+P H+q.2 V\L|Vk1c_ 2483Po |iQ-Gp2[g7E-y&K ?3w$&'$ݢɑI@16Ov=pV{vrqr@X0cNsc@Dz/U (& 4& ¯a#(%̹z6*lf q!l,>9v!&CdD2pyQRPo }|o eHp 3lwfVpsks1۾ 6+Z"#WXAVrIQ{ttSR,@Ekj/8E({.c]6" hmX {}aTLL> B`.aL"\bEp%)Sw7HE]Qs.-#)>J ʌJzX"MUfw`IŢRpH,[:{*ZvO":NE kPu|#Q\t @ PĽo6豖=4>_0*z)<I"j nJz5)90Jn|g:<,q6xשP@Z WZv^ sV-|dr>In oc e*n@B2taJn6zuz@xLkU`DYr3}g@֣9 Nf1g+_g}F(B-d!t0wpb/IP 9/-^?ii/.ruO`w%`j%am@M R dw52:S.<)x_ G>i3}Mu 0M&MS)]5\hCZV_1qKʭ' 87]G=͊>{=oM1ݾ ΘSd@1`W ŝmgvSTR6 twBc8 |G3Έ1'9\7Ғ qoe(׀XYh峷(1 jN 'G^`^6jQUHaMx&߃10˒q rbw<-tea>Xc1:T .lBC(r`~5jG>>{L,w&uĹ>/+m''G)qT1a5#PPnj)ÀMv{FlB]qkjmJR f9B1-I/0nj{xWCRh^O'F :1eroE^d|q8Z0r @ELAA>y,Zd_D }T r=w,`YO=jFq]'D7,P:?`M~WuC"W}\:xp,(<6_oxt\c&rCUP#cΈx|t atHhVR<= >E}!9Ne_tas=YK3=Fz RaM,o0Hy# r M@aG23X][d<[hD?'Z1`_1<5vU]^$_Jk$ w*:SL7)!H&Iaf P |,<\@wVQq;Q0,zo8k9&#|%g$.`6(2{%=u z2=2}xa^vvSCF@]`H#7: [UpZoZ( L6s I,|PAiV7My3P#2эt@ hL[Yf sM n ac+5P:&6f"M*m}_YDcMaqݰ@! Ud74Tny*Ѥ$LSk9!<}& nو/#p"8{[F(\C]UM*-j$Vibb3E6d v4N2,@4|h I]gUt2O=WN vUyZmgy\_4Z;V ^X\Kl#p^< Rty|_Q".Fm \$EBXnt0I^GIjn]^CaA̸VY3MtC '!}a<}om81N(:SA}@aVPQJm#,XM8)F:]nY>Itna`K)l@+Rm=R:=j b3Y>)!IX@kʼnXFwM=mxj,@D{ԷoCLCX7De,GJ]0Hv!I'\^- UZn7xT?; #MiK.rvt{c!(=~2nZ}6N,fYZ %n2mcQ5FMĩ+eL0[p$=8 h\D! fu疩ǘLx[}u$~4ER#&iX B T 10N pu[О[ J|ˆV^^. Ip4'lMjI5 SG 21{5g#1nKo_[0P,t" Gj_Qp_s񄖃-;SRQYJV$M6c^AU[&TIiJ2onf n"0]p)ycknpKiec>8!ӳ.!yR\ЏQa_Mx|Kr6<0V:¥1~l2 E2f#H+LsUi1< jꌨIjTh/>Hd֟'K t|dF ܧ:% |mMom,cDPmo^mo]n [GCGL3#%%H&0G1/2L| j>^ ?kUH: ^1n*Hk,ܥYv~0X(pfwmqRCRC_z Jm go4nBK ܭbLPQ=CFMx sr+~(RT̨]>&KFawiOӧsWv$0WߎF>% q)A鈤IŨG;![(GANa]e%w4قR;%0⢟[F95:).4ȏU3s#0.q'O#K6:HpG Ak'ȄlXm)"x1xSeh~;H=399<>)=p@{n@5wxJ^mK2D!%\"CDQ[r:67T{Zrgȱ3w*r.陙H?$ul5:[N"Tyv& AB+=uZX+@VQDYBnY||KGAE4 tDGWr3a9%ePcbF I5T3oʌIN.8ΣEP pGb{in%kDV[s;",94?h!]|& hc`f^5 ' W8 K?U=“0)oS XWU:J0giEySPMmCdu)N!V[N/%wr{XAz{RU'Bz`Od'vb6MM_@d Ò6ֹ ~tqy\+/j;΃f`B$DiϦ?AldB3,(,^$Q՟ALwaY\3:INk`u\yf.K!՟%]%bTvg1pB2)C %)5)id]jv"&R2DM HZ}>8X׷ "O'@WoLXnҦDڽJm}i>4m37Q1?xB_,Dmzc5T'gYEd6NiqlR)\UST~2kשSZ uLTX3CxjR_Y}c&Z:Nj!PbV@u@s%mkMgP i)z T*) #]PNj=Ds%ߦ ͓yN@z)5MxX FM?Nmz/ؓ!Y\c Dj\3!`9$yLRC<{L&tCEGs3_a Hd"'%l ~oE5&zW8[A$w+_M19.%L8&vUX7hȉ8귲p[4e-WfLjh݆t6f%Т^c {xV4I}5:>}[rv\5BH"LR̘d25:DhNN`uIYJ{J)]Ĕd9JkeDUh}'ob$/qIy0d*s"$H#|k5P4IKɠ"QvѤs%QBLBn/Av#Mto3/b Q;; #!@B2Zg_ Yj]H?P?$1eqsLVg@d?xSGWٵ20@1x*.fZ/~]tM0R.ԋ@qn2\=p+F5 0uh4\y;c֔>ekk"jijcmpr~eO[=0y`RyH k31%A{(>v{stve?|#2VB#+! W F<(s)_I$[ o^F0J"Z1T߉p3FA!yy=Lz{<}n-`na|5]l5zn b#m9J̻h:E-&dT2ZMֽL\]hgj?yQ Mu N8eNv A:|)Y:f2pMB)y;x#7jGօE&!1ORXee 9'v>q`lXg+]z3DW(c5~XQ.Qk4 /X2Ol˫gdڌ֗1DC>DfIY haO; CeX᳎<51w=HK@9B%&tma܎T]{ZbC*v_C,:S"$)HeW.$jl,Σ23:nV.Xb%R_0((yE 87UMu5=+έw7 %I}+7W`CTgQ^U^It #{ViN_d2,8q:HlyfwV +b,`C v)X] AWudkc2<.>tSd`Z*2 "L۱O;9Lz\{V0x9?]F1BA}SHi$PZN]tJh-B9nfs%F;nXS.<.+ZygV6 =:9:41ip}*01L#RUq {b!R].~St *1rMi `*K!q$<Rpa%kRs9*-/_z3WuJ@gA^ _7gVAbA=4Cr-/1oM#s5`G,#DV_xH Pm6f?YyoSk'SLSA@ĞTn8i>Ol P^<PEQ?@AM=]>b 'P@AX ,p LV7N/O@FO}K3ZCy3F+R4{wy >(5p L{Y.&.6F%t]S HBcipC9HC9B*MWbkfEy9.N* uZ`(U=P\(bK@7#P U*D61KyQv@F :~JRM0&_lސqZ=az<[! pE7I3|3 u"ϔ[TN*w*>isvI-d|CS5aK:0dlt@wpcYVcqU)`RW> SO184d{@c.lV~em:sOqȆ .8& 9~A7jx/ i#Nb\;#Q3m!96bqN3t "6f&s:*!" ,GJ__5[i}CG_c=| :Nw#Nڛ=Yq|(%+qA=<~v,<\2PV4yW- }M+P>77`bc zk T]-&6{u%B15&St 5'DHH=%#+c9Ag+VU%IcdD?`0[t J) =I[, a4 B~8se@MFEv?otrw&2c@|ֵjV(\9yR5NrQ8caa#"C JN - UX\[ R+-DX60{@=M =u$s)->b3 97%F_qgRE7__hF4=7=dO-&;+WITZa2'*[UyzS)y`c{;pPa7-&!1՘@CUT(kU%'۱H\F(r?k)%+`ID