18
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
#define __need_timeval 1
21
#include <drizzled/global.h>
23
22
#include "libdrizzle.h"
24
23
#include "libdrizzle_priv.h"
25
#include <libdrizzle/errmsg.h>
26
#include <vio/violite.h>
27
26
#include <assert.h>
29
28
#include <stdlib.h>
47
#define update_statistics(A)
48
#define thd_increment_bytes_sent(N)
50
#define TEST_BLOCKING 8
51
48
#define MAX_PACKET_LENGTH (256L*256L*256L-1)
52
#define MIN_COMPRESS_LENGTH 50 /* Don't compress small bl. */
54
50
static bool net_write_buff(NET *net, const unsigned char *packet, uint32_t len);
57
53
/** Init with packet info. */
59
bool my_net_init(NET *net, Vio* vio)
55
bool drizzleclient_net_init(NET *net, Vio* vio)
62
my_net_local_init(net); /* Set some limits */
58
drizzleclient_net_local_init(net); /* Set some limits */
63
59
if (!(net->buff=(unsigned char*) malloc((size_t) net->max_packet+
64
NET_HEADER_SIZE + COMP_HEADER_SIZE)))
60
NET_HEADER_SIZE + COMP_HEADER_SIZE)))
66
62
net->buff_end=net->buff+net->max_packet;
67
63
net->error=0; net->return_status=0;
76
72
if (vio != 0) /* If real connection */
78
net->fd = vio_fd(vio); /* For perl DBI/DBD */
74
net->fd = drizzleclient_vio_fd(vio); /* For perl DBI/DBD */
75
drizzleclient_vio_fastsend(vio);
84
bool net_init_sock(NET * net, int sock, int flags)
80
bool drizzleclient_net_init_sock(NET * net, int sock, int flags)
87
Vio *vio_tmp= vio_new(sock, VIO_TYPE_TCPIP, flags);
83
Vio *drizzleclient_vio_tmp= drizzleclient_vio_new(sock, VIO_TYPE_TCPIP, flags);
84
if (drizzleclient_vio_tmp == NULL)
91
if (my_net_init(net, vio_tmp))
87
if (drizzleclient_net_init(net, drizzleclient_vio_tmp))
93
89
/* Only delete the temporary vio if we didn't already attach it to the
96
if (vio_tmp && (net->vio != vio_tmp))
92
if (drizzleclient_vio_tmp && (net->vio != drizzleclient_vio_tmp))
93
drizzleclient_vio_delete(drizzleclient_vio_tmp);
100
96
(void) shutdown(sock, SHUT_RDWR);
108
void net_end(NET *net)
104
void drizzleclient_net_end(NET *net)
110
106
if (net->buff != NULL)
116
void net_close(NET *net)
112
void drizzleclient_net_close(NET *net)
118
114
if (net->vio != NULL)
120
vio_delete(net->vio);
116
drizzleclient_vio_delete(net->vio);
125
bool net_peer_addr(NET *net, char *buf, uint16_t *port, size_t buflen)
127
return vio_peer_addr(net->vio, buf, port, buflen);
130
void net_keepalive(NET *net, bool flag)
132
vio_keepalive(net->vio, flag);
135
int net_get_sd(NET *net)
121
bool drizzleclient_net_peer_addr(NET *net, char *buf, uint16_t *port, size_t buflen)
123
return drizzleclient_vio_peer_addr(net->vio, buf, port, buflen);
126
void drizzleclient_net_keepalive(NET *net, bool flag)
128
drizzleclient_vio_keepalive(net->vio, flag);
131
int drizzleclient_net_get_sd(NET *net)
137
133
return net->vio->sd;
140
bool net_should_close(NET *net)
136
bool drizzleclient_net_should_close(NET *net)
142
138
return net->error || (net->vio == 0);
145
bool net_more_data(NET *net)
141
bool drizzleclient_net_more_data(NET *net)
147
143
return (net->vio == 0 || net->vio->read_pos < net->vio->read_end);
150
146
/** Realloc the packet buffer. */
152
bool net_realloc(NET *net, size_t length)
148
bool drizzleclient_net_realloc(NET *net, size_t length)
154
150
unsigned char *buff;
155
151
size_t pkt_length;
215
211
Read from socket until there is nothing more to read. Discard
218
If there is anything when to read 'net_clear' is called this
214
If there is anything when to read 'drizzleclient_net_clear' is called this
219
215
normally indicates an error in the protocol.
221
217
When connection is properly closed (for TCP it means with
226
222
@param clear_buffer if <> 0, then clear all data from comm buff
229
void net_clear(NET *net, bool clear_buffer)
225
void drizzleclient_net_clear(NET *net, bool clear_buffer)
231
227
if (clear_buffer)
233
229
while (net_data_is_ready(net->vio->sd) > 0)
235
231
/* The socket is ready */
236
if (vio_read(net->vio, net->buff,
232
if (drizzleclient_vio_read(net->vio, net->buff,
237
233
(size_t) net->max_packet) <= 0)
250
246
/** Flush write_buffer if not empty. */
252
bool net_flush(NET *net)
248
bool drizzleclient_net_flush(NET *net)
255
251
if (net->buff != net->write_pos)
257
error=net_real_write(net, net->buff,
253
error=drizzleclient_net_real_write(net, net->buff,
258
254
(size_t) (net->write_pos - net->buff)) ? 1 : 0;
259
255
net->write_pos=net->buff;
283
my_net_write(NET *net,const unsigned char *packet,size_t len)
279
drizzleclient_net_write(NET *net,const unsigned char *packet,size_t len)
285
281
unsigned char buff[NET_HEADER_SIZE];
286
282
if (unlikely(!net->vio)) /* nowhere to write */
340
net_write_command(NET *net,unsigned char command,
336
drizzleclient_net_write_command(NET *net,unsigned char command,
341
337
const unsigned char *header, size_t head_len,
342
338
const unsigned char *packet, size_t len)
371
367
buff[3]= (unsigned char) net->pkt_nr++;
372
368
return((net_write_buff(net, buff, header_size) ||
373
369
(head_len && net_write_buff(net, header, head_len)) ||
374
net_write_buff(net, packet, len) || net_flush(net)) ? 1 : 0 );
370
net_write_buff(net, packet, len) || drizzleclient_net_flush(net)) ? 1 : 0 );
389
385
@param len Length of packet
392
The cached buffer can be sent as it is with 'net_flush()'.
388
The cached buffer can be sent as it is with 'drizzleclient_net_flush()'.
393
389
In this code we have to be careful to not send a packet longer than
394
MAX_PACKET_LENGTH to net_real_write() if we are using the compressed
390
MAX_PACKET_LENGTH to drizzleclient_net_real_write() if we are using the compressed
395
391
protocol as we store the length of the compressed packet in 3 bytes.
416
412
/* Fill up already used packet and write it */
417
413
memcpy(net->write_pos,packet,left_length);
418
if (net_real_write(net, net->buff,
414
if (drizzleclient_net_real_write(net, net->buff,
419
415
(size_t) (net->write_pos - net->buff) + left_length))
421
417
net->write_pos= net->buff;
431
427
left_length= MAX_PACKET_LENGTH;
432
428
while (len > left_length)
434
if (net_real_write(net, packet, left_length))
430
if (drizzleclient_net_real_write(net, packet, left_length))
436
432
packet+= left_length;
437
433
len-= left_length;
440
436
if (len > net->max_packet)
441
return net_real_write(net, packet, len) ? 1 : 0;
437
return drizzleclient_net_real_write(net, packet, len) ? 1 : 0;
442
438
/* Send out rest of the blocks as full sized blocks */
444
440
memcpy(net->write_pos,packet,len);
460
456
in the server, yield to another process and come back later.
463
net_real_write(NET *net,const unsigned char *packet, size_t len)
459
drizzleclient_net_real_write(NET *net, const unsigned char *packet, size_t len)
466
const unsigned char *pos,*end;
462
const unsigned char *pos, *end;
467
463
uint32_t retry_count= 0;
469
465
/* Backup of the original SO_RCVTIMEO timeout */
529
525
if (net->write_timeout)
531
527
struct timespec waittime;
534
530
waittime.tv_sec= net->write_timeout;
535
531
waittime.tv_nsec= 0;
537
533
memset(&backtime, 0, sizeof(struct timespec));
538
length= sizeof(struct timespec);
534
time_len= sizeof(struct timespec);
539
535
error= getsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
536
&backtime, &time_len);
543
539
perror("getsockopt");
554
550
/* Loop until we have read everything */
555
551
while (pos != end)
557
if ((long) (length= vio_write(net->vio,pos,(size_t) (end-pos))) <= 0)
554
if ((long) (length= drizzleclient_vio_write(net->vio, pos, (size_t) (end-pos))) <= 0)
559
const bool interrupted= vio_should_retry(net->vio);
556
const bool interrupted= drizzleclient_vio_should_retry(net->vio);
561
558
If we read 0, or we were interrupted this means that
562
559
we need to switch to blocking mode and wait until the timeout
569
while (vio_blocking(net->vio, true, &old_mode) < 0)
566
while (drizzleclient_vio_blocking(net->vio, true, &old_mode) < 0)
571
if (vio_should_retry(net->vio) && retry_count++ < net->retry_count)
568
if (drizzleclient_vio_should_retry(net->vio) && retry_count++ < net->retry_count)
573
570
net->error= 2; /* Close socket */
574
571
net->last_errno= CR_NET_PACKET_TOO_LARGE;
614
610
Reads one packet to net->buff + net->where_b.
615
Long packets are handled by my_net_read().
611
Long packets are handled by drizzleclient_net_read().
616
612
This function reallocates the net->buff buffer if necessary.
648
644
if (net->read_timeout)
650
646
struct timespec waittime;
653
649
waittime.tv_sec= net->read_timeout;
654
650
waittime.tv_nsec= 0;
656
652
memset(&backtime, 0, sizeof(struct timespec));
657
length= sizeof(struct timespec);
653
time_len= sizeof(struct timespec);
658
654
error= getsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
655
&backtime, &time_len);
662
658
perror("getsockopt");
673
669
while (remain > 0)
675
671
/* First read is done with non blocking mode */
676
if ((long) (length= vio_read(net->vio, pos, remain)) <= 0L)
672
if ((long) (length= drizzleclient_vio_read(net->vio, pos, remain)) <= 0L)
678
const bool interrupted = vio_should_retry(net->vio);
674
const bool interrupted = drizzleclient_vio_should_retry(net->vio);
681
677
{ /* Probably in MIT threads */
682
678
if (retry_count++ < net->retry_count)
685
if (vio_errno(net->vio) == EINTR)
681
if (drizzleclient_vio_errno(net->vio) == EINTR)
689
685
len= packet_error;
690
686
net->error= 2; /* Close socket */
691
net->last_errno= (vio_was_interrupted(net->vio) ?
687
net->last_errno= (drizzleclient_vio_was_interrupted(net->vio) ?
692
688
CR_NET_READ_INTERRUPTED :
693
689
CR_NET_READ_ERROR);
694
690
ER(net->last_errno);
725
720
/* The necessary size of net->buff */
726
721
if (helping >= net->max_packet)
728
if (net_realloc(net,helping))
723
if (drizzleclient_net_realloc(net,helping))
730
725
len= packet_error; /* Return error and close connection */
910
905
len = ((uint32_t) (start_of_packet - first_packet_offset) - NET_HEADER_SIZE -
911
906
multi_byte_packet);
912
907
net->save_char= net->read_pos[len]; /* Must be saved */
913
net->read_pos[len]=0; /* Safeguard for drizzle_use_result */
908
net->read_pos[len]=0; /* Safeguard for drizzleclient_use_result */
919
void my_net_set_read_timeout(NET *net, uint32_t timeout)
914
void drizzleclient_net_set_read_timeout(NET *net, uint32_t timeout)
921
916
net->read_timeout= timeout;
924
vio_timeout(net->vio, 0, timeout);
919
drizzleclient_vio_timeout(net->vio, 0, timeout);
930
void my_net_set_write_timeout(NET *net, uint32_t timeout)
925
void drizzleclient_net_set_write_timeout(NET *net, uint32_t timeout)
932
927
net->write_timeout= timeout;
935
vio_timeout(net->vio, 1, timeout);
930
drizzleclient_vio_timeout(net->vio, 1, timeout);
942
937
@param net clear the state of the argument
945
void net_clear_error(NET *net)
940
void drizzleclient_drizzleclient_net_clear_error(NET *net)
947
942
net->last_errno= 0;
948
943
net->last_error[0]= '\0';
949
strcpy(net->sqlstate, sqlstate_get_not_error());
944
strcpy(net->sqlstate, drizzleclient_sqlstate_get_not_error());