• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 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 "HTTPHEADER") ||
209                  ($name eq "POSTQUOTE") ||
210                  ($name eq "PREQUOTE") ||
211                  ($name eq "HTTP200ALIASES") ||
212                  ($name eq "TELNETOPTIONS") ||
213                  ($name eq "MAIL_RCPT") ||
214                  ($name eq "RESOLVE") ||
215                  ($name eq "PROXYHEADER") ||
216                  ($name eq "QUOTE")) {
217              print "${pref} slist);\n$check";
218            }
219            elsif($name eq "HTTPPOST") {
220              print "${pref} httppost);\n$check";
221            }
222            elsif($name eq "MIMEPOST") {
223              print "${pref} mimepost);\n$check";
224            }
225            elsif($name eq "STDERR") {
226              print "${pref} stream);\n$check";
227            }
228            else {
229              print "${pref} &object);\n$check";
230            }
231            print "${pref} NULL);\n$check";
232        }
233        elsif($type eq "FUNCTIONPOINT") {
234            if($name =~ /([^ ]*)FUNCTION/) {
235              my $l=lc($1);
236              print "${pref}\n$i${l}cb);\n$check";
237            }
238            else {
239              print "${pref} &func);\n$check";
240            }
241            print "${pref} NULL);\n$check";
242        }
243        elsif($type eq "OFF_T") {
244            # play conservative to work with 32bit curl_off_t
245            print "${pref} OFF_NO);\n$check";
246            print "${pref} OFF_HI);\n$check";
247            print "${pref} OFF_LO);\n$check";
248        }
249        else {
250            print STDERR "\n---- $type\n";
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__); goto test_cleanup; }\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, 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