home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / mach / doc / unpublished / examples / randomServer.c.Z / randomServer.c
Encoding:
C/C++ Source or Header  |  1989-12-30  |  6.2 KB  |  267 lines

  1. /* Module random */
  2.  
  3. #define EXPORT_BOOLEAN
  4. #include <mach/boolean.h>
  5. #include <mach/message.h>
  6. #include <mach/mig_errors.h>
  7.  
  8. #ifndef    mig_internal
  9. #define    mig_internal    static
  10. #endif
  11.  
  12. #ifndef    TypeCheck
  13. #define    TypeCheck 1
  14. #endif
  15.  
  16. #ifndef    UseExternRCSId
  17. #ifdef    __HC__
  18. #define    UseExternRCSId        1
  19. #endif
  20. #endif
  21.  
  22. #ifndef    UseStaticMsgType
  23. #if    !defined(__HC__) || defined(__STDC__)
  24. #define    UseStaticMsgType    1
  25. #endif
  26. #endif
  27.  
  28. /* Due to pcc compiler bug, cannot use void */
  29. #if    (defined(__STDC__) || defined(c_plusplus)) || defined(__HC__)
  30. #define novalue void
  31. #else
  32. #define novalue int
  33. #endif
  34.  
  35. #define msg_request_port    msg_local_port
  36. #define msg_reply_port        msg_remote_port
  37. #include <mach/std_types.h>
  38. #include "random_types.h"
  39.  
  40. /* Routine get_random */
  41. mig_internal novalue _Xget_random
  42. #if    (defined(__STDC__) || defined(c_plusplus))
  43.     (msg_header_t *InHeadP, msg_header_t *OutHeadP)
  44. #else
  45.     (InHeadP, OutHeadP)
  46.     msg_header_t *InHeadP, *OutHeadP;
  47. #endif
  48. {
  49.     typedef struct {
  50.         msg_header_t Head;
  51.     } Request;
  52.  
  53.     typedef struct {
  54.         msg_header_t Head;
  55.         msg_type_t RetCodeType;
  56.         kern_return_t RetCode;
  57.         msg_type_t numType;
  58.         int num;
  59.     } Reply;
  60.  
  61.     register Request *In0P = (Request *) InHeadP;
  62.     register Reply *OutP = (Reply *) OutHeadP;
  63.     extern kern_return_t get_random
  64. #if    (defined(__STDC__) || defined(c_plusplus))
  65.         (port_t server_port, int *num);
  66. #else
  67.         ();
  68. #endif
  69.  
  70. #if    TypeCheck
  71.     boolean_t msg_simple;
  72. #endif    TypeCheck
  73.  
  74.     unsigned int msg_size;
  75.  
  76. #if    UseStaticMsgType
  77.     static msg_type_t numType = {
  78.         /* msg_type_name = */        MSG_TYPE_INTEGER_32,
  79.         /* msg_type_size = */        32,
  80.         /* msg_type_number = */        1,
  81.         /* msg_type_inline = */        TRUE,
  82.         /* msg_type_longform = */    FALSE,
  83.         /* msg_type_deallocate = */    FALSE,
  84.         /* msg_type_unused = */        0
  85.     };
  86. #endif    UseStaticMsgType
  87.  
  88. #if    TypeCheck
  89.     msg_size = In0P->Head.msg_size;
  90.     msg_simple = In0P->Head.msg_simple;
  91.     if ((msg_size != 24) || (msg_simple != TRUE))
  92.         { OutP->RetCode = MIG_BAD_ARGUMENTS; return; }
  93. #endif    TypeCheck
  94.  
  95.     OutP->RetCode = get_random(In0P->Head.msg_request_port, &OutP->num);
  96. #ifdef    label_punt0
  97. #undef    label_punt0
  98. punt0:
  99. #endif    label_punt0
  100.     if (OutP->RetCode != KERN_SUCCESS)
  101.         return;
  102.  
  103.     msg_size = 40;
  104.  
  105. #if    UseStaticMsgType
  106.     OutP->numType = numType;
  107. #else    UseStaticMsgType
  108.     OutP->numType.msg_type_name = MSG_TYPE_INTEGER_32;
  109.     OutP->numType.msg_type_size = 32;
  110.     OutP->numType.msg_type_number = 1;
  111.     OutP->numType.msg_type_inline = TRUE;
  112.     OutP->numType.msg_type_longform = FALSE;
  113.     OutP->numType.msg_type_deallocate = FALSE;
  114.     OutP->numType.msg_type_unused = 0;
  115. #endif    UseStaticMsgType
  116.  
  117.     OutP->Head.msg_simple = TRUE;
  118.     OutP->Head.msg_size = msg_size;
  119. }
  120.  
  121. /* Routine get_secret */
  122. mig_internal novalue _Xget_secret
  123. #if    (defined(__STDC__) || defined(c_plusplus))
  124.     (msg_header_t *InHeadP, msg_header_t *OutHeadP)
  125. #else
  126.     (InHeadP, OutHeadP)
  127.     msg_header_t *InHeadP, *OutHeadP;
  128. #endif
  129. {
  130.     typedef struct {
  131.         msg_header_t Head;
  132.     } Request;
  133.  
  134.     typedef struct {
  135.         msg_header_t Head;
  136.         msg_type_t RetCodeType;
  137.         kern_return_t RetCode;
  138.         msg_type_t passwordType;
  139.         string25 password;
  140.         char passwordPad[3];
  141.     } Reply;
  142.  
  143.     register Request *In0P = (Request *) InHeadP;
  144.     register Reply *OutP = (Reply *) OutHeadP;
  145.     extern kern_return_t get_secret
  146. #if    (defined(__STDC__) || defined(c_plusplus))
  147.         (port_t server_port, string25 password);
  148. #else
  149.         ();
  150. #endif
  151.  
  152. #if    TypeCheck
  153.     boolean_t msg_simple;
  154. #endif    TypeCheck
  155.  
  156.     unsigned int msg_size;
  157.  
  158. #if    UseStaticMsgType
  159.     static msg_type_t passwordType = {
  160.         /* msg_type_name = */        MSG_TYPE_STRING_C,
  161.         /* msg_type_size = */        200,
  162.         /* msg_type_number = */        1,
  163.         /* msg_type_inline = */        TRUE,
  164.         /* msg_type_longform = */    FALSE,
  165.         /* msg_type_deallocate = */    FALSE,
  166.         /* msg_type_unused = */        0
  167.     };
  168. #endif    UseStaticMsgType
  169.  
  170. #if    TypeCheck
  171.     msg_size = In0P->Head.msg_size;
  172.     msg_simple = In0P->Head.msg_simple;
  173.     if ((msg_size != 24) || (msg_simple != TRUE))
  174.         { OutP->RetCode = MIG_BAD_ARGUMENTS; return; }
  175. #endif    TypeCheck
  176.  
  177.     OutP->RetCode = get_secret(In0P->Head.msg_request_port, OutP->password);
  178. #ifdef    label_punt0
  179. #undef    label_punt0
  180. punt0:
  181. #endif    label_punt0
  182.     if (OutP->RetCode != KERN_SUCCESS)
  183.         return;
  184.  
  185.     msg_size = 64;
  186.  
  187. #if    UseStaticMsgType
  188.     OutP->passwordType = passwordType;
  189. #else    UseStaticMsgType
  190.     OutP->passwordType.msg_type_name = MSG_TYPE_STRING_C;
  191.     OutP->passwordType.msg_type_size = 200;
  192.     OutP->passwordType.msg_type_number = 1;
  193.     OutP->passwordType.msg_type_inline = TRUE;
  194.     OutP->passwordType.msg_type_longform = FALSE;
  195.     OutP->passwordType.msg_type_deallocate = FALSE;
  196.     OutP->passwordType.msg_type_unused = 0;
  197. #endif    UseStaticMsgType
  198.  
  199.     OutP->Head.msg_simple = TRUE;
  200.     OutP->Head.msg_size = msg_size;
  201. }
  202.  
  203. boolean_t random_server
  204. #if    (defined(__STDC__) || defined(c_plusplus))
  205.     (msg_header_t *InHeadP, msg_header_t *OutHeadP)
  206. #else
  207.     (InHeadP, OutHeadP)
  208.     msg_header_t *InHeadP, *OutHeadP;
  209. #endif
  210. {
  211.     register msg_header_t *InP =  InHeadP;
  212.     register death_pill_t *OutP = (death_pill_t *) OutHeadP;
  213.  
  214. #if    UseStaticMsgType
  215.     static msg_type_t RetCodeType = {
  216.         /* msg_type_name = */        MSG_TYPE_INTEGER_32,
  217.         /* msg_type_size = */        32,
  218.         /* msg_type_number = */        1,
  219.         /* msg_type_inline = */        TRUE,
  220.         /* msg_type_longform = */    FALSE,
  221.         /* msg_type_deallocate = */    FALSE,
  222.         /* msg_type_unused = */        0
  223.     };
  224. #endif    UseStaticMsgType
  225.  
  226.     OutP->Head.msg_simple = TRUE;
  227.     OutP->Head.msg_size = sizeof *OutP;
  228.     OutP->Head.msg_type = InP->msg_type;
  229.     OutP->Head.msg_local_port = PORT_NULL;
  230.     OutP->Head.msg_remote_port = InP->msg_reply_port;
  231.     OutP->Head.msg_id = InP->msg_id + 100;
  232.  
  233. #if    UseStaticMsgType
  234.     OutP->RetCodeType = RetCodeType;
  235. #else    UseStaticMsgType
  236.     OutP->RetCodeType.msg_type_name = MSG_TYPE_INTEGER_32;
  237.     OutP->RetCodeType.msg_type_size = 32;
  238.     OutP->RetCodeType.msg_type_number = 1;
  239.     OutP->RetCodeType.msg_type_inline = TRUE;
  240.     OutP->RetCodeType.msg_type_longform = FALSE;
  241.     OutP->RetCodeType.msg_type_deallocate = FALSE;
  242.     OutP->RetCodeType.msg_type_unused = 0;
  243. #endif    UseStaticMsgType
  244.     OutP->RetCode = MIG_BAD_ID;
  245.  
  246.     if ((InP->msg_id > 501) || (InP->msg_id < 500))
  247.         return FALSE;
  248.     else {
  249.         typedef novalue (*SERVER_STUB_PROC)
  250. #if    (defined(__STDC__) || defined(c_plusplus))
  251.             (msg_header_t *, msg_header_t *);
  252. #else
  253.             ();
  254. #endif
  255.         static SERVER_STUB_PROC routines[] = {
  256.             _Xget_random,
  257.             _Xget_secret,
  258.         };
  259.  
  260.         if (routines[InP->msg_id - 500])
  261.             (routines[InP->msg_id - 500]) (InP, &OutP->Head);
  262.          else
  263.             return FALSE;
  264.     }
  265.     return TRUE;
  266. }
  267.