KIHARA Hideto
deton****@m1*****
2003年 10月 25日 (土) 14:39:56 JST
NetBSD/hpcarm 1.6UやFreeBSD/i386 4.6.2-RELEASEで uim-0.1.2のtest.shを実行すると、端末に failed in listen(): Invalid argument というメッセージが何回か表示されます。 $LOGNAMEはdetonなのですが、/tmpを見ると、ソケットは /tmp/uimhelper-deto となっていて、最後の一文字が欠けています。 uim-helper-server.c:init_serv_fd()のbind()を呼んでいる部分で、 SUN_LEN()を使うように変更するとこの現象は出なくなりました。 パッチを最後に付けます。 FreeBSD 4.6.2-RELEASEでは sockaddr_un構造体の定義が以下のようになっています。 struct sockaddr_un { u_char sun_len; /* sockaddr len including null */ u_char sun_family; /* AF_UNIX */ char sun_path[104]; /* path name (gag) */ }; SUN_LEN()はsys/un.hで以下のように#defineされています。 #define SUN_LEN(su) \ (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path)) Solaris 7や8ではsockaddr_un構造体にはsun_lenが無く、 SUN_LEN()は#defineされていないようです。 参考: 『UNIXネットワークプログラミング 第2版 Vol.1 ネットワークAPI: ソケットとXTI』 W.リチャード・スティーヴンス, 篠田陽一訳, トッパン, 1999, p.364 # 私はGNOMEは使ってないので、helper-appletも使えないため、 # uim-helper-serverが動かなくても全然困りませんが。 --- uim-0.1.2/uim/uim-helper-server.c.orig 2003-10-11 01:58:16.000000000 +0900 +++ uim-0.1.2/uim/uim-helper-server.c 2003-10-25 14:06:01.000000000 +0900 @@ -40,7 +40,11 @@ static int init_serv_fd(char *path) myhost.sun_family = PF_UNIX; strcpy(myhost.sun_path, path); - foo = bind(fd,(struct sockaddr *)&myhost,sizeof(myhost.sun_family) + strlen(path)); +#ifndef SUN_LEN +#define SUN_LEN(su) \ + (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path)) +#endif + foo = bind(fd,(struct sockaddr *)&myhost,SUN_LEN(&myhost)); if(foo < -1){ perror("failed in bind()"); return -1;