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));
28 grp->nodes = osrfNewHash();
29 grp->itr = osrfNewHashIterator(grp->nodes);
32 for( i = 0; i != count; i++ ) {
33 if(!(nodes[i] && nodes[i]->domain) ) return NULL;
34 osrfHashSet( grp->nodes, nodes[i], nodes[i]->domain );
41 /* connect all of the nodes to their servers */
42 int osrfTransportGroupConnect( osrfTransportGroup* grp ) {
46 osrfTransportGroupNode* node;
47 osrfHashIteratorReset(grp->itr);
49 while( (node = osrfHashIteratorNext(grp->itr)) ) {
50 if(client_connect( node->connection, node->username,
51 node->password, node->resource, 10, AUTH_DIGEST )) {
57 osrfHashIteratorReset(grp->itr);
62 int osrfTransportGroupSendMatch( osrfTransportGroup* grp, transport_message* msg ) {
63 if(!(grp && msg)) return -1;
67 jid_get_domain( msg->recipient, domain, 255 );
69 osrfTransportGroupNode* node = osrfHashGet(grp->nodes, domain);
71 if( (client_send_message( node->connection, msg )) == 0 )
75 return warning_handler("Error sending message to domain %s", domain );
78 int osrfTransportGroupSend( osrfTransportGroup* grp, transport_message* msg ) {
80 if(!(grp && msg)) return -1;
84 bzero(domain, bufsize);
85 jid_get_domain( msg->recipient, domain, bufsize - 1 );
87 char msgrecip[bufsize];
88 bzero(msgrecip, bufsize);
89 jid_get_username(msg->recipient, msgrecip, bufsize - 1);
92 bzero(msgres, bufsize);
93 jid_get_resource(msg->recipient, msgres, bufsize - 1);
95 char* firstdomain = NULL;
100 /* if we don't host this domain, don't update the recipient but send it as is */
101 if(osrfHashGet(grp->nodes, domain)) updateRecip = 0;
103 osrfTransportGroupNode* node;
107 node = osrfHashIteratorNext(grp->itr);
108 if(!node) osrfHashIteratorReset(grp->itr);
110 node = osrfHashIteratorNext(grp->itr);
113 if(firstdomain == NULL) {
114 firstdomain = node->domain;
117 if(!strcmp(firstdomain, node->domain)) { /* we've made a full loop */
118 return warning_handler("We've tried to send to all domains.. giving up");
122 /* update the recipient domain if necessary */
125 sprintf(newrcp, "%s@%s/%s", msgrecip, node->domain, msgres);
127 sprintf(newrcp, msg->recipient);
129 free(msg->recipient);
130 msg->recipient = strdup(newrcp);
132 if( (client_send_message( node->connection, msg )) == 0 )
140 static int __osrfTGWait( fd_set* fdset, int maxfd, int timeout ) {
141 if(!(fdset && maxfd)) return 0;
149 if( (retval = select( maxfd + 1, fdset, NULL, NULL, NULL)) == -1 )
153 if( (retval = select( maxfd + 1, fdset, NULL, NULL, &tv)) == -1 )
161 transport_message* osrfTransportGroupRecvAll( osrfTransportGroup* grp, int timeout ) {
162 if(!grp) return NULL;
168 osrfTransportGroupNode* node;
169 osrfHashIterator* itr = osrfNewHashIterator(grp->nodes);
171 while( (node = osrfHashIteratorNext(itr)) ) {
173 int fd = node->connection->session->sock_id;
174 if( fd < maxfd ) maxfd = fd;
175 FD_SET( fd, &fdset );
178 osrfHashIteratorReset(itr);
180 if( __osrfTGWait( &fdset, maxfd, timeout ) ) {
181 while( (node = osrfHashIteratorNext(itr)) ) {
183 int fd = node->connection->session->sock_id;
184 if( FD_ISSET( fd, &fdset ) ) {
185 return client_recv( node->connection, 0 );
191 osrfHashIteratorFree(itr);
195 transport_message* osrfTransportGroupRecv( osrfTransportGroup* grp, char* domain, int timeout ) {
196 if(!(grp && domain)) return NULL;
198 osrfTransportGroupNode* node = osrfHashGet(grp->nodes, domain);
199 if(!node && node->connection && node->connection->session) return NULL;
200 int fd = node->connection->session->sock_id;
204 FD_SET( fd, &fdset );
206 int active = __osrfTGWait( &fdset, fd, timeout );
207 if(active) return client_recv( node->connection, 0 );
212 void osrfTransportGroupSetInactive( osrfTransportGroup* grp, char* domain ) {
213 if(!(grp && domain)) return;
214 osrfTransportGroupNode* node = osrfHashGet(grp->nodes, domain );
215 if(node) node->active = 0;
219 osrfTransportGroupNode* __osrfTransportGroupFindNode( osrfTransportGroup* grp, char* domain ) {
220 if(!(grp && grp->list && domain)) return NULL;
222 osrfTransportGroupNode* node = NULL;
224 while( (node = (osrfTransportGroupNode*) osrfListGetIndex( grp->list, i++ )) )
225 if(!strcmp(node->domain, domain)) return node;