У меня есть модуль Apache, который правильно работает в CentOS, но не работает в Ubuntu.Я отследил проблему до того факта, что запись запроса содержит значение NULL для имени файла в структуре request_rec
, которую Apache передает в качестве аргумента функции ловушки, которую я определил в своем модуле, чтобы проверить тип файла дляфайл обрабатывается.
, т. е.,
extern "C" module AP_MODULE_DECLARE_DATA MyModule = {
STANDARD20_MODULE_STUFF, // initializer
NULL, // create per-dir config
NULL, // merge per-dir config
NULL, // server config
NULL, // merge server config
MyCommandTable, // command table
MyRegisterHooks // register hooks
};
... с
static void MyRegisterHooks(apr_pool_t *p)
{
ap_hook_child_init(MyPluginInit, NULL, NULL, APR_HOOK_MIDDLE);
ap_hook_type_checker(MyCheckAppFileType, NULL, NULL, APR_HOOK_MIDDLE);
ap_hook_handler(MyFileHandler,NULL,NULL,APR_HOOK_MIDDLE);
}
... и, наконец, виновной функцией:
static int MyCheckAppFileType(request_rec *ap_req)
{
if(ap_req == NULL)
{
return DECLINED; // Not reached
}
if(ap_req->filename == NULL)
{
return DECLINED; // HERE is the problem ... Why is ap_req->filename NULL?
// On CentOS it is not NULL, only on Ubuntu.
}
// ...
}
Я использую Apache 2.2 как в Ubuntu, так и в CentOS, и я с нуля собрал модуль на обеих системах.
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ ~ 3 месяца спустя: я обнаружил, что собираю модульна CentOS, а затем скопировать двоичный файл в Ubuntu, и это работает.Взятие идентичного кода и его сборка в Ubuntu вызывает вышеуказанный сбой во время выполнения.Следовательно, код не обязательно является проблемой - или, по крайней мере, что-то обрабатывается компилятором по-разному в двух системах, что приводит к успеху в сборке CentOS, но не в сборке Ubuntu.