From 6a655ca192b65702f6c28b33e606fd4d6aec723f Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 25 May 2012 19:24:32 +0900 Subject: [PATCH] Minimize usage of structs from libmetalink --- src/tool_cfgable.h | 7 +- src/tool_metalink.c | 160 +++++++++++++++++++++++++++++++------------- src/tool_metalink.h | 35 +++++----- src/tool_operate.c | 17 +++-- 4 files changed, 146 insertions(+), 73 deletions(-) diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h index a221e3792..72f6cef30 100644 --- a/src/tool_cfgable.h +++ b/src/tool_cfgable.h @@ -203,11 +203,8 @@ struct Configurable { long gssapi_delegation; bool ssl_allow_beast; /* allow this SSL vulnerability */ #ifdef HAVE_LIBMETALINK - struct metalinkfile *metalinkfile_list; /* point to the first node */ - struct metalinkfile *metalinkfile_last; /* point to the last/current node */ - - struct metalink *metalink_list; /* point to the first node */ - struct metalink *metalink_last; /* point to the last/current node */ + metalinkfile *metalinkfile_list; /* point to the first node */ + metalinkfile *metalinkfile_last; /* point to the last/current node */ #endif /* HAVE_LIBMETALINK */ }; /* struct Configurable */ diff --git a/src/tool_metalink.c b/src/tool_metalink.c index 4fb0015c7..9a5f9325e 100644 --- a/src/tool_metalink.c +++ b/src/tool_metalink.c @@ -36,6 +36,7 @@ #include "tool_metalink.h" #include "tool_getparam.h" #include "tool_paramhlp.h" +#include "tool_cfgable.h" #include "memdebug.h" /* keep this as LAST include */ @@ -273,45 +274,121 @@ int Curl_digest_final(digest_context *context, unsigned char *result) return 0; } -struct metalinkfile *new_metalinkfile(metalink_file_t *metalinkfile) { - struct metalinkfile *f; - f = (struct metalinkfile*)malloc(sizeof(struct metalinkfile)); - f->file = metalinkfile; +static metalink_checksum *new_metalink_checksum(const char *hash_name, + const char *hash_value) +{ + metalink_checksum *chksum; + chksum = malloc(sizeof(metalink_checksum)); + chksum->next = NULL; + chksum->hash_name = strdup(hash_name); + chksum->hash_value = strdup(hash_value); + return chksum; +} + +static void delete_metalink_checksum(metalink_checksum *chksum) +{ + if(chksum == NULL) { + return; + } + Curl_safefree(chksum->hash_value); + Curl_safefree(chksum->hash_name); + Curl_safefree(chksum); +} + +static metalink_resource *new_metalink_resource(const char *url) +{ + metalink_resource *res; + res = malloc(sizeof(metalink_resource)); + res->next = NULL; + res->url = strdup(url); + return res; +} + +static void delete_metalink_resource(metalink_resource *res) +{ + if(res == NULL) { + return; + } + Curl_safefree(res->url); + Curl_safefree(res); +} + +static metalinkfile *new_metalinkfile(metalink_file_t *fileinfo) +{ + metalinkfile *f; + f = (metalinkfile*)malloc(sizeof(metalinkfile)); f->next = NULL; + f->filename = strdup(fileinfo->name); + f->checksum = NULL; + f->resource = NULL; + if(fileinfo->checksums) { + metalink_checksum_t **p; + metalink_checksum root, *tail; + root.next = NULL; + tail = &root; + for(p = fileinfo->checksums; *p; ++p) { + metalink_checksum *chksum; + chksum = new_metalink_checksum((*p)->type, (*p)->hash); + tail->next = chksum; + tail = chksum; + } + f->checksum = root.next; + } + if(fileinfo->resources) { + metalink_resource_t **p; + metalink_resource root, *tail; + root.next = NULL; + tail = &root; + for(p = fileinfo->resources; *p; ++p) { + metalink_resource *res; + res = new_metalink_resource((*p)->url); + tail->next = res; + tail = res; + } + f->resource = root.next; + } return f; } -struct metalink *new_metalink(metalink_t *metalink) { - struct metalink *ml; - ml = (struct metalink*)malloc(sizeof(struct metalink)); - ml->metalink = metalink; - ml->next = NULL; - return ml; +static void delete_metalinkfile(metalinkfile *mlfile) +{ + metalink_checksum *mc; + metalink_resource *res; + if(mlfile == NULL) { + return; + } + Curl_safefree(mlfile->filename); + for(mc = mlfile->checksum; mc;) { + metalink_checksum *next; + next = mc->next; + delete_metalink_checksum(mc); + mc = next; + } + for(res = mlfile->resource; res;) { + metalink_resource *next; + next = res->next; + delete_metalink_resource(res); + res = next; + } + Curl_safefree(mlfile); } -int count_next_metalink_resource(struct metalinkfile *mlfile) +int count_next_metalink_resource(metalinkfile *mlfile) { int count = 0; - metalink_resource_t **mlres; - for(mlres = mlfile->file->resources; *mlres; ++mlres, ++count); + metalink_resource *res; + for(res = mlfile->resource; res; res = res->next, ++count); return count; } void clean_metalink(struct Configurable *config) { while(config->metalinkfile_list) { - struct metalinkfile *mlfile = config->metalinkfile_list; + metalinkfile *mlfile = config->metalinkfile_list; config->metalinkfile_list = config->metalinkfile_list->next; - Curl_safefree(mlfile); + delete_metalinkfile(mlfile); } config->metalinkfile_last = 0; - while(config->metalink_list) { - struct metalink *ml = config->metalink_list; - config->metalink_list = config->metalink_list->next; - metalink_delete(ml->metalink); - Curl_safefree(ml); - } - config->metalink_last = 0; } int parse_metalink(struct Configurable *config, const char *infile) @@ -319,27 +396,16 @@ int parse_metalink(struct Configurable *config, const char *infile) metalink_error_t r; metalink_t* metalink; metalink_file_t **files; - struct metalink *ml; r = metalink_parse_file(infile, &metalink); - if(r != 0) { return -1; } if(metalink->files == NULL) { fprintf(config->errors, "\nMetalink does not contain any file.\n"); + metalink_delete(metalink); return 0; } - ml = new_metalink(metalink); - - if(config->metalink_list) { - config->metalink_last->next = ml; - config->metalink_last = ml; - } - else { - config->metalink_list = config->metalink_last = ml; - } - for(files = metalink->files; *files; ++files) { struct getout *url; /* Skip an entry which has no resource. */ @@ -363,16 +429,17 @@ int parse_metalink(struct Configurable *config, const char *infile) url = config->url_get; else /* there was no free node, create one! */ - url=new_getout(config); + url = new_getout(config); if(url) { - struct metalinkfile *mlfile; + metalinkfile *mlfile; + mlfile = new_metalinkfile(*files); + /* Set name as url */ - GetStr(&url->url, (*files)->name); + GetStr(&url->url, mlfile->filename); /* set flag metalink here */ url->flags |= GETOUT_URL | GETOUT_METALINK; - mlfile = new_metalinkfile(*files); if(config->metalinkfile_list) { config->metalinkfile_last->next = mlfile; @@ -383,6 +450,7 @@ int parse_metalink(struct Configurable *config, const char *infile) } } } + metalink_delete(metalink); return 0; } @@ -510,25 +578,25 @@ static int check_hash(const char *filename, } int metalink_check_hash(struct Configurable *config, - struct metalinkfile *mlfile, + metalinkfile *mlfile, const char *filename) { - metalink_checksum_t **checksum; + metalink_checksum *chksum; const metalink_digest_alias *digest_alias; int rv; - if(!mlfile->file->checksums) { + if(mlfile->checksum == NULL) { return -2; } for(digest_alias = digest_aliases; digest_alias->alias_name; ++digest_alias) { - for(checksum = mlfile->file->checksums; *checksum; ++checksum) { - if(Curl_raw_equal(digest_alias->alias_name, (*checksum)->type) && - strlen((*checksum)->hash) == + for(chksum = mlfile->checksum; chksum; chksum = chksum->next) { + if(Curl_raw_equal(digest_alias->alias_name, chksum->hash_name) && + strlen(chksum->hash_value) == digest_alias->digest_def->dparams->digest_resultlen*2) { break; } } - if(*checksum) { + if(chksum) { break; } } @@ -537,7 +605,7 @@ int metalink_check_hash(struct Configurable *config, return -2; } rv = check_hash(filename, digest_alias->digest_def, - (*checksum)->hash, config->errors); + chksum->hash_value, config->errors); if(rv == 1) { fprintf(config->errors, "Checksum matched\n"); } diff --git a/src/tool_metalink.h b/src/tool_metalink.h index 0c9d589eb..58bb3c439 100644 --- a/src/tool_metalink.h +++ b/src/tool_metalink.h @@ -25,26 +25,31 @@ #include -#include "tool_cfgable.h" +struct Configurable; -struct metalinkfile { +typedef struct metalink_checksum { + struct metalink_checksum *next; + char *hash_name; + /* Hex-encoded hash value */ + char *hash_value; +} metalink_checksum; + +typedef struct metalink_resource { + struct metalink_resource *next; + char *url; +} metalink_resource; + +typedef struct metalinkfile { struct metalinkfile *next; - metalink_file_t *file; -}; - -struct metalink { - struct metalink *next; - metalink_t* metalink; -}; - -struct metalinkfile *new_metalinkfile(metalink_file_t *metalinkfile); - -struct metalink *new_metalink(metalink_t *metalink); + char *filename; + metalink_checksum *checksum; + metalink_resource *resource; +} metalinkfile; /* * Counts the resource in the metalinkfile. */ -int count_next_metalink_resource(struct metalinkfile *mlfile); +int count_next_metalink_resource(metalinkfile *mlfile); void clean_metalink(struct Configurable *config); @@ -110,7 +115,7 @@ typedef struct { * checksum. */ int metalink_check_hash(struct Configurable *config, - struct metalinkfile *mlfile, + metalinkfile *mlfile, const char *filename); #endif /* HEADER_CURL_TOOL_METALINK_H */ diff --git a/src/tool_operate.c b/src/tool_operate.c index be860b983..3d8303424 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -130,7 +130,7 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[]) struct OutStruct heads; #ifdef HAVE_LIBMETALINK - struct metalinkfile *mlfile_last = NULL; + metalinkfile *mlfile_last = NULL; #endif /* HAVE_LIBMETALINK */ CURL *curl = NULL; @@ -409,8 +409,8 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[]) int metalink = 0; /* nonzero for metalink download. Put outside of HAVE_LIBMETALINK to reduce #ifdef */ #ifdef HAVE_LIBMETALINK - struct metalinkfile *mlfile; - metalink_resource_t **mlres; + metalinkfile *mlfile; + metalink_resource *mlres; #endif /* HAVE_LIBMETALINK */ outfiles = NULL; @@ -425,7 +425,7 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[]) } mlfile = mlfile_last; mlfile_last = mlfile_last->next; - mlres = mlfile->file->resources; + mlres = mlfile->resource; } else { mlfile = NULL; @@ -558,12 +558,12 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[]) if(metalink) { /* For Metalink download, use name in Metalink file as filename. */ - outfile = strdup(mlfile->file->name); + outfile = strdup(mlfile->filename); if(!outfile) { res = CURLE_OUT_OF_MEMORY; goto show_error; } - this_url = strdup((*mlres)->url); + this_url = strdup(mlres->url); if(!this_url) { res = CURLE_OUT_OF_MEMORY; goto show_error; @@ -1624,7 +1624,10 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[]) if(is_fatal_error(res)) { break; } - if(!metalink_next_res || *(++mlres) == NULL) + if(!metalink_next_res) + break; + mlres = mlres->next; + if(mlres == NULL) /* TODO If metalink_next_res is 1 and mlres is NULL, * set res to error code */