]> ruderich.org/simon Gitweb - tlsproxy/tlsproxy.git/blobdiff - tests/client.c
Check library functions for success values.
[tlsproxy/tlsproxy.git] / tests / client.c
index 3f2dc4b66f7ccaddaaff185b23d59410e96ee5a7..2b7fb07465c41c05bc12992e5a5a751d08cb0949 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Simple GnuTLS client used for testing.
  *
- * Copyright (C) 2011  Simon Ruderich
+ * Copyright (C) 2011-2013  Simon Ruderich
  *
  * 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
 
 #include <config.h>
 
-#include <stdlib.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include <netdb.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
-/* socket(), connect() */
-#include <sys/types.h>
 #include <sys/socket.h>
-/* close() */
+#include <sys/types.h>
 #include <unistd.h>
-/* getaddrinfo() */
-#include <netdb.h>
-/* htons() */
-#include <arpa/inet.h>
-/* errno */
-#include <errno.h>
 
-/* GnuTLS */
 #include <gnutls/gnutls.h>
 #include <gnutls/x509.h>
 
@@ -59,9 +53,10 @@ int main (int argc, char *argv[]) {
     const gnutls_datum_t *cert_list;
     unsigned int cert_list_size;
 
-    if (5 != argc) {
+    if (argc != 5 && argc != 6) {
         fprintf(stderr,
-                "Usage: %s <ca-file> <hostname> <port> <hostname-verify>\n",
+                "Usage: %s <ca-file> <hostname> <port> <hostname-verify> "
+                          "[<digest-authentication>]\n",
                 argv[0]);
         return EXIT_FAILURE;
     }
@@ -77,32 +72,35 @@ int main (int argc, char *argv[]) {
     gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
 
     server = connect_to_host("localhost", "4711");
-    if (-1 == server) {
+    if (server == -1) {
         return EXIT_FAILURE;
     }
     fd = fdopen(server, "a+");
-    if (NULL == fd) {
+    if (fd == NULL) {
         perror("fdopen()");
         return EXIT_FAILURE;
     }
 
     /* Talk to tlsproxy. */
     fprintf(fd, "CONNECT %s:%s HTTP/1.0\r\n", argv[2], argv[3]);
+    if (argc == 6) {
+        fprintf(fd, "Proxy-Authorization: Basic %s\r\n", argv[5]);
+    }
     fprintf(fd, "\r\n");
     fflush(fd);
-    if (-1 == read_http_request(fd, buffer, sizeof(buffer))) {
+    if (read_http_request(fd, buffer, sizeof(buffer)) == -1) {
         fprintf(stderr, "invalid proxy response\n");
         return EXIT_FAILURE;
     }
 
     printf("response: %s\n", buffer);
 
-    if (1 != sscanf(buffer, "HTTP/1.0 %d", &response)) {
+    if (sscanf(buffer, "HTTP/1.0 %d", &response) != 1) {
         fprintf(stderr, "invalid proxy response: %s\n", buffer);
         return EXIT_FAILURE;
     }
 
-    if (200 != response) {
+    if (response != 200) {
         fprintf(stderr, "proxy failure\n");
         return EXIT_FAILURE;
     }
@@ -110,7 +108,7 @@ int main (int argc, char *argv[]) {
     gnutls_transport_set_ptr(session, (gnutls_transport_ptr_t)server);
 
     result = gnutls_handshake(session);
-    if (GNUTLS_E_SUCCESS != result) {
+    if (result != GNUTLS_E_SUCCESS) {
         fprintf(stderr, "gnutls_handshake() failed\n");
         gnutls_perror(result);
         return EXIT_FAILURE;
@@ -118,7 +116,7 @@ int main (int argc, char *argv[]) {
 
     /* Verify the proxy certificate. */
     result = gnutls_certificate_verify_peers2(session, &status);
-    if (0 > result) {
+    if (result < 0) {
         fprintf(stderr, "gnutls_certificate_verify_peers2() failed\n");
         gnutls_perror(result);
         return EXIT_FAILURE;
@@ -129,20 +127,20 @@ int main (int argc, char *argv[]) {
     }
 
     /* Get proxy certificate. */
-    if (0 > (result = gnutls_x509_crt_init(&cert))) {
+    if ((result = gnutls_x509_crt_init(&cert)) < 0) {
         fprintf(stderr, "gnutls_x509_crt_init() failed");
         gnutls_perror(result);
         return EXIT_FAILURE;
     }
 
     cert_list = gnutls_certificate_get_peers(session, &cert_list_size);
-    if (NULL == cert_list) {
+    if (cert_list == NULL) {
         fprintf(stderr, "gnutls_certificate_get_peers() failed");
         return EXIT_FAILURE;
     }
 
-    if (0 > (result = gnutls_x509_crt_import(cert, &cert_list[0],
-                                             GNUTLS_X509_FMT_DER))) {
+    if ((result = gnutls_x509_crt_import(cert, &cert_list[0],
+                                         GNUTLS_X509_FMT_DER)) < 0) {
         fprintf(stderr, "gnutls_x509_crt_import() failed");
         gnutls_perror(result);
         return EXIT_FAILURE;
@@ -151,6 +149,7 @@ int main (int argc, char *argv[]) {
     /* Check hostname. */
     if (!gnutls_x509_crt_check_hostname(cert, argv[4])) {
         fprintf(stderr, "hostname didn't match '%s'\n", argv[4]);
+        return EXIT_FAILURE;
     }
 
     gnutls_x509_crt_deinit(cert);
@@ -176,7 +175,7 @@ static int connect_to_host(const char *hostname, const char *port) {
     int server_socket;
     struct addrinfo *server;
 
-    if (NULL == hostname || NULL == port) {
+    if (hostname == NULL || port == NULL) {
         return -1;
     }
 
@@ -189,24 +188,28 @@ static int connect_to_host(const char *hostname, const char *port) {
                           | AI_ADDRCONFIG  /* supported by this computer */
                           | AI_V4MAPPED;   /* support IPv4 through IPv6 */
     gai_return = getaddrinfo(hostname, port, &gai_hints, &gai_result);
-    if (0 != gai_return) {
-        perror("connect_to_host(): getaddrinfo()");
+    if (gai_return != 0) {
+        if (gai_return == EAI_SYSTEM) {
+            perror("connect_to_host(): getaddrinfo()");
+        } else {
+            fprintf(stderr, "connect_to_host(): getaddrinfo(): %s",
+                            gai_strerror(gai_return));
+        }
         return -1;
     }
 
     /* Now try to connect to each server returned by getaddrinfo(), use the
      * first successful connect. */
-    for (server = gai_result; NULL != server; server = server->ai_next) {
+    for (server = gai_result; server != NULL; server = server->ai_next) {
         server_socket = socket(server->ai_family,
                                server->ai_socktype,
                                server->ai_protocol);
-        if (-1 == server_socket) {
+        if (server_socket < 0) {
             perror("connect_to_host(): socket(), trying next");
             continue;
         }
 
-        if (-1 != connect(server_socket, server->ai_addr,
-                                         server->ai_addrlen)) {
+        if (connect(server_socket, server->ai_addr, server->ai_addrlen) == 0) {
             break;
         }
         perror("connect_to_host(): connect(), trying next");
@@ -216,7 +219,7 @@ static int connect_to_host(const char *hostname, const char *port) {
     /* Make sure we free the result from getaddrinfo(). */
     freeaddrinfo(gai_result);
 
-    if (NULL == server) {
+    if (server == NULL) {
         perror("connect_to_host(): no server found, abort");
         return -1;
     }
@@ -227,18 +230,18 @@ static int connect_to_host(const char *hostname, const char *port) {
 static int read_http_request(FILE *client_fd, char *request, size_t length) {
     char buffer[MAX_REQUEST_LINE];
 
-    if (NULL == fgets(request, (int)length, client_fd)) {
+    if (fgets(request, (int)length, client_fd) == NULL) {
         if (ferror(client_fd)) {
             perror("read_http_request(): fgets()");
             return -1;
         }
-
+        /* EOF */
         return -2;
     }
 
-    while (NULL != fgets(buffer, MAX_REQUEST_LINE, client_fd)) {
+    while (fgets(buffer, sizeof(buffer), client_fd) != NULL) {
         /* End of header. */
-        if (0 == strcmp(buffer, "\n") || 0 == strcmp(buffer, "\r\n")) {
+        if (!strcmp(buffer, "\n") || !strcmp(buffer, "\r\n")) {
             break;
         }
     }