转载于:
https://blog.csdn.net/u010069213/article/details/18570355
zebra实现命令的方法是由command.h中的一个宏来实现的,他的方法DEFUN定义如下
#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)
其中:
funcname:函数名称;
cmdname:注册的命令名称;
cmdstr: 实在vtydsh终端下输入的命令字符串,
helpstr:帮助信息,当输入“?”时显示
在此宏中涉及到的结构体如下:
struct cmd_element
{
const char *string; /* Command specification by string. */
int (*func) (struct cmd_element *, struct vty *, int, const char *[]);
const char *doc; /* Documentation of this command. */
int daemon; /* Daemon to which this command belong. */
vector strvec; /* Pointing out each description vector. */
unsigned int cmdsize; /* Command index count. */
char *config; /* Configuration string */
vector subconfig; /* Sub configuration string */
u_char attr; /* Command attributes */
};
还有一个结构体struct vty 定义在vty.h中
假如我们有下面的宏定义的方法
DEFUN(vtysh_show_hello,vty_show_hello_cmd,
"show hello",
"hello1\n"
"hello2\n"
)
{
printf("hello\n");
return CMD_SUCCESS;
}
根据DEFFUN宏定义,可展开如下:
int vtysh_show_hello(struct cmd_element*,struct vty*,int,char **);
struct cmd_element vty_show_hello_cmd=
{
"show hello",
"vtysh_show_hello",
"hello1\nhello2\n"
};
int vtysh_show_hello(struct cmd_element *self,struct vty *vty,int argc,char **argv)
{
printf("hello\n");
return CMD_SUCCESS;
}