diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 1183dbb177..0dd6025d53 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,42 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-07-19 19:40 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * contrib/hbssl/Makefile + + contrib/hbssl/sslerr.c + + contrib/hbssl/sslx509.c + * contrib/hbssl/ssl.c + * contrib/hbssl/sslctx.c + * contrib/hbssl/hbssl.ch + * contrib/hbssl/tests/test.prg + + Added ERR_*() API functions. + + Prefixed .ch contant names with HB_ to avoid collision with + ssl own headers. + + Added SSL_CTX_SET_MODE(), SSL_CTX_GET_MODE() functions. + + Added HB_SSL_READ_ALL(), HB_SSL_READ_LINE() functions meaning + to mimic HB_INETRECVALL() and HB_INETRECVLINE(). (probably needs + more work, it'd be great if someone who understands the guts of + these inet functions could take a look) + * SSL_PEEK() synced with SSL_READ() recent changes. + + Added SSL_SET_MODE(), SSL_GET_MODE(), SSL_SET_MTU() functions. + + Added SSL_GET_RBIO(), SSL_GET_WBIO() functions. + + Added SSL_GET_PEER_CERTIFICATE() function. + + Added X509_GET_SUBJECT_NAME(), X509_GET_ISSUER_NAME(), X509_NAME_ONELINE() + + Added HB_SSL_MODE_* constants. + + * include/hbextern.ch + * Changed to use new hbextlng.ch. + + - examples/hbextern/hbextern.lst + ! It wasn't deleted in 2009-07-18 21:37 UTC+0600 for some reason. + + * source/rtl/console.c + ! Fixed OUTSTD() and OUTERR() to output separator space + to std/err instead of alt. + + * source/rtl/hbinet.c + % Minor optimization. + 2009-07-18 21:37 UTC+0600 April White (april users.sourceforge.net) - examples/hbextern/hbextern.lst * examples/hbextern/hbextern.prg diff --git a/harbour/contrib/hbssl/Makefile b/harbour/contrib/hbssl/Makefile index 8594a7b7ce..78ea83ea55 100644 --- a/harbour/contrib/hbssl/Makefile +++ b/harbour/contrib/hbssl/Makefile @@ -30,8 +30,10 @@ C_SOURCES=\ sslbio.c \ sslciph.c \ sslctx.c \ + sslerr.c \ sslrand.c \ sslsess.c \ + sslx509.c \ PRG_HEADERS=\ hbssl.ch \ diff --git a/harbour/contrib/hbssl/hbssl.ch b/harbour/contrib/hbssl/hbssl.ch index e2afed5394..86a6d7ee96 100644 --- a/harbour/contrib/hbssl/hbssl.ch +++ b/harbour/contrib/hbssl/hbssl.ch @@ -76,17 +76,25 @@ #define HB_SSLEAY_PLATFORM 3 #define HB_SSLEAY_DIR 4 -#define SSL_ERROR_NONE 0 -#define SSL_ERROR_SSL 1 -#define SSL_ERROR_WANT_READ 2 -#define SSL_ERROR_WANT_WRITE 3 -#define SSL_ERROR_WANT_X509_LOOKUP 4 -#define SSL_ERROR_SYSCALL 5 -#define SSL_ERROR_ZERO_RETURN 6 -#define SSL_ERROR_WANT_CONNECT 7 -#define SSL_ERROR_WANT_ACCEPT 8 +#define HB_SSL_ERROR_NONE 0 +#define HB_SSL_ERROR_SSL 1 +#define HB_SSL_ERROR_WANT_READ 2 +#define HB_SSL_ERROR_WANT_WRITE 3 +#define HB_SSL_ERROR_WANT_X509_LOOKUP 4 +#define HB_SSL_ERROR_SYSCALL 5 +#define HB_SSL_ERROR_ZERO_RETURN 6 +#define HB_SSL_ERROR_WANT_CONNECT 7 +#define HB_SSL_ERROR_WANT_ACCEPT 8 -#define BIO_NOCLOSE 0x00 -#define BIO_CLOSE 0x01 +#define HB_SSL_MODE_ENABLE_PARTIAL_WRITE 1 +#define HB_SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 2 +#define HB_SSL_MODE_AUTO_RETRY 4 +#define HB_SSL_MODE_NO_AUTO_CHAIN 8 + +#define HB_SSL_SENT_SHUTDOWN 1 +#define HB_SSL_RECEIVED_SHUTDOWN 2 + +#define HB_BIO_NOCLOSE 0x00 +#define HB_BIO_CLOSE 0x01 #endif /* HBSSL_CH_ */ diff --git a/harbour/contrib/hbssl/ssl.c b/harbour/contrib/hbssl/ssl.c index 86c0ccdfa1..f2079c644c 100644 --- a/harbour/contrib/hbssl/ssl.c +++ b/harbour/contrib/hbssl/ssl.c @@ -53,6 +53,7 @@ #include "hbapi.h" #include "hbapierr.h" #include "hbapiitm.h" +#include "hbvm.h" #include "hbssl.h" @@ -193,6 +194,32 @@ HB_FUNC( SSL_SET_BIO ) hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); } +HB_FUNC( SSL_GET_RBIO ) +{ + if( hb_SSL_is( 1 ) ) + { + SSL * ssl = hb_SSL_par( 1 ); + + if( ssl ) + hb_retptr( SSL_get_rbio( ssl ) ); + } + else + hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + +HB_FUNC( SSL_GET_WBIO ) +{ + if( hb_SSL_is( 1 ) ) + { + SSL * ssl = hb_SSL_par( 1 ); + + if( ssl ) + hb_retptr( SSL_get_wbio( ssl ) ); + } + else + hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + HB_FUNC( SSL_CONNECT ) { if( hb_SSL_is( 1 ) ) @@ -396,6 +423,194 @@ HB_FUNC( SSL_READ ) hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); } +/* Based on HB_INETRECVALL() */ +HB_FUNC( HB_SSL_READ_ALL ) +{ + fprintf( stdout, "ALL: SSL_READ: ENTER\n" ); + fflush( stdout ); + + if( hb_SSL_is( 1 ) ) + { + SSL * ssl = hb_SSL_par( 1 ); + + if( ssl ) + { + PHB_ITEM pBuffer = hb_param( 2, HB_IT_STRING ); + char * buffer; + ULONG ulLen; + int iLen, iMaxLen, iReceived; + int iTimeElapsed, iTimeout = hb_parni( 4 ); + + if( hb_itemGetWriteCL( pBuffer, &buffer, &ulLen ) ) + iLen = ( int ) ulLen; + else + { + iLen = 0; + buffer = NULL; + } + + if( HB_ISNUM( 3 ) ) + { + iMaxLen = hb_parni( 3 ); + if( iLen < iMaxLen ) + iMaxLen = iLen; + } + else + iMaxLen = iLen; + + hb_vmUnlock(); + + iReceived = 0; + iTimeElapsed = 0; + + fprintf( stdout, "ALL: SSL_READ: START\n" ); + fflush( stdout ); + + do + { + if( SSL_pending( ssl ) > 0 ) + { + iLen = SSL_read( ssl, buffer + iReceived, iMaxLen - iReceived ); + + fprintf( stdout, "ALL: SSL_READ: %d\n", iLen ); + fflush( stdout ); + + if( iLen > 0 ) + iReceived += iLen; + } + else + { + iTimeElapsed += iTimeout; + + hb_vmLock(); + + hb_retni( iReceived ); + return; + } + } + while( iReceived < iMaxLen && iLen > 0 ); + + hb_vmLock(); + + if( iLen == 0 ) + hb_retni( iLen ); + else if( iLen < 0 ) + hb_retni( iLen ); + else + hb_retni( iReceived ); + } + } + else + hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + +/* Based on HB_INETRECVLINE() */ +HB_FUNC( HB_SSL_READ_LINE ) +{ + fprintf( stdout, "ALL: SSL_READ_LINE: ENTER\n" ); + fflush( stdout ); + + if( hb_SSL_is( 1 ) ) + { + SSL * ssl = hb_SSL_par( 1 ); + + if( ssl ) + { + static const char * szPattern = "\r\n"; + + PHB_ITEM pResult = hb_param( 2, HB_IT_BYREF ); + PHB_ITEM pMaxSize = hb_param( 3, HB_IT_NUMERIC ); + PHB_ITEM pBufferSize = hb_param( 4, HB_IT_NUMERIC ); + + char cChar = '\0'; + char * Buffer; + int iAllocated, iBufferSize, iMax; + int iLen = 0, iPatLen; + int iPos = 0, iTimeElapsed, iTimeout = hb_parni( 4 ); + + iBufferSize = pBufferSize ? hb_itemGetNI( pBufferSize ) : 80; + iMax = pMaxSize ? hb_itemGetNI( pMaxSize ) : 0; + + Buffer = ( char * ) hb_xgrab( iBufferSize ); + iAllocated = iBufferSize; + iTimeElapsed = 0; + iPatLen = ( int ) strlen( szPattern ); + + fprintf( stdout, "ALL: SSL_READ_LINE: START\n" ); + fflush( stdout ); + + do + { + if( iPos == iAllocated - 1 ) + { + iAllocated += iBufferSize; + Buffer = ( char * ) hb_xrealloc( Buffer, iAllocated ); + } + + fprintf( stdout, "ALL: SSL_READ_LINE: BEFORE READ\n" ); + fflush( stdout ); + + if( SSL_pending( ssl ) > 0 ) + { + iLen = SSL_read( ssl, &cChar, 1 ); + + fprintf( stdout, "ALL: SSL_READ_LINE: %d\n", iLen ); + fflush( stdout ); + + if( iLen > 0 ) + { + Buffer[ iPos++ ] = cChar; + /* verify endsequence recognition automata status */ + if( iPos >= iPatLen && + memcmp( Buffer + iPos - iPatLen, szPattern, iPatLen ) == 0 ) + { + break; + } + } + else + { + iTimeElapsed += iTimeout; + break; + } + } + else + break; + } + while( iMax == 0 || iPos < iMax ); + + if( iLen <= 0 ) + { + if( pResult ) + hb_itemPutNI( pResult, iLen ); + + hb_xfree( Buffer ); + } + else + { + if( iMax == 0 || iPos < iMax ) + { + iPos -= iPatLen; + + if( pResult ) + hb_itemPutNI( pResult, iPos ); + + hb_retclen_buffer( Buffer, iPos ); + } + else + { + if( pResult ) + hb_itemPutNI( pResult, -2 ); + + hb_xfree( Buffer ); + hb_retc_null(); + } + } + } + } + else + hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + HB_FUNC( SSL_PEEK ) { if( hb_SSL_is( 1 ) ) @@ -407,9 +622,9 @@ HB_FUNC( SSL_PEEK ) PHB_ITEM pBuffer = hb_param( 2, HB_IT_STRING ); int nRead; - if( pBuffer && HB_ISBYREF( 2 ) && HB_ISNUM( 3 ) ) + if( pBuffer && HB_ISBYREF( 2 ) ) { - nRead = hb_parni( 3 ); + nRead = HB_ISNUM( 3 ) ? hb_parni( 3 ) : ( int ) hb_parclen( 2 ); if( ( ULONG ) nRead <= hb_parcsiz( 2 ) ) { @@ -520,7 +735,7 @@ HB_FUNC( SSL_GET_CURRENT_CIPHER ) SSL * ssl = hb_SSL_par( 1 ); if( ssl ) - hb_retptr( ( void * ) SSL_get_current_cipher( ssl ) ); + hb_retptr( SSL_get_current_cipher( ssl ) ); } else hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); @@ -1072,6 +1287,58 @@ HB_FUNC( SSL_SET_VERIFY_RESULT ) hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); } +HB_FUNC( SSL_SET_MODE ) +{ + if( hb_SSL_is( 1 ) ) + { + SSL * ssl = hb_SSL_par( 1 ); + + if( ssl ) + SSL_set_mode( ssl, hb_parnl( 2 ) ); + } + else + hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + +HB_FUNC( SSL_GET_MODE ) +{ + if( hb_SSL_is( 1 ) ) + { + SSL * ssl = hb_SSL_par( 1 ); + + if( ssl ) + hb_parnl( SSL_get_mode( ssl ) ); + } + else + hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + +HB_FUNC( SSL_SET_MTU ) +{ + if( hb_SSL_is( 1 ) ) + { + SSL * ssl = hb_SSL_par( 1 ); + + if( ssl ) + SSL_set_mtu( ssl, hb_parnl( 2 ) ); + } + else + hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + +HB_FUNC( SSL_GET_PEER_CERTIFICATE ) +{ + if( hb_SSL_is( 1 ) ) + { + SSL * ssl = hb_SSL_par( 1 ); + + if( ssl ) + hb_retptr( SSL_get_peer_certificate( ssl ) ); + } + else + hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + /* int SSL_set_cipher_list(SSL *ssl, char *str); int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); @@ -1093,7 +1360,6 @@ char * SSL_get_ex_data( ssl, int ); int SSL_add_dir_cert_subjects_to_stack(STACK *stack, const char *dir); int SSL_add_file_cert_subjects_to_stack(STACK *stack, const char *file); int SSL_add_client_CA(SSL *ssl, X509 *x); -long SSL_ctrl(SSL *ssl, int cmd, long larg, char *parg); STACK * SSL_dup_CA_list(STACK *sk); SSL_CTX * SSL_get_SSL_CTX(const SSL *ssl); X509 * SSL_get_certificate(const SSL *ssl); @@ -1105,12 +1371,9 @@ void (*SSL_get_info_callback(const SSL *ssl);)() STACK * SSL_get_peer_cert_chain(const SSL *ssl); X509 * SSL_get_peer_certificate(const SSL *ssl); EVP_PKEY * SSL_get_privatekey(SSL *ssl); -BIO * SSL_get_rbio(const SSL *ssl); SSL_SESSION *SSL_get_session(const SSL *ssl); int (*SSL_get_verify_callback(const SSL *ssl))(int,X509_STORE_CTX *) -BIO * SSL_get_wbio(const SSL *ssl); STACK * SSL_load_client_CA_file(char *file); -void SSL_set_bio(SSL *ssl, BIO *rbio, BIO *wbio); void SSL_set_client_CA_list(SSL *ssl, STACK *list); void SSL_set_info_callback(SSL *ssl, void (*cb);(void)) void SSL_set_msg_callback(SSL *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg)); diff --git a/harbour/contrib/hbssl/sslctx.c b/harbour/contrib/hbssl/sslctx.c index 1531767442..6b9542865d 100644 --- a/harbour/contrib/hbssl/sslctx.c +++ b/harbour/contrib/hbssl/sslctx.c @@ -544,6 +544,32 @@ HB_FUNC( SSL_CTX_SET_QUIET_SHUTDOWN ) hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); } +HB_FUNC( SSL_CTX_SET_MODE ) +{ + if( hb_SSL_CTX_is( 1 ) ) + { + SSL_CTX * ctx = hb_SSL_CTX_par( 1 ); + + if( ctx ) + SSL_CTX_set_mode( ctx, hb_parnl( 2 ) ); + } + else + hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + +HB_FUNC( SSL_CTX_GET_MODE ) +{ + if( hb_SSL_CTX_is( 1 ) ) + { + SSL_CTX * ctx = hb_SSL_CTX_par( 1 ); + + if( ctx ) + hb_parnl( SSL_CTX_get_mode( ctx ) ); + } + else + hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + /* X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); void SSL_CTX_set_cert_store(SSL_CTX *,X509_STORE *); diff --git a/harbour/contrib/hbssl/sslerr.c b/harbour/contrib/hbssl/sslerr.c new file mode 100644 index 0000000000..70bc69046d --- /dev/null +++ b/harbour/contrib/hbssl/sslerr.c @@ -0,0 +1,175 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * OpenSSL API (ERR) - Harbour interface. + * + * Copyright 2009 Viktor Szakats (harbour.01 syenar.hu) + * www - http://www.harbour-project.org + * + * 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 2, 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 software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). + * + * As a special exception, the Harbour Project gives permission for + * additional uses of the text contained in its release of Harbour. + * + * The exception is that, if you link the Harbour libraries with other + * files to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the Harbour library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the Harbour + * Project under the name Harbour. If you copy code from other + * Harbour Project or Free Software Foundation releases into a copy of + * Harbour, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for Harbour, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + * + */ + +#include "hbapi.h" +#include "hbapierr.h" + +#include + +HB_FUNC( SSL_ERR_GET_ERROR ) +{ + hb_retnint( ERR_get_error() ); +} + +HB_FUNC( SSL_ERR_PEEK_ERROR ) +{ + hb_retnint( ERR_peek_error() ); +} + +HB_FUNC( SSL_ERR_PEEK_LAST_ERROR ) +{ + hb_retnint( ERR_peek_last_error() ); +} + +HB_FUNC( SSL_ERR_ERROR_STRING ) +{ + char buffer[ 120 + 1 ]; + + buffer[ 0 ] = '\0'; + + ERR_error_string_n( ( unsigned long ) hb_parnint( 1 ), buffer, sizeof( buffer ) ); + + hb_retc( buffer ); +} + +HB_FUNC( SSL_ERR_LIB_ERROR_STRING ) +{ + hb_retc( ERR_lib_error_string( ( unsigned long ) hb_parnint( 1 ) ) ); +} + +HB_FUNC( SSL_ERR_FUNC_ERROR_STRING ) +{ + hb_retc( ERR_lib_error_string( ( unsigned long ) hb_parnint( 1 ) ) ); +} + +HB_FUNC( SSL_ERR_REASON_ERROR_STRING ) +{ + hb_retc( ERR_lib_error_string( ( unsigned long ) hb_parnint( 1 ) ) ); +} + +HB_FUNC( SSL_ERR_GET_ERROR_LINE ) +{ + const char * file = NULL; + int line = 0; + + hb_retnint( ERR_get_error_line( &file, &line ) ); + + hb_storc( file, 1 ); + hb_storni( line, 2 ); +} + +HB_FUNC( SSL_ERR_PEEK_ERROR_LINE ) +{ + const char * file = NULL; + int line = 0; + + hb_retnint( ERR_peek_error_line( &file, &line ) ); + + hb_storc( file, 1 ); + hb_storni( line, 2 ); +} + +HB_FUNC( SSL_ERR_PEEK_LAST_ERROR_LINE ) +{ + const char * file = NULL; + int line = 0; + + hb_retnint( ERR_peek_last_error_line( &file, &line ) ); + + hb_storc( file, 1 ); + hb_storni( line, 2 ); +} + +HB_FUNC( SSL_ERR_GET_ERROR_LINE_DATA ) +{ + const char * file = NULL; + int line = 0; + const char * data = NULL; + int flags = 0; + + hb_retnint( ERR_get_error_line_data( &file, &line, &data, &flags ) ); + + hb_storc( file, 1 ); + hb_storni( line, 2 ); + hb_storc( data, 3 ); + hb_storni( flags, 4 ); +} + +HB_FUNC( SSL_ERR_PEEK_ERROR_LINE_DATA ) +{ + const char * file = NULL; + int line = 0; + const char * data = NULL; + int flags = 0; + + hb_retnint( ERR_peek_error_line_data( &file, &line, &data, &flags ) ); + + hb_storc( file, 1 ); + hb_storni( line, 2 ); + hb_storc( data, 3 ); + hb_storni( flags, 4 ); +} + +HB_FUNC( SSL_ERR_PEEK_LAST_ERROR_LINE_DATA ) +{ + const char * file = NULL; + int line = 0; + const char * data = NULL; + int flags = 0; + + hb_retnint( ERR_peek_last_error_line_data( &file, &line, &data, &flags ) ); + + hb_storc( file, 1 ); + hb_storni( line, 2 ); + hb_storc( data, 3 ); + hb_storni( flags, 4 ); +} diff --git a/harbour/contrib/hbssl/sslx509.c b/harbour/contrib/hbssl/sslx509.c new file mode 100644 index 0000000000..1b8e61f1b4 --- /dev/null +++ b/harbour/contrib/hbssl/sslx509.c @@ -0,0 +1,90 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * OpenSSL API (X509) - Harbour interface. + * + * Copyright 2009 Viktor Szakats (harbour.01 syenar.hu) + * www - http://www.harbour-project.org + * + * 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 2, 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 software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). + * + * As a special exception, the Harbour Project gives permission for + * additional uses of the text contained in its release of Harbour. + * + * The exception is that, if you link the Harbour libraries with other + * files to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the Harbour library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the Harbour + * Project under the name Harbour. If you copy code from other + * Harbour Project or Free Software Foundation releases into a copy of + * Harbour, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for Harbour, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + * + */ + +#include "hbapi.h" +#include "hbapierr.h" + +#include "hbssl.h" + +HB_FUNC( X509_GET_SUBJECT_NAME ) +{ + X509 * x509 = ( X509 * ) hb_parptr( 1 ); + + if( x509 ) + hb_retptr( X509_get_subject_name( x509 ) ); + else + hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + +HB_FUNC( X509_GET_ISSUER_NAME ) +{ + X509 * x509 = ( X509 * ) hb_parptr( 1 ); + + if( x509 ) + hb_retptr( X509_get_issuer_name( x509 ) ); + else + hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + +HB_FUNC( X509_NAME_ONELINE ) +{ + X509_NAME * x509_name = ( X509_NAME * ) hb_parptr( 1 ); + + if( x509_name ) + { + char buffer[ 1024 ]; + X509_NAME_oneline( x509_name, buffer, sizeof( buffer ) ); + hb_retc( buffer ); + } + else + hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} diff --git a/harbour/contrib/hbssl/tests/test.prg b/harbour/contrib/hbssl/tests/test.prg index 2e89462b1d..0098a70496 100644 --- a/harbour/contrib/hbssl/tests/test.prg +++ b/harbour/contrib/hbssl/tests/test.prg @@ -44,7 +44,7 @@ PROCEDURE Main() ? "-------" socket := hb_inetCreate() - ? hb_inetTimeout( socket, 500 ) + ? hb_inetTimeout( socket, 2500 ) ? hb_inetConnect( "www.fortify.net", 443, socket ) ? hb_inetErrorCode( socket ) @@ -83,7 +83,7 @@ PROCEDURE Main() ? "SSL_CIPHER_GET_NAME" , SSL_CIPHER_GET_NAME( cipher ) ? "SSL_CIPHER_GET_VERSION", SSL_CIPHER_GET_VERSION( cipher ) ? "SSL_CIPHER_GET_BITS" , SSL_CIPHER_GET_BITS( cipher, @bits ), bits -// ? "SSL_CIPHER_DESCRIPTION", SSL_CIPHER_DESCRIPTION( cipher ) + ? "SSL_CIPHER_DESCRIPTION", SSL_CIPHER_DESCRIPTION( cipher ) ? "SSL_WRITE", tmp := SSL_WRITE( ssl, "GET / http/1.1" + hb_inetCRLF() + "Host: " + "www.fortify.net" + hb_inetCRLF() + hb_inetCRLF() ) ? "SSL_GET_ERROR", SSL_GET_ERROR( ssl, tmp ) diff --git a/harbour/examples/hbextern/hbextern.lst b/harbour/examples/hbextern/hbextern.lst deleted file mode 100644 index ef21f8c8ca..0000000000 --- a/harbour/examples/hbextern/hbextern.lst +++ /dev/null @@ -1,46 +0,0 @@ -# -# $Id$ -#/ - -#Layout: one contrib entry per line, that being a comma separated list of: folder, .CH file name, description -#folder, hbx$$$$$.ch, description without commas - -gtalleg, hbxalleg, Allegro based virtual GT with graphic extensions -gtqtc, hbxgtqtc, Video subsystem for Windows using GUI windows instead of Console - QTC -gtwvg, hbxgtwvg, Video subsystem for Windows using GUI windows instead of Console - WVG -hbblat, hbxblat, BLAT library API -hbbmcdx, hbxbmcdx, BMDBFCDX RDD, xHarbour Project source code -hbbtree, hbxbtree, BTree library API -hbclipsm, hbxclpsm -hbcrypt, hbxcrypt -hbct, hbxct, Clipper Tools library API -hbcurl, hbxcurl, curl library API -hbfbird, hbxfbird, Firebird RDBMS library API -hbfimage, hbxfimge, FreeImage graphic library API -#hbgd, hbxgd, GD graphic library class, # unnecessary as this folder has its own .ch file -hbgt, hbxgt, GT Clipper library API -hbhpdf, hbxhpdf, hbhpdf/libharu library API -hbmisc, hbxmisc -hbmsql, hbxmsql - -# the format of hbmysql/mysqlold.c is such that hbextern.exe will not parse out the function names -hbmysql, hbxmysql, MySQL DBMS library API - -hbmzip, hbxmzip, minizip library API -hbnf, hbxnf, Nanforums library API -hbodbc, hbxodbc, ODBC library API -hbpgsql, hbxpgsql, PostgreSQL RDD library API -hbqt, hbxqt, QT library API -hbsqlit3, hbxsqlt3, SQLite3 library API -hbssl, hbxssl, OpenSSL library API -hbtip, hbxtip, TIP Internet protocol library API -hbtpathy, hbxtpthy, Telepathy library API -hbvpdf, hbxvpdf, PDF library API -hbwin, hbxwin, Windows library API -hbxbp, hbxxbp, xBase++ library API -hbziparc, hbxzip, ZipArchive library API -rddado, hbxado, ADO RDD library API -rddads, hbxads, Advantage Database Server RDD library API -rddsql, hbxsql, SQL RDD library API -xhb, hbxxhb, xHarbour library API -xpp, hbxxpp, xBase++ library API diff --git a/harbour/include/hbextern.ch b/harbour/include/hbextern.ch index 679fa34aee..f049df14f3 100644 --- a/harbour/include/hbextern.ch +++ b/harbour/include/hbextern.ch @@ -54,6 +54,7 @@ #define HB_EXTERN_CH_ #include "hbextcdp.ch" +#include "hbextlng.ch" /* CA-Cl*pper compatible standard functions */ @@ -1036,75 +1037,6 @@ EXTERNAL HB_MUTEXSUBSCRIBE EXTERNAL HB_MUTEXSUBSCRIBENOW EXTERNAL HB_MUTEXQUEUEINFO -/* lang support */ -EXTERNAL HB_LANG_BE866 -EXTERNAL HB_LANG_BEWIN -EXTERNAL HB_LANG_BG866 -EXTERNAL HB_LANG_BGISO -EXTERNAL HB_LANG_BGMIK -EXTERNAL HB_LANG_BGWIN -EXTERNAL HB_LANG_CA -EXTERNAL HB_LANG_CS852 -EXTERNAL HB_LANG_CSISO -EXTERNAL HB_LANG_CSKAM -EXTERNAL HB_LANG_CSWIN -EXTERNAL HB_LANG_DE -EXTERNAL HB_LANG_DEWIN -EXTERNAL HB_LANG_EL -EXTERNAL HB_LANG_ELWIN -EXTERNAL HB_LANG_EN -EXTERNAL HB_LANG_EO -EXTERNAL HB_LANG_ES -EXTERNAL HB_LANG_ESWIN -EXTERNAL HB_LANG_EU -EXTERNAL HB_LANG_FR -EXTERNAL HB_LANG_GL -EXTERNAL HB_LANG_HE862 -EXTERNAL HB_LANG_HEWIN -EXTERNAL HB_LANG_HR437 -EXTERNAL HB_LANG_HR852 -EXTERNAL HB_LANG_HRISO -EXTERNAL HB_LANG_HRWIN -EXTERNAL HB_LANG_HU852 -EXTERNAL HB_LANG_HUCWI -EXTERNAL HB_LANG_HUISO -EXTERNAL HB_LANG_HUWIN -EXTERNAL HB_LANG_ID -EXTERNAL HB_LANG_IS850 -EXTERNAL HB_LANG_IT -EXTERNAL HB_LANG_KO -EXTERNAL HB_LANG_LTWIN -EXTERNAL HB_LANG_NL -EXTERNAL HB_LANG_PL852 -EXTERNAL HB_LANG_PLISO -EXTERNAL HB_LANG_PLMAZ -EXTERNAL HB_LANG_PLWIN -EXTERNAL HB_LANG_PT -EXTERNAL HB_LANG_PTISO -EXTERNAL HB_LANG_RO -EXTERNAL HB_LANG_RU866 -EXTERNAL HB_LANG_RUKOI8 -EXTERNAL HB_LANG_RUWIN -EXTERNAL HB_LANG_SK852 -EXTERNAL HB_LANG_SKISO -EXTERNAL HB_LANG_SKKAM -EXTERNAL HB_LANG_SKWIN -EXTERNAL HB_LANG_SL437 -EXTERNAL HB_LANG_SL852 -EXTERNAL HB_LANG_SLISO -EXTERNAL HB_LANG_SLWIN -EXTERNAL HB_LANG_SR852 -EXTERNAL HB_LANG_SRISO -EXTERNAL HB_LANG_SRWIN -EXTERNAL HB_LANG_TR857 -EXTERNAL HB_LANG_TRWIN -EXTERNAL HB_LANG_UA866 -EXTERNAL HB_LANG_UADOS -EXTERNAL HB_LANG_UAKOI8 -EXTERNAL HB_LANG_UAWIN -EXTERNAL HB_LANG_ZHB5 -EXTERNAL HB_LANG_ZHGB - EXTERNAL HB_AT EXTERNAL HB_ATI EXTERNAL HB_RAT diff --git a/harbour/source/rtl/console.c b/harbour/source/rtl/console.c index 2ea1a2171d..1c4ab6c871 100644 --- a/harbour/source/rtl/console.c +++ b/harbour/source/rtl/console.c @@ -294,7 +294,7 @@ HB_FUNC( OUTSTD ) /* writes a list of values to the standard output device */ for( iParam = 1; iParam <= iPCount; iParam++ ) { if( iParam > 1 ) - hb_conOutAlt( " ", 1 ); + hb_conOutStd( " ", 1 ); pszString = hb_itemString( hb_param( iParam, HB_IT_ANY ), &ulLen, &fFree ); if( ulLen ) hb_conOutStd( pszString, ulLen ); @@ -313,7 +313,7 @@ HB_FUNC( OUTERR ) /* writes a list of values to the standard error device */ for( iParam = 1; iParam <= iPCount; iParam++ ) { if( iParam > 1 ) - hb_conOutAlt( " ", 1 ); + hb_conOutErr( " ", 1 ); pszString = hb_itemString( hb_param( iParam, HB_IT_ANY ), &ulLen, &fFree ); if( ulLen ) hb_conOutErr( pszString, ulLen ); diff --git a/harbour/source/rtl/hbinet.c b/harbour/source/rtl/hbinet.c index 076d0d51b7..b3705f1afc 100644 --- a/harbour/source/rtl/hbinet.c +++ b/harbour/source/rtl/hbinet.c @@ -275,6 +275,8 @@ static void hb_inetLinuxSigusrHandle( int sig ) # endif #endif +static const char * s_inetCRLF = "\r\n"; + /* JC1: we need it volatile to be minimally thread safe. */ static volatile int s_iSessions = 0; @@ -1189,7 +1191,7 @@ static void s_inetRecvPattern( const char * szPattern ) HB_FUNC( HB_INETRECVLINE ) { - s_inetRecvPattern( "\r\n" ); + s_inetRecvPattern( s_inetCRLF ); } HB_FUNC( HB_INETRECVENDBLOCK ) @@ -1483,7 +1485,7 @@ static void s_inetSendInternal( int iMode ) } else if( iLen == 0 ) { - HB_SOCKET_SET_ERROR2( Socket, -1 , "Timeout" ); + HB_SOCKET_SET_ERROR2( Socket, -1, "Timeout" ); break; } else @@ -2176,7 +2178,7 @@ HB_FUNC( HB_INETDGRAMRECV ) HB_FUNC( HB_INETCRLF ) { - hb_retc_const( "\r\n" ); + hb_retc_const( s_inetCRLF ); } HB_FUNC( HB_INETISSOCKET )