2009-07-30 249 views
2

對於現有的OpenSSL版本有可能做到這一點。我SWIG文件:痛飲OpenSSL的1.0 - 問題與STACK_OF宏

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); 
} 

然後呷不喜歡這樣的:

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私人細節?

回答

1

經過一番閱讀後,我發現我爲什麼有這個問題,以及如何解決它。問題發生是因爲SWIG的預處理器不知道STACK_OF宏,所以這就是SWIG失敗的原因。我可以修復由我.i文件添加此:

%include <openssl/safestack.h> 

現在我也碰到與LHASH_OF宏同樣的問題。不幸的是,它包含在lhash.h中,其中還包括stdio.h等我不想要的東西(而且我的構建實際上無法按照它的設置方式找到它們)。我的構建恰好需要-includeall命令行選項來swig。因此,與LHASH_OF不幸的是我結束了與OpenSSL的:(

#define LHASH_OF(type) struct lhash_st_##type 

正下方%複製定義包括我上面提到的線。

0

你可以創建你自己的頭,使類型定義是這樣的:

typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER) 

然後在.i文件做

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

...並讓你的頭在正確的地方執行#included在編譯時?