Mercurial > freewnn
comparison Wnn/jserver/dispatch.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:bbc77ca4def5 |
---|---|
1 /* | |
2 * $Id: dispatch.c,v 1.11 2002/05/12 22:51:16 hiroo Exp $ | |
3 */ | |
4 | |
5 /* | |
6 * FreeWnn is a network-extensible Kana-to-Kanji conversion system. | |
7 * This file is part of FreeWnn. | |
8 * | |
9 * Copyright Kyoto University Research Institute for Mathematical Sciences | |
10 * 1987, 1988, 1989, 1990, 1991, 1992 | |
11 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 | |
12 * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992 | |
13 * Copyright FreeWnn Project 1999, 2000, 2001, 2002 | |
14 * | |
15 * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp> | |
16 * | |
17 * This program is free software; you can redistribute it and/or modify | |
18 * it under the terms of the GNU General Public License as published by | |
19 * the Free Software Foundation; either version 2 of the License, or | |
20 * (at your option) any later version. | |
21 * | |
22 * This program is distributed in the hope that it will be useful, | |
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
25 * GNU General Public License for more details. | |
26 * | |
27 * You should have received a copy of the GNU General Public License | |
28 * along with this program; if not, write to the Free Software | |
29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
30 */ | |
31 | |
32 /* | |
33 * Command Dispatch routine | |
34 */ | |
35 | |
36 #if defined(HAVE_CONFIG_H) | |
37 #include <config.h> | |
38 #endif | |
39 | |
40 #include <stdio.h> | |
41 #if STDC_HEADERS | |
42 # include <stdlib.h> | |
43 # include <string.h> | |
44 #else | |
45 # if HAVE_MALLOC_H | |
46 # include <malloc.h> | |
47 # endif | |
48 # if HAVE_STRINGS_H | |
49 # include <strings.h> | |
50 # endif /* HAVE_STRINGS_H */ | |
51 #endif /* STDC_HEADERS */ | |
52 #include <sys/types.h> | |
53 | |
54 #include "commonhd.h" | |
55 #include "demcom.h" | |
56 #include "de_header.h" | |
57 | |
58 extern int cur_clp; | |
59 | |
60 void | |
61 do_command () | |
62 { | |
63 register int command; | |
64 | |
65 wnn_errorno = 0; | |
66 command = get4_cur (); /* get command */ | |
67 | |
68 #if defined(__STDC__) | |
69 #define CASE(X) case (X): log_debug(#X "(%d): cur_clp = %d", command, cur_clp); | |
70 #else | |
71 #define CASE(X) case (X): log_debug("X(%d): cur_clp = %d", command, cur_clp); | |
72 #endif | |
73 | |
74 switch (command) | |
75 { | |
76 CASE (JS_VERSION) put4_cur (JSERVER_VERSION); | |
77 putc_purge (); | |
78 break; | |
79 | |
80 CASE (JS_OPEN) js_open (); | |
81 break; | |
82 | |
83 CASE (JS_CLOSE) js_close (); | |
84 break; | |
85 /* */ | |
86 CASE (JS_CONNECT) js_connect (); | |
87 break; | |
88 | |
89 CASE (JS_DISCONNECT) js_disconnect (); | |
90 break; | |
91 | |
92 CASE (JS_ENV_EXIST) js_env_exist (); | |
93 break; | |
94 | |
95 CASE (JS_ENV_UN_STICKY) js_env_un_sticky (); | |
96 break; | |
97 | |
98 CASE (JS_ENV_STICKY) js_env_sticky (); | |
99 break; | |
100 /* */ | |
101 CASE (JS_PARAM_SET) js_param_set (); | |
102 break; | |
103 | |
104 CASE (JS_PARAM_GET) js_param_get (); | |
105 break; | |
106 /* */ | |
107 CASE (JS_MKDIR) js_mkdir (); | |
108 break; | |
109 | |
110 CASE (JS_ACCESS) js_access (); | |
111 break; | |
112 | |
113 CASE (JS_FILE_STAT) js_file_stat (); | |
114 break; | |
115 | |
116 CASE (JS_FILE_INFO) js_file_info (); | |
117 break; | |
118 | |
119 CASE (JS_FILE_LIST_ALL) js_file_list_all (); | |
120 break; | |
121 | |
122 CASE (JS_FILE_LIST) js_file_list (); | |
123 break; | |
124 | |
125 CASE (JS_FILE_LOADED) js_file_loaded (); | |
126 break; | |
127 | |
128 CASE (JS_FILE_LOADED_LOCAL) js_file_loaded_local (); | |
129 break; | |
130 | |
131 CASE (JS_FILE_READ) js_file_read (); | |
132 break; | |
133 | |
134 CASE (JS_FILE_WRITE) js_file_write (); | |
135 break; | |
136 | |
137 CASE (JS_FILE_SEND) js_file_send (); | |
138 break; | |
139 | |
140 CASE (JS_FILE_RECEIVE) js_file_receive (); | |
141 break; | |
142 | |
143 CASE (JS_HINDO_FILE_CREATE) js_hindo_file_create (); | |
144 break; | |
145 | |
146 CASE (JS_DIC_FILE_CREATE) js_dic_file_create (); | |
147 break; | |
148 | |
149 CASE (JS_FILE_REMOVE) js_file_remove (); | |
150 break; | |
151 | |
152 CASE (JS_FILE_DISCARD) js_file_discard (); | |
153 break; | |
154 CASE (JS_FILE_COMMENT_SET) js_file_comment_set (); | |
155 break; | |
156 CASE (JS_FILE_PASSWORD_SET) js_file_password_set (); | |
157 break; | |
158 | |
159 /* */ | |
160 CASE (JS_DIC_ADD) js_dic_add (); | |
161 break; | |
162 | |
163 CASE (JS_DIC_DELETE) js_dic_delete (); | |
164 break; | |
165 | |
166 CASE (JS_DIC_USE) js_dic_use (); | |
167 break; | |
168 | |
169 CASE (JS_DIC_LIST) js_dic_list (); | |
170 break; | |
171 | |
172 CASE (JS_DIC_LIST_ALL) js_dic_list_all (); | |
173 break; | |
174 | |
175 CASE (JS_DIC_INFO) js_dic_info (); | |
176 break; | |
177 /* */ | |
178 CASE (JS_FUZOKUGO_SET) js_fuzokugo_set (); | |
179 break; | |
180 | |
181 CASE (JS_FUZOKUGO_GET) js_fuzokugo_get (); | |
182 break; | |
183 /* */ | |
184 CASE (JS_WORD_ADD) js_word_add (); | |
185 break; | |
186 | |
187 CASE (JS_WORD_DELETE) js_word_delete (); | |
188 break; | |
189 | |
190 CASE (JS_WORD_SEARCH) js_word_search (); | |
191 break; | |
192 | |
193 CASE (JS_WORD_SEARCH_BY_ENV) js_word_search_by_env (); | |
194 break; | |
195 | |
196 CASE (JS_WORD_INFO) js_word_info (); | |
197 break; | |
198 CASE (JS_WORD_COMMENT_SET) js_word_comment_set (); | |
199 break; | |
200 /* */ | |
201 CASE (JS_KANREN) do_kanren (); | |
202 putc_purge (); | |
203 break; | |
204 | |
205 CASE (JS_KANTAN_DAI) do_kantan_dai (); | |
206 putc_purge (); | |
207 break; | |
208 | |
209 CASE (JS_KANTAN_SHO) do_kantan_sho (); | |
210 putc_purge (); | |
211 break; | |
212 | |
213 CASE (JS_KANZEN_DAI) do_kanzen_dai (); | |
214 putc_purge (); | |
215 break; | |
216 | |
217 CASE (JS_KANZEN_SHO) do_kanzen_sho (); | |
218 putc_purge (); | |
219 break; | |
220 | |
221 CASE (JS_HINDO_SET) js_hindo_set (); | |
222 break; | |
223 | |
224 /* */ | |
225 CASE (JS_WHO) js_who (); | |
226 break; | |
227 | |
228 CASE (JS_ENV_LIST) js_env_list (); | |
229 break; | |
230 CASE (JS_KILL) js_kill (); | |
231 break; | |
232 CASE (JS_HINDO_FILE_CREATE_CLIENT) js_hindo_file_create_client (); | |
233 break; | |
234 CASE (JS_HINSI_LIST) js_hinsi_list (); | |
235 break; | |
236 CASE (JS_HINSI_NAME) js_hinsi_name (); | |
237 break; | |
238 CASE (JS_HINSI_NUMBER) js_hinsi_number (); | |
239 break; | |
240 CASE (JS_HINSI_DICTS) js_hinsi_dicts (); | |
241 break; | |
242 CASE (JS_HINSI_TABLE_SET) js_hinsi_table_set (); | |
243 break; | |
244 default: | |
245 error1 ("unknown command %x", command); | |
246 } | |
247 } | |
248 | |
249 /* | |
250 communication routine | |
251 */ | |
252 | |
253 char * | |
254 get_file_name (buffer, buffer_size) | |
255 char *buffer; | |
256 size_t buffer_size; | |
257 { | |
258 buffer = gets_cur (buffer, buffer_size); | |
259 | |
260 if (!buffer || *buffer == '\0') | |
261 return NULL; | |
262 | |
263 return expand_file_name (buffer, buffer_size); | |
264 } | |
265 | |
266 char * | |
267 expand_file_name (buffer, buffer_size) | |
268 char *buffer; | |
269 size_t buffer_size; | |
270 { | |
271 char *q; | |
272 | |
273 #ifdef WNN_ALLOW_UNSAFE_PATH | |
274 if (*buffer != '/') | |
275 #else | |
276 /* XXX: path under jserver_dir only */ | |
277 if (*buffer != '/' | |
278 || strncmp(buffer, jserver_dir, strlen(jserver_dir)) != 0) | |
279 #endif | |
280 { | |
281 char *path; | |
282 size_t path_len; | |
283 | |
284 path_len = strlen (jserver_dir) + strlen (buffer) + 2; | |
285 if (path_len > buffer_size) | |
286 return NULL; | |
287 | |
288 path = malloc (path_len); | |
289 if (!path) | |
290 return NULL; | |
291 | |
292 strcpy (path, jserver_dir); | |
293 /* strcat(path,c_c->user_name); */ | |
294 #ifndef WNN_ALLOW_UNSAFE_PATH | |
295 if (path[strlen(path)-1] != '/' && *buffer != '/') | |
296 #endif | |
297 strcat (path, "/"); | |
298 strcat (path, buffer); | |
299 strcpy (buffer, path); | |
300 | |
301 free (path); | |
302 } | |
303 | |
304 #ifndef WNN_ALLOW_UNSAFE_PATH | |
305 { | |
306 char *p, *pp, *p0; | |
307 p = pp = p0 = malloc(strlen(buffer)+1); | |
308 for (q = buffer; *q; p++, q++) { | |
309 if (*q == '/') { | |
310 while (*(q+1) == '/') | |
311 q++; | |
312 if (strncmp(q, "/..", 3) == 0 && (*(q+3) == '/' || (*(q+3) == '\0'))) { | |
313 q += 2; | |
314 p = pp-1; | |
315 continue; | |
316 } | |
317 pp = p; | |
318 } | |
319 *p = *q; | |
320 } | |
321 *p = '\0'; | |
322 strcpy(buffer, p0); | |
323 free(p0); | |
324 } | |
325 if (strncmp(buffer, jserver_dir, strlen(jserver_dir)) != 0) { | |
326 /* unsafe path */ | |
327 return NULL; /* XXX */ | |
328 } | |
329 #endif | |
330 for (q = buffer; *q++;) | |
331 ; | |
332 q -= 2; | |
333 | |
334 for (;;) | |
335 { | |
336 if (*q != '/') | |
337 break; | |
338 *q-- = '\0'; | |
339 } | |
340 /* | |
341 fprintf(stderr,"file_name=%s\n",p); | |
342 */ | |
343 | |
344 return buffer; | |
345 } | |
346 | |
347 void | |
348 error_ret () | |
349 { | |
350 extern char *wnn_perror (); | |
351 | |
352 put4_cur (-1); | |
353 if (wnn_errorno == 0) | |
354 { | |
355 put4_cur (WNN_SOME_ERROR); | |
356 } | |
357 else | |
358 { | |
359 error1 ("Error %s(%d): cur_clp = %d\n", wnn_perror (), wnn_errorno, cur_clp); | |
360 put4_cur (wnn_errorno); | |
361 } | |
362 putc_purge (); | |
363 } |