annotate src/reditor.c @ 34:e170173ecb68 current-release

before ack base protocol.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 26 Nov 2008 15:02:10 +0900
parents 8d4ffb7c9f4e
children 2820e371ab4b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1 #include <stdio.h>
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
2 #include <stdlib.h>
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
3 #include <sys/types.h>
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
4 #include <sys/socket.h>
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
5 #include <netinet/in.h>
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
6 #include <netdb.h>
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
7 #include <unistd.h>
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
8 #include <errno.h>
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
9
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
10 #include "vim.h"
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
11 #include "reditor.h"
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
12
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
13 /* Global variables of Vim */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
14 #include "globals.h"
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
15
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
16 /* Wrapper for Vim */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
17 static void e_msg_wrp(char *msg);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
18 static void free_wrp(void *p);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
19 static BUFTYPE* make_new_buf_wrp(char *name);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
20 static void free_buf_wrp(BUFTYPE *buf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
21 static BUFTYPE* find_buf_by_name_wrp(char *name);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
22 static void open_buffer_memline_wrp(BUFTYPE *buf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
23 static BUFTYPE* get_curbuf_wrp();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
24 static BUFTYPE* set_curbuf_wrp(BUFTYPE *buf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
25 static char* get_memline_wrp(BUFTYPE *buf, long lnum);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
26 static int append_memline_wrp(long lnum, char *text);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
27 static int delete_memline_wrp(long lnum);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
28 static void update_screen_now_wrp();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
29 static char *get_fullpath_wrp(BUFTYPE *buf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
30 /* Wrapper END */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
31
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
32
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
33 static rep_T* get_rep();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
34
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
35 static int rep_connect(char *host);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
36
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
37 static void rep_free(void *obj);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
38
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
39 static BUFTYPE* get_buf_by_name(char *name);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
40 static Session* init_session(Session *sn);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
41 static Session* make_session(char *name, BUFTYPE *buf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
42 static void free_session(Session *sn);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
43 static void free_session_list(Session *head);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
44 static Session* set_cursession(Session *sn);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
45 static Session* find_session_by_buf(BUFTYPE *buf);
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
46 // static Session* find_session_by_name(char *name);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
47 static char* get_fullpath(Session *session);
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
48 static Session * get_waiting_session(int sid, char *text) ;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
49 static void set_waiting_session(Session *session);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
50
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
51 static int writen(int fd, char *textbuf, unsigned int len);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
52
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
53 static rep_cmd* make_cmd(unsigned int cmd,
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
54 unsigned int sid,
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
55 unsigned int eid,
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
56 unsigned int seq,
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
57 unsigned int lnum,
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
58 unsigned int length,
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
59 char *text);
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
60 static void forwardCommand(rep_T *rep, rep_cmd *command);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
61 static void set_cmd_seq( rep_cmd *command, unsigned int cmd, unsigned int seq);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
62
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
63 static int free_cmd(rep_cmd *cmd);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
64 static int free_cmdlist(rep_cmdlist *cmdlist);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
65 static void add_cmd_to_list(rep_cmdlist *cmdlist, rep_cmd *cmd);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
66
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
67 static unsigned int get_header(char *buf,int offset);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
68 static int set_header(unsigned int num, char *pkt, int offset);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
69
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
70 static int rep_exe_cmd(rep_cmd *command);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
71 static int rep_exe_pktlist(rep_cmdlist *cmdlist);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
72
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
73 static int rep_recv_cmds(int fd, rep_cmdlist *txtcmdlist);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
74 static int rep_send_cmds(int fd, rep_cmdlist *cmdlist);
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
75 static int rep_send_cmd( int fd, rep_cmd *cur);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
76
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
77
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
78 /* g_rep has an all information of Remote Editor */
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
79 static rep_T g_rep;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
80
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
81 int lock_editor = 0;
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
82
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
83 /*
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
84 * Wrapper for vim
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
85 */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
86
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
87 /* エラーメッセージ出力 */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
88 static void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
89 e_msg_wrp(msg)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
90 char * msg;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
91 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
92 EMSG(msg);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
93 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
94
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
95 /* 通常のメッセージを出力 */
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
96 void
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
97 puts_msg_wrp(msg)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
98 char * msg;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
99 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
100 MSG_PUTS(msg);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
101 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
102
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
103 static void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
104 free_wrp(p)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
105 void *p;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
106 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
107 vim_free(p);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
108 return;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
109 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
110
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
111
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
112 /* 空の新しいバッファを取得 */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
113 static BUFTYPE *
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
114 make_new_buf_wrp(name)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
115 char * name;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
116 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
117 return buflist_new((char_u*)name, NULL, 0, BLN_LISTED);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
118 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
119
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
120 static void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
121 free_buf_wrp(buf)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
122 BUFTYPE *buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
123 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
124 close_buffer(NULL, buf, DOBUF_DEL);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
125 return;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
126 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
127
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
128
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
129 /* 名前からバッファへのポインタを取得 */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
130 static BUFTYPE *
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
131 find_buf_by_name_wrp(name)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
132 char * name;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
133 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
134 char *sfname = NULL; // sfname is used name's address
14
1e44fe6dcfaa *** empty log message ***
kono
parents: 12
diff changeset
135
1e44fe6dcfaa *** empty log message ***
kono
parents: 12
diff changeset
136 BUFTYPE *buf = NULL; //???
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
137
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
138 fname_expand(buf, (char_u**)&name, (char_u**)&sfname);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
139 buf = buflist_findname((char_u*)name);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
140
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
141 free_wrp(name);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
142 return buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
143 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
144
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
145 static void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
146 open_buffer_memline_wrp(buf)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
147 BUFTYPE *buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
148 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
149 BUFTYPE *oldbuf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
150 oldbuf = curbuf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
151 curbuf = buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
152 open_buffer(FALSE, NULL);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
153 curbuf = oldbuf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
154 return;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
155 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
156
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
157
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
158 /* 現在編集中のバッファへのポインタを取得 */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
159 extern BUFTYPE *curbuf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
160 static BUFTYPE *
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
161 get_curbuf_wrp()
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
162 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
163 return curbuf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
164 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
165
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
166 /* buf を編集対象にする。
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
167 *それまで編集対象だったバッファへのポインタを返す */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
168 static BUFTYPE *
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
169 set_curbuf_wrp(buf)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
170 BUFTYPE *buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
171 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
172 BUFTYPE *cb;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
173 if (buf == NULL)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
174 return NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
175
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
176 cb = get_curbuf_wrp();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
177 set_curbuf(buf,DOBUF_GOTO);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
178
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
179 return cb;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
180 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
181
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
182 /* 指定した行番号の行のテキスト(文字列)のポインタを取得 */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
183 static char *
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
184 get_memline_wrp(buf, lnum)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
185 BUFTYPE *buf; // buf is curbuf
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
186 long lnum;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
187 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
188 return (char*)ml_get_buf(buf, lnum, FALSE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
189 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
190
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
191 /* 編集中のバッファの行の挿入 */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
192 static int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
193 append_memline_wrp(lnum, text)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
194 long lnum;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
195 char *text;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
196 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
197 int r;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
198 int permit;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
199 rep_T *rep;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
200 rep = get_rep();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
201 permit = rep->permit;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
202 rep->permit = FALSE;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
203
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
204 r = ml_append(lnum, (char_u*)text, strlen(text)+1, FALSE);
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
205 appended_lines_mark(lnum,1);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
206
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
207 rep->permit = permit;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
208 return r;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
209 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
210
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
211 /* 編集中のバッファの行数を返す */
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
212 long
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
213 get_bufmaxline_wrp(buf)
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
214 BUFTYPE *buf;
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
215 {
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
216 return buf->b_ml.ml_line_count;
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
217 }
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
218
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
219 /* 編集中のバッファの行の削除 */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
220 static int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
221 delete_memline_wrp(lnum)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
222 long lnum;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
223 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
224 int r;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
225 int permit;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
226 rep_T *rep;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
227 rep = get_rep();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
228 permit = rep->permit;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
229 rep->permit = FALSE;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
230
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
231 int maxline = get_bufmaxline_wrp(get_curbuf_wrp());
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
232 if (lnum+1>maxline) return 0;
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
233 r = ml_delete(lnum+1, FALSE);
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
234 deleted_lines_mark(lnum+1,1);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
235
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
236 rep->permit = permit;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
237 return r;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
238 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
239
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
240 /* バッファの編集後の後処理 */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
241 static void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
242 update_screen_now_wrp()
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
243 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
244 check_cursor();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
245 update_screen(CLEAR);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
246 return;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
247 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
248
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
249
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
250 /* get full path of buffer */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
251 static char *
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
252 get_fullpath_wrp(buf)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
253 BUFTYPE *buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
254 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
255 return (char*)buf->b_ffname;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
256 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
257
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
258
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
259 /* Wrapper END */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
260
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
261
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
262 static void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
263 puts_sys_err()
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
264 {
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
265 char *err = strerror(errno);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
266 char *errmsg = (char*)alloca(strlen(err)+50);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
267
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
268 sprintf(errmsg, "rep>> %d:%s", errno, err);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
269 e_msg_wrp(errmsg);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
270 return;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
271 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
272
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
273
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
274 static rep_T*
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
275 get_rep()
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
276 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
277 return(&g_rep);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
278 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
279
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
280 int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
281 rep_permit()
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
282 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
283 return(g_rep.permit);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
284 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
285
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
286 int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
287 rep_session_permit()
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
288 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
289 return(g_rep.permit && g_rep.cursession && g_rep.cursession->permit);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
290 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
291
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
292 void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
293 rep_start_create_cmds()
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
294 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
295 if (g_rep.cursession) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
296 g_rep.cursession->permit = TRUE;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
297 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
298 return;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
299 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
300
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
301 void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
302 rep_stop_create_cmds()
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
303 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
304 if (g_rep.cursession) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
305 g_rep.cursession->permit = FALSE;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
306 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
307 return;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
308 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
309
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
310
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
311 int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
312 rep_init()
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
313 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
314 /*
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
315 * g_rep is global variable and it is zero cleared.
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
316 */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
317
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
318 char def_hostname[] = "localhost";
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
319
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
320 // 現在編集対象のバッファはセッションに加える?
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
321 g_rep.shead = NULL;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
322
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
323 g_rep.cursession = NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
324 g_rep.servername = NULL;
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
325 g_rep.waiting_session = NULL;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
326
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
327 g_rep.smfd = -1;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
328
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
329 g_rep.eid = 0;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
330 g_rep.seqno = 0;
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
331 g_rep.prevSeq = 0;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
332 g_rep.syncMode = 0;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
333
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
334 g_rep.permit = FALSE;
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
335
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
336 #ifndef HOST_NAME_MAX
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
337 #define HOST_NAME_MAX 255
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
338 #endif
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
339 g_rep.hostname = (char *)malloc(HOST_NAME_MAX);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
340 if (gethostname(g_rep.hostname, sizeof(g_rep.hostname)) < 0) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
341 strncpy(g_rep.hostname, def_hostname, sizeof(def_hostname)+1);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
342 }
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
343 g_rep.nop = make_cmd(REPCMD_NOP, 0, 0, 0, 0, 0, "");
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
344
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
345 return TRUE;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
346 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
347
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
348
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
349 static char default_host[] = "localhost";
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
350
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
351 static int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
352 rep_connect(host)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
353 char *host; /* "hostname:portnumber" */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
354 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
355 int sock;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
356 struct hostent *hp;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
357 struct sockaddr_in sin;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
358 char *tmp;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
359 int port;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
360
14
1e44fe6dcfaa *** empty log message ***
kono
parents: 12
diff changeset
361 if (host == NULL || *host == '\n') {
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
362 host = default_host;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
363 port = REP_PORT;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
364 } else {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
365 if ((tmp = strchr(host, ':')) == NULL ) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
366 return(-1);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
367 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
368 *tmp = '\0';
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
369 tmp++;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
370 port = atol(tmp);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
371 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
372
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
373 if ((hp = gethostbyname(host)) == NULL) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
374 e_msg_wrp("rep_open: gethostbyname: ERROR");
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
375 return(-1);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
376 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
377
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
378 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
379 e_msg_wrp("rep_open: socket : ERROR");
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
380 return(-1);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
381 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
382
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
383 bzero(&sin, sizeof(sin));
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
384 sin.sin_family = AF_INET;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
385 sin.sin_port = htons(port);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
386 bcopy(hp->h_addr, &sin.sin_addr, hp->h_length);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
387
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
388 if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
389 e_msg_wrp("rep_open: connect: ERROR");
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
390 return(-1);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
391 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
392
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
393 return(sock);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
394 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
395
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
396
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
397 static BUFTYPE *
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
398 get_buf_by_name(name)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
399 char *name;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
400 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
401 BUFTYPE *buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
402 if ((buf = find_buf_by_name_wrp(name)) == NULL) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
403 buf = make_new_buf_wrp(name);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
404 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
405
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
406 if (buf && (buf->b_ml.ml_mfp == NULL)) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
407 open_buffer_memline_wrp(buf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
408 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
409
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
410 return buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
411 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
412
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
413
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
414 /* About Session */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
415
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
416 static Session *
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
417 init_session(sn)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
418 Session *sn;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
419 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
420 sn->next = NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
421 sn->buf = NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
422 sn->sname = NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
423 sn->new_cmdlist.head = NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
424 sn->new_cmdlist.num = 0;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
425 sn->sent_cmdlist.head = NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
426 sn->sent_cmdlist.num = 0;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
427 sn->sid = 0;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
428 sn->permit = FALSE;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
429 sn->prevline = -1;
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
430 sn->del_cmd = 0;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
431
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
432 return sn;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
433 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
434
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
435 /*
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
436 * Make a new session.
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
437 * if buf is NULL, buffer is found or made new one.
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
438 */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
439 static Session *
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
440 make_session(name, buf)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
441 char *name;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
442 BUFTYPE *buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
443 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
444 Session *s;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
445
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
446 char *sname;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
447 int namelen = strlen(name)+1;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
448
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
449 s = (Session*)malloc(sizeof(Session));
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
450 if (s == NULL) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
451 return(NULL);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
452 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
453
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
454 if ((sname = (char*)malloc(namelen)) == NULL) {
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
455 return NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
456 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
457 strncpy(sname,name,namelen);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
458
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
459 init_session(s);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
460
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
461 if (buf == NULL) buf = get_buf_by_name(sname);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
462 s->buf = buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
463
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
464 s->sname = sname;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
465
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
466 return s;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
467 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
468
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
469 static void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
470 free_session(sn)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
471 Session *sn;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
472 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
473
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
474 free_cmdlist(&sn->new_cmdlist);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
475 free_cmdlist(&sn->sent_cmdlist);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
476 free_buf_wrp(sn->buf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
477
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
478 if (sn->sname) rep_free(sn->sname);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
479
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
480 init_session(sn);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
481
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
482 rep_free(sn);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
483 return;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
484 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
485
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
486 static void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
487 free_session_list(head)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
488 Session *head;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
489 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
490 Session *next;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
491 for (; head; head=next) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
492 next = head->next;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
493 head->next = NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
494 free_session(head);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
495 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
496 return;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
497 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
498
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
499 static Session *
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
500 get_waiting_session(int sid, char *text) {
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
501 rep_T *rep = get_rep();
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
502 Session *session = rep->waiting_session;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
503 if (session==NULL) return session;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
504 rep->waiting_session = session->next;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
505 session->sid = sid;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
506 if (text!=0) {
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
507 // set session name to the buffer
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
508 update_screen_now_wrp();
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
509 }
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
510 return session;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
511 }
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
512
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
513 static Session*
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
514 set_cursession(sn)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
515 Session *sn;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
516 {
14
1e44fe6dcfaa *** empty log message ***
kono
parents: 12
diff changeset
517 BUFTYPE *oldbuf = NULL;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
518 Session *oldsn;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
519 rep_T *rep = get_rep();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
520
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
521 if (sn) oldbuf = set_curbuf_wrp(sn->buf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
522 rep->cursession = sn;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
523
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
524 oldsn = find_session_by_buf(oldbuf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
525 return oldsn;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
526 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
527
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
528 static Session*
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
529 find_session_by_id(id)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
530 unsigned int id;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
531 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
532 Session *cursn = NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
533 rep_T *rep = get_rep();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
534
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
535 for (cursn = rep->shead; cursn; cursn = cursn->next) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
536 if (cursn->sid == id) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
537 return cursn;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
538 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
539 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
540
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
541 return NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
542 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
543
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
544 static Session*
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
545 find_session_by_buf(buf)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
546 BUFTYPE *buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
547 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
548 Session *cursn = NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
549 rep_T *rep = get_rep();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
550
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
551 if (buf == NULL) return NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
552
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
553 for (cursn = rep->shead; cursn; cursn = cursn->next) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
554 if (cursn->buf == buf) break;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
555 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
556 return cursn;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
557 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
558
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
559 /*
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
560 static Session*
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
561 find_session_by_name(name)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
562 char *name;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
563 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
564 BUFTYPE *buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
565 buf = find_buf_by_name_wrp(name);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
566 return find_session_by_buf(buf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
567 }
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
568 */
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
569
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
570
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
571 static char*
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
572 get_fullpath(session)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
573 Session *session;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
574 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
575 BUFTYPE *buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
576 if (session == NULL) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
577 buf = get_curbuf_wrp();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
578 } else {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
579 buf = session->buf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
580 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
581 return get_fullpath_wrp(buf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
582 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
583
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
584 static Session *
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
585 append_session(Session *s1,Session *s2)
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
586 {
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
587 Session *s3=s1;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
588 if (s1==NULL) return s2;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
589 while(s1->next) s1 = s1->next;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
590 s1->next = s2;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
591 return s3;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
592 }
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
593
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
594 static void
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
595 set_waiting_session(Session *session)
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
596 {
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
597 rep_T *rep = get_rep();
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
598 rep->waiting_session = append_session(rep->waiting_session,session);
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
599 }
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
600
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
601 /* End Session */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
602
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
603 static int
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
604 rep_join_put(int cmd)
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
605 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
606 int sock;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
607 rep_T *rep;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
608
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
609 rep = get_rep();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
610 if ((sock = rep_connect(NULL)) < 0) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
611 return FALSE;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
612 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
613 if (rep->smfd > 0) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
614 close(rep->smfd);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
615 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
616
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
617 rep->smfd = sock;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
618 rep->permit = TRUE;
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
619
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
620 /* get current buffer name */
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
621 char *sname;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
622 if ((sname = get_fullpath(rep->cursession)) == NULL) {
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
623 sname =NO_NAME; /* the buffer has not name */
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
624 }
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
625 BUFTYPE *buf = get_curbuf_wrp();
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
626 Session *session = make_session(sname,buf);
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
627 set_waiting_session(session);
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
628
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
629
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
630 rep_cmd *command = make_cmd(cmd, 0, rep->eid, rep->seqno++, 0, 0, "");
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
631 forwardCommand(rep, command);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
632 free_cmd(command);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
633
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
634 return TRUE;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
635
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
636 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
637
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
638 int rep_join()
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
639 {
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
640 return rep_join_put(SMCMD_JOIN);
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
641 }
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
642
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
643 int
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
644 rep_put()
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
645 {
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
646 return rep_join_put(SMCMD_PUT);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
647 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
648
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
649 int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
650 rep_remove()
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
651 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
652 rep_T *rep = get_rep();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
653 rep_cmd *cmd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
654 Session *sn = rep->cursession;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
655
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
656 if (rep->smfd < 0) { /* session does not exist */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
657 EMSG("Session does not exist.");
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
658 return FALSE;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
659 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
660
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
661 cmd = make_cmd(REPCMD_CLOSE, sn->sid, rep->eid, rep->seqno, 0, 0, "");
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
662 forwardCommand(rep,cmd);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
663 free_cmd(cmd);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
664
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
665 return TRUE;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
666 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
667
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
668
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
669
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
670 /* Session End */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
671
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
672 static void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
673 rep_free(obj)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
674 void *obj;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
675 {
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
676 if (obj) vim_free(obj);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
677 return;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
678 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
679
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
680
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
681 static int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
682 writen(sock, pkt, len)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
683 int sock;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
684 char *pkt;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
685 unsigned int len;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
686 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
687 int offset;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
688 int written;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
689
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
690 if (len == 0) return 0;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
691
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
692 for (offset=0, written=0; offset<len; offset += written) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
693 if ((written = write(sock, pkt + offset, len - offset)) < 0) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
694 puts_sys_err();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
695 return written;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
696 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
697 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
698 return offset;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
699 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
700
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
701 static int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
702 readn(sock, pkt, len)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
703 int sock;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
704 char *pkt;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
705 unsigned int len;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
706 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
707 unsigned int r;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
708 unsigned int offset;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
709
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
710 if (len == 0) return 0;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
711
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
712 for (offset=0, r=0; offset<len; offset += r) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
713 if ((r = read(sock, pkt + offset, len - offset)) < 0) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
714 puts_sys_err();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
715 return r;
29
ef6d2a18d7c2 *** empty log message ***
kono
parents: 28
diff changeset
716 } else if (r==0) return 0;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
717 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
718 return offset;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
719 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
720
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
721
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
722 static void
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
723 make_packet(command, cmd, sid, eid, seq, lnum, len, text)
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
724 rep_cmd *command;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
725 unsigned int cmd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
726 unsigned int sid;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
727 unsigned int eid;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
728 unsigned int seq;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
729 unsigned int lnum;
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
730 unsigned int len;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
731 char * text;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
732 {
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
733 char *packet = &command->pkt[0];
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
734 set_header(cmd, packet, REP_CMD_OFFSET);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
735 set_header(sid, packet, REP_SID_OFFSET);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
736 set_header(eid, packet, REP_EID_OFFSET);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
737 set_header(seq, packet, REP_SEQNUM_OFFSET);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
738 set_header(lnum, packet, REP_LNUM_OFFSET);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
739 set_header(len, packet, REP_T_SIZE_OFFSET);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
740
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
741 if (text && len>0) {
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
742 memcpy(packet+REP_TEXT_OFFSET, text, len);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
743 }
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
744 return;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
745 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
746
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
747
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
748 static rep_cmd*
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
749 make_cmd(cmd, sid, eid, seq, lnum, length, text)
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
750 unsigned int cmd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
751 unsigned int sid;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
752 unsigned int eid;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
753 unsigned int seq;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
754 unsigned int lnum;
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
755 unsigned int length;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
756 char *text;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
757 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
758 rep_cmd *cmd_p;
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
759 cmd_p = (rep_cmd*)malloc(sizeof(rep_cmd)+REP_HEADER_SIZE+length);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
760 if (cmd_p == NULL) return(NULL);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
761 cmd_p->next = NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
762 cmd_p->cmd = cmd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
763 cmd_p->sid = sid;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
764 cmd_p->eid = eid;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
765 cmd_p->seq = seq;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
766 cmd_p->len = length;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
767 cmd_p->lnum = lnum;
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
768 make_packet(cmd_p, cmd, sid, eid, seq, lnum, length, text);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
769 return(cmd_p);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
770 }
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
771
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
772 static void
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
773 set_cmd_seq(cmd_p,cmd,seq)
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
774 rep_cmd *cmd_p;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
775 unsigned int cmd;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
776 unsigned int seq;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
777 {
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
778 char *packet = &cmd_p->pkt[0];
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
779 cmd_p->seq = seq;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
780 cmd_p->cmd = cmd;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
781 set_header(cmd, packet, REP_CMD_OFFSET);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
782 set_header(seq, packet, REP_SEQNUM_OFFSET);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
783 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
784
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
785 static int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
786 free_cmd(cmd)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
787 rep_cmd *cmd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
788 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
789 if (cmd == NULL) return(FALSE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
790 rep_free(cmd);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
791 return(TRUE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
792 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
793
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
794 static int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
795 free_cmdlist(cmdlist)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
796 rep_cmdlist *cmdlist;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
797 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
798 rep_cmd *cur;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
799 rep_cmd *next;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
800
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
801 if (cmdlist->head==NULL) return(FALSE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
802 for (cur=cmdlist->head; cur; cur=next) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
803 next=cur->next;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
804 free_cmd(cur);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
805 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
806 cmdlist->head = NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
807 cmdlist->num = 0;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
808 return(TRUE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
809 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
810
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
811 static void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
812 add_cmd_to_list(cmdlist, cmd)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
813 rep_cmdlist *cmdlist;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
814 rep_cmd *cmd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
815 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
816 rep_cmd *p;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
817 int count = 0;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
818
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
819 for (p=cmd; p; p=p->next) count++;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
820
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
821 if (cmdlist->head) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
822 for (p = cmdlist->head; p->next; p = p->next);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
823 p->next = cmd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
824 } else {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
825 cmdlist->head = cmd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
826 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
827 cmdlist->num += count;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
828 return;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
829 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
830
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
831
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
832 /*
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
833 Before any line changes, keep the lines as DELETE_LINE_CMD.
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
834
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
835 xtr==0 ml_replace
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
836 xtr==1 ml_append
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
837 xtr==-1 ml_delete
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
838 */
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
839 void
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
840 rep_prevline_flush(int lnum, int xtr)
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
841 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
842 BUFTYPE *cbuf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
843 Session *cursn;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
844 rep_cmd *cmd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
845 rep_T *rep = get_rep();
15
8634ceb0aeef add copy_and_get_memline
shinobu
parents: 14
diff changeset
846
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
847 cursn = rep->cursession;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
848
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
849 if (cursn == NULL)
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
850 return;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
851
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
852 // バッファが変更された場合には rep->cursession も合わす
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
853 if ((cbuf = get_curbuf_wrp()) != cursn->buf) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
854 cursn = find_session_by_buf(cbuf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
855 if (cursn == NULL)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
856 return;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
857 rep->cursession = cursn;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
858 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
859
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
860 if(cursn->prevline!=lnum&&xtr!=0) {
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
861 if (cursn->del_cmd) {
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
862 // Cancel delete cmd
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
863 rep_free(cursn->del_cmd);
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
864 cursn->del_cmd = 0;
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
865 }
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
866 }
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
867 cursn->prevline=lnum;
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
868 if (xtr<0) {
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
869 // ml_delete case
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
870 char *text = get_memline_wrp(cursn->buf, lnum);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
871 unsigned int length = strlen(text);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
872 cmd = make_cmd(REPCMD_DELETE, cursn->sid, rep->eid, rep->seqno++,
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
873 cursn->prevline-1, length, text);
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
874 rep_send_cmd(rep->smfd,cmd);
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
875 rep_free(cmd);
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
876 if (cursn->del_cmd) {
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
877 // Cancel delete cmd
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
878 rep_free(cursn->del_cmd);
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
879 cursn->del_cmd = 0;
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
880 }
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
881 } else if (xtr==0) {
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
882 // ml_replace case
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
883 if (cursn->del_cmd)
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
884 return; // already line saved do nothing
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
885 char *text = get_memline_wrp(cursn->buf, lnum);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
886 unsigned int length = strlen(text);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
887 cursn->del_cmd = make_cmd(REPCMD_DELETE, cursn->sid, rep->eid,
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
888 rep->seqno++, cursn->prevline-1, length, text);
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
889
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
890 } else {
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
891 // ml_append case
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
892 // do nothing
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
893 }
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
894 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
895
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
896 /*
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
897 * channged_common から呼ばれて、変更をREP commandに直して
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
898 * 送信する。
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
899 */
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
900 void
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
901 rep_register(lnum, lnume, xtra)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
902 unsigned int lnum;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
903 unsigned int lnume;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
904 int xtra;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
905 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
906 int i;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
907 BUFTYPE *cbuf;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
908 Session *cursn;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
909 rep_cmd *cmd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
910 rep_T *rep = get_rep();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
911
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
912 if ((cursn = rep->cursession) == NULL) return ;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
913
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
914 // バッファが変更された場合には rep->cursession も合わす
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
915 if ((cbuf = get_curbuf_wrp()) != cursn->buf) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
916 cursn = find_session_by_buf(cbuf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
917 if (cursn == NULL)
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
918 return ;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
919 rep->cursession = cursn;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
920 }
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
921 if (xtra<0) {
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
922 // delete case, the command was sent, do nothing
24
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
923 cursn->prevline=-1;
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
924 } else if (xtra>0) {
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
925 // append case
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
926
29
ef6d2a18d7c2 *** empty log message ***
kono
parents: 28
diff changeset
927 for(i=lnum;i<lnum+xtra;i++) {
ef6d2a18d7c2 *** empty log message ***
kono
parents: 28
diff changeset
928 char *text = get_memline_wrp(cursn->buf, i);
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
929 unsigned int length = strlen(text);
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
930 // make INSERT_CMD for insert or changed lines if any
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
931 cmd = make_cmd(REPCMD_INSERT, cursn->sid, rep->eid, rep->seqno++,
29
ef6d2a18d7c2 *** empty log message ***
kono
parents: 28
diff changeset
932 i-1, length, text);
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
933 rep_send_cmd(rep->smfd,cmd);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
934 free_cmd(cmd);
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
935 }
24
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
936 cursn->prevline=-1;
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
937 } else if (xtra==0) {
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
938 // replace case
15
8634ceb0aeef add copy_and_get_memline
shinobu
parents: 14
diff changeset
939
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
940 // send saved DELETE command
20
5896e8fc8c7f *** empty log message ***
kono
parents: 19
diff changeset
941 if (cursn->del_cmd!=0) {
5896e8fc8c7f *** empty log message ***
kono
parents: 19
diff changeset
942 cmd = cursn->del_cmd;
5896e8fc8c7f *** empty log message ***
kono
parents: 19
diff changeset
943 rep_send_cmd(rep->smfd,cmd);
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
944 rep_free(cmd); cmd=0;
20
5896e8fc8c7f *** empty log message ***
kono
parents: 19
diff changeset
945 cursn->del_cmd = 0;
5896e8fc8c7f *** empty log message ***
kono
parents: 19
diff changeset
946 } else {
5896e8fc8c7f *** empty log message ***
kono
parents: 19
diff changeset
947 // first insert case?
5896e8fc8c7f *** empty log message ***
kono
parents: 19
diff changeset
948 }
24
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
949 cursn->prevline = lnum;
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
950
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
951 // send saved new line as INSERT command
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
952 char *text = get_memline_wrp(cursn->buf, lnum);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
953 unsigned int length = strlen(text);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
954 cmd = make_cmd(REPCMD_INSERT, cursn->sid, rep->eid, rep->seqno++,
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
955 cursn->prevline-1, length,text);
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
956 rep_send_cmd(rep->smfd,cmd);
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
957 // reuse cmd
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
958 // save current line for next replace
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
959 set_cmd_seq(cmd,REPCMD_DELETE,rep->seqno++);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
960 cursn->del_cmd = cmd;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
961 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
962
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
963 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
964
31
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
965 static int
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
966 rep_sync()
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
967 {
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
968 Session *cursn;
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
969 rep_T *rep = get_rep();
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
970 if ((cursn = rep->cursession) == NULL) return 0;
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
971 if (rep->syncMode!=0) {
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
972 char *text = get_memline_wrp(cursn->buf, rep->syncMode);
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
973 unsigned int length = strlen(text);
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
974 rep_cmd *cmd = make_cmd(REPCMD_DELETE, cursn->sid, rep->eid,
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
975 rep->seqno++,
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
976 rep->syncMode, length,text);
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
977 rep_send_cmd(rep->smfd,cmd);
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
978 // reuse cmd
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
979 // save current line for next replace
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
980 set_cmd_seq(cmd,REPCMD_INSERT,rep->seqno++);
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
981 rep_send_cmd(rep->smfd,cmd);
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
982 free_cmd(cmd);
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
983 if (rep->syncMode < get_bufmaxline_wrp(cursn->buf)) {
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
984 rep->syncMode++;
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
985 } else {
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
986 rep->syncMode=0;
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
987 }
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
988 return 1;
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
989 }
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
990 return 0;
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
991 }
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
992
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
993 static int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
994 set_header(data, pkt, offset)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
995 unsigned int data;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
996 char *pkt;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
997 int offset;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
998 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
999 int *ipkt;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1000 int ndata = htonl(data);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1001
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1002 ipkt = (int*)pkt;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1003 ipkt[offset/4] = ndata;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1004
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1005 return(TRUE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1006 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1007
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1008 static unsigned int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1009 get_header(pkt, offset)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1010 char *pkt;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1011 int offset;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1012 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1013 int *ipkt;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1014 int data;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1015 unsigned int header;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1016
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1017 ipkt = (int *)pkt;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1018 data = ipkt[offset/4];
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1019 header = (unsigned int)ntohl(data);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1020
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1021 return(header);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1022 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1023
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1024 /*
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1025 REP command packet flow
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1026
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1027 Own change
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1028
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1029 CMD ------> session manager
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1030 session manager <--- CMD command return
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1031 <------ MERGE_START (block user input)
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1032 <------ Merge fix from session manager
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1033 CMD ------> session manager return same command as ack
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1034 <------ MERGE_END command return
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1035 (enable user input)
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1036
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1037 session manager <--- CMD incomming external command
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1038 NOP ------> session manager if we have sent any command
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1039 CMD ------> session manager return same command as ack
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1040
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1041 */
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1042
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1043 static void
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1044 forwardCommand(rep_T *rep, rep_cmd *command)
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1045 {
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1046 int fd = rep->smfd;
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1047 writen(fd,command->pkt,command->len+REP_HEADER_SIZE);
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1048 }
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1049
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1050 static void
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1051 incrementSeq(rep_T *rep)
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1052 {
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1053 rep->seqno++;
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1054 }
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1055
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1056 static void
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
1057 addNop(int sid, rep_T *rep)
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1058 {
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1059 int fd = rep->smfd;
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
1060 char *packet = &rep->nop->pkt[0];
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1061
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1062 if (rep->prevSeq==rep->seqno) {
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
1063 set_header(sid, packet, REP_SID_OFFSET);
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1064 set_header(rep->eid, packet, REP_EID_OFFSET);
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1065 set_header(rep->seqno, packet, REP_SEQNUM_OFFSET);
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1066 rep->prevSeq = rep->seqno;
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1067 incrementSeq(rep);
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1068 writen(fd,rep->nop->pkt,rep->nop->len+REP_HEADER_SIZE);
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1069 }
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1070 }
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1071
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1072 static int
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1073 rep_exe_cmd(command)
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1074 rep_cmd *command;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1075 {
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1076 char *text = command->pkt+REP_TEXT_OFFSET;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1077 int eid = command->eid;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1078 rep_T *rep = get_rep();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1079 Session *session;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1080
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1081 session = find_session_by_id(command->sid);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1082
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1083 switch (command->cmd) {
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1084 case SMCMD_JOIN_ACK:
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1085 {
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1086 session = get_waiting_session(command->sid,text);
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1087 set_cursession(session);
15
8634ceb0aeef add copy_and_get_memline
shinobu
parents: 14
diff changeset
1088 rep_start_create_cmds();
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1089 rep->eid = command->eid;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1090
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1091 char *msg = alloca(150);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1092 sprintf(msg,"joined eid=%d sid=%d",rep->eid,session->sid);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1093 e_msg_wrp(msg);
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
1094
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
1095 rep->prevSeq = rep->seqno;
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1096 }
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1097
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1098 break;
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1099
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1100 case SMCMD_PUT_ACK:
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1101 {
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1102 /* Enter Session */
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1103 session = get_waiting_session(command->sid,text);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1104 /* set session to cursession */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1105 set_cursession(session);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1106 rep_start_create_cmds();
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1107 rep->eid = command->eid;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1108
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1109 char *msg = alloca(150);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1110 sprintf(msg,"put eid=%d sid=%d",rep->eid,session->sid);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1111 e_msg_wrp(msg);
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
1112
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
1113 rep->prevSeq = rep->seqno;
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1114 }
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1115
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1116 break;
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1117 case REPCMD_INSERT:
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1118 append_memline_wrp(command->lnum, text);
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
1119 if (eid!=MERGE_EID) addNop(command->sid, rep);
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1120 forwardCommand(rep,command);
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1121 if (eid!=MERGE_EID) update_screen_now_wrp();
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1122 break;
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1123 case REPCMD_DELETE:
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1124 delete_memline_wrp(command->lnum);
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1125 if (eid!=MERGE_EID) update_screen_now_wrp();
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1126 case REPCMD_NOP:
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
1127 if (eid!=MERGE_EID) addNop(command->sid, rep);
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1128 forwardCommand(rep,command);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1129 break;
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1130 case SMCMD_SYNC:
34
e170173ecb68 before ack base protocol.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
1131 // rep->syncMode = 1;
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1132 set_cmd_seq(command,SMCMD_SYNC_ACK,rep->seqno++);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1133 forwardCommand(rep,command);
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1134 break;
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1135 case SMCMD_QUIT:
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1136 forwardCommand(rep,command);
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1137 break;
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1138 case SMCMD_START_MERGE:
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
1139 lock_editor = 1;
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
1140 set_cmd_seq(command,SMCMD_START_MERGE_ACK,rep->seqno++);
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
1141 forwardCommand(rep,command);
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1142 break;
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1143 case SMCMD_END_MERGE:
28
24808249e776 *** empty log message ***
kono
parents: 27
diff changeset
1144 lock_editor = 0;
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1145 rep->prevSeq = rep->seqno;
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1146 update_screen_now_wrp();
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1147 default:
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1148 break;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1149 }
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1150 free_cmd(command);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1151 return(TRUE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1152 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1153
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1154
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1155 /* execute command list based cmd packet */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1156 static int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1157 rep_exe_pktlist(cmdlist)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1158 rep_cmdlist *cmdlist;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1159 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1160 rep_cmd *repcmd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1161
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1162 if ((cmdlist == NULL) || (cmdlist->head == NULL)) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1163 return(FALSE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1164 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1165
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1166 for (repcmd = cmdlist->head; repcmd; repcmd = repcmd->next) {
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1167 rep_exe_cmd(repcmd);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1168 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1169
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1170 return(TRUE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1171 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1172
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1173
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1174
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1175 static int
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1176 rep_recv_cmds(fd, txtcmdlist)
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1177 int fd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1178 rep_cmdlist *txtcmdlist;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1179 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1180 unsigned int cmd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1181 unsigned int sid;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1182 unsigned int eid;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1183 unsigned int seq;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1184 unsigned int lnum;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1185 unsigned int textsize;
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1186 rep_cmd *cmd_p ;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1187 char *text;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1188 char *header;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1189
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1190 if (fd < 0) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1191 return(FALSE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1192 }
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1193 if ((cmd_p = (rep_cmd *)malloc(sizeof(rep_cmd)+128)) == NULL)
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1194 return FALSE;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1195
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1196 text = &cmd_p->pkt[REP_TEXT_OFFSET];
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1197 header = &cmd_p->pkt[0];
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1198
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1199 /* read header part */
29
ef6d2a18d7c2 *** empty log message ***
kono
parents: 28
diff changeset
1200 if (readn(fd, header, REP_HEADER_SIZE) <= 0) {
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1201 puts_sys_err();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1202 return(FALSE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1203 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1204
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1205 cmd = get_header(header, REP_CMD_OFFSET);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1206 sid = get_header(header, REP_SID_OFFSET);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1207 eid = get_header(header, REP_EID_OFFSET);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1208 seq = get_header(header, REP_SEQNUM_OFFSET);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1209 lnum = get_header(header, REP_LNUM_OFFSET);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1210 textsize = get_header(header, REP_T_SIZE_OFFSET);
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1211 if ((cmd_p = (rep_cmd *)realloc(cmd_p,sizeof(rep_cmd)+textsize)) == NULL)
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1212 return FALSE;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1213
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1214 if (textsize > 0) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1215 /* read text part */
29
ef6d2a18d7c2 *** empty log message ***
kono
parents: 28
diff changeset
1216 if (readn(fd, text, textsize) <= 0) {
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1217 puts_sys_err();
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1218 rep_free(cmd_p);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1219 return(FALSE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1220 }
21
cc45fc3d7c4a *** empty log message ***
kono
parents: 20
diff changeset
1221 text[textsize] = 0;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1222 }
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1223 cmd_p->next = NULL;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1224 cmd_p->cmd = cmd;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1225 cmd_p->sid = sid;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1226 cmd_p->eid = eid;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1227 cmd_p->seq = seq;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1228 cmd_p->len = textsize;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1229 cmd_p->lnum = lnum;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1230
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1231 add_cmd_to_list(txtcmdlist, cmd_p);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1232 return(TRUE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1233 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1234
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1235 void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1236 rep_send_cur_cmdlist()
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1237 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1238 rep_T *rep_p = get_rep();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1239
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1240 rep_send_cmds(rep_p->smfd,&(rep_p->cursession->new_cmdlist));
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1241
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1242 free_cmdlist(&rep_p->cursession->sent_cmdlist);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1243
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1244 rep_p->cursession->sent_cmdlist.head = rep_p->cursession->new_cmdlist.head;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1245 rep_p->cursession->sent_cmdlist.num = rep_p->cursession->new_cmdlist.num;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1246
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1247 rep_p->cursession->new_cmdlist.head = NULL;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1248 rep_p->cursession->new_cmdlist.num = 0;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1249
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1250 return;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1251 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1252
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1253 static int
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
1254 rep_send_cmd(fd,cur)
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
1255 int fd;
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
1256 rep_cmd *cur;
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
1257 {
20
5896e8fc8c7f *** empty log message ***
kono
parents: 19
diff changeset
1258 return writen(fd,cur->pkt,cur->len+REP_HEADER_SIZE );
19
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
1259 }
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
1260
03814a8d0b2a *** empty log message ***
kono
parents: 17
diff changeset
1261 static int
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1262 rep_send_cmds(fd,cmdlist)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1263 int fd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1264 rep_cmdlist *cmdlist;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1265 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1266 rep_cmd *cur;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1267
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1268 if ((fd<0) || (cmdlist == NULL)) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1269 return(FALSE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1270 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1271
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1272 if ((cmdlist->head == NULL) || (cmdlist->num == 0)) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1273 return(TRUE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1274 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1275
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1276 for (cur = cmdlist->head; cur; cur = cur->next) {
20
5896e8fc8c7f *** empty log message ***
kono
parents: 19
diff changeset
1277 if (writen(fd,cur->pkt,cur->len+REP_HEADER_SIZE)==FALSE) {
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1278 return(FALSE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1279 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1280 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1281 return(TRUE);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1282 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1283
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1284 int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1285 rep_fd_check(fd, rfds_p, efds_p)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1286 int fd; // input from keyboard or something...
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1287 fd_set *rfds_p; // readable fds
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1288 fd_set *efds_p; // include a error fd
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1289 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1290 rep_T *rep_p;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1291 rep_cmdlist txtcmdlist = {NULL,0};
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1292
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1293 rep_p = get_rep();
31
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
1294 rep_sync();
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1295 if ((rep_p->smfd > 0) && (FD_ISSET(rep_p->smfd, rfds_p))) {
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1296 if (rep_recv_cmds(rep_p->smfd, &(txtcmdlist)) == FALSE) {
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1297 close(rep_p->smfd);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1298 rep_p->smfd = -1;
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1299 } else {
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1300 rep_exe_pktlist(&txtcmdlist);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1301 }
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1302 }
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1303
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1304 if (FD_ISSET(fd, rfds_p) || FD_ISSET(fd, efds_p)) {
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1305 return(TRUE);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1306 }
25
2d27043cb96b First connection to REP session manager.
kono
parents: 24
diff changeset
1307 return FALSE;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1308 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1309
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1310
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1311
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1312 int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1313 rep_fd_set(rfds_p, efds_p, max_fds)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1314 fd_set *rfds_p;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1315 fd_set *efds_p;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1316 int max_fds;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1317 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1318 rep_T *rep_p;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1319
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1320 rep_p = get_rep();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1321
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1322 if (rep_p->smfd > 0) {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1323 FD_SET(rep_p->smfd,rfds_p);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1324 FD_SET(rep_p->smfd,efds_p);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1325 if(max_fds < rep_p->smfd){
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1326 max_fds = rep_p->smfd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1327 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1328 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1329
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1330 return(max_fds);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1331 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1332
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1333 void
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1334 rep_close(int i)
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1335 {
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1336 rep_T *rep_p;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1337
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1338 rep_p = get_rep();
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1339 // What should I do?
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1340 rep_end();
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1341
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1342 }
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1343
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1344 /*
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1345 * read などで待つ場合に、この関数で REP 関連のデータをチェックする
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1346 * 指定した fd ( read で読みこむ) から入力があるとぬける。
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1347 */
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1348 int
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1349 rep_select(fd)
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1350 int fd;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1351 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1352 fd_set rfds_p;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1353 fd_set efds_p;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1354 int sk;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1355 int max_fds = MAX_FDS;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1356
23
75fedd8da66f *** empty log message ***
kono
parents: 22
diff changeset
1357 struct timeval zerotime;
75fedd8da66f *** empty log message ***
kono
parents: 22
diff changeset
1358 zerotime.tv_sec = 0;
75fedd8da66f *** empty log message ***
kono
parents: 22
diff changeset
1359 zerotime.tv_usec = 0;
31
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
1360 struct timeval *timeout;
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1361
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1362 if (fd < 0) return FALSE;
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1363
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1364 for(;;) {
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1365 /* select の中で modify されてるので、初期化 */
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1366 // struct timeval tv;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1367 // tv.tv_sec = 0;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1368 // tv.tv_usec = 100000;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1369 FD_ZERO(&rfds_p);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1370 FD_ZERO(&efds_p);
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1371
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1372 FD_SET(fd,&rfds_p);
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1373
31
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
1374 if (rep_sync()) {
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
1375 timeout = &zerotime;
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
1376 } else {
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
1377 timeout = 0;
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
1378 }
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1379 max_fds = rep_fd_set(&rfds_p, &efds_p, max_fds);
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1380
31
8d4ffb7c9f4e *** empty log message ***
kono
parents: 29
diff changeset
1381 if ((sk = select(max_fds+1, &rfds_p, NULL, &efds_p, timeout)) < 0) {
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1382 if (errno == EBADF){
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1383 int i;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1384 for(i = 0;i < max_fds;i++){
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1385 fd_set suspect;
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1386 FD_ZERO(&suspect);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1387 if (FD_ISSET(i, &rfds_p)){
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1388 FD_SET(i, &suspect);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1389 if (select(max_fds, &suspect, NULL, NULL, &zerotime) == FAIL){
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1390 FD_CLR(i, &rfds_p);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1391 rep_close(i);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1392 // we have to something to prevent to write to this
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1393 // port...
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1394 return(TRUE);
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1395 }
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1396 FD_CLR(i, &suspect);
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1397 }
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1398 }
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1399 } else {
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1400 e_msg_wrp("rep_select(): ERROR");
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1401 return(FALSE);
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1402 }
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1403
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1404 }
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1405 if ( rep_fd_check(fd, &rfds_p, &efds_p))
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1406 return TRUE; // fd に入力があったので抜ける
26
7101f8c1fa21 *** empty log message ***
kono
parents: 25
diff changeset
1407 }
8
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1408 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1409
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1410 void
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1411 rep_end()
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1412 {
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1413 rep_T *rep_p;
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1414 rep_p = get_rep();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1415
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1416 if (rep_p->shead) free_session_list(rep_p->shead); // cursession is freed
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1417 if (rep_p->servername) free_wrp(rep_p->servername);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1418 if (rep_p->smfd > 0) close(rep_p->smfd);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1419
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1420 set_curbuf_wrp(rep_p->scratch_buf);
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1421
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1422 rep_init();
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1423 }
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1424
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1425
f21b6f345e69 *** empty log message ***
axmo
parents:
diff changeset
1426
24
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1427 extern void
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1428 pcmd(cmd_p)
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1429 rep_cmd *cmd_p;
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1430 {
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1431 int i;
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1432 fprintf(stderr,"cmd=%04x",cmd_p->cmd );
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1433 fprintf(stderr,"sid=%08x", cmd_p->sid);
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1434 fprintf(stderr,"eid=%08x", cmd_p->eid);
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1435 fprintf(stderr,"seq=%08x", cmd_p->seq);
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1436 fprintf(stderr,"lineno=%08x", cmd_p->lnum);
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1437 fprintf(stderr,"sz=%08x", cmd_p->len);
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1438
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1439 fprintf(stderr,"\n");
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1440 for(i=0;i<cmd_p->len+REP_HEADER_SIZE;i++) {
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1441 fprintf(stderr,"%02x ", cmd_p->pkt[i]);
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1442 }
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1443 fprintf(stderr,"\n");
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1444 }
e7d30a296a9b *** empty log message ***
kono
parents: 23
diff changeset
1445
27
a01d8d9b2a58 first working version.
kono
parents: 26
diff changeset
1446 /* end */