76
if (vio != 0) /* If real connection */
76
if (vio != 0) /* If real connection */
78
net->fd = vio_fd(vio); /* For perl DBI/DBD */
78
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
85
void net_end(NET *net)
110
if (net->buff != NULL)
87
DBUG_ENTER("net_end");
88
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
94
/** Realloc the packet buffer. */
152
bool net_realloc(NET *net, size_t length)
96
my_bool net_realloc(NET *net, size_t length)
155
99
size_t pkt_length;
100
DBUG_ENTER("net_realloc");
101
DBUG_PRINT("enter",("length: %lu", (ulong) length));
157
103
if (length >= net->max_packet_size)
105
DBUG_PRINT("error", ("Packet too large. Max size: %lu",
106
net->max_packet_size));
159
107
/* @todo: 1 and 2 codes are identical. */
161
net->last_errno= CR_NET_PACKET_TOO_LARGE;
109
net->last_errno= ER_NET_PACKET_TOO_LARGE;
164
pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1);
112
pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1);
166
114
We must allocate some extra bytes for the end 0 and to be able to
167
115
read big compressed blocks
169
if (!(buff= (unsigned char*) realloc((char*) net->buff, pkt_length +
170
NET_HEADER_SIZE + COMP_HEADER_SIZE)))
117
if (!(buff= (uchar*) my_realloc((char*) net->buff, pkt_length +
118
NET_HEADER_SIZE + COMP_HEADER_SIZE,
172
121
/* @todo: 1 and 2 codes are identical. */
174
net->last_errno= CR_OUT_OF_MEMORY;
123
net->last_errno= ER_OUT_OF_RESOURCES;
175
124
/* In the server the error is reported by MY_WME flag. */
178
127
net->buff=net->write_pos=buff;
179
net->buff_end=buff+(net->max_packet= (uint32_t) pkt_length);
128
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
134
Check if there is any data to be read from the socket.
136
@param sd socket descriptor
141
1 Data or EOF to read
143
-1 Don't know if data is ready or not
197
static bool net_data_is_ready(int sd)
146
static int net_data_is_ready(my_socket sd)
199
149
struct pollfd ufds;
206
156
if (res < 0 || !(ufds.revents & (POLLIN | POLLPRI)))
164
/* Windows uses an _array_ of 64 fd's as default, so it's safe */
165
if (sd >= FD_SETSIZE)
167
#define NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE
172
tv.tv_sec= tv.tv_usec= 0;
174
if ((res= select(sd+1, &sfds, NULL, NULL, &tv)) < 0)
177
return test(res ? FD_ISSET(sd, &sfds) : 0);
178
#endif /* HAVE_POLL */
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
182
Remove unwanted characters from connection
183
and check if disconnected.
185
Read from socket until there is nothing more to read. Discard
188
If there is anything when to read 'net_clear' is called this
189
normally indicates an error in the protocol.
191
When connection is properly closed (for TCP it means with
192
a FIN packet), then select() considers a socket "ready to read",
193
in the sense that there's EOF to read, but read() returns 0.
195
@param net NET handler
196
@param clear_buffer if <> 0, then clear all data from comm buff
229
void net_clear(NET *net, bool clear_buffer)
199
void net_clear(NET *net, my_bool clear_buffer)
203
DBUG_ENTER("net_clear");
231
205
if (clear_buffer)
233
while (net_data_is_ready(net->vio->sd) > 0)
207
while ((ready= net_data_is_ready(net->vio->sd)) > 0)
235
209
/* The socket is ready */
236
if (vio_read(net->vio, net->buff,
237
(size_t) net->max_packet) <= 0)
210
if ((long) (count= vio_read(net->vio, net->buff,
211
(size_t) net->max_packet)) > 0)
213
DBUG_PRINT("info",("skipped %ld bytes from file: %s",
214
(long) count, vio_description(net->vio)));
218
DBUG_PRINT("info",("socket ready but only EOF to read - disconnected"));
223
#ifdef NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE
224
/* 'net_data_is_ready' returned "don't know" */
227
/* Read unblocking to clear net */
229
if (!vio_blocking(net->vio, FALSE, &old_mode))
231
while ((long) (count= vio_read(net->vio, net->buff,
232
(size_t) net->max_packet)) > 0)
233
DBUG_PRINT("info",("skipped %ld bytes from file: %s",
234
(long) count, vio_description(net->vio)));
235
vio_blocking(net->vio, TRUE, &old_mode);
238
#endif /* NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE */
244
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
240
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
245
241
net->write_pos=net->buff;
250
246
/** Flush write_buffer if not empty. */
252
bool net_flush(NET *net)
248
my_bool net_flush(NET *net)
251
DBUG_ENTER("net_flush");
255
252
if (net->buff != net->write_pos)
257
error=net_real_write(net, net->buff,
258
(size_t) (net->write_pos - net->buff)) ? 1 : 0;
254
error=test(net_real_write(net, net->buff,
255
(size_t) (net->write_pos - net->buff)));
259
256
net->write_pos=net->buff;
261
258
/* Sync packet number if using compression */
262
259
if (net->compress)
263
260
net->pkt_nr=net->compress_pkt_nr;
268
265
/*****************************************************************************
269
** Write something to server/client buffer
270
*****************************************************************************/
266
** Write something to server/client buffer
267
*****************************************************************************/
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!
270
Write a logical packet with packet header.
272
Format: Packet length (3 bytes), packet number(1 byte)
273
When compression is used a 3 byte compression length is added
276
If compression is used the original package is modified!
283
my_net_write(NET *net,const unsigned char *packet,size_t len)
280
my_net_write(NET *net,const uchar *packet,size_t len)
285
unsigned char buff[NET_HEADER_SIZE];
282
uchar buff[NET_HEADER_SIZE];
286
283
if (unlikely(!net->vio)) /* nowhere to write */
293
290
while (len >= MAX_PACKET_LENGTH)
295
const uint32_t z_size = MAX_PACKET_LENGTH;
292
const ulong z_size = MAX_PACKET_LENGTH;
296
293
int3store(buff, z_size);
297
buff[3]= (unsigned char) net->pkt_nr++;
294
buff[3]= (uchar) net->pkt_nr++;
298
295
if (net_write_buff(net, buff, NET_HEADER_SIZE) ||
299
net_write_buff(net, packet, z_size))
296
net_write_buff(net, packet, z_size))
301
298
packet += z_size;
304
301
/* Write last packet */
305
302
int3store(buff,len);
306
buff[3]= (unsigned char) net->pkt_nr++;
303
buff[3]= (uchar) net->pkt_nr++;
307
304
if (net_write_buff(net, buff, NET_HEADER_SIZE))
309
return net_write_buff(net,packet,len) ? 1 : 0;
306
#ifndef DEBUG_DATA_PACKETS
307
DBUG_DUMP("packet_header", buff, NET_HEADER_SIZE);
309
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
313
Send a command to the server.
315
The reason for having both header and packet is so that libmysql
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
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)
340
net_write_command(NET *net,uchar command,
341
const uchar *header, size_t head_len,
342
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;
344
ulong length=len+1+head_len; /* 1 extra byte for command */
345
uchar buff[NET_HEADER_SIZE+1];
346
uint header_size=NET_HEADER_SIZE+1;
347
DBUG_ENTER("net_write_command");
348
DBUG_PRINT("enter",("length: %lu", (ulong) len));
348
buff[4]=command; /* For first packet */
350
buff[4]=command; /* For first packet */
350
352
if (length >= MAX_PACKET_LENGTH)
356
358
int3store(buff, MAX_PACKET_LENGTH);
357
buff[3]= (unsigned char) net->pkt_nr++;
359
buff[3]= (uchar) net->pkt_nr++;
358
360
if (net_write_buff(net, buff, header_size) ||
359
net_write_buff(net, header, head_len) ||
360
net_write_buff(net, packet, len))
361
net_write_buff(net, header, head_len) ||
362
net_write_buff(net, packet, len))
363
365
length-= MAX_PACKET_LENGTH;
364
366
len= MAX_PACKET_LENGTH;
366
368
header_size= NET_HEADER_SIZE;
367
369
} while (length >= MAX_PACKET_LENGTH);
368
len=length; /* Data left to be written */
370
len=length; /* Data left to be written */
370
372
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 );
373
buff[3]= (uchar) net->pkt_nr++;
374
DBUG_RETURN(test(net_write_buff(net, buff, header_size) ||
375
(head_len && net_write_buff(net, header, head_len)) ||
376
net_write_buff(net, packet, len) || net_flush(net)));
378
Caching the data in a local buffer before sending it.
380
Caching the data in a local buffer before sending it.
380
382
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.
384
If the rest of the to-be-sent-packet is bigger than buffer,
385
send it in one big block (to avoid copying to internal buffer).
386
If not, copy the rest of the data to the buffer and return without
389
@param net Network handler
390
@param packet Packet to send
391
@param len Length of packet
394
The cached buffer can be sent as it is with 'net_flush()'.
395
In this code we have to be careful to not send a packet longer than
396
MAX_PACKET_LENGTH to net_real_write() if we are using the compressed
397
protocol as we store the length of the compressed packet in 3 bytes.
404
net_write_buff(NET *net, const unsigned char *packet, uint32_t len)
406
net_write_buff(NET *net, const uchar *packet, ulong len)
406
uint32_t left_length;
407
409
if (net->compress && net->max_packet > MAX_PACKET_LENGTH)
408
410
left_length= MAX_PACKET_LENGTH - (net->write_pos - net->buff);
410
left_length= (uint32_t) (net->buff_end - net->write_pos);
412
left_length= (ulong) (net->buff_end - net->write_pos);
414
#ifdef DEBUG_DATA_PACKETS
415
DBUG_DUMP("data", packet, len);
412
417
if (len > left_length)
414
419
if (net->write_pos != net->buff)
416
421
/* 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))
422
memcpy((char*) net->write_pos,packet,left_length);
423
if (net_real_write(net, net->buff,
424
(size_t) (net->write_pos - net->buff) + left_length))
421
426
net->write_pos= net->buff;
422
427
packet+= left_length;
423
428
len-= left_length;
425
430
if (net->compress)
428
We can't have bigger packets than 16M with compression
429
Because the uncompressed length is stored in 3 bytes
433
We can't have bigger packets than 16M with compression
434
Because the uncompressed length is stored in 3 bytes
431
436
left_length= MAX_PACKET_LENGTH;
432
437
while (len > left_length)
434
if (net_real_write(net, packet, left_length))
436
packet+= left_length;
439
if (net_real_write(net, packet, left_length))
441
packet+= left_length;
440
445
if (len > net->max_packet)
441
446
return net_real_write(net, packet, len) ? 1 : 0;
442
447
/* Send out rest of the blocks as full sized blocks */
444
memcpy(net->write_pos,packet,len);
449
memcpy((char*) net->write_pos,packet,len);
445
450
net->write_pos+= len;
451
Read and write one packet using timeouts.
452
If needed, the packet is compressed before sending.
455
- TODO is it needed to set this variable if we have no socket
459
TODO: rewrite this in a manner to do non-block writes. If a write can not be made, and we are
460
in the server, yield to another process and come back later.
456
Read and write one packet using timeouts.
457
If needed, the packet is compressed before sending.
460
- TODO is it needed to set this variable if we have no socket
463
net_real_write(NET *net,const unsigned char *packet, size_t len)
464
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;
467
const uchar *pos,*end;
470
my_bool net_blocking = vio_is_blocking(net->vio);
471
DBUG_ENTER("net_real_write");
475
473
if (net->error == 2)
476
return(-1); /* socket can't be used */
474
DBUG_RETURN(-1); /* socket can't be used */
478
476
net->reading_or_writing=2;
479
477
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 +
481
uint header_length=NET_HEADER_SIZE+COMP_HEADER_SIZE;
482
if (!(b= (uchar*) my_malloc(len + NET_HEADER_SIZE +
483
COMP_HEADER_SIZE, MYF(MY_WME))))
488
net->last_errno= CR_OUT_OF_MEMORY;
486
net->last_errno= ER_OUT_OF_RESOURCES;
489
487
/* In the server, the error is reported by MY_WME flag. */
490
488
net->reading_or_writing= 0;
493
491
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;
493
if (my_compress(b+header_length, &len, &complen))
520
495
int3store(&b[NET_HEADER_SIZE],complen);
521
496
int3store(b,len);
522
b[3]=(unsigned char) (net->compress_pkt_nr++);
497
b[3]=(uchar) (net->compress_pkt_nr++);
523
498
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));
502
#ifdef DEBUG_DATA_PACKETS
503
DBUG_DUMP("data", packet, len);
507
/* Write timeout is set in my_net_set_write_timeout */
554
/* Loop until we have read everything */
555
511
while (pos != end)
557
513
if ((long) (length= vio_write(net->vio,pos,(size_t) (end-pos))) <= 0)
559
const bool interrupted= vio_should_retry(net->vio);
561
If we read 0, or we were interrupted this means that
562
we need to switch to blocking mode and wait until the timeout
563
on the socket kicks in.
565
if ((interrupted || length == 0))
515
my_bool interrupted = vio_should_retry(net->vio);
516
if ((interrupted || length == 0) && !thr_alarm_in_use(&alarmed))
569
while (vio_blocking(net->vio, true, &old_mode) < 0)
571
if (vio_should_retry(net->vio) && retry_count++ < net->retry_count)
573
net->error= 2; /* Close socket */
574
net->last_errno= CR_NET_PACKET_TOO_LARGE;
518
if (!thr_alarm(&alarmed, net->write_timeout, &alarm_buff))
519
{ /* Always true for client */
521
while (vio_blocking(net->vio, TRUE, &old_mode) < 0)
523
if (vio_should_retry(net->vio) && retry_count++ < net->retry_count)
527
"%s: my_net_write: fcntl returned error %d, aborting thread\n",
528
my_progname,vio_errno(net->vio));
529
#endif /* EXTRA_DEBUG */
530
net->error= 2; /* Close socket */
531
net->last_errno= ER_NET_PACKET_TOO_LARGE;
582
if (retry_count++ < net->retry_count)
586
if (vio_errno(net->vio) == EINTR)
590
net->error= 2; /* Close socket */
591
net->last_errno= (interrupted ? CR_NET_WRITE_INTERRUPTED :
592
CR_NET_ERROR_ON_WRITE);
539
if (thr_alarm_in_use(&alarmed) && !thr_got_alarm(&alarmed) &&
542
if (retry_count++ < net->retry_count)
545
fprintf(stderr, "%s: write looped, aborting thread\n",
547
#endif /* EXTRA_DEBUG */
549
if (vio_errno(net->vio) == SOCKET_EINTR)
551
DBUG_PRINT("warning",("Interrupted write. Retrying..."));
554
net->error= 2; /* Close socket */
555
net->last_errno= (interrupted ? ER_NET_WRITE_INTERRUPTED :
556
ER_NET_ERROR_ON_WRITE);
596
560
update_statistics(thd_increment_bytes_sent(length));
599
if ((net->compress) && (packet != NULL))
600
free((char*) packet);
564
my_free((char*) packet,MYF(0));
565
if (thr_alarm_in_use(&alarmed))
568
thr_end_alarm(&alarmed);
569
vio_blocking(net->vio, net_blocking, &old_mode);
601
571
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
return(((int) (pos != end)));
572
DBUG_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.
577
Reads one packet to net->buff + net->where_b.
578
Long packets are handled by my_net_read().
579
This function reallocates the net->buff buffer if necessary.
619
Returns length of packet.
582
Returns length of packet.
623
586
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 :
633
/* Backup of the original SO_RCVTIMEO timeout */
634
struct timespec backtime;
590
uint i,retry_count=0;
591
ulong len=packet_error;
593
my_bool net_blocking=vio_is_blocking(net->vio);
594
uint32 remain= (net->compress ? NET_HEADER_SIZE+COMP_HEADER_SIZE :
640
net->reading_or_writing= 1;
598
net->reading_or_writing=1;
599
thr_alarm_init(&alarmed);
641
600
/* Read timeout is set in my_net_set_read_timeout */
643
pos = net->buff + net->where_b; /* net->packet -4 */
647
/* Check for error, currently assert */
648
if (net->read_timeout)
650
struct timespec waittime;
653
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,
602
pos = net->buff + net->where_b; /* net->packet -4 */
603
for (i=0 ; i < 2 ; i++)
662
perror("getsockopt");
665
error= setsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
666
&waittime, (socklen_t)sizeof(struct timespec));
607
/* First read is done with non blocking mode */
608
if ((long) (length= vio_read(net->vio, pos, remain)) <= 0L)
610
my_bool interrupted = vio_should_retry(net->vio);
612
DBUG_PRINT("info",("vio_read returned %ld errno: %d",
613
(long) length, vio_errno(net->vio)));
614
if (thr_alarm_in_use(&alarmed) && !thr_got_alarm(&alarmed) &&
616
{ /* Probably in MIT threads */
617
if (retry_count++ < net->retry_count)
620
fprintf(stderr, "%s: read looped with error %d, aborting thread\n",
621
my_progname,vio_errno(net->vio));
622
#endif /* EXTRA_DEBUG */
624
if (vio_errno(net->vio) == SOCKET_EINTR)
626
DBUG_PRINT("warning",("Interrupted read. Retrying..."));
629
DBUG_PRINT("error",("Couldn't read packet: remain: %u errno: %d length: %ld",
630
remain, vio_errno(net->vio), (long) length));
632
net->error= 2; /* Close socket */
633
net->last_errno= (vio_was_interrupted(net->vio) ?
634
ER_NET_READ_INTERRUPTED :
638
remain -= (uint32) length;
640
update_statistics(thd_increment_bytes_received(length));
643
{ /* First parts is packet length */
645
DBUG_DUMP("packet_header", net->buff+net->where_b,
647
if (net->buff[net->where_b + 3] != (uchar) net->pkt_nr)
649
if (net->buff[net->where_b] != (uchar) 255)
652
("Packets out of order (Found: %d, expected %u)",
653
(int) net->buff[net->where_b + 3],
657
fprintf(stderr,"Error: Packets out of order (Found: %d, expected %d)\n",
658
(int) net->buff[net->where_b + 3],
659
(uint) (uchar) net->pkt_nr);
671
for (i= 0; i < 2 ; i++)
675
/* First read is done with non blocking mode */
676
if ((long) (length= vio_read(net->vio, pos, remain)) <= 0L)
678
const bool interrupted = vio_should_retry(net->vio);
681
{ /* Probably in MIT threads */
682
if (retry_count++ < net->retry_count)
685
if (vio_errno(net->vio) == EINTR)
690
net->error= 2; /* Close socket */
691
net->last_errno= (vio_was_interrupted(net->vio) ?
692
CR_NET_READ_INTERRUPTED :
697
remain -= (uint32_t) length;
699
update_statistics(thd_increment_bytes_received(length));
702
{ /* First parts is packet length */
705
if (net->buff[net->where_b + 3] != (unsigned char) net->pkt_nr)
708
/* Not a NET error on the client. XXX: why? */
711
net->compress_pkt_nr= ++net->pkt_nr;
715
If the packet is compressed then complen > 0 and contains the
716
number of bytes in the uncompressed packet
718
*complen=uint3korr(&(net->buff[net->where_b + NET_HEADER_SIZE]));
721
len=uint3korr(net->buff+net->where_b);
722
if (!len) /* End of big multi-packet */
724
helping = max(len,*complen) + net->where_b;
725
/* The necessary size of net->buff */
726
if (helping >= net->max_packet)
728
if (net_realloc(net,helping))
730
len= packet_error; /* Return error and close connection */
734
pos=net->buff + net->where_b;
735
remain = (uint32_t) len;
665
/* Not a NET error on the client. XXX: why? */
668
net->compress_pkt_nr= ++net->pkt_nr;
672
If the packet is compressed then complen > 0 and contains the
673
number of bytes in the uncompressed packet
675
*complen=uint3korr(&(net->buff[net->where_b + NET_HEADER_SIZE]));
678
len=uint3korr(net->buff+net->where_b);
679
if (!len) /* End of big multi-packet */
681
helping = max(len,*complen) + net->where_b;
682
/* The necessary size of net->buff */
683
if (helping >= net->max_packet)
685
if (net_realloc(net,helping))
687
len= packet_error; /* Return error and close connection */
691
pos=net->buff + net->where_b;
692
remain = (uint32) len;
741
if (net->read_timeout)
742
error= setsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
743
&backtime, (socklen_t)sizeof(struct timespec));
697
if (thr_alarm_in_use(&alarmed))
700
thr_end_alarm(&alarmed);
701
vio_blocking(net->vio, net_blocking, &old_mode);
703
net->reading_or_writing=0;
704
#ifdef DEBUG_DATA_PACKETS
705
if (len != packet_error)
706
DBUG_DUMP("data", net->buff+net->where_b, len);
746
net->reading_or_writing= 0;
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.
713
Read a packet from the client/server and return it without the internal
716
If the packet is the first packet of a multi-packet packet
717
(which is indicated by the length of the packet = 0xffffff) then
718
all sub packets are read and concatenated.
720
If the packet was compressed, its uncompressed and the length of the
721
uncompressed packet is returned.
724
The function returns the length of the found packet or packet_error.
725
net->read_pos points to the read data.
769
729
my_net_read(NET *net)
771
731
size_t len, complen;
822
782
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;
784
read_length = uint3korr(net->buff+start_of_packet);
787
/* End of multi-byte packet */
788
start_of_packet += NET_HEADER_SIZE;
791
if (read_length + NET_HEADER_SIZE <= buf_length - start_of_packet)
793
if (multi_byte_packet)
795
/* Remove packet header for second packet */
796
memmove(net->buff + first_packet_offset + start_of_packet,
797
net->buff + first_packet_offset + start_of_packet +
799
buf_length - start_of_packet);
800
start_of_packet += read_length;
801
buf_length -= NET_HEADER_SIZE;
804
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;
806
if (read_length != MAX_PACKET_LENGTH) /* last package */
808
multi_byte_packet= 0; /* No last zero len packet */
811
multi_byte_packet= NET_HEADER_SIZE;
812
/* Move data down to read next data packet after current one */
813
if (first_packet_offset)
815
memmove(net->buff,net->buff+first_packet_offset,
816
buf_length-first_packet_offset);
817
buf_length-=first_packet_offset;
818
start_of_packet -= first_packet_offset;
819
first_packet_offset=0;
864
824
/* Move data down to read next data packet after current one */
865
825
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;
827
memmove(net->buff,net->buff+first_packet_offset,
828
buf_length-first_packet_offset);
829
buf_length-=first_packet_offset;
830
start_of_packet -= first_packet_offset;
831
first_packet_offset=0;
874
834
net->where_b=buf_length;
875
835
if ((packet_len = my_real_read(net,&complen)) == packet_error)
837
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);
840
net->error= 2; /* caller will close socket */
841
net->last_errno= ER_NET_UNCOMPRESS_ERROR;
844
buf_length+= complen;
905
buf_length+= complen;
907
847
net->read_pos= net->buff+ first_packet_offset + NET_HEADER_SIZE;
908
848
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 -
849
net->remain_in_buf= (ulong) (buf_length - start_of_packet);
850
len = ((ulong) (start_of_packet - first_packet_offset) - NET_HEADER_SIZE -
911
851
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 */
852
net->save_char= net->read_pos[len]; /* Must be saved */
853
net->read_pos[len]=0; /* Safeguard for mysql_use_result */
919
void my_net_set_read_timeout(NET *net, uint32_t timeout)
859
void my_net_set_read_timeout(NET *net, uint timeout)
861
DBUG_ENTER("my_net_set_read_timeout");
862
DBUG_PRINT("enter", ("timeout: %d", timeout));
921
863
net->read_timeout= timeout;
924
865
vio_timeout(net->vio, 0, timeout);
930
void my_net_set_write_timeout(NET *net, uint32_t timeout)
870
void my_net_set_write_timeout(NET *net, uint timeout)
872
DBUG_ENTER("my_net_set_write_timeout");
873
DBUG_PRINT("enter", ("timeout: %d", timeout));
932
874
net->write_timeout= timeout;
935
876
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());