1#!/usr/bin/env perl 2#*************************************************************************** 3# _ _ ____ _ 4# Project ___| | | | _ \| | 5# / __| | | | |_) | | 6# | (__| |_| | _ <| |___ 7# \___|\___/|_| \_\_____| 8# 9# Copyright (C) 2017 - 2019, 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 CURLcode res = CURLE_OK; 162 (void)URL; /* not used */ 163 global_init(CURL_GLOBAL_ALL); 164 easy_init(dep); 165 easy_init(curl); 166 share = curl_share_init(); 167 if(!share) { 168 res = CURLE_OUT_OF_MEMORY; 169 goto test_cleanup; 170 } 171 172HEADER 173 ; 174 175while(<STDIN>) { 176 if($_ =~ /^ CINIT\(([^ ]*), ([^ ]*), (\d*)\)/) { 177 my ($name, $type, $val)=($1, $2, $3); 178 my $w=" "; 179 my $pref = "${w}res = curl_easy_setopt(curl, CURLOPT_$name,"; 180 my $i = ' ' x (length($w) + 23); 181 my $check = " if(UNEX(res)) {\n err(\"$name\", res, __LINE__); goto test_cleanup; }\n"; 182 if($type eq "STRINGPOINT") { 183 print "${pref} \"string\");\n$check"; 184 print "${pref} NULL);\n$check"; 185 } 186 elsif($type eq "LONG") { 187 print "${pref} 0L);\n$check"; 188 print "${pref} 22L);\n$check"; 189 print "${pref} LO);\n$check"; 190 print "${pref} HI);\n$check"; 191 } 192 elsif($type eq "OBJECTPOINT") { 193 if($name =~ /DEPENDS/) { 194 print "${pref} dep);\n$check"; 195 } 196 elsif($name =~ "SHARE") { 197 print "${pref} share);\n$check"; 198 } 199 elsif($name eq "ERRORBUFFER") { 200 print "${pref} errorbuffer);\n$check"; 201 } 202 elsif(($name eq "POSTFIELDS") || 203 ($name eq "COPYPOSTFIELDS")) { 204 # set size to zero to avoid it being "illegal" 205 print " (void)curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);\n"; 206 print "${pref} stringpointerextra);\n$check"; 207 } 208 elsif($name eq "HTTPPOST") { 209 print "${pref} httppost);\n$check"; 210 } 211 elsif($name eq "MIMEPOST") { 212 print "${pref} mimepost);\n$check"; 213 } 214 elsif($name eq "STDERR") { 215 print "${pref} stream);\n$check"; 216 } 217 else { 218 print "${pref} &object);\n$check"; 219 } 220 print "${pref} NULL);\n$check"; 221 } 222 elsif($type eq "SLISTPOINT") { 223 print "${pref} slist);\n$check"; 224 } 225 elsif($type eq "FUNCTIONPOINT") { 226 if($name =~ /([^ ]*)FUNCTION/) { 227 my $l=lc($1); 228 print "${pref}\n$i${l}cb);\n$check"; 229 } 230 else { 231 print "${pref} &func);\n$check"; 232 } 233 print "${pref} NULL);\n$check"; 234 } 235 elsif($type eq "OFF_T") { 236 # play conservative to work with 32bit curl_off_t 237 print "${pref} OFF_NO);\n$check"; 238 print "${pref} OFF_HI);\n$check"; 239 print "${pref} OFF_LO);\n$check"; 240 } 241 else { 242 print STDERR "\n---- $type\n"; 243 } 244 } 245 elsif($_ =~ /^ CURLINFO_NONE/) { 246 $infomode = 1; 247 } 248 elsif($infomode && 249 ($_ =~ /^ CURLINFO_([^ ]*) *= *CURLINFO_([^ ]*)/)) { 250 my ($info, $type)=($1, $2); 251 my $c = " res = curl_easy_getinfo(curl, CURLINFO_$info,"; 252 my $check = " if(UNEX(res)) {\n geterr(\"$info\", res, __LINE__); goto test_cleanup; }\n"; 253 if($type eq "STRING") { 254 print "$c &charp);\n$check"; 255 } 256 elsif($type eq "LONG") { 257 print "$c &val);\n$check"; 258 } 259 elsif($type eq "OFF_T") { 260 print "$c &oval);\n$check"; 261 } 262 elsif($type eq "DOUBLE") { 263 print "$c &dval);\n$check"; 264 } 265 elsif($type eq "SLIST") { 266 print "$c &slist);\n$check"; 267 print " if(slist)\n curl_slist_free_all(slist);\n"; 268 } 269 elsif($type eq "SOCKET") { 270 print "$c &sockfd);\n$check"; 271 } 272 elsif($type eq "PTR") { 273 if($info eq "CERTINFO") { 274 print "$c &certinfo);\n$check"; 275 } 276 elsif(($info eq "TLS_SESSION") || 277 ($info eq "TLS_SSL_PTR")) { 278 print "$c &tlssession);\n$check"; 279 } 280 else { 281 print STDERR "$info/$type is unsupported\n"; 282 } 283 } 284 else { 285 print STDERR "$type is unsupported\n"; 286 } 287 } 288} 289 290 291print <<FOOTER 292 curl_easy_setopt(curl, 1, 0); 293 res = CURLE_OK; 294test_cleanup: 295 curl_easy_cleanup(curl); 296 curl_easy_cleanup(dep); 297 curl_share_cleanup(share); 298 curl_global_cleanup(); 299 300 return (int)res; 301} 302FOOTER 303 ; 304