forked from enlightenment/efl
reformat using ecrustify because uncrustify dicked it up previously
SVN revision: 54128
This commit is contained in:
parent
64aa07c793
commit
ddd151bf37
File diff suppressed because it is too large
Load Diff
|
@ -17,26 +17,26 @@
|
|||
#include "Ecore_Con.h"
|
||||
#include "ecore_con_private.h"
|
||||
|
||||
typedef struct _Ecore_Con_FD Ecore_Con_FD;
|
||||
typedef struct _Ecore_Con_FD Ecore_Con_FD;
|
||||
typedef struct _Ecore_Con_CAres Ecore_Con_CAres;
|
||||
|
||||
struct _Ecore_Con_FD
|
||||
{
|
||||
Ecore_Fd_Handler *handler;
|
||||
int active;
|
||||
int fd;
|
||||
int active;
|
||||
int fd;
|
||||
};
|
||||
|
||||
struct _Ecore_Con_CAres
|
||||
{
|
||||
Ecore_Con_Server *svr;
|
||||
Ecore_Con_Info_Cb done_cb;
|
||||
void *data;
|
||||
struct addrinfo hints;
|
||||
Ecore_Con_Info *result;
|
||||
void *data;
|
||||
struct addrinfo hints;
|
||||
Ecore_Con_Info *result;
|
||||
|
||||
union {
|
||||
struct in_addr v4;
|
||||
struct in_addr v4;
|
||||
struct in6_addr v6;
|
||||
} addr;
|
||||
|
||||
|
@ -51,13 +51,16 @@ static int active = 0;
|
|||
static Ecore_Timer *tm = NULL;
|
||||
static fd_set info_readers, info_writers;
|
||||
|
||||
static void _ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg, int status,
|
||||
int timeouts, char *node,
|
||||
char *service);
|
||||
static void _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg, int status,
|
||||
int timeouts,
|
||||
struct hostent *hostent);
|
||||
static Eina_Bool _ecore_con_info_cares_fd_cb(void *data,
|
||||
static void _ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg,
|
||||
int status,
|
||||
int timeouts,
|
||||
char *node,
|
||||
char *service);
|
||||
static void _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg,
|
||||
int status,
|
||||
int timeouts,
|
||||
struct hostent *hostent);
|
||||
static Eina_Bool _ecore_con_info_cares_fd_cb(void *data,
|
||||
Ecore_Fd_Handler *fd_handler);
|
||||
static Eina_Bool _ecore_con_info_cares_timeout_cb(void *data);
|
||||
static void _ecore_con_info_cares_clean(void);
|
||||
|
@ -68,7 +71,7 @@ ecore_con_info_init(void)
|
|||
if (info_init == 0)
|
||||
{
|
||||
if (ares_library_init(ARES_LIB_INIT_ALL) != 0)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
if (ares_init(&info_channel) != ARES_SUCCESS)
|
||||
{
|
||||
|
@ -88,12 +91,12 @@ ecore_con_info_shutdown(void)
|
|||
if (info_init == 0)
|
||||
{
|
||||
/* Cancel all ongoing request */
|
||||
ares_cancel(info_channel);
|
||||
ares_destroy(info_channel);
|
||||
ares_cancel(info_channel);
|
||||
ares_destroy(info_channel);
|
||||
|
||||
/* Destroy FD handler here. */
|
||||
/* Shutdown ares */
|
||||
ares_library_cleanup();
|
||||
/* Destroy FD handler here. */
|
||||
/* Shutdown ares */
|
||||
ares_library_cleanup();
|
||||
}
|
||||
|
||||
return info_init;
|
||||
|
@ -102,7 +105,7 @@ ecore_con_info_shutdown(void)
|
|||
int
|
||||
ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
|
@ -121,7 +124,7 @@ ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
|
|||
int
|
||||
ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
|
@ -140,7 +143,7 @@ ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
|
|||
int
|
||||
ecore_con_info_udp_connect(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
|
@ -159,7 +162,7 @@ ecore_con_info_udp_connect(Ecore_Con_Server *svr,
|
|||
int
|
||||
ecore_con_info_udp_listen(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
|
@ -178,7 +181,7 @@ ecore_con_info_udp_listen(Ecore_Con_Server *svr,
|
|||
int
|
||||
ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
|
@ -196,19 +199,21 @@ ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
|
|||
|
||||
static Eina_Bool
|
||||
_ecore_con_info_ares_getnameinfo(Ecore_Con_CAres *arg,
|
||||
int addrtype, const char *name,
|
||||
struct sockaddr *addr, int addrlen)
|
||||
int addrtype,
|
||||
const char *name,
|
||||
struct sockaddr *addr,
|
||||
int addrlen)
|
||||
{
|
||||
int length = 0;
|
||||
|
||||
if (name)
|
||||
length = strlen(name) + 1;
|
||||
length = strlen(name) + 1;
|
||||
else
|
||||
length = 1;
|
||||
length = 1;
|
||||
|
||||
arg->result = malloc(sizeof (Ecore_Con_Info) + length);
|
||||
if (!arg->result)
|
||||
return EINA_FALSE;
|
||||
return EINA_FALSE;
|
||||
|
||||
/* FIXME: What to do when hint is not set ? */
|
||||
arg->result->info.ai_flags = arg->hints.ai_flags;
|
||||
|
@ -221,34 +226,33 @@ _ecore_con_info_ares_getnameinfo(Ecore_Con_CAres *arg,
|
|||
arg->result->info.ai_canonname = (char *)(arg->result + 1);
|
||||
|
||||
if (!name)
|
||||
*arg->result->info.ai_canonname = '\0';
|
||||
*arg->result->info.ai_canonname = '\0';
|
||||
else
|
||||
strcpy(arg->result->info.ai_canonname, name);
|
||||
strcpy(arg->result->info.ai_canonname, name);
|
||||
|
||||
arg->result->info.ai_next = NULL;
|
||||
|
||||
ares_getnameinfo(
|
||||
info_channel, addr, addrlen,
|
||||
ARES_NI_NUMERICSERV | ARES_NI_NUMERICHOST |
|
||||
ARES_NI_LOOKUPSERVICE | ARES_NI_LOOKUPHOST,
|
||||
(ares_nameinfo_callback)_ecore_con_info_ares_nameinfo, arg);
|
||||
info_channel, addr, addrlen,
|
||||
ARES_NI_NUMERICSERV | ARES_NI_NUMERICHOST |
|
||||
ARES_NI_LOOKUPSERVICE | ARES_NI_LOOKUPHOST,
|
||||
(ares_nameinfo_callback)_ecore_con_info_ares_nameinfo, arg);
|
||||
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
|
||||
EAPI int
|
||||
ecore_con_info_get(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data,
|
||||
struct addrinfo *hints)
|
||||
void *data,
|
||||
struct addrinfo *hints)
|
||||
{
|
||||
Ecore_Con_CAres *cares;
|
||||
int ai_family = AF_INET6;
|
||||
|
||||
cares = calloc(1, sizeof (Ecore_Con_CAres));
|
||||
if (!cares)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
cares->svr = svr;
|
||||
cares->done_cb = done_cb;
|
||||
|
@ -294,7 +298,8 @@ ecore_con_info_get(Ecore_Con_Server *svr,
|
|||
}
|
||||
|
||||
static int
|
||||
_ecore_con_info_fds_search(const Ecore_Con_FD *fd1, const Ecore_Con_FD *fd2)
|
||||
_ecore_con_info_fds_search(const Ecore_Con_FD *fd1,
|
||||
const Ecore_Con_FD *fd2)
|
||||
{
|
||||
return fd1->fd - fd2->fd;
|
||||
}
|
||||
|
@ -308,7 +313,7 @@ _ecore_con_info_fds_lookup(int fd)
|
|||
fdl.fd = fd;
|
||||
|
||||
search = eina_list_search_unsorted(
|
||||
info_fds, (Eina_Compare_Cb)_ecore_con_info_fds_search, &fdl);
|
||||
info_fds, (Eina_Compare_Cb)_ecore_con_info_fds_search, &fdl);
|
||||
|
||||
if (search)
|
||||
{
|
||||
|
@ -338,46 +343,45 @@ _ecore_con_info_cares_clean(void)
|
|||
int flags = 0;
|
||||
|
||||
if (FD_ISSET(i, &readers))
|
||||
flags |= ECORE_FD_READ;
|
||||
flags |= ECORE_FD_READ;
|
||||
|
||||
if (FD_ISSET(i, &writers))
|
||||
flags |= ECORE_FD_WRITE;
|
||||
flags |= ECORE_FD_WRITE;
|
||||
|
||||
if (flags)
|
||||
if (!_ecore_con_info_fds_lookup(i))
|
||||
{
|
||||
ecf = malloc(sizeof (Ecore_Con_FD));
|
||||
if (ecf)
|
||||
{
|
||||
ecf->fd = i;
|
||||
ecf->active = active;
|
||||
ecf->handler = ecore_main_fd_handler_add(
|
||||
i, ECORE_FD_WRITE | ECORE_FD_READ,
|
||||
_ecore_con_info_cares_fd_cb,
|
||||
NULL, NULL, NULL);
|
||||
info_fds = eina_list_append(info_fds, ecf);
|
||||
}
|
||||
}
|
||||
|
||||
if (!_ecore_con_info_fds_lookup(i))
|
||||
{
|
||||
ecf = malloc(sizeof (Ecore_Con_FD));
|
||||
if (ecf)
|
||||
{
|
||||
ecf->fd = i;
|
||||
ecf->active = active;
|
||||
ecf->handler = ecore_main_fd_handler_add(
|
||||
i, ECORE_FD_WRITE | ECORE_FD_READ,
|
||||
_ecore_con_info_cares_fd_cb,
|
||||
NULL, NULL, NULL);
|
||||
info_fds = eina_list_append(info_fds, ecf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
info_readers = readers;
|
||||
info_writers = writers;
|
||||
|
||||
EINA_LIST_FOREACH_SAFE(info_fds, l, l_next, ecf)
|
||||
{
|
||||
if (ecf->active != active)
|
||||
{
|
||||
ecore_main_fd_handler_del(ecf->handler);
|
||||
free(ecf);
|
||||
info_fds = eina_list_remove_list(info_fds, l);
|
||||
}
|
||||
}
|
||||
{
|
||||
if (ecf->active != active)
|
||||
{
|
||||
ecore_main_fd_handler_del(ecf->handler);
|
||||
free(ecf);
|
||||
info_fds = eina_list_remove_list(info_fds, l);
|
||||
}
|
||||
}
|
||||
|
||||
if (!info_fds)
|
||||
{
|
||||
if (tm)
|
||||
ecore_timer_del(tm);
|
||||
ecore_timer_del(tm);
|
||||
|
||||
tm = NULL;
|
||||
}
|
||||
|
@ -388,12 +392,12 @@ _ecore_con_info_cares_clean(void)
|
|||
ares_timeout(info_channel, NULL, &tv);
|
||||
|
||||
if (tm)
|
||||
ecore_timer_delay(tm, tv.tv_sec);
|
||||
ecore_timer_delay(tm, tv.tv_sec);
|
||||
else
|
||||
tm =
|
||||
ecore_timer_add((double)tv.tv_sec,
|
||||
_ecore_con_info_cares_timeout_cb,
|
||||
NULL);
|
||||
tm =
|
||||
ecore_timer_add((double)tv.tv_sec,
|
||||
_ecore_con_info_cares_timeout_cb,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -407,7 +411,8 @@ _ecore_con_info_cares_timeout_cb(void *data)
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
_ecore_con_info_cares_fd_cb(void *data, Ecore_Fd_Handler *fd_handler)
|
||||
_ecore_con_info_cares_fd_cb(void *data,
|
||||
Ecore_Fd_Handler *fd_handler)
|
||||
{
|
||||
ares_process(info_channel, &info_readers, &info_writers);
|
||||
_ecore_con_info_cares_clean();
|
||||
|
@ -416,8 +421,10 @@ _ecore_con_info_cares_fd_cb(void *data, Ecore_Fd_Handler *fd_handler)
|
|||
}
|
||||
|
||||
static void
|
||||
_ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg, int status, int timeouts,
|
||||
struct hostent *hostent)
|
||||
_ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg,
|
||||
int status,
|
||||
int timeouts,
|
||||
struct hostent *hostent)
|
||||
{
|
||||
struct sockaddr *addr;
|
||||
int addrlen;
|
||||
|
@ -427,72 +434,72 @@ _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg, int status, int timeouts,
|
|||
switch (status)
|
||||
{
|
||||
case ARES_SUCCESS:
|
||||
if (!hostent->h_addr_list[0])
|
||||
if (!hostent->h_addr_list[0])
|
||||
{
|
||||
fprintf(stderr, "No IP found\n");
|
||||
goto on_error;
|
||||
}
|
||||
|
||||
switch (hostent->h_addrtype)
|
||||
{
|
||||
case AF_INET:
|
||||
{
|
||||
fprintf(stderr, "No IP found\n");
|
||||
goto on_error;
|
||||
struct sockaddr_in *addri;
|
||||
|
||||
addrlen = sizeof (struct sockaddr_in);
|
||||
addri = malloc(addrlen);
|
||||
|
||||
if (!addri)
|
||||
goto on_mem_error;
|
||||
|
||||
addri->sin_family = AF_INET;
|
||||
addri->sin_port = htons(arg->svr->port);
|
||||
|
||||
memcpy(&addri->sin_addr.s_addr,
|
||||
hostent->h_addr_list[0], sizeof (struct in_addr));
|
||||
|
||||
addr = (struct sockaddr *)addri;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (hostent->h_addrtype)
|
||||
case AF_INET6:
|
||||
{
|
||||
case AF_INET:
|
||||
{
|
||||
struct sockaddr_in *addri;
|
||||
struct sockaddr_in6 *addri6;
|
||||
|
||||
addrlen = sizeof (struct sockaddr_in);
|
||||
addri = malloc(addrlen);
|
||||
addrlen = sizeof (struct sockaddr_in6);
|
||||
addri6 = malloc(addrlen);
|
||||
|
||||
if (!addri)
|
||||
goto on_mem_error;
|
||||
if (!addri6)
|
||||
goto on_mem_error;
|
||||
|
||||
addri->sin_family = AF_INET;
|
||||
addri->sin_port = htons(arg->svr->port);
|
||||
addri6->sin6_family = AF_INET6;
|
||||
addri6->sin6_port = htons(arg->svr->port);
|
||||
addri6->sin6_flowinfo = 0;
|
||||
addri6->sin6_scope_id = 0;
|
||||
|
||||
memcpy(&addri->sin_addr.s_addr,
|
||||
hostent->h_addr_list[0], sizeof (struct in_addr));
|
||||
memcpy(&addri6->sin6_addr.s6_addr,
|
||||
hostent->h_addr_list[0], sizeof (struct in6_addr));
|
||||
|
||||
addr = (struct sockaddr *)addri;
|
||||
break;
|
||||
}
|
||||
|
||||
case AF_INET6:
|
||||
{
|
||||
struct sockaddr_in6 *addri6;
|
||||
|
||||
addrlen = sizeof (struct sockaddr_in6);
|
||||
addri6 = malloc(addrlen);
|
||||
|
||||
if (!addri6)
|
||||
goto on_mem_error;
|
||||
|
||||
addri6->sin6_family = AF_INET6;
|
||||
addri6->sin6_port = htons(arg->svr->port);
|
||||
addri6->sin6_flowinfo = 0;
|
||||
addri6->sin6_scope_id = 0;
|
||||
|
||||
memcpy(&addri6->sin6_addr.s6_addr,
|
||||
hostent->h_addr_list[0], sizeof (struct in6_addr));
|
||||
|
||||
addr = (struct sockaddr *)addri6;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
fprintf(stderr, "Unknown addrtype %i\n", hostent->h_addrtype);
|
||||
goto on_error;
|
||||
addr = (struct sockaddr *)addri6;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!_ecore_con_info_ares_getnameinfo(arg, hostent->h_addrtype,
|
||||
hostent->h_name,
|
||||
addr, addrlen))
|
||||
goto on_error;
|
||||
default:
|
||||
fprintf(stderr, "Unknown addrtype %i\n", hostent->h_addrtype);
|
||||
goto on_error;
|
||||
}
|
||||
|
||||
break;
|
||||
if (!_ecore_con_info_ares_getnameinfo(arg, hostent->h_addrtype,
|
||||
hostent->h_name,
|
||||
addr, addrlen))
|
||||
goto on_error;
|
||||
|
||||
break;
|
||||
|
||||
case ARES_ENOTFOUND: /* address notfound */
|
||||
if (arg->byaddr)
|
||||
{
|
||||
/* This happen when host doesn't have a reverse. */
|
||||
if (arg->byaddr)
|
||||
{
|
||||
/* This happen when host doesn't have a reverse. */
|
||||
if (arg->isv6)
|
||||
{
|
||||
struct sockaddr_in6 *addri6;
|
||||
|
@ -501,7 +508,7 @@ _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg, int status, int timeouts,
|
|||
addri6 = malloc(addrlen);
|
||||
|
||||
if (!addri6)
|
||||
goto on_mem_error;
|
||||
goto on_mem_error;
|
||||
|
||||
addri6->sin6_family = AF_INET6;
|
||||
addri6->sin6_port = htons(arg->svr->port);
|
||||
|
@ -521,7 +528,7 @@ _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg, int status, int timeouts,
|
|||
addri = malloc(addrlen);
|
||||
|
||||
if (!addri)
|
||||
goto on_mem_error;
|
||||
goto on_mem_error;
|
||||
|
||||
addri->sin_family = AF_INET;
|
||||
addri->sin_port = htons(arg->svr->port);
|
||||
|
@ -537,28 +544,28 @@ _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg, int status, int timeouts,
|
|||
AF_INET,
|
||||
NULL, addr,
|
||||
addrlen))
|
||||
goto on_error;
|
||||
goto on_error;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
case ARES_ENOTIMP: /* unknown family */
|
||||
case ARES_EBADNAME: /* not a valid internet address */
|
||||
case ARES_ENOMEM: /* not enough memory */
|
||||
case ARES_EDESTRUCTION: /* request canceled, shuting down */
|
||||
goto on_error;
|
||||
goto on_error;
|
||||
|
||||
default:
|
||||
fprintf(stderr,
|
||||
"Unknown status returned by c-ares: %i assuming error\n",
|
||||
status);
|
||||
goto on_error;
|
||||
fprintf(stderr,
|
||||
"Unknown status returned by c-ares: %i assuming error\n",
|
||||
status);
|
||||
goto on_error;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
on_mem_error:
|
||||
fprintf(stderr, "Not enough memory\n");
|
||||
fprintf(stderr, "Not enough memory\n");
|
||||
|
||||
on_error:
|
||||
arg->done_cb(arg->data, NULL);
|
||||
|
@ -566,36 +573,39 @@ on_error:
|
|||
}
|
||||
|
||||
static void
|
||||
_ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg, int status, int timeouts,
|
||||
char *node,
|
||||
char *service)
|
||||
_ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg,
|
||||
int status,
|
||||
int timeouts,
|
||||
char *node,
|
||||
char *service)
|
||||
{
|
||||
switch (status)
|
||||
{
|
||||
case ARES_SUCCESS:
|
||||
if (node)
|
||||
strcpy(arg->result->ip, node);
|
||||
else
|
||||
*arg->result->ip = '\0';
|
||||
if (node)
|
||||
strcpy(arg->result->ip, node);
|
||||
else
|
||||
*arg->result->ip = '\0';
|
||||
|
||||
if (service)
|
||||
strcpy(arg->result->service, service);
|
||||
else
|
||||
*arg->result->service = '\0';
|
||||
if (service)
|
||||
strcpy(arg->result->service, service);
|
||||
else
|
||||
*arg->result->service = '\0';
|
||||
|
||||
arg->done_cb(arg->data, arg->result);
|
||||
break;
|
||||
arg->done_cb(arg->data, arg->result);
|
||||
break;
|
||||
|
||||
case ARES_ENOTIMP:
|
||||
case ARES_ENOTFOUND:
|
||||
case ARES_ENOMEM:
|
||||
case ARES_EDESTRUCTION:
|
||||
case ARES_EBADFLAGS:
|
||||
arg->done_cb(arg->data, NULL);
|
||||
break;
|
||||
arg->done_cb(arg->data, NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
free(arg->result->info.ai_addr);
|
||||
free(arg->result);
|
||||
free(arg);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
# ifdef __cplusplus
|
||||
extern "C"
|
||||
# endif
|
||||
void *alloca (size_t);
|
||||
void *alloca(size_t);
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
@ -62,22 +62,22 @@ typedef struct _CB_Data CB_Data;
|
|||
|
||||
struct _CB_Data
|
||||
{
|
||||
EINA_INLIST;
|
||||
Ecore_Con_Info_Cb cb_done;
|
||||
void *data;
|
||||
Ecore_Fd_Handler *fdh;
|
||||
pid_t pid;
|
||||
EINA_INLIST;
|
||||
Ecore_Con_Info_Cb cb_done;
|
||||
void *data;
|
||||
Ecore_Fd_Handler *fdh;
|
||||
pid_t pid;
|
||||
Ecore_Event_Handler *handler;
|
||||
int fd2;
|
||||
int fd2;
|
||||
};
|
||||
|
||||
|
||||
static void _ecore_con_info_readdata(CB_Data *cbdata);
|
||||
static void _ecore_con_info_slave_free(CB_Data *cbdata);
|
||||
static Eina_Bool _ecore_con_info_data_handler(void *data,
|
||||
static Eina_Bool _ecore_con_info_data_handler(void *data,
|
||||
Ecore_Fd_Handler *fd_handler);
|
||||
static Eina_Bool _ecore_con_info_exit_handler(void *data, int type __UNUSED__,
|
||||
void *event);
|
||||
static Eina_Bool _ecore_con_info_exit_handler(void *data,
|
||||
int type __UNUSED__,
|
||||
void *event);
|
||||
|
||||
static int info_init = 0;
|
||||
static CB_Data *info_slaves = NULL;
|
||||
|
@ -94,7 +94,7 @@ ecore_con_info_shutdown(void)
|
|||
{
|
||||
info_init--;
|
||||
if (info_init == 0)
|
||||
while (info_slaves) _ecore_con_info_slave_free(info_slaves);
|
||||
while (info_slaves) _ecore_con_info_slave_free(info_slaves);
|
||||
|
||||
return info_init;
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ ecore_con_info_shutdown(void)
|
|||
int
|
||||
ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
|
@ -121,7 +121,7 @@ ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
|
|||
int
|
||||
ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
|
@ -140,7 +140,7 @@ ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
|
|||
int
|
||||
ecore_con_info_udp_connect(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
|
@ -159,7 +159,7 @@ ecore_con_info_udp_connect(Ecore_Con_Server *svr,
|
|||
int
|
||||
ecore_con_info_udp_listen(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
|
@ -178,7 +178,7 @@ ecore_con_info_udp_listen(Ecore_Con_Server *svr,
|
|||
int
|
||||
ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
|
@ -197,14 +197,14 @@ ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
|
|||
EAPI int
|
||||
ecore_con_info_get(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data,
|
||||
struct addrinfo *hints)
|
||||
void *data,
|
||||
struct addrinfo *hints)
|
||||
{
|
||||
CB_Data *cbdata;
|
||||
int fd[2];
|
||||
|
||||
if (pipe(fd) < 0)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
cbdata = calloc(1, sizeof(CB_Data));
|
||||
if (!cbdata)
|
||||
|
@ -245,10 +245,10 @@ ecore_con_info_get(Ecore_Con_Server *svr,
|
|||
if (!getaddrinfo(svr->name, service, hints, &result) && result)
|
||||
{
|
||||
if (result->ai_canonname)
|
||||
canonname_len = strlen(result->ai_canonname) + 1;
|
||||
canonname_len = strlen(result->ai_canonname) + 1;
|
||||
|
||||
tosend_len = sizeof(Ecore_Con_Info) + result->ai_addrlen +
|
||||
canonname_len;
|
||||
canonname_len;
|
||||
|
||||
if (!(tosend = alloca(tosend_len))) goto on_error;
|
||||
memset(tosend, 0, tosend_len);
|
||||
|
@ -270,7 +270,7 @@ ecore_con_info_get(Ecore_Con_Server *svr,
|
|||
hbuf, sizeof(hbuf), sbuf, sizeof(sbuf),
|
||||
NI_NUMERICHOST | NI_NUMERICSERV))
|
||||
{
|
||||
memcpy(container->ip, hbuf, sizeof(container->ip));
|
||||
memcpy(container->ip, hbuf, sizeof(container->ip));
|
||||
memcpy(container->service, sbuf, sizeof(container->service));
|
||||
}
|
||||
|
||||
|
@ -279,7 +279,7 @@ ecore_con_info_get(Ecore_Con_Server *svr,
|
|||
|
||||
on_error:
|
||||
if (result)
|
||||
freeaddrinfo(result);
|
||||
freeaddrinfo(result);
|
||||
|
||||
err = write(fd[1], "", 1);
|
||||
close(fd[1]);
|
||||
|
@ -292,8 +292,8 @@ on_error:
|
|||
|
||||
/* PARENT */
|
||||
cbdata->handler =
|
||||
ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _ecore_con_info_exit_handler,
|
||||
cbdata);
|
||||
ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _ecore_con_info_exit_handler,
|
||||
cbdata);
|
||||
close(fd[1]);
|
||||
if (!cbdata->handler)
|
||||
{
|
||||
|
@ -304,7 +304,7 @@ on_error:
|
|||
}
|
||||
|
||||
info_slaves = (CB_Data *)eina_inlist_append(EINA_INLIST_GET(
|
||||
info_slaves),
|
||||
info_slaves),
|
||||
EINA_INLIST_GET(cbdata));
|
||||
return 1;
|
||||
}
|
||||
|
@ -337,13 +337,13 @@ _ecore_con_info_readdata(CB_Data *cbdata)
|
|||
recv = (Ecore_Con_Info *)torecv;
|
||||
|
||||
recv->info.ai_addr =
|
||||
(struct sockaddr *)(torecv + sizeof(Ecore_Con_Info));
|
||||
(struct sockaddr *)(torecv + sizeof(Ecore_Con_Info));
|
||||
if ((size_t)torecv_len !=
|
||||
(sizeof(Ecore_Con_Info) + recv->info.ai_addrlen))
|
||||
recv->info.ai_canonname = (char *)
|
||||
(torecv + sizeof(Ecore_Con_Info) + recv->info.ai_addrlen);
|
||||
recv->info.ai_canonname = (char *)
|
||||
(torecv + sizeof(Ecore_Con_Info) + recv->info.ai_addrlen);
|
||||
else
|
||||
recv->info.ai_canonname = NULL;
|
||||
recv->info.ai_canonname = NULL;
|
||||
|
||||
recv->info.ai_next = NULL;
|
||||
|
||||
|
@ -352,10 +352,10 @@ _ecore_con_info_readdata(CB_Data *cbdata)
|
|||
free(torecv);
|
||||
}
|
||||
else
|
||||
cbdata->cb_done(cbdata->data, NULL);
|
||||
cbdata->cb_done(cbdata->data, NULL);
|
||||
}
|
||||
else
|
||||
cbdata->cb_done(cbdata->data, NULL);
|
||||
cbdata->cb_done(cbdata->data, NULL);
|
||||
|
||||
cbdata->cb_done = NULL;
|
||||
}
|
||||
|
@ -372,7 +372,8 @@ _ecore_con_info_slave_free(CB_Data *cbdata)
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
_ecore_con_info_data_handler(void *data, Ecore_Fd_Handler *fd_handler)
|
||||
_ecore_con_info_data_handler(void *data,
|
||||
Ecore_Fd_Handler *fd_handler)
|
||||
{
|
||||
CB_Data *cbdata;
|
||||
|
||||
|
@ -381,7 +382,7 @@ _ecore_con_info_data_handler(void *data, Ecore_Fd_Handler *fd_handler)
|
|||
{
|
||||
if (ecore_main_fd_handler_active_get(fd_handler,
|
||||
ECORE_FD_READ))
|
||||
_ecore_con_info_readdata(cbdata);
|
||||
_ecore_con_info_readdata(cbdata);
|
||||
else
|
||||
{
|
||||
cbdata->cb_done(cbdata->data, NULL);
|
||||
|
@ -394,7 +395,9 @@ _ecore_con_info_data_handler(void *data, Ecore_Fd_Handler *fd_handler)
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
_ecore_con_info_exit_handler(void *data, int type __UNUSED__, void *event)
|
||||
_ecore_con_info_exit_handler(void *data,
|
||||
int type __UNUSED__,
|
||||
void *event)
|
||||
{
|
||||
CB_Data *cbdata;
|
||||
Ecore_Exe_Event_Del *ev;
|
||||
|
@ -402,9 +405,10 @@ _ecore_con_info_exit_handler(void *data, int type __UNUSED__, void *event)
|
|||
ev = event;
|
||||
cbdata = data;
|
||||
if (cbdata->pid != ev->pid)
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
|
||||
return ECORE_CALLBACK_CANCEL; /* FIXME: Woot ??? */
|
||||
_ecore_con_info_slave_free(cbdata);
|
||||
return ECORE_CALLBACK_CANCEL;
|
||||
}
|
||||
|
||||
|
|
|
@ -31,22 +31,20 @@
|
|||
#include "Ecore_Con.h"
|
||||
#include "ecore_con_private.h"
|
||||
|
||||
|
||||
#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + \
|
||||
(size_t)(((struct sockaddr_un *)NULL)-> \
|
||||
sun_path))
|
||||
#define LENGTH_OF_ABSTRACT_SOCKADDR_UN(s, path) (strlen(path) + 1 + \
|
||||
#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + \
|
||||
(size_t)(((struct sockaddr_un *)NULL)-> \
|
||||
sun_path))
|
||||
#define LENGTH_OF_ABSTRACT_SOCKADDR_UN(s, path) (strlen(path) + 1 + \
|
||||
(size_t)(((struct sockaddr_un \
|
||||
*)NULL)->sun_path))
|
||||
|
||||
|
||||
static int _ecore_con_local_init_count = 0;
|
||||
|
||||
int
|
||||
ecore_con_local_init(void)
|
||||
{
|
||||
if (++_ecore_con_local_init_count != 1)
|
||||
return _ecore_con_local_init_count;
|
||||
return _ecore_con_local_init_count;
|
||||
|
||||
return _ecore_con_local_init_count;
|
||||
}
|
||||
|
@ -55,17 +53,18 @@ int
|
|||
ecore_con_local_shutdown(void)
|
||||
{
|
||||
if (--_ecore_con_local_init_count != 0)
|
||||
return _ecore_con_local_init_count;
|
||||
return _ecore_con_local_init_count;
|
||||
|
||||
return _ecore_con_local_init_count;
|
||||
}
|
||||
|
||||
int
|
||||
ecore_con_local_connect(Ecore_Con_Server *svr,
|
||||
Eina_Bool (*cb_done)(void *data,
|
||||
Ecore_Fd_Handler *fd_handler),
|
||||
void *data __UNUSED__,
|
||||
void (*cb_free)(void *data, void *ev))
|
||||
ecore_con_local_connect(Ecore_Con_Server *svr,
|
||||
Eina_Bool (*cb_done)(void *data,
|
||||
Ecore_Fd_Handler *fd_handler),
|
||||
void *data __UNUSED__,
|
||||
void (*cb_free)(void *data,
|
||||
void *ev))
|
||||
{
|
||||
char buf[4096];
|
||||
struct sockaddr_un socket_unix;
|
||||
|
@ -77,10 +76,10 @@ ecore_con_local_connect(Ecore_Con_Server *svr,
|
|||
{
|
||||
homedir = getenv("HOME");
|
||||
if (!homedir)
|
||||
homedir = getenv("TMP");
|
||||
homedir = getenv("TMP");
|
||||
|
||||
if (!homedir)
|
||||
homedir = "/tmp";
|
||||
homedir = "/tmp";
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s/.ecore/%s/%i", homedir, svr->name,
|
||||
svr->port);
|
||||
|
@ -90,39 +89,39 @@ ecore_con_local_connect(Ecore_Con_Server *svr,
|
|||
if (svr->port < 0)
|
||||
{
|
||||
if (svr->name[0] == '/')
|
||||
strncpy(buf, svr->name, sizeof(buf));
|
||||
strncpy(buf, svr->name, sizeof(buf));
|
||||
else
|
||||
snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s", svr->name);
|
||||
snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s", svr->name);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (svr->name[0] ==
|
||||
'/')
|
||||
snprintf(buf, sizeof(buf), "%s|%i", svr->name,
|
||||
svr->port);
|
||||
snprintf(buf, sizeof(buf), "%s|%i", svr->name,
|
||||
svr->port);
|
||||
else
|
||||
snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s|%i",
|
||||
svr->name,
|
||||
svr->port);
|
||||
snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s|%i",
|
||||
svr->name,
|
||||
svr->port);
|
||||
}
|
||||
}
|
||||
else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
|
||||
strncpy(buf, svr->name,
|
||||
sizeof(buf));
|
||||
strncpy(buf, svr->name,
|
||||
sizeof(buf));
|
||||
|
||||
svr->fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (svr->fd < 0)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&curstate,
|
||||
sizeof(curstate)) < 0)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
socket_unix.sun_family = AF_UNIX;
|
||||
|
||||
|
@ -148,34 +147,34 @@ ecore_con_local_connect(Ecore_Con_Server *svr,
|
|||
|
||||
if (connect(svr->fd, (struct sockaddr *)&socket_unix,
|
||||
socket_unix_len) < 0)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
svr->path = strdup(buf);
|
||||
if (!svr->path)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
if (svr->type & ECORE_CON_SSL)
|
||||
ecore_con_ssl_server_init(svr);
|
||||
ecore_con_ssl_server_init(svr);
|
||||
|
||||
svr->fd_handler =
|
||||
ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
|
||||
cb_done, svr, NULL, NULL);
|
||||
ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
|
||||
cb_done, svr, NULL, NULL);
|
||||
if (!svr->fd_handler)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
if (!svr->delete_me)
|
||||
{
|
||||
/* we got our server! */
|
||||
Ecore_Con_Event_Server_Add *e;
|
||||
Ecore_Con_Event_Server_Add *e;
|
||||
|
||||
e = calloc(1, sizeof(Ecore_Con_Event_Server_Add));
|
||||
if (e)
|
||||
{
|
||||
svr->event_count++;
|
||||
e->server = svr;
|
||||
ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e,
|
||||
cb_free, NULL);
|
||||
}
|
||||
e = calloc(1, sizeof(Ecore_Con_Event_Server_Add));
|
||||
if (e)
|
||||
{
|
||||
svr->event_count++;
|
||||
e->server = svr;
|
||||
ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e,
|
||||
cb_free, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
@ -183,13 +182,13 @@ ecore_con_local_connect(Ecore_Con_Server *svr,
|
|||
|
||||
int
|
||||
ecore_con_local_listen(
|
||||
Ecore_Con_Server *svr,
|
||||
Eina_Bool (*
|
||||
cb_listen)(void *data,
|
||||
Ecore_Fd_Handler *
|
||||
fd_handler),
|
||||
void *data
|
||||
__UNUSED__)
|
||||
Ecore_Con_Server *svr,
|
||||
Eina_Bool (*
|
||||
cb_listen)(void *data,
|
||||
Ecore_Fd_Handler *
|
||||
fd_handler),
|
||||
void *data
|
||||
__UNUSED__)
|
||||
{
|
||||
char buf[4096];
|
||||
struct sockaddr_un socket_unix;
|
||||
|
@ -206,21 +205,21 @@ ecore_con_local_listen(
|
|||
{
|
||||
homedir = getenv("HOME");
|
||||
if (!homedir)
|
||||
homedir = getenv("TMP");
|
||||
homedir = getenv("TMP");
|
||||
|
||||
if (!homedir)
|
||||
homedir = "/tmp";
|
||||
homedir = "/tmp";
|
||||
|
||||
mask = S_IRUSR | S_IWUSR | S_IXUSR;
|
||||
snprintf(buf, sizeof(buf), "%s/.ecore", homedir);
|
||||
if (stat(buf, &st) < 0)
|
||||
mkdir(buf, mask);
|
||||
mkdir(buf, mask);
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s/.ecore/%s", homedir, svr->name);
|
||||
if (stat(buf, &st) < 0)
|
||||
mkdir(buf, mask);
|
||||
mkdir(buf, mask);
|
||||
|
||||
snprintf(buf,
|
||||
snprintf(buf,
|
||||
sizeof(buf),
|
||||
"%s/.ecore/%s/%i",
|
||||
homedir,
|
||||
|
@ -234,45 +233,45 @@ ecore_con_local_listen(
|
|||
if (svr->name[0] == '/')
|
||||
{
|
||||
if (svr->port >= 0)
|
||||
snprintf(buf,
|
||||
sizeof(buf),
|
||||
"%s|%i",
|
||||
svr->name,
|
||||
svr->port);
|
||||
snprintf(buf,
|
||||
sizeof(buf),
|
||||
"%s|%i",
|
||||
svr->name,
|
||||
svr->port);
|
||||
else
|
||||
snprintf(buf,
|
||||
sizeof(buf),
|
||||
"%s",
|
||||
svr->name);
|
||||
snprintf(buf,
|
||||
sizeof(buf),
|
||||
"%s",
|
||||
svr->name);
|
||||
}
|
||||
else
|
||||
snprintf(buf,
|
||||
sizeof(buf),
|
||||
"/tmp/.ecore_service|%s|%i",
|
||||
svr->name,
|
||||
svr->port);
|
||||
snprintf(buf,
|
||||
sizeof(buf),
|
||||
"/tmp/.ecore_service|%s|%i",
|
||||
svr->name,
|
||||
svr->port);
|
||||
}
|
||||
else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
|
||||
strncpy(buf, svr->name,
|
||||
sizeof(buf));
|
||||
strncpy(buf, svr->name,
|
||||
sizeof(buf));
|
||||
|
||||
pmode = umask(mask);
|
||||
start:
|
||||
svr->fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (svr->fd < 0)
|
||||
goto error_umask;
|
||||
goto error_umask;
|
||||
|
||||
if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
|
||||
goto error_umask;
|
||||
goto error_umask;
|
||||
|
||||
if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
|
||||
goto error_umask;
|
||||
goto error_umask;
|
||||
|
||||
lin.l_onoff = 1;
|
||||
lin.l_linger = 0;
|
||||
if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, (const void *)&lin,
|
||||
sizeof(struct linger)) < 0)
|
||||
goto error_umask;
|
||||
goto error_umask;
|
||||
|
||||
socket_unix.sun_family = AF_UNIX;
|
||||
if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
|
||||
|
@ -303,24 +302,24 @@ start:
|
|||
(connect(svr->fd, (struct sockaddr *)&socket_unix,
|
||||
socket_unix_len) < 0) &&
|
||||
(unlink(buf) >= 0))
|
||||
goto start;
|
||||
goto start;
|
||||
else
|
||||
goto error_umask;
|
||||
goto error_umask;
|
||||
}
|
||||
|
||||
if (listen(svr->fd, 4096) < 0)
|
||||
goto error_umask;
|
||||
goto error_umask;
|
||||
|
||||
svr->path = strdup(buf);
|
||||
if (!svr->path)
|
||||
goto error_umask;
|
||||
goto error_umask;
|
||||
|
||||
svr->fd_handler =
|
||||
ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
|
||||
cb_listen, svr, NULL, NULL);
|
||||
ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
|
||||
cb_listen, svr, NULL, NULL);
|
||||
umask(pmode);
|
||||
if (!svr->fd_handler)
|
||||
goto error;
|
||||
goto error;
|
||||
|
||||
return 1;
|
||||
|
||||
|
@ -329,3 +328,4 @@ error_umask:
|
|||
error:
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -64,23 +64,30 @@ int ECORE_CON_EVENT_URL_COMPLETE = 0;
|
|||
int ECORE_CON_EVENT_URL_PROGRESS = 0;
|
||||
|
||||
#ifdef HAVE_CURL
|
||||
static Eina_Bool _ecore_con_url_fd_handler(void *data,
|
||||
static Eina_Bool _ecore_con_url_fd_handler(void *data,
|
||||
Ecore_Fd_Handler *fd_handler);
|
||||
static Eina_Bool _ecore_con_url_perform(Ecore_Con_Url *url_con);
|
||||
static size_t _ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems,
|
||||
void *stream);
|
||||
static size_t _ecore_con_url_data_cb(void *buffer,
|
||||
size_t size,
|
||||
size_t nitems,
|
||||
void *userp);
|
||||
static int _ecore_con_url_progress_cb(void *clientp, double dltotal,
|
||||
double dlnow, double ultotal,
|
||||
double ulnow);
|
||||
static size_t _ecore_con_url_read_cb(void *ptr, size_t size, size_t nitems,
|
||||
void *stream);
|
||||
static void _ecore_con_event_url_free(void *data __UNUSED__, void *ev);
|
||||
static size_t _ecore_con_url_header_cb(void *ptr,
|
||||
size_t size,
|
||||
size_t nitems,
|
||||
void *stream);
|
||||
static size_t _ecore_con_url_data_cb(void *buffer,
|
||||
size_t size,
|
||||
size_t nitems,
|
||||
void *userp);
|
||||
static int _ecore_con_url_progress_cb(void *clientp,
|
||||
double dltotal,
|
||||
double dlnow,
|
||||
double ultotal,
|
||||
double ulnow);
|
||||
static size_t _ecore_con_url_read_cb(void *ptr,
|
||||
size_t size,
|
||||
size_t nitems,
|
||||
void *stream);
|
||||
static void _ecore_con_event_url_free(void *data __UNUSED__,
|
||||
void *ev);
|
||||
static int _ecore_con_url_process_completed_jobs(
|
||||
Ecore_Con_Url *url_con_to_match);
|
||||
Ecore_Con_Url *url_con_to_match);
|
||||
static Eina_Bool _ecore_con_url_idler_handler(void *data);
|
||||
|
||||
static Ecore_Idler *_fd_idler_handler = NULL;
|
||||
|
@ -93,7 +100,7 @@ static Ecore_Timer *_curl_timeout = NULL;
|
|||
typedef struct _Ecore_Con_Url_Event Ecore_Con_Url_Event;
|
||||
struct _Ecore_Con_Url_Event
|
||||
{
|
||||
int type;
|
||||
int type;
|
||||
void *ev;
|
||||
};
|
||||
|
||||
|
@ -110,7 +117,8 @@ _url_complete_idler_cb(void *data)
|
|||
}
|
||||
|
||||
static void
|
||||
_url_complete_push_event(int type, void *ev)
|
||||
_url_complete_push_event(int type,
|
||||
void *ev)
|
||||
{
|
||||
Ecore_Con_Url_Event *lev;
|
||||
|
||||
|
@ -146,7 +154,7 @@ ecore_con_url_init(void)
|
|||
_init_count++;
|
||||
|
||||
if (_init_count > 1)
|
||||
return _init_count;
|
||||
return _init_count;
|
||||
|
||||
if (!ECORE_CON_EVENT_URL_DATA)
|
||||
{
|
||||
|
@ -163,7 +171,7 @@ ecore_con_url_init(void)
|
|||
if (curl_global_init(CURL_GLOBAL_NOTHING))
|
||||
{
|
||||
while (_url_con_list)
|
||||
ecore_con_url_free(eina_list_data_get(_url_con_list));
|
||||
ecore_con_url_free(eina_list_data_get(_url_con_list));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -171,7 +179,7 @@ ecore_con_url_init(void)
|
|||
if (!_curlm)
|
||||
{
|
||||
while (_url_con_list)
|
||||
ecore_con_url_free(eina_list_data_get(_url_con_list));
|
||||
ecore_con_url_free(eina_list_data_get(_url_con_list));
|
||||
|
||||
_init_count--;
|
||||
return 0;
|
||||
|
@ -179,11 +187,11 @@ ecore_con_url_init(void)
|
|||
|
||||
curl_multi_timeout(_curlm, &ms);
|
||||
if (ms <= 0)
|
||||
ms = 1000;
|
||||
ms = 1000;
|
||||
|
||||
_curl_timeout =
|
||||
ecore_timer_add((double)ms / 1000, _ecore_con_url_idler_handler,
|
||||
(void *)0xACE);
|
||||
ecore_timer_add((double)ms / 1000, _ecore_con_url_idler_handler,
|
||||
(void *)0xACE);
|
||||
ecore_timer_freeze(_curl_timeout);
|
||||
}
|
||||
|
||||
|
@ -202,25 +210,25 @@ ecore_con_url_shutdown(void)
|
|||
{
|
||||
#ifdef HAVE_CURL
|
||||
if (!_init_count)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
_init_count--;
|
||||
|
||||
if (_init_count != 0)
|
||||
return _init_count;
|
||||
return _init_count;
|
||||
|
||||
if (_fd_idler_handler)
|
||||
ecore_idler_del(_fd_idler_handler);
|
||||
ecore_idler_del(_fd_idler_handler);
|
||||
|
||||
_fd_idler_handler = NULL;
|
||||
|
||||
if (_curl_timeout)
|
||||
ecore_timer_del(_curl_timeout);
|
||||
ecore_timer_del(_curl_timeout);
|
||||
|
||||
_curl_timeout = NULL;
|
||||
|
||||
while (_url_con_list)
|
||||
ecore_con_url_free(eina_list_data_get(_url_con_list));
|
||||
ecore_con_url_free(eina_list_data_get(_url_con_list));
|
||||
|
||||
if (_curlm)
|
||||
{
|
||||
|
@ -256,11 +264,11 @@ ecore_con_url_new(const char *url)
|
|||
CURLcode ret;
|
||||
|
||||
if (!_init_count)
|
||||
return NULL;
|
||||
return NULL;
|
||||
|
||||
url_con = calloc(1, sizeof(Ecore_Con_Url));
|
||||
if (!url_con)
|
||||
return NULL;
|
||||
return NULL;
|
||||
|
||||
url_con->fd = -1;
|
||||
url_con->write_fd = -1;
|
||||
|
@ -296,18 +304,18 @@ ecore_con_url_new(const char *url)
|
|||
curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION,
|
||||
_ecore_con_url_progress_cb);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSDATA, url_con);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE);
|
||||
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERFUNCTION,
|
||||
_ecore_con_url_header_cb);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERDATA, url_con);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERDATA, url_con);
|
||||
|
||||
/*
|
||||
* FIXME: Check that these timeouts are sensible defaults
|
||||
* FIXME: Provide a means to change these timeouts
|
||||
*/
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_CONNECTTIMEOUT, 30);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEOUT, 300);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEOUT, 300);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1);
|
||||
|
||||
return url_con;
|
||||
|
@ -334,22 +342,23 @@ ecore_con_url_new(const char *url)
|
|||
* @see ecore_con_url_url_set()
|
||||
*/
|
||||
EAPI Ecore_Con_Url *
|
||||
ecore_con_url_custom_new(const char *url, const char *custom_request)
|
||||
ecore_con_url_custom_new(const char *url,
|
||||
const char *custom_request)
|
||||
{
|
||||
#ifdef HAVE_CURL
|
||||
Ecore_Con_Url *url_con;
|
||||
CURLcode ret;
|
||||
|
||||
if (!url)
|
||||
return NULL;
|
||||
return NULL;
|
||||
|
||||
if (!custom_request)
|
||||
return NULL;
|
||||
return NULL;
|
||||
|
||||
url_con = ecore_con_url_new(url);
|
||||
|
||||
if (!url_con)
|
||||
return NULL;
|
||||
return NULL;
|
||||
|
||||
ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST, custom_request);
|
||||
if (ret != CURLE_OK)
|
||||
|
@ -383,7 +392,7 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
|
|||
CURLMcode ret;
|
||||
|
||||
if (!url_con)
|
||||
return;
|
||||
return;
|
||||
|
||||
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
||||
{
|
||||
|
@ -396,7 +405,7 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
|
|||
{
|
||||
FD_CLR(url_con->fd, &_current_fd_set);
|
||||
if (url_con->fd_handler)
|
||||
ecore_main_fd_handler_del(url_con->fd_handler);
|
||||
ecore_main_fd_handler_del(url_con->fd_handler);
|
||||
|
||||
url_con->fd = -1;
|
||||
url_con->fd_handler = NULL;
|
||||
|
@ -406,19 +415,19 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
|
|||
{
|
||||
// FIXME: For an unknown reason, progress continue to arrive after destruction
|
||||
// this prevent any further call to the callback.
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, NULL);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, NULL);
|
||||
|
||||
if (url_con->active)
|
||||
{
|
||||
url_con->active = EINA_FALSE;
|
||||
if (url_con->active)
|
||||
{
|
||||
url_con->active = EINA_FALSE;
|
||||
|
||||
ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
|
||||
if (ret != CURLM_OK)
|
||||
ERR("curl_multi_remove_handle failed: %s",
|
||||
curl_multi_strerror(ret));
|
||||
}
|
||||
ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
|
||||
if (ret != CURLM_OK)
|
||||
ERR("curl_multi_remove_handle failed: %s",
|
||||
curl_multi_strerror(ret));
|
||||
}
|
||||
|
||||
curl_easy_cleanup(url_con->curl_easy);
|
||||
curl_easy_cleanup(url_con->curl_easy);
|
||||
}
|
||||
|
||||
_url_con_list = eina_list_remove(_url_con_list, url_con);
|
||||
|
@ -445,7 +454,8 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
|
|||
*
|
||||
*/
|
||||
EAPI Eina_Bool
|
||||
ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url)
|
||||
ecore_con_url_url_set(Ecore_Con_Url *url_con,
|
||||
const char *url)
|
||||
{
|
||||
#ifdef HAVE_CURL
|
||||
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
||||
|
@ -455,20 +465,20 @@ ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url)
|
|||
}
|
||||
|
||||
if (url_con->active)
|
||||
return EINA_FALSE;
|
||||
return EINA_FALSE;
|
||||
|
||||
if (url_con->url)
|
||||
free(url_con->url);
|
||||
free(url_con->url);
|
||||
|
||||
url_con->url = NULL;
|
||||
if (url)
|
||||
url_con->url = strdup(url);
|
||||
url_con->url = strdup(url);
|
||||
|
||||
if (url_con->url)
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_URL,
|
||||
url_con->url);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_URL,
|
||||
url_con->url);
|
||||
else
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, "");
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, "");
|
||||
|
||||
return EINA_TRUE;
|
||||
#else
|
||||
|
@ -491,7 +501,8 @@ ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url)
|
|||
* @see ecore_con_url_data_get()
|
||||
*/
|
||||
EAPI void
|
||||
ecore_con_url_data_set(Ecore_Con_Url *url_con, void *data)
|
||||
ecore_con_url_data_set(Ecore_Con_Url *url_con,
|
||||
void *data)
|
||||
{
|
||||
#ifdef HAVE_CURL
|
||||
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
||||
|
@ -523,8 +534,9 @@ ecore_con_url_data_set(Ecore_Con_Url *url_con, void *data)
|
|||
* @see ecore_con_url_additional_headers_clear()
|
||||
*/
|
||||
EAPI void
|
||||
ecore_con_url_additional_header_add(Ecore_Con_Url *url_con, const char *key,
|
||||
const char *value)
|
||||
ecore_con_url_additional_header_add(Ecore_Con_Url *url_con,
|
||||
const char *key,
|
||||
const char *value)
|
||||
{
|
||||
#ifdef HAVE_CURL
|
||||
char *tmp;
|
||||
|
@ -538,7 +550,7 @@ ecore_con_url_additional_header_add(Ecore_Con_Url *url_con, const char *key,
|
|||
|
||||
tmp = malloc(strlen(key) + strlen(value) + 3);
|
||||
if (!tmp)
|
||||
return;
|
||||
return;
|
||||
|
||||
sprintf(tmp, "%s: %s", key, value);
|
||||
url_con->additional_headers = eina_list_append(url_con->additional_headers,
|
||||
|
@ -625,8 +637,9 @@ ecore_con_url_data_get(Ecore_Con_Url *url_con)
|
|||
* @sa ecore_con_url_send()
|
||||
*/
|
||||
EAPI void
|
||||
ecore_con_url_time(Ecore_Con_Url *url_con, Ecore_Con_Url_Time condition,
|
||||
double timestamp)
|
||||
ecore_con_url_time(Ecore_Con_Url *url_con,
|
||||
Ecore_Con_Url_Time condition,
|
||||
double timestamp)
|
||||
{
|
||||
#ifdef HAVE_CURL
|
||||
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
||||
|
@ -657,7 +670,8 @@ ecore_con_url_time(Ecore_Con_Url *url_con, Ecore_Con_Url_Time condition,
|
|||
*
|
||||
*/
|
||||
EAPI void
|
||||
ecore_con_url_fd_set(Ecore_Con_Url *url_con, int fd)
|
||||
ecore_con_url_fd_set(Ecore_Con_Url *url_con,
|
||||
int fd)
|
||||
{
|
||||
#ifdef HAVE_CURL
|
||||
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
||||
|
@ -735,8 +749,10 @@ ecore_con_url_response_headers_get(Ecore_Con_Url *url_con)
|
|||
*
|
||||
*/
|
||||
EAPI Eina_Bool
|
||||
ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username,
|
||||
const char *password, Eina_Bool safe)
|
||||
ecore_con_url_httpauth_set(Ecore_Con_Url *url_con,
|
||||
const char *username,
|
||||
const char *password,
|
||||
Eina_Bool safe)
|
||||
{
|
||||
#ifdef HAVE_CURL
|
||||
CURLcode ret;
|
||||
|
@ -752,10 +768,10 @@ ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username,
|
|||
if ((username) && (password))
|
||||
{
|
||||
if (safe)
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH,
|
||||
CURLAUTH_ANYSAFE);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH,
|
||||
CURLAUTH_ANYSAFE);
|
||||
else
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
|
||||
|
||||
ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username);
|
||||
if (ret != CURLE_OK)
|
||||
|
@ -802,8 +818,10 @@ ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username,
|
|||
* @see ecore_con_url_time()
|
||||
*/
|
||||
EAPI Eina_Bool
|
||||
ecore_con_url_send(Ecore_Con_Url *url_con, const void *data, long length,
|
||||
const char *content_type)
|
||||
ecore_con_url_send(Ecore_Con_Url *url_con,
|
||||
const void *data,
|
||||
long length,
|
||||
const char *content_type)
|
||||
{
|
||||
#ifdef HAVE_CURL
|
||||
Eina_List *l;
|
||||
|
@ -817,10 +835,10 @@ ecore_con_url_send(Ecore_Con_Url *url_con, const void *data, long length,
|
|||
}
|
||||
|
||||
if (url_con->active)
|
||||
return EINA_FALSE;
|
||||
return EINA_FALSE;
|
||||
|
||||
if (!url_con->url)
|
||||
return EINA_FALSE;
|
||||
return EINA_FALSE;
|
||||
|
||||
/* Free response headers from previous send() calls */
|
||||
EINA_LIST_FREE(url_con->response_headers, s)
|
||||
|
@ -838,30 +856,30 @@ ecore_con_url_send(Ecore_Con_Url *url_con, const void *data, long length,
|
|||
url_con->headers = curl_slist_append(url_con->headers, tmp);
|
||||
}
|
||||
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDS, data);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDS, data);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDSIZE, length);
|
||||
}
|
||||
|
||||
switch (url_con->time_condition)
|
||||
{
|
||||
case ECORE_CON_URL_TIME_NONE:
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
|
||||
CURL_TIMECOND_NONE);
|
||||
break;
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
|
||||
CURL_TIMECOND_NONE);
|
||||
break;
|
||||
|
||||
case ECORE_CON_URL_TIME_IFMODSINCE:
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
|
||||
CURL_TIMECOND_IFMODSINCE);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE,
|
||||
(long)url_con->timestamp);
|
||||
break;
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
|
||||
CURL_TIMECOND_IFMODSINCE);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE,
|
||||
(long)url_con->timestamp);
|
||||
break;
|
||||
|
||||
case ECORE_CON_URL_TIME_IFUNMODSINCE:
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
|
||||
CURL_TIMECOND_IFUNMODSINCE);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE,
|
||||
(long)url_con->timestamp);
|
||||
break;
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
|
||||
CURL_TIMECOND_IFUNMODSINCE);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE,
|
||||
(long)url_con->timestamp);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Additional headers */
|
||||
|
@ -894,9 +912,11 @@ ecore_con_url_send(Ecore_Con_Url *url_con, const void *data, long length,
|
|||
* and @p pass to directory @p upload_dir
|
||||
*/
|
||||
EAPI Eina_Bool
|
||||
ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename,
|
||||
const char *user, const char *pass,
|
||||
const char *upload_dir)
|
||||
ecore_con_url_ftp_upload(Ecore_Con_Url *url_con,
|
||||
const char *filename,
|
||||
const char *user,
|
||||
const char *pass,
|
||||
const char *upload_dir)
|
||||
{
|
||||
#ifdef HAVE_CURL
|
||||
char url[4096];
|
||||
|
@ -914,15 +934,15 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename,
|
|||
}
|
||||
|
||||
if (url_con->active)
|
||||
return EINA_FALSE;
|
||||
return EINA_FALSE;
|
||||
|
||||
if (!url_con->url)
|
||||
return EINA_FALSE;
|
||||
return EINA_FALSE;
|
||||
|
||||
if (filename)
|
||||
{
|
||||
if (stat(filename, &file_info))
|
||||
return EINA_FALSE;
|
||||
return EINA_FALSE;
|
||||
|
||||
snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass);
|
||||
ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERPWD, userpwd);
|
||||
|
@ -940,7 +960,7 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename,
|
|||
snprintf(url, sizeof(url), "ftp://%s/%s/%s", url_con->url,
|
||||
upload_dir, basename(tmp));
|
||||
else
|
||||
snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url,
|
||||
snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url,
|
||||
basename(tmp));
|
||||
|
||||
if (!ecore_con_url_url_set(url_con, url))
|
||||
|
@ -948,7 +968,7 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename,
|
|||
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_INFILESIZE_LARGE,
|
||||
(curl_off_t)file_info.st_size);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1);
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_READFUNCTION,
|
||||
_ecore_con_url_read_cb);
|
||||
|
||||
|
@ -985,7 +1005,8 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename,
|
|||
* @param verbose Whether or not to enable libcurl's verbose output.
|
||||
*/
|
||||
EAPI void
|
||||
ecore_con_url_verbose_set(Ecore_Con_Url *url_con, Eina_Bool verbose)
|
||||
ecore_con_url_verbose_set(Ecore_Con_Url *url_con,
|
||||
Eina_Bool verbose)
|
||||
{
|
||||
#ifdef HAVE_CURL
|
||||
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
||||
|
@ -996,10 +1017,10 @@ ecore_con_url_verbose_set(Ecore_Con_Url *url_con, Eina_Bool verbose)
|
|||
}
|
||||
|
||||
if (url_con->active)
|
||||
return;
|
||||
return;
|
||||
|
||||
if (!url_con->url)
|
||||
return;
|
||||
return;
|
||||
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, (int)verbose);
|
||||
#else
|
||||
|
@ -1013,7 +1034,8 @@ ecore_con_url_verbose_set(Ecore_Con_Url *url_con, Eina_Bool verbose)
|
|||
* @return FIXME: To be more documented.
|
||||
*/
|
||||
EAPI void
|
||||
ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, Eina_Bool use_epsv)
|
||||
ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con,
|
||||
Eina_Bool use_epsv)
|
||||
{
|
||||
#ifdef HAVE_CURL
|
||||
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
||||
|
@ -1024,10 +1046,10 @@ ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, Eina_Bool use_epsv)
|
|||
}
|
||||
|
||||
if (url_con->active)
|
||||
return;
|
||||
return;
|
||||
|
||||
if (!url_con->url)
|
||||
return;
|
||||
return;
|
||||
|
||||
curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, (int)use_epsv);
|
||||
#endif
|
||||
|
@ -1048,17 +1070,17 @@ _ecore_con_url_suspend_fd_handler(void)
|
|||
int deleted = 0;
|
||||
|
||||
if (!_url_con_list)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
EINA_LIST_FOREACH(_url_con_list, l, url_con)
|
||||
{
|
||||
if (url_con->active && url_con->fd_handler)
|
||||
{
|
||||
ecore_main_fd_handler_del(url_con->fd_handler);
|
||||
url_con->fd_handler = NULL;
|
||||
deleted++;
|
||||
}
|
||||
}
|
||||
{
|
||||
if (url_con->active && url_con->fd_handler)
|
||||
{
|
||||
ecore_main_fd_handler_del(url_con->fd_handler);
|
||||
url_con->fd_handler = NULL;
|
||||
deleted++;
|
||||
}
|
||||
}
|
||||
|
||||
return deleted;
|
||||
}
|
||||
|
@ -1071,25 +1093,28 @@ _ecore_con_url_restart_fd_handler(void)
|
|||
int activated = 0;
|
||||
|
||||
if (!_url_con_list)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
EINA_LIST_FOREACH(_url_con_list, l, url_con)
|
||||
{
|
||||
if (!url_con->fd_handler && url_con->fd != -1)
|
||||
{
|
||||
url_con->fd_handler =
|
||||
ecore_main_fd_handler_add(url_con->fd, url_con->flags,
|
||||
_ecore_con_url_fd_handler,
|
||||
NULL, NULL, NULL);
|
||||
activated++;
|
||||
}
|
||||
}
|
||||
{
|
||||
if (!url_con->fd_handler && url_con->fd != -1)
|
||||
{
|
||||
url_con->fd_handler =
|
||||
ecore_main_fd_handler_add(url_con->fd, url_con->flags,
|
||||
_ecore_con_url_fd_handler,
|
||||
NULL, NULL, NULL);
|
||||
activated++;
|
||||
}
|
||||
}
|
||||
|
||||
return activated;
|
||||
}
|
||||
|
||||
static size_t
|
||||
_ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
|
||||
_ecore_con_url_data_cb(void *buffer,
|
||||
size_t size,
|
||||
size_t nitems,
|
||||
void *userp)
|
||||
{
|
||||
Ecore_Con_Url *url_con;
|
||||
Ecore_Con_Event_Url_Data *e;
|
||||
|
@ -1098,7 +1123,7 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
|
|||
url_con = (Ecore_Con_Url *)userp;
|
||||
|
||||
if (!url_con)
|
||||
return -1;
|
||||
return -1;
|
||||
|
||||
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
||||
{
|
||||
|
@ -1111,14 +1136,14 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
|
|||
if (url_con->write_fd < 0)
|
||||
{
|
||||
e =
|
||||
malloc(sizeof(Ecore_Con_Event_Url_Data) + sizeof(unsigned char) *
|
||||
(real_size - 1));
|
||||
malloc(sizeof(Ecore_Con_Event_Url_Data) + sizeof(unsigned char) *
|
||||
(real_size - 1));
|
||||
if (e)
|
||||
{
|
||||
e->url_con = url_con;
|
||||
e->size = real_size;
|
||||
memcpy(e->data, buffer, real_size);
|
||||
ecore_event_add(ECORE_CON_EVENT_URL_DATA, e,
|
||||
ecore_event_add(ECORE_CON_EVENT_URL_DATA, e,
|
||||
_ecore_con_event_url_free, NULL);
|
||||
}
|
||||
}
|
||||
|
@ -1136,7 +1161,7 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
|
|||
if (count < 0)
|
||||
{
|
||||
if (errno != EAGAIN && errno != EINTR)
|
||||
return -1;
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1149,31 +1174,34 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
|
|||
return real_size;
|
||||
}
|
||||
|
||||
#define ECORE_CON_URL_TRANSMISSION(Transmit, Event, Url_con, Total, Now) \
|
||||
{ \
|
||||
Ecore_Con_Event_Url_Progress *e; \
|
||||
if ((Total != 0) || (Now != 0)) \
|
||||
{ \
|
||||
e = calloc(1, sizeof(Ecore_Con_Event_Url_Progress)); \
|
||||
if (e) \
|
||||
{ \
|
||||
e->url_con = url_con; \
|
||||
e->total = Total; \
|
||||
e->now = Now; \
|
||||
ecore_event_add(Event, e, _ecore_con_event_url_free, NULL); \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
#define ECORE_CON_URL_TRANSMISSION(Transmit, Event, Url_con, Total, Now) \
|
||||
{ \
|
||||
Ecore_Con_Event_Url_Progress *e; \
|
||||
if ((Total != 0) || (Now != 0)) \
|
||||
{ \
|
||||
e = calloc(1, sizeof(Ecore_Con_Event_Url_Progress)); \
|
||||
if (e) \
|
||||
{ \
|
||||
e->url_con = url_con; \
|
||||
e->total = Total; \
|
||||
e->now = Now; \
|
||||
ecore_event_add(Event, e, _ecore_con_event_url_free, NULL); \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
static size_t
|
||||
_ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems, void *stream)
|
||||
_ecore_con_url_header_cb(void *ptr,
|
||||
size_t size,
|
||||
size_t nitems,
|
||||
void *stream)
|
||||
{
|
||||
size_t real_size = size * nitems;
|
||||
Ecore_Con_Url *url_con = stream;
|
||||
|
||||
char *header = malloc(sizeof(char) * (real_size + 1));
|
||||
if (!header)
|
||||
return real_size;
|
||||
return real_size;
|
||||
|
||||
memcpy(header, ptr, real_size);
|
||||
header[real_size] = '\0';
|
||||
|
@ -1185,7 +1213,9 @@ _ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems, void *stream)
|
|||
}
|
||||
|
||||
static int
|
||||
_ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow,
|
||||
_ecore_con_url_progress_cb(void *clientp,
|
||||
double dltotal,
|
||||
double dlnow,
|
||||
double ultotal,
|
||||
double ulnow)
|
||||
{
|
||||
|
@ -1210,7 +1240,10 @@ _ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow,
|
|||
}
|
||||
|
||||
static size_t
|
||||
_ecore_con_url_read_cb(void *ptr, size_t size, size_t nitems, void *stream)
|
||||
_ecore_con_url_read_cb(void *ptr,
|
||||
size_t size,
|
||||
size_t nitems,
|
||||
void *stream)
|
||||
{
|
||||
size_t retcode = fread(ptr, size, nitems, stream);
|
||||
|
||||
|
@ -1250,7 +1283,7 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
|
|||
if (!completed_immediately)
|
||||
{
|
||||
if (url_con->fd_handler)
|
||||
ecore_main_fd_handler_del(url_con->fd_handler);
|
||||
ecore_main_fd_handler_del(url_con->fd_handler);
|
||||
|
||||
url_con->fd_handler = NULL;
|
||||
|
||||
|
@ -1274,13 +1307,13 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
|
|||
{
|
||||
flags = 0;
|
||||
if (FD_ISSET(fd, &read_set))
|
||||
flags |= ECORE_FD_READ;
|
||||
flags |= ECORE_FD_READ;
|
||||
|
||||
if (FD_ISSET(fd, &write_set))
|
||||
flags |= ECORE_FD_WRITE;
|
||||
flags |= ECORE_FD_WRITE;
|
||||
|
||||
if (FD_ISSET(fd, &exc_set))
|
||||
flags |= ECORE_FD_ERROR;
|
||||
flags |= ECORE_FD_ERROR;
|
||||
|
||||
if (flags)
|
||||
{
|
||||
|
@ -1292,15 +1325,15 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
|
|||
curl_multi_strerror(ret));
|
||||
|
||||
if (ms == 0)
|
||||
ms = 1000;
|
||||
ms = 1000;
|
||||
|
||||
FD_SET(fd, &_current_fd_set);
|
||||
url_con->fd = fd;
|
||||
url_con->flags = flags;
|
||||
url_con->fd_handler =
|
||||
ecore_main_fd_handler_add(fd, flags,
|
||||
_ecore_con_url_fd_handler,
|
||||
NULL, NULL, NULL);
|
||||
ecore_main_fd_handler_add(fd, flags,
|
||||
_ecore_con_url_fd_handler,
|
||||
NULL, NULL, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1308,16 +1341,16 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
|
|||
if (!url_con->fd_handler)
|
||||
{
|
||||
/* Failed to set up an fd_handler */
|
||||
ecore_timer_freeze(_curl_timeout);
|
||||
ecore_timer_freeze(_curl_timeout);
|
||||
|
||||
ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
|
||||
if (ret != CURLM_OK)
|
||||
ERR("curl_multi_remove_handle failed: %s",
|
||||
curl_multi_strerror(ret));
|
||||
ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
|
||||
if (ret != CURLM_OK)
|
||||
ERR("curl_multi_remove_handle failed: %s",
|
||||
curl_multi_strerror(ret));
|
||||
|
||||
url_con->active = EINA_FALSE;
|
||||
url_con->fd = -1;
|
||||
return EINA_FALSE;
|
||||
url_con->active = EINA_FALSE;
|
||||
url_con->fd = -1;
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
ecore_timer_thaw(_curl_timeout);
|
||||
|
@ -1334,12 +1367,12 @@ _ecore_con_url_idler_handler(void *data)
|
|||
|
||||
start = ecore_time_get();
|
||||
while (curl_multi_perform(_curlm, &still_running) == CURLM_CALL_MULTI_PERFORM)
|
||||
/* make this not more than a frametime to keep interactivity high */
|
||||
if ((ecore_time_get() - start) > ecore_animator_frametime_get())
|
||||
{
|
||||
done = 0;
|
||||
break;
|
||||
}
|
||||
/* make this not more than a frametime to keep interactivity high */
|
||||
if ((ecore_time_get() - start) > ecore_animator_frametime_get())
|
||||
{
|
||||
done = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
_ecore_con_url_process_completed_jobs(NULL);
|
||||
|
||||
|
@ -1349,7 +1382,7 @@ _ecore_con_url_idler_handler(void *data)
|
|||
_fd_idler_handler = NULL;
|
||||
|
||||
if (!_url_con_list)
|
||||
ecore_timer_freeze(_curl_timeout);
|
||||
ecore_timer_freeze(_curl_timeout);
|
||||
|
||||
return data ==
|
||||
(void *)0xACE ? ECORE_CALLBACK_RENEW : ECORE_CALLBACK_CANCEL;
|
||||
|
@ -1359,14 +1392,14 @@ _ecore_con_url_idler_handler(void *data)
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
_ecore_con_url_fd_handler(void *data __UNUSED__,
|
||||
_ecore_con_url_fd_handler(void *data __UNUSED__,
|
||||
Ecore_Fd_Handler *fd_handler __UNUSED__)
|
||||
{
|
||||
_ecore_con_url_suspend_fd_handler();
|
||||
|
||||
if (!_fd_idler_handler)
|
||||
_fd_idler_handler = ecore_idler_add(
|
||||
_ecore_con_url_idler_handler, NULL);
|
||||
_fd_idler_handler = ecore_idler_add(
|
||||
_ecore_con_url_idler_handler, NULL);
|
||||
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
@ -1386,64 +1419,65 @@ _ecore_con_url_process_completed_jobs(Ecore_Con_Url *url_con_to_match)
|
|||
while ((curlmsg = curl_multi_info_read(_curlm, &n_remaining)))
|
||||
{
|
||||
if (curlmsg->msg != CURLMSG_DONE)
|
||||
continue;
|
||||
continue;
|
||||
|
||||
/* find the job which is done */
|
||||
EINA_LIST_FOREACH(_url_con_list, l, url_con)
|
||||
{
|
||||
if (curlmsg->easy_handle == url_con->curl_easy)
|
||||
{
|
||||
if (url_con_to_match &&
|
||||
(url_con == url_con_to_match))
|
||||
job_matched = 1;
|
||||
{
|
||||
if (curlmsg->easy_handle == url_con->curl_easy)
|
||||
{
|
||||
if (url_con_to_match &&
|
||||
(url_con == url_con_to_match))
|
||||
job_matched = 1;
|
||||
|
||||
if(url_con->fd != -1)
|
||||
{
|
||||
FD_CLR(url_con->fd, &_current_fd_set);
|
||||
if (url_con->fd_handler)
|
||||
ecore_main_fd_handler_del(
|
||||
if(url_con->fd != -1)
|
||||
{
|
||||
FD_CLR(url_con->fd, &_current_fd_set);
|
||||
if (url_con->fd_handler)
|
||||
ecore_main_fd_handler_del(
|
||||
url_con->fd_handler);
|
||||
|
||||
url_con->fd = -1;
|
||||
url_con->fd_handler = NULL;
|
||||
}
|
||||
url_con->fd = -1;
|
||||
url_con->fd_handler = NULL;
|
||||
}
|
||||
|
||||
_url_con_list = eina_list_remove(_url_con_list, url_con);
|
||||
url_con->active = EINA_FALSE;
|
||||
e = calloc(1, sizeof(Ecore_Con_Event_Url_Complete));
|
||||
if (e)
|
||||
{
|
||||
e->url_con = url_con;
|
||||
e->status = 0;
|
||||
if (curlmsg->data.result == CURLE_OK)
|
||||
{
|
||||
long status; /* curl API uses long, not int */
|
||||
_url_con_list = eina_list_remove(_url_con_list, url_con);
|
||||
url_con->active = EINA_FALSE;
|
||||
e = calloc(1, sizeof(Ecore_Con_Event_Url_Complete));
|
||||
if (e)
|
||||
{
|
||||
e->url_con = url_con;
|
||||
e->status = 0;
|
||||
if (curlmsg->data.result == CURLE_OK)
|
||||
{
|
||||
long status; /* curl API uses long, not int */
|
||||
|
||||
status = 0;
|
||||
curl_easy_getinfo(curlmsg->easy_handle,
|
||||
CURLINFO_RESPONSE_CODE,
|
||||
&status);
|
||||
e->status = status;
|
||||
}
|
||||
status = 0;
|
||||
curl_easy_getinfo(curlmsg->easy_handle,
|
||||
CURLINFO_RESPONSE_CODE,
|
||||
&status);
|
||||
e->status = status;
|
||||
}
|
||||
|
||||
_url_complete_push_event(ECORE_CON_EVENT_URL_COMPLETE, e);
|
||||
}
|
||||
_url_complete_push_event(ECORE_CON_EVENT_URL_COMPLETE, e);
|
||||
}
|
||||
|
||||
ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
|
||||
if (ret != CURLM_OK)
|
||||
ERR("curl_multi_remove_handle failed: %s",
|
||||
curl_multi_strerror(ret));
|
||||
ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
|
||||
if (ret != CURLM_OK)
|
||||
ERR("curl_multi_remove_handle failed: %s",
|
||||
curl_multi_strerror(ret));
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return job_matched;
|
||||
}
|
||||
|
||||
static void
|
||||
_ecore_con_event_url_free(void *data __UNUSED__, void *ev)
|
||||
_ecore_con_event_url_free(void *data __UNUSED__,
|
||||
void *ev)
|
||||
{
|
||||
free(ev);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue