ports/net/stone が build できない

ports/net/stoneが最近のFreeBSDでbuildできない。

調べてみると、FreeBSD 12からOpenSSLが1.1に上がった関係で壊れたようだ。原因はいくつかあって、 1つはOpenSSL 1.1ではSSLv2対応が削除されているので-DOPENSSL_NO_SSL2を定義する必要がある。

もう1つはOpenSSL 1.0までは /usr/include/openssl/ssl.hの中で

struct ssl_session_st {
  int ssl_version;
  unsigned int key_arg_length;

などとssl_session_stの構造体のメンバが定義されているが、OpenSSL 1.1以降ではこれがなくなっている。 stone.c 2455行付近の

            if (Debug > 2) {
                char str[SSL_MAX_SSL_SESSION_ID_LENGTH * 2 + 1];
                int len = sess->session_id_length;
                int i;
                if (len > SSL_MAX_SSL_SESSION_ID_LENGTH)
                    len = SSL_MAX_SSL_SESSION_ID_LENGTH;
                for (i=0; i < len; i++)
                    sprintf(&str[i*2], "%02x", sess->session_id[i]);
                str[i*2] = '\0';
                message(LOG_DEBUG, "%d TCP %d: SSL session ID=%s len=%d",
                        p2->stone->sd, p2->sd, str, sess->session_id_length);
            }

で構造体のメンバsession_id_lengthを参照しようとしているのでエラーになっている。ここは 構造体のメンバを直接参照するのではなく、SSL_SESSION_get_id() を使うように書き換えればいいはず。 単純に動かすだけなら、この部分全体をコメントアウトしても大丈夫(デバッグメッセージを出力 する部分なので)。

最後の一つは3270行付近、

    if (Debug > 7)
        message(LOG_DEBUG, "%d TCP %d: SSL_accept ret=%d, state=%x, "
                "finished=%x, in_init=%x/%x", pair->stone->sd,
                sd, ret, SSL_state(ssl), SSL_is_init_finished(ssl),
                SSL_in_init(ssl), SSL_in_accept_init(ssl));

SSL_state()が使われているので、これはSSL_get_state()に書き換える必要がある。 面倒であればこちらもこの部分全体をコメントアウトするだけでいい。

という感じに修正すると手元では無事動いた。余力ができたら久しぶりにsend-pr してみるかな。