#include "slipBio.h"
+#include <unistd.h>
+
#include <iostream>
+#define BUFFER_SIZE 8192
+
char hexDigit( char c ) {
if( c < 0 ) {
return 'x';
}
std::string toHex( const char* buf, int len ) {
- char* c = ( char* ) malloc( len * 2 );
-
- if( !c ) {
- return "<malloc fail>";
- }
-
- std::shared_ptr<char> mem = std::shared_ptr<char>( c, free );
+ std::string data = "000000";
for( int i = 0; i < len; i++ ) {
- c[i * 2] = hexDigit( ( buf[i] >> 4 ) & 0xF );
- c[i * 2 + 1] = hexDigit( buf[i] & 0xF );
+ data.append( 1, ' ' );
+ data.append( 1, hexDigit( ( buf[i] >> 4 ) & 0xF ) );
+ data.append( 1, hexDigit( buf[i] & 0xF ) );
}
- return std::string( mem.get(), len * 2 );
+ return data;
}
SlipBIO::SlipBIO() {
- this->buffer = std::vector<char>( 4096 );
+ this->buffer = std::vector<char>( BUFFER_SIZE );
this->decodeTarget = 0;
this->decodePos = 0;
this->rawPos = 0;
+ this->failed = false;
}
void SlipBIO::setTarget( std::shared_ptr<OpensslBIO> target ) {
SlipBIO::SlipBIO( std::shared_ptr<OpensslBIO> target ) {
this->target = target;
- this->buffer = std::vector<char>( 4096 );
+
+ this->buffer = std::vector<char>( BUFFER_SIZE );
this->decodeTarget = 0;
this->decodePos = 0;
this->rawPos = 0;
SlipBIO::~SlipBIO() {}
int SlipBIO::write( const char* buf, int num ) {
+ std::cout << "Out: " << toHex( buf, num ) << std::endl;
int badOnes = 0;
for( int i = 0; i < num; i++ ) {
}
targetPtr[j++] = ( char )0xC0;
+ int sent = 0;
+
+ while( sent < j ) {
+
+ errno = 0;
+ int dlen = target->write( targetPtr + sent, std::min( 1024, j - sent ) );
+
+ if( dlen < 0 ) {
+ throw "Error, target write failed";
+ } else if( dlen == 0 ) {
+ // sleep
+ usleep( 50000 );
+ }
+
+ if( errno != 0 ) {
+ perror( "Error" );
+ }
- if( target->write( targetPtr, j ) != j ) {
- std::cout << "sent " << j << std::endl;
- throw "Error, target write failed";
+ sent += dlen;
}
return num;
( void ) cmod;
( void ) arg1;
( void ) arg2;
+ std::cout << "SLIP crtl: " << cmod << std::endl;
return target->ctrl( cmod, arg1, arg2 );
}