comparison common-channel.c @ 1049:01eea88963f3 fastopen

merge from default
author Matt Johnston <matt@ucc.asn.au>
date Sat, 28 Feb 2015 09:06:40 +0800
parents 0da8ba489c23 d0e6dd5af46e
children c71df09bc610
comparison
equal deleted inserted replaced
1048:9cec9ed503bb 1049:01eea88963f3
393 393
394 394
395 /* Send the close message and set the channel as closed */ 395 /* Send the close message and set the channel as closed */
396 static void send_msg_channel_close(struct Channel *channel) { 396 static void send_msg_channel_close(struct Channel *channel) {
397 397
398 TRACE(("enter send_msg_channel_close %p", channel)) 398 TRACE(("enter send_msg_channel_close %p", (void*)channel))
399 if (channel->type->closehandler 399 if (channel->type->closehandler
400 && !channel->close_handler_done) { 400 && !channel->close_handler_done) {
401 channel->type->closehandler(channel); 401 channel->type->closehandler(channel);
402 channel->close_handler_done = 1; 402 channel->close_handler_done = 1;
403 } 403 }
576 576
577 if (IS_DROPBEAR_SERVER || (channel->writefd != STDOUT_FILENO)) { 577 if (IS_DROPBEAR_SERVER || (channel->writefd != STDOUT_FILENO)) {
578 /* close the FDs in case they haven't been done 578 /* close the FDs in case they haven't been done
579 * yet (they might have been shutdown etc) */ 579 * yet (they might have been shutdown etc) */
580 TRACE(("CLOSE writefd %d", channel->writefd)) 580 TRACE(("CLOSE writefd %d", channel->writefd))
581 close(channel->writefd); 581 m_close(channel->writefd);
582 TRACE(("CLOSE readfd %d", channel->readfd)) 582 TRACE(("CLOSE readfd %d", channel->readfd))
583 close(channel->readfd); 583 m_close(channel->readfd);
584 TRACE(("CLOSE errfd %d", channel->errfd)) 584 TRACE(("CLOSE errfd %d", channel->errfd))
585 close(channel->errfd); 585 m_close(channel->errfd);
586 } 586 }
587 587
588 if (!channel->close_handler_done 588 if (!channel->close_handler_done
589 && channel->type->closehandler) { 589 && channel->type->closehandler) {
590 channel->type->closehandler(channel); 590 channel->type->closehandler(channel);
610 610
611 struct Channel *channel; 611 struct Channel *channel;
612 612
613 channel = getchannel(); 613 channel = getchannel();
614 614
615 TRACE(("enter recv_msg_channel_request %p", channel)) 615 TRACE(("enter recv_msg_channel_request %p", (void*)channel))
616 616
617 if (channel->sent_close) { 617 if (channel->sent_close) {
618 TRACE(("leave recv_msg_channel_request: already closed channel")) 618 TRACE(("leave recv_msg_channel_request: already closed channel"))
619 return; 619 return;
620 } 620 }
995 } else { 995 } else {
996 closein = 1; 996 closein = 1;
997 } 997 }
998 } else { 998 } else {
999 TRACE(("CLOSE some fd %d", fd)) 999 TRACE(("CLOSE some fd %d", fd))
1000 close(fd); 1000 m_close(fd);
1001 closein = closeout = 1; 1001 closein = closeout = 1;
1002 } 1002 }
1003 1003
1004 if (closeout && (fd == channel->readfd)) { 1004 if (closeout && (fd == channel->readfd)) {
1005 channel->readfd = FD_CLOSED; 1005 channel->readfd = FD_CLOSED;
1018 /* if we called shutdown on it and all references are gone, then we 1018 /* if we called shutdown on it and all references are gone, then we
1019 * need to close() it to stop it lingering */ 1019 * need to close() it to stop it lingering */
1020 if (channel->type->sepfds && channel->readfd == FD_CLOSED 1020 if (channel->type->sepfds && channel->readfd == FD_CLOSED
1021 && channel->writefd == FD_CLOSED && channel->errfd == FD_CLOSED) { 1021 && channel->writefd == FD_CLOSED && channel->errfd == FD_CLOSED) {
1022 TRACE(("CLOSE (finally) of %d", fd)) 1022 TRACE(("CLOSE (finally) of %d", fd))
1023 close(fd); 1023 m_close(fd);
1024 } 1024 }
1025 } 1025 }
1026 1026
1027 1027
1028 #if defined(USING_LISTENERS) || defined(DROPBEAR_CLIENT) 1028 #if defined(USING_LISTENERS) || defined(DROPBEAR_CLIENT)
1135 buf_putbyte(ses.writepayload, SSH_MSG_REQUEST_FAILURE); 1135 buf_putbyte(ses.writepayload, SSH_MSG_REQUEST_FAILURE);
1136 encrypt_packet(); 1136 encrypt_packet();
1137 } 1137 }
1138 1138
1139 struct Channel* get_any_ready_channel() { 1139 struct Channel* get_any_ready_channel() {
1140 size_t i;
1140 if (ses.chancount == 0) { 1141 if (ses.chancount == 0) {
1141 return NULL; 1142 return NULL;
1142 } 1143 }
1143 size_t i;
1144 for (i = 0; i < ses.chansize; i++) { 1144 for (i = 0; i < ses.chansize; i++) {
1145 struct Channel *chan = ses.channels[i]; 1145 struct Channel *chan = ses.channels[i];
1146 if (chan 1146 if (chan
1147 && !(chan->sent_eof || chan->recv_eof) 1147 && !(chan->sent_eof || chan->recv_eof)
1148 && !(chan->await_open)) { 1148 && !(chan->await_open)) {