latter needs a whole pile of tables. */
#ifdef HAVE_OPENSSL
-#define HAVE_TLS
-#include <openssl/crypto.h>
-#include <openssl/x509.h>
-#include <openssl/pem.h>
-#include <openssl/ssl.h>
-#include <openssl/err.h>
-#include <openssl/rand.h>
-#include <openssl/ocsp.h>
+# define HAVE_TLS
+# include <openssl/crypto.h>
+# include <openssl/x509.h>
+# include <openssl/pem.h>
+# include <openssl/ssl.h>
+# include <openssl/err.h>
+# include <openssl/rand.h>
+# include <openssl/ocsp.h>
#endif
#ifdef HAVE_GNUTLS
-#define HAVE_TLS
-#include <gnutls/gnutls.h>
-#include <gnutls/x509.h>
-#include <gnutls/ocsp.h>
+# define HAVE_TLS
+# include <gnutls/gnutls.h>
+# include <gnutls/x509.h>
+# if GNUTLS_VERSION_NUMBER >= 0x030103
+# define HAVE_OCSP
+# include <gnutls/ocsp.h>
+# endif
-#define DH_BITS 768
+# define DH_BITS 768
/* Local static variables for GNUTLS */
static const int comp_priority[16] = { GNUTLS_COMP_NULL, 0 };
static const int cert_type_priority[16] = { GNUTLS_CRT_X509, 0 };
-#endif
+#endif /*HAVE_GNUTLS*/
fprintf(stderr, "GnuTLS connection error: %s:", prefix);
if (err != 0) fprintf(stderr, " %s", gnutls_strerror(err));
fprintf(stderr, "\n");
-exit(1);
+exit(98);
}
if (fd < 0)
{
fprintf(stderr, "Failed to open spool/gnutls-params: %s\n", strerror(errno));
- exit(1);
+ exit(97);
}
if (fstat(fd, &statbuf) < 0)
strcmp(argv[argi], "--help") == 0 ||
strcmp(argv[argi], "-h") == 0)
{
- printf(HELP_MESSAGE);
+ puts(HELP_MESSAGE);
exit(0);
}
if (strcmp(argv[argi], "-tls-on-connect") == 0)
if (argc < ++argi + 1)
{
fprintf(stderr, "Missing required certificate file for ocsp option\n");
- exit(1);
+ exit(96);
}
ocsp_stapling = argv[argi++];
}
{
fprintf(stderr, "Failed to parse seconds from option <%s>\n",
argv[argi]);
- exit(1);
+ exit(95);
}
if (tmplong > 10000L)
{
- fprintf(stderr, "Unreasonably long wait of %d seconds requested\n",
+ fprintf(stderr, "Unreasonably long wait of %ld seconds requested\n",
tmplong);
- exit(1);
+ exit(94);
}
if (tmplong < 0L)
{
- fprintf(stderr, "Timeout must not be negative (%d)\n", tmplong);
- exit(1);
+ fprintf(stderr, "Timeout must not be negative (%ld)\n", tmplong);
+ exit(93);
}
timeout = (int) tmplong;
argi++;
else
{
fprintf(stderr, "Unrecognized option %s\n", argv[argi]);
- exit(1);
+ exit(92);
}
}
if (argc < argi+1)
{
fprintf(stderr, "No IP address given\n");
- exit(1);
+ exit(91);
}
address = argv[argi++];
if (argc < argi+1)
{
fprintf(stderr, "No port number given\n");
- exit(1);
+ exit(90);
}
port = atoi(argv[argi++]);
if (sock < 0)
{
printf("socket creation failed: %s\n", strerror(errno));
- exit(1);
+ exit(89);
}
/* Bind to a specific interface if requested. On an IPv6 system, this has
if (inet_pton(AF_INET6, interface, &s_in6.sin6_addr) != 1)
{
printf("Unable to parse \"%s\"", interface);
- exit(1);
+ exit(88);
}
}
else
{
printf("Unable to bind outgoing SMTP call to %s: %s",
interface, strerror(errno));
- exit(1);
+ exit(87);
}
}
}
if (inet_pton(host_af, address, &s_in6.sin6_addr) != 1)
{
printf("Unable to parse \"%s\"", address);
- exit(1);
+ exit(86);
}
}
else
{
close(sock);
printf("failed: %s\n", strerror(save_errno));
- exit(1);
+ exit(85);
}
printf("connected\n");
if (ctx == NULL)
{
printf ("SSL_CTX_new failed\n");
- exit(1);
+ exit(84);
}
if (certfile != NULL)
if (!SSL_CTX_use_certificate_file(ctx, certfile, SSL_FILETYPE_PEM))
{
printf("SSL_CTX_use_certificate_file failed\n");
- exit(1);
+ exit(83);
}
printf("Certificate file = %s\n", certfile);
}
if (!SSL_CTX_use_PrivateKey_file(ctx, keyfile, SSL_FILETYPE_PEM))
{
printf("SSL_CTX_use_PrivateKey_file failed\n");
- exit(1);
+ exit(82);
}
printf("Key file = %s\n", keyfile);
}
if (keyfile != NULL) printf("Key file = %s\n", keyfile);
tls_init(certfile, keyfile);
tls_session = tls_session_init();
+#ifdef HAVE_OCSP
if (ocsp_stapling)
gnutls_ocsp_status_request_enable_client(tls_session, NULL, 0, NULL);
+#endif
gnutls_transport_set_ptr(tls_session, (gnutls_transport_ptr)sock);
/* When the server asks for a certificate and the client does not have one,
if (!tls_active)
printf("Failed to start TLS\n");
- #ifdef HAVE_GNUTLS
+ #if defined(HAVE_GNUTLS) && defined(HAVE_OCSP)
else if ( ocsp_stapling
&& gnutls_ocsp_status_request_is_checked(tls_session, 0) == 0)
printf("Failed to verify certificate status\n");
if (rc < 0)
{
printf("Read error %s\n", strerror(errno));
- exit(1) ;
+ exit(81) ;
}
else if (rc == 0)
{
printf("Unexpected EOF read\n");
close(sock);
- exit(1);
+ exit(80);
}
else
{
if (strncmp(lineptr, outbuffer + 4, (int)strlen(outbuffer) - 4) != 0)
{
printf("\n******** Input mismatch ********\n");
- exit(1);
+ exit(79);
}
#ifdef HAVE_TLS
printf("Bad certificate\n");
fflush(stdout);
}
+ #ifdef HAVE_OCSP
else if (gnutls_ocsp_status_request_is_checked(tls_session, 0) == 0)
{
printf("Failed to verify certificate status\n");
}
fflush(stdout);
}
+ #endif
}
#endif
else
{
printf("Unconsumed input: %s", inptr);
printf(" About to send: %s\n", outbuffer);
- exit(1);
+ exit(78);
}
#ifdef HAVE_TLS
if (!tls_active)
{
printf("STOPTLS read when TLS not active\n");
- exit(1);
+ exit(77);
}
printf("Shutting down TLS encryption\n");
if (rc < 0)
{
printf("GnuTLS write error: %s\n", gnutls_strerror(rc));
- exit(1);
+ exit(76);
}
#endif
}
if (rc < 0)
{
printf("Write error: %s\n", strerror(errno));
- exit(1);
+ exit(75);
}
}
}