1 | #ifndef HEADER_CURL_TOOL_METALINK_H |
2 | #define |
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 | |