diff --git a/src/configure.in b/src/configure.in index 81404eb6e0487e99889d12f1ed53470718d66376..09b0e5379de3000e9675889348dfe12813670349 100644 --- a/src/configure.in +++ b/src/configure.in @@ -3308,9 +3308,17 @@ AC_CHECK_HEADERS(winsock2.h sys/rusage.h time.h sys/time.h sys/types.h \ #ifdef HAVE_SYS_PARAM_H # include <sys/param.h> #endif +/* Necessary to find struct winsize. */ +#ifdef HAVE_TERMIOS_H +#include <termios.h> +#elif defined(HAVE_SYS_TERMIOS_H) +/* NB: Deprecated by <termios.h> above. */ +#include <sys/termios.h> +#endif ]) -AC_CHECK_TYPES([HPCON, LPPROC_THREAD_ATTRIBUTE_LIST, LPSTARTUPINFOEXW],,,[ +AC_CHECK_TYPES([HPCON, LPPROC_THREAD_ATTRIBUTE_LIST, LPSTARTUPINFOEXW, + struct winsize],,,[ #if (defined(__WINNT__) || defined(__WIN32__)) && !defined(__NT__) #define __NT__ #endif diff --git a/src/fdlib.c b/src/fdlib.c index 13d4d4b8a71a98479c4ee59dc1b04fe9b18818cc..680dbcf85cb06abe95ec7af860e810c55800b3ae 100644 --- a/src/fdlib.c +++ b/src/fdlib.c @@ -2775,12 +2775,14 @@ PMOD_EXPORT const char *debug_fd_inet_ntop(int af, const void *addr, PMOD_EXPORT int debug_fd_openpty(int *master, int *slave, char *ignored_name, void *ignored_term, - void *ignored_winp) + struct winsize *winp) { struct my_pty *master_pty = NULL; struct my_pty *slave_pty = NULL; int master_fd = -1; int slave_fd = -1; + COORD sz; + if (!Pike_NT_CreatePseudoConsole) { errno = ENOENT; return -1; @@ -2817,9 +2819,18 @@ PMOD_EXPORT int debug_fd_openpty(int *master, int *slave, goto fail; } + /* Some reasonable defaults. */ + sz.X = 80; + sz.Y = 25; + + if (winp) { + sz.X = winp->ws_col; + sz.y = winp->ws_row; + } + if (FAILED(Pike_NT_CreatePseudoConsole(sz, slave_pty->write_pipe, slave_pty->read_pipe, - 0, &master->pty))) { + 0, &master_pty->conpty))) { goto fail; } diff --git a/src/fdlib.h b/src/fdlib.h index 7d5c301e4e21866ac8b4da0c2f93befe01d73718..74bfdf3ce0d7b609859032ca8fb639ee9d1b2170 100644 --- a/src/fdlib.h +++ b/src/fdlib.h @@ -109,6 +109,13 @@ typedef struct _STARTUPINFOEXW } STARTUPINFOEXW, *LPSTARTUPINFOEXW; #endif +#ifndef HAVE_STRUCT_WINSIZE +/* Typically found in <termios.h>. */ +struct winsize { + unsigned short ws_row, ws_col, ws_xpixel, ws_ypixel; +}; +#endif + #define SOCKFUN1(NAME,T1) PMOD_EXPORT int PIKE_CONCAT(debug_fd_,NAME) (FD,T1); #define SOCKFUN2(NAME,T1,T2) PMOD_EXPORT int PIKE_CONCAT(debug_fd_,NAME) (FD,T1,T2); #define SOCKFUN3(NAME,T1,T2,T3) PMOD_EXPORT int PIKE_CONCAT(debug_fd_,NAME) (FD,T1,T2,T3); @@ -214,7 +221,7 @@ PMOD_EXPORT const char *debug_fd_inet_ntop(int af, const void *addr, PMOD_EXPORT int debug_fd_openpty(int *master, int *slave, char *ignored_name, void *ignored_term, - void *ignored_winp); + struct winsize *winp); /* Prototypes end here */ #undef SOCKFUN1