Browse Source

client: do cleanup in one place (error and normal exit). This is possible now that all processing is done using jobs, and there are no error reporters enforcing
immediate cleanup with dead vars.

ambrop7 15 years ago
parent
commit
2fe3fbf8dc
1 changed files with 27 additions and 87 deletions
  1. 27 87
      client/client.c

+ 27 - 87
client/client.c

@@ -526,68 +526,9 @@ int main (int argc, char *argv[])
         goto fail10;
     }
     
-    goto event_loop;
-    
-    // cleanup on error
-fail10:
-    FrameDecider_Free(&frame_decider);
-fail7:
-    PacketPassFairQueue_Free(&device.output_queue);
-    SinglePacketBuffer_Free(&device.input_buffer);
-fail5a:
-    PacketPassInterface_Free(&device.input_interface);
-    BTap_Free(&device.btap);
-fail5:
-    if (options.transport_mode == TRANSPORT_MODE_TCP) {
-        while (num_listeners-- > 0) {
-            PasswordListener_Free(&listeners[num_listeners]);
-        }
-    }
-fail4a:
-    if (options.ssl) {
-        CERT_DestroyCertificate(client_cert);
-        SECKEY_DestroyPrivateKey(client_key);
-fail4:
-        SSL_ShutdownServerSessionIDCache();
-fail3:
-        SSL_ClearSessionCache();
-        ASSERT_FORCE(NSS_Shutdown() == SECSuccess)
-fail2:
-        ASSERT_FORCE(PR_Cleanup() == PR_SUCCESS)
-        PL_ArenaFinish();
-    }
-    BSignal_Finish();
-fail1b:
-    BReactor_Free(&ss);
-fail1:
-    BLog(BLOG_ERROR, "initialization failed");
-    BLog_Free();
-fail0:
-    // finish objects
-    DebugObjectGlobal_Finish();
-    return 1;
-    
-event_loop:
     // enter event loop
     BLog(BLOG_NOTICE, "entering event loop");
-    int ret = BReactor_Exec(&ss);
-    
-    // free reactor
-    BReactor_Free(&ss);
-    
-    // free logger
-    BLog(BLOG_NOTICE, "exiting");
-    BLog_Free();
-    
-    // finish objects
-    DebugObjectGlobal_Finish();
-    
-    return ret;
-}
-
-void terminate (void)
-{
-    BLog(BLOG_NOTICE, "tearing down");
+    BReactor_Exec(&ss);
     
     // allow freeing local receive flows
     PacketPassFairQueue_PrepareFree(&device.output_queue);
@@ -619,53 +560,52 @@ void terminate (void)
         peer_dealloc(peer);
     }
     
-    // free server
     ServerConnection_Free(&server);
-    
-    // free frame decider
+fail10:
     FrameDecider_Free(&frame_decider);
-    
-    // free device output
+fail7:
     PacketPassFairQueue_Free(&device.output_queue);
-    
-    // free device input
     SinglePacketBuffer_Free(&device.input_buffer);
+fail5a:
     PacketPassInterface_Free(&device.input_interface);
-    
-    // free device
     BTap_Free(&device.btap);
-    
-    // free listeners
+fail5:
     if (options.transport_mode == TRANSPORT_MODE_TCP) {
-        for (int i = num_bind_addrs - 1; i >= 0; i--) {
-            PasswordListener_Free(&listeners[i]);
+        while (num_listeners-- > 0) {
+            PasswordListener_Free(&listeners[num_listeners]);
         }
     }
-    
+fail4a:
     if (options.ssl) {
-        // free client certificate and private key
         CERT_DestroyCertificate(client_cert);
         SECKEY_DestroyPrivateKey(client_key);
-        
-        // free server cache
+fail4:
         ASSERT_FORCE(SSL_ShutdownServerSessionIDCache() == SECSuccess)
-        
-        // free client cache
+fail3:
         SSL_ClearSessionCache();
-        
-        // free NSS
         ASSERT_FORCE(NSS_Shutdown() == SECSuccess)
-        
-        // free NSPR
+fail2:
         ASSERT_FORCE(PR_Cleanup() == PR_SUCCESS)
         PL_ArenaFinish();
     }
-    
-    // remove signal handler
     BSignal_Finish();
+fail1b:
+    BReactor_Free(&ss);
+fail1:
+    BLog(BLOG_NOTICE, "exiting");
+    BLog_Free();
+fail0:
+    // finish objects
+    DebugObjectGlobal_Finish();
+    return 1;
+}
+
+void terminate (void)
+{
+    BLog(BLOG_NOTICE, "tearing down");
     
-    // exit reactor
-    BReactor_Quit(&ss, 1);
+    // exit event loop
+    BReactor_Quit(&ss, 0);
 }
 
 void print_help (const char *name)