OpenSSL  1.0.1c
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros
saccept.c
Go to the documentation of this file.
1 /* NOCW */
2 /* demos/bio/saccept.c */
3 
4 /* A minimal program to server 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
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 
47 
48 #ifdef WATT32
49  dbug_init();
50  sock_init();
51 #endif
52 
53  /* Add ciphers and message digests */
55 
58  goto err;
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 acceptede on 'in',
71  * The ssl_bio will be 'dupilcated' 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