More cleanup and export a replacement for ecore_con_dns_lookup.
SVN revision: 36497
This commit is contained in:
parent
2455961732
commit
f3ace08723
|
@ -44,15 +44,15 @@
|
|||
* There are two main objects in the @c Ecore_Con library: the @c
|
||||
* Ecore_Con_Server and the @c Ecore_Con_Client.
|
||||
*
|
||||
* The @c Ecore_Con_Server represents a server that can be connected to.
|
||||
* It is used regardless of whether the program is acting as a server or
|
||||
* The @c Ecore_Con_Server represents a server that can be connected to.
|
||||
* It is used regardless of whether the program is acting as a server or
|
||||
* client itself.
|
||||
*
|
||||
* To create a listening server, call @c ecore_con_server_add().
|
||||
*
|
||||
* To connect to a server, call @c ecore_con_server_connect(). Data can
|
||||
* then be sent to the server using the @c ecore_con_server_send().
|
||||
*
|
||||
*
|
||||
* Whenever a client connection is made to an @c Ecore_Con_Server, a
|
||||
* @c ECORE_CON_CLIENT_ADD event is emitted. Any event callbacks that are
|
||||
* called receive a @c Ecore_Con_Client object, which represents a
|
||||
|
@ -68,11 +68,13 @@
|
|||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct _Ecore_Con_Server Ecore_Con_Server; /**< A connection handle */
|
||||
typedef struct _Ecore_Con_Client Ecore_Con_Client; /**< A connection handle */
|
||||
typedef struct _Ecore_Con_Url Ecore_Con_Url;
|
||||
typedef struct _Ecore_Con_Netinfo Ecore_Con_Netinfo;
|
||||
typedef struct _Ecore_Con_Info Ecore_Con_Info;
|
||||
|
||||
typedef void (*Ecore_Con_Info_Cb)(void *data, Ecore_Con_Info *infos);
|
||||
|
||||
typedef enum _Ecore_Con_Type
|
||||
{
|
||||
|
@ -126,28 +128,28 @@ extern "C" {
|
|||
{
|
||||
Ecore_Con_Server *server;
|
||||
};
|
||||
|
||||
|
||||
struct _Ecore_Con_Event_Client_Data
|
||||
{
|
||||
Ecore_Con_Client *client;
|
||||
void *data;
|
||||
int size;
|
||||
};
|
||||
|
||||
|
||||
struct _Ecore_Con_Event_Server_Data
|
||||
{
|
||||
Ecore_Con_Server *server;
|
||||
void *data;
|
||||
int size;
|
||||
};
|
||||
|
||||
|
||||
struct _Ecore_Con_Event_Url_Data
|
||||
{
|
||||
Ecore_Con_Url *url_con;
|
||||
int size;
|
||||
unsigned char data[1];
|
||||
};
|
||||
|
||||
|
||||
struct _Ecore_Con_Event_Url_Complete
|
||||
{
|
||||
Ecore_Con_Url *url_con;
|
||||
|
@ -176,12 +178,12 @@ extern "C" {
|
|||
EAPI extern int ECORE_CON_EVENT_URL_DATA;
|
||||
EAPI extern int ECORE_CON_EVENT_URL_COMPLETE;
|
||||
EAPI extern int ECORE_CON_EVENT_URL_PROGRESS;
|
||||
|
||||
|
||||
EAPI int ecore_con_init(void);
|
||||
EAPI int ecore_con_shutdown(void);
|
||||
|
||||
|
||||
EAPI Ecore_Con_Server *ecore_con_server_add(Ecore_Con_Type type, const char *name, int port, const void *data);
|
||||
|
||||
|
||||
EAPI Ecore_Con_Server *ecore_con_server_connect(Ecore_Con_Type type, const char *name, int port, const void *data);
|
||||
EAPI void *ecore_con_server_del(Ecore_Con_Server *svr);
|
||||
EAPI void *ecore_con_server_data_get(Ecore_Con_Server *svr);
|
||||
|
@ -191,7 +193,7 @@ extern "C" {
|
|||
EAPI void ecore_con_server_client_limit_set(Ecore_Con_Server *svr, int client_limit, char reject_excess_clients);
|
||||
EAPI char *ecore_con_server_ip_get(Ecore_Con_Server *svr);
|
||||
EAPI void ecore_con_server_flush(Ecore_Con_Server *svr);
|
||||
|
||||
|
||||
EAPI int ecore_con_client_send(Ecore_Con_Client *cl, const void *data, int size);
|
||||
EAPI Ecore_Con_Server *ecore_con_client_server_get(Ecore_Con_Client *cl);
|
||||
EAPI void *ecore_con_client_del(Ecore_Con_Client *cl);
|
||||
|
@ -199,7 +201,7 @@ extern "C" {
|
|||
EAPI void *ecore_con_client_data_get(Ecore_Con_Client *cl);
|
||||
EAPI char *ecore_con_client_ip_get(Ecore_Con_Client *cl);
|
||||
EAPI void ecore_con_client_flush(Ecore_Con_Client *cl);
|
||||
|
||||
|
||||
EAPI int ecore_con_ssl_available_get(void);
|
||||
|
||||
EAPI int ecore_con_url_init(void);
|
||||
|
@ -219,7 +221,8 @@ extern "C" {
|
|||
void (*done_cb)(void *data, struct hostent *hostent),
|
||||
void *data);
|
||||
#endif
|
||||
|
||||
EAPI int ecore_con_info_get(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, void *data, struct addrinfo *hints);
|
||||
|
||||
EAPI int ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, char *filename, char *user, char *pass, char *upload_dir);
|
||||
EAPI void ecore_con_url_verbose_set(Ecore_Con_Url *url_con, int verbose);
|
||||
EAPI void ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, int use_epsv);
|
||||
|
|
|
@ -26,10 +26,10 @@
|
|||
# include <winsock2.h>
|
||||
#endif
|
||||
|
||||
static void _ecore_con_cb_tcp_connect(void *data, Ecore_Con_Netinfo *info);
|
||||
static void _ecore_con_cb_udp_connect(void *data, Ecore_Con_Netinfo *info);
|
||||
static void _ecore_con_cb_tcp_listen(void *data, Ecore_Con_Netinfo *info);
|
||||
static void _ecore_con_cb_udp_listen(void *data, Ecore_Con_Netinfo *info);
|
||||
static void _ecore_con_cb_tcp_connect(void *data, Ecore_Con_Info *info);
|
||||
static void _ecore_con_cb_udp_connect(void *data, Ecore_Con_Info *info);
|
||||
static void _ecore_con_cb_tcp_listen(void *data, Ecore_Con_Info *info);
|
||||
static void _ecore_con_cb_udp_listen(void *data, Ecore_Con_Info *info);
|
||||
|
||||
static void _ecore_con_server_free(Ecore_Con_Server *svr);
|
||||
static void _ecore_con_client_free(Ecore_Con_Client *cl);
|
||||
|
@ -185,6 +185,7 @@ ecore_con_server_add(Ecore_Con_Type compl_type, const char *name, int port,
|
|||
struct sockaddr_un socket_unix;
|
||||
struct linger lin;
|
||||
char buf[4096];
|
||||
mode_t pmode;
|
||||
|
||||
if (port < 0) return NULL;
|
||||
/* local user socket: FILE: ~/.ecore/[name]/[port] */
|
||||
|
@ -215,7 +216,7 @@ ecore_con_server_add(Ecore_Con_Type compl_type, const char *name, int port,
|
|||
{
|
||||
const char *homedir;
|
||||
struct stat st;
|
||||
mode_t pmode, mask;
|
||||
mode_t mask;
|
||||
int socket_unix_len;
|
||||
|
||||
if (!name) goto error;
|
||||
|
@ -252,28 +253,12 @@ ecore_con_server_add(Ecore_Con_Type compl_type, const char *name, int port,
|
|||
pmode = umask(mask);
|
||||
start:
|
||||
svr->fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (svr->fd < 0)
|
||||
{
|
||||
umask(pmode);
|
||||
goto error;
|
||||
}
|
||||
if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
|
||||
{
|
||||
umask(pmode);
|
||||
goto error;
|
||||
}
|
||||
if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
|
||||
{
|
||||
umask(pmode);
|
||||
goto error;
|
||||
}
|
||||
if (svr->fd < 0) goto error_umask;
|
||||
if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) goto error_umask;
|
||||
if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) goto error_umask;
|
||||
lin.l_onoff = 1;
|
||||
lin.l_linger = 0;
|
||||
if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, &lin, sizeof(struct linger)) < 0)
|
||||
{
|
||||
umask(pmode);
|
||||
goto error;
|
||||
}
|
||||
if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, &lin, sizeof(struct linger)) < 0) goto error_umask;
|
||||
socket_unix.sun_family = AF_UNIX;
|
||||
if (type == ECORE_CON_LOCAL_ABSTRACT)
|
||||
{
|
||||
|
@ -285,8 +270,7 @@ ecore_con_server_add(Ecore_Con_Type compl_type, const char *name, int port,
|
|||
socket_unix_len = LENGTH_OF_ABSTRACT_SOCKADDR_UN(&socket_unix, name);
|
||||
#else
|
||||
fprintf(stderr, "Your system does not support abstract sockets!\n");
|
||||
umask(pmode);
|
||||
goto error;
|
||||
goto error_umask;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
|
@ -303,36 +287,19 @@ ecore_con_server_add(Ecore_Con_Type compl_type, const char *name, int port,
|
|||
(type == ECORE_CON_LOCAL_SYSTEM))
|
||||
{
|
||||
if (unlink(buf) < 0)
|
||||
{
|
||||
umask(pmode);
|
||||
goto error;
|
||||
}
|
||||
goto error_umask;
|
||||
else
|
||||
goto start;
|
||||
}
|
||||
else
|
||||
{
|
||||
umask(pmode);
|
||||
goto error;
|
||||
}
|
||||
goto error_umask;
|
||||
}
|
||||
else
|
||||
{
|
||||
umask(pmode);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
if (listen(svr->fd, 4096) < 0)
|
||||
{
|
||||
umask(pmode);
|
||||
goto error;
|
||||
goto error_umask;
|
||||
}
|
||||
if (listen(svr->fd, 4096) < 0) goto error_umask;
|
||||
svr->path = strdup(buf);
|
||||
if (!svr->path)
|
||||
{
|
||||
umask(pmode);
|
||||
goto error;
|
||||
}
|
||||
if (!svr->path) goto error_umask;
|
||||
svr->fd_handler =
|
||||
ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
|
||||
_ecore_con_svr_handler, svr, NULL, NULL);
|
||||
|
@ -355,6 +322,8 @@ ecore_con_server_add(Ecore_Con_Type compl_type, const char *name, int port,
|
|||
|
||||
return svr;
|
||||
|
||||
error_umask:
|
||||
umask(pmode);
|
||||
error:
|
||||
if (svr->name) free(svr->name);
|
||||
if (svr->path) free(svr->path);
|
||||
|
@ -1127,7 +1096,7 @@ kill_server(Ecore_Con_Server *svr)
|
|||
}
|
||||
|
||||
static void
|
||||
_ecore_con_cb_tcp_listen(void *data, Ecore_Con_Netinfo *net_info)
|
||||
_ecore_con_cb_tcp_listen(void *data, Ecore_Con_Info *net_info)
|
||||
{
|
||||
Ecore_Con_Server *svr;
|
||||
struct linger lin;
|
||||
|
@ -1161,7 +1130,7 @@ _ecore_con_cb_tcp_listen(void *data, Ecore_Con_Netinfo *net_info)
|
|||
}
|
||||
|
||||
static void
|
||||
_ecore_con_cb_udp_listen(void *data, Ecore_Con_Netinfo *net_info)
|
||||
_ecore_con_cb_udp_listen(void *data, Ecore_Con_Info *net_info)
|
||||
{
|
||||
Ecore_Con_Server *svr;
|
||||
Ecore_Con_Type type;
|
||||
|
@ -1215,7 +1184,7 @@ _ecore_con_cb_udp_listen(void *data, Ecore_Con_Netinfo *net_info)
|
|||
}
|
||||
|
||||
static void
|
||||
_ecore_con_cb_tcp_connect(void *data, Ecore_Con_Netinfo *net_info)
|
||||
_ecore_con_cb_tcp_connect(void *data, Ecore_Con_Info *net_info)
|
||||
{
|
||||
Ecore_Con_Server *svr;
|
||||
struct sockaddr_in socket_addr;
|
||||
|
@ -1259,7 +1228,7 @@ _ecore_con_cb_tcp_connect(void *data, Ecore_Con_Netinfo *net_info)
|
|||
}
|
||||
|
||||
static void
|
||||
_ecore_con_cb_udp_connect(void *data, Ecore_Con_Netinfo *net_info)
|
||||
_ecore_con_cb_udp_connect(void *data, Ecore_Con_Info *net_info)
|
||||
{
|
||||
Ecore_Con_Server *svr;
|
||||
struct sockaddr_in socket_addr;
|
||||
|
|
|
@ -20,12 +20,10 @@
|
|||
|
||||
typedef struct _CB_Data CB_Data;
|
||||
|
||||
typedef void (*CB_Func)(void *data, Ecore_Con_Netinfo *infos);
|
||||
|
||||
struct _CB_Data
|
||||
{
|
||||
Ecore_List2 __list_data;
|
||||
CB_Func cb_done;
|
||||
Ecore_Con_Info_Cb cb_done;
|
||||
void *data;
|
||||
Ecore_Fd_Handler *fdh;
|
||||
pid_t pid;
|
||||
|
@ -34,7 +32,6 @@ struct _CB_Data
|
|||
};
|
||||
|
||||
|
||||
static int _ecore_con_info_get(Ecore_Con_Server *svr, CB_Func done_cb, void *data);
|
||||
static void _ecore_con_info_readdata(CB_Data *cbdata);
|
||||
static void _ecore_con_info_slave_free(CB_Data *cbdata);
|
||||
static int _ecore_con_info_data_handler(void *data, Ecore_Fd_Handler *fd_handler);
|
||||
|
@ -42,16 +39,15 @@ static int _ecore_con_info_exit_handler(void *data, int type __UNUSED__, void *e
|
|||
|
||||
static int info_init = 0;
|
||||
static Ecore_List2 *info_slaves = NULL;
|
||||
static struct addrinfo hints;
|
||||
|
||||
int
|
||||
EAPI int
|
||||
ecore_con_info_init(void)
|
||||
{
|
||||
info_init++;
|
||||
return info_init;
|
||||
}
|
||||
|
||||
int
|
||||
EAPI int
|
||||
ecore_con_info_shutdown(void)
|
||||
{
|
||||
info_init--;
|
||||
|
@ -62,11 +58,13 @@ ecore_con_info_shutdown(void)
|
|||
return info_init;
|
||||
}
|
||||
|
||||
int
|
||||
EAPI int
|
||||
ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
|
||||
CB_Func done_cb,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
memset(&hints, 0, sizeof(struct addrinfo));
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
|
@ -76,14 +74,16 @@ ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
|
|||
hints.ai_next = NULL;
|
||||
hints.ai_addr = NULL;
|
||||
|
||||
return _ecore_con_info_get(svr, done_cb, data);
|
||||
return ecore_con_info_get(svr, done_cb, data, &hints);
|
||||
}
|
||||
|
||||
int
|
||||
EAPI int
|
||||
ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
|
||||
CB_Func done_cb,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
memset(&hints, 0, sizeof(struct addrinfo));
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
|
@ -93,14 +93,16 @@ ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
|
|||
hints.ai_next = NULL;
|
||||
hints.ai_addr = NULL;
|
||||
|
||||
return _ecore_con_info_get(svr, done_cb, data);
|
||||
return ecore_con_info_get(svr, done_cb, data, &hints);
|
||||
}
|
||||
|
||||
int
|
||||
EAPI int
|
||||
ecore_con_info_udp_connect(Ecore_Con_Server *svr,
|
||||
CB_Func done_cb,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
memset(&hints, 0, sizeof(struct addrinfo));
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_DGRAM;
|
||||
|
@ -110,14 +112,16 @@ ecore_con_info_udp_connect(Ecore_Con_Server *svr,
|
|||
hints.ai_next = NULL;
|
||||
hints.ai_addr = NULL;
|
||||
|
||||
return _ecore_con_info_get(svr, done_cb, data);
|
||||
return ecore_con_info_get(svr, done_cb, data, &hints);
|
||||
}
|
||||
|
||||
int
|
||||
EAPI int
|
||||
ecore_con_info_udp_listen(Ecore_Con_Server *svr,
|
||||
CB_Func done_cb,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
memset(&hints, 0, sizeof(struct addrinfo));
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_DGRAM;
|
||||
|
@ -127,14 +131,16 @@ ecore_con_info_udp_listen(Ecore_Con_Server *svr,
|
|||
hints.ai_next = NULL;
|
||||
hints.ai_addr = NULL;
|
||||
|
||||
return _ecore_con_info_get(svr, done_cb, data);
|
||||
return ecore_con_info_get(svr, done_cb, data, &hints);
|
||||
}
|
||||
|
||||
int
|
||||
ecore_con_pre_mcast_listen(Ecore_Con_Server *svr,
|
||||
CB_Func done_cb,
|
||||
EAPI int
|
||||
ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
memset(&hints, 0, sizeof(struct addrinfo));
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_DGRAM;
|
||||
|
@ -144,13 +150,14 @@ ecore_con_pre_mcast_listen(Ecore_Con_Server *svr,
|
|||
hints.ai_next = NULL;
|
||||
hints.ai_addr = NULL;
|
||||
|
||||
return _ecore_con_info_get(svr, done_cb, data);
|
||||
return ecore_con_info_get(svr, done_cb, data, &hints);
|
||||
}
|
||||
|
||||
static int
|
||||
_ecore_con_info_get(Ecore_Con_Server *svr,
|
||||
CB_Func done_cb,
|
||||
void *data)
|
||||
EAPI int
|
||||
ecore_con_info_get(Ecore_Con_Server *svr,
|
||||
Ecore_Con_Info_Cb done_cb,
|
||||
void *data,
|
||||
struct addrinfo *hints)
|
||||
{
|
||||
CB_Data *cbdata;
|
||||
int fd[2];
|
||||
|
@ -179,7 +186,7 @@ _ecore_con_info_get(Ecore_Con_Server *svr,
|
|||
|
||||
if ((cbdata->pid = fork()) == 0)
|
||||
{
|
||||
Ecore_Con_Netinfo container;
|
||||
Ecore_Con_Info container;
|
||||
struct addrinfo *result;
|
||||
char service[NI_MAXSERV];
|
||||
char hbuf[NI_MAXHOST];
|
||||
|
@ -203,7 +210,7 @@ _ecore_con_info_get(Ecore_Con_Server *svr,
|
|||
memcpy(container.ip, hbuf, sizeof(container.ip));
|
||||
memcpy(container.service, sbuf, sizeof(container.service));
|
||||
}
|
||||
write(fd[1], &container, sizeof(Ecore_Con_Netinfo));
|
||||
write(fd[1], &container, sizeof(Ecore_Con_Info));
|
||||
}
|
||||
else
|
||||
write(fd[1], "", 1);
|
||||
|
@ -232,12 +239,12 @@ _ecore_con_info_get(Ecore_Con_Server *svr,
|
|||
static void
|
||||
_ecore_con_info_readdata(CB_Data *cbdata)
|
||||
{
|
||||
Ecore_Con_Netinfo container;
|
||||
Ecore_Con_Info container;
|
||||
ssize_t size;
|
||||
|
||||
size = read(ecore_main_fd_handler_fd_get(cbdata->fdh), &container,
|
||||
sizeof(Ecore_Con_Netinfo));
|
||||
if (size == sizeof(Ecore_Con_Netinfo))
|
||||
sizeof(Ecore_Con_Info));
|
||||
if (size == sizeof(Ecore_Con_Info))
|
||||
{
|
||||
container.info.ai_addr = &container.addr;
|
||||
cbdata->cb_done(cbdata->data, &container);
|
||||
|
|
|
@ -95,7 +95,7 @@ struct _Ecore_Con_Url
|
|||
};
|
||||
#endif
|
||||
|
||||
struct _Ecore_Con_Netinfo
|
||||
struct _Ecore_Con_Info
|
||||
{
|
||||
struct addrinfo info;
|
||||
struct sockaddr addr;
|
||||
|
|
Loading…
Reference in New Issue