使用之前的 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 私有详细信息的情况下完成这项工作?