ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/contrib/os_testcmd.C
Revision: 1.6
Committed: Sat Sep 22 14:27:27 2007 UTC (19 years, 1 month ago) by pippijn
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.5: +3 -3 lines
Log Message:
split up ermyth into ermyth-modules, libermyth (currently just ermyth-util) and ermyth-core

File Contents

# User Rev Content
1 pippijn 1.5 /**
2     * os_testcmd.C: Calls a command without a user_t.
3     *
4     * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team
5     * Rights to this code are as documented in COPYING.
6     *
7     *
8     * Portions of this file were derived from sources bearing the following license:
9 pippijn 1.3 * Copyright © 2006 Jilles Tjoelker, et al
10 pippijn 1.2 * Rights to this code are as documented in doc/pod/license.pod.
11 pippijn 1.1 *
12 pippijn 1.6 * $Id: os_testcmd.C,v 1.5 2007-09-16 18:54:43 pippijn Exp $
13 pippijn 1.1 */
14    
15     #include "atheme.h"
16 pippijn 1.3 #include <ermyth/module.h>
17 pippijn 1.1
18 pippijn 1.6 static char const rcsid[] = "$Id: os_testcmd.C,v 1.5 2007-09-16 18:54:43 pippijn Exp $";
19 pippijn 1.3
20 pippijn 1.6 REGISTER_MODULE ("operserv/testcmd", false, "The Ermyth Team <http://ermyth.xinutec.org>");
21 pippijn 1.1
22     struct testcmddata
23     {
24     sourceinfo_t *prevsi;
25     bool got_result;
26     };
27    
28     static void os_cmd_testcmd (sourceinfo_t *si, int parc, char *parv[]);
29    
30 pippijn 1.4 static void testcmd_command_fail (sourceinfo_t *si, fault::code code, char const * const message);
31 pippijn 1.3 static void testcmd_command_success_nodata (sourceinfo_t *si, char const * const message);
32     static void testcmd_command_success_string (sourceinfo_t *si, char const * const result, char const * const message);
33 pippijn 1.1
34 pippijn 1.3 command_t const os_testcmd = { "TESTCMD", "Executes a command without a user_t.", AC_NONE, 3, os_cmd_testcmd };
35 pippijn 1.1
36 pippijn 1.3 E cmdvec os_cmdtree;
37     E helpvec os_helptree;
38 pippijn 1.1
39     sourceinfo_vtable testcmd_vtable = { "testcmd", testcmd_command_fail, testcmd_command_success_nodata, testcmd_command_success_string };
40    
41 pippijn 1.3 bool
42     _modinit (module *m)
43 pippijn 1.1 {
44     os_cmdtree << os_testcmd;
45     help_addentry (os_helptree, "TESTCMD", "help/operserv/testcmd", NULL);
46 pippijn 1.3
47     return true;
48 pippijn 1.1 }
49    
50     void
51     _moddeinit ()
52     {
53     os_cmdtree >> os_testcmd;
54     help_delentry (os_helptree, "TESTCMD");
55     }
56    
57     static void
58 pippijn 1.4 testcmd_command_fail (sourceinfo_t *si, fault::code code, char const * const message)
59 pippijn 1.1 {
60     testcmddata *udata = static_cast<testcmddata *> (si->callerdata);
61    
62     command_success_nodata (udata->prevsi, "Command failed with fault %d, \"%s\"", code, message);
63     udata->got_result = true;
64     }
65    
66     static void
67 pippijn 1.3 testcmd_command_success_nodata (sourceinfo_t *si, char const * const message)
68 pippijn 1.1 {
69     testcmddata *udata = static_cast<testcmddata *> (si->callerdata);
70    
71     if (udata->got_result)
72     command_success_nodata (udata->prevsi, "More comment \"%s\"", message);
73     else
74     command_success_nodata (udata->prevsi, "Command succeeded with no data, \"%s\"", message);
75     udata->got_result = true;
76     }
77    
78     static void
79 pippijn 1.3 testcmd_command_success_string (sourceinfo_t *si, char const * const result, char const * const message)
80 pippijn 1.1 {
81     testcmddata *udata = static_cast<testcmddata *> (si->callerdata);
82    
83     command_success_nodata (udata->prevsi, "Command succeeded with string \"%s\", \"%s\"", result, message);
84     udata->got_result = true;
85     }
86    
87     static void
88     os_cmd_testcmd (sourceinfo_t *si, int parc, char *parv[])
89     {
90     service_t *svs;
91     command_t const *cmd;
92     sourceinfo_t newsi;
93     testcmddata udata;
94     int newparc;
95     char *newparv[256];
96    
97     if (parc < 2)
98     {
99 pippijn 1.4 command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "TESTCMD");
100     command_fail (si, fault::needmoreparams, "Syntax: TESTCMD <service> <command> [arguments]");
101 pippijn 1.1 return;
102     }
103    
104     svs = find_service (parv[0]);
105     if (svs == NULL)
106     {
107 pippijn 1.4 command_fail (si, fault::nosuch_target, "No such service \2%s\2", parv[0]);
108 pippijn 1.1 return;
109     }
110     if (svs->cmdtree == NULL)
111     {
112 pippijn 1.4 command_fail (si, fault::noprivs, "Service \2%s\2 has no commands", svs->name);
113 pippijn 1.1 return;
114     }
115     cmd = svs->cmdtree->find (parv[1]);
116     if (cmd == NULL)
117     {
118 pippijn 1.4 command_fail (si, fault::nosuch_key, "No such command \2%s\2 in service \2%s\2", parv[1], svs->name);
119 pippijn 1.1 return;
120     }
121     udata.prevsi = si;
122     udata.got_result = false;
123     memset (newparv, '\0', sizeof newparv);
124     if (parc >= 3)
125     newparc = sjtoken (parv[2], ';', newparv);
126     else
127     newparc = 0;
128     memset (&newsi, '\0', sizeof newsi);
129     newsi.smu = si->smu;
130     if (si->su != NULL)
131     newsi.sourcedesc = si->su->ip[0] != '\0' ? si->su->ip : si->su->host;
132     else
133     newsi.sourcedesc = si->sourcedesc;
134     newsi.service = svs;
135     newsi.v = &testcmd_vtable;
136     newsi.callerdata = &udata;
137     cmd->exec (svs, &newsi, newparc, newparv);
138     if (!udata.got_result)
139     command_success_nodata (si, "Command returned without giving a result");
140     }