diff options
author | 2024-05-20 21:21:37 +0000 | |
---|---|---|
committer | 2024-05-20 21:21:37 +0000 | |
commit | f3c1075aa4f7963e5f4f8f168097a20dc18c9168 (patch) | |
tree | 1d841318f08725b16106d013c3224d6d70548173 /ravenwood | |
parent | 5b1f7008ab8d985b7292eecb7a1e47e2c10031fb (diff) |
Revert "[Ravenwood] Internal clean up, more PFD APIs, OsConstant..."
Revert submission 27402077-2024-05-17-PFD
Reason for revert: Broke tests
Reverted changes: /q/submissionid:27402077-2024-05-17-PFD
Change-Id: If2b50329dbcaccb5f13f7631f1fa4df532bfcc60
Diffstat (limited to 'ravenwood')
24 files changed, 234 insertions, 3287 deletions
diff --git a/ravenwood/Android.bp b/ravenwood/Android.bp index 055a05c5e772..95cbb6b2130a 100644 --- a/ravenwood/Android.bp +++ b/ravenwood/Android.bp @@ -56,24 +56,11 @@ java_library { visibility: ["//visibility:public"], } -java_library { - name: "ravenwood-runtime-common", - host_supported: true, - sdk_version: "core_current", - srcs: [ - "runtime-common-src/**/*.java", - ], - visibility: ["//visibility:private"], -} - java_library_host { name: "ravenwood-helper-libcore-runtime.host", srcs: [ "runtime-helper-src/libcore-fake/**/*.java", ], - static_libs: [ - "ravenwood-runtime-common", - ], visibility: ["//visibility:private"], } @@ -90,9 +77,6 @@ java_library { srcs: [ "runtime-helper-src/framework/**/*.java", ], - static_libs: [ - "ravenwood-runtime-common", - ], libs: [ "framework-minus-apex.ravenwood", "ravenwood-junit", @@ -121,7 +105,6 @@ java_library { ], static_libs: [ "androidx.test.monitor-for-device", - "ravenwood-runtime-common", ], libs: [ "android.test.mock", @@ -162,9 +145,6 @@ java_library { "junit-flag-src/**/*.java", ], sdk_version: "test_current", - static_libs: [ - "ravenwood-runtime-common", - ], libs: [ "junit", "flag-junit", @@ -219,7 +199,7 @@ cc_library_shared { ], srcs: [ - "runtime-jni/*.cpp", + "runtime-helper-src/jni/*.cpp", ], shared_libs: [ diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java index 70523d6dd4d2..56a3c64a5750 100644 --- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java +++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java @@ -86,6 +86,10 @@ public class RavenwoodRuleImpl { sPendingUncaughtException.compareAndSet(null, throwable); }; + public static boolean isOnRavenwood() { + return true; + } + public static void init(RavenwoodRule rule) { if (ENABLE_UNCAUGHT_EXCEPTION_DETECTION) { maybeThrowPendingUncaughtException(false); diff --git a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodRule.java b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodRule.java index 68b5aebe9c00..9d12f855c0ea 100644 --- a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodRule.java +++ b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodRule.java @@ -29,8 +29,6 @@ import android.platform.test.annotations.DisabledOnRavenwood; import android.platform.test.annotations.EnabledOnRavenwood; import android.platform.test.annotations.IgnoreUnderRavenwood; -import com.android.ravenwood.common.RavenwoodCommonUtils; - import org.junit.Assume; import org.junit.rules.TestRule; import org.junit.runner.Description; @@ -56,7 +54,7 @@ import java.util.regex.Pattern; * before a test class is fully initialized. */ public class RavenwoodRule implements TestRule { - static final boolean IS_ON_RAVENWOOD = RavenwoodCommonUtils.isOnRavenwood(); + static final boolean IS_ON_RAVENWOOD = RavenwoodRuleImpl.isOnRavenwood(); /** * When probing is enabled, all tests will be unconditionally run on Ravenwood to detect diff --git a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodUtils.java b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodUtils.java index 19c1bffaebcd..99ab32788235 100644 --- a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodUtils.java +++ b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodUtils.java @@ -15,7 +15,9 @@ */ package android.platform.test.ravenwood; -import com.android.ravenwood.common.RavenwoodCommonUtils; +import java.io.File; +import java.io.PrintStream; +import java.util.Arrays; /** * Utilities for writing (bivalent) ravenwood tests. @@ -24,6 +26,15 @@ public class RavenwoodUtils { private RavenwoodUtils() { } + private static final String RAVENWOOD_NATIVE_RUNTIME_NAME = "ravenwood_runtime"; + + // LibcoreRavenwoodUtils calls it with reflections. + public static void loadRavenwoodNativeRuntime() { + if (RavenwoodRule.isOnRavenwood()) { + RavenwoodUtils.loadJniLibrary(RAVENWOOD_NATIVE_RUNTIME_NAME); + } + } + /** * Load a JNI library respecting {@code java.library.path} * (which reflects {@code LD_LIBRARY_PATH}). @@ -45,6 +56,85 @@ public class RavenwoodUtils { * it uses {@code JNI_OnLoad()} as the entry point name on both. */ public static void loadJniLibrary(String libname) { - RavenwoodCommonUtils.loadJniLibrary(libname); + if (RavenwoodRule.isOnRavenwood()) { + loadLibraryOnRavenwood(libname); + } else { + // Just delegate to the loadLibrary(). + System.loadLibrary(libname); + } + } + + private static void loadLibraryOnRavenwood(String libname) { + var path = System.getProperty("java.library.path"); + var filename = "lib" + libname + ".so"; + + System.out.println("Looking for library " + libname + ".so in java.library.path:" + path); + + try { + if (path == null) { + throw new UnsatisfiedLinkError("Cannot load library " + libname + "." + + " Property java.library.path not set!"); + } + for (var dir : path.split(":")) { + var file = new File(dir + "/" + filename); + if (file.exists()) { + System.load(file.getAbsolutePath()); + return; + } + } + throw new UnsatisfiedLinkError("Library " + libname + " not found in " + + "java.library.path: " + path); + } catch (Throwable e) { + dumpFiles(System.out); + throw e; + } + } + + private static void dumpFiles(PrintStream out) { + try { + var path = System.getProperty("java.library.path"); + out.println("# java.library.path=" + path); + + for (var dir : path.split(":")) { + listFiles(out, new File(dir), ""); + + var gparent = new File((new File(dir)).getAbsolutePath() + "../../..") + .getCanonicalFile(); + if (gparent.getName().contains("testcases")) { + // Special case: if we found this directory, dump its contents too. + listFiles(out, gparent, ""); + } + } + + var gparent = new File("../..").getCanonicalFile(); + out.println("# ../..=" + gparent); + listFiles(out, gparent, ""); + } catch (Throwable th) { + out.println("Error: " + th.toString()); + th.printStackTrace(out); + } + } + + private static void listFiles(PrintStream out, File dir, String prefix) { + if (!dir.isDirectory()) { + out.println(prefix + dir.getAbsolutePath() + " is not a directory!"); + return; + } + out.println(prefix + ":" + dir.getAbsolutePath() + "/"); + // First, list the files. + for (var file : Arrays.stream(dir.listFiles()).sorted().toList()) { + out.println(prefix + " " + file.getName() + "" + (file.isDirectory() ? "/" : "")); + } + + // Then recurse. + if (dir.getAbsolutePath().startsWith("/usr") || dir.getAbsolutePath().startsWith("/lib")) { + // There would be too many files, so don't recurse. + return; + } + for (var file : Arrays.stream(dir.listFiles()).sorted().toList()) { + if (file.isDirectory()) { + listFiles(out, file, prefix + " "); + } + } } } diff --git a/ravenwood/junit-stub-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java b/ravenwood/junit-stub-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java index 483b98a96034..773a89a3df4d 100644 --- a/ravenwood/junit-stub-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java +++ b/ravenwood/junit-stub-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java @@ -20,6 +20,10 @@ import org.junit.runner.Description; import org.junit.runners.model.Statement; public class RavenwoodRuleImpl { + public static boolean isOnRavenwood() { + return false; + } + public static void init(RavenwoodRule rule) { // No-op when running on a real device } diff --git a/ravenwood/runtime-common-src/com/android/ravenwood/common/JvmWorkaround.java b/ravenwood/runtime-common-src/com/android/ravenwood/common/JvmWorkaround.java deleted file mode 100644 index ee280991216a..000000000000 --- a/ravenwood/runtime-common-src/com/android/ravenwood/common/JvmWorkaround.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.ravenwood.common; - -import java.io.FileDescriptor; - -/** - * Collection of methods to workaround limitation in the hostside JVM. - */ -public abstract class JvmWorkaround { - JvmWorkaround() { - } - - // We only support OpenJDK for now. - private static JvmWorkaround sInstance = - RavenwoodCommonUtils.isOnRavenwood() ? new OpenJdkWorkaround() : new NullWorkaround(); - - public static JvmWorkaround getInstance() { - return sInstance; - } - - /** - * Equivalent to Android's FileDescriptor.setInt$(). - */ - public abstract void setFdInt(FileDescriptor fd, int fdInt); - - - /** - * Equivalent to Android's FileDescriptor.getInt$(). - */ - public abstract int getFdInt(FileDescriptor fd); - - /** - * Placeholder implementation for the host side. - * - * Even on the host side, we don't want to throw just because the class is loaded, - * which could cause weird random issues, so we throw from individual methods rather - * than from the constructor. - */ - private static class NullWorkaround extends JvmWorkaround { - private RuntimeException calledOnHostside() { - throw new RuntimeException("This method shouldn't be called on the host side"); - } - - @Override - public void setFdInt(FileDescriptor fd, int fdInt) { - throw calledOnHostside(); - } - - @Override - public int getFdInt(FileDescriptor fd) { - throw calledOnHostside(); - } - } -} diff --git a/ravenwood/runtime-common-src/com/android/ravenwood/common/OpenJdkWorkaround.java b/ravenwood/runtime-common-src/com/android/ravenwood/common/OpenJdkWorkaround.java deleted file mode 100644 index 9aedaab5b911..000000000000 --- a/ravenwood/runtime-common-src/com/android/ravenwood/common/OpenJdkWorkaround.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.ravenwood.common; - -import java.io.FileDescriptor; - -class OpenJdkWorkaround extends JvmWorkaround { - @Override - public void setFdInt(FileDescriptor fd, int fdInt) { - try { - final Object obj = Class.forName("jdk.internal.access.SharedSecrets").getMethod( - "getJavaIOFileDescriptorAccess").invoke(null); - Class.forName("jdk.internal.access.JavaIOFileDescriptorAccess").getMethod( - "set", FileDescriptor.class, int.class).invoke(obj, fd, fdInt); - } catch (ReflectiveOperationException e) { - throw new RuntimeException("Failed to interact with raw FileDescriptor internals;" - + " perhaps JRE has changed?", e); - } - } - - @Override - public int getFdInt(FileDescriptor fd) { - try { - final Object obj = Class.forName("jdk.internal.access.SharedSecrets").getMethod( - "getJavaIOFileDescriptorAccess").invoke(null); - return (int) Class.forName("jdk.internal.access.JavaIOFileDescriptorAccess").getMethod( - "get", FileDescriptor.class).invoke(obj, fd); - } catch (ReflectiveOperationException e) { - throw new RuntimeException("Failed to interact with raw FileDescriptor internals;" - + " perhaps JRE has changed?", e); - } - } -} diff --git a/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodCommonUtils.java b/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodCommonUtils.java deleted file mode 100644 index a94cab2582ca..000000000000 --- a/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodCommonUtils.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.ravenwood.common; - -import java.io.File; -import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.PrintStream; -import java.util.Arrays; - -public class RavenwoodCommonUtils { - private RavenwoodCommonUtils() { - } - - private static final Object sLock = new Object(); - - /** Name of `libravenwood_runtime` */ - private static final String RAVENWOOD_NATIVE_RUNTIME_NAME = "ravenwood_runtime"; - - /** Directory name of `out/host/linux-x86/testcases/ravenwood-runtime` */ - private static final String RAVENWOOD_RUNTIME_DIR_NAME = "ravenwood-runtime"; - - private static boolean sEnableExtraRuntimeCheck = - "1".equals(System.getenv("RAVENWOOD_ENABLE_EXTRA_RUNTIME_CHECK")); - - private static final boolean IS_ON_RAVENWOOD = isOnRavenwoodInternal(); - - private static final String RAVEWOOD_RUNTIME_PATH = getRavenwoodRuntimePathInternal(); - - /** - * @return if we're running on Ravenwood. - */ - public static boolean isOnRavenwood() { - return IS_ON_RAVENWOOD; - } - - private static boolean isOnRavenwoodInternal() { - // Call RavenwoodEnvironment.getInstance().isRunningOnRavenwood(), - // but here we can't use Android APIs directly, so use reflections. - try { - var clazz = Class.forName("com.android.internal.ravenwood.RavenwoodEnvironment"); - var getInstance = clazz.getMethod("getInstance"); - var isRunningOnRavenwood = clazz.getMethod("isRunningOnRavenwood"); - - var instance = getInstance.invoke(null); - return (boolean) isRunningOnRavenwood.invoke(instance); - - } catch (Exception e) { - throw new RuntimeException("Can't access RavenwoodEnvironment", e); - } - } - - /** - * Throws if the runtime is not Ravenwood. - */ - public static void ensureOnRavenwood() { - if (!isOnRavenwood()) { - throw new RavenwoodRuntimeException("This is only supposed to be used on Ravenwood"); - } - } - - /** - * @return if the various extra runtime check should be enabled. - */ - public static boolean shouldEnableExtraRuntimeCheck() { - return sEnableExtraRuntimeCheck; - } - - /** - * Load the main runtime JNI library. - */ - public static void loadRavenwoodNativeRuntime() { - ensureOnRavenwood(); - loadJniLibrary(RAVENWOOD_NATIVE_RUNTIME_NAME); - } - - /** - * Internal implementation of - * {@link android.platform.test.ravenwood.RavenwoodUtils#loadJniLibrary(String)} - */ - public static void loadJniLibrary(String libname) { - if (RavenwoodCommonUtils.isOnRavenwood()) { - loadJniLibraryInternal(libname); - } else { - System.loadLibrary(libname); - } - } - - /** - * Function equivalent to ART's System.loadLibrary. See RavenwoodUtils for why we need it. - */ - private static void loadJniLibraryInternal(String libname) { - var path = System.getProperty("java.library.path"); - var filename = "lib" + libname + ".so"; - - System.out.println("Looking for library " + libname + ".so in java.library.path:" + path); - - try { - if (path == null) { - throw new UnsatisfiedLinkError("Cannot load library " + libname + "." - + " Property java.library.path not set!"); - } - for (var dir : path.split(":")) { - var file = new File(dir + "/" + filename); - if (file.exists()) { - System.load(file.getAbsolutePath()); - return; - } - } - throw new UnsatisfiedLinkError("Library " + libname + " not found in " - + "java.library.path: " + path); - } catch (Throwable e) { - dumpFiles(System.out); - throw e; - } - } - - private static void dumpFiles(PrintStream out) { - try { - var path = System.getProperty("java.library.path"); - out.println("# java.library.path=" + path); - - for (var dir : path.split(":")) { - listFiles(out, new File(dir), ""); - - var gparent = new File((new File(dir)).getAbsolutePath() + "../../..") - .getCanonicalFile(); - if (gparent.getName().contains("testcases")) { - // Special case: if we found this directory, dump its contents too. - listFiles(out, gparent, ""); - } - } - - var gparent = new File("../..").getCanonicalFile(); - out.println("# ../..=" + gparent); - listFiles(out, gparent, ""); - } catch (Throwable th) { - out.println("Error: " + th.toString()); - th.printStackTrace(out); - } - } - - private static void listFiles(PrintStream out, File dir, String prefix) { - if (!dir.isDirectory()) { - out.println(prefix + dir.getAbsolutePath() + " is not a directory!"); - return; - } - out.println(prefix + ":" + dir.getAbsolutePath() + "/"); - // First, list the files. - for (var file : Arrays.stream(dir.listFiles()).sorted().toList()) { - out.println(prefix + " " + file.getName() + "" + (file.isDirectory() ? "/" : "")); - } - - // Then recurse. - if (dir.getAbsolutePath().startsWith("/usr") || dir.getAbsolutePath().startsWith("/lib")) { - // There would be too many files, so don't recurse. - return; - } - for (var file : Arrays.stream(dir.listFiles()).sorted().toList()) { - if (file.isDirectory()) { - listFiles(out, file, prefix + " "); - } - } - } - - /** - * @return the full directory path that contains the "ravenwood-runtime" files. - * - * This method throws if called on the device side. - */ - public static String getRavenwoodRuntimePath() { - ensureOnRavenwood(); - return RAVEWOOD_RUNTIME_PATH; - } - - private static String getRavenwoodRuntimePathInternal() { - if (!isOnRavenwood()) { - return null; - } - var path = System.getProperty("java.library.path"); - - System.out.println("Looking for " + RAVENWOOD_RUNTIME_DIR_NAME + " directory" - + " in java.library.path:" + path); - - try { - if (path == null) { - throw new IllegalStateException("java.library.path shouldn't be null"); - } - for (var dir : path.split(":")) { - - // For each path, see if the path contains RAVENWOOD_RUNTIME_DIR_NAME. - var d = new File(dir); - for (;;) { - if (d.getParent() == null) { - break; // Root dir, stop. - } - if (RAVENWOOD_RUNTIME_DIR_NAME.equals(d.getName())) { - var ret = d.getAbsolutePath() + "/"; - System.out.println("Found: " + ret); - return ret; - } - d = d.getParentFile(); - } - } - throw new IllegalStateException(RAVENWOOD_RUNTIME_DIR_NAME + " not found"); - } catch (Throwable e) { - dumpFiles(System.out); - throw e; - } - } - - /** Close an {@link AutoCloseable}. */ - public static void closeQuietly(AutoCloseable c) { - if (c != null) { - try { - c.close(); - } catch (Exception e) { - // Ignore - } - } - } - - /** Close a {@link FileDescriptor}. */ - public static void closeQuietly(FileDescriptor fd) { - var is = new FileInputStream(fd); - RavenwoodCommonUtils.closeQuietly(is); - } -} diff --git a/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodRuntimeException.java b/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodRuntimeException.java deleted file mode 100644 index 7b0cebcecc1a..000000000000 --- a/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodRuntimeException.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.ravenwood.common; - -public class RavenwoodRuntimeException extends RuntimeException { - public RavenwoodRuntimeException(String message) { - super(message); - } - - public RavenwoodRuntimeException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodRuntimeNative.java b/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodRuntimeNative.java deleted file mode 100644 index 65402219ebee..000000000000 --- a/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodRuntimeNative.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.ravenwood.common; - -import java.io.FileDescriptor; - -/** - * Class to host all the JNI methods used in ravenwood runtime. - */ -public class RavenwoodRuntimeNative { - private RavenwoodRuntimeNative() { - } - - static { - RavenwoodCommonUtils.ensureOnRavenwood(); - RavenwoodCommonUtils.loadRavenwoodNativeRuntime(); - } - - public static native void applyFreeFunction(long freeFunction, long nativePtr); - - public static native long nLseek(int fd, long offset, int whence); - - public static native int[] nPipe2(int flags); - - public static native int nDup(int oldfd); - - public static native int nFcntlInt(int fd, int cmd, int arg); - - public static long lseek(FileDescriptor fd, long offset, int whence) { - return nLseek(JvmWorkaround.getInstance().getFdInt(fd), offset, whence); - } - - public static FileDescriptor[] pipe2(int flags) { - var fds = nPipe2(flags); - var ret = new FileDescriptor[] { - new FileDescriptor(), - new FileDescriptor(), - }; - JvmWorkaround.getInstance().setFdInt(ret[0], fds[0]); - JvmWorkaround.getInstance().setFdInt(ret[1], fds[1]); - - return ret; - } - - public static FileDescriptor dup(FileDescriptor fd) { - var fdInt = nDup(JvmWorkaround.getInstance().getFdInt(fd)); - - var retFd = new java.io.FileDescriptor(); - JvmWorkaround.getInstance().setFdInt(retFd, fdInt); - return retFd; - } - - public static int fcntlInt(FileDescriptor fd, int cmd, int arg) { - var fdInt = JvmWorkaround.getInstance().getFdInt(fd); - - return nFcntlInt(fdInt, cmd, arg); - } -} diff --git a/ravenwood/runtime-helper-src/framework/com/android/platform/test/ravenwood/nativesubstitution/ParcelFileDescriptor_host.java b/ravenwood/runtime-helper-src/framework/com/android/platform/test/ravenwood/nativesubstitution/ParcelFileDescriptor_host.java index 8fe6853abb45..2d799142df70 100644 --- a/ravenwood/runtime-helper-src/framework/com/android/platform/test/ravenwood/nativesubstitution/ParcelFileDescriptor_host.java +++ b/ravenwood/runtime-helper-src/framework/com/android/platform/test/ravenwood/nativesubstitution/ParcelFileDescriptor_host.java @@ -26,7 +26,6 @@ import static android.os.ParcelFileDescriptor.MODE_WORLD_WRITEABLE; import static android.os.ParcelFileDescriptor.MODE_WRITE_ONLY; import com.android.internal.annotations.GuardedBy; -import com.android.ravenwood.common.JvmWorkaround; import java.io.File; import java.io.FileDescriptor; @@ -47,11 +46,27 @@ public class ParcelFileDescriptor_host { private static final Map<FileDescriptor, RandomAccessFile> sActive = new HashMap<>(); public static void native_setFdInt$ravenwood(FileDescriptor fd, int fdInt) { - JvmWorkaround.getInstance().setFdInt(fd, fdInt); + try { + final Object obj = Class.forName("jdk.internal.access.SharedSecrets").getMethod( + "getJavaIOFileDescriptorAccess").invoke(null); + Class.forName("jdk.internal.access.JavaIOFileDescriptorAccess").getMethod( + "set", FileDescriptor.class, int.class).invoke(obj, fd, fdInt); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to interact with raw FileDescriptor internals;" + + " perhaps JRE has changed?", e); + } } public static int native_getFdInt$ravenwood(FileDescriptor fd) { - return JvmWorkaround.getInstance().getFdInt(fd); + try { + final Object obj = Class.forName("jdk.internal.access.SharedSecrets").getMethod( + "getJavaIOFileDescriptorAccess").invoke(null); + return (int) Class.forName("jdk.internal.access.JavaIOFileDescriptorAccess").getMethod( + "get", FileDescriptor.class).invoke(obj, fd); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to interact with raw FileDescriptor internals;" + + " perhaps JRE has changed?", e); + } } public static FileDescriptor native_open$ravenwood(File file, int pfdMode) throws IOException { diff --git a/ravenwood/runtime-helper-src/framework/com/android/platform/test/ravenwood/nativesubstitution/RavenwoodEnvironment_host.java b/ravenwood/runtime-helper-src/framework/com/android/platform/test/ravenwood/nativesubstitution/RavenwoodEnvironment_host.java deleted file mode 100644 index 1173ca4052c1..000000000000 --- a/ravenwood/runtime-helper-src/framework/com/android/platform/test/ravenwood/nativesubstitution/RavenwoodEnvironment_host.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.platform.test.ravenwood.nativesubstitution; - -import com.android.internal.ravenwood.RavenwoodEnvironment; - -/** - * Class used by {@link RavenwoodEnvironment} to talk to the ravenwood runtime. - * - * (So far, it's empty.) - */ -public class RavenwoodEnvironment_host { - private RavenwoodEnvironment_host() { - } -} diff --git a/ravenwood/runtime-helper-src/framework/com/android/platform/test/ravenwood/runtimehelper/ClassLoadHook.java b/ravenwood/runtime-helper-src/framework/com/android/platform/test/ravenwood/runtimehelper/ClassLoadHook.java index e198646d4e27..69ff262fe915 100644 --- a/ravenwood/runtime-helper-src/framework/com/android/platform/test/ravenwood/runtimehelper/ClassLoadHook.java +++ b/ravenwood/runtime-helper-src/framework/com/android/platform/test/ravenwood/runtimehelper/ClassLoadHook.java @@ -15,7 +15,7 @@ */ package com.android.platform.test.ravenwood.runtimehelper; -import com.android.ravenwood.common.RavenwoodCommonUtils; +import android.platform.test.ravenwood.RavenwoodUtils; import java.io.File; import java.lang.reflect.Modifier; @@ -141,7 +141,7 @@ public class ClassLoadHook { log("Loading " + LIBANDROID_RUNTIME_NAME + " for '" + libanrdoidClasses + "' and '" + libhwuiClasses + "'"); - RavenwoodCommonUtils.loadJniLibrary(LIBANDROID_RUNTIME_NAME); + RavenwoodUtils.loadJniLibrary(LIBANDROID_RUNTIME_NAME); } /** diff --git a/ravenwood/runtime-helper-src/jni/ravenwood_runtime.cpp b/ravenwood/runtime-helper-src/jni/ravenwood_runtime.cpp new file mode 100644 index 000000000000..8e3a21dd6d87 --- /dev/null +++ b/ravenwood/runtime-helper-src/jni/ravenwood_runtime.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <nativehelper/JNIHelp.h> +#include "jni.h" +#include "utils/Log.h" +#include "utils/misc.h" + + +typedef void (*FreeFunction)(void*); + +static void NativeAllocationRegistry_applyFreeFunction(JNIEnv*, + jclass, + jlong freeFunction, + jlong ptr) { + void* nativePtr = reinterpret_cast<void*>(static_cast<uintptr_t>(ptr)); + FreeFunction nativeFreeFunction + = reinterpret_cast<FreeFunction>(static_cast<uintptr_t>(freeFunction)); + nativeFreeFunction(nativePtr); +} + +static const JNINativeMethod sMethods_NAR[] = +{ + { "applyFreeFunction", "(JJ)V", (void*)NativeAllocationRegistry_applyFreeFunction }, +}; + +extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) +{ + JNIEnv* env = NULL; + jint result = -1; + + if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { + ALOGE("GetEnv failed!"); + return result; + } + ALOG_ASSERT(env, "Could not retrieve the env!"); + + ALOGI("%s: JNI_OnLoad", __FILE__); + + // Initialize the Ravenwood version of NativeAllocationRegistry. + // We don't use this JNI on the device side, but if we ever have to do, skip this part. +#ifndef __ANDROID__ + int res = jniRegisterNativeMethods(env, "libcore/util/NativeAllocationRegistry", + sMethods_NAR, NELEM(sMethods_NAR)); + if (res < 0) { + return res; + } +#endif + + return JNI_VERSION_1_4; +} diff --git a/ravenwood/runtime-helper-src/libcore-fake/android/system/ErrnoException.java b/ravenwood/runtime-helper-src/libcore-fake/android/system/ErrnoException.java index 843455d060c9..388156aa3694 100644 --- a/ravenwood/runtime-helper-src/libcore-fake/android/system/ErrnoException.java +++ b/ravenwood/runtime-helper-src/libcore-fake/android/system/ErrnoException.java @@ -14,8 +14,6 @@ * limitations under the License. */ -// [ravenwood] Copied from libcore. - package android.system; import java.io.IOException; diff --git a/ravenwood/runtime-helper-src/libcore-fake/android/system/Os.java b/ravenwood/runtime-helper-src/libcore-fake/android/system/Os.java deleted file mode 100644 index e031eb27513b..000000000000 --- a/ravenwood/runtime-helper-src/libcore-fake/android/system/Os.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package android.system; - -import com.android.ravenwood.common.RavenwoodRuntimeNative; - -import java.io.FileDescriptor; - -/** - * OS class replacement used on Ravenwood. For now, we just implement APIs as we need them... - * TODO(b/340887115): Need a better integration with libcore. - */ -public final class Os { - private Os() {} - - public static long lseek(FileDescriptor fd, long offset, int whence) throws ErrnoException { - return RavenwoodRuntimeNative.lseek(fd, offset, whence); - } - - - public static FileDescriptor[] pipe2(int flags) throws ErrnoException { - return RavenwoodRuntimeNative.pipe2(flags); - } - - public static FileDescriptor dup(FileDescriptor fd) throws ErrnoException { - return RavenwoodRuntimeNative.dup(fd); - } - - public static int fcntlInt(FileDescriptor fd, int cmd, int arg) throws ErrnoException { - return RavenwoodRuntimeNative.fcntlInt(fd, cmd, arg); - } -} diff --git a/ravenwood/runtime-helper-src/libcore-fake/android/system/OsConstants.java b/ravenwood/runtime-helper-src/libcore-fake/android/system/OsConstants.java deleted file mode 100644 index c56ec8a60f00..000000000000 --- a/ravenwood/runtime-helper-src/libcore-fake/android/system/OsConstants.java +++ /dev/null @@ -1,1259 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package android.system; - -import com.android.ravenwood.common.RavenwoodCommonUtils; - -/** - * Copied from libcore's version, with the local changes: - * - All the imports are removed. (they're only used in javadoc) - * - All the annotations are removed. - * - The initConstants() method is moved to a nested class. - * - * TODO(b/340887115): Need a better integration with libcore. - */ - -public class OsConstants { -// @UnsupportedAppUsage - private OsConstants() { - } - - /** - * Returns the index of the element in the {@link StructCapUserData} (cap_user_data) - * array that this capability is stored in. - * - * @param x capability - * @return index of the element in the {@link StructCapUserData} array storing this capability - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static int CAP_TO_INDEX(int x) { return x >>> 5; } - - /** - * Returns the mask for the given capability. This is relative to the capability's - * {@link StructCapUserData} (cap_user_data) element, the index of which can be - * retrieved with {@link CAP_TO_INDEX}. - * - * @param x capability - * @return mask for given capability - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static int CAP_TO_MASK(int x) { return 1 << (x & 31); } - - /** - * Tests whether the given mode is a block device. - */ - public static boolean S_ISBLK(int mode) { return (mode & S_IFMT) == S_IFBLK; } - - /** - * Tests whether the given mode is a character device. - */ - public static boolean S_ISCHR(int mode) { return (mode & S_IFMT) == S_IFCHR; } - - /** - * Tests whether the given mode is a directory. - */ - public static boolean S_ISDIR(int mode) { return (mode & S_IFMT) == S_IFDIR; } - - /** - * Tests whether the given mode is a FIFO. - */ - public static boolean S_ISFIFO(int mode) { return (mode & S_IFMT) == S_IFIFO; } - - /** - * Tests whether the given mode is a regular file. - */ - public static boolean S_ISREG(int mode) { return (mode & S_IFMT) == S_IFREG; } - - /** - * Tests whether the given mode is a symbolic link. - */ - public static boolean S_ISLNK(int mode) { return (mode & S_IFMT) == S_IFLNK; } - - /** - * Tests whether the given mode is a socket. - */ - public static boolean S_ISSOCK(int mode) { return (mode & S_IFMT) == S_IFSOCK; } - - /** - * Extracts the exit status of a child. Only valid if WIFEXITED returns true. - */ - public static int WEXITSTATUS(int status) { return (status & 0xff00) >> 8; } - - /** - * Tests whether the child dumped core. Only valid if WIFSIGNALED returns true. - */ - public static boolean WCOREDUMP(int status) { return (status & 0x80) != 0; } - - /** - * Returns the signal that caused the child to exit. Only valid if WIFSIGNALED returns true. - */ - public static int WTERMSIG(int status) { return status & 0x7f; } - - /** - * Returns the signal that cause the child to stop. Only valid if WIFSTOPPED returns true. - */ - public static int WSTOPSIG(int status) { return WEXITSTATUS(status); } - - /** - * Tests whether the child exited normally. - */ - public static boolean WIFEXITED(int status) { return (WTERMSIG(status) == 0); } - - /** - * Tests whether the child was stopped (not terminated) by a signal. - */ - public static boolean WIFSTOPPED(int status) { return (WTERMSIG(status) == 0x7f); } - - /** - * Tests whether the child was terminated by a signal. - */ - public static boolean WIFSIGNALED(int status) { return (WTERMSIG(status + 1) >= 2); } - - public static final int AF_INET = placeholder(); - public static final int AF_INET6 = placeholder(); - public static final int AF_NETLINK = placeholder(); - public static final int AF_PACKET = placeholder(); - public static final int AF_UNIX = placeholder(); - - /** - * The virt-vsock address family, linux specific. - * It is used with {@code struct sockaddr_vm} from uapi/linux/vm_sockets.h. - * - * @see <a href="https://man7.org/linux/man-pages/man7/vsock.7.html">vsock(7)</a> - * @see VmSocketAddress - */ - public static final int AF_VSOCK = placeholder(); - public static final int AF_UNSPEC = placeholder(); - public static final int AI_ADDRCONFIG = placeholder(); - public static final int AI_ALL = placeholder(); - public static final int AI_CANONNAME = placeholder(); - public static final int AI_NUMERICHOST = placeholder(); - public static final int AI_NUMERICSERV = placeholder(); - public static final int AI_PASSIVE = placeholder(); - public static final int AI_V4MAPPED = placeholder(); - public static final int ARPHRD_ETHER = placeholder(); - - /** - * The virtio-vsock {@code svmPort} value to bind for any available port. - * - * @see <a href="https://man7.org/linux/man-pages/man7/vsock.7.html">vsock(7)</a> - * @see VmSocketAddress - */ - public static final int VMADDR_PORT_ANY = placeholder(); - - /** - * The virtio-vsock {@code svmCid} value to listens for all CIDs. - * - * @see <a href="https://man7.org/linux/man-pages/man7/vsock.7.html">vsock(7)</a> - * @see VmSocketAddress - */ - public static final int VMADDR_CID_ANY = placeholder(); - - /** - * The virtio-vsock {@code svmCid} value for host communication. - * - * @see <a href="https://man7.org/linux/man-pages/man7/vsock.7.html">vsock(7)</a> - * @see VmSocketAddress - */ - public static final int VMADDR_CID_LOCAL = placeholder(); - - /** - * The virtio-vsock {@code svmCid} value for loopback communication. - * - * @see <a href="https://man7.org/linux/man-pages/man7/vsock.7.html">vsock(7)</a> - * @see VmSocketAddress - */ - public static final int VMADDR_CID_HOST = placeholder(); - - /** - * ARP protocol loopback device identifier. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int ARPHRD_LOOPBACK = placeholder(); - public static final int CAP_AUDIT_CONTROL = placeholder(); - public static final int CAP_AUDIT_WRITE = placeholder(); - public static final int CAP_BLOCK_SUSPEND = placeholder(); - public static final int CAP_CHOWN = placeholder(); - public static final int CAP_DAC_OVERRIDE = placeholder(); - public static final int CAP_DAC_READ_SEARCH = placeholder(); - public static final int CAP_FOWNER = placeholder(); - public static final int CAP_FSETID = placeholder(); - public static final int CAP_IPC_LOCK = placeholder(); - public static final int CAP_IPC_OWNER = placeholder(); - public static final int CAP_KILL = placeholder(); - public static final int CAP_LAST_CAP = placeholder(); - public static final int CAP_LEASE = placeholder(); - public static final int CAP_LINUX_IMMUTABLE = placeholder(); - public static final int CAP_MAC_ADMIN = placeholder(); - public static final int CAP_MAC_OVERRIDE = placeholder(); - public static final int CAP_MKNOD = placeholder(); - public static final int CAP_NET_ADMIN = placeholder(); - public static final int CAP_NET_BIND_SERVICE = placeholder(); - public static final int CAP_NET_BROADCAST = placeholder(); - public static final int CAP_NET_RAW = placeholder(); - public static final int CAP_SETFCAP = placeholder(); - public static final int CAP_SETGID = placeholder(); - public static final int CAP_SETPCAP = placeholder(); - public static final int CAP_SETUID = placeholder(); - public static final int CAP_SYS_ADMIN = placeholder(); - public static final int CAP_SYS_BOOT = placeholder(); - public static final int CAP_SYS_CHROOT = placeholder(); - public static final int CAP_SYSLOG = placeholder(); - public static final int CAP_SYS_MODULE = placeholder(); - public static final int CAP_SYS_NICE = placeholder(); - public static final int CAP_SYS_PACCT = placeholder(); - public static final int CAP_SYS_PTRACE = placeholder(); - public static final int CAP_SYS_RAWIO = placeholder(); - public static final int CAP_SYS_RESOURCE = placeholder(); - public static final int CAP_SYS_TIME = placeholder(); - public static final int CAP_SYS_TTY_CONFIG = placeholder(); - public static final int CAP_WAKE_ALARM = placeholder(); - public static final int E2BIG = placeholder(); - public static final int EACCES = placeholder(); - public static final int EADDRINUSE = placeholder(); - public static final int EADDRNOTAVAIL = placeholder(); - public static final int EAFNOSUPPORT = placeholder(); - public static final int EAGAIN = placeholder(); - public static final int EAI_AGAIN = placeholder(); - public static final int EAI_BADFLAGS = placeholder(); - public static final int EAI_FAIL = placeholder(); - public static final int EAI_FAMILY = placeholder(); - public static final int EAI_MEMORY = placeholder(); - public static final int EAI_NODATA = placeholder(); - public static final int EAI_NONAME = placeholder(); - public static final int EAI_OVERFLOW = placeholder(); - public static final int EAI_SERVICE = placeholder(); - public static final int EAI_SOCKTYPE = placeholder(); - public static final int EAI_SYSTEM = placeholder(); - public static final int EALREADY = placeholder(); - public static final int EBADF = placeholder(); - public static final int EBADMSG = placeholder(); - public static final int EBUSY = placeholder(); - public static final int ECANCELED = placeholder(); - public static final int ECHILD = placeholder(); - public static final int ECONNABORTED = placeholder(); - public static final int ECONNREFUSED = placeholder(); - public static final int ECONNRESET = placeholder(); - public static final int EDEADLK = placeholder(); - public static final int EDESTADDRREQ = placeholder(); - public static final int EDOM = placeholder(); - public static final int EDQUOT = placeholder(); - public static final int EEXIST = placeholder(); - public static final int EFAULT = placeholder(); - public static final int EFBIG = placeholder(); - public static final int EHOSTUNREACH = placeholder(); - public static final int EIDRM = placeholder(); - public static final int EILSEQ = placeholder(); - public static final int EINPROGRESS = placeholder(); - public static final int EINTR = placeholder(); - public static final int EINVAL = placeholder(); - public static final int EIO = placeholder(); - public static final int EISCONN = placeholder(); - public static final int EISDIR = placeholder(); - public static final int ELOOP = placeholder(); - public static final int EMFILE = placeholder(); - public static final int EMLINK = placeholder(); - public static final int EMSGSIZE = placeholder(); - public static final int EMULTIHOP = placeholder(); - public static final int ENAMETOOLONG = placeholder(); - public static final int ENETDOWN = placeholder(); - public static final int ENETRESET = placeholder(); - public static final int ENETUNREACH = placeholder(); - public static final int ENFILE = placeholder(); - public static final int ENOBUFS = placeholder(); - public static final int ENODATA = placeholder(); - public static final int ENODEV = placeholder(); - public static final int ENOENT = placeholder(); - public static final int ENOEXEC = placeholder(); - public static final int ENOLCK = placeholder(); - public static final int ENOLINK = placeholder(); - public static final int ENOMEM = placeholder(); - public static final int ENOMSG = placeholder(); - public static final int ENONET = placeholder(); - public static final int ENOPROTOOPT = placeholder(); - public static final int ENOSPC = placeholder(); - public static final int ENOSR = placeholder(); - public static final int ENOSTR = placeholder(); - public static final int ENOSYS = placeholder(); - public static final int ENOTCONN = placeholder(); - public static final int ENOTDIR = placeholder(); - public static final int ENOTEMPTY = placeholder(); - public static final int ENOTSOCK = placeholder(); - public static final int ENOTSUP = placeholder(); - public static final int ENOTTY = placeholder(); - public static final int ENXIO = placeholder(); - public static final int EOPNOTSUPP = placeholder(); - public static final int EOVERFLOW = placeholder(); - public static final int EPERM = placeholder(); - public static final int EPIPE = placeholder(); - public static final int EPROTO = placeholder(); - public static final int EPROTONOSUPPORT = placeholder(); - public static final int EPROTOTYPE = placeholder(); - public static final int ERANGE = placeholder(); - public static final int EROFS = placeholder(); - public static final int ESPIPE = placeholder(); - public static final int ESRCH = placeholder(); - public static final int ESTALE = placeholder(); - public static final int ETH_P_ALL = placeholder(); - public static final int ETH_P_ARP = placeholder(); - public static final int ETH_P_IP = placeholder(); - public static final int ETH_P_IPV6 = placeholder(); - public static final int ETIME = placeholder(); - public static final int ETIMEDOUT = placeholder(); - public static final int ETXTBSY = placeholder(); - /** - * "Too many users" error. - * See <a href="https://man7.org/linux/man-pages/man3/errno.3.html">errno(3)</a>. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int EUSERS = placeholder(); - // On Linux, EWOULDBLOCK == EAGAIN. Use EAGAIN instead, to reduce confusion. - public static final int EXDEV = placeholder(); - public static final int EXIT_FAILURE = placeholder(); - public static final int EXIT_SUCCESS = placeholder(); - public static final int FD_CLOEXEC = placeholder(); - public static final int FIONREAD = placeholder(); - public static final int F_DUPFD = placeholder(); - public static final int F_DUPFD_CLOEXEC = placeholder(); - public static final int F_GETFD = placeholder(); - public static final int F_GETFL = placeholder(); - public static final int F_GETLK = placeholder(); - public static final int F_GETLK64 = placeholder(); - public static final int F_GETOWN = placeholder(); - public static final int F_OK = placeholder(); - public static final int F_RDLCK = placeholder(); - public static final int F_SETFD = placeholder(); - public static final int F_SETFL = placeholder(); - public static final int F_SETLK = placeholder(); - public static final int F_SETLK64 = placeholder(); - public static final int F_SETLKW = placeholder(); - public static final int F_SETLKW64 = placeholder(); - public static final int F_SETOWN = placeholder(); - public static final int F_UNLCK = placeholder(); - public static final int F_WRLCK = placeholder(); - public static final int ICMP_ECHO = placeholder(); - public static final int ICMP_ECHOREPLY = placeholder(); - public static final int ICMP6_ECHO_REQUEST = placeholder(); - public static final int ICMP6_ECHO_REPLY = placeholder(); - public static final int IFA_F_DADFAILED = placeholder(); - public static final int IFA_F_DEPRECATED = placeholder(); - public static final int IFA_F_HOMEADDRESS = placeholder(); - public static final int IFA_F_MANAGETEMPADDR = placeholder(); - public static final int IFA_F_NODAD = placeholder(); - public static final int IFA_F_NOPREFIXROUTE = placeholder(); - public static final int IFA_F_OPTIMISTIC = placeholder(); - public static final int IFA_F_PERMANENT = placeholder(); - public static final int IFA_F_SECONDARY = placeholder(); - public static final int IFA_F_TEMPORARY = placeholder(); - public static final int IFA_F_TENTATIVE = placeholder(); - public static final int IFF_ALLMULTI = placeholder(); - public static final int IFF_AUTOMEDIA = placeholder(); - public static final int IFF_BROADCAST = placeholder(); - public static final int IFF_DEBUG = placeholder(); - public static final int IFF_DYNAMIC = placeholder(); - public static final int IFF_LOOPBACK = placeholder(); - public static final int IFF_MASTER = placeholder(); - public static final int IFF_MULTICAST = placeholder(); - public static final int IFF_NOARP = placeholder(); - public static final int IFF_NOTRAILERS = placeholder(); - public static final int IFF_POINTOPOINT = placeholder(); - public static final int IFF_PORTSEL = placeholder(); - public static final int IFF_PROMISC = placeholder(); - public static final int IFF_RUNNING = placeholder(); - public static final int IFF_SLAVE = placeholder(); - public static final int IFF_UP = placeholder(); - public static final int IPPROTO_ICMP = placeholder(); - public static final int IPPROTO_ICMPV6 = placeholder(); - public static final int IPPROTO_IP = placeholder(); - public static final int IPPROTO_IPV6 = placeholder(); - public static final int IPPROTO_RAW = placeholder(); - public static final int IPPROTO_TCP = placeholder(); - public static final int IPPROTO_UDP = placeholder(); - - /** - * Encapsulation Security Payload protocol - * - * <p>Defined in /uapi/linux/in.h - */ - public static final int IPPROTO_ESP = placeholder(); - - public static final int IPV6_CHECKSUM = placeholder(); - public static final int IPV6_MULTICAST_HOPS = placeholder(); - public static final int IPV6_MULTICAST_IF = placeholder(); - public static final int IPV6_MULTICAST_LOOP = placeholder(); - public static final int IPV6_PKTINFO = placeholder(); - public static final int IPV6_RECVDSTOPTS = placeholder(); - public static final int IPV6_RECVHOPLIMIT = placeholder(); - public static final int IPV6_RECVHOPOPTS = placeholder(); - public static final int IPV6_RECVPKTINFO = placeholder(); - public static final int IPV6_RECVRTHDR = placeholder(); - public static final int IPV6_RECVTCLASS = placeholder(); - public static final int IPV6_TCLASS = placeholder(); - public static final int IPV6_UNICAST_HOPS = placeholder(); - public static final int IPV6_V6ONLY = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int IP_MULTICAST_ALL = placeholder(); - public static final int IP_MULTICAST_IF = placeholder(); - public static final int IP_MULTICAST_LOOP = placeholder(); - public static final int IP_MULTICAST_TTL = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int IP_RECVTOS = placeholder(); - public static final int IP_TOS = placeholder(); - public static final int IP_TTL = placeholder(); - /** - * Version constant to be used in {@link StructCapUserHeader} with - * {@link Os#capset(StructCapUserHeader, StructCapUserData[])} and - * {@link Os#capget(StructCapUserHeader)}. - * - * See <a href="https://man7.org/linux/man-pages/man2/capget.2.html">capget(2)</a>. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int _LINUX_CAPABILITY_VERSION_3 = placeholder(); - public static final int MAP_FIXED = placeholder(); - public static final int MAP_ANONYMOUS = placeholder(); - /** - * Flag argument for {@code mmap(long, long, int, int, FileDescriptor, long)}. - * - * See <a href="http://man7.org/linux/man-pages/man2/mmap.2.html">mmap(2)</a>. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int MAP_POPULATE = placeholder(); - public static final int MAP_PRIVATE = placeholder(); - public static final int MAP_SHARED = placeholder(); - public static final int MCAST_JOIN_GROUP = placeholder(); - public static final int MCAST_LEAVE_GROUP = placeholder(); - public static final int MCAST_JOIN_SOURCE_GROUP = placeholder(); - public static final int MCAST_LEAVE_SOURCE_GROUP = placeholder(); - public static final int MCAST_BLOCK_SOURCE = placeholder(); - public static final int MCAST_UNBLOCK_SOURCE = placeholder(); - public static final int MCL_CURRENT = placeholder(); - public static final int MCL_FUTURE = placeholder(); - public static final int MFD_CLOEXEC = placeholder(); - public static final int MSG_CTRUNC = placeholder(); - public static final int MSG_DONTROUTE = placeholder(); - public static final int MSG_EOR = placeholder(); - public static final int MSG_OOB = placeholder(); - public static final int MSG_PEEK = placeholder(); - public static final int MSG_TRUNC = placeholder(); - public static final int MSG_WAITALL = placeholder(); - public static final int MS_ASYNC = placeholder(); - public static final int MS_INVALIDATE = placeholder(); - public static final int MS_SYNC = placeholder(); - public static final int NETLINK_NETFILTER = placeholder(); - public static final int NETLINK_ROUTE = placeholder(); - /** - * SELinux enforces that only system_server and netd may use this netlink socket type. - */ - public static final int NETLINK_INET_DIAG = placeholder(); - - /** - * SELinux enforces that only system_server and netd may use this netlink socket type. - * - * @see <a href="https://man7.org/linux/man-pages/man7/netlink.7.html">netlink(7)</a> - */ - public static final int NETLINK_XFRM = placeholder(); - - public static final int NI_DGRAM = placeholder(); - public static final int NI_NAMEREQD = placeholder(); - public static final int NI_NOFQDN = placeholder(); - public static final int NI_NUMERICHOST = placeholder(); - public static final int NI_NUMERICSERV = placeholder(); - public static final int O_ACCMODE = placeholder(); - public static final int O_APPEND = placeholder(); - public static final int O_CLOEXEC = placeholder(); - public static final int O_CREAT = placeholder(); - /** - * Flag for {@code Os#open(String, int, int)}. - * - * When enabled, tries to minimize cache effects of the I/O to and from this - * file. In general this will degrade performance, but it is - * useful in special situations, such as when applications do - * their own caching. File I/O is done directly to/from - * user-space buffers. The {@link O_DIRECT} flag on its own makes an - * effort to transfer data synchronously, but does not give - * the guarantees of the {@link O_SYNC} flag that data and necessary - * metadata are transferred. To guarantee synchronous I/O, - * {@link O_SYNC} must be used in addition to {@link O_DIRECT}. - * - * See <a href="https://man7.org/linux/man-pages/man2/open.2.html">open(2)</a>. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int O_DIRECT = placeholder(); - public static final int O_EXCL = placeholder(); - public static final int O_NOCTTY = placeholder(); - public static final int O_NOFOLLOW = placeholder(); - public static final int O_NONBLOCK = placeholder(); - public static final int O_RDONLY = placeholder(); - public static final int O_RDWR = placeholder(); - public static final int O_SYNC = placeholder(); - public static final int O_DSYNC = placeholder(); - public static final int O_TRUNC = placeholder(); - public static final int O_WRONLY = placeholder(); - public static final int POLLERR = placeholder(); - public static final int POLLHUP = placeholder(); - public static final int POLLIN = placeholder(); - public static final int POLLNVAL = placeholder(); - public static final int POLLOUT = placeholder(); - public static final int POLLPRI = placeholder(); - public static final int POLLRDBAND = placeholder(); - public static final int POLLRDNORM = placeholder(); - public static final int POLLWRBAND = placeholder(); - public static final int POLLWRNORM = placeholder(); - /** - * Reads or changes the ambient capability set of the calling thread. - * Has to be used as a first argument for {@link Os#prctl(int, long, long, long, long)}. - * - * See <a href="https://man7.org/linux/man-pages/man2/prctl.2.html">prctl(2)</a>. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int PR_CAP_AMBIENT = placeholder(); - /** - * The capability specified in {@code arg3} of {@link Os#prctl(int, long, long, long, long)} - * is added to the ambient set. The specified capability must already - * be present in both the permitted and the inheritable sets of the process. - * Has to be used as a second argument for {@link Os#prctl(int, long, long, long, long)}. - * - * See <a href="https://man7.org/linux/man-pages/man2/prctl.2.html">prctl(2)</a>. - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int PR_CAP_AMBIENT_RAISE = placeholder(); - public static final int PR_GET_DUMPABLE = placeholder(); - public static final int PR_SET_DUMPABLE = placeholder(); - public static final int PR_SET_NO_NEW_PRIVS = placeholder(); - public static final int PROT_EXEC = placeholder(); - public static final int PROT_NONE = placeholder(); - public static final int PROT_READ = placeholder(); - public static final int PROT_WRITE = placeholder(); - public static final int R_OK = placeholder(); - /** - * Specifies a value one greater than the maximum file - * descriptor number that can be opened by this process. - * - * <p>Attempts ({@link Os#open(String, int, int)}, {@link Os#pipe()}, - * {@link Os#dup(java.io.FileDescriptor)}, etc.) to exceed this - * limit yield the error {@link EMFILE}. - * - * See <a href="https://man7.org/linux/man-pages/man3/vlimit.3.html">getrlimit(2)</a>. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int RLIMIT_NOFILE = placeholder(); - public static final int RT_SCOPE_HOST = placeholder(); - public static final int RT_SCOPE_LINK = placeholder(); - public static final int RT_SCOPE_NOWHERE = placeholder(); - public static final int RT_SCOPE_SITE = placeholder(); - public static final int RT_SCOPE_UNIVERSE = placeholder(); - /** - * Bitmask for IPv4 addresses add/delete events multicast groups mask. - * Used in {@link NetlinkSocketAddress}. - * - * See <a href="https://man7.org/linux/man-pages/man7/netlink.7.html">netlink(7)</a>. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int RTMGRP_IPV4_IFADDR = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int RTMGRP_IPV4_MROUTE = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int RTMGRP_IPV4_ROUTE = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int RTMGRP_IPV4_RULE = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int RTMGRP_IPV6_IFADDR = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int RTMGRP_IPV6_IFINFO = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int RTMGRP_IPV6_MROUTE = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int RTMGRP_IPV6_PREFIX = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int RTMGRP_IPV6_ROUTE = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int RTMGRP_LINK = placeholder(); - public static final int RTMGRP_NEIGH = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int RTMGRP_NOTIFY = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int RTMGRP_TC = placeholder(); - public static final int SEEK_CUR = placeholder(); - public static final int SEEK_END = placeholder(); - public static final int SEEK_SET = placeholder(); - public static final int SHUT_RD = placeholder(); - public static final int SHUT_RDWR = placeholder(); - public static final int SHUT_WR = placeholder(); - public static final int SIGABRT = placeholder(); - public static final int SIGALRM = placeholder(); - public static final int SIGBUS = placeholder(); - public static final int SIGCHLD = placeholder(); - public static final int SIGCONT = placeholder(); - public static final int SIGFPE = placeholder(); - public static final int SIGHUP = placeholder(); - public static final int SIGILL = placeholder(); - public static final int SIGINT = placeholder(); - public static final int SIGIO = placeholder(); - public static final int SIGKILL = placeholder(); - public static final int SIGPIPE = placeholder(); - public static final int SIGPROF = placeholder(); - public static final int SIGPWR = placeholder(); - public static final int SIGQUIT = placeholder(); - public static final int SIGRTMAX = placeholder(); - public static final int SIGRTMIN = placeholder(); - public static final int SIGSEGV = placeholder(); - public static final int SIGSTKFLT = placeholder(); - public static final int SIGSTOP = placeholder(); - public static final int SIGSYS = placeholder(); - public static final int SIGTERM = placeholder(); - public static final int SIGTRAP = placeholder(); - public static final int SIGTSTP = placeholder(); - public static final int SIGTTIN = placeholder(); - public static final int SIGTTOU = placeholder(); - public static final int SIGURG = placeholder(); - public static final int SIGUSR1 = placeholder(); - public static final int SIGUSR2 = placeholder(); - public static final int SIGVTALRM = placeholder(); - public static final int SIGWINCH = placeholder(); - public static final int SIGXCPU = placeholder(); - public static final int SIGXFSZ = placeholder(); - public static final int SIOCGIFADDR = placeholder(); - public static final int SIOCGIFBRDADDR = placeholder(); - public static final int SIOCGIFDSTADDR = placeholder(); - public static final int SIOCGIFNETMASK = placeholder(); - - /** - * Set the close-on-exec ({@code FD_CLOEXEC}) flag on the new file - * descriptor created by {@link Os#socket(int,int,int)} or - * {@link Os#socketpair(int,int,int,java.io.FileDescriptor,java.io.FileDescriptor)}. - * See the description of the O_CLOEXEC flag in - * <a href="http://man7.org/linux/man-pages/man2/open.2.html">open(2)</a> - * for reasons why this may be useful. - * - * <p>Applications wishing to make use of this flag on older API versions - * may use {@link #O_CLOEXEC} instead. On Android, {@code O_CLOEXEC} and - * {@code SOCK_CLOEXEC} are the same value. - */ - public static final int SOCK_CLOEXEC = placeholder(); - public static final int SOCK_DGRAM = placeholder(); - - /** - * Set the O_NONBLOCK file status flag on the file descriptor - * created by {@link Os#socket(int,int,int)} or - * {@link Os#socketpair(int,int,int,java.io.FileDescriptor,java.io.FileDescriptor)}. - * - * <p>Applications wishing to make use of this flag on older API versions - * may use {@link #O_NONBLOCK} instead. On Android, {@code O_NONBLOCK} - * and {@code SOCK_NONBLOCK} are the same value. - */ - public static final int SOCK_NONBLOCK = placeholder(); - public static final int SOCK_RAW = placeholder(); - public static final int SOCK_SEQPACKET = placeholder(); - public static final int SOCK_STREAM = placeholder(); - public static final int SOL_SOCKET = placeholder(); - public static final int SOL_UDP = placeholder(); - public static final int SOL_PACKET = placeholder(); - public static final int SO_BINDTODEVICE = placeholder(); - public static final int SO_BROADCAST = placeholder(); - public static final int SO_DEBUG = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int SO_DOMAIN = placeholder(); - public static final int SO_DONTROUTE = placeholder(); - public static final int SO_ERROR = placeholder(); - public static final int SO_KEEPALIVE = placeholder(); - public static final int SO_LINGER = placeholder(); - public static final int SO_OOBINLINE = placeholder(); - public static final int SO_PASSCRED = placeholder(); - public static final int SO_PEERCRED = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int SO_PROTOCOL = placeholder(); - public static final int SO_RCVBUF = placeholder(); - public static final int SO_RCVLOWAT = placeholder(); - public static final int SO_RCVTIMEO = placeholder(); - public static final int SO_REUSEADDR = placeholder(); - public static final int SO_SNDBUF = placeholder(); - public static final int SO_SNDLOWAT = placeholder(); - public static final int SO_SNDTIMEO = placeholder(); - public static final int SO_TYPE = placeholder(); - public static final int PACKET_IGNORE_OUTGOING = placeholder(); - /** - * Bitmask for flags argument of - * {@link splice(java.io.FileDescriptor, Int64Ref , FileDescriptor, Int64Ref, long, int)}. - * - * Attempt to move pages instead of copying. This is only a - * hint to the kernel: pages may still be copied if the - * kernel cannot move the pages from the pipe, or if the pipe - * buffers don't refer to full pages. - * - * See <a href="https://man7.org/linux/man-pages/man2/splice.2.html">splice(2)</a>. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int SPLICE_F_MOVE = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int SPLICE_F_NONBLOCK = placeholder(); - /** - * Bitmask for flags argument of - * {@link splice(java.io.FileDescriptor, Int64Ref, FileDescriptor, Int64Ref, long, int)}. - * - * <p>Indicates that more data will be coming in a subsequent splice. This is - * a helpful hint when the {@code fdOut} refers to a socket. - * - * See <a href="https://man7.org/linux/man-pages/man2/splice.2.html">splice(2)</a>. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int SPLICE_F_MORE = placeholder(); - public static final int STDERR_FILENO = placeholder(); - public static final int STDIN_FILENO = placeholder(); - public static final int STDOUT_FILENO = placeholder(); - public static final int ST_MANDLOCK = placeholder(); - public static final int ST_NOATIME = placeholder(); - public static final int ST_NODEV = placeholder(); - public static final int ST_NODIRATIME = placeholder(); - public static final int ST_NOEXEC = placeholder(); - public static final int ST_NOSUID = placeholder(); - public static final int ST_RDONLY = placeholder(); - public static final int ST_RELATIME = placeholder(); - public static final int ST_SYNCHRONOUS = placeholder(); - public static final int S_IFBLK = placeholder(); - public static final int S_IFCHR = placeholder(); - public static final int S_IFDIR = placeholder(); - public static final int S_IFIFO = placeholder(); - public static final int S_IFLNK = placeholder(); - public static final int S_IFMT = placeholder(); - public static final int S_IFREG = placeholder(); - public static final int S_IFSOCK = placeholder(); - public static final int S_IRGRP = placeholder(); - public static final int S_IROTH = placeholder(); - public static final int S_IRUSR = placeholder(); - public static final int S_IRWXG = placeholder(); - public static final int S_IRWXO = placeholder(); - public static final int S_IRWXU = placeholder(); - public static final int S_ISGID = placeholder(); - public static final int S_ISUID = placeholder(); - public static final int S_ISVTX = placeholder(); - public static final int S_IWGRP = placeholder(); - public static final int S_IWOTH = placeholder(); - public static final int S_IWUSR = placeholder(); - public static final int S_IXGRP = placeholder(); - public static final int S_IXOTH = placeholder(); - public static final int S_IXUSR = placeholder(); - public static final int TCP_NODELAY = placeholder(); - public static final int TCP_USER_TIMEOUT = placeholder(); - public static final int UDP_GRO = placeholder(); - public static final int UDP_SEGMENT = placeholder(); - /** - * Get the number of bytes in the output buffer. - * - * See <a href="https://man7.org/linux/man-pages/man2/ioctl.2.html">ioctl(2)</a>. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int TIOCOUTQ = placeholder(); - /** - * Sockopt option to encapsulate ESP packets in UDP. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int UDP_ENCAP = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int UDP_ENCAP_ESPINUDP_NON_IKE = placeholder(); - /** @hide */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int UDP_ENCAP_ESPINUDP = placeholder(); - /** @hide */ -// @UnsupportedAppUsage - public static final int UNIX_PATH_MAX = placeholder(); - public static final int WCONTINUED = placeholder(); - public static final int WEXITED = placeholder(); - public static final int WNOHANG = placeholder(); - public static final int WNOWAIT = placeholder(); - public static final int WSTOPPED = placeholder(); - public static final int WUNTRACED = placeholder(); - public static final int W_OK = placeholder(); - /** - * {@code flags} option for {@link Os#setxattr(String, String, byte[], int)}. - * - * <p>Performs a pure create, which fails if the named attribute exists already. - * - * See <a href="http://man7.org/linux/man-pages/man2/setxattr.2.html">setxattr(2)</a>. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int XATTR_CREATE = placeholder(); - /** - * {@code flags} option for {@link Os#setxattr(String, String, byte[], int)}. - * - * <p>Perform a pure replace operation, which fails if the named attribute - * does not already exist. - * - * See <a href="http://man7.org/linux/man-pages/man2/setxattr.2.html">setxattr(2)</a>. - * - * @hide - */ -// @UnsupportedAppUsage -// @SystemApi(client = MODULE_LIBRARIES) - public static final int XATTR_REPLACE = placeholder(); - public static final int X_OK = placeholder(); - public static final int _SC_2_CHAR_TERM = placeholder(); - public static final int _SC_2_C_BIND = placeholder(); - public static final int _SC_2_C_DEV = placeholder(); - public static final int _SC_2_C_VERSION = placeholder(); - public static final int _SC_2_FORT_DEV = placeholder(); - public static final int _SC_2_FORT_RUN = placeholder(); - public static final int _SC_2_LOCALEDEF = placeholder(); - public static final int _SC_2_SW_DEV = placeholder(); - public static final int _SC_2_UPE = placeholder(); - public static final int _SC_2_VERSION = placeholder(); - public static final int _SC_AIO_LISTIO_MAX = placeholder(); - public static final int _SC_AIO_MAX = placeholder(); - public static final int _SC_AIO_PRIO_DELTA_MAX = placeholder(); - public static final int _SC_ARG_MAX = placeholder(); - public static final int _SC_ASYNCHRONOUS_IO = placeholder(); - public static final int _SC_ATEXIT_MAX = placeholder(); - public static final int _SC_AVPHYS_PAGES = placeholder(); - public static final int _SC_BC_BASE_MAX = placeholder(); - public static final int _SC_BC_DIM_MAX = placeholder(); - public static final int _SC_BC_SCALE_MAX = placeholder(); - public static final int _SC_BC_STRING_MAX = placeholder(); - public static final int _SC_CHILD_MAX = placeholder(); - public static final int _SC_CLK_TCK = placeholder(); - public static final int _SC_COLL_WEIGHTS_MAX = placeholder(); - public static final int _SC_DELAYTIMER_MAX = placeholder(); - public static final int _SC_EXPR_NEST_MAX = placeholder(); - public static final int _SC_FSYNC = placeholder(); - public static final int _SC_GETGR_R_SIZE_MAX = placeholder(); - public static final int _SC_GETPW_R_SIZE_MAX = placeholder(); - public static final int _SC_IOV_MAX = placeholder(); - public static final int _SC_JOB_CONTROL = placeholder(); - public static final int _SC_LINE_MAX = placeholder(); - public static final int _SC_LOGIN_NAME_MAX = placeholder(); - public static final int _SC_MAPPED_FILES = placeholder(); - public static final int _SC_MEMLOCK = placeholder(); - public static final int _SC_MEMLOCK_RANGE = placeholder(); - public static final int _SC_MEMORY_PROTECTION = placeholder(); - public static final int _SC_MESSAGE_PASSING = placeholder(); - public static final int _SC_MQ_OPEN_MAX = placeholder(); - public static final int _SC_MQ_PRIO_MAX = placeholder(); - public static final int _SC_NGROUPS_MAX = placeholder(); - public static final int _SC_NPROCESSORS_CONF = placeholder(); - public static final int _SC_NPROCESSORS_ONLN = placeholder(); - public static final int _SC_OPEN_MAX = placeholder(); - public static final int _SC_PAGESIZE = placeholder(); - public static final int _SC_PAGE_SIZE = placeholder(); - public static final int _SC_PASS_MAX = placeholder(); - public static final int _SC_PHYS_PAGES = placeholder(); - public static final int _SC_PRIORITIZED_IO = placeholder(); - public static final int _SC_PRIORITY_SCHEDULING = placeholder(); - public static final int _SC_REALTIME_SIGNALS = placeholder(); - public static final int _SC_RE_DUP_MAX = placeholder(); - public static final int _SC_RTSIG_MAX = placeholder(); - public static final int _SC_SAVED_IDS = placeholder(); - public static final int _SC_SEMAPHORES = placeholder(); - public static final int _SC_SEM_NSEMS_MAX = placeholder(); - public static final int _SC_SEM_VALUE_MAX = placeholder(); - public static final int _SC_SHARED_MEMORY_OBJECTS = placeholder(); - public static final int _SC_SIGQUEUE_MAX = placeholder(); - public static final int _SC_STREAM_MAX = placeholder(); - public static final int _SC_SYNCHRONIZED_IO = placeholder(); - public static final int _SC_THREADS = placeholder(); - public static final int _SC_THREAD_ATTR_STACKADDR = placeholder(); - public static final int _SC_THREAD_ATTR_STACKSIZE = placeholder(); - public static final int _SC_THREAD_DESTRUCTOR_ITERATIONS = placeholder(); - public static final int _SC_THREAD_KEYS_MAX = placeholder(); - public static final int _SC_THREAD_PRIORITY_SCHEDULING = placeholder(); - public static final int _SC_THREAD_PRIO_INHERIT = placeholder(); - public static final int _SC_THREAD_PRIO_PROTECT = placeholder(); - public static final int _SC_THREAD_SAFE_FUNCTIONS = placeholder(); - public static final int _SC_THREAD_STACK_MIN = placeholder(); - public static final int _SC_THREAD_THREADS_MAX = placeholder(); - public static final int _SC_TIMERS = placeholder(); - public static final int _SC_TIMER_MAX = placeholder(); - public static final int _SC_TTY_NAME_MAX = placeholder(); - public static final int _SC_TZNAME_MAX = placeholder(); - public static final int _SC_VERSION = placeholder(); - public static final int _SC_XBS5_ILP32_OFF32 = placeholder(); - public static final int _SC_XBS5_ILP32_OFFBIG = placeholder(); - public static final int _SC_XBS5_LP64_OFF64 = placeholder(); - public static final int _SC_XBS5_LPBIG_OFFBIG = placeholder(); - public static final int _SC_XOPEN_CRYPT = placeholder(); - public static final int _SC_XOPEN_ENH_I18N = placeholder(); - public static final int _SC_XOPEN_LEGACY = placeholder(); - public static final int _SC_XOPEN_REALTIME = placeholder(); - public static final int _SC_XOPEN_REALTIME_THREADS = placeholder(); - public static final int _SC_XOPEN_SHM = placeholder(); - public static final int _SC_XOPEN_UNIX = placeholder(); - public static final int _SC_XOPEN_VERSION = placeholder(); - public static final int _SC_XOPEN_XCU_VERSION = placeholder(); - - /** - * Returns the string name of a getaddrinfo(3) error value. - * For example, "EAI_AGAIN". - */ - public static String gaiName(int error) { - if (error == EAI_AGAIN) { - return "EAI_AGAIN"; - } - if (error == EAI_BADFLAGS) { - return "EAI_BADFLAGS"; - } - if (error == EAI_FAIL) { - return "EAI_FAIL"; - } - if (error == EAI_FAMILY) { - return "EAI_FAMILY"; - } - if (error == EAI_MEMORY) { - return "EAI_MEMORY"; - } - if (error == EAI_NODATA) { - return "EAI_NODATA"; - } - if (error == EAI_NONAME) { - return "EAI_NONAME"; - } - if (error == EAI_OVERFLOW) { - return "EAI_OVERFLOW"; - } - if (error == EAI_SERVICE) { - return "EAI_SERVICE"; - } - if (error == EAI_SOCKTYPE) { - return "EAI_SOCKTYPE"; - } - if (error == EAI_SYSTEM) { - return "EAI_SYSTEM"; - } - return null; - } - - /** - * Returns the string name of an errno value. - * For example, "EACCES". See {@link Os#strerror} for human-readable errno descriptions. - */ - public static String errnoName(int errno) { - if (errno == E2BIG) { - return "E2BIG"; - } - if (errno == EACCES) { - return "EACCES"; - } - if (errno == EADDRINUSE) { - return "EADDRINUSE"; - } - if (errno == EADDRNOTAVAIL) { - return "EADDRNOTAVAIL"; - } - if (errno == EAFNOSUPPORT) { - return "EAFNOSUPPORT"; - } - if (errno == EAGAIN) { - return "EAGAIN"; - } - if (errno == EALREADY) { - return "EALREADY"; - } - if (errno == EBADF) { - return "EBADF"; - } - if (errno == EBADMSG) { - return "EBADMSG"; - } - if (errno == EBUSY) { - return "EBUSY"; - } - if (errno == ECANCELED) { - return "ECANCELED"; - } - if (errno == ECHILD) { - return "ECHILD"; - } - if (errno == ECONNABORTED) { - return "ECONNABORTED"; - } - if (errno == ECONNREFUSED) { - return "ECONNREFUSED"; - } - if (errno == ECONNRESET) { - return "ECONNRESET"; - } - if (errno == EDEADLK) { - return "EDEADLK"; - } - if (errno == EDESTADDRREQ) { - return "EDESTADDRREQ"; - } - if (errno == EDOM) { - return "EDOM"; - } - if (errno == EDQUOT) { - return "EDQUOT"; - } - if (errno == EEXIST) { - return "EEXIST"; - } - if (errno == EFAULT) { - return "EFAULT"; - } - if (errno == EFBIG) { - return "EFBIG"; - } - if (errno == EHOSTUNREACH) { - return "EHOSTUNREACH"; - } - if (errno == EIDRM) { - return "EIDRM"; - } - if (errno == EILSEQ) { - return "EILSEQ"; - } - if (errno == EINPROGRESS) { - return "EINPROGRESS"; - } - if (errno == EINTR) { - return "EINTR"; - } - if (errno == EINVAL) { - return "EINVAL"; - } - if (errno == EIO) { - return "EIO"; - } - if (errno == EISCONN) { - return "EISCONN"; - } - if (errno == EISDIR) { - return "EISDIR"; - } - if (errno == ELOOP) { - return "ELOOP"; - } - if (errno == EMFILE) { - return "EMFILE"; - } - if (errno == EMLINK) { - return "EMLINK"; - } - if (errno == EMSGSIZE) { - return "EMSGSIZE"; - } - if (errno == EMULTIHOP) { - return "EMULTIHOP"; - } - if (errno == ENAMETOOLONG) { - return "ENAMETOOLONG"; - } - if (errno == ENETDOWN) { - return "ENETDOWN"; - } - if (errno == ENETRESET) { - return "ENETRESET"; - } - if (errno == ENETUNREACH) { - return "ENETUNREACH"; - } - if (errno == ENFILE) { - return "ENFILE"; - } - if (errno == ENOBUFS) { - return "ENOBUFS"; - } - if (errno == ENODATA) { - return "ENODATA"; - } - if (errno == ENODEV) { - return "ENODEV"; - } - if (errno == ENOENT) { - return "ENOENT"; - } - if (errno == ENOEXEC) { - return "ENOEXEC"; - } - if (errno == ENOLCK) { - return "ENOLCK"; - } - if (errno == ENOLINK) { - return "ENOLINK"; - } - if (errno == ENOMEM) { - return "ENOMEM"; - } - if (errno == ENOMSG) { - return "ENOMSG"; - } - if (errno == ENONET) { - return "ENONET"; - } - if (errno == ENOPROTOOPT) { - return "ENOPROTOOPT"; - } - if (errno == ENOSPC) { - return "ENOSPC"; - } - if (errno == ENOSR) { - return "ENOSR"; - } - if (errno == ENOSTR) { - return "ENOSTR"; - } - if (errno == ENOSYS) { - return "ENOSYS"; - } - if (errno == ENOTCONN) { - return "ENOTCONN"; - } - if (errno == ENOTDIR) { - return "ENOTDIR"; - } - if (errno == ENOTEMPTY) { - return "ENOTEMPTY"; - } - if (errno == ENOTSOCK) { - return "ENOTSOCK"; - } - if (errno == ENOTSUP) { - return "ENOTSUP"; - } - if (errno == ENOTTY) { - return "ENOTTY"; - } - if (errno == ENXIO) { - return "ENXIO"; - } - if (errno == EOPNOTSUPP) { - return "EOPNOTSUPP"; - } - if (errno == EOVERFLOW) { - return "EOVERFLOW"; - } - if (errno == EPERM) { - return "EPERM"; - } - if (errno == EPIPE) { - return "EPIPE"; - } - if (errno == EPROTO) { - return "EPROTO"; - } - if (errno == EPROTONOSUPPORT) { - return "EPROTONOSUPPORT"; - } - if (errno == EPROTOTYPE) { - return "EPROTOTYPE"; - } - if (errno == ERANGE) { - return "ERANGE"; - } - if (errno == EROFS) { - return "EROFS"; - } - if (errno == ESPIPE) { - return "ESPIPE"; - } - if (errno == ESRCH) { - return "ESRCH"; - } - if (errno == ESTALE) { - return "ESTALE"; - } - if (errno == ETIME) { - return "ETIME"; - } - if (errno == ETIMEDOUT) { - return "ETIMEDOUT"; - } - if (errno == ETXTBSY) { - return "ETXTBSY"; - } - if (errno == EXDEV) { - return "EXDEV"; - } - return null; - } - - // [ravenwood-change] Moved to a nested class. - // @UnsupportedAppUsage - static class Native { - private static native void initConstants(); - } - - // A hack to avoid these constants being inlined by javac... -// @UnsupportedAppUsage - private static int placeholder() { return 0; } - // ...because we want to initialize them at runtime. - static { - // [ravenwood-change] Load the JNI lib. - RavenwoodCommonUtils.loadRavenwoodNativeRuntime(); - Native.initConstants(); - } -} diff --git a/ravenwood/runtime-helper-src/libcore-fake/libcore/ravenwood/LibcoreRavenwoodUtils.java b/ravenwood/runtime-helper-src/libcore-fake/libcore/ravenwood/LibcoreRavenwoodUtils.java new file mode 100644 index 000000000000..839b62a39471 --- /dev/null +++ b/ravenwood/runtime-helper-src/libcore-fake/libcore/ravenwood/LibcoreRavenwoodUtils.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package libcore.ravenwood; + +public class LibcoreRavenwoodUtils { + private LibcoreRavenwoodUtils() { + } + + public static void loadRavenwoodNativeRuntime() { + // TODO Stop using reflections. + // We need to call RavenwoodUtils.loadRavenwoodNativeRuntime(), but due to the build + // structure complexity, we can't refer to to this method directly from here, + // so let's use reflections for now... + try { + final var clazz = Class.forName("android.platform.test.ravenwood.RavenwoodUtils"); + final var method = clazz.getMethod("loadRavenwoodNativeRuntime"); + method.invoke(null); + } catch (Throwable th) { + throw new IllegalStateException("Failed to load Ravenwood native runtime", th); + } + } +} diff --git a/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java b/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java index 14b5a4f0c1e0..93861e87318f 100644 --- a/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java +++ b/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java @@ -15,7 +15,7 @@ */ package libcore.util; -import com.android.ravenwood.common.RavenwoodRuntimeNative; +import libcore.ravenwood.LibcoreRavenwoodUtils; import java.lang.ref.Cleaner; import java.lang.ref.Reference; @@ -27,6 +27,11 @@ import java.lang.ref.Reference; * (Should ART switch to java.lang.ref.Cleaner?) */ public class NativeAllocationRegistry { + static { + // Initialize the JNI method. + LibcoreRavenwoodUtils.loadRavenwoodNativeRuntime(); + } + private final long mFreeFunction; private static final Cleaner sCleaner = Cleaner.create(); @@ -66,7 +71,7 @@ public class NativeAllocationRegistry { } final Runnable releaser = () -> { - RavenwoodRuntimeNative.applyFreeFunction(mFreeFunction, nativePtr); + applyFreeFunction(mFreeFunction, nativePtr); }; sCleaner.register(referent, releaser); @@ -74,4 +79,10 @@ public class NativeAllocationRegistry { Reference.reachabilityFence(referent); return releaser; } + + /** + * Calls {@code freeFunction}({@code nativePtr}). + */ + public static native void applyFreeFunction(long freeFunction, long nativePtr); } + diff --git a/ravenwood/runtime-jni/ravenwood_os_constants.cpp b/ravenwood/runtime-jni/ravenwood_os_constants.cpp deleted file mode 100644 index ea6c9d4766b6..000000000000 --- a/ravenwood/runtime-jni/ravenwood_os_constants.cpp +++ /dev/null @@ -1,766 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Copied from libcore/luni/src/main/native/android_system_OsConstants.cpp, -// changes annotated with [ravenwood-change]. - -#define LOG_TAG "OsConstants" - -#include <errno.h> -#include <fcntl.h> -#include <netdb.h> -#include <netinet/icmp6.h> -#include <netinet/in.h> -#include <netinet/ip_icmp.h> -#include <netinet/tcp.h> -#include <poll.h> -#include <signal.h> -#include <stdlib.h> -#include <sys/ioctl.h> -#include <sys/mman.h> -#include <sys/prctl.h> -#include <sys/resource.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <sys/un.h> -#include <sys/wait.h> -#include <sys/xattr.h> -#include <unistd.h> - -#include <net/if_arp.h> -#include <linux/if_ether.h> - -// After the others because these are not necessarily self-contained in glibc. -#include <linux/if_addr.h> -#include <linux/rtnetlink.h> - -// Include linux socket constants for setting sockopts -#include <linux/udp.h> - -#include <net/if.h> // After <sys/socket.h> to work around a Mac header file bug. - -// [ravenwood-change] always include it -// #if defined(__BIONIC__) -#include <linux/capability.h> -// #endif - -#include <nativehelper/JNIHelp.h> -#include <nativehelper/jni_macros.h> - -// [ravenwood-change] -- can't access "Portability.h", so just inline it here. -// #include "Portability.h" -#include <byteswap.h> -#include <sys/sendfile.h> -#include <sys/statvfs.h> -#include <netdb.h> -#include <linux/vm_sockets.h> - -// For LOG_ALWAYS_FATAL_IF -#include "utils/Log.h" - - -static void initConstant(JNIEnv* env, jclass c, const char* fieldName, int value) { - jfieldID field = env->GetStaticFieldID(c, fieldName, "I"); - env->SetStaticIntField(c, field, value); -} - -static void OsConstants_initConstants(JNIEnv* env, jclass) { - // [ravenwood-change] -- the constants are in the outer class, but this JNI method is in the - // nested class, so we need to get the outer class here. - jclass c = env->FindClass("android/system/OsConstants"); - LOG_ALWAYS_FATAL_IF(c == NULL, "Unable to find class android/system/OsConstants"); - - initConstant(env, c, "AF_INET", AF_INET); - initConstant(env, c, "AF_INET6", AF_INET6); - initConstant(env, c, "AF_PACKET", AF_PACKET); - initConstant(env, c, "AF_NETLINK", AF_NETLINK); - initConstant(env, c, "AF_UNIX", AF_UNIX); - initConstant(env, c, "AF_VSOCK", AF_VSOCK); - initConstant(env, c, "AF_UNSPEC", AF_UNSPEC); - initConstant(env, c, "AI_ADDRCONFIG", AI_ADDRCONFIG); - initConstant(env, c, "AI_ALL", AI_ALL); - initConstant(env, c, "AI_CANONNAME", AI_CANONNAME); - initConstant(env, c, "AI_NUMERICHOST", AI_NUMERICHOST); -#if defined(AI_NUMERICSERV) - initConstant(env, c, "AI_NUMERICSERV", AI_NUMERICSERV); -#endif - initConstant(env, c, "AI_PASSIVE", AI_PASSIVE); - initConstant(env, c, "AI_V4MAPPED", AI_V4MAPPED); - initConstant(env, c, "ARPHRD_ETHER", ARPHRD_ETHER); - initConstant(env, c, "VMADDR_PORT_ANY", VMADDR_PORT_ANY); - initConstant(env, c, "VMADDR_CID_ANY", VMADDR_CID_ANY); - initConstant(env, c, "VMADDR_CID_LOCAL", VMADDR_CID_LOCAL); - initConstant(env, c, "VMADDR_CID_HOST", VMADDR_CID_HOST); - initConstant(env, c, "ARPHRD_LOOPBACK", ARPHRD_LOOPBACK); -#if defined(CAP_LAST_CAP) - initConstant(env, c, "CAP_AUDIT_CONTROL", CAP_AUDIT_CONTROL); - initConstant(env, c, "CAP_AUDIT_WRITE", CAP_AUDIT_WRITE); - initConstant(env, c, "CAP_BLOCK_SUSPEND", CAP_BLOCK_SUSPEND); - initConstant(env, c, "CAP_CHOWN", CAP_CHOWN); - initConstant(env, c, "CAP_DAC_OVERRIDE", CAP_DAC_OVERRIDE); - initConstant(env, c, "CAP_DAC_READ_SEARCH", CAP_DAC_READ_SEARCH); - initConstant(env, c, "CAP_FOWNER", CAP_FOWNER); - initConstant(env, c, "CAP_FSETID", CAP_FSETID); - initConstant(env, c, "CAP_IPC_LOCK", CAP_IPC_LOCK); - initConstant(env, c, "CAP_IPC_OWNER", CAP_IPC_OWNER); - initConstant(env, c, "CAP_KILL", CAP_KILL); - initConstant(env, c, "CAP_LAST_CAP", CAP_LAST_CAP); - initConstant(env, c, "CAP_LEASE", CAP_LEASE); - initConstant(env, c, "CAP_LINUX_IMMUTABLE", CAP_LINUX_IMMUTABLE); - initConstant(env, c, "CAP_MAC_ADMIN", CAP_MAC_ADMIN); - initConstant(env, c, "CAP_MAC_OVERRIDE", CAP_MAC_OVERRIDE); - initConstant(env, c, "CAP_MKNOD", CAP_MKNOD); - initConstant(env, c, "CAP_NET_ADMIN", CAP_NET_ADMIN); - initConstant(env, c, "CAP_NET_BIND_SERVICE", CAP_NET_BIND_SERVICE); - initConstant(env, c, "CAP_NET_BROADCAST", CAP_NET_BROADCAST); - initConstant(env, c, "CAP_NET_RAW", CAP_NET_RAW); - initConstant(env, c, "CAP_SETFCAP", CAP_SETFCAP); - initConstant(env, c, "CAP_SETGID", CAP_SETGID); - initConstant(env, c, "CAP_SETPCAP", CAP_SETPCAP); - initConstant(env, c, "CAP_SETUID", CAP_SETUID); - initConstant(env, c, "CAP_SYS_ADMIN", CAP_SYS_ADMIN); - initConstant(env, c, "CAP_SYS_BOOT", CAP_SYS_BOOT); - initConstant(env, c, "CAP_SYS_CHROOT", CAP_SYS_CHROOT); - initConstant(env, c, "CAP_SYSLOG", CAP_SYSLOG); - initConstant(env, c, "CAP_SYS_MODULE", CAP_SYS_MODULE); - initConstant(env, c, "CAP_SYS_NICE", CAP_SYS_NICE); - initConstant(env, c, "CAP_SYS_PACCT", CAP_SYS_PACCT); - initConstant(env, c, "CAP_SYS_PTRACE", CAP_SYS_PTRACE); - initConstant(env, c, "CAP_SYS_RAWIO", CAP_SYS_RAWIO); - initConstant(env, c, "CAP_SYS_RESOURCE", CAP_SYS_RESOURCE); - initConstant(env, c, "CAP_SYS_TIME", CAP_SYS_TIME); - initConstant(env, c, "CAP_SYS_TTY_CONFIG", CAP_SYS_TTY_CONFIG); - initConstant(env, c, "CAP_WAKE_ALARM", CAP_WAKE_ALARM); -#endif - initConstant(env, c, "E2BIG", E2BIG); - initConstant(env, c, "EACCES", EACCES); - initConstant(env, c, "EADDRINUSE", EADDRINUSE); - initConstant(env, c, "EADDRNOTAVAIL", EADDRNOTAVAIL); - initConstant(env, c, "EAFNOSUPPORT", EAFNOSUPPORT); - initConstant(env, c, "EAGAIN", EAGAIN); - initConstant(env, c, "EAI_AGAIN", EAI_AGAIN); - initConstant(env, c, "EAI_BADFLAGS", EAI_BADFLAGS); - initConstant(env, c, "EAI_FAIL", EAI_FAIL); - initConstant(env, c, "EAI_FAMILY", EAI_FAMILY); - initConstant(env, c, "EAI_MEMORY", EAI_MEMORY); - initConstant(env, c, "EAI_NODATA", EAI_NODATA); - initConstant(env, c, "EAI_NONAME", EAI_NONAME); -#if defined(EAI_OVERFLOW) - initConstant(env, c, "EAI_OVERFLOW", EAI_OVERFLOW); -#endif - initConstant(env, c, "EAI_SERVICE", EAI_SERVICE); - initConstant(env, c, "EAI_SOCKTYPE", EAI_SOCKTYPE); - initConstant(env, c, "EAI_SYSTEM", EAI_SYSTEM); - initConstant(env, c, "EALREADY", EALREADY); - initConstant(env, c, "EBADF", EBADF); - initConstant(env, c, "EBADMSG", EBADMSG); - initConstant(env, c, "EBUSY", EBUSY); - initConstant(env, c, "ECANCELED", ECANCELED); - initConstant(env, c, "ECHILD", ECHILD); - initConstant(env, c, "ECONNABORTED", ECONNABORTED); - initConstant(env, c, "ECONNREFUSED", ECONNREFUSED); - initConstant(env, c, "ECONNRESET", ECONNRESET); - initConstant(env, c, "EDEADLK", EDEADLK); - initConstant(env, c, "EDESTADDRREQ", EDESTADDRREQ); - initConstant(env, c, "EDOM", EDOM); - initConstant(env, c, "EDQUOT", EDQUOT); - initConstant(env, c, "EEXIST", EEXIST); - initConstant(env, c, "EFAULT", EFAULT); - initConstant(env, c, "EFBIG", EFBIG); - initConstant(env, c, "EHOSTUNREACH", EHOSTUNREACH); - initConstant(env, c, "EIDRM", EIDRM); - initConstant(env, c, "EILSEQ", EILSEQ); - initConstant(env, c, "EINPROGRESS", EINPROGRESS); - initConstant(env, c, "EINTR", EINTR); - initConstant(env, c, "EINVAL", EINVAL); - initConstant(env, c, "EIO", EIO); - initConstant(env, c, "EISCONN", EISCONN); - initConstant(env, c, "EISDIR", EISDIR); - initConstant(env, c, "ELOOP", ELOOP); - initConstant(env, c, "EMFILE", EMFILE); - initConstant(env, c, "EMLINK", EMLINK); - initConstant(env, c, "EMSGSIZE", EMSGSIZE); - initConstant(env, c, "EMULTIHOP", EMULTIHOP); - initConstant(env, c, "ENAMETOOLONG", ENAMETOOLONG); - initConstant(env, c, "ENETDOWN", ENETDOWN); - initConstant(env, c, "ENETRESET", ENETRESET); - initConstant(env, c, "ENETUNREACH", ENETUNREACH); - initConstant(env, c, "ENFILE", ENFILE); - initConstant(env, c, "ENOBUFS", ENOBUFS); - initConstant(env, c, "ENODATA", ENODATA); - initConstant(env, c, "ENODEV", ENODEV); - initConstant(env, c, "ENOENT", ENOENT); - initConstant(env, c, "ENOEXEC", ENOEXEC); - initConstant(env, c, "ENOLCK", ENOLCK); - initConstant(env, c, "ENOLINK", ENOLINK); - initConstant(env, c, "ENOMEM", ENOMEM); - initConstant(env, c, "ENOMSG", ENOMSG); - initConstant(env, c, "ENONET", ENONET); - initConstant(env, c, "ENOPROTOOPT", ENOPROTOOPT); - initConstant(env, c, "ENOSPC", ENOSPC); - initConstant(env, c, "ENOSR", ENOSR); - initConstant(env, c, "ENOSTR", ENOSTR); - initConstant(env, c, "ENOSYS", ENOSYS); - initConstant(env, c, "ENOTCONN", ENOTCONN); - initConstant(env, c, "ENOTDIR", ENOTDIR); - initConstant(env, c, "ENOTEMPTY", ENOTEMPTY); - initConstant(env, c, "ENOTSOCK", ENOTSOCK); - initConstant(env, c, "ENOTSUP", ENOTSUP); - initConstant(env, c, "ENOTTY", ENOTTY); - initConstant(env, c, "ENXIO", ENXIO); - initConstant(env, c, "EOPNOTSUPP", EOPNOTSUPP); - initConstant(env, c, "EOVERFLOW", EOVERFLOW); - initConstant(env, c, "EPERM", EPERM); - initConstant(env, c, "EPIPE", EPIPE); - initConstant(env, c, "EPROTO", EPROTO); - initConstant(env, c, "EPROTONOSUPPORT", EPROTONOSUPPORT); - initConstant(env, c, "EPROTOTYPE", EPROTOTYPE); - initConstant(env, c, "ERANGE", ERANGE); - initConstant(env, c, "EROFS", EROFS); - initConstant(env, c, "ESPIPE", ESPIPE); - initConstant(env, c, "ESRCH", ESRCH); - initConstant(env, c, "ESTALE", ESTALE); - initConstant(env, c, "ETH_P_ALL", ETH_P_ALL); - initConstant(env, c, "ETH_P_ARP", ETH_P_ARP); - initConstant(env, c, "ETH_P_IP", ETH_P_IP); - initConstant(env, c, "ETH_P_IPV6", ETH_P_IPV6); - initConstant(env, c, "ETIME", ETIME); - initConstant(env, c, "ETIMEDOUT", ETIMEDOUT); - initConstant(env, c, "ETXTBSY", ETXTBSY); - initConstant(env, c, "EUSERS", EUSERS); -#if EWOULDBLOCK != EAGAIN -#error EWOULDBLOCK != EAGAIN -#endif - initConstant(env, c, "EXDEV", EXDEV); - initConstant(env, c, "EXIT_FAILURE", EXIT_FAILURE); - initConstant(env, c, "EXIT_SUCCESS", EXIT_SUCCESS); - initConstant(env, c, "FD_CLOEXEC", FD_CLOEXEC); - initConstant(env, c, "FIONREAD", FIONREAD); - initConstant(env, c, "F_DUPFD", F_DUPFD); - initConstant(env, c, "F_DUPFD_CLOEXEC", F_DUPFD_CLOEXEC); - initConstant(env, c, "F_GETFD", F_GETFD); - initConstant(env, c, "F_GETFL", F_GETFL); - initConstant(env, c, "F_GETLK", F_GETLK); -#if defined(F_GETLK64) - initConstant(env, c, "F_GETLK64", F_GETLK64); -#endif - initConstant(env, c, "F_GETOWN", F_GETOWN); - initConstant(env, c, "F_OK", F_OK); - initConstant(env, c, "F_RDLCK", F_RDLCK); - initConstant(env, c, "F_SETFD", F_SETFD); - initConstant(env, c, "F_SETFL", F_SETFL); - initConstant(env, c, "F_SETLK", F_SETLK); -#if defined(F_SETLK64) - initConstant(env, c, "F_SETLK64", F_SETLK64); -#endif - initConstant(env, c, "F_SETLKW", F_SETLKW); -#if defined(F_SETLKW64) - initConstant(env, c, "F_SETLKW64", F_SETLKW64); -#endif - initConstant(env, c, "F_SETOWN", F_SETOWN); - initConstant(env, c, "F_UNLCK", F_UNLCK); - initConstant(env, c, "F_WRLCK", F_WRLCK); - initConstant(env, c, "ICMP_ECHO", ICMP_ECHO); - initConstant(env, c, "ICMP_ECHOREPLY", ICMP_ECHOREPLY); - initConstant(env, c, "ICMP6_ECHO_REQUEST", ICMP6_ECHO_REQUEST); - initConstant(env, c, "ICMP6_ECHO_REPLY", ICMP6_ECHO_REPLY); -#if defined(IFA_F_DADFAILED) - initConstant(env, c, "IFA_F_DADFAILED", IFA_F_DADFAILED); -#endif -#if defined(IFA_F_DEPRECATED) - initConstant(env, c, "IFA_F_DEPRECATED", IFA_F_DEPRECATED); -#endif -#if defined(IFA_F_HOMEADDRESS) - initConstant(env, c, "IFA_F_HOMEADDRESS", IFA_F_HOMEADDRESS); -#endif -#if defined(IFA_F_MANAGETEMPADDR) - initConstant(env, c, "IFA_F_MANAGETEMPADDR", IFA_F_MANAGETEMPADDR); -#endif -#if defined(IFA_F_NODAD) - initConstant(env, c, "IFA_F_NODAD", IFA_F_NODAD); -#endif -#if defined(IFA_F_NOPREFIXROUTE) - initConstant(env, c, "IFA_F_NOPREFIXROUTE", IFA_F_NOPREFIXROUTE); -#endif -#if defined(IFA_F_OPTIMISTIC) - initConstant(env, c, "IFA_F_OPTIMISTIC", IFA_F_OPTIMISTIC); -#endif -#if defined(IFA_F_PERMANENT) - initConstant(env, c, "IFA_F_PERMANENT", IFA_F_PERMANENT); -#endif -#if defined(IFA_F_SECONDARY) - initConstant(env, c, "IFA_F_SECONDARY", IFA_F_SECONDARY); -#endif -#if defined(IFA_F_TEMPORARY) - initConstant(env, c, "IFA_F_TEMPORARY", IFA_F_TEMPORARY); -#endif -#if defined(IFA_F_TENTATIVE) - initConstant(env, c, "IFA_F_TENTATIVE", IFA_F_TENTATIVE); -#endif - initConstant(env, c, "IFF_ALLMULTI", IFF_ALLMULTI); -#if defined(IFF_AUTOMEDIA) - initConstant(env, c, "IFF_AUTOMEDIA", IFF_AUTOMEDIA); -#endif - initConstant(env, c, "IFF_BROADCAST", IFF_BROADCAST); - initConstant(env, c, "IFF_DEBUG", IFF_DEBUG); -#if defined(IFF_DYNAMIC) - initConstant(env, c, "IFF_DYNAMIC", IFF_DYNAMIC); -#endif - initConstant(env, c, "IFF_LOOPBACK", IFF_LOOPBACK); -#if defined(IFF_MASTER) - initConstant(env, c, "IFF_MASTER", IFF_MASTER); -#endif - initConstant(env, c, "IFF_MULTICAST", IFF_MULTICAST); - initConstant(env, c, "IFF_NOARP", IFF_NOARP); - initConstant(env, c, "IFF_NOTRAILERS", IFF_NOTRAILERS); - initConstant(env, c, "IFF_POINTOPOINT", IFF_POINTOPOINT); -#if defined(IFF_PORTSEL) - initConstant(env, c, "IFF_PORTSEL", IFF_PORTSEL); -#endif - initConstant(env, c, "IFF_PROMISC", IFF_PROMISC); - initConstant(env, c, "IFF_RUNNING", IFF_RUNNING); -#if defined(IFF_SLAVE) - initConstant(env, c, "IFF_SLAVE", IFF_SLAVE); -#endif - initConstant(env, c, "IFF_UP", IFF_UP); - initConstant(env, c, "IPPROTO_ICMP", IPPROTO_ICMP); - initConstant(env, c, "IPPROTO_ICMPV6", IPPROTO_ICMPV6); - initConstant(env, c, "IPPROTO_IP", IPPROTO_IP); - initConstant(env, c, "IPPROTO_IPV6", IPPROTO_IPV6); - initConstant(env, c, "IPPROTO_RAW", IPPROTO_RAW); - initConstant(env, c, "IPPROTO_TCP", IPPROTO_TCP); - initConstant(env, c, "IPPROTO_UDP", IPPROTO_UDP); - initConstant(env, c, "IPPROTO_ESP", IPPROTO_ESP); - initConstant(env, c, "IPV6_CHECKSUM", IPV6_CHECKSUM); - initConstant(env, c, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS); - initConstant(env, c, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF); - initConstant(env, c, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP); -#if defined(IPV6_PKTINFO) - initConstant(env, c, "IPV6_PKTINFO", IPV6_PKTINFO); -#endif -#if defined(IPV6_RECVDSTOPTS) - initConstant(env, c, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS); -#endif -#if defined(IPV6_RECVHOPLIMIT) - initConstant(env, c, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT); -#endif -#if defined(IPV6_RECVHOPOPTS) - initConstant(env, c, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS); -#endif -#if defined(IPV6_RECVPKTINFO) - initConstant(env, c, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO); -#endif -#if defined(IPV6_RECVRTHDR) - initConstant(env, c, "IPV6_RECVRTHDR", IPV6_RECVRTHDR); -#endif -#if defined(IPV6_RECVTCLASS) - initConstant(env, c, "IPV6_RECVTCLASS", IPV6_RECVTCLASS); -#endif -#if defined(IPV6_TCLASS) - initConstant(env, c, "IPV6_TCLASS", IPV6_TCLASS); -#endif - initConstant(env, c, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS); - initConstant(env, c, "IPV6_V6ONLY", IPV6_V6ONLY); - initConstant(env, c, "IP_MULTICAST_ALL", IP_MULTICAST_ALL); - initConstant(env, c, "IP_MULTICAST_IF", IP_MULTICAST_IF); - initConstant(env, c, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP); - initConstant(env, c, "IP_MULTICAST_TTL", IP_MULTICAST_TTL); - initConstant(env, c, "IP_RECVTOS", IP_RECVTOS); - initConstant(env, c, "IP_TOS", IP_TOS); - initConstant(env, c, "IP_TTL", IP_TTL); -#if defined(_LINUX_CAPABILITY_VERSION_3) - initConstant(env, c, "_LINUX_CAPABILITY_VERSION_3", _LINUX_CAPABILITY_VERSION_3); -#endif - initConstant(env, c, "MAP_FIXED", MAP_FIXED); - initConstant(env, c, "MAP_ANONYMOUS", MAP_ANONYMOUS); - initConstant(env, c, "MAP_POPULATE", MAP_POPULATE); - initConstant(env, c, "MAP_PRIVATE", MAP_PRIVATE); - initConstant(env, c, "MAP_SHARED", MAP_SHARED); -#if defined(MCAST_JOIN_GROUP) - initConstant(env, c, "MCAST_JOIN_GROUP", MCAST_JOIN_GROUP); -#endif -#if defined(MCAST_LEAVE_GROUP) - initConstant(env, c, "MCAST_LEAVE_GROUP", MCAST_LEAVE_GROUP); -#endif -#if defined(MCAST_JOIN_SOURCE_GROUP) - initConstant(env, c, "MCAST_JOIN_SOURCE_GROUP", MCAST_JOIN_SOURCE_GROUP); -#endif -#if defined(MCAST_LEAVE_SOURCE_GROUP) - initConstant(env, c, "MCAST_LEAVE_SOURCE_GROUP", MCAST_LEAVE_SOURCE_GROUP); -#endif -#if defined(MCAST_BLOCK_SOURCE) - initConstant(env, c, "MCAST_BLOCK_SOURCE", MCAST_BLOCK_SOURCE); -#endif -#if defined(MCAST_UNBLOCK_SOURCE) - initConstant(env, c, "MCAST_UNBLOCK_SOURCE", MCAST_UNBLOCK_SOURCE); -#endif - initConstant(env, c, "MCL_CURRENT", MCL_CURRENT); - initConstant(env, c, "MCL_FUTURE", MCL_FUTURE); -#if defined(MFD_CLOEXEC) - initConstant(env, c, "MFD_CLOEXEC", MFD_CLOEXEC); -#endif - initConstant(env, c, "MSG_CTRUNC", MSG_CTRUNC); - initConstant(env, c, "MSG_DONTROUTE", MSG_DONTROUTE); - initConstant(env, c, "MSG_EOR", MSG_EOR); - initConstant(env, c, "MSG_OOB", MSG_OOB); - initConstant(env, c, "MSG_PEEK", MSG_PEEK); - initConstant(env, c, "MSG_TRUNC", MSG_TRUNC); - initConstant(env, c, "MSG_WAITALL", MSG_WAITALL); - initConstant(env, c, "MS_ASYNC", MS_ASYNC); - initConstant(env, c, "MS_INVALIDATE", MS_INVALIDATE); - initConstant(env, c, "MS_SYNC", MS_SYNC); - initConstant(env, c, "NETLINK_NETFILTER", NETLINK_NETFILTER); - initConstant(env, c, "NETLINK_ROUTE", NETLINK_ROUTE); - initConstant(env, c, "NETLINK_INET_DIAG", NETLINK_INET_DIAG); - initConstant(env, c, "NETLINK_XFRM", NETLINK_XFRM); - initConstant(env, c, "NI_DGRAM", NI_DGRAM); - initConstant(env, c, "NI_NAMEREQD", NI_NAMEREQD); - initConstant(env, c, "NI_NOFQDN", NI_NOFQDN); - initConstant(env, c, "NI_NUMERICHOST", NI_NUMERICHOST); - initConstant(env, c, "NI_NUMERICSERV", NI_NUMERICSERV); - initConstant(env, c, "O_ACCMODE", O_ACCMODE); - initConstant(env, c, "O_APPEND", O_APPEND); - initConstant(env, c, "O_CLOEXEC", O_CLOEXEC); - initConstant(env, c, "O_CREAT", O_CREAT); - initConstant(env, c, "O_DIRECT", O_DIRECT); - initConstant(env, c, "O_EXCL", O_EXCL); - initConstant(env, c, "O_NOCTTY", O_NOCTTY); - initConstant(env, c, "O_NOFOLLOW", O_NOFOLLOW); - initConstant(env, c, "O_NONBLOCK", O_NONBLOCK); - initConstant(env, c, "O_RDONLY", O_RDONLY); - initConstant(env, c, "O_RDWR", O_RDWR); - initConstant(env, c, "O_SYNC", O_SYNC); - initConstant(env, c, "O_DSYNC", O_DSYNC); - initConstant(env, c, "O_TRUNC", O_TRUNC); - initConstant(env, c, "O_WRONLY", O_WRONLY); - initConstant(env, c, "POLLERR", POLLERR); - initConstant(env, c, "POLLHUP", POLLHUP); - initConstant(env, c, "POLLIN", POLLIN); - initConstant(env, c, "POLLNVAL", POLLNVAL); - initConstant(env, c, "POLLOUT", POLLOUT); - initConstant(env, c, "POLLPRI", POLLPRI); - initConstant(env, c, "POLLRDBAND", POLLRDBAND); - initConstant(env, c, "POLLRDNORM", POLLRDNORM); - initConstant(env, c, "POLLWRBAND", POLLWRBAND); - initConstant(env, c, "POLLWRNORM", POLLWRNORM); -#if defined(PR_CAP_AMBIENT) - initConstant(env, c, "PR_CAP_AMBIENT", PR_CAP_AMBIENT); -#endif -#if defined(PR_CAP_AMBIENT_RAISE) - initConstant(env, c, "PR_CAP_AMBIENT_RAISE", PR_CAP_AMBIENT_RAISE); -#endif -#if defined(PR_GET_DUMPABLE) - initConstant(env, c, "PR_GET_DUMPABLE", PR_GET_DUMPABLE); -#endif -#if defined(PR_SET_DUMPABLE) - initConstant(env, c, "PR_SET_DUMPABLE", PR_SET_DUMPABLE); -#endif -#if defined(PR_SET_NO_NEW_PRIVS) - initConstant(env, c, "PR_SET_NO_NEW_PRIVS", PR_SET_NO_NEW_PRIVS); -#endif - initConstant(env, c, "PROT_EXEC", PROT_EXEC); - initConstant(env, c, "PROT_NONE", PROT_NONE); - initConstant(env, c, "PROT_READ", PROT_READ); - initConstant(env, c, "PROT_WRITE", PROT_WRITE); - initConstant(env, c, "R_OK", R_OK); - initConstant(env, c, "RLIMIT_NOFILE", RLIMIT_NOFILE); -// NOTE: The RT_* constants are not preprocessor defines, they're enum -// members. The best we can do (barring UAPI / kernel version checks) is -// to hope they exist on all host linuxes we're building on. These -// constants have been around since 2.6.35 at least, so we should be ok. - initConstant(env, c, "RT_SCOPE_HOST", RT_SCOPE_HOST); - initConstant(env, c, "RT_SCOPE_LINK", RT_SCOPE_LINK); - initConstant(env, c, "RT_SCOPE_NOWHERE", RT_SCOPE_NOWHERE); - initConstant(env, c, "RT_SCOPE_SITE", RT_SCOPE_SITE); - initConstant(env, c, "RT_SCOPE_UNIVERSE", RT_SCOPE_UNIVERSE); - initConstant(env, c, "RTMGRP_IPV4_IFADDR", RTMGRP_IPV4_IFADDR); - initConstant(env, c, "RTMGRP_IPV4_MROUTE", RTMGRP_IPV4_MROUTE); - initConstant(env, c, "RTMGRP_IPV4_ROUTE", RTMGRP_IPV4_ROUTE); - initConstant(env, c, "RTMGRP_IPV4_RULE", RTMGRP_IPV4_RULE); - initConstant(env, c, "RTMGRP_IPV6_IFADDR", RTMGRP_IPV6_IFADDR); - initConstant(env, c, "RTMGRP_IPV6_IFINFO", RTMGRP_IPV6_IFINFO); - initConstant(env, c, "RTMGRP_IPV6_MROUTE", RTMGRP_IPV6_MROUTE); - initConstant(env, c, "RTMGRP_IPV6_PREFIX", RTMGRP_IPV6_PREFIX); - initConstant(env, c, "RTMGRP_IPV6_ROUTE", RTMGRP_IPV6_ROUTE); - initConstant(env, c, "RTMGRP_LINK", RTMGRP_LINK); - initConstant(env, c, "RTMGRP_NEIGH", RTMGRP_NEIGH); - initConstant(env, c, "RTMGRP_NOTIFY", RTMGRP_NOTIFY); - initConstant(env, c, "RTMGRP_TC", RTMGRP_TC); - initConstant(env, c, "SEEK_CUR", SEEK_CUR); - initConstant(env, c, "SEEK_END", SEEK_END); - initConstant(env, c, "SEEK_SET", SEEK_SET); - initConstant(env, c, "SHUT_RD", SHUT_RD); - initConstant(env, c, "SHUT_RDWR", SHUT_RDWR); - initConstant(env, c, "SHUT_WR", SHUT_WR); - initConstant(env, c, "SIGABRT", SIGABRT); - initConstant(env, c, "SIGALRM", SIGALRM); - initConstant(env, c, "SIGBUS", SIGBUS); - initConstant(env, c, "SIGCHLD", SIGCHLD); - initConstant(env, c, "SIGCONT", SIGCONT); - initConstant(env, c, "SIGFPE", SIGFPE); - initConstant(env, c, "SIGHUP", SIGHUP); - initConstant(env, c, "SIGILL", SIGILL); - initConstant(env, c, "SIGINT", SIGINT); - initConstant(env, c, "SIGIO", SIGIO); - initConstant(env, c, "SIGKILL", SIGKILL); - initConstant(env, c, "SIGPIPE", SIGPIPE); - initConstant(env, c, "SIGPROF", SIGPROF); -#if defined(SIGPWR) - initConstant(env, c, "SIGPWR", SIGPWR); -#endif - initConstant(env, c, "SIGQUIT", SIGQUIT); -#if defined(SIGRTMAX) - initConstant(env, c, "SIGRTMAX", SIGRTMAX); -#endif -#if defined(SIGRTMIN) - initConstant(env, c, "SIGRTMIN", SIGRTMIN); -#endif - initConstant(env, c, "SIGSEGV", SIGSEGV); -#if defined(SIGSTKFLT) - initConstant(env, c, "SIGSTKFLT", SIGSTKFLT); -#endif - initConstant(env, c, "SIGSTOP", SIGSTOP); - initConstant(env, c, "SIGSYS", SIGSYS); - initConstant(env, c, "SIGTERM", SIGTERM); - initConstant(env, c, "SIGTRAP", SIGTRAP); - initConstant(env, c, "SIGTSTP", SIGTSTP); - initConstant(env, c, "SIGTTIN", SIGTTIN); - initConstant(env, c, "SIGTTOU", SIGTTOU); - initConstant(env, c, "SIGURG", SIGURG); - initConstant(env, c, "SIGUSR1", SIGUSR1); - initConstant(env, c, "SIGUSR2", SIGUSR2); - initConstant(env, c, "SIGVTALRM", SIGVTALRM); - initConstant(env, c, "SIGWINCH", SIGWINCH); - initConstant(env, c, "SIGXCPU", SIGXCPU); - initConstant(env, c, "SIGXFSZ", SIGXFSZ); - initConstant(env, c, "SIOCGIFADDR", SIOCGIFADDR); - initConstant(env, c, "SIOCGIFBRDADDR", SIOCGIFBRDADDR); - initConstant(env, c, "SIOCGIFDSTADDR", SIOCGIFDSTADDR); - initConstant(env, c, "SIOCGIFNETMASK", SIOCGIFNETMASK); - initConstant(env, c, "SOCK_CLOEXEC", SOCK_CLOEXEC); - initConstant(env, c, "SOCK_DGRAM", SOCK_DGRAM); - initConstant(env, c, "SOCK_NONBLOCK", SOCK_NONBLOCK); - initConstant(env, c, "SOCK_RAW", SOCK_RAW); - initConstant(env, c, "SOCK_SEQPACKET", SOCK_SEQPACKET); - initConstant(env, c, "SOCK_STREAM", SOCK_STREAM); - initConstant(env, c, "SOL_SOCKET", SOL_SOCKET); -#if defined(SOL_UDP) - initConstant(env, c, "SOL_UDP", SOL_UDP); -#endif - initConstant(env, c, "SOL_PACKET", SOL_PACKET); -#if defined(SO_BINDTODEVICE) - initConstant(env, c, "SO_BINDTODEVICE", SO_BINDTODEVICE); -#endif - initConstant(env, c, "SO_BROADCAST", SO_BROADCAST); - initConstant(env, c, "SO_DEBUG", SO_DEBUG); -#if defined(SO_DOMAIN) - initConstant(env, c, "SO_DOMAIN", SO_DOMAIN); -#endif - initConstant(env, c, "SO_DONTROUTE", SO_DONTROUTE); - initConstant(env, c, "SO_ERROR", SO_ERROR); - initConstant(env, c, "SO_KEEPALIVE", SO_KEEPALIVE); - initConstant(env, c, "SO_LINGER", SO_LINGER); - initConstant(env, c, "SO_OOBINLINE", SO_OOBINLINE); -#if defined(SO_PASSCRED) - initConstant(env, c, "SO_PASSCRED", SO_PASSCRED); -#endif -#if defined(SO_PEERCRED) - initConstant(env, c, "SO_PEERCRED", SO_PEERCRED); -#endif -#if defined(SO_PROTOCOL) - initConstant(env, c, "SO_PROTOCOL", SO_PROTOCOL); -#endif - initConstant(env, c, "SO_RCVBUF", SO_RCVBUF); - initConstant(env, c, "SO_RCVLOWAT", SO_RCVLOWAT); - initConstant(env, c, "SO_RCVTIMEO", SO_RCVTIMEO); - initConstant(env, c, "SO_REUSEADDR", SO_REUSEADDR); - initConstant(env, c, "SO_SNDBUF", SO_SNDBUF); - initConstant(env, c, "SO_SNDLOWAT", SO_SNDLOWAT); - initConstant(env, c, "SO_SNDTIMEO", SO_SNDTIMEO); - initConstant(env, c, "SO_TYPE", SO_TYPE); -#if defined(PACKET_IGNORE_OUTGOING) - initConstant(env, c, "PACKET_IGNORE_OUTGOING", PACKET_IGNORE_OUTGOING); -#endif - initConstant(env, c, "SPLICE_F_MOVE", SPLICE_F_MOVE); - initConstant(env, c, "SPLICE_F_NONBLOCK", SPLICE_F_NONBLOCK); - initConstant(env, c, "SPLICE_F_MORE", SPLICE_F_MORE); - initConstant(env, c, "STDERR_FILENO", STDERR_FILENO); - initConstant(env, c, "STDIN_FILENO", STDIN_FILENO); - initConstant(env, c, "STDOUT_FILENO", STDOUT_FILENO); - initConstant(env, c, "ST_MANDLOCK", ST_MANDLOCK); - initConstant(env, c, "ST_NOATIME", ST_NOATIME); - initConstant(env, c, "ST_NODEV", ST_NODEV); - initConstant(env, c, "ST_NODIRATIME", ST_NODIRATIME); - initConstant(env, c, "ST_NOEXEC", ST_NOEXEC); - initConstant(env, c, "ST_NOSUID", ST_NOSUID); - initConstant(env, c, "ST_RDONLY", ST_RDONLY); - initConstant(env, c, "ST_RELATIME", ST_RELATIME); - initConstant(env, c, "ST_SYNCHRONOUS", ST_SYNCHRONOUS); - initConstant(env, c, "S_IFBLK", S_IFBLK); - initConstant(env, c, "S_IFCHR", S_IFCHR); - initConstant(env, c, "S_IFDIR", S_IFDIR); - initConstant(env, c, "S_IFIFO", S_IFIFO); - initConstant(env, c, "S_IFLNK", S_IFLNK); - initConstant(env, c, "S_IFMT", S_IFMT); - initConstant(env, c, "S_IFREG", S_IFREG); - initConstant(env, c, "S_IFSOCK", S_IFSOCK); - initConstant(env, c, "S_IRGRP", S_IRGRP); - initConstant(env, c, "S_IROTH", S_IROTH); - initConstant(env, c, "S_IRUSR", S_IRUSR); - initConstant(env, c, "S_IRWXG", S_IRWXG); - initConstant(env, c, "S_IRWXO", S_IRWXO); - initConstant(env, c, "S_IRWXU", S_IRWXU); - initConstant(env, c, "S_ISGID", S_ISGID); - initConstant(env, c, "S_ISUID", S_ISUID); - initConstant(env, c, "S_ISVTX", S_ISVTX); - initConstant(env, c, "S_IWGRP", S_IWGRP); - initConstant(env, c, "S_IWOTH", S_IWOTH); - initConstant(env, c, "S_IWUSR", S_IWUSR); - initConstant(env, c, "S_IXGRP", S_IXGRP); - initConstant(env, c, "S_IXOTH", S_IXOTH); - initConstant(env, c, "S_IXUSR", S_IXUSR); - initConstant(env, c, "TCP_NODELAY", TCP_NODELAY); -#if defined(TCP_USER_TIMEOUT) - initConstant(env, c, "TCP_USER_TIMEOUT", TCP_USER_TIMEOUT); -#endif - initConstant(env, c, "TIOCOUTQ", TIOCOUTQ); - initConstant(env, c, "UDP_ENCAP", UDP_ENCAP); - initConstant(env, c, "UDP_ENCAP_ESPINUDP_NON_IKE", UDP_ENCAP_ESPINUDP_NON_IKE); - initConstant(env, c, "UDP_ENCAP_ESPINUDP", UDP_ENCAP_ESPINUDP); -#if defined(UDP_GRO) - initConstant(env, c, "UDP_GRO", UDP_GRO); -#endif -#if defined(UDP_SEGMENT) - initConstant(env, c, "UDP_SEGMENT", UDP_SEGMENT); -#endif - // UNIX_PATH_MAX is mentioned in some versions of unix(7), but not actually declared. - initConstant(env, c, "UNIX_PATH_MAX", sizeof(sockaddr_un::sun_path)); - initConstant(env, c, "WCONTINUED", WCONTINUED); - initConstant(env, c, "WEXITED", WEXITED); - initConstant(env, c, "WNOHANG", WNOHANG); - initConstant(env, c, "WNOWAIT", WNOWAIT); - initConstant(env, c, "WSTOPPED", WSTOPPED); - initConstant(env, c, "WUNTRACED", WUNTRACED); - initConstant(env, c, "W_OK", W_OK); - initConstant(env, c, "XATTR_CREATE", XATTR_CREATE); - initConstant(env, c, "XATTR_REPLACE", XATTR_REPLACE); - initConstant(env, c, "X_OK", X_OK); - initConstant(env, c, "_SC_2_CHAR_TERM", _SC_2_CHAR_TERM); - initConstant(env, c, "_SC_2_C_BIND", _SC_2_C_BIND); - initConstant(env, c, "_SC_2_C_DEV", _SC_2_C_DEV); -#if defined(_SC_2_C_VERSION) - initConstant(env, c, "_SC_2_C_VERSION", _SC_2_C_VERSION); -#endif - initConstant(env, c, "_SC_2_FORT_DEV", _SC_2_FORT_DEV); - initConstant(env, c, "_SC_2_FORT_RUN", _SC_2_FORT_RUN); - initConstant(env, c, "_SC_2_LOCALEDEF", _SC_2_LOCALEDEF); - initConstant(env, c, "_SC_2_SW_DEV", _SC_2_SW_DEV); - initConstant(env, c, "_SC_2_UPE", _SC_2_UPE); - initConstant(env, c, "_SC_2_VERSION", _SC_2_VERSION); - initConstant(env, c, "_SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX); - initConstant(env, c, "_SC_AIO_MAX", _SC_AIO_MAX); - initConstant(env, c, "_SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX); - initConstant(env, c, "_SC_ARG_MAX", _SC_ARG_MAX); - initConstant(env, c, "_SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO); - initConstant(env, c, "_SC_ATEXIT_MAX", _SC_ATEXIT_MAX); -#if defined(_SC_AVPHYS_PAGES) - initConstant(env, c, "_SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES); -#endif - initConstant(env, c, "_SC_BC_BASE_MAX", _SC_BC_BASE_MAX); - initConstant(env, c, "_SC_BC_DIM_MAX", _SC_BC_DIM_MAX); - initConstant(env, c, "_SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX); - initConstant(env, c, "_SC_BC_STRING_MAX", _SC_BC_STRING_MAX); - initConstant(env, c, "_SC_CHILD_MAX", _SC_CHILD_MAX); - initConstant(env, c, "_SC_CLK_TCK", _SC_CLK_TCK); - initConstant(env, c, "_SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX); - initConstant(env, c, "_SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX); - initConstant(env, c, "_SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX); - initConstant(env, c, "_SC_FSYNC", _SC_FSYNC); - initConstant(env, c, "_SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX); - initConstant(env, c, "_SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX); - initConstant(env, c, "_SC_IOV_MAX", _SC_IOV_MAX); - initConstant(env, c, "_SC_JOB_CONTROL", _SC_JOB_CONTROL); - initConstant(env, c, "_SC_LINE_MAX", _SC_LINE_MAX); - initConstant(env, c, "_SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX); - initConstant(env, c, "_SC_MAPPED_FILES", _SC_MAPPED_FILES); - initConstant(env, c, "_SC_MEMLOCK", _SC_MEMLOCK); - initConstant(env, c, "_SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE); - initConstant(env, c, "_SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION); - initConstant(env, c, "_SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING); - initConstant(env, c, "_SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX); - initConstant(env, c, "_SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX); - initConstant(env, c, "_SC_NGROUPS_MAX", _SC_NGROUPS_MAX); - initConstant(env, c, "_SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF); - initConstant(env, c, "_SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN); - initConstant(env, c, "_SC_OPEN_MAX", _SC_OPEN_MAX); - initConstant(env, c, "_SC_PAGESIZE", _SC_PAGESIZE); - initConstant(env, c, "_SC_PAGE_SIZE", _SC_PAGE_SIZE); - initConstant(env, c, "_SC_PASS_MAX", _SC_PASS_MAX); -#if defined(_SC_PHYS_PAGES) - initConstant(env, c, "_SC_PHYS_PAGES", _SC_PHYS_PAGES); -#endif - initConstant(env, c, "_SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO); - initConstant(env, c, "_SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING); - initConstant(env, c, "_SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS); - initConstant(env, c, "_SC_RE_DUP_MAX", _SC_RE_DUP_MAX); - initConstant(env, c, "_SC_RTSIG_MAX", _SC_RTSIG_MAX); - initConstant(env, c, "_SC_SAVED_IDS", _SC_SAVED_IDS); - initConstant(env, c, "_SC_SEMAPHORES", _SC_SEMAPHORES); - initConstant(env, c, "_SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX); - initConstant(env, c, "_SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX); - initConstant(env, c, "_SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS); - initConstant(env, c, "_SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX); - initConstant(env, c, "_SC_STREAM_MAX", _SC_STREAM_MAX); - initConstant(env, c, "_SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO); - initConstant(env, c, "_SC_THREADS", _SC_THREADS); - initConstant(env, c, "_SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR); - initConstant(env, c, "_SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE); - initConstant(env, c, "_SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS); - initConstant(env, c, "_SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX); - initConstant(env, c, "_SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING); - initConstant(env, c, "_SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT); - initConstant(env, c, "_SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT); - initConstant(env, c, "_SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS); - initConstant(env, c, "_SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN); - initConstant(env, c, "_SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX); - initConstant(env, c, "_SC_TIMERS", _SC_TIMERS); - initConstant(env, c, "_SC_TIMER_MAX", _SC_TIMER_MAX); - initConstant(env, c, "_SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX); - initConstant(env, c, "_SC_TZNAME_MAX", _SC_TZNAME_MAX); - initConstant(env, c, "_SC_VERSION", _SC_VERSION); - initConstant(env, c, "_SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32); - initConstant(env, c, "_SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG); - initConstant(env, c, "_SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64); - initConstant(env, c, "_SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG); - initConstant(env, c, "_SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT); - initConstant(env, c, "_SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N); - initConstant(env, c, "_SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY); - initConstant(env, c, "_SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME); - initConstant(env, c, "_SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS); - initConstant(env, c, "_SC_XOPEN_SHM", _SC_XOPEN_SHM); - initConstant(env, c, "_SC_XOPEN_UNIX", _SC_XOPEN_UNIX); - initConstant(env, c, "_SC_XOPEN_VERSION", _SC_XOPEN_VERSION); - initConstant(env, c, "_SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION); -} - -static JNINativeMethod gMethods[] = { - NATIVE_METHOD(OsConstants, initConstants, "()V"), -}; - -void register_android_system_OsConstants(JNIEnv* env) { - // [ravenwood-change] -- method moved to the nested class - jniRegisterNativeMethods(env, "android/system/OsConstants$Native", gMethods, NELEM(gMethods)); -} diff --git a/ravenwood/runtime-jni/ravenwood_runtime.cpp b/ravenwood/runtime-jni/ravenwood_runtime.cpp deleted file mode 100644 index 34cf9f915677..000000000000 --- a/ravenwood/runtime-jni/ravenwood_runtime.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <fcntl.h> -#include <sys/stat.h> -#include <string.h> -#include <unistd.h> -#include <nativehelper/JNIHelp.h> -#include "jni.h" -#include "utils/Log.h" -#include "utils/misc.h" - -// Defined in ravenwood_os_constants.cpp -void register_android_system_OsConstants(JNIEnv* env); - -// ---- Exception related ---- - -static void throwErrnoException(JNIEnv* env, const char* functionName) { - int error = errno; - jniThrowErrnoException(env, functionName, error); -} - -template <typename rc_t> -static rc_t throwIfMinusOne(JNIEnv* env, const char* name, rc_t rc) { - if (rc == rc_t(-1)) { - throwErrnoException(env, name); - } - return rc; -} - -// ---- JNI methods ---- - -typedef void (*FreeFunction)(void*); - -static void nApplyFreeFunction(JNIEnv*, jclass, jlong freeFunction, jlong ptr) { - void* nativePtr = reinterpret_cast<void*>(static_cast<uintptr_t>(ptr)); - FreeFunction nativeFreeFunction - = reinterpret_cast<FreeFunction>(static_cast<uintptr_t>(freeFunction)); - nativeFreeFunction(nativePtr); -} - -static jint nFcntlInt(JNIEnv* env, jclass, jint fd, jint cmd, jint arg) { - return throwIfMinusOne(env, "fcntl", TEMP_FAILURE_RETRY(fcntl(fd, cmd, arg))); -} - -static jlong nLseek(JNIEnv* env, jclass, jint fd, jlong offset, jint whence) { - return throwIfMinusOne(env, "lseek", TEMP_FAILURE_RETRY(lseek(fd, offset, whence))); -} - -static jintArray nPipe2(JNIEnv* env, jclass, jint flags) { - int fds[2]; - throwIfMinusOne(env, "pipe2", TEMP_FAILURE_RETRY(pipe2(fds, flags))); - - jintArray result; - result = env->NewIntArray(2); - if (result == NULL) { - return NULL; /* out of memory error thrown */ - } - env->SetIntArrayRegion(result, 0, 2, fds); - return result; -} - -static jlong nDup(JNIEnv* env, jclass, jint fd) { - return throwIfMinusOne(env, "fcntl", TEMP_FAILURE_RETRY(fcntl(fd, F_DUPFD_CLOEXEC, 0))); -} - -// ---- Registration ---- - -static const JNINativeMethod sMethods[] = -{ - { "applyFreeFunction", "(JJ)V", (void*)nApplyFreeFunction }, - { "nFcntlInt", "(III)I", (void*)nFcntlInt }, - { "nLseek", "(IJI)J", (void*)nLseek }, - { "nPipe2", "(I)[I", (void*)nPipe2 }, - { "nDup", "(I)I", (void*)nDup }, -}; - -extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) -{ - JNIEnv* env = NULL; - jint result = -1; - - if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { - ALOGE("GetEnv failed!"); - return result; - } - ALOG_ASSERT(env, "Could not retrieve the env!"); - - ALOGI("%s: JNI_OnLoad", __FILE__); - - jint res = jniRegisterNativeMethods(env, "com/android/ravenwood/common/RavenwoodRuntimeNative", - sMethods, NELEM(sMethods)); - if (res < 0) { - return res; - } - - register_android_system_OsConstants(env); - - return JNI_VERSION_1_4; -} diff --git a/ravenwood/runtime-test/Android.bp b/ravenwood/runtime-test/Android.bp deleted file mode 100644 index 410292001670..000000000000 --- a/ravenwood/runtime-test/Android.bp +++ /dev/null @@ -1,23 +0,0 @@ -package { - // See: http://go/android-license-faq - // A large-scale-change added 'default_applicable_licenses' to import - // all of the 'license_kinds' from "frameworks_base_license" - // to get the below license kinds: - // SPDX-license-identifier-Apache-2.0 - default_applicable_licenses: ["frameworks_base_license"], -} - -android_ravenwood_test { - name: "RavenwoodRuntimeTest", - - static_libs: [ - "androidx.annotation_annotation", - "androidx.test.ext.junit", - "androidx.test.rules", - ], - srcs: [ - "test/**/*.java", - ], - // sdk_version: "module_current", - auto_gen_config: true, -} diff --git a/ravenwood/runtime-test/test/com/android/ravenwood/runtimetest/OsConstantsTest.java b/ravenwood/runtime-test/test/com/android/ravenwood/runtimetest/OsConstantsTest.java deleted file mode 100644 index 3332e24ea013..000000000000 --- a/ravenwood/runtime-test/test/com/android/ravenwood/runtimetest/OsConstantsTest.java +++ /dev/null @@ -1,444 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.ravenwood.runtimetest; - -// Copied from libcore/luni/src/test/java/libcore/android/system/OsConstantsTest.java - -import static android.system.OsConstants.CAP_TO_INDEX; -import static android.system.OsConstants.CAP_TO_MASK; -import static android.system.OsConstants.S_ISBLK; -import static android.system.OsConstants.S_ISCHR; -import static android.system.OsConstants.S_ISDIR; -import static android.system.OsConstants.S_ISFIFO; -import static android.system.OsConstants.S_ISLNK; -import static android.system.OsConstants.S_ISREG; -import static android.system.OsConstants.S_ISSOCK; -import static android.system.OsConstants.WCOREDUMP; -import static android.system.OsConstants.WEXITSTATUS; -import static android.system.OsConstants.WIFEXITED; -import static android.system.OsConstants.WIFSIGNALED; -import static android.system.OsConstants.WIFSTOPPED; -import static android.system.OsConstants.WSTOPSIG; -import static android.system.OsConstants.WTERMSIG; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import android.system.OsConstants; - -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -public class OsConstantsTest { - - // http://b/15602893 - @Test - public void testBug15602893() { - assertTrue(OsConstants.RT_SCOPE_HOST > 0); - assertTrue(OsConstants.RT_SCOPE_LINK > 0); - assertTrue(OsConstants.RT_SCOPE_SITE > 0); - - assertTrue(OsConstants.IFA_F_TENTATIVE > 0); - } - - // introduced for http://b/30402085 - @Test - public void testTcpUserTimeoutIsDefined() { - assertTrue(OsConstants.TCP_USER_TIMEOUT > 0); - } - - /** - * Verifies equality assertions given in the documentation for - * {@link OsConstants#SOCK_CLOEXEC} and {@link OsConstants#SOCK_NONBLOCK}. - */ - @Test - public void testConstantsEqual() { - assertEquals(OsConstants.O_CLOEXEC, OsConstants.SOCK_CLOEXEC); - assertEquals(OsConstants.O_NONBLOCK, OsConstants.SOCK_NONBLOCK); - } - - @Test - public void test_CAP_constants() { - assertEquals(0, OsConstants.CAP_CHOWN); - assertEquals(1, OsConstants.CAP_DAC_OVERRIDE); - assertEquals(2, OsConstants.CAP_DAC_READ_SEARCH); - assertEquals(3, OsConstants.CAP_FOWNER); - assertEquals(4, OsConstants.CAP_FSETID); - assertEquals(5, OsConstants.CAP_KILL); - assertEquals(6, OsConstants.CAP_SETGID); - assertEquals(7, OsConstants.CAP_SETUID); - assertEquals(8, OsConstants.CAP_SETPCAP); - assertEquals(9, OsConstants.CAP_LINUX_IMMUTABLE); - assertEquals(10, OsConstants.CAP_NET_BIND_SERVICE); - assertEquals(11, OsConstants.CAP_NET_BROADCAST); - assertEquals(12, OsConstants.CAP_NET_ADMIN); - assertEquals(13, OsConstants.CAP_NET_RAW); - assertEquals(14, OsConstants.CAP_IPC_LOCK); - assertEquals(15, OsConstants.CAP_IPC_OWNER); - assertEquals(16, OsConstants.CAP_SYS_MODULE); - assertEquals(17, OsConstants.CAP_SYS_RAWIO); - assertEquals(18, OsConstants.CAP_SYS_CHROOT); - assertEquals(19, OsConstants.CAP_SYS_PTRACE); - assertEquals(20, OsConstants.CAP_SYS_PACCT); - assertEquals(21, OsConstants.CAP_SYS_ADMIN); - assertEquals(22, OsConstants.CAP_SYS_BOOT); - assertEquals(23, OsConstants.CAP_SYS_NICE); - assertEquals(24, OsConstants.CAP_SYS_RESOURCE); - assertEquals(25, OsConstants.CAP_SYS_TIME); - assertEquals(26, OsConstants.CAP_SYS_TTY_CONFIG); - assertEquals(27, OsConstants.CAP_MKNOD); - assertEquals(28, OsConstants.CAP_LEASE); - assertEquals(29, OsConstants.CAP_AUDIT_WRITE); - assertEquals(30, OsConstants.CAP_AUDIT_CONTROL); - assertEquals(31, OsConstants.CAP_SETFCAP); - assertEquals(32, OsConstants.CAP_MAC_OVERRIDE); - assertEquals(33, OsConstants.CAP_MAC_ADMIN); - assertEquals(34, OsConstants.CAP_SYSLOG); - assertEquals(35, OsConstants.CAP_WAKE_ALARM); - assertEquals(36, OsConstants.CAP_BLOCK_SUSPEND); - // last constant - assertEquals(40, OsConstants.CAP_LAST_CAP); - } - - @Test - public void test_CAP_TO_INDEX() { - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_CHOWN)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_DAC_OVERRIDE)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_DAC_READ_SEARCH)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_FOWNER)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_FSETID)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_KILL)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SETGID)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SETUID)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SETPCAP)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_LINUX_IMMUTABLE)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_NET_BIND_SERVICE)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_NET_BROADCAST)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_NET_ADMIN)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_NET_RAW)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_IPC_LOCK)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_IPC_OWNER)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SYS_MODULE)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SYS_RAWIO)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SYS_CHROOT)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SYS_PTRACE)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SYS_PACCT)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SYS_ADMIN)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SYS_BOOT)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SYS_NICE)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SYS_RESOURCE)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SYS_TIME)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SYS_TTY_CONFIG)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_MKNOD)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_LEASE)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_AUDIT_WRITE)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_AUDIT_CONTROL)); - assertEquals(0, CAP_TO_INDEX(OsConstants.CAP_SETFCAP)); - assertEquals(1, CAP_TO_INDEX(OsConstants.CAP_MAC_OVERRIDE)); - assertEquals(1, CAP_TO_INDEX(OsConstants.CAP_MAC_ADMIN)); - assertEquals(1, CAP_TO_INDEX(OsConstants.CAP_SYSLOG)); - assertEquals(1, CAP_TO_INDEX(OsConstants.CAP_WAKE_ALARM)); - assertEquals(1, CAP_TO_INDEX(OsConstants.CAP_BLOCK_SUSPEND)); - } - - @Test - public void test_CAP_TO_MASK() { - assertEquals(1 << 0, CAP_TO_MASK(OsConstants.CAP_CHOWN)); - assertEquals(1 << 1, CAP_TO_MASK(OsConstants.CAP_DAC_OVERRIDE)); - assertEquals(1 << 2, CAP_TO_MASK(OsConstants.CAP_DAC_READ_SEARCH)); - assertEquals(1 << 3, CAP_TO_MASK(OsConstants.CAP_FOWNER)); - assertEquals(1 << 4, CAP_TO_MASK(OsConstants.CAP_FSETID)); - assertEquals(1 << 5, CAP_TO_MASK(OsConstants.CAP_KILL)); - assertEquals(1 << 6, CAP_TO_MASK(OsConstants.CAP_SETGID)); - assertEquals(1 << 7, CAP_TO_MASK(OsConstants.CAP_SETUID)); - assertEquals(1 << 8, CAP_TO_MASK(OsConstants.CAP_SETPCAP)); - assertEquals(1 << 9, CAP_TO_MASK(OsConstants.CAP_LINUX_IMMUTABLE)); - assertEquals(1 << 10, CAP_TO_MASK(OsConstants.CAP_NET_BIND_SERVICE)); - assertEquals(1 << 11, CAP_TO_MASK(OsConstants.CAP_NET_BROADCAST)); - assertEquals(1 << 12, CAP_TO_MASK(OsConstants.CAP_NET_ADMIN)); - assertEquals(1 << 13, CAP_TO_MASK(OsConstants.CAP_NET_RAW)); - assertEquals(1 << 14, CAP_TO_MASK(OsConstants.CAP_IPC_LOCK)); - assertEquals(1 << 15, CAP_TO_MASK(OsConstants.CAP_IPC_OWNER)); - assertEquals(1 << 16, CAP_TO_MASK(OsConstants.CAP_SYS_MODULE)); - assertEquals(1 << 17, CAP_TO_MASK(OsConstants.CAP_SYS_RAWIO)); - assertEquals(1 << 18, CAP_TO_MASK(OsConstants.CAP_SYS_CHROOT)); - assertEquals(1 << 19, CAP_TO_MASK(OsConstants.CAP_SYS_PTRACE)); - assertEquals(1 << 20, CAP_TO_MASK(OsConstants.CAP_SYS_PACCT)); - assertEquals(1 << 21, CAP_TO_MASK(OsConstants.CAP_SYS_ADMIN)); - assertEquals(1 << 22, CAP_TO_MASK(OsConstants.CAP_SYS_BOOT)); - assertEquals(1 << 23, CAP_TO_MASK(OsConstants.CAP_SYS_NICE)); - assertEquals(1 << 24, CAP_TO_MASK(OsConstants.CAP_SYS_RESOURCE)); - assertEquals(1 << 25, CAP_TO_MASK(OsConstants.CAP_SYS_TIME)); - assertEquals(1 << 26, CAP_TO_MASK(OsConstants.CAP_SYS_TTY_CONFIG)); - assertEquals(1 << 27, CAP_TO_MASK(OsConstants.CAP_MKNOD)); - assertEquals(1 << 28, CAP_TO_MASK(OsConstants.CAP_LEASE)); - assertEquals(1 << 29, CAP_TO_MASK(OsConstants.CAP_AUDIT_WRITE)); - assertEquals(1 << 30, CAP_TO_MASK(OsConstants.CAP_AUDIT_CONTROL)); - assertEquals(1 << 31, CAP_TO_MASK(OsConstants.CAP_SETFCAP)); - assertEquals(1 << 0, CAP_TO_MASK(OsConstants.CAP_MAC_OVERRIDE)); - assertEquals(1 << 1, CAP_TO_MASK(OsConstants.CAP_MAC_ADMIN)); - assertEquals(1 << 2, CAP_TO_MASK(OsConstants.CAP_SYSLOG)); - assertEquals(1 << 3, CAP_TO_MASK(OsConstants.CAP_WAKE_ALARM)); - assertEquals(1 << 4, CAP_TO_MASK(OsConstants.CAP_BLOCK_SUSPEND)); - } - - @Test - public void test_S_ISLNK() { - assertTrue(S_ISLNK(OsConstants.S_IFLNK)); - - assertFalse(S_ISLNK(OsConstants.S_IFBLK)); - assertFalse(S_ISLNK(OsConstants.S_IFCHR)); - assertFalse(S_ISLNK(OsConstants.S_IFDIR)); - assertFalse(S_ISLNK(OsConstants.S_IFIFO)); - assertFalse(S_ISLNK(OsConstants.S_IFMT)); - assertFalse(S_ISLNK(OsConstants.S_IFREG)); - assertFalse(S_ISLNK(OsConstants.S_IFSOCK)); - assertFalse(S_ISLNK(OsConstants.S_IRGRP)); - assertFalse(S_ISLNK(OsConstants.S_IROTH)); - assertFalse(S_ISLNK(OsConstants.S_IRUSR)); - assertFalse(S_ISLNK(OsConstants.S_IRWXG)); - assertFalse(S_ISLNK(OsConstants.S_IRWXO)); - assertFalse(S_ISLNK(OsConstants.S_IRWXU)); - assertFalse(S_ISLNK(OsConstants.S_ISGID)); - assertFalse(S_ISLNK(OsConstants.S_ISUID)); - assertFalse(S_ISLNK(OsConstants.S_ISVTX)); - assertFalse(S_ISLNK(OsConstants.S_IWGRP)); - assertFalse(S_ISLNK(OsConstants.S_IWOTH)); - assertFalse(S_ISLNK(OsConstants.S_IWUSR)); - assertFalse(S_ISLNK(OsConstants.S_IXGRP)); - assertFalse(S_ISLNK(OsConstants.S_IXOTH)); - assertFalse(S_ISLNK(OsConstants.S_IXUSR)); - } - - @Test - public void test_S_ISREG() { - assertTrue(S_ISREG(OsConstants.S_IFREG)); - - assertFalse(S_ISREG(OsConstants.S_IFBLK)); - assertFalse(S_ISREG(OsConstants.S_IFCHR)); - assertFalse(S_ISREG(OsConstants.S_IFDIR)); - assertFalse(S_ISREG(OsConstants.S_IFIFO)); - assertFalse(S_ISREG(OsConstants.S_IFLNK)); - assertFalse(S_ISREG(OsConstants.S_IFMT)); - assertFalse(S_ISREG(OsConstants.S_IFSOCK)); - assertFalse(S_ISREG(OsConstants.S_IRGRP)); - assertFalse(S_ISREG(OsConstants.S_IROTH)); - assertFalse(S_ISREG(OsConstants.S_IRUSR)); - assertFalse(S_ISREG(OsConstants.S_IRWXG)); - assertFalse(S_ISREG(OsConstants.S_IRWXO)); - assertFalse(S_ISREG(OsConstants.S_IRWXU)); - assertFalse(S_ISREG(OsConstants.S_ISGID)); - assertFalse(S_ISREG(OsConstants.S_ISUID)); - assertFalse(S_ISREG(OsConstants.S_ISVTX)); - assertFalse(S_ISREG(OsConstants.S_IWGRP)); - assertFalse(S_ISREG(OsConstants.S_IWOTH)); - assertFalse(S_ISREG(OsConstants.S_IWUSR)); - assertFalse(S_ISREG(OsConstants.S_IXGRP)); - assertFalse(S_ISREG(OsConstants.S_IXOTH)); - assertFalse(S_ISREG(OsConstants.S_IXUSR)); - } - - @Test - public void test_S_ISDIR() { - assertTrue(S_ISDIR(OsConstants.S_IFDIR)); - - assertFalse(S_ISDIR(OsConstants.S_IFBLK)); - assertFalse(S_ISDIR(OsConstants.S_IFCHR)); - assertFalse(S_ISDIR(OsConstants.S_IFIFO)); - assertFalse(S_ISDIR(OsConstants.S_IFLNK)); - assertFalse(S_ISDIR(OsConstants.S_IFMT)); - assertFalse(S_ISDIR(OsConstants.S_IFREG)); - assertFalse(S_ISDIR(OsConstants.S_IFSOCK)); - assertFalse(S_ISDIR(OsConstants.S_IRGRP)); - assertFalse(S_ISDIR(OsConstants.S_IROTH)); - assertFalse(S_ISDIR(OsConstants.S_IRUSR)); - assertFalse(S_ISDIR(OsConstants.S_IRWXG)); - assertFalse(S_ISDIR(OsConstants.S_IRWXO)); - assertFalse(S_ISDIR(OsConstants.S_IRWXU)); - assertFalse(S_ISDIR(OsConstants.S_ISGID)); - assertFalse(S_ISDIR(OsConstants.S_ISUID)); - assertFalse(S_ISDIR(OsConstants.S_ISVTX)); - assertFalse(S_ISDIR(OsConstants.S_IWGRP)); - assertFalse(S_ISDIR(OsConstants.S_IWOTH)); - assertFalse(S_ISDIR(OsConstants.S_IWUSR)); - assertFalse(S_ISDIR(OsConstants.S_IXGRP)); - assertFalse(S_ISDIR(OsConstants.S_IXOTH)); - assertFalse(S_ISDIR(OsConstants.S_IXUSR)); - } - - @Test - public void test_S_ISCHR() { - assertTrue(S_ISCHR(OsConstants.S_IFCHR)); - - assertFalse(S_ISCHR(OsConstants.S_IFBLK)); - assertFalse(S_ISCHR(OsConstants.S_IFDIR)); - assertFalse(S_ISCHR(OsConstants.S_IFIFO)); - assertFalse(S_ISCHR(OsConstants.S_IFLNK)); - assertFalse(S_ISCHR(OsConstants.S_IFMT)); - assertFalse(S_ISCHR(OsConstants.S_IFREG)); - assertFalse(S_ISCHR(OsConstants.S_IFSOCK)); - assertFalse(S_ISCHR(OsConstants.S_IRGRP)); - assertFalse(S_ISCHR(OsConstants.S_IROTH)); - assertFalse(S_ISCHR(OsConstants.S_IRUSR)); - assertFalse(S_ISCHR(OsConstants.S_IRWXG)); - assertFalse(S_ISCHR(OsConstants.S_IRWXO)); - assertFalse(S_ISCHR(OsConstants.S_IRWXU)); - assertFalse(S_ISCHR(OsConstants.S_ISGID)); - assertFalse(S_ISCHR(OsConstants.S_ISUID)); - assertFalse(S_ISCHR(OsConstants.S_ISVTX)); - assertFalse(S_ISCHR(OsConstants.S_IWGRP)); - assertFalse(S_ISCHR(OsConstants.S_IWOTH)); - assertFalse(S_ISCHR(OsConstants.S_IWUSR)); - assertFalse(S_ISCHR(OsConstants.S_IXGRP)); - assertFalse(S_ISCHR(OsConstants.S_IXOTH)); - assertFalse(S_ISCHR(OsConstants.S_IXUSR)); - } - - @Test - public void test_S_ISBLK() { - assertTrue (S_ISBLK(OsConstants.S_IFBLK)); - - assertFalse(S_ISBLK(OsConstants.S_IFCHR)); - assertFalse(S_ISBLK(OsConstants.S_IFDIR)); - assertFalse(S_ISBLK(OsConstants.S_IFIFO)); - assertFalse(S_ISBLK(OsConstants.S_IFLNK)); - assertFalse(S_ISBLK(OsConstants.S_IFMT)); - assertFalse(S_ISBLK(OsConstants.S_IFREG)); - assertFalse(S_ISBLK(OsConstants.S_IFSOCK)); - assertFalse(S_ISBLK(OsConstants.S_IRGRP)); - assertFalse(S_ISBLK(OsConstants.S_IROTH)); - assertFalse(S_ISBLK(OsConstants.S_IRUSR)); - assertFalse(S_ISBLK(OsConstants.S_IRWXG)); - assertFalse(S_ISBLK(OsConstants.S_IRWXO)); - assertFalse(S_ISBLK(OsConstants.S_IRWXU)); - assertFalse(S_ISBLK(OsConstants.S_ISGID)); - assertFalse(S_ISBLK(OsConstants.S_ISUID)); - assertFalse(S_ISBLK(OsConstants.S_ISVTX)); - assertFalse(S_ISBLK(OsConstants.S_IWGRP)); - assertFalse(S_ISBLK(OsConstants.S_IWOTH)); - assertFalse(S_ISBLK(OsConstants.S_IWUSR)); - assertFalse(S_ISBLK(OsConstants.S_IXGRP)); - assertFalse(S_ISBLK(OsConstants.S_IXOTH)); - assertFalse(S_ISBLK(OsConstants.S_IXUSR)); - } - - @Test - public void test_S_ISFIFO() { - assertTrue(S_ISFIFO(OsConstants.S_IFIFO)); - - assertFalse(S_ISFIFO(OsConstants.S_IFBLK)); - assertFalse(S_ISFIFO(OsConstants.S_IFCHR)); - assertFalse(S_ISFIFO(OsConstants.S_IFDIR)); - assertFalse(S_ISFIFO(OsConstants.S_IFLNK)); - assertFalse(S_ISFIFO(OsConstants.S_IFMT)); - assertFalse(S_ISFIFO(OsConstants.S_IFREG)); - assertFalse(S_ISFIFO(OsConstants.S_IFSOCK)); - assertFalse(S_ISFIFO(OsConstants.S_IRGRP)); - assertFalse(S_ISFIFO(OsConstants.S_IROTH)); - assertFalse(S_ISFIFO(OsConstants.S_IRUSR)); - assertFalse(S_ISFIFO(OsConstants.S_IRWXG)); - assertFalse(S_ISFIFO(OsConstants.S_IRWXO)); - assertFalse(S_ISFIFO(OsConstants.S_IRWXU)); - assertFalse(S_ISFIFO(OsConstants.S_ISGID)); - assertFalse(S_ISFIFO(OsConstants.S_ISUID)); - assertFalse(S_ISFIFO(OsConstants.S_ISVTX)); - assertFalse(S_ISFIFO(OsConstants.S_IWGRP)); - assertFalse(S_ISFIFO(OsConstants.S_IWOTH)); - assertFalse(S_ISFIFO(OsConstants.S_IWUSR)); - assertFalse(S_ISFIFO(OsConstants.S_IXGRP)); - assertFalse(S_ISFIFO(OsConstants.S_IXOTH)); - assertFalse(S_ISFIFO(OsConstants.S_IXUSR)); - } - - @Test - public void test_S_ISSOCK() { - assertTrue(S_ISSOCK(OsConstants.S_IFSOCK)); - - assertFalse(S_ISSOCK(OsConstants.S_IFBLK)); - assertFalse(S_ISSOCK(OsConstants.S_IFCHR)); - assertFalse(S_ISSOCK(OsConstants.S_IFDIR)); - assertFalse(S_ISSOCK(OsConstants.S_IFIFO)); - assertFalse(S_ISSOCK(OsConstants.S_IFLNK)); - assertFalse(S_ISSOCK(OsConstants.S_IFMT)); - assertFalse(S_ISSOCK(OsConstants.S_IFREG)); - assertFalse(S_ISSOCK(OsConstants.S_IRGRP)); - assertFalse(S_ISSOCK(OsConstants.S_IROTH)); - assertFalse(S_ISSOCK(OsConstants.S_IRUSR)); - assertFalse(S_ISSOCK(OsConstants.S_IRWXG)); - assertFalse(S_ISSOCK(OsConstants.S_IRWXO)); - assertFalse(S_ISSOCK(OsConstants.S_IRWXU)); - assertFalse(S_ISSOCK(OsConstants.S_ISGID)); - assertFalse(S_ISSOCK(OsConstants.S_ISUID)); - assertFalse(S_ISSOCK(OsConstants.S_ISVTX)); - assertFalse(S_ISSOCK(OsConstants.S_IWGRP)); - assertFalse(S_ISSOCK(OsConstants.S_IWOTH)); - assertFalse(S_ISSOCK(OsConstants.S_IWUSR)); - assertFalse(S_ISSOCK(OsConstants.S_IXGRP)); - assertFalse(S_ISSOCK(OsConstants.S_IXOTH)); - assertFalse(S_ISSOCK(OsConstants.S_IXUSR)); - } - - @Test - public void test_WEXITSTATUS() { - assertEquals(0, WEXITSTATUS(0x0000)); - assertEquals(0, WEXITSTATUS(0x00DE)); - assertEquals(0xF0, WEXITSTATUS(0xF000)); - assertEquals(0xAB, WEXITSTATUS(0xAB12)); - } - - @Test - public void test_WCOREDUMP() { - assertFalse(WCOREDUMP(0)); - assertTrue(WCOREDUMP(0x80)); - } - - @Test - public void test_WTERMSIG() { - assertEquals(0, WTERMSIG(0)); - assertEquals(0x7f, WTERMSIG(0x7f)); - } - - @Test - public void test_WSTOPSIG() { - assertEquals(0, WSTOPSIG(0x0000)); - assertEquals(0, WSTOPSIG(0x00DE)); - assertEquals(0xF0, WSTOPSIG(0xF000)); - assertEquals(0xAB, WSTOPSIG(0xAB12)); - } - - - @Test - public void test_WIFEXITED() { - assertTrue(WIFEXITED(0)); - assertFalse(WIFEXITED(0x7f)); - } - - @Test - public void test_WIFSTOPPED() { - assertFalse(WIFSTOPPED(0)); - assertTrue(WIFSTOPPED(0x7f)); - } - - @Test - public void test_WIFSIGNALED() { - assertFalse(WIFSIGNALED(0)); - assertTrue(WIFSIGNALED(1)); - } -} diff --git a/ravenwood/runtime-test/test/com/android/ravenwood/runtimetest/OsTest.java b/ravenwood/runtime-test/test/com/android/ravenwood/runtimetest/OsTest.java deleted file mode 100644 index b5038e68516d..000000000000 --- a/ravenwood/runtime-test/test/com/android/ravenwood/runtimetest/OsTest.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.ravenwood.runtimetest; - -import static org.junit.Assert.assertEquals; - -import android.system.Os; -import android.system.OsConstants; - -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import com.android.ravenwood.common.JvmWorkaround; -import com.android.ravenwood.common.RavenwoodRuntimeNative; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.io.File; -import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.RandomAccessFile; - -@RunWith(AndroidJUnit4.class) -public class OsTest { - public interface ConsumerWithThrow<T> { - void accept(T var1) throws Exception; - } - - private void withTestFile(ConsumerWithThrow<FileDescriptor> consumer) throws Exception { - File file = File.createTempFile("osTest", "bin"); - try (var raf = new RandomAccessFile(file, "rw")) { - var fd = raf.getFD(); - - try (var os = new FileOutputStream(fd)) { - os.write(1); - os.write(2); - os.write(3); - os.write(4); - - consumer.accept(fd); - } - } - } - - @Test - public void testLseek() throws Exception { - withTestFile((fd) -> { - assertEquals(4, Os.lseek(fd, 4, OsConstants.SEEK_SET)); - assertEquals(4, Os.lseek(fd, 0, OsConstants.SEEK_CUR)); - assertEquals(6, Os.lseek(fd, 2, OsConstants.SEEK_CUR)); - }); - } - - @Test - public void testDup() throws Exception { - withTestFile((fd) -> { - var dup = Os.dup(fd); - - checkAreDup(fd, dup); - }); - } - - @Test - public void testPipe2() throws Exception { - var fds = Os.pipe2(0); - - write(fds[1], 123); - assertEquals(123, read(fds[0])); - } - - @Test - public void testFcntlInt() throws Exception { - withTestFile((fd) -> { - var dupInt = Os.fcntlInt(fd, 0, 0); - - var dup = new FileDescriptor(); - JvmWorkaround.getInstance().setFdInt(dup, dupInt); - - checkAreDup(fd, dup); - }); - } - - private static void write(FileDescriptor fd, int oneByte) throws IOException { - // Create a dup to avoid closing the FD. - try (var dup = new FileOutputStream(RavenwoodRuntimeNative.dup(fd))) { - dup.write(oneByte); - } - } - - private static int read(FileDescriptor fd) throws IOException { - // Create a dup to avoid closing the FD. - try (var dup = new FileInputStream(RavenwoodRuntimeNative.dup(fd))) { - return dup.read(); - } - } - - private static void checkAreDup(FileDescriptor fd1, FileDescriptor fd2) throws Exception { - assertEquals(4, Os.lseek(fd1, 4, OsConstants.SEEK_SET)); - assertEquals(4, Os.lseek(fd1, 0, OsConstants.SEEK_CUR)); - - // Dup'ed FD shares the same position. - assertEquals(4, Os.lseek(fd2, 0, OsConstants.SEEK_CUR)); - - assertEquals(6, Os.lseek(fd1, 2, OsConstants.SEEK_CUR)); - assertEquals(6, Os.lseek(fd2, 0, OsConstants.SEEK_CUR)); - } -} |