Use Files.readSymbolicLink where possible (#6100)

This commit is contained in:
Basil Crow authored and GitHub committed 2021-12-24 08:39:25 -08:00
1 parent 2066ad5143
commit 5ff14cfaef
1 file changed
+4 -35
@@ -6,14 +6,13 @@ import static hudson.util.jna.GNUCLibrary.F_SETFD;
import static hudson.util.jna.GNUCLibrary.LIBC;
import static java.util.logging.Level.FINE;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.StringArray;
import hudson.Extension;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.util.List;
import java.util.logging.Logger;
import jenkins.util.JavaVMArguments;
@@ -73,11 +72,8 @@ public class UnixSlaveRestarter extends SlaveRestarter {
File exe = new File(name);
if (exe.exists()) {
try {
String path = resolveSymlink(exe);
if (path != null) {
return path;
}
} catch (IOException e) {
return Files.readSymbolicLink(exe.toPath()).toString();
} catch (IOException | InvalidPathException | UnsupportedOperationException e) {
LOGGER.log(FINE, "Failed to resolve symlink " + exe, e);
}
return name;
@@ -87,33 +83,6 @@ public class UnixSlaveRestarter extends SlaveRestarter {
return System.getProperty("java.home") + "/bin/java";
}
private static String resolveSymlink(File link) throws IOException {
String filename = link.getAbsolutePath();
for (int sz = 512; sz < 65536; sz *= 2) {
Memory m = new Memory(sz);
int r = LIBC.readlink(filename, m, new NativeLong(sz));
if (r < 0) {
int err = Native.getLastError();
if (err == 22 /*EINVAL --- but is this really portable?*/) {
return null; // this means it's not a symlink
}
throw new IOException(
"Failed to readlink " + link + " error=" + err + " " + LIBC.strerror(err));
}
if (r == sz) {
continue; // buffer too small
}
byte[] buf = new byte[r];
m.read(0, buf, 0, r);
return new String(buf, StandardCharsets.UTF_8);
}
throw new IOException("Failed to readlink " + link);
}
private static final Logger LOGGER = Logger.getLogger(UnixSlaveRestarter.class.getName());
private static final long serialVersionUID = 1L;