Clamav杀毒软件源码分析笔记[二]
刺猬@http://blog.csdn.net/littlehedgehog
[读取命令行参数]
开始正儿八经地分析源码了. 从哪里入手呢,当然还是按照书上的来,我们先来看看Clamd的程序如何从生到死,Clamd是杀毒软件的服务端,我们在客户端提交要查杀的信息,然后Clamd服务端进行按照我们指令办事,然后把结果返回给我们。这个貌似是unix程序的一个经典构架了,所谓的客户端直接跟用户打交道,然后解析用户输入,把真正要做的工作再传给服务端完成。服务端其实是一个无名英雄了。 话说回来这里第一步我们就要处理命令行下琐碎的各个参数选项.为了让Clamd服务端按照我们要求来运行,这貌似是个相当麻烦的工作,比女人都麻烦,呵呵. 不过还好网上有不少linux fans 都写过相应的博文了. 还是先来看源码吧: [./clamd/options.c]
- /* 这个是clamd的主函数 文件名为options,那么这个主函数就主要在处理这个选项(参数选项)问题了*/
- int main(int argc, char **argv)
- {
- int ret, opt_index, i, len;
- struct optstruct *opt;
- const char *getopt_parameters = "hc:V";
- static struct option long_options[] =
- {
- { "help", 0, 0, 'h'},
- { "config-file", 1, 0, 'c'},
- { "version", 0, 0, 'V'},
- { "debug", 0, 0, 0},
- {0, 0, 0, 0}
- };
- #if defined(C_LINUX) && defined(CL_DEBUG)
- /* njh@bandsman.co.uk: create a dump if needed */
- struct rlimit rlim;
- rlim.rlim_cur = rlim.rlim_max = RLIM_INFINITY;
- if (setrlimit(RLIMIT_CORE, &rlim) < 0)
- perror("setrlimit");
- #endif
- opt=(struct optstruct*)mcalloc(1, sizeof(struct optstruct));
- opt->optlist = NULL;
- opt->filename = NULL;
- while (1)
- {
- opt_index=0;
- ret=getopt_long(argc, argv, getopt_parameters, long_options, &opt_index);
- if (ret == -1)
- break;
- switch (ret)
- {
- case 0:
- register_long_option(opt, long_options[opt_index].nam