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
25*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h"
26*6236dae4SAndroid Build Coastguard Worker
27*6236dae4SAndroid Build Coastguard Worker #ifdef __AMIGA__
28*6236dae4SAndroid Build Coastguard Worker
29*6236dae4SAndroid Build Coastguard Worker #include <curl/curl.h>
30*6236dae4SAndroid Build Coastguard Worker
31*6236dae4SAndroid Build Coastguard Worker #include "hostip.h"
32*6236dae4SAndroid Build Coastguard Worker #include "amigaos.h"
33*6236dae4SAndroid Build Coastguard Worker
34*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_PROTO_BSDSOCKET_H
35*6236dae4SAndroid Build Coastguard Worker # if defined(__amigaos4__)
36*6236dae4SAndroid Build Coastguard Worker # include <bsdsocket/socketbasetags.h>
37*6236dae4SAndroid Build Coastguard Worker # elif !defined(USE_AMISSL)
38*6236dae4SAndroid Build Coastguard Worker # include <amitcp/socketbasetags.h>
39*6236dae4SAndroid Build Coastguard Worker # endif
40*6236dae4SAndroid Build Coastguard Worker # ifdef __libnix__
41*6236dae4SAndroid Build Coastguard Worker # include <stabs.h>
42*6236dae4SAndroid Build Coastguard Worker # endif
43*6236dae4SAndroid Build Coastguard Worker #endif
44*6236dae4SAndroid Build Coastguard Worker
45*6236dae4SAndroid Build Coastguard Worker /* The last #include files should be: */
46*6236dae4SAndroid Build Coastguard Worker #include "curl_memory.h"
47*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h"
48*6236dae4SAndroid Build Coastguard Worker
49*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_PROTO_BSDSOCKET_H
50*6236dae4SAndroid Build Coastguard Worker
51*6236dae4SAndroid Build Coastguard Worker #ifdef __amigaos4__
52*6236dae4SAndroid Build Coastguard Worker /*
53*6236dae4SAndroid Build Coastguard Worker * AmigaOS 4.x specific code
54*6236dae4SAndroid Build Coastguard Worker */
55*6236dae4SAndroid Build Coastguard Worker
56*6236dae4SAndroid Build Coastguard Worker /*
57*6236dae4SAndroid Build Coastguard Worker * hostip4.c - Curl_ipv4_resolve_r() replacement code
58*6236dae4SAndroid Build Coastguard Worker *
59*6236dae4SAndroid Build Coastguard Worker * Logic that needs to be considered are the following build cases:
60*6236dae4SAndroid Build Coastguard Worker * - newlib networking
61*6236dae4SAndroid Build Coastguard Worker * - clib2 networking
62*6236dae4SAndroid Build Coastguard Worker * - direct bsdsocket.library networking (usually AmiSSL builds)
63*6236dae4SAndroid Build Coastguard Worker * Each with the threaded resolver enabled or not.
64*6236dae4SAndroid Build Coastguard Worker *
65*6236dae4SAndroid Build Coastguard Worker * With the threaded resolver enabled, try to use gethostbyname_r() where
66*6236dae4SAndroid Build Coastguard Worker * available, otherwise (re)open bsdsocket.library and fallback to
67*6236dae4SAndroid Build Coastguard Worker * gethostbyname().
68*6236dae4SAndroid Build Coastguard Worker */
69*6236dae4SAndroid Build Coastguard Worker
70*6236dae4SAndroid Build Coastguard Worker #include <proto/bsdsocket.h>
71*6236dae4SAndroid Build Coastguard Worker
72*6236dae4SAndroid Build Coastguard Worker static struct SocketIFace *__CurlISocket = NULL;
73*6236dae4SAndroid Build Coastguard Worker static uint32 SocketFeatures = 0;
74*6236dae4SAndroid Build Coastguard Worker
75*6236dae4SAndroid Build Coastguard Worker #define HAVE_BSDSOCKET_GETHOSTBYNAME_R 0x01
76*6236dae4SAndroid Build Coastguard Worker #define HAVE_BSDSOCKET_GETADDRINFO 0x02
77*6236dae4SAndroid Build Coastguard Worker
Curl_amiga_init(void)78*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_amiga_init(void)
79*6236dae4SAndroid Build Coastguard Worker {
80*6236dae4SAndroid Build Coastguard Worker struct SocketIFace *ISocket;
81*6236dae4SAndroid Build Coastguard Worker struct Library *base = OpenLibrary("bsdsocket.library", 4);
82*6236dae4SAndroid Build Coastguard Worker
83*6236dae4SAndroid Build Coastguard Worker if(base) {
84*6236dae4SAndroid Build Coastguard Worker ISocket = (struct SocketIFace *)GetInterface(base, "main", 1, NULL);
85*6236dae4SAndroid Build Coastguard Worker if(ISocket) {
86*6236dae4SAndroid Build Coastguard Worker ULONG enabled = 0;
87*6236dae4SAndroid Build Coastguard Worker
88*6236dae4SAndroid Build Coastguard Worker SocketBaseTags(SBTM_SETVAL(SBTC_CAN_SHARE_LIBRARY_BASES), TRUE,
89*6236dae4SAndroid Build Coastguard Worker SBTM_GETREF(SBTC_HAVE_GETHOSTADDR_R_API), (ULONG)&enabled,
90*6236dae4SAndroid Build Coastguard Worker TAG_DONE);
91*6236dae4SAndroid Build Coastguard Worker
92*6236dae4SAndroid Build Coastguard Worker if(enabled) {
93*6236dae4SAndroid Build Coastguard Worker SocketFeatures |= HAVE_BSDSOCKET_GETHOSTBYNAME_R;
94*6236dae4SAndroid Build Coastguard Worker }
95*6236dae4SAndroid Build Coastguard Worker
96*6236dae4SAndroid Build Coastguard Worker __CurlISocket = ISocket;
97*6236dae4SAndroid Build Coastguard Worker
98*6236dae4SAndroid Build Coastguard Worker atexit(Curl_amiga_cleanup);
99*6236dae4SAndroid Build Coastguard Worker
100*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
101*6236dae4SAndroid Build Coastguard Worker }
102*6236dae4SAndroid Build Coastguard Worker CloseLibrary(base);
103*6236dae4SAndroid Build Coastguard Worker }
104*6236dae4SAndroid Build Coastguard Worker
105*6236dae4SAndroid Build Coastguard Worker return CURLE_FAILED_INIT;
106*6236dae4SAndroid Build Coastguard Worker }
107*6236dae4SAndroid Build Coastguard Worker
Curl_amiga_cleanup(void)108*6236dae4SAndroid Build Coastguard Worker void Curl_amiga_cleanup(void)
109*6236dae4SAndroid Build Coastguard Worker {
110*6236dae4SAndroid Build Coastguard Worker if(__CurlISocket) {
111*6236dae4SAndroid Build Coastguard Worker struct Library *base = __CurlISocket->Data.LibBase;
112*6236dae4SAndroid Build Coastguard Worker DropInterface((struct Interface *)__CurlISocket);
113*6236dae4SAndroid Build Coastguard Worker CloseLibrary(base);
114*6236dae4SAndroid Build Coastguard Worker __CurlISocket = NULL;
115*6236dae4SAndroid Build Coastguard Worker }
116*6236dae4SAndroid Build Coastguard Worker }
117*6236dae4SAndroid Build Coastguard Worker
118*6236dae4SAndroid Build Coastguard Worker #ifdef CURLRES_AMIGA
119*6236dae4SAndroid Build Coastguard Worker /*
120*6236dae4SAndroid Build Coastguard Worker * Because we need to handle the different cases in hostip4.c at runtime,
121*6236dae4SAndroid Build Coastguard Worker * not at compile-time, based on what was detected in Curl_amiga_init(),
122*6236dae4SAndroid Build Coastguard Worker * we replace it completely with our own as to not complicate the baseline
123*6236dae4SAndroid Build Coastguard Worker * code. Assumes malloc/calloc/free are thread safe because Curl_he2ai()
124*6236dae4SAndroid Build Coastguard Worker * allocates memory also.
125*6236dae4SAndroid Build Coastguard Worker */
126*6236dae4SAndroid Build Coastguard Worker
Curl_ipv4_resolve_r(const char * hostname,int port)127*6236dae4SAndroid Build Coastguard Worker struct Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname,
128*6236dae4SAndroid Build Coastguard Worker int port)
129*6236dae4SAndroid Build Coastguard Worker {
130*6236dae4SAndroid Build Coastguard Worker struct Curl_addrinfo *ai = NULL;
131*6236dae4SAndroid Build Coastguard Worker struct hostent *h;
132*6236dae4SAndroid Build Coastguard Worker struct SocketIFace *ISocket = __CurlISocket;
133*6236dae4SAndroid Build Coastguard Worker
134*6236dae4SAndroid Build Coastguard Worker if(SocketFeatures & HAVE_BSDSOCKET_GETHOSTBYNAME_R) {
135*6236dae4SAndroid Build Coastguard Worker LONG h_errnop = 0;
136*6236dae4SAndroid Build Coastguard Worker struct hostent *buf;
137*6236dae4SAndroid Build Coastguard Worker
138*6236dae4SAndroid Build Coastguard Worker buf = calloc(1, CURL_HOSTENT_SIZE);
139*6236dae4SAndroid Build Coastguard Worker if(buf) {
140*6236dae4SAndroid Build Coastguard Worker h = gethostbyname_r((STRPTR)hostname, buf,
141*6236dae4SAndroid Build Coastguard Worker (char *)buf + sizeof(struct hostent),
142*6236dae4SAndroid Build Coastguard Worker CURL_HOSTENT_SIZE - sizeof(struct hostent),
143*6236dae4SAndroid Build Coastguard Worker &h_errnop);
144*6236dae4SAndroid Build Coastguard Worker if(h) {
145*6236dae4SAndroid Build Coastguard Worker ai = Curl_he2ai(h, port);
146*6236dae4SAndroid Build Coastguard Worker }
147*6236dae4SAndroid Build Coastguard Worker free(buf);
148*6236dae4SAndroid Build Coastguard Worker }
149*6236dae4SAndroid Build Coastguard Worker }
150*6236dae4SAndroid Build Coastguard Worker else {
151*6236dae4SAndroid Build Coastguard Worker #ifdef CURLRES_THREADED
152*6236dae4SAndroid Build Coastguard Worker /* gethostbyname() is not thread safe, so we need to reopen bsdsocket
153*6236dae4SAndroid Build Coastguard Worker * on the thread's context
154*6236dae4SAndroid Build Coastguard Worker */
155*6236dae4SAndroid Build Coastguard Worker struct Library *base = OpenLibrary("bsdsocket.library", 4);
156*6236dae4SAndroid Build Coastguard Worker if(base) {
157*6236dae4SAndroid Build Coastguard Worker ISocket = (struct SocketIFace *)GetInterface(base, "main", 1, NULL);
158*6236dae4SAndroid Build Coastguard Worker if(ISocket) {
159*6236dae4SAndroid Build Coastguard Worker h = gethostbyname((STRPTR)hostname);
160*6236dae4SAndroid Build Coastguard Worker if(h) {
161*6236dae4SAndroid Build Coastguard Worker ai = Curl_he2ai(h, port);
162*6236dae4SAndroid Build Coastguard Worker }
163*6236dae4SAndroid Build Coastguard Worker DropInterface((struct Interface *)ISocket);
164*6236dae4SAndroid Build Coastguard Worker }
165*6236dae4SAndroid Build Coastguard Worker CloseLibrary(base);
166*6236dae4SAndroid Build Coastguard Worker }
167*6236dae4SAndroid Build Coastguard Worker #else
168*6236dae4SAndroid Build Coastguard Worker /* not using threaded resolver - safe to use this as-is */
169*6236dae4SAndroid Build Coastguard Worker h = gethostbyname(hostname);
170*6236dae4SAndroid Build Coastguard Worker if(h) {
171*6236dae4SAndroid Build Coastguard Worker ai = Curl_he2ai(h, port);
172*6236dae4SAndroid Build Coastguard Worker }
173*6236dae4SAndroid Build Coastguard Worker #endif
174*6236dae4SAndroid Build Coastguard Worker }
175*6236dae4SAndroid Build Coastguard Worker
176*6236dae4SAndroid Build Coastguard Worker return ai;
177*6236dae4SAndroid Build Coastguard Worker }
178*6236dae4SAndroid Build Coastguard Worker #endif /* CURLRES_AMIGA */
179*6236dae4SAndroid Build Coastguard Worker
180*6236dae4SAndroid Build Coastguard Worker #ifdef USE_AMISSL
181*6236dae4SAndroid Build Coastguard Worker #include <signal.h>
Curl_amiga_select(int nfds,fd_set * readfds,fd_set * writefds,fd_set * errorfds,struct timeval * timeout)182*6236dae4SAndroid Build Coastguard Worker int Curl_amiga_select(int nfds, fd_set *readfds, fd_set *writefds,
183*6236dae4SAndroid Build Coastguard Worker fd_set *errorfds, struct timeval *timeout)
184*6236dae4SAndroid Build Coastguard Worker {
185*6236dae4SAndroid Build Coastguard Worker int r = WaitSelect(nfds, readfds, writefds, errorfds, timeout, 0);
186*6236dae4SAndroid Build Coastguard Worker /* Ensure Ctrl-C signal is actioned */
187*6236dae4SAndroid Build Coastguard Worker if((r == -1) && (SOCKERRNO == EINTR))
188*6236dae4SAndroid Build Coastguard Worker raise(SIGINT);
189*6236dae4SAndroid Build Coastguard Worker return r;
190*6236dae4SAndroid Build Coastguard Worker }
191*6236dae4SAndroid Build Coastguard Worker #endif /* USE_AMISSL */
192*6236dae4SAndroid Build Coastguard Worker
193*6236dae4SAndroid Build Coastguard Worker #elif !defined(USE_AMISSL) /* __amigaos4__ */
194*6236dae4SAndroid Build Coastguard Worker /*
195*6236dae4SAndroid Build Coastguard Worker * Amiga OS3 specific code
196*6236dae4SAndroid Build Coastguard Worker */
197*6236dae4SAndroid Build Coastguard Worker
198*6236dae4SAndroid Build Coastguard Worker struct Library *SocketBase = NULL;
199*6236dae4SAndroid Build Coastguard Worker extern int errno, h_errno;
200*6236dae4SAndroid Build Coastguard Worker
201*6236dae4SAndroid Build Coastguard Worker #ifdef __libnix__
202*6236dae4SAndroid Build Coastguard Worker void __request(const char *msg);
203*6236dae4SAndroid Build Coastguard Worker #else
204*6236dae4SAndroid Build Coastguard Worker # define __request(msg) Printf(msg "\n\a")
205*6236dae4SAndroid Build Coastguard Worker #endif
206*6236dae4SAndroid Build Coastguard Worker
Curl_amiga_cleanup(void)207*6236dae4SAndroid Build Coastguard Worker void Curl_amiga_cleanup(void)
208*6236dae4SAndroid Build Coastguard Worker {
209*6236dae4SAndroid Build Coastguard Worker if(SocketBase) {
210*6236dae4SAndroid Build Coastguard Worker CloseLibrary(SocketBase);
211*6236dae4SAndroid Build Coastguard Worker SocketBase = NULL;
212*6236dae4SAndroid Build Coastguard Worker }
213*6236dae4SAndroid Build Coastguard Worker }
214*6236dae4SAndroid Build Coastguard Worker
Curl_amiga_init(void)215*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_amiga_init(void)
216*6236dae4SAndroid Build Coastguard Worker {
217*6236dae4SAndroid Build Coastguard Worker if(!SocketBase)
218*6236dae4SAndroid Build Coastguard Worker SocketBase = OpenLibrary("bsdsocket.library", 4);
219*6236dae4SAndroid Build Coastguard Worker
220*6236dae4SAndroid Build Coastguard Worker if(!SocketBase) {
221*6236dae4SAndroid Build Coastguard Worker __request("No TCP/IP Stack running!");
222*6236dae4SAndroid Build Coastguard Worker return CURLE_FAILED_INIT;
223*6236dae4SAndroid Build Coastguard Worker }
224*6236dae4SAndroid Build Coastguard Worker
225*6236dae4SAndroid Build Coastguard Worker if(SocketBaseTags(SBTM_SETVAL(SBTC_ERRNOPTR(sizeof(errno))), (ULONG) &errno,
226*6236dae4SAndroid Build Coastguard Worker SBTM_SETVAL(SBTC_LOGTAGPTR), (ULONG) "curl",
227*6236dae4SAndroid Build Coastguard Worker TAG_DONE)) {
228*6236dae4SAndroid Build Coastguard Worker __request("SocketBaseTags ERROR");
229*6236dae4SAndroid Build Coastguard Worker return CURLE_FAILED_INIT;
230*6236dae4SAndroid Build Coastguard Worker }
231*6236dae4SAndroid Build Coastguard Worker
232*6236dae4SAndroid Build Coastguard Worker #ifndef __libnix__
233*6236dae4SAndroid Build Coastguard Worker atexit(Curl_amiga_cleanup);
234*6236dae4SAndroid Build Coastguard Worker #endif
235*6236dae4SAndroid Build Coastguard Worker
236*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
237*6236dae4SAndroid Build Coastguard Worker }
238*6236dae4SAndroid Build Coastguard Worker
239*6236dae4SAndroid Build Coastguard Worker #ifdef __libnix__
240*6236dae4SAndroid Build Coastguard Worker ADD2EXIT(Curl_amiga_cleanup, -50);
241*6236dae4SAndroid Build Coastguard Worker #endif
242*6236dae4SAndroid Build Coastguard Worker
243*6236dae4SAndroid Build Coastguard Worker #endif /* !USE_AMISSL */
244*6236dae4SAndroid Build Coastguard Worker
245*6236dae4SAndroid Build Coastguard Worker #endif /* HAVE_PROTO_BSDSOCKET_H */
246*6236dae4SAndroid Build Coastguard Worker
247*6236dae4SAndroid Build Coastguard Worker #endif /* __AMIGA__ */
248