Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

253 lines
4.8 KiB

/* File: C:\WACKER\xfer\krm_res.c (Created: 28-Jan-1994)
* created from HAWIN source file
* krm_res.c -- Routines for handling file transmission using KERMIT
* file transfer protocol.
*
* Copyright 1989,1991,1994 by Hilgraeve Inc. -- Monroe, MI
* All rights reserved
*
* $Revision: 2 $
* $Date: 2/05/99 3:22p $
*/
#include <windows.h>
#pragma hdrstop
#include <time.h>
#include <term\res.h>
#include <sys\types.h>
#include <sys\utime.h>
#include <tdll\stdtyp.h>
#include <tdll\mc.h>
#include <tdll\load_res.h>
#include <tdll\xfer_msc.h>
#include <tdll\globals.h>
#include <tdll\file_io.h>
#if !defined(BYTE)
#define BYTE unsigned char
#endif
#include "cmprs.h"
#include "xfr_dsp.h"
#include "xfr_todo.h"
#include "xfr_srvc.h"
#include "xfer.h"
#include "xfer.hh"
#include "xfer_tsc.h"
#include "krm.h"
#include "krm.hh"
// Resident routines for kermit receiving
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* kunload_packet
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
int kunload_packet(ST_KRM *kc, int len, unsigned char *bufr)
{
int sethbit = FALSE;
unsigned char c;
unsigned char *bp;
unsigned char c7;
unsigned char *limit;
int reptcount;
int i;
xfer_idle(kc->hSession, XFER_IDLE_IO);
bp = bufr;
limit = bufr + len;
while (bp < limit)
{
c = *bp++;
if (kc->its_rept && c == kc->its_rept)
{
reptcount = unchar(*bp++);
c = *bp++;
}
else
reptcount = 1;
if (kc->its_qbin && c == kc->its_qbin)
{
sethbit = TRUE;
c = *bp++;
}
if (c == kc->its_qctl)
{
c = *bp++;
c7 = (unsigned char)(c & 0x7F);
if (c7 != kc->its_qctl && c7 != kc->its_qbin && c7 != kc->its_rept)
c = (unsigned char)ctl(c);
}
if (sethbit)
{
c |= 0x80;
sethbit = FALSE;
}
for (i = reptcount + 1; --i > 0; )
if ((*kc->p_kputc)(kc, c) == ERROR)
return(ERROR);
} /* while (bp < limit) */
/* pointer should stop right at limit, if not, somethings wrong */
if (bp > limit)
return(ERROR);
else
return(0);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* kr_putc
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
int kr_putc(ST_KRM *kc, int c)
{
++kc->kbytes_received;
return ((int)(fio_putc(c, kc->fhdl)));
}
// Resident routines for kermit sending
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* kload_packet
*
* DESCRIPTION:
*
* ARGUMENTS:
*
* RETURNS:
*
*/
int kload_packet(ST_KRM *kc, unsigned char *bufr)
{
char *bp = bufr;
char *rp = bufr;
char *limit;
int rptcount = 1;
int c, c7;
int lastc = -1;
int no8thbit = 0 /* (cnfg.bits_per_char != 8) */;
xfer_idle(kc->hSession, XFER_IDLE_IO);
limit = bufr + (kc->its_maxl - kc->its_chkt - 6);
while (bp < limit)
{
if ((c = (*kc->p_kgetc)(kc)) == EOF)
break;
if (kc->its_rept) /* check for repeat characters */
{
if (c != lastc)
{
rptcount = 1; /* start new check for repeat chars */
rp = bp;
lastc = c;
}
else if (++rptcount == 4)
{
bp = rp; /* back up in buffer to where repeat started */
while ((c = (*kc->p_kgetc)(kc)) == lastc && ++rptcount < 94)
;
if (c != lastc)
{
if (c != EOF) /* note: putting the extra char. */
{ /* directly back into the send */
fio_ungetc(c, kc->fhdl);/* file buffer will not work */
--kc->kbytes_sent; /* if p_kgetc is not pointing */
} /* directly to ks_getc(). */
c = lastc;
}
lastc = -1;
*bp++ = kc->its_rept;
*bp++ = (char)tochar(rptcount);
}
}
/* check for binary (8th bit) quoting */
if (c & 0x80)
{
if (kc->its_qbin) /* do 8th-bit quoting */
{
*bp++ = kc->its_qbin;
c &= 0x7F;
}
else if (no8thbit)
{
/* error! */
// strcpy(kc->xtra_err, strld(TM_NOT_CNFGD));
/* TODO: figure this error out */
return(ERROR);
}
}
/* check for characters needing control-quoting */
c7 = (c & 0x7F);
if (c7 < ' ' || c7 == DEL)
{
*bp++ = kc->its_qctl;
c = ctl(c);
}
else if (c7 == (int)kc->its_qctl ||
c7 == (int)kc->its_qbin ||
c7 == (int)kc->its_rept)
*bp++ = kc->its_qctl;
*bp++ = (char)c;
}
if (fio_ferror(kc->fhdl))
return(ERROR);
return (int)(bp - bufr);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* ks_getc
*
* DESCRIPTION:
*
* ARGUMENTS:
*
* RETURNS:
*
*/
#if 1
int ks_getc(ST_KRM *kc)
{
++kc->kbytes_sent;
return(fio_getc(kc->fhdl));
}
#else
int ks_getc(ST_KRM *kc)
{
int c;
++kc->kbytes_sent;
c = fio_getc(kc->fhdl);
DbgOutStr("%c", c, 0,0,0,0);
return c;
}
#endif