SWIG OpenSSL 1.0 - STACK_OF宏的问题

时间:2009-07-30 18:14:27

标签: openssl swig

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

2 个答案:

答案 0 :(得分:1)

经过一番阅读后,我发现了为什么会遇到这个问题,以及如何解决这个问题。问题发生的原因是SWIG的预处理器不知道STACK_OF宏,所以这就是SWIG失败的原因。我可以通过在我的.i文件中添加它来解决这个问题:

%include <openssl/safestack.h>

现在我也遇到了与LHASH_OF宏相同的问题。不幸的是它包含在lhash.h中,它还包括stdio.h等我不想要的(我的构建实际上找不到它的设置方式)。我的构建恰好需要-includeall命令行选项来swig。不幸的是,LHASH_OF最终我从OpenSSL复制了这个定义:(

#define LHASH_OF(type) struct lhash_st_##type

在我提到的%include行下面。

答案 1 :(得分:0)

你能创建自己的标题,使得typedef像这样:

typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)

然后在.i文件中执行

t_stack_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
    return SSL_get_ciphers(ssl);
}

...并在编译时将标题#included放在正确的位置?