• 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 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