24
1
mirror of https://github.com/processone/ejabberd.git synced 2024-07-06 23:22:36 +02:00

Merge remote branch 'mainline/2.1.x' into 2.2.x

This commit is contained in:
Christophe Romain 2010-08-09 10:04:11 +02:00
commit 23b28ec60f
15 changed files with 170 additions and 57 deletions

View File

@ -2,7 +2,7 @@
"http://www.w3.org/TR/REC-html40/loose.dtd"> "http://www.w3.org/TR/REC-html40/loose.dtd">
<HTML> <HTML>
<HEAD> <HEAD>
<TITLE>Ejabberd 2.1.5 Developers Guide <TITLE>Ejabberd 2.1.x Developers Guide
</TITLE> </TITLE>
<META http-equiv="Content-Type" content="text/html; charset=US-ASCII"> <META http-equiv="Content-Type" content="text/html; charset=US-ASCII">
@ -49,7 +49,7 @@ TD P{margin:0px;}
<!--HEVEA command line is: /usr/bin/hevea -fix -pedantic dev.tex --> <!--HEVEA command line is: /usr/bin/hevea -fix -pedantic dev.tex -->
<!--CUT DEF section 1 --><P><A NAME="titlepage"></A> <!--CUT DEF section 1 --><P><A NAME="titlepage"></A>
</P><TABLE CLASS="title"><TR><TD><H1 CLASS="titlemain">Ejabberd 2.1.5 Developers Guide</H1><H3 CLASS="titlerest">Alexey Shchepin<BR> </P><TABLE CLASS="title"><TR><TD><H1 CLASS="titlemain">Ejabberd 2.1.x Developers Guide</H1><H3 CLASS="titlerest">Alexey Shchepin<BR>
<A HREF="mailto:alexey@sevcom.net"><TT>mailto:alexey@sevcom.net</TT></A><BR> <A HREF="mailto:alexey@sevcom.net"><TT>mailto:alexey@sevcom.net</TT></A><BR>
<A HREF="xmpp:aleksey@jabber.ru"><TT>xmpp:aleksey@jabber.ru</TT></A></H3></TD></TR> <A HREF="xmpp:aleksey@jabber.ru"><TT>xmpp:aleksey@jabber.ru</TT></A></H3></TD></TR>
</TABLE><DIV CLASS="center"> </TABLE><DIV CLASS="center">

View File

@ -2,7 +2,7 @@
"http://www.w3.org/TR/REC-html40/loose.dtd"> "http://www.w3.org/TR/REC-html40/loose.dtd">
<HTML> <HTML>
<HEAD> <HEAD>
<TITLE>Ejabberd 2.1.5 Feature Sheet <TITLE>Ejabberd 2.1.x Feature Sheet
</TITLE> </TITLE>
<META http-equiv="Content-Type" content="text/html; charset=US-ASCII"> <META http-equiv="Content-Type" content="text/html; charset=US-ASCII">
@ -50,7 +50,7 @@ SPAN{width:20%; float:right; text-align:left; margin-left:auto;}
<!--HEVEA command line is: /usr/bin/hevea -fix -pedantic features.tex --> <!--HEVEA command line is: /usr/bin/hevea -fix -pedantic features.tex -->
<!--CUT DEF section 1 --><P><A NAME="titlepage"></A> <!--CUT DEF section 1 --><P><A NAME="titlepage"></A>
</P><TABLE CLASS="title"><TR><TD><H1 CLASS="titlemain">Ejabberd 2.1.5 Feature Sheet</H1><H3 CLASS="titlerest">Sander Devrieze<BR> </P><TABLE CLASS="title"><TR><TD><H1 CLASS="titlemain">Ejabberd 2.1.x Feature Sheet</H1><H3 CLASS="titlerest">Sander Devrieze<BR>
<A HREF="mailto:s.devrieze@pandora.be"><TT>mailto:s.devrieze@pandora.be</TT></A><BR> <A HREF="mailto:s.devrieze@pandora.be"><TT>mailto:s.devrieze@pandora.be</TT></A><BR>
<A HREF="xmpp:sander@devrieze.dyndns.org"><TT>xmpp:sander@devrieze.dyndns.org</TT></A></H3></TD></TR> <A HREF="xmpp:sander@devrieze.dyndns.org"><TT>xmpp:sander@devrieze.dyndns.org</TT></A></H3></TD></TR>
</TABLE><DIV CLASS="center"> </TABLE><DIV CLASS="center">

