static gras_dict_t *_gras_trp_plugins; /* All registered plugins */
static void gras_trp_plugin_free(void *p); /* free one of the plugins */
-
-gras_dynar_t *_gras_trp_sockets; /* all existing sockets */
static void gras_trp_socket_free(void *s); /* free one socket */
gras_error_t
gras_trp_init(void){
gras_error_t errcode;
- /* make room for all socket ownership descriptions */
- TRY(gras_dynar_new(&_gras_trp_sockets, sizeof(gras_socket_t*), NULL));
-
/* make room for all plugins */
TRY(gras_dict_new(&_gras_trp_plugins));
void
gras_trp_exit(void){
gras_dict_free(&_gras_trp_plugins);
- gras_dynar_free(_gras_trp_sockets);
}
if (! (sock=malloc(sizeof(gras_socket_t))) )
RAISE_MALLOC;
+ DEBUG1("Create a new socket (%p)", sock);
sock->plugin = NULL;
sock->sd = -1;
sock->raw = 0;
*dst = sock;
- return no_error;
+
+ return gras_dynar_push(gras_socketset_get(),dst);
}
}
*dst = sock;
- /* Register this socket */
- errcode = gras_dynar_push(_gras_trp_sockets,dst);
- if (errcode != no_error) {
- free(sock);
- *dst = NULL;
- return errcode;
- }
return no_error;
}
TRY(gras_trp_plugin_get_by_name(gras_if_RL() ? "tcp" : "sg",
&trp));
+ DEBUG1("Create a client socket from plugin %s",gras_if_RL() ? "tcp" : "sg");
/* defaults settings */
TRY(gras_trp_socket_new(0,&sock));
sock->plugin= trp;
return errcode;
}
- /* register socket */
*dst = sock;
- errcode = gras_dynar_push(_gras_trp_sockets,dst);
- if (errcode != no_error) {
- free(sock);
- *dst = NULL;
- return errcode;
- }
return no_error;
}
void gras_socket_close(gras_socket_t *sock) {
+ gras_dynar_t *sockets = gras_socketset_get();
gras_socket_t *sock_iter;
int cursor;
/* FIXME: Issue an event when the socket is closed */
if (sock) {
- gras_dynar_foreach(_gras_trp_sockets,cursor,sock_iter) {
+ gras_dynar_foreach(sockets,cursor,sock_iter) {
if (sock == sock_iter) {
- gras_dynar_cursor_rm(_gras_trp_sockets,&cursor);
+ gras_dynar_cursor_rm(sockets,&cursor);
if ( sock->plugin->socket_close)
(* sock->plugin->socket_close)(sock);
/* free the memory */
+ if (sock->peer_name)
+ free(sock->peer_name);
free(sock);
return;
}