aboutsummaryrefslogtreecommitdiff
path: root/openssl-sys/src/probe.rs
diff options
context:
space:
mode:
authorValerii Hiora <[email protected]>2014-11-11 16:54:17 +0200
committerValerii Hiora <[email protected]>2014-11-13 15:17:00 +0200
commitb60d140d3d18c1e8b226036bd8e39e8a87264fb7 (patch)
tree3281c631402e4e9d9a4a15bcfc96347a0a69c0db /openssl-sys/src/probe.rs
parentBump to 0.0.1 (diff)
downloadrust-openssl-b60d140d3d18c1e8b226036bd8e39e8a87264fb7.tar.xz
rust-openssl-b60d140d3d18c1e8b226036bd8e39e8a87264fb7.zip
New build system
Diffstat (limited to 'openssl-sys/src/probe.rs')
-rw-r--r--openssl-sys/src/probe.rs72
1 files changed, 72 insertions, 0 deletions
diff --git a/openssl-sys/src/probe.rs b/openssl-sys/src/probe.rs
new file mode 100644
index 00000000..fc162028
--- /dev/null
+++ b/openssl-sys/src/probe.rs
@@ -0,0 +1,72 @@
+use std::os;
+use std::io::fs::PathExtensions;
+
+pub struct ProbeResult {
+ pub cert_file: Option<Path>,
+ pub cert_dir: Option<Path>,
+}
+
+/// Probe the system for the directory in which CA certificates should likely be
+/// found.
+///
+/// This will only search known system locations.
+pub fn find_certs_dirs() -> Vec<Path> {
+ // see http://gagravarr.org/writing/openssl-certs/others.shtml
+ [
+ "/var/ssl",
+ "/usr/share/ssl",
+ "/usr/local/ssl",
+ "/usr/local/openssl",
+ "/usr/local/share",
+ "/usr/lib/ssl",
+ "/usr/ssl",
+ "/etc/openssl",
+ "/etc/pki/tls",
+ "/etc/ssl",
+ ].iter().map(|s| Path::new(*s)).filter(|p| {
+ p.exists()
+ }).collect()
+}
+
+pub fn init_ssl_cert_env_vars() {
+ let ProbeResult { cert_file, cert_dir } = probe();
+ match cert_file {
+ Some(path) => put("SSL_CERT_FILE", path),
+ None => {}
+ }
+ match cert_dir {
+ Some(path) => put("SSL_CERT_DIR", path),
+ None => {}
+ }
+
+ fn put(var: &str, path: Path) {
+ // Don't stomp over what anyone else has set
+ match os::getenv(var) {
+ Some(..) => {}
+ None => os::setenv(var, path),
+ }
+ }
+}
+
+pub fn probe() -> ProbeResult {
+ let mut result = ProbeResult {
+ cert_file: os::getenv("SSL_CERT_FILE").map(Path::new),
+ cert_dir: os::getenv("SSL_CERT_DIR").map(Path::new),
+ };
+ for certs_dir in find_certs_dirs().iter() {
+ // cert.pem looks to be an openssl 1.0.1 thing, while
+ // certs/ca-certificates.crt appears to be a 0.9.8 thing
+ try(&mut result.cert_file, certs_dir.join("cert.pem"));
+ try(&mut result.cert_file, certs_dir.join("certs/ca-certificates.crt"));
+ try(&mut result.cert_file, certs_dir.join("certs/ca-root-nss.crt"));
+
+ try(&mut result.cert_dir, certs_dir.join("certs"));
+ }
+ result
+}
+
+fn try(dst: &mut Option<Path>, val: Path) {
+ if dst.is_none() && val.exists() {
+ *dst = Some(val);
+ }
+}