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