35
开发 CGI 时,不需要在自已的程序中包含 main 函数,只需链接 cgi.so 即可。
在 cgi.so 的 main 函数中,会首先得到被请求的 CGI 接口名称,例如前例中的
set_wireless.cgi,从 CGI 开发者定义的 CGI 接口表中,找到相应的函数入口,并
调用它来处理参数。这个入口表为 struct IGD_CGIMAP_ENTRY 数组。
定义如下:
2 2.2 定义 插件的 的 I CGI 接口
即 定 义 一 个 struct IGD_CGIMAP_ENTRY 数 组 , 数 组 的 名 称 必 须 是
IGD_CGI_FUN_MAP,每个成员有三部分组成:
11. 第一部分是字符串,它是 CGI接口名称,必须以“.cgi”结尾,例如:
set_wireless.cgi;
12. 第二部分是函数指针,它是处理该CGI 接口的函数入口;
13. 第三部分是权限设定,可以使用宏 PERM_ALL 和 PERM_LE_ADMIN,
PERM_ALL 表示该接口允许所有用户调用,即本地 web 登录和插件中心远程操作,PERM_LE_ADMIN 只允许本地 web 登录使用该接口。
数组以第一部分为 NULL 的成员结束。
例如:
struct IGD_CGIMAP_ENTRY IGD_CGI_FUN_MAP[]= {
{“ip_dns_args_dump.cgi”, ip_dns_args_dump_cgi, PERM_ALL},
{“ip_dns_args_set.cgi”, ip_dns_args_set_cgi, PERM_LE_ADMIN},
{“ip_dns_set.cgi”, ip_dns_set_cgi, PERM_LE_ADMIN},
{“ip_dns_show.cgi”, ip_dns_show_cgi, PERM_ALL},
{“ip_dns_clean.cgi”, ip_dns_clean_cgi, PERM_LE_ADMIN},
{“ip_dns_del.cgi”, ip_dns_del_cgi, PERM_LE_ADMIN},
{NULL,}
};
struct IGD_CGIMAP_ENTRY {
char*name;
IGD_CGI_HANDLER handler;
int user_perm_flag;