From 49b79b76316248d5233d08006234933913faaa3b Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Wed, 5 Oct 2011 00:03:20 +0200 Subject: curl tool: code moved to tool_*.[ch] files --- src/tool_operhlp.c | 231 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 src/tool_operhlp.c (limited to 'src/tool_operhlp.c') diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c new file mode 100644 index 000000000..1a72035f7 --- /dev/null +++ b/src/tool_operhlp.c @@ -0,0 +1,231 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "setup.h" + +#include + +#include "rawstr.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "version.h" + +#include "tool_cfgable.h" +#include "tool_convert.h" +#include "tool_operhlp.h" + +#include "memdebug.h" /* keep this as LAST include */ + +/* + * my_useragent: returns allocated string with default user agent + */ +char *my_useragent(void) +{ + char useragent[256]; /* we don't want a larger default user agent */ + + snprintf(useragent, sizeof(useragent), + CURL_NAME "/" CURL_VERSION " (" OS ") " "%s", curl_version()); + + return strdup(useragent); +} + +/* + * Print list of OpenSSL supported engines + */ +void list_engines(const struct curl_slist *engines) +{ + puts("Build-time engines:"); + if(!engines) { + puts(" "); + return; + } + for(; engines; engines = engines->next) + printf(" %s\n", engines->data); +} + +void clean_getout(struct Configurable *config) +{ + struct getout *next; + struct getout *node = config->url_list; + + while(node) { + next = node->next; + Curl_safefree(node->url); + Curl_safefree(node->outfile); + Curl_safefree(node->infile); + Curl_safefree(node); + node = next; + } + config->url_list = NULL; +} + +bool output_expected(const char *url, const char *uploadfile) +{ + if(!uploadfile) + return TRUE; /* download */ + if(checkprefix("http://", url) || checkprefix("https://", url)) + return TRUE; /* HTTP(S) upload */ + + return FALSE; /* non-HTTP upload, probably no output should be expected */ +} + +bool stdin_upload(const char *uploadfile) +{ + return (curlx_strequal(uploadfile, "-") || + curlx_strequal(uploadfile, ".")) ? TRUE : FALSE; +} + +/* + * Adds the file name to the URL if it doesn't already have one. + * url will be freed before return if the returned pointer is different + */ +char *add_file_name_to_url(CURL *curl, char *url, const char *filename) +{ + /* If no file name part is given in the URL, we add this file name */ + char *ptr = strstr(url, "://"); + if(ptr) + ptr += 3; + else + ptr = url; + ptr = strrchr(ptr, '/'); + if(!ptr || !strlen(++ptr)) { + /* The URL has no file name part, add the local file name. In order + to be able to do so, we have to create a new URL in another + buffer.*/ + + /* We only want the part of the local path that is on the right + side of the rightmost slash and backslash. */ + const char *filep = strrchr(filename, '/'); + char *file2 = strrchr(filep?filep:filename, '\\'); + char *encfile; + + if(file2) + filep = file2 + 1; + else if(filep) + filep++; + else + filep = filename; + + /* URL encode the file name */ + encfile = curl_easy_escape(curl, filep, 0 /* use strlen */); + if(encfile) { + char *urlbuffer = malloc(strlen(url) + strlen(encfile) + 3); + if(!urlbuffer) { + Curl_safefree(url); + return NULL; + } + if(ptr) + /* there is a trailing slash on the URL */ + sprintf(urlbuffer, "%s%s", url, encfile); + else + /* there is no trailing slash on the URL */ + sprintf(urlbuffer, "%s/%s", url, encfile); + + curl_free(encfile); + + Curl_safefree(url); + url = urlbuffer; /* use our new URL instead! */ + } + } + return url; +} + +/* Extracts the name portion of the URL. + * Returns a heap-allocated string, or NULL if no name part + */ +char *get_url_file_name(const char *url) +{ + char *fn = NULL; + + /* Find and get the remote file name */ + const char *pc = strstr(url, "://"); + if(pc) + pc += 3; + else + pc = url; + pc = strrchr(pc, '/'); + + if(pc) { + /* duplicate the string beyond the slash */ + pc++; + fn = *pc ? strdup(pc): NULL; + } + return fn; +} + +/* + * 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(); +} + +#ifdef CURLDEBUG +void memory_tracking_init(void) +{ + char *env; + /* if CURL_MEMDEBUG is set, this starts memory tracking message logging */ + env = curlx_getenv("CURL_MEMDEBUG"); + if(env) { + /* use the value as file name */ + char fname[CURL_MT_LOGFNAME_BUFSIZE]; + if(strlen(env) >= CURL_MT_LOGFNAME_BUFSIZE) + env[CURL_MT_LOGFNAME_BUFSIZE-1] = '\0'; + strcpy(fname, env); + curl_free(env); + curl_memdebug(fname); + /* this weird stuff here is to make curl_free() get called + before curl_memdebug() as otherwise memory tracking will + log a free() without an alloc! */ + } + /* if CURL_MEMLIMIT is set, this enables fail-on-alloc-number-N feature */ + env = curlx_getenv("CURL_MEMLIMIT"); + if(env) { + char *endptr; + long num = strtol(env, &endptr, 10); + if((endptr != env) && (endptr == env + strlen(env)) && (num > 0)) + curl_memlimit(num); + curl_free(env); + } +} +#endif + -- cgit v1.2.1 From 5bf0d74120a92fb834b0d13098c0b5e93249a84f Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Wed, 5 Oct 2011 15:06:26 +0200 Subject: curl tool: OOM handling fixes --- src/tool_operhlp.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'src/tool_operhlp.c') diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c index 1a72035f7..5a6a670f9 100644 --- a/src/tool_operhlp.c +++ b/src/tool_operhlp.c @@ -152,14 +152,17 @@ char *add_file_name_to_url(CURL *curl, char *url, const char *filename) } /* Extracts the name portion of the URL. - * Returns a heap-allocated string, or NULL if no name part + * Returns a pointer to a heap-allocated string or NULL if + * no name part, at location indicated by first argument. */ -char *get_url_file_name(const char *url) +CURLcode get_url_file_name(char **filename, const char *url) { - char *fn = NULL; + const char *pc; + + *filename = NULL; /* Find and get the remote file name */ - const char *pc = strstr(url, "://"); + pc = strstr(url, "://"); if(pc) pc += 3; else @@ -169,9 +172,13 @@ char *get_url_file_name(const char *url) if(pc) { /* duplicate the string beyond the slash */ pc++; - fn = *pc ? strdup(pc): NULL; + if(*pc) { + *filename = strdup(pc); + if(!*filename) + return CURLE_OUT_OF_MEMORY; + } } - return fn; + return CURLE_OK; } /* -- cgit v1.2.1 From ec73fd89ed5b526548e61527037e1603234333a0 Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Wed, 5 Oct 2011 16:41:04 +0200 Subject: curl tool: OOM handling fixes --- src/tool_operhlp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/tool_operhlp.c') diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c index 5a6a670f9..d7dbe13c1 100644 --- a/src/tool_operhlp.c +++ b/src/tool_operhlp.c @@ -132,6 +132,7 @@ char *add_file_name_to_url(CURL *curl, char *url, const char *filename) if(encfile) { char *urlbuffer = malloc(strlen(url) + strlen(encfile) + 3); if(!urlbuffer) { + curl_free(encfile); Curl_safefree(url); return NULL; } @@ -143,8 +144,8 @@ char *add_file_name_to_url(CURL *curl, char *url, const char *filename) sprintf(urlbuffer, "%s/%s", url, encfile); curl_free(encfile); - Curl_safefree(url); + url = urlbuffer; /* use our new URL instead! */ } } -- cgit v1.2.1 From f7bfdbabf2d5398f4c266eabb0992a04af661f22 Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Thu, 6 Oct 2011 17:39:00 +0200 Subject: curl tool: reviewed code moved to tool_*.[ch] files --- src/tool_operhlp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/tool_operhlp.c') diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c index d7dbe13c1..808d2d564 100644 --- a/src/tool_operhlp.c +++ b/src/tool_operhlp.c @@ -29,11 +29,10 @@ /* use our own printf() functions */ #include "curlx.h" -#include "version.h" - #include "tool_cfgable.h" #include "tool_convert.h" #include "tool_operhlp.h" +#include "tool_version.h" #include "memdebug.h" /* keep this as LAST include */ -- cgit v1.2.1 From c532604b137cae2e2814280778f914e4cd0460d1 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Sun, 20 Nov 2011 23:33:46 +0100 Subject: -J -O: use -O name if no Content-Disposition header comes! A regression between 7.22.0 and 7.23.0 -- downloading a file with the flags -O and -J results in the content being written to stdout if and only if there was no Content-Disposition header in the http response. If there is a C-D header with a filename attribute, the output is correctly written. Reported by: Dave Reisner Bug: http://curl.haxx.se/mail/archive-2011-11/0030.html --- src/tool_operhlp.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/tool_operhlp.c') diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c index 808d2d564..4c1697b20 100644 --- a/src/tool_operhlp.c +++ b/src/tool_operhlp.c @@ -178,6 +178,24 @@ CURLcode get_url_file_name(char **filename, const char *url) return CURLE_OUT_OF_MEMORY; } } + + /* in case we built debug enabled, we allow an environment variable + * named CURL_TESTDIR to prefix the given file name to put it into a + * specific directory + */ +#ifdef DEBUGBUILD + { + char *tdir = curlx_getenv("CURL_TESTDIR"); + if(tdir) { + char buffer[512]; /* suitably large */ + snprintf(buffer, sizeof(buffer), "%s/%s", tdir, *filename); + Curl_safefree(*filename); + *filename = strdup(buffer); /* clone the buffer */ + curl_free(tdir); + } + } +#endif + return CURLE_OK; } -- cgit v1.2.1 From 919c97fa65a5c00f7044e849eeb0095408413505 Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Fri, 6 Apr 2012 23:35:15 +0200 Subject: curl tool: use configuration files from lib directory Configuration files such as curl_config.h and all config-*.h no longer exist nor are generated/copied into 'src' directory, now these only exist in 'lib' directory from where curl tool sources uses them. Additionally old src/setup.h has been refactored into src/tool_setup.h which now pulls lib/setup.h The possibility of a makefile needing an include path adjustment exists. --- src/tool_operhlp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/tool_operhlp.c') diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c index 4c1697b20..8b31f54aa 100644 --- a/src/tool_operhlp.c +++ b/src/tool_operhlp.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -19,7 +19,7 @@ * KIND, either express or implied. * ***************************************************************************/ -#include "setup.h" +#include "tool_setup.h" #include -- cgit v1.2.1 From 01b0f1061da2bd7a8703f4c8aa846a9088d7ab3e Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Sun, 8 Apr 2012 13:50:18 +0200 Subject: curl tool: make curl.h first header included in tool_setup.h --- src/tool_operhlp.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/tool_operhlp.c') diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c index 8b31f54aa..7a98e350b 100644 --- a/src/tool_operhlp.c +++ b/src/tool_operhlp.c @@ -21,8 +21,6 @@ ***************************************************************************/ #include "tool_setup.h" -#include - #include "rawstr.h" #define ENABLE_CURLX_PRINTF -- cgit v1.2.1 From e7257dcf2eac075126999fed380f4015022c17b2 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Sat, 12 May 2012 15:07:07 +0200 Subject: my_useragent: shorten user-agent The built-in user-agent will now only say curl/[version] and nothing else in an attempt to decrease overhead in HTTP requests. --- src/tool_operhlp.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'src/tool_operhlp.c') diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c index 7a98e350b..e45f102f5 100644 --- a/src/tool_operhlp.c +++ b/src/tool_operhlp.c @@ -39,12 +39,7 @@ */ char *my_useragent(void) { - char useragent[256]; /* we don't want a larger default user agent */ - - snprintf(useragent, sizeof(useragent), - CURL_NAME "/" CURL_VERSION " (" OS ") " "%s", curl_version()); - - return strdup(useragent); + return strdup( CURL_NAME "/" CURL_VERSION ); } /* -- cgit v1.2.1 From cf75a64651e927eb00d6cfe2434d8893985a865f Mon Sep 17 00:00:00 2001 From: Kamil Dudka Date: Wed, 31 Oct 2012 10:43:36 +0100 Subject: tool_metalink: introduce metalink_cleanup() in the internal API ... to release resources allocated at global scope --- src/tool_operhlp.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/tool_operhlp.c') diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c index e45f102f5..9078b9564 100644 --- a/src/tool_operhlp.c +++ b/src/tool_operhlp.c @@ -32,6 +32,11 @@ #include "tool_operhlp.h" #include "tool_version.h" +#ifdef USE_METALINK +/* import the declaration of metalink_cleanup() */ +# include "tool_metalink.h" +#endif + #include "memdebug.h" /* keep this as LAST include */ /* @@ -215,6 +220,9 @@ void main_free(void) { curl_global_cleanup(); convert_cleanup(); +#ifdef USE_METALINK + metalink_cleanup(); +#endif } #ifdef CURLDEBUG -- cgit v1.2.1