home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format 56
/
af056sub.adf
/
parnfs.lha
/
netio.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-12-02
|
5KB
|
243 lines
/*
* $Id: netio.c,v 1.1 1993/12/02 20:45:46 Rhialto Exp $
* $Log: netio.c,v $
* Revision 1.1 1993/12/02 20:45:46 Rhialto
* Initial revision
*
*
* Network file system: network I/O. This version for PARNET.DEVICE.
*/
#include "netfs.h"
#include "devices/parnet.h"
#ifdef DEBUG
# include "syslog.h"
#else
# define debug(x)
#endif
Prototype struct MsgPort *Port;
Prototype struct MsgPort *RdPort;
Prototype struct IOParReq *ParReq;
Prototype struct IOParReq *RdParReq[PENDREADS];
Prototype Packet *RdPkt[PENDREADS];
Prototype int MyAddr;
Prototype int PeerAddr;
Prototype int NetFSPort;
struct MsgPort *Port;
struct MsgPort *RdPort;
struct IOParReq *ParReq;
struct IOParReq *RdParReq[PENDREADS];
Packet *RdPkt[PENDREADS];
int MyAddr;
int PeerAddr;
int NetFSPort;
Prototype void SendRead(struct IOParReq *io, Packet *pkt, ULONG size);
void
SendRead(struct IOParReq *io, Packet *pkt, ULONG size)
{
io->io_Command = CMD_READ;
io->io_Data = pkt;
io->io_Length = size;
io->io_Data2 = NULL;
io->io_Length2 = 0;
SendIO((struct IORequest *)io);
}
Prototype LONG DoReset(struct IOParReq *io);
LONG
DoReset(struct IOParReq *io)
{
char pkt[STDREPLY];
Packet *p = (Packet *)pkt;
struct DateStamp ds;
p->p_Type = pt_Reset;
p->p_Origin = MyAddr;
DateStamp(&ds);
if (MyValidation == 0)
MyValidation = (ds.ds_Days * 24*60 +
ds.ds_Minute) * 60 +
ds.ds_Tick / TICKS_PER_SECOND;
p->p_Validation = MyValidation;
debug(("DoReset %d\n", MyValidation));
io->io_Command = CMD_WRITE;
io->io_Data = pkt;
io->io_Length = sizeof(pkt);
io->io_Data2 = NULL;
io->io_Length2 = 0;
return DoIO((struct IORequest *)io);
}
Prototype LONG DoResetReply(struct IOParReq *io);
LONG
DoResetReply(struct IOParReq *io)
{
char pkt[STDREPLY];
Packet *p = (Packet *)pkt;
p->p_Type = pt_ResetReply;
p->p_Origin = MyAddr;
p->p_Validation = MyValidation;
debug(("DoResetReply %d\n", MyValidation));
io->io_Command = CMD_WRITE;
io->io_Data = pkt;
io->io_Length = sizeof(pkt);
io->io_Data2 = NULL;
io->io_Length2 = 0;
return DoIO((struct IORequest *)io);
}
Prototype LONG DoProtocol(struct IOParReq *io, Packet *pkt);
LONG
DoProtocol(struct IOParReq *io, Packet *pkt)
{
switch (pkt->p_Type) {
case pt_Reply:
return pt_Reply;
case pt_Request:
return pt_Request;
case pt_AsyncReply:
DoAsyncReply(pkt); /* Different in client and server */
return pt_Retry;
break;
case pt_Reset:
/* Oops! Server reset! */
Validation = pkt->p_Validation;
DoResetReply(io);
return pt_Reset; /* No use in retrying */
case pt_ResetReply:
Validation = pkt->p_Validation;
debug(("got ResetReply %d\n", Validation));
/* fall through */
default:
/* Ignore bad packets, including mistaken pt_Requests */
debug(("Must re-read a packet\n"));
return pt_Retry;
}
}
Prototype LONG InitReads(void);
LONG
InitReads(void)
{
int i;
for (i = 0; i < PENDREADS; i++) {
if ((RdPkt[i] = AllocMem(PKTSIZE, MEMF_PUBLIC)) == NULL)
return 4;
}
for (i = 0; i < PENDREADS; i++) {
SendRead(RdParReq[i], RdPkt[i], PKTSIZE);
}
return 0;
}
Prototype ULONG OpenNetwork(void);
ULONG
OpenNetwork(void)
{
ULONG error;
int i;
Port = CreatePort("Net:NetIO", -1);
if (Port == NULL)
return 1;
RdPort = CreatePort("Net:RdNetIO", -1);
if (RdPort == NULL)
return 1;
ParReq = CreateExtIO(Port, sizeof(*ParReq));
if (ParReq == 0)
return 2;
ParReq->io_Port = NetFSPort;
ParReq->io_Flags = PRO_DGRAM;
ParReq->io_Addr = PeerAddr;
debug(("MyAddr %d PeerAddr %d Port %d\n", MyAddr, PeerAddr, NetFSPort));
error = OpenDevice(DevName, 0, (struct IORequest *)ParReq, 0);
if (error)
return error;
ParReq->io_Command = PPD_SETADDR;
ParReq->io_Addr = MyAddr;
DoIO((struct IORequest *)ParReq);
ParReq->io_Addr = PeerAddr;
if ((RdParReq[0] = CreateExtIO(RdPort, sizeof(*ParReq))) == NULL)
return 3;
RdParReq[0]->io_Device = ParReq->io_Device;
RdParReq[0]->io_Unit = ParReq->io_Unit;
RdParReq[0]->io_Port = NetFSPort; /* not needed, just tidy */
RdParReq[0]->io_Flags = IOF_QUICK;
for (i = 1; i < PENDREADS; i++) {
if ((RdParReq[i] = CreateExtIO(RdPort, sizeof(*ParReq))) == NULL)
return 4;
*RdParReq[i] = *RdParReq[0];
}
InitReads();
DoReset(ParReq);
return 0;
}
Prototype ULONG CloseNetwork(void);
ULONG
CloseNetwork(void)
{
int i;
if (ParReq) {
if (ParReq->io_Device) {
CloseDevice((struct IORequest *)ParReq);
}
DeleteExtIO((struct IORequest *)ParReq);
ParReq = NULL;
}
for (i = 0; i < PENDREADS; i++) {
if (RdParReq[i]) {
AbortIO((struct IORequest *)RdParReq[i]);
WaitIO((struct IORequest *)RdParReq[i]);
DeleteExtIO((struct IORequest *)RdParReq[i]);
}
RdParReq[i] = NULL;
}
if (RdPort) {
DeletePort(RdPort);
RdPort = NULL;
}
if (Port) {
DeletePort(Port);
Port = NULL;
}
return 0;
}