pantry/projects/openssl.org/x509_def.c.diff
Max Howell e968bff3f1 Openssl portable (#132)
* +scripts/test-all.ts
2022-09-14 11:43:44 -04:00

63 lines
1.7 KiB
Diff

diff --git a/crypto/x509/x509_def.c b/crypto/x509/x509_def.c
index bfa8d7d..da3c743 100644
--- a/crypto/x509/x509_def.c
+++ b/crypto/x509/x509_def.c
@@ -11,25 +11,53 @@
#include "internal/cryptlib.h"
#include <openssl/crypto.h>
#include <openssl/x509.h>
+#include <libgen.h> /* dirname */
+
+#ifdef __linux__
+#define __USE_GNU
+#endif
+#include <dlfcn.h> /* dladdr */
+
+const char *relocat0r(const char *suffix) {
+ static const char *prefix = NULL;
+ if (!prefix) {
+ // repeated calls to dladdr seem to return different values on Linux ¯\_(ツ)_/¯
+ Dl_info info;
+ if (!dladdr(relocat0r, &info)) { return NULL; }
+ prefix = dirname(info.dli_fname);
+ }
+ char *dir = malloc(strlen(prefix) + 4 + strlen(suffix) + 2);
+ if (!dir) { return NULL; }
+ sprintf(dir, "%s/../%s", prefix, suffix);
+ return dir;
+}
const char *X509_get_default_private_dir(void)
{
- return X509_PRIVATE_DIR;
+ static const char *dir = NULL;
+ if (!dir) dir = relocat0r("ssl/private");
+ return dir ?: X509_PRIVATE_DIR;
}
const char *X509_get_default_cert_area(void)
{
- return X509_CERT_AREA;
+ static const char *dir = NULL;
+ if (!dir) dir = relocat0r("ssl");
+ return dir ?: X509_CERT_AREA;
}
const char *X509_get_default_cert_dir(void)
{
- return X509_CERT_DIR;
+ static const char *dir = NULL;
+ if (!dir) dir = relocat0r("ssl/certs");
+ return dir ?: X509_CERT_DIR;
}
const char *X509_get_default_cert_file(void)
{
- return X509_CERT_FILE;
+ static const char *dir = NULL;
+ if (!dir) dir = relocat0r("ssl/cert.pem");
+ return dir ?: X509_CERT_FILE;
}
const char *X509_get_default_cert_dir_env(void)