XINU
rdscontrol.c
Go to the documentation of this file.
1 /* rdscontrol.c - rdscontrol */
2 
3 #include <xinu.h>
4 
5 /*------------------------------------------------------------------------
6  * rdscontrol - Provide control functions for the remote disk
7  *------------------------------------------------------------------------
8  */
10  struct dentry *devptr, /* Entry in device switch table */
11  int32 func, /* The control function to use */
12  int32 arg1, /* Argument #1 */
13  int32 arg2 /* Argument #2 */
14  )
15 {
16  struct rdscblk *rdptr; /* Pointer to control block */
17  struct rdbuff *bptr; /* Ptr to buffer that will be */
18  /* placed on the req. queue */
19  struct rdbuff *pptr; /* Ptr to "previous" node on */
20  /* a list */
21  struct rd_msg_dreq msg; /* Buffer for delete request */
22  struct rd_msg_dres resp; /* Buffer for delete response */
23  char *to, *from; /* Used during name copy */
24  int32 retval; /* Return value */
25 
26  /* Verify that device is currently open */
27 
28  rdptr = &rdstab[devptr->dvminor];
29  if (rdptr->rd_state != RD_OPEN) {
30  return SYSERR;
31  }
32 
33  /* Ensure rdsprocess is runnning */
34 
35  if ( ! rdptr->rd_comruns ) {
36  rdptr->rd_comruns = TRUE;
37  resume(rdptr->rd_comproc);
38  }
39 
40  switch (func) {
41 
42  /* Synchronize writes */
43 
44  case RDS_CTL_SYNC:
45 
46  /* Allocate a buffer to use for the request list */
47 
48  bptr = rdsbufalloc(rdptr);
49  if (bptr == (struct rdbuff *)SYSERR) {
50  return SYSERR;
51  }
52 
53  /* Form a sync request */
54 
55  bptr->rd_op = RD_OP_SYNC;
56  bptr->rd_refcnt = 1;
57  bptr->rd_blknum = 0; /* Unused */
58  bptr->rd_status = RD_INVALID;
59  bptr->rd_pid = getpid();
60 
61  /* Insert new request into list just before tail */
62 
63  pptr = rdptr->rd_rtprev;
64  rdptr->rd_rtprev = bptr;
65  bptr->rd_next = pptr->rd_next;
66  bptr->rd_prev = pptr;
67  pptr->rd_next = bptr;
68 
69  /* Prepare to wait until item is processed */
70 
71  recvclr();
72 
73  /* Signal then semaphore to start communication */
74 
75  signal(rdptr->rd_reqsem);
76 
77  /* Block to wait for a message */
78 
79  bptr = (struct rdbuff *)receive();
80  if (bptr == (struct rdbuff *)SYSERR) {
81  return SYSERR;
82  }
83  break;
84 
85  /* Delete the remote disk (entirely remove it) */
86 
87  case RDS_CTL_DEL:
88 
89  /* Handcraft a message for the server that requests */
90  /* deleting the disk with the specified ID */
91 
92  msg.rd_type = htons(RD_MSG_DREQ);/* Request deletion */
93  msg.rd_status = htons(0);
94  msg.rd_seq = 0; /* rdscomm will insert sequence # later */
95  to = msg.rd_id;
96  memset(to, NULLCH, RD_IDLEN); /* Initialize to zeroes */
97  from = rdptr->rd_id;
98  while ( (*to++ = *from++) != NULLCH ) { /* copy ID */
99  ;
100  }
101 
102  /* Send message and receive response */
103 
104  retval = rdscomm((struct rd_msg_hdr *)&msg,
105  sizeof(struct rd_msg_dreq),
106  (struct rd_msg_hdr *)&resp,
107  sizeof(struct rd_msg_dres),
108  rdptr);
109 
110  /* Check response */
111 
112  if (retval == SYSERR) {
113  return SYSERR;
114  } else if (retval == TIMEOUT) {
115  kprintf("Timeout during remote file delete\n\r");
116  return SYSERR;
117  } else if (ntohs(resp.rd_status) != 0) {
118  return SYSERR;
119  }
120 
121  /* Close local device */
122 
123  return rdsclose(devptr);
124 
125  default:
126  kprintf("rfsControl: function %d not valid\n\r", func);
127  return SYSERR;
128  }
129 
130  return OK;
131 }
syscall kprintf(char *fmt,...)
ポーリングI/Oを使用して、フォーマットされた文字列をコンソールに出力する。
Definition: kprintf.c:98
#define RD_OPEN
Definition: rdisksys.h:37
sid32 rd_reqsem
Definition: rdisksys.h:92
#define RDS_CTL_DEL
Definition: rdisksys.h:110
int32 rd_op
Definition: rdisksys.h:58
int32 dvminor
Definition: conf.h:8
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define RD_IDLEN
Definition: rdisksys.h:29
int32 rd_status
Definition: rdisksys.h:62
#define OK
処理が成功した場合
Definition: kernel.h:77
umsg32 receive(void)
メッセージの受信を待ち、受信後にreceive()の呼び出し者にメッセージを返す。
Definition: receive.c:17
#define TIMEOUT
システムコールがタイムアウトした場合
Definition: kernel.h:83
pid32 rd_comproc
Definition: rdisksys.h:89
Definition: conf.h:6
devcall rdscontrol(struct dentry *devptr, int32 func, int32 arg1, int32 arg2)
Definition: rdscontrol.c:9
bool8 rd_comruns
Definition: rdisksys.h:90
struct rdbuff * rd_prev
Definition: rdisksys.h:57
devcall rdsclose(struct dentry *)
Definition: rdsclose.c:9
#define TRUE
Boolean True(1)
Definition: kernel.h:65
umsg32 recvclr(void)
受信メッセージをクリアし、待機している場合はメッセージを返す。
Definition: recvclr.c:14
#define RD_OP_SYNC
Definition: rdisksys.h:44
struct rdscblk rdstab[]
Definition: rdsinit.c:11
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
int32 rd_refcnt
Definition: rdisksys.h:59
struct rdbuff * rd_next
Definition: rdisksys.h:56
void * memset(void *, const int, int32)
指定のByteブロックに対して、同じ値をNバイト分書き込む。
Definition: memset.c:13
pri16 resume(pid32)
プロセスを休止状態(サスペンド)からREADY状態に遷移させる。
Definition: resume.c:20
#define ntohs(x)
Definition: prototypes.h:622
pid32 getpid(void)
現在実行中のプロセスIDを返す。
Definition: getpid.c:11
#define RD_MSG_DREQ
Definition: rdisksys.h:132
pid32 rd_pid
Definition: rdisksys.h:63
struct rdbuff * rdsbufalloc(struct rdscblk *)
Definition: rdsbufalloc.c:9
struct rdbuff * rd_rtprev
Definition: rdisksys.h:76
status rdscomm(struct rd_msg_hdr *, int32, struct rd_msg_hdr *, int32, struct rdscblk *)
Definition: rdscomm.c:11
#define RDS_CTL_SYNC
Definition: rdisksys.h:111
syscall signal(sid32)
セマフォにシグナルを送り、待機プロセスがある場合は解除する。
Definition: signal.c:18
int32 rd_state
Definition: rdisksys.h:69
char rd_id[RD_IDLEN]
Definition: rdisksys.h:70
#define htons(x)
Definition: prototypes.h:619
int32 devcall
デバイスコール関数 返り値の型
Definition: kernel.h:49
uint32 rd_blknum
Definition: rdisksys.h:61
#define NULLCH
NULL文字(NULL終端)
Definition: kernel.h:70
#define RD_INVALID
Definition: rdisksys.h:49