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

  1. /*   GET.C     Client for Peter/Pete's IPC system.        bjw  june 88 */
  2.  
  3. /*
  4. //              This client requests the function of multiplication:
  5. //              You pass two numbers, the result is their product.  This is
  6. //              meant to be a pseduo-test suite for the Manx IPC product.
  7. //              Reads numbers from command line only.
  8. //
  9. //              bjw             25-june-88      Initial coding.
  10. //              Pete G.         4-aug-88        Revisions
  11. //
  12. //  [In my capacity as "editor", I've taken the liberty of making several
  13. //   changes in Brian's original, for various necessary reasons.  I hope
  14. /    he'll forgive me.   -- Pete --]
  15. */
  16.  
  17.  
  18. #include <exec/types.h>
  19.  
  20. #include "IPC.H"
  21.  
  22. #include <stdio.h>
  23.  
  24. #ifdef AZTEC_C
  25. #include <functions.h>
  26. #endif
  27.  
  28. #define  VERSION    "0.02"
  29. #define  IPC_NAME   "MULT"
  30.  
  31. #define  ID_NUMBER  MAKE_ID('N','U','M','B')
  32.  
  33. extern long  atol ();
  34.  
  35.  
  36. /* ---------------------  Global Variables  -------------------------- */
  37.  
  38.  
  39. struct IPCPort   *port;                       /* Our point of service */
  40. struct MsgPort   *reply;
  41.  
  42.  
  43. /* ----------------------  Primitive Code  --------------------------- */
  44.  
  45. fillItem (item, number)
  46.         struct IPCItem  *item;
  47.         long   number;
  48. {
  49.  
  50.         item->ii_Id = ID_NUMBER;
  51.         item->ii_Flags = IPC_TRANSFER | IPC_NETWORK;
  52.         item->ii_Size = 0;
  53.         item->ii_Ptr = (void *) number;
  54. }
  55.  
  56.  
  57. /* ---------------------  The Code Beginneth  ------------------------ */
  58.  
  59. /*
  60.  *  This procedure sends a single message
  61.  */
  62.         long
  63. send (str1, str2)
  64.         char  *str1, *str2;
  65. {
  66.         register struct IPCMessage   *msg;
  67.         long   n1, n2;
  68.         long   res;
  69.  
  70.         n1 = atol (str1);
  71.         n2 = atol (str2);
  72.  
  73.         msg = CreateIPCMsg (3, 0, reply);
  74.         if (!msg) return -1;
  75.  
  76.         msg->ipc_Items[0].ii_Size = 0;          /* Server provides result here */
  77.         fillItem (& msg->ipc_Items[1], n1);
  78.         fillItem (& msg->ipc_Items[2], n2);
  79.  
  80.         if (PutIPCMsg (port, msg)) /* MUST always check that it got sent! */
  81.             WaitPort (reply);               /* Get the reply */
  82.  
  83.         if (((msg->ipc_Flags & IPC_NOTKNOWN) == 0) &&
  84.                 (msg->ipc_Items[0].ii_Flags & IPC_MODIFIED) )
  85.         {
  86.                 res = (long) msg->ipc_Items[0].ii_Ptr;
  87.         } else
  88.         {
  89.                 res = -1;
  90.         }
  91.  
  92.         DeleteIPCMsg (msg);
  93.  
  94.         return (res);
  95. }       /* send */
  96.  
  97.  
  98. void Getout(exitcode) int exitcode;
  99. {
  100.     if (port) DropIPCPort(port);
  101.     if (reply) DeletePort(reply);
  102.     exit(exitcode);
  103. }
  104.  
  105.  
  106.  
  107. main (argc, argv)
  108.         int  argc;
  109.         char *argv[];
  110. {
  111.         long   res;
  112.  
  113.         fprintf (stderr, "[Use %s, %s]\n", IPC_NAME, VERSION);
  114.  
  115.         if (argc != 3)
  116.         {
  117.                 fprintf (stderr, "usage: get <numb1> <numb2>\n");
  118.                 fprintf (stderr, "\tprint product of two numbers\n");
  119.                 exit (1);
  120.         }
  121.  
  122.         port = FindIPCPort (IPC_NAME);
  123.         /* [In most cases GetIPCPort is preferable, so that you don't
  124.             have to have a server already loaded, but this client sends
  125.             its message the moment it is called, so FindIPCPort is
  126.             appropriate   -- Pete --]
  127.         */
  128.         if (port == NULL)
  129.         {
  130.                 fprintf (stderr, "Can't find server.\n");
  131.                 Getout(1);
  132.         }
  133.  
  134.         reply = CreatePort (0L, NULL);
  135.         if (!reply) Getout(1);
  136.  
  137.         res = send (argv[1], argv[2]);
  138.  
  139.         printf ("%s (%s,%s) --> %ld\n", IPC_NAME, argv[1], argv[2], res);
  140.  
  141.         Getout(0);
  142.  
  143. }       /* main */
  144.