#include "setup.h"
#include <curl/curl.h>
#include "rawstr.h"
#define ENABLE_CURLX_PRINTF
#include "curlx.h"
#include "tool_cfgable.h"
#include "tool_convert.h"
#include "tool_operhlp.h"
#include "tool_version.h"
#include "memdebug.h"
char *my_useragent(void)
{
char useragent[256];
snprintf(useragent, sizeof(useragent),
CURL_NAME "/" CURL_VERSION " (" OS ") " "%s", curl_version());
return strdup(useragent);
}
void list_engines(const struct curl_slist *engines)
{
puts("Build-time engines:");
if(!engines) {
puts(" <none>");
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;
if(checkprefix("http://", url) || checkprefix("https://", url))
return TRUE;
return FALSE;
}
bool stdin_upload(const char *uploadfile)
{
return (curlx_strequal(uploadfile, "-") ||
curlx_strequal(uploadfile, ".")) ? TRUE : FALSE;
}
char *add_file_name_to_url(CURL *curl, char *url, const char *filename)
{
char *ptr = strstr(url, "://");
if(ptr)
ptr += 3;
else
ptr = url;
ptr = strrchr(ptr, '/');
if(!ptr || !strlen(++ptr)) {
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;
encfile = curl_easy_escape(curl, filep, 0 );
if(encfile) {
char *urlbuffer = malloc(strlen(url) + strlen(encfile) + 3);
if(!urlbuffer) {
curl_free(encfile);
Curl_safefree(url);
return NULL;
}
if(ptr)
sprintf(urlbuffer, "%s%s", url, encfile);
else
sprintf(urlbuffer, "%s/%s", url, encfile);
curl_free(encfile);
Curl_safefree(url);
url = urlbuffer;
}
}
return url;
}
CURLcode get_url_file_name(char **filename, const char *url)
{
const char *pc;
*filename = NULL;
pc = strstr(url, "://");
if(pc)
pc += 3;
else
pc = url;
pc = strrchr(pc, '/');
if(pc) {
pc++;
if(*pc) {
*filename = strdup(pc);
if(!*filename)
return CURLE_OUT_OF_MEMORY;
}
}
#ifdef DEBUGBUILD
{
char *tdir = curlx_getenv("CURL_TESTDIR");
if(tdir) {
char buffer[512];
snprintf(buffer, sizeof(buffer), "%s/%s", tdir, *filename);
Curl_safefree(*filename);
*filename = strdup(buffer);
curl_free(tdir);
}
}
#endif
return CURLE_OK;
}
CURLcode main_init(void)
{
#if defined(__DJGPP__) || defined(__GO32__)
_djstat_flags |= _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
#endif
return curl_global_init(CURL_GLOBAL_DEFAULT);
}
void main_free(void)
{
curl_global_cleanup();
convert_cleanup();
}
#ifdef CURLDEBUG
void memory_tracking_init(void)
{
char *env;
env = curlx_getenv("CURL_MEMDEBUG");
if(env) {
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);
}
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