Às vezes, você precisa executar uma versão antiga do ejabberd como 2.0.x com o último Erlang VM R15B atualizado.
Em seguida, você ficará paralisado ao executar os drivers Erlang com a seguinte mensagem de erro:
unable to load driver './sha_drv.so': Driver compiled with incorrect version of erl_driver.h
A solução é simples.
Primeiro, você precisa atualizar o driver para a nova estrutura ErlDrvEntry. Certifique-se de que sua estrutura seja:
static ErlDrvEntry mydriver_entry = {
NULL, /* init */
start,
stop,
NULL, /* output */
NULL, /* ready_input */
NULL, /* ready_output */
"mydriver_drv", /* the name of the driver */
NULL, /* finish */
NULL, /* handle */
NULL, /* control */
NULL, /* timeout */
process, /* outputv */
NULL, /* ready_async */
NULL, /* flush */
NULL, /* call */
NULL, /* event */
ERL_DRV_EXTENDED_MARKER, /* ERL_DRV_EXTENDED_MARKER */
ERL_DRV_EXTENDED_MAJOR_VERSION, /* ERL_DRV_EXTENDED_MAJOR_VERSION */
ERL_DRV_EXTENDED_MINOR_VERSION, /* ERL_DRV_EXTENDED_MINOR_VERSION -> CHECK IF REALLY MINOR */
ERL_DRV_FLAG_USE_PORT_LOCKING /* ERL_DRV_FLAGs */
};
Praticamente, tive que estender a estrutura em todos os arquivos do driver com os seguintes campos:
NULL, /* ready_async */
NULL, /* flush */
NULL, /* call */
NULL, /* event */
ERL_DRV_EXTENDED_MARKER, /* ERL_DRV_EXTENDED_MARKER */
ERL_DRV_EXTENDED_MAJOR_VERSION, /* ERL_DRV_EXTENDED_MAJOR_VERSION */
ERL_DRV_EXTENDED_MINOR_VERSION, /* ERL_DRV_EXTENDED_MINOR_VERSION -> CHECK IF REALLY MINOR */
ERL_DRV_FLAG_USE_PORT_LOCKING /* ERL_DRV_FLAGs */
Apenas grep por ErlDrvEntry no código-fonte e atualize todas as suas estruturas.
O último problema é ainda mais fácil de resolver. O módulo Regexp está obsoleto. Você deve atualizar seu código para o novo módulo re.erl.
Aqui está um exemplo de gen_mod.erl :
– element (2, regexp: gsub (Val, “@ HOST @”, Host)).
+ re: substituir (Val, “@ HOST @”, Host, [global, {retornar, lista}]).
ProcessOne tem um exemplo de correspondência para migração de regexp.erl para re.erl : https://support.process-one.net/browse/EJAB-921