突然消失するかもしれないブログ

”とつきえブログ”

stoneをLinuxでコンパイルする

LinuxでTCP & UDPリピータが必要だったのでstone version 2.3e(stone-2.3e.tar.gz)をコンパイルしてインストールしようとしたら、以下のようなコンパイルエラーが出てしまいました。

http://www.gcd.org/sengoku/stone/Welcome.ja.html

$ make linux

stone.c:4509: error: dereferencing pointer to incomplete type
stone.c:4524: error: dereferencing pointer to incomplete type
stone.c:4536: error: dereferencing pointer to incomplete type
stone.c:4551: error: dereferencing pointer to incomplete type
stone.c:4557: error: dereferencing pointer to incomplete type

stone.cのソースコードを見ると、以下のような記述があり、原因を調べてみたところ、struct ucredの定義が解決出来ないのが原因です。

struct ucred *cred = NULL;

socklen_t optlen = sizeof(*cred);

解決方法としては、Makefileの以下の記述部分に、-D_GNU_SOURCEを追加することで正常にコンパイルできるようになりました。

linux:
        $(MAKE) FLAGS="-O -Wall -DCPP=’\"/usr/bin/cpp -traditional\"’ -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL
_DST=80 -DUSE_EPOLL –D_GNU_SOURCE $(FLAGS)" LIBS="-lpthread $(LIBS)" stone

makeで指定するオプションには、linux以外にもlinux-sslなど他のオプションもありますので、必要に応じて上記の定義を追加すればOKです。

glibc 2.8以降では、_GNU_SOURCEを定義しないと、struct ucredが定義されないんですね。

Debian Squeezeで導入されているglibcは、2.9-25なので上記に該当しています。Ubuntu 9.0.4も上記に該当します。

Debian Squeezeの場合

ii  libc6                             2.9-25                     GNU C Library: Shared libraries

Ubuntu 9.0.4の場合

ii  libc6                                      2.9-4ubuntu6.1                            GNU C Library: Shared libr
aries

 

<参考>

http://www.linux.or.jp/JM/html/LDP_man-pages/man7/unix.7.html

SCM_CREDENTIALS
    Unix 信任状を送受信する。これは認証に用いることができる。信任状は、 struct ucred の補助メッセージとして渡される。この構造体は <sys/socket.h> で以下のように定義されている。

    struct ucred {
        pid_t pid;    /* process ID of the sending process */
        uid_t uid;    /* user ID of the sending process */
        gid_t gid;    /* group ID of the sending process */
    };

    glibc 2.8 以降では、この構造体の定義を得るためには機能検査マクロ _GNU_SOURCE を定義しなければならない。

広告

stoneをLinuxでコンパイルする」への1件のフィードバック

  1. ピンバック:stoneを使ってIRCのSSL暗号化を行う | シーズクリエイターズブログ

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。