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?

Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top