29 #ifdef CURLX_NO_MEMORY_CALLBACKS 30 #error "libcurl shall not ever be built with CURLX_NO_MEMORY_CALLBACKS defined" 33 #ifdef HAVE_NETINET_IN_H 34 #include <netinet/in.h> 39 #ifdef HAVE_ARPA_INET_H 40 #include <arpa/inet.h> 45 #ifdef HAVE_SYS_IOCTL_H 46 #include <sys/ioctl.h> 49 #ifdef HAVE_SYS_PARAM_H 50 #include <sys/param.h> 89 #ifdef USE_WINDOWS_SSPI 90 Curl_sspi_global_cleanup();
99 WORD wVersionRequested;
103 #if defined(ENABLE_IPV6) && (USE_WINSOCK < 2) 104 Error IPV6_requires_winsock2
107 wVersionRequested = MAKEWORD(USE_WINSOCK, USE_WINSOCK);
109 res = WSAStartup(wVersionRequested, &wsaData);
122 if(LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested) ||
123 HIBYTE(wsaData.wVersion) != HIBYTE(wVersionRequested) ) {
131 #elif defined(USE_LWIPSOCK) 135 #ifdef USE_WINDOWS_SSPI 155 #if defined(_WIN32_WCE) 156 #define system_strdup _strdup 157 #elif !defined(HAVE_STRDUP) 158 #define system_strdup curlx_strdup 160 #define system_strdup strdup 163 #if defined(_MSC_VER) && defined(_DLL) && !defined(__POCC__) 164 # pragma warning(disable:4232) 167 #ifndef __SYMBIAN32__ 177 #if defined(WIN32) && defined(UNICODE) 178 curl_wcsdup_callback Curl_cwcsdup = (curl_wcsdup_callback)_wcsdup;
192 #if defined(_MSC_VER) && defined(_DLL) && !defined(__POCC__) 193 # pragma warning(default:4232) 212 #if defined(WIN32) && defined(UNICODE) 213 Curl_cwcsdup = (curl_wcsdup_callback)_wcsdup;
238 DEBUGF(
fprintf(stderr,
"Warning: LONG namespace not available\n"));
243 DEBUGF(
fprintf(stderr,
"Error: resolver_global_init failed\n"));
249 #if defined(USE_LIBSSH2) && defined(HAVE_LIBSSH2_INIT) 250 if(libssh2_init(0)) {
285 if(!m || !f || !r || !s || !c)
332 #if defined(USE_LIBSSH2) && defined(HAVE_LIBSSH2_EXIT) 333 (void)libssh2_exit();
373 #undef curl_easy_setopt 392 struct socketmonitor {
393 struct socketmonitor *next;
401 struct socketmonitor *list;
411 static int events_timer(
struct Curl_multi *multi,
415 struct events *ev = userp;
420 else if(timeout_ms == 0)
434 static int poll2cselect(
int pollmask)
451 static short socketcb2poll(
int pollmask)
474 struct events *ev = userp;
475 struct socketmonitor *m;
476 struct socketmonitor *prev = NULL;
478 #if defined(CURL_DISABLE_VERBOSE_STRINGS) 485 if(m->socket.fd ==
s) {
488 struct socketmonitor *nxt = m->next;
496 infof(easy,
"socket cb: socket %d REMOVED\n",
s);
501 m->socket.events = socketcb2poll(what);
502 infof(easy,
"socket cb: socket %d UPDATED as %s%s\n",
s,
519 m =
malloc(
sizeof(
struct socketmonitor));
523 m->socket.events = socketcb2poll(what);
524 m->socket.revents = 0;
526 infof(easy,
"socket cb: socket %d ADDED as %s%s\n",
s,
544 static void events_setup(
struct Curl_multi *multi,
struct events *ev)
569 struct socketmonitor *m;
579 for(m = ev->list, f = &fds[0]; m; m = m->next) {
580 f->
fd = m->socket.fd;
581 f->
events = m->socket.events;
592 pollrc =
Curl_poll(fds, numfds, (
int)ev->ms);
603 &ev->running_handles);
605 else if(pollrc > 0) {
607 for(i = 0; i< numfds; i++) {
610 int act = poll2cselect(fds[i].revents);
611 infof(multi->
easyp,
"call curl_multi_socket_action(socket %d)\n",
614 &ev->running_handles);
624 if(timediff > ev->ms)
627 ev->ms -= (long)timediff;
658 static struct events evs = {2,
FALSE, 0, NULL, 0};
661 events_setup(multi, &evs);
663 return wait_or_timeout(multi, &evs);
667 #define easy_events(x) CURLE_NOT_BUILT_IN 679 while(!done && !mcode) {
680 int still_running = 0;
695 if(without_fds > 2) {
696 int sleep_ms = without_fds < 10 ? (1 << (without_fds - 1)) : 1000;
712 if(!mcode && !still_running) {
761 failf(data,
"easy handle already used in multi handle");
848 #undef curl_easy_getinfo 856 paramp = va_arg(arg,
void *);
1036 for(i = 0; i < count; i++) {
1053 ((newstate&(KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) !=
1054 (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) )
1070 failf(data,
"CONNECT_ONLY is required!");
1077 failf(data,
"Failed to get recent socket");
1102 result =
Curl_read(c, sfd, buffer, buflen, &n1);
1117 size_t buflen,
size_t *n)
1129 result =
Curl_write(c, sfd, buffer, buflen, &n1);
struct Curl_multi * Curl_multi_handle(int hashsize, int chashsize)
struct CookieInfo * Curl_cookie_init(struct Curl_easy *data, const char *file, struct CookieInfo *inc, bool newsession)
struct connectdata * lastconnect
void *(* curl_calloc_callback)(size_t nmemb, size_t size)
CURLcode Curl_open(struct Curl_easy **curl)
Curl_open()
CURLcode Curl_client_chop_write(struct connectdata *conn, int type, char *ptr, size_t len)
void curl_easy_reset(struct Curl_easy *data)
CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, CURL *curl_handle)
static CURLcode easy_connection(struct Curl_easy *data, curl_socket_t *sfd, struct connectdata **connp)
struct Curl_multi * multi_easy
#define sigpipe_ignore(x, y)
struct curltime curlx_tvnow(void)
void *(* curl_realloc_callback)(void *ptr, size_t size)
CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles)
struct Curl_multi * multi
static CURLcode global_init(long flags, bool memoryfuncs)
curl_global_init() globally initializes curl given a bitwise set of the different features of what to...
CURLcode Curl_initinfo(struct Curl_easy *data)
CURLcode curl_easy_getinfo(struct Curl_easy *data, CURLINFO info,...)
struct Curl_easy * curl_easy_duphandle(struct Curl_easy *data)
void Curl_version_init(void)
static unsigned int initialized
#define CURLEASY_MAGIC_NUMBER
static void win32_cleanup(void)
#define realloc(ptr, size)
CURLcode curl_global_init(long flags)
curl_global_init() globally initializes curl given a bitwise set of the different features of what to...
void curl_easy_cleanup(struct Curl_easy *data)
#define Curl_amiga_init()
UNITTEST_START int result
static CURLcode easy_transfer(struct Curl_multi *multi)
struct DynamicStatic change
static size_t num_sockets
CURLcode curl_global_init_mem(long flags, curl_malloc_callback m, curl_free_callback f, curl_realloc_callback r, curl_strdup_callback s, curl_calloc_callback c)
void Curl_global_host_cache_dtor(void)
struct connectdata * easy_conn
curl_socket_t Curl_getconnectinfo(struct Curl_easy *data, struct connectdata **connp)
#define sigpipe_restore(x)
curl_strdup_callback Curl_cstrdup
int Curl_wait_ms(int timeout_ms)
curl_easy_setopt expects a curl_off_t argument for this option curl_easy_setopt expects a curl_write_callback argument for this option curl_easy_setopt expects a curl_ioctl_callback argument for this option curl_easy_setopt expects a curl_opensocket_callback argument for this option curl_easy_setopt expects a curl_debug_callback argument for this option curl_easy_setopt expects a curl_conv_callback argument for this option curl_easy_setopt expects a private data pointer as argument for this option curl_easy_setopt expects a FILE *argument for this option curl_easy_setopt expects a struct curl_httppost *argument for this option curl_easy_setopt expects a struct curl_slist *argument for this option curl_easy_getinfo expects a pointer to char *for this info curl_easy_getinfo expects a pointer to double for this info curl_easy_getinfo expects a pointer to struct curl_tlssessioninfo *for this info curl_easy_getinfo expects a pointer to curl_socket_t for this info size_t
#define curl_multi_setopt(handle, opt, param)
#define CURL_GLOBAL_DEFAULT
curl_free_callback Curl_cfree
void *(* curl_malloc_callback)(size_t size)
void curl_global_cleanup(void)
curl_global_cleanup() globally cleanups curl, uses the value of "init_flags" to determine what needs ...
UNITTEST_START struct Curl_easy data
curl_malloc_callback Curl_cmalloc
static CURLcode easy_perform(struct Curl_easy *data, bool events)
struct tempbuf tempwrite[3]
#define SIGPIPE_VARIABLE(x)
CURLcode curl_easy_send(struct Curl_easy *data, const void *buffer, size_t buflen, size_t *n)
#define Curl_amiga_cleanup()
struct CookieInfo * cookies
CURLcode Curl_write(struct connectdata *conn, curl_socket_t sockfd, const void *mem, size_t len, ssize_t *written)
#define Curl_resolver_global_init()
struct curl_slist * cookielist
CURLcode Curl_init_userdefined(struct UserDefined *set)
#define CURL_GLOBAL_WIN32
#define Curl_safefree(ptr)
#define Curl_ssl_cleanup()
CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *curl_handle)
CURLcode curl_easy_perform(struct Curl_easy *data)
time_t curlx_tvdiff(struct curltime newer, struct curltime older)
#define CURL_SOCKET_TIMEOUT
static CURLcode win32_init(void)
void Curl_free_request_state(struct Curl_easy *data)
void Curl_freeset(struct Curl_easy *data)
CURLcode curl_easy_pause(struct Curl_easy *data, int action)
CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle, struct curl_waitfd extra_fds[], unsigned int extra_nfds, int timeout_ms, int *ret)
CURLcode Curl_dupset(struct Curl_easy *dst, struct Curl_easy *src)
CURL_EXTERN CURLMsg * curl_multi_info_read(CURLM *multi_handle, int *msgs_in_queue)
CURLcode curl_easy_recv(struct Curl_easy *data, void *buffer, size_t buflen, size_t *n)
struct Curl_easy * curl_easy_init(void)
int Curl_resolver_duphandle(void **to, void *from)
CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option, va_list param)
struct curl_slist * Curl_slist_duplicate(struct curl_slist *inlist)
curl_calloc_callback Curl_ccalloc
#define CURL_GLOBAL_ACK_EINTR
#define Curl_resolver_global_cleanup()
int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
static CURL * easy[MAX_EASY_HANDLES]
void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
CURLcode Curl_close(struct Curl_easy *data)
char *(* curl_strdup_callback)(const char *str)
void(* curl_free_callback)(void *ptr)
CURL_EXTERN void curl_slist_free_all(struct curl_slist *)
struct conncache * conn_cache
curl_realloc_callback Curl_crealloc
CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle, curl_socket_t s, int ev_bitmask, int *running_handles)
CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle)
CURLcode curl_easy_setopt(struct Curl_easy *data, CURLoption tag,...)
#define calloc(nbelem, size)
CURLcode Curl_getinfo(struct Curl_easy *data, CURLINFO info,...)
CURLcode Curl_read(struct connectdata *conn, curl_socket_t sockfd, char *buf, size_t sizerequested, ssize_t *n)
#define Curl_convert_setup(x)