reformat using ecrustify because uncrustify dicked it up previously

SVN revision: 54128
This commit is contained in:
Mike Blumenkrantz 2010-11-03 17:58:37 +00:00
parent 64aa07c793
commit ddd151bf37
6 changed files with 1149 additions and 1030 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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

View File

@ -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);
}