Invoke AC_PROG_CPP.
[elisp/starttls.git] / gnutls.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <gnutls/gnutls.h>
4
5 static gnutls_session tls_session = NULL;
6
7 void
8 tls_negotiate (fd, cert_file, key_file)
9      int fd;
10      const char *cert_file, *key_file;
11 {
12   gnutls_certificate_credentials xcred;
13
14   gnutls_global_init ();
15
16   gnutls_certificate_allocate_credentials(&xcred);
17
18   if (cert_file)
19     {
20       if (!key_file)
21         key_file = cert_file;
22       gnutls_certificate_set_x509_key_file (xcred, cert_file, key_file,
23                                             GNUTLS_X509_FMT_PEM);
24     }
25
26   gnutls_init (&tls_session, GNUTLS_CLIENT);
27   gnutls_set_default_priority (tls_session);
28   gnutls_credentials_set (tls_session, GNUTLS_CRD_CERTIFICATE, xcred);
29
30   gnutls_transport_set_ptr (tls_session, (gnutls_transport_ptr)fd);
31
32   gnutls_handshake (tls_session);
33 }
34
35 int
36 tls_write(fd, buf, num)
37      const char *buf;
38      int fd, num;
39 {
40   if (tls_session) 
41     return gnutls_record_send (tls_session, buf, num);
42   return write (fd, buf, num);
43 }
44
45 int
46 tls_read(fd, buf, num)
47      char *buf;
48      int fd, num;
49 {
50   if (tls_session)
51     return gnutls_record_recv (tls_session, buf, num);
52   return read (fd, buf, num);
53 }
54
55 int
56 tls_pending()
57 {
58   return tls_session && gnutls_record_check_pending (tls_session);
59 }