diff --git a/channels.c b/channels.c index 57b5d59..396db78 100644 --- a/channels.c +++ b/channels.c @@ -2479,11 +2479,12 @@ channel_input_data(int type, u_int32_t seq, void *ctxt) if (c->datagram) buffer_put_string(&c->output, data, data_len); else { - #if(1)//ndef WIN32_FIXME + #if(0)//ndef WIN32_FIXME buffer_append(&c->output, data, data_len); #else if ( c->client_tty ) - telProcessNetwork ( data, data_len ); // run it by ANSI engine if it is the ssh client + buffer_append(&c->output, data, data_len); + //telProcessNetwork ( data, data_len ); // run it by ANSI engine if it is the ssh client else { #ifdef WIN32_PRAGMA_REMCON buffer_append(&c->output, data, data_len); // it is the sshd server, so pass it on diff --git a/clientloop.c b/clientloop.c index 9e8c953..7e23fd6 100644 --- a/clientloop.c +++ b/clientloop.c @@ -1523,7 +1523,7 @@ client_simple_escape_filter(Channel *c, char *buf, int len) #ifdef WIN32_FIXME u_char * client_ansi_parser_filter(Channel *c, u_char **buf, u_int *len) { /* TODO - account fo error/extended stream*/ - if (isatty(c->wfd)) { + if (c->client_tty) { telProcessNetwork(buffer_ptr(&c->output), buffer_len(&c->output)); buffer_clear(&c->output); buffer_append(&c->output, " \b", 2); diff --git a/contrib/win32/win32compat/fileio.c b/contrib/win32/win32compat/fileio.c index 37614e6..4d124cd 100644 --- a/contrib/win32/win32compat/fileio.c +++ b/contrib/win32/win32compat/fileio.c @@ -590,16 +590,17 @@ fileio_close(struct w32_io* pio) { CancelIo(pio->handle); //let queued APCs (if any) drain SleepEx(0, TRUE); - if (pio->type != STD_IO_FD) //STD handles are never explicitly closed + if (pio->type != STD_IO_FD) {//STD handles are never explicitly closed CloseHandle(pio->handle); - if (pio->read_details.buf) - free(pio->read_details.buf); + if (pio->read_details.buf) + free(pio->read_details.buf); - if (pio->write_details.buf) - free(pio->write_details.buf); + if (pio->write_details.buf) + free(pio->write_details.buf); - free(pio); + free(pio); + } return 0; } diff --git a/contrib/win32/win32compat/inc/w32posix.h b/contrib/win32/win32compat/inc/w32posix.h index 92002cf..2612e11 100644 --- a/contrib/win32/win32compat/inc/w32posix.h +++ b/contrib/win32/win32compat/inc/w32posix.h @@ -108,12 +108,12 @@ typedef void(*sighandler_t)(int); int w32_temp_DelChildToWatch(HANDLE processtowatch); int w32_temp_AddChildToWatch(HANDLE processtowatch); HANDLE w32_fd_to_handle(int fd); -int w32_allocate_fd_for_handle(HANDLE h); +int w32_allocate_fd_for_handle(HANDLE h, BOOL is_sock); /* temporary definitions to aid in transition */ #define WSHELPDelChildToWatch(a) w32_temp_DelChildToWatch((a)) #define WSHELPAddChildToWatch(a) w32_temp_AddChildToWatch((a)) #define sfd_to_handle(a) w32_fd_to_handle((a)) -#define allocate_sfd(a) w32_allocate_fd_for_handle((a)) +#define allocate_sfd(a, b) w32_allocate_fd_for_handle((a, b)) //#define WSHELPwopen(a, b) w32_open((a, b)) diff --git a/contrib/win32/win32compat/w32fd.c b/contrib/win32/win32compat/w32fd.c index 1756c43..075a459 100644 --- a/contrib/win32/win32compat/w32fd.c +++ b/contrib/win32/win32compat/w32fd.c @@ -693,7 +693,7 @@ w32_fd_to_handle(int fd) { return fd_table.w32_ios[fd]->handle; } -int w32_allocate_fd_for_handle(HANDLE h) { +int w32_allocate_fd_for_handle(HANDLE h, BOOL is_sock) { int min_index = fd_table_get_min_index(); struct w32_io* pio; @@ -708,7 +708,7 @@ int w32_allocate_fd_for_handle(HANDLE h) { } memset(pio, 0, sizeof(struct w32_io)); - pio->type = FILE_FD; + pio->type = is_sock? SOCK_FD : FILE_FD; pio->handle = h; fd_table_set(pio, min_index); return min_index; diff --git a/sshd.c b/sshd.c index 3501842..83ca563 100644 --- a/sshd.c +++ b/sshd.c @@ -1699,6 +1699,32 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) startups++; break; } + + /* + * Got connection. Fork a child to handle it, unless + * we are in debugging mode. + */ + if (debug_flag) { + /* + * In debugging mode. Close the listening + * socket, and start processing the + * connection without forking. + */ + debug("Server will not fork when running in debugging mode."); + close_listen_socks(); + *sock_in = *newsock; + *sock_out = *newsock; + close(startup_p[0]); + close(startup_p[1]); + startup_pipe = -1; + pid = getpid(); + if (rexec_flag) { + send_rexec_state(config_s[0], + &cfg); + close(config_s[0]); + } + break; + } #ifdef WIN32_FIXME /* @@ -1770,32 +1796,6 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) */ - /* - * Got connection. Fork a child to handle it, unless - * we are in debugging mode. - */ - if (debug_flag) { - /* - * In debugging mode. Close the listening - * socket, and start processing the - * connection without forking. - */ - debug("Server will not fork when running in debugging mode."); - close_listen_socks(); - *sock_in = *newsock; - *sock_out = *newsock; - close(startup_p[0]); - close(startup_p[1]); - startup_pipe = -1; - pid = getpid(); - if (rexec_flag) { - send_rexec_state(config_s[0], - &cfg); - close(config_s[0]); - } - break; - } - /* * Normal production daemon. Fork, and have * the child process the connection. The @@ -2820,7 +2820,7 @@ main(int ac, char **av) int remotesochandle ; remotesochandle = atoi( getenv("SSHD_REMSOC") ); - sock_in = sock_out = newsock = allocate_sfd(remotesochandle) ; //si.hStdInput); + sock_in = sock_out = newsock = w32_allocate_fd_for_handle(remotesochandle, TRUE) ; //si.hStdInput); // we have the socket handle, delete it for child processes we create like shell SetEnvironmentVariable("SSHD_REMSOC", NULL);