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