Xinu7/src/sys/sys/rfmkpac.c
/* rfmkpac.c - rfmkpac */
#include <conf.h>
#include <kernel.h>
#include <network.h>
static struct fpacket packet;
/*------------------------------------------------------------------------
* rfmkpac -- make a remote file request packet and send it
*------------------------------------------------------------------------
*/
rfmkpac(rop, rname, rpos, buff, len)
int rop;
char *rname;
long *rpos;
char *buff;
int len;
{
struct fphdr *fptr;
int reqlen, rplylen;
wait(Rf.rmutex);
fptr = (struct fphdr *) &packet;
fptr->f_op = hs2net(rop);
fptr->f_pos = hl2net(*rpos);
fptr->f_count = hs2net(len);
strncpy(fptr->f_name, rname, RNAMLEN);
reqlen = rplylen = FPHLEN + len;
switch (rop) {
case FS_WRITE:
case FS_RENAME:
if (len > RDATLEN) {
signal(Rf.rmutex);
return(SYSERR);
}
blkcopy(packet.fpdata, buff, len);
rplylen = FPHLEN;
break;
case FS_CLOSE:
case FS_OPEN:
case FS_UNLINK:
case FS_MKDIR:
case FS_RMDIR:
case FS_ACCESS:
rplylen = FPHLEN;
/* fall through */
case FS_READ:
if (len > RDATLEN) {
signal(Rf.rmutex);
return(SYSERR);
}
reqlen = FPHLEN;
break;
default:
;
}
if (rfsend(fptr, reqlen, rplylen) == SYSERR ||
net2hs(fptr->f_op) == FS_ERROR) {
signal(Rf.rmutex);
return(SYSERR);
}
switch (rop) {
case FS_READ:
blkcopy(buff, packet.fpdata, len);
/* fall through */
case FS_WRITE:
*rpos = net2hl(fptr->f_pos);
len = net2hs(fptr->f_count);
break;
default:
len = OK;
}
signal(Rf.rmutex);
return(len);
}