summaryrefslogblamecommitdiff
path: root/ek17.diff
blob: 6853edfde7ff28ec4b4c6cd5de39299c4c343488 (plain) (tree)







































































































































































































































                                                                                  
*** ../../ek16/kermit.c	2011-03-30 12:40:09.705176000 -0400
--- kermit.c	2011-06-06 16:24:13.034202000 -0400
***************
*** 1,8 ****
  #define KERMIT_C
  /*
    Embedded Kermit protocol module
!   Version: 1.6
!   Most Recent Update: Wed Mar 30 12:39:11 2011
  
    No stdio or other runtime library calls, no system calls, no system 
    includes, no static data, and no global variables in this module.
--- 1,8 ----
  #define KERMIT_C
  /*
    Embedded Kermit protocol module
!   Version: 1.7
!   Most Recent Update: Mon Jun  6 15:36:26 2011
  
    No stdio or other runtime library calls, no system calls, no system 
    includes, no static data, and no global variables in this module.
***************
*** 98,104 ****
  
      int i, j, rc;			/* Workers */
      int datalen;                        /* Length of packet data field */
-     int bctu;				/* Block check type for this packet */
      UCHAR *p;                           /* Pointer to packet data field */
      UCHAR *q;                           /* Pointer to data to be checked */
      UCHAR *s;				/* Worker string pointer */
--- 98,103 ----
***************
*** 313,319 ****
          }
  	debug(DB_MSG,"HDR CHKSUM OK",0,0);
          p[2] = c;                       /* Put checksum back */
!         datalen = xunchar(p[0])*95 + xunchar(p[1]) - k->bct; /* Data length */
          p += 3;                         /* Fix data pointer */
          k->ipktinfo[r_slot].dat = p;	/* Permanent record of data pointer */
      } else {                            /* Regular packet */
--- 312,319 ----
          }
  	debug(DB_MSG,"HDR CHKSUM OK",0,0);
          p[2] = c;                       /* Put checksum back */
! 	/* Data length */
!         datalen = xunchar(p[0])*95 + xunchar(p[1]) - ((k->bctf) ? 3 : k->bct);
          p += 3;                         /* Fix data pointer */
          k->ipktinfo[r_slot].dat = p;	/* Permanent record of data pointer */
      } else {                            /* Regular packet */
***************
*** 323,334 ****
--- 323,342 ----
      }
  #endif /* F_LP */
  #ifdef F_CRC
+     if (k->bctf) {			/* FORCE 3 */
+ 	chklen = 3;
+     } else {
  	if (t == 'S' || k->state == S_INIT) { /* S-packet was retransmitted? */
+ 	    if (q[10] == '5') {		/* Block check type requested is 5 */
+ 		k->bctf = 1;		/* FORCE 3 */
+ 		chklen = 3;
+ 	    }
  	    chklen = 1;			/* Block check is always type 1 */
  	    datalen = k->ipktinfo[r_slot].len - 3; /* Data length */
  	} else {
  	    chklen = k->bct;
  	}
+     }
  #else
      chklen = 1;				/* Block check is always type 1 */
      datalen = k->ipktinfo[r_slot].len - 3; /* Data length */
***************
*** 1031,1036 ****
--- 1039,1045 ----
          if ((k->bct < 1) || (k->bct > 3))
  #endif /* F_CRC */
  	  k->bct = 1;
