diff options
author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-04-28 23:46:32 +0900 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2012-05-26 23:09:37 +0200 |
commit | 53f2c02ac75360b53a8eba8d575e5fa55f8b3372 (patch) | |
tree | 1f0022915b41e9a87def212cb5465a2b52d3d528 /src/tool_metalink.c | |
parent | 1919352a10f7103d32fede9c2b8c427440dea517 (diff) | |
download | curl-53f2c02ac75360b53a8eba8d575e5fa55f8b3372.tar.gz |
metalink: parse downloaded Metalink file
Parse downloaded Metalink file and add downloads described there. Fixed
compile error without metalink support.
Diffstat (limited to 'src/tool_metalink.c')
-rw-r--r-- | src/tool_metalink.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/tool_metalink.c b/src/tool_metalink.c index a57297b78..4b4c6bcd3 100644 --- a/src/tool_metalink.c +++ b/src/tool_metalink.c @@ -21,9 +21,23 @@ ***************************************************************************/ #include "tool_setup.h" #include "tool_metalink.h" +#include "tool_getparam.h" +#include "tool_paramhlp.h" #include "memdebug.h" /* keep this as LAST include */ +/* Copied from tool_getparam.c */ +#define GetStr(str,val) do { \ + if(*(str)) { \ + free(*(str)); \ + *(str) = NULL; \ + } \ + if((val)) \ + *(str) = strdup((val)); \ + if(!(val)) \ + return PARAM_NO_MEM; \ +} WHILE_FALSE + struct metalinkfile *new_metalinkfile(metalink_file_t *metalinkfile) { struct metalinkfile *f; f = (struct metalinkfile*)malloc(sizeof(struct metalinkfile)); @@ -64,3 +78,67 @@ void clean_metalink(struct Configurable *config) } config->metalink_last = 0; } + +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; + } + 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. */ + if(!(*files)->resources[0]) continue; + if(config->url_get || + ((config->url_get = config->url_list) != NULL)) { + /* there's a node here, if it already is filled-in continue to + find an "empty" node */ + while(config->url_get && (config->url_get->flags & GETOUT_URL)) + config->url_get = config->url_get->next; + } + + /* now there might or might not be an available node to fill in! */ + + if(config->url_get) + /* existing node */ + url = config->url_get; + else + /* there was no free node, create one! */ + url=new_getout(config); + + if(url) { + struct metalinkfile *mlfile; + /* Set name as url */ + GetStr(&url->url, (*files)->name); + + /* set flag metalink here */ + url->flags |= GETOUT_URL | GETOUT_METALINK; + mlfile = new_metalinkfile(*files); + + if(config->metalinkfile_list) { + config->metalinkfile_last->next = mlfile; + config->metalinkfile_last = mlfile; + } + else { + config->metalinkfile_list = config->metalinkfile_last = mlfile; + } + } + } + return 0; +} |