diff -urN skkinput-2.03/dot.skkinput skkinput-2.03.v6/dot.skkinput --- skkinput-2.03/dot.skkinput Wed Nov 26 20:28:31 1997 +++ skkinput-2.03.v6/dot.skkinput Tue Sep 11 06:37:44 2001 @@ -4,7 +4,7 @@ ; skkserv の起きているホスト名を指定します. skk-server-host: "localhost" ; skkserv と TCP/IP で通信する際に用いるポート番号. -skk-port-num: 1178 +skk-port-num: "1178" ; skkinput ユーザ辞書のパスを指定します. skkinput-jisyo: "~/.skkinput-jisyo" ; skkinput ユーザ辞書のバックアップのパスを指定します. diff -urN skkinput-2.03/main.c skkinput-2.03.v6/main.c --- skkinput-2.03/main.c Mon Mar 23 15:05:22 1998 +++ skkinput-2.03.v6/main.c Tue Sep 11 06:44:27 2001 @@ -110,7 +110,7 @@ extern void initHenkanKakuteiHashTable( void ) ; extern void clearHenkanKakuteiHash( void ) ; /* skksoc.c */ -extern int skkinput_StartCommunication( char *server_name, int port_num ) ; +extern int skkinput_StartCommunication( char *server_name, char *port_num ) ; extern int skkinput_CloseCommunication( void ) ; /* skkldic.c */ extern int set_localjisyo @@ -196,7 +196,7 @@ */ /* その他、skkinput が必要とする…skkInputWidget 毎には必要としない情報。*/ char *skkserv_host ; -int skkserv_portnum ; +char *skkserv_portnum = NULL; char *skkinput_local_jisyo_name ; char *skkinput_backup_jisyo_name ; char *skk_local_jisyo_name ; @@ -698,7 +698,8 @@ break ; /* skkserv と通信するに利用するポート番号を設定する。*/ case OPTION_PORT : - skkserv_portnum = atoi( argv[ i ] ) ; + if (skkserv_portnum) free (skkserv_portnum); + skkserv_portnum = strdup( argv[ i ] ) ; break ; /* 局所辞書の名前を設定する。*/ case OPTION_USERDIC : diff -urN skkinput-2.03/skkconfig.c skkinput-2.03.v6/skkconfig.c --- skkinput-2.03/skkconfig.c Thu Nov 13 22:42:43 1997 +++ skkinput-2.03.v6/skkconfig.c Tue Sep 11 06:31:22 2001 @@ -194,7 +194,7 @@ */ SkkInpDef skkinput_initdef[] = { { "skk-port-num:", - PARAM_INTEGER, &skkserv_portnum }, + PARAM_STRING, &skkserv_portnum }, { "skk-server-host:", PARAM_STRING, &skkserv_host }, { "skkinput-jisyo:", @@ -998,10 +998,10 @@ servent = getservbyname( SKKSERV_SERVICE_NAME, SKKSERV_SERVICE_PROTO ) ; if( servent == NULL ){ /* /etc/services に設定はなかったので、config.h の中のを使う。*/ - skkserv_portnum = atoi( DEFAULT_SKKPORT ) ; + skkserv_portnum = strdup ( DEFAULT_SKKPORT ); } else { /* /etc/services に設定があった…。*/ - skkserv_portnum = htons( servent->s_port ) ; + skkserv_portnum = strdup ( servent->s_name ); #if defined(DEBUG) fprintf ( stderr, "getservbyname: \"%s\", %d\n", diff -urN skkinput-2.03/skksoc.c skkinput-2.03.v6/skksoc.c --- skkinput-2.03/skksoc.c Thu Oct 30 13:40:59 1997 +++ skkinput-2.03.v6/skksoc.c Tue Sep 11 06:36:34 2001 @@ -51,14 +51,10 @@ } ; extern char *skkserv_host ; -extern int skkserv_portnum ; +extern char *skkserv_portnum ; /* skkserv とお話する際のバッファ。*/ static struct MessageBuffer mesbuf ; -/* SKK server の情報。*/ -struct sockaddr_in server ; -/* SKK server の Host の情報。*/ -static struct hostent *host ; /* skkserv をお話するのに利用する socket */ static int skkserv_soc ; /* skkserv とのお話に使えるファイルポインタ。*/ @@ -80,59 +76,6 @@ ( struct MessageBuffer *buf, struct myChar *string ) ; /* - * ソケットを作成する関数。 - *------------ - * server の名前が与えられると、そこに対しての socket を作成しよう - * と試みる。 - */ -static int makeSocket( char *server_name, int port_num ) -{ - struct protoent *proto; - /* Protocol の設定。*/ - if( ( proto = getprotobyname( "tcp" ) ) == NULL ){ - return 1 ; - } - /* ソケットの生成 */ - if( ( skkserv_soc = socket( AF_INET, SOCK_STREAM, proto->p_proto ) ) < 0 ){ - fprintf( stderr, "Cannot make socket.\n" ) ; - return 1 ; - } - /* サーバの情報を取り出す。*/ -#ifdef HAVE_BZERO - bzero( ( char *)&server, sizeof( server ) ) ; -#else - memset( ( char *)&server, 0, sizeof( server ) ) ; -#endif - server.sin_family = AF_INET ; - if( ( host = gethostbyname( server_name ) ) == NULL ){ - shutdown( skkserv_soc, 2 ) ; - close( skkserv_soc ) ; - fprintf( stderr, "%s: Unknown host.\n", server_name ) ; - return 1 ; - } -#ifdef HAVE_BCOPY - bcopy( host->h_addr, &server.sin_addr, host->h_length ) ; -#else - memcpy( &server.sin_addr, host->h_addr, host->h_length ) ; -#endif - server.sin_port = htons( port_num ) ; - - read_skkserv_fp = fdopen( skkserv_soc, "r" ) ; - write_skkserv_fp = fdopen( skkserv_soc, "w" ) ; - - /* fdopen に失敗したら… */ - if( read_skkserv_fp == NULL || write_skkserv_fp == NULL ){ - if( read_skkserv_fp != NULL ) - fclose( read_skkserv_fp ) ; - if( write_skkserv_fp != NULL ) - fclose( write_skkserv_fp ) ; - read_skkserv_fp = write_skkserv_fp = NULL ; - return 1 ; - } - return 0 ; -} - -/* * skkserv に message を送信する関数。 */ static int send_to_server( int funcno, struct myChar *string ) @@ -294,26 +237,55 @@ * socket を用意し、skkerv に接続する関数。 *---- */ -int skkinput_StartCommunication( char *server_name, int port_num ) +int skkinput_StartCommunication( char *server_name, char *port_num ) { - /* skkerv と通信するためのソケットを作成致します。*/ - if( makeSocket( server_name, port_num ) ){ - fprintf( stderr, "Warning : cannot make a socket." ) ; - skkserv_connection_ok = False ; - return 1 ; + struct addrinfo hints, *res, *res0; + memset (&hints, 0, sizeof (hints)); + hints.ai_socktype = SOCK_STREAM; + + if (getaddrinfo (server_name, port_num, &hints, &res0)) { + fprintf ( stderr, "Warning : cannot make a socket." ); + skkserv_connection_ok = False ; + return 1; + } + + for (res = res0; res; res = res->ai_next) { + skkserv_soc = socket (res->ai_family, res->ai_socktype, 0); + if (skkserv_soc < 0) continue; + if (connect (skkserv_soc, (struct sockaddr *) res->ai_addr, + res->ai_addrlen) < 0) + { + perror ("connect"); + fprintf (stderr, "Warning : cannot connect SKK server."); + shutdown (skkserv_soc, 2); + close (skkserv_soc); + skkserv_connection_ok = False; + continue; + } + else { + skkserv_connection_ok = True; + break; + } + } + if (skkserv_soc < 0) { + fprintf (stderr, "Warning: cannot make a socket."); + skkserv_connection_ok = False; + return 1; } - /* 接続要求。*/ - if( connect( skkserv_soc, - ( struct sockaddr *)&server, sizeof( server ) ) < 0 ){ - perror( "connect" ) ; - fprintf( stderr, "Warning : cannot connect SKK server." ) ; - shutdown( skkserv_soc, 2 ) ; - close( skkserv_soc ) ; - skkserv_connection_ok = False ; - return 1 ; + + read_skkserv_fp = fdopen( skkserv_soc, "r" ) ; + write_skkserv_fp = fdopen( skkserv_soc, "w" ) ; + + /* fdopen に失敗したら… */ + if( read_skkserv_fp == NULL || write_skkserv_fp == NULL ){ + if( read_skkserv_fp != NULL ) + fclose( read_skkserv_fp ) ; + if( write_skkserv_fp != NULL ) + fclose( write_skkserv_fp ) ; + read_skkserv_fp = write_skkserv_fp = NULL ; + return 1 ; } - skkserv_connection_ok = True ; - return 0 ; + return 0; } /*