From 62c64500b13a7405fcea98076874cf45a8310911 Mon Sep 17 00:00:00 2001 From: Ivan Migalev Date: Sun, 17 Nov 2019 18:02:01 +0700 Subject: [PATCH 1/7] Move JNA library to the com.microsoft.tfs.jni module (cherry picked from commit 0f82448726cb0de66d621e3703a93c17023bf5e6) --- build/modules/clc/build.xml | 1 + build/modules/sdk/build.xml | 1 + source/com.microsoft.tfs.core/.classpath | 2 -- source/com.microsoft.tfs.core/META-INF/MANIFEST.MF | 2 -- source/com.microsoft.tfs.core/build.properties | 2 -- source/com.microsoft.tfs.jni/.classpath | 2 ++ source/com.microsoft.tfs.jni/META-INF/MANIFEST.MF | 4 +++- source/com.microsoft.tfs.jni/build.properties | 2 ++ .../libs/jna/jna-4.2.1.jar | Bin .../libs/jna/jna-platform-4.2.1.jar | Bin 10 files changed, 9 insertions(+), 7 deletions(-) rename source/{com.microsoft.tfs.core => com.microsoft.tfs.jni}/libs/jna/jna-4.2.1.jar (100%) rename source/{com.microsoft.tfs.core => com.microsoft.tfs.jni}/libs/jna/jna-platform-4.2.1.jar (100%) diff --git a/build/modules/clc/build.xml b/build/modules/clc/build.xml index dc5e54cac..f39aae47c 100644 --- a/build/modules/clc/build.xml +++ b/build/modules/clc/build.xml @@ -127,6 +127,7 @@ + diff --git a/build/modules/sdk/build.xml b/build/modules/sdk/build.xml index 273ac23b9..8e50d705e 100644 --- a/build/modules/sdk/build.xml +++ b/build/modules/sdk/build.xml @@ -20,6 +20,7 @@ + diff --git a/source/com.microsoft.tfs.core/.classpath b/source/com.microsoft.tfs.core/.classpath index 5d89c2a3c..cc5e60e95 100644 --- a/source/com.microsoft.tfs.core/.classpath +++ b/source/com.microsoft.tfs.core/.classpath @@ -41,8 +41,6 @@ - - diff --git a/source/com.microsoft.tfs.core/META-INF/MANIFEST.MF b/source/com.microsoft.tfs.core/META-INF/MANIFEST.MF index 759a01949..96ac15611 100644 --- a/source/com.microsoft.tfs.core/META-INF/MANIFEST.MF +++ b/source/com.microsoft.tfs.core/META-INF/MANIFEST.MF @@ -26,8 +26,6 @@ Bundle-ClassPath: com.microsoft.tfs.core.jar, libs/jackson-core-2.4.1/jackson-core-2.4.1.jar, libs/jackson-core-2.4.1/jackson-databind-2.4.1.jar, libs/annotation-detector-3.0.4/annotation-detector-3.0.4.jar, - libs/jna/jna-4.2.1.jar, - libs/jna/jna-platform-4.2.1.jar, libs/slf4j/slf4j-api-1.7.19.jar, libs/slf4j/slf4j-log4j12-1.7.19.jar, libs/oauth2-useragent/oauth2-useragent-0.11.2.jar, diff --git a/source/com.microsoft.tfs.core/build.properties b/source/com.microsoft.tfs.core/build.properties index 7a40dd1b5..9bd58e13d 100644 --- a/source/com.microsoft.tfs.core/build.properties +++ b/source/com.microsoft.tfs.core/build.properties @@ -18,8 +18,6 @@ bin.includes = META-INF/,\ libs/jackson-core-2.4.1/jackson-databind-2.4.1.jar,\ libs/applicationinsights-core/applicationinsights-core-1.0.4.jar,\ libs/annotation-detector-3.0.4/annotation-detector-3.0.4.jar,\ - libs/jna/jna-4.2.1.jar,\ - libs/jna/jna-platform-4.2.1.jar,\ libs/slf4j/slf4j-api-1.7.19.jar,\ libs/slf4j/slf4j-log4j12-1.7.19.jar,\ libs/oauth2-useragent/oauth2-useragent-0.11.2.jar,\ diff --git a/source/com.microsoft.tfs.jni/.classpath b/source/com.microsoft.tfs.jni/.classpath index 50e024a7b..7af277077 100644 --- a/source/com.microsoft.tfs.jni/.classpath +++ b/source/com.microsoft.tfs.jni/.classpath @@ -6,5 +6,7 @@ + + diff --git a/source/com.microsoft.tfs.jni/META-INF/MANIFEST.MF b/source/com.microsoft.tfs.jni/META-INF/MANIFEST.MF index de62f64ec..44c90bbfc 100644 --- a/source/com.microsoft.tfs.jni/META-INF/MANIFEST.MF +++ b/source/com.microsoft.tfs.jni/META-INF/MANIFEST.MF @@ -29,4 +29,6 @@ Export-Package: com.microsoft.tfs.jni, Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Require-Bundle: com.microsoft.tfs.logging, com.microsoft.tfs.util -Bundle-ClassPath: com.microsoft.tfs.jni.jar +Bundle-ClassPath: com.microsoft.tfs.jni.jar, + libs/jna/jna-4.2.1.jar, + libs/jna/jna-platform-4.2.1.jar diff --git a/source/com.microsoft.tfs.jni/build.properties b/source/com.microsoft.tfs.jni/build.properties index 80b45312c..aad90eb7a 100644 --- a/source/com.microsoft.tfs.jni/build.properties +++ b/source/com.microsoft.tfs.jni/build.properties @@ -1,5 +1,7 @@ bin.includes = META-INF/,\ os/,\ com.microsoft.tfs.jni.jar,\ + libs/jna/jna-4.2.1.jar,\ + libs/jna/jna-platform-4.2.1.jar,\ plugin.properties source.com.microsoft.tfs.jni.jar = src/ diff --git a/source/com.microsoft.tfs.core/libs/jna/jna-4.2.1.jar b/source/com.microsoft.tfs.jni/libs/jna/jna-4.2.1.jar similarity index 100% rename from source/com.microsoft.tfs.core/libs/jna/jna-4.2.1.jar rename to source/com.microsoft.tfs.jni/libs/jna/jna-4.2.1.jar diff --git a/source/com.microsoft.tfs.core/libs/jna/jna-platform-4.2.1.jar b/source/com.microsoft.tfs.jni/libs/jna/jna-platform-4.2.1.jar similarity index 100% rename from source/com.microsoft.tfs.core/libs/jna/jna-platform-4.2.1.jar rename to source/com.microsoft.tfs.jni/libs/jna/jna-platform-4.2.1.jar From 72c9c6042c0a57edb84ab6fc5e231d32867e7cc5 Mon Sep 17 00:00:00 2001 From: Ivan Migalev Date: Mon, 18 Nov 2019 15:16:34 +0700 Subject: [PATCH 2/7] Replace Windows native_console.dll with JNA code (cherry picked from commit f1072212b6b4706ef18ddc9410fc391916e3b48f) --- .../native-src/build-inner.cmd | 16 --- .../native-src/win32/console_jni.c | 132 ------------------ .../os/win32/x86/native_console.dll | Bin 54440 -> 0 bytes .../os/win32/x86_64/native_console.dll | Bin 63144 -> 0 bytes .../jni/internal/console/NativeConsole.java | 18 ++- .../console/WindowsNativeConsole.java | 62 ++++++++ .../winapi/ConsoleScreenBufferInfo.java | 19 +++ .../jni/internal/console/winapi/Coord.java | 19 +++ .../jni/internal/console/winapi/Kernel32.java | 21 +++ .../internal/console/winapi/SmallRect.java | 18 +++ 10 files changed, 152 insertions(+), 153 deletions(-) delete mode 100644 source/com.microsoft.tfs.jni/native-src/win32/console_jni.c delete mode 100644 source/com.microsoft.tfs.jni/os/win32/x86/native_console.dll delete mode 100644 source/com.microsoft.tfs.jni/os/win32/x86_64/native_console.dll create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/WindowsNativeConsole.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/ConsoleScreenBufferInfo.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/Coord.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/Kernel32.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/SmallRect.java diff --git a/source/com.microsoft.tfs.jni/native-src/build-inner.cmd b/source/com.microsoft.tfs.jni/native-src/build-inner.cmd index 194d05055..ef6428bb6 100644 --- a/source/com.microsoft.tfs.jni/native-src/build-inner.cmd +++ b/source/com.microsoft.tfs.jni/native-src/build-inner.cmd @@ -253,7 +253,6 @@ rem ########################################################### if not defined NOJAVAH ( echo Generating C headers... "%JAVA_HOME%\bin\javah" -classpath "%BUILD_TMP%" -o "%BUILD_TMP%\native_auth.h" com.microsoft.tfs.jni.internal.auth.NativeAuth - "%JAVA_HOME%\bin\javah" -classpath "%BUILD_TMP%" -o "%BUILD_TMP%\native_console.h" com.microsoft.tfs.jni.internal.console.NativeConsole "%JAVA_HOME%\bin\javah" -classpath "%BUILD_TMP%" -o "%BUILD_TMP%\native_filesystem.h" com.microsoft.tfs.jni.internal.filesystem.NativeFileSystem "%JAVA_HOME%\bin\javah" -classpath "%BUILD_TMP%" -o "%BUILD_TMP%\native_misc.h" com.microsoft.tfs.jni.internal.platformmisc.NativePlatformMisc "%JAVA_HOME%\bin\javah" -classpath "%BUILD_TMP%" -o "%BUILD_TMP%\native_synchronization.h" com.microsoft.tfs.jni.internal.synchronization.NativeSynchronization @@ -262,7 +261,6 @@ if not defined NOJAVAH ( ) if not exist "%BUILD_TMP%\native_auth.h" goto javaherror -if not exist "%BUILD_TMP%\native_console.h" goto javaherror if not exist "%BUILD_TMP%\native_filesystem.h" goto javaherror if not exist "%BUILD_TMP%\native_misc.h" goto javaherror if not exist "%BUILD_TMP%\native_synchronization.h" goto javaherror @@ -289,7 +287,6 @@ echo Compiling native C code... rem Compile everything to objects @echo on cl -c win32\auth_sspi.c -Fo"%BUILD_TMP%\auth_sspi.obj" %CFLAGS% -cl -c win32\console_jni.c -Fo"%BUILD_TMP%\console_jni.obj" %CFLAGS% cl -c win32\filesystem_jni.c -Fo"%BUILD_TMP%\filesystem_jni.obj" %CFLAGS% cl -c win32\misc_jni.c -Fo"%BUILD_TMP%\misc_jni.obj" %CFLAGS% cl -c win32\synchronization_jni.c -Fo"%BUILD_TMP%\synchronization_jni.obj" %CFLAGS% @@ -303,7 +300,6 @@ cl -c common\util.c -Fo"%BUILD_TMP%\util.obj" %CFLAGS% @echo off if not exist "%BUILD_TMP%\auth_sspi.obj" goto compileerror -if not exist "%BUILD_TMP%\console_jni.obj" goto compileerror if not exist "%BUILD_TMP%\filesystem_jni.obj" goto compileerror if not exist "%BUILD_TMP%\misc_jni.obj" goto compileerror if not exist "%BUILD_TMP%\synchronization_jni.obj" goto compileerror @@ -318,7 +314,6 @@ rem Link individual libraries. @echo on link -dll "%BUILD_TMP%\auth.obj" "%BUILD_TMP%\auth_sspi.obj" "%BUILD_TMP%\util.obj" "%BUILD_TMP%\logger_log4j.obj" -out:"%BUILD_TMP%\native_auth.dll" %LFLAGS% -link -dll "%BUILD_TMP%\console_jni.obj" "%BUILD_TMP%\util.obj" -out:"%BUILD_TMP%\native_console.dll" %LFLAGS% link -dll "%BUILD_TMP%\filesystem_jni.obj" "%BUILD_TMP%\util.obj" "%BUILD_TMP%\objects.obj" advapi32.lib -out:"%BUILD_TMP%\native_filesystem.dll" %LFLAGS% link -dll "%BUILD_TMP%\misc_jni.obj" "%BUILD_TMP%\util.obj" advapi32.lib -out:"%BUILD_TMP%\native_misc.dll" %LFLAGS% link -dll "%BUILD_TMP%\synchronization_jni.obj" "%BUILD_TMP%\util.obj" -out:"%BUILD_TMP%\native_synchronization.dll" %LFLAGS% @@ -328,7 +323,6 @@ link -dll "%BUILD_TMP%\messagewindow_jni.obj" "%BUILD_TMP%\util.obj" user32.lib @echo off if not exist "%BUILD_TMP%\native_auth.dll" goto compileerror -if not exist "%BUILD_TMP%\native_console.dll" goto compileerror if not exist "%BUILD_TMP%\native_filesystem.dll" goto compileerror if not exist "%BUILD_TMP%\native_misc.dll" goto compileerror if not exist "%BUILD_TMP%\native_synchronization.dll" goto compileerror @@ -358,11 +352,6 @@ if exist %DESTDIR%\native_auth.dll goto delerror if exist %SYMBOLDIR%\native_auth.pdb del %SYMBOLDIR%\native_auth.pdb if exist %SYMBOLDIR%\native_auth.pdb goto delerror -if exist %DESTDIR%\native_console.dll del %DESTDIR%\native_console.dll -if exist %DESTDIR%\native_console.dll goto delerror -if exist %SYMBOLDIR%\native_console.pdb del %SYMBOLDIR%\native_console.pdb -if exist %SYMBOLDIR%\native_console.pdb goto delerror - if exist %DESTDIR%\native_filesystem.dll del %DESTDIR%\native_filesystem.dll if exist %DESTDIR%\native_filesystem.dll goto delerror if exist %SYMBOLDIR%\native_filesystem.pdb del %SYMBOLDIR%\native_filesystem.pdb @@ -402,11 +391,6 @@ if not exist %DESTDIR%\native_auth.dll goto copyerror copy "%BUILD_TMP%\native_auth.pdb" %SYMBOLDIR%\native_auth.pdb if not exist %SYMBOLDIR%\native_auth.pdb goto copyerror -copy "%BUILD_TMP%\native_console.dll" %DESTDIR%\native_console.dll -if not exist %DESTDIR%\native_console.dll goto copyerror -copy "%BUILD_TMP%\native_console.pdb" %SYMBOLDIR%\native_console.pdb -if not exist %SYMBOLDIR%\native_console.pdb goto copyerror - copy "%BUILD_TMP%\native_filesystem.dll" %DESTDIR%\native_filesystem.dll if not exist %DESTDIR%\native_filesystem.dll goto copyerror copy "%BUILD_TMP%\native_filesystem.pdb" %SYMBOLDIR%\native_filesystem.pdb diff --git a/source/com.microsoft.tfs.jni/native-src/win32/console_jni.c b/source/com.microsoft.tfs.jni/native-src/win32/console_jni.c deleted file mode 100644 index 6c0828a88..000000000 --- a/source/com.microsoft.tfs.jni/native-src/win32/console_jni.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) Microsoft. All rights reserved. - * Licensed under the MIT license. See License.txt in the repository root. - */ - -#include -#include -#include -#include - -#include "tee_sal.h" -#include "native_console.h" - -/* - * Does the real console size work. Pass NULL for any argument you do not wish to have a value written to. - * On error no arguments are updated. - */ -void _getScreenBufferAndWindowSize(_Inout_opt_ int * screenBufferRows, _Inout_opt_ int * screenBufferColumns, - _Inout_opt_ int * windowRows, _Inout_opt_ int * windowColumns) -{ - CONSOLE_SCREEN_BUFFER_INFO info; - - if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info) != TRUE) - { - return; - } - - if (screenBufferRows != NULL) - { - *screenBufferRows = info.dwSize.Y; - } - - if (screenBufferColumns != NULL) - { - *screenBufferColumns = info.dwSize.X; - } - - if (windowRows != NULL) - { - // Add 1 because rows at both bounds are visible - *windowRows = info.srWindow.Bottom - info.srWindow.Top + 1; - } - - if (windowColumns != NULL) - { - // Add 1 because columns at both bounds are visible - *windowColumns = info.srWindow.Right - info.srWindow.Left + 1; - } -} - -/* - * Gets the height of the console WINDOW (not screen buffer) this process is attached to in rows. - * - * If an error occured, 0 is returned. - */ -JNIEXPORT jint JNICALL Java_com_microsoft_tfs_jni_internal_console_NativeConsole_nativeGetRows(JNIEnv *env, jclass cls) -{ - int rows = 0; - _getScreenBufferAndWindowSize(NULL, NULL, &rows, NULL); - return rows; -} - -/* - * Gets the width of the console SCREEN BUFFER (not window) this process is attached to in columns. - * - * If an error occured, 0 is returned. - */ -JNIEXPORT jint JNICALL Java_com_microsoft_tfs_jni_internal_console_NativeConsole_nativeGetColumns(JNIEnv *env, - jclass cls) -{ - int columns = 0; - _getScreenBufferAndWindowSize(NULL, &columns, NULL, NULL); - return columns; -} - -/* - * Disables character echo on the console. - * - * Returns true if the operation succeeded, false if it failed. - */ -JNIEXPORT jboolean JNICALL Java_com_microsoft_tfs_jni_internal_console_NativeConsole_nativeDisableEcho(JNIEnv *env, - jclass cls) -{ - HANDLE inputHandle = GetStdHandle(STD_INPUT_HANDLE); - DWORD consoleFlags; - - if (inputHandle != INVALID_HANDLE_VALUE) - { - /* Get the current mode. */ - if (GetConsoleMode(inputHandle, &consoleFlags)) - { - /* Turn off echo. */ - consoleFlags &= ~(ENABLE_ECHO_INPUT); - - if (SetConsoleMode(inputHandle, consoleFlags)) - { - return JNI_TRUE; - } - } - } - - return JNI_FALSE; -} - -/* - * Enables character echo on the console. - * - * Returns true if the operation succeeded, false if it failed. - */ -JNIEXPORT jboolean JNICALL Java_com_microsoft_tfs_jni_internal_console_NativeConsole_nativeEnableEcho(JNIEnv *env, - jclass cls) -{ - HANDLE inputHandle = GetStdHandle(STD_INPUT_HANDLE); - DWORD consoleFlags; - - if (inputHandle != INVALID_HANDLE_VALUE) - { - /* Get the current mode. */ - if (GetConsoleMode(inputHandle, &consoleFlags)) - { - /* Turn on echo. */ - consoleFlags |= (ENABLE_ECHO_INPUT); - - if (SetConsoleMode(inputHandle, consoleFlags)) - { - return JNI_TRUE; - } - } - } - - return JNI_FALSE; -} diff --git a/source/com.microsoft.tfs.jni/os/win32/x86/native_console.dll b/source/com.microsoft.tfs.jni/os/win32/x86/native_console.dll deleted file mode 100644 index cdc14e6057c93f48f1ae62a220937472a606ddb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54440 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 ldg;I!t(C%z^RhY@XM<*v`aqS1%{10jEB}M=M diff --git a/source/com.microsoft.tfs.jni/os/win32/x86_64/native_console.dll b/source/com.microsoft.tfs.jni/os/win32/x86_64/native_console.dll deleted file mode 100644 index fc3e8589f046ff2e79b9955d8434512b5f7d2ec6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63144 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 Xx?ySS$rsMA+?r@@qPt>~Rnh+gKcZ@) diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/NativeConsole.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/NativeConsole.java index 730519e26..2728e1316 100644 --- a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/NativeConsole.java +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/NativeConsole.java @@ -6,6 +6,7 @@ import com.microsoft.tfs.jni.Console; import com.microsoft.tfs.jni.internal.LibraryNames; import com.microsoft.tfs.jni.loader.NativeLoader; +import com.microsoft.tfs.util.Platform; /** * An implementation of the {@link Console} interface that uses native methods. @@ -13,6 +14,9 @@ * @threadsafety thread-safe */ public class NativeConsole implements Console { + + private static Console backend; + /** * This static initializer is a "best-effort" native code loader (no * exceptions thrown for normal load failures). @@ -24,7 +28,11 @@ public class NativeConsole implements Console { * code will execute fine. */ static { - NativeLoader.loadLibraryAndLogError(LibraryNames.CONSOLE_LIBRARY_NAME); + if (Platform.isCurrentPlatform(Platform.WINDOWS)) { + backend = new WindowsNativeConsole(); + } else { + NativeLoader.loadLibraryAndLogError(LibraryNames.CONSOLE_LIBRARY_NAME); + } } public NativeConsole() { @@ -32,22 +40,22 @@ public NativeConsole() { @Override public int getConsoleColumns() { - return nativeGetColumns(); + return backend == null ? nativeGetColumns() : backend.getConsoleColumns(); } @Override public int getConsoleRows() { - return nativeGetRows(); + return backend == null ? nativeGetRows() : backend.getConsoleRows(); } @Override public boolean disableEcho() { - return nativeDisableEcho(); + return backend == null ? nativeDisableEcho() : backend.disableEcho(); } @Override public boolean enableEcho() { - return nativeEnableEcho(); + return backend == null ? nativeEnableEcho() : backend.enableEcho(); } private static native int nativeGetRows(); diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/WindowsNativeConsole.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/WindowsNativeConsole.java new file mode 100644 index 000000000..ce55226bd --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/WindowsNativeConsole.java @@ -0,0 +1,62 @@ +package com.microsoft.tfs.jni.internal.console; + +import com.microsoft.tfs.jni.Console; +import com.microsoft.tfs.jni.internal.console.winapi.ConsoleScreenBufferInfo; +import com.microsoft.tfs.jni.internal.console.winapi.Kernel32; +import com.sun.jna.Pointer; +import com.sun.jna.ptr.IntByReference; + +import static com.microsoft.tfs.jni.internal.console.winapi.Kernel32.ENABLE_ECHO_INPUT; + +public class WindowsNativeConsole implements Console { + private static ConsoleScreenBufferInfo getConsoleScreenBufferInfo() { + Kernel32 kernel32 = Kernel32.INSTANCE; + Pointer handle = kernel32.GetStdHandle(Kernel32.STD_OUTPUT_HANDLE); + if (handle.equals(Pointer.NULL)) + return null; + + ConsoleScreenBufferInfo info = new ConsoleScreenBufferInfo(); + if (!kernel32.GetConsoleScreenBufferInfo(handle, info)) + return null; + + return info; + } + + @Override public int getConsoleColumns() { + ConsoleScreenBufferInfo info = getConsoleScreenBufferInfo(); + return info == null ? 0 : info.dwSize.x; + } + + @Override public int getConsoleRows() { + ConsoleScreenBufferInfo info = getConsoleScreenBufferInfo(); + return info == null ? 0 : info.dwSize.y; + } + + @Override public boolean disableEcho() { + Kernel32 kernel32 = Kernel32.INSTANCE; + Pointer stdOut = kernel32.GetStdHandle(Kernel32.STD_OUTPUT_HANDLE); + if (stdOut.equals(Pointer.NULL)) + return false; + + IntByReference consoleMode = new IntByReference(); + if (!kernel32.GetConsoleMode(stdOut, consoleMode)) + return false; + + int newConsoleMode = consoleMode.getValue() & ~ENABLE_ECHO_INPUT; + return kernel32.SetConsoleMode(stdOut, newConsoleMode); + } + + @Override public boolean enableEcho() { + Kernel32 kernel32 = Kernel32.INSTANCE; + Pointer stdOut = kernel32.GetStdHandle(Kernel32.STD_OUTPUT_HANDLE); + if (stdOut.equals(Pointer.NULL)) + return false; + + IntByReference consoleMode = new IntByReference(); + if (!kernel32.GetConsoleMode(stdOut, consoleMode)) + return false; + + int newConsoleMode = consoleMode.getValue() | ENABLE_ECHO_INPUT; + return kernel32.SetConsoleMode(stdOut, newConsoleMode); + } +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/ConsoleScreenBufferInfo.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/ConsoleScreenBufferInfo.java new file mode 100644 index 000000000..fb84f6cda --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/ConsoleScreenBufferInfo.java @@ -0,0 +1,19 @@ +package com.microsoft.tfs.jni.internal.console.winapi; + +import com.sun.jna.Structure; + +import java.util.Arrays; +import java.util.List; + +public class ConsoleScreenBufferInfo extends Structure { + + @Override protected List getFieldOrder() { + return Arrays.asList("dwSize", "dwCursorPosition", "wAttributes", "srWindow", "dwMaximumWindowSize"); + } + + public Coord dwSize; + public Coord dwCursorPosition; + public short wAttributes; + public SmallRect srWindow; + public Coord dwMaximumWindowSize; +} \ No newline at end of file diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/Coord.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/Coord.java new file mode 100644 index 000000000..e04ffe26a --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/Coord.java @@ -0,0 +1,19 @@ +package com.microsoft.tfs.jni.internal.console.winapi; + +import com.sun.jna.Structure; + +import java.util.Arrays; +import java.util.List; + +public class Coord extends Structure { + + public static class ByValue extends Coord implements Structure.ByValue { + } + + @Override protected List getFieldOrder() { + return Arrays.asList("x", "y"); + } + + public short x; + public short y; +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/Kernel32.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/Kernel32.java new file mode 100644 index 000000000..fdf08c6c6 --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/Kernel32.java @@ -0,0 +1,21 @@ +package com.microsoft.tfs.jni.internal.console.winapi; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; +import com.sun.jna.ptr.IntByReference; + +public interface Kernel32 extends Library { + + Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("Kernel32", Kernel32.class); + int STD_OUTPUT_HANDLE = -11; + int ENABLE_ECHO_INPUT = 0x0004; + + Pointer GetStdHandle(int nStdHandle); + + boolean GetConsoleScreenBufferInfo(Pointer hConsoleOutput, ConsoleScreenBufferInfo lpConsoleScreenBufferInfo); + + boolean GetConsoleMode(Pointer hConsoleHandle, IntByReference lpMode); + + boolean SetConsoleMode(Pointer hConsoleHandle, int lpMode); +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/SmallRect.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/SmallRect.java new file mode 100644 index 000000000..044a2d37e --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/SmallRect.java @@ -0,0 +1,18 @@ +package com.microsoft.tfs.jni.internal.console.winapi; + +import com.sun.jna.Structure; + +import java.util.Arrays; +import java.util.List; + +public class SmallRect extends Structure { + + @Override protected List getFieldOrder() { + return Arrays.asList("left", "top", "right", "bottom"); + } + + public short left; + public short top; + public short right; + public short bottom; +} From 7065e93492188803ef73726d4547da263b411825 Mon Sep 17 00:00:00 2001 From: Ivan Migalev Date: Mon, 18 Nov 2019 16:54:50 +0700 Subject: [PATCH 3/7] Use base JNA API instead of our own (cherry picked from commit 5a76a6c6196c04d49ed33eb8722f5091d95e7e83) --- .../jni/internal/console/WindowsNativeConsole.java | 11 ++++++----- .../tfs/jni/internal/console/winapi/Kernel32.java | 14 ++------------ 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/WindowsNativeConsole.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/WindowsNativeConsole.java index ce55226bd..6e56e4bee 100644 --- a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/WindowsNativeConsole.java +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/WindowsNativeConsole.java @@ -4,15 +4,16 @@ import com.microsoft.tfs.jni.internal.console.winapi.ConsoleScreenBufferInfo; import com.microsoft.tfs.jni.internal.console.winapi.Kernel32; import com.sun.jna.Pointer; +import com.sun.jna.platform.win32.WinNT; import com.sun.jna.ptr.IntByReference; import static com.microsoft.tfs.jni.internal.console.winapi.Kernel32.ENABLE_ECHO_INPUT; -public class WindowsNativeConsole implements Console { +class WindowsNativeConsole implements Console { private static ConsoleScreenBufferInfo getConsoleScreenBufferInfo() { Kernel32 kernel32 = Kernel32.INSTANCE; - Pointer handle = kernel32.GetStdHandle(Kernel32.STD_OUTPUT_HANDLE); - if (handle.equals(Pointer.NULL)) + WinNT.HANDLE handle = kernel32.GetStdHandle(Kernel32.STD_OUTPUT_HANDLE); + if (handle.getPointer().equals(Pointer.NULL)) return null; ConsoleScreenBufferInfo info = new ConsoleScreenBufferInfo(); @@ -34,7 +35,7 @@ private static ConsoleScreenBufferInfo getConsoleScreenBufferInfo() { @Override public boolean disableEcho() { Kernel32 kernel32 = Kernel32.INSTANCE; - Pointer stdOut = kernel32.GetStdHandle(Kernel32.STD_OUTPUT_HANDLE); + WinNT.HANDLE stdOut = kernel32.GetStdHandle(Kernel32.STD_OUTPUT_HANDLE); if (stdOut.equals(Pointer.NULL)) return false; @@ -48,7 +49,7 @@ private static ConsoleScreenBufferInfo getConsoleScreenBufferInfo() { @Override public boolean enableEcho() { Kernel32 kernel32 = Kernel32.INSTANCE; - Pointer stdOut = kernel32.GetStdHandle(Kernel32.STD_OUTPUT_HANDLE); + WinNT.HANDLE stdOut = kernel32.GetStdHandle(Kernel32.STD_OUTPUT_HANDLE); if (stdOut.equals(Pointer.NULL)) return false; diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/Kernel32.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/Kernel32.java index fdf08c6c6..e3e22208d 100644 --- a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/Kernel32.java +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/winapi/Kernel32.java @@ -1,21 +1,11 @@ package com.microsoft.tfs.jni.internal.console.winapi; -import com.sun.jna.Library; import com.sun.jna.Native; -import com.sun.jna.Pointer; -import com.sun.jna.ptr.IntByReference; -public interface Kernel32 extends Library { +public interface Kernel32 extends com.sun.jna.platform.win32.Kernel32 { Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("Kernel32", Kernel32.class); - int STD_OUTPUT_HANDLE = -11; int ENABLE_ECHO_INPUT = 0x0004; - Pointer GetStdHandle(int nStdHandle); - - boolean GetConsoleScreenBufferInfo(Pointer hConsoleOutput, ConsoleScreenBufferInfo lpConsoleScreenBufferInfo); - - boolean GetConsoleMode(Pointer hConsoleHandle, IntByReference lpMode); - - boolean SetConsoleMode(Pointer hConsoleHandle, int lpMode); + boolean GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, ConsoleScreenBufferInfo lpConsoleScreenBufferInfo); } From a4da82eb79175a89c21feb41e6d0688ddb42b328 Mon Sep 17 00:00:00 2001 From: Ivan Migalev Date: Mon, 18 Nov 2019 17:41:51 +0700 Subject: [PATCH 4/7] Add IDEA directory to .gitignore (cherry picked from commit bb41a1a620308ee48fa0e02667a7296b01112d7d) --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index ceff68ef3..4b456e243 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ .metadata .recommenders +# IntelliJ IDEA +/.idea + # Eclipse output folders for all projects under source/ bin From 64ee11aa3d1a20b661f3b6c2723f64e1bf636c20 Mon Sep 17 00:00:00 2001 From: Ivan Migalev Date: Mon, 18 Nov 2019 18:05:51 +0700 Subject: [PATCH 5/7] Partially replace code from libnative_console with JNA (cherry picked from commit c63d335d4d42dda79cf0ee671f08091929e137ea) --- .../os/linux/x86/libnative_console.so | Bin 9869 -> 0 bytes .../os/linux/x86_64/libnative_console.so | Bin 13482 -> 0 bytes .../os/macosx/libnative_console.jnilib | Bin 67160 -> 0 bytes .../tfs/jni/internal/LibraryNames.java | 5 -- .../jni/internal/console/NativeConsole.java | 39 +++------------- .../internal/console/UnixNativeConsole.java | 43 ++++++++++++++++++ .../tfs/jni/internal/console/unix/LibC.java | 20 ++++++++ .../jni/internal/console/unix/winsize.java | 18 ++++++++ 8 files changed, 87 insertions(+), 38 deletions(-) delete mode 100644 source/com.microsoft.tfs.jni/os/linux/x86/libnative_console.so delete mode 100644 source/com.microsoft.tfs.jni/os/linux/x86_64/libnative_console.so delete mode 100644 source/com.microsoft.tfs.jni/os/macosx/libnative_console.jnilib create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/UnixNativeConsole.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/LibC.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/winsize.java diff --git a/source/com.microsoft.tfs.jni/os/linux/x86/libnative_console.so b/source/com.microsoft.tfs.jni/os/linux/x86/libnative_console.so deleted file mode 100644 index b844195ec841aba9f3b914dd2d9000461d36c1d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9869 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 Z?hv)>PZUbgYIjR#b+_|(12g_O;=dgubW;ET diff --git a/source/com.microsoft.tfs.jni/os/linux/x86_64/libnative_console.so b/source/com.microsoft.tfs.jni/os/linux/x86_64/libnative_console.so deleted file mode 100644 index 755db719207a7881b8cf809422c76a1dda271265..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13482 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 SJRt}WTflF`PPmGQ1OFH1o=2Df diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/LibraryNames.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/LibraryNames.java index e7b1359eb..d3cb615e3 100644 --- a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/LibraryNames.java +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/LibraryNames.java @@ -17,11 +17,6 @@ public abstract class LibraryNames { */ public static final String MISC_LIBRARY_NAME = "native_misc"; //$NON-NLS-1$ - /** - * The short name of the native console library. - */ - public static final String CONSOLE_LIBRARY_NAME = "native_console"; //$NON-NLS-1$ - /** * The short name of the authentication library. */ diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/NativeConsole.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/NativeConsole.java index 2728e1316..fbddd2f7a 100644 --- a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/NativeConsole.java +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/NativeConsole.java @@ -4,8 +4,6 @@ package com.microsoft.tfs.jni.internal.console; import com.microsoft.tfs.jni.Console; -import com.microsoft.tfs.jni.internal.LibraryNames; -import com.microsoft.tfs.jni.loader.NativeLoader; import com.microsoft.tfs.util.Platform; /** @@ -15,54 +13,29 @@ */ public class NativeConsole implements Console { - private static Console backend; - - /** - * This static initializer is a "best-effort" native code loader (no - * exceptions thrown for normal load failures). - * - * Apps with multiple classloaders (like Eclipse) can run this initializer - * more than once in a single JVM OS process, and on some platforms - * (Windows) the native libraries will fail to load the second time, because - * they're already loaded. This failure can be ignored because the native - * code will execute fine. - */ - static { - if (Platform.isCurrentPlatform(Platform.WINDOWS)) { - backend = new WindowsNativeConsole(); - } else { - NativeLoader.loadLibraryAndLogError(LibraryNames.CONSOLE_LIBRARY_NAME); - } - } + private static final Console backend = + Platform.isCurrentPlatform(Platform.WINDOWS) ? new WindowsNativeConsole() : new UnixNativeConsole(); public NativeConsole() { } @Override public int getConsoleColumns() { - return backend == null ? nativeGetColumns() : backend.getConsoleColumns(); + return backend.getConsoleColumns(); } @Override public int getConsoleRows() { - return backend == null ? nativeGetRows() : backend.getConsoleRows(); + return backend.getConsoleRows(); } @Override public boolean disableEcho() { - return backend == null ? nativeDisableEcho() : backend.disableEcho(); + return backend.disableEcho(); } @Override public boolean enableEcho() { - return backend == null ? nativeEnableEcho() : backend.enableEcho(); + return backend.enableEcho(); } - - private static native int nativeGetRows(); - - private static native int nativeGetColumns(); - - private static native boolean nativeDisableEcho(); - - private static native boolean nativeEnableEcho(); } diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/UnixNativeConsole.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/UnixNativeConsole.java new file mode 100644 index 000000000..95e1ac040 --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/UnixNativeConsole.java @@ -0,0 +1,43 @@ +package com.microsoft.tfs.jni.internal.console; + +import com.microsoft.tfs.jni.Console; +import com.microsoft.tfs.jni.internal.console.unix.LibC; +import com.microsoft.tfs.jni.internal.console.unix.winsize; + +class UnixNativeConsole implements Console { + + private winsize getTtySize() { + LibC libC = LibC.INSTANCE; + int tty = libC.open("/dev/tty", LibC.O_RDONLY); + if (tty >= 0) { + try { + winsize size = new winsize(); + if (libC.ioctl(tty, LibC.TIOCGWINSZ, size.getPointer()) >= 0) { + return size; + } + } finally { + libC.close(tty); + } + } + + return null; + } + + @Override public int getConsoleColumns() { + winsize size = getTtySize(); + return size == null ? 0 : size.ws_col; + } + + @Override public int getConsoleRows() { + winsize size = getTtySize(); + return size == null ? 0 : size.ws_row; + } + + @Override public boolean disableEcho() { + return false; + } + + @Override public boolean enableEcho() { + return false; + } +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/LibC.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/LibC.java new file mode 100644 index 000000000..cace18d46 --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/LibC.java @@ -0,0 +1,20 @@ +package com.microsoft.tfs.jni.internal.console.unix; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Platform; +import com.sun.jna.Pointer; + +public interface LibC extends Library { + + LibC INSTANCE = (LibC) Native.loadLibrary("c", LibC.class); + + int O_RDONLY = 0; + long TIOCGWINSZ = Platform.isLinux() ? 0x5413L : 0x40087468L; + + int open(String pathname, int flags); + + int close(int fd); + + int ioctl(int fd, long cmd, Pointer p); +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/winsize.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/winsize.java new file mode 100644 index 000000000..660270b81 --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/winsize.java @@ -0,0 +1,18 @@ +package com.microsoft.tfs.jni.internal.console.unix; + +import com.sun.jna.Structure; + +import java.util.Arrays; +import java.util.List; + +public class winsize extends Structure { + + @Override protected List getFieldOrder() { + return Arrays.asList("ws_row", "ws_col", "ws_xpixel", "ws_ypixel"); + } + + public short ws_row; + public short ws_col; + public short ws_xpixel; + public short ws_ypixel; +} From e2c1879751ca26fef5fd558d768d12e6094c7ebd Mon Sep 17 00:00:00 2001 From: Ivan Migalev Date: Tue, 19 Nov 2019 16:56:57 +0700 Subject: [PATCH 6/7] Fix the syscall syntax for Unix (cherry picked from commit 7b4787b8f11ab352386741689a1074715869a8ce) --- .../microsoft/tfs/jni/internal/console/UnixNativeConsole.java | 2 +- .../src/com/microsoft/tfs/jni/internal/console/unix/LibC.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/UnixNativeConsole.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/UnixNativeConsole.java index 95e1ac040..2ae9f9ae2 100644 --- a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/UnixNativeConsole.java +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/UnixNativeConsole.java @@ -12,7 +12,7 @@ private winsize getTtySize() { if (tty >= 0) { try { winsize size = new winsize(); - if (libC.ioctl(tty, LibC.TIOCGWINSZ, size.getPointer()) >= 0) { + if (libC.ioctl(tty, LibC.TIOCGWINSZ, size) >= 0) { return size; } } finally { diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/LibC.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/LibC.java index cace18d46..385d0b7b8 100644 --- a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/LibC.java +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/LibC.java @@ -16,5 +16,5 @@ public interface LibC extends Library { int close(int fd); - int ioctl(int fd, long cmd, Pointer p); + int ioctl(int fd, long cmd, winsize p); } From cb40a919f47469e6148415c512d308995289f008 Mon Sep 17 00:00:00 2001 From: Ivan Migalev Date: Tue, 19 Nov 2019 18:06:16 +0700 Subject: [PATCH 7/7] Implement enable/disable echo for UnixNativeConsole (cherry picked from commit 303c48bb9dfbd2f37e31c3cb8dd6a45c112c9f0c) --- .../com.microsoft.tfs.jni/native-src/build.sh | 10 -- .../native-src/unix/console_jni.c | 117 ------------------ .../os/aix/ppc/libnative_console.a | Bin 62100 -> 0 bytes .../os/freebsd/x86/libnative_console.so | Bin 9326 -> 0 bytes .../os/freebsd/x86_64/libnative_console.so | Bin 12449 -> 0 bytes .../os/hpux/PA_RISC/libnative_console.sl | Bin 16384 -> 0 bytes .../os/hpux/ia64_32/libnative_console.so | Bin 69768 -> 0 bytes .../os/linux/arm/libnative_console.so | Bin 9128 -> 0 bytes .../os/linux/ppc/libnative_console.so | Bin 19203 -> 0 bytes .../os/solaris/sparc/libnative_console.so | Bin 9868 -> 0 bytes .../os/solaris/x86/libnative_console.so | Bin 8760 -> 0 bytes .../os/solaris/x86_64/libnative_console.so | Bin 12792 -> 0 bytes .../internal/console/UnixNativeConsole.java | 21 +++- .../tfs/jni/internal/console/unix/LibC.java | 7 ++ .../jni/internal/console/unix/termios.java | 22 ++++ 15 files changed, 48 insertions(+), 129 deletions(-) delete mode 100644 source/com.microsoft.tfs.jni/native-src/unix/console_jni.c delete mode 100644 source/com.microsoft.tfs.jni/os/aix/ppc/libnative_console.a delete mode 100644 source/com.microsoft.tfs.jni/os/freebsd/x86/libnative_console.so delete mode 100644 source/com.microsoft.tfs.jni/os/freebsd/x86_64/libnative_console.so delete mode 100644 source/com.microsoft.tfs.jni/os/hpux/PA_RISC/libnative_console.sl delete mode 100644 source/com.microsoft.tfs.jni/os/hpux/ia64_32/libnative_console.so delete mode 100644 source/com.microsoft.tfs.jni/os/linux/arm/libnative_console.so delete mode 100644 source/com.microsoft.tfs.jni/os/linux/ppc/libnative_console.so delete mode 100644 source/com.microsoft.tfs.jni/os/solaris/sparc/libnative_console.so delete mode 100644 source/com.microsoft.tfs.jni/os/solaris/x86/libnative_console.so delete mode 100644 source/com.microsoft.tfs.jni/os/solaris/x86_64/libnative_console.so create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/termios.java diff --git a/source/com.microsoft.tfs.jni/native-src/build.sh b/source/com.microsoft.tfs.jni/native-src/build.sh index 2295ea375..37f0f1901 100755 --- a/source/com.microsoft.tfs.jni/native-src/build.sh +++ b/source/com.microsoft.tfs.jni/native-src/build.sh @@ -254,7 +254,6 @@ esac # The simple names of the libraries we generate. A "lib" prefix # and/or file extension is added per-platform. LIBRARY_AUTH="native_auth" -LIBRARY_CONSOLE="native_console" LIBRARY_FILESYSTEM="native_filesystem" LIBRARY_MISC="native_misc" LIBRARY_SYNCHRONIZATION="native_synchronization" @@ -262,7 +261,6 @@ LIBRARY_KEYCHAIN="native_keychain" # The sources required by each library we compile and link. SOURCES_AUTH="common/util.c common/objects.c common/logger_log4j.c common/auth.c unix/auth_gss.c" -SOURCES_CONSOLE="common/util.c common/objects.c unix/console_jni.c" SOURCES_FILESYSTEM="common/util.c common/objects.c unix/filesystem_jni.c" SOURCES_MISC="common/util.c common/objects.c unix/misc_jni.c" SOURCES_SYNCHRONIZATION="common/util.c common/objects.c unix/synchronization_jni.c" @@ -396,7 +394,6 @@ if [ "$PREVIEW" = 0 ] ; then $E -n "- Generating C headers... " javah -jni -o "$TMP/native_auth.h" com.microsoft.tfs.jni.internal.auth.NativeAuth - javah -jni -o "$TMP/native_console.h" com.microsoft.tfs.jni.internal.console.NativeConsole javah -jni -o "$TMP/native_filesystem.h" com.microsoft.tfs.jni.internal.filesystem.NativeFileSystem javah -jni -o "$TMP/native_keychain.h" com.microsoft.tfs.jni.internal.keychain.NativeKeychain javah -jni -o "$TMP/native_misc.h" com.microsoft.tfs.jni.internal.platformmisc.NativePlatformMisc @@ -435,7 +432,6 @@ case $PLATFORM in CFLAGS="$CFLAGS -fstack-protector -Wstack-protector -D_FORTIFY_SOURCE=2 -I${JAVA_FRAMEWORK}/Headers $arch_support -DMACOS_X -DHAS_STAT_MTIMESPEC" LDFLAGS="$LDFLAGS -bundle -framework JavaVM -framework SystemConfiguration -framework CoreServices -mmacosx-version-min=10.5" - build_library_gcc "$TMP/lib$LIBRARY_CONSOLE.jnilib" "$SOURCES_CONSOLE" build_library_gcc "$TMP/lib$LIBRARY_FILESYSTEM.jnilib" "$SOURCES_FILESYSTEM" build_library_gcc "$TMP/lib$LIBRARY_MISC.jnilib" "$SOURCES_MISC" build_library_gcc "$TMP/lib$LIBRARY_SYNCHRONIZATION.jnilib" "$SOURCES_SYNCHRONIZATION" @@ -471,7 +467,6 @@ case $PLATFORM in CFLAGS="$CFLAGS -m32 -Di386 -Di586 -DcpuIntel -D_LITTLE_ENDIAN" fi - build_library_gcc "$TMP/lib$LIBRARY_CONSOLE.so" "$SOURCES_CONSOLE" build_library_gcc "$TMP/lib$LIBRARY_FILESYSTEM.so" "$SOURCES_FILESYSTEM" build_library_gcc "$TMP/lib$LIBRARY_MISC.so" "$SOURCES_MISC" build_library_gcc "$TMP/lib$LIBRARY_SYNCHRONIZATION.so" "$SOURCES_SYNCHRONIZATION" @@ -506,7 +501,6 @@ case $PLATFORM in CFLAGS="$CFLAGS -milp32" fi - build_library_gcc "$TMP/lib$LIBRARY_CONSOLE.$EXTENSION" "$SOURCES_CONSOLE" build_library_gcc "$TMP/lib$LIBRARY_FILESYSTEM.$EXTENSION" "$SOURCES_FILESYSTEM" build_library_gcc "$TMP/lib$LIBRARY_MISC.$EXTENSION" "$SOURCES_MISC" build_library_gcc "$TMP/lib$LIBRARY_SYNCHRONIZATION.$EXTENSION" "$SOURCES_SYNCHRONIZATION" @@ -535,7 +529,6 @@ case $PLATFORM in LDFLAGS="$LDFLAGS -z defs" fi - build_library_gcc "$TMP/lib$LIBRARY_CONSOLE.so" "$SOURCES_CONSOLE" build_library_gcc "$TMP/lib$LIBRARY_FILESYSTEM.so" "$SOURCES_FILESYSTEM" build_library_gcc "$TMP/lib$LIBRARY_MISC.so" "$SOURCES_MISC" build_library_gcc "$TMP/lib$LIBRARY_SYNCHRONIZATION.so" "$SOURCES_SYNCHRONIZATION" @@ -572,7 +565,6 @@ case $PLATFORM in CFLAGS="$CFLAGS -DPOWERPC -D_BIG_ENDIAN" fi - build_library_gcc "$TMP/lib$LIBRARY_CONSOLE.a" "$SOURCES_CONSOLE" build_library_gcc "$TMP/lib$LIBRARY_FILESYSTEM.a" "$SOURCES_FILESYSTEM" build_library_gcc "$TMP/lib$LIBRARY_MISC.a" "$SOURCES_MISC" build_library_gcc "$TMP/lib$LIBRARY_SYNCHRONIZATION.a" "$SOURCES_SYNCHRONIZATION" @@ -599,7 +591,6 @@ case $PLATFORM in LDFLAGS="$LDFLAGS -z defs" fi - build_library_gcc "$TMP/lib$LIBRARY_CONSOLE.so" "$SOURCES_CONSOLE" build_library_gcc "$TMP/lib$LIBRARY_FILESYSTEM.so" "$SOURCES_FILESYSTEM" build_library_gcc "$TMP/lib$LIBRARY_MISC.so" "$SOURCES_MISC" build_library_gcc "$TMP/lib$LIBRARY_SYNCHRONIZATION.so" "$SOURCES_SYNCHRONIZATION" @@ -627,7 +618,6 @@ case $PLATFORM in CFLAGS="$CFLAGS -D_POSIX_SOURCE -D_XOPEN_SOURCE=500 -I$JAVA_HOME/include -W \"c,langlvl(extended),float(ieee),dll,exportall\"" LDFLAGS="$LDFLAGS -W l,dll" - build_library_zos "$TMP/lib$LIBRARY_CONSOLE.so" "$EBCDIC_DIR" "$SOURCES_CONSOLE" build_library_zos "$TMP/lib$LIBRARY_FILESYSTEM.so" "$EBCDIC_DIR" "$SOURCES_FILESYSTEM" build_library_zos "$TMP/lib$LIBRARY_MISC.so" "$EBCDIC_DIR" "$SOURCES_MISC" build_library_zos "$TMP/lib$LIBRARY_SYNCHRONIZATION.so" "$EBCDIC_DIR" "$SOURCES_SYNCHRONIZATION" diff --git a/source/com.microsoft.tfs.jni/native-src/unix/console_jni.c b/source/com.microsoft.tfs.jni/native-src/unix/console_jni.c deleted file mode 100644 index 31093d89f..000000000 --- a/source/com.microsoft.tfs.jni/native-src/unix/console_jni.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) Microsoft. All rights reserved. - * Licensed under the MIT license. See License.txt in the repository root. - */ - -/* - * JNI functions that do console work. - */ - -#include -#include -#include -#include -#include -#include - -#include "native_console.h" -#include "util.h" - -/* - * Does the real console/terminal size work. Not exported via JNI. - */ -void _getConsoleSize(int * rows, int * columns) -{ - int ttyfd; - struct winsize ws; - static const char * tty = "/dev/tty"; - - if ((ttyfd = open(tty, O_RDONLY)) >= 0) - { - if (ioctl(ttyfd, TIOCGWINSZ, &ws) >= 0) - { - *rows = ws.ws_row; - *columns = ws.ws_col; - } - close(ttyfd); - } -} - -/* - * Gets the height of the console this process is attached to in rows. - * - * If an error occured, 0 is returned. - */ -JNIEXPORT jint JNICALL Java_com_microsoft_tfs_jni_internal_console_NativeConsole_nativeGetRows(JNIEnv *env, jclass cls) -{ - int rows = 0, columns = 0; - _getConsoleSize(&rows, &columns); - return rows; -} - -/* - * Gets the width of the terminal this process is attached to in columns. - * - * If an error occured, 0 is returned. - */ -JNIEXPORT jint JNICALL Java_com_microsoft_tfs_jni_internal_console_NativeConsole_nativeGetColumns(JNIEnv *env, - jclass cls) -{ - int rows = 0, columns = 0; - _getConsoleSize(&rows, &columns); - return columns; -} - -/* - * Disables character echo on the console. - * - * Returns true if the operation succeeded, false if it failed. - */ -JNIEXPORT jboolean JNICALL Java_com_microsoft_tfs_jni_internal_console_NativeConsole_nativeDisableEcho(JNIEnv *env, - jclass cls) -{ - struct termios settings; - - /* Get settings. */ - if (tcgetattr(STDIN_FILENO, &settings) != 0) - { - return JNI_FALSE; - } - - settings.c_lflag &= (~ECHO); - - /* Set them back. */ - if (tcsetattr(STDIN_FILENO, TCSANOW, &settings) != 0) - { - return JNI_FALSE; - } - - return JNI_TRUE; -} - -/* - * Enables character echo on the console. - * - * Returns true if the operation succeeded, false if it failed. - */ -JNIEXPORT jboolean JNICALL Java_com_microsoft_tfs_jni_internal_console_NativeConsole_nativeEnableEcho(JNIEnv *env, - jclass cls) -{ - struct termios settings; - - /* Get settings. */ - if (tcgetattr(STDIN_FILENO, &settings) != 0) - { - return JNI_FALSE; - } - - settings.c_lflag |= (ECHO); - - /* Set them back. */ - if (tcsetattr(STDIN_FILENO, TCSANOW, &settings) != 0) - { - return JNI_FALSE; - } - - return JNI_TRUE; -} diff --git a/source/com.microsoft.tfs.jni/os/aix/ppc/libnative_console.a b/source/com.microsoft.tfs.jni/os/aix/ppc/libnative_console.a deleted file mode 100644 index b05963c2045c4be1f6778855a44ab59655dd8ea3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62100 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

