annotate tools/Linda_library/ldserv.c @ 50:0025a8582d5f

Federated Linda Ring three
author axmo
date Fri, 12 Dec 2008 19:38:40 +0900
parents 6c40056777be
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
6c40056777be Initial revision
fuchita
parents:
diff changeset
1 /**********************************************************************/
6c40056777be Initial revision
fuchita
parents:
diff changeset
2 /* */
6c40056777be Initial revision
fuchita
parents:
diff changeset
3 /* Linda Server */
6c40056777be Initial revision
fuchita
parents:
diff changeset
4 // $Id$
6c40056777be Initial revision
fuchita
parents:
diff changeset
5 //
6c40056777be Initial revision
fuchita
parents:
diff changeset
6 /* */
6c40056777be Initial revision
fuchita
parents:
diff changeset
7 /**********************************************************************/
6c40056777be Initial revision
fuchita
parents:
diff changeset
8 #include <stdio.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
9 #include <stdlib.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
10 #include <string.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
11 #include <unistd.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
12 #include <fcntl.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
13 #include <sys/uio.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
14 #include <sys/time.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
15 #include <sys/select.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
16 #include <sys/stat.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
17 #include <sys/types.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
18 #include <sys/socket.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
19 #include <sys/un.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
20 #include <netinet/in.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
21 #include <netinet/tcp.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
22 #include <signal.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
23 #include <termios.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
24 #include <netdb.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
25 #include <errno.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
26 #include <signal.h>
6c40056777be Initial revision
fuchita
parents:
diff changeset
27 #define MAX_REQ 1
6c40056777be Initial revision
fuchita
parents:
diff changeset
28 #define FAIL (-1)
6c40056777be Initial revision
fuchita
parents:
diff changeset
29 #define MAX_USER 4
6c40056777be Initial revision
fuchita
parents:
diff changeset
30 #define MAX_TUPLE 65536
6c40056777be Initial revision
fuchita
parents:
diff changeset
31 #define PATHNAME "/tmp/ldserv"
6c40056777be Initial revision
fuchita
parents:
diff changeset
32
6c40056777be Initial revision
fuchita
parents:
diff changeset
33 #define DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
34
6c40056777be Initial revision
fuchita
parents:
diff changeset
35
6c40056777be Initial revision
fuchita
parents:
diff changeset
36 #define BUFFSIZE 65535
6c40056777be Initial revision
fuchita
parents:
diff changeset
37
6c40056777be Initial revision
fuchita
parents:
diff changeset
38 /*----------------------------------------------------------------------
6c40056777be Initial revision
fuchita
parents:
diff changeset
39 パケットフォーマット
6c40056777be Initial revision
fuchita
parents:
diff changeset
40 char short int int
6c40056777be Initial revision
fuchita
parents:
diff changeset
41 Mode + ID + Seq + Data_len + Padding + Data
6c40056777be Initial revision
fuchita
parents:
diff changeset
42 0 1 3 7 11 12
6c40056777be Initial revision
fuchita
parents:
diff changeset
43 ----------------------------------------------------------------------*/
6c40056777be Initial revision
fuchita
parents:
diff changeset
44 #define LINDA_MODE_OFFSET 0
6c40056777be Initial revision
fuchita
parents:
diff changeset
45 #define LINDA_ID_OFFSET 1
6c40056777be Initial revision
fuchita
parents:
diff changeset
46 #define LINDA_SEQ_OFFSET 3
6c40056777be Initial revision
fuchita
parents:
diff changeset
47 #define LINDA_DATA_LENGTH_OFFSET 7
6c40056777be Initial revision
fuchita
parents:
diff changeset
48 #define LINDA_HEADER_SIZE 12
6c40056777be Initial revision
fuchita
parents:
diff changeset
49
6c40056777be Initial revision
fuchita
parents:
diff changeset
50
6c40056777be Initial revision
fuchita
parents:
diff changeset
51 #define INT_SIZE 4 // 4Byte = sizeof(int)
6c40056777be Initial revision
fuchita
parents:
diff changeset
52
6c40056777be Initial revision
fuchita
parents:
diff changeset
53 typedef struct tuple{
6c40056777be Initial revision
fuchita
parents:
diff changeset
54 unsigned char *data;
6c40056777be Initial revision
fuchita
parents:
diff changeset
55 struct tuple *next;
6c40056777be Initial revision
fuchita
parents:
diff changeset
56 unsigned int seq;
6c40056777be Initial revision
fuchita
parents:
diff changeset
57 unsigned short fd;
6c40056777be Initial revision
fuchita
parents:
diff changeset
58 unsigned int datalen;
6c40056777be Initial revision
fuchita
parents:
diff changeset
59 char mode;
6c40056777be Initial revision
fuchita
parents:
diff changeset
60 } TUPLE ;
6c40056777be Initial revision
fuchita
parents:
diff changeset
61
6c40056777be Initial revision
fuchita
parents:
diff changeset
62 TUPLE *tuple_space[MAX_TUPLE]; // TUPLE Space
6c40056777be Initial revision
fuchita
parents:
diff changeset
63 TUPLE *tp;
6c40056777be Initial revision
fuchita
parents:
diff changeset
64 int unix_port = 11511; // 11511 is Default Port number
6c40056777be Initial revision
fuchita
parents:
diff changeset
65 extern int errno;
6c40056777be Initial revision
fuchita
parents:
diff changeset
66
6c40056777be Initial revision
fuchita
parents:
diff changeset
67 #ifdef COUNT_PACKET
6c40056777be Initial revision
fuchita
parents:
diff changeset
68 // print packet count message per PRINT_INTERVAL sec
6c40056777be Initial revision
fuchita
parents:
diff changeset
69 #define PRINT_INTERVAL 4
6c40056777be Initial revision
fuchita
parents:
diff changeset
70
6c40056777be Initial revision
fuchita
parents:
diff changeset
71 /*-------------------------------------------------------------------/
6c40056777be Initial revision
fuchita
parents:
diff changeset
72 void
6c40056777be Initial revision
fuchita
parents:
diff changeset
73 count_packet (char type):
6c40056777be Initial revision
fuchita
parents:
diff changeset
74 クライアントより受け取ったコマンドをカウントする関数
6c40056777be Initial revision
fuchita
parents:
diff changeset
75
6c40056777be Initial revision
fuchita
parents:
diff changeset
76 引き数:
6c40056777be Initial revision
fuchita
parents:
diff changeset
77 type - 受け取ったコマンドの種類(char型: i,o,r,w)
6c40056777be Initial revision
fuchita
parents:
diff changeset
78 /-------------------------------------------------------------------*/
6c40056777be Initial revision
fuchita
parents:
diff changeset
79 void count_packet(char type)
6c40056777be Initial revision
fuchita
parents:
diff changeset
80 {
6c40056777be Initial revision
fuchita
parents:
diff changeset
81 static int out_packet=-1,read_packet=0,in_packet=0,wait_packet=0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
82 static struct timeval start,now,previous;
6c40056777be Initial revision
fuchita
parents:
diff changeset
83
6c40056777be Initial revision
fuchita
parents:
diff changeset
84 if (out_packet == -1) {
6c40056777be Initial revision
fuchita
parents:
diff changeset
85 gettimeofday(&start,NULL);
6c40056777be Initial revision
fuchita
parents:
diff changeset
86 gettimeofday(&previous,NULL);
6c40056777be Initial revision
fuchita
parents:
diff changeset
87 out_packet = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
88 printf("packet\tout\tread\tin\twait\ttime\n");
6c40056777be Initial revision
fuchita
parents:
diff changeset
89 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
90
6c40056777be Initial revision
fuchita
parents:
diff changeset
91 if (type == 'o') {
6c40056777be Initial revision
fuchita
parents:
diff changeset
92 out_packet++;
6c40056777be Initial revision
fuchita
parents:
diff changeset
93 } else if (type == 'r') {
6c40056777be Initial revision
fuchita
parents:
diff changeset
94 read_packet++;
6c40056777be Initial revision
fuchita
parents:
diff changeset
95 } else if (type == 'i') {
6c40056777be Initial revision
fuchita
parents:
diff changeset
96 in_packet++;
6c40056777be Initial revision
fuchita
parents:
diff changeset
97 } else if (type == 'w') {
6c40056777be Initial revision
fuchita
parents:
diff changeset
98 wait_packet++;
6c40056777be Initial revision
fuchita
parents:
diff changeset
99 } else {
6c40056777be Initial revision
fuchita
parents:
diff changeset
100 fprintf(stderr,"No type in count_packet function\n");
6c40056777be Initial revision
fuchita
parents:
diff changeset
101 return;
6c40056777be Initial revision
fuchita
parents:
diff changeset
102 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
103
6c40056777be Initial revision
fuchita
parents:
diff changeset
104 gettimeofday(&now,NULL);
6c40056777be Initial revision
fuchita
parents:
diff changeset
105 if ((now.tv_sec-previous.tv_sec) > PRINT_INTERVAL) {
6c40056777be Initial revision
fuchita
parents:
diff changeset
106 printf("log\t%d\t%d\t%d\t%d\t%ld\n",
6c40056777be Initial revision
fuchita
parents:
diff changeset
107 out_packet,read_packet,in_packet,wait_packet,now.tv_sec-start.tv_sec);
6c40056777be Initial revision
fuchita
parents:
diff changeset
108 fflush(stdout);
6c40056777be Initial revision
fuchita
parents:
diff changeset
109
6c40056777be Initial revision
fuchita
parents:
diff changeset
110 previous.tv_sec = now.tv_sec;
6c40056777be Initial revision
fuchita
parents:
diff changeset
111 out_packet = read_packet = in_packet = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
112 wait_packet = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
113 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
114 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
115 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
116
6c40056777be Initial revision
fuchita
parents:
diff changeset
117 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
118 /*-------------------------------------------------------------------/
6c40056777be Initial revision
fuchita
parents:
diff changeset
119 int
6c40056777be Initial revision
fuchita
parents:
diff changeset
120 show_tuple_space ():
6c40056777be Initial revision
fuchita
parents:
diff changeset
121 TUPLE Space にあるTUPLEをID順に表示する
6c40056777be Initial revision
fuchita
parents:
diff changeset
122 /-------------------------------------------------------------------*/
6c40056777be Initial revision
fuchita
parents:
diff changeset
123 void show_tuple_space()
6c40056777be Initial revision
fuchita
parents:
diff changeset
124 {
6c40056777be Initial revision
fuchita
parents:
diff changeset
125 int i;
6c40056777be Initial revision
fuchita
parents:
diff changeset
126
6c40056777be Initial revision
fuchita
parents:
diff changeset
127 static int toggle = -1;
6c40056777be Initial revision
fuchita
parents:
diff changeset
128 static struct timeval start,now,previous;
6c40056777be Initial revision
fuchita
parents:
diff changeset
129
6c40056777be Initial revision
fuchita
parents:
diff changeset
130 TUPLE * tmp;
6c40056777be Initial revision
fuchita
parents:
diff changeset
131
6c40056777be Initial revision
fuchita
parents:
diff changeset
132 if (toggle == -1) {
6c40056777be Initial revision
fuchita
parents:
diff changeset
133 gettimeofday(&start,NULL);
6c40056777be Initial revision
fuchita
parents:
diff changeset
134 toggle = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
135 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
136 gettimeofday(&now,NULL);
6c40056777be Initial revision
fuchita
parents:
diff changeset
137 printf("time **** %ld\n",now.tv_sec-start.tv_sec);
6c40056777be Initial revision
fuchita
parents:
diff changeset
138 fflush(stdout);
6c40056777be Initial revision
fuchita
parents:
diff changeset
139 previous.tv_sec = now.tv_sec;
6c40056777be Initial revision
fuchita
parents:
diff changeset
140
6c40056777be Initial revision
fuchita
parents:
diff changeset
141 printf("\n******\n");
6c40056777be Initial revision
fuchita
parents:
diff changeset
142 for(i=0;i<MAX_TUPLE-1;i++){
6c40056777be Initial revision
fuchita
parents:
diff changeset
143 if(tuple_space[i]){
6c40056777be Initial revision
fuchita
parents:
diff changeset
144 printf("id: %d\t",i);
6c40056777be Initial revision
fuchita
parents:
diff changeset
145 for(tmp=tuple_space[i];tmp;tmp = tmp->next){
6c40056777be Initial revision
fuchita
parents:
diff changeset
146 printf("%c:%d\t",tmp->mode,tmp->seq);
6c40056777be Initial revision
fuchita
parents:
diff changeset
147 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
148 printf("\n");
6c40056777be Initial revision
fuchita
parents:
diff changeset
149 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
150 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
151 if(tuple_space[i]){
6c40056777be Initial revision
fuchita
parents:
diff changeset
152 printf("id: %d\t",i);
6c40056777be Initial revision
fuchita
parents:
diff changeset
153 for(tmp=tuple_space[i];tmp;tmp = tmp->next){
6c40056777be Initial revision
fuchita
parents:
diff changeset
154 printf("%c:%c%c\t",tmp->mode,tmp->data[0],tmp->data[1]);
6c40056777be Initial revision
fuchita
parents:
diff changeset
155 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
156 printf("\n");
6c40056777be Initial revision
fuchita
parents:
diff changeset
157 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
158 printf("******\n\n");
6c40056777be Initial revision
fuchita
parents:
diff changeset
159 return;
6c40056777be Initial revision
fuchita
parents:
diff changeset
160 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
161 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
162
6c40056777be Initial revision
fuchita
parents:
diff changeset
163
6c40056777be Initial revision
fuchita
parents:
diff changeset
164 /*-------------------------------------------------------------------/
6c40056777be Initial revision
fuchita
parents:
diff changeset
165 int
6c40056777be Initial revision
fuchita
parents:
diff changeset
166 get_int(unsigned char * tuple, int offset):
6c40056777be Initial revision
fuchita
parents:
diff changeset
167 TUPLEのヘッダに格納された int型 のデータを得るための関数
6c40056777be Initial revision
fuchita
parents:
diff changeset
168 psx_get_datalength() と psx_get_seq() から呼ばれる。
6c40056777be Initial revision
fuchita
parents:
diff changeset
169
6c40056777be Initial revision
fuchita
parents:
diff changeset
170 引き数:
6c40056777be Initial revision
fuchita
parents:
diff changeset
171 tuple - ヘッダ情報も含んだTUPLE。psx_reply()で得たものでもいい。
6c40056777be Initial revision
fuchita
parents:
diff changeset
172 offset - 取りだすデータのオフセット。LINDA_DATA_LENGTH_OFFSET
6c40056777be Initial revision
fuchita
parents:
diff changeset
173 か LINDA_SEQ_OFFSET。
6c40056777be Initial revision
fuchita
parents:
diff changeset
174
6c40056777be Initial revision
fuchita
parents:
diff changeset
175 返り値:
6c40056777be Initial revision
fuchita
parents:
diff changeset
176 指定したオフセットに格納されていた数値(int型)
6c40056777be Initial revision
fuchita
parents:
diff changeset
177 /-------------------------------------------------------------------*/
6c40056777be Initial revision
fuchita
parents:
diff changeset
178 static
6c40056777be Initial revision
fuchita
parents:
diff changeset
179 unsigned int
6c40056777be Initial revision
fuchita
parents:
diff changeset
180 get_int(unsigned char * tuple, int offset){
6c40056777be Initial revision
fuchita
parents:
diff changeset
181 unsigned int i;
6c40056777be Initial revision
fuchita
parents:
diff changeset
182
6c40056777be Initial revision
fuchita
parents:
diff changeset
183 i = (tuple[offset] <<24)+
6c40056777be Initial revision
fuchita
parents:
diff changeset
184 (tuple[offset+1]<<16)+
6c40056777be Initial revision
fuchita
parents:
diff changeset
185 (tuple[offset+2]<<8) +
6c40056777be Initial revision
fuchita
parents:
diff changeset
186 (tuple[offset+3]);
6c40056777be Initial revision
fuchita
parents:
diff changeset
187 return i;
6c40056777be Initial revision
fuchita
parents:
diff changeset
188 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
189
6c40056777be Initial revision
fuchita
parents:
diff changeset
190 unsigned int
6c40056777be Initial revision
fuchita
parents:
diff changeset
191 psx_get_datalength(unsigned char * tuple){
6c40056777be Initial revision
fuchita
parents:
diff changeset
192 return get_int(tuple,LINDA_DATA_LENGTH_OFFSET);
6c40056777be Initial revision
fuchita
parents:
diff changeset
193 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
194
6c40056777be Initial revision
fuchita
parents:
diff changeset
195 unsigned int
6c40056777be Initial revision
fuchita
parents:
diff changeset
196 psx_get_seq(unsigned char * tuple){
6c40056777be Initial revision
fuchita
parents:
diff changeset
197 return get_int(tuple,LINDA_SEQ_OFFSET);
6c40056777be Initial revision
fuchita
parents:
diff changeset
198 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
199
6c40056777be Initial revision
fuchita
parents:
diff changeset
200 unsigned short
6c40056777be Initial revision
fuchita
parents:
diff changeset
201 psx_get_id(unsigned char * tuple){
6c40056777be Initial revision
fuchita
parents:
diff changeset
202 return (tuple[LINDA_ID_OFFSET] * 256 + tuple[LINDA_ID_OFFSET+1]);
6c40056777be Initial revision
fuchita
parents:
diff changeset
203 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
204
6c40056777be Initial revision
fuchita
parents:
diff changeset
205 unsigned char
6c40056777be Initial revision
fuchita
parents:
diff changeset
206 psx_get_mode(unsigned char * tuple){
6c40056777be Initial revision
fuchita
parents:
diff changeset
207 return tuple[LINDA_MODE_OFFSET];
6c40056777be Initial revision
fuchita
parents:
diff changeset
208 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
209
6c40056777be Initial revision
fuchita
parents:
diff changeset
210 static
6c40056777be Initial revision
fuchita
parents:
diff changeset
211 void
6c40056777be Initial revision
fuchita
parents:
diff changeset
212 set_int_to_char(unsigned char * tuple, int i, int offset){
6c40056777be Initial revision
fuchita
parents:
diff changeset
213 tuple[offset] = (i>>24) & 0xff;
6c40056777be Initial revision
fuchita
parents:
diff changeset
214 tuple[offset+1] = (i>>16) & 0xff;
6c40056777be Initial revision
fuchita
parents:
diff changeset
215 tuple[offset+2] = (i>>8) & 0xff;
6c40056777be Initial revision
fuchita
parents:
diff changeset
216 tuple[offset+3] = (i) & 0xff;
6c40056777be Initial revision
fuchita
parents:
diff changeset
217 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
218
6c40056777be Initial revision
fuchita
parents:
diff changeset
219 void
6c40056777be Initial revision
fuchita
parents:
diff changeset
220 psx_set_datalength(unsigned char * tuple, int length){
6c40056777be Initial revision
fuchita
parents:
diff changeset
221 set_int_to_char(tuple,length,LINDA_DATA_LENGTH_OFFSET);
6c40056777be Initial revision
fuchita
parents:
diff changeset
222 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
223
6c40056777be Initial revision
fuchita
parents:
diff changeset
224 void
6c40056777be Initial revision
fuchita
parents:
diff changeset
225 psx_set_seq(unsigned char * tuple, int seq){
6c40056777be Initial revision
fuchita
parents:
diff changeset
226 set_int_to_char(tuple,seq,LINDA_SEQ_OFFSET);
6c40056777be Initial revision
fuchita
parents:
diff changeset
227 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
228
6c40056777be Initial revision
fuchita
parents:
diff changeset
229 void
6c40056777be Initial revision
fuchita
parents:
diff changeset
230 psx_set_id(unsigned char * tuple, short id){
6c40056777be Initial revision
fuchita
parents:
diff changeset
231 tuple[LINDA_ID_OFFSET] = (id>>8) & 0xff;
6c40056777be Initial revision
fuchita
parents:
diff changeset
232 tuple[LINDA_ID_OFFSET+1] = id & 0xff;
6c40056777be Initial revision
fuchita
parents:
diff changeset
233 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
234
6c40056777be Initial revision
fuchita
parents:
diff changeset
235 void
6c40056777be Initial revision
fuchita
parents:
diff changeset
236 psx_set_mode(unsigned char * tuple, char mode){
6c40056777be Initial revision
fuchita
parents:
diff changeset
237 tuple[LINDA_MODE_OFFSET] = mode;
6c40056777be Initial revision
fuchita
parents:
diff changeset
238 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
239
6c40056777be Initial revision
fuchita
parents:
diff changeset
240 /*-------------------------------------------------------------------/
6c40056777be Initial revision
fuchita
parents:
diff changeset
241 int
6c40056777be Initial revision
fuchita
parents:
diff changeset
242 sz_send (int fd, unsigned char *buf, int size, int flag):
6c40056777be Initial revision
fuchita
parents:
diff changeset
243 クライアントへTUPLEを送る。
6c40056777be Initial revision
fuchita
parents:
diff changeset
244
6c40056777be Initial revision
fuchita
parents:
diff changeset
245 引き数:
6c40056777be Initial revision
fuchita
parents:
diff changeset
246 fd - 送信先のファイルディスクリプタ
6c40056777be Initial revision
fuchita
parents:
diff changeset
247 buf - 送るデータ
6c40056777be Initial revision
fuchita
parents:
diff changeset
248 size - bufのサイズ(byte)
6c40056777be Initial revision
fuchita
parents:
diff changeset
249 flag - 使用していない
6c40056777be Initial revision
fuchita
parents:
diff changeset
250 返り値:
6c40056777be Initial revision
fuchita
parents:
diff changeset
251 送ったデータのbyte数
6c40056777be Initial revision
fuchita
parents:
diff changeset
252 /-------------------------------------------------------------------*/
6c40056777be Initial revision
fuchita
parents:
diff changeset
253 int
6c40056777be Initial revision
fuchita
parents:
diff changeset
254 sz_send(int fd, unsigned char *buf, unsigned int size,int flag) {
6c40056777be Initial revision
fuchita
parents:
diff changeset
255 unsigned int i,nsize,writtensize;
6c40056777be Initial revision
fuchita
parents:
diff changeset
256
6c40056777be Initial revision
fuchita
parents:
diff changeset
257 nsize = htonl(size); // size は datasize + LINDA_HEADER_SIZE
6c40056777be Initial revision
fuchita
parents:
diff changeset
258 write(fd,&nsize,INT_SIZE);
6c40056777be Initial revision
fuchita
parents:
diff changeset
259 for(writtensize=0,i=0; writtensize < size; writtensize+=i){
6c40056777be Initial revision
fuchita
parents:
diff changeset
260 i = write(fd,(char*)buf+writtensize,size-writtensize);
6c40056777be Initial revision
fuchita
parents:
diff changeset
261 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
262
6c40056777be Initial revision
fuchita
parents:
diff changeset
263 return(i);
6c40056777be Initial revision
fuchita
parents:
diff changeset
264 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
265
6c40056777be Initial revision
fuchita
parents:
diff changeset
266 struct sigaction old,new;
6c40056777be Initial revision
fuchita
parents:
diff changeset
267
6c40056777be Initial revision
fuchita
parents:
diff changeset
268 static void
6c40056777be Initial revision
fuchita
parents:
diff changeset
269 intr(int i)
6c40056777be Initial revision
fuchita
parents:
diff changeset
270 {
6c40056777be Initial revision
fuchita
parents:
diff changeset
271 fprintf(stderr,"intr: %d \n",i);
6c40056777be Initial revision
fuchita
parents:
diff changeset
272 // stop = 1;
6c40056777be Initial revision
fuchita
parents:
diff changeset
273 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
274
6c40056777be Initial revision
fuchita
parents:
diff changeset
275 /*-------------------------------------------------------------------/
6c40056777be Initial revision
fuchita
parents:
diff changeset
276 int
6c40056777be Initial revision
fuchita
parents:
diff changeset
277 main (int argc,char *argv[]):
6c40056777be Initial revision
fuchita
parents:
diff changeset
278 サーバのメイン。クライアントから送られて来た各コマンドに対応
6c40056777be Initial revision
fuchita
parents:
diff changeset
279 した処理を行う。
6c40056777be Initial revision
fuchita
parents:
diff changeset
280 /-------------------------------------------------------------------*/
6c40056777be Initial revision
fuchita
parents:
diff changeset
281 int
6c40056777be Initial revision
fuchita
parents:
diff changeset
282 main(int argc,char *argv[])
6c40056777be Initial revision
fuchita
parents:
diff changeset
283 {
6c40056777be Initial revision
fuchita
parents:
diff changeset
284 int i, a, users;
6c40056777be Initial revision
fuchita
parents:
diff changeset
285 int ls,sk,fd,maxfds;
6c40056777be Initial revision
fuchita
parents:
diff changeset
286 unsigned int id;
6c40056777be Initial revision
fuchita
parents:
diff changeset
287 unsigned int datasize;
6c40056777be Initial revision
fuchita
parents:
diff changeset
288
6c40056777be Initial revision
fuchita
parents:
diff changeset
289 socklen_t paddrlen;
6c40056777be Initial revision
fuchita
parents:
diff changeset
290
6c40056777be Initial revision
fuchita
parents:
diff changeset
291 int skfg = 1;
6c40056777be Initial revision
fuchita
parents:
diff changeset
292 short user = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
293 unsigned char userchar[2];
6c40056777be Initial revision
fuchita
parents:
diff changeset
294 #ifdef UNIX_DOMAIN
6c40056777be Initial revision
fuchita
parents:
diff changeset
295 struct sockaddr_un my_addr, peer;
6c40056777be Initial revision
fuchita
parents:
diff changeset
296 #else
6c40056777be Initial revision
fuchita
parents:
diff changeset
297 struct sockaddr_in my_addr, peer;
6c40056777be Initial revision
fuchita
parents:
diff changeset
298 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
299 struct timeval zerotime;
6c40056777be Initial revision
fuchita
parents:
diff changeset
300 unsigned char ipaddr[4];
6c40056777be Initial revision
fuchita
parents:
diff changeset
301 unsigned char *buf = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
302 int len;
6c40056777be Initial revision
fuchita
parents:
diff changeset
303 int fduser[MAX_USER];
6c40056777be Initial revision
fuchita
parents:
diff changeset
304 fd_set readfds, suspect, tmpfd;
6c40056777be Initial revision
fuchita
parents:
diff changeset
305 char ch;
6c40056777be Initial revision
fuchita
parents:
diff changeset
306
6c40056777be Initial revision
fuchita
parents:
diff changeset
307 extern char *optarg;
6c40056777be Initial revision
fuchita
parents:
diff changeset
308 extern int optind;
6c40056777be Initial revision
fuchita
parents:
diff changeset
309
6c40056777be Initial revision
fuchita
parents:
diff changeset
310
6c40056777be Initial revision
fuchita
parents:
diff changeset
311 new.sa_handler = intr;
6c40056777be Initial revision
fuchita
parents:
diff changeset
312 sigaction(SIGPIPE,&new,&old);
6c40056777be Initial revision
fuchita
parents:
diff changeset
313
6c40056777be Initial revision
fuchita
parents:
diff changeset
314
6c40056777be Initial revision
fuchita
parents:
diff changeset
315 while ((ch = getopt(argc, argv, "p:h:")) != -1){
6c40056777be Initial revision
fuchita
parents:
diff changeset
316 switch(ch) {
6c40056777be Initial revision
fuchita
parents:
diff changeset
317 case 'p':
6c40056777be Initial revision
fuchita
parents:
diff changeset
318 unix_port = atoi(optarg);
6c40056777be Initial revision
fuchita
parents:
diff changeset
319 break;
6c40056777be Initial revision
fuchita
parents:
diff changeset
320 case '?':
6c40056777be Initial revision
fuchita
parents:
diff changeset
321 default:
6c40056777be Initial revision
fuchita
parents:
diff changeset
322 fprintf(stderr,"usage: %s [-p port]\n",argv[0]);
6c40056777be Initial revision
fuchita
parents:
diff changeset
323 break;
6c40056777be Initial revision
fuchita
parents:
diff changeset
324 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
325 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
326
6c40056777be Initial revision
fuchita
parents:
diff changeset
327 argc -= optind;
6c40056777be Initial revision
fuchita
parents:
diff changeset
328 argv += optind;
6c40056777be Initial revision
fuchita
parents:
diff changeset
329
6c40056777be Initial revision
fuchita
parents:
diff changeset
330 zerotime.tv_sec = zerotime.tv_usec = 0L;
6c40056777be Initial revision
fuchita
parents:
diff changeset
331 users = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
332
6c40056777be Initial revision
fuchita
parents:
diff changeset
333 #ifdef UNIX_DOMAIN
6c40056777be Initial revision
fuchita
parents:
diff changeset
334 if ((ls = socket(AF_UNIX, SOCK_STREAM, 0)) == FAIL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
335 #else
6c40056777be Initial revision
fuchita
parents:
diff changeset
336 if ((ls = socket(AF_INET, SOCK_STREAM, 0)) == FAIL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
337 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
338 // }
6c40056777be Initial revision
fuchita
parents:
diff changeset
339 fprintf(stderr, "socket open error! errno :%d %s\n", errno,
6c40056777be Initial revision
fuchita
parents:
diff changeset
340 strerror(errno));
6c40056777be Initial revision
fuchita
parents:
diff changeset
341 exit(1);
6c40056777be Initial revision
fuchita
parents:
diff changeset
342 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
343 if (setsockopt(ls, SOL_SOCKET, SO_REUSEADDR,(char *) &skfg, sizeof(skfg)) < 0){
6c40056777be Initial revision
fuchita
parents:
diff changeset
344 fprintf(stderr, "setsockopt error %d\n",errno);
6c40056777be Initial revision
fuchita
parents:
diff changeset
345 close(ls);
6c40056777be Initial revision
fuchita
parents:
diff changeset
346 exit(1);
6c40056777be Initial revision
fuchita
parents:
diff changeset
347 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
348 #ifdef UNIX_DOMAIN
6c40056777be Initial revision
fuchita
parents:
diff changeset
349 my_addr.sun_family = AF_UNIX;
6c40056777be Initial revision
fuchita
parents:
diff changeset
350 strcpy(my_addr.sun_path, PATHNAME);
6c40056777be Initial revision
fuchita
parents:
diff changeset
351 #else
6c40056777be Initial revision
fuchita
parents:
diff changeset
352 my_addr.sin_family = AF_INET;
6c40056777be Initial revision
fuchita
parents:
diff changeset
353 my_addr.sin_port = unix_port;
6c40056777be Initial revision
fuchita
parents:
diff changeset
354 my_addr.sin_addr.s_addr = INADDR_ANY;
6c40056777be Initial revision
fuchita
parents:
diff changeset
355 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
356
6c40056777be Initial revision
fuchita
parents:
diff changeset
357 if (bind(ls, (struct sockaddr *)&my_addr,sizeof(my_addr)) == FAIL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
358 fprintf(stderr, "socket binded address error! errno:%d %s\n", errno,
6c40056777be Initial revision
fuchita
parents:
diff changeset
359 strerror(errno));
6c40056777be Initial revision
fuchita
parents:
diff changeset
360 close(ls);
6c40056777be Initial revision
fuchita
parents:
diff changeset
361 exit(1);
6c40056777be Initial revision
fuchita
parents:
diff changeset
362 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
363 if (listen(ls, MAX_REQ) == FAIL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
364 fprintf(stderr, "list creat error! errno:%d %s\n", errno,
6c40056777be Initial revision
fuchita
parents:
diff changeset
365 strerror(errno));
6c40056777be Initial revision
fuchita
parents:
diff changeset
366 close(ls);
6c40056777be Initial revision
fuchita
parents:
diff changeset
367 exit(1);
6c40056777be Initial revision
fuchita
parents:
diff changeset
368 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
369 paddrlen = (socklen_t)sizeof(peer);
6c40056777be Initial revision
fuchita
parents:
diff changeset
370 maxfds = FD_SETSIZE;
6c40056777be Initial revision
fuchita
parents:
diff changeset
371 fd = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
372 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
373 // maxfds = 8;
6c40056777be Initial revision
fuchita
parents:
diff changeset
374 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
375 FD_ZERO(&readfds);
6c40056777be Initial revision
fuchita
parents:
diff changeset
376
6c40056777be Initial revision
fuchita
parents:
diff changeset
377 // main loop
6c40056777be Initial revision
fuchita
parents:
diff changeset
378 while(1){
6c40056777be Initial revision
fuchita
parents:
diff changeset
379 FD_SET(ls, &readfds);
6c40056777be Initial revision
fuchita
parents:
diff changeset
380 tmpfd = readfds;
6c40056777be Initial revision
fuchita
parents:
diff changeset
381
6c40056777be Initial revision
fuchita
parents:
diff changeset
382 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
383 show_tuple_space();
6c40056777be Initial revision
fuchita
parents:
diff changeset
384 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
385 if ((sk = select(maxfds, &readfds, NULL, NULL, NULL)) == FAIL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
386 if (errno == EBADF){
6c40056777be Initial revision
fuchita
parents:
diff changeset
387 for(i = 0;i < maxfds;i++){
6c40056777be Initial revision
fuchita
parents:
diff changeset
388 FD_ZERO(&suspect);
6c40056777be Initial revision
fuchita
parents:
diff changeset
389 if (FD_ISSET(i, &readfds)){
6c40056777be Initial revision
fuchita
parents:
diff changeset
390 FD_SET(i, &suspect);
6c40056777be Initial revision
fuchita
parents:
diff changeset
391 if (select(maxfds, &suspect, NULL, NULL, &zerotime) == FAIL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
392 fprintf(stdout, "%d descriptor clear",i);
6c40056777be Initial revision
fuchita
parents:
diff changeset
393 FD_CLR(i, &readfds);
6c40056777be Initial revision
fuchita
parents:
diff changeset
394 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
395 FD_CLR(i, &suspect);
6c40056777be Initial revision
fuchita
parents:
diff changeset
396 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
397 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
398 } else {
6c40056777be Initial revision
fuchita
parents:
diff changeset
399 fprintf(stderr, "select error! errno:%d %s\n", errno,
6c40056777be Initial revision
fuchita
parents:
diff changeset
400 strerror(errno));
6c40056777be Initial revision
fuchita
parents:
diff changeset
401 close(ls);
6c40056777be Initial revision
fuchita
parents:
diff changeset
402 exit(1);
6c40056777be Initial revision
fuchita
parents:
diff changeset
403 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
404 } else {
6c40056777be Initial revision
fuchita
parents:
diff changeset
405 while(1){
6c40056777be Initial revision
fuchita
parents:
diff changeset
406 fd = (fd + 1) % maxfds;
6c40056777be Initial revision
fuchita
parents:
diff changeset
407 if (FD_ISSET(fd, &readfds)) break;
6c40056777be Initial revision
fuchita
parents:
diff changeset
408 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
409 readfds = tmpfd;
6c40056777be Initial revision
fuchita
parents:
diff changeset
410
6c40056777be Initial revision
fuchita
parents:
diff changeset
411 // 新規の接続
6c40056777be Initial revision
fuchita
parents:
diff changeset
412 if (fd == ls){
6c40056777be Initial revision
fuchita
parents:
diff changeset
413 if ((sk = accept(ls, (struct sockaddr *)&peer, &paddrlen)) == FAIL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
414 fprintf(stderr, "connection accept error! errno:%d %s\n", errno,
6c40056777be Initial revision
fuchita
parents:
diff changeset
415 strerror(errno));
6c40056777be Initial revision
fuchita
parents:
diff changeset
416 close(ls);
6c40056777be Initial revision
fuchita
parents:
diff changeset
417 exit(1);
6c40056777be Initial revision
fuchita
parents:
diff changeset
418 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
419 #ifndef UNIX_DOMAIN
6c40056777be Initial revision
fuchita
parents:
diff changeset
420 if (peer.sin_family == AF_INET){
6c40056777be Initial revision
fuchita
parents:
diff changeset
421 int tmp = 1;
6c40056777be Initial revision
fuchita
parents:
diff changeset
422
6c40056777be Initial revision
fuchita
parents:
diff changeset
423 setsockopt (sk, IPPROTO_TCP, TCP_NODELAY,
6c40056777be Initial revision
fuchita
parents:
diff changeset
424 (char *) &tmp, sizeof (int));
6c40056777be Initial revision
fuchita
parents:
diff changeset
425 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
426 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
427 if ((tp = tuple_space[MAX_TUPLE-1]) == NULL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
428 tp = tuple_space[MAX_TUPLE-1] = (TUPLE *) malloc(sizeof(TUPLE));
6c40056777be Initial revision
fuchita
parents:
diff changeset
429 tp->next = NULL;
6c40056777be Initial revision
fuchita
parents:
diff changeset
430 } else {
6c40056777be Initial revision
fuchita
parents:
diff changeset
431 while(tp->next) tp = tp->next;
6c40056777be Initial revision
fuchita
parents:
diff changeset
432 tp->next = (TUPLE *) malloc(sizeof(TUPLE));
6c40056777be Initial revision
fuchita
parents:
diff changeset
433 tp = tp->next;
6c40056777be Initial revision
fuchita
parents:
diff changeset
434 tp->next = NULL;
6c40056777be Initial revision
fuchita
parents:
diff changeset
435 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
436 tp->mode = 'o';
6c40056777be Initial revision
fuchita
parents:
diff changeset
437 tp->seq = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
438 tp->data = (unsigned char *) malloc(sizeof(short)+LINDA_HEADER_SIZE);
6c40056777be Initial revision
fuchita
parents:
diff changeset
439 tp->datalen = sizeof(short);
6c40056777be Initial revision
fuchita
parents:
diff changeset
440 user++;
6c40056777be Initial revision
fuchita
parents:
diff changeset
441 userchar[0] = user / 10 + '0';
6c40056777be Initial revision
fuchita
parents:
diff changeset
442 userchar[1] = user % 10 + '0';
6c40056777be Initial revision
fuchita
parents:
diff changeset
443
6c40056777be Initial revision
fuchita
parents:
diff changeset
444 psx_set_mode(tp->data,tp->mode);
6c40056777be Initial revision
fuchita
parents:
diff changeset
445 psx_set_id(tp->data,MAX_TUPLE-1);
6c40056777be Initial revision
fuchita
parents:
diff changeset
446 psx_set_seq(tp->data,tp->seq);
6c40056777be Initial revision
fuchita
parents:
diff changeset
447 psx_set_datalength(tp->data,tp->datalen);
6c40056777be Initial revision
fuchita
parents:
diff changeset
448 memcpy(tp->data+LINDA_HEADER_SIZE, &userchar ,sizeof(userchar));
6c40056777be Initial revision
fuchita
parents:
diff changeset
449
6c40056777be Initial revision
fuchita
parents:
diff changeset
450 fprintf(stdout, "localhost connected assign id = %d\n", user);
6c40056777be Initial revision
fuchita
parents:
diff changeset
451 #ifndef UNIX_DOMAIN
6c40056777be Initial revision
fuchita
parents:
diff changeset
452 memcpy(ipaddr, &peer.sin_addr.s_addr, sizeof(ipaddr));
6c40056777be Initial revision
fuchita
parents:
diff changeset
453 fprintf(stdout, "%d.%d.%d.%d connected \n",
6c40056777be Initial revision
fuchita
parents:
diff changeset
454 ipaddr[0],ipaddr[1],ipaddr[2],ipaddr[3]);
6c40056777be Initial revision
fuchita
parents:
diff changeset
455 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
456 FD_SET(sk,&readfds);
6c40056777be Initial revision
fuchita
parents:
diff changeset
457
6c40056777be Initial revision
fuchita
parents:
diff changeset
458 // 接続を確立しているクライアントからの要求
6c40056777be Initial revision
fuchita
parents:
diff changeset
459 } else {
6c40056777be Initial revision
fuchita
parents:
diff changeset
460 int tempnum;
6c40056777be Initial revision
fuchita
parents:
diff changeset
461 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
462 fprintf(stdout, "\n\ndata from %d descriptor\n", fd);
6c40056777be Initial revision
fuchita
parents:
diff changeset
463 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
464 if((len=read(fd,&tempnum,INT_SIZE))!=INT_SIZE) {
6c40056777be Initial revision
fuchita
parents:
diff changeset
465 if (len==0) {
6c40056777be Initial revision
fuchita
parents:
diff changeset
466 fprintf(stdout, "fd %d closed\n", fd);
6c40056777be Initial revision
fuchita
parents:
diff changeset
467 close(fd);
6c40056777be Initial revision
fuchita
parents:
diff changeset
468 continue;
6c40056777be Initial revision
fuchita
parents:
diff changeset
469 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
470 fprintf(stderr, "read error! on fd:%d ret=%d %s\n",
6c40056777be Initial revision
fuchita
parents:
diff changeset
471 fd, len, strerror(errno));
6c40056777be Initial revision
fuchita
parents:
diff changeset
472 close(fd);
6c40056777be Initial revision
fuchita
parents:
diff changeset
473 continue;
6c40056777be Initial revision
fuchita
parents:
diff changeset
474 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
475 len = ntohl(tempnum); // len は DATASIZE + LINDA_HEADER_SIZE
6c40056777be Initial revision
fuchita
parents:
diff changeset
476
6c40056777be Initial revision
fuchita
parents:
diff changeset
477 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
478 fprintf(stderr, "datta on fd:%d len=%d\n", fd,len);
6c40056777be Initial revision
fuchita
parents:
diff changeset
479 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
480 if((buf = (unsigned char*)malloc(len))==NULL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
481 fprintf(stderr,"allocate error! :%d %s",errno,strerror(errno));
6c40056777be Initial revision
fuchita
parents:
diff changeset
482 exit(1);
6c40056777be Initial revision
fuchita
parents:
diff changeset
483 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
484 for(a=0;a<len;a+=i) {
6c40056777be Initial revision
fuchita
parents:
diff changeset
485 if((i=read(fd,buf+a,len-a))<0) {
6c40056777be Initial revision
fuchita
parents:
diff changeset
486 fprintf(stderr, "ldserv: client read error! on i=%d len=%d %s\n",
6c40056777be Initial revision
fuchita
parents:
diff changeset
487 i, len, strerror(errno));
6c40056777be Initial revision
fuchita
parents:
diff changeset
488 close(fd);
6c40056777be Initial revision
fuchita
parents:
diff changeset
489 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
490 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
491 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
492 fprintf(stdout,"recv size = %d : mode = %c\n", len, *buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
493 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
494 #ifdef COUNT_PACKET
6c40056777be Initial revision
fuchita
parents:
diff changeset
495 count_packet(buf[0]);
6c40056777be Initial revision
fuchita
parents:
diff changeset
496 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
497
6c40056777be Initial revision
fuchita
parents:
diff changeset
498 if ((buf[LINDA_MODE_OFFSET] == '!') || (len == 0)){
6c40056777be Initial revision
fuchita
parents:
diff changeset
499 FD_CLR(fd, &readfds);
6c40056777be Initial revision
fuchita
parents:
diff changeset
500 for(i = 0;i < users; i++){
6c40056777be Initial revision
fuchita
parents:
diff changeset
501 if (fduser[i] == fd) break;
6c40056777be Initial revision
fuchita
parents:
diff changeset
502 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
503 fprintf(stdout, "connection closed descriptor :%d\n", fd);
6c40056777be Initial revision
fuchita
parents:
diff changeset
504 close(fd);
6c40056777be Initial revision
fuchita
parents:
diff changeset
505 free(buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
506 buf=0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
507 } else if (buf[LINDA_MODE_OFFSET] == 'c'){
6c40056777be Initial revision
fuchita
parents:
diff changeset
508 id = buf[LINDA_ID_OFFSET] * 256 + buf[LINDA_ID_OFFSET+1];
6c40056777be Initial revision
fuchita
parents:
diff changeset
509 //buf[LINDA_MODE_OFFSET] = 'a';
6c40056777be Initial revision
fuchita
parents:
diff changeset
510 tp = tuple_space[id];
6c40056777be Initial revision
fuchita
parents:
diff changeset
511 while(tp && tp->next && (tp->mode=='w')){
6c40056777be Initial revision
fuchita
parents:
diff changeset
512 tp = tp->next;
6c40056777be Initial revision
fuchita
parents:
diff changeset
513 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
514 if (tp && (tp->mode == 'o')){
6c40056777be Initial revision
fuchita
parents:
diff changeset
515 psx_set_datalength(buf,tp->datalen);
6c40056777be Initial revision
fuchita
parents:
diff changeset
516 } else {
6c40056777be Initial revision
fuchita
parents:
diff changeset
517 /* means no out tuple */
6c40056777be Initial revision
fuchita
parents:
diff changeset
518 memset(&buf[LINDA_DATA_LENGTH_OFFSET],0,INT_SIZE);
6c40056777be Initial revision
fuchita
parents:
diff changeset
519 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
520
6c40056777be Initial revision
fuchita
parents:
diff changeset
521 if (sz_send(fd, buf, LINDA_HEADER_SIZE, 0) == FAIL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
522 fprintf(stderr,"recv error! errno :%d %s\n", errno,
6c40056777be Initial revision
fuchita
parents:
diff changeset
523 strerror(errno));
6c40056777be Initial revision
fuchita
parents:
diff changeset
524 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
525 free(buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
526 buf = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
527 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
528 fprintf(stdout,"send size= %d : mode = %c\n",len, *buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
529 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
530 } else if (buf[LINDA_MODE_OFFSET] == 'i' || buf[LINDA_MODE_OFFSET] == 'r'){
6c40056777be Initial revision
fuchita
parents:
diff changeset
531 int mode = buf[LINDA_MODE_OFFSET];
6c40056777be Initial revision
fuchita
parents:
diff changeset
532 TUPLE * temp = NULL;
6c40056777be Initial revision
fuchita
parents:
diff changeset
533
6c40056777be Initial revision
fuchita
parents:
diff changeset
534 id = psx_get_id(buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
535 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
536 fprintf(stdout, "*** %c command : id = %d ***\n",mode,id);
6c40056777be Initial revision
fuchita
parents:
diff changeset
537 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
538 tp = tuple_space[id];
6c40056777be Initial revision
fuchita
parents:
diff changeset
539
6c40056777be Initial revision
fuchita
parents:
diff changeset
540 // w は無視する
6c40056777be Initial revision
fuchita
parents:
diff changeset
541 while(tp && tp->next && (tp->mode=='w')){
6c40056777be Initial revision
fuchita
parents:
diff changeset
542 temp = tp;
6c40056777be Initial revision
fuchita
parents:
diff changeset
543 tp = tp->next;
6c40056777be Initial revision
fuchita
parents:
diff changeset
544 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
545
6c40056777be Initial revision
fuchita
parents:
diff changeset
546 if (tp && (tp->mode == 'o')){
6c40056777be Initial revision
fuchita
parents:
diff changeset
547 psx_set_mode(tp->data,'a');
6c40056777be Initial revision
fuchita
parents:
diff changeset
548 psx_set_seq(tp->data, psx_get_seq(buf));
6c40056777be Initial revision
fuchita
parents:
diff changeset
549 free(buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
550 buf=0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
551 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
552 fprintf(stdout,"send size = %d : mode = %c\n",
6c40056777be Initial revision
fuchita
parents:
diff changeset
553 tp->datalen + LINDA_HEADER_SIZE, tp->mode);
6c40056777be Initial revision
fuchita
parents:
diff changeset
554 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
555 if (sz_send(fd, tp->data, (tp->datalen) + LINDA_HEADER_SIZE, 0) == FAIL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
556 fprintf(stderr,"recv error! errno :%d %s\n", errno,
6c40056777be Initial revision
fuchita
parents:
diff changeset
557 strerror(errno));
6c40056777be Initial revision
fuchita
parents:
diff changeset
558 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
559 if(mode == 'i') {
6c40056777be Initial revision
fuchita
parents:
diff changeset
560 if(tp->data){
6c40056777be Initial revision
fuchita
parents:
diff changeset
561 free(tp->data);
6c40056777be Initial revision
fuchita
parents:
diff changeset
562 tp->data=0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
563 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
564
6c40056777be Initial revision
fuchita
parents:
diff changeset
565 if(temp){
6c40056777be Initial revision
fuchita
parents:
diff changeset
566 temp->next = tp->next;
6c40056777be Initial revision
fuchita
parents:
diff changeset
567 }else{
6c40056777be Initial revision
fuchita
parents:
diff changeset
568 tuple_space[id] = tp->next;
6c40056777be Initial revision
fuchita
parents:
diff changeset
569 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
570 free(tp);
6c40056777be Initial revision
fuchita
parents:
diff changeset
571 tp = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
572 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
573 } else {
6c40056777be Initial revision
fuchita
parents:
diff changeset
574 if (tp == NULL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
575 tp = tuple_space[id] = (TUPLE *) malloc(sizeof(TUPLE));
6c40056777be Initial revision
fuchita
parents:
diff changeset
576 tp->next = NULL;
6c40056777be Initial revision
fuchita
parents:
diff changeset
577 } else {
6c40056777be Initial revision
fuchita
parents:
diff changeset
578 while(tp->next) tp = tp->next;
6c40056777be Initial revision
fuchita
parents:
diff changeset
579 tp->next = (TUPLE *) malloc(sizeof(TUPLE));
6c40056777be Initial revision
fuchita
parents:
diff changeset
580 tp = tp->next;
6c40056777be Initial revision
fuchita
parents:
diff changeset
581 tp->next = NULL;
6c40056777be Initial revision
fuchita
parents:
diff changeset
582 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
583
6c40056777be Initial revision
fuchita
parents:
diff changeset
584 tp->mode = mode;
6c40056777be Initial revision
fuchita
parents:
diff changeset
585 tp->seq = psx_get_seq(buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
586 tp->fd = fd;
6c40056777be Initial revision
fuchita
parents:
diff changeset
587 tp->datalen = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
588 tp->data = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
589 free(buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
590 buf=0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
591 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
592 fprintf(stdout, "data inserted insert seq = %d, id = %d\n"
6c40056777be Initial revision
fuchita
parents:
diff changeset
593 ,tp->seq,id);
6c40056777be Initial revision
fuchita
parents:
diff changeset
594 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
595 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
596 } else if (buf[LINDA_MODE_OFFSET] == 'w'){
6c40056777be Initial revision
fuchita
parents:
diff changeset
597 int mode = buf[LINDA_MODE_OFFSET];
6c40056777be Initial revision
fuchita
parents:
diff changeset
598
6c40056777be Initial revision
fuchita
parents:
diff changeset
599 id = buf[LINDA_ID_OFFSET] * 256 + buf[LINDA_ID_OFFSET+1];
6c40056777be Initial revision
fuchita
parents:
diff changeset
600 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
601 fprintf(stdout, "***%c command : id = %d ***\n",mode,id);
6c40056777be Initial revision
fuchita
parents:
diff changeset
602 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
603 tp = (TUPLE *) malloc(sizeof(TUPLE));
6c40056777be Initial revision
fuchita
parents:
diff changeset
604 tp->mode = mode;
6c40056777be Initial revision
fuchita
parents:
diff changeset
605 tp->seq = psx_get_seq(buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
606 tp->fd = fd;
6c40056777be Initial revision
fuchita
parents:
diff changeset
607 tp->datalen = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
608 tp->data = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
609 tp->next = tuple_space[id];
6c40056777be Initial revision
fuchita
parents:
diff changeset
610 tuple_space[id] = tp;
6c40056777be Initial revision
fuchita
parents:
diff changeset
611 free(buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
612 buf=0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
613 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
614 fprintf(stdout, "data inserted insert seq = %d, id = %d\n"
6c40056777be Initial revision
fuchita
parents:
diff changeset
615 ,tuple_space[id]->seq,id);
6c40056777be Initial revision
fuchita
parents:
diff changeset
616 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
617 } else if (buf[LINDA_MODE_OFFSET] == 'o'){
6c40056777be Initial revision
fuchita
parents:
diff changeset
618 id = buf[LINDA_ID_OFFSET] * 256 + buf[LINDA_ID_OFFSET+1];
6c40056777be Initial revision
fuchita
parents:
diff changeset
619
6c40056777be Initial revision
fuchita
parents:
diff changeset
620 datasize = psx_get_datalength(buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
621 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
622 fprintf(stdout, "*** out command : id = %d ***\n",id);
6c40056777be Initial revision
fuchita
parents:
diff changeset
623 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
624 while((tuple_space[id]) &&
6c40056777be Initial revision
fuchita
parents:
diff changeset
625 ((tuple_space[id]->mode=='w')||(tuple_space[id]->mode == 'r'))){
6c40056777be Initial revision
fuchita
parents:
diff changeset
626
6c40056777be Initial revision
fuchita
parents:
diff changeset
627 // buf[LINDA_MODE_OFFSET] = 'a';
6c40056777be Initial revision
fuchita
parents:
diff changeset
628 psx_set_mode(buf,'a');
6c40056777be Initial revision
fuchita
parents:
diff changeset
629 psx_set_seq(buf,tuple_space[id]->seq);
6c40056777be Initial revision
fuchita
parents:
diff changeset
630
6c40056777be Initial revision
fuchita
parents:
diff changeset
631 if (sz_send(tuple_space[id]->fd,buf,datasize+LINDA_HEADER_SIZE, 0) == FAIL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
632 fprintf(stderr,"recv error! errno :%d %s\n", errno,
6c40056777be Initial revision
fuchita
parents:
diff changeset
633 strerror(errno));
6c40056777be Initial revision
fuchita
parents:
diff changeset
634 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
635 tp = tuple_space[id];
6c40056777be Initial revision
fuchita
parents:
diff changeset
636 tuple_space[id] = tp->next;
6c40056777be Initial revision
fuchita
parents:
diff changeset
637 free(tp);
6c40056777be Initial revision
fuchita
parents:
diff changeset
638 tp = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
639 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
640 if ((tuple_space[id]) && tuple_space[id]->mode == 'i'){
6c40056777be Initial revision
fuchita
parents:
diff changeset
641 buf[LINDA_MODE_OFFSET] = 'a';
6c40056777be Initial revision
fuchita
parents:
diff changeset
642 psx_set_seq(buf,tuple_space[id]->seq);
6c40056777be Initial revision
fuchita
parents:
diff changeset
643
6c40056777be Initial revision
fuchita
parents:
diff changeset
644 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
645 fprintf(stdout,"sendsize = %d :mode = %c\n",
6c40056777be Initial revision
fuchita
parents:
diff changeset
646 datasize+LINDA_HEADER_SIZE, *buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
647 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
648 if (sz_send(tuple_space[id]->fd,buf,datasize+LINDA_HEADER_SIZE,0)==FAIL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
649 fprintf(stderr,"recv error! errno :%d %s\n", errno,
6c40056777be Initial revision
fuchita
parents:
diff changeset
650 strerror(errno));
6c40056777be Initial revision
fuchita
parents:
diff changeset
651 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
652 free(buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
653 buf=0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
654 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
655 fprintf(stdout, "send dataid=%d ,mode=%c,len=%d \n"
6c40056777be Initial revision
fuchita
parents:
diff changeset
656 ,id, tuple_space[id]->mode, tuple_space[id]->datalen);
6c40056777be Initial revision
fuchita
parents:
diff changeset
657 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
658 // we should not free waiting in-packet's data
6c40056777be Initial revision
fuchita
parents:
diff changeset
659 tp = tuple_space[id];
6c40056777be Initial revision
fuchita
parents:
diff changeset
660 tuple_space[id] = tp->next;
6c40056777be Initial revision
fuchita
parents:
diff changeset
661 free(tp);
6c40056777be Initial revision
fuchita
parents:
diff changeset
662 tp = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
663 } else if ((tuple_space[id]==NULL) || (tuple_space[id]->mode == 'o')){
6c40056777be Initial revision
fuchita
parents:
diff changeset
664 if ((tp = tuple_space[id]) == NULL){
6c40056777be Initial revision
fuchita
parents:
diff changeset
665 tp = tuple_space[id] = (TUPLE *) malloc(sizeof(TUPLE));
6c40056777be Initial revision
fuchita
parents:
diff changeset
666 tp->next = NULL;
6c40056777be Initial revision
fuchita
parents:
diff changeset
667 } else {
6c40056777be Initial revision
fuchita
parents:
diff changeset
668 while(tp->next) tp = tp->next;
6c40056777be Initial revision
fuchita
parents:
diff changeset
669 tp->next = (TUPLE *) malloc(sizeof(TUPLE));
6c40056777be Initial revision
fuchita
parents:
diff changeset
670 tp = tp->next;
6c40056777be Initial revision
fuchita
parents:
diff changeset
671 tp->next = NULL;
6c40056777be Initial revision
fuchita
parents:
diff changeset
672 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
673 tp->mode = 'o';
6c40056777be Initial revision
fuchita
parents:
diff changeset
674 tp->seq = psx_get_seq(buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
675 tp->data = buf;//(char *) malloc(datasize);
6c40056777be Initial revision
fuchita
parents:
diff changeset
676 tp->datalen = datasize;
6c40056777be Initial revision
fuchita
parents:
diff changeset
677 buf = 0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
678 // memcpy(tp->data, buf+LINDA_HEADER_SIZE,datasize);
6c40056777be Initial revision
fuchita
parents:
diff changeset
679 #ifdef DEBUG
6c40056777be Initial revision
fuchita
parents:
diff changeset
680 fprintf(stdout, "data inserted len = %d, id = %d\n" ,tp->datalen,id);
6c40056777be Initial revision
fuchita
parents:
diff changeset
681 #endif
6c40056777be Initial revision
fuchita
parents:
diff changeset
682 } else {
6c40056777be Initial revision
fuchita
parents:
diff changeset
683 fprintf(stdout,"Uncorrect mode : %c\n",tuple_space[id]->mode);
6c40056777be Initial revision
fuchita
parents:
diff changeset
684 free(buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
685 buf=0;
6c40056777be Initial revision
fuchita
parents:
diff changeset
686 return(0);
6c40056777be Initial revision
fuchita
parents:
diff changeset
687 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
688
6c40056777be Initial revision
fuchita
parents:
diff changeset
689 } else {
6c40056777be Initial revision
fuchita
parents:
diff changeset
690 fprintf(stdout,"Uncorrect buffer\n");
6c40056777be Initial revision
fuchita
parents:
diff changeset
691 if(buf) free(buf);
6c40056777be Initial revision
fuchita
parents:
diff changeset
692 return(0);
6c40056777be Initial revision
fuchita
parents:
diff changeset
693 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
694 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
695 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
696 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
697 perror("Unexpeced end");
6c40056777be Initial revision
fuchita
parents:
diff changeset
698 close(ls);/* conection terminat */
6c40056777be Initial revision
fuchita
parents:
diff changeset
699 }
6c40056777be Initial revision
fuchita
parents:
diff changeset
700