206
186
if (res < 0 || !(ufds.revents & (POLLIN | POLLPRI)))
194
/* Windows uses an _array_ of 64 fd's as default, so it's safe */
195
if (sd >= FD_SETSIZE)
197
#define NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE
202
tv.tv_sec= tv.tv_usec= 0;
204
if ((res= select(sd+1, &sfds, NULL, NULL, &tv)) < 0)
207
return test(res ? FD_ISSET(sd, &sfds) : 0);
208
#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
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
229
void net_clear(NET *net, bool clear_buffer)
229
void net_clear(NET *net, my_bool clear_buffer)
233
DBUG_ENTER("net_clear");
231
235
if (clear_buffer)
233
while (net_data_is_ready(net->vio->sd) > 0)
237
while ((ready= net_data_is_ready(net->vio->sd)) > 0)
235
239
/* The socket is ready */
236
if (vio_read(net->vio, net->buff,
237
(size_t) net->max_packet) <= 0)
240
if ((long) (count= vio_read(net->vio, net->buff,
241
(size_t) net->max_packet)) > 0)
243
DBUG_PRINT("info",("skipped %ld bytes from file: %s",
244
(long) count, vio_description(net->vio)));
248
DBUG_PRINT("info",("socket ready but only EOF to read - disconnected"));
253
#ifdef NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE
254
/* 'net_data_is_ready' returned "don't know" */
257
/* Read unblocking to clear net */
259
if (!vio_blocking(net->vio, FALSE, &old_mode))
261
while ((long) (count= vio_read(net->vio, net->buff,
262
(size_t) net->max_packet)) > 0)
263
DBUG_PRINT("info",("skipped %ld bytes from file: %s",
264
(long) count, vio_description(net->vio)));
265
vio_blocking(net->vio, TRUE, &old_mode);
268
#endif /* NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE */
244
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
270
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
245
271
net->write_pos=net->buff;
250
276
/** Flush write_buffer if not empty. */
252
bool net_flush(NET *net)
278
my_bool net_flush(NET *net)
281
DBUG_ENTER("net_flush");
255
282
if (net->buff != net->write_pos)
257
error=net_real_write(net, net->buff,
258
(size_t) (net->write_pos - net->buff)) ? 1 : 0;
284
error=test(net_real_write(net, net->buff,
285
(size_t) (net->write_pos - net->buff)));
259
286
net->write_pos=net->buff;
261
288
/* Sync packet number if using compression */
262
289
if (net->compress)
263
290
net->pkt_nr=net->compress_pkt_nr;
268
295
/*****************************************************************************
269
** Write something to server/client buffer
270
*****************************************************************************/
296
** Write something to server/client buffer
297
*****************************************************************************/
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!
300
Write a logical packet with packet header.
302
Format: Packet length (3 bytes), packet number(1 byte)
303
When compression is used a 3 byte compression length is added
306
If compression is used the original package is modified!
283
my_net_write(NET *net,const unsigned char *packet,size_t len)
310
my_net_write(NET *net,const uchar *packet,size_t len)
285
unsigned char buff[NET_HEADER_SIZE];
312
uchar buff[NET_HEADER_SIZE];
286
313
if (unlikely(!net->vio)) /* nowhere to write */
293
320
while (len >= MAX_PACKET_LENGTH)
295
const uint32_t z_size = MAX_PACKET_LENGTH;
322
const ulong z_size = MAX_PACKET_LENGTH;
296
323
int3store(buff, z_size);
297
buff[3]= (unsigned char) net->pkt_nr++;
324
buff[3]= (uchar) net->pkt_nr++;
298
325
if (net_write_buff(net, buff, NET_HEADER_SIZE) ||
299
net_write_buff(net, packet, z_size))
326
net_write_buff(net, packet, z_size))
301
328
packet += z_size;
304
331
/* Write last packet */
305
332
int3store(buff,len);
306
buff[3]= (unsigned char) net->pkt_nr++;
333
buff[3]= (uchar) net->pkt_nr++;
307
334
if (net_write_buff(net, buff, NET_HEADER_SIZE))
309
return net_write_buff(net,packet,len) ? 1 : 0;
336
#ifndef DEBUG_DATA_PACKETS
337
DBUG_DUMP("packet_header", buff, NET_HEADER_SIZE);
339
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
343
Send a command to the server.
345
The reason for having both header and packet is so that libmysql
346
can easy add a header to a special command (like prepared statements)
347
without having to re-alloc the string.
349
As the command is part of the first data packet, we have to do some data
350
juggling to put the command in there, without having to create a new
353
This function will split big packets into sub-packets if needed.
354
(Each sub packet can only be 2^24 bytes)
356
@param net NET handler
357
@param command Command in MySQL server (enum enum_server_command)
358
@param header Header to write after command
359
@param head_len Length of header
360
@param packet Query or parameter to query
361
@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)
370
net_write_command(NET *net,uchar command,
371
const uchar *header, size_t head_len,
372
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;
374
ulong length=len+1+head_len; /* 1 extra byte for command */
375
uchar buff[NET_HEADER_SIZE+1];
376
uint header_size=NET_HEADER_SIZE+1;
377
DBUG_ENTER("net_write_command");
378
DBUG_PRINT("enter",("length: %lu", (ulong) len));
348
buff[4]=command; /* For first packet */
380
buff[4]=command; /* For first packet */
350
382
if (length >= MAX_PACKET_LENGTH)
356
388
int3store(buff, MAX_PACKET_LENGTH);
357
buff[3]= (unsigned char) net->pkt_nr++;
389
buff[3]= (uchar) net->pkt_nr++;
358
390
if (net_write_buff(net, buff, header_size) ||
359
net_write_buff(net, header, head_len) ||
360
net_write_buff(net, packet, len))
391
net_write_buff(net, header, head_len) ||
392
net_write_buff(net, packet, len))
363
395
length-= MAX_PACKET_LENGTH;
364
396
len= MAX_PACKET_LENGTH;
366
398
header_size= NET_HEADER_SIZE;
367
399
} while (length >= MAX_PACKET_LENGTH);
368
len=length; /* Data left to be written */
400
len=length; /* Data left to be written */
370
402
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 );
403
buff[3]= (uchar) net->pkt_nr++;
404
DBUG_RETURN(test(net_write_buff(net, buff, header_size) ||
405
(head_len && net_write_buff(net, header, head_len)) ||
406
net_write_buff(net, packet, len) || net_flush(net)));
378
Caching the data in a local buffer before sending it.
410
Caching the data in a local buffer before sending it.
380
412
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.
414
If the rest of the to-be-sent-packet is bigger than buffer,
415
send it in one big block (to avoid copying to internal buffer).
416
If not, copy the rest of the data to the buffer and return without
419
@param net Network handler
420
@param packet Packet to send
421
@param len Length of packet
424
The cached buffer can be sent as it is with 'net_flush()'.
425
In this code we have to be careful to not send a packet longer than
426
MAX_PACKET_LENGTH to net_real_write() if we are using the compressed
427
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)
436
net_write_buff(NET *net, const uchar *packet, ulong len)
406
uint32_t left_length;
407
439
if (net->compress && net->max_packet > MAX_PACKET_LENGTH)
408
440
left_length= MAX_PACKET_LENGTH - (net->write_pos - net->buff);
410
left_length= (uint32_t) (net->buff_end - net->write_pos);
442
left_length= (ulong) (net->buff_end - net->write_pos);
444
#ifdef DEBUG_DATA_PACKETS
445
DBUG_DUMP("data", packet, len);
412
447
if (len > left_length)
414
449
if (net->write_pos != net->buff)
416
451
/* 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))
452
memcpy((char*) net->write_pos,packet,left_length);
453
if (net_real_write(net, net->buff,
454
(size_t) (net->write_pos - net->buff) + left_length))
421
456
net->write_pos= net->buff;
422
457
packet+= left_length;
423
458
len-= left_length;
425
460
if (net->compress)
428
We can't have bigger packets than 16M with compression
429
Because the uncompressed length is stored in 3 bytes
463
We can't have bigger packets than 16M with compression
464
Because the uncompressed length is stored in 3 bytes
431
466
left_length= MAX_PACKET_LENGTH;
432
467
while (len > left_length)
434
if (net_real_write(net, packet, left_length))
436
packet+= left_length;
469
if (net_real_write(net, packet, left_length))
471
packet+= left_length;
440
475
if (len > net->max_packet)
441
476
return net_real_write(net, packet, len) ? 1 : 0;
442
477
/* Send out rest of the blocks as full sized blocks */
444
memcpy(net->write_pos,packet,len);
479
memcpy((char*) net->write_pos,packet,len);
445
480
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.
486
Read and write one packet using timeouts.
487
If needed, the packet is compressed before sending.
490
- 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)
494
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;
497
const uchar *pos,*end;
503
my_bool net_blocking = vio_is_blocking(net->vio);
504
DBUG_ENTER("net_real_write");
475
506
if (net->error == 2)
476
return(-1); /* socket can't be used */
507
DBUG_RETURN(-1); /* socket can't be used */
478
509
net->reading_or_writing=2;
479
510
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 +
514
uint header_length=NET_HEADER_SIZE+COMP_HEADER_SIZE;
515
if (!(b= (uchar*) my_malloc(len + NET_HEADER_SIZE +
516
COMP_HEADER_SIZE, MYF(MY_WME))))
488
net->last_errno= CR_OUT_OF_MEMORY;
519
net->last_errno= ER_OUT_OF_RESOURCES;
489
520
/* In the server, the error is reported by MY_WME flag. */
490
521
net->reading_or_writing= 0;
493
524
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;
526
if (my_compress(b+header_length, &len, &complen))
520
528
int3store(&b[NET_HEADER_SIZE],complen);
521
529
int3store(b,len);
522
b[3]=(unsigned char) (net->compress_pkt_nr++);
530
b[3]=(uchar) (net->compress_pkt_nr++);
523
531
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));
535
#ifdef DEBUG_DATA_PACKETS
536
DBUG_DUMP("data", packet, len);
540
thr_alarm_init(&alarmed);
542
thr_alarm(&alarmed, net->write_timeout, &alarm_buff);
545
/* Write timeout is set in my_net_set_write_timeout */
546
#endif /* NO_ALARM */
554
/* Loop until we have read everything */
555
550
while (pos != end)
557
552
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))
554
my_bool interrupted = vio_should_retry(net->vio);
555
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;
557
if (!thr_alarm(&alarmed, net->write_timeout, &alarm_buff))
558
{ /* Always true for client */
560
while (vio_blocking(net->vio, TRUE, &old_mode) < 0)
562
if (vio_should_retry(net->vio) && retry_count++ < net->retry_count)
566
"%s: my_net_write: fcntl returned error %d, aborting thread\n",
567
my_progname,vio_errno(net->vio));
568
#endif /* EXTRA_DEBUG */
569
net->error= 2; /* Close socket */
570
net->last_errno= ER_NET_PACKET_TOO_LARGE;
572
my_error(ER_NET_PACKET_TOO_LARGE, MYF(0));
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);
581
if (thr_alarm_in_use(&alarmed) && !thr_got_alarm(&alarmed) &&
584
if (retry_count++ < net->retry_count)
587
fprintf(stderr, "%s: write looped, aborting thread\n",
589
#endif /* EXTRA_DEBUG */
591
#if !defined(MYSQL_SERVER)
592
if (vio_errno(net->vio) == SOCKET_EINTR)
594
DBUG_PRINT("warning",("Interrupted write. Retrying..."));
597
#endif /* !defined(MYSQL_SERVER) */
598
net->error= 2; /* Close socket */
599
net->last_errno= (interrupted ? ER_NET_WRITE_INTERRUPTED :
600
ER_NET_ERROR_ON_WRITE);
602
my_error(net->last_errno, MYF(0));
603
#endif /* MYSQL_SERVER */
596
607
update_statistics(thd_increment_bytes_sent(length));
599
if ((net->compress) && (packet != NULL))
600
free((char*) packet);
611
my_free((char*) packet,MYF(0));
612
if (thr_alarm_in_use(&alarmed))
615
thr_end_alarm(&alarmed);
616
vio_blocking(net->vio, net_blocking, &old_mode);
601
618
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)));
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.
619
Returns length of packet.
619
DBUG_RETURN(((int) (pos != end)));
623
/*****************************************************************************
624
** Read something from server/clinet
625
*****************************************************************************/
629
static my_bool net_safe_read(NET *net, uchar *buff, size_t length,
630
thr_alarm_t *alarmed)
636
if ((long) (tmp= vio_read(net->vio, buff, length)) <= 0)
638
my_bool interrupted = vio_should_retry(net->vio);
639
if (!thr_got_alarm(alarmed) && interrupted)
640
{ /* Probably in MIT threads */
641
if (retry_count++ < net->retry_count)
653
Help function to clear the commuication buffer when we get a too big packet.
655
@param net Communication handle
656
@param remain Bytes to read
657
@param alarmed Parameter for thr_alarm()
658
@param alarm_buff Parameter for thr_alarm()
661
0 Was able to read the whole packet
663
1 Got mailformed packet from client
666
static my_bool my_net_skip_rest(NET *net, uint32 remain, thr_alarm_t *alarmed,
670
DBUG_ENTER("my_net_skip_rest");
671
DBUG_PRINT("enter",("bytes_to_skip: %u", (uint) remain));
673
/* The following is good for debugging */
674
update_statistics(thd_increment_net_big_packet_count(1));
676
if (!thr_alarm_in_use(alarmed))
679
if (thr_alarm(alarmed,net->read_timeout, alarm_buff) ||
680
vio_blocking(net->vio, TRUE, &old_mode) < 0)
681
DBUG_RETURN(1); /* Can't setup, abort */
687
size_t length= min(remain, net->max_packet);
688
if (net_safe_read(net, net->buff, length, alarmed))
690
update_statistics(thd_increment_bytes_received(length));
691
remain -= (uint32) length;
693
if (old != MAX_PACKET_LENGTH)
695
if (net_safe_read(net, net->buff, NET_HEADER_SIZE, alarmed))
697
old=remain= uint3korr(net->buff);
702
#endif /* NO_ALARM */
706
Reads one packet to net->buff + net->where_b.
707
Long packets are handled by my_net_read().
708
This function reallocates the net->buff buffer if necessary.
711
Returns length of packet.
623
715
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;
719
uint i,retry_count=0;
720
ulong len=packet_error;
725
my_bool net_blocking=vio_is_blocking(net->vio);
726
uint32 remain= (net->compress ? NET_HEADER_SIZE+COMP_HEADER_SIZE :
640
net->reading_or_writing= 1;
730
net->reading_or_writing=1;
731
thr_alarm_init(&alarmed);
734
thr_alarm(&alarmed,net->read_timeout,&alarm_buff);
641
736
/* 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,
662
perror("getsockopt");
665
error= setsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
666
&waittime, (socklen_t)sizeof(struct timespec));
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;
737
#endif /* NO_ALARM */
739
pos = net->buff + net->where_b; /* net->packet -4 */
740
for (i=0 ; i < 2 ; i++)
744
/* First read is done with non blocking mode */
745
if ((long) (length= vio_read(net->vio, pos, remain)) <= 0L)
747
my_bool interrupted = vio_should_retry(net->vio);
749
DBUG_PRINT("info",("vio_read returned %ld errno: %d",
750
(long) length, vio_errno(net->vio)));
751
#if defined(MYSQL_SERVER)
753
We got an error that there was no data on the socket. We now set up
754
an alarm to not 'read forever', change the socket to non blocking
757
if ((interrupted || length == 0) && !thr_alarm_in_use(&alarmed))
759
if (!thr_alarm(&alarmed,net->read_timeout,&alarm_buff)) /* Don't wait too long */
762
while (vio_blocking(net->vio, TRUE, &old_mode) < 0)
764
if (vio_should_retry(net->vio) &&
765
retry_count++ < net->retry_count)
768
("fcntl returned error %d, aborting thread",
769
vio_errno(net->vio)));
772
"%s: read: fcntl returned error %d, aborting thread\n",
773
my_progname,vio_errno(net->vio));
774
#endif /* EXTRA_DEBUG */
776
net->error= 2; /* Close socket */
777
net->last_errno= ER_NET_FCNTL_ERROR;
779
my_error(ER_NET_FCNTL_ERROR, MYF(0));
787
#endif /* defined(MYSQL_SERVER) */
788
if (thr_alarm_in_use(&alarmed) && !thr_got_alarm(&alarmed) &&
790
{ /* Probably in MIT threads */
791
if (retry_count++ < net->retry_count)
794
fprintf(stderr, "%s: read looped with error %d, aborting thread\n",
795
my_progname,vio_errno(net->vio));
796
#endif /* EXTRA_DEBUG */
798
#if !defined(MYSQL_SERVER)
799
if (vio_errno(net->vio) == SOCKET_EINTR)
801
DBUG_PRINT("warning",("Interrupted read. Retrying..."));
805
DBUG_PRINT("error",("Couldn't read packet: remain: %u errno: %d length: %ld",
806
remain, vio_errno(net->vio), (long) length));
808
net->error= 2; /* Close socket */
809
net->last_errno= (vio_was_interrupted(net->vio) ?
810
ER_NET_READ_INTERRUPTED :
813
my_error(net->last_errno, MYF(0));
817
remain -= (uint32) length;
819
update_statistics(thd_increment_bytes_received(length));
822
{ /* First parts is packet length */
824
DBUG_DUMP("packet_header", net->buff+net->where_b,
826
if (net->buff[net->where_b + 3] != (uchar) net->pkt_nr)
828
if (net->buff[net->where_b] != (uchar) 255)
831
("Packets out of order (Found: %d, expected %u)",
832
(int) net->buff[net->where_b + 3],
836
fprintf(stderr,"Error: Packets out of order (Found: %d, expected %d)\n",
837
(int) net->buff[net->where_b + 3],
838
(uint) (uchar) net->pkt_nr);
844
/* Not a NET error on the client. XXX: why? */
846
my_error(ER_NET_PACKETS_OUT_OF_ORDER, MYF(0));
850
net->compress_pkt_nr= ++net->pkt_nr;
854
If the packet is compressed then complen > 0 and contains the
855
number of bytes in the uncompressed packet
857
*complen=uint3korr(&(net->buff[net->where_b + NET_HEADER_SIZE]));
860
len=uint3korr(net->buff+net->where_b);
861
if (!len) /* End of big multi-packet */
863
helping = max(len,*complen) + net->where_b;
864
/* The necessary size of net->buff */
865
if (helping >= net->max_packet)
867
if (net_realloc(net,helping))
869
#if defined(MYSQL_SERVER) && !defined(NO_ALARM)
870
if (!net->compress &&
871
!my_net_skip_rest(net, (uint32) len, &alarmed, &alarm_buff))
872
net->error= 3; /* Successfully skiped packet */
874
len= packet_error; /* Return error and close connection */
878
pos=net->buff + net->where_b;
879
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));
884
if (thr_alarm_in_use(&alarmed))
887
thr_end_alarm(&alarmed);
888
vio_blocking(net->vio, net_blocking, &old_mode);
890
net->reading_or_writing=0;
891
#ifdef DEBUG_DATA_PACKETS
892
if (len != packet_error)
893
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.
900
Read a packet from the client/server and return it without the internal
903
If the packet is the first packet of a multi-packet packet
904
(which is indicated by the length of the packet = 0xffffff) then
905
all sub packets are read and concatenated.
907
If the packet was compressed, its uncompressed and the length of the
908
uncompressed packet is returned.
911
The function returns the length of the found packet or packet_error.
912
net->read_pos points to the read data.
769
916
my_net_read(NET *net)
771
918
size_t len, complen;
822
969
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;
971
read_length = uint3korr(net->buff+start_of_packet);
974
/* End of multi-byte packet */
975
start_of_packet += NET_HEADER_SIZE;
978
if (read_length + NET_HEADER_SIZE <= buf_length - start_of_packet)
980
if (multi_byte_packet)
982
/* Remove packet header for second packet */
983
memmove(net->buff + first_packet_offset + start_of_packet,
984
net->buff + first_packet_offset + start_of_packet +
986
buf_length - start_of_packet);
987
start_of_packet += read_length;
988
buf_length -= NET_HEADER_SIZE;
991
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;
993
if (read_length != MAX_PACKET_LENGTH) /* last package */
995
multi_byte_packet= 0; /* No last zero len packet */
998
multi_byte_packet= NET_HEADER_SIZE;
999
/* Move data down to read next data packet after current one */
1000
if (first_packet_offset)
1002
memmove(net->buff,net->buff+first_packet_offset,
1003
buf_length-first_packet_offset);
1004
buf_length-=first_packet_offset;
1005
start_of_packet -= first_packet_offset;
1006
first_packet_offset=0;
864
1011
/* Move data down to read next data packet after current one */
865
1012
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;
1014
memmove(net->buff,net->buff+first_packet_offset,
1015
buf_length-first_packet_offset);
1016
buf_length-=first_packet_offset;
1017
start_of_packet -= first_packet_offset;
1018
first_packet_offset=0;
874
1021
net->where_b=buf_length;
875
1022
if ((packet_len = my_real_read(net,&complen)) == packet_error)
1023
return packet_error;
1024
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);
1027
net->error= 2; /* caller will close socket */
1028
net->last_errno= ER_NET_UNCOMPRESS_ERROR;
1030
my_error(ER_NET_UNCOMPRESS_ERROR, MYF(0));
1032
return packet_error;
1034
buf_length+= complen;
905
buf_length+= complen;
907
1037
net->read_pos= net->buff+ first_packet_offset + NET_HEADER_SIZE;
908
1038
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 -
1039
net->remain_in_buf= (ulong) (buf_length - start_of_packet);
1040
len = ((ulong) (start_of_packet - first_packet_offset) - NET_HEADER_SIZE -
911
1041
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 */
1042
net->save_char= net->read_pos[len]; /* Must be saved */
1043
net->read_pos[len]=0; /* Safeguard for mysql_use_result */
919
void my_net_set_read_timeout(NET *net, uint32_t timeout)
1049
void my_net_set_read_timeout(NET *net, uint timeout)
1051
DBUG_ENTER("my_net_set_read_timeout");
1052
DBUG_PRINT("enter", ("timeout: %d", timeout));
921
1053
net->read_timeout= timeout;
924
1056
vio_timeout(net->vio, 0, timeout);
930
void my_net_set_write_timeout(NET *net, uint32_t timeout)
1062
void my_net_set_write_timeout(NET *net, uint timeout)
1064
DBUG_ENTER("my_net_set_write_timeout");
1065
DBUG_PRINT("enter", ("timeout: %d", timeout));
932
1066
net->write_timeout= timeout;
935
1069
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());