static int init_gnutls_functions (Lisp_Object libraries) { HMODULE library; int max_log_level = 1; if (!(library = w32_delayed_load (libraries, Qgnutls_dll))) { GNUTLS_LOG (1, max_log_level, "GnuTLS library not found"); return 0; } LOAD_GNUTLS_FN (library, gnutls_alert_get); LOAD_GNUTLS_FN (library, gnutls_alert_get_name); LOAD_GNUTLS_FN (library, gnutls_alert_send_appropriate); LOAD_GNUTLS_FN (library, gnutls_anon_allocate_client_credentials); LOAD_GNUTLS_FN (library, gnutls_anon_free_client_credentials); LOAD_GNUTLS_FN (library, gnutls_bye); LOAD_GNUTLS_FN (library, gnutls_certificate_allocate_credentials); LOAD_GNUTLS_FN (library, gnutls_certificate_free_credentials); LOAD_GNUTLS_FN (library, gnutls_certificate_get_peers); LOAD_GNUTLS_FN (library, gnutls_certificate_set_verify_flags); LOAD_GNUTLS_FN (library, gnutls_certificate_set_x509_crl_file); LOAD_GNUTLS_FN (library, gnutls_certificate_set_x509_key_file); LOAD_GNUTLS_FN (library, gnutls_certificate_set_x509_trust_file); LOAD_GNUTLS_FN (library, gnutls_certificate_type_get); LOAD_GNUTLS_FN (library, gnutls_certificate_verify_peers2); LOAD_GNUTLS_FN (library, gnutls_credentials_set); LOAD_GNUTLS_FN (library, gnutls_deinit); LOAD_GNUTLS_FN (library, gnutls_dh_set_prime_bits); LOAD_GNUTLS_FN (library, gnutls_error_is_fatal); LOAD_GNUTLS_FN (library, gnutls_global_init); LOAD_GNUTLS_FN (library, gnutls_global_set_log_function); LOAD_GNUTLS_FN (library, gnutls_global_set_log_level); LOAD_GNUTLS_FN (library, gnutls_global_set_mem_functions); LOAD_GNUTLS_FN (library, gnutls_handshake); LOAD_GNUTLS_FN (library, gnutls_init); LOAD_GNUTLS_FN (library, gnutls_priority_set_direct); LOAD_GNUTLS_FN (library, gnutls_record_check_pending); LOAD_GNUTLS_FN (library, gnutls_record_recv); LOAD_GNUTLS_FN (library, gnutls_record_send); LOAD_GNUTLS_FN (library, gnutls_strerror); LOAD_GNUTLS_FN (library, gnutls_transport_set_errno); LOAD_GNUTLS_FN (library, gnutls_transport_set_lowat); LOAD_GNUTLS_FN (library, gnutls_transport_set_ptr2); LOAD_GNUTLS_FN (library, gnutls_transport_set_pull_function); LOAD_GNUTLS_FN (library, gnutls_transport_set_push_function); LOAD_GNUTLS_FN (library, gnutls_x509_crt_check_hostname); LOAD_GNUTLS_FN (library, gnutls_x509_crt_deinit); LOAD_GNUTLS_FN (library, gnutls_x509_crt_import); LOAD_GNUTLS_FN (library, gnutls_x509_crt_init); max_log_level = global_gnutls_log_level; GNUTLS_LOG2 (1, max_log_level, "GnuTLS library loaded:", SDATA (Fget (Qgnutls_dll, QCloaded_from))); return 1; }
Lisp_Object emacs_gnutls_deinit (Lisp_Object proc) { int log_level; CHECK_PROCESS (proc); if (XPROCESS (proc)->gnutls_p == 0) return Qnil; log_level = XPROCESS (proc)->gnutls_log_level; if (XPROCESS (proc)->gnutls_x509_cred) { GNUTLS_LOG (2, log_level, "Deallocating x509 credentials"); fn_gnutls_certificate_free_credentials (XPROCESS (proc)->gnutls_x509_cred); XPROCESS (proc)->gnutls_x509_cred = NULL; } if (XPROCESS (proc)->gnutls_anon_cred) { GNUTLS_LOG (2, log_level, "Deallocating anon credentials"); fn_gnutls_anon_free_client_credentials (XPROCESS (proc)->gnutls_anon_cred); XPROCESS (proc)->gnutls_anon_cred = NULL; } if (XPROCESS (proc)->gnutls_state) { fn_gnutls_deinit (XPROCESS (proc)->gnutls_state); XPROCESS (proc)->gnutls_state = NULL; if (GNUTLS_INITSTAGE (proc) >= GNUTLS_STAGE_INIT) GNUTLS_INITSTAGE (proc) = GNUTLS_STAGE_INIT - 1; } XPROCESS (proc)->gnutls_p = 0; return Qt; }
EMACS_INT emacs_gnutls_read (struct Lisp_Process *proc, char *buf, EMACS_INT nbyte) { ssize_t rtnval; gnutls_session_t state = proc->gnutls_state; int log_level = proc->gnutls_log_level; if (proc->gnutls_initstage != GNUTLS_STAGE_READY) { /* If the handshake count is under the limit, try the handshake again and increment the handshake count. This count is kept per process (connection), not globally. */ if (proc->gnutls_handshakes_tried < GNUTLS_EMACS_HANDSHAKES_LIMIT) { proc->gnutls_handshakes_tried++; emacs_gnutls_handshake (proc); GNUTLS_LOG2i (5, log_level, "Retried handshake", proc->gnutls_handshakes_tried); return -1; } GNUTLS_LOG (2, log_level, "Giving up on handshake; resetting retries"); proc->gnutls_handshakes_tried = 0; return 0; } rtnval = fn_gnutls_record_recv (state, buf, nbyte); if (rtnval >= 0) return rtnval; else if (rtnval == GNUTLS_E_UNEXPECTED_PACKET_LENGTH) /* The peer closed the connection. */ return 0; else if (emacs_gnutls_handle_error (state, rtnval) == 0) /* non-fatal error */ return -1; else { /* a fatal error occurred */ return 0; } }
static int init_gnutls_functions (Lisp_Object libraries) { HMODULE library; int max_log_level = 1; if (!(library = w32_delayed_load (libraries, Qgnutls_dll))) { GNUTLS_LOG (1, max_log_level, "GnuTLS library not found"); return 0; } LOAD_GNUTLS_FN (library, gnutls_alert_get); LOAD_GNUTLS_FN (library, gnutls_alert_get_name); LOAD_GNUTLS_FN (library, gnutls_alert_send_appropriate); LOAD_GNUTLS_FN (library, gnutls_anon_allocate_client_credentials); LOAD_GNUTLS_FN (library, gnutls_anon_free_client_credentials); LOAD_GNUTLS_FN (library, gnutls_bye); LOAD_GNUTLS_FN (library, gnutls_certificate_allocate_credentials); LOAD_GNUTLS_FN (library, gnutls_certificate_free_credentials); LOAD_GNUTLS_FN (library, gnutls_certificate_get_peers); LOAD_GNUTLS_FN (library, gnutls_certificate_set_verify_flags); LOAD_GNUTLS_FN (library, gnutls_certificate_set_x509_crl_file); LOAD_GNUTLS_FN (library, gnutls_certificate_set_x509_key_file); LOAD_GNUTLS_FN (library, gnutls_certificate_set_x509_trust_file); LOAD_GNUTLS_FN (library, gnutls_certificate_type_get); LOAD_GNUTLS_FN (library, gnutls_certificate_verify_peers2); LOAD_GNUTLS_FN (library, gnutls_credentials_set); LOAD_GNUTLS_FN (library, gnutls_deinit); LOAD_GNUTLS_FN (library, gnutls_dh_set_prime_bits); LOAD_GNUTLS_FN (library, gnutls_error_is_fatal); LOAD_GNUTLS_FN (library, gnutls_global_init); LOAD_GNUTLS_FN (library, gnutls_global_set_log_function); LOAD_GNUTLS_FN (library, gnutls_global_set_log_level); LOAD_GNUTLS_FN (library, gnutls_global_set_mem_functions); LOAD_GNUTLS_FN (library, gnutls_handshake); LOAD_GNUTLS_FN (library, gnutls_init); LOAD_GNUTLS_FN (library, gnutls_priority_set_direct); LOAD_GNUTLS_FN (library, gnutls_record_check_pending); LOAD_GNUTLS_FN (library, gnutls_record_recv); LOAD_GNUTLS_FN (library, gnutls_record_send); LOAD_GNUTLS_FN (library, gnutls_strerror); LOAD_GNUTLS_FN (library, gnutls_transport_set_errno); LOAD_GNUTLS_FN (library, gnutls_check_version); /* We don't need to call gnutls_transport_set_lowat in GnuTLS 2.11.1 and later, and the function was removed entirely in 3.0.0. */ if (!fn_gnutls_check_version ("2.11.1")) LOAD_GNUTLS_FN (library, gnutls_transport_set_lowat); LOAD_GNUTLS_FN (library, gnutls_transport_set_ptr2); LOAD_GNUTLS_FN (library, gnutls_transport_set_pull_function); LOAD_GNUTLS_FN (library, gnutls_transport_set_push_function); LOAD_GNUTLS_FN (library, gnutls_x509_crt_check_hostname); LOAD_GNUTLS_FN (library, gnutls_x509_crt_deinit); LOAD_GNUTLS_FN (library, gnutls_x509_crt_import); LOAD_GNUTLS_FN (library, gnutls_x509_crt_init); max_log_level = global_gnutls_log_level; { Lisp_Object name = CAR_SAFE (Fget (Qgnutls_dll, QCloaded_from)); GNUTLS_LOG2 (1, max_log_level, "GnuTLS library loaded:", STRINGP (name) ? (const char *) SDATA (name) : "unknown"); } return 1; }