test-sslserver.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <my_global.h>
  14. #ifdef HAVE_OPENSSL
  15. #include <my_sys.h>
  16. #include <m_string.h>
  17. #include <m_ctype.h>
  18. #include "mysql.h"
  19. #include "errmsg.h"
  20. #include <my_dir.h>
  21. #include <my_getopt.h>
  22. #include <signal.h>
  23. #include <violite.h>
  24. const char *VER="0.2";
  25. #ifndef DBUG_OFF
  26. const char *default_dbug_option="d:t:O,-";
  27. #endif
  28. #if 0
  29. static void
  30. fatal_error( const char* r)
  31. {
  32. perror(r);
  33. exit(0);
  34. }
  35. #endif
  36. typedef struct {
  37. int sd;
  38. struct st_VioSSLAcceptorFd* ssl_acceptor;
  39. } TH_ARGS;
  40. static void
  41. do_ssl_stuff( TH_ARGS* args)
  42. {
  43. const char* s = "Huhuhuhuuu";
  44. Vio* server_vio;
  45. int err;
  46. DBUG_ENTER("do_ssl_stuff");
  47. server_vio = vio_new(args->sd, VIO_TYPE_TCPIP, TRUE);
  48. /* ----------------------------------------------- */
  49. /* TCP connection is ready. Do server side SSL. */
  50. err = write(server_vio->sd,(gptr)s, strlen(s));
  51. sslaccept(args->ssl_acceptor,server_vio,60L);
  52. err = server_vio->write(server_vio,(gptr)s, strlen(s));
  53. DBUG_VOID_RETURN;
  54. }
  55. static void*
  56. client_thread( void* arg)
  57. {
  58.   my_thread_init();
  59.   do_ssl_stuff((TH_ARGS*)arg);
  60.   return 0;
  61. }
  62. int
  63. main(int argc __attribute__((unused)), char** argv)
  64. {
  65. char server_key[] = "../SSL/server-key.pem",
  66. server_cert[] = "../SSL/server-cert.pem";
  67. char ca_file[] = "../SSL/cacert.pem",
  68. *ca_path = 0,
  69. *cipher = 0;
  70. struct st_VioSSLAcceptorFd* ssl_acceptor;
  71. pthread_t th;
  72. TH_ARGS th_args;
  73. struct sockaddr_in sa_serv;
  74. struct sockaddr_in sa_cli;
  75. int listen_sd;
  76. int err;
  77. #if defined(__sgi) && _NO_XOPEN4 && _NO_XOPEN5
  78. socklen_t client_len;
  79. #else
  80. size_t client_len;
  81. #endif
  82. int reuseaddr = 1; /* better testing, uh? */
  83. MY_INIT(argv[0]);
  84.         DBUG_PROCESS(argv[0]);
  85.         DBUG_PUSH(default_dbug_option);
  86. printf("Server key/cert : %s/%sn", server_key, server_cert);
  87. if (ca_file!=0)
  88. printf("CAfile          : %sn", ca_file);
  89. if (ca_path!=0)
  90. printf("CApath          : %sn", ca_path);
  91.         th_args.ssl_acceptor = ssl_acceptor = new_VioSSLAcceptorFd(server_key, server_cert, ca_file, ca_path,cipher);
  92. /* ----------------------------------------------- */
  93. /* Prepare TCP socket for receiving connections */
  94. listen_sd = socket (AF_INET, SOCK_STREAM, 0);
  95. setsockopt(listen_sd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(&reuseaddr));
  96. memset (&sa_serv, '', sizeof(sa_serv));
  97. sa_serv.sin_family      = AF_INET;
  98. sa_serv.sin_addr.s_addr = INADDR_ANY;
  99. sa_serv.sin_port        = htons (1111);          /* Server Port number */
  100. err = bind(listen_sd, (struct sockaddr*) &sa_serv,
  101.      sizeof (sa_serv));                  
  102. /* Receive a TCP connection. */
  103. err = listen (listen_sd, 5); 
  104. client_len = sizeof(sa_cli);
  105. th_args.sd = accept (listen_sd, (struct sockaddr*) &sa_cli, &client_len);
  106. close (listen_sd);
  107. printf ("Connection from %lx, port %xn",
  108.   (long)sa_cli.sin_addr.s_addr, sa_cli.sin_port);
  109. /* ----------------------------------------------- */
  110. /* TCP connection is ready. Do server side SSL. */
  111. err = pthread_create(&th, NULL, client_thread, (void*)&th_args);
  112. DBUG_PRINT("info", ("pthread_create: %d", err));
  113. pthread_join(th, NULL);
  114. #if 0
  115. if (err<=0) {
  116. my_free((gptr)ssl_acceptor,MYF(0));
  117. fatal_error("server:SSL_write");
  118. }
  119. #endif /* 0 */
  120. my_free((gptr)ssl_acceptor,MYF(0));
  121. return 0;
  122. }
  123. #else /* HAVE_OPENSSL */
  124. int main() {
  125. return 0;
  126. }
  127. #endif /* HAVE_OPENSSL */