轉載於:
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;
}