XINU
rfsopen.c
Go to the documentation of this file.
1 /* rfsopen.c - rfsopen */
2 
3 #include <xinu.h>
4 
5 /*------------------------------------------------------------------------
6  * rfsopen - Allocate a remote file pseudo-device for a specific file
7  *------------------------------------------------------------------------
8  */
9 
11  struct dentry *devptr, /* Entry in device switch table */
12  char *name, /* File name to use */
13  char *mode /* Mode chars: 'r' 'w' 'o' 'n' */
14  )
15 {
16  struct rflcblk *rfptr; /* Ptr to control block entry */
17  struct rf_msg_oreq msg; /* Message to be sent */
18  struct rf_msg_ores resp; /* Buffer to hold response */
19  int32 retval; /* Return value from rfscomm */
20  int32 len; /* Counts chars in name */
21  char *nptr; /* Pointer into name string */
22  char *fptr; /* Pointer into file name */
23  int32 i; /* General loop index */
24 
25  /* Wait for exclusive access */
26 
28 
29  /* Search control block array to find a free entry */
30 
31  for(i=0; i<Nrfl; i++) {
32  rfptr = &rfltab[i];
33  if (rfptr->rfstate == RF_FREE) {
34  break;
35  }
36  }
37  if (i >= Nrfl) { /* No free table slots remain */
39  return SYSERR;
40  }
41 
42  /* Copy name into free table slot */
43 
44  nptr = name;
45  fptr = rfptr->rfname;
46  len = 0;
47  while ( (*fptr++ = *nptr++) != NULLCH) {
48  len++;
49  if (len >= RF_NAMLEN) { /* File name is too long */
51  return SYSERR;
52  }
53  }
54 
55  /* Verify that name is non-null */
56 
57  if (len==0) {
59  return SYSERR;
60  }
61 
62  /* Parse mode string */
63 
64  if ( (rfptr->rfmode = rfsgetmode(mode)) == SYSERR ) {
66  return SYSERR;
67  }
68 
69  /* Form an open request to create a new file or open an old one */
70 
71  msg.rf_type = htons(RF_MSG_OREQ);/* Request a file open */
72  msg.rf_status = htons(0);
73  msg.rf_seq = 0; /* Rfscomm fills in seq. number */
74  nptr = msg.rf_name;
75  memset(nptr, NULLCH, RF_NAMLEN);/* Initialize name to zero bytes*/
76  while ( (*nptr++ = *name++) != NULLCH ) { /* Copy name to req. */
77  ;
78  }
79  msg.rf_mode = htonl(rfptr->rfmode); /* Set mode in request */
80 
81  /* Send message and receive response */
82 
83  retval = rfscomm((struct rf_msg_hdr *)&msg,
84  sizeof(struct rf_msg_oreq),
85  (struct rf_msg_hdr *)&resp,
86  sizeof(struct rf_msg_ores) );
87 
88  /* Check response */
89 
90  if (retval == SYSERR) {
92  return SYSERR;
93  } else if (retval == TIMEOUT) {
94  kprintf("Timeout during remote file open\n\r");
96  return SYSERR;
97  } else if (ntohs(resp.rf_status) != 0) {
99  return SYSERR;
100  }
101 
102  /* Set initial file position */
103 
104  rfptr->rfpos = 0;
105 
106  /* Mark state as currently used */
107 
108  rfptr->rfstate = RF_USED;
109 
110  /* Return device descriptor of newly created pseudo-device */
111 
113  return rfptr->rfdev;
114 }
syscall kprintf(char *fmt,...)
ポーリングI/Oを使用して、フォーマットされた文字列をコンソールに出力する。
Definition: kprintf.c:98
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
struct rflcblk rfltab[]
Definition: rflinit.c:5
int32 rfstate
Definition: rfilesys.h:50
uint32 rfmode
Definition: rfilesys.h:54
int32 rfscomm(struct rf_msg_hdr *, int32, struct rf_msg_hdr *, int32)
Definition: rfscomm.c:10
#define TIMEOUT
システムコールがタイムアウトした場合
Definition: kernel.h:83
#define RF_MSG_OREQ
Definition: rfilesys.h:89
char rfname[RF_NAMLEN]
Definition: rfilesys.h:52
#define RF_USED
Definition: rfilesys.h:47
#define RF_NAMLEN
Definition: rfilesys.h:9
RF_MSG_HDR int32 rf_mode
Definition: rfilesys.h:192
Definition: conf.h:6
struct rfdata Rf_data
Definition: rfsinit.c:10
int32 rfsgetmode(char *)
Definition: rfsgetmode.c:10
sid32 rf_mutex
Definition: rfilesys.h:38
devcall rfsopen(struct dentry *devptr, char *name, char *mode)
Definition: rfsopen.c:10
#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
int32 rfdev
Definition: rfilesys.h:51
syscall wait(sid32)
Definition: wait.c:9
syscall signal(sid32)
セマフォにシグナルを送り、待機プロセスがある場合は解除する。
Definition: signal.c:18
#define Nrfl
Definition: conf.h:68
#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