64
64
drizzle_state_push(con, drizzle_state_write);
65
65
drizzle_state_push(con, drizzle_state_handshake_client_write);
69
drizzle_state_push(con, drizzle_state_write);
70
drizzle_state_push(con, drizzle_state_handshake_ssl_client_write);
68
74
return drizzle_state_loop(con);
226
232
drizzle_state_push(con, drizzle_state_packet_read);
227
233
drizzle_state_push(con, drizzle_state_write);
228
234
drizzle_state_push(con, drizzle_state_handshake_client_write);
237
drizzle_state_push(con, drizzle_state_write);
238
drizzle_state_push(con, drizzle_state_handshake_ssl_client_write);
231
242
return DRIZZLE_RETURN_OK;
491
502
return DRIZZLE_RETURN_OK;
494
drizzle_return_t drizzle_state_handshake_client_write(drizzle_con_st *con)
505
int drizzle_compile_capabilities(drizzle_con_st *con)
497
507
int capabilities;
498
drizzle_return_t ret;
502
return DRIZZLE_RETURN_INVALID_ARGUMENT;
504
drizzle_log_debug(con->drizzle, "drizzle_state_handshake_client_write");
506
/* Calculate max packet size. */
507
con->packet_size= 4 /* Capabilities */
508
+ 4 /* Max packet size */
511
+ strlen(con->user) + 1
512
+ 1 /* Scramble size */
513
+ DRIZZLE_MAX_SCRAMBLE_SIZE
514
+ strlen(con->db) + 1;
516
/* Assume the entire handshake packet will fit in the buffer. */
517
if ((con->packet_size + 4) > DRIZZLE_MAX_BUFFER_SIZE)
519
drizzle_set_error(con->drizzle, "drizzle_state_handshake_client_write",
520
"buffer too small:%zu", con->packet_size + 4);
521
return DRIZZLE_RETURN_INTERNAL_ERROR;
524
ptr= con->buffer_ptr;
526
/* Store packet size at the end since it may change. */
527
ptr[3]= con->packet_number;
528
con->packet_number++;
531
509
if (con->options & DRIZZLE_CON_MYSQL)
532
510
con->capabilities|= DRIZZLE_CAPABILITIES_PROTOCOL_41;
550
528
capabilities|= int(DRIZZLE_CAPABILITIES_PLUGIN_AUTH);
553
capabilities&= ~(int(DRIZZLE_CAPABILITIES_COMPRESS) | int(DRIZZLE_CAPABILITIES_SSL));
533
capabilities|= int(DRIZZLE_CAPABILITIES_SSL);
536
capabilities&= ~(int(DRIZZLE_CAPABILITIES_COMPRESS));
554
537
if (con->db[0] == 0)
555
538
capabilities&= ~int(DRIZZLE_CAPABILITIES_CONNECT_WITH_DB);
543
drizzle_return_t drizzle_state_handshake_client_write(drizzle_con_st *con)
548
drizzle_return_t ret;
552
return DRIZZLE_RETURN_INVALID_ARGUMENT;
554
drizzle_log_debug(con->drizzle, "drizzle_state_handshake_client_write");
558
ssl_ret= SSL_connect(con->ssl);
561
drizzle_set_error(con->drizzle, "drizzle_state_handshake_client_write", "SSL error: %d", SSL_get_error(con->ssl, ssl_ret));
562
return DRIZZLE_RETURN_SSL_ERROR;
564
con->ssl_state= DRIZZLE_SSL_STATE_HANDSHAKE_COMPLETE;
567
/* Calculate max packet size. */
568
con->packet_size= 4 /* Capabilities */
569
+ 4 /* Max packet size */
572
+ strlen(con->user) + 1
573
+ 1 /* Scramble size */
574
+ DRIZZLE_MAX_SCRAMBLE_SIZE
575
+ strlen(con->db) + 1;
577
/* Assume the entire handshake packet will fit in the buffer. */
578
if ((con->packet_size + 4) > DRIZZLE_MAX_BUFFER_SIZE)
580
drizzle_set_error(con->drizzle, "drizzle_state_handshake_client_write",
581
"buffer too small:%zu", con->packet_size + 4);
582
return DRIZZLE_RETURN_INTERNAL_ERROR;
585
ptr= con->buffer_ptr;
587
/* Store packet size at the end since it may change. */
588
ptr[3]= con->packet_number;
589
con->packet_number++;
592
capabilities= drizzle_compile_capabilities(con);
557
594
drizzle_set_byte4(ptr, capabilities);
588
625
return DRIZZLE_RETURN_OK;
628
drizzle_return_t drizzle_state_handshake_ssl_client_write(drizzle_con_st *con)
633
drizzle_log_debug(con->drizzle, "drizzle_state_handshake_ssl_client_write");
635
/* SSL handshake packet structure */
636
con->packet_size= 4 /* Capabilities */
637
+ 4 /* Max packet size */
639
+ 23; /* Padding unused bytes */
641
ptr= con->buffer_ptr;
642
drizzle_set_byte3(ptr, con->packet_size);
643
ptr[3]= con->packet_number;
644
con->packet_number++;
647
capabilities= drizzle_compile_capabilities(con);
648
drizzle_set_byte4(ptr, capabilities);
650
drizzle_set_byte4(ptr, con->max_packet_size);
653
ptr[0]= con->charset;
655
con->buffer_size+= con->packet_size + 4;
660
drizzle_state_pop(con);
661
return DRIZZLE_RETURN_OK;
591
664
drizzle_return_t drizzle_state_handshake_result_read(drizzle_con_st *con)