Files
smallmodel 099a67f1fd Make cURL loosely coupled (#739)
This makes it so the project doesn't link against the library. The project must be able to run without the presence of the library.
2025-06-07 20:36:15 +02:00

143 lines
5.3 KiB
C

/*
===========================================================================
Copyright (C) 2025 the OpenMoHAA team
This file is part of OpenMoHAA source code.
OpenMoHAA source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
OpenMoHAA source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
#include "sys_curl.h"
#include "sys_loadlib.h"
#include "../qcommon/qcommon.h"
curlImport_t curlImport;
static void *cURLLib = NULL;
static qboolean cURLValid;
cvar_t *sys_curllib = NULL;
#ifdef WIN32
# define DEFAULT_CURL_LIB "libcurl.dll"
# define ALTERNATE_CURL_LIB "libcurl-3.dll"
#elif defined(__APPLE__)
# define DEFAULT_CURL_LIB "libcurl.4.dylib"
# define ALTERNATE_CURL_LIB "libcurl.3.dylib"
#else
# define DEFAULT_CURL_LIB "libcurl.so.4"
# define ALTERNATE_CURL_LIB "libcurl.so.3"
#endif
/*
=================
GPA
=================
*/
static void *GPA(char *str)
{
void *rv;
rv = Sys_LoadFunction(cURLLib, str);
if (!rv) {
Com_Printf("Can't load symbol %s\n", str);
cURLValid = qfalse;
return NULL;
} else {
Com_DPrintf("Loaded symbol %s (0x%p)\n", str, rv);
return rv;
}
}
void Sys_InitCurl()
{
#ifdef HAS_LIBCURL
if (cURLLib) {
return;
}
sys_curllib = Cvar_Get("sys_curllib", DEFAULT_CURL_LIB, 0);
Com_Printf("Loading \"%s\"...\n", sys_curllib->string);
if (!(cURLLib = Sys_LoadDll(sys_curllib->string, qtrue))) {
#ifdef ALTERNATE_CURL_LIB
// On some linux distributions there is no libcurl.so.3, but only libcurl.so.4. That one works too.
if (!(cURLLib = Sys_LoadDll(ALTERNATE_CURL_LIB, qtrue)))
#endif
return;
}
cURLValid = qtrue;
curlImport.qcurl_version = GPA("curl_version");
curlImport.qcurl_getenv = GPA("curl_getenv");
curlImport.qcurl_free = GPA("curl_free");
curlImport.qcurl_slist_append = GPA("curl_slist_append");
curlImport.qcurl_slist_free_all = GPA("curl_slist_free_all");
curlImport.qcurl_version_info = GPA("curl_version_info");
curlImport.qcurl_easy_strerror = GPA("curl_easy_strerror");
curlImport.qcurl_share_strerror = GPA("curl_share_strerror");
curlImport.qcurl_easy_pause = GPA("curl_easy_pause");
curlImport.qcurl_easy_escape = GPA("curl_easy_escape");
curlImport.qcurl_easy_unescape = GPA("curl_easy_unescape");
curlImport.qcurl_easy_init = GPA("curl_easy_init");
curlImport.qcurl_easy_setopt = GPA("curl_easy_setopt");
curlImport.qcurl_easy_perform = GPA("curl_easy_perform");
curlImport.qcurl_easy_cleanup = GPA("curl_easy_cleanup");
curlImport.qcurl_easy_getinfo = GPA("curl_easy_getinfo");
curlImport.qcurl_easy_duphandle = GPA("curl_easy_duphandle");
curlImport.qcurl_easy_reset = GPA("curl_easy_reset");
curlImport.qcurl_easy_recv = GPA("curl_easy_recv");
curlImport.qcurl_easy_send = GPA("curl_easy_send");
curlImport.qcurl_easy_upkeep = GPA("curl_easy_upkeep");
curlImport.qcurl_multi_init = GPA("curl_multi_init");
curlImport.qcurl_multi_add_handle = GPA("curl_multi_add_handle");
curlImport.qcurl_multi_remove_handle = GPA("curl_multi_remove_handle");
curlImport.qcurl_multi_fdset = GPA("curl_multi_fdset");
curlImport.qcurl_multi_wait = GPA("curl_multi_wait");
curlImport.qcurl_multi_poll = GPA("curl_multi_poll");
curlImport.qcurl_multi_wakeup = GPA("curl_multi_wakeup");
curlImport.qcurl_multi_perform = GPA("curl_multi_perform");
curlImport.qcurl_multi_cleanup = GPA("curl_multi_cleanup");
curlImport.qcurl_multi_info_read = GPA("curl_multi_info_read");
curlImport.qcurl_multi_strerror = GPA("curl_multi_strerror");
curlImport.qcurl_multi_socket_action = GPA("curl_multi_socket_action");
curlImport.qcurl_multi_timeout = GPA("curl_multi_timeout");
curlImport.qcurl_multi_setopt = GPA("curl_multi_setopt");
curlImport.qcurl_multi_assign = GPA("curl_multi_assign");
//curlImport.qcurl_multi_get_handles = GPA("curl_multi_get_handles");
curlImport.qcurl_pushheader_bynum = GPA("curl_pushheader_bynum");
curlImport.qcurl_pushheader_byname = GPA("curl_pushheader_byname");
//curlImport.qcurl_multi_waitfds = GPA("curl_multi_waitfds");
if (!cURLValid) {
Sys_ShutdownCurl();
}
#endif
}
void Sys_ShutdownCurl()
{
if (cURLLib) {
Com_Printf("Unloading cURL...\n");
Sys_UnloadLibrary(cURLLib);
cURLLib = NULL;
cURLValid = qfalse;
memset(&curlImport, 0, sizeof(curlImport));
}
}