Mercurial > freewnn
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Wnn/jserver/dispatch.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,363 @@ +/* + * $Id: dispatch.c,v 1.11 2002/05/12 22:51:16 hiroo Exp $ + */ + +/* + * FreeWnn is a network-extensible Kana-to-Kanji conversion system. + * This file is part of FreeWnn. + * + * Copyright Kyoto University Research Institute for Mathematical Sciences + * 1987, 1988, 1989, 1990, 1991, 1992 + * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 + * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992 + * Copyright FreeWnn Project 1999, 2000, 2001, 2002 + * + * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Command Dispatch routine + */ + +#if defined(HAVE_CONFIG_H) +#include <config.h> +#endif + +#include <stdio.h> +#if STDC_HEADERS +# include <stdlib.h> +# include <string.h> +#else +# if HAVE_MALLOC_H +# include <malloc.h> +# endif +# if HAVE_STRINGS_H +# include <strings.h> +# endif /* HAVE_STRINGS_H */ +#endif /* STDC_HEADERS */ +#include <sys/types.h> + +#include "commonhd.h" +#include "demcom.h" +#include "de_header.h" + +extern int cur_clp; + +void +do_command () +{ + register int command; + + wnn_errorno = 0; + command = get4_cur (); /* get command */ + +#if defined(__STDC__) +#define CASE(X) case (X): log_debug(#X "(%d): cur_clp = %d", command, cur_clp); +#else +#define CASE(X) case (X): log_debug("X(%d): cur_clp = %d", command, cur_clp); +#endif + + switch (command) + { + CASE (JS_VERSION) put4_cur (JSERVER_VERSION); + putc_purge (); + break; + + CASE (JS_OPEN) js_open (); + break; + + CASE (JS_CLOSE) js_close (); + break; +/* */ + CASE (JS_CONNECT) js_connect (); + break; + + CASE (JS_DISCONNECT) js_disconnect (); + break; + + CASE (JS_ENV_EXIST) js_env_exist (); + break; + + CASE (JS_ENV_UN_STICKY) js_env_un_sticky (); + break; + + CASE (JS_ENV_STICKY) js_env_sticky (); + break; +/* */ + CASE (JS_PARAM_SET) js_param_set (); + break; + + CASE (JS_PARAM_GET) js_param_get (); + break; +/* */ + CASE (JS_MKDIR) js_mkdir (); + break; + + CASE (JS_ACCESS) js_access (); + break; + + CASE (JS_FILE_STAT) js_file_stat (); + break; + + CASE (JS_FILE_INFO) js_file_info (); + break; + + CASE (JS_FILE_LIST_ALL) js_file_list_all (); + break; + + CASE (JS_FILE_LIST) js_file_list (); + break; + + CASE (JS_FILE_LOADED) js_file_loaded (); + break; + + CASE (JS_FILE_LOADED_LOCAL) js_file_loaded_local (); + break; + + CASE (JS_FILE_READ) js_file_read (); + break; + + CASE (JS_FILE_WRITE) js_file_write (); + break; + + CASE (JS_FILE_SEND) js_file_send (); + break; + + CASE (JS_FILE_RECEIVE) js_file_receive (); + break; + + CASE (JS_HINDO_FILE_CREATE) js_hindo_file_create (); + break; + + CASE (JS_DIC_FILE_CREATE) js_dic_file_create (); + break; + + CASE (JS_FILE_REMOVE) js_file_remove (); + break; + + CASE (JS_FILE_DISCARD) js_file_discard (); + break; + CASE (JS_FILE_COMMENT_SET) js_file_comment_set (); + break; + CASE (JS_FILE_PASSWORD_SET) js_file_password_set (); + break; + +/* */ + CASE (JS_DIC_ADD) js_dic_add (); + break; + + CASE (JS_DIC_DELETE) js_dic_delete (); + break; + + CASE (JS_DIC_USE) js_dic_use (); + break; + + CASE (JS_DIC_LIST) js_dic_list (); + break; + + CASE (JS_DIC_LIST_ALL) js_dic_list_all (); + break; + + CASE (JS_DIC_INFO) js_dic_info (); + break; +/* */ + CASE (JS_FUZOKUGO_SET) js_fuzokugo_set (); + break; + + CASE (JS_FUZOKUGO_GET) js_fuzokugo_get (); + break; +/* */ + CASE (JS_WORD_ADD) js_word_add (); + break; + + CASE (JS_WORD_DELETE) js_word_delete (); + break; + + CASE (JS_WORD_SEARCH) js_word_search (); + break; + + CASE (JS_WORD_SEARCH_BY_ENV) js_word_search_by_env (); + break; + + CASE (JS_WORD_INFO) js_word_info (); + break; + CASE (JS_WORD_COMMENT_SET) js_word_comment_set (); + break; +/* */ + CASE (JS_KANREN) do_kanren (); + putc_purge (); + break; + + CASE (JS_KANTAN_DAI) do_kantan_dai (); + putc_purge (); + break; + + CASE (JS_KANTAN_SHO) do_kantan_sho (); + putc_purge (); + break; + + CASE (JS_KANZEN_DAI) do_kanzen_dai (); + putc_purge (); + break; + + CASE (JS_KANZEN_SHO) do_kanzen_sho (); + putc_purge (); + break; + + CASE (JS_HINDO_SET) js_hindo_set (); + break; + +/* */ + CASE (JS_WHO) js_who (); + break; + + CASE (JS_ENV_LIST) js_env_list (); + break; + CASE (JS_KILL) js_kill (); + break; + CASE (JS_HINDO_FILE_CREATE_CLIENT) js_hindo_file_create_client (); + break; + CASE (JS_HINSI_LIST) js_hinsi_list (); + break; + CASE (JS_HINSI_NAME) js_hinsi_name (); + break; + CASE (JS_HINSI_NUMBER) js_hinsi_number (); + break; + CASE (JS_HINSI_DICTS) js_hinsi_dicts (); + break; + CASE (JS_HINSI_TABLE_SET) js_hinsi_table_set (); + break; + default: + error1 ("unknown command %x", command); + } +} + +/* + communication routine + */ + +char * +get_file_name (buffer, buffer_size) + char *buffer; + size_t buffer_size; +{ + buffer = gets_cur (buffer, buffer_size); + + if (!buffer || *buffer == '\0') + return NULL; + + return expand_file_name (buffer, buffer_size); +} + +char * +expand_file_name (buffer, buffer_size) + char *buffer; + size_t buffer_size; +{ + char *q; + +#ifdef WNN_ALLOW_UNSAFE_PATH + if (*buffer != '/') +#else + /* XXX: path under jserver_dir only */ + if (*buffer != '/' + || strncmp(buffer, jserver_dir, strlen(jserver_dir)) != 0) +#endif + { + char *path; + size_t path_len; + + path_len = strlen (jserver_dir) + strlen (buffer) + 2; + if (path_len > buffer_size) + return NULL; + + path = malloc (path_len); + if (!path) + return NULL; + + strcpy (path, jserver_dir); +/* strcat(path,c_c->user_name); */ +#ifndef WNN_ALLOW_UNSAFE_PATH + if (path[strlen(path)-1] != '/' && *buffer != '/') +#endif + strcat (path, "/"); + strcat (path, buffer); + strcpy (buffer, path); + + free (path); + } + +#ifndef WNN_ALLOW_UNSAFE_PATH + { + char *p, *pp, *p0; + p = pp = p0 = malloc(strlen(buffer)+1); + for (q = buffer; *q; p++, q++) { + if (*q == '/') { + while (*(q+1) == '/') + q++; + if (strncmp(q, "/..", 3) == 0 && (*(q+3) == '/' || (*(q+3) == '\0'))) { + q += 2; + p = pp-1; + continue; + } + pp = p; + } + *p = *q; + } + *p = '\0'; + strcpy(buffer, p0); + free(p0); + } + if (strncmp(buffer, jserver_dir, strlen(jserver_dir)) != 0) { + /* unsafe path */ + return NULL; /* XXX */ + } +#endif + for (q = buffer; *q++;) + ; + q -= 2; + + for (;;) + { + if (*q != '/') + break; + *q-- = '\0'; + } +/* +fprintf(stderr,"file_name=%s\n",p); +*/ + + return buffer; +} + +void +error_ret () +{ + extern char *wnn_perror (); + + put4_cur (-1); + if (wnn_errorno == 0) + { + put4_cur (WNN_SOME_ERROR); + } + else + { + error1 ("Error %s(%d): cur_clp = %d\n", wnn_perror (), wnn_errorno, cur_clp); + put4_cur (wnn_errorno); + } + putc_purge (); +}