Revert "Update to 7.40.1"
[platform/upstream/curl.git] / src / tool_main.c
index 093969f..8c8acc6 100644 (file)
 #include <signal.h>
 #endif
 
+#ifdef USE_NSS
+#include <nspr.h>
+#include <plarenas.h>
+#endif
+
 #define ENABLE_CURLX_PRINTF
 /* use our own printf() functions */
 #include "curlx.h"
@@ -130,8 +135,12 @@ static CURLcode main_init(struct GlobalConfig *config)
   _djstat_flags |= _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
 #endif
 
+  /* Initialise the global config */
+  config->showerror = -1;             /* Will show errors */
+  config->errors = stderr;            /* Default errors to stderr */
+
   /* Allocate the initial operate config */
-  config->first = malloc(sizeof(struct OperationConfig));
+  config->first = config->last = malloc(sizeof(struct OperationConfig));
   if(config->first) {
     /* Perform the libcurl initialization */
     result = curl_global_init(CURL_GLOBAL_DEFAULT);
@@ -140,14 +149,29 @@ static CURLcode main_init(struct GlobalConfig *config)
       result = get_libcurl_info();
 
       if(!result) {
-        /* Initialise the config */
-        config_init(config->first);
+        /* Get a curl handle to use for all forthcoming curl transfers */
+        config->easy = curl_easy_init();
+        if(config->easy) {
+          /* Initialise the config */
+          config_init(config->first);
+          config->first->easy = config->easy;
+          config->first->global = config;
+        }
+        else {
+          helpf(stderr, "error initializing curl easy handle\n");
+          result = CURLE_FAILED_INIT;
+          free(config->first);
+        }
       }
-      else
+      else {
         helpf(stderr, "error retrieving curl library information\n");
+        free(config->first);
+      }
     }
-    else
+    else {
       helpf(stderr, "error initializing curl library\n");
+      free(config->first);
+    }
   }
   else {
     helpf(stderr, "error initializing curl\n");
@@ -157,15 +181,49 @@ static CURLcode main_init(struct GlobalConfig *config)
   return result;
 }
 
+static void free_config_fields(struct GlobalConfig *config)
+{
+  Curl_safefree(config->trace_dump);
+
+  if(config->errors_fopened && config->errors)
+    fclose(config->errors);
+  config->errors = NULL;
+
+  if(config->trace_fopened && config->trace_stream)
+    fclose(config->trace_stream);
+  config->trace_stream = NULL;
+
+  Curl_safefree(config->libcurl);
+}
+
 /*
  * This is the main global destructor for the app. Call this after
  * _all_ libcurl usage is done.
  */
-static void main_free(void)
+static void main_free(struct GlobalConfig *config)
 {
+  /* Cleanup the easy handle */
+  curl_easy_cleanup(config->easy);
+  config->easy = NULL;
+
+  /* Main cleanup */
   curl_global_cleanup();
   convert_cleanup();
   metalink_cleanup();
+#ifdef USE_NSS
+  if(PR_Initialized()) {
+    /* prevent valgrind from reporting still reachable mem from NSRP arenas */
+    PL_ArenaFinish();
+    /* prevent valgrind from reporting possibly lost memory (fd cache, ...) */
+    PR_Cleanup();
+  }
+#endif
+  free_config_fields(config);
+
+  /* Free the config structures */
+  config_free(config->last);
+  config->first = NULL;
+  config->last = NULL;
 }
 
 /*
@@ -191,21 +249,15 @@ int main(int argc, char *argv[])
   result = main_init(&global);
   if(!result) {
     /* Start our curl operation */
-    result = operate(global.first, argc, argv);
+    result = operate(&global, argc, argv);
 
-    /* Perform the main cleanup */
-    main_free();
-  }
-
-  if(global.first) {
 #ifdef __SYMBIAN32__
-    if(global->first->showerror)
+    if(global.showerror)
       tool_pressanykey();
 #endif
 
-    /* Free the config structures */
-    config_free(global.first);
-    global.first = NULL;
+    /* Perform the main cleanup */
+    main_free(&global);
   }
 
 #ifdef __NOVELL_LIBC__