代码之家  ›  专栏  ›  技术社区  ›  Heikki Toivonen

SWIG OpenSSL 1.0-宏堆栈_出现问题

  •  2
  • Heikki Toivonen  · 技术社区  · 16 年前

    使用以前的OpenSSL版本,可以在SWIG.i文件中执行此操作:

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

    对于OpenSSL 1.0.0beta3,这会失败,因为堆栈似乎不再定义。新的OpenSSL试图在类型检查方面做得更好,因此应该使用宏的堆栈_,其定义如下:

    #define STACK_OF(type) struct stack_st_##type
    

    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可能会在不同版本之间更改宏。有_stackstruct,但这也是OpenSSL私有细节,可能会随着版本的不同而变化。堆栈也可以作为参数输入,如:

    int sk_x509_num(STACK_OF(X509) *stack) {
        return sk_num(stack);
    }
    

    哪个SWIG也不喜欢。

    有没有任何方法可以在不使用OpenSSL私有细节的情况下实现这一点?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Heikki Toivonen    16 年前

    经过一段时间的阅读,我发现了我为什么会有这个问题,以及如何解决它。出现这个问题是因为SWIG的预处理器不知道宏的堆栈_,所以SWIG失败。我可以通过在.I文件中添加以下内容来解决此问题:

    %include <openssl/safestack.h>
    

    现在我也遇到了同样的问题,拉什_的宏。不幸的是,它包含在lhash.h中,其中还包括stdio.h等我不想要的内容(我的构建实际上无法找到它的设置方式)。我的构建恰好需要-includeall命令行选项来swig。因此,不幸的是,我最终从OpenSSL复制了定义:(

    #define LHASH_OF(type) struct lhash_st_##type
    

        2
  •  0
  •   caf    16 年前

    typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)
    

    然后在.i文件中

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