home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 164.lha / IPC / ManxDemo / Have.c < prev    next >
C/C++ Source or Header  |  1988-04-28  |  4KB  |  128 lines

  1. /*   HAVE.C     Server for Peter/Pete's IPC system.        bjw  june 88 */
  2.  
  3. /*
  4. //              This server provides the function of multiplication:
  5. //              You pass two numbers, the result is their product.  This is
  6. //              meant to be a pseudo-test suite for the Manx IPC product.
  7. //              Send us a BREAK C to cause us to exit.
  8. //
  9. //              bjw             25-june-88      Initial coding.
  10. //              Pete G.         4-aug-88        Minor revisions
  11. */
  12.  
  13.  
  14. #include <exec/types.h>
  15.  
  16. #include "IPC.H"
  17.  
  18. #include <stdio.h>
  19.  
  20. #ifdef AZTEC_C
  21. #include <functions.h>
  22. #endif
  23.  
  24. #define  VERSION    "0.01"
  25. #define  IPC_NAME   "MULT"
  26. #define  BREAK_C    (1L<<12)
  27.  
  28. #define  ID_NUMBER  MAKE_ID('N','U','M','B')
  29.  
  30.  
  31. /* ---------------------  Global Variables  -------------------------- */
  32.  
  33.  
  34. struct IPCPort   *port;                        /* Our point of service */
  35.  
  36.  
  37. /*  These functions to ensure proper type-casting
  38.  *    have been moved into IPC.h for more general use [-- Pete --].
  39.  *
  40.  * #define GetIPCMessage(port) ((struct IPCMessage *)GetMsg(port))
  41.  * #define ReplyIPCMessage(msg)  ReplyMsg(&(msg)->ipc_Msg)
  42.  *
  43.  *  [Pete also added in IPC.h:]
  44.  *  SigBitIPCPort(port)
  45.  *  -- a macro to return the signal bit of a port.
  46.  */
  47.  
  48.  
  49. /* ---------------------  The Code Beginneth  ------------------------ */
  50.  
  51.  
  52.         void
  53. work (mp)
  54.         struct IPCMessage  *mp;
  55. {
  56.         register struct IPCItem     *items;
  57.         long      n1, n2, p;
  58.  
  59.         items = & mp->ipc_Items[0];
  60.  
  61.         /* 1.  Check that types are OK: */
  62.         if ((mp->ipc_ItemCount != 3) ||
  63.                 (items[1].ii_Id != ID_NUMBER) ||
  64.                 (items[1].ii_Size != 0) ||
  65.                 (items[2].ii_Id != ID_NUMBER) ||
  66.                 (items[2].ii_Size != 0) ||
  67.                 (items[0].ii_Size != 0) )       /* Make sure nothing attached here */
  68.         {
  69.                 mp->ipc_Flags |= IPC_NOTKNOWN;
  70.                 return ;                /* BAD ! */
  71.         }
  72.  
  73.         /* 2.  Do the work we came here for: */
  74.         n1 = (long) items[1].ii_Ptr;
  75.         n2 = (long) items[2].ii_Ptr;
  76.         p = n1 * n2;
  77.  
  78.         /* 3.  Now store result, storing an indentifier: */
  79.         items[0].ii_Id = ID_NUMBER;
  80.         items[0].ii_Flags = IPC_MODIFIED | IPC_NETWORK;
  81.  /*     items[0].ii_Size = 0L;  ** this is checked above */
  82.         items[0].ii_Ptr = (void *) p;
  83.  
  84.         fprintf (stderr, "%s (%ld, %ld) --> %ld.\n", IPC_NAME, n1, n2, p);
  85.  
  86. }       /* work */
  87.  
  88.  
  89. main ()
  90. {
  91.         struct IPCMessage   *msg;
  92.         long  wait_flags, wake_flags;
  93.         int   done = 0;
  94.  
  95.         fprintf (stderr, "[%s, %s]\n", IPC_NAME, VERSION);
  96.         port = ServeIPCPort (IPC_NAME);
  97.         if (port == NULL)
  98.         {
  99.                 fprintf (stderr, "Some one already serving\n");
  100.                 exit (1);
  101.         }
  102.  
  103.         wait_flags = BREAK_C | SigBitIPCPort(port);
  104.         while (! done)
  105.         {
  106.                 wake_flags = Wait (wait_flags);
  107.                 if (wake_flags & BREAK_C)
  108.                 {
  109.                         /* Shutting the port here avoids having to drain port later! */
  110.                 ShutIPCPort (port);
  111.                         done = 1;
  112.                 }
  113.  
  114.                 while ((msg=GetIPCMessage(port)) != NULL)
  115.                 {
  116.                         work (msg);                     /* Perform the work */
  117.                         ReplyIPCMessage (msg);
  118.                 }
  119.  
  120.         }
  121.  
  122.         /*  Cleanup and Exit: */
  123.         LeaveIPCPort (port);
  124.  
  125.         fprintf (stderr, "%s exiting..\n", IPC_NAME);
  126. }       /* main */
  127.  
  128.