• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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