From dd7595a3475407a7fa96a97393bae8c5220e8762 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Wed, 4 Jan 2012 18:41:13 +1000 Subject: Add the base Enlightenment Foundation Libraries - eina, eet, evas, ecore, embryo, and edje. Note that embryo wont be used, but I'm not sure yet if you can build edje without it. --- libraries/evas/src/lib/cserve/Makefile.am | 32 ++ libraries/evas/src/lib/cserve/Makefile.in | 688 +++++++++++++++++++++++++ libraries/evas/src/lib/cserve/evas_cs.h | 285 ++++++++++ libraries/evas/src/lib/cserve/evas_cs_client.c | 528 +++++++++++++++++++ libraries/evas/src/lib/cserve/evas_cs_main.c | 9 + libraries/evas/src/lib/cserve/evas_cs_mem.c | 168 ++++++ libraries/evas/src/lib/cserve/evas_cs_server.c | 380 ++++++++++++++ 7 files changed, 2090 insertions(+) create mode 100644 libraries/evas/src/lib/cserve/Makefile.am create mode 100644 libraries/evas/src/lib/cserve/Makefile.in create mode 100644 libraries/evas/src/lib/cserve/evas_cs.h create mode 100644 libraries/evas/src/lib/cserve/evas_cs_client.c create mode 100644 libraries/evas/src/lib/cserve/evas_cs_main.c create mode 100644 libraries/evas/src/lib/cserve/evas_cs_mem.c create mode 100644 libraries/evas/src/lib/cserve/evas_cs_server.c (limited to 'libraries/evas/src/lib/cserve') diff --git a/libraries/evas/src/lib/cserve/Makefile.am b/libraries/evas/src/lib/cserve/Makefile.am new file mode 100644 index 0000000..6ff6e2a --- /dev/null +++ b/libraries/evas/src/lib/cserve/Makefile.am @@ -0,0 +1,32 @@ +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/lib/cserve \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" \ +-DPACKAGE_LIB_DIR=\"$(libdir)\" \ +-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ +@EINA_CFLAGS@ \ +@FREETYPE_CFLAGS@ \ +@FRIBIDI_CFLAGS@ \ +@EET_CFLAGS@ \ +@FONTCONFIG_CFLAGS@ \ +@pthread_cflags@ \ +@PIXMAN_CFLAGS@ + +if EVAS_CSERVE + +noinst_LTLIBRARIES = libevas_cserve.la + +endif + +libevas_cserve_la_SOURCES = \ +evas_cs.h \ +evas_cs_main.c \ +evas_cs_server.c \ +evas_cs_client.c \ +evas_cs_mem.c + +libevas_cserve_la_LIBADD = @EINA_LIBS@ -lrt diff --git a/libraries/evas/src/lib/cserve/Makefile.in b/libraries/evas/src/lib/cserve/Makefile.in new file mode 100644 index 0000000..74b5ff9 --- /dev/null +++ b/libraries/evas/src/lib/cserve/Makefile.in @@ -0,0 +1,688 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/lib/cserve +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/efl_attribute.m4 \ + $(top_srcdir)/m4/efl_coverage.m4 \ + $(top_srcdir)/m4/efl_doxygen.m4 \ + $(top_srcdir)/m4/efl_fnmatch.m4 \ + $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \ + $(top_srcdir)/m4/evas_check_engine.m4 \ + $(top_srcdir)/m4/evas_check_loader.m4 \ + $(top_srcdir)/m4/evas_converter.m4 \ + $(top_srcdir)/m4/evas_dither.m4 \ + $(top_srcdir)/m4/evas_scaler.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libevas_cserve_la_DEPENDENCIES = +am_libevas_cserve_la_OBJECTS = evas_cs_main.lo evas_cs_server.lo \ + evas_cs_client.lo evas_cs_mem.lo +libevas_cserve_la_OBJECTS = $(am_libevas_cserve_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +@EVAS_CSERVE_TRUE@am_libevas_cserve_la_rpath = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libevas_cserve_la_SOURCES) +DIST_SOURCES = $(libevas_cserve_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_CFLAGS = @CHECK_CFLAGS@ +CHECK_LIBS = @CHECK_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@ +DIRECTFB_LIBS = @DIRECTFB_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ECORE_EVAS_CFLAGS = @ECORE_EVAS_CFLAGS@ +ECORE_EVAS_LIBS = @ECORE_EVAS_LIBS@ +EDB_CFLAGS = @EDB_CFLAGS@ +EDB_LIBS = @EDB_LIBS@ +EDJE_CFLAGS = @EDJE_CFLAGS@ +EDJE_LIBS = @EDJE_LIBS@ +EET_CFLAGS = @EET_CFLAGS@ +EET_LIBS = @EET_LIBS@ +EFL_COVERAGE_CFLAGS = @EFL_COVERAGE_CFLAGS@ +EFL_COVERAGE_LIBS = @EFL_COVERAGE_LIBS@ +EFL_FNMATCH_LIBS = @EFL_FNMATCH_LIBS@ +EGREP = @EGREP@ +EINA_CFLAGS = @EINA_CFLAGS@ +EINA_LIBS = @EINA_LIBS@ +EVAS_CFLAGS = @EVAS_CFLAGS@ +EVAS_LIBS = @EVAS_LIBS@ +EVAS_SSE3_CFLAGS = @EVAS_SSE3_CFLAGS@ +EVIL_CFLAGS = @EVIL_CFLAGS@ +EVIL_LIBS = @EVIL_LIBS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GL_EET_CFLAGS = @GL_EET_CFLAGS@ +GL_EET_LIBS = @GL_EET_LIBS@ +GREP = @GREP@ +HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LINEBREAK_CFLAGS = @LINEBREAK_CFLAGS@ +LINEBREAK_LIBS = @LINEBREAK_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MODULE_ARCH = @MODULE_ARCH@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PIXMAN_CFLAGS = @PIXMAN_CFLAGS@ +PIXMAN_LIBS = @PIXMAN_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHM_OPEN_LINK = @SHM_OPEN_LINK@ +STRIP = @STRIP@ +SVG_CFLAGS = @SVG_CFLAGS@ +SVG_LIBS = @SVG_LIBS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +VMAJ = @VMAJ@ +WIN32_CFLAGS = @WIN32_CFLAGS@ +WIN32_CPPFLAGS = @WIN32_CPPFLAGS@ +XCB_CFLAGS = @XCB_CFLAGS@ +XCB_GL_CFLAGS = @XCB_GL_CFLAGS@ +XCB_GL_LIBS = @XCB_GL_LIBS@ +XCB_LIBS = @XCB_LIBS@ +XEXT_CFLAGS = @XEXT_CFLAGS@ +XEXT_LIBS = @XEXT_LIBS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +altivec_cflags = @altivec_cflags@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +dlopen_libs = @dlopen_libs@ +docdir = @docdir@ +dvidir = @dvidir@ +edje_cc = @edje_cc@ +efl_doxygen = @efl_doxygen@ +efl_have_doxygen = @efl_have_doxygen@ +evas_engine_buffer_cflags = @evas_engine_buffer_cflags@ +evas_engine_buffer_libs = @evas_engine_buffer_libs@ +evas_engine_direct3d_cflags = @evas_engine_direct3d_cflags@ +evas_engine_direct3d_libs = @evas_engine_direct3d_libs@ +evas_engine_directfb_cflags = @evas_engine_directfb_cflags@ +evas_engine_directfb_libs = @evas_engine_directfb_libs@ +evas_engine_fb_cflags = @evas_engine_fb_cflags@ +evas_engine_fb_libs = @evas_engine_fb_libs@ +evas_engine_gl_cocoa_cflags = @evas_engine_gl_cocoa_cflags@ +evas_engine_gl_cocoa_libs = @evas_engine_gl_cocoa_libs@ +evas_engine_gl_common_libs = @evas_engine_gl_common_libs@ +evas_engine_gl_sdl_cflags = @evas_engine_gl_sdl_cflags@ +evas_engine_gl_sdl_libs = @evas_engine_gl_sdl_libs@ +evas_engine_gl_xcb_cflags = @evas_engine_gl_xcb_cflags@ +evas_engine_gl_xcb_libs = @evas_engine_gl_xcb_libs@ +evas_engine_gl_xlib_cflags = @evas_engine_gl_xlib_cflags@ +evas_engine_gl_xlib_libs = @evas_engine_gl_xlib_libs@ +evas_engine_psl1ght_cflags = @evas_engine_psl1ght_cflags@ +evas_engine_psl1ght_libs = @evas_engine_psl1ght_libs@ +evas_engine_software_16_ddraw_cflags = @evas_engine_software_16_ddraw_cflags@ +evas_engine_software_16_ddraw_libs = @evas_engine_software_16_ddraw_libs@ +evas_engine_software_16_sdl_cflags = @evas_engine_software_16_sdl_cflags@ +evas_engine_software_16_sdl_libs = @evas_engine_software_16_sdl_libs@ +evas_engine_software_16_wince_cflags = @evas_engine_software_16_wince_cflags@ +evas_engine_software_16_wince_libs = @evas_engine_software_16_wince_libs@ +evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@ +evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@ +evas_engine_software_8_x11_cflags = @evas_engine_software_8_x11_cflags@ +evas_engine_software_8_x11_libs = @evas_engine_software_8_x11_libs@ +evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@ +evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@ +evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@ +evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@ +evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@ +evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@ +evas_engine_software_xcb_cflags = @evas_engine_software_xcb_cflags@ +evas_engine_software_xcb_libs = @evas_engine_software_xcb_libs@ +evas_engine_software_xlib_cflags = @evas_engine_software_xlib_cflags@ +evas_engine_software_xlib_libs = @evas_engine_software_xlib_libs@ +evas_image_loader_bmp_cflags = @evas_image_loader_bmp_cflags@ +evas_image_loader_bmp_libs = @evas_image_loader_bmp_libs@ +evas_image_loader_edb_cflags = @evas_image_loader_edb_cflags@ +evas_image_loader_edb_libs = @evas_image_loader_edb_libs@ +evas_image_loader_eet_cflags = @evas_image_loader_eet_cflags@ +evas_image_loader_eet_libs = @evas_image_loader_eet_libs@ +evas_image_loader_generic_cflags = @evas_image_loader_generic_cflags@ +evas_image_loader_generic_libs = @evas_image_loader_generic_libs@ +evas_image_loader_gif_cflags = @evas_image_loader_gif_cflags@ +evas_image_loader_gif_libs = @evas_image_loader_gif_libs@ +evas_image_loader_ico_cflags = @evas_image_loader_ico_cflags@ +evas_image_loader_ico_libs = @evas_image_loader_ico_libs@ +evas_image_loader_jpeg_cflags = @evas_image_loader_jpeg_cflags@ +evas_image_loader_jpeg_libs = @evas_image_loader_jpeg_libs@ +evas_image_loader_pmaps_cflags = @evas_image_loader_pmaps_cflags@ +evas_image_loader_pmaps_libs = @evas_image_loader_pmaps_libs@ +evas_image_loader_png_cflags = @evas_image_loader_png_cflags@ +evas_image_loader_png_libs = @evas_image_loader_png_libs@ +evas_image_loader_psd_cflags = @evas_image_loader_psd_cflags@ +evas_image_loader_psd_libs = @evas_image_loader_psd_libs@ +evas_image_loader_svg_cflags = @evas_image_loader_svg_cflags@ +evas_image_loader_svg_libs = @evas_image_loader_svg_libs@ +evas_image_loader_tga_cflags = @evas_image_loader_tga_cflags@ +evas_image_loader_tga_libs = @evas_image_loader_tga_libs@ +evas_image_loader_tiff_cflags = @evas_image_loader_tiff_cflags@ +evas_image_loader_tiff_libs = @evas_image_loader_tiff_libs@ +evas_image_loader_wbmp_cflags = @evas_image_loader_wbmp_cflags@ +evas_image_loader_wbmp_libs = @evas_image_loader_wbmp_libs@ +evas_image_loader_xpm_cflags = @evas_image_loader_xpm_cflags@ +evas_image_loader_xpm_libs = @evas_image_loader_xpm_libs@ +exec_prefix = @exec_prefix@ +have_evas_engine_gl_x11 = @have_evas_engine_gl_x11@ +have_evas_engine_gl_xcb = @have_evas_engine_gl_xcb@ +have_evas_engine_gl_xlib = @have_evas_engine_gl_xlib@ +have_evas_engine_software_x11 = @have_evas_engine_software_x11@ +have_evas_engine_software_xcb = @have_evas_engine_software_xcb@ +have_evas_engine_software_xlib = @have_evas_engine_software_xlib@ +have_lcov = @have_lcov@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +lt_enable_auto_import = @lt_enable_auto_import@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfig_requires_private = @pkgconfig_requires_private@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_cflags = @pthread_cflags@ +pthread_libs = @pthread_libs@ +release_info = @release_info@ +requirement_evas = @requirement_evas@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +version_info = @version_info@ +MAINTAINERCLEANFILES = Makefile.in +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/lib/cserve \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" \ +-DPACKAGE_LIB_DIR=\"$(libdir)\" \ +-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ +@EINA_CFLAGS@ \ +@FREETYPE_CFLAGS@ \ +@FRIBIDI_CFLAGS@ \ +@EET_CFLAGS@ \ +@FONTCONFIG_CFLAGS@ \ +@pthread_cflags@ \ +@PIXMAN_CFLAGS@ + +@EVAS_CSERVE_TRUE@noinst_LTLIBRARIES = libevas_cserve.la +libevas_cserve_la_SOURCES = \ +evas_cs.h \ +evas_cs_main.c \ +evas_cs_server.c \ +evas_cs_client.c \ +evas_cs_mem.c + +libevas_cserve_la_LIBADD = @EINA_LIBS@ -lrt +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/cserve/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/lib/cserve/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libevas_cserve.la: $(libevas_cserve_la_OBJECTS) $(libevas_cserve_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libevas_cserve_la_rpath) $(libevas_cserve_la_OBJECTS) $(libevas_cserve_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_cs_client.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_cs_main.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_cs_mem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_cs_server.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libraries/evas/src/lib/cserve/evas_cs.h b/libraries/evas/src/lib/cserve/evas_cs.h new file mode 100644 index 0000000..73bbaed --- /dev/null +++ b/libraries/evas/src/lib/cserve/evas_cs.h @@ -0,0 +1,285 @@ +#ifndef EVAS_CS_H +#define EVAS_CS_H 1 + +#ifdef EVAS_CSERVE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "evas_common.h" +#include "evas_private.h" + +#ifdef EAPI +# undef EAPI +#endif + +#ifdef _WIN32 +# ifdef EFL_EVAS_BUILD +# ifdef DLL_EXPORT +# define EAPI __declspec(dllexport) +# else +# define EAPI +# endif /* ! DLL_EXPORT */ +# else +# define EAPI __declspec(dllimport) +# endif /* ! EFL_EVAS_BUILD */ +#else +# ifdef __GNUC__ +# if __GNUC__ >= 4 +# define EAPI __attribute__ ((visibility("default"))) +# else +# define EAPI +# endif +# else +# define EAPI +# endif +#endif /* ! _WIN32 */ + +#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + (size_t)(((struct sockaddr_un *)NULL)->sun_path)) + +typedef struct _Server Server; +typedef struct _Client Client; +typedef struct _Mem Mem; + +struct _Server +{ + char *socket_path; + Eina_List *clients; + int (*func) (void *fdata, Server *s, Client *c, int opcode, int size, unsigned char *data); + void *data; + pid_t pid; + int server_id; + // for channel 2; + struct { + int fd; + int req_from, req_to; + } ch[2]; + void *main_handle; +}; + +struct _Client +{ + Server *server; + unsigned char *buf; + Client *client_main; + int bufsize, bufalloc; + int fd; + unsigned char *inbuf; + int inbufsize, inbufalloc; + unsigned char dead : 1; + void (*func) (void *fdata, Client *c); + void *data; + pid_t pid; + int req_from, req_to; + LK(lock); +}; + +struct _Mem +{ + unsigned char *data; + char *name; + int fd; + int id; + int offset; + int size; + int ref; + Eina_Bool write : 1; +}; + +//// for comms +enum +{ + OP_NOP, // 0 + + OP_INIT, // 1 + OP_LOAD, // 2 + OP_UNLOAD, // 3 + OP_LOADDATA, // 4 + OP_UNLOADDATA, // 5 + OP_USELESSDATA, // 6 + OP_PRELOAD, // 7 + OP_FORCEDUNLOAD, // 8 + + OP_GETCONFIG, // 9 + OP_SETCONFIG, // 10 + OP_GETSTATS, // 11 + OP_GETINFO, // 12 + + OP_INVALID // 13 +}; + +typedef struct +{ + pid_t pid; + int server_id; + void *handle; +} Op_Init; +typedef struct +{ + struct { + int scale_down_by; + double dpi; + int w, h; + struct { + int x, y, w, h; + } region; + Eina_Bool orientation; + } lopt; +} Op_Load; // +"file""key" +typedef struct +{ + void *handle; + int server_id; + struct { + int id; + int offset; + int size; + } mem; + struct { + int w, h; + Eina_Bool alpha : 1; + } image; +} Op_Load_Reply; +typedef struct +{ + void *handle; + int server_id; +} Op_Unload; +typedef struct +{ + void *handle; + int server_id; +} Op_Unloaddata; +typedef struct +{ + void *handle; + int server_id; +} Op_Loaddata; +typedef struct +{ + struct { + int id; + int offset; + int size; + } mem; +} Op_Loaddata_Reply; +typedef struct +{ + void *handle; + int server_id; +} Op_Preload; +typedef struct +{ + void *handle; + struct { + int id; + int offset; + int size; + } mem; +} Op_Preload_Reply; +typedef struct +{ + void *handle; + int server_id; +} Op_Forcedunload; +typedef struct +{ + int cache_max_usage; + int cache_item_timeout; + int cache_item_timeout_check; +} Op_Getconfig_Reply; +typedef struct +{ + int cache_max_usage; + int cache_item_timeout; + int cache_item_timeout_check; +} Op_Setconfig; +typedef struct +{ + int saved_memory; + int wasted_memory; + int saved_memory_peak; + int wasted_memory_peak; + double saved_time_image_header_load; + double saved_time_image_data_load; +} Op_Getstats_Reply; +typedef struct +{ + struct { + int mem_total; + int count; + } active, cached; +} Op_Getinfo_Reply; // + N active Info Items + N cached items +typedef struct +{ + int file_key_size; + int w, h; + time_t file_mod_time; + time_t file_checked_time; + time_t cached_time; + int refcount; + int data_refcount; + int memory_footprint; + double head_load_time; + double data_load_time; + Eina_Bool alpha : 1; + Eina_Bool data_loaded : 1; + Eina_Bool active : 1; + Eina_Bool dead : 1; + Eina_Bool useless : 1; +} Op_Getinfo_Item; // + "file""key" + + +// for clients to connect to cserve +EAPI Eina_Bool evas_cserve_init(void); +EAPI int evas_cserve_use_get(void); +EAPI Eina_Bool evas_cserve_have_get(void); +EAPI void evas_cserve_shutdown(void); +EAPI void evas_cserve_discon(void); +EAPI Eina_Bool evas_cserve_image_load(Image_Entry *ie, const char *file, const char *key, RGBA_Image_Loadopts *lopt); +EAPI Eina_Bool evas_cserve_image_data_load(Image_Entry *ie); +EAPI void evas_cserve_image_unload(Image_Entry *ie); +EAPI void evas_cserve_image_useless(Image_Entry *ie); +EAPI void evas_cserve_image_free(Image_Entry *ie); +EAPI Eina_Bool evas_cserve_raw_config_get(Op_Getconfig_Reply *config); +EAPI Eina_Bool evas_cserve_raw_config_set(Op_Setconfig *config); +EAPI Eina_Bool evas_cserve_raw_stats_get(Op_Getstats_Reply *stats); +EAPI Op_Getinfo_Reply *evas_cserve_raw_info_get(void); + +// for the server +EAPI Server *evas_cserve_server_add(void); +EAPI void evas_cserve_server_del(Server *s); +EAPI void evas_cserve_client_send(Client *c, int opcode, int size, unsigned char *data); +EAPI void evas_cserve_server_message_handler_set(Server *s, int (*func) (void *fdata, Server *s, Client *c, int opcode, int size, unsigned char *data), void *data); +EAPI void evas_cserve_server_wait(Server *s, int timeout); + +//// for memory +// for server +EAPI Mem *evas_cserve_mem_new(int size, const char *name); +EAPI void evas_cserve_mem_free(Mem *m); + +// for client +EAPI Mem *evas_cserve_mem_open(int pid, int id, const char *name, int size, int do_write); +EAPI void evas_cserve_mem_close(Mem *m); + +// for both +EAPI Eina_Bool evas_cserve_mem_resize(Mem *m, int size); +EAPI void evas_cserve_mem_del(int pid, int id); + +#endif + +#endif diff --git a/libraries/evas/src/lib/cserve/evas_cs_client.c b/libraries/evas/src/lib/cserve/evas_cs_client.c new file mode 100644 index 0000000..b24848d --- /dev/null +++ b/libraries/evas/src/lib/cserve/evas_cs_client.c @@ -0,0 +1,528 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "evas_cs.h" + +#ifdef EVAS_CSERVE + +static Server *cserve = NULL; +static int csrve_init = 0; +static int connect_num = 0; +static int cserve_discon = 0; + +static void +pipe_handler(int x __UNUSED__, siginfo_t *info __UNUSED__, void *data __UNUSED__) +{ +} + +static void +pipe_handle(int push) +{ + static struct sigaction old_action; + struct sigaction action; + + if (push) + { + action.sa_handler = NULL; + action.sa_sigaction = pipe_handler; + action.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGPIPE, &action, &old_action); + } + else + { + sigaction(SIGPIPE, &old_action, &action); + } +} + +static Server * +server_connect(void) +{ + Server *s; + char buf[PATH_MAX]; + int curstate = 0; + struct sockaddr_un socket_unix; + int socket_unix_len; + + s = calloc(1, sizeof(Server)); + if (!s) return NULL; + s->ch[0].fd = -1; + s->ch[1].fd = -1; + snprintf(buf, sizeof(buf), "/tmp/.evas-cserve-%x", getuid()); + s->socket_path = strdup(buf); + if (!s->socket_path) + { + free(s); + return NULL; + } + s->ch[0].fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (s->ch[0].fd < 0) goto error; + if (fcntl(s->ch[0].fd, F_SETFD, FD_CLOEXEC) < 0) goto error; + if (setsockopt(s->ch[0].fd, SOL_SOCKET, SO_REUSEADDR, &curstate, sizeof(curstate)) < 0) + goto error; + socket_unix.sun_family = AF_UNIX; + strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path)); + socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix); + if (connect(s->ch[0].fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) goto error; + + s->ch[1].fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (s->ch[1].fd < 0) goto error; + if (fcntl(s->ch[1].fd, F_SETFD, FD_CLOEXEC) < 0) goto error; + if (setsockopt(s->ch[1].fd, SOL_SOCKET, SO_REUSEADDR, &curstate, sizeof(curstate)) < 0) + goto error; + socket_unix.sun_family = AF_UNIX; + strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path)); + socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix); + if (connect(s->ch[1].fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) goto error; + + return s; + error: + if (s->ch[0].fd >= 0) close(s->ch[0].fd); + if (s->ch[1].fd >= 0) close(s->ch[1].fd); + free(s->socket_path); + free(s); + return NULL; +} + +static void +server_disconnect(Server *s) +{ + close(s->ch[0].fd); + close(s->ch[1].fd); + free(s->socket_path); + free(s); +} + +static int +server_send(Server *s, int channel, int opcode, int size, unsigned char *data) +{ + int ints[3]; + int num; + + pipe_handle(1); + ints[0] = size; + ints[1] = opcode; + s->ch[channel].req_to++; + ints[2] = s->ch[channel].req_to; + num = write(s->ch[channel].fd, ints, (sizeof(int) * 3)); + if (num < 0) + { + pipe_handle(0); + if (cserve) server_disconnect(cserve); + cserve = NULL; + return 0; + } + num = write(s->ch[channel].fd, data, size); + if (num < 0) + { + pipe_handle(0); + if (cserve) server_disconnect(cserve); + cserve = NULL; + return 0; + } + pipe_handle(0); + return 1; +} + +static unsigned char * +server_read(Server *s, int channel, int *opcode, int *size) +{ + int ints[3], num, left; + unsigned char *data; + + num = read(s->ch[channel].fd, ints, sizeof(int) * 3); + if (num != (sizeof(int) * 3)) + { + if (cserve) server_disconnect(cserve); + cserve = NULL; + return NULL; + } + *size = ints[0]; + *opcode = ints[1]; + if ((*size < 0) || (*size > (1024 * 1024))) return NULL; + if (ints[2] != (s->ch[channel].req_from + 1)) + { + ERR("EEK! sequence number mismatch from serer with pid: %i. " + "---- num %i is not 1 more than %i" + , + s->pid, ints[2], s->ch[channel].req_from); + return NULL; + } + s->ch[channel].req_from++; + data = malloc(*size); + if (!data) return NULL; + num = read(s->ch[channel].fd, data, *size); + if (num < 0) + { + free(data); + return NULL; + } + left = *size - num; + while (left > 0) + { + num = read(s->ch[channel].fd, data + (*size - left), left); + if (num < 0) + { + free(data); + return NULL; + } + left -= num; + } + return data; +} + +static int +server_init(Server *s) +{ + Op_Init msg, *rep; + int opcode; + int size; + + msg.pid = getpid(); + msg.server_id = 0; + msg.handle = NULL; + if (!server_send(s, 0, OP_INIT, sizeof(msg), (unsigned char *)(&msg))) + return 0; + rep = (Op_Init *)server_read(s, 0, &opcode, &size); + if ((rep) && (opcode == OP_INIT) && (size == sizeof(Op_Init))) + { + s->pid = rep->pid; + s->server_id = rep->server_id; + s->main_handle = rep->handle; + connect_num++; + msg.pid = getpid(); + msg.server_id = 1; + msg.handle = rep->handle; + free(rep); + if (!server_send(s, 1, OP_INIT, sizeof(msg), (unsigned char *)(&msg))) + return 0; + rep = (Op_Init *)server_read(s, 1, &opcode, &size); + if ((rep) && (opcode == OP_INIT) && (size == sizeof(Op_Init))) + { + free(rep); + return 1; + } + if (rep) free(rep); + return 0; + } + if (rep) free(rep); + return 0; +} + +EAPI Eina_Bool +evas_cserve_init(void) +{ + csrve_init++; + if (cserve) return 1; + cserve = server_connect(); + if (!cserve) return 0; + if (!server_init(cserve)) + { + if (cserve) server_disconnect(cserve); + cserve = NULL; + return 0; + } + return 1; +} + +EAPI int +evas_cserve_use_get(void) +{ + return csrve_init; +} + +EAPI Eina_Bool +evas_cserve_have_get(void) +{ + if (cserve) return 1; + return 0; +} + +EAPI void +evas_cserve_shutdown(void) +{ + csrve_init--; + if (csrve_init > 0) return; + if (!cserve) return; + server_disconnect(cserve); + cserve = NULL; +} + +EAPI void +evas_cserve_discon(void) +{ + if (cserve) + { + server_disconnect(cserve); + cserve = NULL; + cserve_discon = 1; + } +} + +static void +server_reinit(void) +{ + if (cserve) return; + if (cserve_discon) return; + cserve = server_connect(); + if (cserve) + { + if (!server_init(cserve)) + { + if (cserve) server_disconnect(cserve); + cserve = NULL; + } + } +} + +EAPI Eina_Bool +evas_cserve_image_load(Image_Entry *ie, const char *file, const char *key, RGBA_Image_Loadopts *lopt) +{ + Op_Load msg; + Op_Load_Reply *rep; + unsigned char *buf; + char fbuf[PATH_MAX], wdb[PATH_MAX]; + int flen, klen; + int opcode; + int size; + + if (csrve_init > 0) server_reinit(); + else return 0; + if (!cserve) return 0; + if (!key) key = ""; + memset(&msg, 0, sizeof(msg)); + msg.lopt.scale_down_by = lopt->scale_down_by; + msg.lopt.dpi = lopt->dpi; + msg.lopt.w = lopt->w; + msg.lopt.h = lopt->h; + msg.lopt.region.x = lopt->region.x; + msg.lopt.region.y = lopt->region.y; + msg.lopt.region.w = lopt->region.w; + msg.lopt.region.h = lopt->region.h; + msg.lopt.orientation = lopt->orientation; + if (file[0] != '/') + { + if (getcwd(wdb, sizeof(wdb))) + { + snprintf(fbuf, sizeof(buf), "%s/%s", wdb, file); + file = fbuf; + } + } + if (!realpath(file, wdb)) file = wdb; + flen = strlen(file) + 1; + klen = strlen(key) + 1; + buf = malloc(sizeof(msg) + flen + klen); + if (!buf) return 0; + memcpy(buf, &msg, sizeof(msg)); + memcpy(buf + sizeof(msg), file, flen); + memcpy(buf + sizeof(msg) + flen, key, klen); + if (!server_send(cserve, ie->channel, OP_LOAD, + sizeof(msg) + flen + klen, + buf)) + { + free(buf); + return 0; + } + free(buf); + if (!cserve) return 0; + rep = (Op_Load_Reply *)server_read(cserve, ie->channel, &opcode, &size); + if ((rep) && (opcode == OP_LOAD) && (size == sizeof(Op_Load_Reply))) + { + ie->w = rep->image.w; + ie->h = rep->image.h; + ie->flags.alpha = rep->image.alpha; + ie->data1 = rep->handle; + } + if (rep) free(rep); + if (!ie->data1) return 0; + ie->connect_num = connect_num; + if (cserve) + ie->server_id = cserve->server_id; + return 1; +} + +EAPI Eina_Bool +evas_cserve_image_data_load(Image_Entry *ie) +{ + Op_Loaddata msg; + Op_Loaddata_Reply *rep; + int opcode; + int size; + if (csrve_init > 0) server_reinit(); + else return 0; + if (!cserve) return 0; + if (!ie->data1) return 0; + if (cserve->server_id != ie->server_id) + { + ie->data1 = NULL; + if (!evas_cserve_image_load(ie, ie->file, ie->key, &(ie->load_opts))) + return 0; + } + if (ie->connect_num != connect_num) return 0; + memset(&msg, 0, sizeof(msg)); + msg.handle = ie->data1; + msg.server_id = cserve->server_id; + if (!server_send(cserve, ie->channel, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg))) + return 0; + if (!cserve) return 0; + rep = (Op_Loaddata_Reply *)server_read(cserve, ie->channel, &opcode, &size); + if ((rep) && (opcode == OP_LOADDATA) && (size == sizeof(Op_Loaddata_Reply))) + { + if (rep->mem.size <= 0) + { + free(rep); + return 0; + } + ie->data2 = evas_cserve_mem_open(cserve->pid, rep->mem.id, NULL, rep->mem.size, 0); + free(rep); + return 1; + } + if (rep) free(rep); + return 0; +} + +EAPI void +evas_cserve_image_free(Image_Entry *ie) +{ + Op_Unload msg; + + if (csrve_init > 0) server_reinit(); + else return; + if (!cserve) return; + if (!ie->data1) return; + memset(&msg, 0, sizeof(msg)); + msg.handle = ie->data1; + msg.server_id = cserve->server_id; + if (ie->data2) evas_cserve_image_unload(ie); + if (cserve) + { + if (ie->connect_num == connect_num) + { + if (ie->server_id == cserve->server_id) + server_send(cserve, ie->channel, OP_UNLOAD, sizeof(msg), (unsigned char *)(&msg)); + } + } + ie->data1 = NULL; + ie->data2 = NULL; +} + +EAPI void +evas_cserve_image_unload(Image_Entry *ie) +{ + Op_Unloaddata msg; + + if (csrve_init > 0) server_reinit(); + else return; + if (!cserve) return; + if (!ie->data1) return; + if (ie->connect_num != connect_num) return; + memset(&msg, 0, sizeof(msg)); + msg.handle = ie->data1; + msg.server_id = cserve->server_id; + if (ie->data2) evas_cserve_mem_close(ie->data2); + ie->data2 = NULL; + if (ie->connect_num == connect_num) + { + if (ie->server_id == cserve->server_id) + server_send(cserve, ie->channel, OP_UNLOADDATA, sizeof(msg), (unsigned char *)(&msg)); + } +} + +EAPI void +evas_cserve_image_useless(Image_Entry *ie) +{ + Op_Unloaddata msg; + + if (csrve_init > 0) server_reinit(); + else return; + if (!cserve) return; + if (!ie->data1) return; + if (ie->connect_num != connect_num) return; + memset(&msg, 0, sizeof(msg)); + msg.handle = ie->data1; + msg.server_id = cserve->server_id; + if (ie->data2) evas_cserve_mem_close(ie->data2); + ie->data2 = NULL; + if (ie->connect_num == connect_num) + { + if (ie->server_id == cserve->server_id) + server_send(cserve, ie->channel, OP_USELESSDATA, sizeof(msg), (unsigned char *)(&msg)); + } +} + +EAPI Eina_Bool +evas_cserve_raw_config_get(Op_Getconfig_Reply *config) +{ + Op_Getconfig_Reply *rep; + int opcode; + int size; + if (csrve_init > 0) server_reinit(); + else return 0; + if (!cserve) return 0; + if (!server_send(cserve, 0, OP_GETCONFIG, 0, NULL)) return 0; + rep = (Op_Getconfig_Reply *)server_read(cserve, 0, &opcode, &size); + if ((rep) && (opcode == OP_GETCONFIG) && (size == sizeof(Op_Getconfig_Reply))) + { + memcpy(config, rep, sizeof(Op_Getconfig_Reply)); + free(rep); + return 1; + } + if (rep) free(rep); + return 0; +} + +EAPI Eina_Bool +evas_cserve_raw_config_set(Op_Setconfig *config) +{ + if (csrve_init > 0) server_reinit(); + else return 0; + if (!cserve) return 0; + if (!server_send(cserve, 0, OP_SETCONFIG, sizeof(Op_Setconfig), (unsigned char *)config)) return 0; + return 1; +} + +EAPI Eina_Bool +evas_cserve_raw_stats_get(Op_Getstats_Reply *stats) +{ + Op_Getstats_Reply *rep; + int opcode; + int size; + if (csrve_init > 0) server_reinit(); + else return 0; + if (!cserve) return 0; + if (!server_send(cserve, 0, OP_GETSTATS, 0, NULL)) return 0; + rep = (Op_Getstats_Reply *)server_read(cserve, 0, &opcode, &size); + if ((rep) && (opcode == OP_GETSTATS) && (size == sizeof(Op_Getstats_Reply))) + { + memcpy(stats, rep, sizeof(Op_Getstats_Reply)); + free(rep); + return 1; + } + if (rep) free(rep); + return 0; +} + +EAPI Op_Getinfo_Reply * +evas_cserve_raw_info_get(void) +{ + Op_Getinfo_Reply *rep; + int opcode; + int size; + if (csrve_init > 0) server_reinit(); + else return NULL; + if (!cserve) return NULL; + if (!server_send(cserve, 0, OP_GETINFO, 0, NULL)) return NULL; + rep = (Op_Getinfo_Reply *)server_read(cserve, 0, &opcode, &size); + if ((rep) && (opcode == OP_GETINFO) && + (size >= (int)sizeof(Op_Getinfo_Reply))) + { + return rep; + } + if (rep) free(rep); + return NULL; +} + +#endif diff --git a/libraries/evas/src/lib/cserve/evas_cs_main.c b/libraries/evas/src/lib/cserve/evas_cs_main.c new file mode 100644 index 0000000..e8282aa --- /dev/null +++ b/libraries/evas/src/lib/cserve/evas_cs_main.c @@ -0,0 +1,9 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "evas_cs.h" + +#ifdef EVAS_CSERVE + +#endif diff --git a/libraries/evas/src/lib/cserve/evas_cs_mem.c b/libraries/evas/src/lib/cserve/evas_cs_mem.c new file mode 100644 index 0000000..15edf93 --- /dev/null +++ b/libraries/evas/src/lib/cserve/evas_cs_mem.c @@ -0,0 +1,168 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "evas_cs.h" + +#ifdef EVAS_CSERVE + +EAPI Mem * +evas_cserve_mem_new(int size, const char *name) +{ + Mem *m; + static int id = 0; + char buf[PATH_MAX]; + + m = calloc(1, sizeof(Mem)); + if (!m) return NULL; + if (name) + snprintf(buf, sizeof(buf), "/evas-shm-%x.%s", getuid(), name); + else + { + id++; + snprintf(buf, sizeof(buf), "/evas-shm-%x.%x.%x", getuid(), getpid(), id); + } + m->id = id; + m->offset = 0; + m->name = strdup(buf); + if (!m->name) + { + free(m); + return NULL; + } + m->size = size; + m->fd = shm_open(m->name, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); + if (m->fd < 0) + { + free(m->name); + free(m); + return NULL; + } + if (ftruncate(m->fd, m->size) < 0) + { + shm_unlink(m->name); + close(m->fd); + free(m->name); + free(m); + return NULL; + } + + eina_mmap_safety_enabled_set(EINA_TRUE); + + m->data = mmap(NULL, m->size, PROT_READ | PROT_WRITE, MAP_SHARED, m->fd, 0); + if (m->data == MAP_FAILED) + { + shm_unlink(m->name); + close(m->fd); + free(m->name); + free(m); + return NULL; + } + m->ref = 1; + m->write = 1; + return m; +} + +EAPI void +evas_cserve_mem_free(Mem *m) +{ + shm_unlink(m->name); + munmap(m->data, m->size); + close(m->fd); + free(m->name); + free(m); +} + +EAPI Mem * +evas_cserve_mem_open(int pid, int id, const char *name, int size, int do_write) +{ + Mem *m; + char buf[PATH_MAX]; + + m = calloc(1, sizeof(Mem)); + if (!m) return NULL; + if (name) + snprintf(buf, sizeof(buf), "/evas-shm-%x.%s", getuid(), name); + else + snprintf(buf, sizeof(buf), "/evas-shm-%x.%x.%x", getuid(), pid, id); + m->name = strdup(buf); + if (!m->name) + { + free(m); + return NULL; + } + m->size = size; + if (do_write) + m->fd = shm_open(m->name, O_RDWR, S_IRUSR | S_IWUSR); + else + m->fd = shm_open(m->name, O_RDONLY, S_IRUSR); + if (m->fd < 0) + { + free(m->name); + free(m); + return NULL; + } + m->write = do_write; + + eina_mmap_safety_enabled_set(EINA_TRUE); + + if (do_write) + m->data = mmap(NULL, m->size, PROT_READ | PROT_WRITE, MAP_SHARED, m->fd, 0); + else + m->data = mmap(NULL, m->size, PROT_READ, MAP_SHARED, m->fd, 0); + if (m->data == MAP_FAILED) + { + close(m->fd); + free(m->name); + free(m); + return NULL; + } + m->ref = 1; + return m; +} + +EAPI void +evas_cserve_mem_close(Mem *m) +{ + munmap(m->data, m->size); + close(m->fd); + free(m->name); + free(m); +} + +EAPI Eina_Bool +evas_cserve_mem_resize(Mem *m, int size) +{ + if (m->size == size) return 1; + if (m->write) + { + if (ftruncate(m->fd, size) < 0) return 0; + munmap(m->data, m->size); + eina_mmap_safety_enabled_set(EINA_TRUE); + m->data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, m->fd, 0); + } + else + { + munmap(m->data, m->size); + eina_mmap_safety_enabled_set(EINA_TRUE); + m->data = mmap(NULL, size, PROT_READ, MAP_SHARED, m->fd, 0); + } + if (m->data == MAP_FAILED) + { + m->data = NULL; + return 0; + } + m->size = size; + return 1; +} + +EAPI void +evas_cserve_mem_del(int pid, int id) +{ + char buf[PATH_MAX]; + + snprintf(buf, sizeof(buf), "/evas-shm-%x.%x.%x", getuid(), pid, id); + shm_unlink(buf); +} + +#endif diff --git a/libraries/evas/src/lib/cserve/evas_cs_server.c b/libraries/evas/src/lib/cserve/evas_cs_server.c new file mode 100644 index 0000000..3b5d8b9 --- /dev/null +++ b/libraries/evas/src/lib/cserve/evas_cs_server.c @@ -0,0 +1,380 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "evas_cs.h" + +#ifdef EVAS_CSERVE + +EAPI Server * +evas_cserve_server_add(void) +{ + Server *s; + char buf[PATH_MAX]; + struct sockaddr_un socket_unix; + struct linger lin; + mode_t pmode; + int socket_unix_len; + + s = calloc(1, sizeof(Server)); + if (!s) return NULL; + s->ch[0].fd = -1; + snprintf(buf, sizeof(buf), "/tmp/.evas-cserve-%x", getuid()); + s->socket_path = strdup(buf); + if (!s->socket_path) + { + free(s); + return NULL; + } + pmode = umask(~(S_IRUSR | S_IWUSR)); + start: + s->ch[0].fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (s->ch[0].fd < 0) goto error; + if (fcntl(s->ch[0].fd, F_SETFL, O_NONBLOCK) < 0) goto error; + if (fcntl(s->ch[0].fd, F_SETFD, FD_CLOEXEC) < 0) goto error; + lin.l_onoff = 1; + lin.l_linger = 0; + if (setsockopt(s->ch[0].fd, SOL_SOCKET, SO_LINGER, &lin, sizeof(struct linger)) < 0) + goto error; + socket_unix.sun_family = AF_UNIX; + strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path)); + socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix); + if (bind(s->ch[0].fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) + { + if ((connect(s->ch[0].fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) && + (unlink(s->socket_path) >= 0)) + { + close(s->ch[0].fd); + goto start; + } + else + goto error; + } + if (listen(s->ch[0].fd, 4096) < 0) goto error; + umask(pmode); + return s; + error: + umask(pmode); + if (s->ch[0].fd >= 0) close(s->ch[0].fd); + free(s->socket_path); + free(s); + return NULL; +} + +EAPI void +evas_cserve_server_del(Server *s) +{ + Client *c; + + EINA_LIST_FREE(s->clients, c) + { + LKL(c->lock); + close(c->fd); + if (c->buf) free(c->buf); + if (c->inbuf) free(c->inbuf); + LKD(c->lock); + free(c); + } + close(s->ch[0].fd); + unlink(s->socket_path); + free(s->socket_path); + free(s); +} + +static void +server_accept(Server *s) +{ + Client *c; + int new_fd; + struct sockaddr_in incoming; + size_t size_in; + + size_in = sizeof(struct sockaddr_in); + new_fd = accept(s->ch[0].fd, (struct sockaddr *)&incoming, (socklen_t *)&size_in); + if (new_fd < 0) return; + fcntl(new_fd, F_SETFL, O_NONBLOCK); + fcntl(new_fd, F_SETFD, FD_CLOEXEC); + c = calloc(1, sizeof(Client)); + if (!c) + { + close(new_fd); + return; + } + c->server = s; + c->fd = new_fd; + LKI(c->lock); + s->clients = eina_list_append(s->clients, c); +} + +static void +client_flush(Client *c) +{ + int num; + + num = write(c->fd, c->buf, c->bufsize); + if (num < 0) + { + c->dead = 1; + return; + } + if (num < c->bufsize) + { + unsigned char *buf; + + buf = malloc(c->bufsize - num); + if (buf) + { + memcpy(buf, c->buf + num, c->bufsize - num); + free(c->buf); + c->bufsize = c->bufsize - num; + c->bufalloc = c->bufsize; + c->buf = buf; + } + } + else + { + free(c->buf); + c->buf = NULL; + c->bufsize = 0; + c->bufalloc = 0; + } +} + +static void +client_buf_add(Client *c, unsigned char *data, int size) +{ + int newsize; + unsigned char *buf; + + newsize = c->bufsize + size; + if (newsize > c->bufalloc) + { + c->bufalloc = newsize + 16384; + buf = realloc(c->buf, c->bufalloc); + if (buf) c->buf = buf; + else return; + } + memcpy(c->buf + c->bufsize, data, size); + c->bufsize += size; +} + +static void +client_write(Client *c, unsigned char *data, int size) +{ + int num; + + if (!c->buf) + { + num = write(c->fd, data, size); + if (num != size) + client_buf_add(c, data + num, size - num); + } + else + { + client_buf_add(c, data, size); + } +} + +EAPI void +evas_cserve_client_send(Client *c, int opcode, int size, unsigned char *data) +{ + unsigned char *data2; + int *ints; + + data2 = malloc(size + (sizeof(int) * 3)); + if (!data2) return; + ints = (int *)data2; + ints[0] = size; + ints[1] = opcode; +// LKL(c->lock); + c->req_to++; + ints[2] = c->req_to; + memcpy(data2 + (sizeof(int) * 3), data, size); + client_write(c, data2, size + (sizeof(int) * 3)); +// LKU(c->lock); + free(data2); +} + +static void +server_message_handle(Server *s, Client *c, int opcode, int size, unsigned char *data) +{ + if (s->func) s->func(s->data, s, c, opcode, size, data); +} + +EAPI void +evas_cserve_server_message_handler_set(Server *s, int (*func) (void *fdata, Server *s, Client *c, int opcode, int size, unsigned char *data), void *data) +{ + s->func = func; + s->data = data; +} + +static int +server_parse(Server *s, Client *c) +{ + int *ints; + unsigned char *data, *newbuf; + + if (c->inbufsize < (int)sizeof(int)) return 0; + ints = (int *)((c->inbuf)); + if ((ints[0] < 0) || (ints[0] > (1024 * 1024))) + return 0; + if (c->inbufsize < (ints[0] + ((int)sizeof(int) * 3))) + { + return 0; + } + data = c->inbuf + (sizeof(int) * 3); + if (ints[2] != (c->req_from + 1)) + { + ERR("EEK! sequence number mismatch from client with pid: %i." + "---- num %i is not 1 more than %i" + , + c->pid, ints[2], c->req_from); + return 0; + } + c->req_from++; + server_message_handle(s, c, ints[1], ints[0], data); + c->inbufalloc -= ints[0] + (sizeof(int) * 3); + if (c->inbufalloc == 0) + { + free(c->inbuf); + c->inbuf = NULL; + c->inbufsize = 0; + return 0; + } + newbuf = malloc(c->inbufalloc); + if (!newbuf) + { + c->inbufalloc += ints[0] + (sizeof(int) * 3); + /* fixme - bad situation */ + return 0; + } + memcpy(newbuf, c->inbuf + ints[0] + (sizeof(int) * 3), c->inbufalloc); + c->inbufsize -= ints[0] + (sizeof(int) * 3); + free(c->inbuf); + c->inbuf = newbuf; + return 1; +} + +static void +server_data(Server *s, Client *c, unsigned char *data, int size) +{ + if (!c->inbuf) + { + c->inbuf = malloc(size); + if (c->inbuf) + { + memcpy(c->inbuf, data, size); + c->inbufalloc = size; + c->inbufsize = size; + } + else + { + /* fixme - bad situation */ + return; + } + } + else + { + int size2; + + size2 = c->inbufsize + size; + if (size2 > c->inbufalloc) + { + unsigned char *newbuf; + + c->inbufalloc = size2; + newbuf = realloc(c->inbuf, c->inbufalloc); + if (newbuf) c->inbuf = newbuf; + else size2 = 0; + } + if (size2 > 0) + { + memcpy(c->inbuf + c->inbufsize, data, size); + c->inbufsize = size2; + } + else + { + /* fixme - bad situation */ + return; + } + } + while (server_parse(s, c)); +} + +EAPI void +evas_cserve_server_wait(Server *s, int timeout) +{ + fd_set rset, wset, xset; + int maxfd; + int ret; + struct timeval to; + Eina_List *l, *dead = NULL; + Client *c; + + maxfd = 0; + FD_ZERO(&rset); + FD_ZERO(&wset); + FD_ZERO(&xset); + FD_SET(s->ch[0].fd, &rset); + if (s->ch[0].fd > maxfd) maxfd = s->ch[0].fd; + EINA_LIST_FOREACH(s->clients, l, c) + { + FD_SET(c->fd, &rset); + if (c->buf) + FD_SET(c->fd, &wset); + if (c->fd > maxfd) maxfd = c->fd; + } + if (timeout > 0) + { + to.tv_sec = timeout / 1000000; + to.tv_usec = timeout % 1000000; + ret = select(maxfd + 1, &rset, &wset, &xset, &to); + } + else + ret = select(maxfd + 1, &rset, &wset, &xset, NULL); + if (ret < 1) return; + + EINA_LIST_FOREACH(s->clients, l, c) + { + if (c->dead) continue; + if (FD_ISSET(c->fd, &rset)) + { + unsigned char buf[16384]; + int num; + + errno = 0; + num = read(c->fd, buf, sizeof(buf)); + if (num <= 0) + { + c->dead = 1; + dead = eina_list_append(dead, c); + } + else if (num > 0) + { + server_data(s, c, buf, num); + } + } + else if (FD_ISSET(c->fd, &wset)) + { + client_flush(c); + if (c->dead) dead = eina_list_append(dead, c); + } + } + if (FD_ISSET(s->ch[0].fd, &rset)) + { + server_accept(s); + } + EINA_LIST_FREE(dead, c) + { + LKL(c->lock); + if (c->func) c->func(c->data, c); + s->clients = eina_list_remove(s->clients, c); + close(c->fd); + if (c->buf) free(c->buf); + if (c->inbuf) free(c->inbuf); + LKD(c->lock); + free(c); + } +} + +#endif -- cgit v1.1