+ 	if (k->bctf) k->bct = 3;
      }
      if (datalen >= 9) {                 /* Repeat counts */
          if ((s[9] > 32 && s[9] < 63) || (s[9] > 95 && s[9] < 127)) {
***************
*** 1120,1126 ****
        d[ 6] = k->ebq = '&';           /* I need to request it */
      else                                /* else just agree with other Kermit */
        d[ 6] = k->ebq;
!     d[ 7] = k->bct + '0';               /* Block check type */
      d[ 8] = k->rptq;			/* Repeat prefix */
      d[ 9] = tochar(k->capas);           /* Capability bits */
      d[10] = tochar(k->window);          /* Window size */
--- 1129,1138 ----
        d[ 6] = k->ebq = '&';           /* I need to request it */
      else                                /* else just agree with other Kermit */
        d[ 6] = k->ebq;
!     if (k->bctf)			/* Block check type */
!       d[7] = '5';			/* FORCE 3 */
!     else
!       d[7] = k->bct + '0';		/* Normal */
      d[ 8] = k->rptq;			/* Repeat prefix */
      d[ 9] = tochar(k->capas);           /* Capability bits */
      d[10] = tochar(k->window);          /* Window size */
***************
*** 1136,1143 ****
--- 1148,1157 ----
  #endif /* F_LP */
  
  #ifdef F_CRC
+     if (!(k->bctf)) {			/* Unless FORCE 3 */
  	b = k->bct;
  	k->bct = 1;			/* Always use block check type 1 */
+     }
  #endif /* F_CRC */
      switch (type) {
        case 'Y':				/* This is an ACK for packet 0 */
***************
*** 1150,1156 ****
--- 1164,1172 ----
  	rc = -1;
      }
  #ifdef F_CRC
+     if (!(k->bctf)) {			/* Unless FORCE 3 */
  	k->bct = b;
+     }
  #endif /* F_CRC */
      return(rc);                         /* Pass along return code. */
  }
***************
*** 1510,1516 ****
--- 1526,1534 ----
  
  STATIC void
  epkt(char * msg, struct k_data * k) {
+     if (!(k->bctf)) {			/* Unless FORCE 3 */
  	k->bct = 1;
+     }
      (void) spkt('E', 0, -1, (UCHAR *) msg, k);
  }
  
*** ../../ek16/kermit.h	2011-03-30 13:13:04.814335000 -0400
--- kermit.h	2011-06-06 15:36:54.700435000 -0400
***************
*** 1,7 ****
  #ifndef __KERMIT_H__
  #define __KERMIT_H__
  
! #define VERSION "1.6"			/* Kermit module version number */
  
  /*
    kermit.h -- Symbol and struct definitions for embedded Kermit.
--- 1,7 ----
  #ifndef __KERMIT_H__
  #define __KERMIT_H__
  
! #define VERSION "1.7"			/* Kermit module version number */
  
  /*
    kermit.h -- Symbol and struct definitions for embedded Kermit.
***************
*** 388,393 ****
--- 388,394 ----
      int zincnt;				/* Input buffer position */
      int zinlen;				/* Length of input file buffer */
      UCHAR * zinptr;			/* Pointer to input file buffer */
+     int bctf;				/* Flag to force type 3 block check */
      int dummy;
  };
  
*** ../../ek16/main.c	2011-03-30 12:40:53.830806000 -0400
--- main.c	2011-06-06 15:33:45.997789000 -0400
***************
*** 124,130 ****
  #endif /* RECVONLY */
      fprintf(stderr," -p [neoms]   Parity: none, even, odd, mark, space\n");
  #ifdef F_CRC
!     fprintf(stderr," -b [123]     Block check type: 1, 2, or 3\n");
  #endif /* F_CRC */
      fprintf(stderr," -k           Keep incompletely received files\n");
      fprintf(stderr," -B           Force binary mode\n");
--- 124,130 ----
  #endif /* RECVONLY */
      fprintf(stderr," -p [neoms]   Parity: none, even, odd, mark, space\n");
  #ifdef F_CRC
!     fprintf(stderr," -b [1235]    Block check type: 1, 2, 3, or 5\n");
  #endif /* F_CRC */
      fprintf(stderr," -k           Keep incompletely received files\n");
      fprintf(stderr," -B           Force binary mode\n");
***************
*** 219,225 ****
  	    }
  	    if (c == 'b') {
  		check = atoi(*xargv);
! 		if (check < 1 || check > 3)
  		  fatal("Invalid block check",(char *)0,(char *)0);
  #ifdef DEBUG
  	    } else if (c == 'E') {
--- 219,225 ----
  	    }
  	    if (c == 'b') {
  		check = atoi(*xargv);
! 		if (check < 1 || check > 5 || check == 4)
  		  fatal("Invalid block check",(char *)0,(char *)0);
  #ifdef DEBUG
  	    } else if (c == 'E') {
***************
*** 338,344 ****
      k.remote = remote;			/* Remote vs local */
      k.binary = ftype;			/* 0 = text, 1 = binary */
      k.parity = parity;                  /* Communications parity */
!     k.bct = check;			/* Block check type */
      k.ikeep = keep;			/* Keep incompletely received files */
      k.filelist = cmlist;		/* List of files to send (if any) */
      k.cancel = 0;			/* Not canceled yet */
--- 338,344 ----
      k.remote = remote;			/* Remote vs local */
      k.binary = ftype;			/* 0 = text, 1 = binary */
      k.parity = parity;                  /* Communications parity */
!     k.bct = (check == 5) ? 3 : check;	/* Block check type */
      k.ikeep = keep;			/* Keep incompletely received files */
      k.filelist = cmlist;		/* List of files to send (if any) */
      k.cancel = 0;			/* Not canceled yet */
***************
*** 367,372 ****
--- 367,374 ----
  #else
      k.dbf    = 0;
  #endif /* DEBUG */
+     /* Force Type 3 Block Check (16-bit CRC) on all packets, or not */
+     k.bctf   = (check == 5) ? 1 : 0;
  
  /* Initialize Kermit protocol */