2
0
mirror of https://github.com/rehlds/metamod-r.git synced 2025-01-13 15:18:19 +03:00

Removed meta errno

This commit is contained in:
asmodai 2017-01-07 21:03:16 +03:00
parent 7e6878b3a1
commit be24b08896
15 changed files with 136 additions and 237 deletions

View File

@ -356,7 +356,7 @@ void cmd_doplug(PLUG_CMD pcmd)
} }
// Output to both places, because we don't want the admin // Output to both places, because we don't want the admin
// to miss this.. // to miss this..
if (!findp && meta_errno == ME_NOTUNIQ) if (!findp /*&& meta_errno == ME_NOTUNIQ*/) // TODO
{ {
META_ERROR("Unique match for required plugin '%s' was not found! Exiting.", arg); META_ERROR("Unique match for required plugin '%s' was not found! Exiting.", arg);
META_CONS("\nERROR: Unique match for required plugin '%s' was not found! Exiting.\n", arg); META_CONS("\nERROR: Unique match for required plugin '%s' was not found! Exiting.\n", arg);
@ -378,7 +378,7 @@ void cmd_doplug(PLUG_CMD pcmd)
if (!findp) if (!findp)
{ {
if (meta_errno == ME_NOTUNIQ) if (false /*meta_errno == ME_NOTUNIQ*/) // TODO
META_CONS("Couldn't find unique plugin matching '%s'", arg); META_CONS("Couldn't find unique plugin matching '%s'", arg);
else else
META_CONS("Couldn't find plugin matching '%s'", arg); META_CONS("Couldn't find plugin matching '%s'", arg);
@ -407,7 +407,7 @@ void cmd_doplug(PLUG_CMD pcmd)
META_CONS("Unloaded plugin '%s'", findp->desc); META_CONS("Unloaded plugin '%s'", findp->desc);
g_plugins->show(); g_plugins->show();
} }
else if (meta_errno == ME_DELAYED) else if (false /*meta_errno == ME_DELAYED*/) // TODO
META_CONS("Unload delayed for plugin '%s'", findp->desc); META_CONS("Unload delayed for plugin '%s'", findp->desc);
else else
META_CONS("Unload failed for plugin '%s'", findp->desc); META_CONS("Unload failed for plugin '%s'", findp->desc);
@ -430,9 +430,9 @@ void cmd_doplug(PLUG_CMD pcmd)
findp->action = PA_RELOAD; findp->action = PA_RELOAD;
if (findp->reload(PT_ANYTIME, PNL_COMMAND)) if (findp->reload(PT_ANYTIME, PNL_COMMAND))
META_CONS("Reloaded plugin '%s'", findp->desc); META_CONS("Reloaded plugin '%s'", findp->desc);
else if (meta_errno == ME_DELAYED) else if (0/*meta_errno == ME_DELAYED*/)
META_CONS("Reload delayed for plugin '%s'", findp->desc); META_CONS("Reload delayed for plugin '%s'", findp->desc);
else if (meta_errno == ME_NOTALLOWED) else if (0/*meta_errno == ME_NOTALLOWED*/)
META_CONS("Reload not allowed for plugin '%s' now, only allowed %s", findp->desc, findp->str_loadable(SL_ALLOWED)); META_CONS("Reload not allowed for plugin '%s' now, only allowed %s", findp->desc, findp->str_loadable(SL_ALLOWED));
else else
META_CONS("Reload failed for plugin '%s'", findp->desc); META_CONS("Reload failed for plugin '%s'", findp->desc);

View File

@ -22,7 +22,7 @@ option_t *MConfig::find(const char* lookup) const
} }
} }
RETURN_ERRNO(NULL, ME_NOTFOUND); return NULL;
} }
bool MConfig::set(const char* key, const char* value) const bool MConfig::set(const char* key, const char* value) const
@ -31,7 +31,7 @@ bool MConfig::set(const char* key, const char* value) const
if (optp) if (optp)
return set(optp, value); return set(optp, value);
RETURN_ERRNO(false, ME_NOTFOUND); return false;
} }
bool MConfig::set(option_t* setp, const char* setstr) bool MConfig::set(option_t* setp, const char* setstr)
@ -51,7 +51,7 @@ bool MConfig::set(option_t* setp, const char* setstr)
if (!isdigit(setstr[0])) if (!isdigit(setstr[0]))
{ {
META_ERROR("option '%s' invalid format '%s'", setp->name, setstr); META_ERROR("option '%s' invalid format '%s'", setp->name, setstr);
RETURN_ERRNO(false, ME_FORMAT); return false;
} }
*optval = Q_atoi(setstr); *optval = Q_atoi(setstr);
META_DEBUG(3, ("set config int: %s = %d", setp->name, *optval)); META_DEBUG(3, ("set config int: %s = %d", setp->name, *optval));
@ -69,7 +69,7 @@ bool MConfig::set(option_t* setp, const char* setstr)
{ {
META_ERROR("option '%s' invalid format '%s'", setp->name, META_ERROR("option '%s' invalid format '%s'", setp->name,
setstr); setstr);
RETURN_ERRNO(false, ME_FORMAT); return false;
} }
META_DEBUG(3, ("set config bool: %s = %s", setp->name, *optval ? "true" : "false")); META_DEBUG(3, ("set config bool: %s = %s", setp->name, *optval ? "true" : "false"));
break; break;
@ -88,7 +88,7 @@ bool MConfig::set(option_t* setp, const char* setstr)
break; break;
default: default:
META_ERROR("unrecognized config type '%d'", setp->type); META_ERROR("unrecognized config type '%d'", setp->type);
RETURN_ERRNO(false, ME_ARGUMENT); return false;
} }
return true; return true;
@ -111,7 +111,7 @@ bool MConfig::load(const char* fn)
if (!fp) if (!fp)
{ {
META_ERROR("unable to open config file '%s': %s", loadfile, strerror(errno)); META_ERROR("unable to open config file '%s': %s", loadfile, strerror(errno));
RETURN_ERRNO(false, ME_NOFILE); return false;
} }
META_DEBUG(2, ("Loading from config file: %s", loadfile)); META_DEBUG(2, ("Loading from config file: %s", loadfile));

View File

@ -121,7 +121,7 @@ bool setup_gamedll(gamedll_t *gamedll)
else else
{ {
// Neither known-list found a gamedll. // Neither known-list found a gamedll.
RETURN_ERRNO(false, ME_NOTFOUND); return false;
} }
Q_snprintf(gamedll->pathname, sizeof(gamedll->pathname), "%s/dlls/%s", gamedll->gamedir, knownfn); Q_snprintf(gamedll->pathname, sizeof(gamedll->pathname), "%s/dlls/%s", gamedll->gamedir, knownfn);

View File

