X-Git-Url: https://git.exim.org/users/heiko/exim.git/blobdiff_plain/d5c0d8c9374623620844d539d4810da63e9abca1..ce80533b305c56d57cb7ec1484491f191132cf84:/test/src/client.c?ds=inline diff --git a/test/src/client.c b/test/src/client.c index 4ac130df2..5b998e269 100644 --- a/test/src/client.c +++ b/test/src/client.c @@ -103,7 +103,7 @@ static int ssl_session_timeout = 200; /* Priorities for TLS algorithms to use. */ -#if GNUTLS_VERSION_NUMBER < 0x030400 +# if GNUTLS_VERSION_NUMBER < 0x030400 static const int protocol_priority[16] = { GNUTLS_TLS1, GNUTLS_SSL3, 0 }; static const int kx_priority[16] = { @@ -125,7 +125,7 @@ static const int mac_priority[16] = { 0 }; static const int comp_priority[16] = { GNUTLS_COMP_NULL, 0 }; -#endif +# endif #endif /*HAVE_GNUTLS*/ @@ -133,6 +133,7 @@ static const int comp_priority[16] = { GNUTLS_COMP_NULL, 0 }; #ifdef HAVE_TLS char * ocsp_stapling = NULL; +char * pri_string = NULL; #endif @@ -223,7 +224,7 @@ if(!(bs = OCSP_response_get1_basic(rsp))) } -if (!(sk = chain_from_pem_file(ocsp_stapling))) +if (!(sk = chain_from_pem_file((const uschar *)ocsp_stapling))) { BIO_printf(arg, "error in cert setup\n"); return 0; @@ -454,7 +455,7 @@ gnutls_session_t session; gnutls_init(&session, GNUTLS_CLIENT | GNUTLS_NO_EXTENSIONS); -#if GNUTLS_VERSION_NUMBER < 0x030400 +# if GNUTLS_VERSION_NUMBER < 0x030400 gnutls_cipher_set_priority(session, default_cipher_priority); gnutls_compression_set_priority(session, comp_priority); gnutls_kx_set_priority(session, kx_priority); @@ -462,10 +463,19 @@ gnutls_protocol_set_priority(session, protocol_priority); gnutls_mac_set_priority(session, mac_priority); gnutls_cred_set(session, GNUTLS_CRD_CERTIFICATE, x509_cred); -#else -gnutls_set_default_priority(session); +# else +if (pri_string) + { + gnutls_priority_t priority_cache; + const char * errpos; + + gnutls_priority_init(&priority_cache, pri_string, &errpos); + gnutls_priority_set(session, priority_cache); + } +else + gnutls_set_default_priority(session); gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, x509_cred); -#endif +# endif gnutls_dh_set_prime_bits(session, DH_BITS); gnutls_db_set_cache_expiration(session, ssl_session_timeout); @@ -543,32 +553,32 @@ while (fgets(CS outbuffer, sizeof(outbuffer), f) != NULL) /* Expect incoming */ if ( strncmp(CS outbuffer, "???", 3) == 0 - && (outbuffer[3] == ' ' || outbuffer[3] == '*') + && (outbuffer[3] == ' ' || outbuffer[3] == '*' || outbuffer[3] == '?') ) { unsigned char *lineptr; unsigned exp_eof = outbuffer[3] == '*'; + unsigned resp_optional = outbuffer[3] == '?'; printf("%s\n", outbuffer); n = unescape_buf(outbuffer, n); +nextinput: if (*inptr == 0) /* Refill input buffer */ { + alarm(timeout); if (srv->tls_active) { #ifdef HAVE_OPENSSL - rc = SSL_read (srv->ssl, inbuffer, bsiz - 1); + rc = SSL_read(srv->ssl, inbuffer, bsiz - 1); #endif #ifdef HAVE_GNUTLS rc = gnutls_record_recv(tls_session, CS inbuffer, bsiz - 1); #endif } else - { - alarm(timeout); rc = read(srv->sock, inbuffer, bsiz); - alarm(0); - } + alarm(0); if (rc < 0) { @@ -608,19 +618,31 @@ while (fgets(CS outbuffer, sizeof(outbuffer), f) != NULL) if (*inptr == '\n') inptr++; } - printf("<<< %s\n", lineptr); if (strncmp(CS lineptr, CS outbuffer + 4, n - 4) != 0) - { - printf("\n******** Input mismatch ********\n"); - exit(79); - } + if (resp_optional) + { + inptr = lineptr; /* consume scriptline, not inputline */ + continue; + } + else + { + printf("<<< %s\n", lineptr); + printf("\n******** Input mismatch ********\n"); + exit(79); + } + + /* input matched script */ + + if (resp_optional) + goto nextinput; /* consume inputline, not scriptline */ + + printf("<<< %s\n", lineptr); #ifdef HAVE_TLS if (srv->sent_starttls) { if (lineptr[0] == '2') { -int rc; unsigned int verify; printf("Attempting to start TLS\n"); @@ -710,7 +732,7 @@ int rc; else if (strncmp(CS outbuffer, "<<< ", 4) == 0) { FILE * new_f; - if (!(new_f = fopen(outbuffer+4 , "r"))) + if (!(new_f = fopen((const char *)outbuffer+4 , "r"))) { printf("Unable to open '%s': %s", inptr, strerror(errno)); exit(74); @@ -836,6 +858,10 @@ Usage: client\n" "\ [-tls-on-connect]\n\ [-ocsp]\n" +# ifdef HAVE_GNUTLS +"\ + [-p priority-string]\n" +# endif #endif "\ [-tn] n seconds timeout\n\ @@ -901,6 +927,17 @@ while (argc >= argi + 1 && argv[argi][0] == '-') } ocsp_stapling = argv[argi++]; } +# ifdef HAVE_GNUTLS + else if (strcmp(argv[argi], "-p") == 0) + { + if (argc < ++argi + 1) + { + fprintf(stderr, "Missing priority string\n"); + exit(96); + } + pri_string = argv[argi++]; + } +#endif #endif else if (argv[argi][1] == 't' && isdigit(argv[argi][2])) @@ -1194,7 +1231,8 @@ do_file(&srv, stdin, timeout, inbuffer, sizeof(inbuffer), inptr); printf("End of script\n"); shutdown(srv.sock, SHUT_WR); -while (read(srv.sock, inbuffer, sizeof(inbuffer)) > 0) ; +if (fcntl(srv.sock, F_SETFL, O_NONBLOCK) == 0) + while (read(srv.sock, inbuffer, sizeof(inbuffer)) > 0) ; close(srv.sock); exit(0);