version 1.208, 2004/07/11 17:48:47 |
version 1.209, 2004/08/11 21:43:04 |
|
|
* Size of the channel array. All slots of the array must always be |
* Size of the channel array. All slots of the array must always be |
* initialized (at least the type field); unused slots set to NULL |
* initialized (at least the type field); unused slots set to NULL |
*/ |
*/ |
static int channels_alloc = 0; |
static u_int channels_alloc = 0; |
|
|
/* |
/* |
* Maximum file descriptor value used in any of the channels. This is |
* Maximum file descriptor value used in any of the channels. This is |
|
|
{ |
{ |
Channel *c; |
Channel *c; |
|
|
if (id < 0 || id >= channels_alloc) { |
if (id < 0 || (u_int)id >= channels_alloc) { |
logit("channel_lookup: %d: bad id", id); |
logit("channel_lookup: %d: bad id", id); |
return NULL; |
return NULL; |
} |
} |
|
|
channel_new(char *ctype, int type, int rfd, int wfd, int efd, |
channel_new(char *ctype, int type, int rfd, int wfd, int efd, |
u_int window, u_int maxpack, int extusage, char *remote_name, int nonblock) |
u_int window, u_int maxpack, int extusage, char *remote_name, int nonblock) |
{ |
{ |
int i, found; |
int found; |
|
u_int i; |
Channel *c; |
Channel *c; |
|
|
/* Do initial allocation if this is the first call. */ |
/* Do initial allocation if this is the first call. */ |
|
|
for (found = -1, i = 0; i < channels_alloc; i++) |
for (found = -1, i = 0; i < channels_alloc; i++) |
if (channels[i] == NULL) { |
if (channels[i] == NULL) { |
/* Found a free slot. */ |
/* Found a free slot. */ |
found = i; |
found = (int)i; |
break; |
break; |
} |
} |
if (found == -1) { |
if (found < 0) { |
/* There are no free slots. Take last+1 slot and expand the array. */ |
/* There are no free slots. Take last+1 slot and expand the array. */ |
found = channels_alloc; |
found = channels_alloc; |
if (channels_alloc > 10000) |
if (channels_alloc > 10000) |
|
|
static int |
static int |
channel_find_maxfd(void) |
channel_find_maxfd(void) |
{ |
{ |
int i, max = 0; |
u_int i; |
|
int max = 0; |
Channel *c; |
Channel *c; |
|
|
for (i = 0; i < channels_alloc; i++) { |
for (i = 0; i < channels_alloc; i++) { |
|
|
channel_free(Channel *c) |
channel_free(Channel *c) |
{ |
{ |
char *s; |
char *s; |
int i, n; |
u_int i, n; |
|
|
for (n = 0, i = 0; i < channels_alloc; i++) |
for (n = 0, i = 0; i < channels_alloc; i++) |
if (channels[i]) |
if (channels[i]) |
n++; |
n++; |
debug("channel %d: free: %s, nchannels %d", c->self, |
debug("channel %d: free: %s, nchannels %u", c->self, |
c->remote_name ? c->remote_name : "???", n); |
c->remote_name ? c->remote_name : "???", n); |
|
|
s = channel_open_message(); |
s = channel_open_message(); |
|
|
void |
void |
channel_free_all(void) |
channel_free_all(void) |
{ |
{ |
int i; |
u_int i; |
|
|
for (i = 0; i < channels_alloc; i++) |
for (i = 0; i < channels_alloc; i++) |
if (channels[i] != NULL) |
if (channels[i] != NULL) |
|
|
void |
void |
channel_close_all(void) |
channel_close_all(void) |
{ |
{ |
int i; |
u_int i; |
|
|
for (i = 0; i < channels_alloc; i++) |
for (i = 0; i < channels_alloc; i++) |
if (channels[i] != NULL) |
if (channels[i] != NULL) |
|
|
void |
void |
channel_stop_listening(void) |
channel_stop_listening(void) |
{ |
{ |
int i; |
u_int i; |
Channel *c; |
Channel *c; |
|
|
for (i = 0; i < channels_alloc; i++) { |
for (i = 0; i < channels_alloc; i++) { |
|
|
int |
int |
channel_still_open(void) |
channel_still_open(void) |
{ |
{ |
int i; |
u_int i; |
Channel *c; |
Channel *c; |
|
|
for (i = 0; i < channels_alloc; i++) { |
for (i = 0; i < channels_alloc; i++) { |
|
|
int |
int |
channel_find_open(void) |
channel_find_open(void) |
{ |
{ |
int i; |
u_int i; |
Channel *c; |
Channel *c; |
|
|
for (i = 0; i < channels_alloc; i++) { |
for (i = 0; i < channels_alloc; i++) { |
|
|
Buffer buffer; |
Buffer buffer; |
Channel *c; |
Channel *c; |
char buf[1024], *cp; |
char buf[1024], *cp; |
int i; |
u_int i; |
|
|
buffer_init(&buffer); |
buffer_init(&buffer); |
snprintf(buf, sizeof buf, "The following connections are open:\r\n"); |
snprintf(buf, sizeof buf, "The following connections are open:\r\n"); |
|
|
channel_handler(chan_fn *ftab[], fd_set * readset, fd_set * writeset) |
channel_handler(chan_fn *ftab[], fd_set * readset, fd_set * writeset) |
{ |
{ |
static int did_init = 0; |
static int did_init = 0; |
int i; |
u_int i; |
Channel *c; |
Channel *c; |
|
|
if (!did_init) { |
if (!did_init) { |
|
|
*/ |
*/ |
void |
void |
channel_prepare_select(fd_set **readsetp, fd_set **writesetp, int *maxfdp, |
channel_prepare_select(fd_set **readsetp, fd_set **writesetp, int *maxfdp, |
int *nallocp, int rekeying) |
u_int *nallocp, int rekeying) |
{ |
{ |
int n; |
u_int n, sz; |
u_int sz; |
|
|
|
n = MAX(*maxfdp, channel_max_fd); |
n = MAX(*maxfdp, channel_max_fd); |
|
|
|
|
channel_output_poll(void) |
channel_output_poll(void) |
{ |
{ |
Channel *c; |
Channel *c; |
int i; |
u_int i, len; |
u_int len; |
|
|
|
for (i = 0; i < channels_alloc; i++) { |
for (i = 0; i < channels_alloc; i++) { |
c = channels[i]; |
c = channels[i]; |
|
|
int |
int |
channel_cancel_rport_listener(const char *host, u_short port) |
channel_cancel_rport_listener(const char *host, u_short port) |
{ |
{ |
int i, found = 0; |
u_int i; |
|
int found = 0; |
|
|
for(i = 0; i < channels_alloc; i++) { |
for(i = 0; i < channels_alloc; i++) { |
Channel *c = channels[i]; |
Channel *c = channels[i]; |
|
|
void |
void |
channel_send_window_changes(void) |
channel_send_window_changes(void) |
{ |
{ |
int i; |
u_int i; |
struct winsize ws; |
struct winsize ws; |
|
|
for (i = 0; i < channels_alloc; i++) { |
for (i = 0; i < channels_alloc; i++) { |