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