DEFUNSH (VTYSH_BGPD,
router_bgp,
router_bgp_cmd,
"router bgp " CMD_AS_RANGE,
ROUTER_STR
BGP_STR
AS_STR)
{
vty->node = BGP_NODE;
return CMD_SUCCESS;
}
ALIAS_SH (VTYSH_BGPD,
router_bgp,
router_bgp_view_cmd,
"router bgp " CMD_AS_RANGE " view WORD",
ROUTER_STR
BGP_STR
AS_STR
"BGP view\n"
"view name\n")
DEFUNSH (VTYSH_BGPD,
address_family_vpnv4,
address_family_vpnv4_cmd,
"address-family vpnv4",
"Enter Address Family command mode\n"
"Address family\n")
{
vty->node = BGP_VPNV4_NODE;
return CMD_SUCCESS;
}
14 个解决方案
#1
DEFUNSH 这应该 是个宏定义啊。。
你右键 有跳到这的 宏 定义的地方的选项 自己分析一下。。
你右键 有跳到这的 宏 定义的地方的选项 自己分析一下。。
#2
晕了 写了一长串不知道是什么
#3
应该是 一个 函数。。
#4
应该宏定义。。
#5
大写的函数名。。。
#6
迷惑了!
#7
这些是GNU Zebra(路由软件)的vtysh( integrated shell of Zebra )中的宏定义。
#8
ls老大 请问类似以这个宏定义
DEFUN (vtysh_show_hello, vtysh_show_hello_cmd,
"show hello",
" hello1\n"
" hello2\n"
)
{
printf("hello\n");
return CMD_SUCCESS;
}
怎么进行宏展开啊谢谢你!还有你有关于vtysh的资料吗
#9
对于这个vtysh_show_hello,在相应的头文件中应该有如下定义:
typedef struct cmd_element
{
const char *string; /* Command specification by string. */
int (*func) (struct cmd_element *, struct vty *, int, char **);
const char *doc; /* Documentation of this command. */
};
#define DEFUN(funcname, cmdname, cmdstr, helpstr) \
int funcname (struct cmd_element *, struct vty *, int, char **); \
struct cmd_element cmdname = \
{ \
cmdstr, \
funcname, \
helpstr \
}; \
int funcname \
(struct cmd_element *self, struct vty *vty, int argc, char **argv)
还有一个结构struct vty应定义在vty.h中。根据宏定义DEFUN,可展开如下:
int vtysh_show_hello (struct cmd_element *, struct vty *, int, char **);
struct cmd_element vtysh_show_hello_cmd =
{
"show hello",
vtysh_show_hello,
" hello1\n hello2\n"
};
int vtysh_show_hello (struct cmd_element *self, struct vty *vty, int argc, char **argv)
{
printf("hello\n");
return CMD_SUCCESS;
}
在vtysh的开发环境中的头文件中找到宏定义DEFUN,就可明白它的含义了。以下是一个例子:
http://src.opensolaris.org/source/xref/rbridges/rbridges-quagga/lib/command.h
typedef struct cmd_element
{
const char *string; /* Command specification by string. */
int (*func) (struct cmd_element *, struct vty *, int, char **);
const char *doc; /* Documentation of this command. */
};
#define DEFUN(funcname, cmdname, cmdstr, helpstr) \
int funcname (struct cmd_element *, struct vty *, int, char **); \
struct cmd_element cmdname = \
{ \
cmdstr, \
funcname, \
helpstr \
}; \
int funcname \
(struct cmd_element *self, struct vty *vty, int argc, char **argv)
还有一个结构struct vty应定义在vty.h中。根据宏定义DEFUN,可展开如下:
int vtysh_show_hello (struct cmd_element *, struct vty *, int, char **);
struct cmd_element vtysh_show_hello_cmd =
{
"show hello",
vtysh_show_hello,
" hello1\n hello2\n"
};
int vtysh_show_hello (struct cmd_element *self, struct vty *vty, int argc, char **argv)
{
printf("hello\n");
return CMD_SUCCESS;
}
在vtysh的开发环境中的头文件中找到宏定义DEFUN,就可明白它的含义了。以下是一个例子:
http://src.opensolaris.org/source/xref/rbridges/rbridges-quagga/lib/command.h
#10
我之前几个月也在研究vtysh,现将研究的一点心得列出:
zebra是在linux环境下用软件模拟路由器的功能,通过zebra,可以将linux机器虚拟成多个路由器。而vtysh就是其中的终端控制台程序。本次任务就是将vtysh从zebra中提取出来,并且进行裁剪,去掉软件内部关于协议的部分,只留下最基本的view模式和enable模式。
首先,进入vtysh_main.c,从main函数开始,其主要过程如下:
1、progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
检查可执行文件名,去掉前面的路径部分。
(在此之前,可以加入权限判断,输入用户名和密码,调用权限判断函数,权限函数另外实现)
2、while (1) {
opt = getopt_long (argc, argv, "be:h", longopts, 0);
...
}
该操作分别对应--help里的boot,eval,help,可将其注释掉。
3、signal_init ();
信号初始化,与键盘响应有关,很重要,但具体没有研究清楚。保留。
4、vtysh_init_vty ();
vtysh_init_cmd ();
对控制台输出的菜单节点和命令节点做初始化。可根据自己需要定义新节点,新命令模式,以及新的命令。
5、vtysh_config_init
配置初始化,用于配合zebra使用,如单*剪,似乎没有什么用处,这里暂时保留了。
6、vty_init_vtysh
vtysh中有一个很重要的结构体vector,根据不同的用途,定义了一系列类型的vector。
这里是对vty的vector做初始化。
7、vtysh_connect_all ();
与其他守护进程建立socket连接
8、vtysh_read_config (config_file, config_current, config_default);
读配置文件,各守护进程的配置文件。
9、vtysh_pager_init
似乎与环境变量有关,具体不明,暂时保留。
10、vtysh_readline_init
绑定初始命令显示的输入字符,这里设置成“?”,可修改。
11、 vty_hello (vty);
输出欢迎语,可以修改。
* 在version.h 第25行 #define ZEBRA_VERSION "***" 可修改版本号
* 在command.c 第38行 可以改登录后的欢迎语
* 在command.c 第3139行, host.name = "Johnson"; 可以改默认控制台显示用户名"Johnson>"
12、while (vtysh_rl_gets ())
vtysh_execute (line_read);
主循环,其中先对传入的命令行进行解析,匹配,明确命令和参数,然后调用相应的函数来处理。
zebra是在linux环境下用软件模拟路由器的功能,通过zebra,可以将linux机器虚拟成多个路由器。而vtysh就是其中的终端控制台程序。本次任务就是将vtysh从zebra中提取出来,并且进行裁剪,去掉软件内部关于协议的部分,只留下最基本的view模式和enable模式。
首先,进入vtysh_main.c,从main函数开始,其主要过程如下:
1、progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
检查可执行文件名,去掉前面的路径部分。
(在此之前,可以加入权限判断,输入用户名和密码,调用权限判断函数,权限函数另外实现)
2、while (1) {
opt = getopt_long (argc, argv, "be:h", longopts, 0);
...
}
该操作分别对应--help里的boot,eval,help,可将其注释掉。
3、signal_init ();
信号初始化,与键盘响应有关,很重要,但具体没有研究清楚。保留。
4、vtysh_init_vty ();
vtysh_init_cmd ();
对控制台输出的菜单节点和命令节点做初始化。可根据自己需要定义新节点,新命令模式,以及新的命令。
5、vtysh_config_init
配置初始化,用于配合zebra使用,如单*剪,似乎没有什么用处,这里暂时保留了。
6、vty_init_vtysh
vtysh中有一个很重要的结构体vector,根据不同的用途,定义了一系列类型的vector。
这里是对vty的vector做初始化。
7、vtysh_connect_all ();
与其他守护进程建立socket连接
8、vtysh_read_config (config_file, config_current, config_default);
读配置文件,各守护进程的配置文件。
9、vtysh_pager_init
似乎与环境变量有关,具体不明,暂时保留。
10、vtysh_readline_init
绑定初始命令显示的输入字符,这里设置成“?”,可修改。
11、 vty_hello (vty);
输出欢迎语,可以修改。
* 在version.h 第25行 #define ZEBRA_VERSION "***" 可修改版本号
* 在command.c 第38行 可以改登录后的欢迎语
* 在command.c 第3139行, host.name = "Johnson"; 可以改默认控制台显示用户名"Johnson>"
12、while (vtysh_rl_gets ())
vtysh_execute (line_read);
主循环,其中先对传入的命令行进行解析,匹配,明确命令和参数,然后调用相应的函数来处理。
#11
vtysh_show_hello是函数名
vtysh_show_hello_cmd是命令名,在install_element函数中使用
show hello 是具体的命令
hello1 已及后面的是注释,对应"show hello"中每个node(以空格区分,show hello会被分成show 和 hello)
#12
请问这个宏的展开是怎么弄的 用什么语法可以进行展开还是工具还是一个字一个字敲出来的! 不好意思我这片完全不懂!
#13
宏的展开由C/C++编译器自动展开,不需要人工敲.前面的解释只是帮助理解.
#14
#1
DEFUNSH 这应该 是个宏定义啊。。
你右键 有跳到这的 宏 定义的地方的选项 自己分析一下。。
你右键 有跳到这的 宏 定义的地方的选项 自己分析一下。。
#2
晕了 写了一长串不知道是什么
#3
应该是 一个 函数。。
#4
应该宏定义。。
#5
大写的函数名。。。
#6
迷惑了!
#7
这些是GNU Zebra(路由软件)的vtysh( integrated shell of Zebra )中的宏定义。
#8
ls老大 请问类似以这个宏定义
DEFUN (vtysh_show_hello, vtysh_show_hello_cmd,
"show hello",
" hello1\n"
" hello2\n"
)
{
printf("hello\n");
return CMD_SUCCESS;
}
怎么进行宏展开啊谢谢你!还有你有关于vtysh的资料吗
#9
对于这个vtysh_show_hello,在相应的头文件中应该有如下定义:
typedef struct cmd_element
{
const char *string; /* Command specification by string. */
int (*func) (struct cmd_element *, struct vty *, int, char **);
const char *doc; /* Documentation of this command. */
};
#define DEFUN(funcname, cmdname, cmdstr, helpstr) \
int funcname (struct cmd_element *, struct vty *, int, char **); \
struct cmd_element cmdname = \
{ \
cmdstr, \
funcname, \
helpstr \
}; \
int funcname \
(struct cmd_element *self, struct vty *vty, int argc, char **argv)
还有一个结构struct vty应定义在vty.h中。根据宏定义DEFUN,可展开如下:
int vtysh_show_hello (struct cmd_element *, struct vty *, int, char **);
struct cmd_element vtysh_show_hello_cmd =
{
"show hello",
vtysh_show_hello,
" hello1\n hello2\n"
};
int vtysh_show_hello (struct cmd_element *self, struct vty *vty, int argc, char **argv)
{
printf("hello\n");
return CMD_SUCCESS;
}
在vtysh的开发环境中的头文件中找到宏定义DEFUN,就可明白它的含义了。以下是一个例子:
http://src.opensolaris.org/source/xref/rbridges/rbridges-quagga/lib/command.h
typedef struct cmd_element
{
const char *string; /* Command specification by string. */
int (*func) (struct cmd_element *, struct vty *, int, char **);
const char *doc; /* Documentation of this command. */
};
#define DEFUN(funcname, cmdname, cmdstr, helpstr) \
int funcname (struct cmd_element *, struct vty *, int, char **); \
struct cmd_element cmdname = \
{ \
cmdstr, \
funcname, \
helpstr \
}; \
int funcname \
(struct cmd_element *self, struct vty *vty, int argc, char **argv)
还有一个结构struct vty应定义在vty.h中。根据宏定义DEFUN,可展开如下:
int vtysh_show_hello (struct cmd_element *, struct vty *, int, char **);
struct cmd_element vtysh_show_hello_cmd =
{
"show hello",
vtysh_show_hello,
" hello1\n hello2\n"
};
int vtysh_show_hello (struct cmd_element *self, struct vty *vty, int argc, char **argv)
{
printf("hello\n");
return CMD_SUCCESS;
}
在vtysh的开发环境中的头文件中找到宏定义DEFUN,就可明白它的含义了。以下是一个例子:
http://src.opensolaris.org/source/xref/rbridges/rbridges-quagga/lib/command.h
#10
我之前几个月也在研究vtysh,现将研究的一点心得列出:
zebra是在linux环境下用软件模拟路由器的功能,通过zebra,可以将linux机器虚拟成多个路由器。而vtysh就是其中的终端控制台程序。本次任务就是将vtysh从zebra中提取出来,并且进行裁剪,去掉软件内部关于协议的部分,只留下最基本的view模式和enable模式。
首先,进入vtysh_main.c,从main函数开始,其主要过程如下:
1、progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
检查可执行文件名,去掉前面的路径部分。
(在此之前,可以加入权限判断,输入用户名和密码,调用权限判断函数,权限函数另外实现)
2、while (1) {
opt = getopt_long (argc, argv, "be:h", longopts, 0);
...
}
该操作分别对应--help里的boot,eval,help,可将其注释掉。
3、signal_init ();
信号初始化,与键盘响应有关,很重要,但具体没有研究清楚。保留。
4、vtysh_init_vty ();
vtysh_init_cmd ();
对控制台输出的菜单节点和命令节点做初始化。可根据自己需要定义新节点,新命令模式,以及新的命令。
5、vtysh_config_init
配置初始化,用于配合zebra使用,如单*剪,似乎没有什么用处,这里暂时保留了。
6、vty_init_vtysh
vtysh中有一个很重要的结构体vector,根据不同的用途,定义了一系列类型的vector。
这里是对vty的vector做初始化。
7、vtysh_connect_all ();
与其他守护进程建立socket连接
8、vtysh_read_config (config_file, config_current, config_default);
读配置文件,各守护进程的配置文件。
9、vtysh_pager_init
似乎与环境变量有关,具体不明,暂时保留。
10、vtysh_readline_init
绑定初始命令显示的输入字符,这里设置成“?”,可修改。
11、 vty_hello (vty);
输出欢迎语,可以修改。
* 在version.h 第25行 #define ZEBRA_VERSION "***" 可修改版本号
* 在command.c 第38行 可以改登录后的欢迎语
* 在command.c 第3139行, host.name = "Johnson"; 可以改默认控制台显示用户名"Johnson>"
12、while (vtysh_rl_gets ())
vtysh_execute (line_read);
主循环,其中先对传入的命令行进行解析,匹配,明确命令和参数,然后调用相应的函数来处理。
zebra是在linux环境下用软件模拟路由器的功能,通过zebra,可以将linux机器虚拟成多个路由器。而vtysh就是其中的终端控制台程序。本次任务就是将vtysh从zebra中提取出来,并且进行裁剪,去掉软件内部关于协议的部分,只留下最基本的view模式和enable模式。
首先,进入vtysh_main.c,从main函数开始,其主要过程如下:
1、progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
检查可执行文件名,去掉前面的路径部分。
(在此之前,可以加入权限判断,输入用户名和密码,调用权限判断函数,权限函数另外实现)
2、while (1) {
opt = getopt_long (argc, argv, "be:h", longopts, 0);
...
}
该操作分别对应--help里的boot,eval,help,可将其注释掉。
3、signal_init ();
信号初始化,与键盘响应有关,很重要,但具体没有研究清楚。保留。
4、vtysh_init_vty ();
vtysh_init_cmd ();
对控制台输出的菜单节点和命令节点做初始化。可根据自己需要定义新节点,新命令模式,以及新的命令。
5、vtysh_config_init
配置初始化,用于配合zebra使用,如单*剪,似乎没有什么用处,这里暂时保留了。
6、vty_init_vtysh
vtysh中有一个很重要的结构体vector,根据不同的用途,定义了一系列类型的vector。
这里是对vty的vector做初始化。
7、vtysh_connect_all ();
与其他守护进程建立socket连接
8、vtysh_read_config (config_file, config_current, config_default);
读配置文件,各守护进程的配置文件。
9、vtysh_pager_init
似乎与环境变量有关,具体不明,暂时保留。
10、vtysh_readline_init
绑定初始命令显示的输入字符,这里设置成“?”,可修改。
11、 vty_hello (vty);
输出欢迎语,可以修改。
* 在version.h 第25行 #define ZEBRA_VERSION "***" 可修改版本号
* 在command.c 第38行 可以改登录后的欢迎语
* 在command.c 第3139行, host.name = "Johnson"; 可以改默认控制台显示用户名"Johnson>"
12、while (vtysh_rl_gets ())
vtysh_execute (line_read);
主循环,其中先对传入的命令行进行解析,匹配,明确命令和参数,然后调用相应的函数来处理。
#11
vtysh_show_hello是函数名
vtysh_show_hello_cmd是命令名,在install_element函数中使用
show hello 是具体的命令
hello1 已及后面的是注释,对应"show hello"中每个node(以空格区分,show hello会被分成show 和 hello)
#12
请问这个宏的展开是怎么弄的 用什么语法可以进行展开还是工具还是一个字一个字敲出来的! 不好意思我这片完全不懂!
#13
宏的展开由C/C++编译器自动展开,不需要人工敲.前面的解释只是帮助理解.