.png)
Функция SSL_CTX_new() работает нормально, но что-то странное: она устанавливает errno в ENOSYS.
В документации об этом ничего не сказано: https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_new.html
#include <errno.h>
#include <openssl/ssl.h>
int main(int argc, char * argv[]){
SSL_library_init();
SSL_load_error_strings();
perror("A");
SSL_CTX * sslContext = SSL_CTX_new(TLS_server_method());
if (sslContext == NULL){
return EXIT_FAILURE;
}
perror("B");
return 0;
}
этот код возвращает это:
A: Undefined error: 0
B: Function not implemented
Моя версия openssl: OpenSSL 1.1.1b 26 февраля 2019 г.
решение1
Не все библиотеки используют errno для сообщения о состоянии. Если в документации явно не сказано, что эта функция устанавливает errno, то значение лучше всего рассматривать какнеопределенный: функция может сохранить исходное значение, или установить его в 0, или оставить в нем какой-то мусор.
И действительно, в документации OpenSSL ничего не говорится об errno; вместо этого библиотека имеет свой собственный «стек ошибок», к которому можно получить доступ с помощьюERR_get_error(), и это обеспечивает более точные коды ошибок и сообщения, чем весьма ограниченный набор, предоставляемый libc.
Таким образом, значение, которое вы найдете в errno, — это просто остаток от какой-то функции libc, которую использовала SSL_CTX_new().внутренне. (Например, он мог попытаться инициализировать ГСЧ, вызвав libc getrandom(), который затем вернул ENOSYS из-за отсутствия поддержки ядра.)