version 1.11, 2001/06/10 11:29:20 |
version 1.11.2.1, 2002/03/07 17:37:46 |
|
|
dispatch_fn *dispatch[DISPATCH_MAX]; |
dispatch_fn *dispatch[DISPATCH_MAX]; |
|
|
void |
void |
dispatch_protocol_error(int type, int plen, void *ctxt) |
dispatch_protocol_error(int type, u_int32_t seq, void *ctxt) |
{ |
{ |
fatal("dispatch_protocol_error: type %d plen %d", type, plen); |
log("dispatch_protocol_error: type %d seq %u", type, seq); |
|
if (!compat20) |
|
fatal("protocol error"); |
|
packet_start(SSH2_MSG_UNIMPLEMENTED); |
|
packet_put_int(seq); |
|
packet_send(); |
|
packet_write_wait(); |
} |
} |
void |
void |
|
dispatch_protocol_ignore(int type, u_int32_t seq, void *ctxt) |
|
{ |
|
log("dispatch_protocol_ignore: type %d seq %u", type, seq); |
|
} |
|
void |
dispatch_init(dispatch_fn *dflt) |
dispatch_init(dispatch_fn *dflt) |
{ |
{ |
int i; |
u_int i; |
for (i = 0; i < DISPATCH_MAX; i++) |
for (i = 0; i < DISPATCH_MAX; i++) |
dispatch[i] = dflt; |
dispatch[i] = dflt; |
} |
} |
void |
void |
|
dispatch_range(u_int from, u_int to, dispatch_fn *fn) |
|
{ |
|
u_int i; |
|
|
|
for (i = from; i <= to; i++) { |
|
if (i >= DISPATCH_MAX) |
|
break; |
|
dispatch[i] = fn; |
|
} |
|
} |
|
void |
dispatch_set(int type, dispatch_fn *fn) |
dispatch_set(int type, dispatch_fn *fn) |
{ |
{ |
dispatch[type] = fn; |
dispatch[type] = fn; |
|
|
dispatch_run(int mode, int *done, void *ctxt) |
dispatch_run(int mode, int *done, void *ctxt) |
{ |
{ |
for (;;) { |
for (;;) { |
int plen; |
|
int type; |
int type; |
|
u_int32_t seqnr; |
|
|
if (mode == DISPATCH_BLOCK) { |
if (mode == DISPATCH_BLOCK) { |
type = packet_read(&plen); |
type = packet_read_seqnr(&seqnr); |
} else { |
} else { |
type = packet_read_poll(&plen); |
type = packet_read_poll_seqnr(&seqnr); |
if (type == SSH_MSG_NONE) |
if (type == SSH_MSG_NONE) |
return; |
return; |
} |
} |
if (type > 0 && type < DISPATCH_MAX && dispatch[type] != NULL) |
if (type > 0 && type < DISPATCH_MAX && dispatch[type] != NULL) |
(*dispatch[type])(type, plen, ctxt); |
(*dispatch[type])(type, seqnr, ctxt); |
else |
else |
packet_disconnect("protocol error: rcvd type %d", type); |
packet_disconnect("protocol error: rcvd type %d", type); |
if (done != NULL && *done) |
if (done != NULL && *done) |