Home | History | Annotate | Download | only in src
      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 (at) 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 */
    168