58 #ifndef CURL_SOCKET_HASH_TABLE_SIZE 59 #define CURL_SOCKET_HASH_TABLE_SIZE 911 62 #define CURL_CONNECTION_HASH_SIZE 97 64 #define CURL_MULTI_HANDLE 0x000bab1e 66 #define GOOD_MULTI_HANDLE(x) \ 67 ((x) && (x)->type == CURL_MULTI_HANDLE) 80 static const char *
const statename[]={
128 #if defined(DEBUGBUILD) && defined(CURL_DISABLE_VERBOSE_STRINGS) 132 if(oldstate ==
state)
138 #if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS) 141 long connection_id = -5000;
147 "STATE: %s => %s handle %p; line %d (connection #%ld)\n",
148 statename[oldstate], statename[data->
mstate],
149 (
void *)data, lineno, connection_id);
163 #define multistate(x,y) mstate(x,y) 165 #define multistate(x,y) mstate(x,y, __LINE__) 243 (void) k1_len; (void) k2_len;
248 static size_t hash_fd(
void *
key,
size_t key_length,
size_t slots_num)
253 return (fd % slots_num);
478 static void debug_print_sock_hash(
void *
p)
482 fprintf(stderr,
" [easy %p/magic %x/socket %d]",
483 (
void *)sh->data, sh->data->magic, (
int)sh->
socket);
501 if(maxconnects > 0 &&
503 infof(data,
"Connection cache is full, closing the oldest one.\n");
509 conn_candidate->data =
data;
516 return (conn_candidate == conn) ?
FALSE :
TRUE;
563 result = conn->
handler->
done(conn, status, premature);
581 DEBUGF(
infof(data,
"Connection still in use, no more multi_done now!\n"));
616 #
if defined(USE_NTLM)
634 infof(data,
"Connection #%ld to host %s left intact\n",
700 easy_owns_conn =
TRUE;
816 for(i = 0; i<2; i++) {
920 fd_set *read_fd_set, fd_set *write_fd_set,
921 fd_set *exc_fd_set,
int *max_fd)
927 int this_max_fd = -1;
944 FD_SET(sockbunch[i], read_fd_set);
948 FD_SET(sockbunch[i], write_fd_set);
954 if((
int)s > this_max_fd)
955 this_max_fd = (int)s;
961 *max_fd = this_max_fd;
966 #define NUM_POLLS_ON_STACK 10 970 unsigned int extra_nfds,
978 unsigned int nfds = 0;
979 unsigned int curlfds;
980 struct pollfd *ufds = NULL;
981 bool ufds_malloc =
FALSE;
982 long timeout_internal;
984 struct pollfd a_few_on_stack[NUM_POLLS_ON_STACK];
993 if((timeout_internal >= 0) && (timeout_internal < (long)timeout_ms))
994 timeout_ms = (
int)timeout_internal;
1024 if(nfds > NUM_POLLS_ON_STACK) {
1035 ufds = &a_few_on_stack[0];
1044 data = multi->
easyp;
1052 ufds[nfds].
fd = sockbunch[
i];
1058 ufds[nfds].
fd = sockbunch[
i];
1073 for(i = 0; i < extra_nfds; i++) {
1074 ufds[nfds].
fd = extra_fds[
i].
fd;
1088 pollrc =
Curl_poll(ufds, nfds, timeout_ms);
1089 DEBUGF(
infof(data,
"Curl_poll(%d ds, %d ms) == %d\n",
1090 nfds, timeout_ms, pollrc));
1097 for(i = 0; i < extra_nfds; i++) {
1098 unsigned short mask = 0;
1099 unsigned r = ufds[curlfds +
i].
revents;
1182 infof(data,
"Re-used connection seems dead, get a new one\n");
1184 connclose(conn,
"Reconnect dead connection");
1198 bool protocol_done =
TRUE;
1201 result =
Curl_connect(data, connp, &async, &protocol_done);
1269 if(!result && *done)
1296 if(!result && (*complete == 1))
1310 bool protocol_connect =
FALSE;
1311 bool dophase_done =
FALSE;
1317 time_t recv_timeout_ms;
1318 time_t send_timeout_ms;
1327 bool stream_error =
FALSE;
1333 infof(data,
"Pipe broke: handle %p, url = %s\n",
1354 failf(data,
"In state %d with no easy_conn, bail out!\n", data->
mstate);
1359 DEBUGF(
infof(data,
"multi changed, check CONNECT_PEND queue!\n"));
1378 if(timeout_ms < 0) {
1381 failf(data,
"Resolving timed out after %ld milliseconds",
1384 failf(data,
"Connection timed out after %ld milliseconds",
1389 failf(data,
"Operation timed out after %ld milliseconds with %" 1396 failf(data,
"Operation timed out after %ld milliseconds with %" 1406 stream_error =
TRUE;
1411 goto statemachine_end;
1437 &async, &protocol_connect);
1454 stream_error =
TRUE;
1465 if(protocol_connect)
1469 #ifndef CURL_DISABLE_HTTP 1499 #ifdef CURLRES_ASYNCH 1500 conn->async.dns = dns;
1501 conn->async.done =
TRUE;
1504 infof(data,
"Hostname '%s' was found in DNS cache\n", hostname);
1530 if(protocol_connect)
1534 #ifndef CURL_DISABLE_HTTP 1546 stream_error =
TRUE;
1552 #ifndef CURL_DISABLE_HTTP 1579 if(connected && !result) {
1580 #ifndef CURL_DISABLE_HTTP 1596 stream_error =
TRUE;
1603 if(!protocol_connect)
1616 stream_error =
TRUE;
1623 if(!result && protocol_connect) {
1633 stream_error =
TRUE;
1699 char *newurl = NULL;
1708 stream_error =
TRUE;
1739 stream_error =
TRUE;
1748 stream_error =
TRUE;
1770 stream_error =
TRUE;
1799 stream_error =
TRUE;
1836 send_timeout_ms = 0;
1844 recv_timeout_ms = 0;
1852 if(send_timeout_ms <= 0 && recv_timeout_ms <= 0)
1854 else if(send_timeout_ms >= recv_timeout_ms)
1863 char *newurl = NULL;
1865 bool comeback =
FALSE;
1868 send_timeout_ms = 0;
1877 recv_timeout_ms = 0;
1885 if(send_timeout_ms > 0 || recv_timeout_ms > 0) {
1887 if(send_timeout_ms >= recv_timeout_ms)
1989 stream_error =
TRUE;
2154 data = multi->
easyp;
2222 bool restore_pipe =
FALSE;
2232 restore_pipe =
TRUE;
2247 data = multi->
easyp;
2249 nextdata = data->
next;
2327 unsigned int curraction;
2334 curraction =
multi_getsock(data, socks, MAX_SOCKSPEREASYHANDLE);
2358 if(entry->
action == action)
2385 for(i = 0; i< data->
numsocks; i++) {
2388 for(j = 0; j<num; j++) {
2399 bool remove_sock_from_hash =
TRUE;
2408 remove_sock_from_hash =
FALSE;
2413 if(entry->
easy == data) {
2422 remove_sock_from_hash =
FALSE;
2427 if(entry->
easy == data) {
2440 if(remove_sock_from_hash) {
2511 for(e = list->
head; e;) {
2547 int *running_handles)
2561 data = multi->
easyp;
2675 #undef curl_multi_setopt 2685 va_start(param, option);
2688 case CURLMOPT_SOCKETFUNCTION:
2691 case CURLMOPT_SOCKETDATA:
2694 case CURLMOPT_PUSHFUNCTION:
2697 case CURLMOPT_PUSHDATA:
2700 case CURLMOPT_PIPELINING:
2703 case CURLMOPT_TIMERFUNCTION:
2706 case CURLMOPT_TIMERDATA:
2709 case CURLMOPT_MAXCONNECTS:
2712 case CURLMOPT_MAX_HOST_CONNECTIONS:
2715 case CURLMOPT_MAX_PIPELINE_LENGTH:
2718 case CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE:
2721 case CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE:
2724 case CURLMOPT_PIPELINING_SITE_BL:
2728 case CURLMOPT_PIPELINING_SERVER_BL:
2732 case CURLMOPT_MAX_TOTAL_CONNECTIONS:
2744 #undef curl_multi_socket 2747 int *running_handles)
2756 int ev_bitmask,
int *running_handles)
2759 ev_bitmask, running_handles);
2778 static struct curltime tv_zero = {0, 0};
2833 if(timeout_ms < 0) {
2834 static const struct curltime none = {0, 0};
2867 for(e = timeoutlist->
head; e; e = e->
next) {
2903 for(e = timeoutlist->
head; e; e = e->
next) {
2945 set.tv_sec += milli/1000;
2946 set.tv_usec += (
unsigned int)(milli%1000)*1000;
2950 set.tv_usec -= 1000000;
2978 infof(data,
"Internal error removing splay node = %d\n", rc);
3026 infof(data,
"Internal error clearing splay node = %d\n", rc);
3029 while(list->
size > 0) {
3034 infof(data,
"Expire cleared\n");
3112 void Curl_multi_dump(
struct Curl_multi *multi)
3116 fprintf(stderr,
"* Multi status: %d handles, %d alive\n",
3118 for(data = multi->
easyp; data; data = data->
next) {
3121 fprintf(stderr,
"handle %p, state %s, %d sockets\n",
3124 for(i = 0; i < data->
numsocks; i++) {
3128 fprintf(stderr,
"%d ", (
int)s);
3130 fprintf(stderr,
"INTERNAL CONFUSION\n");
#define GOOD_MULTI_HANDLE(x)
struct Curl_multi * Curl_multi_handle(int hashsize, int chashsize)
CURLcode Curl_connect(struct Curl_easy *data, struct connectdata **in_connect, bool *asyncp, bool *protocol_done)
struct curl_llist recv_pipe
CURLcode(* do_it)(struct connectdata *, bool *done)
#define CONNECT_FIRSTSOCKET_PROXY_SSL()
struct connectdata * lastconnect
#define Curl_splaycomparekeys(i, j)
static int waitproxyconnect_getsock(struct connectdata *conn, curl_socket_t *sock, int numsocks)
int Curl_removeHandleFromPipeline(struct Curl_easy *handle, struct curl_llist *pipeline)
struct Curl_easy * closure_handle
CURLcode Curl_follow(struct Curl_easy *data, char *newurl, followtype type)
bool param(const std::string ¶m_name, T ¶m_val, const T &default_val)
curl_wildcard_states state
void Curl_multi_handlePipeBreak(struct Curl_easy *data)
static struct Curl_sh_entry * sh_getentry(struct curl_hash *sh, curl_socket_t s)
static struct Curl_sh_entry * sh_addentry(struct curl_hash *sh, curl_socket_t s, struct Curl_easy *data)
CURLMcode curl_multi_fdset(struct Curl_multi *multi, fd_set *read_fd_set, fd_set *write_fd_set, fd_set *exc_fd_set, int *max_fd)
static CURLMcode add_next_timeout(struct curltime now, struct Curl_multi *multi, struct Curl_easy *d)
int Curl_hash_init(struct curl_hash *h, int slots, hash_function hfunc, comp_function comparator, curl_hash_dtor dtor)
static void sh_delentry(struct curl_hash *sh, curl_socket_t s)
void Curl_expire_done(struct Curl_easy *data, expire_id id)
static CURLMcode multi_addtimeout(struct Curl_easy *data, struct curltime *stamp, expire_id eid)
static int domore_getsock(struct connectdata *conn, curl_socket_t *socks, int numsocks)
#define CURL_WAIT_POLLOUT
struct Curl_tree * Curl_splaygetbest(struct curltime i, struct Curl_tree *t, struct Curl_tree **removed)
void Curl_wildcard_dtor(struct WildcardData *wc)
CURLcode Curl_readwrite(struct connectdata *conn, struct Curl_easy *data, bool *done, bool *comeback)
int Curl_resolver_getsock(struct connectdata *conn, curl_socket_t *sock, int numsocks)
void(* init_multistate_func)(struct Curl_easy *data)
void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
struct curl_llist send_pipe
static void close_all_connections(struct Curl_multi *multi)
long server_response_timeout
CURLcode Curl_disconnect(struct connectdata *conn, bool dead_connection)
CURLMcode curl_multi_socket_all(struct Curl_multi *multi, int *running_handles)
CURLcode Curl_add_handle_to_pipeline(struct Curl_easy *handle, struct connectdata *conn)
static int waitconnect_getsock(struct connectdata *conn, curl_socket_t *sock, int numsocks)
CURLMcode Curl_multi_add_perform(struct Curl_multi *multi, struct Curl_easy *data, struct connectdata *conn)
void Curl_connect_free(struct Curl_easy *data)
struct curl_llist timeoutlist
struct curl_llist pipelining_server_bl
#define streamclose(x, y)
CURLcode Curl_posttransfer(struct Curl_easy *data)
#define sigpipe_ignore(x, y)
struct time_node expires[EXPIRE_LAST]
CURLMcode Curl_pipeline_set_site_blacklist(char **sites, struct curl_llist *list)
#define CURL_MULTI_HANDLE
static CURLMcode multi_addmsg(struct Curl_multi *multi, struct Curl_message *msg)
long Curl_pgrsLimitWaitTime(curl_off_t cursize, curl_off_t startsize, curl_off_t limit, struct curltime start, struct curltime now)
#define MAX_SOCKSPEREASYHANDLE
int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len)
const struct Curl_handler * handler
static void singlesocket(struct Curl_multi *multi, struct Curl_easy *data)
int Curl_pgrsDone(struct connectdata *conn)
struct curl_llist_element * tail
bool Curl_pipeline_checkget_read(struct Curl_easy *data, struct connectdata *conn)
struct Curl_multi * multi
struct curltime dl_limit_start
#define GETSOCK_READSOCK(x)
IMETHOD Vector diff(const Vector &p_w_a, const Vector &p_w_b, double dt=1)
bool Curl_pipeline_checkget_write(struct Curl_easy *data, struct connectdata *conn)
void Curl_init_CONNECT(struct Curl_easy *data)
struct curl_hash sockhash
struct Curl_dns_entry * dns_entry
static bool multi_ischanged(struct Curl_multi *multi, bool clear)
int Curl_protocol_getsock(struct connectdata *conn, curl_socket_t *socks, int numsocks)
void Curl_llist_init(struct curl_llist *l, curl_llist_dtor dtor)
#define CURLEASY_MAGIC_NUMBER
#define CURL_CONNECTION_HASH_SIZE
CURLMcode curl_multi_add_handle(struct Curl_multi *multi, struct Curl_easy *data)
bool Curl_pipeline_wanted(const struct Curl_multi *multi, int bits)
CURLMcode Curl_pipeline_set_server_blacklist(char **servers, struct curl_llist *list)
void Curl_hash_destroy(struct curl_hash *h)
curl_socket_t tempsock[2]
static CURLcode multi_reconnect_request(struct connectdata **connp)
curl_off_t Curl_multi_chunk_length_penalty_size(struct Curl_multi *multi)
struct curl_llist pipelining_site_bl
static void multi_freeamsg(void *a, void *b)
int curlx_uztosi(size_t uznum)
int(* domore_getsock)(struct connectdata *conn, curl_socket_t *socks, int numsocks)
CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
geometry_msgs::TransformStamped t
static int sh_init(struct curl_hash *hash, int hashsize)
size_t Curl_multi_max_total_connections(struct Curl_multi *multi)
UNITTEST_START int result
CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles)
struct curl_hash * hostcache
static int multi_getsock(struct Curl_easy *data, curl_socket_t *socks, int numsocks)
int(* curl_socket_callback)(CURL *easy, curl_socket_t s, int what, void *userp, void *socketp)
#define CURL_WAIT_POLLPRI
void Curl_resolver_cancel(struct connectdata *conn)
CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
static bool ConnectionDone(struct Curl_easy *data, struct connectdata *conn)
int(* curl_multi_timer_callback)(CURLM *multi, long timeout_ms, void *userp)
bool Curl_recvpipe_head(struct Curl_easy *data, struct connectdata *conn)
long content_length_penalty_size
struct curl_hash * Curl_global_host_cache_init(void)
struct proxy_info http_proxy
CURLMcode curl_multi_socket_action(struct Curl_multi *multi, curl_socket_t s, int ev_bitmask, int *running_handles)
CURLMcode curl_multi_wait(struct Curl_multi *multi, struct curl_waitfd extra_fds[], unsigned int extra_nfds, int timeout_ms, int *ret)
static void sh_freeentry(void *freethis)
int Curl_pgrsUpdate(struct connectdata *conn)
CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done)
CURLMcode curl_multi_assign(struct Curl_multi *multi, curl_socket_t s, void *hashp)
struct curl_llist pending
int Curl_doing_getsock(struct connectdata *conn, curl_socket_t *socks, int numsocks)
bool Curl_sendpipe_head(struct Curl_easy *data, struct connectdata *conn)
struct connectdata * easy_conn
memcpy(filename, filename1, strlen(filename1))
void Curl_move_handle_from_send_to_recv_pipe(struct Curl_easy *handle, struct connectdata *conn)
static size_t hash_fd(void *key, size_t key_length, size_t slots_num)
struct curl_httppost * last
int Curl_mk_dnscache(struct curl_hash *hash)
#define sigpipe_restore(x)
struct curl_llist msglist
CURLMcode curl_multi_timeout(struct Curl_multi *multi, long *timeout_ms)
time_t Curl_timeleft(struct Curl_easy *data, struct curltime *nowp, bool duringconnect)
size_t Curl_llist_count(struct curl_llist *list)
curl_socket_callback socket_cb
CURL_EXTERN CURL * curl_easy_init(void)
UNITTEST_START struct Curl_easy data
static CURLcode multi_do_more(struct connectdata *conn, int *complete)
CURLcode Curl_is_connected(struct connectdata *conn, int sockindex, bool *connected)
long chunk_length_penalty_size
struct http_connect_state * connect_state
void Curl_pipeline_leave_read(struct connectdata *conn)
CURLMcode curl_multi_remove_handle(struct Curl_multi *multi, struct Curl_easy *data)
void Curl_multi_process_pending_handles(struct Curl_multi *multi)
void Curl_multi_connchanged(struct Curl_multi *multi)
struct Curl_tree * Curl_splayinsert(struct curltime i, struct Curl_tree *t, struct Curl_tree *node)
struct tempbuf tempwrite[3]
#define SIGPIPE_VARIABLE(x)
CURL_TYPEOF_CURL_OFF_T curl_off_t
void Curl_resolv_unlock(struct Curl_easy *data, struct Curl_dns_entry *dns)
void Curl_getoff_all_pipelines(struct Curl_easy *data, struct connectdata *conn)
struct Curl_multi * curl_multi_init(void)
struct conncache conn_cache
#define GETSOCK_WRITESOCK(x)
CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn)
size_t Curl_multi_max_host_connections(struct Curl_multi *multi)
CURLMsg * curl_multi_info_read(struct Curl_multi *multi, int *msgs_in_queue)
void Curl_pipeline_leave_write(struct connectdata *conn)
struct proxy_info socks_proxy
CURLcode Curl_speedcheck(struct Curl_easy *data, struct curltime now)
struct curl_llist_element * head
struct Curl_tree * Curl_splay(struct curltime i, struct Curl_tree *t)
static CURLcode multi_done(struct connectdata **connp, CURLcode status, bool premature)
curl_push_callback push_cb
static CURLcode multi_do(struct connectdata **connp, bool *done)
bool Curl_connect_ongoing(struct connectdata *conn)
static void mstate(struct Curl_easy *data, CURLMstate state)
CURLcode Curl_protocol_connect(struct connectdata *conn, bool *protocol_done)
curl_socket_t writesockfd
struct curltime expiretime
void Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e, void *user)
static CURLMcode multi_runsingle(struct Curl_multi *multi, struct curltime now, struct Curl_easy *data)
int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks, int numsocks)
struct curltime ul_limit_start
void Curl_hostcache_clean(struct Curl_easy *data, struct curl_hash *hash)
curl_off_t max_send_speed
time_t curlx_tvdiff(struct curltime newer, struct curltime older)
long max_total_connections
data progress t_startsingle tv_usec
#define CURL_SOCKET_TIMEOUT
struct curltime timer_lastcall
int Curl_single_getsock(const struct connectdata *conn, curl_socket_t *sock, int numsocks)
CURLcode Curl_pretransfer(struct Curl_easy *data)
CURLMcode curl_multi_setopt(struct Curl_multi *multi, CURLMoption option,...)
void Curl_free_request_state(struct Curl_easy *data)
void Curl_multi_closed(struct connectdata *conn, curl_socket_t s)
static CURLMcode multi_socket(struct Curl_multi *multi, bool checkall, curl_socket_t s, int ev_bitmask, int *running_handles)
struct curltime t_startsingle
struct hostname conn_to_host
curl_off_t max_recv_speed
CURLcode Curl_resolver_is_resolved(struct connectdata *conn, struct Curl_dns_entry **dns)
void Curl_llist_destroy(struct curl_llist *list, void *user)
curl_multi_timer_callback timer_cb
struct curl_llist * Curl_multi_pipelining_server_bl(struct Curl_multi *multi)
curl_socket_t sockets[MAX_SOCKSPEREASYHANDLE]
struct connectdata * Curl_oldest_idle_connection(struct Curl_easy *data)
#define Curl_tvdiff(x, y)
curl_off_t Curl_multi_content_length_penalty_size(struct Curl_multi *multi)
enum Names::@35 hostcachetype
struct Curl_easy * easylp
void * Curl_hash_add(struct curl_hash *h, void *key, size_t key_len, void *p)
#define CURL_SOCKET_HASH_TABLE_SIZE
void Curl_llist_insert_next(struct curl_llist *list, struct curl_llist_element *e, const void *p, struct curl_llist_element *ne)
int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
int Curl_conncache_init(struct conncache *connc, int size)
struct curl_llist_element * prev
CURLcode Curl_resolver_wait_resolv(struct connectdata *conn, struct Curl_dns_entry **dnsentry)
void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
void Curl_conncache_destroy(struct conncache *connc)
#define GOOD_EASY_HANDLE(x)
CURLcode Curl_close(struct Curl_easy *data)
bool Curl_connect_complete(struct connectdata *conn)
struct Curl_dns_entry * Curl_fetch_addr(struct connectdata *conn, const char *hostname, int port)
struct Curl_tree * timetree
struct WildcardData wildcard
struct Curl_tree timenode
struct curl_llist_element list
static void do_complete(struct connectdata *conn)
static size_t fd_key_compare(void *k1, size_t k1_len, void *k2, size_t k2_len)
CURLcode Curl_protocol_connecting(struct connectdata *conn, bool *done)
int(* curl_push_callback)(CURL *parent, CURL *easy, size_t num_headers, struct curl_pushheaders *headers, void *userp)
struct curl_hash hostcache
int Curl_splayremovebyaddr(struct Curl_tree *t, struct Curl_tree *removenode, struct Curl_tree **newroot)
struct conncache * conn_cache
struct connectdata * Curl_conncache_find_first_connection(struct conncache *connc)
long max_host_connections
struct curl_llist_element connect_queue
bool proxy_ssl_connected[2]
struct curl_llist * Curl_multi_pipelining_site_bl(struct Curl_multi *multi)
CURLMcode curl_multi_socket(struct Curl_multi *multi, curl_socket_t s, int *running_handles)
void Curl_expire_clear(struct Curl_easy *data)
void * Curl_hash_pick(struct curl_hash *h, void *key, size_t key_len)
#define calloc(nbelem, size)
static int update_timer(struct Curl_multi *multi)
CURLcode Curl_retry_request(struct connectdata *conn, char **url)
Curl_do_more_func do_more
CURLcode Curl_async_resolved(struct connectdata *conn, bool *protocol_connect)
bool proxy_connect_closed
static void multi_deltimeout(struct Curl_easy *data, expire_id eid)
static CURLMcode multi_timeout(struct Curl_multi *multi, long *timeout_ms)
struct curl_llist_element * next
#define CURL_FORMAT_CURL_OFF_T
struct curl_llist_element list