sconnect.c revision 296465
1/* NOCW */ 2/* demos/bio/sconnect.c */ 3 4/*- 5 * A minimal program to do SSL to a passed host and port. 6 * It is actually using non-blocking IO but in a very simple manner 7 * sconnect host:port - it does a 'GET / HTTP/1.0' 8 * 9 * cc -I../../include sconnect.c -L../.. -lssl -lcrypto 10 */ 11#include <stdio.h> 12#include <stdlib.h> 13#include <unistd.h> 14#include <openssl/err.h> 15#include <openssl/ssl.h> 16 17extern int errno; 18 19int main(argc, argv) 20int argc; 21char *argv[]; 22{ 23 char *host; 24 BIO *out; 25 char buf[1024 * 10], *p; 26 SSL_CTX *ssl_ctx = NULL; 27 SSL *ssl; 28 BIO *ssl_bio; 29 int i, len, off, ret = 1; 30 31 if (argc <= 1) 32 host = "localhost:4433"; 33 else 34 host = argv[1]; 35 36#ifdef WATT32 37 dbug_init(); 38 sock_init(); 39#endif 40 41 /* Lets get nice error messages */ 42 SSL_load_error_strings(); 43 44 /* Setup all the global SSL stuff */ 45 OpenSSL_add_ssl_algorithms(); 46 ssl_ctx = SSL_CTX_new(SSLv23_client_method()); 47 48 /* Lets make a SSL structure */ 49 ssl = SSL_new(ssl_ctx); 50 SSL_set_connect_state(ssl); 51 52 /* Use it inside an SSL BIO */ 53 ssl_bio = BIO_new(BIO_f_ssl()); 54 BIO_set_ssl(ssl_bio, ssl, BIO_CLOSE); 55 56 /* Lets use a connect BIO under the SSL BIO */ 57 out = BIO_new(BIO_s_connect()); 58 BIO_set_conn_hostname(out, host); 59 BIO_set_nbio(out, 1); 60 out = BIO_push(ssl_bio, out); 61 62 p = "GET / HTTP/1.0\r\n\r\n"; 63 len = strlen(p); 64 65 off = 0; 66 for (;;) { 67 i = BIO_write(out, &(p[off]), len); 68 if (i <= 0) { 69 if (BIO_should_retry(out)) { 70 fprintf(stderr, "write DELAY\n"); 71 sleep(1); 72 continue; 73 } else { 74 goto err; 75 } 76 } 77 off += i; 78 len -= i; 79 if (len <= 0) 80 break; 81 } 82 83 for (;;) { 84 i = BIO_read(out, buf, sizeof(buf)); 85 if (i == 0) 86 break; 87 if (i < 0) { 88 if (BIO_should_retry(out)) { 89 fprintf(stderr, "read DELAY\n"); 90 sleep(1); 91 continue; 92 } 93 goto err; 94 } 95 fwrite(buf, 1, i, stdout); 96 } 97 98 ret = 1; 99 100 if (0) { 101 err: 102 if (ERR_peek_error() == 0) { /* system call error */ 103 fprintf(stderr, "errno=%d ", errno); 104 perror("error"); 105 } else 106 ERR_print_errors_fp(stderr); 107 } 108 BIO_free_all(out); 109 if (ssl_ctx != NULL) 110 SSL_CTX_free(ssl_ctx); 111 exit(!ret); 112 return (ret); 113} 114