Mercurial > dropbear
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 */ |