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, 2019, 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 #include "tool_sdecls.h" 26 27 struct GlobalConfig; 28 struct OperationConfig; 29 30 /* returns 1 for success, 0 otherwise (we use OpenSSL *_Init fncs directly) */ 31 typedef int (* Curl_digest_init_func)(void *context); 32 33 typedef void (* Curl_digest_update_func)(void *context, 34 const unsigned char *data, 35 unsigned int len); 36 typedef void (* Curl_digest_final_func)(unsigned char *result, void *context); 37 38 typedef struct { 39 Curl_digest_init_func digest_init; /* Initialize context procedure */ 40 Curl_digest_update_func digest_update; /* Update context with data */ 41 Curl_digest_final_func digest_final; /* Get final result procedure */ 42 unsigned int digest_ctxtsize; /* Context structure size */ 43 unsigned int digest_resultlen; /* Result length (bytes) */ 44 } digest_params; 45 46 typedef struct { 47 const digest_params *digest_hash; /* Hash function definition */ 48 void *digest_hashctx; /* Hash function context */ 49 } digest_context; 50 51 digest_context * Curl_digest_init(const digest_params *dparams); 52 int Curl_digest_update(digest_context *context, 53 const unsigned char *data, 54 unsigned int len); 55 int Curl_digest_final(digest_context *context, unsigned char *result); 56 57 typedef struct { 58 const char *hash_name; 59 const digest_params *dparams; 60 } metalink_digest_def; 61 62 typedef struct { 63 const char *alias_name; 64 const metalink_digest_def *digest_def; 65 } metalink_digest_alias; 66 67 typedef struct metalink_checksum { 68 const metalink_digest_def *digest_def; 69 /* raw digest value, not ascii hex digest */ 70 unsigned char *digest; 71 } metalink_checksum; 72 73 typedef struct metalink_resource { 74 struct metalink_resource *next; 75 char *url; 76 } metalink_resource; 77 78 typedef struct metalinkfile { 79 struct metalinkfile *next; 80 char *filename; 81 metalink_checksum *checksum; 82 metalink_resource *resource; 83 } metalinkfile; 84 85 #ifdef USE_METALINK 86 87 /* 88 * curl requires libmetalink 0.1.0 or newer 89 */ 90 #define CURL_REQ_LIBMETALINK_MAJOR 0 91 #define CURL_REQ_LIBMETALINK_MINOR 1 92 #define CURL_REQ_LIBMETALINK_PATCH 0 93 94 #define CURL_REQ_LIBMETALINK_VERS ((CURL_REQ_LIBMETALINK_MAJOR * 10000) + \ 95 (CURL_REQ_LIBMETALINK_MINOR * 100) + \ 96 CURL_REQ_LIBMETALINK_PATCH) 97 98 extern const digest_params MD5_DIGEST_PARAMS[1]; 99 extern const digest_params SHA1_DIGEST_PARAMS[1]; 100 extern const digest_params SHA256_DIGEST_PARAMS[1]; 101 102 #include <metalink/metalink.h> 103 104 /* 105 * Counts the resource in the metalinkfile. 106 */ 107 int count_next_metalink_resource(metalinkfile *mlfile); 108 109 void delete_metalinkfile(metalinkfile *mlfile); 110 void clean_metalink(struct OperationConfig *config); 111 112 /* 113 * Performs final parse operation and extracts information from 114 * Metalink and creates metalinkfile structs. 115 * 116 * This function returns 0 if it succeeds without warnings, or one of 117 * the following negative error codes: 118 * 119 * -1: Parsing failed; or no file is found 120 * -2: Parsing succeeded with some warnings. 121 */ 122 int parse_metalink(struct OperationConfig *config, struct OutStruct *outs, 123 const char *metalink_url); 124 125 /* 126 * Callback function for CURLOPT_WRITEFUNCTION 127 */ 128 size_t metalink_write_cb(void *buffer, size_t sz, size_t nmemb, 129 void *userdata); 130 131 /* 132 * Returns nonzero if content_type includes "application/metalink+xml" 133 * media-type. The check is done in case-insensitive manner. 134 */ 135 int check_metalink_content_type(const char *content_type); 136 137 /* 138 * Check checksum of file denoted by filename. 139 * 140 * This function returns 1 if the checksum matches or one of the 141 * following integers: 142 * 143 * 0: 144 * Checksum didn't match. 145 * -1: 146 * Could not open file; or could not read data from file. 147 * -2: 148 * No checksum in Metalink supported, hash algorithm not available, or 149 * Metalink does not contain checksum. 150 */ 151 int metalink_check_hash(struct GlobalConfig *config, 152 metalinkfile *mlfile, 153 const char *filename); 154 155 /* 156 * Release resources allocated at global scope. 157 */ 158 void metalink_cleanup(void); 159 160 #else /* USE_METALINK */ 161 162 #define count_next_metalink_resource(x) 0 163 #define delete_metalinkfile(x) (void)x 164 #define clean_metalink(x) (void)x 165 166 /* metalink_cleanup() takes no arguments */ 167 #define metalink_cleanup() Curl_nop_stmt 168 169 #endif /* USE_METALINK */ 170 171 #endif /* HEADER_CURL_TOOL_METALINK_H */ 172