Skip to content

Commit d6ef787

Browse files
committed
WIP
1 parent 23e5d49 commit d6ef787

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

components/environment/src/main/java/datadog/environment/OperatingSystem.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,15 @@
1010
import java.nio.file.Path;
1111
import java.nio.file.Paths;
1212
import java.util.Arrays;
13+
import java.util.Objects;
14+
import java.util.function.Predicate;
15+
import java.util.stream.Stream;
1316

1417
/** Detects operating systems and libc library. */
1518
public final class OperatingSystem {
1619
private static final String OS_NAME_PROPERTY = "os.name";
1720
private static final String OS_ARCH_PROPERTY = "os.arch";
21+
private static final Path TEMP_DIR = Paths.get(computeTempPath());
1822

1923
private OperatingSystem() {}
2024

@@ -146,4 +150,57 @@ private static boolean containsArray(byte[] container, int offset, byte[] contai
146150
}
147151
return true;
148152
}
153+
154+
public static Path getTempDir() {
155+
return TEMP_DIR;
156+
}
157+
158+
private static String computeTempPath() {
159+
if (JavaVirtualMachine.isJ9()) {
160+
return computeJ9TempDir();
161+
}
162+
// See
163+
// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-gettemppatha#remarks
164+
// and
165+
// the JDK OS-specific implementations of os::get_temp_directory(), i.e.
166+
// https://github.com/openjdk/jdk/blob/f50bd0d9ec65a6b9596805d0131aaefc1bb913f3/src/hotspot/os/bsd/os_bsd.cpp#L886-L904
167+
if (OperatingSystem.isLinux()) {
168+
return "/tmp";
169+
} else if (OperatingSystem.isWindows()) {
170+
return computeWindowsTempDir();
171+
} else if (OperatingSystem.isMacOs()) {
172+
return EnvironmentVariables.getOrDefault("TMPDIR", ".");
173+
} else {
174+
return SystemProperties.getOrDefault("java.io.tmpdir", ".");
175+
}
176+
}
177+
178+
private static String computeWindowsTempDir() {
179+
return Stream.of("TMP", "TEMP", "USERPROFILE")
180+
.map(EnvironmentVariables::get)
181+
.filter(Objects::nonNull)
182+
.filter(((Predicate<String>) String::isEmpty).negate())
183+
.findFirst()
184+
.orElse("C:\\Windows");
185+
}
186+
187+
private static String computeJ9TempDir() {
188+
try {
189+
https: // github.com/eclipse-openj9/openj9/blob/196082df056a990756a5571bfac29585fbbfbb42/jcl/src/java.base/share/classes/openj9/internal/tools/attach/target/IPC.java#L351
190+
return (String)
191+
Class.forName("openj9.internal.tools.attach.target.IPC")
192+
.getDeclaredMethod("getTmpDir")
193+
.invoke(null);
194+
} catch (Throwable t) {
195+
// Fall back to constants based on J9 source code, may not have perfect coverage
196+
String tmpDir = SystemProperties.get("java.io.tmpdir");
197+
if (tmpDir != null && !tmpDir.isEmpty()) {
198+
return tmpDir;
199+
} else if (OperatingSystem.isWindows()) {
200+
return "C:\\Documents";
201+
} else {
202+
return "/tmp";
203+
}
204+
}
205+
}
149206
}

0 commit comments

Comments
 (0)