summaryrefslogtreecommitdiff
path: root/src/tool_metalink.c
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-04-28 23:46:32 +0900
committerDaniel Stenberg <daniel@haxx.se>2012-05-26 23:09:37 +0200
commit53f2c02ac75360b53a8eba8d575e5fa55f8b3372 (patch)
tree1f0022915b41e9a87def212cb5465a2b52d3d528 /src/tool_metalink.c
parent1919352a10f7103d32fede9c2b8c427440dea517 (diff)
downloadcurl-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.c78
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;
+}