DarkPlaces
Game engine based on the Quake 1 engine by id Software, developed by LadyHavoc
 
libcurl.c File Reference
#include "quakedef.h"
#include "fs.h"
#include "libcurl.h"
#include "thread.h"
#include "com_list.h"
#include "image.h"
#include "jpeg.h"
#include "image_png.h"
+ Include dependency graph for libcurl.c:

Go to the source code of this file.

Data Structures

struct  CURLMsg
 
struct  downloadinfo
 
struct  requirement
 

Macros

#define CINIT(name, type, number)
 
#define CLEAR_AND_RETRY()
 
#define CURL_GLOBAL_NOTHING   0
 
#define CURL_GLOBAL_SSL   1
 
#define CURL_GLOBAL_WIN32   2
 
#define CURLINFO_DOUBLE   0x300000
 
#define CURLINFO_LONG   0x200000
 
#define CURLINFO_MASK   0x0fffff
 
#define CURLINFO_SLIST   0x400000
 
#define CURLINFO_STRING   0x100000
 
#define CURLINFO_TYPEMASK   0xf00000
 
#define CURLOPTTYPE_FUNCTIONPOINT   20000
 
#define CURLOPTTYPE_LONG   0
 
#define CURLOPTTYPE_OBJECTPOINT   10000
 
#define CURLOPTTYPE_OFF_T   30000
 
#define CURLPROTO_FTP   (1<<2)
 
#define CURLPROTO_HTTP   (1<<0)
 
#define CURLPROTO_HTTPS   (1<<1)
 
#define LOADTYPE_CACHEPIC   2
 
#define LOADTYPE_NONE   0
 
#define LOADTYPE_PAK   1
 
#define LOADTYPE_SKINFRAME   3
 

Typedefs

typedef struct CURL_s CURL
 
typedef struct curl_slist curl_slist
 
typedef struct CURLM_s CURLM
 

Enumerations

enum  curl_infotype {
  CURLINFO_TEXT = 0 , CURLINFO_HEADER_IN , CURLINFO_HEADER_OUT , CURLINFO_DATA_IN ,
  CURLINFO_DATA_OUT , CURLINFO_SSL_DATA_IN , CURLINFO_SSL_DATA_OUT , CURLINFO_END
}
 
enum  CURLcode { CURLE_OK = 0 }
 
enum  CURLINFO {
  CURLINFO_NONE , CURLINFO_EFFECTIVE_URL = CURLINFO_STRING + 1 , CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2 , CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE + 3 ,
  CURLINFO_NAMELOOKUP_TIME = CURLINFO_DOUBLE + 4 , CURLINFO_CONNECT_TIME = CURLINFO_DOUBLE + 5 , CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6 , CURLINFO_SIZE_UPLOAD = CURLINFO_DOUBLE + 7 ,
  CURLINFO_SIZE_DOWNLOAD = CURLINFO_DOUBLE + 8 , CURLINFO_SPEED_DOWNLOAD = CURLINFO_DOUBLE + 9 , CURLINFO_SPEED_UPLOAD = CURLINFO_DOUBLE + 10 , CURLINFO_HEADER_SIZE = CURLINFO_LONG + 11 ,
  CURLINFO_REQUEST_SIZE = CURLINFO_LONG + 12 , CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG + 13 , CURLINFO_FILETIME = CURLINFO_LONG + 14 , CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15 ,
  CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16 , CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17 , CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18 , CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19 ,
  CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20 , CURLINFO_PRIVATE = CURLINFO_STRING + 21 , CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG + 22 , CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23 ,
  CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24 , CURLINFO_OS_ERRNO = CURLINFO_LONG + 25 , CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26 , CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27
}
 
enum  CURLMcode { CURLM_CALL_MULTI_PERFORM =-1 , CURLM_OK = 0 }
 
enum  CURLMSG { CURLMSG_NONE , CURLMSG_DONE , CURLMSG_LAST }
 
enum  CURLoption {
  CINIT =(WRITEDATA, OBJECTPOINT, 1) , CINIT =(WRITEDATA, OBJECTPOINT, 1) , CINIT =(WRITEDATA, OBJECTPOINT, 1) , CINIT =(WRITEDATA, OBJECTPOINT, 1) ,
  CINIT =(WRITEDATA, OBJECTPOINT, 1) , CINIT =(WRITEDATA, OBJECTPOINT, 1) , CINIT =(WRITEDATA, OBJECTPOINT, 1) , CINIT =(WRITEDATA, OBJECTPOINT, 1) ,
  CINIT =(WRITEDATA, OBJECTPOINT, 1) , CINIT =(WRITEDATA, OBJECTPOINT, 1) , CINIT =(WRITEDATA, OBJECTPOINT, 1) , CINIT =(WRITEDATA, OBJECTPOINT, 1) ,
  CINIT =(WRITEDATA, OBJECTPOINT, 1) , CINIT =(WRITEDATA, OBJECTPOINT, 1) , CINIT =(WRITEDATA, OBJECTPOINT, 1) , CINIT =(WRITEDATA, OBJECTPOINT, 1) ,
  CINIT =(WRITEDATA, OBJECTPOINT, 1)
}
 
enum  CurlStatus { CURL_DOWNLOAD_SUCCESS = 0 , CURL_DOWNLOAD_FAILED , CURL_DOWNLOAD_ABORTED , CURL_DOWNLOAD_SERVERERROR }
 

Functions

static void CheckPendingDownloads (void)
 
static const char * CleanURL (const char *url, char *urlbuf, size_t urlbuflength)
 
qbool Curl_Available (void)
 
static qbool Curl_Begin (const char *URL, const char *extraheaders, double maxspeed, const char *name, int loadtype, qbool forthismap, const char *post_content_type, const unsigned char *postbuf, size_t postbufsize, unsigned char *buf, size_t bufsize, curl_callback_t callback, void *cbdata)
 
qbool Curl_Begin_ToFile (const char *URL, double maxspeed, const char *name, int loadtype, qbool forthismap)
 
qbool Curl_Begin_ToMemory (const char *URL, double maxspeed, unsigned char *buf, size_t bufsize, curl_callback_t callback, void *cbdata)
 
qbool Curl_Begin_ToMemory_POST (const char *URL, const char *extraheaders, double maxspeed, const char *post_content_type, const unsigned char *postbuf, size_t postbufsize, unsigned char *buf, size_t bufsize, curl_callback_t callback, void *cbdata)
 
void Curl_Cancel_ToMemory (curl_callback_t callback, void *cbdata)
 
void Curl_CancelAll (void)
 
static void Curl_CheckCommandWhenDone (void)
 
void Curl_Clear_forthismap (void)
 
void Curl_ClearRequirements (void)
 
static void CURL_CloseLibrary (void)
 
static void Curl_CommandWhenDone (const char *cmd)
 
static void Curl_CommandWhenError (const char *cmd)
 
static void Curl_Curl_f (cmd_state_t *cmd)
 
static void curl_default_callback (int status, size_t length_received, unsigned char *buffer, void *cbdata)
 
static void Curl_EndDownload (downloadinfo *di, CurlStatus status, CURLcode error, const char *content_type_)
 
static downloadinfoCurl_Find (const char *filename)
 
static const char * Curl_FindPackURL (const char *filename)
 
void Curl_Frame (void)
 
static size_t CURL_fwrite (void *data, size_t size, size_t nmemb, void *vdi)
 
static double Curl_GetDownloadAmount (downloadinfo *di)
 
Curl_downloadinfo_tCurl_GetDownloadInfo (int *nDownloads, const char **additional_info, char *addinfo, size_t addinfolength)
 
static double Curl_GetDownloadSpeed (downloadinfo *di)
 
qbool Curl_Have_forthismap (void)
 
static void Curl_Info_f (cmd_state_t *cmd)
 
void Curl_Init (void)
 
void Curl_Init_Commands (void)
 
static qbool CURL_OpenLibrary (void)
 
static void curl_quiet_callback (int status, size_t length_received, unsigned char *buffer, void *cbdata)
 
void Curl_Register_predownload (void)
 
void Curl_RequireFile (const char *filename)
 
qbool Curl_Running (void)
 
bool Curl_Select (int timeout_ms)
 
static qbool Curl_SendRequirement (const char *filename, qbool foundone, char *sendbuffer, size_t sendbuffer_len)
 
void Curl_SendRequirements (void)
 
void Curl_Shutdown (void)
 
static unsigned char * decode_image (downloadinfo *di, const char *content_type)
 
 LIST_HEAD (downloads)
 

Variables

static double bytes_received = 0
 
static double bytes_sent = 0
 
static char command_when_done [256] = ""
 
static char command_when_error [256] = ""
 
static dllhandle_t curl_dll = NULL
 
static cvar_t curl_enabled = {CF_SHARED | CF_ARCHIVE, "curl_enabled","1", "whether libcurl may be used to GET files or POST data"}
 
static cvar_t curl_maxdownloads = {CF_SHARED | CF_ARCHIVE, "curl_maxdownloads","3", "maximum number of concurrent HTTP/FTP downloads"}
 
static cvar_t curl_maxspeed = {CF_SHARED | CF_ARCHIVE, "curl_maxspeed","0", "maximum download speed (KiB/s)"}
 
voidcurl_mutex = NULL
 
static cvar_t curl_useragent = {CF_SHARED, "curl_useragent","1", "send the User-Agent string (note: turning this off may break stuff)"}
 
static cvar_t curl_useragent_append = {CF_SHARED, "curl_useragent_append","", "a string to append to the User-Agent string (useful for name and version number of your mod)"}
 
static dllfunction_t curlfuncs []
 
static CURLMcurlm = NULL
 
static double curltime = 0
 
static cvar_t developer_curl = {CF_SHARED, "developer_curl","0", "whether verbose libcurl output should be printed to stderr"}
 
static qbool noclear = false
 
static int numdownloads = 0
 
static int numdownloads_added = 0
 
static int numdownloads_fail = 0
 
static int numdownloads_success = 0
 
static void(* qcurl_easy_cleanup )(CURL *handle)
 
static CURLcode(* qcurl_easy_getinfo )(CURL *handle, CURLINFO info,...)
 
static CURL *(* qcurl_easy_init )(void)
 
static CURLcode(* qcurl_easy_setopt )(CURL *handle, CURLoption option,...)
 
static const char *(* qcurl_easy_strerror )(CURLcode)
 
static void(* qcurl_global_cleanup )(void)
 
static void(* qcurl_global_init )(long flags)
 
static CURLMcode(* qcurl_multi_add_handle )(CURLM *multi_handle, CURL *easy_handle)
 
static void(* qcurl_multi_cleanup )(CURLM *)
 
static CURLMsg *(* qcurl_multi_info_read )(CURLM *multi_handle, int *msgs_in_queue)
 
static CURLM *(* qcurl_multi_init )(void)
 
static CURLMcode(* qcurl_multi_perform )(CURLM *multi_handle, int *running_handles)
 
static CURLMcode(* qcurl_multi_remove_handle )(CURLM *multi_handle, CURL *easy_handle)
 
static const char *(* qcurl_multi_strerror )(CURLcode)
 
static CURLMcode(* qcurl_multi_wait )(CURLM *multi_handle, void *, unsigned int extra_nfds, int timeout_ms, int *ret)
 
static curl_slist *(* qcurl_slist_append )(curl_slist *list, const char *string)
 
static void(* qcurl_slist_free_all )(curl_slist *list)
 
static requirementrequirements = NULL
 
static cvar_t sv_curl_defaulturl = {CF_SERVER, "sv_curl_defaulturl","", "default autodownload source URL"}
 
static cvar_t sv_curl_maxspeed = {CF_SERVER, "sv_curl_maxspeed","0", "maximum download speed for clients downloading from sv_curl_defaulturl (KiB/s)"}
 
static cvar_t sv_curl_serverpackages = {CF_SERVER, "sv_curl_serverpackages","", "list of required files for the clients, separated by spaces"}
 

Macro Definition Documentation

◆ CINIT

#define CINIT ( name,
type,
number )
Value:
CURLOPT_ ## name = CURLOPTTYPE_ ## type + number
const GLchar * name
Definition glquake.h:601
GLenum type
Definition glquake.h:656

Definition at line 54 of file libcurl.c.

◆ CLEAR_AND_RETRY

#define CLEAR_AND_RETRY ( )
Value:
do \
{ \
di->stream = FS_OpenRealFile(di->filename, "wb", false); \
FS_Close(di->stream); \
if(di->startpos && !di->callback) \
{ \
Curl_Begin(di->url, di->extraheaders, di->maxspeed, di->filename, di->loadtype, di->forthismap, di->post_content_type, di->postbuf, di->postbufsize, NULL, 0, NULL, NULL); \
di->forthismap = false; \
} \
} \
while(0)
qfile_t * FS_OpenRealFile(const char *filepath, const char *mode, qbool quiet)
Definition fs.c:2901
#define NULL
Definition qtypes.h:12

Referenced by Curl_EndDownload().

◆ CURL_GLOBAL_NOTHING

#define CURL_GLOBAL_NOTHING   0

Definition at line 47 of file libcurl.c.

◆ CURL_GLOBAL_SSL

#define CURL_GLOBAL_SSL   1

Definition at line 48 of file libcurl.c.

Referenced by Curl_Init().

◆ CURL_GLOBAL_WIN32

#define CURL_GLOBAL_WIN32   2

Definition at line 49 of file libcurl.c.

◆ CURLINFO_DOUBLE

#define CURLINFO_DOUBLE   0x300000

Definition at line 94 of file libcurl.c.

◆ CURLINFO_LONG

#define CURLINFO_LONG   0x200000

Definition at line 93 of file libcurl.c.

◆ CURLINFO_MASK

#define CURLINFO_MASK   0x0fffff

Definition at line 96 of file libcurl.c.

◆ CURLINFO_SLIST

#define CURLINFO_SLIST   0x400000

