1 #include "opensrf/transport_client.h"
2 #include "opensrf/generic_utils.h"
5 #define SRFSH_PORT 5222
6 #define COMMAND_BUFSIZE 12
9 char* prompt = "srfsh# ";
10 transport_client* client = NULL;
12 int parse_request( char* request );
13 int handle_router( char* words[] );
14 int handle_time( char* words[] );
15 int parse_error( char* words[] );
16 int router_query_servers( char* server );
17 int srfsh_client_connect();
20 int main( int argc, char* argv[] ) {
24 fatal_handler( "usage: %s <jabbersever> <username> <password>", argv[0] );
27 memset(request, 0, 256);
30 client = client_init( argv[1], SRFSH_PORT );
31 if( ! client_connect( client, argv[2], argv[3], "srfsh", 5 ) ) {
32 fprintf(stderr, "Unable to connect to jabber server '%s' as '%s'\n", argv[1], argv[2]);
33 fprintf(stderr, "Most queries will be futile...\n" );
37 while( fgets( request, 255, stdin) ) {
40 request[strlen(request)-1] = '\0';
42 if( !strcmp(request, "exit") || !strcmp(request,"quit")) {
43 client_disconnect( client );
44 client_free( client );
49 if( !strcmp(request, "help") || !strcmp(request,"?"))
52 parse_request( request );
55 memset(request, 0, 300);
58 fprintf(stderr, "Exiting...\n[Ignore Segfault]\n");
63 int parse_error( char* words[] ) {
71 memset(buffer, 0, 256);
72 while( (current=words[i++]) ) {
73 strcat(buffer, current);
76 if( ! buffer || strlen(buffer) < 1 )
79 fprintf( stderr, "Command Incomplete or Not Recognized: %s\n", buffer );
85 int parse_request( char* request ) {
92 char* words[COMMAND_BUFSIZE];
93 memset(words,0,COMMAND_BUFSIZE);
95 char* cur_tok = strtok( request, " " );
100 while(cur_tok != NULL) {
101 words[i++] = cur_tok;
102 cur_tok = strtok( NULL, " " );
105 // not sure why (strtok?), but this is necessary
106 memset( words + i, 0, COMMAND_BUFSIZE - i );
108 /* pass off to the top level command */
109 if( !strcmp(words[0],"router") )
110 ret_val = handle_router( words );
112 if( !strcmp(words[0],"time") )
113 ret_val = handle_time( words );
116 return parse_error( words );
123 int handle_router( char* words[] ) {
131 if( !strcmp(words[1],"query") ) {
133 if( words[2] && !strcmp(words[2],"servers") ) {
134 for(i=3; i < COMMAND_BUFSIZE - 3 && words[i]; i++ ) {
135 router_query_servers( words[i] );
146 int handle_time( char* words[] ) {
153 printf( "%s\n", buf );
158 time_t epoch = (time_t)atoi( words[1] );
159 char* localtime = strdup( ctime( &epoch ) );
160 printf( "%s => %s", words[1], localtime );
171 int router_query_servers( char* router_server ) {
173 if( ! router_server || strlen(router_server) == 0 )
178 sprintf(rbuf,"router@%s/router", router_server );
180 transport_message* send =
181 message_init( "servers", NULL, NULL, rbuf, NULL );
182 message_set_router_info( send, NULL, NULL, NULL, "query", 0 );
184 client_send_message( client, send );
185 message_free( send );
187 transport_message* recv = client_recv( client, -1 );
189 fprintf(stderr, "NULL message received from router\n");
192 "---------------------------------------------------------------------------------\n"
193 "Received from 'server' query on %s\n"
194 "---------------------------------------------------------------------------------\n"
195 "original reg time | latest reg time | last used time | class | server\n"
196 "---------------------------------------------------------------------------------\n"
198 "---------------------------------------------------------------------------------\n"
199 , router_server, recv->body );
201 message_free( recv );
209 "---------------------------------------------------------------------------------\n"
211 "---------------------------------------------------------------------------------\n"
212 "router query servers <server1 [, server2, ...]>\n"
215 "---------------------------------------------------------------------------------\n"