diff options
Diffstat (limited to 'src/ejabberd_zlib')
-rw-r--r-- | src/ejabberd_zlib/Makefile.in | 63 | ||||
-rw-r--r-- | src/ejabberd_zlib/Makefile.win32 | 36 | ||||
-rw-r--r-- | src/ejabberd_zlib/ejabberd_zlib.erl | 208 | ||||
-rw-r--r-- | src/ejabberd_zlib/ejabberd_zlib_drv.c | 219 |
4 files changed, 0 insertions, 526 deletions
diff --git a/src/ejabberd_zlib/Makefile.in b/src/ejabberd_zlib/Makefile.in deleted file mode 100644 index b572c1169..000000000 --- a/src/ejabberd_zlib/Makefile.in +++ /dev/null @@ -1,63 +0,0 @@ -# $Id$ - -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ - -ZLIB_CFLAGS = @ZLIB_CFLAGS@ -ZLIB_LIBS = @ZLIB_LIBS@ - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -# Assume Linux-style dynamic library flags -DYNAMIC_LIB_CFLAGS = -fpic -shared -ifeq ($(shell uname),Darwin) - DYNAMIC_LIB_CFLAGS = -fPIC -bundle -flat_namespace -undefined suppress -endif -ifeq ($(shell uname),SunOs) - DYNAMIC_LIB_CFLAGS = -KPIC -G -z text -endif - -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -ERLSHLIBS = ../ejabberd_zlib_drv.so -OUTDIR = .. -SOURCES = $(wildcard *.erl) -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - -all: $(BEAMS) $(ERLSHLIBS) - -$(OUTDIR)/%.beam: %.erl - @ERLC@ -W $(EFLAGS) -o $(OUTDIR) $< - -#all: $(ERLSHLIBS) -# erl -s make all report "{outdir, \"..\"}" -noinput -s erlang halt - -$(ERLSHLIBS): ../%.so: %.c - $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) \ - $(subst ../,,$(subst .so,.c,$@)) \ - $(LIBS) \ - $(ZLIB_LIBS) \ - $(ZLIB_CFLAGS) \ - $(ERLANG_LIBS) \ - $(ERLANG_CFLAGS) \ - -o $@ \ - $(DYNAMIC_LIB_CFLAGS) - -clean: - rm -f $(BEAMS) $(ERLSHLIBS) - -distclean: clean - rm -f Makefile - -TAGS: - etags *.erl diff --git a/src/ejabberd_zlib/Makefile.win32 b/src/ejabberd_zlib/Makefile.win32 deleted file mode 100644 index 0041df83c..000000000 --- a/src/ejabberd_zlib/Makefile.win32 +++ /dev/null @@ -1,36 +0,0 @@ - -include ..\Makefile.inc - -EFLAGS = -I .. -pz .. - -OUTDIR = .. -BEAMS = ..\ejabberd_zlib.beam - -SOURCE = ejabberd_zlib_drv.c -OBJECT = ejabberd_zlib_drv.o -DLL = $(OUTDIR)\ejabberd_zlib_drv.dll - -ALL : $(DLL) $(BEAMS) - -CLEAN : - -@erase $(DLL) - -@erase $(OUTDIR)\ejabberd_zlib_drv.exp - -@erase $(OUTDIR)\ejabberd_zlib_drv.lib - -@erase $(OBJECT) - -@erase $(BEAMS) - -$(OUTDIR)\ejabberd_zlib.beam : ejabberd_zlib.erl - erlc -W $(EFLAGS) -o $(OUTDIR) ejabberd_zlib.erl - -CC=cl.exe -CC_FLAGS=-nologo -D__WIN32__ -DWIN32 -DWINDOWS -D_WIN32 -DNT -MD -Ox -I"$(ERLANG_DIR)\usr\include" -I"$(EI_DIR)\include" -I"$(ZLIB_DIR)\include" - -LD=link.exe -LD_FLAGS=-release -nologo -incremental:no -dll "$(EI_DIR)\lib\ei_md.lib" "$(EI_DIR)\lib\erl_interface_md.lib" "$(ZLIB_LIB)" MSVCRT.LIB kernel32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib comdlg32.lib shell32.lib - -$(DLL) : $(OBJECT) - $(LD) $(LD_FLAGS) -out:$@ $< - -$(OBJECT) : $(SOURCE) - $(CC) $(CC_FLAGS) -c -Fo$@ $< - diff --git a/src/ejabberd_zlib/ejabberd_zlib.erl b/src/ejabberd_zlib/ejabberd_zlib.erl deleted file mode 100644 index 3dee8d687..000000000 --- a/src/ejabberd_zlib/ejabberd_zlib.erl +++ /dev/null @@ -1,208 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% File : ejabberd_zlib.erl -%%% Author : Alexey Shchepin <alexey@process-one.net> -%%% Purpose : Interface to zlib -%%% Created : 19 Jan 2006 by Alexey Shchepin <alexey@process-one.net> -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% This program is free software; you can redistribute it and/or -%%% modify it under the terms of the GNU General Public License as -%%% published by the Free Software Foundation; either version 2 of the -%%% License, or (at your option) any later version. -%%% -%%% This program is distributed in the hope that it will be useful, -%%% but WITHOUT ANY WARRANTY; without even the implied warranty of -%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%%% General Public License for more details. -%%% -%%% You should have received a copy of the GNU General Public License -%%% along with this program; if not, write to the Free Software -%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -%%% 02111-1307 USA -%%% -%%%---------------------------------------------------------------------- - --module(ejabberd_zlib). - --author('alexey@process-one.net'). - --behaviour(gen_server). - --export([start/0, start_link/0, enable_zlib/2, - disable_zlib/1, send/2, recv/2, recv/3, recv_data/2, - setopts/2, sockname/1, peername/1, get_sockmod/1, - controlling_process/2, close/1]). - -%% Internal exports, call-back functions. --export([init/1, handle_call/3, handle_cast/2, - handle_info/2, code_change/3, terminate/2]). - --define(DEFLATE, 1). - --define(INFLATE, 2). - --record(zlibsock, {sockmod :: atom(), - socket :: inet:socket(), - zlibport :: port()}). - --type zlib_socket() :: #zlibsock{}. - --export_type([zlib_socket/0]). - -start() -> - gen_server:start({local, ?MODULE}, ?MODULE, [], []). - -start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], - []). - -init([]) -> - case erl_ddll:load_driver(ejabberd:get_so_path(), - ejabberd_zlib_drv) - of - ok -> ok; - {error, already_loaded} -> ok - end, - Port = open_port({spawn, "ejabberd_zlib_drv"}, - [binary]), - {ok, Port}. - -%%% -------------------------------------------------------- -%%% The call-back functions. -%%% -------------------------------------------------------- - -handle_call(_, _, State) -> {noreply, State}. - -handle_cast(_, State) -> {noreply, State}. - -handle_info({'EXIT', Port, Reason}, Port) -> - {stop, {port_died, Reason}, Port}; -handle_info({'EXIT', _Pid, _Reason}, Port) -> - {noreply, Port}; -handle_info(_, State) -> {noreply, State}. - -code_change(_OldVsn, State, _Extra) -> {ok, State}. - -terminate(_Reason, Port) -> Port ! {self, close}, ok. - --spec enable_zlib(atom(), inet:socket()) -> {ok, zlib_socket()}. - -enable_zlib(SockMod, Socket) -> - case erl_ddll:load_driver(ejabberd:get_so_path(), - ejabberd_zlib_drv) - of - ok -> ok; - {error, already_loaded} -> ok - end, - Port = open_port({spawn, "ejabberd_zlib_drv"}, - [binary]), - {ok, - #zlibsock{sockmod = SockMod, socket = Socket, - zlibport = Port}}. - --spec disable_zlib(zlib_socket()) -> {atom(), inet:socket()}. - -disable_zlib(#zlibsock{sockmod = SockMod, - socket = Socket, zlibport = Port}) -> - port_close(Port), {SockMod, Socket}. - --spec recv(zlib_socket(), number()) -> {ok, binary()} | {error, any()}. - -recv(Socket, Length) -> recv(Socket, Length, infinity). - --spec recv(zlib_socket(), number(), timeout()) -> {ok, binary()} | - {error, any()}. - -recv(#zlibsock{sockmod = SockMod, socket = Socket} = - ZlibSock, - Length, Timeout) -> - case SockMod:recv(Socket, Length, Timeout) of - {ok, Packet} -> recv_data(ZlibSock, Packet); - {error, _Reason} = Error -> Error - end. - --spec recv_data(zlib_socket(), iodata()) -> {ok, binary()} | {error, any()}. - -recv_data(#zlibsock{sockmod = SockMod, - socket = Socket} = - ZlibSock, - Packet) -> - case SockMod of - gen_tcp -> recv_data2(ZlibSock, Packet); - _ -> - case SockMod:recv_data(Socket, Packet) of - {ok, Packet2} -> recv_data2(ZlibSock, Packet2); - Error -> Error - end - end. - -recv_data2(ZlibSock, Packet) -> - case catch recv_data1(ZlibSock, Packet) of - {'EXIT', Reason} -> {error, Reason}; - Res -> Res - end. - -recv_data1(#zlibsock{zlibport = Port} = _ZlibSock, - Packet) -> - case port_control(Port, ?INFLATE, Packet) of - <<0, In/binary>> -> {ok, In}; - <<1, Error/binary>> -> {error, (Error)} - end. - --spec send(zlib_socket(), iodata()) -> ok | {error, binary() | inet:posix()}. - -send(#zlibsock{sockmod = SockMod, socket = Socket, - zlibport = Port}, - Packet) -> - case port_control(Port, ?DEFLATE, Packet) of - <<0, Out/binary>> -> SockMod:send(Socket, Out); - <<1, Error/binary>> -> {error, (Error)} - end. - --spec setopts(zlib_socket(), list()) -> ok | {error, inet:posix()}. - -setopts(#zlibsock{sockmod = SockMod, socket = Socket}, - Opts) -> - case SockMod of - gen_tcp -> inet:setopts(Socket, Opts); - _ -> SockMod:setopts(Socket, Opts) - end. - --spec sockname(zlib_socket()) -> {ok, {inet:ip_address(), inet:port_number()}} | - {error, inet:posix()}. - -sockname(#zlibsock{sockmod = SockMod, - socket = Socket}) -> - case SockMod of - gen_tcp -> inet:sockname(Socket); - _ -> SockMod:sockname(Socket) - end. - --spec get_sockmod(zlib_socket()) -> atom(). - -get_sockmod(#zlibsock{sockmod = SockMod}) -> SockMod. - --spec peername(zlib_socket()) -> {ok, {inet:ip_address(), inet:port_number()}} | - {error, inet:posix()}. - -peername(#zlibsock{sockmod = SockMod, - socket = Socket}) -> - case SockMod of - gen_tcp -> inet:peername(Socket); - _ -> SockMod:peername(Socket) - end. - --spec controlling_process(zlib_socket(), pid()) -> ok | {error, atom()}. - -controlling_process(#zlibsock{sockmod = SockMod, - socket = Socket}, - Pid) -> - SockMod:controlling_process(Socket, Pid). - --spec close(zlib_socket()) -> true. - -close(#zlibsock{sockmod = SockMod, socket = Socket, - zlibport = Port}) -> - SockMod:close(Socket), port_close(Port). diff --git a/src/ejabberd_zlib/ejabberd_zlib_drv.c b/src/ejabberd_zlib/ejabberd_zlib_drv.c deleted file mode 100644 index ea1cc74ca..000000000 --- a/src/ejabberd_zlib/ejabberd_zlib_drv.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * ejabberd, Copyright (C) 2002-2013 ProcessOne - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - * 02111-1307 USA - * - */ - -#include <stdio.h> -#include <string.h> -#include <erl_driver.h> -#include <zlib.h> - -/* - * R15B changed several driver callbacks to use ErlDrvSizeT and - * ErlDrvSSizeT typedefs instead of int. - * This provides missing typedefs on older OTP versions. - */ -#if ERL_DRV_EXTENDED_MAJOR_VERSION < 2 -typedef int ErlDrvSizeT; -typedef int ErlDrvSSizeT; -#endif - -#define BUF_SIZE 1024 - -typedef struct { - ErlDrvPort port; - z_stream *d_stream; - z_stream *i_stream; -} ejabberd_zlib_data; - -static void* zlib_alloc(void* data, unsigned int items, unsigned int size) -{ - return (void*) driver_alloc(items*size); -} - -static void zlib_free(void* data, void* addr) -{ - driver_free(addr); -} - -static ErlDrvData ejabberd_zlib_drv_start(ErlDrvPort port, char *buff) -{ - ejabberd_zlib_data *d = - (ejabberd_zlib_data *)driver_alloc(sizeof(ejabberd_zlib_data)); - d->port = port; - - d->d_stream = (z_stream *)driver_alloc(sizeof(z_stream)); - - d->d_stream->zalloc = zlib_alloc; - d->d_stream->zfree = zlib_free; - d->d_stream->opaque = (voidpf)0; - - deflateInit(d->d_stream, Z_DEFAULT_COMPRESSION); - - d->i_stream = (z_stream *)driver_alloc(sizeof(z_stream)); - - d->i_stream->zalloc = zlib_alloc; - d->i_stream->zfree = zlib_free; - d->i_stream->opaque = (voidpf)0; - - inflateInit(d->i_stream); - - set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY); - - return (ErlDrvData)d; -} - -static void ejabberd_zlib_drv_stop(ErlDrvData handle) -{ - ejabberd_zlib_data *d = (ejabberd_zlib_data *)handle; - - deflateEnd(d->d_stream); - driver_free(d->d_stream); - - inflateEnd(d->i_stream); - driver_free(d->i_stream); - - driver_free((char *)handle); -} - - -#define DEFLATE 1 -#define INFLATE 2 - -#define die_unless(cond, errstr) \ - if (!(cond)) \ - { \ - rlen = strlen(errstr) + 1; \ - b = driver_realloc_binary(b, rlen); \ - b->orig_bytes[0] = 1; \ - strncpy(b->orig_bytes + 1, errstr, rlen - 1); \ - *rbuf = (char *)b; \ - return rlen; \ - } - - -static ErlDrvSSizeT ejabberd_zlib_drv_control(ErlDrvData handle, - unsigned int command, - char *buf, ErlDrvSizeT len, - char **rbuf, ErlDrvSizeT rlen) -{ - ejabberd_zlib_data *d = (ejabberd_zlib_data *)handle; - int err; - int size; - ErlDrvBinary *b; - - switch (command) - { - case DEFLATE: - size = BUF_SIZE + 1; - rlen = 1; - b = driver_alloc_binary(size); - b->orig_bytes[0] = 0; - - d->d_stream->next_in = (unsigned char *)buf; - d->d_stream->avail_in = len; - d->d_stream->avail_out = 0; - err = Z_OK; - - while (err == Z_OK && d->d_stream->avail_out == 0) - { - d->d_stream->next_out = (unsigned char *)b->orig_bytes + rlen; - d->d_stream->avail_out = BUF_SIZE; - - err = deflate(d->d_stream, Z_SYNC_FLUSH); - die_unless((err == Z_OK) || (err == Z_STREAM_END), - "Deflate error"); - - rlen += (BUF_SIZE - d->d_stream->avail_out); - size += (BUF_SIZE - d->d_stream->avail_out); - b = driver_realloc_binary(b, size); - } - b = driver_realloc_binary(b, rlen); - *rbuf = (char *)b; - return rlen; - case INFLATE: - size = BUF_SIZE + 1; - rlen = 1; - b = driver_alloc_binary(size); - b->orig_bytes[0] = 0; - - if (len > 0) { - d->i_stream->next_in = (unsigned char *)buf; - d->i_stream->avail_in = len; - d->i_stream->avail_out = 0; - err = Z_OK; - - while (err == Z_OK && d->i_stream->avail_out == 0) - { - d->i_stream->next_out = (unsigned char *)b->orig_bytes + rlen; - d->i_stream->avail_out = BUF_SIZE; - - err = inflate(d->i_stream, Z_SYNC_FLUSH); - die_unless((err == Z_OK) || (err == Z_STREAM_END), - "Inflate error"); - - rlen += (BUF_SIZE - d->i_stream->avail_out); - size += (BUF_SIZE - d->i_stream->avail_out); - b = driver_realloc_binary(b, size); - } - } - b = driver_realloc_binary(b, rlen); - *rbuf = (char *)b; - return rlen; - } - - b = driver_alloc_binary(1); - b->orig_bytes[0] = 0; - *rbuf = (char *)b; - return 1; -} - - -ErlDrvEntry ejabberd_zlib_driver_entry = { - NULL, /* F_PTR init, N/A */ - ejabberd_zlib_drv_start, /* L_PTR start, called when port is opened */ - ejabberd_zlib_drv_stop, /* F_PTR stop, called when port is closed */ - NULL, /* F_PTR output, called when erlang has sent */ - NULL, /* F_PTR ready_input, called when input descriptor ready */ - NULL, /* F_PTR ready_output, called when output descriptor ready */ - "ejabberd_zlib_drv", /* char *driver_name, the argument to open_port */ - NULL, /* F_PTR finish, called when unloaded */ - NULL, /* handle */ - ejabberd_zlib_drv_control, /* F_PTR control, port_command callback */ - NULL, /* F_PTR timeout, reserved */ - NULL, /* F_PTR outputv, reserved */ - /* Added in Erlang/OTP R15B: */ - NULL, /* ready_async */ - NULL, /* flush */ - NULL, /* call */ - NULL, /* event */ - ERL_DRV_EXTENDED_MARKER, /* extended_marker */ - ERL_DRV_EXTENDED_MAJOR_VERSION, /* major_version */ - ERL_DRV_EXTENDED_MINOR_VERSION, /* minor_version */ - 0, /* driver_flags */ - NULL, /* handle2 */ - NULL, /* process_exit */ - NULL /* stop_select */ -}; - -DRIVER_INIT(ejabberd_zlib_drv) /* must match name in driver_entry */ -{ - return &ejabberd_zlib_driver_entry; -} - - |