Definition at line 95 of file libcurl.c.

◆ CURLINFO_STRING

#define CURLINFO_STRING   0x100000

Definition at line 92 of file libcurl.c.

◆ CURLINFO_TYPEMASK

#define CURLINFO_TYPEMASK   0xf00000

Definition at line 97 of file libcurl.c.

◆ CURLOPTTYPE_FUNCTIONPOINT

#define CURLOPTTYPE_FUNCTIONPOINT   20000

Definition at line 52 of file libcurl.c.

◆ CURLOPTTYPE_LONG

#define CURLOPTTYPE_LONG   0

Definition at line 50 of file libcurl.c.

◆ CURLOPTTYPE_OBJECTPOINT

#define CURLOPTTYPE_OBJECTPOINT   10000

Definition at line 51 of file libcurl.c.

◆ CURLOPTTYPE_OFF_T

#define CURLOPTTYPE_OFF_T   30000

Definition at line 53 of file libcurl.c.

◆ CURLPROTO_FTP

#define CURLPROTO_FTP   (1<<2)

Definition at line 79 of file libcurl.c.

Referenced by CheckPendingDownloads().

◆ CURLPROTO_HTTP

#define CURLPROTO_HTTP   (1<<0)

Definition at line 77 of file libcurl.c.

Referenced by CheckPendingDownloads().

◆ CURLPROTO_HTTPS

#define CURLPROTO_HTTPS   (1<<1)

Definition at line 78 of file libcurl.c.

Referenced by CheckPendingDownloads().

◆ LOADTYPE_CACHEPIC

#define LOADTYPE_CACHEPIC   2

Definition at line 200 of file libcurl.c.

Referenced by Curl_Curl_f(), and Curl_EndDownload().

◆ LOADTYPE_NONE

#define LOADTYPE_NONE   0

Definition at line 198 of file libcurl.c.

Referenced by Curl_Begin(), and Curl_Curl_f().

◆ LOADTYPE_PAK

#define LOADTYPE_PAK   1

Definition at line 199 of file libcurl.c.

Referenced by Curl_Begin(), Curl_Curl_f(), and Curl_EndDownload().

◆ LOADTYPE_SKINFRAME

#define LOADTYPE_SKINFRAME   3

Definition at line 201 of file libcurl.c.

Referenced by Curl_Curl_f(), and Curl_EndDownload().

Typedef Documentation

◆ CURL

typedef struct CURL_s CURL

Definition at line 33 of file libcurl.c.

◆ curl_slist

typedef struct curl_slist curl_slist

Definition at line 35 of file libcurl.c.

◆ CURLM

typedef struct CURLM_s CURLM

Definition at line 34 of file libcurl.c.

Enumeration Type Documentation

◆ curl_infotype

Enumerator
CURLINFO_TEXT 
CURLINFO_HEADER_IN 
CURLINFO_HEADER_OUT 
CURLINFO_DATA_IN 
CURLINFO_DATA_OUT 
CURLINFO_SSL_DATA_IN 
CURLINFO_SSL_DATA_OUT 
CURLINFO_END 

Definition at line 80 of file libcurl.c.

81{
82 CURLINFO_TEXT = 0,
83 CURLINFO_HEADER_IN, /* 1 */
84 CURLINFO_HEADER_OUT, /* 2 */
85 CURLINFO_DATA_IN, /* 3 */
86 CURLINFO_DATA_OUT, /* 4 */
90}
@ CURLINFO_SSL_DATA_OUT
Definition libcurl.c:88
@ CURLINFO_END
Definition libcurl.c:89
@ CURLINFO_HEADER_OUT
Definition libcurl.c:84
@ CURLINFO_DATA_IN
Definition libcurl.c:85
@ CURLINFO_TEXT
Definition libcurl.c:82
@ CURLINFO_DATA_OUT
Definition libcurl.c:86
@ CURLINFO_HEADER_IN
Definition libcurl.c:83
@ CURLINFO_SSL_DATA_IN
Definition libcurl.c:87

◆ CURLcode

enum CURLcode
Enumerator
CURLE_OK 

Definition at line 36 of file libcurl.c.

37{
38 CURLE_OK = 0
39}
@ CURLE_OK
Definition libcurl.c:38

◆ CURLINFO

enum CURLINFO
Enumerator
CURLINFO_NONE 
CURLINFO_EFFECTIVE_URL 
CURLINFO_RESPONSE_CODE 
CURLINFO_TOTAL_TIME 
CURLINFO_NAMELOOKUP_TIME 
CURLINFO_CONNECT_TIME 
CURLINFO_PRETRANSFER_TIME 
CURLINFO_SIZE_UPLOAD 
CURLINFO_SIZE_DOWNLOAD 
CURLINFO_SPEED_DOWNLOAD 
CURLINFO_SPEED_UPLOAD 
CURLINFO_HEADER_SIZE 
CURLINFO_REQUEST_SIZE 
CURLINFO_SSL_VERIFYRESULT 
CURLINFO_FILETIME 
CURLINFO_CONTENT_LENGTH_DOWNLOAD 
CURLINFO_CONTENT_LENGTH_UPLOAD 
CURLINFO_STARTTRANSFER_TIME 
CURLINFO_CONTENT_TYPE 
CURLINFO_REDIRECT_TIME 
CURLINFO_REDIRECT_COUNT 
CURLINFO_PRIVATE 
CURLINFO_HTTP_CONNECTCODE 
CURLINFO_HTTPAUTH_AVAIL 
CURLINFO_PROXYAUTH_AVAIL 
CURLINFO_OS_ERRNO 
CURLINFO_NUM_CONNECTS 
CURLINFO_SSL_ENGINES 

Definition at line 98 of file libcurl.c.

99{
100 CURLINFO_NONE, /* first, never use this */
128}
#define CURLINFO_STRING
Definition libcurl.c:92
#define CURLINFO_DOUBLE
Definition libcurl.c:94
#define CURLINFO_SLIST
Definition libcurl.c:95
@ CURLINFO_SSL_ENGINES
Definition libcurl.c:127
@ CURLINFO_HEADER_SIZE
Definition libcurl.c:111
@ CURLINFO_SIZE_DOWNLOAD
Definition libcurl.c:108
@ CURLINFO_PRIVATE
Definition libcurl.c:121
@ CURLINFO_HTTPAUTH_AVAIL
Definition libcurl.c:123
@ CURLINFO_CONNECT_TIME
Definition libcurl.c:105
@ CURLINFO_FILETIME
Definition libcurl.c:114
@ CURLINFO_NUM_CONNECTS
Definition libcurl.c:126
@ CURLINFO_REQUEST_SIZE
Definition libcurl.c:112
@ CURLINFO_NONE
Definition libcurl.c:100
@ CURLINFO_SSL_VERIFYRESULT
Definition libcurl.c:113
@ CURLINFO_PRETRANSFER_TIME
Definition libcurl.c:106
@ CURLINFO_CONTENT_LENGTH_UPLOAD
Definition libcurl.c:116
@ CURLINFO_OS_ERRNO
Definition libcurl.c:125
@ CURLINFO_PROXYAUTH_AVAIL
Definition libcurl.c:124
@ CURLINFO_NAMELOOKUP_TIME
Definition libcurl.c:104
@ CURLINFO_SIZE_UPLOAD
Definition libcurl.c:107
@ CURLINFO_REDIRECT_COUNT
Definition libcurl.c:120
@ CURLINFO_CONTENT_TYPE
Definition libcurl.c:118
@ CURLINFO_SPEED_UPLOAD
Definition libcurl.c:110
@ CURLINFO_HTTP_CONNECTCODE
Definition libcurl.c:122
@ CURLINFO_REDIRECT_TIME
Definition libcurl.c:119
@ CURLINFO_CONTENT_LENGTH_DOWNLOAD
Definition libcurl.c:115
@ CURLINFO_EFFECTIVE_URL
Definition libcurl.c:101
@ CURLINFO_TOTAL_TIME
Definition libcurl.c:103
@ CURLINFO_SPEED_DOWNLOAD
Definition libcurl.c:109
@ CURLINFO_RESPONSE_CODE
Definition libcurl.c:102
@ CURLINFO_STARTTRANSFER_TIME
Definition libcurl.c:117
#define CURLINFO_LONG
Definition libcurl.c:93

◆ CURLMcode

enum CURLMcode
Enumerator
CURLM_CALL_MULTI_PERFORM 
CURLM_OK 

Definition at line 41 of file libcurl.c.

42{
43 CURLM_CALL_MULTI_PERFORM=-1, /* please call curl_multi_perform() soon */
44 CURLM_OK = 0
45}
@ CURLM_CALL_MULTI_PERFORM
Definition libcurl.c:43
@ CURLM_OK
Definition libcurl.c:44

◆ CURLMSG

enum CURLMSG
Enumerator
CURLMSG_NONE 
CURLMSG_DONE 
CURLMSG_LAST 

Definition at line 131 of file libcurl.c.

132{
133 CURLMSG_NONE, /* first, not used */
134 CURLMSG_DONE, /* This easy handle has completed. 'result' contains
135 the CURLcode of the transfer */
137}
@ CURLMSG_DONE
Definition libcurl.c:134
@ CURLMSG_LAST
Definition libcurl.c:136
@ CURLMSG_NONE
Definition libcurl.c:133

◆ CURLoption

enum CURLoption
Enumerator
CINIT 
CINIT 
CINIT 
CINIT 
CINIT 
CINIT 
CINIT 
CINIT 
CINIT 
CINIT 
CINIT 
CINIT 
CINIT 
CINIT 
CINIT 
CINIT 
CINIT 

Definition at line 55 of file libcurl.c.

56{
57 CINIT(WRITEDATA, OBJECTPOINT, 1),
58 CINIT(URL, OBJECTPOINT, 2),
59 CINIT(ERRORBUFFER, OBJECTPOINT, 10),
60 CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11),
61 CINIT(POSTFIELDS, OBJECTPOINT, 15),
62 CINIT(REFERER, OBJECTPOINT, 16),
63 CINIT(USERAGENT, OBJECTPOINT, 18),
64 CINIT(LOW_SPEED_LIMIT, LONG , 19),
65 CINIT(LOW_SPEED_TIME, LONG, 20),
66 CINIT(RESUME_FROM, LONG, 21),
67 CINIT(HTTPHEADER, OBJECTPOINT, 23),
68 CINIT(VERBOSE, LONG, 41),
69 CINIT(POST, LONG, 47), /* HTTP POST method */
70 CINIT(FOLLOWLOCATION, LONG, 52), /* use Location: Luke! */
71 CINIT(POSTFIELDSIZE, LONG, 60),
72 CINIT(PRIVATE, OBJECTPOINT, 103),
73 CINIT(PROTOCOLS, LONG, 181),
74 CINIT(REDIR_PROTOCOLS, LONG, 182)
75}
#define CINIT(name, type, number)
Definition libcurl.c:54

◆ CurlStatus

enum CurlStatus
Enumerator
CURL_DOWNLOAD_SUCCESS 
CURL_DOWNLOAD_FAILED 
CURL_DOWNLOAD_ABORTED 
CURL_DOWNLOAD_SERVERERROR 

Definition at line 447 of file libcurl.c.

448{
453}
@ CURL_DOWNLOAD_SUCCESS
Definition libcurl.c:449
@ CURL_DOWNLOAD_ABORTED
Definition libcurl.c:451
@ CURL_DOWNLOAD_SERVERERROR
Definition libcurl.c:452
@ CURL_DOWNLOAD_FAILED
Definition libcurl.c:450

Function Documentation

◆ CheckPendingDownloads()

static void CheckPendingDownloads ( void )
static

Definition at line 683 of file libcurl.c.

