LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

поскольку кусок что я выложил не вполне понятен без контекста кидаю всю функцию. она правда использует некие функции их своей либы, но должно быть вроде все понятно.

это чтение в буфер блока размером fsize с таймаутом ftmo. возвращает число считанных байт, 0 - если вышло по таймауту, или -1 если ошибка


int CryptoConnection::readBlock(void *fbuff, int fsize, uint ftmo){
	SSL *lconn = as_SSL(_conn);

	int lbytes = 0;

	while (true) {
		//dbg("---------> try to get ssl block");
		if (fsize == lbytes) return lbytes;
		if ( SSL_pending(lconn) == 0) {
			//WaitResult lwr = waitOnHandle((upHandle)_handle,ftmo);
			WaitResult lwr = upNet::waitOnSocket(_handle,ftmo);
			switch (lwr) {
			case WaitResult::awaited: 
			//	dbg("...awaited...");
				break;
			case WaitResult::error: 
				//dbg("---------> error on read block");
				return -1;

			case WaitResult::logic_error: 
				//dbg("---------> error on read block");
				return -1;

			case WaitResult::timeouted: 
				//dbg("---------> error on read block");
				return 0;

			default: //timeout
				//dbg("--------> exit by timeout");
				//return lbytes;
				return 0;
			}
			//dbg("*****awaited");
		}

		//dbg("---------> SSL block got");
		
		
		int lres = SSL_read(lconn, fbuff, fsize-lbytes); //non blocking read
		if(lres > 0) {
			lbytes += lres;
			if(lbytes == fsize) return lbytes;
		}
		else {
			int lerr = SSL_get_error(lconn, lres);
			switch(lerr){
			case SSL_ERROR_WANT_READ: 
			case SSL_ERROR_WANT_WRITE:	continue;

			case SSL_ERROR_ZERO_RETURN: ///peer disconnected
				dbg("***crypto::readblock: peer disconnected");
				ssl_print_errors();
				return -1;

			case SSL_ERROR_WANT_CONNECT:
			case SSL_ERROR_WANT_ACCEPT:
				dbg("***crypto::readblock: wants CONNECT/ACCEPT!");
				return -1;

			case SSL_ERROR_SSL:
				dbg("***crypto::readblock: SSL protorcol error!");
				return -1;

			case SSL_ERROR_SYSCALL:
				dbg("***crypto::readblock: SSL error syscall!");
				return -1;

			case SSL_ERROR_NONE:
				dbg("***crypto::readblock: ERROR_NONE!");
				return -1;

			default: 
				//break;
				dbgInt("***crypto::readblock:unknown result!: ",lerr);
				ssl_print_errors();
				return -1;
			}
		}
	}
	return lbytes;
}

Исходная версия alysnix, :

поскольку кусок что я выложил не вполне понятен без контекста кидаю всю функцию. она правда использует некие функции их своей либы, но должно быть вроде все понятно.

это чтение в буфер блока размером fsize с таймаутом ftmo.


int CryptoConnection::readBlock(void *fbuff, int fsize, uint ftmo){
	SSL *lconn = as_SSL(_conn);

	int lbytes = 0;

	while (true) {
		//dbg("---------> try to get ssl block");
		if (fsize == lbytes) return lbytes;
		if ( SSL_pending(lconn) == 0) {
			//WaitResult lwr = waitOnHandle((upHandle)_handle,ftmo);
			WaitResult lwr = upNet::waitOnSocket(_handle,ftmo);
			switch (lwr) {
			case WaitResult::awaited: 
			//	dbg("...awaited...");
				break;
			case WaitResult::error: 
				//dbg("---------> error on read block");
				return -1;

			case WaitResult::logic_error: 
				//dbg("---------> error on read block");
				return -1;

			case WaitResult::timeouted: 
				//dbg("---------> error on read block");
				return 0;

			default: //timeout
				//dbg("--------> exit by timeout");
				//return lbytes;
				return 0;
			}
			//dbg("*****awaited");
		}

		//dbg("---------> SSL block got");
		
		
		int lres = SSL_read(lconn, fbuff, fsize-lbytes); //non blocking read
		if(lres > 0) {
			lbytes += lres;
			if(lbytes == fsize) return lbytes;
		}
		else {
			int lerr = SSL_get_error(lconn, lres);
			switch(lerr){
			case SSL_ERROR_WANT_READ: 
			case SSL_ERROR_WANT_WRITE:	continue;

			case SSL_ERROR_ZERO_RETURN: ///peer disconnected
				dbg("***crypto::readblock: peer disconnected");
				ssl_print_errors();
				return -1;

			case SSL_ERROR_WANT_CONNECT:
			case SSL_ERROR_WANT_ACCEPT:
				dbg("***crypto::readblock: wants CONNECT/ACCEPT!");
				return -1;

			case SSL_ERROR_SSL:
				dbg("***crypto::readblock: SSL protorcol error!");
				return -1;

			case SSL_ERROR_SYSCALL:
				dbg("***crypto::readblock: SSL error syscall!");
				return -1;

			case SSL_ERROR_NONE:
				dbg("***crypto::readblock: ERROR_NONE!");
				return -1;

			default: 
				//break;
				dbgInt("***crypto::readblock:unknown result!: ",lerr);
				ssl_print_errors();
				return -1;
			}
		}
	}
	return lbytes;
}