Adaptando uma versão antiga do ejabberd para Erlang R15

À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