in src/main/java/software/amazon/awssdk/crt/CRT.java [136:219]
private static void extractAndLoadLibrary(String path) {
try {
// Check java.io.tmpdir
String tmpdirPath;
File tmpdirFile;
try {
tmpdirFile = new File(path).getAbsoluteFile();
tmpdirPath = tmpdirFile.getAbsolutePath();
if (tmpdirFile.exists()) {
if (!tmpdirFile.isDirectory()) {
throw new IOException("not a directory: " + tmpdirPath);
}
} else {
tmpdirFile.mkdirs();
}
if (!tmpdirFile.canRead() || !tmpdirFile.canWrite()) {
throw new IOException("access denied: " + tmpdirPath);
}
} catch (Exception ex) {
String msg = "Invalid directory: " + path;
throw new IOException(msg, ex);
}
// Prefix the lib
String prefix = "AWSCRT_" + new Date().getTime();
String libraryName = System.mapLibraryName(CRT_LIB_NAME);
String libraryPath = "/" + getOSIdentifier() + "/" + getArchIdentifier() + "/" + libraryName;
File tempSharedLib = File.createTempFile(prefix, libraryName, tmpdirFile);
// open a stream to read the shared lib contents from this JAR
try (InputStream in = CRT.class.getResourceAsStream(libraryPath)) {
if (in == null) {
throw new IOException("Unable to open library in jar for AWS CRT: " + libraryPath);
}
if (tempSharedLib.exists()) {
tempSharedLib.delete();
}
// Copy from jar stream to temp file
try (FileOutputStream out = new FileOutputStream(tempSharedLib)) {
int read;
byte [] bytes = new byte[1024];
while ((read = in.read(bytes)) != -1){
out.write(bytes, 0, read);
}
}
}
if (!tempSharedLib.setExecutable(true)) {
throw new CrtRuntimeException("Unable to make shared library executable");
}
if (!tempSharedLib.setWritable(false)) {
throw new CrtRuntimeException("Unable to make shared library read-only");
}
if (!tempSharedLib.setReadable(true)) {
throw new CrtRuntimeException("Unable to make shared library readable");
}
// Ensure that the shared lib will be destroyed when java exits
tempSharedLib.deleteOnExit();
// load the shared lib from the temp path
System.load(tempSharedLib.getAbsolutePath());
} catch (CrtRuntimeException crtex) {
System.err.println("Unable to initialize AWS CRT: " + crtex);
crtex.printStackTrace();
throw crtex;
} catch (UnknownPlatformException upe) {
System.err.println("Unable to determine platform for AWS CRT: " + upe);
upe.printStackTrace();
CrtRuntimeException rex = new CrtRuntimeException("Unable to determine platform for AWS CRT");
rex.initCause(upe);
throw rex;
} catch (Exception ex) {
System.err.println("Unable to unpack AWS CRT lib: " + ex);
ex.printStackTrace();
CrtRuntimeException rex = new CrtRuntimeException("Unable to unpack AWS CRT library");
rex.initCause(ex);
throw rex;
}
}