diff -r 000000000000 -r 6f7a81934006 daemon/dispatch.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/daemon/dispatch.cc Wed Jan 16 22:39:43 2008 +0100 @@ -0,0 +1,147 @@ +// Copyright (C) 1999,2000 Bruce Guenter +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +#include +#include "daemon.h" +#include "misc/lookup.h" + +// declare the commands +extern CMD(adduser2); +extern CMD(autoresponse); +extern CMD(chattr); +extern CMD(check); +extern CMD(deluser); +extern CMD(listdomain); +extern CMD(lookup); + +#ifdef TEST_DAEMON +CMD(echo) +{ + logcommand(args); + mystring msg; + for(unsigned i = 0; i < args.count(); i++) { + if(i > 0) msg += " "; + msg += args[i]; + } + RETURN(ok, msg); +} +CMD(fecho) +{ + logcommand(args); + mystring msg; + for(unsigned i = 0; i < args.count(); i++) { + if(i > 0) msg += " "; + msg += args[i]; + } + RETURN(ok, msg); +} +#endif // TEST_DAEMON + +//CMD(stat); +//CMD(statall); + +struct dispatch +{ + const char* name; + response (*function)(command&, int); + unsigned arg_min; + unsigned arg_max; + bool decode_virtual; + //unsigned count; +}; + +#define ENTRY(NAME,MIN,MAX,DV) { #NAME , NAME##_cmd , unsigned(MIN), unsigned(MAX), DV } +dispatch dispatch_table[] = { + ENTRY(lookup, 3, 3, true), + ENTRY(check, 3, 3, true), + ENTRY(chattr, 5, -1, true), + ENTRY(adduser2, 5, -1, true), + ENTRY(autoresponse, 4, 5, true), + ENTRY(deluser, 3, 3, true), + ENTRY(listdomain, 2, 2, false), +#ifdef TEST_DAEMON + ENTRY(echo, 0, -1, false), // For testing purposes only + ENTRY(fecho, 0, -1, false), // For testing purposes only +#endif // TEST_DAEMON + { "", 0, 0, false, 0 } +}; +//ENTRY(stat, 1, , false), +//ENTRY(statall, 0, 0, false), + +static dispatch* find_dispatch(mystring name) +{ + for(dispatch* ptr = dispatch_table; ptr->function != 0; ptr++) { + if(name == ptr->name) + return ptr; + } + return 0; +} + +#if 0 +CMD(stat) + // Usage: stat function + // Returns: count +{ + logcommand(args); + const dispatch* ptr = find_dispatch(args[0]); + if(!ptr) + RETURN(err, "Unknown operation to stat"); + RETURN(ok, itoa(ptr->count)); +} + +CMD(statall) + // Usage: statall + // Returns: name:count;name:count... +{ + logcommand(args); + mystring r; + for(const dispatch* ptr = dispatch_table; ptr->function != 0; ptr++) { + if(!r.empty()) + r += ";"; + r += ptr->name; + r += ":"; + r += itoa(ptr->count); + } + RETURN(ok, r); +} +#endif + +response dispatch_cmd(command& args, int fd) +{ + dispatch* ptr = find_dispatch(args.name()); + if(ptr) { + if(args.count() < ptr->arg_min || + (ptr->arg_max != unsigned(-1) && args.count() > ptr->arg_max)) + RETURN(bad, "Incorrect number of parameters to command " + args.name()); + //++ptr->count; + if(ptr->decode_virtual) { + if(is_local(args[0])) + args.replace_first_two(args[1]); + else { + mystring baseuser(find_virtual(args[0])); + if(baseuser.empty()) + RETURN(err, "Invalid or unknown domain name: " + args[0]); + else if(!args[1]) + args.replace_first_two(baseuser); + else + args.replace_first_two(baseuser + "-" + args[1]); + } + } + return ptr->function(args, fd); + } + else + RETURN(bad, "Invalid operation"); +}