From d935ddaf508f1a0f6122aae6865a3bef8bdcec38 Mon Sep 17 00:00:00 2001 From: Ivan Migalev Date: Fri, 22 Nov 2019 20:06:16 +0700 Subject: [PATCH] Implement native_misc library for macOS and Linux --- .../jni/internal/console/NativeConsole.java | 8 +- .../internal/console/UnixNativeConsole.java | 29 ++++--- .../platformmisc/LinuxNativePlatformMisc.java | 28 +++++++ .../platformmisc/MacOsNativePlatformMisc.java | 77 +++++++++++++++++++ .../platformmisc/NativePlatformMisc.java | 40 ++++------ .../platformmisc/UnixNativePlatformMisc.java | 59 ++++++++++++++ .../jni/internal/{console => }/unix/LibC.java | 15 ++-- .../tfs/jni/internal/unix/linux/LibC.java | 11 +++ .../tfs/jni/internal/unix/linux/passwd.java | 35 +++++++++ .../jni/internal/unix/macos/CoreServices.java | 13 ++++ .../tfs/jni/internal/unix/macos/LibC.java | 11 +++ .../unix/macos/SCDynamicStoreRef.java | 8 ++ .../internal/unix/macos/SCPreferencesRef.java | 8 ++ .../unix/macos/SystemConfiguration.java | 17 ++++ .../tfs/jni/internal/unix/macos/passwd.java | 43 +++++++++++ .../internal/{console => }/unix/termios.java | 2 +- .../internal/{console => }/unix/winsize.java | 2 +- 17 files changed, 355 insertions(+), 51 deletions(-) create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/LinuxNativePlatformMisc.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/MacOsNativePlatformMisc.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/UnixNativePlatformMisc.java rename source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/{console => }/unix/LibC.java (65%) create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/linux/LibC.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/linux/passwd.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/CoreServices.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/LibC.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/SCDynamicStoreRef.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/SCPreferencesRef.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/SystemConfiguration.java create mode 100644 source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/passwd.java rename source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/{console => }/unix/termios.java (93%) rename source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/{console => }/unix/winsize.java (87%) 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 fbddd2f7a..34269ce73 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 @@ -13,8 +13,12 @@ */ public class NativeConsole implements Console { - private static final Console backend = - Platform.isCurrentPlatform(Platform.WINDOWS) ? new WindowsNativeConsole() : new UnixNativeConsole(); + private static final Console backend = Platform.isCurrentPlatform(Platform.WINDOWS) + ? new WindowsNativeConsole() + : new UnixNativeConsole( + Platform.isCurrentPlatform(Platform.MAC_OS_X) + ? com.microsoft.tfs.jni.internal.unix.macos.LibC.INSTANCE + : com.microsoft.tfs.jni.internal.unix.linux.LibC.INSTANCE); public NativeConsole() { } 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 8f19c5c4b..d537e8ec2 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 @@ -1,14 +1,19 @@ 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.termios; -import com.microsoft.tfs.jni.internal.console.unix.winsize; +import com.microsoft.tfs.jni.internal.unix.LibC; +import com.microsoft.tfs.jni.internal.unix.termios; +import com.microsoft.tfs.jni.internal.unix.winsize; class UnixNativeConsole implements Console { + private final LibC libC; + + public UnixNativeConsole(LibC libC) { + this.libC = libC; + } + private winsize getTtySize() { - LibC libC = LibC.INSTANCE; int tty = libC.open("/dev/tty", LibC.O_RDONLY); if (tty >= 0) { try { @@ -24,19 +29,20 @@ private winsize getTtySize() { return null; } - @Override public int getConsoleColumns() { + @Override + public int getConsoleColumns() { winsize size = getTtySize(); return size == null ? 0 : size.ws_col; } - @Override public int getConsoleRows() { + @Override + public int getConsoleRows() { winsize size = getTtySize(); return size == null ? 0 : size.ws_row; } - @Override public boolean disableEcho() { - LibC libC = LibC.INSTANCE; - + @Override + public boolean disableEcho() { termios settings = new termios(); if (libC.tcgetattr(LibC.STDIN_FILENO, settings) != 0) return false; @@ -46,9 +52,8 @@ private winsize getTtySize() { return libC.tcsetattr(LibC.STDIN_FILENO, LibC.TCSANOW, settings) == 0; } - @Override public boolean enableEcho() { - LibC libC = LibC.INSTANCE; - + @Override + public boolean enableEcho() { termios settings = new termios(); if (libC.tcgetattr(LibC.STDIN_FILENO, settings) != 0) return false; diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/LinuxNativePlatformMisc.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/LinuxNativePlatformMisc.java new file mode 100644 index 000000000..2dc66b17c --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/LinuxNativePlatformMisc.java @@ -0,0 +1,28 @@ +package com.microsoft.tfs.jni.internal.platformmisc; + +import com.microsoft.tfs.jni.internal.unix.linux.LibC; +import com.microsoft.tfs.jni.internal.unix.linux.passwd; +import com.sun.jna.platform.linux.XAttr; +import com.sun.jna.ptr.PointerByReference; + +public class LinuxNativePlatformMisc extends UnixNativePlatformMisc { + + private static final LibC libC = LibC.INSTANCE; + + protected LinuxNativePlatformMisc() { + super(libC); + } + + @Override + public String getHomeDirectory(String username) { + passwd pwd = new passwd(); + byte[] pwdBuffer = new byte[1024]; + PointerByReference tempPwdPtr = new PointerByReference(); + if (libC.getpwnam_r(username, pwd, pwdBuffer, new XAttr.size_t(pwdBuffer.length), tempPwdPtr) != 0 + || tempPwdPtr.getValue() == null) + return null; + + passwd tempPwd = new passwd(tempPwdPtr.getValue()); + return tempPwd.pw_dir; + } +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/MacOsNativePlatformMisc.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/MacOsNativePlatformMisc.java new file mode 100644 index 000000000..dbbcfd24a --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/MacOsNativePlatformMisc.java @@ -0,0 +1,77 @@ +package com.microsoft.tfs.jni.internal.platformmisc; + +import com.microsoft.tfs.jni.internal.unix.macos.*; +import com.sun.jna.platform.linux.XAttr; +import com.sun.jna.platform.mac.CoreFoundation; +import com.sun.jna.ptr.IntByReference; +import com.sun.jna.ptr.PointerByReference; + +public class MacOsNativePlatformMisc extends UnixNativePlatformMisc { + + private static final LibC libC = LibC.INSTANCE; + private static final CoreFoundation coreFoundation = CoreFoundation.INSTANCE; + private static final CoreServices coreServices = CoreServices.INSTANCE; + private static final SystemConfiguration systemConfiguration = SystemConfiguration.INSTANCE; + + protected MacOsNativePlatformMisc() { + super(libC); + } + + @Override + public String getHomeDirectory(String username) { + passwd pwd = new passwd(); + byte[] pwdBuffer = new byte[1024]; + PointerByReference tempPwdPtr = new PointerByReference(); + if (libC.getpwnam_r(username, pwd, pwdBuffer, new XAttr.size_t(pwdBuffer.length), tempPwdPtr) != 0 + || tempPwdPtr.getValue() == null) + return null; + + passwd tempPwd = new passwd(tempPwdPtr.getValue()); + return tempPwd.pw_dir; + } + + /** + * This will attempt to return the HostName system preference (10.4+). If that fails, this will attempt to return + * the LocalHostName system preference (aka, the Bonjour name as configured in Sharing preferences; 10.3+). This is + * to work around MacOS's dynamic hostname. If both of those fail this uses the Unix hostname. + */ + @Override + public String getComputerName() { + IntByReference osVersion = new IntByReference(); + if (coreServices.Gestalt(CoreServices.gestaltSystemVersion, osVersion) != 0) + osVersion.setValue(0); + + if (osVersion.getValue() >= 0x1040) { + CoreFoundation.CFStringRef microsoft = CoreFoundation.CFStringRef.createCFString("Microsoft"); + try { + SCPreferencesRef configuration = systemConfiguration.SCPreferencesCreate(null, microsoft, null); + if (configuration != null) { + try { + CoreFoundation.CFStringRef hostName = + systemConfiguration.SCPreferencesGetHostName(configuration); + if (hostName != null) { + return hostName.stringValue(); + } + } finally { + coreFoundation.CFRelease(configuration); + } + } + } finally { + CoreFoundation.INSTANCE.CFRelease(microsoft); + } + } + + if (osVersion.getValue() >= 0x1030) { + CoreFoundation.CFStringRef hostName = systemConfiguration.SCDynamicStoreCopyLocalHostName(null); + if (hostName != null) { + try { + return hostName.stringValue(); + } finally { + coreFoundation.CFRelease(hostName); + } + } + } + + return super.getComputerName(); + } +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/NativePlatformMisc.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/NativePlatformMisc.java index 9229d7d6c..b1070951a 100644 --- a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/NativePlatformMisc.java +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/NativePlatformMisc.java @@ -20,9 +20,7 @@ */ public class NativePlatformMisc implements PlatformMisc { - private final PlatformMisc backend = Platform.isCurrentPlatform(Platform.WINDOWS) - ? new WindowsNativePlatformMisc() - : null; + private final PlatformMisc backend; /** * This static initializer is a "best-effort" native code loader (no @@ -39,6 +37,12 @@ public class NativePlatformMisc implements PlatformMisc { } public NativePlatformMisc() { + if (Platform.isCurrentPlatform(Platform.WINDOWS)) + backend = new WindowsNativePlatformMisc(); + else if (Platform.isCurrentPlatform(Platform.MAC_OS_X)) + backend = new MacOsNativePlatformMisc(); + else + backend = new LinuxNativePlatformMisc(); } @Override @@ -49,20 +53,14 @@ public String getHomeDirectory(final String username) { return null; } - return nativeGetHomeDirectory(username); + return backend.getHomeDirectory(username); } @Override public boolean changeCurrentDirectory(final String directory) { Check.notNull(directory, "directory"); //$NON-NLS-1$ - boolean success; - if (backend != null) - success = backend.changeCurrentDirectory(directory); - else - success = nativeChangeCurrentDirectory(directory) == 0; - - if (success) { + if (backend.changeCurrentDirectory(directory)) { /* * We must set this variable for Java classes to have any idea that * the paths have changed. Canonical path is much nicer to @@ -73,9 +71,11 @@ public boolean changeCurrentDirectory(final String directory) { } catch (final IOException e) { System.setProperty("user.dir", new File(directory).getAbsolutePath()); //$NON-NLS-1$ } + + return true; } - return success; + return false; } @Override @@ -89,7 +89,7 @@ public int getDefaultCodePage() { @Override public String getComputerName() { - final String name = backend == null ? nativeGetComputerName() : backend.getComputerName(); + final String name = backend.getComputerName(); if (name == null || name.length() == 0) { return null; @@ -129,23 +129,9 @@ public String getWellKnownSID(final int wellKnownSIDType, final String domainSID : backend.getWellKnownSID(wellKnownSIDType, domainSIDString); } - private static native int nativeChangeCurrentDirectory(String directory); - - private static native String nativeGetComputerName(); - - private static native String nativeGetEnvironmentVariable(String name); - // WARNING: Following only available on Windows. - private static native int nativeGetDefaultCodePage(); - private static native String nativeGetCurrentIdentityUser(); - private static native String nativeExpandEnvironmentString(String value); - private static native String nativeGetWellKnownSID(int wellKnownSIDType, String domainSIDString); - - // WARNING: Following only available on Unix. - - private static native String nativeGetHomeDirectory(String username); } diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/UnixNativePlatformMisc.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/UnixNativePlatformMisc.java new file mode 100644 index 000000000..ecb2a07ee --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/platformmisc/UnixNativePlatformMisc.java @@ -0,0 +1,59 @@ +package com.microsoft.tfs.jni.internal.platformmisc; + +import com.microsoft.tfs.jni.PlatformMisc; +import com.microsoft.tfs.jni.internal.unix.LibC; +import com.microsoft.tfs.jni.internal.unix.linux.passwd; +import com.sun.jna.platform.linux.XAttr; +import com.sun.jna.platform.unix.LibCAPI; +import com.sun.jna.ptr.PointerByReference; + +import java.nio.charset.Charset; + +public abstract class UnixNativePlatformMisc implements PlatformMisc { + + private final LibC libC; + + protected UnixNativePlatformMisc(LibC libC) { + this.libC = libC; + } + + @Override + public boolean changeCurrentDirectory(String directory) { + return libC.chdir(directory) == 0; + } + + @Override + public int getDefaultCodePage() { + throw new RuntimeException("Platform not supported"); + } + + @Override + public String getComputerName() { + byte[] buffer = new byte[LibCAPI.HOST_NAME_MAX]; + if (libC.gethostname(buffer, buffer.length) != 0) { + return null; + } + + return new String(buffer, Charset.defaultCharset()); + } + + @Override + public String getEnvironmentVariable(String name) { + return null; + } + + @Override + public String expandEnvironmentString(String value) { + return null; + } + + @Override + public String getCurrentIdentityUser() { + return null; + } + + @Override + public String getWellKnownSID(int wellKnownSIDType, String domainSIDString) { + return null; + } +} 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/unix/LibC.java similarity index 65% rename from source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/LibC.java rename to source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/LibC.java index e215ad8ba..efd8251df 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/unix/LibC.java @@ -1,14 +1,13 @@ -package com.microsoft.tfs.jni.internal.console.unix; +package com.microsoft.tfs.jni.internal.unix; -import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import com.sun.jna.platform.linux.XAttr; +import com.sun.jna.ptr.PointerByReference; -public interface LibC extends Library { - - LibC INSTANCE = (LibC) Native.loadLibrary("c", LibC.class); - +public interface LibC extends com.sun.jna.platform.unix.LibC { int O_RDONLY = 0; long TIOCGWINSZ = Platform.isLinux() ? 0x5413L : 0x40087468L; int STDIN_FILENO = 0; @@ -16,12 +15,12 @@ public interface LibC extends Library { 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); + + int chdir(String path); } diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/linux/LibC.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/linux/LibC.java new file mode 100644 index 000000000..a2768410e --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/linux/LibC.java @@ -0,0 +1,11 @@ +package com.microsoft.tfs.jni.internal.unix.linux; + +import com.sun.jna.Native; +import com.sun.jna.platform.linux.XAttr; +import com.sun.jna.ptr.PointerByReference; + +public interface LibC extends com.microsoft.tfs.jni.internal.unix.LibC { + LibC INSTANCE = Native.load("c", LibC.class); + + int getpwnam_r(String name, passwd pwd, byte[] buf, XAttr.size_t buflen, PointerByReference result); +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/linux/passwd.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/linux/passwd.java new file mode 100644 index 000000000..ef0bcaac2 --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/linux/passwd.java @@ -0,0 +1,35 @@ +package com.microsoft.tfs.jni.internal.unix.linux; + +import com.sun.jna.Pointer; +import com.sun.jna.Structure; + +import java.util.Arrays; +import java.util.List; + +public class passwd extends Structure { + public passwd() {} + + public passwd(Pointer p) { + super(p); + read(); + } + + public String pw_name; /* username */ + public String pw_passwd; /* user password */ + public int pw_uid; /* user ID */ + public int pw_gid; /* group ID */ + public String pw_gecos; /* user information */ + public String pw_dir; /* home directory */ + public String pw_shell; /* shell program */ + + @Override protected List getFieldOrder() { + return Arrays.asList( + "pw_name", + "pw_passwd", + "pw_uid", + "pw_gid", + "pw_gecos", + "pw_dir", + "pw_shell"); + } +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/CoreServices.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/CoreServices.java new file mode 100644 index 000000000..00e68d211 --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/CoreServices.java @@ -0,0 +1,13 @@ +package com.microsoft.tfs.jni.internal.unix.macos; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.ptr.IntByReference; + +public interface CoreServices extends Library { + CoreServices INSTANCE = Native.load("CoreServices", CoreServices.class); + + int gestaltSystemVersion = 0x73797376; // 'sysv' + + short Gestalt(int selector, IntByReference response); +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/LibC.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/LibC.java new file mode 100644 index 000000000..e7144b1b3 --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/LibC.java @@ -0,0 +1,11 @@ +package com.microsoft.tfs.jni.internal.unix.macos; + +import com.sun.jna.Native; +import com.sun.jna.platform.linux.XAttr; +import com.sun.jna.ptr.PointerByReference; + +public interface LibC extends com.microsoft.tfs.jni.internal.unix.LibC { + LibC INSTANCE = Native.load("c", LibC.class); + + int getpwnam_r(String name, passwd pwd, byte[] buf, XAttr.size_t buflen, PointerByReference result); +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/SCDynamicStoreRef.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/SCDynamicStoreRef.java new file mode 100644 index 000000000..519aac348 --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/SCDynamicStoreRef.java @@ -0,0 +1,8 @@ +package com.microsoft.tfs.jni.internal.unix.macos; + +import com.sun.jna.platform.mac.CoreFoundation; + +public class SCDynamicStoreRef extends CoreFoundation.CFTypeRef { + public SCDynamicStoreRef() { + } +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/SCPreferencesRef.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/SCPreferencesRef.java new file mode 100644 index 000000000..f82fea912 --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/SCPreferencesRef.java @@ -0,0 +1,8 @@ +package com.microsoft.tfs.jni.internal.unix.macos; + +import com.sun.jna.platform.mac.CoreFoundation; + +public class SCPreferencesRef extends CoreFoundation.CFTypeRef { + public SCPreferencesRef() { + } +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/SystemConfiguration.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/SystemConfiguration.java new file mode 100644 index 000000000..8beaabb31 --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/SystemConfiguration.java @@ -0,0 +1,17 @@ +package com.microsoft.tfs.jni.internal.unix.macos; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.platform.mac.CoreFoundation; + +public interface SystemConfiguration extends Library { + SystemConfiguration INSTANCE = Native.load("SystemConfiguration", SystemConfiguration.class); + + SCPreferencesRef SCPreferencesCreate( + CoreFoundation.CFAllocatorRef allocator, + CoreFoundation.CFStringRef name, + CoreFoundation.CFStringRef prefsID); + + CoreFoundation.CFStringRef SCPreferencesGetHostName(SCPreferencesRef preferences); + CoreFoundation.CFStringRef SCDynamicStoreCopyLocalHostName(SCDynamicStoreRef store); +} diff --git a/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/passwd.java b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/passwd.java new file mode 100644 index 000000000..154d3d600 --- /dev/null +++ b/source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/macos/passwd.java @@ -0,0 +1,43 @@ +package com.microsoft.tfs.jni.internal.unix.macos; + +import com.sun.jna.Pointer; +import com.sun.jna.Structure; + +import java.util.Arrays; +import java.util.List; + +public class passwd extends Structure { + public passwd() {} + + public passwd(Pointer p) { + super(p); + read(); + } + + public String pw_name; /* user name */ + public String pw_passwd; /* encrypted password */ + public int pw_uid; /* user uid */ + public int pw_gid; /* user gid */ + public long pw_change; /* password change time */ + public String pw_class; /* user access class */ + public String pw_gecos; /* Honeywell login info */ + public String pw_dir; /* home directory */ + public String pw_shell; /* default shell */ + public long pw_expire; /* account expiration */ + public int pw_fields; /* internal: fields filled in */ + + @Override protected List getFieldOrder() { + return Arrays.asList( + "pw_name", + "pw_passwd", + "pw_uid", + "pw_gid", + "pw_change", + "pw_class", + "pw_gecos", + "pw_dir", + "pw_shell", + "pw_expire", + "pw_fields"); + } +} 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/unix/termios.java similarity index 93% rename from source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/termios.java rename to source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/termios.java index 8ec37d316..487e87f0a 100644 --- 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/unix/termios.java @@ -1,4 +1,4 @@ -package com.microsoft.tfs.jni.internal.console.unix; +package com.microsoft.tfs.jni.internal.unix; import com.sun.jna.Structure; 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/unix/winsize.java similarity index 87% rename from source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/console/unix/winsize.java rename to source/com.microsoft.tfs.jni/src/com/microsoft/tfs/jni/internal/unix/winsize.java index 660270b81..47c1b5f52 100644 --- 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/unix/winsize.java @@ -1,4 +1,4 @@ -package com.microsoft.tfs.jni.internal.console.unix; +package com.microsoft.tfs.jni.internal.unix; import com.sun.jna.Structure;