문제

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

... 그리고 컴파일 타임에 올바른 위치에 헤더를 포함 시키시겠습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top