SWIG OpenSSL 1.0-STACK_OFマクロの問題
質問
以前のOpenSSLバージョンでは、SWIG .iファイルでこれを行うことができました。
STACK *ssl_get_ciphers(SSL *ssl) {
return (STACK *)SSL_get_ciphers(ssl);
}
OpenSSL 1.0.0beta3では、STACKが定義されていないため、これは失敗します。新しいOpenSSLは型チェックでより良い仕事をしようとするので、次のように定義されるSTACK_OFマクロを使用することになっています:
#define STACK_OF(type) struct stack_st_##type
上記のコードを変更してSTACK_OFを使用する場合:
STACK_OF(SSL_CIPHER) *ssl_get_ciphers(SSL *ssl) {
return SSL_get_ciphers(ssl);
}
その後、SWIGはこれを好みません:
Error: Syntax error in input(1).
次のように変更することで、コンパイルできるようになります。
struct stack_st_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
return SSL_get_ciphers(ssl);
}
しかし、OpenSSLはリリースごとにマクロを変更する可能性があるため、これは明らかに良くありません。 _STACK構造体がありますが、これもOpenSSLプライベートの詳細であり、リリースごとに変更される可能性があります。スタックは、次のようにパラメーターとして受け取ることもできます。
int sk_x509_num(STACK_OF(X509) *stack) {
return sk_num(stack);
}
SWIGはどちらも好きではありません。
OpenSSLの個人情報を使用せずにこの機能を実行する方法はありますか?
解決
さらに読んだ後、なぜ問題が発生したのか、どうやって回避するのかを見つけました。この問題は、SWIGのプリプロセッサがSTACK_OFマクロを認識していないために発生したため、SWIGが失敗します。これを.iファイルに追加することで修正できます。
%include <openssl/safestack.h>
今、LHASH_OFマクロで同じ問題に遭遇しました。残念ながら、lhash.hには含まれており、stdio.hなども含まれていますが、これは必要ありません(実際、ビルドでは設定どおりに見つけることができません)。私のビルドでは、たまたま-includeallコマンドラインオプションが必要です。残念ながらLHASH_OFでOpenSSLから定義をコピーすることになりました:(
#define LHASH_OF(type) struct lhash_st_##type
上記の%include行のすぐ下。
他のヒント
次のようなtypedefを作成する独自のヘッダーを作成できますか
typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)
その後、.iファイルでdo
t_stack_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
return SSL_get_ciphers(ssl);
}
...そして、ヘッダーをコンパイル時に適切な場所にインクルードしますか?