-
Notifications
You must be signed in to change notification settings - Fork 37
/
NativeFileAccessUtils.java
54 lines (43 loc) · 1.88 KB
/
NativeFileAccessUtils.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package mirror;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.PosixFilePermission;
import java.util.Set;
import com.google.common.annotations.VisibleForTesting;
import jnr.posix.FileStat;
import jnr.posix.POSIX;
import jnr.posix.POSIXFactory;
public class NativeFileAccessUtils {
private static final POSIX posix = POSIXFactory.getNativePOSIX();
@VisibleForTesting
public static void setModifiedTimeForSymlink(Path absolutePath, long millis) throws IOException {
long[] modTime = millisToTimeStructArray(millis);
int r = posix.lutimes(absolutePath.toString(), modTime, modTime);
if (r != 0) {
throw new IOException("lutimes failed with code " + r);
}
}
public static void setReadOnly(Path absolutePath) {
posix.chmod(absolutePath.toFile().toString(), Integer.parseInt("0444", 8));
}
public static void setWritable(Path absolutePath) {
FileStat s = posix.stat(absolutePath.toFile().toString());
posix.chmod(absolutePath.toFile().toString(), s.mode() | Integer.parseInt("0700", 8));
}
public static boolean isExecutable(Path absolutePath) throws IOException {
Set<PosixFilePermission> p = Files.getPosixFilePermissions(absolutePath);
return p.contains(PosixFilePermission.GROUP_EXECUTE)
|| p.contains(PosixFilePermission.OWNER_EXECUTE)
|| p.contains(PosixFilePermission.OTHERS_EXECUTE);
}
public static void setExecutable(Path absolutePath) throws IOException {
Set<PosixFilePermission> p = Files.getPosixFilePermissions(absolutePath);
p.add(PosixFilePermission.OWNER_EXECUTE);
Files.setPosixFilePermissions(absolutePath, p);
}
/** @return millis has an array of seconds + microseconds, as expected by the POSIX APIs. */
private static long[] millisToTimeStructArray(long millis) {
return new long[] { millis / 1000, (millis % 1000) * 1000 };
}
}