SWIG OPENSSL 1.0- STACK_OF 매크로의 문제
문제
이전 OpenSSL 버전을 사용하면 Swig .i 파일 에서이 작업을 수행 할 수있었습니다.
STACK *ssl_get_ciphers(SSL *ssl) {
return (STACK *)SSL_get_ciphers(ssl);
}
OpenSSL 1.0.0beta3를 사용하면 스택이 더 이상 정의되지 않은 것처럼 보이기 때문에 실패합니다. New 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 struct가 있지만 다시 OpenSSL 개인 세부 사항이며 릴리스에서 릴리스로 변경 될 수 있습니다. 스택은 다음과 같이 매개 변수로도 들어올 수도 있습니다.
int sk_x509_num(STACK_OF(X509) *stack) {
return sk_num(stack);
}
어떤 Swig가 마음에 들지 않습니다.
OpenSSL 개인 정보를 사용하지 않고이 작업을 수행 할 수있는 방법이 있습니까?
해결책
좀 더 읽은 후 나는 왜 내가 문제가 있었는지, 어떻게 문제를 해결하는지 알았습니다. SWIG의 사전 처리기가 STACK_OF 매크로에 대해 알지 못하므로 SWIG가 실패하기 때문에 문제가 발생했습니다. .i 파일에 이것을 추가 하여이 문제를 해결할 수 있습니다.
%include <openssl/safestack.h>
이제 나는 또한 lhash_of 매크로와 동일한 문제가 발생합니다. 불행히도 Lhash.h에 포함되어 있습니다. 여기에는 내가 원하지 않는 stdio.h 등도 포함되어 있습니다 (그리고 내 빌드는 실제로 설정하는 방식을 찾을 수 없습니다). 내 빌드는 swig에 -includeall 명령 줄 옵션이 필요합니다. 불행히도 lhash_of와 함께 나는 OpenSSL에서 정의를 복사하는 것으로 끝났습니다.
#define LHASH_OF(type) struct lhash_st_##type
위에서 언급 한 %포함 라인 바로 아래에 있습니다.
다른 팁
다음과 같이 typedef를 만드는 자신의 헤더를 만들 수 있습니까?
typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)
그런 다음 .i 파일에서
t_stack_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
return SSL_get_ciphers(ssl);
}
... 그리고 컴파일 타임에 올바른 위치에 헤더를 포함 시키시겠습니까?