1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems, Inc.
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1
/* Copyright (C) 2000 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
17
HFTODO this must be hidden if we don't want client capabilities in
21
#define __need_timeval 1
23
#include "libdrizzle.h"
24
#include "libdrizzle_priv.h"
25
#include <libdrizzle/errmsg.h>
26
#include <vio/violite.h>
20
#include <my_global.h>
22
#include <drizzle_com.h>
23
#include <mysqld_error.h>
31
28
#include <signal.h>
33
#include <sys/socket.h>
38
32
The following handles the differences when this is linked between the
76
if (vio != 0) /* If real connection */
75
if (vio != 0) /* If real connection */
78
net->fd = vio_fd(vio); /* For perl DBI/DBD */
77
net->fd = vio_fd(vio); /* For perl DBI/DBD */
84
bool net_init_sock(NET * net, int sock, int flags)
87
Vio *vio_tmp= vio_new(sock, VIO_TYPE_TCPIP, flags);
91
if (my_net_init(net, vio_tmp))
93
/* Only delete the temporary vio if we didn't already attach it to the
96
if (vio_tmp && (net->vio != vio_tmp))
100
(void) shutdown(sock, SHUT_RDWR);
108
84
void net_end(NET *net)
110
if (net->buff != NULL)
86
my_free(net->buff,MYF(MY_ALLOW_ZERO_PTR));
116
void net_close(NET *net)
118
if (net->vio != NULL)
120
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)
140
bool net_should_close(NET *net)
142
return net->error || (net->vio == 0);
145
bool net_more_data(NET *net)
147
return (net->vio == 0 || net->vio->read_pos < net->vio->read_end);
150
92
/** Realloc the packet buffer. */
152
94
bool net_realloc(NET *net, size_t length)
155
97
size_t pkt_length;
157
99
if (length >= net->max_packet_size)
159
101
/* @todo: 1 and 2 codes are identical. */
161
net->last_errno= CR_NET_PACKET_TOO_LARGE;
103
net->last_errno= ER_NET_PACKET_TOO_LARGE;
164
pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1);
106
pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1);
166
108
We must allocate some extra bytes for the end 0 and to be able to
167
109
read big compressed blocks
169
if (!(buff= (unsigned char*) realloc((char*) net->buff, pkt_length +
170
NET_HEADER_SIZE + COMP_HEADER_SIZE)))
111
if (!(buff= (uchar*) my_realloc((char*) net->buff, pkt_length +
112
NET_HEADER_SIZE + COMP_HEADER_SIZE,
172
115
/* @todo: 1 and 2 codes are identical. */
174
net->last_errno= CR_OUT_OF_MEMORY;
117
net->last_errno= ER_OUT_OF_RESOURCES;
175
118
/* In the server the error is reported by MY_WME flag. */
178
121
net->buff=net->write_pos=buff;
179
net->buff_end=buff+(net->max_packet= (uint32_t) pkt_length);
122
net->buff_end=buff+(net->max_packet= (ulong) pkt_length);
185
Check if there is any data to be read from the socket.
187
@param sd socket descriptor
192
1 Data or EOF to read
194
-1 Don't know if data is ready or not
128
Check if there is any data to be read from the socket.
130
@param sd socket descriptor
135
1 Data or EOF to read
137
-1 Don't know if data is ready or not
197
static bool net_data_is_ready(int sd)
140
static int net_data_is_ready(my_socket sd)
199
142
struct pollfd ufds;
212
Remove unwanted characters from connection
213
and check if disconnected.
215
Read from socket until there is nothing more to read. Discard
218
If there is anything when to read 'net_clear' is called this
219
normally indicates an error in the protocol.
221
When connection is properly closed (for TCP it means with
222
a FIN packet), then select() considers a socket "ready to read",
223
in the sense that there's EOF to read, but read() returns 0.
225
@param net NET handler
226
@param clear_buffer if <> 0, then clear all data from comm buff
155
Remove unwanted characters from connection
156
and check if disconnected.
158
Read from socket until there is nothing more to read. Discard
161
If there is anything when to read 'net_clear' is called this
162
normally indicates an error in the protocol.
164
When connection is properly closed (for TCP it means with
165
a FIN packet), then select() considers a socket "ready to read",
166
in the sense that there's EOF to read, but read() returns 0.
168
@param net NET handler
169
@param clear_buffer if <> 0, then clear all data from comm buff
229
172
void net_clear(NET *net, bool clear_buffer)
231
177
if (clear_buffer)
233
while (net_data_is_ready(net->vio->sd) > 0)
179
while ((ready= net_data_is_ready(net->vio->sd)) > 0)
235
181
/* The socket is ready */
236
if (vio_read(net->vio, net->buff,
237
(size_t) net->max_packet) <= 0)
182
if ((long) (count= vio_read(net->vio, net->buff,
183
(size_t) net->max_packet)) <= 0)
244
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
190
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
245
191
net->write_pos=net->buff;
268
214
/*****************************************************************************
269
** Write something to server/client buffer
270
*****************************************************************************/
215
** Write something to server/client buffer
216
*****************************************************************************/
273
Write a logical packet with packet header.
275
Format: Packet length (3 bytes), packet number(1 byte)
276
When compression is used a 3 byte compression length is added
279
If compression is used the original package is modified!
219
Write a logical packet with packet header.
221
Format: Packet length (3 bytes), packet number(1 byte)
222
When compression is used a 3 byte compression length is added
225
If compression is used the original package is modified!
283
my_net_write(NET *net,const unsigned char *packet,size_t len)
229
my_net_write(NET *net,const uchar *packet,size_t len)
285
unsigned char buff[NET_HEADER_SIZE];
231
uchar buff[NET_HEADER_SIZE];
286
232
if (unlikely(!net->vio)) /* nowhere to write */
293
239
while (len >= MAX_PACKET_LENGTH)
295
const uint32_t z_size = MAX_PACKET_LENGTH;
241
const ulong z_size = MAX_PACKET_LENGTH;
296
242
int3store(buff, z_size);
297
buff[3]= (unsigned char) net->pkt_nr++;
243
buff[3]= (uchar) net->pkt_nr++;
298
244
if (net_write_buff(net, buff, NET_HEADER_SIZE) ||
299
net_write_buff(net, packet, z_size))
245
net_write_buff(net, packet, z_size))
301
247
packet += z_size;
304
250
/* Write last packet */
305
251
int3store(buff,len);
306
buff[3]= (unsigned char) net->pkt_nr++;
252
buff[3]= (uchar) net->pkt_nr++;
307
253
if (net_write_buff(net, buff, NET_HEADER_SIZE))
309
return net_write_buff(net,packet,len) ? 1 : 0;
255
return test(net_write_buff(net,packet,len));
313
Send a command to the server.
315
The reason for having both header and packet is so that libdrizzle
316
can easy add a header to a special command (like prepared statements)
317
without having to re-alloc the string.
319
As the command is part of the first data packet, we have to do some data
320
juggling to put the command in there, without having to create a new
323
This function will split big packets into sub-packets if needed.
324
(Each sub packet can only be 2^24 bytes)
326
@param net NET handler
327
@param command Command in MySQL server (enum enum_server_command)
328
@param header Header to write after command
329
@param head_len Length of header
330
@param packet Query or parameter to query
331
@param len Length of packet
259
Send a command to the server.
261
The reason for having both header and packet is so that libmysql
262
can easy add a header to a special command (like prepared statements)
263
without having to re-alloc the string.
265
As the command is part of the first data packet, we have to do some data
266
juggling to put the command in there, without having to create a new
269
This function will split big packets into sub-packets if needed.
270
(Each sub packet can only be 2^24 bytes)
272
@param net NET handler
273
@param command Command in MySQL server (enum enum_server_command)
274
@param header Header to write after command
275
@param head_len Length of header
276
@param packet Query or parameter to query
277
@param len Length of packet
340
net_write_command(NET *net,unsigned char command,
341
const unsigned char *header, size_t head_len,
342
const unsigned char *packet, size_t len)
286
net_write_command(NET *net,uchar command,
287
const uchar *header, size_t head_len,
288
const uchar *packet, size_t len)
344
uint32_t length=len+1+head_len; /* 1 extra byte for command */
345
unsigned char buff[NET_HEADER_SIZE+1];
346
uint32_t header_size=NET_HEADER_SIZE+1;
290
ulong length=len+1+head_len; /* 1 extra byte for command */
291
uchar buff[NET_HEADER_SIZE+1];
292
uint header_size=NET_HEADER_SIZE+1;
348
buff[4]=command; /* For first packet */
294
buff[4]=command; /* For first packet */
350
296
if (length >= MAX_PACKET_LENGTH)
356
302
int3store(buff, MAX_PACKET_LENGTH);
357
buff[3]= (unsigned char) net->pkt_nr++;
303
buff[3]= (uchar) net->pkt_nr++;
358
304
if (net_write_buff(net, buff, header_size) ||
359
net_write_buff(net, header, head_len) ||
360
net_write_buff(net, packet, len))
305
net_write_buff(net, header, head_len) ||
306
net_write_buff(net, packet, len))
363
309
length-= MAX_PACKET_LENGTH;
364
310
len= MAX_PACKET_LENGTH;
366
312
header_size= NET_HEADER_SIZE;
367
313
} while (length >= MAX_PACKET_LENGTH);
368
len=length; /* Data left to be written */
314
len=length; /* Data left to be written */
370
316
int3store(buff,length);
371
buff[3]= (unsigned char) net->pkt_nr++;
372
return((net_write_buff(net, buff, header_size) ||
373
(head_len && net_write_buff(net, header, head_len)) ||
374
net_write_buff(net, packet, len) || net_flush(net)) ? 1 : 0 );
317
buff[3]= (uchar) net->pkt_nr++;
318
return(test(net_write_buff(net, buff, header_size) ||
319
(head_len && net_write_buff(net, header, head_len)) ||
320
net_write_buff(net, packet, len) || net_flush(net)));
378
Caching the data in a local buffer before sending it.
324
Caching the data in a local buffer before sending it.
380
326
Fill up net->buffer and send it to the client when full.
382
If the rest of the to-be-sent-packet is bigger than buffer,
383
send it in one big block (to avoid copying to internal buffer).
384
If not, copy the rest of the data to the buffer and return without
387
@param net Network handler
388
@param packet Packet to send
389
@param len Length of packet
392
The cached buffer can be sent as it is with 'net_flush()'.
393
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
395
protocol as we store the length of the compressed packet in 3 bytes.
328
If the rest of the to-be-sent-packet is bigger than buffer,
329
send it in one big block (to avoid copying to internal buffer).
330
If not, copy the rest of the data to the buffer and return without
333
@param net Network handler
334
@param packet Packet to send
335
@param len Length of packet
338
The cached buffer can be sent as it is with 'net_flush()'.
339
In this code we have to be careful to not send a packet longer than
340
MAX_PACKET_LENGTH to net_real_write() if we are using the compressed
341
protocol as we store the length of the compressed packet in 3 bytes.
404
350
net_write_buff(NET *net, const unsigned char *packet, uint32_t len)
406
uint32_t left_length;
407
353
if (net->compress && net->max_packet > MAX_PACKET_LENGTH)
408
354
left_length= MAX_PACKET_LENGTH - (net->write_pos - net->buff);
410
left_length= (uint32_t) (net->buff_end - net->write_pos);
356
left_length= (ulong) (net->buff_end - net->write_pos);
412
358
if (len > left_length)
414
360
if (net->write_pos != net->buff)
416
362
/* Fill up already used packet and write it */
417
memcpy(net->write_pos,packet,left_length);
418
if (net_real_write(net, net->buff,
419
(size_t) (net->write_pos - net->buff) + left_length))
363
memcpy((char*) net->write_pos,packet,left_length);
364
if (net_real_write(net, net->buff,
365
(size_t) (net->write_pos - net->buff) + left_length))
421
367
net->write_pos= net->buff;
422
368
packet+= left_length;
423
369
len-= left_length;
425
371
if (net->compress)
428
We can't have bigger packets than 16M with compression
429
Because the uncompressed length is stored in 3 bytes
374
We can't have bigger packets than 16M with compression
375
Because the uncompressed length is stored in 3 bytes
431
377
left_length= MAX_PACKET_LENGTH;
432
378
while (len > left_length)
434
if (net_real_write(net, packet, left_length))
436
packet+= left_length;
380
if (net_real_write(net, packet, left_length))
382
packet+= left_length;
440
386
if (len > net->max_packet)
441
387
return net_real_write(net, packet, len) ? 1 : 0;
442
388
/* Send out rest of the blocks as full sized blocks */
444
memcpy(net->write_pos,packet,len);
390
memcpy((char*) net->write_pos,packet,len);
445
391
net->write_pos+= len;
451
Read and write one packet using timeouts.
452
If needed, the packet is compressed before sending.
397
Read and write one packet using timeouts.
398
If needed, the packet is compressed before sending.
455
- TODO is it needed to set this variable if we have no socket
401
- TODO is it needed to set this variable if we have no socket
460
406
in the server, yield to another process and come back later.
463
net_real_write(NET *net,const unsigned char *packet, size_t len)
409
net_real_write(NET *net,const uchar *packet, size_t len)
466
const unsigned char *pos,*end;
467
uint32_t retry_count= 0;
469
/* Backup of the original SO_RCVTIMEO timeout */
471
struct timespec backtime;
412
const uchar *pos,*end;
475
415
if (net->error == 2)
476
return(-1); /* socket can't be used */
416
return(-1); /* socket can't be used */
478
418
net->reading_or_writing=2;
479
419
if (net->compress)
483
const uint32_t header_length=NET_HEADER_SIZE+COMP_HEADER_SIZE;
484
if (!(b= (unsigned char*) malloc(len + NET_HEADER_SIZE +
423
uint header_length=NET_HEADER_SIZE+COMP_HEADER_SIZE;
424
if (!(b= (uchar*) my_malloc(len + NET_HEADER_SIZE +
425
COMP_HEADER_SIZE, MYF(MY_WME))))
488
net->last_errno= CR_OUT_OF_MEMORY;
428
net->last_errno= ER_OUT_OF_RESOURCES;
489
429
/* In the server, the error is reported by MY_WME flag. */
490
430
net->reading_or_writing= 0;
493
433
memcpy(b+header_length,packet,len);
495
complen= len * 120 / 100 + 12;
496
unsigned char * compbuf= (unsigned char *) malloc(complen);
499
uLongf tmp_complen= complen;
500
int res= compress((Bytef*) compbuf, &tmp_complen,
501
(Bytef*) (b+header_length),
503
complen= tmp_complen;
507
if ((res != Z_OK) || (complen >= len))
511
size_t tmplen= complen;
435
if (my_compress(b+header_length, &len, &complen))
520
437
int3store(&b[NET_HEADER_SIZE],complen);
521
438
int3store(b,len);
522
b[3]=(unsigned char) (net->compress_pkt_nr++);
439
b[3]=(uchar) (net->compress_pkt_nr++);
523
440
len+= header_length;
528
/* Check for error, currently assert */
529
if (net->write_timeout)
531
struct timespec waittime;
534
waittime.tv_sec= net->write_timeout;
537
memset(&backtime, 0, sizeof(struct timespec));
538
length= sizeof(struct timespec);
539
error= getsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
543
perror("getsockopt");
546
error= setsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
547
&waittime, (socklen_t)sizeof(struct timespec));
554
446
/* Loop until we have read everything */
582
474
if (retry_count++ < net->retry_count)
586
if (vio_errno(net->vio) == EINTR)
478
if (vio_errno(net->vio) == SOCKET_EINTR)
590
net->error= 2; /* Close socket */
591
net->last_errno= (interrupted ? CR_NET_WRITE_INTERRUPTED :
592
CR_NET_ERROR_ON_WRITE);
482
net->error= 2; /* Close socket */
483
net->last_errno= (interrupted ? ER_NET_WRITE_INTERRUPTED :
484
ER_NET_ERROR_ON_WRITE);
596
488
update_statistics(thd_increment_bytes_sent(length));
599
if ((net->compress) && (packet != NULL))
600
free((char*) packet);
492
my_free((char*) packet,MYF(0));
601
493
net->reading_or_writing=0;
604
if (net->write_timeout)
605
error= setsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
606
&backtime, (socklen_t)sizeof(struct timespec));
609
495
return(((int) (pos != end)));
614
Reads one packet to net->buff + net->where_b.
615
Long packets are handled by my_net_read().
616
This function reallocates the net->buff buffer if necessary.
500
Reads one packet to net->buff + net->where_b.
501
Long packets are handled by my_net_read().
502
This function reallocates the net->buff buffer if necessary.
619
Returns length of packet.
505
Returns length of packet.
623
509
my_real_read(NET *net, size_t *complen)
627
uint32_t i,retry_count=0;
628
uint32_t len=packet_error;
629
uint32_t remain= (net->compress ? NET_HEADER_SIZE+COMP_HEADER_SIZE :
513
uint i,retry_count=0;
514
ulong len=packet_error;
515
uint32 remain= (net->compress ? NET_HEADER_SIZE+COMP_HEADER_SIZE :
633
517
/* Backup of the original SO_RCVTIMEO timeout */
634
struct timespec backtime;
518
struct timeval backtime;
640
523
net->reading_or_writing= 1;
641
524
/* Read timeout is set in my_net_set_read_timeout */
643
pos = net->buff + net->where_b; /* net->packet -4 */
526
pos = net->buff + net->where_b; /* net->packet -4 */
647
529
/* Check for error, currently assert */
648
530
if (net->read_timeout)
650
struct timespec waittime;
532
struct timeval waittime;
651
533
socklen_t length;
653
535
waittime.tv_sec= net->read_timeout;
656
memset(&backtime, 0, sizeof(struct timespec));
657
length= sizeof(struct timespec);
658
error= getsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
538
memset(&backtime, 0, sizeof(struct timeval));
539
length= sizeof(struct timeval);
540
error= getsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
659
541
&backtime, &length);
662
544
perror("getsockopt");
663
545
assert(error == 0);
665
error= setsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
666
&waittime, (socklen_t)sizeof(struct timespec));
547
error= setsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
548
&waittime, (socklen_t)sizeof(struct timeval));
667
549
assert(error == 0);
671
552
for (i= 0; i < 2 ; i++)
675
556
/* First read is done with non blocking mode */
676
557
if ((long) (length= vio_read(net->vio, pos, remain)) <= 0L)
678
const bool interrupted = vio_should_retry(net->vio);
559
bool interrupted = vio_should_retry(net->vio);
681
{ /* Probably in MIT threads */
562
{ /* Probably in MIT threads */
682
563
if (retry_count++ < net->retry_count)
685
if (vio_errno(net->vio) == EINTR)
566
if (vio_errno(net->vio) == SOCKET_EINTR)
689
570
len= packet_error;
690
net->error= 2; /* Close socket */
571
net->error= 2; /* Close socket */
691
572
net->last_errno= (vio_was_interrupted(net->vio) ?
692
CR_NET_READ_INTERRUPTED :
573
ER_NET_READ_INTERRUPTED :
697
remain -= (uint32_t) length;
577
remain -= (uint32) length;
699
579
update_statistics(thd_increment_bytes_received(length));
702
{ /* First parts is packet length */
582
{ /* First parts is packet length */
705
if (net->buff[net->where_b + 3] != (unsigned char) net->pkt_nr)
585
if (net->buff[net->where_b + 3] != (uchar) net->pkt_nr)
707
587
len= packet_error;
708
588
/* Not a NET error on the client. XXX: why? */
753
Read a packet from the client/server and return it without the internal
756
If the packet is the first packet of a multi-packet packet
757
(which is indicated by the length of the packet = 0xffffff) then
758
all sub packets are read and concatenated.
760
If the packet was compressed, its uncompressed and the length of the
761
uncompressed packet is returned.
764
The function returns the length of the found packet or packet_error.
765
net->read_pos points to the read data.
631
Read a packet from the client/server and return it without the internal
634
If the packet is the first packet of a multi-packet packet
635
(which is indicated by the length of the packet = 0xffffff) then
636
all sub packets are read and concatenated.
638
If the packet was compressed, its uncompressed and the length of the
639
uncompressed packet is returned.
642
The function returns the length of the found packet or packet_error.
643
net->read_pos points to the read data.
776
654
if (len == MAX_PACKET_LENGTH)
778
656
/* First packet of a multi-packet. Concatenate the packets */
779
uint32_t save_pos = net->where_b;
657
ulong save_pos = net->where_b;
780
658
size_t total_length= 0;
785
len = my_real_read(net,&complen);
663
len = my_real_read(net,&complen);
786
664
} while (len == MAX_PACKET_LENGTH);
787
665
if (len != packet_error)
789
667
net->where_b = save_pos;
791
669
net->read_pos = net->buff + net->where_b;
792
670
if (len != packet_error)
793
net->read_pos[len]=0; /* Safeguard for drizzle_use_result */
671
net->read_pos[len]=0; /* Safeguard for mysql_use_result */
798
676
/* We are using the compressed protocol */
801
uint32_t start_of_packet;
802
uint32_t first_packet_offset;
803
uint32_t read_length, multi_byte_packet=0;
679
ulong start_of_packet;
680
ulong first_packet_offset;
681
uint read_length, multi_byte_packet=0;
805
683
if (net->remain_in_buf)
807
buf_length= net->buf_length; /* Data left in old packet */
685
buf_length= net->buf_length; /* Data left in old packet */
808
686
first_packet_offset= start_of_packet= (net->buf_length -
810
688
/* Restore the character that was overwritten by the end 0 */
811
689
net->buff[start_of_packet]= net->save_char;
822
700
if (buf_length - start_of_packet >= NET_HEADER_SIZE)
824
read_length = uint3korr(net->buff+start_of_packet);
827
/* End of multi-byte packet */
828
start_of_packet += NET_HEADER_SIZE;
831
if (read_length + NET_HEADER_SIZE <= buf_length - start_of_packet)
833
if (multi_byte_packet)
835
/* Remove packet header for second packet */
836
memmove(net->buff + first_packet_offset + start_of_packet,
837
net->buff + first_packet_offset + start_of_packet +
839
buf_length - start_of_packet);
840
start_of_packet += read_length;
841
buf_length -= NET_HEADER_SIZE;
844
start_of_packet+= read_length + NET_HEADER_SIZE;
702
read_length = uint3korr(net->buff+start_of_packet);
705
/* End of multi-byte packet */
706
start_of_packet += NET_HEADER_SIZE;
709
if (read_length + NET_HEADER_SIZE <= buf_length - start_of_packet)
711
if (multi_byte_packet)
713
/* Remove packet header for second packet */
714
memmove(net->buff + first_packet_offset + start_of_packet,
715
net->buff + first_packet_offset + start_of_packet +
717
buf_length - start_of_packet);
718
start_of_packet += read_length;
719
buf_length -= NET_HEADER_SIZE;
722
start_of_packet+= read_length + NET_HEADER_SIZE;
846
if (read_length != MAX_PACKET_LENGTH) /* last package */
848
multi_byte_packet= 0; /* No last zero len packet */
851
multi_byte_packet= NET_HEADER_SIZE;
852
/* Move data down to read next data packet after current one */
853
if (first_packet_offset)
855
memmove(net->buff,net->buff+first_packet_offset,
856
buf_length-first_packet_offset);
857
buf_length-=first_packet_offset;
858
start_of_packet -= first_packet_offset;
859
first_packet_offset=0;
724
if (read_length != MAX_PACKET_LENGTH) /* last package */
726
multi_byte_packet= 0; /* No last zero len packet */
729
multi_byte_packet= NET_HEADER_SIZE;
730
/* Move data down to read next data packet after current one */
731
if (first_packet_offset)
733
memmove(net->buff,net->buff+first_packet_offset,
734
buf_length-first_packet_offset);
735
buf_length-=first_packet_offset;
736
start_of_packet -= first_packet_offset;
737
first_packet_offset=0;
864
742
/* Move data down to read next data packet after current one */
865
743
if (first_packet_offset)
867
memmove(net->buff,net->buff+first_packet_offset,
868
buf_length-first_packet_offset);
869
buf_length-=first_packet_offset;
870
start_of_packet -= first_packet_offset;
871
first_packet_offset=0;
745
memmove(net->buff,net->buff+first_packet_offset,
746
buf_length-first_packet_offset);
747
buf_length-=first_packet_offset;
748
start_of_packet -= first_packet_offset;
749
first_packet_offset=0;
874
752
net->where_b=buf_length;
875
753
if ((packet_len = my_real_read(net,&complen)) == packet_error)
755
if (my_uncompress(net->buff + net->where_b, packet_len,
880
unsigned char * compbuf= (unsigned char *) malloc(complen);
883
uLongf tmp_complen= complen;
884
int error= uncompress((Bytef*) compbuf, &tmp_complen,
885
(Bytef*) (net->buff + net->where_b),
887
complen= tmp_complen;
891
net->error= 2; /* caller will close socket */
892
net->last_errno= CR_NET_UNCOMPRESS_ERROR;
896
memcpy((net->buff + net->where_b), compbuf, complen);
758
net->error= 2; /* caller will close socket */
759
net->last_errno= ER_NET_UNCOMPRESS_ERROR;
762
buf_length+= complen;
905
buf_length+= complen;
907
765
net->read_pos= net->buff+ first_packet_offset + NET_HEADER_SIZE;
908
766
net->buf_length= buf_length;
909
net->remain_in_buf= (uint32_t) (buf_length - start_of_packet);
910
len = ((uint32_t) (start_of_packet - first_packet_offset) - NET_HEADER_SIZE -
767
net->remain_in_buf= (ulong) (buf_length - start_of_packet);
768
len = ((ulong) (start_of_packet - first_packet_offset) - NET_HEADER_SIZE -
911
769
multi_byte_packet);
912
net->save_char= net->read_pos[len]; /* Must be saved */
913
net->read_pos[len]=0; /* Safeguard for drizzle_use_result */
770
net->save_char= net->read_pos[len]; /* Must be saved */
771
net->read_pos[len]=0; /* Safeguard for mysql_use_result */
919
void my_net_set_read_timeout(NET *net, uint32_t timeout)
777
void my_net_set_read_timeout(NET *net, uint timeout)
921
779
net->read_timeout= timeout;
924
781
vio_timeout(net->vio, 0, timeout);
930
void my_net_set_write_timeout(NET *net, uint32_t timeout)
786
void my_net_set_write_timeout(NET *net, uint timeout)
932
788
net->write_timeout= timeout;
935
790
vio_timeout(net->vio, 1, timeout);
940
Clear possible error state of struct NET
942
@param net clear the state of the argument
945
void net_clear_error(NET *net)
948
net->last_error[0]= '\0';
949
strcpy(net->sqlstate, sqlstate_get_not_error());