lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame^] | 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 */ |