5 #define ROUTER_MAX_MSGS_PER_PACKET 12
7 transport_router_registrar* routt;
8 void _build_trusted_sites( transport_router_registrar* router );
11 void sig_hup_handler( int a ) {
12 router_registrar_free( routt );
15 free( router_resource );
20 int main( int argc, char* argv[] ) {
23 fatal_handler( "Usage: %s <path_to_config_file>", argv[0] );
29 jid_get_domain( "client@elroy/test", b );
30 fprintf(stderr, "Domain %s\n", b );
32 config_reader_init( argv[1] );
33 if( conf_reader == NULL ) fatal_handler( "main(): Config is NULL" );
35 /* laod the config options */
36 char* server = config_value("//router/transport/server");
37 char* port = config_value("//router/transport/port");
38 char* username = config_value("//router/transport/username");
39 char* password = config_value("//router/transport/password");
40 router_resource = config_value("//router/transport/resource");
41 char* con_timeout = config_value("//router/transport/connect_timeout" );
42 char* max_retries = config_value("//router/transport/max_reconnect_attempts" );
43 char* component = config_value("//router/component" );
45 fprintf(stderr, "Router connecting as \nserver: %s \nport: %s \nuser:%s \nresource:%s\n",
46 server, port, username, router_resource );
48 int iport = atoi( port );
49 int con_itimeout = atoi( con_timeout );
50 int max_retries_ = atoi(max_retries);
53 icomponent = atoi(component);
56 fatal_handler( "Port is negative or 0" );
61 /* build the router_registrar */
62 transport_router_registrar* router_registrar =
63 router_registrar_init( server, iport, username, password, router_resource, 0, con_itimeout, icomponent );
65 routt = router_registrar;
74 signal(SIGHUP,sig_hup_handler);
78 /* wait for incoming... */
79 while( ++counter <= max_retries_ ) {
81 /* connect to jabber */
82 if( router_registrar_connect( router_registrar ) ) {
83 info_handler( "Connected..." );
84 fprintf(stderr, "- Connected -\n");
86 listen_loop( router_registrar );
88 fatal_handler( "Could not connect to Jabber Server" );
90 /* this should never happen */
91 warning_handler( "Jabber server probably went away, attempting reconnect" );
97 router_registrar_free( router_registrar );
103 transport_router_registrar* router_registrar_init( char* server,
104 int port, char* username, char* password,
105 char* resource, int client_timeout, int con_timeout, int component ) {
107 if( server == NULL ) { return NULL; }
109 /* allocate a new router_registrar object */
110 size_t size = sizeof( transport_router_registrar );
111 transport_router_registrar* router_registrar = (transport_router_registrar*) safe_malloc( size );
113 router_registrar->client_timeout = client_timeout;
114 router_registrar->jabber = jabber_connect_init( server, port, username, password, resource, con_timeout, component );
115 _build_trusted_sites( router_registrar );
116 info_handler( "Trusted stuff %s, %s, %s", router_registrar->trusted_servers[0],
117 router_registrar->trusted_clients[0], router_registrar->trusted_clients[1] );
118 return router_registrar;
122 void _build_trusted_sites( transport_router_registrar* router ) {
124 router->trusted_servers = (char**) safe_malloc(sizeof(char**));
125 router->trusted_clients = (char**) safe_malloc(sizeof(char**));
127 *(router->trusted_servers) = (char*) safe_malloc(ROUTER_MAX_TRUSTED);
128 *(router->trusted_clients) = (char*) safe_malloc(ROUTER_MAX_TRUSTED);
132 char* server = config_value("//router/trusted_domains/server%d", i );
136 router->trusted_servers[i-1] = server;
141 char* client = config_value( "//router/trusted_domains/client%d", i );
144 router->trusted_clients[i-1] = client;
147 if( router->trusted_servers[0] == NULL ||
148 router->trusted_clients[0] == NULL )
150 fatal_handler( "You must specify at least one trusted server and client in the config file");
154 jabber_connect* jabber_connect_init( char* server,
155 int port, char* username, char* password, char* resource, int connect_timeout, int component ) {
157 size_t len = sizeof(jabber_connect);
158 jabber_connect* jabber = (jabber_connect*) safe_malloc( len );
161 jabber->connect_timeout = connect_timeout;
163 jabber->server = strdup(server);
164 jabber->username = strdup(username);
165 jabber->password = strdup(password);
166 jabber->resource = strdup(resource);
168 if( jabber->server == NULL || jabber->username == NULL ||
169 jabber->password == NULL || jabber->resource == NULL ) {
170 fatal_handler( "jabber_init(): Out of Memory" );
174 /* build the transport client */
175 jabber->t_client = client_init( jabber->server, jabber->port, component );
180 /* connect the router_registrar to jabber */
181 int router_registrar_connect( transport_router_registrar* router ) {
182 return j_connect( router->jabber );
185 /* connect a jabber_connect object jabber */
186 int j_connect( jabber_connect* jabber ) {
187 if( jabber == NULL ) { return 0; }
188 return client_connect( jabber->t_client,
189 jabber->username, jabber->password, jabber->resource,
190 jabber->connect_timeout, AUTH_DIGEST );
193 int fill_fd_set( transport_router_registrar* router, fd_set* set ) {
198 int router_fd = router->jabber->t_client->session->sock_obj->sock_fd;
200 FD_SET( router_fd, set );
202 server_class_node* cur_node = router->server_class_list;
203 while( cur_node != NULL ) {
204 int cur_class_fd = cur_node->jabber->t_client->session->sock_obj->sock_fd;
205 if( cur_class_fd > max_fd )
206 max_fd = cur_class_fd;
207 FD_SET( cur_class_fd, set );
208 cur_node = cur_node->next;
216 void listen_loop( transport_router_registrar* router ) {
222 int router_fd = router->jabber->t_client->session->sock_obj->sock_fd;
223 transport_message* cur_msg;
228 int max_fd = fill_fd_set( router, &listen_set );
231 fatal_handler( "fill_fd_set return bogus max_fd: %d", max_fd );
234 info_handler( "Going into select" );
236 if( (select_ret=select(max_fd+ 1, &listen_set, NULL, NULL, NULL)) < 0 ) {
238 warning_handler( "Select returned error %d", select_ret );
239 warning_handler( "Select Error %d on fd %d", errno );
240 perror( "Select Error" );
241 warning_handler( "Errors: EBADF %d, EINTR %d, EINVAL %d, ENOMEM %d",
242 EBADF, EINTR, EINVAL, ENOMEM );
247 info_handler( "Select returned %d", select_ret );
249 if( FD_ISSET( router_fd, &listen_set ) ) {
250 cur_msg = client_recv( router->jabber->t_client, 1 );
252 /* We only process a message if we have some trusted servers and the current
253 message came from one of those servers */
254 if(router->trusted_servers && router->trusted_servers[0]) {
258 char server_buf[256];
259 memset(server_buf,0,256);
260 jid_get_domain( cur_msg->sender, server_buf );
261 info_handler("Received top level message from %s", server_buf );
264 if(router->trusted_servers[i] == NULL)
266 if(!strcmp(router->trusted_servers[i], server_buf)) {
273 router_registrar_handle_msg( router, cur_msg );
275 warning_handler( "Received top level message from unpriveleged sender %s", cur_msg->sender );
278 message_free( cur_msg );
279 if( ++num_handled == select_ret )
283 /* cycle through the children and find any whose fd's are ready for reading */
284 server_class_node* cur_node = router->server_class_list;
285 while( cur_node != NULL ) {
286 int cur_fd = cur_node->jabber->t_client->session->sock_obj->sock_fd;
288 if( FD_ISSET(cur_fd, &listen_set) ) {
290 FD_CLR(cur_fd,&listen_set);
292 cur_msg = client_recv( cur_node->jabber->t_client, 1 );
293 info_handler( "%s received from %s", cur_node->server_class, cur_msg->sender );
294 int handle_ret = server_class_handle_msg( router, cur_node, cur_msg );
296 if( handle_ret == -1 ) {
297 warning_handler( "server_class_handle_msg() returned -1" );
298 cur_node = router->server_class_list; /*start over*/
301 } else if( handle_ret == 0 ) {
302 /* delete and continue */
303 warning_handler( "server_class_handle_msg() returned 0" );
304 server_class_node* tmp_node = cur_node->next;
305 remove_server_class( router, cur_node );
310 info_handler( "%s handled message successfully", cur_node->server_class );
311 /* dont free message here */
312 if( num_handled == select_ret )
315 if( num_handled == select_ret )
317 cur_node = cur_node->next;
319 } /* cycling through the server_class list */
321 } /* no select errors */
326 /* determine where to route top level messages */
327 int router_registrar_handle_msg( transport_router_registrar* router_registrar, transport_message* msg ) {
329 info_handler( "Received class: %s : command %s ", msg->router_class, msg->router_command );
331 if( router_registrar == NULL || msg == NULL ) { return 0; }
333 if( msg->router_command == NULL || !strcmp(msg->router_command,"") ) {
334 return router_registrar_handle_app_request( router_registrar, msg );
337 // user issued a ruoter query
338 /* a query command has router_command="query" and the actual query type
339 is the content of the message */
340 if( !strcmp(msg->router_command,"query")) {
341 info_handler( "Router received query command" );
343 // user issues a servers query
344 if( !strcmp(msg->body, "servers")) {
346 info_handler( "Router received servers query command" );
347 router_return_server_info( router_registrar, msg );
353 info_handler("Looking for server_class_node %s...",msg->router_class);
354 server_class_node* active_class_node = find_server_class( router_registrar, msg->router_class );
356 if( active_class_node == NULL ) {
357 info_handler("Could not find server_class_node %s, creating one.",msg->router_class);
359 /* there is no server_class for msg->router_class so we build it here */
360 if( strcmp( msg->router_command, "register") == 0 ) {
362 info_handler("Adding server_class_node for %s",msg->router_class);
364 init_server_class( router_registrar, msg->sender, msg->router_class );
366 if( active_class_node == NULL ) {
367 fatal_handler( "router_listen(): active_class_node == NULL for %s", msg->sender );
371 if (router_registrar->server_class_list != NULL) {
372 active_class_node->next = router_registrar->server_class_list;
373 router_registrar->server_class_list->prev = active_class_node;
375 router_registrar->server_class_list = active_class_node;
377 //spawn_server_class( (void*) active_class_node );
380 warning_handler( "router_register_handler_msg(): Bad Command [%s] for class [%s]",
381 msg->router_command, msg->router_class );
384 } else if( strcmp( msg->router_command, "register") == 0 ) {
385 /* there is a server_class for msg->router_class so we
386 need to either add a new server_node or update the existing one */
389 server_node* s_node = find_server_node( active_class_node, msg->sender );
391 if( s_node != NULL ) {
392 s_node->available = 1;
393 s_node->upd_time = time(NULL);
394 info_handler( "Found matching registered server: %s. Updating.",
397 s_node = init_server_node( msg->sender );
399 info_handler( "Adding server_node for: %s.", s_node->remote_id );
401 if (s_node == NULL ) {
402 warning_handler( " Could not create new xerver_node for %s.",
407 s_node->next = active_class_node->current_server_node->next;
408 s_node->prev = active_class_node->current_server_node;
410 active_class_node->current_server_node->next->prev = s_node;
411 active_class_node->current_server_node->next = s_node;
415 } else if( strcmp( msg->router_command, "unregister") == 0 ) {
417 if( ! unregister_server_node( active_class_node, msg->sender ) )
418 remove_server_class( router_registrar, active_class_node );
421 warning_handler( "router_register_handler_msg(): Bad Command [%s] for class [%s]",
422 msg->router_command, msg->router_class );
429 /* removes a server class node from the top level router_registrar */
430 int unregister_server_node( server_class_node* active_class_node, char* remote_id ) {
432 server_node* d_node = find_server_node( active_class_node, remote_id );
434 if ( d_node != NULL ) {
436 info_handler( "Removing server_node for: %s.", d_node->remote_id );
438 if ( d_node->next == NULL ) {
439 warning_handler( "NEXT is NULL in ring [%s] -- "
440 "THIS SHOULD NEVER HAPPEN",
445 if ( d_node->prev == NULL ) {
446 warning_handler( "PREV is NULL in a ring [%s] -- "
447 "THIS SHOULD NEVER HAPPEN",
452 if ( d_node->next == d_node && d_node->prev == d_node) {
453 info_handler( "Last node, setting ring to NULL: %s.",
456 active_class_node->current_server_node = NULL;
458 server_node_free( d_node );
462 info_handler( "Nodes remain, splicing: %s, %s",
463 d_node->prev->remote_id,
464 d_node->next->remote_id);
466 info_handler( "d_node => %x, next => %x, prev => %x",
467 d_node, d_node->next, d_node->prev );
470 d_node->prev->next = d_node->next;
471 d_node->next->prev = d_node->prev;
473 info_handler( "prev => %x, prev->next => %x, prev->prev => %x",
474 d_node->prev, d_node->prev->next, d_node->prev->prev );
476 info_handler( "next => %x, next->next => %x, next->prev => %x",
477 d_node->next, d_node->next->next, d_node->next->prev );
479 if (active_class_node->current_server_node == d_node)
480 active_class_node->current_server_node = d_node->next;
483 server_node_free( d_node );
490 server_node * find_server_node ( server_class_node * class, const char * remote_id ) {
492 if ( class == NULL ) {
493 warning_handler(" find_server_node(): bad arg!");
497 server_node * start_node = class->current_server_node;
498 server_node * node = class->current_server_node;
504 if ( strcmp(node->remote_id, remote_id) == 0 )
509 } while ( node != start_node );
514 /* if we return -1, then we just deleted the server_class you were looking for
515 if we return 0, then some other error has occured
516 we return 1 otherwise */
517 int remove_server_class( transport_router_registrar* router, server_class_node* class ) {
521 transport_message * msg = NULL;
522 while ( (msg = client_recv(class->jabber->t_client, 0)) != NULL ) {
523 server_class_handle_msg(router, class, msg);
527 free( class->server_class );
528 class->server_class = NULL;
530 find_server_class( router, router_resource ); /* find deletes for us */
532 if( router->server_class_list == NULL )
537 server_class_node * find_server_class ( transport_router_registrar * router, const char * class_id ) {
539 if ( router == NULL ) {
540 warning_handler(" find_server_class(): bad arg!");
544 info_handler( "Finding server class for %s", class_id );
545 server_class_node * class = router->server_class_list;
546 server_class_node * dead_class = NULL;
548 while ( class != NULL ) {
550 if ( class->server_class == NULL ) {
551 info_handler( "Found an empty server class" );
553 if ( class->prev != NULL ) {
554 class->prev->next = class->next;
555 if( class->next != NULL ) {
556 class->next->prev = class->prev;
560 info_handler( "Empty class is the first on the list" );
561 if( class->next != NULL )
562 router->server_class_list = class->next;
564 else { /* we're the last class node in the class node list */
565 info_handler( "Empty class is the last on the list" );
566 server_class_node_free( router->server_class_list );
567 router->server_class_list = NULL;
576 info_handler( "Tossing our dead class" );
577 server_class_node_free( dead_class );
583 if ( strcmp(class->server_class, class_id) == 0 )
585 info_handler( "%s != %s", class->server_class, class_id );
593 /* builds a new server class and connects to the jabber server with the new resource */
594 server_class_node* init_server_class(
595 transport_router_registrar* router, char* remote_id, char* server_class ) {
597 size_t len = sizeof( server_class_node );
598 server_class_node* node = (server_class_node*) safe_malloc( len );
600 node->jabber = jabber_connect_init( router->jabber->server,
601 router->jabber->port, router->jabber->username,
602 router->jabber->password, server_class, router->jabber->connect_timeout, router->component );
606 node->server_class = strdup( server_class );
607 if( server_class == NULL ) {
608 fatal_handler( "imit_server_class(): out of memory for %s", server_class );
612 info_handler( "Received class to init_server_class: %s", server_class );
613 node->current_server_node = init_server_node( remote_id );
614 if( node->current_server_node == NULL ) {
615 fatal_handler( "init_server_class(): NULL server_node for %s", remote_id );
620 if( ! j_connect( node->jabber ) ) {
621 fatal_handler( "Unable to init server class %s", node->server_class );
625 info_handler( "Jabber address in init for %s : address %x : username %s : resource %s",
626 node->server_class, node->jabber->t_client->session->sock_obj->sock_fd,
627 node->jabber->username, node->jabber->resource );
633 /* builds a new server_node to be added to the ring of server_nodes */
634 server_node* init_server_node( char* remote_id ) {
636 info_handler( "Initing server node for %s", remote_id );
637 server_node* current_server_node;
638 size_t size = sizeof( server_node);
639 current_server_node = (server_node*) safe_malloc( size );
641 current_server_node->remote_id = strdup(remote_id);
642 if( current_server_node->remote_id == NULL ) {
643 fatal_handler("init_server_class(): Out of Memory for %s", remote_id );
647 current_server_node->reg_time = time(NULL);
648 current_server_node->available = 1;
649 current_server_node->next = current_server_node;
650 current_server_node->prev = current_server_node;
653 return current_server_node;
657 int server_class_handle_msg( transport_router_registrar* router,
658 server_class_node* s_node, transport_message* msg ) {
660 if( s_node->current_server_node == NULL ) {
661 /* return error to client ??!*/
662 /* WE have no one to send the message to */
663 warning_handler( "We no longer have any servers for %s : "
664 "no one to send the message to. Sending error message to %s", s_node->server_class, msg->sender );
665 free( msg->recipient );
667 char* rec = strdup( msg->sender );
669 fatal_handler( "class msg_handler: out of memory");
673 info_handler( "Building error message to return for %s", s_node->server_class);
674 msg->recipient = rec;
675 set_msg_error(msg, "cancel", 501);
677 client_send_message( s_node->jabber->t_client, msg );
680 remove_server_class( router, s_node );
685 info_handler( "[%s] Received \nfrom: %s \nto: %s",
686 s_node->server_class, msg->sender, msg->recipient );
688 if( msg->is_error ) {
689 warning_handler( "We've received an error message type: %s : code: %d",
690 msg->error_type, msg->error_code );
692 if( strcmp( msg->error_type, "cancel" ) == 0 ) {
693 warning_handler( "Looks like we've lost a server!" );
694 server_node* dead_node = find_server_node( s_node, msg->sender );
696 if( dead_node != NULL ) {
697 //message_free( msg );
698 transport_message* tmp = dead_node->last_sent;
700 /* copy over last sent, it will be freed in the unregister function */
701 transport_message* tmp2 = message_init( tmp->body, tmp->subject, tmp->thread,
702 tmp->recipient, tmp->sender );
704 message_set_router_info( tmp2, tmp->router_from,
705 tmp->router_to, tmp->router_class, tmp->router_command, tmp->broadcast );
707 if( ! unregister_server_node( s_node, dead_node->remote_id ) ) {
708 /* WE have no one to send the message to */
709 warning_handler( "We no longer have any servers for %s : "
710 "no one to send the message to.", s_node->server_class );
711 free( msg->recipient );
713 char* rec = strdup( msg->router_from );
715 fatal_handler( "class msg_handler: out of memory");
719 info_handler( "Building error message to return for %s", s_node->server_class);
720 msg->recipient = rec;
721 client_send_message( s_node->jabber->t_client, msg );
722 message_free( tmp2 );
734 server_node* c_node = s_node->current_server_node->next;
736 /* not implemented yet */
737 while( ! c_node->available ) {
738 if( c_node == s_node->current_server_node ) {
739 warning_handler("No server_node's are available for %s", s_node->server_class );
740 /* XXX send error message to client */
743 c_node = c_node->next;
745 s_node->current_server_node = c_node;
747 transport_message * new_msg =
748 message_init( msg->body, msg->subject, msg->thread,
749 s_node->current_server_node->remote_id, msg->sender );
751 message_set_router_info( new_msg, msg->sender, NULL, NULL, NULL, 0 );
753 info_handler( "[%s] Routing message from [%s]\nto [%s]", s_node->server_class, msg->sender, new_msg->recipient );
754 //info_handler( "New Message Details: sender:%s recipient: %s \nbody: %s",
755 // new_msg->sender, new_msg->recipient, new_msg->body );
757 message_free( s_node->current_server_node->last_sent );
758 s_node->current_server_node->last_sent = msg;
760 if ( new_msg != NULL && client_send_message( s_node->jabber->t_client, new_msg ) ) {
761 s_node->current_server_node->serve_count++;
762 s_node->current_server_node->la_time = time(NULL);
763 message_free( new_msg ); // XXX
766 message_free( new_msg ); // XXX
772 int router_return_server_info(
773 transport_router_registrar* router, transport_message* msg ) {
775 server_class_node* cur_class = router->server_class_list;
776 growing_buffer* buffer = buffer_init(1024);
778 while( cur_class != NULL ) {
780 server_node* start_node = cur_class->current_server_node;
781 server_node* cur_node = start_node;
782 if( cur_node == NULL ) continue;
788 sprintf( tbuf, "%d", (int)cur_node->reg_time );
789 buffer_add( buffer, tbuf );
790 buffer_add( buffer, " | ");
793 sprintf( tbuf, "%d", (int)cur_node->upd_time );
794 buffer_add( buffer, tbuf );
795 buffer_add( buffer, " | ");
798 sprintf( tbuf, "%d", (int)cur_node->la_time );
799 buffer_add( buffer, tbuf );
800 buffer_add( buffer, " | ");
805 sprintf(sbuf,"%d",cur_node->serve_count);
807 buffer_add( buffer, "#" );
808 buffer_add( buffer, sbuf );
809 buffer_add( buffer, " | ");
811 buffer_add( buffer, cur_class->server_class );
812 buffer_add( buffer, " | ");
814 buffer_add( buffer, cur_node->remote_id );
816 buffer_add( buffer, "\n" );
817 cur_node = cur_node->next;
819 } while( cur_node != start_node );
821 cur_class = cur_class->next;
825 info_handler( "Router returning servers query command: %s", buffer->buf );
827 transport_message* new_msg;
829 if( buffer->buf == NULL || strlen(buffer->buf) == 0 )
830 new_msg = message_init( "0", NULL, NULL, msg->sender, NULL );
832 new_msg = message_init( buffer->buf, NULL, NULL, msg->sender, NULL );
834 client_send_message( router->jabber->t_client, new_msg );
835 message_free( new_msg );
841 int router_registrar_handle_app_request(
842 transport_router_registrar* router, transport_message* msg ) {
844 osrf_message* arr[ROUTER_MAX_MSGS_PER_PACKET];
845 memset(arr, 0, ROUTER_MAX_MSGS_PER_PACKET );
846 int num_msgs = osrf_message_from_xml( msg->body, arr );
849 for( i = 0; i != num_msgs; i++ ) {
851 osrf_message* omsg = arr[i];
852 osrf_message* success;
854 char* newxml = osrf_message_to_xml(omsg);
855 debug_handler( "Received potential app request from client:\n%s\n", newxml );
858 if(omsg->m_type == CONNECT) {
860 success = osrf_message_init(
861 STATUS, omsg->thread_trace, omsg->protocol );
863 osrf_message_set_status_info(
864 success, "oilsConnectStatus", "Connection Successful", OSRF_STATUS_OK );
866 } else if( omsg->m_type == REQUEST ) {
868 success = router_registrar_process_app_request( router, omsg );
870 } else if(omsg->m_type == DISCONNECT) {
875 success = osrf_message_init(
876 STATUS, omsg->thread_trace, omsg->protocol );
877 osrf_message_set_status_info(
878 success, "oilsMethodException", "Method Not Found", OSRF_STATUS_NOTFOUND );
882 /* now send our new message back */
885 char* xml = osrf_message_to_xml(success);
886 debug_handler( "Sending XML to client app request:\n%s\n", xml );
887 transport_message* return_m = message_init(
888 xml, "", msg->thread, msg->sender, "" );
891 client_send_message(router->jabber->t_client, return_m);
894 osrf_message_free(success);
905 osrf_message* router_registrar_process_app_request(
906 transport_router_registrar* router, osrf_message* omsg ) {
909 if( omsg->method_name == NULL )
912 json* result_content = NULL;
914 debug_handler( "Received method from client: %s", omsg->method_name );
916 if(!strcmp(omsg->method_name,"opensrf.router.info.class.list")) {
918 debug_handler("Processing opensrf.router.info.class.list request");
920 result_content = json_object_new_array();
921 server_class_node* cur_class = router->server_class_list;
922 while( cur_class != NULL ) {
924 debug_handler("Adding %s to request list", cur_class->server_class);
926 json_object_array_add(
927 result_content, json_object_new_string(cur_class->server_class));
928 cur_class = cur_class->next;
931 //if( json_object_array_length(result_content) < 1 )
932 // result_content = NULL;
936 if( result_content == NULL )
939 osrf_message* success = osrf_message_init(
940 RESULT, omsg->thread_trace, omsg->protocol );
941 osrf_message_set_result_content( success, result_content );
942 json_object_put(result_content);
950 int router_registrar_free( transport_router_registrar* router_registrar ) {
951 if( router_registrar == NULL ) return 0;
952 jabber_connect_free( router_registrar->jabber );
954 /* free the server_class list XXX */
955 while( router_registrar->server_class_list != NULL ) {
956 remove_server_class(router_registrar, router_registrar->server_class_list);
959 transport_router_registrar* router = router_registrar;
965 if( router->trusted_servers[i] == NULL &&
966 router->trusted_clients[i] == NULL )
969 if(router->trusted_servers[i] != NULL)
970 free(router->trusted_servers[i]);
971 if(router->trusted_clients[i] != NULL)
972 free(router->trusted_clients[i]);
976 free( router_registrar );
984 int server_class_node_free( server_class_node* node ) {
985 if( node == NULL ) { return 0; }
986 if( node->server_class != NULL )
987 free( node->server_class );
989 jabber_connect_free( node->jabber );
991 /* just in case, free the list */
992 while( node->current_server_node != NULL ) {
993 unregister_server_node( node, node->current_server_node->remote_id );
999 int server_node_free( server_node* node ) {
1000 if( node == NULL ) { return 0; }
1001 message_free( node->last_sent );
1002 free( node->remote_id );
1007 int jabber_connect_free( jabber_connect* jabber ) {
1008 if( jabber == NULL ) { return 0; }
1009 client_free( jabber->t_client );
1010 free( jabber->username );
1011 free( jabber->password );
1012 free( jabber->resource );
1013 free( jabber->server );