comparison common-channel.c @ 722:4a274f47eabd

Add ~. and ~^Z handling to exit/suspend dbclient
author Matt Johnston <matt@ucc.asn.au>
date Sat, 23 Mar 2013 23:16:06 +0800
parents abd99ecd7ec2
children 9a5438271556
comparison
equal deleted inserted replaced
721:62fb0b5ff683 722:4a274f47eabd
641 size_pos = ses.writepayload->pos; 641 size_pos = ses.writepayload->pos;
642 buf_putint(ses.writepayload, 0); 642 buf_putint(ses.writepayload, 0);
643 643
644 /* read the data */ 644 /* read the data */
645 len = read(fd, buf_getwriteptr(ses.writepayload, maxlen), maxlen); 645 len = read(fd, buf_getwriteptr(ses.writepayload, maxlen), maxlen);
646
646 if (len <= 0) { 647 if (len <= 0) {
647 if (len == 0 || errno != EINTR) { 648 if (len == 0 || errno != EINTR) {
648 /* This will also get hit in the case of EAGAIN. The only 649 /* This will also get hit in the case of EAGAIN. The only
649 time we expect to receive EAGAIN is when we're flushing a FD, 650 time we expect to receive EAGAIN is when we're flushing a FD,
650 in which case it can be treated the same as EOF */ 651 in which case it can be treated the same as EOF */
651 close_chan_fd(channel, fd, SHUT_RD); 652 close_chan_fd(channel, fd, SHUT_RD);
652 } 653 }
653 ses.writepayload->len = ses.writepayload->pos = 0; 654 buf_setpos(ses.writepayload, 0);
655 buf_setlen(ses.writepayload, 0);
654 TRACE(("leave send_msg_channel_data: len %d read err %d or EOF for fd %d", 656 TRACE(("leave send_msg_channel_data: len %d read err %d or EOF for fd %d",
655 len, errno, fd)) 657 len, errno, fd))
656 return; 658 return;
659 }
660
661 if (channel->read_mangler) {
662 channel->read_mangler(channel, buf_getwriteptr(ses.writepayload, len), &len);
663 if (len == 0) {
664 buf_setpos(ses.writepayload, 0);
665 buf_setlen(ses.writepayload, 0);
666 return;
667 }
657 } 668 }
658 669
659 TRACE(("send_msg_channel_data: len %d fd %d", len, fd)) 670 TRACE(("send_msg_channel_data: len %d fd %d", len, fd))
660 buf_incrwritepos(ses.writepayload, len); 671 buf_incrwritepos(ses.writepayload, len);
661 /* ... real size here */ 672 /* ... real size here */