]> WPIA git - cassiopeia.git/blob - src/io/opensslBIO.cpp
add: implement command chunking especially for FULL_CRL-commands
[cassiopeia.git] / src / io / opensslBIO.cpp
1 #include "opensslBIO.h"
2
3 OpensslBIOWrapper::OpensslBIOWrapper( std::shared_ptr<BIO> _b ) : b( _b ), buffer( 2*0xFFFF+20, 0 ), pos(0) {
4 }
5
6 OpensslBIOWrapper::~OpensslBIOWrapper() {
7 }
8
9 int OpensslBIOWrapper::write( const char* buf, int num ) {
10     return BIO_write( b.get(), buf, num );
11 }
12
13 int OpensslBIOWrapper::read( char* buf, int size ) {
14     return BIO_read( b.get(), buf, size );
15 }
16
17 long OpensslBIOWrapper::ctrl( int cmod, long arg1, void* arg2 ) {
18     return BIO_ctrl( b.get(), cmod, arg1, arg2 );
19 }
20
21 int OpensslBIOWrapper::puts( const char* str ) {
22     return BIO_puts( b.get(), str );
23 }
24
25 int OpensslBIOWrapper::gets( char* str, int size ) {
26     return BIO_gets( b.get(), str, size );
27 }
28
29 const char* OpensslBIOWrapper::getName() {
30     return "OpenSSLWrapper";
31 }
32 #include <log/logger.hpp>
33 std::string OpensslBIOWrapper::readLine(){
34     int target = 0;
35     while(1){
36         logger::warn("doing data");
37         while(target < pos){
38             if(buffer[target] == '\n'){
39                 target++;
40                 std::string res(buffer.data(), 0, target);
41                 std::copy(buffer.data() + target, buffer.data() + pos, buffer.data() );
42                 pos -= target;
43                 logger::warn("emit");
44                 return res;
45             }
46             target++;
47         }
48         std::stringstream ss;
49         ss << "target: " << target << ", pos:" << pos;
50         logger::warn(ss.str());
51         int dlen = read(buffer.data() + pos, buffer.size() - pos);
52         if ( dlen <= 0 ){
53             logger::warn(" error! ");
54             throw EOFException();
55         }
56         std::stringstream ss2;
57         ss2 << "done: " << dlen;
58         logger::warn(ss2.str());
59         pos += dlen;
60     }
61 }