summaryrefslogtreecommitdiff
path: root/src/common/HPM.h
blob: 9a6bda7138de162294d4b9a3b8ca8caafa7c5bb3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// 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" */
};

struct HPDataOperationStorage {
	void **HPDataSRCPtr;
	unsigned int *hdatac;
};

/* 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);
	void (*grabHPData) (struct HPDataOperationStorage *ret, enum HPluginDataTypes type, void *ptr);
	/* for server-specific HPData e.g. map_session_data */
	void (*grabHPDataSub) (struct HPDataOperationStorage *ret, enum HPluginDataTypes type, void *ptr);
} HPM_s;

struct HPM_interface *HPM;

void hpm_defaults(void);

#endif /* _HPM_H_ */