/** * os_testcmd.C: Calls a command without a user_t. * * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team * Rights to this code are as documented in COPYING. * * * Portions of this file were derived from sources bearing the following license: * Copyright © 2006 Jilles Tjoelker, et al * Rights to this code are as documented in doc/pod/license.pod. * * $Id: os_testcmd.C,v 1.6 2007/09/22 14:27:27 pippijn Exp $ */ #include "atheme.h" #include static char const rcsid[] = "$Id: os_testcmd.C,v 1.6 2007/09/22 14:27:27 pippijn Exp $"; REGISTER_MODULE ("operserv/testcmd", false, "The Ermyth Team "); struct testcmddata { sourceinfo_t *prevsi; bool got_result; }; static void os_cmd_testcmd (sourceinfo_t *si, int parc, char *parv[]); static void testcmd_command_fail (sourceinfo_t *si, fault::code code, char const * const message); static void testcmd_command_success_nodata (sourceinfo_t *si, char const * const message); static void testcmd_command_success_string (sourceinfo_t *si, char const * const result, char const * const message); command_t const os_testcmd = { "TESTCMD", "Executes a command without a user_t.", AC_NONE, 3, os_cmd_testcmd }; E cmdvec os_cmdtree; E helpvec os_helptree; sourceinfo_vtable testcmd_vtable = { "testcmd", testcmd_command_fail, testcmd_command_success_nodata, testcmd_command_success_string }; bool _modinit (module *m) { os_cmdtree << os_testcmd; help_addentry (os_helptree, "TESTCMD", "help/operserv/testcmd", NULL); return true; } void _moddeinit () { os_cmdtree >> os_testcmd; help_delentry (os_helptree, "TESTCMD"); } static void testcmd_command_fail (sourceinfo_t *si, fault::code code, char const * const message) { testcmddata *udata = static_cast (si->callerdata); command_success_nodata (udata->prevsi, "Command failed with fault %d, \"%s\"", code, message); udata->got_result = true; } static void testcmd_command_success_nodata (sourceinfo_t *si, char const * const message) { testcmddata *udata = static_cast (si->callerdata); if (udata->got_result) command_success_nodata (udata->prevsi, "More comment \"%s\"", message); else command_success_nodata (udata->prevsi, "Command succeeded with no data, \"%s\"", message); udata->got_result = true; } static void testcmd_command_success_string (sourceinfo_t *si, char const * const result, char const * const message) { testcmddata *udata = static_cast (si->callerdata); command_success_nodata (udata->prevsi, "Command succeeded with string \"%s\", \"%s\"", result, message); udata->got_result = true; } static void os_cmd_testcmd (sourceinfo_t *si, int parc, char *parv[]) { service_t *svs; command_t const *cmd; sourceinfo_t newsi; testcmddata udata; int newparc; char *newparv[256]; if (parc < 2) { command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "TESTCMD"); command_fail (si, fault::needmoreparams, "Syntax: TESTCMD [arguments]"); return; } svs = find_service (parv[0]); if (svs == NULL) { command_fail (si, fault::nosuch_target, "No such service \2%s\2", parv[0]); return; } if (svs->cmdtree == NULL) { command_fail (si, fault::noprivs, "Service \2%s\2 has no commands", svs->name); return; } cmd = svs->cmdtree->find (parv[1]); if (cmd == NULL) { command_fail (si, fault::nosuch_key, "No such command \2%s\2 in service \2%s\2", parv[1], svs->name); return; } udata.prevsi = si; udata.got_result = false; memset (newparv, '\0', sizeof newparv); if (parc >= 3) newparc = sjtoken (parv[2], ';', newparv); else newparc = 0; memset (&newsi, '\0', sizeof newsi); newsi.smu = si->smu; if (si->su != NULL) newsi.sourcedesc = si->su->ip[0] != '\0' ? si->su->ip : si->su->host; else newsi.sourcedesc = si->sourcedesc; newsi.service = svs; newsi.v = &testcmd_vtable; newsi.callerdata = &udata; cmd->exec (svs, &newsi, newparc, newparv); if (!udata.got_result) command_success_nodata (si, "Command returned without giving a result"); }