699930db513c37677bf9d411b1fc1daf18c392a1
[openssl.git] / demos / bio / saccept.c
1 /* NOCW */
2 /* demos/bio/saccept.c */
3
4 /* A minimal program to serve an SSL connection.
5  * It uses blocking.
6  * saccept host:port
7  * host is the interface IP to use.  If any interface, use *:port
8  * The default it *:4433
9  *
10  * cc -I../../include saccept.c -L../.. -lssl -lcrypto -ldl
11  */
12
13 #include <stdio.h>
14 #include <signal.h>
15 #include <openssl/err.h>
16 #include <openssl/ssl.h>
17
18 #define CERT_FILE       "server.pem"
19
20 BIO *in=NULL;
21
22 void close_up()
23         {
24         if (in != NULL)
25                 BIO_free(in);
26         }
27
28 int main(argc,argv)
29 int argc;
30 char *argv[];
31         {
32         char *port=NULL;
33         BIO *ssl_bio,*tmp;
34         SSL_CTX *ctx;
35         SSL *ssl;
36         char buf[512];
37         int ret=1,i;
38
39         if (argc <= 1)
40                 port="*:4433";
41         else
42                 port=argv[1];
43
44         signal(SIGINT,close_up);
45
46         SSL_load_error_strings();
47
48 #ifdef WATT32
49         dbug_init();
50         sock_init();
51 #endif
52
53         /* Add ciphers and message digests */
54         OpenSSL_add_ssl_algorithms();
55
56         ctx=SSL_CTX_new(SSLv23_server_method());
57         if (!SSL_CTX_use_certificate_file(ctx,CERT_FILE,SSL_FILETYPE_PEM))
58                 goto err;
59         if (!SSL_CTX_use_PrivateKey_file(ctx,CERT_FILE,SSL_FILETYPE_PEM))
60                 goto err;
61         if (!SSL_CTX_check_private_key(ctx))
62                 goto err;
63
64         /* Setup server side SSL bio */
65         ssl=SSL_new(ctx);
66         ssl_bio=BIO_new_ssl(ctx,0);
67
68         if ((in=BIO_new_accept(port)) == NULL) goto err;
69
70         /* This means that when a new connection is accepted on 'in',
71          * The ssl_bio will be 'duplicated' and have the new socket
72          * BIO push into it.  Basically it means the SSL BIO will be
73          * automatically setup */
74         BIO_set_accept_bios(in,ssl_bio);
75
76 again:
77         /* The first call will setup the accept socket, and the second
78          * will get a socket.  In this loop, the first actual accept
79          * will occur in the BIO_read() function. */
80
81         if (BIO_do_accept(in) <= 0) goto err;
82
83         for (;;)
84                 {
85                 i=BIO_read(in,buf,512);
86                 if (i == 0)
87                         {
88                         /* If we have finished, remove the underlying
89                          * BIO stack so the next time we call any function
90                          * for this BIO, it will attempt to do an
91                          * accept */
92                         printf("Done\n");
93                         tmp=BIO_pop(in);
94                         BIO_free_all(tmp);
95                         goto again;
96                         }
97                 if (i < 0) goto err;
98                 fwrite(buf,1,i,stdout);
99                 fflush(stdout);
100                 }
101
102         ret=0;
103 err:
104         if (ret)
105                 {
106                 ERR_print_errors_fp(stderr);
107                 }
108         if (in != NULL) BIO_free(in);
109         exit(ret);
110         return(!ret);
111         }
112