谁知到defun怎么用

时间:2020-12-03 17:03:46
完全不知道每行是干什么的
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


大写的函数名。。。
谁知到defun怎么用

#6


迷惑了!

#7


这些是GNU Zebra(路由软件)的vtysh( integrated shell of Zebra )中的宏定义。

#8


引用 7 楼 logiciel 的回复:
这些是GNU Zebra(路由软件)的vtysh( integrated shell of Zebra )中的宏定义。


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

#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);
   主循环,其中先对传入的命令行进行解析,匹配,明确命令和参数,然后调用相应的函数来处理。

#11


引用 8 楼 nixon001 的回复:
引用 7 楼 logiciel 的回复:
这些是GNU Zebra(路由软件)的vtysh( integrated shell of Zebra )中的宏定义。


ls老大 请问类似以这个宏定义
DEFUN (vtysh_show_hello, vtysh_show_hello_cmd,
"show hello", 
       "  hello1\n"
       "  ……


vtysh_show_hello是函数名
vtysh_show_hello_cmd是命令名,在install_element函数中使用
show hello 是具体的命令
hello1 已及后面的是注释,对应"show hello"中每个node(以空格区分,show hello会被分成show 和 hello)

#12


引用 9 楼 logiciel 的回复:
对于这个vtysh_show_hello,在相应的头文件中应该有如下定义:

typedef struct cmd_element
{
  const char *string; /* Command specification by string. */
  int (*func) (struct cmd_element *, struct vty *, int, char **);
……



请问这个宏的展开是怎么弄的 用什么语法可以进行展开还是工具还是一个字一个字敲出来的!   不好意思我这片完全不懂!

#13


宏的展开由C/C++编译器自动展开,不需要人工敲.前面的解释只是帮助理解.

#14


该回复于2010-08-12 10:09:11被版主删除

#1


DEFUNSH 这应该 是个宏定义啊。。
你右键 有跳到这的 宏 定义的地方的选项 自己分析一下。。

#2


晕了  写了一长串不知道是什么

#3


应该是 一个 函数。。

#4


应该宏定义。。

#5


大写的函数名。。。
谁知到defun怎么用

#6


迷惑了!

#7


这些是GNU Zebra(路由软件)的vtysh( integrated shell of Zebra )中的宏定义。

#8


引用 7 楼 logiciel 的回复:
这些是GNU Zebra(路由软件)的vtysh( integrated shell of Zebra )中的宏定义。


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

#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);
   主循环,其中先对传入的命令行进行解析,匹配,明确命令和参数,然后调用相应的函数来处理。

#11


引用 8 楼 nixon001 的回复:
引用 7 楼 logiciel 的回复:
这些是GNU Zebra(路由软件)的vtysh( integrated shell of Zebra )中的宏定义。


ls老大 请问类似以这个宏定义
DEFUN (vtysh_show_hello, vtysh_show_hello_cmd,
"show hello", 
       "  hello1\n"
       "  ……


vtysh_show_hello是函数名
vtysh_show_hello_cmd是命令名,在install_element函数中使用
show hello 是具体的命令
hello1 已及后面的是注释,对应"show hello"中每个node(以空格区分,show hello会被分成show 和 hello)

#12


引用 9 楼 logiciel 的回复:
对于这个vtysh_show_hello,在相应的头文件中应该有如下定义:

typedef struct cmd_element
{
  const char *string; /* Command specification by string. */
  int (*func) (struct cmd_element *, struct vty *, int, char **);
……



请问这个宏的展开是怎么弄的 用什么语法可以进行展开还是工具还是一个字一个字敲出来的!   不好意思我这片完全不懂!

#13


宏的展开由C/C++编译器自动展开,不需要人工敲.前面的解释只是帮助理解.

#14


该回复于2010-08-12 10:09:11被版主删除