В предыдущих версиях 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?