XINU
rflwrite.c
Go to the documentation of this file.
1 /* rflwrite.c - rflwrite */
2 
3 #include <xinu.h>
4 
5 /*------------------------------------------------------------------------
6  * rflwrite - Write data to a remote file
7  *------------------------------------------------------------------------
8  */
10  struct dentry *devptr, /* Entry in device switch table */
11  char *buff, /* Buffer of bytes */
12  int32 count /* Count of bytes to write */
13  )
14 {
15  struct rflcblk *rfptr; /* Pointer to control block */
16  int32 retval; /* Return value */
17  struct rf_msg_wreq msg; /* Request message to send */
18  struct rf_msg_wres resp; /* Buffer for response */
19  char *from, *to; /* Used to copy name */
20  int i; /* Counts bytes copied into req */
21  int32 len; /* Length of name */
22 
23  /* Wait for exclusive access */
24 
26 
27  /* Verify count is legitimate */
28 
29  if ( (count <= 0) || (count > RF_DATALEN) ) {
31  return SYSERR;
32  }
33 
34  /* Verify pseudo-device is in use and mode allows writing */
35 
36  rfptr = &rfltab[devptr->dvminor];
37  if ( (rfptr->rfstate == RF_FREE) ||
38  ! (rfptr->rfmode & RF_MODE_W) ) {
40  return SYSERR;
41  }
42 
43  /* Form write request */
44 
45  msg.rf_type = htons(RF_MSG_WREQ);
46  msg.rf_status = htons(0);
47  msg.rf_seq = 0; /* Rfscomm will set sequence */
48  from = rfptr->rfname;
49  to = msg.rf_name;
50  memset(to, NULLCH, RF_NAMLEN); /* Start name as all zero bytes */
51  len = 0;
52  while ( (*to++ = *from++) ) { /* Copy name to request */
53  if (++len >= RF_NAMLEN) {
55  return SYSERR;
56  }
57  }
58  while ( (*to++ = *from++) ) { /* Copy name into request */
59  ;
60  }
61  msg.rf_pos = htonl(rfptr->rfpos);/* Set file position */
62  msg.rf_len = htonl(count); /* Set count of bytes to write */
63  for (i=0; i<count; i++) { /* Copy data into message */
64  msg.rf_data[i] = *buff++;
65  }
66  while (i < RF_DATALEN) {
67  msg.rf_data[i++] = NULLCH;
68  }
69 
70  /* Send message and receive response */
71 
72  retval = rfscomm((struct rf_msg_hdr *)&msg,
73  sizeof(struct rf_msg_wreq),
74  (struct rf_msg_hdr *)&resp,
75  sizeof(struct rf_msg_wres) );
76 
77  /* Check response */
78 
79  if (retval == SYSERR) {
81  return SYSERR;
82  } else if (retval == TIMEOUT) {
83  kprintf("Timeout during remote file read\n");
85  return SYSERR;
86  } else if (ntohs(resp.rf_status) != 0) {
88  return SYSERR;
89  }
90 
91  /* Report results to caller */
92 
93  rfptr->rfpos += ntohl(resp.rf_len);
94 
96  return ntohl(resp.rf_len);
97 }
syscall kprintf(char *fmt,...)
ポーリングI/Oを使用して、フォーマットされた文字列をコンソールに出力する。
Definition: kprintf.c:98
int32 dvminor
Definition: conf.h:8
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define RF_MODE_W
Definition: rfilesys.h:12
struct rflcblk rfltab[]
Definition: rflinit.c:5
int32 rfstate
Definition: rfilesys.h:50
#define RF_DATALEN
Definition: rfilesys.h:10
uint32 rfmode
Definition: rfilesys.h:54
int32 rfscomm(struct rf_msg_hdr *, int32, struct rf_msg_hdr *, int32)
Definition: rfscomm.c:10
devcall rflwrite(struct dentry *devptr, char *buff, int32 count)
Definition: rflwrite.c:9
#define TIMEOUT
システムコールがタイムアウトした場合
Definition: kernel.h:83
char rfname[RF_NAMLEN]
Definition: rfilesys.h:52
uint32 rf_len
Definition: rfilesys.h:168
#define RF_MSG_WREQ
Definition: rfilesys.h:86
#define RF_NAMLEN
Definition: rfilesys.h:9
Definition: conf.h:6
#define ntohl(x)
Definition: prototypes.h:623
struct rfdata Rf_data
Definition: rfsinit.c:10
sid32 rf_mutex
Definition: rfilesys.h:38
#define RF_FREE
Definition: rfilesys.h:46
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
uint32 rfpos
Definition: rfilesys.h:53
void * memset(void *, const int, int32)
指定のByteブロックに対して、同じ値をNバイト分書き込む。
Definition: memset.c:13
#define ntohs(x)
Definition: prototypes.h:622
char rf_data[RF_DATALEN]
Definition: rfilesys.h:170
RF_MSG_HDR uint32 rf_pos
Definition: rfilesys.h:167
syscall wait(sid32)
Definition: wait.c:9
syscall signal(sid32)
セマフォにシグナルを送り、待機プロセスがある場合は解除する。
Definition: signal.c:18
#define htonl(x)
Definition: prototypes.h:620
#define htons(x)
Definition: prototypes.h:619
int32 devcall
デバイスコール関数 返り値の型
Definition: kernel.h:49
#define NULLCH
NULL文字(NULL終端)
Definition: kernel.h:70