tool_metalink.h revision e6cd738ed3716c02557fb3a47515244e949ade39
1#ifndef HEADER_CURL_TOOL_METALINK_H 2#define HEADER_CURL_TOOL_METALINK_H 3/*************************************************************************** 4 * _ _ ____ _ 5 * Project ___| | | | _ \| | 6 * / __| | | | |_) | | 7 * | (__| |_| | _ <| |___ 8 * \___|\___/|_| \_\_____| 9 * 10 * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. 11 * 12 * This software is licensed as described in the file COPYING, which 13 * you should have received as part of this distribution. The terms 14 * are also available at http://curl.haxx.se/docs/copyright.html. 15 * 16 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 17 * copies of the Software, and permit persons to whom the Software is 18 * furnished to do so, under the terms of the COPYING file. 19 * 20 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 21 * KIND, either express or implied. 22 * 23 ***************************************************************************/ 24#include "tool_setup.h" 25 26struct GlobalConfig; 27struct OperationConfig; 28 29/* returns 1 for success, 0 otherwise (we use OpenSSL *_Init fncs directly) */ 30typedef int (* Curl_digest_init_func)(void *context); 31 32typedef void (* Curl_digest_update_func)(void *context, 33 const unsigned char *data, 34 unsigned int len); 35typedef void (* Curl_digest_final_func)(unsigned char *result, void *context); 36 37typedef struct { 38 Curl_digest_init_func digest_init; /* Initialize context procedure */ 39 Curl_digest_update_func digest_update; /* Update context with data */ 40 Curl_digest_final_func digest_final; /* Get final result procedure */ 41 unsigned int digest_ctxtsize; /* Context structure size */ 42 unsigned int digest_resultlen; /* Result length (bytes) */ 43} digest_params; 44 45typedef struct { 46 const digest_params *digest_hash; /* Hash function definition */ 47 void *digest_hashctx; /* Hash function context */ 48} digest_context; 49 50digest_context * Curl_digest_init(const digest_params *dparams); 51int Curl_digest_update(digest_context *context, 52 const unsigned char *data, 53 unsigned int len); 54int Curl_digest_final(digest_context *context, unsigned char *result); 55 56typedef struct { 57 const char *hash_name; 58 const digest_params *dparams; 59} metalink_digest_def; 60 61typedef struct { 62 const char *alias_name; 63 const metalink_digest_def *digest_def; 64} metalink_digest_alias; 65 66typedef struct metalink_checksum { 67 const metalink_digest_def *digest_def; 68 /* raw digest value, not ascii hex digest */ 69 unsigned char *digest; 70} metalink_checksum; 71 72typedef struct metalink_resource { 73 struct metalink_resource *next; 74 char *url; 75} metalink_resource; 76 77typedef struct metalinkfile { 78 struct metalinkfile *next; 79 char *filename; 80 metalink_checksum *checksum; 81 metalink_resource *resource; 82} metalinkfile; 83 84#ifdef USE_METALINK 85 86/* 87 * curl requires libmetalink 0.1.0 or newer 88 */ 89#define CURL_REQ_LIBMETALINK_MAJOR 0 90#define CURL_REQ_LIBMETALINK_MINOR 1 91#define CURL_REQ_LIBMETALINK_PATCH 0 92 93#define CURL_REQ_LIBMETALINK_VERS ((CURL_REQ_LIBMETALINK_MAJOR * 10000) + \ 94 (CURL_REQ_LIBMETALINK_MINOR * 100) + \ 95 CURL_REQ_LIBMETALINK_PATCH) 96 97extern const digest_params MD5_DIGEST_PARAMS[1]; 98extern const digest_params SHA1_DIGEST_PARAMS[1]; 99extern const digest_params SHA256_DIGEST_PARAMS[1]; 100 101#include <metalink/metalink.h> 102 103/* 104 * Counts the resource in the metalinkfile. 105 */ 106int count_next_metalink_resource(metalinkfile *mlfile); 107void clean_metalink(struct OperationConfig *config); 108 109/* 110 * Performs final parse operation and extracts information from 111 * Metalink and creates metalinkfile structs. 112 * 113 * This function returns 0 if it succeeds without warnings, or one of 114 * the following negative error codes: 115 * 116 * -1: Parsing failed; or no file is found 117 * -2: Parsing succeeded with some warnings. 118 */ 119int parse_metalink(struct OperationConfig *config, struct OutStruct *outs, 120 const char *metalink_url); 121 122/* 123 * Callback function for CURLOPT_WRITEFUNCTION 124 */ 125size_t metalink_write_cb(void *buffer, size_t sz, size_t nmemb, 126 void *userdata); 127 128/* 129 * Returns nonzero if content_type includes "application/metalink+xml" 130 * media-type. The check is done in case-insensitive manner. 131 */ 132int check_metalink_content_type(const char *content_type); 133 134/* 135 * Check checksum of file denoted by filename. 136 * 137 * This function returns 1 if the checksum matches or one of the 138 * following integers: 139 * 140 * 0: 141 * Checksum didn't match. 142 * -1: 143 * Could not open file; or could not read data from file. 144 * -2: 145 * No checksum in Metalink supported, hash algorithm not available, or 146 * Metalink does not contain checksum. 147 */ 148int metalink_check_hash(struct GlobalConfig *config, 149 metalinkfile *mlfile, 150 const char *filename); 151 152/* 153 * Release resources allocated at global scope. 154 */ 155void metalink_cleanup(void); 156 157#else /* USE_METALINK */ 158 159#define count_next_metalink_resource(x) 0 160#define clean_metalink(x) (void)x 161 162/* metalink_cleanup() takes no arguments */ 163#define metalink_cleanup() Curl_nop_stmt 164 165#endif /* USE_METALINK */ 166 167#endif /* HEADER_CURL_TOOL_METALINK_H */ 168