SWIG OpenSSL 1.0 - Problème avec les macros STACK_OF
Question
Avec les versions précédentes d'OpenSSL, cela était possible dans les fichiers SWIG .i:
STACK *ssl_get_ciphers(SSL *ssl) {
return (STACK *)SSL_get_ciphers(ssl);
}
Avec OpenSSL 1.0.0beta3, cela échoue car STACK ne semble plus être défini. La nouvelle OpenSSL tente de faire un meilleur travail de vérification de type. On est donc censé utiliser la macro STACK_OF, qui est définie comme suit:
#define STACK_OF(type) struct stack_st_##type
Si je change le code ci-dessus pour utiliser STACK_OF:
STACK_OF(SSL_CIPHER) *ssl_get_ciphers(SSL *ssl) {
return SSL_get_ciphers(ssl);
}
Alors SWIG n’aime pas ça:
Error: Syntax error in input(1).
Je peux obtenir des choses à compiler en changeant cela en:
struct stack_st_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
return SSL_get_ciphers(ssl);
}
mais ce n'est évidemment pas bon, car OpenSSL pourrait changer la macro de version en version. Il existe une structure _STACK, mais il s'agit à nouveau de détails privés OpenSSL et peut changer d'une version à l'autre. Les piles peuvent également entrer en tant que paramètres, comme dans:
int sk_x509_num(STACK_OF(X509) *stack) {
return sk_num(stack);
}
ce que SWIG n’aime pas non plus.
Y a-t-il un moyen de faire en sorte que cela fonctionne sans recourir à des informations privées OpenSSL?
La solution
Après un peu plus de lecture, j'ai découvert pourquoi j'avais le problème et comment le résoudre. Le problème est dû au fait que le préprocesseur de SWIG ne connaît pas la macro STACK_OF. C’est pourquoi SWIG échoue. Je peux résoudre ce problème en ajoutant ceci dans mon fichier .i:
%include <openssl/safestack.h>
Maintenant, je rencontre également le même problème avec la macro LHASH_OF. Malheureusement, il est inclus dans lhash.h, qui inclut également stdio.h, etc., ce que je ne souhaite pas (et ma construction ne parvient pas à les trouver de la manière dont il a été configuré). Ma construction a besoin de l'option de ligne de commande -includeall pour swig. Donc, malheureusement, avec LHASH_OF, j'ai fini par copier la définition d'OpenSSL: (
#define LHASH_OF(type) struct lhash_st_##type
juste sous la ligne% include que j'ai mentionnée ci-dessus.
Autres conseils
Pouvez-vous créer votre propre en-tête qui crée des typedefs comme ceci:
typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)
Puis, dans le fichier .i, faites
t_stack_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
return SSL_get_ciphers(ssl);
}
... et que votre en-tête # soit inclus au bon endroit au moment de la compilation?