19 package org.sleuthkit.datamodel;
22 import java.io.IOException;
23 import java.io.RandomAccessFile;
24 import java.nio.channels.FileChannel;
25 import java.nio.channels.FileLock;
26 import java.util.Arrays;
27 import java.util.logging.Level;
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};
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)
130 ? LockState.HELD_BY_NEW
131 : LockState.HELD_BY_OLD;
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;
165 private LockState lockState;
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;
static void removeLibLock()
static LibraryLock acquireLibLock()