home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Collection - Online Library - January 1996 / CKITOS2196.ISO / diskette / gg244090.dsk / unc.dsk / CHAPTER.07 / MATHO_S.C < prev    next >
C/C++ Source or Header  |  1993-10-28  |  7KB  |  174 lines

  1. /******************************************************************************/
  2. /* Module  : matho_s.c                                                        */
  3. /* Purpose : Perform the necessary setup for the server manager code          */
  4. /*           module matho_m.c. This module registers manager EPV,             */
  5. /*           selects all protocol sequences available, advertises the server  */
  6. /*           and listens for RPC requests. Uses object UUIDs.                 */
  7. /******************************************************************************/
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <pthread.h>
  12. #include <sys/types.h>
  13. #include <dce/rpc.h>
  14. #include "errchk.h"
  15. #include "matho.h"
  16.  
  17. #define MAX_CONC_CALLS_PROTSEQ  4       /* Max concurrent call per protocol.  */
  18. #define MAX_CONC_CALLS_TOTAL    8       /* Max concurrent calls total.        */
  19. #define ENTRY_NAME "/.:/Servers/MathO"  /* Server entry name.                 */
  20.  
  21. extern matho_v1_0_epv_t epv_int;        /* Integer manager EPV table.         */
  22. extern matho_v1_0_epv_t epv_float;      /* Float manager EPV table.           */
  23.  
  24. char **argv_global;
  25.  
  26. int main ( int argc, char *argv[] )
  27. {
  28.    /* Define the object UUID vector.                                          */
  29.    struct obj_uuid_vec_t {
  30.       unsigned32 count;
  31.       uuid_t *vec[ 3 ];
  32.    } obj_uuid_vec;
  33.  
  34.    uuid_t obj_uuid_int, obj_uuid_float, obj_uuid_double,
  35.           type_uuid_int, type_uuid_float;
  36.    rpc_binding_vector_t *bv_p;
  37.    unsigned32 status;
  38.  
  39.    /* Statements for Ctrl-C handling.                                         */
  40.    sigset_t sigs;
  41.    pthread_t setup_thread;
  42. #ifdef IBMOS2
  43.    pthread_inst_exception_handler ();
  44. #endif
  45.    setup_thread = pthread_self ();
  46.  
  47.    /* Create object UUID for integer and float math managers from string.     */
  48.    uuid_from_string ( OBJ_UUID_INT, &obj_uuid_int, &status );
  49.    ERRCHK ( status );
  50.    uuid_from_string ( OBJ_UUID_FLOAT, &obj_uuid_float, &status );
  51.    ERRCHK ( status );
  52.    uuid_from_string ( OBJ_UUID_DOUBLE, &obj_uuid_double, &status );
  53.    ERRCHK ( status );
  54.  
  55.  
  56.    /* Initialize type UUIDs.                                                  */
  57.    uuid_create ( &type_uuid_int, &status );
  58.    ERRCHK ( status );
  59.    uuid_create ( &type_uuid_float, &status );
  60.    ERRCHK ( status );
  61.  
  62.    /* Associate object UUIDs with type UUIDs.                                 */
  63.    rpc_object_set_type ( &obj_uuid_int, &type_uuid_int, &status );
  64.    ERRCHK ( status );
  65.    rpc_object_set_type ( &obj_uuid_float, &type_uuid_float, &status );
  66.    ERRCHK ( status );
  67.    rpc_object_set_type ( &obj_uuid_double, &type_uuid_float, &status );
  68.    ERRCHK ( status );
  69.  
  70.    /* Register interface/epv associations with RPC runtime.                   */
  71.    printf("Registering server interface with RPC runtime...\n");
  72.    rpc_server_register_if ( matho_v1_0_s_ifspec, &type_uuid_int,
  73.                             ( rpc_mgr_epv_t )&epv_int, &status );
  74.    ERRCHK ( status );
  75.    rpc_server_register_if ( matho_v1_0_s_ifspec, &type_uuid_float,
  76.                             ( rpc_mgr_epv_t )&epv_float, &status );
  77.    ERRCHK ( status );
  78.  
  79.  
  80.    /* Inform RPC runtime to use selected protocol sequences.                  */
  81.    switch ( (( argc > 1 ) ? *argv[1] | ' ' : 'a') ) {
  82.    case 't':
  83.       rpc_server_use_protseq ("ncacn_ip_tcp", MAX_CONC_CALLS_PROTSEQ, &status );
  84.       break;
  85.    case 'u':
  86.       rpc_server_use_protseq ("ncadg_ip_udp", MAX_CONC_CALLS_PROTSEQ, &status );
  87.       break;
  88.    case 'a':
  89.    default:
  90.       rpc_server_use_all_protseqs ( MAX_CONC_CALLS_PROTSEQ, &status );
  91.    }
  92.    ERRCHK ( status );
  93.  
  94.    /* Get the binding handle vector from RPC runtime.                         */
  95.    rpc_server_inq_bindings ( &bv_p, &status );
  96.    ERRCHK ( status );
  97.  
  98.    /* Initialize the object UUID vector.                                      */
  99.    obj_uuid_vec.count = 3;
  100.    obj_uuid_vec.vec[ 0 ] = &obj_uuid_int;
  101.    obj_uuid_vec.vec[ 1 ] = &obj_uuid_float;
  102.    obj_uuid_vec.vec[ 2 ] = &obj_uuid_double;
  103.  
  104.    /* Register binding information with endpoint map, including object UUIDs. */
  105.    printf("Registering server endpoints with endpoint mapper (RPCD)...\n");
  106.    rpc_ep_register ( matho_v1_0_s_ifspec, bv_p,
  107.                      ( uuid_vector_t * )&obj_uuid_vec,
  108.                      ( unsigned_char_t * )"Object math server, version 1.0",
  109.                      &status );
  110.    ERRCHK ( status );
  111.  
  112.    /* Export binding information to the namespace, including object UUIDs.    */
  113.    printf("Exporting server bindings into CDS namespace...\n");
  114.    rpc_ns_binding_export ( rpc_c_ns_syntax_dce, ENTRY_NAME,
  115.                            matho_v1_0_s_ifspec, bv_p,
  116.                            ( uuid_vector_t * )&obj_uuid_vec, &status );
  117.    ERRCHK ( status );
  118.  
  119.    /* Make argv available to the manager routines.                            */
  120.    argv_global = argv;
  121.  
  122.    /* Ctrl-C handling to remove stale entries.                                */
  123.  
  124.    /* Make sure the setup thread receives the Ctrl-C in non-OS2 machines.     */
  125.    sigemptyset ( &sigs );
  126.    sigaddset ( &sigs, SIGINT );
  127.    sigaddset ( &sigs, SIGTERM );
  128.    if ( pthread_signal_to_cancel_np ( &sigs, &setup_thread ) != 0 ) {
  129.       printf ( "Error in pthread_signal_to_cancel_np\n" );
  130.       exit ( 1 );
  131.    }
  132.  
  133.    TRY {
  134.    /* Listen for service requests.                                            */
  135.    printf ( "Server %s listening...\n", ENTRY_NAME );
  136.    rpc_server_listen ( MAX_CONC_CALLS_TOTAL, &status );
  137.    ERRCHK ( status );
  138.    }
  139.    CATCH_ALL {
  140.    /* Upon receiving a Ctrl-C ...
  141.    /* Unregister the interface for all object UUIDs.                          */
  142.       printf ( "Interface being unregistered\n" );
  143.  
  144.    /* Remove the binding information from CDS.                                */
  145.       printf("Unexporting server bindings from CDS namespace...\n");
  146.       rpc_ns_binding_unexport ( rpc_c_ns_syntax_dce, ENTRY_NAME,
  147.                                 matho_v1_0_s_ifspec,
  148.                                 ( uuid_vector_t * )&obj_uuid_vec, &status );
  149.       ERRCHK ( status );
  150.  
  151.  
  152.       printf("Unregistering server interface with RPC runtime...\n");
  153.       rpc_server_unregister_if ( matho_v1_0_s_ifspec,
  154.                                  (uuid_t *)&type_uuid_int, &status );
  155.       ERRCHK ( status );
  156.       rpc_server_unregister_if ( matho_v1_0_s_ifspec,
  157.                                  (uuid_t *)&type_uuid_float, &status );
  158.       ERRCHK ( status );
  159.  
  160.    /* Remove the entries from the endpoint map for all object UUIDs.          */
  161.       printf("Unregistering server endpoints with endpoint mapper (RPCD)...\n");
  162.       rpc_ep_unregister ( matho_v1_0_s_ifspec, bv_p,
  163.                           ( uuid_vector_t * )&obj_uuid_vec, &status );
  164.       ERRCHK ( status );
  165.  
  166. #ifdef IBMOS2
  167.    pthread_dinst_exception_handler ();
  168. #endif
  169.  
  170.       exit ( 0 );
  171.       }
  172.    ENDTRY;
  173. }
  174.