summaryrefslogblamecommitdiff
path: root/src/common/HPM.h
blob: e685b3068a975f6a803f11c3fc2b1cf43b9751e9 (plain) (tree)



















                                                              
                
                          




                                                                                                          












                                                      
               













                                   




















                                      







                                                                                                  




                                       


                          




                                    





                                                 

                            



                                          
                                                        



                                                 
                                                              


                                       
                                                                       



                                                                                       
                                                                                                          


                                                                                  





                          
                    
// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// See the LICENSE file

#ifndef	_HPM_H_
#define _HPM_H_

#include "../common/cbasetypes.h"
#include "../common/HPMi.h"

#ifdef WIN32
	#ifndef WIN32_LEAN_AND_MEAN
		#define WIN32_LEAN_AND_MEAN
	#endif
	#include <windows.h>
	#define plugin_open(x)		LoadLibraryA(x)
	#define plugin_import(x,y,z)	(z)GetProcAddress(x,y)
	#define plugin_close(x)	FreeLibrary(x)

	#define DLL_EXT			".dll"
	#define DLL				HINSTANCE
#else // ! WIN32
	#include <dlfcn.h>
	#ifdef RTLD_DEEPBIND // Certain linux ditributions require this, but it's not available everywhere
		#define plugin_open(x)		dlopen(x,RTLD_NOW|RTLD_DEEPBIND)
	#else // ! RTLD_DEEPBIND
		#define plugin_open(x)		dlopen(x,RTLD_NOW)
	#endif // RTLD_DEEPBIND
	#define plugin_import(x,y,z)	(z)dlsym(x,y)
	#define plugin_close(x)	dlclose(x)

	#ifdef CYGWIN
		#define DLL_EXT		".dll"
	#else
		#define DLL_EXT		".so"
	#endif

	#define DLL				void *

	#include <string.h> // size_t

#endif // WIN32

struct hplugin {
	DLL dll;
	unsigned int idx;
	char *filename;
	struct hplugin_info *info;
	struct HPMi_interface *hpi;
};

struct hpm_symbol {
	char *name;
	void *ptr;
};

struct HPluginData {
	unsigned int pluginID;
	unsigned int type;
	struct {
		unsigned int free : 1;
	} flag;
	void *data;
};

struct HPluginPacket {
	unsigned int pluginID;
	unsigned short cmd;
	short len;
	void (*receive) (int fd);
};

struct HPMFileNameCache {
	const char *addr;
	char *name;
};

struct HPMArgData {
	unsigned int pluginID;
	char *name;/* e.g. "--my-arg","-v","--whatever" */
	void (*help) (void);/* to display when --help is used */
	void (*func) (char *param);/* NULL when no param is available */
	bool has_param;/* because of the weird "--arg<space>param" instead of the "--arg=param" */
};

/* Hercules Plugin Manager Interface */
struct HPM_interface {
	/* vars */
	unsigned int version[2];
	bool off;
	bool hooking;
	/* hooking */
	bool force_return;
	/* data */
	struct hplugin **plugins;
	unsigned int plugin_count;
	struct hpm_symbol **symbols;
	unsigned int symbol_count;
	/* packet hooking points */
	struct HPluginPacket *packets[hpPHP_MAX];
	unsigned int packetsc[hpPHP_MAX];
	/* plugin file ptr caching */
	struct HPMFileNameCache *fnames;
	unsigned int fnamec;
	/* --command-line */
	DBMap *arg_db;
	/* funcs */
	void (*init) (void);
	void (*final) (void);
	struct hplugin * (*create) (void);
	struct hplugin * (*load) (const char* filename);
	void (*unload) (struct hplugin* plugin);
	bool (*exists) (const char *filename);
	bool (*iscompatible) (char* version);
	void (*event) (enum hp_event_types type);
	void *(*import_symbol) (char *name, unsigned int pID);
	void (*share) (void *, char *);
	void (*symbol_defaults) (void);
	void (*config_read) (void);
	bool (*populate) (struct hplugin *plugin,const char *filename);
	void (*symbol_defaults_sub) (void);//TODO drop
	char *(*pid2name) (unsigned int pid);
	unsigned char (*parse_packets) (int fd, enum HPluginPacketHookingPoints point);
	void (*load_sub) (struct hplugin *plugin);
	bool (*addhook_sub) (enum HPluginHookType type, const char *target, void *hook, unsigned int pID);
	bool (*parse_arg) (const char *arg, int* index, char *argv[], bool param);
	void (*arg_help) (void);
	int (*arg_db_clear_sub) (DBKey key, DBData *data, va_list args);
} HPM_s;

struct HPM_interface *HPM;

void hpm_defaults(void);

#endif /* _HPM_H_ */