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 */
|
---|