View File

@ -6,7 +6,7 @@
ejabberd 2.1.5 ejabberd 2.1.x
Installation and Operation Guide Installation and Operation Guide
@ -76,7 +76,7 @@ BLOCKQUOTE.figure DIV.center DIV.center HR{display:none;}
<HR SIZE=2><BR> <HR SIZE=2><BR>
<BR> <BR>
<TABLE CELLSPACING=6 CELLPADDING=0><TR><TD ALIGN=right NOWRAP> <FONT SIZE=6><B>ejabberd 2.1.5 </B></FONT></TD></TR> <TABLE CELLSPACING=6 CELLPADDING=0><TR><TD ALIGN=right NOWRAP> <FONT SIZE=6><B>ejabberd 2.1.x </B></FONT></TD></TR>
<TR><TD ALIGN=right NOWRAP>&nbsp;</TD></TR> <TR><TD ALIGN=right NOWRAP>&nbsp;</TD></TR>
<TR><TD ALIGN=right NOWRAP> <FONT SIZE=6>Installation and Operation Guide</FONT></TD></TR> <TR><TD ALIGN=right NOWRAP> <FONT SIZE=6>Installation and Operation Guide</FONT></TD></TR>
</TABLE><BR> </TABLE><BR>

View File

@ -1,2 +1,2 @@
% ejabberd version (automatically generated). % ejabberd version (automatically generated).
\newcommand{\version}{2.1.5} \newcommand{\version}{2.1.x}

View File

@ -31,6 +31,7 @@ else
endif endif
EFLAGS += @ERLANG_SSLVER@ -pa . EFLAGS += @ERLANG_SSLVER@ -pa .
ERLANG_CFLAGS += @ERLANG_SSLVER@
# make debug=true to compile Erlang module with debug informations. # make debug=true to compile Erlang module with debug informations.
ifdef debug ifdef debug
@ -63,6 +64,11 @@ ifeq (@transient_supervisors@, false)
EFLAGS+=-DNO_TRANSIENT_SUPERVISORS EFLAGS+=-DNO_TRANSIENT_SUPERVISORS
endif endif
ifeq (@md2@, true)
EFLAGS+=-DHAVE_MD2
ERLANG_CFLAGS += -DHAVE_MD2
endif
INSTALL_EPAM= INSTALL_EPAM=
ifeq (@pam@, pam) ifeq (@pam@, pam)
INSTALL_EPAM=install -m 750 $(O_USER) epam $(PBINDIR) INSTALL_EPAM=install -m 750 $(O_USER) epam $(PBINDIR)

2
src/aclocal.m4 vendored
View File

@ -134,7 +134,7 @@ ssldef() ->
if if
OTP >= "R14" -> "-DSSL40\n"; OTP >= "R14" -> "-DSSL40\n";
OTP >= "R12" -> "-DSSL39\n"; OTP >= "R12" -> "-DSSL39\n";
true -> "" true -> "\n"
end. end.
%% return physical architecture based on OS/Processor %% return physical architecture based on OS/Processor

