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

  1. /******************************************************************************/
  2. /* Module  : addr_s.c                                                         */
  3. /* Purpose : Perform the necessary setup for the server manager code          */
  4. /*           module addr_m.c. This module registers manager EPV,              */
  5. /*           selects all protocol sequences available, advertises the server  */
  6. /*           and listens for RPC requests. Uses object UUID.                  */
  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 "look.h"
  16.  
  17. #define MAX_CONC_CALLS_PROTSEQ  4       /* Max concurrent calls per protocol. */
  18. #define MAX_CONC_CALLS_TOTAL    8       /* Max concurrent calls total.        */
  19. #define ENTRY_NAME "/.:/Servers/Addr"   /* Server entry name.                 */
  20.  
  21. extern look_v1_0_epv_t epv_addr;        /* Address manager EPV table.         */
  22.  
  23. int main ( int argc, char *argv[] )
  24. {
  25.    /* Define the object UUID vector.                                          */
  26.    struct obj_uuid_vec_t {
  27.       unsigned32 count;
  28.       uuid_t *vec[ 1 ];
  29.    } obj_uuid_vec;
  30.  
  31.    uuid_t obj_uuid_addr, type_uuid_addr;
  32.  
  33.    rpc_binding_vector_t *bv_p;
  34.    unsigned32 status;
  35.  
  36.    /* Statements for Ctrl-C handling.                                         */
  37.    sigset_t sigs;
  38.    pthread_t setup_thread = pthread_self ();
  39. #ifdef IBMOS2
  40.    pthread_inst_exception_handler ();
  41. #endif
  42.  
  43.    /* Create object UUID for the address manager from string.                 */
  44.    uuid_from_string ( ADDR_OBJ_UUID, &obj_uuid_addr, &status );
  45.    ERRCHK ( status );
  46.  
  47.    /* Initialize the type UUID.                                               */
  48.    uuid_create ( &type_uuid_addr, &status );
  49.  
  50.    /* Associate object UUID with type UUID.                                   */
  51.    rpc_object_set_type ( &obj_uuid_addr, &type_uuid_addr, &status );
  52.    ERRCHK ( status );
  53.  
  54.    /* Register interface/epv associations with RPC runtime.                   */
  55.    printf("Registering server interface with RPC runtime...\n");
  56.    rpc_server_register_if ( look_v1_0_s_ifspec, &type_uuid_addr,
  57.                             ( rpc_mgr_epv_t )&epv_addr, &status );
  58.    ERRCHK ( status );
  59.  
  60.    /* Inform RPC runtime to use selected protocol sequences.                  */
  61.    switch ( (( argc > 1 ) ? *argv[1] | ' ' : 'a') ) {
  62.    case 't':
  63.       rpc_server_use_protseq ("ncacn_ip_tcp", MAX_CONC_CALLS_PROTSEQ, &status );
  64.       break;
  65.    case 'u':
  66.       rpc_server_use_protseq ("ncadg_ip_udp", MAX_CONC_CALLS_PROTSEQ, &status );
  67.       break;
  68.    case 'a':
  69.    default:
  70.       rpc_server_use_all_protseqs ( MAX_CONC_CALLS_PROTSEQ, &status );
  71.    }
  72.    ERRCHK ( status );
  73.  
  74.    /* Get the binding handle vector from RPC runtime.                         */
  75.    rpc_server_inq_bindings ( &bv_p, &status );
  76.    ERRCHK ( status );
  77.  
  78.    /* Initialize the object UUID vector.                                      */
  79.    obj_uuid_vec.count = 1;
  80.    obj_uuid_vec.vec[ 0 ] = &obj_uuid_addr;
  81.  
  82.    /* Register binding information with endpoint map, including object UUID.  */
  83.    printf("Registering server endpoints with endpoint mapper (RPCD)...\n");
  84.    rpc_ep_register ( look_v1_0_s_ifspec, bv_p,
  85.                      ( uuid_vector_t * )&obj_uuid_vec,
  86.                      ( unsigned_char_t * )"Address server, version 1.0",
  87.                      &status );
  88.    ERRCHK ( status );
  89.  
  90.    /* Export binding information to the namespace, including object UUID.     */
  91.    printf("Exporting server bindings into CDS namespace...\n");
  92.    rpc_ns_binding_export ( rpc_c_ns_syntax_dce, ENTRY_NAME,
  93.                            look_v1_0_s_ifspec, bv_p,
  94.                            ( uuid_vector_t * )&obj_uuid_vec, &status );
  95.    ERRCHK ( status );
  96.  
  97.    /* Ctrl-C handling to remove stale entries.                                */
  98.  
  99.    /* Make sure the setup thread receives the Ctrl-C in non-OS2 machines.     */
  100.    sigemptyset ( &sigs );
  101.    sigaddset ( &sigs, SIGINT );
  102.    sigaddset ( &sigs, SIGTERM );
  103.    if ( pthread_signal_to_cancel_np ( &sigs, &setup_thread ) != 0 ) {
  104.       printf ( "Error in pthread_signal_to_cancel_np\n" );
  105.       exit ( 1 );
  106.    }
  107.  
  108.    TRY {
  109.    /* Listen for service requests.                                            */
  110.    printf ( "Server %s listening...\n", ENTRY_NAME );
  111.    rpc_server_listen ( MAX_CONC_CALLS_TOTAL, &status );
  112.    ERRCHK ( status );
  113.    }
  114.    CATCH_ALL {
  115.    /* Upon receiving a Ctrl-C ...                                             */
  116.    /* Remove the entry from the CDS.                                          */
  117.       printf("Unexporting server bindings from CDS namespace...\n");
  118.       rpc_ns_binding_unexport ( rpc_c_ns_syntax_dce, ENTRY_NAME,
  119.                                 look_v1_0_s_ifspec,
  120.                                 ( uuid_vector_t * )&obj_uuid_vec, &status );
  121.       ERRCHK ( status );
  122.  
  123.    /* Unregister the interface.                                               */
  124.       printf("Unregistering server interface with RPC runtime...\n");
  125.       rpc_server_unregister_if ( look_v1_0_s_ifspec,
  126.                                  (uuid_t *)&type_uuid_addr, &status );
  127.       ERRCHK ( status );
  128.  
  129.    /* Remove the entry from the endpoint map.                                 */
  130.       printf("Unregistering server endpoints with endpoint mapper (RPCD)...\n");
  131.       rpc_ep_unregister ( look_v1_0_s_ifspec, bv_p,
  132.                           ( uuid_vector_t * )&obj_uuid_vec, &status );
  133.       ERRCHK ( status );
  134.  
  135. #ifdef IBMOS2
  136.       pthread_dinst_exception_handler();
  137. #endif
  138.  
  139.       exit ( 0 );
  140.       }
  141.    ENDTRY;
  142. }
  143.