home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 56 / af056sub.adf / parnfs.lha / netio1.c < prev    next >
C/C++ Source or Header  |  1993-12-02  |  3KB  |  135 lines

  1. /*
  2.  * $Id: netio1.c,v 1.1 1993/12/02 20:45:46 Rhialto Exp $
  3.  * $Log: netio1.c,v $
  4.  * Revision 1.1  1993/12/02  20:45:46  Rhialto
  5.  * Initial revision
  6.  *
  7.  *
  8.  * Network file system: network I/O for the client only.
  9.  * This version for PARNET.DEVICE.
  10.  */
  11.  
  12. #include "netfs.h"
  13. #include "devices/parnet.h"
  14.  
  15. #include <string.h>
  16.  
  17. #ifdef DEBUG
  18. #   include "syslog.h"
  19. #else
  20. #   define    debug(x)
  21. #endif
  22.  
  23. Prototype LONG SendRecv(void *sdata, ULONG slen, void *rdata, ULONG rlen);
  24.  
  25. LONG
  26. SendRecv(Packet *sdata, ULONG slen, Packet *rdata, ULONG rlen)
  27. {
  28.     return SendRecv2(sdata, slen, NULL, 0, rdata, rlen, NULL, 0);
  29. }
  30.  
  31. Prototype LONG Send2(Packet *sdata1, ULONG slen1, void *sdata2, ULONG slen2);
  32.  
  33. LONG
  34. Send2(Packet *sdata1, ULONG slen1, void *sdata2, ULONG slen2)
  35. {
  36.     sdata1->p_Type = pt_Request;
  37.     sdata1->p_Origin = MyAddr;
  38.  
  39.     ParReq->io_Command = CMD_WRITE;
  40.     ParReq->io_Data    = sdata1;
  41.     ParReq->io_Length  = slen1;
  42.     ParReq->io_Data2   = sdata2;
  43.     ParReq->io_Length2 = slen2;
  44.  
  45.     return DoIO((struct IORequest *)ParReq);
  46. }
  47.  
  48. Prototype LONG SendRecv2(Packet *sdata1, ULONG slen1, void *sdata2, ULONG slen2, Packet *rdata1, ULONG rlen1, void *rdata2, ULONG rlen2);
  49.  
  50. LONG
  51. SendRecv2(Packet *sdata1, ULONG slen1, void *sdata2, ULONG slen2,
  52.       Packet *rdata1, ULONG rlen1, void *rdata2, ULONG rlen2)
  53. {
  54.     Packet       *pkt;
  55.     LONG        ioerror = 0;
  56.     struct IOParReq *io;
  57.  
  58.     debug(("Send %d %d, expect %d %d\n", slen1, slen2, rlen1, rlen2));
  59.     if (ioerror = Send2(sdata1, slen1, sdata2, slen2)) {
  60.     error = ERROR_NO_DISK;
  61.     return ioerror;
  62.     }
  63.  
  64. reread:
  65.     WaitPort(RdPort);             /* XXX timeout & retry here */
  66.     io = GetMsg(RdPort);
  67.     pkt = io->io_Data;
  68.  
  69.     debug(("Receive %d\n", io->io_Actual));
  70.     if (io->io_Error && (io->io_Error != PPERR_WARN_OVFLOW)) {
  71.     debug(("parnet error = %d\n", io->io_Error));
  72.     ioerror = io->io_Error;
  73.     error = ERROR_NO_DISK;
  74.     goto end;
  75.     }
  76.  
  77.     switch (DoProtocol(io, pkt)) {
  78.     case pt_Reply:
  79.     /* This is what we want */
  80.     memcpy(rdata1, pkt, rlen1);
  81.     if (rlen2 && (slen2 = io->io_Actual - rlen1) > 0) {
  82.         memcpy(rdata2, (char *)pkt + rlen1, slen2);
  83.     }
  84.     break;
  85.     case pt_Reset:
  86.     ioerror = pt_Reset;    /* No use in retrying */
  87.     break;
  88.     default:
  89.     /* Ignore bad packets, including mistaken pt_Requests */
  90.     SendRead(io, pkt, PKTSIZE);
  91.     debug(("Re-read a packet\n"));
  92.     goto reread;
  93.     }
  94.  
  95. end:
  96.     SendRead(io, pkt, PKTSIZE);
  97.  
  98.     return ioerror;
  99. }
  100.  
  101. Prototype void ClientDefaults(ULONG type, ULONG addrs);
  102.  
  103. void
  104. ClientDefaults(ULONG type, ULONG addrs)
  105. {
  106.     debug(("ClientDefaults %x %x\n", type, addrs));
  107.  
  108.     switch (type) {
  109.     case 0:
  110.     /* Primary client/server */
  111.     MyAddr = CLI_ADDR;
  112.     PeerAddr = SRV_ADDR;
  113.     NetFSPort = NETFS_PORT;
  114.     break;
  115.     case 1:
  116.     /* Secondary server/client */
  117.     MyAddr = SRV_ADDR;
  118.     PeerAddr = CLI_ADDR;
  119.     NetFSPort = NETFS_PORT + 1;
  120.     break;
  121.     case 2:
  122.     /* Custom installation */
  123. /*
  124.  * Interleave = 0xppppsscc, where
  125.  * pppp: the port number the server is using (in hex)
  126.  * ss  : the parnet address of the server (in hex, 0x01 .. 0xFE)
  127.  * cc  : the parnet address of this client (in hex, 0x01 .. 0xFE)
  128.  */
  129.     MyAddr =     addrs      & 0x00FF;
  130.     PeerAddr =  (addrs >>  8) & 0x00FF;
  131.     NetFSPort = (addrs >> 16) & 0xFFFF;
  132.     break;
  133.     }
  134. }
  135.