684{
685 const char *h;
686 char urlbuf[1024];
687 char vabuf[1024];
688 if(!curl_dll)
689 return;
691 {
692 downloadinfo *di;
693 List_For_Each_Entry(di, &downloads, downloadinfo, list)
694 {
695 if(!di->started)
696 {
697 if(!di->buffer)
698 {
699 Con_Printf("Downloading %s -> %s", CleanURL(di->url, urlbuf, sizeof(urlbuf)), di->filename);
700
701 di->stream = FS_OpenRealFile(di->filename, "ab", false);
702 if(!di->stream)
703 {
704 Con_Printf("\nFAILED: Could not open output file %s\n", di->filename);
706 return;
707 }
708 FS_Seek(di->stream, 0, SEEK_END);
709 di->startpos = FS_Tell(di->stream);
710
711 if(di->startpos > 0)
712 Con_Printf(", resuming from position %ld", (long) di->startpos);
713 Con_Print("...\n");
714 }
715 else
716 {
717 Con_DPrintf("Downloading %s -> memory\n", CleanURL(di->url, urlbuf, sizeof(urlbuf)));
718 di->startpos = 0;
719 }
720
721 di->curle = qcurl_easy_init();
722 di->slist = NULL;
723 qcurl_easy_setopt(di->curle, CURLOPT_URL, di->url);
725 {
726 const char *ua
727#ifdef HTTP_USER_AGENT
728 = HTTP_USER_AGENT;
729#else
731#endif
732 if(!ua)
733 ua = "";
735 ua = va(vabuf, sizeof(vabuf), "%s%s%s",
736 ua,
737 (ua[0] && ua[strlen(ua)-1] != ' ')
738 ? " "
739 : "",
741 qcurl_easy_setopt(di->curle, CURLOPT_USERAGENT, ua);
742 }
743 else
744 qcurl_easy_setopt(di->curle, CURLOPT_USERAGENT, "");
746 qcurl_easy_setopt(di->curle, CURLOPT_VERBOSE, (long) 1);
747 qcurl_easy_setopt(di->curle, CURLOPT_REFERER, di->referer);
748 qcurl_easy_setopt(di->curle, CURLOPT_RESUME_FROM, (long) di->startpos);
749 qcurl_easy_setopt(di->curle, CURLOPT_FOLLOWLOCATION, 1);
750 qcurl_easy_setopt(di->curle, CURLOPT_WRITEFUNCTION, CURL_fwrite);
751 qcurl_easy_setopt(di->curle, CURLOPT_LOW_SPEED_LIMIT, (long) 256);
752 qcurl_easy_setopt(di->curle, CURLOPT_LOW_SPEED_TIME, (long) 45);
753 qcurl_easy_setopt(di->curle, CURLOPT_WRITEDATA, (void *) di);
754 qcurl_easy_setopt(di->curle, CURLOPT_PRIVATE, (void *) di);
756 if(qcurl_easy_setopt(di->curle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_FTP) != CURLE_OK)
757 {
758 Con_Printf("^1WARNING:^7 for security reasons, please upgrade to libcurl 7.19.4 or above. In a later version of DarkPlaces, HTTP redirect support will be disabled for this libcurl version.\n");
759 //qcurl_easy_setopt(di->curle, CURLOPT_FOLLOWLOCATION, 0);
760 }
761 if(di->post_content_type)
762 {
763 qcurl_easy_setopt(di->curle, CURLOPT_POST, 1);
764 qcurl_easy_setopt(di->curle, CURLOPT_POSTFIELDS, di->postbuf);
765 qcurl_easy_setopt(di->curle, CURLOPT_POSTFIELDSIZE, di->postbufsize);
766 di->slist = qcurl_slist_append(di->slist, va(vabuf, sizeof(vabuf), "Content-Type: %s", di->post_content_type));
767 }
768
769 // parse extra headers into slist
770 // \n separated list!
771 h = di->extraheaders;
772 while(h)
773 {
774 const char *hh = strchr(h, '\n');
775 if(hh)
776 {
777 char *buf = (char *) Mem_Alloc(tempmempool, hh - h + 1);
778 memcpy(buf, h, hh - h);
779 buf[hh - h] = 0;
780 di->slist = qcurl_slist_append(di->slist, buf);
781 h = hh + 1;
782 }
783 else
784 {
785 di->slist = qcurl_slist_append(di->slist, h);
786 h = NULL;
787 }
788 }
789
790 qcurl_easy_setopt(di->curle, CURLOPT_HTTPHEADER, di->slist);
791
793 di->started = true;
794 ++numdownloads;
796 break;
797 }
798 }
799 }
800}
#define List_For_Each_Entry(pos, head, type, member)
Definition com_list.h:121
char * va(char *buf, size_t buflen, const char *format,...)
Definition common.c:972
void Con_Print(const char *msg)
Prints to all appropriate console targets, and adds timestamps.
Definition console.c:1504
void Con_DPrintf(const char *fmt,...)
A Con_Printf that only shows up if the "developer" cvar is set.
Definition console.c:1544
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
Definition console.c:1514
char engineversion[128]
version string for the corner of the console, crash messages, status command, etc
Definition host.c:304
fs_offset_t FS_Tell(qfile_t *file)
Definition fs.c:3461
int FS_Seek(qfile_t *file, fs_offset_t offset, int whence)
Definition fs.c:3359
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition glquake.h:657
static dllhandle_t curl_dll
Definition libcurl.c:195
static cvar_t curl_useragent
Definition libcurl.c:13
static CURLM * curlm
Definition libcurl.c:403
static size_t CURL_fwrite(void *data, size_t size, size_t nmemb, void *vdi)
Definition libcurl.c:416
static int numdownloads
Definition libcurl.c:235
static CURL *(* qcurl_easy_init)(void)
Definition libcurl.c:155
#define CURLPROTO_HTTP
Definition libcurl.c:77
static const char * CleanURL(const char *url, char *urlbuf, size_t urlbuflength)
Definition libcurl.c:651
static void Curl_EndDownload(downloadinfo *di, CurlStatus status, CURLcode error, const char *content_type_)
Definition libcurl.c:521
static CURLMcode(* qcurl_multi_add_handle)(CURLM *multi_handle, CURL *easy_handle)
Definition libcurl.c:164
static curl_slist *(* qcurl_slist_append)(curl_slist *list, const char *string)
Definition libcurl.c:169
#define CURLPROTO_HTTPS
Definition libcurl.c:78
static cvar_t curl_useragent_append
Definition libcurl.c:14
static CURLcode(* qcurl_easy_setopt)(CURL *handle, CURLoption option,...)
Definition libcurl.c:157
#define CURLPROTO_FTP
Definition libcurl.c:79
static cvar_t curl_maxdownloads
Definition libcurl.c:11
static cvar_t developer_curl
Definition libcurl.c:20
float strlen(string s)
int integer
Definition cvar.h:73
const char * string
Definition cvar.h:71
qbool started
Definition libcurl.c:213
qfile_t * stream
Definition libcurl.c:210
CURL * curle
Definition libcurl.c:212
char referer[256]
Definition libcurl.c:209
size_t postbufsize
Definition libcurl.c:229
char filename[MAX_OSPATH]
Definition libcurl.c:207
unsigned char * buffer
Definition libcurl.c:223
const char * extraheaders
Definition libcurl.c:231
fs_offset_t startpos
Definition libcurl.c:211
const char * post_content_type
Definition libcurl.c:230
char url[1024]
Definition libcurl.c:208
curl_slist * slist
Definition libcurl.c:221
const unsigned char * postbuf
Definition libcurl.c:228
mempool_t * tempmempool
Definition zone.c:794
#define Mem_Alloc(pool, size)
Definition zone.h:92

References buf, downloadinfo::buffer, CleanURL(), Con_DPrintf(), Con_Print(), Con_Printf(), curl_dll, CURL_DOWNLOAD_FAILED, Curl_EndDownload(), CURL_fwrite(), curl_maxdownloads, curl_useragent, curl_useragent_append, downloadinfo::curle, CURLE_OK, curlm, CURLPROTO_FTP, CURLPROTO_HTTP, CURLPROTO_HTTPS, developer_curl, engineversion, downloadinfo::filename, FS_OpenRealFile(), FS_Seek(), FS_Tell(), cvar_t::integer, List_For_Each_Entry, Mem_Alloc, NULL, numdownloads, qcurl_easy_init, qcurl_easy_setopt, qcurl_multi_add_handle, qcurl_slist_append, downloadinfo::referer, downloadinfo::slist, downloadinfo::started, downloadinfo::startpos, downloadinfo::stream, cvar_t::string, strlen(), tempmempool, downloadinfo::url, and va().

Referenced by Curl_Frame().

◆ CleanURL()

static const char * CleanURL ( const char * url,
char * urlbuf,
size_t urlbuflength )
static

Definition at line 651 of file libcurl.c.

652{
653 const char *p, *q, *r;
654
655 // if URL is of form anything://foo-without-slash@rest, replace by anything://rest
656 p = strstr(url, "://");
657 if(p)
658 {
659 q = strchr(p + 3, '@');
660 if(q)
661 {
662 r = strchr(p + 3, '/');
663 if(!r || q < r)
664 {
665 dpsnprintf(urlbuf, urlbuflength, "%.*s%s", (int)(p - url + 3), url, q + 1);
666 return urlbuf;
667 }
668 }
669 }
670
671 return url;
672}
int dpsnprintf(char *buffer, size_t buffersize, const char *format,...)
Returns the number of printed characters, excluding the final '\0' or returns -1 if the buffer isn't ...
Definition common.c:997
dp_FragColor r

References dpsnprintf(), and r.

Referenced by CheckPendingDownloads(), Curl_Begin(), and Curl_Info_f().

◆ Curl_Available()

qbool Curl_Available ( void )

Definition at line 840 of file libcurl.c.

841{
842 return curl_dll ? true : false;
843}
const float true

References curl_dll, and true.

Referenced by checkextension().

◆ Curl_Begin()

static qbool Curl_Begin ( const char * URL,
const char * extraheaders,
double maxspeed,
const char * name,
int loadtype,
qbool forthismap,
const char * post_content_type,
const unsigned char * postbuf,
size_t postbufsize,
unsigned char * buf,
size_t bufsize,
curl_callback_t callback,
void * cbdata )
static

Definition at line 886 of file libcurl.c.

887{
888 if(buf)
889 if(loadtype != LOADTYPE_NONE)
890 Host_Error("Curl_Begin: loadtype and buffer are both set");
891
893 {
894 return false;
895 }
896 else
897 {
898 char fn[MAX_OSPATH];
899 char urlbuf[1024];
900 const char *p, *q;
901 size_t length;
902 downloadinfo *di;
903
904 // if URL is protocol:///* or protocol://:port/*, insert the IP of the current server
905 p = strchr(URL, ':');
906 if(p)
907 {
908 if(!strncmp(p, ":///", 4) || !strncmp(p, "://:", 4))
909 {
910 char addressstring[128];
911 *addressstring = 0;
912 InfoString_GetValue(cls.userinfo, "*ip", addressstring, sizeof(addressstring));
913 q = strchr(addressstring, ':');
914 if(!q)
915 q = addressstring + strlen(addressstring);
916 if(*addressstring)
917 {
918 dpsnprintf(urlbuf, sizeof(urlbuf), "%.*s://%.*s%s", (int) (p - URL), URL, (int) (q - addressstring), addressstring, URL + (p - URL) + 3);
919 URL = urlbuf;
920 }
921 }
922 }
923
924 // Note: This extraction of the file name portion is NOT entirely correct.
925 //
926 // It does the following:
927 //
928 // http://host/some/script.cgi/SomeFile.pk3?uid=ABCDE -> SomeFile.pk3
929 // http://host/some/script.php?uid=ABCDE&file=/SomeFile.pk3 -> SomeFile.pk3
930 // http://host/some/script.php?uid=ABCDE&file=SomeFile.pk3 -> script.php
931 //
932 // However, I'd like to keep this "buggy" behavior so that PHP script
933 // authors can write download scripts without having to enable
934 // AcceptPathInfo on Apache. They just have to ensure that their script
935 // can be called with such a "fake" path name like
936 // http://host/some/script.php?uid=ABCDE&file=/SomeFile.pk3
937 //
938 // By the way, such PHP scripts should either send the file or a
939 // "Location:" redirect; PHP code example:
940 //
941 // header("Location: http://www.example.com/");
942 //
943 // By the way, this will set User-Agent to something like
944 // "Nexuiz build 22:27:55 Mar 17 2006" (engineversion) and Referer to
945 // dp://serverhost:serverport/ so you can filter on this; an example
946 // httpd log file line might be:
947 //
948 // 141.2.16.3 - - [17/Mar/2006:22:32:43 +0100] "GET /maps/tznex07.pk3 HTTP/1.1" 200 1077455 "dp://141.2.16.7:26000/" "Nexuiz Linux 22:07:43 Mar 17 2006"
949
951
952 if(buf)
953 {
954 if(!name)
955 name = CleanURL(URL, urlbuf, sizeof(urlbuf));
956 }
957 else
958 {
959 if(!name)
960 {
961 name = CleanURL(URL, urlbuf, sizeof(urlbuf));
962 p = strrchr(name, '/');
963 p = p ? (p+1) : name;
964 q = strchr(p, '?');
965 length = q ? (size_t)(q - p) : strlen(p);
966 dpsnprintf(fn, sizeof(fn), "dlcache/%.*s", (int)length, p);
967 }
968 else
969 {
970 dpsnprintf(fn, sizeof(fn), "dlcache/%s", name);
971 }
972
973 name = fn; // make it point back
974
975 // already downloading the file?
976 {
977 downloadinfo *existingdownloadinfo = Curl_Find(fn);
978 if(existingdownloadinfo)
979 {
980 Con_Printf("Can't download %s, already getting it from %s!\n", fn, CleanURL(existingdownloadinfo->url, urlbuf, sizeof(urlbuf)));
981
982 // however, if it was not for this map yet...
983 if(forthismap && !existingdownloadinfo->forthismap)
984 {
985 existingdownloadinfo->forthismap = true;
986 // this "fakes" a download attempt so the client will wait for
987 // the download to finish and then reconnect
989 }
990
992 return false;
993 }
994 }
995
996 if(FS_FileExists(fn))
997 {
998 if(loadtype == LOADTYPE_PAK)
999 {
1000 qbool already_loaded;
1001 if(FS_AddPack(fn, &already_loaded, true, true))
1002 {
1003 Con_DPrintf("%s already exists, not downloading!\n", fn);
1004 if(already_loaded)
1005 Con_DPrintf("(pak was already loaded)\n");
1006 else
1007 {
1008 if(forthismap)
1009 {
1012 }
1013 }
1014
1016 return false;
1017 }
1018 else
1019 {
1020 qfile_t *f = FS_OpenRealFile(fn, "rb", false);
1021 if(f)
1022 {
1023 char b[4] = {0};
1024 FS_Read(f, b, sizeof(b)); // no "-1", I will use memcmp
1025
1026 if(memcmp(b, "PK\x03\x04", 4) && memcmp(b, "PACK", 4))
1027 {
1028 Con_DPrintf("Detected non-PAK %s, clearing and NOT resuming.\n", fn);
1029 FS_Close(f);
1030 f = FS_OpenRealFile(fn, "wb", false);
1031 if(f)
1032 FS_Close(f);
1033 }
1034 else
1035 {
1036 // OK
1037 FS_Close(f);
1038 }
1039 }
1040 }
1041 }
1042 else
1043 {
1044 // never resume these
1045 qfile_t *f = FS_OpenRealFile(fn, "wb", false);
1046 if(f)
1047 FS_Close(f);
1048 }
1049 }
1050 }
1051
1052 // if we get here, we actually want to download... so first verify the
1053 // URL scheme (so one can't read local files using file://)
1054 if(strncmp(URL, "http://", 7) && strncmp(URL, "ftp://", 6) && strncmp(URL, "https://", 8))
1055 {
1056 Con_Printf("Curl_Begin(\"%s\"): nasty URL scheme rejected\n", URL);
1058 return false;
1059 }
1060
1061 if(forthismap)
1063 di = (downloadinfo *) Z_Malloc(sizeof(*di));
1064 dp_strlcpy(di->filename, name, sizeof(di->filename));
1065 dp_strlcpy(di->url, URL, sizeof(di->url));
1066 dpsnprintf(di->referer, sizeof(di->referer), "dp://%s/", cls.netcon ? cls.netcon->address : "notconnected.invalid");
1067 di->forthismap = forthismap;
1068 di->stream = NULL;
1069 di->startpos = 0;
1070 di->curle = NULL;
1071 di->started = false;
1072 di->loadtype = loadtype;
1073 di->maxspeed = maxspeed;
1074 di->bytes_received = 0;
1075 di->bytes_received_curl = 0;
1076 di->bytes_sent_curl = 0;
1077 di->extraheaders = extraheaders;
1078 di->buffer = buf;
1079 di->buffersize = bufsize;
1080 if(callback == NULL)
1081 {
1083 di->callback_data = di;
1084 }
1085 else
1086 {
1087 di->callback = callback;
1088 di->callback_data = cbdata;
1089 }
1090
1091 if(post_content_type)
1092 {
1093 di->post_content_type = post_content_type;
1094 di->postbuf = postbuf;
1095 di->postbufsize = postbufsize;
1096 }
1097 else
1098 {
1099 di->post_content_type = NULL;
1100 di->postbuf = NULL;
1101 di->postbufsize = 0;
1102 }
1103
1104 List_Add(&di->list, &downloads);
1105
1106 if (curl_mutex)
1108
1109 return true;
1110 }
1111}
client_static_t cls
Definition cl_main.c:116
size_t InfoString_GetValue(const char *buffer, const char *key, char *value, size_t valuesize)
Returns the number of bytes written to *value excluding the \0 terminator.
static void List_Add(llist_t *node, llist_t *head)
Definition com_list.h:241
#define dp_strlcpy(dst, src, dsize)
Definition common.h:303
fs_offset_t FS_Read(qfile_t *file, void *buffer, size_t buffersize)
Definition fs.c:3066
qbool FS_AddPack(const char *pakfile, qbool *already_loaded, qbool keep_plain_dirs, qbool dlcache)
Definition fs.c:1309
int FS_Close(qfile_t *file)
Definition fs.c:2970
const char * FS_FileExists(const char *filename)
Look for a file in the packages and in the filesystem Returns its canonical name (same case as used i...
Definition fs.c:3693
GLenum GLuint GLenum GLsizei length
Definition glquake.h:657
void Host_Error(const char *error,...)
Definition host.c:85
static void curl_default_callback(int status, size_t length_received, unsigned char *buffer, void *cbdata)
Definition libcurl.c:456
static cvar_t curl_enabled
Definition libcurl.c:10
static int numdownloads_success
Definition libcurl.c:240
#define LOADTYPE_NONE
Definition libcurl.c:198
#define LOADTYPE_PAK
Definition libcurl.c:199
static downloadinfo * Curl_Find(const char *filename)
Definition libcurl.c:852
void * curl_mutex
Definition libcurl.c:203
static int numdownloads_added
Definition libcurl.c:241
#define MAX_OSPATH
max length of a filesystem pathname
Definition qdefs.h:175
bool qbool
Definition qtypes.h:9
float f
dp_FragColor b
netconn_t * netcon
Definition client.h:630
char userinfo[MAX_USERINFO_STRING]
Definition client.h:669
double bytes_sent_curl
Definition libcurl.c:217
size_t buffersize
Definition libcurl.c:224
qbool forthismap
Definition libcurl.c:219
curl_callback_t callback
Definition libcurl.c:225
size_t bytes_received
Definition libcurl.c:215
double maxspeed
Definition libcurl.c:220
double bytes_received_curl
Definition libcurl.c:216
llist_t list
Definition libcurl.c:218
void * callback_data
Definition libcurl.c:226
char address[128]
Definition netconn.h:231
#define Thread_LockMutex(m)
Definition thread.h:17
#define Thread_UnlockMutex(m)
Definition thread.h:18
#define Z_Malloc(size)
Definition zone.h:161

References netconn_t::address, b, buf, downloadinfo::buffer, downloadinfo::buffersize, downloadinfo::bytes_received, downloadinfo::bytes_received_curl, downloadinfo::bytes_sent_curl, downloadinfo::callback, downloadinfo::callback_data, CleanURL(), cls, Con_DPrintf(), Con_Printf(), curl_default_callback(), curl_dll, curl_enabled, Curl_Find(), curl_mutex, downloadinfo::curle, dp_strlcpy, dpsnprintf(), downloadinfo::extraheaders, f, downloadinfo::filename, downloadinfo::forthismap, FS_AddPack(), FS_Close(), FS_FileExists(), FS_OpenRealFile(), FS_Read(), Host_Error(), InfoString_GetValue(), cvar_t::integer, length, downloadinfo::list, List_Add(), downloadinfo::loadtype, LOADTYPE_NONE, LOADTYPE_PAK, MAX_OSPATH, downloadinfo::maxspeed, name, client_static_t::netcon, NULL, numdownloads_added, numdownloads_success, downloadinfo::post_content_type, downloadinfo::postbuf, downloadinfo::postbufsize, downloadinfo::referer, downloadinfo::started, downloadinfo::startpos, downloadinfo::stream, strlen(), Thread_LockMutex, Thread_UnlockMutex, downloadinfo::url, client_static_t::userinfo, and Z_Malloc.

Referenced by Curl_Begin_ToFile(), Curl_Begin_ToMemory(), and Curl_Begin_ToMemory_POST().

◆ Curl_Begin_ToFile()

qbool Curl_Begin_ToFile ( const char * URL,
double maxspeed,
const char * name,
int loadtype,
qbool forthismap )

Definition at line 1113 of file libcurl.c.

1114{
1115 return Curl_Begin(URL, NULL, maxspeed, name, loadtype, forthismap, NULL, NULL, 0, NULL, 0, NULL, NULL);
1116}
static qbool Curl_Begin(const char *URL, const char *extraheaders, double maxspeed, const char *name, int loadtype, qbool forthismap, const char *post_content_type, const unsigned char *postbuf, size_t postbufsize, unsigned char *buf, size_t bufsize, curl_callback_t callback, void *cbdata)
Definition libcurl.c:886

References Curl_Begin(), name, and NULL.

Referenced by Curl_Curl_f().

◆ Curl_Begin_ToMemory()

qbool Curl_Begin_ToMemory ( const char * URL,
double maxspeed,
unsigned char * buf,
size_t bufsize,
curl_callback_t callback,
void * cbdata )

Definition at line 1117 of file libcurl.c.

1118{
1119 return Curl_Begin(URL, NULL, maxspeed, NULL, false, false, NULL, NULL, 0, buf, bufsize, callback, cbdata);
1120}

References buf, Curl_Begin(), and NULL.

Referenced by Crypto_KeyGen_f().

◆ Curl_Begin_ToMemory_POST()

qbool Curl_Begin_ToMemory_POST ( const char * URL,
const char * extraheaders,
double maxspeed,
const char * post_content_type,
const unsigned char * postbuf,
size_t postbufsize,
unsigned char * buf,
size_t bufsize,
curl_callback_t callback,
void * cbdata )

Definition at line 1121 of file libcurl.c.

1122{
1123 return Curl_Begin(URL, extraheaders, maxspeed, NULL, false, false, post_content_type, postbuf, postbufsize, buf, bufsize, callback, cbdata);
1124}

References buf, Curl_Begin(), and NULL.

Referenced by VM_uri_get().

◆ Curl_Cancel_ToMemory()

void Curl_Cancel_ToMemory ( curl_callback_t callback,
void * cbdata )

Definition at line 863 of file libcurl.c.

864{
865 downloadinfo *di, *ndi;
866 if(!curl_dll)
867 return;
868 List_For_Each_Entry_Safe(di, ndi, &downloads, downloadinfo, list)
869 {
870 if(di->callback == callback && di->callback_data == cbdata)
871 {
872 di->callback = curl_quiet_callback; // do NOT call the callback
874 }
875 }
876}
#define List_For_Each_Entry_Safe(pos, n, head, type, member)
Definition com_list.h:173
static void curl_quiet_callback(int status, size_t length_received, unsigned char *buffer, void *cbdata)
Definition libcurl.c:482

References downloadinfo::callback, downloadinfo::callback_data, curl_dll, CURL_DOWNLOAD_ABORTED, Curl_EndDownload(), curl_quiet_callback(), CURLE_OK, List_For_Each_Entry_Safe, and NULL.

◆ Curl_CancelAll()

void Curl_CancelAll ( void )

Definition at line 1284 of file libcurl.c.

1285{
1286 if(!curl_dll)
1287 return;
1288
1290
1291 while(!List_Is_Empty(&downloads))
1292 {
1294 // INVARIANT: downloads will point to the next download after that!
1295 }
1296
1298}
#define List_First_Entry(ptr, type, member)
Definition com_list.h:50
static qbool List_Is_Empty(const llist_t *list)
Definition com_list.h:211

References curl_dll, CURL_DOWNLOAD_ABORTED, Curl_EndDownload(), curl_mutex, CURLE_OK, List_First_Entry, List_Is_Empty(), NULL, Thread_LockMutex, and Thread_UnlockMutex.

Referenced by CL_StopDownload_f(), Curl_Curl_f(), and Curl_Shutdown().

◆ Curl_CheckCommandWhenDone()

static void Curl_CheckCommandWhenDone ( void )
static

Definition at line 331 of file libcurl.c.

332{
333 if(!curl_dll)
334 return;
336 {
337 if(numdownloads_fail == 0)
338 {
339 Con_DPrintf("cURL downloads occurred, executing %s\n", command_when_done);
340 Cbuf_AddText(cmd_local, "\n");
342 Cbuf_AddText(cmd_local, "\n");
343 }
344 else
345 {
346 Con_DPrintf("cURL downloads FAILED, executing %s\n", command_when_error);
347 Cbuf_AddText(cmd_local, "\n");
349 Cbuf_AddText(cmd_local, "\n");
350 }
352 }
353}
void Cbuf_AddText(cmd_state_t *cmd, const char *text)
Definition cmd.c:264
cmd_state_t * cmd_local
command interpreter for local commands injected by SVQC, CSQC, MQC, server or client engine code uses...
Definition cmd.c:25
static char command_when_error[256]
Definition libcurl.c:243
static int numdownloads_fail
Definition libcurl.c:239
void Curl_Clear_forthismap(void)
Definition libcurl.c:287
static char command_when_done[256]
Definition libcurl.c:242

References Cbuf_AddText(), cmd_local, command_when_done, command_when_error, Con_DPrintf(), Curl_Clear_forthismap(), curl_dll, numdownloads_added, numdownloads_fail, and numdownloads_success.

Referenced by Curl_Curl_f(), and Curl_Frame().

◆ Curl_Clear_forthismap()

void Curl_Clear_forthismap ( void )

Definition at line 287 of file libcurl.c.

288{
289 downloadinfo *di;
290 if(noclear)
291 return;
293 List_For_Each_Entry(di, &downloads, downloadinfo, list)
294 di->forthismap = false;
301}
static qbool noclear
Definition libcurl.c:237
static void Curl_CommandWhenDone(const char *cmd)
Definition libcurl.c:254
static void Curl_CommandWhenError(const char *cmd)
Definition libcurl.c:270

References Curl_CommandWhenDone(), Curl_CommandWhenError(), curl_mutex, downloadinfo::forthismap, List_For_Each_Entry, noclear, NULL, numdownloads_added, numdownloads_fail, numdownloads_success, Thread_LockMutex, and Thread_UnlockMutex.

Referenced by CL_DisconnectEx(), Curl_CheckCommandWhenDone(), and Curl_Curl_f().

◆ Curl_ClearRequirements()

void Curl_ClearRequirements ( void )

Definition at line 1795 of file libcurl.c.

1796{
1797 while(requirements)
1798 {
1801 Z_Free(req);
1802 }
1803}
static requirement * requirements
Definition libcurl.c:1769
struct requirement_s * next
Definition libcurl.c:1765
#define Z_Free(data)
Definition zone.h:164

References requirement::next, requirements, and Z_Free.

Referenced by Curl_Shutdown(), and SV_SpawnServer().

◆ CURL_CloseLibrary()

static void CURL_CloseLibrary ( void )
static

Definition at line 397 of file libcurl.c.

398{
400}
void Sys_FreeLibrary(dllhandle_t *handle)
Definition sys_shared.c:245

References curl_dll, and Sys_FreeLibrary().

Referenced by Curl_Shutdown().

◆ Curl_CommandWhenDone()

static void Curl_CommandWhenDone ( const char * cmd)
static

Definition at line 254 of file libcurl.c.

255{
256 if(!curl_dll)
257 return;
258 if(cmd)
260 else
262}
void cmd(string command,...)

References cmd(), command_when_done, curl_dll, and dp_strlcpy.

Referenced by Curl_Clear_forthismap(), Curl_Curl_f(), and Curl_Register_predownload().

◆ Curl_CommandWhenError()

static void Curl_CommandWhenError ( const char * cmd)
static

Definition at line 270 of file libcurl.c.

271{
272 if(!curl_dll)
273 return;
274 if(cmd)
276 else
278}

References cmd(), command_when_error, curl_dll, and dp_strlcpy.

Referenced by Curl_Clear_forthismap(), and Curl_Register_predownload().

◆ Curl_Curl_f()

static void Curl_Curl_f ( cmd_state_t * cmd)
static

Definition at line 1424 of file libcurl.c.

1425{
1426 double maxspeed = 0;
1427 int i;
1428 int end;
1429 int loadtype = LOADTYPE_NONE;
1430 qbool forthismap = false;
1431 const char *url;
1432 const char *name = 0;
1433
1434 if(!curl_dll)
1435 {
1436 Con_Print("libcurl DLL not found, this command is inactive.\n");
1437 return;
1438 }
1439
1441 {
1442 Con_Print("curl support not enabled. Set cl_curl_enabled to 1 to enable.\n");
1443 return;
1444 }
1445
1446 if(Cmd_Argc(cmd) < 2)
1447 {
1448 Con_Print("usage:\ncurl --info, curl --cancel [filename], curl url\n");
1449 return;
1450 }
1451
1452 url = Cmd_Argv(cmd, Cmd_Argc(cmd) - 1);
1453 end = Cmd_Argc(cmd);
1454
1455 for(i = 1; i != end; ++i)
1456 {
1457 const char *a = Cmd_Argv(cmd, i);
1458 if(!strcmp(a, "--info"))
1459 {
1461 return;
1462 }
1463 else if(!strcmp(a, "--cancel"))
1464 {
1465 if(i == end - 1) // last argument
1467 else
1468 {
1469 downloadinfo *di = Curl_Find(url);
1470 if(di)
1472 else
1473 Con_Print("download not found\n");
1474 }
1475 return;
1476 }
1477 else if(!strcmp(a, "--pak"))
1478 {
1479 loadtype = LOADTYPE_PAK;
1480 }
1481 else if(!strcmp(a, "--cachepic"))
1482 {
1483 loadtype = LOADTYPE_CACHEPIC;
1484 }
1485 else if(!strcmp(a, "--skinframe"))
1486 {
1487 loadtype = LOADTYPE_SKINFRAME;
1488 }
1489 else if(!strcmp(a, "--for")) // must be last option
1490 {
1491 for(i = i + 1; i != end - 1; ++i)
1492 {
1493 if(!FS_FileExists(Cmd_Argv(cmd, i)))
1494 goto needthefile; // why can't I have a "double break"?
1495 }
1496 // if we get here, we have all the files...
1497 return;
1498 }
1499 else if(!strcmp(a, "--forthismap"))
1500 {
1501 forthismap = true;
1502 }
1503 else if(!strcmp(a, "--as"))
1504 {
1505 if(i < end - 1)
1506 {
1507 ++i;
1508 name = Cmd_Argv(cmd, i);
1509 }
1510 }
1511 else if(!strcmp(a, "--clear_autodownload"))
1512 {
1513 // mark all running downloads as "not for this map", so if they
1514 // fail, it does not matter
1516 return;
1517 }
1518 else if(!strcmp(a, "--finish_autodownload"))
1519 {
1521 {
1522 char donecommand[256];
1523 if(cls.netcon)
1524 {
1525 if(cl.loadbegun) // curling won't inhibit loading the map any more when at this stage, so bail out and force a reconnect
1526 {
1527 dpsnprintf(donecommand, sizeof(donecommand), "connect %s", cls.netcon->address);
1528 Curl_CommandWhenDone(donecommand);
1529 noclear = true;
1530 CL_Disconnect();
1531 noclear = false;
1533 }
1534 else
1536 }
1537 }
1538 return;
1539 }
1540 else if(!strncmp(a, "--maxspeed=", 11))
1541 {
1542 maxspeed = atof(a + 11);
1543 }
1544 else if(*a == '-')
1545 {
1546 Con_Printf("curl: invalid option %s\n", a);
1547 // but we ignore the option
1548 }
1549 }
1550
1551needthefile:
1552 Curl_Begin_ToFile(url, maxspeed, name, loadtype, forthismap);
1553}
client_state_t cl
Definition cl_main.c:117
void CL_Disconnect(void)
Definition cl_main.c:478
static int Cmd_Argc(cmd_state_t *cmd)
Definition cmd.h:249
static const char * Cmd_Argv(cmd_state_t *cmd, int arg)
Cmd_Argv(cmd, ) will return an empty string (not a NULL) if arg > argc, so string operations are alwa...
Definition cmd.h:254
void Curl_Register_predownload(void)
Definition libcurl.c:315
qbool Curl_Begin_ToFile(const char *URL, double maxspeed, const char *name, int loadtype, qbool forthismap)
Definition libcurl.c:1113
static void Curl_CheckCommandWhenDone(void)
Definition libcurl.c:331
void Curl_CancelAll(void)
Definition libcurl.c:1284
static void Curl_Info_f(cmd_state_t *cmd)
Definition libcurl.c:1369
#define LOADTYPE_CACHEPIC
Definition libcurl.c:200
#define LOADTYPE_SKINFRAME
Definition libcurl.c:201
int i
ret a
qbool loadbegun
Definition client.h:1027

References a, netconn_t::address, cl, CL_Disconnect(), cls, cmd(), Cmd_Argc(), Cmd_Argv(), Con_Print(), Con_Printf(), Curl_Begin_ToFile(), Curl_CancelAll(), Curl_CheckCommandWhenDone(), Curl_Clear_forthismap(), Curl_CommandWhenDone(), curl_dll, CURL_DOWNLOAD_ABORTED, curl_enabled, Curl_EndDownload(), Curl_Find(), Curl_Info_f(), Curl_Register_predownload(), CURLE_OK, dpsnprintf(), FS_FileExists(), i, cvar_t::integer, client_state_t::loadbegun, LOADTYPE_CACHEPIC, LOADTYPE_NONE, LOADTYPE_PAK, LOADTYPE_SKINFRAME, name, client_static_t::netcon, noclear, NULL, and numdownloads_added.

Referenced by Curl_Init_Commands().

◆ curl_default_callback()

static void curl_default_callback ( int status,
size_t length_received,
unsigned char * buffer,
void * cbdata )
static

Definition at line 456 of file libcurl.c.

457{
458 downloadinfo *di = (downloadinfo *) cbdata;
459 switch(status)
460 {
461 case CURLCBSTATUS_OK:
462 Con_DPrintf("Download of %s: OK\n", di->filename);
463 break;
465 Con_DPrintf("Download of %s: FAILED\n", di->filename);
466 break;
468 Con_DPrintf("Download of %s: ABORTED\n", di->filename);
469 break;
471 Con_DPrintf("Download of %s: (unknown server error)\n", di->filename);
472 break;
474 Con_DPrintf("Download of %s: (unknown client error)\n", di->filename);
475 break;
476 default:
477 Con_DPrintf("Download of %s: %d\n", di->filename, status);
478 break;
479 }
480}
@ CURLCBSTATUS_UNKNOWN
Definition libcurl.h:11
@ CURLCBSTATUS_SERVERERROR
Definition libcurl.h:10
@ CURLCBSTATUS_OK
Definition libcurl.h:7
@ CURLCBSTATUS_FAILED
Definition libcurl.h:8
@ CURLCBSTATUS_ABORTED
Definition libcurl.h:9

References Con_DPrintf(), CURLCBSTATUS_ABORTED, CURLCBSTATUS_FAILED, CURLCBSTATUS_OK, CURLCBSTATUS_SERVERERROR, CURLCBSTATUS_UNKNOWN, and downloadinfo::filename.

Referenced by Curl_Begin(), and curl_quiet_callback().

◆ Curl_EndDownload()

static void Curl_EndDownload ( downloadinfo * di,
CurlStatus status,
CURLcode error,
const char * content_type_ )
static

Definition at line 521 of file libcurl.c.

522{
523 char content_type[64];
524 qbool ok = false;
525 if(!curl_dll)
526 return;
527 switch(status)
528 {
530 ok = true;
532 break;
535 break;
538 break;
540 // reopen to enforce it to have zero bytes again
541 if(di->stream)
542 {
543 FS_Close(di->stream);
544 di->stream = FS_OpenRealFile(di->filename, "wb", false);
545 }
546
547 if(di->callback)
549 break;
550 default:
551 if(di->callback)
553 break;
554 }
555 if(content_type_)
556 dp_strlcpy(content_type, content_type_, sizeof(content_type));
557 else
558 *content_type = 0;
559
560 if(di->curle)
561 {
564 if(di->slist)
566 }
567
568 if(!di->callback && ok && !di->bytes_received)
569 {
570 Con_Printf("ERROR: empty file\n");
571 ok = false;
572 }
573
574 if(di->stream)
575 FS_Close(di->stream);
576
577#define CLEAR_AND_RETRY() \
578 do \
579 { \
580 di->stream = FS_OpenRealFile(di->filename, "wb", false); \
581 FS_Close(di->stream); \
582 if(di->startpos && !di->callback) \
583 { \
584 Curl_Begin(di->url, di->extraheaders, di->maxspeed, di->filename, di->loadtype, di->forthismap, di->post_content_type, di->postbuf, di->postbufsize, NULL, 0, NULL, NULL); \
585 di->forthismap = false; \
586 } \
587 } \
588 while(0)
589
590 if(ok && di->loadtype == LOADTYPE_PAK)
591 {
592 ok = FS_AddPack(di->filename, NULL, true, true);
593 if(!ok)
595 }
596 else if(ok && di->loadtype == LOADTYPE_CACHEPIC)
597 {
598 const char *p;
599 unsigned char *pixels = NULL;
600
601 p = di->filename;
602#ifdef WE_ARE_EVIL
603 if(!strncmp(p, "dlcache/", 8))
604 p += 8;
605#endif
606
607 pixels = decode_image(di, content_type);
608 if(pixels)
610 else
612 }
613 else if(ok && di->loadtype == LOADTYPE_SKINFRAME)
614 {
615 const char *p;
616 unsigned char *pixels = NULL;
617
618 p = di->filename;
619#ifdef WE_ARE_EVIL
620 if(!strncmp(p, "dlcache/", 8))
621 p += 8;
622#endif
623
624 pixels = decode_image(di, content_type);
625 if(pixels)
626 R_SkinFrame_LoadInternalBGRA(p, TEXF_FORCE_RELOAD | TEXF_MIPMAP | TEXF_ALPHA, pixels, image_width, image_height, 0, 0, 0, false); // TODO what sRGB argument to put here?
627 else
629 }
630
631 List_Delete(&di->list);
632
633 --numdownloads;
634 if(di->forthismap)
635 {
636 if(ok)
638 else
640 }
641 Z_Free(di);
642}
static void List_Delete(llist_t *node)
Definition com_list.h:274
cachepic_t * Draw_NewPic(const char *picname, int width, int height, unsigned char *pixels, textype_t textype, int texflags)
Definition gl_draw.c:256
skinframe_t * R_SkinFrame_LoadInternalBGRA(const char *name, int textureflags, const unsigned char *skindata, int width, int height, int comparewidth, int compareheight, int comparecrc, qbool sRGB)
Definition gl_rmain.c:2546
GLint GLenum GLenum GLvoid * pixels
Definition glquake.h:706
int image_height
Definition image.c:10
int image_width
Definition image.c:9
static void(* qcurl_easy_cleanup)(CURL *handle)
Definition libcurl.c:156
#define CLEAR_AND_RETRY()
static CURLMcode(* qcurl_multi_remove_handle)(CURLM *multi_handle, CURL *easy_handle)
Definition libcurl.c:165
static unsigned char * decode_image(downloadinfo *di, const char *content_type)
Definition libcurl.c:487
static void(* qcurl_slist_free_all)(curl_slist *list)
Definition libcurl.c:170
void error(string err,...)
#define TEXF_ALPHA
Definition r_textures.h:9
#define TEXF_MIPMAP
Definition r_textures.h:11
@ TEXTYPE_BGRA
Definition r_textures.h:53
#define TEXF_CLAMP
Definition r_textures.h:15
#define TEXF_FORCE_RELOAD
Definition r_textures.h:41

References downloadinfo::buffer, downloadinfo::bytes_received, downloadinfo::callback, downloadinfo::callback_data, CLEAR_AND_RETRY, Con_Printf(), curl_dll, CURL_DOWNLOAD_ABORTED, CURL_DOWNLOAD_FAILED, CURL_DOWNLOAD_SERVERERROR, CURL_DOWNLOAD_SUCCESS, CURLCBSTATUS_ABORTED, CURLCBSTATUS_FAILED, CURLCBSTATUS_OK, CURLCBSTATUS_SERVERERROR, CURLCBSTATUS_UNKNOWN, downloadinfo::curle, curlm, decode_image(), dp_strlcpy, Draw_NewPic(), error(), downloadinfo::filename, downloadinfo::forthismap, FS_AddPack(), FS_Close(), FS_OpenRealFile(), image_height, image_width, downloadinfo::list, List_Delete(), downloadinfo::loadtype, LOADTYPE_CACHEPIC, LOADTYPE_PAK, LOADTYPE_SKINFRAME, NULL, numdownloads, numdownloads_fail, numdownloads_success, pixels, qcurl_easy_cleanup, qcurl_multi_remove_handle, qcurl_slist_free_all, R_SkinFrame_LoadInternalBGRA(), downloadinfo::slist, downloadinfo::stream, TEXF_ALPHA, TEXF_CLAMP, TEXF_FORCE_RELOAD, TEXF_MIPMAP, TEXTYPE_BGRA, and Z_Free.

Referenced by CheckPendingDownloads(), Curl_Cancel_ToMemory(), Curl_CancelAll(), Curl_Curl_f(), and Curl_Frame().

◆ Curl_Find()

static downloadinfo * Curl_Find ( const char * filename)
static

Definition at line 852 of file libcurl.c.

853{
854 downloadinfo *di;
855 if(!curl_dll)
856 return NULL;
857 List_For_Each_Entry(di, &downloads, downloadinfo, list)
858 if(!strcasecmp(di->filename, filename))
859 return di;
860 return NULL;
861}

References curl_dll, downloadinfo::filename, List_For_Each_Entry, and NULL.

Referenced by Curl_Begin(), and Curl_Curl_f().

◆ Curl_FindPackURL()

static const char * Curl_FindPackURL ( const char * filename)
static

Definition at line 1701 of file libcurl.c.

1702{
1703 static char foundurl[1024]; // invoked only by server
1704 fs_offset_t filesize;
1705 char *buf = (char *) FS_LoadFile("curl_urls.txt", tempmempool, true, &filesize);
1706 if(buf && filesize)
1707 {
1708 // read lines of format "pattern url"
1709 char *p = buf;
1710 char *pattern = NULL, *patternend = NULL, *url = NULL, *urlend = NULL;
1711 qbool eof = false;
1712
1713 pattern = p;
1714 while(!eof)
1715 {
1716 switch(*p)
1717 {
1718 case 0:
1719 eof = true;
1720 // fallthrough
1721 case '\n':
1722 case '\r':
1723 if(pattern && url && patternend)
1724 {
1725 if(!urlend)
1726 urlend = p;
1727 *patternend = 0;
1728 *urlend = 0;
1729 if(matchpattern(filename, pattern, true))
1730 {
1731 dp_strlcpy(foundurl, url, sizeof(foundurl));
1732 Z_Free(buf);
1733 return foundurl;
1734 }
1735 }
1736 pattern = NULL;
1737 patternend = NULL;
1738 url = NULL;
1739 urlend = NULL;
1740 break;
1741 case ' ':
1742 case '\t':
1743 if(pattern && !patternend)
1744 patternend = p;
1745 else if(url && !urlend)
1746 urlend = p;
1747 break;
1748 default:
1749 if(!pattern)
1750 pattern = p;
1751 else if(pattern && patternend && !url)
1752 url = p;
1753 break;
1754 }
1755 ++p;
1756 }
1757 }
1758 if(buf)
1759 Z_Free(buf);
1761}
int matchpattern(const char *in, const char *pattern, int caseinsensitive)
Definition filematch.c:16
unsigned char * FS_LoadFile(const char *path, mempool_t *pool, qbool quiet, fs_offset_t *filesizepointer)
Definition fs.c:3540
int64_t fs_offset_t
Definition fs.h:37
static cvar_t sv_curl_defaulturl
Definition libcurl.c:16

References buf, dp_strlcpy, FS_LoadFile(), matchpattern(), NULL, cvar_t::string, sv_curl_defaulturl, tempmempool, and Z_Free.

Referenced by Curl_SendRequirement().

◆ Curl_Frame()

void Curl_Frame ( void )

Definition at line 1134 of file libcurl.c.

1135{
1136 double maxspeed;
1137 downloadinfo *di;
1138
1139 noclear = false;
1140
1142 return;
1143
1144 if(!curl_dll)
1145 return;
1146
1148
1150
1151 if(List_Is_Empty(&downloads))
1152 {
1154 return;
1155 }
1156
1157 if(host.realtime < curltime) // throttle
1158 {
1160 return;
1161 }
1162
1163 {
1164 int remaining;
1165 CURLMcode mc;
1166
1167 do
1168 {
1169 mc = qcurl_multi_perform(curlm, &remaining);
1170 }
1171 while(mc == CURLM_CALL_MULTI_PERFORM);
1172
1173 List_For_Each_Entry(di, &downloads, downloadinfo, list)
1174 {
1175 double b = 0;
1176 if(di->curle)
1177 {
1179 bytes_sent += (b - di->bytes_sent_curl);
1180 di->bytes_sent_curl = b;
1182 bytes_sent += (b - di->bytes_received_curl);
1183 di->bytes_received_curl = b;
1184 }
1185 }
1186
1187 for(;;)
1188 {
1189 CURLMsg *msg = qcurl_multi_info_read(curlm, &remaining);
1190 if(!msg)
1191 break;
1192 if(msg->msg == CURLMSG_DONE)
1193 {
1194 const char *ct = NULL;
1196 CURLcode result;
1198 result = msg->data.result;
1199 if(result)
1200 {
1201 failed = CURL_DOWNLOAD_FAILED;
1202 }
1203 else
1204 {
1205 long code;
1207 switch(code / 100)
1208 {
1209 case 4: // e.g. 404?
1210 case 5: // e.g. 500?
1212 result = (CURLcode) code;
1213 break;
1214 }
1216 }
1217
1218 Curl_EndDownload(di, failed, result, ct);
1219 }
1220 }
1221 }
1222
1224
1225 // when will we curl the next time?
1226 // we will wait a bit to ensure our download rate is kept.
1227 // we now know that realtime >= curltime... so set up a new curltime
1228
1229 // use the slowest allowing download to derive the maxspeed... this CAN
1230 // be done better, but maybe later
1231 maxspeed = curl_maxspeed.value;
1232 List_For_Each_Entry(di, &downloads, downloadinfo, list)
1233 if(di->maxspeed > 0)
1234 if(di->maxspeed < maxspeed || maxspeed <= 0)
1235 maxspeed = di->maxspeed;
1236
1237 if(maxspeed > 0)
1238 {
1239 double bytes = bytes_sent + bytes_received; // maybe smoothen a bit?
1240 curltime = host.realtime + bytes / (maxspeed * 1024.0);
1241 bytes_sent = 0;
1242 bytes_received = 0;
1243 }
1244 else
1246
1248}
@ ca_dedicated
Definition client.h:530
host_static_t host
Definition host.c:41
static double bytes_received
Definition libcurl.c:404
static double curltime
Definition libcurl.c:406
static void CheckPendingDownloads(void)
Definition libcurl.c:683
CurlStatus
Definition libcurl.c:448
static CURLMcode(* qcurl_multi_perform)(CURLM *multi_handle, int *running_handles)
Definition libcurl.c:162
CURLMcode
Definition libcurl.c:42
static CURLcode(* qcurl_easy_getinfo)(CURL *handle, CURLINFO info,...)
Definition libcurl.c:158
static double bytes_sent
Definition libcurl.c:405
static CURLMsg *(* qcurl_multi_info_read)(CURLM *multi_handle, int *msgs_in_queue)
Definition libcurl.c:166
CURLcode
Definition libcurl.c:37
static cvar_t curl_maxspeed
Definition libcurl.c:12
CURL * easy_handle
Definition libcurl.c:142
CURLMSG msg
Definition libcurl.c:141
union CURLMsg::@16 data
CURLcode result
Definition libcurl.c:146
cactive_t state
Definition client.h:568
float value
Definition cvar.h:74
double realtime
the accumulated mainloop time since application started (with filtering), without any slowmo or clamp...
Definition host.h:46

References b, bytes_received, downloadinfo::bytes_received_curl, bytes_sent, downloadinfo::bytes_sent_curl, ca_dedicated, CheckPendingDownloads(), cls, Curl_CheckCommandWhenDone(), curl_dll, CURL_DOWNLOAD_FAILED, CURL_DOWNLOAD_SERVERERROR, CURL_DOWNLOAD_SUCCESS, curl_enabled, Curl_EndDownload(), curl_maxspeed, curl_mutex, downloadinfo::curle, CURLINFO_CONTENT_TYPE, CURLINFO_PRIVATE, CURLINFO_RESPONSE_CODE, CURLINFO_SIZE_DOWNLOAD, CURLINFO_SIZE_UPLOAD, curlm, CURLM_CALL_MULTI_PERFORM, CURLMSG_DONE, curltime, CURLMsg::data, CURLMsg::easy_handle, host, cvar_t::integer, List_For_Each_Entry, List_Is_Empty(), downloadinfo::maxspeed, CURLMsg::msg, noclear, NULL, qcurl_easy_getinfo, qcurl_multi_info_read, qcurl_multi_perform, host_static_t::realtime, CURLMsg::result, client_static_t::state, Thread_LockMutex, Thread_UnlockMutex, and cvar_t::value.

Referenced by Host_Frame().

◆ CURL_fwrite()

static size_t CURL_fwrite ( void * data,
size_t size,
size_t nmemb,
void * vdi )
static

Definition at line 416 of file libcurl.c.

417{
418 fs_offset_t ret = -1;
419 size_t bytes = size * nmemb;
420 downloadinfo *di = (downloadinfo *) vdi;
421
422 if(di->buffer)
423 {
424 if(di->bytes_received + bytes <= di->buffersize)
425 {
426 memcpy(di->buffer + di->bytes_received, data, bytes);
427 ret = bytes;
428 }
429 // otherwise: buffer overrun, ret stays -1
430 }
431
432 if(di->stream)
433 {
434 ret = FS_Write(di->stream, data, bytes);
435 }
436
437 di->bytes_received += bytes;
438
439 //Con_Printf("CURL_fwrite callback timestamp: %f bytes: %ld\n", host.realtime, ret);
440
441 return ret;
442 // Why not ret / nmemb?
443 // Because CURLOPT_WRITEFUNCTION docs say to return the number of bytes.
444 // Yes, this is incompatible to fwrite(2).
445}
vector size
fs_offset_t FS_Write(qfile_t *file, const void *data, size_t datasize)
Definition fs.c:3019
GLsizeiptr const GLvoid * data
Definition glquake.h:639
return ret

References downloadinfo::buffer, downloadinfo::bytes_received, data, FS_Write(), ret, size, and downloadinfo::stream.

Referenced by CheckPendingDownloads().

◆ Curl_GetDownloadAmount()

static double Curl_GetDownloadAmount ( downloadinfo * di)
static

Definition at line 1323 of file libcurl.c.

1324{
1325 if(!curl_dll)
1326 return -2;
1327 if(di->curle)
1328 {
1329 double length;
1331 if(length > 0)
1332 return (di->startpos + di->bytes_received) / (di->startpos + length);
1333 else
1334 return 0;
1335 }
1336 else
1337 return -1;
1338}

References downloadinfo::bytes_received, curl_dll, downloadinfo::curle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, length, qcurl_easy_getinfo, and downloadinfo::startpos.

Referenced by Curl_GetDownloadInfo(), and Curl_Info_f().

◆ Curl_GetDownloadInfo()

Curl_downloadinfo_t * Curl_GetDownloadInfo ( int * nDownloads,
const char ** additional_info,
char * addinfo,
size_t addinfolength )

Definition at line 1612 of file libcurl.c.

1613{
1614 int i;
1615 downloadinfo *di;
1616 Curl_downloadinfo_t *downinfo;
1617
1618 if(!curl_dll)
1619 {
1620 *nDownloads = 0;
1621 if(additional_info)
1622 *additional_info = NULL;
1623 return NULL;
1624 }
1625
1627
1628 i = 0;
1629 List_For_Each_Entry(di, &downloads, downloadinfo, list)
1630 ++i;
1631
1632 downinfo = (Curl_downloadinfo_t *) Z_Malloc(sizeof(*downinfo) * i);
1633 i = 0;
1634 List_For_Each_Entry(di, &downloads, downloadinfo, list)
1635 {
1636 // do not show infobars for background downloads
1637 if(developer.integer <= 0)
1638 if(di->buffer)
1639 continue;
1640 dp_strlcpy(downinfo[i].filename, di->filename, sizeof(downinfo[i].filename));
1641 if(di->curle)
1642 {
1643 downinfo[i].progress = Curl_GetDownloadAmount(di);
1644 downinfo[i].speed = Curl_GetDownloadSpeed(di);
1645 downinfo[i].queued = false;
1646 }
1647 else
1648 {
1649 downinfo[i].queued = true;
1650 }
1651 ++i;
1652 }
1653
1654 if(additional_info)
1655 {
1656 // TODO: can I clear command_when_done as soon as the first download fails?
1658 {
1659 if(!strncmp(command_when_done, "connect ", 8))
1660 dpsnprintf(addinfo, addinfolength, "(will join %s when done)", command_when_done + 8);
1661 else if(!strcmp(command_when_done, "cl_begindownloads"))
1662 dpsnprintf(addinfo, addinfolength, "(will enter the game when done)");
1663 else
1664 dpsnprintf(addinfo, addinfolength, "(will do '%s' when done)", command_when_done);
1665 *additional_info = addinfo;
1666 }
1667 else
1668 *additional_info = NULL;
1669 }
1670
1671 *nDownloads = i;
1673 return downinfo;
1674}
cvar_t developer
Definition host.c:48
static double Curl_GetDownloadAmount(downloadinfo *di)
Definition libcurl.c:1323
static double Curl_GetDownloadSpeed(downloadinfo *di)
Definition libcurl.c:1347

References downloadinfo::buffer, command_when_done, curl_dll, Curl_GetDownloadAmount(), Curl_GetDownloadSpeed(), curl_mutex, downloadinfo::curle, developer, dp_strlcpy, dpsnprintf(), Curl_downloadinfo_t::filename, downloadinfo::filename, i, cvar_t::integer, List_For_Each_Entry, NULL, numdownloads_added, numdownloads_fail, Curl_downloadinfo_t::progress, Curl_downloadinfo_t::queued, Curl_downloadinfo_t::speed, Thread_LockMutex, Thread_UnlockMutex, and Z_Malloc.

Referenced by SCR_DrawCurlDownload(), and SCR_InfobarHeight().

◆ Curl_GetDownloadSpeed()

static double Curl_GetDownloadSpeed ( downloadinfo * di)
static

Definition at line 1347 of file libcurl.c.

1348{
1349 if(!curl_dll)
1350 return -2;
1351 if(di->curle)
1352 {
1353 double speed;
1355 return speed;
1356 }
1357 else
1358 return -1;
1359}

References curl_dll, downloadinfo::curle, CURLINFO_SPEED_DOWNLOAD, and qcurl_easy_getinfo.

Referenced by Curl_GetDownloadInfo(), and Curl_Info_f().

◆ Curl_Have_forthismap()

qbool Curl_Have_forthismap ( void )

Definition at line 310 of file libcurl.c.

311{
312 return numdownloads_added != 0;
313}

References numdownloads_added.

Referenced by CL_BeginDownloads().

◆ Curl_Info_f()

static void Curl_Info_f ( cmd_state_t * cmd)
static

Definition at line 1369 of file libcurl.c.

1370{
1371 downloadinfo *di;
1372 char urlbuf[1024];
1373 if(!curl_dll)
1374 return;
1375 if(Curl_Running())
1376 {
1378 Con_Print("Currently running downloads:\n");
1379 List_For_Each_Entry(di, &downloads, downloadinfo, list)
1380 {
1381 double speed, percent;
1382 Con_Printf(" %s -> %s ", CleanURL(di->url, urlbuf, sizeof(urlbuf)), di->filename);
1383 percent = 100.0 * Curl_GetDownloadAmount(di);
1384 speed = Curl_GetDownloadSpeed(di);
1385 if(percent >= 0)
1386 Con_Printf("(%.1f%% @ %.1f KiB/s)\n", percent, speed / 1024.0);
1387 else
1388 Con_Print("(queued)\n");
1389 }
1391 }
1392 else
1393 {
1394 Con_Print("No downloads running.\n");
1395 }
1396}
qbool Curl_Running(void)
Definition libcurl.c:1307

References CleanURL(), Con_Print(), Con_Printf(), curl_dll, Curl_GetDownloadAmount(), Curl_GetDownloadSpeed(), curl_mutex, Curl_Running(), downloadinfo::filename, List_For_Each_Entry, Thread_LockMutex, Thread_UnlockMutex, and downloadinfo::url.

Referenced by Curl_Curl_f().

◆ Curl_Init()

void Curl_Init ( void )

Definition at line 810 of file libcurl.c.

811{
813 if(!curl_dll)
814 return;
818}
static qbool CURL_OpenLibrary(void)
Definition libcurl.c:362
#define CURL_GLOBAL_SSL
Definition libcurl.c:48
static void(* qcurl_global_init)(long flags)
Definition libcurl.c:152
static CURLM *(* qcurl_multi_init)(void)
Definition libcurl.c:161
qbool Thread_HasThreads(void)
Definition thread_null.c:13
#define Thread_CreateMutex()
Definition thread.h:15

References curl_dll, CURL_GLOBAL_SSL, curl_mutex, CURL_OpenLibrary(), curlm, qcurl_global_init, qcurl_multi_init, Thread_CreateMutex, and Thread_HasThreads().

Referenced by Host_Init().

◆ Curl_Init_Commands()

void Curl_Init_Commands ( void )

Definition at line 1578 of file libcurl.c.

1579{
1585 Cvar_RegisterVirtual (&curl_enabled, "cl_curl_enabled");
1586 Cvar_RegisterVirtual (&curl_maxdownloads, "cl_curl_maxdownloads");
1587 Cvar_RegisterVirtual (&curl_maxspeed, "cl_curl_maxspeed");
1588 Cvar_RegisterVirtual (&curl_useragent, "cl_curl_useragent");
1589 Cvar_RegisterVirtual (&curl_useragent_append, "cl_curl_useragent_append");
1590
1594
1596
1597 Cmd_AddCommand(CF_CLIENT | CF_CLIENT_FROM_SERVER, "curl", Curl_Curl_f, "download data from an URL and add to search path");
1598 //Cmd_AddCommand(cmd_local, "curlcat", Curl_CurlCat_f, "display data from an URL (debugging command)");
1599}
void Cmd_AddCommand(unsigned flags, const char *cmd_name, xcommand_t function, const char *description)
called by the init functions of other parts of the program to register commands and functions to call...
Definition cmd.c:1661
#define CF_CLIENT
cvar/command that only the client can change/execute
Definition cmd.h:48
#define CF_CLIENT_FROM_SERVER
command that the server is allowed to execute on the client
Definition cmd.h:50
void Cvar_RegisterVariable(cvar_t *variable)
registers a cvar that already has the name, string, and optionally the archive elements set.
Definition cvar.c:599
void Cvar_RegisterVirtual(cvar_t *variable, const char *name)
Definition cvar.c:513
static void Curl_Curl_f(cmd_state_t *cmd)
Definition libcurl.c:1424
static cvar_t sv_curl_serverpackages
Definition libcurl.c:17
static cvar_t sv_curl_maxspeed
Definition libcurl.c:18

References CF_CLIENT, CF_CLIENT_FROM_SERVER, Cmd_AddCommand(), Curl_Curl_f(), curl_enabled, curl_maxdownloads, curl_maxspeed, curl_useragent, curl_useragent_append, Cvar_RegisterVariable(), Cvar_RegisterVirtual(), developer_curl, sv_curl_defaulturl, sv_curl_maxspeed, and sv_curl_serverpackages.

Referenced by Host_Init().

◆ CURL_OpenLibrary()

static qbool CURL_OpenLibrary ( void )
static

Definition at line 362 of file libcurl.c.

363{
364 const char* dllnames [] =
365 {
366#if defined(WIN32)
367 "libcurl-4.dll",
368 "libcurl-3.dll",
369#elif defined(MACOSX)
370 "libcurl.4.dylib", // Mac OS X Notyetreleased
371 "libcurl.3.dylib", // Mac OS X Tiger
372 "libcurl.2.dylib", // Mac OS X Panther
373#else
374 "libcurl.so.4",
375 "libcurl.so.3",
376 "libcurl.so", // FreeBSD
377#endif
378 NULL
379 };
380
381 // Already loaded?
382 if (curl_dll)
383 return true;
384
385 // Load the DLL
386 return Sys_LoadDependency (dllnames, &curl_dll, curlfuncs);
387}
static dllfunction_t curlfuncs[]
Definition libcurl.c:172
qbool Sys_LoadDependency(const char **dllnames, dllhandle_t *handle, const dllfunction_t *fcts)
Definition sys_shared.c:131

References curl_dll, curlfuncs, NULL, and Sys_LoadDependency().

Referenced by Curl_Init().

◆ curl_quiet_callback()

static void curl_quiet_callback ( int status,
size_t length_received,
unsigned char * buffer,
void * cbdata )
static

Definition at line 482 of file libcurl.c.

483{
484 curl_default_callback(status, length_received, buffer, cbdata);
485}
GLuint buffer
Definition glquake.h:630

References buffer, and curl_default_callback().

Referenced by Curl_Cancel_ToMemory().

◆ Curl_Register_predownload()

void Curl_Register_predownload ( void )

Definition at line 315 of file libcurl.c.

316{
318 Curl_CommandWhenDone("cl_begindownloads");
319 Curl_CommandWhenError("cl_begindownloads");
321}

References Curl_CommandWhenDone(), Curl_CommandWhenError(), curl_mutex, Thread_LockMutex, and Thread_UnlockMutex.

Referenced by CL_BeginDownloads(), and Curl_Curl_f().

◆ Curl_RequireFile()

void Curl_RequireFile ( const char * filename)

Definition at line 1779 of file libcurl.c.

1780{
1781 requirement *req = (requirement *) Z_Malloc(sizeof(*requirements));
1782 req->next = requirements;
1783 dp_strlcpy(req->filename, filename, sizeof(req->filename));
1784 requirements = req;
1785}
char filename[MAX_OSPATH]
Definition libcurl.c:1766

References dp_strlcpy, requirement::filename, requirement::next, requirements, and Z_Malloc.

Referenced by SV_SpawnServer().

◆ Curl_Running()

qbool Curl_Running ( void )

Definition at line 1307 of file libcurl.c.

1308{
1309 if(!curl_dll)
1310 return false;
1311
1312 return !List_Is_Empty(&downloads);
1313}

References curl_dll, and List_Is_Empty().

Referenced by Curl_Info_f().

◆ Curl_Select()

bool Curl_Select ( int timeout_ms)

Definition at line 1263 of file libcurl.c.

1264{
1265 CURLMcode err;
1266
1267 if (List_Is_Empty(&downloads))
1268 return false;
1269
1270 err = qcurl_multi_wait(curlm, NULL, 0, timeout_ms, NULL);
1271 if (err == CURLM_OK)
1272 return true;
1273 Con_Printf(CON_ERROR "curl_multi_wait() failed with code %d\n", err);
1274 return false;
1275}
#define CON_ERROR
Definition console.h:102
static CURLMcode(* qcurl_multi_wait)(CURLM *multi_handle, void *, unsigned int extra_nfds, int timeout_ms, int *ret)
Definition libcurl.c:163

References CON_ERROR, Con_Printf(), curlm, CURLM_OK, List_Is_Empty(), NULL, and qcurl_multi_wait.

Referenced by Sys_Sleep().

◆ Curl_SendRequirement()

static qbool Curl_SendRequirement ( const char * filename,
qbool foundone,
char * sendbuffer,
size_t sendbuffer_len )
static

Definition at line 1817 of file libcurl.c.

1818{
1819 const char *p;
1820 const char *thispack = FS_WhichPack(filename);
1821 const char *packurl;
1822
1823 if(!thispack || !*thispack)
1824 return false;
1825
1826 p = strrchr(thispack, '/');
1827 if(p)
1828 thispack = p + 1;
1829
1830 packurl = Curl_FindPackURL(thispack);
1831
1832 if(packurl && *packurl && strcmp(packurl, "-"))
1833 {
1834 if(!foundone)
1835 dp_strlcat(sendbuffer, "curl --clear_autodownload\n", sendbuffer_len);
1836
1837 dp_strlcat(sendbuffer, "curl --pak --forthismap --as ", sendbuffer_len);
1838 dp_strlcat(sendbuffer, thispack, sendbuffer_len);
1839 if(sv_curl_maxspeed.value > 0)
1840 dpsnprintf(sendbuffer + strlen(sendbuffer), sendbuffer_len - strlen(sendbuffer), " --maxspeed=%.1f", sv_curl_maxspeed.value);
1841 dp_strlcat(sendbuffer, " --for ", sendbuffer_len);
1842 dp_strlcat(sendbuffer, filename, sendbuffer_len);
1843 dp_strlcat(sendbuffer, " ", sendbuffer_len);
1844 dp_strlcat(sendbuffer, packurl, sendbuffer_len);
1845 dp_strlcat(sendbuffer, thispack, sendbuffer_len);
1846 dp_strlcat(sendbuffer, "\n", sendbuffer_len);
1847
1848 return true;
1849 }
1850
1851 return false;
1852}
#define dp_strlcat(dst, src, dsize)
Definition common.h:304
const char * FS_WhichPack(const char *filename)
Definition fs.c:4091
static const char * Curl_FindPackURL(const char *filename)
Definition libcurl.c:1701

References Curl_FindPackURL(), dp_strlcat, dpsnprintf(), FS_WhichPack(), strlen(), sv_curl_maxspeed, and cvar_t::value.

Referenced by Curl_SendRequirements().

◆ Curl_SendRequirements()

void Curl_SendRequirements ( void )

Definition at line 1853 of file libcurl.c.

1854{
1855 // for each requirement, find the pack name
1856 char sendbuffer[4096] = "";
1857 requirement *req;
1858 qbool foundone = false;
1859 const char *p;
1860
1861 for(req = requirements; req; req = req->next)
1862 foundone = Curl_SendRequirement(req->filename, foundone, sendbuffer, sizeof(sendbuffer)) || foundone;
1863
1865 while(COM_ParseToken_Simple(&p, false, false, true))
1866 foundone = Curl_SendRequirement(com_token, foundone, sendbuffer, sizeof(sendbuffer)) || foundone;
1867
1868 if(foundone)
1869 dp_strlcat(sendbuffer, "curl --finish_autodownload\n", sizeof(sendbuffer));
1870
1871 if(strlen(sendbuffer) + 1 < sizeof(sendbuffer))
1872 SV_ClientCommands("%s", sendbuffer);
1873 else
1874 Con_Printf("Could not initiate autodownload due to URL buffer overflow\n");
1875}
char com_token[MAX_INPUTLINE]
Definition common.c:39
qbool COM_ParseToken_Simple(const char **datapointer, qbool returnnewline, qbool parsebackslash, qbool parsecomments)
Definition common.c:463
static qbool Curl_SendRequirement(const char *filename, qbool foundone, char *sendbuffer, size_t sendbuffer_len)
Definition libcurl.c:1817
void SV_ClientCommands(const char *fmt,...) DP_FUNC_PRINTF(1)
Definition sv_send.c:135

References COM_ParseToken_Simple(), com_token, Con_Printf(), Curl_SendRequirement(), dp_strlcat, requirement::filename, requirement::next, requirements, cvar_t::string, strlen(), SV_ClientCommands(), and sv_curl_serverpackages.

Referenced by SV_SendServerinfo().

◆ Curl_Shutdown()

void Curl_Shutdown ( void )

Definition at line 828 of file libcurl.c.

829{
830 if(!curl_dll)
831 return;
836 curl_dll = NULL;
837}
static void CURL_CloseLibrary(void)
Definition libcurl.c:397
void Curl_ClearRequirements(void)
Definition libcurl.c:1795
#define Thread_DestroyMutex(m)
Definition thread.h:16

References Curl_CancelAll(), Curl_ClearRequirements(), CURL_CloseLibrary(), curl_dll, curl_mutex, NULL, and Thread_DestroyMutex.

Referenced by Host_Shutdown().

◆ decode_image()

static unsigned char * decode_image ( downloadinfo * di,
const char * content_type )
static

Definition at line 487 of file libcurl.c.

488{
489 unsigned char *pixels = NULL;
490 fs_offset_t filesize = 0;
491 unsigned char *data = FS_LoadFile(di->filename, tempmempool, true, &filesize);
492 if(data)
493 {
494 int mip = 0;
495 if(!strcmp(content_type, "image/jpeg"))
496 pixels = JPEG_LoadImage_BGRA(data, filesize, &mip);
497 else if(!strcmp(content_type, "image/png"))
498 pixels = PNG_LoadImage_BGRA(data, filesize, &mip);
499 else if(filesize >= 7 && !strncmp((char *) data, "\xFF\xD8", 7))
500 pixels = JPEG_LoadImage_BGRA(data, filesize, &mip);
501 else if(filesize >= 7 && !strncmp((char *) data, "\x89PNG\x0D\x0A\x1A\x0A", 7))
502 pixels = PNG_LoadImage_BGRA(data, filesize, &mip);
503 else
504 Con_Printf("Did not detect content type: %s\n", content_type);
505 Mem_Free(data);
506 }
507 // do we call Image_MakeLinearColorsFromsRGB or not?
508 return pixels;
509}
unsigned char * PNG_LoadImage_BGRA(const unsigned char *raw, int filesize, int *miplevel)
Definition image_png.c:294
unsigned char * JPEG_LoadImage_BGRA(const unsigned char *f, int filesize, int *miplevel)
Definition jpeg.c:606
#define Mem_Free(mem)
Definition zone.h:96

References Con_Printf(), data, downloadinfo::filename, FS_LoadFile(), JPEG_LoadImage_BGRA(), Mem_Free, NULL, pixels, PNG_LoadImage_BGRA(), and tempmempool.

Referenced by Curl_EndDownload().

◆ LIST_HEAD()

LIST_HEAD ( downloads )

Variable Documentation

◆ bytes_received

double bytes_received = 0
static

Definition at line 404 of file libcurl.c.

Referenced by Curl_Frame().

◆ bytes_sent

double bytes_sent = 0
static

Definition at line 405 of file libcurl.c.

Referenced by Curl_Frame().

◆ command_when_done

char command_when_done[256] = ""
static

◆ command_when_error

char command_when_error[256] = ""
static

Definition at line 243 of file libcurl.c.

Referenced by Curl_CheckCommandWhenDone(), and Curl_CommandWhenError().

◆ curl_dll

◆ curl_enabled

cvar_t curl_enabled = {CF_SHARED | CF_ARCHIVE, "curl_enabled","1", "whether libcurl may be used to GET files or POST data"}
static

Definition at line 10 of file libcurl.c.

10{CF_SHARED | CF_ARCHIVE, "curl_enabled","1", "whether libcurl may be used to GET files or POST data"};
#define CF_SHARED
Definition cmd.h:67
#define CF_ARCHIVE
cvar should have its set value saved to config.cfg and persist across sessions
Definition cmd.h:53

Referenced by Curl_Begin(), Curl_Curl_f(), Curl_Frame(), and Curl_Init_Commands().

◆ curl_maxdownloads

cvar_t curl_maxdownloads = {CF_SHARED | CF_ARCHIVE, "curl_maxdownloads","3", "maximum number of concurrent HTTP/FTP downloads"}
static

Definition at line 11 of file libcurl.c.

11{CF_SHARED | CF_ARCHIVE, "curl_maxdownloads","3", "maximum number of concurrent HTTP/FTP downloads"};

Referenced by CheckPendingDownloads(), and Curl_Init_Commands().

◆ curl_maxspeed

cvar_t curl_maxspeed = {CF_SHARED | CF_ARCHIVE, "curl_maxspeed","0", "maximum download speed (KiB/s)"}
static

Definition at line 12 of file libcurl.c.

12{CF_SHARED | CF_ARCHIVE, "curl_maxspeed","0", "maximum download speed (KiB/s)"};

Referenced by Curl_Frame(), and Curl_Init_Commands().

◆ curl_mutex

◆ curl_useragent

cvar_t curl_useragent = {CF_SHARED, "curl_useragent","1", "send the User-Agent string (note: turning this off may break stuff)"}
static

Definition at line 13 of file libcurl.c.

13{CF_SHARED, "curl_useragent","1", "send the User-Agent string (note: turning this off may break stuff)"};

Referenced by CheckPendingDownloads(), and Curl_Init_Commands().

◆ curl_useragent_append

cvar_t curl_useragent_append = {CF_SHARED, "curl_useragent_append","", "a string to append to the User-Agent string (useful for name and version number of your mod)"}
static

Definition at line 14 of file libcurl.c.

14{CF_SHARED, "curl_useragent_append","", "a string to append to the User-Agent string (useful for name and version number of your mod)"};

Referenced by CheckPendingDownloads(), and Curl_Init_Commands().

◆ curlfuncs

dllfunction_t curlfuncs[]
static
Initial value:
=
{
{"curl_global_init", (void **) &qcurl_global_init},
{"curl_global_cleanup", (void **) &qcurl_global_cleanup},
{"curl_easy_init", (void **) &qcurl_easy_init},
{"curl_easy_cleanup", (void **) &qcurl_easy_cleanup},
{"curl_easy_setopt", (void **) &qcurl_easy_setopt},
{"curl_easy_strerror", (void **) &qcurl_easy_strerror},
{"curl_easy_getinfo", (void **) &qcurl_easy_getinfo},
{"curl_multi_init", (void **) &qcurl_multi_init},
{"curl_multi_perform", (void **) &qcurl_multi_perform},
{"curl_multi_wait", (void **) &qcurl_multi_wait},
{"curl_multi_add_handle", (void **) &qcurl_multi_add_handle},
{"curl_multi_remove_handle",(void **) &qcurl_multi_remove_handle},
{"curl_multi_info_read", (void **) &qcurl_multi_info_read},
{"curl_multi_cleanup", (void **) &qcurl_multi_cleanup},
{"curl_multi_strerror", (void **) &qcurl_multi_strerror},
{"curl_slist_append", (void **) &qcurl_slist_append},
{"curl_slist_free_all", (void **) &qcurl_slist_free_all},
}
static const char *(* qcurl_multi_strerror)(CURLcode)
Definition libcurl.c:168
static const char *(* qcurl_easy_strerror)(CURLcode)
Definition libcurl.c:159
static void(* qcurl_global_cleanup)(void)
Definition libcurl.c:153
static void(* qcurl_multi_cleanup)(CURLM *)
Definition libcurl.c:167

Definition at line 172 of file libcurl.c.

173{
174 {"curl_global_init", (void **) &qcurl_global_init},
175 {"curl_global_cleanup", (void **) &qcurl_global_cleanup},
176 {"curl_easy_init", (void **) &qcurl_easy_init},
177 {"curl_easy_cleanup", (void **) &qcurl_easy_cleanup},
178 {"curl_easy_setopt", (void **) &qcurl_easy_setopt},
179 {"curl_easy_strerror", (void **) &qcurl_easy_strerror},
180 {"curl_easy_getinfo", (void **) &qcurl_easy_getinfo},
181 {"curl_multi_init", (void **) &qcurl_multi_init},
182 {"curl_multi_perform", (void **) &qcurl_multi_perform},
183 {"curl_multi_wait", (void **) &qcurl_multi_wait},
184 {"curl_multi_add_handle", (void **) &qcurl_multi_add_handle},
185 {"curl_multi_remove_handle",(void **) &qcurl_multi_remove_handle},
186 {"curl_multi_info_read", (void **) &qcurl_multi_info_read},
187 {"curl_multi_cleanup", (void **) &qcurl_multi_cleanup},
188 {"curl_multi_strerror", (void **) &qcurl_multi_strerror},
189 {"curl_slist_append", (void **) &qcurl_slist_append},
190 {"curl_slist_free_all", (void **) &qcurl_slist_free_all},
191 {NULL, NULL}
192};

Referenced by CURL_OpenLibrary().

◆ curlm

CURLM* curlm = NULL
static

◆ curltime

double curltime = 0
static

Definition at line 406 of file libcurl.c.

Referenced by Curl_Frame().

◆ developer_curl

cvar_t developer_curl = {CF_SHARED, "developer_curl","0", "whether verbose libcurl output should be printed to stderr"}
static

Definition at line 20 of file libcurl.c.

20{CF_SHARED, "developer_curl","0", "whether verbose libcurl output should be printed to stderr"};

Referenced by CheckPendingDownloads(), and Curl_Init_Commands().

◆ noclear

qbool noclear = false
static

Definition at line 237 of file libcurl.c.

Referenced by Curl_Clear_forthismap(), Curl_Curl_f(), and Curl_Frame().

◆ numdownloads

int numdownloads = 0
static

Definition at line 235 of file libcurl.c.

Referenced by CheckPendingDownloads(), and Curl_EndDownload().

◆ numdownloads_added

int numdownloads_added = 0
static

◆ numdownloads_fail

int numdownloads_fail = 0
static

◆ numdownloads_success

int numdownloads_success = 0
static

◆ qcurl_easy_cleanup

void(* qcurl_easy_cleanup) (CURL *handle) ( CURL * handle)
static

Definition at line 156 of file libcurl.c.

Referenced by Curl_EndDownload().

◆ qcurl_easy_getinfo

CURLcode(* qcurl_easy_getinfo) (CURL *handle, CURLINFO info,...) ( CURL * handle,
CURLINFO info,
... )
static

Definition at line 158 of file libcurl.c.

Referenced by Curl_Frame(), Curl_GetDownloadAmount(), and Curl_GetDownloadSpeed().

◆ qcurl_easy_init

CURL *(* qcurl_easy_init) (void) ( void )
static

Definition at line 155 of file libcurl.c.

Referenced by CheckPendingDownloads().

◆ qcurl_easy_setopt

CURLcode(* qcurl_easy_setopt) (CURL *handle, CURLoption option,...) ( CURL * handle,
CURLoption option,
... )
static

Definition at line 157 of file libcurl.c.

Referenced by CheckPendingDownloads().

◆ qcurl_easy_strerror

const char *(* qcurl_easy_strerror) (CURLcode) ( CURLcode )
static

Definition at line 159 of file libcurl.c.

◆ qcurl_global_cleanup

void(* qcurl_global_cleanup) (void) ( void )
static

Definition at line 153 of file libcurl.c.

◆ qcurl_global_init

void(* qcurl_global_init) (long flags) ( long flags)
static

Definition at line 152 of file libcurl.c.

Referenced by Curl_Init().

◆ qcurl_multi_add_handle

CURLMcode(* qcurl_multi_add_handle) (CURLM *multi_handle, CURL *easy_handle) ( CURLM * multi_handle,
CURL * easy_handle )
static

Definition at line 164 of file libcurl.c.

Referenced by CheckPendingDownloads().

◆ qcurl_multi_cleanup

void(* qcurl_multi_cleanup) (CURLM *) ( CURLM * )
static

Definition at line 167 of file libcurl.c.

◆ qcurl_multi_info_read

CURLMsg *(* qcurl_multi_info_read) (CURLM *multi_handle, int *msgs_in_queue) ( CURLM * multi_handle,
int * msgs_in_queue )
static

Definition at line 166 of file libcurl.c.

Referenced by Curl_Frame().

◆ qcurl_multi_init

CURLM *(* qcurl_multi_init) (void) ( void )
static

Definition at line 161 of file libcurl.c.

Referenced by Curl_Init().

◆ qcurl_multi_perform

CURLMcode(* qcurl_multi_perform) (CURLM *multi_handle, int *running_handles) ( CURLM * multi_handle,
int * running_handles )
static

Definition at line 162 of file libcurl.c.

Referenced by Curl_Frame().

◆ qcurl_multi_remove_handle

CURLMcode(* qcurl_multi_remove_handle) (CURLM *multi_handle, CURL *easy_handle) ( CURLM * multi_handle,
CURL * easy_handle )
static

Definition at line 165 of file libcurl.c.

Referenced by Curl_EndDownload().

◆ qcurl_multi_strerror

const char *(* qcurl_multi_strerror) (CURLcode) ( CURLcode )
static

Definition at line 168 of file libcurl.c.

◆ qcurl_multi_wait

CURLMcode(* qcurl_multi_wait) (CURLM *multi_handle, void *, unsigned int extra_nfds, int timeout_ms, int *ret) ( CURLM * multi_handle,
void * ,
unsigned int extra_nfds,
int timeout_ms,
int * ret )
static

Definition at line 163 of file libcurl.c.

Referenced by Curl_Select().

◆ qcurl_slist_append

curl_slist *(* qcurl_slist_append) (curl_slist *list, const char *string) ( curl_slist * list,
const char * string )
static

Definition at line 169 of file libcurl.c.

Referenced by CheckPendingDownloads().

◆ qcurl_slist_free_all

void(* qcurl_slist_free_all) (curl_slist *list) ( curl_slist * list)
static

Definition at line 170 of file libcurl.c.

Referenced by Curl_EndDownload().

◆ requirements

requirement* requirements = NULL
static

Definition at line 1769 of file libcurl.c.

Referenced by Curl_ClearRequirements(), Curl_RequireFile(), and Curl_SendRequirements().

◆ sv_curl_defaulturl

cvar_t sv_curl_defaulturl = {CF_SERVER, "sv_curl_defaulturl","", "default autodownload source URL"}
static

Definition at line 16 of file libcurl.c.

16{CF_SERVER, "sv_curl_defaulturl","", "default autodownload source URL"};
#define CF_SERVER
cvar/command that only the server can change/execute
Definition cmd.h:49

Referenced by Curl_FindPackURL(), and Curl_Init_Commands().

◆ sv_curl_maxspeed

cvar_t sv_curl_maxspeed = {CF_SERVER, "sv_curl_maxspeed","0", "maximum download speed for clients downloading from sv_curl_defaulturl (KiB/s)"}
static

Definition at line 18 of file libcurl.c.

18{CF_SERVER, "sv_curl_maxspeed","0", "maximum download speed for clients downloading from sv_curl_defaulturl (KiB/s)"};

Referenced by Curl_Init_Commands(), and Curl_SendRequirement().

◆ sv_curl_serverpackages

cvar_t sv_curl_serverpackages = {CF_SERVER, "sv_curl_serverpackages","", "list of required files for the clients, separated by spaces"}
static

Definition at line 17 of file libcurl.c.

17{CF_SERVER, "sv_curl_serverpackages","", "list of required files for the clients, separated by spaces"};

Referenced by Curl_Init_Commands(), and Curl_SendRequirements().