ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/contrib/os_testcmd.C
Revision: 1.1
Committed: Thu Jul 19 08:24:53 2007 UTC (19 years, 3 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Log Message:
initial import. the most important changes since Atheme are:
- fixed many memory leaks
- fixed many bugs
- converted to C++ and use more STL containers
- added a (not very enhanced yet) perl module
- greatly improved XML-RPC speed
- added a JSON-RPC module with code from json-cpp
- added a valgrind memcheck module to operserv
- added a more object oriented base64 implementation
- added a specialised unit test framework
- improved stability
- use gettimeofday() if available
- reworked adding/removing commands
- MemoServ IGNORE DEL can now remove indices

File Contents

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