diff --git a/src/tool_main.c b/src/tool_main.c
index 5682bd78e976bd4e02402a8db967698b544dd273..ba9b518e1c47e333e67df7612747c4dfaf8105bd 100644
--- a/src/tool_main.c
+++ b/src/tool_main.c
@@ -115,6 +115,32 @@ static void memory_tracking_init(void)
 #  define memory_tracking_init() Curl_nop_stmt
 #endif
 
+/*
+ * This is the main global constructor for the app. Call this before
+ * _any_ libcurl usage. If this fails, *NO* libcurl functions may be
+ * used, or havoc may be the result.
+ */
+static CURLcode main_init(void)
+{
+#if defined(__DJGPP__) || defined(__GO32__)
+  /* stop stat() wasting time */
+  _djstat_flags |= _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
+#endif
+
+  return curl_global_init(CURL_GLOBAL_DEFAULT);
+}
+
+/*
+ * This is the main global destructor for the app. Call this after
+ * _all_ libcurl usage is done.
+ */
+static void main_free(void)
+{
+  curl_global_cleanup();
+  convert_cleanup();
+  metalink_cleanup();
+}
+
 /*
 ** curl tool main function.
 */
@@ -139,8 +165,19 @@ int main(int argc, char *argv[])
     /* Initialise the config */
     init_config(config);
 
-    /* Start our curl operation */
-    res = operate(config, argc, argv);
+    /* Initialize the curl library - do not call any libcurl functions before
+       this point */
+    if(!main_init()) {
+      /* Start our curl operation */
+      res = operate(config, argc, argv);
+
+      /* Perform the main cleanup */
+      main_free();
+    }
+    else {
+      helpf(config->errors, "error initializing curl library\n");
+      res = CURLE_FAILED_INIT;
+    }
 
 #ifdef __SYMBIAN32__
     if(config->showerror)
diff --git a/src/tool_operate.c b/src/tool_operate.c
index c3ccfe7f19ffb6640ef50b99ab4a9c4b51623edb..ce7bceea618e6248619a21c9dfa867c60194d89a 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -214,19 +214,9 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
   heads.stream = stdout;
   heads.config = config;
 
-  /*
-  ** Initialize curl library - do not call any libcurl functions before
-  ** this point.
-  */
-  if(main_init() != CURLE_OK) {
-    helpf(config->errors, "error initializing curl library\n");
-    return CURLE_FAILED_INIT;
-  }
-
   /* Get libcurl info right away */
   if(get_libcurl_info() != CURLE_OK) {
     helpf(config->errors, "error retrieving curl library information\n");
-    main_free();
     return CURLE_FAILED_INIT;
   }
 
@@ -234,7 +224,6 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
   curl = curl_easy_init();
   if(!curl) {
     helpf(config->errors, "error initializing curl easy handle\n");
-    main_free();
     return CURLE_FAILED_INIT;
   }
   config->easy = curl;
@@ -1892,7 +1881,5 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
   /* Release metalink related resources here */
   clean_metalink(config);
 
-  main_free(); /* cleanup */
-
   return res;
 }
diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c
index b8c0a2971009413667141e4741889baf8a0312fc..a9dab9b8008818c69f9f614e44c4253661e678d9 100644
--- a/src/tool_operhlp.c
+++ b/src/tool_operhlp.c
@@ -193,29 +193,3 @@ CURLcode get_url_file_name(char **filename, const char *url)
   return CURLE_OK;
 }
 
-/*
- * This is the main global constructor for the app. Call this before
- * _any_ libcurl usage. If this fails, *NO* libcurl functions may be
- * used, or havoc may be the result.
- */
-CURLcode main_init(void)
-{
-#if defined(__DJGPP__) || defined(__GO32__)
-  /* stop stat() wasting time */
-  _djstat_flags |= _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
-#endif
-
-  return curl_global_init(CURL_GLOBAL_DEFAULT);
-}
-
-/*
- * This is the main global destructor for the app. Call this after
- * _all_ libcurl usage is done.
- */
-void main_free(void)
-{
-  curl_global_cleanup();
-  convert_cleanup();
-  metalink_cleanup();
-}
-
diff --git a/src/tool_operhlp.h b/src/tool_operhlp.h
index c2365c88f8cf79792335c0099f21e1dbd854dc49..7ca12362b28a5b375459c40df1f61952804ced25 100644
--- a/src/tool_operhlp.h
+++ b/src/tool_operhlp.h
@@ -37,9 +37,5 @@ char *add_file_name_to_url(CURL *curl, char *url, const char *filename);
 
 CURLcode get_url_file_name(char **filename, const char *url);
 
-CURLcode main_init(void);
-
-void main_free(void);
-
 #endif /* HEADER_CURL_TOOL_OPERHLP_H */