ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c-Apache模块命令解析器原型

2019-11-20 07:50:35  阅读:211  来源: 互联网

标签:apache apache-modules c-3 linux c-4


我正在创建一个Apache2模块并遇到一个奇怪的编译问题.
这是我的函数的原型,该函数用于解析名为“ analytics_ip”的配置命令:

static const char *apr_cfg_set_analytics_ip(cmd_parms *cmd, void *config, const char *data);

这是包含指向此函数的指针的command_rec结构的数组:

static const command_rec apr_cmds[] =
{
 AP_INIT_TAKE1("analytics_ip", apr_cfg_set_analytics_ip, NULL, OR_ALL, ""),
 { NULL }
};

结构command_rec在头文件http_config.h中声明

typedef struct command_struct command_rec;
struct command_struct {
    /** Name of this command */
    const char *name;
    /** The function to be called when this directive is parsed */
    cmd_func func;
    /** Extra data, for functions which implement multiple commands... */
    void *cmd_data;
    /** What overrides need to be allowed to enable this command. */
    int req_override;
    /** What the command expects as arguments */
    enum cmd_how args_how;

    /** 'usage' message, in case of syntax errors */
    const char *errmsg;
};

当我遵循cmd_func时,它进入以下声明:

typedef const char *(*cmd_func) ();

如果我没记错的话,这意味着“指向指向char的指针并且不接受任何参数的函数的指针”.这怎么可能?命令解析功能必须接受至少一个参数,该参数包含与该功能相对应的config变量的模块值.

我正在用g编译此模块.
错误信息:

mod_xxx.h:65:2: error: invalid conversion from ‘const char* (*)(cmd_parms*, void*, const char*) {aka const char* (*)(cmd_parms_struct*, void*, const char*)}’ to ‘cmd_func {aka const char* (*)()}’ [-fpermissive]
  };

提前致谢

解决方法:

cmd_func是一个联合,它在http_config.h中定义如下:

typedef union {
    /** function to call for a no-args */
    const char *(*no_args) (cmd_parms *parms, void *mconfig);
    /** function to call for a raw-args */
    const char *(*raw_args) (cmd_parms *parms, void *mconfig,
                             const char *args);
    /** function to call for a argv/argc */
    const char *(*take_argv) (cmd_parms *parms, void *mconfig,
                             int argc, char *const argv[]);
    /** function to call for a take1 */
    const char *(*take1) (cmd_parms *parms, void *mconfig, const char *w);
    /** function to call for a take2 */
    const char *(*take2) (cmd_parms *parms, void *mconfig, const char *w,
                          const char *w2);
    /** function to call for a take3 */
    const char *(*take3) (cmd_parms *parms, void *mconfig, const char *w,
                          const char *w2, const char *w3);
    /** function to call for a flag */
    const char *(*flag) (cmd_parms *parms, void *mconfig, int on);
} cmd_func;

枚举cmd_how args_how;负责选择功能的正确版本.

处理它的开关位于server/config.c(在invoke_cmd函数中).

您似乎正在使用对应于cmd-> AP_TAKE1或简单地cmd-> take1的“ take1”版本.

问题可能是C和C具有differences regarding the union initialization.(AP_INIT_TAKE1使用{.take1 = func}语法在C中不起作用).

您必须以C兼容的方式初始化静态const command_rec apr_cmds或将其移动到使用C编译的单独目标文件中.或者,如果您不使用C,则只需使用gcc进行编译.

标签:apache,apache-modules,c-3,linux,c-4
来源: https://codeday.me/bug/20191120/2042684.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有