[352] | 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 */
|
---|