1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _
3*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| |
4*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___
6*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker *
8*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker *
10*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker *
14*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker *
18*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker *
21*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker *
23*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker #include "tool_setup.h"
25*6236dae4SAndroid Build Coastguard Worker
26*6236dae4SAndroid Build Coastguard Worker #include "slist_wc.h"
27*6236dae4SAndroid Build Coastguard Worker
28*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_LIBCURL_OPTION
29*6236dae4SAndroid Build Coastguard Worker
30*6236dae4SAndroid Build Coastguard Worker #include "curlx.h"
31*6236dae4SAndroid Build Coastguard Worker
32*6236dae4SAndroid Build Coastguard Worker #include "tool_cfgable.h"
33*6236dae4SAndroid Build Coastguard Worker #include "tool_easysrc.h"
34*6236dae4SAndroid Build Coastguard Worker #include "tool_msgs.h"
35*6236dae4SAndroid Build Coastguard Worker
36*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h" /* keep this as LAST include */
37*6236dae4SAndroid Build Coastguard Worker
38*6236dae4SAndroid Build Coastguard Worker /* global variable definitions, for easy-interface source code generation */
39*6236dae4SAndroid Build Coastguard Worker
40*6236dae4SAndroid Build Coastguard Worker struct slist_wc *easysrc_decl = NULL; /* Variable declarations */
41*6236dae4SAndroid Build Coastguard Worker struct slist_wc *easysrc_data = NULL; /* Build slists, forms etc. */
42*6236dae4SAndroid Build Coastguard Worker struct slist_wc *easysrc_code = NULL; /* Setopt calls */
43*6236dae4SAndroid Build Coastguard Worker struct slist_wc *easysrc_toohard = NULL; /* Unconvertible setopt */
44*6236dae4SAndroid Build Coastguard Worker struct slist_wc *easysrc_clean = NULL; /* Clean up allocated data */
45*6236dae4SAndroid Build Coastguard Worker int easysrc_mime_count = 0;
46*6236dae4SAndroid Build Coastguard Worker int easysrc_slist_count = 0;
47*6236dae4SAndroid Build Coastguard Worker
48*6236dae4SAndroid Build Coastguard Worker static const char *const srchead[]={
49*6236dae4SAndroid Build Coastguard Worker "/********* Sample code generated by the curl command line tool **********",
50*6236dae4SAndroid Build Coastguard Worker " * All curl_easy_setopt() options are documented at:",
51*6236dae4SAndroid Build Coastguard Worker " * https://curl.se/libcurl/c/curl_easy_setopt.html",
52*6236dae4SAndroid Build Coastguard Worker " ************************************************************************/",
53*6236dae4SAndroid Build Coastguard Worker "#include <curl/curl.h>",
54*6236dae4SAndroid Build Coastguard Worker "",
55*6236dae4SAndroid Build Coastguard Worker "int main(int argc, char *argv[])",
56*6236dae4SAndroid Build Coastguard Worker "{",
57*6236dae4SAndroid Build Coastguard Worker " CURLcode ret;",
58*6236dae4SAndroid Build Coastguard Worker " CURL *hnd;",
59*6236dae4SAndroid Build Coastguard Worker NULL
60*6236dae4SAndroid Build Coastguard Worker };
61*6236dae4SAndroid Build Coastguard Worker /* easysrc_decl declarations come here */
62*6236dae4SAndroid Build Coastguard Worker /* easysrc_data initialization come here */
63*6236dae4SAndroid Build Coastguard Worker /* easysrc_code statements come here */
64*6236dae4SAndroid Build Coastguard Worker static const char *const srchard[]={
65*6236dae4SAndroid Build Coastguard Worker "/* Here is a list of options the curl code used that cannot get generated",
66*6236dae4SAndroid Build Coastguard Worker " as source easily. You may choose to either not use them or implement",
67*6236dae4SAndroid Build Coastguard Worker " them yourself.",
68*6236dae4SAndroid Build Coastguard Worker "",
69*6236dae4SAndroid Build Coastguard Worker NULL
70*6236dae4SAndroid Build Coastguard Worker };
71*6236dae4SAndroid Build Coastguard Worker static const char *const srcend[]={
72*6236dae4SAndroid Build Coastguard Worker "",
73*6236dae4SAndroid Build Coastguard Worker " return (int)ret;",
74*6236dae4SAndroid Build Coastguard Worker "}",
75*6236dae4SAndroid Build Coastguard Worker "/**** End of sample code ****/",
76*6236dae4SAndroid Build Coastguard Worker NULL
77*6236dae4SAndroid Build Coastguard Worker };
78*6236dae4SAndroid Build Coastguard Worker
79*6236dae4SAndroid Build Coastguard Worker /* Clean up all source code if we run out of memory */
easysrc_free(void)80*6236dae4SAndroid Build Coastguard Worker static void easysrc_free(void)
81*6236dae4SAndroid Build Coastguard Worker {
82*6236dae4SAndroid Build Coastguard Worker slist_wc_free_all(easysrc_decl);
83*6236dae4SAndroid Build Coastguard Worker easysrc_decl = NULL;
84*6236dae4SAndroid Build Coastguard Worker slist_wc_free_all(easysrc_data);
85*6236dae4SAndroid Build Coastguard Worker easysrc_data = NULL;
86*6236dae4SAndroid Build Coastguard Worker slist_wc_free_all(easysrc_code);
87*6236dae4SAndroid Build Coastguard Worker easysrc_code = NULL;
88*6236dae4SAndroid Build Coastguard Worker slist_wc_free_all(easysrc_toohard);
89*6236dae4SAndroid Build Coastguard Worker easysrc_toohard = NULL;
90*6236dae4SAndroid Build Coastguard Worker slist_wc_free_all(easysrc_clean);
91*6236dae4SAndroid Build Coastguard Worker easysrc_clean = NULL;
92*6236dae4SAndroid Build Coastguard Worker }
93*6236dae4SAndroid Build Coastguard Worker
94*6236dae4SAndroid Build Coastguard Worker /* Add a source line to the main code or remarks */
easysrc_add(struct slist_wc ** plist,const char * line)95*6236dae4SAndroid Build Coastguard Worker CURLcode easysrc_add(struct slist_wc **plist, const char *line)
96*6236dae4SAndroid Build Coastguard Worker {
97*6236dae4SAndroid Build Coastguard Worker CURLcode ret = CURLE_OK;
98*6236dae4SAndroid Build Coastguard Worker struct slist_wc *list = slist_wc_append(*plist, line);
99*6236dae4SAndroid Build Coastguard Worker if(!list) {
100*6236dae4SAndroid Build Coastguard Worker easysrc_free();
101*6236dae4SAndroid Build Coastguard Worker ret = CURLE_OUT_OF_MEMORY;
102*6236dae4SAndroid Build Coastguard Worker }
103*6236dae4SAndroid Build Coastguard Worker else
104*6236dae4SAndroid Build Coastguard Worker *plist = list;
105*6236dae4SAndroid Build Coastguard Worker return ret;
106*6236dae4SAndroid Build Coastguard Worker }
107*6236dae4SAndroid Build Coastguard Worker
easysrc_addf(struct slist_wc ** plist,const char * fmt,...)108*6236dae4SAndroid Build Coastguard Worker CURLcode easysrc_addf(struct slist_wc **plist, const char *fmt, ...)
109*6236dae4SAndroid Build Coastguard Worker {
110*6236dae4SAndroid Build Coastguard Worker CURLcode ret;
111*6236dae4SAndroid Build Coastguard Worker char *bufp;
112*6236dae4SAndroid Build Coastguard Worker va_list ap;
113*6236dae4SAndroid Build Coastguard Worker va_start(ap, fmt);
114*6236dae4SAndroid Build Coastguard Worker bufp = vaprintf(fmt, ap);
115*6236dae4SAndroid Build Coastguard Worker va_end(ap);
116*6236dae4SAndroid Build Coastguard Worker if(!bufp) {
117*6236dae4SAndroid Build Coastguard Worker ret = CURLE_OUT_OF_MEMORY;
118*6236dae4SAndroid Build Coastguard Worker }
119*6236dae4SAndroid Build Coastguard Worker else {
120*6236dae4SAndroid Build Coastguard Worker ret = easysrc_add(plist, bufp);
121*6236dae4SAndroid Build Coastguard Worker curl_free(bufp);
122*6236dae4SAndroid Build Coastguard Worker }
123*6236dae4SAndroid Build Coastguard Worker return ret;
124*6236dae4SAndroid Build Coastguard Worker }
125*6236dae4SAndroid Build Coastguard Worker
126*6236dae4SAndroid Build Coastguard Worker #define CHKRET(v) do {CURLcode ret = (v); if(ret) return ret;} while(0)
127*6236dae4SAndroid Build Coastguard Worker
easysrc_init(void)128*6236dae4SAndroid Build Coastguard Worker CURLcode easysrc_init(void)
129*6236dae4SAndroid Build Coastguard Worker {
130*6236dae4SAndroid Build Coastguard Worker CHKRET(easysrc_add(&easysrc_code,
131*6236dae4SAndroid Build Coastguard Worker "hnd = curl_easy_init();"));
132*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
133*6236dae4SAndroid Build Coastguard Worker }
134*6236dae4SAndroid Build Coastguard Worker
easysrc_perform(void)135*6236dae4SAndroid Build Coastguard Worker CURLcode easysrc_perform(void)
136*6236dae4SAndroid Build Coastguard Worker {
137*6236dae4SAndroid Build Coastguard Worker /* Note any setopt calls which we could not convert */
138*6236dae4SAndroid Build Coastguard Worker if(easysrc_toohard) {
139*6236dae4SAndroid Build Coastguard Worker int i;
140*6236dae4SAndroid Build Coastguard Worker struct curl_slist *ptr;
141*6236dae4SAndroid Build Coastguard Worker const char *c;
142*6236dae4SAndroid Build Coastguard Worker CHKRET(easysrc_add(&easysrc_code, ""));
143*6236dae4SAndroid Build Coastguard Worker /* Preamble comment */
144*6236dae4SAndroid Build Coastguard Worker for(i = 0; ((c = srchard[i]) != NULL); i++)
145*6236dae4SAndroid Build Coastguard Worker CHKRET(easysrc_add(&easysrc_code, c));
146*6236dae4SAndroid Build Coastguard Worker /* Each unconverted option */
147*6236dae4SAndroid Build Coastguard Worker if(easysrc_toohard) {
148*6236dae4SAndroid Build Coastguard Worker for(ptr = easysrc_toohard->first; ptr; ptr = ptr->next)
149*6236dae4SAndroid Build Coastguard Worker CHKRET(easysrc_add(&easysrc_code, ptr->data));
150*6236dae4SAndroid Build Coastguard Worker }
151*6236dae4SAndroid Build Coastguard Worker CHKRET(easysrc_add(&easysrc_code, ""));
152*6236dae4SAndroid Build Coastguard Worker CHKRET(easysrc_add(&easysrc_code, "*/"));
153*6236dae4SAndroid Build Coastguard Worker
154*6236dae4SAndroid Build Coastguard Worker slist_wc_free_all(easysrc_toohard);
155*6236dae4SAndroid Build Coastguard Worker easysrc_toohard = NULL;
156*6236dae4SAndroid Build Coastguard Worker }
157*6236dae4SAndroid Build Coastguard Worker
158*6236dae4SAndroid Build Coastguard Worker CHKRET(easysrc_add(&easysrc_code, ""));
159*6236dae4SAndroid Build Coastguard Worker CHKRET(easysrc_add(&easysrc_code, "ret = curl_easy_perform(hnd);"));
160*6236dae4SAndroid Build Coastguard Worker CHKRET(easysrc_add(&easysrc_code, ""));
161*6236dae4SAndroid Build Coastguard Worker
162*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
163*6236dae4SAndroid Build Coastguard Worker }
164*6236dae4SAndroid Build Coastguard Worker
easysrc_cleanup(void)165*6236dae4SAndroid Build Coastguard Worker CURLcode easysrc_cleanup(void)
166*6236dae4SAndroid Build Coastguard Worker {
167*6236dae4SAndroid Build Coastguard Worker CHKRET(easysrc_add(&easysrc_code, "curl_easy_cleanup(hnd);"));
168*6236dae4SAndroid Build Coastguard Worker CHKRET(easysrc_add(&easysrc_code, "hnd = NULL;"));
169*6236dae4SAndroid Build Coastguard Worker
170*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
171*6236dae4SAndroid Build Coastguard Worker }
172*6236dae4SAndroid Build Coastguard Worker
dumpeasysrc(struct GlobalConfig * config)173*6236dae4SAndroid Build Coastguard Worker void dumpeasysrc(struct GlobalConfig *config)
174*6236dae4SAndroid Build Coastguard Worker {
175*6236dae4SAndroid Build Coastguard Worker struct curl_slist *ptr;
176*6236dae4SAndroid Build Coastguard Worker char *o = config->libcurl;
177*6236dae4SAndroid Build Coastguard Worker
178*6236dae4SAndroid Build Coastguard Worker FILE *out;
179*6236dae4SAndroid Build Coastguard Worker bool fopened = FALSE;
180*6236dae4SAndroid Build Coastguard Worker if(strcmp(o, "-")) {
181*6236dae4SAndroid Build Coastguard Worker out = fopen(o, FOPEN_WRITETEXT);
182*6236dae4SAndroid Build Coastguard Worker fopened = TRUE;
183*6236dae4SAndroid Build Coastguard Worker }
184*6236dae4SAndroid Build Coastguard Worker else
185*6236dae4SAndroid Build Coastguard Worker out = stdout;
186*6236dae4SAndroid Build Coastguard Worker if(!out)
187*6236dae4SAndroid Build Coastguard Worker warnf(config, "Failed to open %s to write libcurl code", o);
188*6236dae4SAndroid Build Coastguard Worker else {
189*6236dae4SAndroid Build Coastguard Worker int i;
190*6236dae4SAndroid Build Coastguard Worker const char *c;
191*6236dae4SAndroid Build Coastguard Worker
192*6236dae4SAndroid Build Coastguard Worker for(i = 0; ((c = srchead[i]) != NULL); i++)
193*6236dae4SAndroid Build Coastguard Worker fprintf(out, "%s\n", c);
194*6236dae4SAndroid Build Coastguard Worker
195*6236dae4SAndroid Build Coastguard Worker /* Declare variables used for complex setopt values */
196*6236dae4SAndroid Build Coastguard Worker if(easysrc_decl) {
197*6236dae4SAndroid Build Coastguard Worker for(ptr = easysrc_decl->first; ptr; ptr = ptr->next)
198*6236dae4SAndroid Build Coastguard Worker fprintf(out, " %s\n", ptr->data);
199*6236dae4SAndroid Build Coastguard Worker }
200*6236dae4SAndroid Build Coastguard Worker
201*6236dae4SAndroid Build Coastguard Worker /* Set up complex values for setopt calls */
202*6236dae4SAndroid Build Coastguard Worker if(easysrc_data) {
203*6236dae4SAndroid Build Coastguard Worker fprintf(out, "\n");
204*6236dae4SAndroid Build Coastguard Worker
205*6236dae4SAndroid Build Coastguard Worker for(ptr = easysrc_data->first; ptr; ptr = ptr->next)
206*6236dae4SAndroid Build Coastguard Worker fprintf(out, " %s\n", ptr->data);
207*6236dae4SAndroid Build Coastguard Worker }
208*6236dae4SAndroid Build Coastguard Worker
209*6236dae4SAndroid Build Coastguard Worker fprintf(out, "\n");
210*6236dae4SAndroid Build Coastguard Worker if(easysrc_code) {
211*6236dae4SAndroid Build Coastguard Worker for(ptr = easysrc_code->first; ptr; ptr = ptr->next) {
212*6236dae4SAndroid Build Coastguard Worker if(ptr->data[0]) {
213*6236dae4SAndroid Build Coastguard Worker fprintf(out, " %s\n", ptr->data);
214*6236dae4SAndroid Build Coastguard Worker }
215*6236dae4SAndroid Build Coastguard Worker else {
216*6236dae4SAndroid Build Coastguard Worker fprintf(out, "\n");
217*6236dae4SAndroid Build Coastguard Worker }
218*6236dae4SAndroid Build Coastguard Worker }
219*6236dae4SAndroid Build Coastguard Worker }
220*6236dae4SAndroid Build Coastguard Worker
221*6236dae4SAndroid Build Coastguard Worker if(easysrc_clean) {
222*6236dae4SAndroid Build Coastguard Worker for(ptr = easysrc_clean->first; ptr; ptr = ptr->next)
223*6236dae4SAndroid Build Coastguard Worker fprintf(out, " %s\n", ptr->data);
224*6236dae4SAndroid Build Coastguard Worker }
225*6236dae4SAndroid Build Coastguard Worker
226*6236dae4SAndroid Build Coastguard Worker for(i = 0; ((c = srcend[i]) != NULL); i++)
227*6236dae4SAndroid Build Coastguard Worker fprintf(out, "%s\n", c);
228*6236dae4SAndroid Build Coastguard Worker
229*6236dae4SAndroid Build Coastguard Worker if(fopened)
230*6236dae4SAndroid Build Coastguard Worker fclose(out);
231*6236dae4SAndroid Build Coastguard Worker }
232*6236dae4SAndroid Build Coastguard Worker
233*6236dae4SAndroid Build Coastguard Worker easysrc_free();
234*6236dae4SAndroid Build Coastguard Worker }
235*6236dae4SAndroid Build Coastguard Worker
236*6236dae4SAndroid Build Coastguard Worker #endif /* CURL_DISABLE_LIBCURL_OPTION */
237