summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick White <git@njw.me.uk>2008-05-08 16:23:17 +0100
committerNick White <git@njw.me.uk>2008-05-08 16:23:17 +0100
commitfe92b3a849126f0bdc4469c236caafae28dceab8 (patch)
tree7a4e116c8b1a1039f45c8f7d12680b27be6c1a7c
parent3270ba5e383587e38ff7b4e8bb7f5d4cf7813766 (diff)
Switched to using config structure from global variables
-rw-r--r--src/config.c90
-rw-r--r--src/download.c110
-rw-r--r--src/getht.c82
-rw-r--r--src/getht.h20
4 files changed, 141 insertions, 161 deletions
diff --git a/src/config.c b/src/config.c
index e89bc94..1f02b4b 100644
--- a/src/config.c
+++ b/src/config.c
@@ -25,22 +25,14 @@
#include <curl/curl.h>
-extern int proxy_type;
-extern char proxy_addr[STR_MAX];
-extern long proxy_port;
-extern int proxy_auth;
-extern char proxy_user[STR_MAX];
-extern char proxy_pass[STR_MAX];
-extern char issue_uri[STR_MAX];
-
-int loadconfig(char * htde_path, char * save_path, int * update)
+int loadconfig(char * getht_path, struct config * options)
/* Loads variables from config file to extern and passed
* variables. */
{
FILE * config_file;
char filepath[STR_MAX];
- snprintf(filepath, STR_MAX, "%s/config.ini", htde_path);
+ snprintf(filepath, STR_MAX, "%s/config.ini", getht_path);
if((config_file = fopen(filepath,"r")) == NULL)
{
@@ -55,45 +47,45 @@ int loadconfig(char * htde_path, char * save_path, int * update)
if(option[0] == '#'); /* ignore lines beginning with a hash */
else if(!strcmp(option, "savepath"))
- strncpy(save_path, parameter, STR_MAX);
+ strncpy(options->save_path, parameter, STR_MAX);
else if(!strcmp(option, "startup_check"))
- *update = atoi(parameter);
+ options->startup_check = atoi(parameter);
else if(!strcmp(option, "toc_uri"))
- strncpy(issue_uri, parameter, STR_MAX);
+ strncpy(options->issue_uri, parameter, STR_MAX);
else if(!strcmp(option, "proxy_type"))
{
if(!strcmp(parameter, "http"))
- proxy_type = CURLPROXY_HTTP;
+ options->proxy.type = CURLPROXY_HTTP;
else if(!strcmp(parameter, "socks4"))
- proxy_type = CURLPROXY_SOCKS4;
+ options->proxy.type = CURLPROXY_SOCKS4;
else if(!strcmp(parameter, "socks5"))
- proxy_type = CURLPROXY_SOCKS5;
+ options->proxy.type = CURLPROXY_SOCKS5;
else
fprintf(stderr,
"Proxy type %s not known, please use either http, socks4 or socks5\n",
parameter);
}
else if(!strcmp(option, "proxy_address"))
- strncpy(proxy_addr, parameter, STR_MAX);
+ strncpy(options->proxy.address, parameter, STR_MAX);
else if(!strcmp(option, "proxy_port"))
- proxy_port = (long) atoi(parameter);
+ options->proxy.port = (long) atoi(parameter);
else if(!strcmp(option, "proxy_auth"))
{
if(!strcmp(parameter, "basic"))
- proxy_auth = CURLAUTH_BASIC;
+ options->proxy.auth = CURLAUTH_BASIC;
else if(!strcmp(parameter, "digest"))
- proxy_auth = CURLAUTH_DIGEST;
+ options->proxy.auth = CURLAUTH_DIGEST;
else if(!strcmp(parameter, "ntlm"))
- proxy_auth = CURLAUTH_NTLM;
+ options->proxy.auth = CURLAUTH_NTLM;
else
fprintf(stderr,
"Proxy authentication method %s not known, please use basic, digest or ntlm",
parameter);
}
else if(!strcmp(option, "proxy_user"))
- strncpy(proxy_user, parameter, STR_MAX);
+ strncpy(options->proxy.user, parameter, STR_MAX);
else if(!strcmp(option, "proxy_pass"))
- strncpy(proxy_pass, parameter, STR_MAX);
+ strncpy(options->proxy.pass, parameter, STR_MAX);
else
fprintf(stderr, "Option '%s' not recognised, ignoring\n", option);
}
@@ -101,13 +93,13 @@ int loadconfig(char * htde_path, char * save_path, int * update)
return 0;
}
-int writefreshconfig(char * htde_path, char * save_path, int * update)
+int writefreshconfig(char * getht_path, struct config * options)
/* Write a new config file according to extern and passed variables. */
{
FILE * config_file;
char filepath[STR_MAX];
- snprintf(filepath, STR_MAX, "%s/config.ini", htde_path);
+ snprintf(filepath, STR_MAX, "%s/config.ini", getht_path);
if((config_file = fopen(filepath,"w")) == NULL)
{
@@ -117,50 +109,50 @@ int writefreshconfig(char * htde_path, char * save_path, int * update)
else
fprintf(stdout,"Writing a fresh config file to %s.\n",filepath);
- if(save_path[0])
- fprintf(config_file, "%s = %s\n", "savepath", save_path);
- if(update)
- fprintf(config_file, "%s = %i\n", "startup_check", *update);
- if(issue_uri[0])
- fprintf(config_file, "%s = %s\n", "toc_uri", issue_uri);
- if(proxy_type)
+ if(options->save_path[0])
+ fprintf(config_file, "%s = %s\n", "savepath", options->save_path);
+ if(options->startup_check)
+ fprintf(config_file, "%s = %i\n", "startup_check", options->startup_check);
+ if(options->issue_uri[0])
+ fprintf(config_file, "%s = %s\n", "toc_uri", options->issue_uri);
+ if(options->proxy.type)
{
- if(proxy_type == CURLPROXY_HTTP)
+ if(options->proxy.type == CURLPROXY_HTTP)
fprintf(config_file, "%s = %s\n", "proxy_type", "http");
- else if(proxy_type == CURLPROXY_SOCKS4)
+ else if(options->proxy.type == CURLPROXY_SOCKS4)
fprintf(config_file, "%s = %s\n", "proxy_type", "socks4");
- else if(proxy_type == CURLPROXY_SOCKS5)
+ else if(options->proxy.type == CURLPROXY_SOCKS5)
fprintf(config_file, "%s = %s\n", "proxy_type", "socks5");
}
- if(proxy_addr[0])
- fprintf(config_file, "%s = %s\n", "proxy_address", proxy_addr);
- if(proxy_port)
- fprintf(config_file, "%s = %i\n", "proxy_port", proxy_port);
- if(proxy_auth)
+ if(options->proxy.address[0])
+ fprintf(config_file, "%s = %s\n", "proxy_address", options->proxy.address);
+ if(options->proxy.port)
+ fprintf(config_file, "%s = %i\n", "proxy_port", options->proxy.port);
+ if(options->proxy.auth)
{
- if(proxy_auth = CURLAUTH_BASIC)
+ if(options->proxy.auth = CURLAUTH_BASIC)
fprintf(config_file, "%s = %s\n", "proxy_auth", "basic");
- else if(proxy_auth = CURLAUTH_DIGEST)
+ else if(options->proxy.auth = CURLAUTH_DIGEST)
fprintf(config_file, "%s = %s\n", "proxy_auth", "digest");
- else if(proxy_auth = CURLAUTH_NTLM)
+ else if(options->proxy.auth = CURLAUTH_NTLM)
fprintf(config_file, "%s = %s\n", "proxy_auth", "ntlm");
}
- if(proxy_user[0])
- fprintf(config_file, "%s = %s\n", "proxy_user", proxy_user);
- if(proxy_pass[0])
- fprintf(config_file, "%s = %s\n", "proxy_pass", proxy_pass);
+ if(options->proxy.user[0])
+ fprintf(config_file, "%s = %s\n", "proxy_user", options->proxy.user);
+ if(options->proxy.pass[0])
+ fprintf(config_file, "%s = %s\n", "proxy_pass", options->proxy.pass);
return 0;
}
-int updateconfig(char * htde_path, char * save_path, int * update)
+int updateconfig(char * getht_path, struct config * options)
/* Read existing config file, and rewrite any variables which differ
* in memory. */
{
FILE * config_file;
char filepath[STR_MAX];
- snprintf(filepath, STR_MAX, "%s/config.ini", htde_path);
+ snprintf(filepath, STR_MAX, "%s/config.ini", getht_path);
if((config_file = fopen(filepath,"rw")) == NULL)
{
diff --git a/src/download.c b/src/download.c
index b8fd086..b287655 100644
--- a/src/download.c
+++ b/src/download.c
@@ -35,24 +35,13 @@ int write_func(void *ptr, size_t size, size_t nmemb, FILE *stream)
int update_progress(void *data, double dltotal, double dlnow,
double ultotal, double ulnow);
-extern int proxy_type;
-extern char proxy_addr[STR_MAX];
-extern long proxy_port;
-extern int proxy_auth;
-extern char proxy_user[STR_MAX];
-extern char proxy_pass[STR_MAX];
-extern CURL *main_curl_handle;
-
-int save_file(CURL *curl_handle, char *uri, char *filepath, char *filetitle, long resume_offset)
+int save_file(char *uri, char *filepath, char *filetitle, long resume_offset, struct config * options)
/* Save the file *uri to *filepath */
{
printf("Downloading %s ",filetitle);
fflush(stdout);
- if(!curl_handle)
- curl_handle = main_curl_handle;
-
- if(curl_handle) {
+ if(options->curl_handle) {
FILE *file;
file = fopen(filepath, resume_offset?"a":"w");
if(!file)
@@ -61,38 +50,38 @@ int save_file(CURL *curl_handle, char *uri, char *filepath, char *filetitle, lon
return 1;
}
- curl_easy_setopt(curl_handle, CURLOPT_URL, uri);
- curl_easy_setopt(curl_handle, CURLOPT_READFUNCTION, read_func);
- curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_func);
- curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, file);
+ curl_easy_setopt(options->curl_handle, CURLOPT_URL, uri);
+ curl_easy_setopt(options->curl_handle, CURLOPT_READFUNCTION, read_func);
+ curl_easy_setopt(options->curl_handle, CURLOPT_WRITEFUNCTION, write_func);
+ curl_easy_setopt(options->curl_handle, CURLOPT_WRITEDATA, file);
- if(proxy_type)
+ if(options->proxy.type)
{
- curl_easy_setopt(curl_handle, CURLOPT_PROXYTYPE, proxy_type);
- curl_easy_setopt(curl_handle, CURLOPT_PROXY, proxy_addr);
- if(proxy_port)
- curl_easy_setopt(curl_handle, CURLOPT_PROXYPORT, proxy_port);
- if(proxy_auth)
- curl_easy_setopt(curl_handle, CURLOPT_PROXYAUTH, proxy_auth);
- if(proxy_user[0] && proxy_pass[0])
+ curl_easy_setopt(options->curl_handle, CURLOPT_PROXYTYPE, options->proxy.type);
+ curl_easy_setopt(options->curl_handle, CURLOPT_PROXY, options->proxy.address);
+ if(options->proxy.port)
+ curl_easy_setopt(options->curl_handle, CURLOPT_PROXYPORT, options->proxy.port);
+ if(options->proxy.auth)
+ curl_easy_setopt(options->curl_handle, CURLOPT_PROXYAUTH, options->proxy.auth);
+ if(options->proxy.user[0] && options->proxy.pass[0])
{
char userpass[STR_MAX];
- snprintf(userpass, STR_MAX, "%s:%s", proxy_user, proxy_pass);
- curl_easy_setopt(curl_handle, CURLOPT_PROXYUSERPWD, userpass);
+ snprintf(userpass, STR_MAX, "%s:%s", options->proxy.user, options->proxy.pass);
+ curl_easy_setopt(options->curl_handle, CURLOPT_PROXYUSERPWD, userpass);
}
}
- curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 0);
- curl_easy_setopt(curl_handle, CURLOPT_PROGRESSFUNCTION, update_progress);
- curl_easy_setopt(curl_handle, CURLOPT_PROGRESSDATA, &resume_offset);
+ curl_easy_setopt(options->curl_handle, CURLOPT_NOPROGRESS, 0);
+ curl_easy_setopt(options->curl_handle, CURLOPT_PROGRESSFUNCTION, update_progress);
+ curl_easy_setopt(options->curl_handle, CURLOPT_PROGRESSDATA, &resume_offset);
- curl_easy_setopt(curl_handle, CURLOPT_RESUME_FROM, resume_offset);
+ curl_easy_setopt(options->curl_handle, CURLOPT_RESUME_FROM, resume_offset);
/* create a buffer to hold any curl errors */
char errorinfo[CURL_ERROR_SIZE];
- curl_easy_setopt(curl_handle, CURLOPT_ERRORBUFFER, errorinfo);
+ curl_easy_setopt(options->curl_handle, CURLOPT_ERRORBUFFER, errorinfo);
- if(curl_easy_perform(curl_handle))
+ if(curl_easy_perform(options->curl_handle))
{
remove(filepath);
fprintf(stderr,"\nError, could not download %s: %s\n",uri, errorinfo);
@@ -133,54 +122,51 @@ int update_progress(void *data, double dltotal, double dlnow,
return 0;
}
-double getremotefilesize(CURL *curl_handle, char *uri)
+double getremotefilesize(char *uri, struct config * options)
{
double filesize;
- if(!curl_handle)
- curl_handle = main_curl_handle;
-
- if(curl_handle) {
+ if(options->curl_handle) {
- curl_easy_setopt(curl_handle, CURLOPT_URL, uri);
- curl_easy_setopt(curl_handle, CURLOPT_READFUNCTION, read_func);
+ curl_easy_setopt(options->curl_handle, CURLOPT_URL, uri);
+ curl_easy_setopt(options->curl_handle, CURLOPT_READFUNCTION, read_func);
/* don't download or return either body or header */
- curl_easy_setopt(curl_handle, CURLOPT_NOBODY, 1);
- curl_easy_setopt(curl_handle, CURLOPT_HEADER, 0);
+ curl_easy_setopt(options->curl_handle, CURLOPT_NOBODY, 1);
+ curl_easy_setopt(options->curl_handle, CURLOPT_HEADER, 0);
- if(proxy_type)
+ if(options->proxy.type)
{
- curl_easy_setopt(curl_handle, CURLOPT_PROXYTYPE, proxy_type);
- curl_easy_setopt(curl_handle, CURLOPT_PROXY, proxy_addr);
- if(proxy_port)
- curl_easy_setopt(curl_handle, CURLOPT_PROXYPORT, proxy_port);
- if(proxy_auth)
- curl_easy_setopt(curl_handle, CURLOPT_PROXYAUTH, proxy_auth);
- if(proxy_user[0] && proxy_pass[0])
+ curl_easy_setopt(options->curl_handle, CURLOPT_PROXYTYPE, options->proxy.type);
+ curl_easy_setopt(options->curl_handle, CURLOPT_PROXY, options->proxy.address);
+ if(options->proxy.port)
+ curl_easy_setopt(options->curl_handle, CURLOPT_PROXYPORT, options->proxy.port);
+ if(options->proxy.auth)
+ curl_easy_setopt(options->curl_handle, CURLOPT_PROXYAUTH, options->proxy.auth);
+ if(options->proxy.user[0] && options->proxy.pass[0])
{
char userpass[STR_MAX];
- snprintf(userpass, STR_MAX, "%s:%s", proxy_user, proxy_pass);
- curl_easy_setopt(curl_handle, CURLOPT_PROXYUSERPWD, userpass);
+ snprintf(userpass, STR_MAX, "%s:%s", options->proxy.user, options->proxy.pass);
+ curl_easy_setopt(options->curl_handle, CURLOPT_PROXYUSERPWD, userpass);
}
}
- curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1);
+ curl_easy_setopt(options->curl_handle, CURLOPT_NOPROGRESS, 1);
- if(curl_easy_perform(curl_handle))
+ if(curl_easy_perform(options->curl_handle))
filesize = -1;
- curl_easy_getinfo(curl_handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &filesize);
+ curl_easy_getinfo(options->curl_handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &filesize);
}
else
filesize = -1;
- curl_easy_reset(curl_handle);
+ curl_easy_reset(options->curl_handle);
return filesize;
}
-void downloadissue(CURL *curl_handle, char * directory, iss * issue, int force)
+void downloadissue(struct config * options, iss * issue, int force)
/* Download issue pointed to */
{
sec * cur_section;
@@ -188,7 +174,7 @@ void downloadissue(CURL *curl_handle, char * directory, iss * issue, int force)
char filename[STR_MAX];
char filepath[STR_MAX];
- snprintf(newdir,STR_MAX,"%s/%i_%i-%i",directory,
+ snprintf(newdir,STR_MAX,"%s/%i_%i-%i",options->save_path,
issue->date.year,issue->date.firstmonth,issue->date.lastmonth);
printf("Downloading %s to %s\n",issue->title, newdir);
@@ -211,7 +197,7 @@ void downloadissue(CURL *curl_handle, char * directory, iss * issue, int force)
struct stat fileinfo;
/* see if local file exists */
if(stat(filepath, &fileinfo))
- save_file(curl_handle, cur_section->uri, filepath, filename, 0);
+ save_file(cur_section->uri, filepath, filename, 0, options);
else
{
/* get size of local file */
@@ -220,16 +206,16 @@ void downloadissue(CURL *curl_handle, char * directory, iss * issue, int force)
/* get size of remote file */
long remotesize = 0;
- remotesize = (long) getremotefilesize(curl_handle, cur_section->uri);
+ remotesize = (long) getremotefilesize(cur_section->uri, options);
/* if size of local file != size of remote file, resume */
if(remotesize > 0 && localsize < remotesize)
- save_file(curl_handle, cur_section->uri, filepath, filename, localsize);
+ save_file(cur_section->uri, filepath, filename, localsize, options);
else
printf("Skipping download of completed section %i\n", cur_section->number);
}
}
else
- save_file(curl_handle, cur_section->uri, filepath, filename, 0);
+ save_file(cur_section->uri, filepath, filename, 0, options);
}
}
diff --git a/src/getht.c b/src/getht.c
index e1aa847..ec90f0b 100644
--- a/src/getht.c
+++ b/src/getht.c
@@ -30,19 +30,22 @@
#include "issue.h"
#include "getht.h"
-int update_contents_files();
-
-int proxy_type; char proxy_addr[STR_MAX]; long proxy_port;
-int proxy_auth;
-char proxy_user[STR_MAX]; char proxy_pass[STR_MAX];
-char toc_xml[STR_MAX];
-char issue_uri[STR_MAX];
-CURL *main_curl_handle;
+int update_contents_files(struct config * options);
int main(int argc, char *argv[])
{
+ struct config options;
char getht_path[STR_MAX];
- char save_path[STR_MAX];
+
+ /* initialise appropriate options vars */
+ options.startup_check = 0;
+ options.verbose = 0;
+ options.proxy.type = 0;
+ options.proxy.auth = 0;
+ options.proxy.address[0] = '\0';
+ options.proxy.port = 0;
+ options.proxy.user[0] = '\0';
+ options.proxy.pass[0] = '\0';
/* Define & set up paths */
snprintf(getht_path,STR_MAX,"%s/.getht",getenv("HOME"));
@@ -55,36 +58,29 @@ int main(int argc, char *argv[])
scanf("%s", getht_path);
}
- snprintf(toc_xml,STR_MAX,"%s/%s",getht_path,ISS_XML_FILE);
+ snprintf(options.toc_xml,STR_MAX,"%s/%s",getht_path,ISS_XML_FILE);
- strncpy(issue_uri,XML_TOC_URI,STR_MAX);
+ strncpy(options.issue_uri,XML_TOC_URI,STR_MAX);
- snprintf(save_path,STR_MAX,"%s/hinduism_today",getenv("HOME"));
+ snprintf(options.save_path,STR_MAX,"%s/hinduism_today",getenv("HOME"));
int downall = 0;
int downissue = 0, downissueno = -1;
int listissues = 0;
- int force = 0, update = 0;
- int verbose = 0, option = 0;
-
- proxy_type = 0;
- proxy_port = 0;
- proxy_addr[0] = '\0';
- proxy_auth = 0;
- proxy_user[0] = '\0';
- proxy_pass[0] = '\0';
+ int force = 0;
+ int option = 0;
- if(loadconfig(getht_path, &save_path, &update) != 0)
- writefreshconfig(getht_path, &save_path, &update, &issue_uri);
+ if(loadconfig(getht_path, &options) != 0)
+ writefreshconfig(getht_path, &options);
- if(!opendir(save_path))
- if(mkdir(save_path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH))
+ if(!opendir(options.save_path))
+ if(mkdir(options.save_path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH))
{
- fprintf(stderr,"Cannot open/create directory %s",save_path);
+ fprintf(stderr,"Cannot open/create directory %s",options.save_path);
printf("Please enter the path of a directory to save issues in: ");
- scanf("%s", save_path);
+ scanf("%s", options.save_path);
- updateconfig(getht_path, &save_path, NULL);
+ updateconfig(getht_path, &options);
}
/* Parse command line options */
@@ -122,7 +118,7 @@ int main(int argc, char *argv[])
option = 1;
break;
case 'u':
- update = 1;
+ options.startup_check = 1;
option = 1;
break;
case 'h':
@@ -130,7 +126,7 @@ int main(int argc, char *argv[])
return 0;
break;
case 'v':
- verbose++;
+ options.verbose++;
option = 1;
break;
case 'V':
@@ -147,11 +143,11 @@ int main(int argc, char *argv[])
return 0;
}
- main_curl_handle = curl_easy_init();
+ options.curl_handle = curl_easy_init();
- if(update)
+ if(options.startup_check)
{
- if(update_contents_files())
+ if(update_contents_files(&options))
fprintf(stderr,"Could not update contents files\n");
}
@@ -163,16 +159,16 @@ int main(int argc, char *argv[])
if(downissue || listissues)
{
- issue = parsetoc(toc_xml, &no_of_issues);
+ issue = parsetoc(options.toc_xml, &no_of_issues);
if(!issue)
{
- if(!update)
+ if(!options.startup_check)
{
printf("Cannot open contents file, trying to update contents\n");
- if(update_contents_files())
+ if(update_contents_files(&options))
return 1;
- issue = parsetoc(toc_xml, &no_of_issues);
+ issue = parsetoc(options.toc_xml, &no_of_issues);
}
else
{
@@ -184,26 +180,26 @@ int main(int argc, char *argv[])
if(downall)
{
for(i = 0; i < no_of_issues; i++)
- downloadissue(NULL, save_path, issue[i], force);
+ downloadissue(&options, issue[i], force);
}
else if(downissueno >= 0 && downissueno <= no_of_issues)
- downloadissue(NULL, save_path, issue[downissueno], force);
+ downloadissue(&options, issue[downissueno], force);
}
if(listissues)
- list_issues(issue, no_of_issues, verbose);
+ list_issues(issue, no_of_issues, options.verbose);
/* Ensure curl cleans itself up */
- curl_easy_cleanup(main_curl_handle);
+ curl_easy_cleanup(options.curl_handle);
return 0;
}
-int update_contents_files()
+int update_contents_files(struct config * options)
/* Returns 0 on success, 1 on failure */
{
- if(save_file(NULL, issue_uri, toc_xml, "contents", 0))
+ if(save_file(options->issue_uri, options->toc_xml, "contents", 0, options))
return 1;
else
return 0;
diff --git a/src/getht.h b/src/getht.h
index f2315d4..4ec0f4a 100644
--- a/src/getht.h
+++ b/src/getht.h
@@ -26,20 +26,26 @@
#include <curl/curl.h>
-struct config {
- char * proxytype;
- char * proxyauth;
- char proxy_addr[STR_MAX];
- long proxy_port;
- char proxy_user[STR_MAX];
- char proxy_pass[STR_MAX];
+struct proxy_options {
+ char type;
+ char auth;
+ char address[STR_MAX];
+ long port;
+ char user[STR_MAX];
+ char pass[STR_MAX];
+};
+struct config {
char toc_xml[STR_MAX];
char issue_uri[STR_MAX];
char save_path[STR_MAX];
+ struct proxy_options proxy;
+
int startup_check;
+ int verbose;
+
CURL *curl_handle;
};