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