31
src/configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.65 for ejabberd 2.1.5. # Generated by GNU Autoconf 2.65 for ejabberd 2.1.x.
# #
# Report bugs to <ejabberd@process-one.net>. # Report bugs to <ejabberd@process-one.net>.
# #
@ -552,8 +552,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='ejabberd' PACKAGE_NAME='ejabberd'
PACKAGE_TARNAME='ejabberd' PACKAGE_TARNAME='ejabberd'
PACKAGE_VERSION='2.1.5' PACKAGE_VERSION='2.1.x'
PACKAGE_STRING='ejabberd 2.1.5' PACKAGE_STRING='ejabberd 2.1.x'
PACKAGE_BUGREPORT='ejabberd@process-one.net' PACKAGE_BUGREPORT='ejabberd@process-one.net'
PACKAGE_URL='' PACKAGE_URL=''
@ -608,6 +608,7 @@ build_os
build_vendor build_vendor
build_cpu build_cpu
build build
md2
INSTALLUSER INSTALLUSER
SSL_CFLAGS SSL_CFLAGS
SSL_LIBS SSL_LIBS
@ -1278,7 +1279,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures ejabberd 2.1.5 to adapt to many kinds of systems. \`configure' configures ejabberd 2.1.x to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1344,7 +1345,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of ejabberd 2.1.5:";; short | recursive ) echo "Configuration of ejabberd 2.1.x:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1469,7 +1470,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
ejabberd configure 2.1.5 ejabberd configure 2.1.x
generated by GNU Autoconf 2.65 generated by GNU Autoconf 2.65
Copyright (C) 2009 Free Software Foundation, Inc. Copyright (C) 2009 Free Software Foundation, Inc.
@ -1815,7 +1816,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by ejabberd $as_me 2.1.5, which was It was created by ejabberd $as_me 2.1.x, which was
generated by GNU Autoconf 2.65. Invocation command line was generated by GNU Autoconf 2.65. Invocation command line was
$ $0 $@ $ $0 $@
@ -3224,7 +3225,7 @@ ssldef() ->
if if
OTP >= "R14" -> "-DSSL40\n"; OTP >= "R14" -> "-DSSL40\n";
OTP >= "R12" -> "-DSSL39\n"; OTP >= "R12" -> "-DSSL39\n";
true -> "" true -> "\n"
end. end.
%% return physical architecture based on OS/Processor %% return physical architecture based on OS/Processor
@ -4822,6 +4823,16 @@ if test "$ENABLEUSER" != ""; then
fi fi
ac_fn_c_check_header_mongrel "$LINENO" "openssl/md2.h" "ac_cv_header_openssl_md2_h" "$ac_includes_default"
if test "x$ac_cv_header_openssl_md2_h" = x""yes; then :
md2=true
else
md2=false
fi
ac_aux_dir= ac_aux_dir=
for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
for ac_t in install-sh install.sh shtool; do for ac_t in install-sh install.sh shtool; do
@ -5654,7 +5665,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by ejabberd $as_me 2.1.5, which was This file was extended by ejabberd $as_me 2.1.x, which was
generated by GNU Autoconf 2.65. Invocation command line was generated by GNU Autoconf 2.65. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -5707,7 +5718,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
ejabberd config.status 2.1.5 ejabberd config.status 2.1.x
configured by $0, generated by GNU Autoconf 2.65, configured by $0, generated by GNU Autoconf 2.65,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@ -148,6 +148,9 @@ if test "$ENABLEUSER" != ""; then
AC_SUBST([INSTALLUSER], [$ENABLEUSER]) AC_SUBST([INSTALLUSER], [$ENABLEUSER])
fi fi
AC_CHECK_HEADER(openssl/md2.h, md2=true, md2=false)
AC_SUBST(md2)
AC_CANONICAL_SYSTEM AC_CANONICAL_SYSTEM
#AC_DEFINE_UNQUOTED(CPU_VENDOR_OS, "$target") #AC_DEFINE_UNQUOTED(CPU_VENDOR_OS, "$target")
#AC_SUBST(target_os) #AC_SUBST(target_os)

View File

@ -2,7 +2,7 @@
{application, ejabberd, {application, ejabberd,
[{description, "ejabberd"}, [{description, "ejabberd"},
{vsn, "2.1.5"}, {vsn, "2.1.x"},
{modules, [acl, {modules, [acl,
adhoc, adhoc,
configure, configure,

View File

@ -277,25 +277,8 @@ feature_response(#iq{type = result,
sub_el = [{xmlelement, _, _, Els}]}, sub_el = [{xmlelement, _, _, Els}]},
Host, From, Caps, [SubNode | SubNodes]) -> Host, From, Caps, [SubNode | SubNodes]) ->
BinaryNode = node_to_binary(Caps#caps.node, SubNode), BinaryNode = node_to_binary(Caps#caps.node, SubNode),
IsValid = case Caps#caps.hash of case check_hash(Caps, Els) of
"md2" -> true ->
Caps#caps.version == make_disco_hash(Els, md2);
"md5" ->
Caps#caps.version == make_disco_hash(Els, md5);
"sha-1" ->
Caps#caps.version == make_disco_hash(Els, sha1);
"sha-224" ->
Caps#caps.version == make_disco_hash(Els, sha224);
"sha-256" ->
Caps#caps.version == make_disco_hash(Els, sha256);
"sha-384" ->
Caps#caps.version == make_disco_hash(Els, sha384);
"sha-512" ->
Caps#caps.version == make_disco_hash(Els, sha512);
_ ->
true
end,
if IsValid ->
Features = lists:flatmap( Features = lists:flatmap(
fun({xmlelement, "feature", FAttrs, _}) -> fun({xmlelement, "feature", FAttrs, _}) ->
[xml:get_attr_s("var", FAttrs)]; [xml:get_attr_s("var", FAttrs)];
@ -305,7 +288,7 @@ feature_response(#iq{type = result,
mnesia:dirty_write( mnesia:dirty_write(
#caps_features{node_pair = BinaryNode, #caps_features{node_pair = BinaryNode,
features = features_to_binary(Features)}); features = features_to_binary(Features)});
true -> false ->
mnesia:dirty_write(#caps_features{node_pair = BinaryNode}) mnesia:dirty_write(#caps_features{node_pair = BinaryNode})
end, end,
feature_request(Host, From, Caps, SubNodes); feature_request(Host, From, Caps, SubNodes);
@ -350,6 +333,7 @@ make_my_disco_hash(Host) ->
"" ""
end. end.
-ifdef(HAVE_MD2).
make_disco_hash(DiscoEls, Algo) -> make_disco_hash(DiscoEls, Algo) ->
Concat = [concat_identities(DiscoEls), Concat = [concat_identities(DiscoEls),
concat_features(DiscoEls), concat_features(DiscoEls),
@ -371,6 +355,64 @@ make_disco_hash(DiscoEls, Algo) ->
sha:sha512(Concat) sha:sha512(Concat)
end). end).
check_hash(Caps, Els) ->
case Caps#caps.hash of
"md2" ->
Caps#caps.version == make_disco_hash(Els, md2);
"md5" ->
Caps#caps.version == make_disco_hash(Els, md5);
"sha-1" ->
Caps#caps.version == make_disco_hash(Els, sha1);
"sha-224" ->
Caps#caps.version == make_disco_hash(Els, sha224);
"sha-256" ->
Caps#caps.version == make_disco_hash(Els, sha256);
"sha-384" ->
Caps#caps.version == make_disco_hash(Els, sha384);
"sha-512" ->
Caps#caps.version == make_disco_hash(Els, sha512);
_ ->
true
end.
-else.
make_disco_hash(DiscoEls, Algo) ->
Concat = [concat_identities(DiscoEls),
concat_features(DiscoEls),
concat_info(DiscoEls)],
base64:encode_to_string(
if Algo == md5 ->
crypto:md5(Concat);
Algo == sha1 ->
crypto:sha(Concat);
Algo == sha224 ->
sha:sha224(Concat);
Algo == sha256 ->
sha:sha256(Concat);
Algo == sha384 ->
sha:sha384(Concat);
Algo == sha512 ->
sha:sha512(Concat)
end).
check_hash(Caps, Els) ->
case Caps#caps.hash of
"md5" ->
Caps#caps.version == make_disco_hash(Els, md5);
"sha-1" ->
Caps#caps.version == make_disco_hash(Els, sha1);
"sha-224" ->
Caps#caps.version == make_disco_hash(Els, sha224);
"sha-256" ->
Caps#caps.version == make_disco_hash(Els, sha256);
"sha-384" ->
Caps#caps.version == make_disco_hash(Els, sha384);
"sha-512" ->
Caps#caps.version == make_disco_hash(Els, sha512);
_ ->
true
end.
-endif.
concat_features(Els) -> concat_features(Els) ->
lists:usort( lists:usort(
lists:flatmap( lists:flatmap(

View File

@ -1916,10 +1916,18 @@ send_new_presence(NJID, Reason, StateData) ->
false -> false ->
[] []
end, end,
Status2 = case ((StateData#state.config)#config.anonymous==false)
andalso (NJID == Info#user.jid) of
true ->
[{xmlelement, "status", [{"code", "100"}], []}
| Status];
false ->
Status
end,
Packet = xml:append_subtags( Packet = xml:append_subtags(
Presence, Presence,
[{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
[{xmlelement, "item", ItemAttrs, ItemEls} | Status]}]), [{xmlelement, "item", ItemAttrs, ItemEls} | Status2]}]),
ejabberd_router:route( ejabberd_router:route(
jlib:jid_replace_resource(StateData#state.jid, Nick), jlib:jid_replace_resource(StateData#state.jid, Nick),
Info#user.jid, Info#user.jid,

View File

@ -28,7 +28,11 @@
-author('alexey@process-one.net'). -author('alexey@process-one.net').
-export([start/0, sha/1, sha1/1, sha224/1, sha256/1, sha384/1, -export([start/0, sha/1, sha1/1, sha224/1, sha256/1, sha384/1,
sha512/1, md2/1]). sha512/1]).
-ifdef(HAVE_MD2).
-export([md2/1]).
-endif.
-include("ejabberd.hrl"). -include("ejabberd.hrl").
@ -80,8 +84,10 @@ sha384(Text) ->
sha512(Text) -> sha512(Text) ->
erlang:port_control(?DRIVER, 512, Text). erlang:port_control(?DRIVER, 512, Text).
-ifdef(HAVE_MD2).
md2(Text) -> md2(Text) ->
erlang:port_control(?DRIVER, 2, Text). erlang:port_control(?DRIVER, 2, Text).
-endif.
driver_path() -> driver_path() ->
Suffix = case os:type() of Suffix = case os:type() of

View File

@ -30,6 +30,11 @@ ifdef debug
EFLAGS+=+debug_info +export_all EFLAGS+=+debug_info +export_all
endif endif
ifeq (@md2@, true)
EFLAGS+=-DHAVE_MD2
ERLANG_CFLAGS += -DHAVE_MD2
endif
ERLSHLIBS = ../tls_drv.so ../sha_drv.so ERLSHLIBS = ../tls_drv.so ../sha_drv.so
OUTDIR = .. OUTDIR = ..
SOURCES = $(wildcard *.erl) SOURCES = $(wildcard *.erl)

View File

@ -20,7 +20,9 @@
#include <erl_driver.h> #include <erl_driver.h>
#include <openssl/sha.h> #include <openssl/sha.h>
#ifdef HAVE_MD2
#include <openssl/md2.h> #include <openssl/md2.h>
#endif
static ErlDrvData sha_drv_start(ErlDrvPort port, char *buf) static ErlDrvData sha_drv_start(ErlDrvPort port, char *buf)
{ {
@ -36,11 +38,13 @@ static int sha_drv_control(ErlDrvData handle,
ErlDrvBinary *b = NULL; ErlDrvBinary *b = NULL;
switch (command) { switch (command) {
#ifdef HAVE_MD2
case 2: case 2:
rlen = MD2_DIGEST_LENGTH; rlen = MD2_DIGEST_LENGTH;
b = driver_alloc_binary(rlen); b = driver_alloc_binary(rlen);
if (b) MD2((unsigned char*)buf, len, (unsigned char*)b->orig_bytes); if (b) MD2((unsigned char*)buf, len, (unsigned char*)b->orig_bytes);
break; break;
#endif
case 224: case 224:
rlen = SHA224_DIGEST_LENGTH; rlen = SHA224_DIGEST_LENGTH;
b = driver_alloc_binary(rlen); b = driver_alloc_binary(rlen);

View File

@ -2,6 +2,23 @@
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#ifdef SSL40
#define ENIF_ALLOC(SIZE) enif_alloc(SIZE)
#define ENIF_FREE(PTR) enif_free(PTR)
#define ENIF_REALLOC(PTR, SIZE) enif_realloc(PTR, SIZE)
#define ENIF_ALLOC_BINARY(SIZE, BIN) enif_alloc_binary(SIZE, BIN)
#define ENIF_COMPARE(TERM1, TERM2) enif_compare(TERM1, TERM2)
#else
#define ENIF_ALLOC(SIZE) enif_alloc(env, SIZE)
#define ENIF_FREE(PTR) enif_free(env, PTR)
#define ENIF_REALLOC(PTR, SIZE) enif_realloc(env, PTR, SIZE)
#define ENIF_ALLOC_BINARY(SIZE, BIN) enif_alloc_binary(env, SIZE, BIN)
#define ENIF_COMPARE(TERM1, TERM2) enif_compare(env, TERM1, TERM2)
#endif
static ERL_NIF_TERM atom_xmlelement;
static ERL_NIF_TERM atom_xmlcdata;
struct buf { struct buf {
int limit; int limit;
int len; int len;
@ -10,12 +27,19 @@ struct buf {
static int make_element(ErlNifEnv* env, struct buf *rbuf, ERL_NIF_TERM el); static int make_element(ErlNifEnv* env, struct buf *rbuf, ERL_NIF_TERM el);
static int load(ErlNifEnv* env, void** priv, ERL_NIF_TERM load_info)
{
atom_xmlelement = enif_make_atom(env, "xmlelement");
atom_xmlcdata = enif_make_atom(env, "xmlcdata");
return 0;
}
static struct buf *init_buf(ErlNifEnv* env) static struct buf *init_buf(ErlNifEnv* env)
{ {
struct buf *rbuf = enif_alloc(env, sizeof(struct buf)); struct buf *rbuf = ENIF_ALLOC(sizeof(struct buf));
rbuf->limit = 1024; rbuf->limit = 1024;
rbuf->len = 0; rbuf->len = 0;
rbuf->b = enif_alloc(env, rbuf->limit); rbuf->b = ENIF_ALLOC(rbuf->limit);
return rbuf; return rbuf;
} }
@ -23,9 +47,9 @@ static void destroy_buf(ErlNifEnv* env, struct buf *rbuf)
{ {
if (rbuf) { if (rbuf) {
if (rbuf->b) { if (rbuf->b) {
enif_free(env, rbuf->b); ENIF_FREE(rbuf->b);
}; };
enif_free(env, rbuf); ENIF_FREE(rbuf);
}; };
} }
@ -35,7 +59,7 @@ inline void resize_buf(ErlNifEnv* env, struct buf *rbuf, int len_to_add)
if (new_len >= rbuf->limit) { if (new_len >= rbuf->limit) {
rbuf->limit = ((new_len / 1024) + 1) * 1024; rbuf->limit = ((new_len / 1024) + 1) * 1024;
rbuf->b = enif_realloc(env, rbuf->b, rbuf->limit); rbuf->b = ENIF_REALLOC(rbuf->b, rbuf->limit);
}; };
} }
@ -141,7 +165,7 @@ static int make_element(ErlNifEnv* env, struct buf *rbuf, ERL_NIF_TERM el)
if (enif_get_tuple(env, el, &arity, &tuple)) { if (enif_get_tuple(env, el, &arity, &tuple)) {
if (arity == 2) { if (arity == 2) {
if (!enif_compare(env, tuple[0], enif_make_atom(env, "xmlcdata"))) { if (!ENIF_COMPARE(tuple[0], atom_xmlcdata)) {
if (enif_inspect_iolist_as_binary(env, tuple[1], &cdata)) { if (enif_inspect_iolist_as_binary(env, tuple[1], &cdata)) {
crypt(env, rbuf, cdata.data, cdata.size); crypt(env, rbuf, cdata.data, cdata.size);
ret = 1; ret = 1;
@ -149,7 +173,7 @@ static int make_element(ErlNifEnv* env, struct buf *rbuf, ERL_NIF_TERM el)
}; };
}; };
if (arity == 4) { if (arity == 4) {
if (!enif_compare(env, tuple[0], enif_make_atom(env, "xmlelement"))) { if (!ENIF_COMPARE(tuple[0], atom_xmlelement)) {
if (enif_inspect_iolist_as_binary(env, tuple[1], &name)) { if (enif_inspect_iolist_as_binary(env, tuple[1], &name)) {
buf_add_char(env, rbuf, '<'); buf_add_char(env, rbuf, '<');
buf_add_str(env, rbuf, (char *)name.data, name.size); buf_add_str(env, rbuf, (char *)name.data, name.size);
@ -192,7 +216,7 @@ static ERL_NIF_TERM element_to(ErlNifEnv* env, int argc,
destroy_buf(env, rbuf); destroy_buf(env, rbuf);
return result; return result;
} else { } else {
if (enif_alloc_binary(env, rbuf->len, &output)) { if (ENIF_ALLOC_BINARY(rbuf->len, &output)) {
memcpy(output.data, rbuf->b, rbuf->len); memcpy(output.data, rbuf->b, rbuf->len);
result = enif_make_binary(env, &output); result = enif_make_binary(env, &output);
destroy_buf(env, rbuf); destroy_buf(env, rbuf);
@ -206,11 +230,13 @@ static ERL_NIF_TERM element_to(ErlNifEnv* env, int argc,
return enif_make_badarg(env); return enif_make_badarg(env);
} }
/* static ERL_NIF_TERM element_to_string(ErlNifEnv* env, int argc, */ #ifdef SSL40
/* const ERL_NIF_TERM argv[]) */ static ERL_NIF_TERM element_to_string(ErlNifEnv* env, int argc,
/* { */ const ERL_NIF_TERM argv[])
/* return element_to(env, argc, argv, 1); */ {
/* } */ return element_to(env, argc, argv, 1);
}
#endif
static ERL_NIF_TERM element_to_binary(ErlNifEnv* env, int argc, static ERL_NIF_TERM element_to_binary(ErlNifEnv* env, int argc,
const ERL_NIF_TERM argv[]) const ERL_NIF_TERM argv[])
@ -222,9 +248,11 @@ static ErlNifFunc nif_funcs[] =
{ {
/* Stupid Erlang bug with enif_make_string() is fixed /* Stupid Erlang bug with enif_make_string() is fixed
in R14A only (OTP-8685), so we can't use in R14A only (OTP-8685), so we can't use
element_to_string yet.*/ element_to_string in Erlang < R14A.*/
/* {"element_to_string", 1, element_to_string}, */ #ifdef SSL40
{"element_to_string", 1, element_to_string},
#endif
{"element_to_binary", 1, element_to_binary} {"element_to_binary", 1, element_to_binary}
}; };
ERL_NIF_INIT(xml, nif_funcs, NULL, NULL, NULL, NULL) ERL_NIF_INIT(xml, nif_funcs, load, NULL, NULL, NULL)