38public class LibraryLock
implements AutoCloseable {
40 private static final String LIB_FILE_LOCK_TEXT =
"lib_lock";
42 private static final String TMP_DIR_KEY =
"java.io.tmpdir";
43 private static final String USER_NAME_KEY =
"user.name";
45 private static final byte[] UTF8_BOM = {(byte) 0XEF, (
byte) 0xBB, (byte) 0XBF};
47 private static LibraryLock libLock =
null;
60 if (libLock ==
null) {
61 libLock = getLibLock();
72 if (libLock !=
null) {
88 System.getProperty(TMP_DIR_KEY,
""),
90 System.getProperty(USER_NAME_KEY,
""),
94 if (libTskJniFile.
isFile() && !libTskJniFile.canWrite()) {
96 try (RandomAccessFile lockFileRaf =
new RandomAccessFile(libTskJniFile,
"r")) {
97 LockState lockState = isNewLock(lockFileRaf)
98 ? LockState.HELD_BY_NEW
99 : LockState.HELD_BY_OLD;
101 return new LibraryLock(lockState, libTskJniFile, lockFileRaf,
null,
null);
102 }
catch (IOException ex) {
104 java.util.logging.Logger.getLogger(LibraryLock.class.getCanonicalName()).log(Level.WARNING,
"An error occurred while acquiring the TSK lib lock", ex);
105 return new LibraryLock(LockState.HELD_BY_OLD, libTskJniFile,
null,
null,
null);
109 libTskJniFile.getParentFile().mkdirs();
112 RandomAccessFile lockFileRaf =
null;
113 FileChannel lockFileChannel =
null;
114 FileLock lockFileLock =
null;
116 lockFileRaf =
new RandomAccessFile(libTskJniFile,
"rw");
117 lockFileChannel = lockFileRaf.getChannel();
118 lockFileLock = lockFileChannel ==
null
120 : lockFileChannel.tryLock(1024L, 1L,
false);
122 if (lockFileLock !=
null) {
123 lockFileRaf.setLength(0);
124 lockFileRaf.write(UTF8_BOM);
125 lockFileRaf.writeChars(LIB_FILE_LOCK_TEXT);
127 return new LibraryLock(LockState.ACQUIRED, libTskJniFile, lockFileRaf, lockFileChannel, lockFileLock);
129 LockState lockState = isNewLock(lockFileRaf)
133 return new LibraryLock(lockState, libTskJniFile, lockFileRaf, lockFileChannel,
null);
135 }
catch (IOException ex) {
137 java.util.logging.Logger.getLogger(LibraryLock.class.getCanonicalName()).log(Level.WARNING,
"An error occurred while acquiring the TSK lib lock", ex);
138 return new LibraryLock(
LockState.
HELD_BY_OLD, libTskJniFile, lockFileRaf, lockFileChannel, lockFileLock);
153 private static boolean isNewLock(RandomAccessFile libRaf)
throws IOException {
155 byte[] startFileArr =
new byte[UTF8_BOM.length];
156 int read = libRaf.read(startFileArr);
157 return read == startFileArr.length && Arrays.equals(UTF8_BOM, startFileArr);
161 private File libTskJniFile;
162 private RandomAccessFile lockFileRaf;
163 private FileChannel lockFileChannel;
164 private FileLock lockFileLock;
179 RandomAccessFile lockFileRaf,
180 FileChannel lockFileChannel,
181 FileLock lockFileLock) {
183 this.libTskJniFile = lockFile;
184 this.lockFileRaf = lockFileRaf;
185 this.lockFileChannel = lockFileChannel;
186 this.lockFileLock = lockFileLock;
187 this.lockState = lockState;
206 return libTskJniFile;
210 public void close() throws Exception {
212 if (this.lockFileLock !=
null) {
213 this.lockFileLock.close();
214 this.lockFileLock =
null;
217 if (this.lockFileChannel !=
null) {
218 this.lockFileChannel.close();
219 this.lockFileChannel =
null;
222 if (this.lockFileRaf !=
null) {
223 this.lockFileRaf.close();
224 this.lockFileRaf =
null;
227 if (this.libTskJniFile !=
null) {
228 this.libTskJniFile.delete();
229 this.libTskJniFile =
null;