diff options
Diffstat (limited to 'win32/ioctl.c')
-rw-r--r-- | win32/ioctl.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/win32/ioctl.c b/win32/ioctl.c index 93f9f504d..d0ed68d61 100644 --- a/win32/ioctl.c +++ b/win32/ioctl.c | |||
@@ -1,5 +1,7 @@ | |||
1 | #include "libbb.h" | 1 | #include "libbb.h" |
2 | #include "lazyload.h" | ||
2 | 3 | ||
4 | #if ENABLE_STTY || ENABLE_TTYSIZE | ||
3 | static int mingw_get_terminal_width_height(struct winsize *win) | 5 | static int mingw_get_terminal_width_height(struct winsize *win) |
4 | { | 6 | { |
5 | int fd; | 7 | int fd; |
@@ -21,6 +23,45 @@ static int mingw_get_terminal_width_height(struct winsize *win) | |||
21 | 23 | ||
22 | return -1; | 24 | return -1; |
23 | } | 25 | } |
26 | #endif | ||
27 | |||
28 | #if ENABLE_STTY | ||
29 | static int mingw_set_terminal_width_height(struct winsize *win) | ||
30 | { | ||
31 | BOOL ret; | ||
32 | DECLARE_PROC_ADDR(BOOL, GetConsoleScreenBufferInfoEx, HANDLE, | ||
33 | PCONSOLE_SCREEN_BUFFER_INFOEX); | ||
34 | DECLARE_PROC_ADDR(BOOL, SetConsoleScreenBufferInfoEx, HANDLE, | ||
35 | PCONSOLE_SCREEN_BUFFER_INFOEX); | ||
36 | |||
37 | if (!INIT_PROC_ADDR(kernel32.dll, GetConsoleScreenBufferInfoEx)) | ||
38 | return -1; | ||
39 | if (!INIT_PROC_ADDR(kernel32.dll, SetConsoleScreenBufferInfoEx)) | ||
40 | return -1; | ||
41 | |||
42 | for (int fd = STDOUT_FILENO; fd <= STDERR_FILENO; ++fd) { | ||
43 | CONSOLE_SCREEN_BUFFER_INFOEX sbi; | ||
44 | HANDLE handle = (HANDLE)_get_osfhandle(fd); | ||
45 | |||
46 | sbi.cbSize = sizeof(sbi); | ||
47 | if (handle != INVALID_HANDLE_VALUE && | ||
48 | (ret=GetConsoleScreenBufferInfoEx(handle, &sbi)) != 0) { | ||
49 | if (sbi.dwSize.X != win->ws_col) { | ||
50 | sbi.dwSize.X = win->ws_col; | ||
51 | } | ||
52 | if (sbi.dwSize.Y < win->ws_row) { | ||
53 | sbi.dwSize.Y = win->ws_row; | ||
54 | } | ||
55 | sbi.srWindow.Bottom = sbi.srWindow.Top + win->ws_row; | ||
56 | sbi.srWindow.Right = sbi.srWindow.Left + win->ws_col; | ||
57 | ret = SetConsoleScreenBufferInfoEx(handle, &sbi); | ||
58 | break; | ||
59 | } | ||
60 | } | ||
61 | |||
62 | return ret ? 0 : -1; | ||
63 | } | ||
64 | #endif | ||
24 | 65 | ||
25 | int ioctl(int fd UNUSED_PARAM, int code, ...) | 66 | int ioctl(int fd UNUSED_PARAM, int code, ...) |
26 | { | 67 | { |
@@ -31,10 +72,18 @@ int ioctl(int fd UNUSED_PARAM, int code, ...) | |||
31 | va_start(ap, code); | 72 | va_start(ap, code); |
32 | 73 | ||
33 | switch (code) { | 74 | switch (code) { |
75 | #if ENABLE_STTY || ENABLE_TTYSIZE | ||
34 | case TIOCGWINSZ: | 76 | case TIOCGWINSZ: |
35 | arg = va_arg(ap, void *); | 77 | arg = va_arg(ap, void *); |
36 | ret = mingw_get_terminal_width_height((struct winsize *)arg); | 78 | ret = mingw_get_terminal_width_height((struct winsize *)arg); |
37 | break; | 79 | break; |
80 | #endif | ||
81 | #if ENABLE_STTY | ||
82 | case TIOCSWINSZ: | ||
83 | arg = va_arg(ap, void *); | ||
84 | ret = mingw_set_terminal_width_height((struct winsize *)arg); | ||
85 | break; | ||
86 | #endif | ||
38 | default: | 87 | default: |
39 | ret = -1; | 88 | ret = -1; |
40 | errno = EINVAL; | 89 | errno = EINVAL; |