xref: /aosp_15_r20/external/curl/lib/amigaos.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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