loader/loader.cpp
changeset 1840 dd80e60b571c
parent 1561 b437438914c5
child 1843 051154c7d130
     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;