X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/5dcadbf4edc474a0e55a3caaa3604ed06b6a3926..9078840563ffbb46c5a06f3eb94e5742e3ede07c:/test/src/client.c diff --git a/test/src/client.c b/test/src/client.c index de36ef065..c0c017dd3 100644 --- a/test/src/client.c +++ b/test/src/client.c @@ -36,6 +36,9 @@ ripped from the openssl ocsp and s_client utilities. */ #include #include +/* Set to TRUE to enable debug output */ +#define DEBUG if (FALSE) + #ifdef AF_INET6 #define HAVE_IPV6 1 #endif @@ -571,36 +574,51 @@ nextinput: { #ifdef HAVE_OPENSSL int error; + DEBUG { printf("call SSL_read\n"); fflush(stdout); } rc = SSL_read(srv->ssl, inbuffer, bsiz - 1); + DEBUG { printf("SSL_read: %d\n", rc); fflush(stdout); } if (rc <= 0) switch (error = SSL_get_error(srv->ssl, rc)) { case SSL_ERROR_ZERO_RETURN: break; case SSL_ERROR_SYSCALL: - printf("%s\n", ERR_error_string(ERR_get_error(), NULL)); break; + printf("%s\n", ERR_error_string(ERR_get_error(), NULL)); rc = -1; + break; case SSL_ERROR_SSL: - printf("%s\n", ERR_error_string(ERR_get_error(), NULL)); break; + printf("%s\nTLS terminated\n", ERR_error_string(ERR_get_error(), NULL)); SSL_shutdown(srv->ssl); SSL_free(srv->ssl); srv->tls_active = FALSE; + { /* OpenSSL leaves it in restartsys mode */ + struct sigaction act = {.sa_handler = sigalrm_handler_flag, .sa_flags = 0}; + sigalrm_seen = 1; + sigaction(SIGALRM, &act, NULL); + } + *inptr = 0; + DEBUG { printf("go round\n"); fflush(stdout); } goto nextinput; default: printf("SSL error code %d\n", error); } - #endif #ifdef HAVE_GNUTLS rc = gnutls_record_recv(tls_session, CS inbuffer, bsiz - 1); #endif } else - rc = read(srv->sock, inbuffer, bsiz); + { + DEBUG { printf("call read\n"); fflush(stdout); } + rc = read(srv->sock, inbuffer, bsiz); + DEBUG { printf("read: %d\n", rc); fflush(stdout); } + } alarm(0); if (rc < 0) { + if (errno == EINTR && sigalrm_seen && resp_optional) + continue; /* next scriptline */ printf("Read error %s\n", strerror(errno)); exit(81); } @@ -630,6 +648,7 @@ nextinput: inptr = inbuffer; } } + DEBUG { printf("read: '%s'\n", inptr); fflush(stdout); } lineptr = inptr; while (*inptr != 0 && *inptr != '\r' && *inptr != '\n') inptr++; @@ -652,12 +671,19 @@ nextinput: exit(79); } - /* input matched script */ + /* Input matched script. Output the inputline, unless optional */ + DEBUG { printf("read matched\n"); fflush(stdout); } + + if (!resp_optional) + printf("<<< %s\n", lineptr); + else - if (resp_optional) - goto nextinput; /* consume inputline, not scriptline */ + /* If there is further input after this line, consume inputline but not + scriptline in case there are several matching. Nonmatches are dealt with + above. */ - printf("<<< %s\n", lineptr); + if (*inptr != 0) + goto nextinput; #ifdef HAVE_TLS if (srv->sent_starttls)