1 #include "osrf_transgroup.h"
2 #include <sys/select.h>
5 osrfTransportGroupNode* osrfNewTransportGroupNode(
6 char* domain, int port, char* username, char* password, char* resource ) {
8 if(!(domain && port && username && password && resource)) return NULL;
10 osrfTransportGroupNode* node = safe_malloc(sizeof(osrfTransportGroupNode));
11 node->domain = strdup(domain);
13 node->username = strdup(username);
14 node->password = strdup(password);
15 node->domain = strdup(domain);
18 node->connection = client_init( domain, port, NULL, 0 );
24 osrfTransportGroup* osrfNewTransportGroup( char* router, osrfTransportGroupNode* nodes[], int count ) {
25 if(!nodes || !router || count < 1) return NULL;
27 osrfTransportGroup* grp = safe_malloc(sizeof(osrfTransportGroup));
29 grp->router = strdup(router);
30 grp->list = osrfNewList(1);
33 for( i = 0; i != count; i++ ) osrfListPush( grp->list, nodes[i] );
38 int osrfTransportGroupConnect( osrfTransportGroup* grp ) {
42 for( i = 0; i != grp->list->size; i++ ) {
43 osrfTransportGroupNode* node = osrfListGetIndex( grp->list, i );
44 if(client_connect( node->connection, node->username,
45 node->password, node->resource, 10, AUTH_DIGEST )) {
47 node->lastsent = time(NULL);
56 osrfTransportGroup* osrfNewTransportGroup( char* resource ) {
58 grp->username = osrfConfigGetValue( NULL, "/username" );
59 grp->password = osrfConfigGetValue( NULL, "/passwd" );
60 char* port = osrfConfigGetValue( NULL, "/port" );
61 if(port) grp->port = atoi(port);
64 if(!resource) resource = "client";
65 char* host = getenv("HOSTNAME");
66 if(!host) host = "localhost";
67 char* res = va_list_to_string( "osrf_%s_%s_%d", resource, host, getpid() );
70 osrfStringArray* arr = osrfNewStringArray(8);
71 osrfConfigGetValueList(NULL, arr, "/domains/domain");
73 for( i = 0; i != arr->size; i++ ) {
74 char* domain = osrfStringArrayGetString( arr, i );
76 node->domain = strdup(domain);
77 node->connection = client_init( domain, grp->port, NULL, 0 );
78 if(client_connect( node->connection, grp->username, grp->password, res, 10, AUTH_DIGEST )) {
80 node->lastsent = time(NULL);
82 osrfListPush( grp->list, node );
87 osrfStringArrayFree(arr);
93 int osrfTransportGroupSend( osrfTransportGroup* grp, transport_message* msg, char* newdomain ) {
94 if(!(grp && msg)) return -1;
98 jid_get_domain( msg->recipient, domain );
101 bzero(msgrecip, 254);
102 jid_get_username(msg->recipient, msgrecip);
105 osrfTransportGroupNode* node = __osrfTransportGroupFindNode( grp, domain );
107 if( strcmp( msgrecip, grp->router ) ) { /* not a top level router message */
110 if( (client_send_message( node->connection, msg )) == 0 )
113 return warning_handler("Error sending message to domain %s", domain );
115 return warning_handler("Transport group has no node for domain %s", domain );
120 if( type == OSRF_SERVER_NODE )
121 return _osrfTGServerSend( grp, msgdom, msg );
122 if( type == OSRF_CLIENT_NODE )
123 return _osrfTGClientSend( grp, msgdom, msg );
129 int _osrfTGServerSend( osrfTransportGroup* grp, char* domain, transport_message* msg ) {
131 debug_handler("Transport group sending server message to domain %s", domain );
133 osrfTransportGroupNode* node = __osrfTransportGroupFindNode( grp, domain );
135 if( (client_send_message( node->connection, msg )) == 0 )
138 return warning_handler("Error sending server response to domain %s", domain );
140 return warning_handler("Transport group has no node for domain %s for server response", domain );
144 int _osrfTGClientSend( osrfTransportGroup* grp, char* domain, transport_message* msg ) {
146 debug_handler("Transport group sending client message to domain %s", domain );
148 /* first see if we have a node for the requested domain */
149 osrfTransportGroupNode* node = __osrfTransportGroupFindNode( grp, domain );
150 if(node && node->active) {
151 if( (client_send_message( node->connection, msg )) == 0 )
157 /* if not (or it fails), try sending to the current domain */
158 node = osrfListGetIndex(grp->list, grp->currentNode);
159 if(node && node->active) {
160 if( (client_send_message( node->connection, msg )) == 0 )
164 /* start at the beginning and try them all ... */
165 grp->currentNode = 0;
166 while( grp->currentNode < grp->list->size ) {
167 if( (node = osrfListGetIndex(grp->list, grp->currentNode++)) && node->active ) {
168 if( (client_send_message( node->connection, msg )) == 0 )
170 else node->active = 0;
176 static int __osrfTGWait( fd_set* fdset, int maxfd, int timeout ) {
177 if(!(fdset && maxfd)) return 0;
185 if( (retval = select( maxfd + 1, fdset, NULL, NULL, NULL)) == -1 )
189 if( (retval = select( maxfd + 1, fdset, NULL, NULL, &tv)) == -1 )
197 transport_message* osrfTransportGroupRecvAll( osrfTransportGroup* grp, int timeout ) {
198 if(!(grp && grp->list)) return NULL;
202 osrfTransportGroupNode* node = NULL;
206 for( i = 0; i != grp->list->size; i++ ) {
207 if( (node = osrfListGetIndex(grp->list, grp->currentNode++)) && node->active ) {
208 int fd = node->connection->session->sock_id;
209 if( fd < maxfd ) maxfd = fd;
210 FD_SET( fd, &fdset );
214 if( __osrfTGWait( &fdset, maxfd, timeout ) ) {
215 for( i = 0; i != grp->list->size; i++ ) {
216 if( (node = osrfListGetIndex(grp->list, grp->currentNode++)) && node->active ) {
217 int fd = node->connection->session->sock_id;
218 if( FD_ISSET( fd, &fdset ) ) {
219 return client_recv( node->connection, 0 );
228 transport_message* osrfTransportGroupRecv( osrfTransportGroup* grp, char* domain, int timeout ) {
229 if(!(grp && domain)) return NULL;
231 osrfTransportGroupNode* node = __osrfTransportGroupFindNode( grp, domain );
232 if(!node && node->connection && node->connection->session) return NULL;
233 int fd = node->connection->session->sock_id;
237 FD_SET( fd, &fdset );
239 int active = __osrfTGWait( &fdset, fd, timeout );
240 if(active) return client_recv( node->connection, 0 );
245 void osrfTransportGroupSetInactive( osrfTransportGroup* grp, char* domain ) {
246 if(!(grp && domain)) return;
247 osrfTransportGroupNode* node = __osrfTransportGroupFindNode( grp, domain );
248 if(node) node->active = 0;
251 osrfTransportGroupNode* __osrfTransportGroupFindNode( osrfTransportGroup* grp, char* domain ) {
252 if(!(grp && grp->list && domain)) return NULL;
254 osrfTransportGroupNode* node = NULL;
256 while( (node = (osrfTransportGroupNode*) osrfListGetIndex( grp->list, i++ )) )
257 if(!strcmp(node->domain, domain)) return node;