1
0
Fork 0
mirror of https://github.com/processone/ejabberd synced 2025-10-03 17:59:31 +02:00

ejabberd 13 requires Erlang/OTP R15B or higher (EJAB-1630)

Fix documents and remove useless code.
This commit is contained in:
Badlop 2013-04-11 17:12:53 +02:00
parent c98540b8db
commit c7eaa9aeac
12 changed files with 24 additions and 428 deletions

3
README
View file

@ -9,8 +9,7 @@ To compile ejabberd you need:
- GNU Make - GNU Make
- GCC - GCC
- Libexpat 1.95 or higher - Libexpat 1.95 or higher
- Erlang/OTP R10B-9 or higher. Recommended: R13B04 and R14B04. - Erlang/OTP R15B or higher.
Avoid R14A and R14B.
- OpenSSL 0.9.8 or higher, for STARTTLS, SASL and SSL encryption. - OpenSSL 0.9.8 or higher, for STARTTLS, SASL and SSL encryption.
- Zlib 1.2.3 or higher, for Stream Compression support - Zlib 1.2.3 or higher, for Stream Compression support
(XEP-0138). Optional. (XEP-0138). Optional.

View file

@ -314,8 +314,7 @@ To compile \ejabberd{} on a `Unix-like' operating system, you need:
\item GNU Make \item GNU Make
\item GCC \item GCC
\item Libexpat 1.95 or higher \item Libexpat 1.95 or higher
\item Erlang/OTP R10B-9 or higher. The recommended versions are R13B04 and R14B04. \item Erlang/OTP R15B or higher.
Don't use R14A or R14B because \footahref{http://www.erlang.org/cgi-bin/ezmlm-cgi/4/54598}{they have a bug}.
\item OpenSSL 0.9.8 or higher, for STARTTLS, SASL and SSL encryption. \item OpenSSL 0.9.8 or higher, for STARTTLS, SASL and SSL encryption.
\item Zlib 1.2.3 or higher, for Stream Compression support (\xepref{0138}). Optional. \item Zlib 1.2.3 or higher, for Stream Compression support (\xepref{0138}). Optional.
\item Erlang mysql library. Optional. For MySQL authentication or storage. See section \ref{compilemysql}. \item Erlang mysql library. Optional. For MySQL authentication or storage. See section \ref{compilemysql}.
@ -390,7 +389,6 @@ Some options that you may be interested in modifying:
\titem{--enable-nif} \titem{--enable-nif}
Replaces some critical Erlang functions with equivalents written in C to improve performance. Replaces some critical Erlang functions with equivalents written in C to improve performance.
This feature requires Erlang/OTP R13B04 or higher.
\end{description} \end{description}
\makesubsection{install}{Install} \makesubsection{install}{Install}
@ -5541,8 +5539,7 @@ In order for this communication to work,
\term{epmd} must be running and listening for name requests in the port 4369. \term{epmd} must be running and listening for name requests in the port 4369.
You should block the port 4369 in the firewall in such a way that You should block the port 4369 in the firewall in such a way that
only the programs in your machine can access it. only the programs in your machine can access it.
or configure the option \term{ERL\_EPMD\_ADDRESS} in the file \term{ejabberdctl.cfg} or configure the option \term{ERL\_EPMD\_ADDRESS} in the file \term{ejabberdctl.cfg}.
(this option works only in Erlang/OTP R14B03 or higher).
If you build a cluster of several \ejabberd{} instances, If you build a cluster of several \ejabberd{} instances,
each \ejabberd{} instance is called an \ejabberd{} node. each \ejabberd{} instance is called an \ejabberd{} node.

View file

@ -30,8 +30,8 @@ else
INIT_USER=$(INSTALLUSER) INIT_USER=$(INSTALLUSER)
endif endif
EFLAGS += @ERLANG_SSLVER@ -pa . EFLAGS += -pa .
ERLANG_CFLAGS += @ERLANG_SSLVER@ ERLANG_CFLAGS +=
# make debug=true to compile Erlang module with debug informations. # make debug=true to compile Erlang module with debug informations.
ifdef debug ifdef debug

View file

@ -126,17 +126,9 @@ start() ->
EIDirS = code:lib_dir("erl_interface") ++ "\n", EIDirS = code:lib_dir("erl_interface") ++ "\n",
EILibS = libpath("erl_interface") ++ "\n", EILibS = libpath("erl_interface") ++ "\n",
RootDirS = code:root_dir() ++ "\n", RootDirS = code:root_dir() ++ "\n",
file:write_file("conftest.out", list_to_binary(EIDirS ++ EILibS ++ ssldef() ++ RootDirS)), file:write_file("conftest.out", list_to_binary(EIDirS ++ EILibS ++ RootDirS)),
halt(). halt().
ssldef() ->
OTP = (catch erlang:system_info(otp_release)),
if
OTP >= "R14" -> "-DSSL40\n";
OTP >= "R12" -> "-DSSL39\n";
true -> "\n"
end.
%% return physical architecture based on OS/Processor %% return physical architecture based on OS/Processor
archname() -> archname() ->
ArchStr = erlang:system_info(system_architecture), ArchStr = erlang:system_info(system_architecture),
@ -184,8 +176,6 @@ _EOF
ERLANG_EI_DIR=`cat conftest.out | head -n 1` ERLANG_EI_DIR=`cat conftest.out | head -n 1`
# Second line # Second line
ERLANG_EI_LIB=`cat conftest.out | head -n 2 | tail -n 1` ERLANG_EI_LIB=`cat conftest.out | head -n 2 | tail -n 1`
# Third line
ERLANG_SSLVER=`cat conftest.out | head -n 3 | tail -n 1`
# End line # End line
ERLANG_DIR=`cat conftest.out | tail -n 1` ERLANG_DIR=`cat conftest.out | tail -n 1`
@ -194,7 +184,6 @@ _EOF
AC_SUBST(ERLANG_CFLAGS) AC_SUBST(ERLANG_CFLAGS)
AC_SUBST(ERLANG_LIBS) AC_SUBST(ERLANG_LIBS)
AC_SUBST(ERLANG_SSLVER)
AC_SUBST(ERLC) AC_SUBST(ERLC)
AC_SUBST(ERL) AC_SUBST(ERL)
]) ])

32
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.68 for ejabberd 2.1.12. # Generated by GNU Autoconf 2.68 for ejabberd 13.03-beta2.
# #
# Report bugs to <ejabberd@process-one.net>. # Report bugs to <ejabberd@process-one.net>.
# #
@ -560,8 +560,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.12' PACKAGE_VERSION='13.03-beta2'
PACKAGE_STRING='ejabberd 2.1.12' PACKAGE_STRING='ejabberd 13.03-beta2'
PACKAGE_BUGREPORT='ejabberd@process-one.net' PACKAGE_BUGREPORT='ejabberd@process-one.net'
PACKAGE_URL='' PACKAGE_URL=''
@ -657,7 +657,6 @@ EGREP
GREP GREP
CPP CPP
LIBICONV LIBICONV
ERLANG_SSLVER
ERLANG_LIBS ERLANG_LIBS
ERLANG_CFLAGS ERLANG_CFLAGS
ERL ERL
@ -1288,7 +1287,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.12 to adapt to many kinds of systems. \`configure' configures ejabberd 13.03-beta2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1354,7 +1353,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.12:";; short | recursive ) echo "Configuration of ejabberd 13.03-beta2:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1479,7 +1478,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.12 ejabberd configure 13.03-beta2
generated by GNU Autoconf 2.68 generated by GNU Autoconf 2.68
Copyright (C) 2010 Free Software Foundation, Inc. Copyright (C) 2010 Free Software Foundation, Inc.
@ -1823,7 +1822,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.12, which was It was created by ejabberd $as_me 13.03-beta2, which was
generated by GNU Autoconf 2.68. Invocation command line was generated by GNU Autoconf 2.68. Invocation command line was
$ $0 $@ $ $0 $@
@ -3224,17 +3223,9 @@ start() ->
EIDirS = code:lib_dir("erl_interface") ++ "\n", EIDirS = code:lib_dir("erl_interface") ++ "\n",
EILibS = libpath("erl_interface") ++ "\n", EILibS = libpath("erl_interface") ++ "\n",
RootDirS = code:root_dir() ++ "\n", RootDirS = code:root_dir() ++ "\n",
file:write_file("conftest.out", list_to_binary(EIDirS ++ EILibS ++ ssldef() ++ RootDirS)), file:write_file("conftest.out", list_to_binary(EIDirS ++ EILibS ++ RootDirS)),
halt(). halt().
ssldef() ->
OTP = (catch erlang:system_info(otp_release)),
if
OTP >= "R14" -> "-DSSL40\n";
OTP >= "R12" -> "-DSSL39\n";
true -> "\n"
end.
%% return physical architecture based on OS/Processor %% return physical architecture based on OS/Processor
archname() -> archname() ->
ArchStr = erlang:system_info(system_architecture), ArchStr = erlang:system_info(system_architecture),
@ -3282,8 +3273,6 @@ _EOF
ERLANG_EI_DIR=`cat conftest.out | head -n 1` ERLANG_EI_DIR=`cat conftest.out | head -n 1`
# Second line # Second line
ERLANG_EI_LIB=`cat conftest.out | head -n 2 | tail -n 1` ERLANG_EI_LIB=`cat conftest.out | head -n 2 | tail -n 1`
# Third line
ERLANG_SSLVER=`cat conftest.out | head -n 3 | tail -n 1`
# End line # End line
ERLANG_DIR=`cat conftest.out | tail -n 1` ERLANG_DIR=`cat conftest.out | tail -n 1`
@ -3295,7 +3284,6 @@ _EOF
#locating iconv #locating iconv
@ -5690,7 +5678,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.12, which was This file was extended by ejabberd $as_me 13.03-beta2, which was
generated by GNU Autoconf 2.68. Invocation command line was generated by GNU Autoconf 2.68. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -5743,7 +5731,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.12 ejabberd config.status 13.03-beta2
configured by $0, generated by GNU Autoconf 2.68, configured by $0, generated by GNU Autoconf 2.68,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View file

@ -40,11 +40,7 @@
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]). terminate/2, code_change/3]).
-ifdef(SSL40).
-define(PG2, pg2). -define(PG2, pg2).
-else.
-define(PG2, pg2_backport).
-endif.
-record(state, {}). -record(state, {}).

View file

@ -11,7 +11,6 @@ ASN_FLAGS = -bber_bin +optimize +binary_strings
ERLANG_CFLAGS = @ERLANG_CFLAGS@ ERLANG_CFLAGS = @ERLANG_CFLAGS@
ERLANG_LIBS = @ERLANG_LIBS@ ERLANG_LIBS = @ERLANG_LIBS@
EFLAGS += @ERLANG_SSLVER@
EFLAGS += -I .. EFLAGS += -I ..
EFLAGS += -pz .. EFLAGS += -pz ..

View file

@ -1,340 +0,0 @@
%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 1997-2011. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% %CopyrightEnd%
%%
-module(pg2_backport).
-export([create/1, delete/1, join/2, leave/2]).
-export([get_members/1, get_local_members/1]).
-export([get_closest_pid/1, which_groups/0]).
-export([start/0,start_link/0,init/1,handle_call/3,handle_cast/2,handle_info/2,
terminate/2]).
%%% As of R13B03 monitors are used instead of links.
%%%
%%% Exported functions
%%%
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
start() ->
ensure_started().
create(Name) ->
ensure_started(),
case ets:member(pg2_table, {group, Name}) of
false ->
global:trans({{?MODULE, Name}, self()},
fun() ->
gen_server:multi_call(?MODULE, {create, Name})
end),
ok;
true ->
ok
end.
delete(Name) ->
ensure_started(),
global:trans({{?MODULE, Name}, self()},
fun() ->
gen_server:multi_call(?MODULE, {delete, Name})
end),
ok.
join(Name, Pid) when is_pid(Pid) ->
ensure_started(),
case ets:member(pg2_table, {group, Name}) of
false ->
{error, {no_such_group, Name}};
true ->
global:trans({{?MODULE, Name}, self()},
fun() ->
gen_server:multi_call(?MODULE,
{join, Name, Pid})
end),
ok
end.
leave(Name, Pid) when is_pid(Pid) ->
ensure_started(),
case ets:member(pg2_table, {group, Name}) of
false ->
{error, {no_such_group, Name}};
true ->
global:trans({{?MODULE, Name}, self()},
fun() ->
gen_server:multi_call(?MODULE,
{leave, Name, Pid})
end),
ok
end.
get_members(Name) ->
ensure_started(),
case ets:member(pg2_table, {group, Name}) of
true ->
group_members(Name);
false ->
{error, {no_such_group, Name}}
end.
get_local_members(Name) ->
ensure_started(),
case ets:member(pg2_table, {group, Name}) of
true ->
local_group_members(Name);
false ->
{error, {no_such_group, Name}}
end.
which_groups() ->
ensure_started(),
all_groups().
get_closest_pid(Name) ->
case get_local_members(Name) of
[Pid] ->
Pid;
[] ->
{_,_,X} = erlang:now(),
case get_members(Name) of
[] -> {error, {no_process, Name}};
Members ->
lists:nth((X rem length(Members))+1, Members)
end;
Members when is_list(Members) ->
{_,_,X} = erlang:now(),
lists:nth((X rem length(Members))+1, Members);
Else ->
Else
end.
%%%
%%% Callback functions from gen_server
%%%
-record(state, {}).
init([]) ->
Ns = nodes(),
net_kernel:monitor_nodes(true),
lists:foreach(fun(N) ->
{?MODULE, N} ! {new_pg2, node()},
self() ! {nodeup, N}
end, Ns),
pg2_table = ets:new(pg2_table, [ordered_set, protected, named_table]),
{ok, #state{}}.
handle_call({create, Name}, _From, S) ->
assure_group(Name),
{reply, ok, S};
handle_call({join, Name, Pid}, _From, S) ->
ets:member(pg2_table, {group, Name}) andalso join_group(Name, Pid),
{reply, ok, S};
handle_call({leave, Name, Pid}, _From, S) ->
ets:member(pg2_table, {group, Name}) andalso leave_group(Name, Pid),
{reply, ok, S};
handle_call({delete, Name}, _From, S) ->
delete_group(Name),
{reply, ok, S};
handle_call(Request, From, S) ->
error_logger:warning_msg("The pg2 server received an unexpected message:\n"
"handle_call(~p, ~p, _)\n",
[Request, From]),
{noreply, S}.
handle_cast({exchange, _Node, List}, S) ->
store(List),
{noreply, S};
handle_cast(_, S) ->
%% Ignore {del_member, Name, Pid}.
{noreply, S}.
handle_info({'DOWN', MonitorRef, process, _Pid, _Info}, S) ->
member_died(MonitorRef),
{noreply, S};
handle_info({nodeup, Node}, S) ->
gen_server:cast({?MODULE, Node}, {exchange, node(), all_members()}),
{noreply, S};
handle_info({new_pg2, Node}, S) ->
gen_server:cast({?MODULE, Node}, {exchange, node(), all_members()}),
{noreply, S};
handle_info(_, S) ->
{noreply, S}.
terminate(_Reason, _S) ->
true = ets:delete(pg2_table),
ok.
%%%
%%% Local functions
%%%
%%% One ETS table, pg2_table, is used for bookkeeping. The type of the
%%% table is ordered_set, and the fast matching of partially
%%% instantiated keys is used extensively.
%%%
%%% {{group, Name}}
%%% Process group Name.
%%% {{ref, Pid}, RPid, MonitorRef, Counter}
%%% {{ref, MonitorRef}, Pid}
%%% Each process has one monitor. Sometimes a process is spawned to
%%% monitor the pid (RPid). Counter is incremented when the Pid joins
%%% some group.
%%% {{member, Name, Pid}, GroupCounter}
%%% {{local_member, Name, Pid}}
%%% Pid is a member of group Name, GroupCounter is incremented when the
%%% Pid joins the group Name.
%%% {{pid, Pid, Name}}
%%% Pid is a member of group Name.
store(List) ->
_ = [(assure_group(Name)
andalso
store2(Name, Members)) ||
[Name, Members] <- List],
ok.
store2(Name, Members) ->
[join_group(Name, P) || P <- Members -- group_members(Name)],
true.
assure_group(Name) ->
Key = {group, Name},
ets:member(pg2_table, Key) orelse true =:= ets:insert(pg2_table, {Key}).
delete_group(Name) ->
_ = [leave_group(Name, Pid) || Pid <- group_members(Name)],
true = ets:delete(pg2_table, {group, Name}),
ok.
member_died(Ref) ->
[{{ref, Ref}, Pid}] = ets:lookup(pg2_table, {ref, Ref}),
Names = member_groups(Pid),
_ = [leave_group(Name, P) ||
Name <- Names,
P <- member_in_group(Pid, Name)],
%% Kept for backward compatibility with links. Can be removed, eventually.
_ = [gen_server:abcast(nodes(), ?MODULE, {del_member, Name, Pid}) ||
Name <- Names],
ok.
join_group(Name, Pid) ->
Ref_Pid = {ref, Pid},
try _ = ets:update_counter(pg2_table, Ref_Pid, {4, +1})
catch _:_ ->
{RPid, Ref} = do_monitor(Pid),
true = ets:insert(pg2_table, {Ref_Pid, RPid, Ref, 1}),
true = ets:insert(pg2_table, {{ref, Ref}, Pid})
end,
Member_Name_Pid = {member, Name, Pid},
try _ = ets:update_counter(pg2_table, Member_Name_Pid, {2, +1})
catch _:_ ->
true = ets:insert(pg2_table, {Member_Name_Pid, 1}),
_ = [ets:insert(pg2_table, {{local_member, Name, PidX}}) ||
PidX <- [Pid],
node(PidX) =:= node()],
true = ets:insert(pg2_table, {{pid, Pid, Name}})
end.
leave_group(Name, Pid) ->
Member_Name_Pid = {member, Name, Pid},
try ets:update_counter(pg2_table, Member_Name_Pid, {2, -1}) of
N ->
if
N =:= 0 ->
true = ets:delete(pg2_table, {pid, Pid, Name}),
_ = [ets:delete(pg2_table, {local_member, Name, PidX}) ||
PidX <- [Pid],
node(PidX) =:= node()],
true = ets:delete(pg2_table, Member_Name_Pid);
true ->
ok
end,
Ref_Pid = {ref, Pid},
case ets:update_counter(pg2_table, Ref_Pid, {4, -1}) of
0 ->
[{Ref_Pid,RPid,Ref,0}] = ets:lookup(pg2_table, Ref_Pid),
true = ets:delete(pg2_table, {ref, Ref}),
true = ets:delete(pg2_table, Ref_Pid),
true = erlang:demonitor(Ref, [flush]),
kill_monitor_proc(RPid, Pid);
_ ->
ok
end
catch _:_ ->
ok
end.
all_members() ->
[[G, group_members(G)] || G <- all_groups()].
group_members(Name) ->
[P ||
[P, N] <- ets:match(pg2_table, {{member, Name, '$1'},'$2'}),
_ <- lists:seq(1, N)].
local_group_members(Name) ->
[P ||
[Pid] <- ets:match(pg2_table, {{local_member, Name, '$1'}}),
P <- member_in_group(Pid, Name)].
member_in_group(Pid, Name) ->
case ets:lookup(pg2_table, {member, Name, Pid}) of
[] -> [];
[{{member, Name, Pid}, N}] ->
lists:duplicate(N, Pid)
end.
member_groups(Pid) ->
[Name || [Name] <- ets:match(pg2_table, {{pid, Pid, '$1'}})].
all_groups() ->
[N || [N] <- ets:match(pg2_table, {{group,'$1'}})].
ensure_started() ->
case whereis(?MODULE) of
undefined ->
C = {pg2, {?MODULE, start_link, []}, permanent,
1000, worker, [?MODULE]},
supervisor:start_child(kernel_safe_sup, C);
Pg2Pid ->
{ok, Pg2Pid}
end.
kill_monitor_proc(RPid, Pid) ->
RPid =:= Pid orelse exit(RPid, kill).
%% When/if erlang:monitor() returns before trying to connect to the
%% other node this function can be removed.
do_monitor(Pid) ->
case (node(Pid) =:= node()) orelse lists:member(node(Pid), nodes()) of
true ->
%% Assume the node is still up
{Pid, erlang:monitor(process, Pid)};
false ->
F = fun() ->
Ref = erlang:monitor(process, Pid),
receive
{'DOWN', Ref, process, Pid, _Info} ->
exit(normal)
end
end,
erlang:spawn_monitor(F)
end.

View file

@ -21,7 +21,6 @@ ifeq ($(shell uname),SunOs)
DYNAMIC_LIB_CFLAGS = -KPIC -G -z text DYNAMIC_LIB_CFLAGS = -KPIC -G -z text
endif endif
EFLAGS += @ERLANG_SSLVER@
EFLAGS += -I .. EFLAGS += -I ..
EFLAGS += -pz .. EFLAGS += -pz ..

View file

@ -9,7 +9,6 @@ LIBS = @LIBS@
ERLANG_CFLAGS = @ERLANG_CFLAGS@ ERLANG_CFLAGS = @ERLANG_CFLAGS@
ERLANG_LIBS = @ERLANG_LIBS@ ERLANG_LIBS = @ERLANG_LIBS@
EFLAGS += @ERLANG_SSLVER@
EFLAGS += -I .. EFLAGS += -I ..
EFLAGS += -pz .. EFLAGS += -pz ..

View file

@ -59,24 +59,8 @@
{method, path, q = [], us, auth, lang = <<"">>, {method, path, q = [], us, auth, lang = <<"">>,
data = <<"">>, ip, host, port, tp, headers}). data = <<"">>, ip, host, port, tp, headers}).
-ifdef(SSL40).
-define(STRING2LOWER, string). -define(STRING2LOWER, string).
-else.
-ifdef(SSL39).
-define(STRING2LOWER, string).
-else.
-define(STRING2LOWER, httpd_util).
-endif.
-endif.
-record(state, -record(state,
{host, docroot, accesslog, accesslogfd, {host, docroot, accesslog, accesslogfd,
directory_indices, custom_headers, default_content_type, directory_indices, custom_headers, default_content_type,

View file

@ -2,20 +2,6 @@
#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_xmlelement;
static ERL_NIF_TERM atom_xmlcdata; static ERL_NIF_TERM atom_xmlcdata;
@ -36,10 +22,10 @@ static int load(ErlNifEnv* env, void** priv, ERL_NIF_TERM load_info)
static struct buf *init_buf(ErlNifEnv* env) static struct buf *init_buf(ErlNifEnv* env)
{ {
struct buf *rbuf = ENIF_ALLOC(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(rbuf->limit); rbuf->b = enif_alloc(rbuf->limit);
return rbuf; return rbuf;
} }
@ -47,9 +33,9 @@ static void destroy_buf(ErlNifEnv* env, struct buf *rbuf)
{ {
if (rbuf) { if (rbuf) {
if (rbuf->b) { if (rbuf->b) {
ENIF_FREE(rbuf->b); enif_free(rbuf->b);
}; };
ENIF_FREE(rbuf); enif_free(rbuf);
}; };
} }
@ -60,7 +46,7 @@ inline void resize_buf(ErlNifEnv* env, struct buf *rbuf, int len_to_add)
if (new_len > rbuf->limit) { if (new_len > rbuf->limit) {
while (new_len > rbuf->limit) while (new_len > rbuf->limit)
rbuf->limit *= 2; rbuf->limit *= 2;
rbuf->b = ENIF_REALLOC(rbuf->b, rbuf->limit); rbuf->b = enif_realloc(rbuf->b, rbuf->limit);
} }
} }
@ -166,7 +152,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(tuple[0], atom_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;
@ -174,7 +160,7 @@ static int make_element(ErlNifEnv* env, struct buf *rbuf, ERL_NIF_TERM el)
}; };
}; };
if (arity == 4) { if (arity == 4) {
if (!ENIF_COMPARE(tuple[0], atom_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);
@ -217,7 +203,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(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);