/* * lftp - file transfer program * * Copyright (c) 1996-2016 by Alexander V. Lukyanov (lav@yars.free.net) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "buffer_ssl.h" #if USE_SSL # include "lftp_ssl.h" // IOBufferSSL implementation #undef super #define super IOBuffer int IOBufferSSL::Do() { int m=STALL; if(Done() || Error()) return m; if(mode==PUT && Size()==0) { // nothing to write, but may need to do handshake if(!ssl->handshake_done) { if(Put_LL("",0)<0) return MOVED; if(ssl->handshake_done && eof) ssl->shutdown(); } if(ssl->handshake_done && !eof) return m; } else { // cannot use want_mask before trying to read/write, since ssl can be shared if(!ssl->handshake_done || eof || Ready(ssl->fd,dir_mask())) m|=super::Do(); } Block(ssl->fd,block_mask()); return m; } int IOBufferSSL::Get_LL(int size) { int total=0; int max_read=0; char *space=GetSpace(size); while(totalread(space+total,size-total); if(res<0) { if(res==ssl->RETRY) { SetNotReady(ssl->fd,want_mask()); break; } else { // error SetError(ssl->error,ssl->fatal); break; } } if(res==0) { eof=true; break; } total+=res; if(max_readwrite(buf,size); if(res<0) { if(res==ssl->RETRY) { SetNotReady(ssl->fd,want_mask()); return 0; } else { // error SetError(ssl->error,ssl->fatal); return -1; } } return res; } int IOBufferSSL::PutEOF_LL() { if(Size()==0) ssl->shutdown(); return 0; } IOBufferSSL::~IOBufferSSL() { } #endif // USE_SSL