Add an option to reconnect in ssl_client2

Purpose: test resuming sessions.
diff --git a/programs/ssl/ssl_client2.c b/programs/ssl/ssl_client2.c
index 05dfdc7..e8d3820 100644
--- a/programs/ssl/ssl_client2.c
+++ b/programs/ssl/ssl_client2.c
@@ -59,6 +59,7 @@
 #define DFL_AUTH_MODE           SSL_VERIFY_OPTIONAL
 #define DFL_MFL_CODE            SSL_MAX_FRAG_LEN_NONE
 #define DFL_TRUNC_HMAC          0
+#define DFL_RECONNECT           0
 
 #define LONG_HEADER "User-agent: blah-blah-blah-blah-blah-blah-blah-blah-"   \
     "-01--blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-" \
@@ -96,6 +97,7 @@
     int auth_mode;              /* verify mode for connection               */
     unsigned char mfl_code;     /* code for maximum fragment length         */
     int trunc_hmac;             /* negotiate truncated hmac or not          */
+    int reconnect;              /* attempt to resume session                */
 } opt;
 
 static void my_debug( void *ctx, int level, const char *str )
@@ -184,6 +186,7 @@
     "    request_page=%%s     default: \".\"\n"             \
     "    renegotiation=%%d    default: 1 (enabled)\n"       \
     "    allow_legacy=%%d     default: 0 (disabled)\n"      \
+    "    reconnect=%%d        default: 0 (disabled)\n"      \
     "\n"                                                    \
     "    min_version=%%s      default: \"\" (ssl3)\n"       \
     "    max_version=%%s      default: \"\" (tls1_2)\n"     \
@@ -226,6 +229,7 @@
     entropy_context entropy;
     ctr_drbg_context ctr_drbg;
     ssl_context ssl;
+    ssl_session saved_session;
 #if defined(POLARSSL_X509_PARSE_C)
     x509_cert cacert;
     x509_cert clicert;
@@ -239,6 +243,7 @@
      */
     server_fd = 0;
     memset( &ssl, 0, sizeof( ssl_context ) );
+    memset( &saved_session, 0, sizeof( ssl_session ) );
 #if defined(POLARSSL_X509_PARSE_C)
     memset( &cacert, 0, sizeof( x509_cert ) );
     memset( &clicert, 0, sizeof( x509_cert ) );
@@ -285,6 +290,7 @@
     opt.auth_mode           = DFL_AUTH_MODE;
     opt.mfl_code            = DFL_MFL_CODE;
     opt.trunc_hmac          = DFL_TRUNC_HMAC;
+    opt.reconnect           = DFL_RECONNECT;
 
     for( i = 1; i < argc; i++ )
     {
@@ -345,6 +351,12 @@
             if( opt.allow_legacy < 0 || opt.allow_legacy > 1 )
                 goto usage;
         }
+        else if( strcmp( p, "reconnect" ) == 0 )
+        {
+            opt.reconnect = atoi( q );
+            if( opt.reconnect < 0 || opt.reconnect > 1 )
+                goto usage;
+        }
         else if( strcmp( p, "min_version" ) == 0 )
         {
             if( strcmp( q, "ssl3" ) == 0 )
@@ -693,6 +705,20 @@
     printf( " ok\n    [ Ciphersuite is %s ]\n",
             ssl_get_ciphersuite( &ssl ) );
 
+    if( opt.reconnect != 0 )
+    {
+        printf("  . Saving session for reuse..." );
+        fflush( stdout );
+
+        if( ( ret = ssl_get_session( &ssl, &saved_session ) ) != 0 )
+        {
+            printf( " failed\n  ! ssl_get_session returned -0x%x\n\n", -ret );
+            goto exit;
+        }
+
+        printf( " ok\n" );
+    }
+
 #if defined(POLARSSL_X509_PARSE_C)
     /*
      * 5. Verify the server certificate
@@ -732,6 +758,7 @@
     /*
      * 6. Write the GET request
      */
+send_request:
     printf( "  > Write to server:" );
     fflush( stdout );
 
@@ -789,6 +816,43 @@
 
     ssl_close_notify( &ssl );
 
+    if( opt.reconnect != 0 )
+    {
+        opt.reconnect = 0;
+
+        printf( "  . Reconnecting with saved session..." );
+        fflush( stdout );
+
+        if( ( ret = ssl_session_reset( &ssl ) ) != 0 )
+        {
+            printf( " failed\n  ! ssl_session_reset returned -0x%x\n\n", -ret );
+            goto exit;
+        }
+
+        ssl_set_session( &ssl, &saved_session );
+
+        if( ( ret = net_connect( &server_fd, opt.server_name,
+                        opt.server_port ) ) != 0 )
+        {
+            printf( " failed\n  ! net_connect returned -0x%x\n\n", -ret );
+            goto exit;
+        }
+
+        while( ( ret = ssl_handshake( &ssl ) ) != 0 )
+        {
+            if( ret != POLARSSL_ERR_NET_WANT_READ &&
+                ret != POLARSSL_ERR_NET_WANT_WRITE )
+            {
+                printf( " failed\n  ! ssl_handshake returned -0x%x\n\n", -ret );
+                goto exit;
+            }
+        }
+
+        printf( " ok\n" );
+
+        goto send_request;
+    }
+
 exit:
 
 #ifdef POLARSSL_ERROR_C