diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java index 480c8fbd79c..6a080aafd35 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java @@ -1,10 +1,13 @@ package datadog.trace.agent.tooling.servicediscovery; +import static datadog.trace.api.telemetry.LogCollector.SEND_TELEMETRY; + import com.sun.jna.Library; import com.sun.jna.Memory; import com.sun.jna.Native; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; +import datadog.environment.OperatingSystem; import datadog.trace.core.servicediscovery.ForeignMemoryWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,7 +16,7 @@ public class MemFDUnixWriter implements ForeignMemoryWriter { private static final Logger log = LoggerFactory.getLogger(MemFDUnixWriter.class); private interface LibC extends Library { - int memfd_create(String name, int flags); + int syscall(int number, Object... args); NativeLong write(int fd, Pointer buf, NativeLong count); @@ -36,7 +39,13 @@ private interface LibC extends Library { public void write(String fileName, byte[] payload) { final LibC libc = Native.load("c", LibC.class); - int memFd = libc.memfd_create(fileName, MFD_CLOEXEC | MFD_ALLOW_SEALING); + OperatingSystem.Architecture arch = OperatingSystem.architecture(); + int memfdSyscall = getMemfdSyscall(arch); + if (memfdSyscall <= 0) { + log.debug(SEND_TELEMETRY, "service discovery not supported for arch={}", arch); + return; + } + int memFd = libc.syscall(memfdSyscall, fileName, MFD_CLOEXEC | MFD_ALLOW_SEALING); if (memFd < 0) { log.warn("{} memfd create failed, errno={}", fileName, Native.getLastError()); return; @@ -60,4 +69,23 @@ public void write(String fileName, byte[] payload) { } // memfd is not closed to keep it readable for the lifetime of the process. } + + private static int getMemfdSyscall(OperatingSystem.Architecture arch) { + switch (arch) { + case X64: + // https://github.com/torvalds/linux/blob/v6.17/arch/x86/entry/syscalls/syscall_64.tbl#L331 + return 319; + case X86: + // https://github.com/torvalds/linux/blob/v6.17/arch/x86/entry/syscalls/syscall_32.tbl#L371 + return 356; + case ARM64: + // https://github.com/torvalds/linux/blob/v6.17/scripts/syscall.tbl#L329 + return 279; + case ARM: + // https://github.com/torvalds/linux/blob/v6.17/arch/arm64/tools/syscall_32.tbl#L400 + return 385; + default: + return -1; + } + } }