- markus@cvs.openbsd.org 2002/01/13 21:31:20
[channels.h nchan.c] add chan_set_[io]state(), order states, state is now an u_int, simplifies debugging messages; ok provos@
This commit is contained in:
parent
0e3b87279c
commit
abea8ee1c3
|
@ -159,6 +159,10 @@
|
||||||
[auth2.c auth2-chall.c compat.c sshconnect2.c sshd.c]
|
[auth2.c auth2-chall.c compat.c sshconnect2.c sshd.c]
|
||||||
use buffer API and avoid static strings of fixed size;
|
use buffer API and avoid static strings of fixed size;
|
||||||
ok provos@/mouring@
|
ok provos@/mouring@
|
||||||
|
- markus@cvs.openbsd.org 2002/01/13 21:31:20
|
||||||
|
[channels.h nchan.c]
|
||||||
|
add chan_set_[io]state(), order states, state is now an u_int,
|
||||||
|
simplifies debugging messages; ok provos@
|
||||||
|
|
||||||
|
|
||||||
20020121
|
20020121
|
||||||
|
@ -7307,4 +7311,4 @@
|
||||||
- Wrote replacements for strlcpy and mkdtemp
|
- Wrote replacements for strlcpy and mkdtemp
|
||||||
- Released 1.0pre1
|
- Released 1.0pre1
|
||||||
|
|
||||||
$Id: ChangeLog,v 1.1768 2002/01/22 12:26:38 djm Exp $
|
$Id: ChangeLog,v 1.1769 2002/01/22 12:27:11 djm Exp $
|
||||||
|
|
22
channels.h
22
channels.h
|
@ -32,7 +32,7 @@
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
/* RCSID("$OpenBSD: channels.h,v 1.56 2001/12/28 15:06:00 markus Exp $"); */
|
/* RCSID("$OpenBSD: channels.h,v 1.57 2002/01/13 21:31:20 markus Exp $"); */
|
||||||
|
|
||||||
#ifndef CHANNEL_H
|
#ifndef CHANNEL_H
|
||||||
#define CHANNEL_H
|
#define CHANNEL_H
|
||||||
|
@ -68,8 +68,8 @@ struct Channel {
|
||||||
int type; /* channel type/state */
|
int type; /* channel type/state */
|
||||||
int self; /* my own channel identifier */
|
int self; /* my own channel identifier */
|
||||||
int remote_id; /* channel identifier for remote peer */
|
int remote_id; /* channel identifier for remote peer */
|
||||||
int istate; /* input from channel (state of receive half) */
|
u_int istate; /* input from channel (state of receive half) */
|
||||||
int ostate; /* output to channel (state of transmit half) */
|
u_int ostate; /* output to channel (state of transmit half) */
|
||||||
int flags; /* close sent/rcvd */
|
int flags; /* close sent/rcvd */
|
||||||
int rfd; /* read fd */
|
int rfd; /* read fd */
|
||||||
int wfd; /* write fd */
|
int wfd; /* write fd */
|
||||||
|
@ -123,16 +123,16 @@ struct Channel {
|
||||||
#define CHAN_X11_PACKET_DEFAULT (CHAN_X11_WINDOW_DEFAULT/2)
|
#define CHAN_X11_PACKET_DEFAULT (CHAN_X11_WINDOW_DEFAULT/2)
|
||||||
|
|
||||||
/* possible input states */
|
/* possible input states */
|
||||||
#define CHAN_INPUT_OPEN 0x01
|
#define CHAN_INPUT_OPEN 0
|
||||||
#define CHAN_INPUT_WAIT_DRAIN 0x02
|
#define CHAN_INPUT_WAIT_DRAIN 1
|
||||||
#define CHAN_INPUT_WAIT_OCLOSE 0x04
|
#define CHAN_INPUT_WAIT_OCLOSE 2
|
||||||
#define CHAN_INPUT_CLOSED 0x08
|
#define CHAN_INPUT_CLOSED 3
|
||||||
|
|
||||||
/* possible output states */
|
/* possible output states */
|
||||||
#define CHAN_OUTPUT_OPEN 0x10
|
#define CHAN_OUTPUT_OPEN 0
|
||||||
#define CHAN_OUTPUT_WAIT_DRAIN 0x20
|
#define CHAN_OUTPUT_WAIT_DRAIN 1
|
||||||
#define CHAN_OUTPUT_WAIT_IEOF 0x40
|
#define CHAN_OUTPUT_WAIT_IEOF 2
|
||||||
#define CHAN_OUTPUT_CLOSED 0x80
|
#define CHAN_OUTPUT_CLOSED 3
|
||||||
|
|
||||||
#define CHAN_CLOSE_SENT 0x01
|
#define CHAN_CLOSE_SENT 0x01
|
||||||
#define CHAN_CLOSE_RCVD 0x02
|
#define CHAN_CLOSE_RCVD 0x02
|
||||||
|
|
83
nchan.c
83
nchan.c
|
@ -23,7 +23,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
RCSID("$OpenBSD: nchan.c,v 1.36 2002/01/10 12:47:59 markus Exp $");
|
RCSID("$OpenBSD: nchan.c,v 1.37 2002/01/13 21:31:20 markus Exp $");
|
||||||
|
|
||||||
#include "ssh1.h"
|
#include "ssh1.h"
|
||||||
#include "ssh2.h"
|
#include "ssh2.h"
|
||||||
|
@ -83,6 +83,28 @@ static void chan_send_eof2(Channel *);
|
||||||
static void chan_shutdown_write(Channel *);
|
static void chan_shutdown_write(Channel *);
|
||||||
static void chan_shutdown_read(Channel *);
|
static void chan_shutdown_read(Channel *);
|
||||||
|
|
||||||
|
static char *ostates[] = { "open", "drain", "wait_ieof", "closed" };
|
||||||
|
static char *istates[] = { "open", "drain", "wait_oclose", "closed" };
|
||||||
|
|
||||||
|
static void
|
||||||
|
chan_set_istate(Channel *c, u_int next)
|
||||||
|
{
|
||||||
|
if (c->istate > CHAN_INPUT_CLOSED || next > CHAN_INPUT_CLOSED)
|
||||||
|
fatal("chan_set_istate: bad state %d -> %d", c->istate, next);
|
||||||
|
debug("channel %d: input %s -> %s", c->self, istates[c->istate],
|
||||||
|
istates[next]);
|
||||||
|
c->istate = next;
|
||||||
|
}
|
||||||
|
static void
|
||||||
|
chan_set_ostate(Channel *c, u_int next)
|
||||||
|
{
|
||||||
|
if (c->ostate > CHAN_OUTPUT_CLOSED || next > CHAN_OUTPUT_CLOSED)
|
||||||
|
fatal("chan_set_ostate: bad state %d -> %d", c->ostate, next);
|
||||||
|
debug("channel %d: output %s -> %s", c->self, ostates[c->ostate],
|
||||||
|
ostates[next]);
|
||||||
|
c->ostate = next;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SSH1 specific implementation of event functions
|
* SSH1 specific implementation of event functions
|
||||||
*/
|
*/
|
||||||
|
@ -93,20 +115,17 @@ chan_rcvd_oclose1(Channel *c)
|
||||||
debug("channel %d: rcvd oclose", c->self);
|
debug("channel %d: rcvd oclose", c->self);
|
||||||
switch (c->istate) {
|
switch (c->istate) {
|
||||||
case CHAN_INPUT_WAIT_OCLOSE:
|
case CHAN_INPUT_WAIT_OCLOSE:
|
||||||
debug("channel %d: input wait_oclose -> closed", c->self);
|
chan_set_istate(c, CHAN_INPUT_CLOSED);
|
||||||
c->istate = CHAN_INPUT_CLOSED;
|
|
||||||
break;
|
break;
|
||||||
case CHAN_INPUT_OPEN:
|
case CHAN_INPUT_OPEN:
|
||||||
debug("channel %d: input open -> closed", c->self);
|
|
||||||
chan_shutdown_read(c);
|
chan_shutdown_read(c);
|
||||||
chan_send_ieof1(c);
|
chan_send_ieof1(c);
|
||||||
c->istate = CHAN_INPUT_CLOSED;
|
chan_set_istate(c, CHAN_INPUT_CLOSED);
|
||||||
break;
|
break;
|
||||||
case CHAN_INPUT_WAIT_DRAIN:
|
case CHAN_INPUT_WAIT_DRAIN:
|
||||||
/* both local read_failed and remote write_failed */
|
/* both local read_failed and remote write_failed */
|
||||||
log("channel %d: input drain -> closed", c->self);
|
|
||||||
chan_send_ieof1(c);
|
chan_send_ieof1(c);
|
||||||
c->istate = CHAN_INPUT_CLOSED;
|
chan_set_istate(c, CHAN_INPUT_CLOSED);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error("channel %d: protocol error: rcvd_oclose for istate %d",
|
error("channel %d: protocol error: rcvd_oclose for istate %d",
|
||||||
|
@ -120,9 +139,8 @@ chan_read_failed_12(Channel *c)
|
||||||
debug("channel %d: read failed", c->self);
|
debug("channel %d: read failed", c->self);
|
||||||
switch (c->istate) {
|
switch (c->istate) {
|
||||||
case CHAN_INPUT_OPEN:
|
case CHAN_INPUT_OPEN:
|
||||||
debug("channel %d: input open -> drain", c->self);
|
|
||||||
chan_shutdown_read(c);
|
chan_shutdown_read(c);
|
||||||
c->istate = CHAN_INPUT_WAIT_DRAIN;
|
chan_set_istate(c, CHAN_INPUT_WAIT_DRAIN);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error("channel %d: chan_read_failed for istate %d",
|
error("channel %d: chan_read_failed for istate %d",
|
||||||
|
@ -141,9 +159,8 @@ chan_ibuf_empty1(Channel *c)
|
||||||
}
|
}
|
||||||
switch (c->istate) {
|
switch (c->istate) {
|
||||||
case CHAN_INPUT_WAIT_DRAIN:
|
case CHAN_INPUT_WAIT_DRAIN:
|
||||||
debug("channel %d: input drain -> wait_oclose", c->self);
|
|
||||||
chan_send_ieof1(c);
|
chan_send_ieof1(c);
|
||||||
c->istate = CHAN_INPUT_WAIT_OCLOSE;
|
chan_set_istate(c, CHAN_INPUT_WAIT_OCLOSE);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error("channel %d: chan_ibuf_empty for istate %d",
|
error("channel %d: chan_ibuf_empty for istate %d",
|
||||||
|
@ -157,12 +174,10 @@ chan_rcvd_ieof1(Channel *c)
|
||||||
debug("channel %d: rcvd ieof", c->self);
|
debug("channel %d: rcvd ieof", c->self);
|
||||||
switch (c->ostate) {
|
switch (c->ostate) {
|
||||||
case CHAN_OUTPUT_OPEN:
|
case CHAN_OUTPUT_OPEN:
|
||||||
debug("channel %d: output open -> drain", c->self);
|
chan_set_ostate(c, CHAN_OUTPUT_WAIT_DRAIN);
|
||||||
c->ostate = CHAN_OUTPUT_WAIT_DRAIN;
|
|
||||||
break;
|
break;
|
||||||
case CHAN_OUTPUT_WAIT_IEOF:
|
case CHAN_OUTPUT_WAIT_IEOF:
|
||||||
debug("channel %d: output wait_ieof -> closed", c->self);
|
chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
|
||||||
c->ostate = CHAN_OUTPUT_CLOSED;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error("channel %d: protocol error: rcvd_ieof for ostate %d",
|
error("channel %d: protocol error: rcvd_ieof for ostate %d",
|
||||||
|
@ -176,14 +191,12 @@ chan_write_failed1(Channel *c)
|
||||||
debug("channel %d: write failed", c->self);
|
debug("channel %d: write failed", c->self);
|
||||||
switch (c->ostate) {
|
switch (c->ostate) {
|
||||||
case CHAN_OUTPUT_OPEN:
|
case CHAN_OUTPUT_OPEN:
|
||||||
debug("channel %d: output open -> wait_ieof", c->self);
|
|
||||||
chan_send_oclose1(c);
|
chan_send_oclose1(c);
|
||||||
c->ostate = CHAN_OUTPUT_WAIT_IEOF;
|
chan_set_ostate(c, CHAN_OUTPUT_WAIT_IEOF);
|
||||||
break;
|
break;
|
||||||
case CHAN_OUTPUT_WAIT_DRAIN:
|
case CHAN_OUTPUT_WAIT_DRAIN:
|
||||||
debug("channel %d: output wait_drain -> closed", c->self);
|
|
||||||
chan_send_oclose1(c);
|
chan_send_oclose1(c);
|
||||||
c->ostate = CHAN_OUTPUT_CLOSED;
|
chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error("channel %d: chan_write_failed for ostate %d",
|
error("channel %d: chan_write_failed for ostate %d",
|
||||||
|
@ -202,9 +215,8 @@ chan_obuf_empty1(Channel *c)
|
||||||
}
|
}
|
||||||
switch (c->ostate) {
|
switch (c->ostate) {
|
||||||
case CHAN_OUTPUT_WAIT_DRAIN:
|
case CHAN_OUTPUT_WAIT_DRAIN:
|
||||||
debug("channel %d: output drain -> closed", c->self);
|
|
||||||
chan_send_oclose1(c);
|
chan_send_oclose1(c);
|
||||||
c->ostate = CHAN_OUTPUT_CLOSED;
|
chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error("channel %d: internal error: obuf_empty for ostate %d",
|
error("channel %d: internal error: obuf_empty for ostate %d",
|
||||||
|
@ -261,8 +273,8 @@ chan_rcvd_oclose2(Channel *c)
|
||||||
c->flags |= CHAN_CLOSE_RCVD;
|
c->flags |= CHAN_CLOSE_RCVD;
|
||||||
if (c->type == SSH_CHANNEL_LARVAL) {
|
if (c->type == SSH_CHANNEL_LARVAL) {
|
||||||
/* tear down larval channels immediately */
|
/* tear down larval channels immediately */
|
||||||
c->ostate = CHAN_OUTPUT_CLOSED;
|
chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
|
||||||
c->istate = CHAN_INPUT_CLOSED;
|
chan_set_istate(c, CHAN_INPUT_CLOSED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (c->ostate) {
|
switch (c->ostate) {
|
||||||
|
@ -271,21 +283,18 @@ chan_rcvd_oclose2(Channel *c)
|
||||||
* wait until a data from the channel is consumed if a CLOSE
|
* wait until a data from the channel is consumed if a CLOSE
|
||||||
* is received
|
* is received
|
||||||
*/
|
*/
|
||||||
debug("channel %d: output open -> drain", c->self);
|
chan_set_ostate(c, CHAN_OUTPUT_WAIT_DRAIN);
|
||||||
c->ostate = CHAN_OUTPUT_WAIT_DRAIN;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
switch (c->istate) {
|
switch (c->istate) {
|
||||||
case CHAN_INPUT_OPEN:
|
case CHAN_INPUT_OPEN:
|
||||||
debug("channel %d: input open -> closed", c->self);
|
|
||||||
chan_shutdown_read(c);
|
chan_shutdown_read(c);
|
||||||
break;
|
break;
|
||||||
case CHAN_INPUT_WAIT_DRAIN:
|
case CHAN_INPUT_WAIT_DRAIN:
|
||||||
debug("channel %d: input drain -> closed", c->self);
|
|
||||||
chan_send_eof2(c);
|
chan_send_eof2(c);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
c->istate = CHAN_INPUT_CLOSED;
|
chan_set_istate(c, CHAN_INPUT_CLOSED);
|
||||||
}
|
}
|
||||||
static void
|
static void
|
||||||
chan_ibuf_empty2(Channel *c)
|
chan_ibuf_empty2(Channel *c)
|
||||||
|
@ -298,10 +307,9 @@ chan_ibuf_empty2(Channel *c)
|
||||||
}
|
}
|
||||||
switch (c->istate) {
|
switch (c->istate) {
|
||||||
case CHAN_INPUT_WAIT_DRAIN:
|
case CHAN_INPUT_WAIT_DRAIN:
|
||||||
debug("channel %d: input drain -> closed", c->self);
|
|
||||||
if (!(c->flags & CHAN_CLOSE_SENT))
|
if (!(c->flags & CHAN_CLOSE_SENT))
|
||||||
chan_send_eof2(c);
|
chan_send_eof2(c);
|
||||||
c->istate = CHAN_INPUT_CLOSED;
|
chan_set_istate(c, CHAN_INPUT_CLOSED);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error("channel %d: chan_ibuf_empty for istate %d",
|
error("channel %d: chan_ibuf_empty for istate %d",
|
||||||
|
@ -313,10 +321,8 @@ static void
|
||||||
chan_rcvd_ieof2(Channel *c)
|
chan_rcvd_ieof2(Channel *c)
|
||||||
{
|
{
|
||||||
debug("channel %d: rcvd eof", c->self);
|
debug("channel %d: rcvd eof", c->self);
|
||||||
if (c->ostate == CHAN_OUTPUT_OPEN) {
|
if (c->ostate == CHAN_OUTPUT_OPEN)
|
||||||
debug("channel %d: output open -> drain", c->self);
|
chan_set_ostate(c, CHAN_OUTPUT_WAIT_DRAIN);
|
||||||
c->ostate = CHAN_OUTPUT_WAIT_DRAIN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
static void
|
static void
|
||||||
chan_write_failed2(Channel *c)
|
chan_write_failed2(Channel *c)
|
||||||
|
@ -324,14 +330,12 @@ chan_write_failed2(Channel *c)
|
||||||
debug("channel %d: write failed", c->self);
|
debug("channel %d: write failed", c->self);
|
||||||
switch (c->ostate) {
|
switch (c->ostate) {
|
||||||
case CHAN_OUTPUT_OPEN:
|
case CHAN_OUTPUT_OPEN:
|
||||||
debug("channel %d: output open -> closed", c->self);
|
|
||||||
chan_shutdown_write(c); /* ?? */
|
chan_shutdown_write(c); /* ?? */
|
||||||
c->ostate = CHAN_OUTPUT_CLOSED;
|
chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
|
||||||
break;
|
break;
|
||||||
case CHAN_OUTPUT_WAIT_DRAIN:
|
case CHAN_OUTPUT_WAIT_DRAIN:
|
||||||
debug("channel %d: output drain -> closed", c->self);
|
|
||||||
chan_shutdown_write(c);
|
chan_shutdown_write(c);
|
||||||
c->ostate = CHAN_OUTPUT_CLOSED;
|
chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error("channel %d: chan_write_failed for ostate %d",
|
error("channel %d: chan_write_failed for ostate %d",
|
||||||
|
@ -350,9 +354,8 @@ chan_obuf_empty2(Channel *c)
|
||||||
}
|
}
|
||||||
switch (c->ostate) {
|
switch (c->ostate) {
|
||||||
case CHAN_OUTPUT_WAIT_DRAIN:
|
case CHAN_OUTPUT_WAIT_DRAIN:
|
||||||
debug("channel %d: output drain -> closed", c->self);
|
|
||||||
chan_shutdown_write(c);
|
chan_shutdown_write(c);
|
||||||
c->ostate = CHAN_OUTPUT_CLOSED;
|
chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error("channel %d: chan_obuf_empty for ostate %d",
|
error("channel %d: chan_obuf_empty for ostate %d",
|
||||||
|
|
Loading…
Reference in New Issue