00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifdef HAVE_CONFIG_H
00018 # include <dtn-config.h>
00019 #endif
00020
00021 #include <climits>
00022
00023 #include "InterfaceCommand.h"
00024 #include "contacts/InterfaceTable.h"
00025 #include "conv_layers/ConvergenceLayer.h"
00026 #include <oasys/util/StringBuffer.h>
00027
00028 namespace dtn {
00029
00030 InterfaceCommand::InterfaceCommand()
00031 : TclCommand("interface")
00032 {
00033 add_to_help("add <name> <conv layer> [<args>?]",
00034 "add an interface");
00035 add_to_help("del <name>", "delete an interface");
00036 add_to_help("list", "list all of the interfaces");
00037 }
00038
00039 int
00040 InterfaceCommand::exec(int argc, const char** argv, Tcl_Interp* interp)
00041 {
00042 (void)interp;
00043
00044 if (strcasecmp("list", argv[1]) == 0) {
00045
00046 if (argc > 2) {
00047 wrong_num_args(argc, argv, 1, 2, 2);
00048 }
00049
00050 oasys::StringBuffer buf;
00051 InterfaceTable::instance()->list(&buf);
00052 set_result(buf.c_str());
00053
00054 return TCL_OK;
00055 }
00056
00057
00058 else if (strcasecmp(argv[1], "add") == 0) {
00059 if (argc < 4) {
00060 wrong_num_args(argc, argv, 1, 4, INT_MAX);
00061 return TCL_ERROR;
00062 }
00063
00064 const char* name = argv[2];
00065 const char* proto = argv[3];
00066
00067 ConvergenceLayer* cl = ConvergenceLayer::find_clayer(proto);
00068 if (!cl) {
00069 resultf("can't find convergence layer for %s", proto);
00070 return TCL_ERROR;
00071 }
00072
00073
00074 if (! InterfaceTable::instance()->add(name, cl, proto,
00075 argc - 4, argv + 4)) {
00076 resultf("error adding interface %s", name);
00077 return TCL_ERROR;
00078 }
00079 return TCL_OK;
00080 }
00081
00082
00083 else if (strcasecmp(argv[1], "del") == 0) {
00084 if (argc != 3) {
00085 wrong_num_args(argc, argv, 2, 4, 4);
00086 return TCL_ERROR;
00087 }
00088
00089 const char* name = argv[2];
00090
00091 if (! InterfaceTable::instance()->del(name)) {
00092 resultf("error removing interface %s", name);
00093 return TCL_ERROR;
00094 }
00095
00096 return TCL_OK;
00097 }
00098
00099 resultf("invalid interface subcommand %s", argv[1]);
00100 return TCL_ERROR;
00101 }
00102
00103 }