示例#1
0
int
XmodemRTimeout() {
	if( ++errorCount > MAXERROR )
		return state == Init ? XmErrInitTo : XmErrRcvTo ;

	switch( state ) {
	case Start:
		return -1 ;		/* shouldn't happen */
	case Init:
		if( ++errorCount2 >= 3 )
			switch( protocol ) {
			case WXmodem:
				protocol = XmodemCrc ;
				errorCount2 = 0 ;
				break ;
			case XmodemCrc:
				protocol = Xmodem ;
				pktHdrLen = 3 ;
				break ;
			}
		return XmodemRStart() ;

	case Wait:			/* timeout while waiting */
	case Packet:			/* timeout in mid packet */
		return rejectPacket() ;
	}
}
示例#2
0
int
XmodemRRcv(char c) {
	errorCount = 0 ;

	switch( state ) {
	case Start:		/* shouldn't happen, ignore */
		if( c == CAN )
			return XmErrCancel ;
		break ;

	case Init:		/* waiting */
	case Wait:
		switch( c ) {
		case SOH:
		case STX:
			pktLen = c == STX ? 1024 : 128 ;
			inCount = 0 ;
			optr = packet ;
			state = Packet ;
			xmTimeout = PKTTO ;
			break ;

		case EOT:
			if( ++eotCount > 1 ) {
				sendFlush(ACK) ;
				if( ymodem )
					return XmodemRInit() ;	/* restart protocol */
				else
					return XmDone ;
			} else
				return rejectPacket() ;	/* make xmitter try again */

		case CAN:
			return XmErrCancel ;

		default:		/* ignore all others */
			if( ++ignoreCount > 1030 ) {
				ignoreCount = 0 ;
				return sendFlush(NAK) ;
			}
			break ;
		}
		break ;


	case Packet:		/* mid packet */
		*optr++ = c ;
		if( ++inCount >= pktLen + pktHdrLen )
			ProcessPacket() ;
		break ;
	}
	return 0 ;
}
示例#3
0
			virtual void visit(const hexabus::WritePacket<uint8_t>& write) { rejectPacket(); }
示例#4
0
			/** 
			 * not needed.
			 */
			virtual void visit(const hexabus::WritePacket<bool>& write) { rejectPacket(); }
示例#5
0
			virtual void visit(const hexabus::InfoPacket<boost::array<char, 65> >& info) { rejectPacket(); }
示例#6
0
			virtual void visit(const hexabus::InfoPacket<std::string>& info) { rejectPacket(); }
示例#7
0
			virtual void visit(const hexabus::InfoPacket<boost::posix_time::time_duration>& info) { rejectPacket(); }
示例#8
0
			virtual void visit(const hexabus::EndpointInfoPacket& endpointInfo) { rejectPacket(); }
示例#9
0
			virtual void visit(const hexabus::EndpointQueryPacket& endpointQuery) { rejectPacket(); }
示例#10
0
			virtual void visit(const hexabus::QueryPacket& query) { rejectPacket(); }
示例#11
0
			/**
			 * Ignored
			 */
			virtual void visit(const hexabus::ErrorPacket& error) { rejectPacket(); }
示例#12
0
			virtual void visit(const hexabus::WritePacket<boost::array<char, 65> >& write) { rejectPacket(); }
示例#13
0
			virtual void visit(const hexabus::WritePacket<std::string>& write) { rejectPacket(); }
示例#14
0
			virtual void visit(const hexabus::WritePacket<boost::posix_time::time_duration>& write) { rejectPacket(); }
示例#15
0
static	int
ProcessPacket() {
	int	id = (u_char)packet[0] ;
	int	idc = (u_char)packet[1] ;
	int	i ;

	if( idc != 255-id )
		return rejectPacket() ;

	if( id == packetId )		/* duplicate */
		return acceptPacket() ;

	if( id != (packetId+1)%256 ) {	/* out of sequence */
		(void) sendCancel() ;
		return XmErrSequence ;
	}

	if( protocol == Xmodem ) {
		/* compute checksum */
		int csum = calcChecksum(packet+2, pktLen) ;
		if( csum != (u_char) packet[2+pktLen] )
			return rejectPacket() ;
	} else {
		int crc0 = (u_char)packet[pktLen+2] << 8 | (u_char)packet[pktLen+3] ;
		int crc1 = calcrc(packet+2, pktLen) ;
		if( crc0 != crc1 )
			return rejectPacket() ;
	}

	/* it's a good packet */
	packetId = (packetId+1)%256 ;


	/* is this the first packet? */

	if( packetCount == 0 ) {
		if( ymodem ) {
			if( packet[2] == '\0' ) {	/* last file */
				(void) acceptPacket() ;
				return XmDone ;
			}

			if( packet[2] == '/' )
				strcpy(xmFilename, packet+2) ;
			else {
				strcpy(xmFilename, xmDefPath) ;
				strcat(xmFilename, packet+2) ;
			}

			fileLen = fileDate = fileMode = -1 ;
			sscanf(packet+2+strlen(packet)+1, "%d %o %o",
			       &fileLen, &fileDate, &fileMode) ;
		}

		if( (ofile = fopen(xmFilename, "w")) == NULL ) {
			sendCancel() ;
			return XmErrCantOpen ;
		}

		if( ymodem ) {
			packetCount = 1 ;
			(void) acceptPacket() ;
			return sendFlush('C') ;
		} else
			state = Packet ;
	}

	++packetCount ;

	/* TODO: ymodem: if this is last packet, truncate it */
	if( (i=fwrite(packet+2, 1, pktLen, ofile)) != pktLen ) {
		sendCancel() ;
		return XmErrSys ;
	} else
		return acceptPacket() ;
}