#include "Transport/transport_private.h"
-
GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(transport,GRAS);
static gras_dict_t *_gras_trp_plugins; /* All registered plugins */
gras_dynar_t *_gras_trp_sockets; /* all existing sockets */
static void gras_trp_socket_free(void *s); /* free one socket */
-static fd_set FDread;
+gras_error_t
+gras_trp_plugin_new(const char *name, gras_trp_setup_t setup);
+
+gras_error_t
+gras_trp_plugin_new(const char *name, gras_trp_setup_t setup) {
+ gras_error_t errcode;
+
+ gras_trp_plugin_t *plug = malloc(sizeof(gras_trp_plugin_t));
+
+ DEBUG1("Create plugin %s",name);
+
+ if (!plug)
+ RAISE_MALLOC;
+
+ memset(plug,0,sizeof(gras_trp_plugin_t));
+
+ plug->name=strdup(name);
+ if (!plug->name)
+ RAISE_MALLOC;
+
+ errcode = setup(plug);
+ switch (errcode) {
+ case mismatch_error:
+ /* SG plugin return mismatch when in RL mode (and vice versa) */
+ free(plug->name);
+ free(plug);
+ break;
+
+ case no_error:
+ TRY(gras_dict_set(_gras_trp_plugins,
+ name, plug, gras_trp_plugin_free));
+ break;
+
+ default:
+ free(plug);
+ return errcode;
+ }
+ return no_error;
+}
gras_error_t
gras_trp_init(void){
gras_error_t errcode;
- gras_trp_plugin_t *plug;
/* make room for all socket ownership descriptions */
TRY(gras_dynar_new(&_gras_trp_sockets, sizeof(gras_socket_t*), NULL));
- /* We do not ear for any socket for now */
- FD_ZERO(&FDread);
-
/* make room for all plugins */
TRY(gras_dict_new(&_gras_trp_plugins));
- /* TCP */
- TRY(gras_trp_tcp_init(&plug));
- TRY(gras_dict_set(_gras_trp_plugins,
- plug->name, plug, gras_trp_plugin_free));
-
- /* FILE */
- TRY(gras_trp_file_init(&plug));
- TRY(gras_dict_set(_gras_trp_plugins,
- plug->name, plug, gras_trp_plugin_free));
+ /* Add them */
+ TRY(gras_trp_plugin_new("tcp", gras_trp_tcp_setup));
+ TRY(gras_trp_plugin_new("file",gras_trp_file_setup));
+ TRY(gras_trp_plugin_new("sg",gras_trp_sg_setup));
return no_error;
}
gras_trp_plugin_t *plug = p;
if (plug) {
- if (plug->free_specific && plug->specific)
- plug->free_specific(plug->specific);
+ if (plug->exit) {
+ plug->exit(plug);
+ } else if (plug->data) {
+ DEBUG1("Plugin %s lacks exit(). Free data anyway.",plug->name);
+ free(plug->data);
+ }
free(plug->name);
free(plug);
sock->plugin = NULL;
sock->sd = -1;
- sock->incoming = incoming? 1:0;
- sock->outgoing = incoming? 0:1;
- sock->accepting = incoming? 1:0;
- DEBUG3("in=%c out=%c accept=%c",
- sock->incoming?'y':'n',
- sock->outgoing?'y':'n',
- sock->accepting?'y':'n');
+ sock->incoming = incoming ? 1:0;
+ sock->outgoing = incoming ? 0:1;
+ sock->accepting = incoming ? 1:0;
sock->port = -1;
sock->peer_port = -1;
sock->peer_name = NULL;
+ sock->raw = 0;
*dst = sock;
return no_error;
*dst = NULL;
- TRY(gras_trp_plugin_get_by_name(gras_if_RL() ? "TCP" : "SG",
+ DEBUG1("Create a server socket from plugin %s",gras_if_RL() ? "tcp" : "sg");
+ TRY(gras_trp_plugin_get_by_name(gras_if_RL() ? "tcp" : "sg",
&trp));
/* defaults settings */
sock->port=port;
/* Call plugin socket creation function */
- errcode = trp->socket_server(trp, port, 0/* not raw */, sock);
+ errcode = trp->socket_server(trp, port, sock);
+ DEBUG3("in=%c out=%c accept=%c",
+ sock->incoming?'y':'n',
+ sock->outgoing?'y':'n',
+ sock->accepting?'y':'n');
+
if (errcode != no_error) {
free(sock);
return errcode;
*dst = NULL;
- TRY(gras_trp_plugin_get_by_name(gras_if_RL() ? "TCP" : "SG",
+ TRY(gras_trp_plugin_get_by_name(gras_if_RL() ? "tcp" : "sg",
&trp));
/* defaults settings */
/* plugin-specific */
errcode= (* trp->socket_client)(trp,
host ? host : "localhost", port,
- 0 /* not raw */,
sock);
+ DEBUG3("in=%c out=%c accept=%c",
+ sock->incoming?'y':'n',
+ sock->outgoing?'y':'n',
+ sock->accepting?'y':'n');
+
if (errcode != no_error) {
free(sock);
return errcode;
return no_error;
}
-void gras_socket_close(gras_socket_t **sock) {
+void gras_socket_close(gras_socket_t *sock) {
gras_socket_t *sock_iter;
int cursor;
/* FIXME: Issue an event when the socket is closed */
- if (sock && *sock) {
+ if (sock) {
gras_dynar_foreach(_gras_trp_sockets,cursor,sock_iter) {
- if (*sock == sock_iter) {
+ if (sock == sock_iter) {
gras_dynar_cursor_rm(_gras_trp_sockets,&cursor);
- if ( (*sock)->plugin->socket_close)
- (* (*sock)->plugin->socket_close)(*sock);
+ if ( sock->plugin->socket_close)
+ (* sock->plugin->socket_close)(sock);
/* free the memory */
- free(*sock);
- *sock=NULL;
+ free(sock);
return;
}
}