rfmkpac.c
来自「TCP-IP红宝书源代码」· C语言 代码 · 共 103 行
C
103 行
/* rfmkpac.c - rfmkpac */
#include <conf.h>
#include <kernel.h>
#include <network.h>
/*#define PRINTERRORS*/
static struct fpacket packet;
/*------------------------------------------------------------------------
* rfmkpac -- make a remote file request packet and send it
*------------------------------------------------------------------------
*/
int
rfmkpac(int rop, char *rname, char *rpos, unsigned char *buff, unsigned len)
{
struct fphdr *fptr;
int reqlen, rplylen;
#ifdef MIPS
short op;
#endif
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);
#if defined(DEBUG) || defined(PRINTERRORS)
kprintf("rfmkpac(rename) ==> SYSERR, bad len %d\n",
len);
#endif
return(SYSERR);
}
memcpy(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);
#if defined(DEBUG) || defined(PRINTERRORS)
kprintf("rfmkpac ==> SYSERR, bad len %d\n", len);
#endif
return(SYSERR);
}
reqlen = FPHLEN;
break;
default:
;
}
if (rfsend(fptr, reqlen, rplylen) == SYSERR ||
#ifdef MIPS /* stupid MIPS compiler */
(op = net2hs(fptr->f_op)) == FS_ERROR) {
#else
net2hs(fptr->f_op) == (unsigned)FS_ERROR) {
#endif
signal(Rf.rmutex);
#if defined(DEBUG) || defined(PRINTERRORS)
kprintf("rfmkpac: returning SYSERR\n");
if ((op = net2hs(fptr->f_op)) == FS_ERROR)
kprintf("rfmkpac: got FS_ERROR back, req:%d rep:%d\n",
reqlen, rplylen);
#endif
return(SYSERR);
}
switch (rop) {
case FS_READ:
memcpy(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);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?