@ -15,12 +15,11 @@ static void buffered_ALERT(MLOG_SERVICE service, ALERT_TYPE atype, const char *p
// Print to console. // Print to console.
void META_CONS(const char *fmt, ...) void META_CONS(const char *fmt, ...)
{ {
va_list ap;
char buf[MAX_LOGMSG_LEN]; char buf[MAX_LOGMSG_LEN];
unsigned int len;
va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
len = Q_vsnprintf(buf, sizeof buf, fmt, ap); size_t len = Q_vsnprintf(buf, sizeof buf - 1, fmt, ap);
va_end(ap); va_end(ap);
buf[len] = '\n'; buf[len] = '\n';
@ -43,7 +42,6 @@ void META_DEV(const char *fmt, ...)
void META_INFO(const char *fmt, ...) void META_INFO(const char *fmt, ...)
{ {
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
buffered_ALERT(mlsIWEL, at_logged, "[META] INFO:", fmt, ap); buffered_ALERT(mlsIWEL, at_logged, "[META] INFO:", fmt, ap);
va_end(ap); va_end(ap);
@ -52,7 +50,6 @@ void META_INFO(const char *fmt, ...)
void META_WARNING(const char *fmt, ...) void META_WARNING(const char *fmt, ...)
{ {
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
buffered_ALERT(mlsIWEL, at_logged, "[META] WARNING:", fmt, ap); buffered_ALERT(mlsIWEL, at_logged, "[META] WARNING:", fmt, ap);
va_end(ap); va_end(ap);
@ -61,7 +58,6 @@ void META_WARNING(const char *fmt, ...)
void META_ERROR(const char *fmt, ...) void META_ERROR(const char *fmt, ...)
{ {
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
buffered_ALERT(mlsIWEL, at_logged, "[META] ERROR:", fmt, ap); buffered_ALERT(mlsIWEL, at_logged, "[META] ERROR:", fmt, ap);
va_end(ap); va_end(ap);
@ -70,7 +66,6 @@ void META_ERROR(const char *fmt, ...)
void META_LOG(const char *fmt, ...) void META_LOG(const char *fmt, ...)
{ {
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
buffered_ALERT(mlsIWEL, at_logged, "[META]", fmt, ap); buffered_ALERT(mlsIWEL, at_logged, "[META]", fmt, ap);
va_end(ap); va_end(ap);
@ -79,12 +74,11 @@ void META_LOG(const char *fmt, ...)
// Print to client. // Print to client.
void META_CLIENT(edict_t *pEntity, const char *fmt, ...) void META_CLIENT(edict_t *pEntity, const char *fmt, ...)
{ {
va_list ap;
char buf[MAX_CLIENTMSG_LEN]; char buf[MAX_CLIENTMSG_LEN];
unsigned int len;
va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
len = Q_vsnprintf(buf, sizeof(buf) - 1, fmt, ap); size_t len = Q_vsnprintf(buf, sizeof buf - 1, fmt, ap);
va_end(ap); va_end(ap);
buf[len] = '\n'; buf[len] = '\n';

View File

@ -1,42 +1,6 @@
#pragma once #pragma once
#include "enginecallbacks.h" // ALERT, etc #include "enginecallbacks.h" // ALERT, etc
#include "sdk_util.h" // UTIL_VarArgs, etc
// Debug logging.
//
// This is done as a macro, rather than a function. This way, you can add
// DEBUG statements all over, without worrying about performance
// implications. If the debugging level is set low, all those statements
// will only generate a simple float/int compare each; if we were to use a
// function instead of a macro, it would end up wasting a lot of cpu cycles
// calling/returning from the function every time. With a fair number of
// DEBUG statements, or if they're placed in frequently excuted code, the
// overhead of the wasted function calls could significantly impact server
// performance.
//
// For this reason, we also compare directly to the float value of the
// cvar, rather than calling CVAR_GET_FLOAT() and thus generating a string
// compare for each DEBUG statement.
//
// Called as:
// META_DEBUG(3, ("return code: %d", ret));
//
// Note the double parens, and the missing parens around "args" in the
// macro itself. Note also the "do..while(0)" loop wrapping the
// statements, so they become a single statement when expanded, necessary
// for times when it might be called as a single-statement result of an
// else (or other flow control).
//
// As suggested by Jussi Kivilinna: Use "if (meta_debug.value < level); else
// DO(something);" style because "meta_debug.value < level" is in most common
// case "false". Check disasm, contitional jumps are predicted not to be
// taken by CPU.
//
// Yes, it's all a bit of a hack.
#define META_DEBUG(level, args) \
do { if (meta_debug.value < level) break; else ALERT(at_logged, "[META] (debug:%d) %s\n", level, UTIL_VarArgs args ); } while(0)
// max buffer size for printed messages // max buffer size for printed messages
#define MAX_LOGMSG_LEN 1024 #define MAX_LOGMSG_LEN 1024
@ -46,11 +10,13 @@
extern cvar_t meta_debug; extern cvar_t meta_debug;
// META_DEV provides debug logging via the cvar "developer" (when set to 1) template<typename ...t_args>
// and uses a function call rather than a macro as it's really intended to void META_DEBUG(int level, t_args... args)
// be used only during startup, before meta_debug has been set from reading {
// server.cfg. if (meta_debug.value < level)
// NOTE: META_DEV has now been mostly obsoleted in the code. return;
ALERT(at_logged, "[META] (debug:%i) %s\n", level, args...);
}
void META_CONS(const char *fmt, ...); void META_CONS(const char *fmt, ...);
void META_DEV(const char *fmt, ...); void META_DEV(const char *fmt, ...);

View File

@ -257,7 +257,7 @@ bool meta_init_gamedll(void)
if (!_getcwd(buf, sizeof(buf))) if (!_getcwd(buf, sizeof(buf)))
{ {
META_WARNING("dll: Couldn't get cwd; %s", strerror(errno)); META_WARNING("dll: Couldn't get cwd; %s", strerror(errno));
RETURN_ERRNO(false, ME_NULLRESULT); return false;
} }
Q_snprintf(GameDLL.gamedir, sizeof(GameDLL.gamedir), "%s/%s", buf, gamedir); Q_snprintf(GameDLL.gamedir, sizeof(GameDLL.gamedir), "%s/%s", buf, gamedir);
@ -295,7 +295,7 @@ bool meta_load_gamedll(void)
if (!GameDLL.sys_module.load(GameDLL.pathname)) if (!GameDLL.sys_module.load(GameDLL.pathname))
{ {
META_ERROR("dll: Couldn't load game DLL %s: %s", GameDLL.pathname, CSysModule::getloaderror()); META_ERROR("dll: Couldn't load game DLL %s: %s", GameDLL.pathname, CSysModule::getloaderror());
RETURN_ERRNO(false, ME_DLOPEN); return false;
} }
// prepare meta_engfuncs // prepare meta_engfuncs
@ -313,7 +313,7 @@ bool meta_load_gamedll(void)
else else
{ {
META_ERROR("dll: Couldn't find GiveFnptrsToDll() in game DLL '%s'", GameDLL.name); META_ERROR("dll: Couldn't find GiveFnptrsToDll() in game DLL '%s'", GameDLL.name);
RETURN_ERRNO(false, ME_DLMISSING); return false;
} }
// TODO // TODO
@ -373,7 +373,7 @@ bool meta_load_gamedll(void)
if (!found) if (!found)
{ {
META_ERROR("dll: Couldn't find either GetEntityAPI nor GetEntityAPI2 in game DLL '%s'", GameDLL.name); META_ERROR("dll: Couldn't find either GetEntityAPI nor GetEntityAPI2 in game DLL '%s'", GameDLL.name);
RETURN_ERRNO(false, ME_DLMISSING); return false;
} }
// prepare gamedll callbacks // prepare gamedll callbacks

View File

@ -24,7 +24,7 @@ MPluginList::MPluginList(const char* ifile) : max_loaded_count(0)
MPlugin *MPluginList::find(module_handle_t handle) MPlugin *MPluginList::find(module_handle_t handle)
{ {
if (!handle) if (!handle)
RETURN_ERRNO(NULL, ME_ARGUMENT); return NULL;
for (int i = 0; i < max_loaded_count; i++) for (int i = 0; i < max_loaded_count; i++)
{ {
@ -34,7 +34,7 @@ MPlugin *MPluginList::find(module_handle_t handle)
return &plist[i]; return &plist[i];
} }
RETURN_ERRNO(NULL, ME_NOTFOUND); return NULL;
} }
// Find a plugin based on the plugin index #. // Find a plugin based on the plugin index #.
@ -44,11 +44,11 @@ MPlugin *MPluginList::find(module_handle_t handle)
MPlugin *MPluginList::find(int pindex) MPlugin *MPluginList::find(int pindex)
{ {
if (pindex <= 0) if (pindex <= 0)
RETURN_ERRNO(NULL, ME_ARGUMENT); return NULL;
auto pfound = &plist[pindex - 1]; auto pfound = &plist[pindex - 1];
if (pfound->status < PL_VALID) if (pfound->status < PL_VALID)
RETURN_ERRNO(NULL, ME_NOTFOUND); return NULL;
else else
return pfound; return pfound;
} }
@ -60,7 +60,7 @@ MPlugin *MPluginList::find(int pindex)
MPlugin *MPluginList::find(plid_t id) MPlugin *MPluginList::find(plid_t id)
{ {
if (!id) if (!id)
RETURN_ERRNO(NULL, ME_ARGUMENT); return NULL;
for (int i = 0; i < max_loaded_count; i++) for (int i = 0; i < max_loaded_count; i++)
{ {
@ -71,7 +71,7 @@ MPlugin *MPluginList::find(plid_t id)
return &plist[i]; return &plist[i];
} }
RETURN_ERRNO(NULL, ME_NOTFOUND); return NULL;
} }
// Find a plugin with the given pathname. // Find a plugin with the given pathname.
@ -81,7 +81,7 @@ MPlugin *MPluginList::find(plid_t id)
MPlugin *MPluginList::find(const char* findpath) MPlugin *MPluginList::find(const char* findpath)
{ {
if (!findpath) if (!findpath)
RETURN_ERRNO(NULL, ME_ARGUMENT); return NULL;
META_DEBUG(8, ("Looking for loaded plugin with dlfnamepath: %s", findpath)); META_DEBUG(8, ("Looking for loaded plugin with dlfnamepath: %s", findpath));
@ -100,7 +100,7 @@ MPlugin *MPluginList::find(const char* findpath)
} }
META_DEBUG(8, ("No loaded plugin found with path: %s", findpath)); META_DEBUG(8, ("No loaded plugin found with path: %s", findpath));
RETURN_ERRNO(NULL, ME_NOTFOUND); return NULL;
} }
// Find a plugin that uses the given memory location. // Find a plugin that uses the given memory location.
@ -130,7 +130,7 @@ MPlugin *MPluginList::find_match(const char *prefix)
if (!prefix) if (!prefix)
{ {
RETURN_ERRNO(NULL, ME_ARGUMENT); return NULL;
} }
pfound = NULL; pfound = NULL;
@ -145,7 +145,7 @@ MPlugin *MPluginList::find_match(const char *prefix)
if (iplug->info && Q_strnicmp(iplug->info->name, prefix, len) == 0) if (iplug->info && Q_strnicmp(iplug->info->name, prefix, len) == 0)
{ {
if (pfound) if (pfound)
RETURN_ERRNO(NULL, ME_NOTUNIQ); return NULL;
pfound = iplug; pfound = iplug;
continue; continue;
@ -153,7 +153,7 @@ MPlugin *MPluginList::find_match(const char *prefix)
else if (Q_strnicmp(iplug->desc, prefix, len) == 0) else if (Q_strnicmp(iplug->desc, prefix, len) == 0)
{ {
if (pfound) if (pfound)
RETURN_ERRNO(NULL, ME_NOTUNIQ); return NULL;
pfound = iplug; pfound = iplug;
continue; continue;
@ -161,7 +161,7 @@ MPlugin *MPluginList::find_match(const char *prefix)
else if (Q_strnicmp(iplug->file, prefix, len) == 0) else if (Q_strnicmp(iplug->file, prefix, len) == 0)
{ {
if (pfound) if (pfound)
RETURN_ERRNO(NULL, ME_NOTUNIQ); return NULL;
pfound = iplug; pfound = iplug;
continue; continue;
@ -169,7 +169,7 @@ MPlugin *MPluginList::find_match(const char *prefix)
else if (Q_strnicmp(iplug->file, buf, Q_strlen(buf)) == 0) else if (Q_strnicmp(iplug->file, buf, Q_strlen(buf)) == 0)
{ {
if (pfound) if (pfound)
RETURN_ERRNO(NULL, ME_NOTUNIQ); return NULL;
pfound = iplug; pfound = iplug;
continue; continue;
@ -177,7 +177,7 @@ MPlugin *MPluginList::find_match(const char *prefix)
else if (iplug->info && Q_strnicmp(iplug->info->logtag, prefix, len) == 0) else if (iplug->info && Q_strnicmp(iplug->info->logtag, prefix, len) == 0)
{ {
if (pfound) if (pfound)
RETURN_ERRNO(NULL, ME_NOTUNIQ); return NULL;
pfound = iplug; pfound = iplug;
continue; continue;
@ -187,7 +187,7 @@ MPlugin *MPluginList::find_match(const char *prefix)
if (pfound) if (pfound)
return pfound; return pfound;
RETURN_ERRNO(NULL, ME_NOTFOUND); return NULL;
} }
// Find a plugin with same file, logtag, desc or significant // Find a plugin with same file, logtag, desc or significant
@ -201,7 +201,7 @@ MPlugin *MPluginList::find_match(MPlugin* pmatch)
MPlugin *iplug, *pfound; MPlugin *iplug, *pfound;
if (!pmatch) if (!pmatch)
{ {
RETURN_ERRNO(NULL, ME_ARGUMENT); return NULL;
} }
pfound = NULL; pfound = NULL;
@ -218,7 +218,7 @@ MPlugin *MPluginList::find_match(MPlugin* pmatch)
if (pfound) if (pfound)
return pfound; return pfound;
RETURN_ERRNO(NULL, ME_NOTFOUND); return NULL;
} }
MPlugin* MPluginList::plugin_addload(plid_t plid, const char* fname, PLUG_LOADTIME now) MPlugin* MPluginList::plugin_addload(plid_t plid, const char* fname, PLUG_LOADTIME now)
@ -229,27 +229,27 @@ MPlugin* MPluginList::plugin_addload(plid_t plid, const char* fname, PLUG_LOADTI
if (!(pl_loader = find(plid))) if (!(pl_loader = find(plid)))
{ {
META_DEBUG(1, ("Couldn't find plugin that gave this loading request!")); META_DEBUG(1, ("Couldn't find plugin that gave this loading request!"));
RETURN_ERRNO(NULL, ME_BADREQ); return NULL;
} }
Q_memset(&pl_temp, 0, sizeof(pl_temp)); Q_memset(&pl_temp, 0, sizeof(pl_temp));
if (!pl_temp.plugin_parseline(fname, pl_loader->index)) if (!pl_temp.plugin_parseline(fname, pl_loader->index))
{ {
RETURN_ERRNO(NULL, ME_NOTFOUND); return NULL;
} }
if (pl_temp.resolve() != true) if (pl_temp.resolve() != true)
{ {
META_DEBUG(1, ("Couldn't resolve given path into a file: %s", pl_temp.file)); META_DEBUG(1, ("Couldn't resolve given path into a file: %s", pl_temp.file));
RETURN_ERRNO(NULL, ME_NOTFOUND); return NULL;
} }
if ((pl_found = find(pl_temp.pathname))) if ((pl_found = find(pl_temp.pathname)))
{ {
META_DEBUG(1, ("Plugin '%s' already in current list; file=%s desc='%s'", META_DEBUG(1, ("Plugin '%s' already in current list; file=%s desc='%s'",
pl_temp.file, pl_found->file, pl_found->desc)); pl_temp.file, pl_found->file, pl_found->desc));
RETURN_ERRNO(NULL, ME_ALREADY); return NULL;
} }
if (!(pl_added = add(&pl_temp))) if (!(pl_added = add(&pl_temp)))
@ -261,7 +261,7 @@ MPlugin* MPluginList::plugin_addload(plid_t plid, const char* fname, PLUG_LOADTI
pl_added->action = PA_LOAD; pl_added->action = PA_LOAD;
if (!pl_added->load(now)) if (!pl_added->load(now))
{ {
if (meta_errno == ME_NOTALLOWED || meta_errno == ME_DELAYED) if (1/*meta_errno == ME_NOTALLOWED || meta_errno == ME_DELAYED*/)
{ {
META_DEBUG(1, ("Plugin '%s' couldn't attach; only allowed %s", pl_added->desc, pl_added->str_loadable(SL_ALLOWED))); META_DEBUG(1, ("Plugin '%s' couldn't attach; only allowed %s", pl_added->desc, pl_added->str_loadable(SL_ALLOWED)));
pl_added->clear(); pl_added->clear();
@ -278,7 +278,6 @@ MPlugin* MPluginList::plugin_addload(plid_t plid, const char* fname, PLUG_LOADTI
} }
META_DEBUG(1, ("Loaded plugin '%s' successfully", pl_added->desc)); META_DEBUG(1, ("Loaded plugin '%s' successfully", pl_added->desc));
meta_errno = ME_NOERROR;
return pl_added; return pl_added;
} }
@ -308,7 +307,7 @@ MPlugin* MPluginList::add(MPlugin* padd)
if (!iplug) if (!iplug)
{ {
META_ERROR("Couldn't add plugin '%s' to list; reached max plugins (%d)", padd->file, MAX_PLUGINS); META_ERROR("Couldn't add plugin '%s' to list; reached max plugins (%d)", padd->file, MAX_PLUGINS);
RETURN_ERRNO(NULL, ME_MAXREACHED); return NULL;
} }
// copy filename into this free slot // copy filename into this free slot
@ -350,7 +349,7 @@ bool MPluginList::ini_startup()
if (!valid_gamedir_file(inifile)) if (!valid_gamedir_file(inifile))
{ {
META_ERROR("ini: Metamod plugins file empty or missing: %s", inifile); META_ERROR("ini: Metamod plugins file empty or missing: %s", inifile);
RETURN_ERRNO(false, ME_NOFILE); return false;
} }
full_gamedir_path(inifile, inifile); full_gamedir_path(inifile, inifile);
@ -358,7 +357,7 @@ bool MPluginList::ini_startup()
if (!fp) if (!fp)
{ {
META_ERROR("ini: Unable to open plugins file '%s': %s", inifile, strerror(errno)); META_ERROR("ini: Unable to open plugins file '%s': %s", inifile, strerror(errno));
RETURN_ERRNO(false, ME_NOFILE); return false;
} }
META_LOG("ini: Begin reading plugins list: %s", inifile); META_LOG("ini: Begin reading plugins list: %s", inifile);
@ -375,10 +374,7 @@ bool MPluginList::ini_startup()
// Parse directly into next entry in array // Parse directly into next entry in array
if (!plist[n].ini_parseline(line)) if (!plist[n].ini_parseline(line))
{ {
if (meta_errno == ME_FORMAT) META_ERROR("ini: Skipping malformed line %d of %s", ln, inifile);
{
META_ERROR("ini: Skipping malformed line %d of %s", ln, inifile);
}
continue; continue;
} }
// Check for a duplicate - an existing entry with this pathname. // Check for a duplicate - an existing entry with this pathname.
@ -435,7 +431,7 @@ bool MPluginList::ini_refresh()
if (!fp) if (!fp)
{ {
META_ERROR("ini: Unable to open plugins file '%s': %s", inifile, strerror(errno)); META_ERROR("ini: Unable to open plugins file '%s': %s", inifile, strerror(errno));
RETURN_ERRNO(false, ME_NOFILE); return false;
} }
META_LOG("ini: Begin re-reading plugins list: %s", inifile); META_LOG("ini: Begin re-reading plugins list: %s", inifile);
@ -453,10 +449,7 @@ bool MPluginList::ini_refresh()
Q_memset(&pl_temp, 0, sizeof(pl_temp)); Q_memset(&pl_temp, 0, sizeof(pl_temp));
if (!pl_temp.ini_parseline(line)) if (!pl_temp.ini_parseline(line))
{ {
if (meta_errno == ME_FORMAT) META_ERROR("ini: Skipping malformed line %d of %s",ln, inifile);
{
META_ERROR("ini: Skipping malformed line %d of %s",ln, inifile);
}
continue; continue;
} }
// Try to find plugin with this pathname in the current list of // Try to find plugin with this pathname in the current list of
@ -510,7 +503,7 @@ bool MPluginList::ini_refresh()
// since we last loaded it. // since we last loaded it.
if (!pl_found->newer_file()) if (!pl_found->newer_file())
{ {
if (meta_errno == ME_NOFILE) if (1/*meta_errno == ME_NOFILE*/)
{ {
META_ERROR("ini: Skipping plugin, couldn't stat file '%s': %s", pl_found->pathname, strerror(errno)); META_ERROR("ini: Skipping plugin, couldn't stat file '%s': %s", pl_found->pathname, strerror(errno));
continue; continue;
@ -588,7 +581,7 @@ bool MPluginList::cmd_addload(const char* args)
{ {
// Already in list // Already in list
META_CONS("Plugin '%s' already in current list; file=%s desc='%s'", pl_temp.file, pl_found->file, pl_found->desc); META_CONS("Plugin '%s' already in current list; file=%s desc='%s'", pl_temp.file, pl_found->file, pl_found->desc);
RETURN_ERRNO(false, ME_ALREADY); return false;
} }
// new plugin; add to list // new plugin; add to list
if (!(pl_added = add(&pl_temp))) if (!(pl_added = add(&pl_temp)))
@ -603,9 +596,9 @@ bool MPluginList::cmd_addload(const char* args)
if (!pl_added->load(PT_ANYTIME)) if (!pl_added->load(PT_ANYTIME))
{ {
// load failed // load failed
if (meta_errno == ME_DELAYED) if (1/*meta_errno == ME_DELAYED*/)
META_CONS("Loaded plugin '%s', but will wait to become active, %s", pl_added->desc, pl_added->str_loadable(SL_ALLOWED)); META_CONS("Loaded plugin '%s', but will wait to become active, %s", pl_added->desc, pl_added->str_loadable(SL_ALLOWED));
else if (meta_errno == ME_NOTALLOWED) else if (1/*meta_errno == ME_NOTALLOWED*/)
{ {
META_CONS("Plugin '%s' couldn't attach; only allowed %s", pl_added->desc, pl_added->str_loadable(SL_ALLOWED)); META_CONS("Plugin '%s' couldn't attach; only allowed %s", pl_added->desc, pl_added->str_loadable(SL_ALLOWED));
pl_added->clear(); pl_added->clear();
@ -694,14 +687,14 @@ bool MPluginList::refresh(PLUG_LOADTIME now)
META_DEBUG(1, ("Loading plugin '%s'", iplug->desc)); META_DEBUG(1, ("Loading plugin '%s'", iplug->desc));
if (iplug->load(now)) if (iplug->load(now))
nloaded++; nloaded++;
else if (meta_errno == ME_DELAYED) else if (1/*meta_errno == ME_DELAYED*/)
ndelayed++; ndelayed++;
break; break;
case PA_RELOAD: case PA_RELOAD:
META_DEBUG(1, ("Reloading plugin '%s'", iplug->desc)); META_DEBUG(1, ("Reloading plugin '%s'", iplug->desc));
if (iplug->reload(now, PNL_FILE_NEWER)) if (iplug->reload(now, PNL_FILE_NEWER))
nreloaded++; nreloaded++;
else if (meta_errno == ME_DELAYED) else if (1/*meta_errno == ME_DELAYED*/)
ndelayed++; ndelayed++;
break; break;
case PA_NONE: case PA_NONE:
@ -712,7 +705,7 @@ bool MPluginList::refresh(PLUG_LOADTIME now)
iplug->action = PA_UNLOAD; iplug->action = PA_UNLOAD;
if (iplug->unload(now, PNL_INI_DELETED, PNL_INI_DELETED)) if (iplug->unload(now, PNL_INI_DELETED, PNL_INI_DELETED))
nunloaded++; nunloaded++;
else if (meta_errno == ME_DELAYED) else if (1/*meta_errno == ME_DELAYED*/)
ndelayed++; ndelayed++;
} }
break; break;
@ -721,7 +714,7 @@ bool MPluginList::refresh(PLUG_LOADTIME now)
META_DEBUG(1, ("Retrying attach plugin '%s'", iplug->desc)); META_DEBUG(1, ("Retrying attach plugin '%s'", iplug->desc));
if (iplug->retry(now, PNL_DELAYED)) if (iplug->retry(now, PNL_DELAYED))
nloaded++; nloaded++;
else if (meta_errno == ME_DELAYED) else if (1/*meta_errno == ME_DELAYED*/)
ndelayed++; ndelayed++;
break; break;
case PA_UNLOAD: case PA_UNLOAD:
@ -729,7 +722,7 @@ bool MPluginList::refresh(PLUG_LOADTIME now)
META_DEBUG(1, ("Retrying unload plugin '%s'", iplug->desc)); META_DEBUG(1, ("Retrying unload plugin '%s'", iplug->desc));
if (iplug->retry(now, PNL_DELAYED)) if (iplug->retry(now, PNL_DELAYED))
nunloaded++; nunloaded++;
else if (meta_errno == ME_DELAYED) else if (1/*meta_errno == ME_DELAYED*/)
ndelayed++; ndelayed++;
break; break;
case PA_NULL: case PA_NULL:

View File

@ -14,7 +14,6 @@ void MPlayer::set_cvar_query(const char *cvar)
// client cvar is queried. // client cvar is queried.
if (!cvar) if (!cvar)
{ {
meta_errno = ME_ARGUMENT;
return; return;
} }
@ -80,5 +79,5 @@ const char *MPlayerList::is_querying_cvar(const edict_t *pEntity) const
if (indx >= 1 && indx <= gpGlobals->maxClients) if (indx >= 1 && indx <= gpGlobals->maxClients)
return players[indx].is_querying_cvar(); return players[indx].is_querying_cvar();
RETURN_ERRNO(NULL, ME_NOTFOUND); return NULL;
} }

View File

@ -22,19 +22,19 @@ bool MPlugin::ini_parseline(char *line)
if (line[0] == '\0') if (line[0] == '\0')
{ {
META_DEBUG(7, ("ini: Ignoring empty line: %s", line)); META_DEBUG(7, ("ini: Ignoring empty line: %s", line));
RETURN_ERRNO(false, ME_BLANK); return false;
} }
if (line[0] == '#' || line[0] == ';' || Q_strstr(line, "//") == line) if (line[0] == '#' || line[0] == ';' || Q_strstr(line, "//") == line)
{ {
META_DEBUG(7, ("ini: Ignoring commented line: %s", line)); META_DEBUG(7, ("ini: Ignoring commented line: %s", line));
RETURN_ERRNO(false, ME_COMMENT); return false;
} }
// grab platform ("win32" or "linux") // grab platform ("win32" or "linux")
token = strtok_r(line, " \t", &ptr_token); token = strtok_r(line, " \t", &ptr_token);
if (!token) if (!token)
RETURN_ERRNO(false, ME_FORMAT); return false;
if (Q_stricmp(token, PLATFORM) == 0) if (Q_stricmp(token, PLATFORM) == 0)
{ {
pfspecific = 0; pfspecific = 0;
@ -47,14 +47,14 @@ bool MPlugin::ini_parseline(char *line)
{ {
// plugin is not for this OS // plugin is not for this OS
META_DEBUG(7, ("ini: Ignoring entry for %s", token)); META_DEBUG(7, ("ini: Ignoring entry for %s", token));
RETURN_ERRNO(false, ME_OSNOTSUP); return false;
} }
// grab filename // grab filename
token = strtok_r(NULL, " \t\r\n", &ptr_token); token = strtok_r(NULL, " \t\r\n", &ptr_token);
if (!token) if (!token)
{ {
RETURN_ERRNO(false, ME_FORMAT); return false;
} }
Q_strncpy(filename, token, sizeof filename - 1); Q_strncpy(filename, token, sizeof filename - 1);
@ -104,17 +104,17 @@ bool MPlugin::plugin_unload(plid_t plid, PLUG_LOADTIME now, PL_UNLOAD_REASON rea
if (!(pl_unloader = g_plugins->find(plid))) if (!(pl_unloader = g_plugins->find(plid)))
{ {
META_WARNING("dll: Not unloading plugin '%s'; plugin that requested unload is not found.", desc); META_WARNING("dll: Not unloading plugin '%s'; plugin that requested unload is not found.", desc);
RETURN_ERRNO(false, ME_BADREQ); return false;
} }
else if (pl_unloader->index == index) else if (pl_unloader->index == index)
{ {
META_WARNING("dll: Not unloading plugin '%s'; Plugin tried to unload itself.", desc); META_WARNING("dll: Not unloading plugin '%s'; Plugin tried to unload itself.", desc);
RETURN_ERRNO(false, ME_UNLOAD_SELF); return false;
} }
else if (is_unloader) else if (is_unloader)
{ {
META_WARNING("dll: Not unloading plugin '%s'; Plugin is unloading plugin that tried to unload it.", desc); META_WARNING("dll: Not unloading plugin '%s'; Plugin is unloading plugin that tried to unload it.", desc);
RETURN_ERRNO(false, ME_UNLOAD_UNLOADER); return false;
} }
else else
{ {
@ -137,10 +137,9 @@ bool MPlugin::plugin_unload(plid_t plid, PLUG_LOADTIME now, PL_UNLOAD_REASON rea
pl_unloader->is_unloader = false; pl_unloader->is_unloader = false;
//can't unload plugin now, set delayed //can't unload plugin now, set delayed
if (meta_errno == ME_DELAYED) if (0/*meta_errno == ME_DELAYED*/)
{ {
action = old_action; action = old_action;
meta_errno = ME_NOTALLOWED;
META_DEBUG(2, ("dll: Failed unload plugin '%s'; can't detach now: allowed=%s; now=%s", desc, str_unloadable(), str_loadtime(PT_ANYTIME, SL_SIMPLE))); META_DEBUG(2, ("dll: Failed unload plugin '%s'; can't detach now: allowed=%s; now=%s", desc, str_unloadable(), str_loadtime(PT_ANYTIME, SL_SIMPLE)));
} }
@ -196,12 +195,12 @@ bool MPlugin::cmd_parseline(const char *line)
// remove "load" // remove "load"
token = strtok_r(buf, " \t", &ptr_token); token = strtok_r(buf, " \t", &ptr_token);
if (!token) if (!token)
RETURN_ERRNO(false, ME_FORMAT); return false;
// grab filename // grab filename
token = strtok_r(NULL, " \t", &ptr_token); token = strtok_r(NULL, " \t", &ptr_token);
if (!token) if (!token)
RETURN_ERRNO(false, ME_FORMAT); return false;
Q_strncpy(filename, token, sizeof filename - 1); Q_strncpy(filename, token, sizeof filename - 1);
filename[sizeof filename - 1] = '\0'; filename[sizeof filename - 1] = '\0';
@ -248,22 +247,22 @@ bool MPlugin::check_input(void)
if (status < PL_VALID) if (status < PL_VALID)
{ {
META_ERROR("dll: Tried to operate on plugin[%d] with a non-valid status (%d)", index, str_status()); META_ERROR("dll: Tried to operate on plugin[%d] with a non-valid status (%d)", index, str_status());
RETURN_ERRNO(false, ME_ARGUMENT); return false;
} }
if (!file || !file[0]) if (!file || !file[0])
{ {
META_ERROR("dll: Tried to operate on plugin[%d] with an empty file", index); META_ERROR("dll: Tried to operate on plugin[%d] with an empty file", index);
RETURN_ERRNO(false, ME_ARGUMENT); return false;
} }
if (!filename[0]) if (!filename[0])
{ {
META_ERROR("dll: Tried to operate on plugin[%d] with an empty filename", index); META_ERROR("dll: Tried to operate on plugin[%d] with an empty filename", index);
RETURN_ERRNO(false, ME_ARGUMENT); return false;
} }
if (!pathname[0]) if (!pathname[0])
{ {
META_ERROR("dll: Tried to operate on plugin[%d] with an empty pathname", index); META_ERROR("dll: Tried to operate on plugin[%d] with an empty pathname", index);
RETURN_ERRNO(false, ME_ARGUMENT); return false;
} }
if (!desc[0]) if (!desc[0])
@ -308,7 +307,7 @@ bool MPlugin::resolve(void)
if (!found) if (!found)
{ {
META_DEBUG(2, ("Couldn't resolve '%s' to file", filename)); META_DEBUG(2, ("Couldn't resolve '%s' to file", filename));
RETURN_ERRNO(false, ME_NOTFOUND); return false;
} }
META_DEBUG(2, ("Resolved '%s' to file '%s'", filename, found)); META_DEBUG(2, ("Resolved '%s' to file '%s'", filename, found));
@ -574,17 +573,17 @@ bool MPlugin::load(PLUG_LOADTIME now)
if (!check_input()) if (!check_input())
{ {
// details logged, meta_errno set in check_input() // details logged, meta_errno set in check_input()
RETURN_ERRNO(false, ME_ARGUMENT); return false;
} }
if (status >= PL_RUNNING) if (status >= PL_RUNNING)
{ {
META_ERROR("dll: Not loading plugin '%s'; already loaded (status=%s)", desc, str_status()); META_ERROR("dll: Not loading plugin '%s'; already loaded (status=%s)", desc, str_status());
RETURN_ERRNO(false, ME_ALREADY); return false;
} }
if (action != PA_LOAD && action != PA_ATTACH) if (action != PA_LOAD && action != PA_ATTACH)
{ {
META_ERROR("dll: Not loading plugin '%s'; not marked for load (action=%s)", desc, str_action()); META_ERROR("dll: Not loading plugin '%s'; not marked for load (action=%s)", desc, str_action());
RETURN_ERRNO(false, ME_BADREQ); return false;
} }
if (status < PL_OPENED) if (status < PL_OPENED)
@ -593,13 +592,10 @@ bool MPlugin::load(PLUG_LOADTIME now)
if (!query()) if (!query())
{ {
META_ERROR("dll: Skipping plugin '%s'; couldn't query", desc); META_ERROR("dll: Skipping plugin '%s'; couldn't query", desc);
if (meta_errno != ME_DLOPEN)
{
if (!sys_module.unload()) if (!sys_module.unload())
{ {
META_ERROR("dll: Couldn't close plugin file '%s': %s", file, "invalid handle"); META_ERROR("dll: Couldn't close plugin file '%s': %s", file, "invalid handle");
} }
}
status = PL_BADFILE; status = PL_BADFILE;
info = NULL; //prevent crash info = NULL; //prevent crash
// meta_errno should be already set in query() // meta_errno should be already set in query()
@ -615,14 +611,14 @@ bool MPlugin::load(PLUG_LOADTIME now)
{ {
// will try to attach again at next opportunity // will try to attach again at next opportunity
META_DEBUG(2, ("dll: Delaying load plugin '%s'; can't attach now: allowed=%s; now=%s", desc, str_loadable(), str_loadtime(now, SL_SIMPLE))); META_DEBUG(2, ("dll: Delaying load plugin '%s'; can't attach now: allowed=%s; now=%s", desc, str_loadable(), str_loadtime(now, SL_SIMPLE)));
RETURN_ERRNO(false, ME_DELAYED); return false;
} }
else else
{ {
META_DEBUG(2, ("dll: Failed load plugin '%s'; can't attach now: allowed=%s; now=%s", desc, str_loadable(), str_loadtime(now, SL_SIMPLE))); META_DEBUG(2, ("dll: Failed load plugin '%s'; can't attach now: allowed=%s; now=%s", desc, str_loadable(), str_loadtime(now, SL_SIMPLE)));
// don't try to attach again later // don't try to attach again later
action = PA_NONE; action = PA_NONE;
RETURN_ERRNO(false, ME_NOTALLOWED); return false;
} }
} }
@ -683,7 +679,7 @@ bool MPlugin::query(void)
if (!sys_module.load(pathname)) if (!sys_module.load(pathname))
{ {
META_ERROR("dll: Failed query plugin '%s'; Couldn't open file '%s': %s", desc, pathname, sys_module.getloaderror()); META_ERROR("dll: Failed query plugin '%s'; Couldn't open file '%s': %s", desc, pathname, sys_module.getloaderror());
RETURN_ERRNO(false, ME_DLOPEN); return false;
} }
// First, we check to see if they have a Meta_Query. We would normally // First, we check to see if they have a Meta_Query. We would normally
@ -701,7 +697,7 @@ bool MPlugin::query(void)
{ {
META_ERROR("dll: Failed query plugin '%s'; Couldn't find Meta_Query(): %s", desc, "function not found"); META_ERROR("dll: Failed query plugin '%s'; Couldn't find Meta_Query(): %s", desc, "function not found");
// caller will dlclose() // caller will dlclose()
RETURN_ERRNO(false, ME_DLMISSING); return false;
} }
// Call Meta_Init, if present. This is an optional plugin routine to // Call Meta_Init, if present. This is an optional plugin routine to
@ -736,14 +732,13 @@ bool MPlugin::query(void)
// META_ERROR("dll: Couldn't find GiveFnptrsToDll() in plugin '%s': %s", desc, DLERROR()); // META_ERROR("dll: Couldn't find GiveFnptrsToDll() in plugin '%s': %s", desc, DLERROR());
META_ERROR("dll: Failed query plugin '%s'; Couldn't find GiveFnptrsToDll(): %s", desc, "function not found"); META_ERROR("dll: Failed query plugin '%s'; Couldn't find GiveFnptrsToDll(): %s", desc, "function not found");
// caller will dlclose() // caller will dlclose()
RETURN_ERRNO(false, ME_DLMISSING); return false;
} }
pfn_give_engfuncs(g_engine.pl_funcs, g_engine.globals); pfn_give_engfuncs(g_engine.pl_funcs, g_engine.globals);
META_DEBUG(6, ("dll: Plugin '%s': Called GiveFnptrsToDll()", desc)); META_DEBUG(6, ("dll: Plugin '%s': Called GiveFnptrsToDll()", desc));
// Call plugin's Meta_Query(), to pass our meta interface version, and get // Call plugin's Meta_Query(), to pass our meta interface version, and get
// plugin's info structure. // plugin's info structure.
meta_errno = ME_NOERROR;
info = NULL; info = NULL;
// Make a copy of the meta_util function table for each plugin, for the // Make a copy of the meta_util function table for each plugin, for the
@ -754,7 +749,6 @@ bool MPlugin::query(void)
{ {
META_ERROR("dll: Failed query plugin '%s'; Meta_Query returned error", META_ERROR("dll: Failed query plugin '%s'; Meta_Query returned error",
desc); desc);
meta_errno = ME_DLERROR;
} }
else else
{ {
@ -782,14 +776,12 @@ bool MPlugin::query(void)
if (pmajor > mmajor || (pmajor == mmajor && pminor > mminor)) if (pmajor > mmajor || (pmajor == mmajor && pminor > mminor))
{ {
META_ERROR("dll: Plugin '%s' requires a newer version of Metamod (Metamod needs at least interface %s not the current %s)", desc, info->ifvers, META_INTERFACE_VERSION); META_ERROR("dll: Plugin '%s' requires a newer version of Metamod (Metamod needs at least interface %s not the current %s)", desc, info->ifvers, META_INTERFACE_VERSION);
meta_errno = ME_IFVERSION;
} }
// If plugin has older major interface version, it's incompatible // If plugin has older major interface version, it's incompatible
// (update plugin). // (update plugin).
else if (pmajor < mmajor) else if (pmajor < mmajor)
{ {
META_ERROR("dll: Plugin '%s' is out of date and incompatible with this version of Metamod; please find a newer version of the plugin (plugin needs at least interface %s not the current %s)", desc, META_INTERFACE_VERSION, info->ifvers); META_ERROR("dll: Plugin '%s' is out of date and incompatible with this version of Metamod; please find a newer version of the plugin (plugin needs at least interface %s not the current %s)", desc, META_INTERFACE_VERSION, info->ifvers);
meta_errno = ME_IFVERSION;
} }
// Plugin has identical major, with older minor. This is supposed to be // Plugin has identical major, with older minor. This is supposed to be
// backwards compatible, so we warn, but we still accept it. // backwards compatible, so we warn, but we still accept it.
@ -799,14 +791,14 @@ bool MPlugin::query(void)
META_LOG("dll: Plugin '%s': unexpected version comparision; metavers=%s, mmajor=%d, mminor=%d; plugvers=%s, pmajor=%d, pminor=%d", desc, META_INTERFACE_VERSION, mmajor, mminor, info->ifvers, pmajor, pminor); META_LOG("dll: Plugin '%s': unexpected version comparision; metavers=%s, mmajor=%d, mminor=%d; plugvers=%s, pmajor=%d, pminor=%d", desc, META_INTERFACE_VERSION, mmajor, mminor, info->ifvers, pmajor, pminor);
} }
if (meta_errno == ME_IFVERSION) if (0/*meta_errno == ME_IFVERSION*/)
{ {
META_ERROR("dll: Rejected plugin '%s' due to interface version incompatibility (mm=%s, pl=%s)", desc, META_INTERFACE_VERSION, info->ifvers); META_ERROR("dll: Rejected plugin '%s' due to interface version incompatibility (mm=%s, pl=%s)", desc, META_INTERFACE_VERSION, info->ifvers);
// meta_errno is set already above // meta_errno is set already above
// caller will dlclose() // caller will dlclose()
return false; return false;
} }
else if (meta_errno != ME_NOERROR) else if (0/*meta_errno != ME_NOERROR*/) // TODO
// some other error, already logged // some other error, already logged
return false; return false;
@ -814,7 +806,7 @@ bool MPlugin::query(void)
{ {
META_ERROR("dll: Failed query plugin '%s'; Empty info structure", desc); META_ERROR("dll: Failed query plugin '%s'; Empty info structure", desc);
// caller will dlclose() // caller will dlclose()
RETURN_ERRNO(false, ME_NULLRESULT); return false;
} }
// Replace temporary desc with plugin's internal name. // Replace temporary desc with plugin's internal name.
@ -863,7 +855,7 @@ bool MPlugin::attach(PLUG_LOADTIME now)
if (!gamedll_funcs.dllapi_table) if (!gamedll_funcs.dllapi_table)
{ {
META_ERROR("dll: Failed attach plugin '%s': Failed malloc() for dllapi_table"); META_ERROR("dll: Failed attach plugin '%s': Failed malloc() for dllapi_table");
RETURN_ERRNO(false, ME_NOMEM); return false;
} }
Q_memcpy(gamedll_funcs.dllapi_table, GameDLL.funcs.dllapi_table, sizeof(DLL_FUNCTIONS)); Q_memcpy(gamedll_funcs.dllapi_table, GameDLL.funcs.dllapi_table, sizeof(DLL_FUNCTIONS));
} }
@ -873,7 +865,7 @@ bool MPlugin::attach(PLUG_LOADTIME now)
if (!gamedll_funcs.newapi_table) if (!gamedll_funcs.newapi_table)
{ {
META_ERROR("dll: Failed attach plugin '%s': Failed malloc() for newapi_table"); META_ERROR("dll: Failed attach plugin '%s': Failed malloc() for newapi_table");
RETURN_ERRNO(false, ME_NOMEM); return false;
} }
static_cast<meta_new_dll_functions_t *>(gamedll_funcs.newapi_table)->set_from(GameDLL.funcs.newapi_table); static_cast<meta_new_dll_functions_t *>(gamedll_funcs.newapi_table)->set_from(GameDLL.funcs.newapi_table);
} }
@ -881,7 +873,7 @@ bool MPlugin::attach(PLUG_LOADTIME now)
{ {
META_ERROR("dll: Failed attach plugin '%s': Couldn't find Meta_Attach(): %s", desc, "function not found"); META_ERROR("dll: Failed attach plugin '%s': Couldn't find Meta_Attach(): %s", desc, "function not found");
// caller will dlclose() // caller will dlclose()
RETURN_ERRNO(false, ME_DLMISSING); return false;
} }
Q_memset(&meta_table, 0, sizeof(meta_table)); Q_memset(&meta_table, 0, sizeof(meta_table));
@ -892,7 +884,7 @@ bool MPlugin::attach(PLUG_LOADTIME now)
{ {
META_ERROR("dll: Failed attach plugin '%s': Error from Meta_Attach(): %d", desc, ret); META_ERROR("dll: Failed attach plugin '%s': Error from Meta_Attach(): %d", desc, ret);
// caller will dlclose() // caller will dlclose()
RETURN_ERRNO(false, ME_DLERROR); return false;
} }
META_DEBUG(6, ("dll: Plugin '%s': Called Meta_Attach() successfully", desc)); META_DEBUG(6, ("dll: Plugin '%s': Called Meta_Attach() successfully", desc));
@ -996,20 +988,20 @@ bool MPlugin::unload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason, PL_UNLOAD_REASO
if (!check_input()) if (!check_input())
{ {
// details logged, meta_errno set in check_input() // details logged, meta_errno set in check_input()
RETURN_ERRNO(false, ME_ARGUMENT); return false;
} }
if (status < PL_RUNNING) if (status < PL_RUNNING)
{ {
if (reason != PNL_CMD_FORCED && reason != PNL_RELOAD) if (reason != PNL_CMD_FORCED && reason != PNL_RELOAD)
{ {
META_ERROR("dll: Not unloading plugin '%s'; already unloaded (status=%s)", desc, str_status()); META_ERROR("dll: Not unloading plugin '%s'; already unloaded (status=%s)", desc, str_status());
RETURN_ERRNO(false, ME_ALREADY); return false;
} }
} }
if (action != PA_UNLOAD && action != PA_RELOAD) if (action != PA_UNLOAD && action != PA_RELOAD)
{ {
META_WARNING("dll: Not unloading plugin '%s'; not marked for unload (action=%s)", desc, str_action()); META_WARNING("dll: Not unloading plugin '%s'; not marked for unload (action=%s)", desc, str_action());
RETURN_ERRNO(false, ME_BADREQ); return false;
} }
// Are we allowed to detach this plugin at this time? // Are we allowed to detach this plugin at this time?
@ -1027,14 +1019,14 @@ bool MPlugin::unload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason, PL_UNLOAD_REASO
META_DEBUG(2, ("dll: Delaying unload plugin '%s'; can't detach now: allowed=%s; now=%s", desc, str_unloadable(), str_loadtime(now, SL_SIMPLE))); META_DEBUG(2, ("dll: Delaying unload plugin '%s'; can't detach now: allowed=%s; now=%s", desc, str_unloadable(), str_loadtime(now, SL_SIMPLE)));
// caller should give message to user // caller should give message to user
// try to unload again at next opportunity // try to unload again at next opportunity
RETURN_ERRNO(false, ME_DELAYED); return false;
} }
else else
{ {
META_DEBUG(2, ("dll: Failed unload plugin '%s'; can't detach now: allowed=%s; now=%s", desc, str_unloadable(), str_loadtime(now, SL_SIMPLE))); META_DEBUG(2, ("dll: Failed unload plugin '%s'; can't detach now: allowed=%s; now=%s", desc, str_unloadable(), str_loadtime(now, SL_SIMPLE)));
// don't try to unload again later // don't try to unload again later
action = PA_NONE; action = PA_NONE;
RETURN_ERRNO(false, ME_NOTALLOWED); return false;
} }
} }
} }
@ -1121,14 +1113,14 @@ bool MPlugin::detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
{ {
META_ERROR("dll: Error detach plugin '%s': Couldn't find Meta_Detach(): %s", desc, "function not found"); META_ERROR("dll: Error detach plugin '%s': Couldn't find Meta_Detach(): %s", desc, "function not found");
// caller will dlclose() // caller will dlclose()
RETURN_ERRNO(false, ME_DLMISSING); return false;
} }
ret = pfn_detach(now, reason); ret = pfn_detach(now, reason);
if (ret != TRUE) if (ret != TRUE)
{ {
META_ERROR("dll: Failed detach plugin '%s': Error from Meta_Detach(): %d", desc, ret); META_ERROR("dll: Failed detach plugin '%s': Error from Meta_Detach(): %d", desc, ret);
RETURN_ERRNO(false, ME_DLERROR); return false;
} }
META_DEBUG(6, ("dll: Plugin '%s': Called Meta_Detach() successfully", desc)); META_DEBUG(6, ("dll: Plugin '%s': Called Meta_Detach() successfully", desc));
@ -1146,7 +1138,7 @@ bool MPlugin::reload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
if (!check_input()) if (!check_input())
{ {
// details logged, meta_errno set in check_input() // details logged, meta_errno set in check_input()
RETURN_ERRNO(false, ME_ARGUMENT); return false;
} }
// Are we allowed to load this plugin at this time? // Are we allowed to load this plugin at this time?
// If we cannot load the plugin after unloading it, we keep it. // If we cannot load the plugin after unloading it, we keep it.
@ -1157,14 +1149,14 @@ bool MPlugin::reload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
META_DEBUG(2, ("dll: Delaying reload plugin '%s'; would not be able to reattach now: allowed=%s; now=%s", desc, str_loadable(), str_loadtime(now, SL_SIMPLE))); META_DEBUG(2, ("dll: Delaying reload plugin '%s'; would not be able to reattach now: allowed=%s; now=%s", desc, str_loadable(), str_loadtime(now, SL_SIMPLE)));
// caller should give message to user // caller should give message to user
// try to reload again at next opportunity // try to reload again at next opportunity
RETURN_ERRNO(false, ME_DELAYED); return false;
} }
else else
{ {
META_DEBUG(2, ("dll: Failed reload plugin '%s'; would not be able to reattach now: allowed=%s; now=%s", desc, str_loadable(), str_loadtime(now, SL_SIMPLE))); META_DEBUG(2, ("dll: Failed reload plugin '%s'; would not be able to reattach now: allowed=%s; now=%s", desc, str_loadable(), str_loadtime(now, SL_SIMPLE)));
// don't try to reload again later // don't try to reload again later
action = PA_NONE; action = PA_NONE;
RETURN_ERRNO(false, ME_NOTALLOWED); return false;
} }
} }
@ -1201,12 +1193,12 @@ bool MPlugin::pause()
if (status == PL_PAUSED) if (status == PL_PAUSED)
{ {
META_ERROR("Not pausing plugin '%s'; already paused", desc); META_ERROR("Not pausing plugin '%s'; already paused", desc);
RETURN_ERRNO(false, ME_ALREADY); return false;
} }
if (status != PL_RUNNING) if (status != PL_RUNNING)
{ {
META_ERROR("Cannot pause plugin '%s'; not currently running (status=%s)", desc, str_status()); META_ERROR("Cannot pause plugin '%s'; not currently running (status=%s)", desc, str_status());
RETURN_ERRNO(false, ME_BADREQ); return false;
} }
// are we allowed to pause this plugin? // are we allowed to pause this plugin?
@ -1214,7 +1206,7 @@ bool MPlugin::pause()
{ {
META_ERROR("Cannot pause plugin '%s'; not allowed by plugin (allowed=%s)", desc, str_unloadable()); META_ERROR("Cannot pause plugin '%s'; not allowed by plugin (allowed=%s)", desc, str_unloadable());
action = PA_NONE; action = PA_NONE;
RETURN_ERRNO(false, ME_NOTALLOWED); return false;
} }
status = PL_PAUSED; status = PL_PAUSED;
@ -1230,7 +1222,7 @@ bool MPlugin::unpause()
if (status != PL_PAUSED) if (status != PL_PAUSED)
{ {
META_ERROR("Cannot unpause plugin '%s'; not currently paused (status=%s)", desc, str_status()); META_ERROR("Cannot unpause plugin '%s'; not currently paused (status=%s)", desc, str_status());
RETURN_ERRNO(false, ME_BADREQ); return false;
} }
status = PL_RUNNING; status = PL_RUNNING;
@ -1257,7 +1249,7 @@ bool MPlugin::retry(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
else else
{ {
META_ERROR("No pending action to retry for plugin '%s'; (status=%s, action=%s)", desc, str_status(), str_action()); META_ERROR("No pending action to retry for plugin '%s'; (status=%s, action=%s)", desc, str_status(), str_action());
RETURN_ERRNO(false, ME_BADREQ); return false;
} }
} }
@ -1271,7 +1263,7 @@ bool MPlugin::clear(void)
if (status != PL_FAILED && status != PL_BADFILE && status != PL_EMPTY && status != PL_OPENED) if (status != PL_FAILED && status != PL_BADFILE && status != PL_EMPTY && status != PL_OPENED)
{ {
META_ERROR("Cannot clear plugin '%s'; not marked as failed, empty, or open (status=%s)", desc, str_status()); META_ERROR("Cannot clear plugin '%s'; not marked as failed, empty, or open (status=%s)", desc, str_status());
RETURN_ERRNO(false, ME_BADREQ); return false;
} }
// If file is open, close the file. Note: after this, attempts to // If file is open, close the file. Note: after this, attempts to
// reference any memory locations in the file will produce a segfault. // reference any memory locations in the file will produce a segfault.
@ -1279,7 +1271,7 @@ bool MPlugin::clear(void)
{ {
META_ERROR("dll: Couldn't close plugin file '%s': %s", file, "invalid handle"); META_ERROR("dll: Couldn't close plugin file '%s': %s", file, "invalid handle");
status = PL_FAILED; status = PL_FAILED;
RETURN_ERRNO(false, ME_DLERROR); return false;
} }
if (gamedll_funcs.dllapi_table) Q_free(gamedll_funcs.dllapi_table); if (gamedll_funcs.dllapi_table) Q_free(gamedll_funcs.dllapi_table);
@ -1417,14 +1409,14 @@ bool MPlugin::newer_file()
time_t file_time; time_t file_time;
if (stat(pathname, &st) != 0) if (stat(pathname, &st) != 0)
RETURN_ERRNO(false, ME_NOFILE); return false;
file_time = st.st_ctime > st.st_mtime ? st.st_ctime : st.st_mtime; file_time = st.st_ctime > st.st_mtime ? st.st_ctime : st.st_mtime;
META_DEBUG(5, ("newer_file? file=%s; load=%d, file=%d; ctime=%d, mtime=%d", file, time_loaded, file_time, st.st_ctime, st.st_mtime)); META_DEBUG(5, ("newer_file? file=%s; load=%d, file=%d; ctime=%d, mtime=%d", file, time_loaded, file_time, st.st_ctime, st.st_mtime));
if (file_time > time_loaded) if (file_time > time_loaded)
return true; return true;
else else
RETURN_ERRNO(false, ME_NOERROR); return false;
} }
// Return a string describing status of plugin. // Return a string describing status of plugin.

View File

@ -149,7 +149,7 @@ bool MRegCvar::set(cvar_t *src) const
if (Q_stricmp(src->name, data->name)) if (Q_stricmp(src->name, data->name))
{ {
META_ERROR("Tried to set cvar with mismatched name; src=%s dst=%s", src->name, data->name); META_ERROR("Tried to set cvar with mismatched name; src=%s dst=%s", src->name, data->name);
RETURN_ERRNO(false, ME_ARGUMENT); return false;
} }
// Would like to free() existing string, but can't tell where it was // Would like to free() existing string, but can't tell where it was
@ -192,7 +192,7 @@ MRegCvar *MRegCvarList::add(const char *addname)
if (!temp) if (!temp)
{ {
META_ERROR("Couldn't grow registered cvar list to %d for '%s'; %s", newsize, addname, strerror(errno)); META_ERROR("Couldn't grow registered cvar list to %d for '%s'; %s", newsize, addname, strerror(errno));
RETURN_ERRNO(NULL, ME_NOMEM); return NULL;
} }
vlist = temp; vlist = temp;
size = newsize; size = newsize;
@ -212,14 +212,14 @@ MRegCvar *MRegCvarList::add(const char *addname)
if (!icvar->data) if (!icvar->data)
{ {
META_ERROR("Couldn't malloc cvar for adding reg cvar name '%s': %s", addname, strerror(errno)); META_ERROR("Couldn't malloc cvar for adding reg cvar name '%s': %s", addname, strerror(errno));
RETURN_ERRNO(NULL, ME_NOMEM); return NULL;
} }
icvar->data->name = Q_strdup(addname); icvar->data->name = Q_strdup(addname);
if (!icvar->data->name) if (!icvar->data->name)
{ {
META_ERROR("Couldn't Q_strdup for adding reg cvar name '%s': %s", addname, strerror(errno)); META_ERROR("Couldn't Q_strdup for adding reg cvar name '%s': %s", addname, strerror(errno));
RETURN_ERRNO(NULL, ME_NOMEM); return NULL;
} }
endlist++; endlist++;
return icvar; return icvar;
@ -236,7 +236,7 @@ MRegCvar *MRegCvarList::find(const char *findname)
return &vlist[i]; return &vlist[i];
} }
RETURN_ERRNO(NULL, ME_NOTFOUND); return NULL;
} }
// Disable any cvars belonging to the given plugin (by index id). // Disable any cvars belonging to the given plugin (by index id).
@ -351,7 +351,7 @@ MRegMsg *MRegMsgList::add(const char *addname, int addmsgid, int addsize)
{ {
// all slots used // all slots used
META_ERROR("Couldn't add registered msg '%s' to list; reached max msgs (%d)", addname, size); META_ERROR("Couldn't add registered msg '%s' to list; reached max msgs (%d)", addname, size);
RETURN_ERRNO(NULL, ME_MAXREACHED); return NULL;
} }
MRegMsg *imsg = &mlist[endlist]; MRegMsg *imsg = &mlist[endlist];
@ -378,7 +378,7 @@ MRegMsg *MRegMsgList::find(const char *findname)
return &mlist[i]; return &mlist[i];
} }
RETURN_ERRNO(NULL, ME_NOTFOUND); return NULL;
} }
// Try to find a registered msg with the given msgid. // Try to find a registered msg with the given msgid.
@ -392,7 +392,7 @@ MRegMsg *MRegMsgList::find(int findmsgid)
return &mlist[i]; return &mlist[i];
} }
RETURN_ERRNO(NULL, ME_NOTFOUND); return NULL;
} }
// List the registered usermsgs for the gamedll. // List the registered usermsgs for the gamedll.

