📄 dcpfpkt.c
字号:
{
printmsg(0,"fgetpkt: Did not expect character ^%c (x%02x)",
(char) (*(ip-1) + 'A') , (short) *(ip-1));
goto dcorr;
}
len = 0;
while (len < 5) {
i = sread(&buf[len], 5 - len, M_fPacketTimeout);
if (i == 0) {
printmsg(0,
"fgetpkt: Timeout reading %d chars after %d seconds",
5 - len, M_fPacketTimeout);
goto dcorr;
}
len += i;
}
printmsg(6, "fgetpkt: buf=|%.*s|", len , packet);
if (buf[4] != '\r')
{
printmsg(0,
"fgetpkt: error: Expected carriage return, "
"not %s%c (x%02x)",
(buf[4] < ' ') ? "^" : "" ,
(char) (buf[4] + ((buf[4] < ' ') ? 'A' : 0)),
(short) buf[4]);
goto dcorr;
}
sscanf(buf, "%4x", &chksum);
*bytes = op - packet;
if (chksum == sum) {
eof = TRUE;
printmsg(6, "fgetpkt: data=|%.*s|", *bytes , packet);
return DCP_OK;
} else {
printmsg(0, "fgetpkt: Checksum mismatch, told %04x, calc %04x",
chksum, sum);
fsendresp(DCP_RETRY);
return DCP_RETRY;
}
}
special = *ip++;
} else {
if (*ip < '\040') {
printmsg(0,"fgetpkt: error: got control character ^%c (%x)",
(char) (*ip + 'A') , (short) *ip);
goto dcorr;
}
switch (special) {
case 0:
c = (char) (*ip++);
break;
case '\172':
c = (char) (*ip++ - 0100);
break;
case '\173':
c = (char) (*ip++ + 0100);
break;
case '\174':
c = (char) (*ip++ + 0100);
break;
case '\175':
c = (char) (*ip++ + 0200);
break;
case '\176':
c = (char) (*ip++ + 0300);
break;
default:
printmsg(0,"fgetpkt: Invalid special chracter 0x%2x",
(short) special );
panic();
c = '\0';
}
*op++ = c;
left --;
if (sum & 0x8000) {
sum <<= 1;
sum++;
} else
sum <<= 1;
sum += c & 0377;
sum &= 0xffff;
special = 0;
}
} while (left > 0);
/*--------------------------------------------------------------------*/
/* The packet is full of data, return to caller */
/*--------------------------------------------------------------------*/
*bytes = s_pktsize;
printmsg(6, "fgetpkt: data=|%.*s|", *bytes , packet);
chksum = sum;
return DCP_OK;
/*--------------------------------------------------------------------*/
/* The data is corrupt; flush the incoming file */
/*--------------------------------------------------------------------*/
dcorr:
printmsg (0, "Data corrupted, skipping to EOF");
len = 1;
while (len)
len = sread(packet, 1, M_fPacketTimeout);
fsendresp(DCP_RETRY);
return DCP_RETRY;
} /* fgetpkt */
/*--------------------------------------------------------------------*/
/* f s e n d p k t */
/* */
/* Send an "f" protocol packet to the other system */
/*--------------------------------------------------------------------*/
short fsendpkt(char *ip, short len)
{
char *op;
short sum, nl;
short ret;
char obuf[MAXPACK * 2];
op = obuf;
nl = 0;
sum = chksum;
if (len == 0)
{
printmsg(0,"fsendpkt: Internal error: zero length for packet");
return DCP_FAILED;
}
do {
if (sum & 0x8000) {
sum <<= 1;
sum++;
} else
sum <<= 1;
sum += *ip & 0377;
sum &= 0xffff;
if (*ip & 0200) {
*ip &= 0177;
if (*ip < 040) {
*op++ = '\174';
*op++ = (char) (*ip++ + 0100);
} else
if (*ip <= 0171) {
*op++ = '\175';
*op++ = *ip++;
}
else {
*op++ = '\176';
*op++ = (char) (*ip++ - 0100);
}
nl += 2;
} else {
if (*ip < 040) {
*op++ = '\172';
*op++ = (char) (*ip++ + 0100);
nl += 2;
} else
if (*ip <= 0171) {
*op++ = *ip++;
nl++;
} else {
*op++ = '\173';
*op++ = (char) (*ip++ - 0100);
nl += 2;
}
}
} while (--len > 0);
chksum = sum;
ret = swrite(obuf, nl);
if ( ret == nl )
return DCP_OK;
else
return DCP_FAILED;
} /* fsendpkt */
/*--------------------------------------------------------------------*/
/* f f i l e p k t */
/* */
/* Prepare for processing an "f" procotol file transfer */
/*--------------------------------------------------------------------*/
short ffilepkt( void)
{
chksum = 0xffff;
printmsg(3,"ffilepkt: Checksum reset");
return DCP_OK;
} /* ffilepkt */
/*--------------------------------------------------------------------*/
/* f e o f */
/* */
/* Transmit "f" protocol end of file to the other system */
/*--------------------------------------------------------------------*/
short feofpkt( void )
{
char ibuf[MAXMSGLEN];
/*--------------------------------------------------------------------*/
/* Transmit EOF with an attached checksum */
/*--------------------------------------------------------------------*/
printmsg(2,"feofpkt: sending EOF");
sprintf(ibuf, "\176\176%04x", chksum);
printmsg(2,"--> %s", ibuf);
fwrmsg(ibuf);
/*--------------------------------------------------------------------*/
/* Now get the response and report it */
/*--------------------------------------------------------------------*/
if (frdmsg(ibuf) == DCP_FAILED)
return DCP_FAILED;
printmsg(2,"<-- %s",ibuf);
/*--------------------------------------------------------------------*/
/* Determine our next step from the result */
/*--------------------------------------------------------------------*/
switch(*ibuf)
{
case 'R':
return DCP_RETRY;
case 'G':
return DCP_OK;
default:
return DCP_FAILED;
} /* switch */
} /* feofpkt */
/*--------------------------------------------------------------------*/
/* f s e n d r e s p */
/* */
/* Send result to a file transfer to other host */
/*--------------------------------------------------------------------*/
static short fsendresp(short state)
{
char *s;
switch (state)
{
case DCP_OK:
s = "G";
break;
case DCP_RETRY:
s = "R";
break;
default:
s = "Q";
break;
}
printmsg(2,"--> %s", s);
return fwrmsg(s);
} /* fsendresp */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -