Home | History | Annotate | Download | only in libtest
      1 #!/usr/bin/env perl
      2 #***************************************************************************
      3 #                                  _   _ ____  _
      4 #  Project                     ___| | | |  _ \| |
      5 #                             / __| | | | |_) | |
      6 #                            | (__| |_| |  _ <| |___
      7 #                             \___|\___/|_| \_\_____|
      8 #
      9 # Copyright (C) 2017, Daniel Stenberg, <daniel (at] haxx.se>, et al.
     10 #
     11 # This software is licensed as described in the file COPYING, which
     12 # you should have received as part of this distribution. The terms
     13 # are also available at https://curl.haxx.se/docs/copyright.html.
     14 #
     15 # You may opt to use, copy, modify, merge, publish, distribute and/or sell
     16 # copies of the Software, and permit persons to whom the Software is
     17 # furnished to do so, under the terms of the COPYING file.
     18 #
     19 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
     20 # KIND, either express or implied.
     21 #
     22 ###########################################################################
     23 
     24 # Usage:
     25 #   perl mk-lib1521.pl < ../../include/curl/curl.h > lib1521.c
     26 
     27 # minimum and maximum long signed values
     28 my $minlong = "LONG_MIN";
     29 my $maxlong = "LONG_MAX";
     30 # maximum long unsigned value
     31 my $maxulong = "ULONG_MAX";
     32 
     33 print <<HEADER
     34 /***************************************************************************
     35  *                                  _   _ ____  _
     36  *  Project                     ___| | | |  _ \\| |
     37  *                             / __| | | | |_) | |
     38  *                            | (__| |_| |  _ <| |___
     39  *                             \\___|\\___/|_| \\_\\_____|
     40  *
     41  * Copyright (C) 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
     42  *
     43  * This software is licensed as described in the file COPYING, which
     44  * you should have received as part of this distribution. The terms
     45  * are also available at https://curl.haxx.se/docs/copyright.html.
     46  *
     47  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
     48  * copies of the Software, and permit persons to whom the Software is
     49  * furnished to do so, under the terms of the COPYING file.
     50  *
     51  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
     52  * KIND, either express or implied.
     53  *
     54  ***************************************************************************/
     55 #include "test.h"
     56 #include "memdebug.h"
     57 #include <limits.h>
     58 
     59 /* This source code is generated by mk-lib1521.pl ! */
     60 
     61 struct data {
     62     char *blaha;
     63 };
     64 
     65 #define LO $minlong
     66 #define HI $maxlong
     67 #define OFF_LO (curl_off_t) LO
     68 #define OFF_HI (curl_off_t) $maxulong
     69 #define OFF_NO (curl_off_t) 0
     70 
     71 /* Unexpected error.
     72     CURLE_NOT_BUILT_IN   - means disabled at build
     73     CURLE_UNKNOWN_OPTION - means no such option (anymore?)
     74     CURLE_SSL_ENGINE_NOTFOUND - set unkown ssl engine
     75     CURLE_UNSUPPORTED_PROTOCOL - set bad HTTP version
     76     CURLE_BAD_FUNCTION_ARGUMENT - unsupported value
     77    */
     78 #define UNEX(x) ((x) && \\
     79                  ((x) != CURLE_NOT_BUILT_IN) && \\
     80                  ((x) != CURLE_UNKNOWN_OPTION) && \\
     81                  ((x) != CURLE_SSL_ENGINE_NOTFOUND) && \\
     82                  ((x) != CURLE_UNSUPPORTED_PROTOCOL) && \\
     83                  ((x) != CURLE_BAD_FUNCTION_ARGUMENT) )
     84 
     85 static size_t writecb(char *buffer, size_t size, size_t nitems,
     86                       void *outstream)
     87 {
     88   (void)buffer;
     89   (void)size;
     90   (void)nitems;
     91   (void)outstream;
     92   return 0;
     93 }
     94 
     95 static size_t readcb(char *buffer,
     96               size_t size,
     97               size_t nitems,
     98               void *instream)
     99 {
    100   (void)buffer;
    101   (void)size;
    102   (void)nitems;
    103   (void)instream;
    104   return 0;
    105 }
    106 
    107 static int err(const char *name, CURLcode val, int lineno)
    108 {
    109   printf("CURLOPT_%s returned %d, \\"%s\\" on line %d\\n",
    110          name, val, curl_easy_strerror(val), lineno);
    111   return (int)val;
    112 }
    113 
    114 static int geterr(const char *name, CURLcode val, int lineno)
    115 {
    116   printf("CURLINFO_%s returned %d, \\"%s\\" on line %d\\n",
    117          name, val, curl_easy_strerror(val), lineno);
    118   return (int)val;
    119 }
    120 
    121 static curl_progress_callback progresscb;
    122 static curl_write_callback headercb;
    123 static curl_debug_callback debugcb;
    124 static curl_ssl_ctx_callback ssl_ctx_cb;
    125 static curl_ioctl_callback ioctlcb;
    126 static curl_sockopt_callback sockoptcb;
    127 static curl_opensocket_callback opensocketcb;
    128 static curl_seek_callback seekcb;
    129 static curl_sshkeycallback ssh_keycb;
    130 static curl_chunk_bgn_callback chunk_bgn_cb;
    131 static curl_chunk_end_callback chunk_end_cb;
    132 static curl_fnmatch_callback fnmatch_cb;
    133 static curl_closesocket_callback closesocketcb;
    134 static curl_xferinfo_callback xferinfocb;
    135 
    136 int test(char *URL)
    137 {
    138   CURL *curl = NULL;
    139   CURL *dep = NULL;
    140   CURLSH *share = NULL;
    141   char errorbuffer[CURL_ERROR_SIZE];
    142   void *conv_from_network_cb = NULL;
    143   void *conv_to_network_cb = NULL;
    144   void *conv_from_utf8_cb = NULL;
    145   void *interleavecb = NULL;
    146   char *stringpointerextra = (char *)"moooo";
    147   struct curl_slist *slist = NULL;
    148   struct curl_httppost *httppost = NULL;
    149   curl_mime *mimepost = NULL;
    150   FILE *stream = stderr;
    151   struct data object;
    152   char *charp;
    153   long val;
    154   curl_off_t oval;
    155   double dval;
    156   curl_socket_t sockfd;
    157   struct curl_certinfo *certinfo;
    158   struct curl_tlssessioninfo *tlssession;
    159   CURLcode res = CURLE_OK;
    160   (void)URL; /* not used */
    161   global_init(CURL_GLOBAL_ALL);
    162   easy_init(dep);
    163   easy_init(curl);
    164   share = curl_share_init();
    165   if(!share) {
    166     res = CURLE_OUT_OF_MEMORY;
    167     goto test_cleanup;
    168   }
    169 
    170 HEADER
    171     ;
    172 
    173 while(<STDIN>) {
    174     if($_ =~ /^  CINIT\(([^ ]*), ([^ ]*), (\d*)\)/) {
    175         my ($name, $type, $val)=($1, $2, $3);
    176         my $w="  ";
    177         my $pref = "${w}res = curl_easy_setopt(curl, CURLOPT_$name,";
    178         my $i = ' ' x (length($w) + 23);
    179         my $check = "  if(UNEX(res)) {\n    err(\"$name\", res, __LINE__); goto test_cleanup; }\n";
    180         if($type eq "STRINGPOINT") {
    181             print "${pref} \"string\");\n$check";
    182             print "${pref} NULL);\n$check";
    183         }
    184         elsif($type eq "LONG") {
    185             print "${pref} 0L);\n$check";
    186             print "${pref} 22L);\n$check";
    187             print "${pref} LO);\n$check";
    188             print "${pref} HI);\n$check";
    189         }
    190         elsif($type eq "OBJECTPOINT") {
    191             if($name =~ /DEPENDS/) {
    192               print "${pref} dep);\n$check";
    193             }
    194             elsif($name =~ "SHARE") {
    195               print "${pref} share);\n$check";
    196             }
    197             elsif($name eq "ERRORBUFFER") {
    198               print "${pref} errorbuffer);\n$check";
    199             }
    200             elsif(($name eq "POSTFIELDS") ||
    201                   ($name eq "COPYPOSTFIELDS")) {
    202               # set size to zero to avoid it being "illegal"
    203               print "  (void)curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);\n";
    204               print "${pref} stringpointerextra);\n$check";
    205             }
    206             elsif(($name eq "HTTPHEADER") ||
    207                   ($name eq "POSTQUOTE") ||
    208                   ($name eq "PREQUOTE") ||
    209                   ($name eq "HTTP200ALIASES") ||
    210                   ($name eq "TELNETOPTIONS") ||
    211                   ($name eq "MAIL_RCPT") ||
    212                   ($name eq "RESOLVE") ||
    213                   ($name eq "PROXYHEADER") ||
    214                   ($name eq "QUOTE")) {
    215               print "${pref} slist);\n$check";
    216             }
    217             elsif($name eq "HTTPPOST") {
    218               print "${pref} httppost);\n$check";
    219             }
    220             elsif($name eq "MIMEPOST") {
    221               print "${pref} mimepost);\n$check";
    222             }
    223             elsif($name eq "STDERR") {
    224               print "${pref} stream);\n$check";
    225             }
    226             else {
    227               print "${pref} &object);\n$check";
    228             }
    229             print "${pref} NULL);\n$check";
    230         }
    231         elsif($type eq "FUNCTIONPOINT") {
    232             if($name =~ /([^ ]*)FUNCTION/) {
    233               my $l=lc($1);
    234               print "${pref}\n$i${l}cb);\n$check";
    235             }
    236             else {
    237               print "${pref} &func);\n$check";
    238             }
    239             print "${pref} NULL);\n$check";
    240         }
    241         elsif($type eq "OFF_T") {
    242             # play conservative to work with 32bit curl_off_t
    243             print "${pref} OFF_NO);\n$check";
    244             print "${pref} OFF_HI);\n$check";
    245             print "${pref} OFF_LO);\n$check";
    246         }
    247         else {
    248             print STDERR "\n---- $type\n";
    249         }
    250     }
    251     elsif($_ =~ /^  CURLINFO_NONE/) {
    252        $infomode = 1;
    253     }
    254     elsif($infomode &&
    255           ($_ =~ /^  CURLINFO_([^ ]*) *= *CURLINFO_([^ ]*)/)) {
    256        my ($info, $type)=($1, $2);
    257        my $c = "  res = curl_easy_getinfo(curl, CURLINFO_$info,";
    258        my $check = "  if(UNEX(res)) {\n    geterr(\"$info\", res, __LINE__); goto test_cleanup; }\n";
    259        if($type eq "STRING") {
    260          print "$c &charp);\n$check";
    261        }
    262        elsif($type eq "LONG") {
    263          print "$c &val);\n$check";
    264        }
    265        elsif($type eq "OFF_T") {
    266          print "$c &oval);\n$check";
    267        }
    268        elsif($type eq "DOUBLE") {
    269          print "$c &dval);\n$check";
    270        }
    271        elsif($type eq "SLIST") {
    272          print "$c &slist);\n$check";
    273          print "  if(slist)\n    curl_slist_free_all(slist);\n";
    274        }
    275        elsif($type eq "SOCKET") {
    276          print "$c &sockfd);\n$check";
    277        }
    278        elsif($type eq "PTR") {
    279          if($info eq "CERTINFO") {
    280             print "$c &certinfo);\n$check";
    281          }
    282          elsif(($info eq "TLS_SESSION") ||
    283                ($info eq "TLS_SSL_PTR")) {
    284             print "$c &tlssession);\n$check";
    285          }
    286          else {
    287             print STDERR "$info/$type is unsupported\n";
    288          }
    289        }
    290        else {
    291          print STDERR "$type is unsupported\n";
    292        }
    293     }
    294 }
    295 
    296 
    297 print <<FOOTER
    298   curl_easy_setopt(curl, 1, 0);
    299   res = CURLE_OK;
    300 test_cleanup:
    301   curl_easy_cleanup(curl);
    302   curl_easy_cleanup(dep);
    303   curl_share_cleanup(share);
    304   curl_global_cleanup();
    305 
    306   return (int)res;
    307 }
    308 FOOTER
    309     ;
    310