View File

@ -254,16 +254,15 @@ int EXT_FUNC mutil_LoadMetaPlugin(plid_t plid, const char* fname, PLUG_LOADTIME
MPlugin *pl_loaded; MPlugin *pl_loaded;
if (!fname) if (!fname)
{ {
return ME_ARGUMENT; return 1;
} }
meta_errno = ME_NOERROR;
if (!(pl_loaded = g_plugins->plugin_addload(plid, fname, now))) if (!(pl_loaded = g_plugins->plugin_addload(plid, fname, now)))
{ {
if (plugin_handle) if (plugin_handle)
*plugin_handle = nullptr; *plugin_handle = nullptr;
return meta_errno; return 1;
} }
else else
{ {
@ -281,7 +280,7 @@ int EXT_FUNC mutil_UnloadMetaPlugin(plid_t plid, const char *fname, PLUG_LOADTIM
if (!fname) if (!fname)
{ {
return ME_ARGUMENT; return 1;
} }
pindex = strtol(fname, &endptr, 10); pindex = strtol(fname, &endptr, 10);
@ -291,14 +290,12 @@ int EXT_FUNC mutil_UnloadMetaPlugin(plid_t plid, const char *fname, PLUG_LOADTIM
findp = g_plugins->find_match(fname); findp = g_plugins->find_match(fname);
if (!findp) if (!findp)
return meta_errno; return 1;
meta_errno = ME_NOERROR;
if (findp->plugin_unload(plid, now, reason)) if (findp->plugin_unload(plid, now, reason))
return 0; return 0;
return meta_errno; return 1;
} }
int EXT_FUNC mutil_UnloadMetaPluginByHandle(plid_t plid, void *plugin_handle, PLUG_LOADTIME now, PL_UNLOAD_REASON reason) int EXT_FUNC mutil_UnloadMetaPluginByHandle(plid_t plid, void *plugin_handle, PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
@ -307,18 +304,16 @@ int EXT_FUNC mutil_UnloadMetaPluginByHandle(plid_t plid, void *plugin_handle, PL
if (!plugin_handle) if (!plugin_handle)
{ {
return ME_ARGUMENT; return 1;
} }
if (!(findp = g_plugins->find((module_handle_t)plugin_handle))) if (!(findp = g_plugins->find((module_handle_t)plugin_handle)))
return ME_NOTFOUND; return 1;
meta_errno = ME_NOERROR;
if (findp->plugin_unload(plid, now, reason)) if (findp->plugin_unload(plid, now, reason))
return 0; return 0;
return meta_errno; return 1;
} }
const char* EXT_FUNC mutil_IsQueryingClientCvar(plid_t plid, const edict_t* pEdict) const char* EXT_FUNC mutil_IsQueryingClientCvar(plid_t plid, const edict_t* pEdict)

View File

@ -172,7 +172,7 @@ bool IS_VALID_PTR(void *memptr)
bool IS_VALID_PTR(void *memptr) bool IS_VALID_PTR(void *memptr)
{ {
if (IsBadCodePtr((FARPROC) memptr)) if (IsBadCodePtr((FARPROC) memptr))
RETURN_ERRNO(false, ME_BADMEMPTR); return false;
else else
return true; return true;
} }

View File

@ -28,12 +28,12 @@ void EXT_FUNC meta_command_handler()
// to a generic command-handler function (see above). // to a generic command-handler function (see above).
void EXT_FUNC meta_AddServerCommand(char *cmd_name, void (*function)()) void EXT_FUNC meta_AddServerCommand(char *cmd_name, void (*function)())
{ {
MPlugin *iplug = g_plugins->find_memloc(function); MPlugin *plug = g_plugins->find_memloc(function);
META_DEBUG(4, ("called: meta_AddServerCommand; cmd_name=%s, function=%d", cmd_name, function)); META_DEBUG(4, ("called: meta_AddServerCommand; cmd_name=%s, function=%d, plugin=%s", cmd_name, function, plug ? plug->file : "unknown"));
// try to find which plugin is registering this command // try to find which plugin is registering this command
if (!iplug) { if (!plug) {
META_ERROR("Failed to find memloc for regcmd '%s'", cmd_name); META_ERROR("Failed to find memloc for regcmd '%s'", cmd_name);
} }
@ -42,7 +42,7 @@ void EXT_FUNC meta_AddServerCommand(char *cmd_name, void (*function)())
if (!icmd) if (!icmd)
{ {
// If not found, add. // If not found, add.
icmd = g_regCmds->add(cmd_name, function, iplug); icmd = g_regCmds->add(cmd_name, function, plug);
if (!icmd) if (!icmd)
{ {
return; return;

View File

@ -1,7 +1,5 @@
#include "precompiled.h" #include "precompiled.h"
META_ERRNO meta_errno;
void __declspec(noreturn) do_exit(int exitval) void __declspec(noreturn) do_exit(int exitval)
{ {
//TerminateProcess(GetCurrentProcess(), 1); //TerminateProcess(GetCurrentProcess(), 1);

View File

@ -1,39 +1 @@
#pragma once #pragma once
// Like C's errno, for our various functions; describes causes of failure
// or false returns.
enum META_ERRNO
{
ME_NOERROR = 0,
ME_FORMAT, // invalid format
ME_COMMENT, // ignored comment
ME_BLANK, // ignored blank (empty) line
ME_ALREADY, // request had already been done
ME_DELAYED, // request is delayed
ME_NOTALLOWED, // request not allowed
ME_SKIPPED, // request is being skipped for whatever reason
ME_BADREQ, // invalid request for this <whatever>
ME_ARGUMENT, // invalid arguments
ME_NULLRESULT, // resulting data was empty or null
ME_MAXREACHED, // reached max/limit
ME_NOTUNIQ, // not unique (ambigious match)
ME_NOTFOUND, // in find operation, match not found
ME_NOFILE, // file empty or missing
ME_NOMEM, // malloc failed
ME_BADMEMPTR, // invalid memory address
ME_OSNOTSUP, // OS doesn't support this operation
ME_DLOPEN, // failed to open shared lib/dll
ME_DLMISSING, // symbol missing in lib/dll
ME_DLERROR, // some other error encountered calling functions from dll
ME_IFVERSION, // incompatible interface version
ME_UNLOAD_UNLOADER, // tried to unload unloader
ME_UNLOAD_SELF, // tried to unload self
};
extern META_ERRNO meta_errno;
#define RETURN_ERRNO(retval, errval) \
do { meta_errno = errval; return retval; } while (0)
#define RETURN_LOGERR_ERRNO(errargs, retval, errval) \
do { META_ERROR errargs; meta_errno = errval; return retval; } while (0)