1#!/usr/bin/env perl 2#*************************************************************************** 3# _ _ ____ _ 4# Project ___| | | | _ \| | 5# / __| | | | |_) | | 6# | (__| |_| | _ <| |___ 7# \___|\___/|_| \_\_____| 8# 9# Copyright (C) 2017, 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 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 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_ssl_ctx_callback ssl_ctx_cb; 125static curl_ioctl_callback ioctlcb; 126static curl_sockopt_callback sockoptcb; 127static curl_opensocket_callback opensocketcb; 128static curl_seek_callback seekcb; 129static curl_sshkeycallback ssh_keycb; 130static curl_chunk_bgn_callback chunk_bgn_cb; 131static curl_chunk_end_callback chunk_end_cb; 132static curl_fnmatch_callback fnmatch_cb; 133static curl_closesocket_callback closesocketcb; 134static curl_xferinfo_callback xferinfocb; 135 136int 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 170HEADER 171 ; 172 173while(<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 297print <<FOOTER 298 curl_easy_setopt(curl, 1, 0); 299 res = CURLE_OK; 300test_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} 308FOOTER 309 ; 310