14

mbexp

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3.  
  4. #if defined( LINUX )
  5. #else
  6. #include <sys/select.h>
  7. #endif
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. #if defined( SUN ) || defined( LINUX )
  14. #include <unistd.h>
  15. #endif
  16.  
  17. #include <errno.h>
  18.  
  19. #include "mb.h"
  20.  
  21. struct mbexp {
  22.     u_int   mode;
  23.     char *  peer_name;
  24.     char *  domain_name;
  25.     char *  host_name;
  26.     char *  port_name;
  27.     int     mb_socket;
  28.     u_int   mb_msg_id;
  29. } mbexp;
  30.  
  31. void mbexp_unbind( ) {
  32.     if ( mbexp.mb_socket != -1 ) {
  33.         mb_unbind( mbexp.mb_socket );
  34.         mbexp.mb_socket = -1;
  35.     }
  36. }
  37.  
  38. void mbexp_bind( char *host ) {
  39.     if ( mbexp.mb_socket == -1 ) {
  40.         int ret = mb_bind( mbexp.host_name, mbexp.port_name );
  41.  
  42.         switch ( ret ) {
  43.         case -3:
  44.             fprintf( stderr, "Host not found\n" );
  45.             break;
  46.         case -2:
  47.             fprintf( stderr, "Service not found\n" );
  48.             break;
  49.         case -1:
  50.             fprintf( stderr, "%s\n", strerror( errno ) );
  51.             break;
  52.         default:
  53.             mbexp.mb_socket = ret;
  54.             break;
  55.         }
  56.     }
  57. }
  58.  
  59. void mbexp_exit( int status ) {
  60.     mbexp_unbind( );
  61.     exit( status );
  62. }
  63.  
  64. void mbexp_receive_data( int socket ) {
  65.     int msg_id, msg_len;
  66.     u_char *msg;
  67.  
  68.     int msg_type = mb_receive( socket, &msg_id, &msg_len, &msg );
  69.  
  70.     switch( msg_type ) {
  71.     case MB_ONEWAY:
  72.         fprintf( stdout, "\nONEWAY[%i]<%i>\n", msg_id, msg_len );
  73.         free( msg );
  74.         break;
  75.     case MB_MULTIWAY:
  76.         fprintf( stdout, "\nMULTIWAY[%i]<%i>\n", msg_id, msg_len );
  77.         free( msg );
  78.         break;
  79.     case MB_TWOWAY:
  80.         fprintf( stdout, "\nTWOWAY[%i]<%i>\n", msg_id, msg_len );
  81.         mb_reply( socket, msg_id, msg_len, msg );   /* echo */
  82.         free( msg );
  83.         break;
  84.     case MB_REPLY:
  85.         if ( msg_len > 0 ) {
  86.             fprintf( stdout, "\nREPLY[%i]<%i>\n", msg_id, msg_len );
  87.             free( msg );
  88.         }
  89.         else
  90.             fprintf( stdout, "\nSENT[%i]\n", msg_id );
  91.         break;
  92.     case MB_NOBODY:
  93.         fprintf( stdout, "\nNOBODY[%i]\n", msg_id );
  94.         break;
  95.     case MB_TIMEOUT:
  96.         fprintf( stdout, "\nTIMEOUT[%i]\n", msg_id );
  97.         break;
  98.     case MB_REGISTER:
  99.         fprintf( stdout, "\n%s\n", msg );
  100.         break;
  101.     case MB_PROBE:
  102.         fprintf( stdout, "\n%s\n", msg );
  103.         break;
  104.     default:
  105.         fprintf( stderr, "\n%s?\n", mbexp.port_name ? mbexp.port_name : MB_PORTNAME );
  106.         mbexp_exit( 2 );
  107.         break;
  108.     }
  109. }
  110.  
  111. void mbexp_register_as( char *app_name, int sync ) {
  112.     int n;
  113.  
  114.     if ( mbexp.mb_socket != -1 ) {
  115.         if ( (n = mb_register( mbexp.mb_socket, ++mbexp.mb_msg_id, app_name, sync )) < 0 )
  116.             mbexp.mb_socket = -1;
  117.         else {
  118.             if ( sync )
  119.                 fprintf( stdout, "%i\n", n );
  120.         }
  121.     }
  122. }
  123.  
  124. void mbexp_probe( char *app_name, int sync ) {
  125.     int n;
  126.  
  127.     if ( mbexp.mb_socket != -1 ) {
  128.         if ( (n = mb_probe( mbexp.mb_socket, ++mbexp.mb_msg_id, app_name, sync )) < 0 )
  129.             mbexp.mb_socket = -1;
  130.         else {
  131.             if ( sync )
  132.                 fprintf( stdout, "%i\n", n );
  133.         }
  134.     }
  135. }
  136.  
  137. void mbexp_send_data( char *peer_name, u_int len, u_char *msg, int mode ) {
  138.     if ( mbexp.mb_socket != -1 )
  139.         if ( mb_send( mbexp.mb_socket, peer_name, mode, ++mbexp.mb_msg_id, len, msg ) < 0 )
  140.             mbexp.mb_socket = -1;
  141. }
  142.  
  143. static void mbexp_send( ) {
  144.     char text[ 4096 ];
  145.     u_int len;
  146.    
  147.     char *nl;
  148.  
  149.     if ( !fgets( text, sizeof( text ), stdin ) )
  150.         mbexp_exit( 0 );
  151.  
  152.     if ((nl = strchr( text, '\n' )))
  153.         *nl = 0;
  154.  
  155.     if ( (len = strlen( text )) > 0 )
  156.         mbexp_send_data( mbexp.peer_name, len, (u_char *)text, mbexp.mode );
  157. }
  158.  
  159. static void startup( ) {
  160.     mbexp_bind( mbexp.host_name );
  161.     if ( mbexp.mb_socket == -1 )
  162.         mbexp_exit( 1 );
  163.     if ( mbexp.domain_name )
  164.         mbexp_register_as( mbexp.domain_name, 0 );
  165. }
  166.  
  167. static void main_loop( ) {
  168.     fd_set read_fds;
  169.     int n_fds = FD_SETSIZE;
  170.  
  171.     for ( ;; ) {    /* forever */
  172.         FD_ZERO( &read_fds );
  173.  
  174.         FD_SET( 0, &read_fds );
  175.  
  176.         if ( mbexp.mb_socket != -1 )
  177.             FD_SET( mbexp.mb_socket, &read_fds );
  178.  
  179.         switch ( select( n_fds, &read_fds, 0, 0, 0 )) {
  180.         case -1:    /* trouble */
  181.             if ( errno != EINTR )
  182.                 mbexp_exit( errno );
  183.             break;
  184.         case 0:     /* time out */
  185.             break;
  186.         default:    /* event */
  187.             if ( FD_ISSET( 0, &read_fds ))
  188.                 mbexp_send( );
  189.             if ( mbexp.mb_socket != -1 && FD_ISSET( mbexp.mb_socket, &read_fds ))
  190.                 mbexp_receive_data( mbexp.mb_socket );
  191.             break;
  192.         }
  193.     }
  194. }
  195.  
  196. int main( int argc, char **argv ) {
  197.     extern int opterr;
  198.  
  199.     int c;
  200.  
  201.     mbexp.mode = MB_ONEWAY;
  202.     mbexp.mb_socket = -1;
  203.  
  204.     opterr = 0;
  205.  
  206.     while ( (c = getopt( argc, argv, "m:" )) != -1 )
  207.         switch ( c ) {
  208.         case 'm':
  209.             if ( strcmp( optarg, "oneway" ) == 0 )
  210.                 mbexp.mode = MB_ONEWAY;
  211.             else if ( strcmp( optarg, "twoway" ) == 0 )
  212.                 mbexp.mode = MB_TWOWAY;
  213.             else if ( strcmp( optarg, "multiway" ) == 0 )
  214.                 mbexp.mode = MB_MULTIWAY;
  215.             else
  216.                 goto error;
  217.             break;
  218.         case '?':
  219.         default:
  220.         error:
  221.             fprintf( stderr, "%s [-m oneway|twoway|multiway] peer_name [domain_name]\n", argv[ 0 ] );
  222.             exit( 1 );
  223.         }
  224.  
  225.     switch ( argc - optind ) {
  226.     case 2:
  227.         mbexp.domain_name = argv[ optind + 1 ];
  228.         /* fall thru */
  229.     case 1:
  230.         mbexp.peer_name = argv[ optind ];
  231.         break;
  232.     default:
  233.         goto error;
  234.     }
  235.  
  236.     startup( );
  237.     main_loop( );
  238. }

Comments

Your comment:
[p] [b] [i] [u] [s] [quote] [pre] [br] [code] [url] [email] strip help 2000

Enter a maximum of 2000 characters.
Improve the presentation of your text with the following formatting tags:
[p]paragraph[/p], [b]bold[/b], [i]italics[/i], [u]underline[/u], [s]strike[/s], [quote]citation[/quote], [pre]as is[/pre], [br]line break,
[url]http://www.izend.org[/url], [url=http://www.izend.org]site[/url], [email]izend@izend.org[/email], [email=izend@izend.org]izend[/email],
[code]command[/code], [code=language]source code in c, java, php, html, javascript, xml, css, sql, bash, dos, make, etc.[/code].