]> WPIA git - cassiopeia.git/blobdiff - src/io/slipBio.cpp
fmt: run format script excluding lambdas
[cassiopeia.git] / src / io / slipBio.cpp
index f3db8204c1eef6272e870c3b22827d6967a013bf..8bae55cdd34795590e59b6ecbcc0717ccb38a592 100644 (file)
@@ -1,12 +1,12 @@
 #include "slipBio.h"
 
 #include <unistd.h>
-
+#include <exception>
 #include <iostream>
 
 #include "log/logger.hpp"
 
-static constexpr std::size_t buffer_size = 8192;
+static constexpr std::size_t buffer_size =  2 * 0xFFFF + 20;//8192;
 
 #define SLIP_ESCAPE_CHAR ( (char) 0xDB)
 #define SLIP_CONNECTION ( (char) 0xC0)
@@ -32,7 +32,7 @@ char hexDigit( char c ) {
     return 'x';
 }
 
-std::string toHex( const charbuf, int len ) {
+std::string toHex( const char *buf, int len ) {
     std::string data = "000000";
 
     for( int i = 0; i < len; i++ ) {
@@ -44,7 +44,7 @@ std::string toHex( const char* buf, int len ) {
     return data;
 }
 
-SlipBIO::SlipBIO() : buffer( std::vector<char>( buffer_size ) ), decodeTarget( 0 ), decodePos( 0 ), rawPos( 0 ) {
+SlipBIO::SlipBIO() : buffer( buffer_size ), decodeTarget( 0 ), decodePos( 0 ), rawPos( 0 ) {
 }
 
 void SlipBIO::setTarget( std::shared_ptr<OpensslBIO> target, bool server ) {
@@ -57,10 +57,11 @@ SlipBIO::SlipBIO( std::shared_ptr<OpensslBIO> target ) : target( target ), buffe
 
 SlipBIO::~SlipBIO() {}
 
-int SlipBIO::write( const charbuf, int num ) {
+int SlipBIO::write( const char *buf, int num ) {
 #ifdef SLIP_IO_DEBUG
     logger::notef( "slip-out: %s", toHex( buf, num ) );
 #endif
+
     if( waitForReset ) {
         logger::note( "denying read because of reset-need!" );
         return -1;
@@ -76,7 +77,7 @@ int SlipBIO::write( const char* buf, int num ) {
     }
 
     int totalLen = num + badOnes; // 2
-    char* targetPtr = ( char* ) malloc( totalLen );
+    char *targetPtr = ( char * ) malloc( totalLen );
 
     if( !targetPtr ) {
         return -1;
@@ -111,7 +112,7 @@ int SlipBIO::write( const char* buf, int num ) {
 #endif
 
         if( dlen < 0 ) {
-            throw "Error, target write failed";
+            throw std::runtime_error( "Error, target write failed" );
         } else if( dlen == 0 ) {
             // sleep
             logger::note( "waiting for write ability" );
@@ -128,29 +129,34 @@ int SlipBIO::write( const char* buf, int num ) {
     return num;
 }
 
-int SlipBIO::read( charbuf, int size ) {
+int SlipBIO::read( char *buf, int size ) {
 #ifdef UNMASK_DEBUG
     logger::note( "starting read" );
 #endif
+
     // while we have no data to decode or unmasking does not yield a full package
     while( decodeTarget == 0 ) {
         if( waitForReset ) {
             logger::note( "denying read because of reset-need!" );
             return -1;
         }
-        if(decodePos < rawPos) {
+
+        if( decodePos < rawPos ) {
             int res = unmask();
+
             if( res == 1 ) {
                 continue; // probably Packet :-)
-            } else if(res == -1) {
+            } else if( res == -1 ) {
                 logger::note( "sending reset because of malfomed packet" );
-               return -1;
+                return -1;
             }
         }
-        if( decodeTarget != 0 ){
+
+        if( decodeTarget != 0 ) {
             // we have data now, emit it!
             break;
         }
+
         // we have no data, read more
         if( buffer.size() - rawPos < 64 ) {
             // not enough space... package is too big
@@ -171,19 +177,23 @@ int SlipBIO::read( char* buf, int size ) {
 #endif
         int len = target->read( buffer.data() + rawPos, buffer.size() - rawPos );
 #ifdef RAW_IO_DEBUG
-        logger::note( toHex(buffer.data() + rawPos, len ) );
+        logger::note( toHex( buffer.data() + rawPos, len ) );
 #endif
+
         if( len > 0 ) {
             rawPos += len;
         } else {
-            logger::note("Reporting EOS from slip");
+            logger::note( "Reporting EOS from slip" );
             return -1;
             //decodeTarget = 0;
             //failed = true;
         }
 
     }
-    if( waitForReset ) return -1;
+
+    if( waitForReset ) {
+        return -1;
+    }
 
     int len = std::min( decodeTarget, ( unsigned int ) size );
     // a package finished, return it
@@ -197,8 +207,8 @@ int SlipBIO::read( char* buf, int size ) {
     convert << ", requested were: " << size;
     logger::note( convert.str() );
 #endif
-    
-    if(decodeTarget == 0 && rawPos <= decodePos + 1){
+
+    if( decodeTarget == 0 && rawPos <= decodePos + 1 ) {
         // compact the remaining at most 1 byte of raw data
         buffer[0] = buffer[decodePos];
         rawPos -= decodePos;
@@ -212,37 +222,39 @@ int SlipBIO::read( char* buf, int size ) {
     return len;
 }
 
-long SlipBIO::ctrl( int cmod, long arg1, voidarg2 ) {
+long SlipBIO::ctrl( int cmod, long arg1, void *arg2 ) {
     ( void ) cmod;
     ( void ) arg1;
     ( void ) arg2;
 
     if( cmod == BIO_CTRL_RESET ) {
         decodeTarget = 0;
+
         if( server ) {
             waitForReset = false;
             waitForConnection = true;
             resetCounter = -1;
         } else {
             static char ctr = 8;
-            char resetSequence[] = {SLIP_CONNECTION, 1,2,3,4,5,6,7, ctr};
+            char resetSequence[] = {SLIP_CONNECTION, 1, 2, 3, 4, 5, 6, 7, ctr};
             target->write( resetSequence, 9 );
             header = {1, 2, 3, 4, 5, 6, 7, ctr};
             resetCounter = -1;
             waitForConnection = true;
             logger::note( "Resetting SLIP layer" );
         }
+
         return 0;
-    }else if(cmod == BIO_CTRL_FLUSH ){
+    } else if( cmod == BIO_CTRL_FLUSH ) {
 #ifdef UNMASK_DEBUG
-        logger::note( "flush requested ");
+        logger::note( "flush requested " );
 #endif
     }
 
     return target->ctrl( cmod, arg1, arg2 );
 }
 
-const charSlipBIO::getName() {
+const char *SlipBIO::getName() {
     return "SlipBIO";
 }
 
@@ -257,82 +269,94 @@ int SlipBIO::unmask() {
     }
     logger::note( "unmasking" );
 #endif
-    if( waitForConnection ){
+
+    if( waitForConnection ) {
 #ifdef UNMASK_DEBUG
         logger::note( "scanning for connection" );
 #endif
         decodeTarget = 0;
+
         if( server ) {
 #ifdef UNMASK_DEBUG
-            logger::note( "on server site, waiting for CONNECTION-byte");
+            logger::note( "on server site, waiting for CONNECTION-byte" );
 #endif
-            while(decodePos < rawPos) {
-                if(buffer[decodePos] == SLIP_CONNECTION) {
+
+            while( decodePos < rawPos ) {
+                if( buffer[decodePos] == SLIP_CONNECTION ) {
                     resetCounter = 0;
 #ifdef UNMASK_DEBUG
                     logger::note( "got connection byte" );
 #endif
-                } else if(resetCounter >= 0) {
+                } else if( resetCounter >= 0 ) {
                     header[resetCounter] = buffer[decodePos];
                     resetCounter++;
                 }
+
                 decodePos++;
-                if( resetCounter >= ((int) header.size()) ){
+
+                if( resetCounter >= ( ( int ) header.size() ) ) {
                     waitForConnection = false;
                     char data[] = { SLIP_CONNECTION };
-                    target->write( data, 1);
+                    target->write( data, 1 );
 #ifdef UNMASK_DEBUG
-                    logger::notef( "SLIP, initing connection with ping-seq %s:", toHex(header.data(), header.size()) );
+                    logger::notef( "SLIP, initing connection with ping-seq %s:", toHex( header.data(), header.size() ) );
 #endif
                     target->write( header.data(), header.size() );
                     break;
                 }
             }
-            if( decodePos >= rawPos ){
+
+            if( decodePos >= rawPos ) {
                 decodePos = 0;
                 rawPos = 0;
                 return 0; // no package
             }
-            
+
         } else {
-            while(decodePos < rawPos) {
-                if(buffer[decodePos] == SLIP_CONNECTION) {
+            while( decodePos < rawPos ) {
+                if( buffer[decodePos] == SLIP_CONNECTION ) {
 #ifdef UNMASK_DEBUG
                     logger::note( "got connbyte" );
 #endif
                     resetCounter = 0;
-                } else if(resetCounter >= 0) {
+                } else if( resetCounter >= 0 ) {
 #ifdef UNMASK_DEBUG
                     logger::note( "got head-byte" );
 #endif
-                    if(buffer[decodePos] == header[resetCounter]) {
+
+                    if( buffer[decodePos] == header[resetCounter] ) {
                         resetCounter++;
                     } else {
                         resetCounter = -1;
                     }
                 }
+
                 decodePos++;
-                if( resetCounter >= ((int) header.size()) ){
+
+                if( resetCounter >= ( ( int ) header.size() ) ) {
                     waitForConnection = false;
 #ifdef UNMASK_DEBUG
-                    logger::note("connection found! :-)!");
+                    logger::note( "connection found! :-)!" );
 #endif
                     break;
                 }
             }
-            if( decodePos >= rawPos ){
+
+            if( decodePos >= rawPos ) {
                 rawPos = 0;
                 decodePos = 0;
                 return 0; // no package
             }
         }
     }
+
     unsigned int j = decodeTarget;
 
     for( unsigned int i = decodePos; i < rawPos; i++ ) {
-        if(waitForConnection && buffer[i] != SLIP_CONNECTION ) {
+        if( waitForConnection && buffer[i] != SLIP_CONNECTION ) {
             continue;
         }
+
         if( buffer[i] == SLIP_ESCAPE_CHAR ) {
             i++;
 
@@ -374,6 +398,7 @@ int SlipBIO::unmask() {
                 logger::note( "error connection failed" );
                 return -1;
             }
+
             logger::note( "got package border; slip re-validated SHOULD NEVER HAPPEN!!" );
             decodeTarget = 0;
             waitForConnection = false;