diff options
Diffstat (limited to 'japanese/FreeWnn-server/files/patch-Wnn-jserver-de.c')
-rw-r--r-- | japanese/FreeWnn-server/files/patch-Wnn-jserver-de.c | 1861 |
1 files changed, 1554 insertions, 307 deletions
diff --git a/japanese/FreeWnn-server/files/patch-Wnn-jserver-de.c b/japanese/FreeWnn-server/files/patch-Wnn-jserver-de.c index 3c0c678c1364..5685e7a0b411 100644 --- a/japanese/FreeWnn-server/files/patch-Wnn-jserver-de.c +++ b/japanese/FreeWnn-server/files/patch-Wnn-jserver-de.c @@ -2,10 +2,20 @@ Index: Wnn/jserver/de.c =================================================================== RCS file: /home/cvs/private/hrs/freewnn/Wnn/jserver/de.c,v retrieving revision 1.1.1.1 -diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn-jserver-de.c,v 1.3 2009-01-02 23:08:15 hrs Exp $ -I\$NetBSD:.*\$ -I\$OpenBSD:.*\$ -I\$DragonFly:.*\$ -I\$Id:.*\$ -I\$Translation:.*\$ -I\$hrs:.*\$ -w -r1.1.1.1 de.c +retrieving revision 1.7 +diff -u -p -r1.1.1.1 -r1.7 --- Wnn/jserver/de.c 20 Dec 2008 07:13:30 -0000 1.1.1.1 -+++ Wnn/jserver/de.c 2 Jan 2009 22:27:53 -0000 -@@ -102,29 +102,18 @@ ++++ Wnn/jserver/de.c 2 Jan 2010 14:05:14 -0000 1.7 +@@ -1,7 +1,7 @@ + /* + * 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 +@@ -102,54 +102,35 @@ static char rcs_id[] = "$Id: de.c,v 1.36 #endif #ifndef INET6 @@ -29,93 +39,368 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- -#endif +#define MAX_ACCEPTS 256 - #define PROTO_ALL 0x1 +-#define PROTO_ALL 0x1 #define PROTO_UN 0x2 #define PROTO_INET 0x4 -#ifdef INET6 #define PROTO_INET6 0x8 -#endif - static int listen_proto = PROTO_ALL; +-static int listen_proto = PROTO_ALL; ++#define PROTO_ALL (PROTO_UN|PROTO_INET|PROTO_INET6) ++static int listen_proto; jmp_buf client_dead; -@@ -132,17 +121,15 @@ + static int port; - static int serverNO = 0; +-static int serverNO = 0; ++static int serverNO; -struct cmblk -{ +- int sd; /** ソケットのfd **/ +struct cmblk { + int domain; - int sd; /** ソケットのfd **/ ++ int sd; /* socket fd */ }; -#define COMS_BLOCK struct cmblk -static COMS_BLOCK *cblk; -+static struct cmblk *cblk; - /** クライアントごとのソケットを管理するテーブル **/ +- /** クライアントごとのソケットを管理するテーブル **/ - -static COMS_BLOCK accept_blk[MAX_ACCEPTS]; /*accept sock blocks */ - -+static struct cmblk accept_blk[MAX_ACCEPTS]; /*accept sock blocks */ +- +-/* Communication Buffers */ +-static char snd_buf[R_BUF_SIZ]; /** 送信バッファ **/ +-static int sbp; /** 送信バッファポインタ **/ +- +-static int rbc; /** 受信バッファcounter **/ +-static char rcv_buf[S_BUF_SIZ]; /** 受信バッファ **/ ++/** クライアントごとのソケットを管理するテーブル **/ ++static struct cmblk *cblk; ++/*accept sock blocks */ ++static struct cmblk accept_blk[MAX_ACCEPTS]; +static int bindex; - /* Communication Buffers */ - static char snd_buf[R_BUF_SIZ]; /** 送信バッファ **/ -@@ -191,17 +178,14 @@ - static void daemon_fin_in (int); - static int rcv_1_client (int); - static void snd_1_client (int, int); + #if defined(EAGAIN) + # if defined(EWOULDBLOCK) +@@ -167,7 +148,6 @@ static char rcv_buf[S_BUF_SIZ]; + + /* Client Table */ + int clientp; /** cblkの有効なデータの最後を差している **/ +- + int cur_clp; /** 現在のクライアントの番号 **/ + + static fd_set *all_socks; /** ビットパターン +@@ -181,27 +161,24 @@ struct msg_cat *wnn_msg_cat; + struct msg_cat *js_msg_cat; + + /* function prototypes */ +-static void daemon_main (void); +-static void socket_disc_init (void); +-static void sel_all (void); +-static int get_client (void); +-static void new_client (void); +-static void daemon_init (void); +-static void daemon_fin_un (int); +-static void daemon_fin_in (int); +-static int rcv_1_client (int); +-static void snd_1_client (int, int); -static void socket_init_un (void); -static void socket_init_in (void); -static int socket_accept_un (void); -static int socket_accept_in (int); +-static void xerror (char*); +-static void get_options (int, char **); +-static void usage (void); +-static void print_version (void); +-#ifdef DEBUG +-static void dmp (char*, int); +-#endif ++static void daemon_main(void); ++static void socket_disc_init(void); ++static int sel_all(void); ++static int get_client(void); ++static void new_client(void); ++static void daemon_init(void); ++static void daemon_fin_un(int); ++static void daemon_fin_in(int); ++static int rcv_1_client(int); ++static void snd_1_client(int, int); +static void socket_init_un(int *); +static void socket_init_in(int *); +static int socket_accept(int); - static void xerror (char*); - static void get_options (int, char **); - static void usage (void); - static void print_version (void); --#ifdef DEBUG - static void dmp (char*, int); --#endif ++static void xerror(char*); ++static void get_options(int, char **); ++static void usage(void); ++static void print_version(void); ++static void dmp(char*, int); static char cmd_name[16]; -@@ -266,8 +250,11 @@ - /* hosts_access_verbose = 2; */ +@@ -214,154 +191,136 @@ int deny_severity; + + /* No arguments are used. Only options. */ + int +-main (int argc, char *argv[]) ++main(int argc, char *argv[]) + { +- int tmpttyfd; +- char *cswidth_name; +- extern char *get_cswidth_name (); +- extern void set_cswidth (); +- +- char nlspath[64]; +- +- strcpy (cmd_name, WNN_DAEMON_NAME); +- strcpy (lang_dir, LANG_NAME); +- strcpy (nlspath, LIBDIR); +- strcat (nlspath, "/%L/%N"); +- js_msg_cat = msg_open (MESSAGE_FILE, nlspath, lang_dir); +- wnn_msg_cat = msg_open ("libwnn.msg", nlspath, lang_dir); +- if (wnn_msg_cat == NULL) +- { +- log_err ("cannot open message file libwnn.msg."); +- } +- if (cswidth_name = get_cswidth_name (LANG_NAME)) +- set_cswidth (create_cswidth (cswidth_name)); ++ int tmpttyfd; ++ pid_t pid; ++ int fd; ++ char *cswidth_name; ++ extern char *get_cswidth_name (); ++ extern void set_cswidth (); ++ ++ char nlspath[64]; ++ ++ strcpy(cmd_name, WNN_DAEMON_NAME); ++ strcpy(lang_dir, LANG_NAME); ++ strcpy(nlspath, LIBDIR); ++ strcat(nlspath, "/%L/%N"); ++ js_msg_cat = msg_open (MESSAGE_FILE, nlspath, lang_dir); ++ wnn_msg_cat = msg_open ("libwnn.msg", nlspath, lang_dir); + +- port = -1; +- /* option default */ +- option_flag = (OPT_FORK & ~OPT_VERBOSE); +- +- setuid (geteuid ()); +- get_options (argc, argv); +- print_version(); +- log_debug("invoked as %s.", argv[0]); +- if (option_flag & OPT_FORK) +- { +- if (fork ()) +- { +- signal (SIGCHLD, _exit); +- signal (SIGHUP, SIG_IGN); +- signal (SIGINT, SIG_IGN); +- signal (SIGQUIT, SIG_IGN); +-#ifdef SIGTSTP +- signal (SIGTSTP, SIG_IGN); +-#endif +- signal (SIGTERM, _exit); +- pause (); ++ if (wnn_msg_cat == NULL) { ++ log_err ("cannot open message file libwnn.msg."); + } +- } ++ if (cswidth_name = get_cswidth_name (LANG_NAME)) ++ set_cswidth (create_cswidth (cswidth_name)); + ++ port = -1; ++ /* option default */ ++ option_flag = (OPT_FORK & ~OPT_VERBOSE); ++ ++ setuid(geteuid()); ++ get_options (argc, argv); ++ print_version(); ++ log_debug("invoked as %s.", argv[0]); + #if defined(HAVE_LIBWRAP) +- allow_severity = LOG_INFO; +- deny_severity = LOG_WARNING; +- /* hosts_access_verbose = 2; */ ++ allow_severity = LOG_INFO; ++ deny_severity = LOG_WARNING; ++ /* hosts_access_verbose = 2; */ #endif /* HAVE_LIBWRAP */ - signal (SIGHUP, signal_hand); -+ if (option_flag & OPT_FORK) -+ /* when -D is not specified, accept SIGINT */ - signal (SIGINT, signal_hand); -+ -+ signal (SIGHUP, signal_hand); - signal (SIGQUIT, signal_hand); - signal (SIGTERM, terminate_hand); - if (option_flag & OPT_FORK) -@@ -276,16 +263,17 @@ - signal (SIGTSTP, SIG_IGN); +- signal (SIGINT, signal_hand); +- signal (SIGQUIT, signal_hand); +- signal (SIGTERM, terminate_hand); +- if (option_flag & OPT_FORK) +- { +-#ifdef SIGTSTP +- signal (SIGTSTP, SIG_IGN); ++ signal(SIGHUP, signal_hand); ++ signal(SIGQUIT, signal_hand); ++ signal(SIGTERM, terminate_hand); ++ if (option_flag & OPT_FORK) { ++ /* when -D is not specified, accept SIGINT */ ++ signal(SIGINT, signal_hand); ++#ifdef SIGTSTP ++ signal(SIGTSTP, SIG_IGN); #endif /* SIGTSTP */ - } -+ - read_default (); - daemon_init (); - - env_init (); +- } +- read_default (); +- daemon_init (); +- +- env_init (); - if (file_init () == NULL) -+ if (file_init () == 0) - { - exit (1); - } - dic_init (); +- { +- exit (1); +- } +- dic_init (); - if (NULL == get_kaiseki_area (LENGTHCONV + 1)) /* 変換可能文字数 */ -+ if (0 == get_kaiseki_area (LENGTHCONV + 1)) /* 変換可能文字数 */ - { - log_err ("get_kaiseki_area failed."); - exit (1); -@@ -370,19 +358,16 @@ +- { +- log_err ("get_kaiseki_area failed."); +- exit (1); +- } +- init_work_areas (); +- init_jmt (); +- +- read_default_files (); +- +- if (option_flag & OPT_FORK) +- { +- /* End of initialization, kill parent */ +- kill (getppid (), SIGTERM); +- fclose (stdin); +- fclose (stdout); +- if (!(option_flag & OPT_VERBOSE)) +- { +-#if !(defined(BSD) && (BSD >= 199306)) /* !4.4BSD-Lite by Taoka */ +- fclose (stderr); +-#else /* 4.4BSD-Lite */ +- int fd = open ("/dev/null", O_WRONLY); +- if (fd < 0) +- { +- xerror ("Cannot open /dev/null"); +- } +- dup2 (fd, 2); +- close (fd); +-#endif /* 4.4BSD-Lite */ + } +- ++ read_default(); ++ daemon_init(); ++ env_init(); ++ if (file_init() == 0) ++ exit (1); ++ dic_init(); ++ if (0 == get_kaiseki_area (LENGTHCONV + 1)) { ++ /* 変換可能文字数 */ ++ log_err ("get_kaiseki_area failed."); ++ exit (1); ++ } ++ init_work_areas(); ++ init_jmt(); ++ read_default_files(); ++ if (option_flag & OPT_FORK) { ++ pid = fork(); ++ if (pid == -1) { ++ log_err ("cannot fork."); ++ exit(1); ++ } ++ if (pid > 0) ++ _exit(0); ++ setsid(); ++ pid = fork(); ++ if (pid == -1) { ++ log_err ("cannot fork."); ++ exit(1); ++ } ++ if (pid > 0) ++ _exit(0); ++ chdir("/"); ++ umask(0); ++ close(STDIN_FILENO); ++ close(STDOUT_FILENO); ++ if (!(option_flag & OPT_VERBOSE)) { ++ close(STDERR_FILENO); ++ fd = open("/dev/null", O_WRONLY); ++ if (fd < 0) { ++ xerror ("Cannot open /dev/null"); ++ } ++ dup2(fd, STDERR_FILENO); ++ close(fd); ++ } + #ifdef SETPGRP_VOID +- setpgrp (); ++ setpgrp(); + #else /* !SETPGRP_VOID */ + # if !defined(TIOCNOTTY) && defined(SVR4) + # define TIOCNOTTY _IO('t', 113) + # endif /* !defined(TIOCNOTTY) && defined(SVR4) */ + #ifndef HITACHI +- if ((tmpttyfd = open ("/dev/tty", O_RDWR)) >= 0) +- { +- ioctl (tmpttyfd, TIOCNOTTY, 0); +- close (tmpttyfd); +- } ++ if ((tmpttyfd = open("/dev/tty", O_RDWR)) >= 0) { ++ ioctl(tmpttyfd, TIOCNOTTY, 0); ++ close(tmpttyfd); ++ } + #endif /* HITACHI */ + #endif /* SETPGRP_VOID */ +- } +- +- daemon_main (); +- +- daemon_fin (); +- return (0); /* it is not reached. only for avoiding compiler warning. */ ++ } ++ daemon_main(); ++ daemon_fin(); ++ return(0); /* NOTREACHED */ + } + + static void + daemon_main (void) + { +- for (;;) +- { +- c_c = NULL; /* Added for logging: server section */ +- sel_all (); +- new_client (); +- for (;;) +- { +- if (get_client () == -1) +- break; +- c_c = &client[cur_clp]; +- rbc = 0; +- sbp = 0; ++ for (;;) { ++ c_c = NULL; /* Added for logging: server section */ ++ sel_all(); ++ new_client(); ++ ++ for (;;) { ++ if (get_client () == -1) ++ break; ++ c_c = &client[cur_clp]; + /* if(rcv_1_client(cur_clp) == 0){ del_client(); continue; } */ +- if (setjmp (client_dead)) +- { +- del_client (); +- continue; +- } +- do_command (c_c); +- } +- } ++ if (setjmp(client_dead)) { ++ del_client (); ++ continue; ++ } ++ do_command(c_c); ++ } ++ } + } + + /* +@@ -370,39 +329,36 @@ daemon_main (void) static void socket_disc_init (void) { @@ -127,13 +412,17 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- - { - nofile = FD_SETSIZE; - } +- all_socks = (fd_set *) malloc (sizeof (fd_set)); +- FD_ZERO (all_socks); +- ready_socks = (fd_set *) malloc (sizeof (fd_set)); +- dummy1_socks = (fd_set *) malloc (sizeof (fd_set)); +- dummy2_socks = (fd_set *) malloc (sizeof (fd_set)); + nofile = MIN(WNN_NFD, FD_SETSIZE); + - all_socks = (fd_set *) malloc (sizeof (fd_set)); -- FD_ZERO (all_socks); - ready_socks = (fd_set *) malloc (sizeof (fd_set)); - dummy1_socks = (fd_set *) malloc (sizeof (fd_set)); - dummy2_socks = (fd_set *) malloc (sizeof (fd_set)); ++ all_socks = (fd_set *)malloc(sizeof(fd_set)); ++ ready_socks = (fd_set *)malloc(sizeof(fd_set)); ++ dummy1_socks = (fd_set *)malloc(sizeof(fd_set)); ++ dummy2_socks = (fd_set *)malloc(sizeof(fd_set)); + FD_ZERO(all_socks); + FD_ZERO(ready_socks); + FD_ZERO(dummy1_socks); @@ -141,70 +430,133 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- } /** 全てのソケットについて待つ **/ -@@ -390,20 +375,17 @@ - sel_all (void) +-static void +-sel_all (void) ++static int ++sel_all(void) { - memcpy (ready_socks, all_socks, sizeof (fd_set)); +- memcpy (ready_socks, all_socks, sizeof (fd_set)); - bzero (dummy1_socks, sizeof (fd_set)); - bzero (dummy2_socks, sizeof (fd_set)); ++ int ns = 0; ++ memcpy(ready_socks, all_socks, sizeof(fd_set)); + FD_ZERO(dummy1_socks); + FD_ZERO(dummy2_socks); top: - errno = 0; +- errno = 0; - if ((no_of_ready_socks = select (nofile, ready_socks, dummy1_socks, dummy2_socks, NULL)) == -1) - { +- if (errno == EINTR) +- goto top; +- xerror ("select error"); +- } ++ errno = 0; + if ((no_of_ready_socks = select(nofile, ready_socks, dummy1_socks, dummy2_socks, NULL)) == -1) { - if (errno == EINTR) - goto top; - xerror ("select error"); - } --#ifdef DEBUG - log_debug ("select OK, ready_socks[0]=%02X, n-r-s=%x\n", ready_socks[0], no_of_ready_socks); --#endif ++ if (errno == EINTR) ++ goto top; ++ xerror ("select error"); ++ } + #ifdef DEBUG +- log_debug ("select OK, ready_socks[0]=%02X, n-r-s=%x\n", ready_socks[0], no_of_ready_socks); ++ log_debug ("select OK, ready_socks[0]=%02X, n-r-s=%x\n", ready_socks[0], no_of_ready_socks); + #endif + } + +@@ -412,142 +368,136 @@ top: + static int + get_client (void) + { +- int i; +- +- if (no_of_ready_socks == 0) +- return -1; /* no client waits service */ +- +- for (i = cur_clp;;) +- { +- if (no_of_ready_socks == 0) +- return -1; +- i++; +- if (i >= clientp) +- i = 0; +- if (FD_ISSET (cblk[i].sd, ready_socks)) +- { +- FD_CLR (cblk[i].sd, ready_socks); +- no_of_ready_socks--; +- return cur_clp = i; +- } +- } ++ int i; ++ ++ if (no_of_ready_socks == 0) ++ return -1; /* no client waits service */ ++ ++ for (i = cur_clp;;) ++ { ++ if (no_of_ready_socks == 0) ++ return -1; ++ i++; ++ if (i >= clientp) ++ i = 0; ++ if (FD_ISSET(cblk[i].sd, ready_socks)) { ++ FD_CLR(cblk[i].sd, ready_socks); ++ no_of_ready_socks--; ++ return (cur_clp = i); ++ } ++ } } - /** ready_socksから今やる一人を取り出して返す(cur_clpにもセットする) -@@ -438,7 +420,7 @@ + /** 新しいクライアントが居るか否かを調べる + 居た場合はcblkに登録する **/ static void - new_client (void) /* NewClient */ +-new_client (void) /* NewClient */ ++new_client(void) { - int sd; +- int full, i; +- FILE *f[3]; +- char gomi[1024]; + int sd = -1; - int full, i; - FILE *f[3]; - char gomi[1024]; -@@ -446,61 +428,54 @@ - int is_internet_socket; - struct request_info tcpd_request; ++ int full, i; ++ FILE *f[3]; ++ char gomi[1024]; + #ifdef HAVE_LIBWRAP +- int is_internet_socket; +- struct request_info tcpd_request; ++ int is_internet_socket; ++ struct request_info tcpd_request; #endif /* HAVE_LIBWRAP */ -#ifdef AF_UNIX - if ((serverNO == 0) && - (FD_ISSET (accept_blk[UNIX_ACPT].sd, ready_socks))) - { - FD_CLR (accept_blk[UNIX_ACPT].sd, ready_socks); +- no_of_ready_socks--; +- sd = socket_accept_un (); + + log_debug("new client called"); ++ + for (i = 0; i < bindex && !FD_ISSET(accept_blk[i].sd, ready_socks); i++) + ; + + if (i == bindex) + return; + -+ log_debug("new client: FDISSET(%d/%d) true, domain=%d", i, bindex, accept_blk[i].domain); + FD_CLR(accept_blk[i].sd, ready_socks); - no_of_ready_socks--; -- sd = socket_accept_un (); -+ ++ no_of_ready_socks--; ++ log_debug("new client: FDISSET(%d/%d) true, domain=%d", ++ i, bindex, accept_blk[i].domain); ++ + switch (accept_blk[i].domain) { +#ifdef AF_UNIX + case AF_UNIX: + sd = socket_accept(i); #ifdef HAVE_LIBWRAP - is_internet_socket = 0; +- is_internet_socket = 0; -#endif - } - else ++ is_internet_socket = 0; +#endif /* HAVE_LIBWRAP */ + break; #endif @@ -229,77 +581,212 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- + case AF_INET: + sd = socket_accept(i); #ifdef HAVE_LIBWRAP - is_internet_socket = 1; +- is_internet_socket = 1; -#endif - } - else - { -+#endif /* HAVE_LIBWRAP */ -+ break; -+ default: - return; - } +- return; +- } - log_debug ("new client: sd = %d", sd); -+ -+ log_debug("new client: sd = %d (type=%d)", sd, accept_blk[i].domain); -+ - /* reserve 2 fd */ +- /* reserve 2 fd */ - for (full = i = 0; i < 2; i++) - { - if (NULL == (f[i] = fopen ("/dev/null", "r"))) - { -+ for (full = i = 0; i < 2; i++) { -+ if (NULL == (f[i] = fopen ("/dev/null", "r"))) { - full = 1; - } - } +- full = 1; +- } +- } - for (i = 0; i < 2; i++) - { -+ for (i = 0; i < 2; i++) { - if (NULL != f[i]) - fclose (f[i]); - } - +- if (NULL != f[i]) +- fclose (f[i]); +- } +- - if (full || sd >= nofile || clientp >= max_client) - { +- log_err ("no more client."); ++ is_internet_socket = 1; ++#endif /* HAVE_LIBWRAP */ ++ break; ++ default: ++ return; ++ } ++ ++ log_debug("new client: sd = %d (type=%d)", ++ sd, accept_blk[i].domain); ++ ++ /* reserve 2 fd */ ++ for (full = i = 0; i < 2; i++) { ++ if (NULL == (f[i] = fopen ("/dev/null", "r"))) { ++ full = 1; ++ } ++ } ++ ++ for (i = 0; i < 2; i++) { ++ if (NULL != f[i]) ++ fclose (f[i]); ++ } ++ + if (full || sd >= nofile || clientp >= max_client) { - log_err ("no more client."); ++ log_err("no more client."); #ifdef HAVE_RECV - recv (sd, gomi, 1024, 0); -@@ -521,8 +496,7 @@ - request_init (&tcpd_request,RQ_DAEMON, WNN_DAEMON_NAME, - RQ_FILE, sd, NULL); - fromhost (&tcpd_request); +- recv (sd, gomi, 1024, 0); ++ recv(sd, gomi, 1024, 0); + #else +- read (sd, gomi, 1024); ++ read(sd, gomi, 1024); + #endif +- shutdown (sd, 2); ++ shutdown(sd, 2); + #ifdef HAVE_CLOSESOCKET +- closesocket (sd); ++ closesocket(sd); + #else +- close (sd); ++ close(sd); + #endif +- return; +- } +- ++ return; ++ } ++ + #ifdef HAVE_LIBWRAP +- if (is_internet_socket) { +- request_init (&tcpd_request,RQ_DAEMON, WNN_DAEMON_NAME, +- RQ_FILE, sd, NULL); +- fromhost (&tcpd_request); - if (!hosts_access (&tcpd_request)) - { +- log_err ("reject client."); /* should be log_info? */ +- /* should we log IP address / hostname? */ ++ if (is_internet_socket) { ++ request_init (&tcpd_request,RQ_DAEMON, WNN_DAEMON_NAME, ++ RQ_FILE, sd, NULL); ++ fromhost (&tcpd_request); + if (!hosts_access (&tcpd_request)) { - log_err ("reject client."); /* should be log_info? */ - /* should we log IP address / hostname? */ ++ log_err ("reject client."); /* should be log_info? */ ++ /* should we log IP address / hostname? */ #ifdef HAVE_RECV -@@ -543,8 +517,7 @@ - - cblk[clientp].sd = sd; - FD_SET (sd, all_socks); +- recv (sd, gomi, 1024, 0); ++ recv(sd, gomi, 1024, 0); + #else +- read (sd, gomi, 1024); ++ read(sd, gomi, 1024); + #endif +- shutdown (sd, 2); ++ shutdown(sd, 2); + #ifdef HAVE_CLOSESOCKET +- closesocket (sd); ++ closesocket(sd); + #else +- close (sd); ++ close(sd); + #endif +- return; +- } +- } ++ return; ++ } ++ } + #endif /* HAVE_LIBWRAP */ +- +- cblk[clientp].sd = sd; +- FD_SET (sd, all_socks); - for (i = 0; i < WNN_MAX_ENV_OF_A_CLIENT; i++) - { +- (client[clientp].env)[i] = -1; +- } +- clientp++; ++ ++ cblk[clientp].sd = sd; ++ FD_SET(sd, all_socks); + for (i = 0; i < WNN_MAX_ENV_OF_A_CLIENT; i++) { - (client[clientp].env)[i] = -1; - } - clientp++; -@@ -584,8 +557,7 @@ - signal (SIGQUIT, SIG_IGN); - */ ++ (client[clientp].env)[i] = -1; ++ } ++ clientp++; + } + + /** クライアントをcblkから削除する **/ +@@ -555,746 +505,724 @@ new_client (void) /* NewCl + void + del_client (void) + { +- disconnect_all_env_of_client (); +- FD_CLR (cblk[cur_clp].sd, all_socks); ++ disconnect_all_env_of_client (); ++ FD_CLR(cblk[cur_clp].sd, all_socks); + #ifdef HAVE_CLOSESOCKET +- closesocket (cblk[cur_clp].sd); ++ closesocket(cblk[cur_clp].sd); + #else +- close (cblk[cur_clp].sd); ++ close(cblk[cur_clp].sd); + #endif + /* logging here because c_c (used in log_debug) will be broken after + following section */ +- log_debug("Delete Client: cur_clp = %d\n", cur_clp); +- cblk[cur_clp] = cblk[clientp - 1]; +- client[cur_clp] = client[clientp - 1]; +- /* Clear host/user name with zero - needed for logging */ +- client[clientp - 1].user_name[0] = '\0'; /* Should we use bzero()? */ +- client[clientp - 1].host_name[0] = '\0'; +- clientp--; +-} ++ log_debug("Delete Client: cur_clp = %d\n", cur_clp); ++ cblk[cur_clp] = cblk[clientp - 1]; ++ client[cur_clp] = client[clientp - 1]; ++ /* Clear host/user name with zero - needed for logging */ ++ ++ /* Should we use bzero()? */ ++ client[clientp - 1].user_name[0] = '\0'; + ++ client[clientp - 1].host_name[0] = '\0'; ++ clientp--; ++} + + /** サーバをイニシャライズする **/ + static void +-daemon_init (void) /* initialize Daemon */ ++daemon_init(void) /* initialize Daemon */ + { +- /* +- signal (SIGHUP, SIG_IGN); +- signal (SIGINT, SIG_IGN); +- signal (SIGQUIT, SIG_IGN); +- */ ++ /* ++ signal (SIGHUP, SIG_IGN); ++ signal (SIGINT, SIG_IGN); ++ signal (SIGQUIT, SIG_IGN); ++ */ + ++ if ((cblk = (struct cmblk *)malloc(max_client * sizeof(struct cmblk))) == NULL) { ++ xerror ("daemon_init: "); ++ } ++ ++ if ((client = (CLIENT *)malloc(max_client * sizeof (CLIENT))) == NULL) { ++ xerror ("daemon_init: "); ++ } ++ ++ SDRAND(time(NULL)); ++ clientp = 0; /* V3.0 */ ++ cur_clp = 0; /* V3.0 */ ++ socket_disc_init(); -- - if ((cblk = (COMS_BLOCK *) malloc (max_client * sizeof (COMS_BLOCK))) == NULL) -+ if ((cblk = (struct cmblk *) malloc (max_client * sizeof(struct cmblk))) == NULL) - { - xerror ("daemon_init: "); - } -@@ -597,17 +569,14 @@ - clientp = 0; /* V3.0 */ - cur_clp = 0; /* V3.0 */ - socket_disc_init (); +- { +- xerror ("daemon_init: "); +- } +- if ((client = (CLIENT *) malloc (max_client * sizeof (CLIENT))) == NULL) +- { +- xerror ("daemon_init: "); +- } +- SDRAND (time (NULL)); +- clientp = 0; /* V3.0 */ +- cur_clp = 0; /* V3.0 */ +- socket_disc_init (); -#ifdef INET6 - if (listen_proto&(PROTO_ALL|PROTO_INET|PROTO_INET6)) - socket_init_in (); @@ -307,62 +794,123 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- - if (listen_proto&(PROTO_ALL|PROTO_INET)) - socket_init_in (); -#endif -+ #ifdef AF_UNIX - if (listen_proto&(PROTO_ALL|PROTO_UN)) +- if (listen_proto&(PROTO_ALL|PROTO_UN)) - socket_init_un (); -#endif /* AF_UNIX */ -+ socket_init_un(&bindex); ++ if (listen_proto & PROTO_UN) ++ socket_init_un(&bindex); +#endif -+ -+ if (listen_proto & (PROTO_ALL|PROTO_INET|PROTO_INET6)) -+ socket_init_in(&bindex); ++ if (listen_proto & (PROTO_INET|PROTO_INET6)) ++ socket_init_in(&bindex); } /** サーバを終わる **/ -@@ -619,8 +588,6 @@ - struct sockaddr_un addr_un; - socklen_t addrlen; +-#ifdef AF_UNIX ++#ifdef AF_UNIX + static void +-daemon_fin_un (int sock_d_un) ++daemon_fin_un(int sock_d_un) + { +- int trueFlag = 1; +- struct sockaddr_un addr_un; +- socklen_t addrlen; ++ int trueFlag = 1; ++ struct sockaddr_un addr_un; ++ socklen_t addrlen; - if (serverNO == 0) - { #ifndef SOLARIS #if defined(FIONBIO) - ioctl (sock_d_un, FIONBIO, &trueFlag); -@@ -628,8 +595,7 @@ +- ioctl (sock_d_un, FIONBIO, &trueFlag); ++ ioctl (sock_d_un, FIONBIO, &trueFlag); + #endif #else /* !SOLARIS */ - fcntl (sock_d_un, F_SETFL, F_UNLCK); +- fcntl (sock_d_un, F_SETFL, F_UNLCK); ++ fcntl (sock_d_un, F_SETFL, F_UNLCK); #endif /* !SOLARIS */ - for (;;) - { +- addrlen = sizeof (addr_un); +- if (accept (sock_d_un, (struct sockaddr *) &addr_un, &addrlen) < 0) +- break; +- /* EWOULDBLOCK EXPECTED, but we don't check */ + for (;;) { - addrlen = sizeof (addr_un); - if (accept (sock_d_un, (struct sockaddr *) &addr_un, &addrlen) < 0) - break; -@@ -638,7 +604,6 @@ - shutdown (sock_d_un, 2); - close (sock_d_un); - } --} ++ addrlen = sizeof (addr_un); ++ if (accept(sock_d_un, ++ (struct sockaddr *)&addr_un, ++ &addrlen) < 0) ++ break; ++ /* EWOULDBLOCK EXPECTED, but we don't check */ + } +- shutdown (sock_d_un, 2); +- close (sock_d_un); +- } ++ shutdown (sock_d_un, 2); ++ close (sock_d_un); + } #endif /* AF_UNIX */ static void -@@ -662,8 +627,7 @@ +-daemon_fin_in (int sock_d_in) ++daemon_fin_in(int sock_d_in) + { +- int trueFlag = 1; +- struct sockaddr_in addr_in; +- socklen_t addrlen; ++ int trueFlag = 1; ++ struct sockaddr_in addr_in; ++ socklen_t addrlen; + #ifdef USE_SETSOCKOPT +- int on = ~0; ++ int on = ~0; + #endif + + #ifndef SOLARIS + #ifdef USE_SETSOCKOPT +- setsockopt (sock_d_in, SOL_SOCKET, SO_NONBLOCK, &on, sizeof (int)); ++ setsockopt(sock_d_in, SOL_SOCKET, SO_NONBLOCK, &on, sizeof(int)); + #else + #if defined(FIONBIO) +- ioctl (sock_d_in, FIONBIO, &trueFlag); ++ ioctl(sock_d_in, FIONBIO, &trueFlag); + #endif + #endif /* USE_SETSOCKOPT */ #else /* !SOLARIS */ - fcntl (sock_d_in, F_SETFL, F_UNLCK); +- fcntl (sock_d_in, F_SETFL, F_UNLCK); ++ fcntl(sock_d_in, F_SETFL, F_UNLCK); #endif /* !SOLARIS */ - for (;;) - { +- addrlen = sizeof (addr_in); +- if (accept (sock_d_in, (struct sockaddr *) &addr_in, &addrlen) < 0) +- break; +- /* EWOULDBLOCK EXPECTED, but we don't check */ +- } +- shutdown (sock_d_in, 2); + for (;;) { - addrlen = sizeof (addr_in); - if (accept (sock_d_in, (struct sockaddr *) &addr_in, &addrlen) < 0) - break; -@@ -680,38 +644,36 @@ ++ addrlen = sizeof(addr_in); ++ if (accept(sock_d_in, ++ (struct sockaddr *)&addr_in, ++ &addrlen) < 0) ++ break; ++ /* EWOULDBLOCK EXPECTED, but we don't check */ ++ } ++ shutdown (sock_d_in, 2); + #ifdef HAVE_CLOSESOCKET +- closesocket (sock_d_in); ++ closesocket (sock_d_in); + #else +- close (sock_d_in); ++ close (sock_d_in); + #endif + } + void daemon_fin (void) { -+ int i; - int fd; +- int fd; -#ifdef AF_UNIX - int sock_d_un = accept_blk[UNIX_ACPT].sd; -#endif /* AF_UNIX */ @@ -370,6 +918,8 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- -#ifdef INET6 - int sock_d_in6 = accept_blk[INET6_ACPT].sd; -#endif ++ int i; ++ int fd; - /* - accept all pending connection from new clients, @@ -380,23 +930,25 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- + switch (accept_blk[i].domain) { #ifdef AF_UNIX - daemon_fin_un (sock_d_un); +-#endif +- daemon_fin_in (sock_d_in); + case AF_UNIX: -+ if (listen_proto & (PROTO_ALL|PROTO_UN)) ++ if (listen_proto & PROTO_UN) + daemon_fin_un(accept_blk[i].sd); + break; - #endif -- daemon_fin_in (sock_d_in); ++#endif + case AF_INET: -+ if (listen_proto & (PROTO_ALL|PROTO_INET)) ++ if (listen_proto & PROTO_INET) + daemon_fin_in(accept_blk[i].sd); + break; #ifdef INET6 - daemon_fin_in (sock_d_in6); +-#endif + case AF_INET6: -+ if (listen_proto & (PROTO_ALL|PROTO_INET6)) ++ if (listen_proto & PROTO_INET6) + daemon_fin_in(accept_blk[i].sd); + break; - #endif ++#endif + default: + break; + } @@ -414,37 +966,423 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- -#endif /* AF_UNIX */ - FD_ISSET (fd, all_socks)) - { +- shutdown (fd, 2); + for (fd = nofile - 1; fd >= 0; fd--) { + if (FD_ISSET(fd, all_socks)) { - shutdown (fd, 2); ++ shutdown (fd, 2); #ifdef HAVE_CLOSESOCKET - closesocket (fd); -@@ -837,10 +799,8 @@ - } - } - } +- closesocket (fd); ++ closesocket (fd); + #else +- close (fd); ++ close (fd); + #endif +- } +- } ++ } ++ } + } + +-/*------*/ ++static unsigned char snd_buf[S_BUF_SIZ]; /** 送信バッファ **/ ++static unsigned char *sp = snd_buf; ++ ++static unsigned char rcv_buf[R_BUF_SIZ]; /** 受信バッファ **/ ++static unsigned char *rbp = rcv_buf; ++static unsigned char *rp = rcv_buf; + +-/** **/ + char * +-gets_cur (char *buffer, size_t buffer_size) ++gets_cur(char *buffer, size_t buffer_size) + { +- char *b; ++ char *b; + +- if (!buffer || !buffer_size) +- return NULL; ++ if (!buffer || !buffer_size) ++ return NULL; + +- b = buffer; ++ b = buffer; + +- while (--buffer_size && (*b = getc_cur ()) != '\0') +- b++; ++ while (--buffer_size && (*b = getc_cur()) != '\0') ++ b++; + +- if (!buffer_size) +- { +- *b = '\0'; +- while (getc_cur () != '\0') +- ; +- } ++ if (!buffer_size) { ++ *b = '\0'; ++ while (getc_cur() != '\0') ++ ; ++ } + +- return buffer; ++ return buffer; + } + + /** **/ + w_char * +-getws_cur (w_char *buffer, size_t buffer_size) ++getws_cur(w_char *buffer, size_t buffer_size) + { +- w_char *b; ++ w_char *b; + +- if (!buffer || !buffer_size) +- return NULL; ++ if (!buffer || !buffer_size) ++ return NULL; + +- b = buffer; ++ b = buffer; + +- while (--buffer_size && (*b = get2_cur ()) != 0) +- b++; ++ while (--buffer_size && (*b = get2_cur ()) != 0) ++ b++; + +- if (!buffer_size) +- { +- *b = 0; +- while (getc_cur () != 0) +- ; +- } +- +- return buffer; ++ if (!buffer_size) { ++ *b = 0; ++ while (getc_cur () != 0) ++ ; ++ } ++ return buffer; + } + + /** カレント・クライアントから2バイト取る **/ + int + get2_cur (void) + { +- int x; +- x = getc_cur (); +- return (x << 8) | getc_cur (); ++ int h; ++ h = getc_cur () << 8; ++ h |= getc_cur (); ++ return h; + } + + /** カレント・クライアントから4バイト取る **/ + int + get4_cur (void) + { +- int x1, x2, x3; +- x1 = getc_cur (); +- x2 = getc_cur (); +- x3 = getc_cur (); +- return (x1 << (8 * 3)) | (x2 << (8 * 2)) | (x3 << (8 * 1)) | getc_cur (); ++ int h; ++ h = getc_cur() << (8*3); ++ h |= getc_cur() << (8*2); ++ h |= getc_cur() << (8*1); ++ h |= getc_cur() << (8*0); ++ return h; + } + + /** カレント・クライアントから1バイト取る **/ + int +-getc_cur (void) ++getc_cur(void) + { +- static int rbp; +- if (rbc <= 0) +- { +- rbc = rcv_1_client (cur_clp); +- rbp = 0; +- } +- rbc--; +- return rcv_buf[rbp++] & 0xFF; ++#if DEBUG_IO ++ fprintf(stderr, "getc_cur: Enter\n"); ++#endif ++ if (rp == rbp) { ++ rcv_1_client(cur_clp); ++ } ++#if DEBUG_IO ++ fprintf(stderr, "getc_cur: [%02x]\n", *rbp & 0xff); ++#endif ++ return *(rbp++) & 0xff; + } + + /** クライアントから1パケット取る **/ + static int +-rcv_1_client (int clp) /* clp=クライアント番号 */ ++rcv_1_client(int clp) /* clp=クライアント番号 */ + { +- int cc = 0; +- while (cc <= 0) +- { +- errno = 0; ++ int n = 0; ++ ++ if (rbp == rp) { ++ rbp = rp = &rcv_buf[0]; ++ } ++ ++ while (rbp == rp) { ++ errno = 0; + #ifdef HAVE_RECV +- cc = recv (cblk[clp].sd, rcv_buf, S_BUF_SIZ, 0); ++ n = recv(cblk[clp].sd, rcv_buf, sizeof(rcv_buf), 0); + #else +- cc = read (cblk[clp].sd, rcv_buf, S_BUF_SIZ); ++ n = read(cblk[clp].sd, rcv_buf, sizeof(rcv_buf)); + #endif +- if (cc <= 0) +- { +- if (ERRNO_CHECK (errno)) +- { +- continue; +- } +- else if (cc == 0) +- { /* client dead */ +- longjmp (client_dead, 666); +- } +- else +- { /* cc == -1 */ +- if (errno != EINTR) +- longjmp (client_dead, 666); +- continue; +- } +- } +- } -#ifdef DEBUG - log_debug ("rcv: clp = %d, sd = %d, cc = %d", clp, cblk[clp].sd, cc); - dmp (rcv_buf, cc); --#endif - return cc; +- log_debug ("rcv: clp = %d, sd = %d, cc = %d", clp, cblk[clp].sd, cc); +- dmp (rcv_buf, cc); ++ if (n <= 0) { ++ if (ERRNO_CHECK (errno)) { ++ continue; ++ } else if (n == 0) { ++ /* client dead */ ++ longjmp(client_dead, 666); ++ } else { ++ /* n == -1 */ ++ if (errno != EINTR) ++ longjmp (client_dead, 666); ++ continue; ++ } ++ } ++ rp += n; ++ log_debug ("rcv: clp=%d, sd=%d, n=%d\n", clp, cblk[clp].sd, n); ++#if DEBUG_IO ++ dmp(rbp, rp - rbp); + #endif +- return cc; ++ } ++ ++ return n; } -@@ -850,10 +810,9 @@ - int n /* n : number of bytes to send */ ) + /** クライアントへ1パケット送る **/ + static void +-snd_1_client (int clp, /* clp: クライアント番号 */ +- int n /* n : number of bytes to send */ ) ++snd_1_client(int clp, int dummy) { - int cc, x; +- int cc, x; -#ifdef DEBUG - log_debug ("snd: clp = %d, sd = %d", clp, cblk[clp].sd); - dmp (snd_buf, n); --#endif +- log_debug ("snd: clp = %d, sd = %d", clp, cblk[clp].sd); +- dmp (snd_buf, n); ++ unsigned char *bp = snd_buf; ++ int n; ++ size_t total = sp - bp; + - for (cc = 0; cc < n;) - { - errno = 0; -@@ -967,112 +926,111 @@ ++#if DEBUG_IO ++ fprintf(stderr, "snd: clp=%d, sd=%d\n", clp, cblk[clp].sd); ++ dmp(snd_buf, sp - bp); + #endif +- for (cc = 0; cc < n;) +- { +- errno = 0; ++ ++ while (0 < sp - bp && sp <= snd_buf + sizeof(snd_buf)) { ++ errno =0; + #ifdef HAVE_SEND +- x = send (cblk[clp].sd, &snd_buf[cc], n - cc, 0); ++ n = send(cblk[clp].sd, bp, sp - bp, 0); + #else +- x = write (cblk[clp].sd, &snd_buf[cc], n - cc); ++ n = write(cblk[clp].sd, bp, sp - bp); + #endif +- if (x < 0) +- { +- if (ERRNO_CHECK (errno) || errno == EINTR) +- { +- errno = 0; +- continue; +- } +- else +- { /* client dead */ +- longjmp (client_dead, 666); +- } +- } +- cc += x; +- } ++ if (n < 0) { ++ if (ERRNO_CHECK (errno) || errno == EINTR) { ++ continue; ++ } else { ++ /* client dead */ ++ longjmp (client_dead, 666); ++ } ++ } ++ bp += n; ++ } ++ sp = snd_buf; + } + +-/** **/ + void +-puts_cur (char *p) ++puts_cur(char *p) + { +- int c; +- while (c = *p++) +- putc_cur (c); +- putc_cur (0); ++ int c; ++ while(c = *p++) ++ putc_cur(c); ++ putc_cur(0x00); + } + +-/** **/ + void +-puts_n_cur (char *p, int n) ++puts_n_cur(char *p, int n) + { +- int c; +- while ((c = *p++) && --n >= 0) +- putc_cur (c); +- putc_cur (0); ++ int c; ++ while ((c = *p++) && --n >= 0) ++ putc_cur(c); ++ putc_cur(0x00); + } + +-/** **/ + void +-putws_cur (w_char *p) ++putws_cur(w_char *p) + { +- int c; +- while (c = *p++) +- put2_cur (c); +- put2_cur (0); ++ int c; ++ while (c = *p++) ++ put2_cur(c); ++ put2_cur(0x0000); + } + +-/** **/ + void +-putnws_cur (w_char *p, int n) ++putnws_cur(w_char *p, int n) + { +- int c; +- for (; n > 0; n--) +- { +- if ((c = *p++) == 0) +- break; +- put2_cur (c); +- } +- put2_cur (0); ++ unsigned int c; ++ for (; n > 0; n--) { ++ if ((c = *p++) == 0) ++ break; ++ put2_cur(c); ++ } ++ put2_cur(0x0000); + } + +-/** カレント・クライアントへ2バイト送る **/ + void +-put2_cur (int c) ++put2_cur(int c) + { +- putc_cur (c >> (8 * 1)); +- putc_cur (c); ++ putc_cur(c >> (8 * 1)); ++ putc_cur(c); + } + +-/** カレント・クライアントへ4バイト送る **/ + void +-put4_cur (int c) ++put4_cur(int c) + { +- putc_cur (c >> (8 * 3)); +- putc_cur (c >> (8 * 2)); +- putc_cur (c >> (8 * 1)); +- putc_cur (c); ++ putc_cur(c >> (8 * 3)); ++ putc_cur(c >> (8 * 2)); ++ putc_cur(c >> (8 * 1)); ++ putc_cur(c); + } - /** ソケットのイニシャライズ **/ +-/** カレント・クライアントへ1バイト送る **/ + void +-putc_cur (int c) ++putc_cur(int c) + { +- snd_buf[sbp++] = c; +- if (sbp >= R_BUF_SIZ) +- { +- snd_1_client (cur_clp, R_BUF_SIZ); +- sbp = 0; +- } ++#if DEBUG_IO ++ fprintf(stderr, "putc_cur: Enter\n"); ++#endif ++ if (snd_buf + sizeof(snd_buf) <= sp) ++ putc_purge(); ++ ++#if DEBUG_IO ++ fprintf(stderr, "putc_cur: [%02x]\n", c & 0xff); ++#endif ++ *(sp++) = c & 0xff; + } + +-/** カレント・クライアントの送信バッファをフラッシュする **/ ++/* flush send buffer */ + void +-putc_purge (void) ++putc_purge(void) + { +- if (sbp != 0) +- { +- snd_1_client (cur_clp, sbp); +- sbp = 0; +- } ++ if (snd_buf < sp) { ++ snd_1_client(cur_clp, 0); ++ } + } + +-/*-----*/ +- +-/** ソケットのイニシャライズ **/ ++/* initialize sockets */ #ifdef AF_UNIX +#if !defined(SUN_LEN) +# define SUN_LEN(su) (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path)) @@ -454,52 +1392,65 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- -socket_init_un (void) +socket_init_un(int *index) { - struct sockaddr_un saddr_un; - int sock_d_un; +- struct sockaddr_un saddr_un; +- int sock_d_un; - if (serverNO == 0) - { -+ - saddr_un.sun_family = AF_UNIX; +- saddr_un.sun_family = AF_UNIX; - unlink (sockname); - strcpy (saddr_un.sun_path, sockname); - if ((sock_d_un = socket (AF_UNIX, SOCK_STREAM, 0)) == ERROR) - { +- xerror ("could not create unix domain socket"); +- } +- if (bind (sock_d_un, (struct sockaddr *) &saddr_un, strlen (saddr_un.sun_path) + 2) == ERROR) +- { +- shutdown (sock_d_un, 2); +- xerror ("could not bind unix domain socket"); ++ struct sockaddr_un saddr_un; ++ int sock_d_un; ++ ++ saddr_un.sun_family = AF_UNIX; + strncpy(saddr_un.sun_path, sockname, sizeof(saddr_un.sun_path) - 1); + saddr_un.sun_path[sizeof(saddr_un.sun_path) - 1] = '\0'; + + unlink(saddr_un.sun_path); + + if ((sock_d_un = socket(saddr_un.sun_family, SOCK_STREAM, 0)) == ERROR) - xerror ("could not create unix domain socket"); -- } -- if (bind (sock_d_un, (struct sockaddr *) &saddr_un, strlen (saddr_un.sun_path) + 2) == ERROR) -- { ++ xerror("could not create unix domain socket"); + -+ if (bind(sock_d_un, (struct sockaddr *)&saddr_un, SUN_LEN(&saddr_un)) == ERROR) { - shutdown (sock_d_un, 2); - xerror ("could not bind unix domain socket"); ++ if (bind(sock_d_un, ++ (struct sockaddr *)&saddr_un, ++ SUN_LEN(&saddr_un)) == ERROR) { ++ shutdown (sock_d_un, 2); ++ xerror("could not bind unix domain socket"); } - if (listen (sock_d_un, 5) == ERROR) - { +- shutdown (sock_d_un, 2); +- xerror ("could not listen unix domain socket"); + + if (listen(sock_d_un, 5) == ERROR) { - shutdown (sock_d_un, 2); - xerror ("could not listen unix domain socket"); ++ shutdown (sock_d_un, 2); ++ xerror("could not listen unix domain socket"); } -+ - chmod (sockname, 0777); - signal (SIGPIPE, SIG_IGN); +- chmod (sockname, 0777); +- signal (SIGPIPE, SIG_IGN); -#ifdef DEBUG - log_debug ("sock_d_un = %d", sock_d_un); -#endif - accept_blk[UNIX_ACPT].sd = sock_d_un; -+ log_debug ("sock_d_un = %d (bindex=%d)", sock_d_un, *index); +- FD_SET (sock_d_un, all_socks); +- } ++ ++ chmod(sockname, 0777); ++ signal(SIGPIPE, SIG_IGN); ++ log_debug("sock_d_un = %d (bindex=%d)", sock_d_un, *index); + accept_blk[(*index)].sd = sock_d_un; + accept_blk[(*index)].domain = saddr_un.sun_family; + (*index)++; - FD_SET (sock_d_un, all_socks); - } --} ++ FD_SET (sock_d_un, all_socks); + } #endif /* AF_UNIX */ /* Inet V3.0 */ @@ -509,27 +1460,28 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- { + int i; #ifndef SOLARIS - int on = 1; +- int on = 1; ++ int on = 1; #else /* SOLARIS */ - int on = 0; +- int on = 0; ++ int on = 0; #endif /* SOLARIS */ +- struct servent *sp; + - struct servent *sp; ++ struct servent *sp; #if !defined(SO_DONTLINGER) && defined(SO_LINGER) - struct linger linger; +- struct linger linger; ++ struct linger linger; #endif -#ifdef INET6 - struct addrinfo hints, *res, *res0; -+ struct sockaddr sa; - int error; +- struct addrinfo hints, *res, *res0; +- int error; - char sport[6]; -#else - struct sockaddr_in saddr_in; -#endif -+ char hbuf[NI_MAXHOST]; -+ char sbuf[NI_MAXSERV]; - int sock_d_in; - +- int sock_d_in; +- - if (port < 0) - { - if ((sp = getservbyname (SERVERNAME, "tcp")) == NULL) @@ -540,49 +1492,54 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- - { - port = ntohs (sp->s_port); - } +- } ++ struct addrinfo hints, *res, *res0; ++ struct sockaddr sa; ++ int error; ++ char hbuf[NI_MAXHOST]; ++ char sbuf[NI_MAXSERV]; ++ int sock_d_in; ++ + memset(&sa, 0, sizeof(struct sockaddr)); + if (port < 0) { + strncpy(sbuf, SERVERNAME, sizeof(sbuf) - 1); + sbuf[sizeof(sbuf) - 1] = '\0'; -+ error = getnameinfo(&sa, sa.sa_len, NULL, 0, sbuf, sizeof(sbuf), NI_NUMERICSERV); ++ error = getnameinfo(&sa, ++ sa.sa_len, ++ NULL, ++ 0, ++ sbuf, ++ sizeof(sbuf), ++ NI_NUMERICSERV); + if (error) + sprintf(sbuf, "%d", WNN_PORT_IN); + } else { + sprintf(sbuf, "%d", port); - } ++ } - port += serverNO; +- port += serverNO; ++ port += serverNO; -#if DEBUG - log_debug ("port=%x", port); -#endif -#ifdef INET6 - memset(&hints, 0, sizeof(hints)); +- memset(&hints, 0, sizeof(hints)); - if (listen_proto&PROTO_INET && !(listen_proto&PROTO_INET6)) -+ if (listen_proto & PROTO_ALL || listen_proto & (PROTO_INET|PROTO_INET6)) -+ hints.ai_family = PF_UNSPEC; -+ else if (listen_proto & PROTO_INET) - hints.ai_family = PF_INET; +- hints.ai_family = PF_INET; - else if (listen_proto&PROTO_INET6 && !(listen_proto&PROTO_INET)) -+ else if (listen_proto & PROTO_INET6) - hints.ai_family = PF_INET6; +- hints.ai_family = PF_INET6; - else - hints.ai_family = PF_UNSPEC; -+ - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_PASSIVE; +- hints.ai_socktype = SOCK_STREAM; +- hints.ai_flags = AI_PASSIVE; - sprintf(sport, "%d", port); - error = getaddrinfo(NULL, sport, &hints, &res0); - if (error) - { - xerror (gai_strerror(error)); - } -+ -+ for (i = 0; i < MAXLISTENADDR && listenaddr[i][0] != '\0'; i++) { -+ if (error = getaddrinfo(listenaddr[i], sbuf, &hints, &res0)) -+ xerror((char *)gai_strerror(error)); -+ - for (res = res0; res; res = res->ai_next) { +- for (res = res0; res; res = res->ai_next) { - if (res->ai_family == AF_INET || res->ai_family == AF_INET6){ - if ((sock_d_in = socket (res->ai_family, res->ai_socktype, res->ai_protocol)) == ERROR) -#else @@ -592,30 +1549,69 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- - if ((sock_d_in = socket (AF_INET, SOCK_STREAM, 0)) == ERROR) -#endif - { --#ifdef INET6 -- if (res->ai_family == AF_INET6) -- xerror ("could not create inet6 socket"); -- else if (res->ai_family == AF_INET) -+ log_debug("socket: try %s : %s (type=%d)", listenaddr[i], sbuf, res->ai_family); ++ memset(&hints, 0, sizeof(hints)); ++ if (listen_proto & PROTO_INET ++ || listen_proto & PROTO_INET6) ++ hints.ai_family = PF_UNSPEC; ++ hints.ai_socktype = SOCK_STREAM; ++ hints.ai_flags = AI_PASSIVE; ++ ++ for (i = 0; i < MAXLISTENADDR && listenaddr[i][0] != '\0'; i++) { ++ log_debug("getaddrinfo: try %s",listenaddr[i]); ++ ++ if (error = getaddrinfo(listenaddr[i], sbuf, &hints, &res0)) ++ xerror((char *)gai_strerror(error)); ++ ++ for (res = res0; res; res = res->ai_next) { ++ log_debug("socket: try %s : %s (type=%d)", ++ listenaddr[i], sbuf, res->ai_family); + + switch (res->ai_family) { + case AF_INET: -+ sock_d_in = socket(res->ai_family, res->ai_socktype, res->ai_protocol); ++ if (!(listen_proto & PROTO_INET)) { ++ log_debug("socket: ignore %s\n", listenaddr[i]); ++ continue; ++ } ++ sock_d_in = socket(res->ai_family, ++ res->ai_socktype, ++ res->ai_protocol); + if (sock_d_in == -1) -+ xerror("could not create inet/inet6 socket"); ++ xerror("could not create inet socket"); + break; + #ifdef INET6 +- if (res->ai_family == AF_INET6) +- xerror ("could not create inet6 socket"); +- else if (res->ai_family == AF_INET) + case AF_INET6: -+ sock_d_in = socket(res->ai_family, res->ai_socktype, res->ai_protocol); ++ if (!(listen_proto & PROTO_INET6)) { ++ log_debug("socket: ignore %s\n", listenaddr[i]); ++ continue; ++ } ++ sock_d_in = socket(res->ai_family, ++ res->ai_socktype, ++ res->ai_protocol); + if (sock_d_in == -1) -+ xerror("could not create inet/inet6 socket"); ++ xerror("could not create inet6 socket"); +#ifdef IPV6_V6ONLY + setsockopt(sock_d_in, IPPROTO_IPV6, IPV6_V6ONLY, NULL, 0); #endif - xerror ("could not create inet socket"); - } - setsockopt (sock_d_in, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (int)); +- } +- setsockopt (sock_d_in, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (int)); ++#endif /* INET6 */ ++ } ++ setsockopt (sock_d_in, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (int)); #ifdef SO_DONTLINGER -@@ -1085,69 +1043,31 @@ +- setsockopt (sock_d_in, SOL_SOCKET, SO_DONTLINGER, (char *) 0, 0); ++ setsockopt (sock_d_in, SOL_SOCKET, SO_DONTLINGER, (char *) 0, 0); + #else + # ifdef SO_LINGER +- linger.l_onoff = 0; +- linger.l_linger = 0; +- setsockopt (sock_d_in, SOL_SOCKET, SO_LINGER, (char *) &linger, sizeof linger); ++ linger.l_onoff = 0; ++ linger.l_linger = 0; ++ setsockopt(sock_d_in, SOL_SOCKET, SO_LINGER, (char *) &linger, sizeof linger); # endif /* SO_LINGER */ #endif /* SO_DONTLINGER */ @@ -625,56 +1621,67 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- - if (bind (sock_d_in, (struct sockaddr *) &saddr_in, sizeof (saddr_in)) == ERROR) -#endif - { -+ if (bind(sock_d_in, res->ai_addr, res->ai_addrlen) == ERROR) { - shutdown (sock_d_in, 2); +- shutdown (sock_d_in, 2); -#ifdef INET6 - if (res->ai_family == AF_INET6) - xerror ("can't bind inet6 socket"); - else if (res->ai_family == AF_INET) -#endif - xerror ("can't bind inet socket"); -+ xerror("could not bind inet/inet6 socket"); - } +- } - if (listen (sock_d_in, 5) == ERROR) - { -+ -+ if (listen(sock_d_in, 5) == ERROR) { - shutdown (sock_d_in, 2); +- shutdown (sock_d_in, 2); -#ifdef INET6 - if (res->ai_family == AF_INET6) - xerror ("can't listen inet6 socket"); - else if (res->ai_family == AF_INET) -#endif - xerror ("can't listen inet socket"); -+ xerror("could not listen inet/inet6 socket"); - } +- } -#if DEBUG - log_debug ("sock_d_in = %d", sock_d_in); -#endif -+ log_debug("sock_d_in = %d (bindex=%d)", sock_d_in, *index); - FD_SET (sock_d_in, all_socks); +- FD_SET (sock_d_in, all_socks); -#ifdef INET6 - if (res->ai_family == AF_INET) - accept_blk[INET_ACPT].sd = sock_d_in; - else if (res->ai_family == AF_INET6) - accept_blk[INET6_ACPT].sd = sock_d_in; -+ accept_blk[(*index)].sd = sock_d_in; -+ accept_blk[(*index)].domain = res->ai_family; -+ (*index)++; - } - } - freeaddrinfo(res0); +- } +- } +- freeaddrinfo(res0); -#else - accept_blk[INET_ACPT].sd = sock_d_in; -#endif ++ if (bind(sock_d_in, res->ai_addr, res->ai_addrlen) == ERROR) { ++ shutdown (sock_d_in, 2); ++ xerror("could not bind inet/inet6 socket"); ++ } ++ ++ if (listen(sock_d_in, 5) == ERROR) { ++ shutdown (sock_d_in, 2); ++ xerror("could not listen inet/inet6 socket"); ++ } ++ ++ log_debug("sock_d_in = %d (bindex=%d)", ++ sock_d_in, *index); ++ FD_SET(sock_d_in, all_socks); ++ accept_blk[(*index)].sd = sock_d_in; ++ accept_blk[(*index)].domain = res->ai_family; ++ (*index)++; ++ } ++ } ++ freeaddrinfo(res0); } - +- /** accept new client socket **/ -#ifdef AF_UNIX --static int + static int -socket_accept_un (void) --{ ++socket_accept(int index) + { - struct sockaddr_un addr; - socklen_t addrlen; - @@ -683,10 +1690,9 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- -} -#endif /* AF_UNIX */ - - static int +-static int -socket_accept_in (int fd) -+socket_accept(int index) - { +-{ - struct sockaddr_in addr; - socklen_t addrlen; - @@ -696,57 +1702,298 @@ diff -d -u -I\$FreeBSD: /tmp/pcvs/ports/japanese/FreeWnn-server/files/patch-Wnn- } static void -@@ -1157,7 +1077,6 @@ - exit (1); +-xerror (char *s) ++xerror(char *s) + { +- log_err ("%s (%s).", s, strerror(errno)); +- exit (1); ++ log_err ("%s (%s).", s, strerror(errno)); ++ exit (1); } -#if DEBUG static void - dmp (char *p, int n) +-dmp (char *p, int n) ++dmp(char *p, int n) { -@@ -1172,13 +1091,13 @@ - fprintf (stderr, "n=%d\n", n); - } +- int i, j; ++ int i, j; + +- for (i = 0; i < n; i += 16) +- { +- for (j = 0; j < 16; j++) +- { +- fprintf (stderr, "%02x ", p[i + j] & 0xFF); +- } +- fprintf (stderr, "n=%d\n", n); +- } ++ for (i = 0; i < n; i += 16) { ++ for (j = 0; j < 16; j++) { ++ fprintf (stderr, "%02x ", p[i + j] & 0xFF); ++ } ++ fprintf (stderr, "n=%d\n", n); ++ } } -#endif static void - get_options (int argc, char **argv) - { - int c; - int digit_optind = 0; -+ int lindex = 0; - - strcpy (jserverrcfile, LIBDIR); /* usr/local/lib/wnn */ - strcat (jserverrcfile, SERVER_INIT_FILE); /* ja_JP/jserverrc */ -@@ -1193,6 +1112,8 @@ - {"inet", 0, NULL, '4'}, - {"inet6", 0, NULL, '6'}, - {"jserverrc", 1, NULL, 'f'}, -+ {"listenaddr", 1, NULL, 'a'}, -+ {"unix", 0, NULL, 'u'}, - {"version", 0, NULL, 'v'}, - {0, 0, 0, 0} - }; -@@ -1209,7 +1130,14 @@ - break; - - case 'f': /* --jserverrc FILENAME */ +-get_options (int argc, char **argv) ++get_options(int argc, char **argv) + { +- int c; +- int digit_optind = 0; +- +- strcpy (jserverrcfile, LIBDIR); /* usr/local/lib/wnn */ +- strcat (jserverrcfile, SERVER_INIT_FILE); /* ja_JP/jserverrc */ ++ int c; ++ int digit_optind = 0; ++ int lindex = 0; + +- while (1) +- { +- int this_option_optind = optind ? optind : 1; +- int option_index = 0; +- static struct option long_options[] = +- { +- {"baseport", 1, NULL, 'p'}, +- {"inet", 0, NULL, '4'}, +- {"inet6", 0, NULL, '6'}, +- {"jserverrc", 1, NULL, 'f'}, +- {"version", 0, NULL, 'v'}, +- {0, 0, 0, 0} +- }; +- +- c = getopt_long (argc, argv, OPTIONARGS, +- long_options, &option_index); +- if (c == -1) +- break; ++ strcpy (jserverrcfile, LIBDIR); /* usr/local/lib/wnn */ ++ strcat (jserverrcfile, SERVER_INIT_FILE); /* ja_JP/jserverrc */ + +- switch (c) ++ while (1) + { +- case 'D': /* do not detach, not a daemon */ +- option_flag &= ~OPT_FORK; +- break; +- +- case 'f': /* --jserverrc FILENAME */ - strcpy (jserverrcfile, optarg); -+ strncpy(jserverrcfile, optarg, sizeof(jserverrcfile) - 1); -+ jserverrcfile[sizeof(jserverrcfile) - 1] = '\0'; -+ break; +- break; +- +- case 's': +- /* should nuke noisy someday */ +- noisy = 1; option_flag |= OPT_VERBOSE; +- if (strcmp ("-", optarg) != 0) +- { +- /** maybe FILE wnnerr = stderr; or wnnerr = open(optarg...) is better? or freopen is normal method? */ +- /** take a look at daemon(3) */ +- if (freopen (optarg, "a", stderr) == NULL) +- { +- /** fprintf to stderr? */ +- printf ("Error in opening scriptfile %s.\n", optarg); +- exit (1); +- } +- } +- log_debug ("script started"); +- break; +- +- case 'h': +- /* var hinsi_file_name polluted */ +- hinsi_file_name = optarg; +- break; +- +- case 'N': +- serverNO = atoi (optarg); +- /* error handling needed */ +- break; +- +- case 'p': +- port = atoi (optarg); +- /* error handling needed */ +- break; +- +- case 'v': +- print_version(); +- usage(); +- break; +- +- case 'u': +- listen_proto &= ~PROTO_ALL; +- listen_proto |= PROTO_UN; +- break; +- +- case '4': +- listen_proto &= ~PROTO_ALL; +- listen_proto |= PROTO_INET; +- break; ++ int this_option_optind = optind ? optind : 1; ++ int option_index = 0; ++ static struct option long_options[] = ++ { ++ {"baseport", 1, NULL, 'p'}, ++ {"inet", 0, NULL, '4'}, ++ {"inet6", 0, NULL, '6'}, ++ {"jserverrc", 1, NULL, 'f'}, ++ {"listenaddr", 1, NULL, 'a'}, ++ {"unix", 0, NULL, 'u'}, ++ {"version", 0, NULL, 'v'}, ++ {0, 0, 0, 0} ++ }; ++ ++ c = getopt_long (argc, argv, OPTIONARGS, ++ long_options, &option_index); ++ if (c == -1) ++ break; ++ ++ switch (c) ++ { ++ case 'D': /* do not detach, not a daemon */ ++ option_flag &= ~OPT_FORK; ++ break; ++ ++ case 'f': /* --jserverrc FILENAME */ ++ strncpy(jserverrcfile, optarg, sizeof(jserverrcfile) - 1); ++ jserverrcfile[sizeof(jserverrcfile) - 1] = '\0'; ++ break; ++ ++ case 'a': /* --listenaddr ADDR */ ++ strncpy(listenaddr[lindex], optarg, NI_MAXHOST - 1); ++ listenaddr[lindex][NI_MAXHOST - 1] = '\0'; ++ lindex++; ++ break; ++ ++ case 's': ++ /* should nuke noisy someday */ ++ noisy = 1; option_flag |= OPT_VERBOSE; ++ if (strcmp ("-", optarg) != 0) ++ { ++ /** maybe FILE wnnerr = stderr; or wnnerr = open(optarg...) is better? or freopen is normal method? */ ++ /** take a look at daemon(3) */ ++ if (freopen (optarg, "a", stderr) == NULL) ++ { ++ /** fprintf to stderr? */ ++ printf ("Error in opening scriptfile %s.\n", optarg); ++ exit (1); ++ } ++ } ++ log_debug ("script started"); ++ break; ++ ++ case 'h': ++ /* var hinsi_file_name polluted */ ++ hinsi_file_name = optarg; ++ break; ++ ++ case 'N': ++ serverNO = atoi (optarg); ++ /* error handling needed */ ++ break; ++ ++ case 'p': ++ port = atoi (optarg); ++ /* error handling needed */ ++ break; ++ ++ case 'v': ++ print_version(); ++ usage(); ++ break; + -+ case 'a': /* --listenaddr ADDR */ -+ strncpy(listenaddr[lindex], optarg, NI_MAXHOST - 1); -+ listenaddr[lindex][NI_MAXHOST - 1] = '\0'; -+ lindex++; - break; ++ case 'u': ++ listen_proto |= PROTO_UN; ++ break; ++ ++ case '4': ++ listen_proto |= PROTO_INET; ++ break; + + #ifdef INET6 +- case '6': +- listen_proto &= ~PROTO_ALL; +- listen_proto |= PROTO_INET6; +- break; ++ case '6': ++ listen_proto |= PROTO_INET6; ++ break; + #endif /* INET6 */ +- +- default: +- print_version(); +- usage(); +- break; ++ default: ++ print_version(); ++ usage(); ++ break; ++ } ++ } ++ if (!listen_proto) { ++ listen_proto = PROTO_ALL; + } +- } + } + + +-/* +-*/ + void + js_who (void) + { +- int i, j; ++ int i, j; - case 's': -@@ -1318,9 +1246,9 @@ +- put4_cur (clientp); +- for (i = 0; i < clientp; i++) +- { +- put4_cur (cblk[i].sd); +- puts_cur (client[i].user_name); +- puts_cur (client[i].host_name); +- for (j = 0; j < WNN_MAX_ENV_OF_A_CLIENT; j++) +- { +- put4_cur ((client[i].env)[j]); +- } ++ put4_cur (clientp); ++ for (i = 0; i < clientp; i++) ++ { ++ put4_cur (cblk[i].sd); ++ puts_cur (client[i].user_name); ++ puts_cur (client[i].host_name); ++ for (j = 0; j < WNN_MAX_ENV_OF_A_CLIENT; j++) ++ { ++ put4_cur ((client[i].env)[j]); ++ } + +- } +- putc_purge (); ++ } ++ putc_purge(); + } + + void +@@ -1302,25 +1230,25 @@ js_kill (void) + { + if (clientp == 1) + { +- put4_cur (0); +- putc_purge (); ++ put4_cur(0x00000000); ++ putc_purge(); + terminate_hand (); + } + else + { + put4_cur (clientp - 1); +- putc_purge (); ++ putc_purge(); + } + } + + void + usage (void) { - fprintf(stderr, +- fprintf(stderr, ++ fprintf(stderr, #ifdef INET6 - "usage: %s [-Du46][-f <init_file> -s <log_file(\"-\" for stderr)> -h <pos_file> -N <serverNO> -p <port_base>]\n", + "usage: %s [-Du46][-f <init_file> -a <listenaddr> -s <log_file(\"-\" for stderr)> -h <pos_file> -N <serverNO> -p <port_base>]\n", |