|>t<<6hM^e;sUn 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 Dfde*q diff --git a/source/com.microsoft.tfs.jni/os/freebsd/x86_64/libnative_console.so b/source/com.microsoft.tfs.jni/os/freebsd/x86_64/libnative_console.so deleted file mode 100644 index 8a789acc4de3ac70da2064e71bdc8dd80583a8e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12449 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 ONU5th2_1GO-G2dOK3ziq diff --git a/source/com.microsoft.tfs.jni/os/hpux/PA_RISC/libnative_console.sl b/source/com.microsoft.tfs.jni/os/hpux/PA_RISC/libnative_console.sl deleted file mode 100644 index 9a622a2212afd3bb708215cb754febd1ce5b6b06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 YUW%sP5~ukjl7_W%F@ diff --git a/source/com.microsoft.tfs.jni/os/linux/ppc/libnative_console.so b/source/com.microsoft.tfs.jni/os/linux/ppc/libnative_console.so deleted file mode 100644 index 6cdc6eec185270f3c658622e02f724966d3f78a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19203 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 OpLJX7Cyp~d=ls7&fg{xb diff --git a/source/com.microsoft.tfs.jni/os/solaris/sparc/libnative_console.so b/source/com.microsoft.tfs.jni/os/solaris/sparc/libnative_console.so deleted file mode 100644 index 408831d57d3dbfd6d1cdf3a35309f110e018a487..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9868 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 diff --git a/source/com.microsoft.tfs.jni/os/solaris/x86/libnative_console.so b/source/com.microsoft.tfs.jni/os/solaris/x86/libnative_console.so deleted file mode 100644 index 00e56a908d463ade54015f77b452624c3f53d76c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8760 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 D$q@lh diff --git a/source/com.microsoft.tfs.jni/os/solaris/x86_64/libnative_console.so b/source/com.microsoft.tfs.jni/os/solaris/x86_64/libnative_console.so deleted file mode 100644 index de804899d4a247225dcd53103a457f9e23d8432f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12792 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 diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/UnixNativeConsole.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/UnixNativeConsole.java index 2ae9f9ae2..8f19c5c4b 100644 --- a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/UnixNativeConsole.java +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/UnixNativeConsole.java @@ -2,6 +2,7 @@ import com.microsoft.tfs.jni.Console; import com.microsoft.tfs.jni.internal.console.unix.LibC; +import com.microsoft.tfs.jni.internal.console.unix.termios; import com.microsoft.tfs.jni.internal.console.unix.winsize; class UnixNativeConsole implements Console { @@ -34,10 +35,26 @@ private winsize getTtySize() { } @Override public boolean disableEcho() { - return false; + LibC libC = LibC.INSTANCE; + + termios settings = new termios(); + if (libC.tcgetattr(LibC.STDIN_FILENO, settings) != 0) + return false; + + settings.c_lflag &= ~LibC.ECHO; + + return libC.tcsetattr(LibC.STDIN_FILENO, LibC.TCSANOW, settings) == 0; } @Override public boolean enableEcho() { - return false; + LibC libC = LibC.INSTANCE; + + termios settings = new termios(); + if (libC.tcgetattr(LibC.STDIN_FILENO, settings) != 0) + return false; + + settings.c_lflag |= LibC.ECHO; + + return libC.tcsetattr(LibC.STDIN_FILENO, LibC.TCSANOW, settings) == 0; } } diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/LibC.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/LibC.java index 385d0b7b8..e215ad8ba 100644 --- a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/LibC.java +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/LibC.java @@ -11,10 +11,17 @@ public interface LibC extends Library { int O_RDONLY = 0; long TIOCGWINSZ = Platform.isLinux() ? 0x5413L : 0x40087468L; + int STDIN_FILENO = 0; + int ECHO = 8; + int TCSANOW = 0; int open(String pathname, int flags); int close(int fd); int ioctl(int fd, long cmd, winsize p); + + int tcgetattr(int fd, termios termios_p); + + int tcsetattr(int fd, int optional_actions, termios termios_p); } diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/termios.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/termios.java new file mode 100644 index 000000000..8ec37d316 --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/termios.java @@ -0,0 +1,22 @@ +package com.microsoft.tfs.jni.internal.console.unix; + +import com.sun.jna.Structure; + +import java.util.Arrays; +import java.util.List; + +public class termios extends Structure { + + @Override protected List getFieldOrder() { + return Arrays.asList("c_iflag", "c_oflag", "c_cflag", "c_lflag", "c_line", "c_cc", "c_ispeed", "c_ospeed"); + } + + public int c_iflag; /* input mode flags */ + public int c_oflag; /* output mode flags */ + public int c_cflag; /* control mode flags */ + public int c_lflag; /* local mode flags */ + public byte c_line; /* line discipline */ + public byte[] c_cc = new byte[32]; /* control characters */ + public int c_ispeed; /* input speed */ + public int c_ospeed; /* output speed */ +}