Domanda

Con le precedenti versioni di OpenSSL era possibile farlo nei file SWI .i:

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

Con OpenSSL 1.0.0beta3 questo fallisce perché STACK sembra non essere più definito. Il nuovo OpenSSL cerca di fare un lavoro migliore nel controllo del tipo, quindi si suppone che si usi la macro STACK_OF, definita in questo modo:

#define STACK_OF(type) struct stack_st_##type

Se cambio il codice sopra per utilizzare STACK_OF:

STACK_OF(SSL_CIPHER) *ssl_get_ciphers(SSL *ssl) {
    return SSL_get_ciphers(ssl);
}

Quindi a SWIG non piace questo:

Error: Syntax error in input(1).

Posso ottenere cose da compilare cambiandole in:

struct stack_st_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
    return SSL_get_ciphers(ssl);
}

ma ovviamente non va bene, perché OpenSSL potrebbe cambiare la macro da una versione all'altra. C'è la struttura _STACK, ma di nuovo questo è il dettaglio privato di OpenSSL e potrebbe cambiare da una versione all'altra. Le pile possono anche entrare come parametri, come in:

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

che neanche a SWIG piace.

Esiste un modo per farlo funzionare senza ricorrere all'uso dei dettagli privati ??di OpenSSL?

È stato utile?

Soluzione

Dopo qualche altra lettura ho scoperto perché avevo il problema e come risolverlo. Il problema si è verificato perché il preprocessore di SWIG non è a conoscenza della macro STACK_OF, pertanto SWIG non funziona. Posso risolverlo aggiungendo questo nel mio file .i:

%include <openssl/safestack.h>

Ora ho riscontrato lo stesso problema con la macro LHASH_OF. Sfortunatamente è incluso in lhash.h che include anche stdio.h ecc. Che non voglio (e la mia build in realtà non riesce a trovarli nel modo in cui è impostata). La mia build ha bisogno dell'opzione -inclealeall riga di comando per eseguire il swig. Quindi sfortunatamente con LHASH_OF ho finito per copiare la definizione da OpenSSL :(

#define LHASH_OF(type) struct lhash_st_##type

proprio sotto la riga di inclusione% menzionata sopra.

Altri suggerimenti

Puoi creare la tua intestazione che rende i typedef come questo:

typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)

Quindi, nel file .i, fai

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

... e inserisci la tua intestazione # nel posto giusto al momento della compilazione?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top