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 https://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 26 struct GlobalConfig; 27 struct OperationConfig; 28 29 /* returns 1 for success, 0 otherwise (we use OpenSSL *_Init fncs directly) */ 30 typedef int (* Curl_digest_init_func)(void *context); 31 32 typedef void (* Curl_digest_update_func)(void *context, 33 const unsigned char *data, 34 unsigned int len); 35 typedef void (* Curl_digest_final_func)(unsigned char *result, void *context); 36 37 typedef 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 45 typedef struct { 46 const digest_params *digest_hash; /* Hash function definition */ 47 void *digest_hashctx; /* Hash function context */ 48 } digest_context; 49 50 digest_context * Curl_digest_init(const digest_params *dparams); 51 int Curl_digest_update(digest_context *context, 52 const unsigned char *data, 53 unsigned int len); 54 int Curl_digest_final(digest_context *context, unsigned char *result); 55 56 typedef struct { 57 const char *hash_name; 58 const digest_params *dparams; 59 } metalink_digest_def; 60 61 typedef struct { 62 const char *alias_name; 63 const metalink_digest_def *digest_def; 64 } metalink_digest_alias; 65 66 typedef 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 72 typedef struct metalink_resource { 73 struct metalink_resource *next; 74 char *url; 75 } metalink_resource; 76 77 typedef 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 97 extern const digest_params MD5_DIGEST_PARAMS[1]; 98 extern const digest_params SHA1_DIGEST_PARAMS[1]; 99 extern const digest_params SHA256_DIGEST_PARAMS[1]; 100 101 #include <metalink/metalink.h> 102 103 /* 104 * Counts the resource in the metalinkfile. 105 */ 106 int count_next_metalink_resource(metalinkfile *mlfile); 107 void 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 */ 119 int parse_metalink(struct OperationConfig *config, struct OutStruct *outs, 120 const char *metalink_url); 121 122 /* 123 * Callback function for CURLOPT_WRITEFUNCTION 124 */ 125 size_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 */ 132 int 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 */ 148 int metalink_check_hash(struct GlobalConfig *config, 149 metalinkfile *mlfile, 150 const char *filename); 151 152 /* 153 * Release resources allocated at global scope. 154 */ 155 void 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