2009-07-30 244 views
2

对于现有的OpenSSL版本有可能做到这一点。我SWIG文件:痛饮OpenSSL的1.0 - 问题与STACK_OF宏

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); 
} 

然后呷不喜欢这样的:

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私人细节?

回答

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 

正下方%复制定义包括我上面提到的线。

0

你可以创建你自己的头,使类型定义是这样的:

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在编译时?