1#!/usr/bin/env perl 2#*************************************************************************** 3# _ _ ____ _ 4# Project ___| | | | _ \| | 5# / __| | | | |_) | | 6# | (__| |_| | _ <| |___ 7# \___|\___/|_| \_\_____| 8# 9# Copyright (C) 2017 - 2020, Daniel Stenberg, <daniel@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 28my $minlong = "LONG_MIN"; 29my $maxlong = "LONG_MAX"; 30# maximum long unsigned value 31my $maxulong = "ULONG_MAX"; 32 33print <<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 61struct 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 unknown 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 85static 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 95static 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 107static 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 114static 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 121static curl_progress_callback progresscb; 122static curl_write_callback headercb; 123static curl_debug_callback debugcb; 124static curl_trailer_callback trailercb; 125static curl_ssl_ctx_callback ssl_ctx_cb; 126static curl_ioctl_callback ioctlcb; 127static curl_sockopt_callback sockoptcb; 128static curl_opensocket_callback opensocketcb; 129static curl_seek_callback seekcb; 130static curl_sshkeycallback ssh_keycb; 131static curl_chunk_bgn_callback chunk_bgn_cb; 132static curl_chunk_end_callback chunk_end_cb; 133static curl_fnmatch_callback fnmatch_cb; 134static curl_closesocket_callback closesocketcb; 135static curl_xferinfo_callback xferinfocb; 136static curl_resolver_start_callback resolver_start_cb; 137 138int test(char *URL) 139{ 140 CURL *curl = NULL; 141 CURL *dep = NULL; 142 CURLSH *share = NULL; 143 char errorbuffer[CURL_ERROR_SIZE]; 144 void *conv_from_network_cb = NULL; 145 void *conv_to_network_cb = NULL; 146 void *conv_from_utf8_cb = NULL; 147 void *interleavecb = NULL; 148 char *stringpointerextra = (char *)"moooo"; 149 struct curl_slist *slist = NULL; 150 struct curl_httppost *httppost = NULL; 151 curl_mime *mimepost = NULL; 152 FILE *stream = stderr; 153 struct data object; 154 char *charp; 155 long val; 156 curl_off_t oval; 157 double dval; 158 curl_socket_t sockfd; 159 struct curl_certinfo *certinfo; 160 struct curl_tlssessioninfo *tlssession; 161 struct curl_blob blob = { (void *)"silly", 5, 0}; 162 CURLcode res = CURLE_OK; 163 (void)URL; /* not used */ 164 global_init(CURL_GLOBAL_ALL); 165 easy_init(dep); 166 easy_init(curl); 167 share = curl_share_init(); 168 if(!share) { 169 res = CURLE_OUT_OF_MEMORY; 170 goto test_cleanup; 171 } 172 173HEADER 174 ; 175 176while(<STDIN>) { 177 if($_ =~ /^ CURLOPT\(([^ ]*), ([^ ]*), (\d*)\)/) { 178 my ($name, $type, $val)=($1, $2, $3); 179 my $w=" "; 180 my $pref = "${w}res = curl_easy_setopt(curl, $name,"; 181 my $i = ' ' x (length($w) + 23); 182 my $check = " if(UNEX(res)) {\n err(\"$name\", res, __LINE__);\n goto test_cleanup;\n }\n"; 183 if($type eq "CURLOPTTYPE_STRINGPOINT") { 184 print "${pref} \"string\");\n$check"; 185 print "${pref} NULL);\n$check"; 186 } 187 elsif(($type eq "CURLOPTTYPE_LONG") || 188 ($type eq "CURLOPTTYPE_VALUES")) { 189 print "${pref} 0L);\n$check"; 190 print "${pref} 22L);\n$check"; 191 print "${pref} LO);\n$check"; 192 print "${pref} HI);\n$check"; 193 } 194 elsif(($type eq "CURLOPTTYPE_OBJECTPOINT") || 195 ($type eq "CURLOPTTYPE_CBPOINT")) { 196 if($name =~ /DEPENDS/) { 197 print "${pref} dep);\n$check"; 198 } 199 elsif($name =~ "SHARE") { 200 print "${pref} share);\n$check"; 201 } 202 elsif($name eq "CURLOPT_ERRORBUFFER") { 203 print "${pref} errorbuffer);\n$check"; 204 } 205 elsif(($name eq "CURLOPT_POSTFIELDS") || 206 ($name eq "CURLOPT_COPYPOSTFIELDS")) { 207 # set size to zero to avoid it being "illegal" 208 print " (void)curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);\n"; 209 print "${pref} stringpointerextra);\n$check"; 210 } 211 elsif($name eq "CURLOPT_HTTPPOST") { 212 print "${pref} httppost);\n$check"; 213 } 214 elsif($name eq "CURLOPT_MIMEPOST") { 215 print "${pref} mimepost);\n$check"; 216 } 217 elsif($name eq "CURLOPT_STDERR") { 218 print "${pref} stream);\n$check"; 219 } 220 else { 221 print "${pref} &object);\n$check"; 222 } 223 print "${pref} NULL);\n$check"; 224 } 225 elsif($type eq "CURLOPTTYPE_SLISTPOINT") { 226 print "${pref} slist);\n$check"; 227 } 228 elsif($type eq "CURLOPTTYPE_FUNCTIONPOINT") { 229 if($name =~ /([^ ]*)FUNCTION/) { 230 my $l=lc($1); 231 $l =~ s/^curlopt_//; 232 print "${pref}\n$i${l}cb);\n$check"; 233 } 234 else { 235 print "${pref} &func);\n$check"; 236 } 237 print "${pref} NULL);\n$check"; 238 } 239 elsif($type eq "CURLOPTTYPE_OFF_T") { 240 # play conservative to work with 32bit curl_off_t 241 print "${pref} OFF_NO);\n$check"; 242 print "${pref} OFF_HI);\n$check"; 243 print "${pref} OFF_LO);\n$check"; 244 } 245 elsif($type eq "CURLOPTTYPE_BLOB") { 246 print "${pref} &blob);\n$check"; 247 } 248 else { 249 print STDERR "\nUnknown type: $type\n"; 250 exit 22; # exit to make this noticed! 251 } 252 } 253 elsif($_ =~ /^ CURLINFO_NONE/) { 254 $infomode = 1; 255 } 256 elsif($infomode && 257 ($_ =~ /^ CURLINFO_([^ ]*) *= *CURLINFO_([^ ]*)/)) { 258 my ($info, $type)=($1, $2); 259 my $c = " res = curl_easy_getinfo(curl, CURLINFO_$info,"; 260 my $check = " if(UNEX(res)) {\n geterr(\"$info\", res, __LINE__);\n goto test_cleanup;\n }\n"; 261 if($type eq "STRING") { 262 print "$c &charp);\n$check"; 263 } 264 elsif($type eq "LONG") { 265 print "$c &val);\n$check"; 266 } 267 elsif($type eq "OFF_T") { 268 print "$c &oval);\n$check"; 269 } 270 elsif($type eq "DOUBLE") { 271 print "$c &dval);\n$check"; 272 } 273 elsif($type eq "SLIST") { 274 print "$c &slist);\n$check"; 275 print " if(slist)\n curl_slist_free_all(slist);\n"; 276 } 277 elsif($type eq "SOCKET") { 278 print "$c &sockfd);\n$check"; 279 } 280 elsif($type eq "PTR") { 281 if($info eq "CERTINFO") { 282 print "$c &certinfo);\n$check"; 283 } 284 elsif(($info eq "TLS_SESSION") || 285 ($info eq "TLS_SSL_PTR")) { 286 print "$c &tlssession);\n$check"; 287 } 288 else { 289 print STDERR "$info/$type is unsupported\n"; 290 } 291 } 292 else { 293 print STDERR "$type is unsupported\n"; 294 } 295 } 296} 297 298 299print <<FOOTER 300 curl_easy_setopt(curl, (CURLoption)1, 0); 301 res = CURLE_OK; 302test_cleanup: 303 curl_easy_cleanup(curl); 304 curl_easy_cleanup(dep); 305 curl_share_cleanup(share); 306 curl_global_cleanup(); 307 308 return (int)res; 309} 310FOOTER 311 ; 312