1 /*
2  * Copyright (c) 2005-2006 Atheme Development Group
3  * Rights to this code are as documented in doc/LICENSE.
4  *
5  * A simple module inspector.
6  *
7  */
8 
9 #include "atheme.h"
10 
11 DECLARE_MODULE_V1
12 (
13 	"operserv/modinspect", false, _modinit, _moddeinit,
14 	PACKAGE_STRING,
15 	VENDOR_STRING
16 );
17 
18 static void os_cmd_modinspect(sourceinfo_t *si, int parc, char *parv[]);
19 
20 command_t os_modinspect = { "MODINSPECT", N_("Displays information about loaded modules."), PRIV_SERVER_AUSPEX, 1, os_cmd_modinspect, { .path = "oservice/modinspect" } };
21 
_modinit(module_t * m)22 void _modinit(module_t *m)
23 {
24 	service_named_bind_command("operserv", &os_modinspect);
25 }
26 
_moddeinit(module_unload_intent_t intent)27 void _moddeinit(module_unload_intent_t intent)
28 {
29 	service_named_unbind_command("operserv", &os_modinspect);
30 }
31 
os_cmd_modinspect(sourceinfo_t * si,int parc,char * parv[])32 static void os_cmd_modinspect(sourceinfo_t *si, int parc, char *parv[])
33 {
34 	char *mname = parv[0];
35 	module_t *m;
36 
37 	if (!mname)
38 	{
39 		command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "MODINSPECT");
40 		command_fail(si, fault_needmoreparams, _("Syntax: MODINSPECT <module>"));
41 		return;
42 	}
43 
44 	logcommand(si, CMDLOG_GET, "MODINSPECT: \2%s\2", mname);
45 
46 	m = module_find_published(mname);
47 
48 	if (!m)
49 	{
50 		command_fail(si, fault_nosuch_target, _("\2%s\2 is not loaded."), mname);
51 		return;
52 	}
53 
54 	/* Is there a header? */
55 	if (!m->header)
56 	{
57 		command_fail(si, fault_unimplemented, _("\2%s\2 cannot be inspected."), mname);
58 		return;
59 	}
60 
61 	command_success_nodata(si, _("Information on \2%s\2:"), mname);
62 	command_success_nodata(si, _("Name       : %s"), m->name);
63 	command_success_nodata(si, _("Address    : %p"), m->address);
64 	command_success_nodata(si, _("Entry point: %p"), m->header->modinit);
65 	command_success_nodata(si, _("Exit point : %p"), m->header->deinit);
66 	command_success_nodata(si, _("SDK Serial : %s"), m->header->serial);
67 	command_success_nodata(si, _("Version    : %s"), m->header->version);
68 	command_success_nodata(si, _("Vendor     : %s"), m->header->vendor);
69 	command_success_nodata(si, _("Can unload : %s"), m->can_unload == MODULE_UNLOAD_CAPABILITY_OK ? "Yes" :
70 					( m->can_unload == MODULE_UNLOAD_CAPABILITY_NEVER ? "No" : "Reload only"));
71 	command_success_nodata(si, _("*** \2End of Info\2 ***"));
72 }
73 
74 /* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs
75  * vim:ts=8
76  * vim:sw=8
77  * vim:noexpandtab
78  */
79