From 44902cb49cd51e2bb2f1cef05cb3c0e799b83434 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Sat, 3 Aug 2024 16:11:57 +0100 Subject: Rework OS abstractions - As much as possible avoid dragging system headers into translation units. This should avoid namespace pollution and, hopefully, speed up builds a little bit. - Avoid leaning on the UCRT so much on Windows - prefer native win32 calls and native file handles except where doing so is inconvenient (in particular, for stat(), which we might try and replace later). - Also, switch from SystemFunction036 to ProcessPrng on Windows. This requires us to generate a stub for bcryptprimitives.dll because Microsoft haven't bothered to provide a link library, but the function is better-documented and seems to be a more direct under-the-hood call as well. Apparently it's what's used by the major web browsers these days, which seems like a good indication it's stable and trusted. - Lastly, remove a bunch of functions and macros and stuff that weren't actually being used. It seems good to try and keep the scope of OS-dependent stuff relatively contained and only add to it when actually required. --- src/errmsg.h | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'src/errmsg.h') diff --git a/src/errmsg.h b/src/errmsg.h index 17a4457..cdf5095 100644 --- a/src/errmsg.h +++ b/src/errmsg.h @@ -1,5 +1,5 @@ /* - * Copyright © 2022 Michael Smith + * Copyright © 2024 Michael Smith * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -17,6 +17,15 @@ #ifndef INC_ERRMSG_H #define INC_ERRMSG_H +#ifdef _WIN32 +#include + +// note: redundant declspec avoids warnings if Windows.h was also included +__declspec(dllimport) unsigned long __stdcall FormatMessageA(unsigned long, + const void *, unsigned long, unsigned long, char *, unsigned long, + va_list *); +#endif + #include "con_.h" #include "os.h" @@ -48,14 +57,17 @@ extern const char msg_note[], msg_warn[], msg_error[]; #ifdef _WIN32 #define _errmsg_sys(msg, ...) do { \ - char _warnsys_buf[512]; \ - OS_WINDOWS_ERROR(_warnsys_buf); \ - _errmsg_msg(_ERRMSG_STR(MODULE_NAME), msg, __VA_ARGS__, _warnsys_buf); \ + char _errmsg_buf[512]; \ + FormatMessageA(/*FORMAT_MESSAGE_FROM_SYSTEM*/ 4096, 0, os_lasterror(), \ + /*MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)*/ 1024, _errmsg_buf, \ + sizeof(_errmsg_buf), 0); \ + _errmsg_msg(_ERRMSG_STR(MODULE_NAME), msg, __VA_ARGS__, _errmsg_buf); \ } while (0) #define _errmsg_dl _errmsg_sys #else #define _errmsg_sys _errmsg_std static inline const char *_errmsg_dlerror(void) { + char *dlerror(void); const char *e = dlerror(); if (!e) return "Unknown error"; // just in case, better avoid weirdness! return e; -- cgit v1.2.3