+////
+//// OS-specific Secure Random
+////
+
+#ifdef WIN32
+
+bool secure_rand_fill_buf(void *buf, size_t len)
+{
+ HCRYPTPROV wctx;
+
+ if (!CryptAcquireContext(&wctx, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
+ return false;
+
+ CryptGenRandom(wctx, len, (BYTE *)buf);
+ CryptReleaseContext(wctx, 0);
+ return true;
+}
+
+#else
+
+bool secure_rand_fill_buf(void *buf, size_t len)
+{
+ // N.B. This function checks *only* for /dev/urandom, because on most
+ // common OSes it is non-blocking, whereas /dev/random is blocking, and it
+ // is exceptionally uncommon for there to be a situation where /dev/random
+ // exists but /dev/urandom does not. This guesswork is necessary since
+ // random devices are not covered by any POSIX standard...
+ FILE *fp = fopen("/dev/urandom", "rb");
+ if (!fp)
+ return false;
+
+ bool success = fread(buf, len, 1, fp) == 1;
+
+ fclose(fp);
+ return success;
+}
+
+#endif
+
+void attachOrCreateConsole()
+{
+#ifdef _WIN32
+ static bool consoleAllocated = false;
+ const bool redirected = (_fileno(stdout) == -2 || _fileno(stdout) == -1); // If output is redirected to e.g a file
+ if (!consoleAllocated && redirected && (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole())) {
+ freopen("CONOUT$", "w", stdout);
+ freopen("CONOUT$", "w", stderr);
+ consoleAllocated = true;
+ }
+#endif
+}
+
+int mt_snprintf(char *buf, const size_t buf_size, const char *fmt, ...)
+{
+ // https://msdn.microsoft.com/en-us/library/bt7tawza.aspx
+ // Many of the MSVC / Windows printf-style functions do not support positional
+ // arguments (eg. "%1$s"). We just forward the call to vsnprintf for sane
+ // platforms, but defer to _vsprintf_p on MSVC / Windows.
+ // https://github.com/FFmpeg/FFmpeg/blob/5ae9fa13f5ac640bec113120d540f70971aa635d/compat/msvcrt/snprintf.c#L46
+ // _vsprintf_p has to be shimmed with _vscprintf_p on -1 (for an example see
+ // above FFmpeg link).
+ va_list args;
+ va_start(args, fmt);
+#ifndef _MSC_VER
+ int c = vsnprintf(buf, buf_size, fmt, args);
+#else // _MSC_VER
+ int c = _vsprintf_p(buf, buf_size, fmt, args);
+ if (c == -1)
+ c = _vscprintf_p(fmt, args);
+#endif // _MSC_VER
+ va_end(args);
+ return c;
+}
+
+bool openURL(const std::string &url)
+{
+ if ((url.substr(0, 7) != "http://" && url.substr(0, 8) != "https://") ||
+ url.find_first_of("\r\n") != std::string::npos) {
+ errorstream << "Invalid url: " << url << std::endl;
+ return false;
+ }