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 ();
+}