home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / languages / c / oslib / Examples / p2-632 < prev    next >
Text File  |  1994-09-26  |  3KB  |  103 lines

  1. #include <string.h>
  2.  
  3. #include "econet.h"
  4. #include "os.h"
  5. #include "osbyte.h"
  6. #include "osmodule.h"
  7. #include "osword.h"
  8.  
  9. #define RPC_SEND_TIME 42 /*some number, unique for this net*/
  10.  
  11. typedef struct clock_list clock_list;
  12.  
  13. struct clock_list {clock_list *next; econet_tx_cb tx; os_date_and_time clock;};
  14.  
  15. extern byte Command_Port;
  16. extern clock_list *Tx_List;
  17. extern int Reply_Count, Reply_Delay;
  18. extern byte Buffer [80];
  19. extern void Event_Veneer (void);
  20. extern bool Claimed_Flag;
  21.  
  22. os_error *start (void)
  23.  
  24. {  os_error *error = NULL;
  25.  
  26.    if ((error = xos_claim (EventV, (void *) &Event_Veneer, NULL)) != NULL)
  27.       goto finish;
  28.    Claimed_Flag = TRUE;
  29.  
  30.    if ((error = xos_byte (osbyte_ENABLE_EVENT, Event_EconetUserRPC, SKIP,
  31.          NULL, NULL)) != NULL)
  32.       goto finish;
  33.  
  34.    if ((error = xos_byte (osbyte_ENABLE_EVENT, Event_EconetTx, SKIP,
  35.          NULL, NULL)) != NULL)
  36.       goto finish;
  37.  
  38. finish:
  39.    /*If error != NULL, should disable enabled events and release EventV (if
  40.       claimed) here.*/
  41.    return error;
  42. }
  43.  
  44. os_error *event (int *event, byte *args, int rpc, byte station, byte net)
  45.            /*or (int *event, econet_tx_cb tx, int status)*/
  46.  
  47.    /*The mechanism by which Event_Veneer() calls event() is not
  48.       detailed here. Assume that if event is set to -1 on exit, the call is
  49.       claimed.*/
  50.  
  51. {  os_error *error = NULL;
  52.    clock_list *clock_ptr;
  53.    oswordreadclock_utc_block utc;
  54.  
  55.    switch (*event)
  56.    {  case Event_EconetUserRPC:
  57.          if (rpc == RPC_SEND_TIME && args [0] == 1)
  58.          {  if ((error = xosmodule_alloc (sizeof *clock_ptr,
  59.                   (void **) &clock_ptr)) != NULL)
  60.                goto finish;
  61.  
  62.             utc.op = oswordreadclock_OP_UTC;
  63.             if ((error = xoswordreadclock_utc (&utc)) != NULL)
  64.                goto finish;
  65.             memcpy (clock_ptr->clock, utc.utc, sizeof (os_date_and_time));
  66.  
  67.             if ((error = xeconet_start_transmit (0, args [1], station,
  68.                   net, (byte *) &clock_ptr->clock, sizeof clock_ptr->clock,
  69.                   Reply_Count, Reply_Delay, &clock_ptr->tx, NULL)) !=
  70.                   NULL)
  71.                goto finish;
  72.  
  73.             /*Add the list to new record.*/
  74.             clock_ptr->next = Tx_List;
  75.             Tx_List = clock_ptr;
  76.  
  77.             /*claim vector*/
  78.             *event = -1;
  79.          }
  80.       break;
  81.  
  82.       case Event_EconetTx:
  83.       {  econet_tx_cb tx = (econet_tx_cb) args;
  84.          clock_list **t;
  85.  
  86.          for (t = &Tx_List; *t != NULL; t = &(*t)->next)
  87.             if ((*t)->tx == tx)
  88.             {  /*Remove from the list*/
  89.                *t = (*t)->next;
  90.                (void) xeconet_abandon_transmit (tx, NULL);
  91.                (void) xosmodule_free ((byte *) *t);
  92.             }
  93.  
  94.          /*claim vector*/
  95.          *event = -1;
  96.       }
  97.       break;
  98.    }
  99.  
  100. finish:
  101.    return error;
  102. }
  103.