1.1 --- a/loader/loader.cpp Tue Jan 08 03:06:33 2008 +0000
1.2 +++ b/loader/loader.cpp Thu Jan 10 18:15:45 2008 +0000
1.3 @@ -70,6 +70,29 @@
1.4 HINSTANCE g_hCore = NULL;
1.5 bool load_attempted = false;
1.6
1.7 +size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...);
1.8 +
1.9 +class FailPlugin : public SourceMM::ISmmFailPlugin
1.10 +{
1.11 +public:
1.12 + int GetApiVersion()
1.13 + {
1.14 + return fail_version;
1.15 + }
1.16 +
1.17 + bool Load(SourceMM::PluginId id, SourceMM::ISmmAPI *ismm, char *error, size_t maxlength, bool late)
1.18 + {
1.19 + if (error != NULL && maxlength != 0)
1.20 + {
1.21 + UTIL_Format(error, maxlength, "%s", error_buffer);
1.22 + }
1.23 + return false;
1.24 + }
1.25 +
1.26 + int fail_version;
1.27 + char error_buffer[512];
1.28 +} s_FailPlugin;
1.29 +
1.30 size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...)
1.31 {
1.32 va_list ap;
1.33 @@ -87,7 +110,7 @@
1.34 return len;
1.35 }
1.36
1.37 -METAMOD_PLUGIN *_GetPluginPtr(const char *path)
1.38 +METAMOD_PLUGIN *_GetPluginPtr(const char *path, int fail_api)
1.39 {
1.40 METAMOD_FN_ORIG_LOAD fn;
1.41 METAMOD_PLUGIN *pl;
1.42 @@ -95,7 +118,34 @@
1.43
1.44 if (!(g_hCore=openlib(path)))
1.45 {
1.46 - return NULL;
1.47 +#if defined __linux__
1.48 + UTIL_Format(s_FailPlugin.error_buffer,
1.49 + sizeof(s_FailPlugin.error_buffer),
1.50 + "%s",
1.51 + dlerror());
1.52 +#else
1.53 + DWORD err = GetLastError();
1.54 +
1.55 + if (FormatMessageA(
1.56 + FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
1.57 + NULL,
1.58 + err,
1.59 + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
1.60 + s_FailPlugin.error_buffer,
1.61 + sizeof(s_FailPlugin.error_buffer),
1.62 + NULL)
1.63 + == 0)
1.64 + {
1.65 + UTIL_Format(s_FailPlugin.error_buffer,
1.66 + sizeof(s_FailPlugin.error_buffer),
1.67 + "unknown error %x",
1.68 + err);
1.69 + }
1.70 +#endif
1.71 +
1.72 + s_FailPlugin.fail_version = fail_api;
1.73 +
1.74 + return (METAMOD_PLUGIN *)&s_FailPlugin;
1.75 }
1.76
1.77 if (!(fn=(METAMOD_FN_ORIG_LOAD)findsym(g_hCore, "CreateInterface")))
1.78 @@ -171,7 +221,7 @@
1.79 char abspath[256];
1.80 UTIL_Format(abspath, sizeof(abspath), "%s" PATH_SEP_CHAR "%s", mli->pl_path, filename);
1.81
1.82 - return _GetPluginPtr(abspath);
1.83 + return _GetPluginPtr(abspath, METAMOD_FAIL_API_V2);
1.84 }
1.85
1.86 DLL_EXPORT void UnloadInterface_MMS()
1.87 @@ -215,7 +265,7 @@
1.88
1.89 UTIL_Format(targetfile, sizeof(targetfile), "%s" PATH_SEP_CHAR FILENAME_1_4_EP1, thisfile);
1.90
1.91 - return _GetPluginPtr(targetfile);
1.92 + return _GetPluginPtr(targetfile, METAMOD_FAIL_API_V1);
1.93 }
1.94
1.95 return NULL;