Patience. It will get looked over.

On 7/26/06, Essien Ita Essien <[EMAIL PROTECTED]> wrote:

> Carsten Haitzler (The Rasterman) wrote:
>> On Mon, 24 Jul 2006 20:58:27 +0100 Essien Ita Essien
>> <[EMAIL PROTECTED]>
>> babbled:
>>
>> a quick scan of the patch - coding style. we can argue forever which is
>> best/right/wrong - but we won't. follow the existing style. i.e.
>>
>>
> my bad. I've fixed the indentation here (and learn a lot about vim and
> formating in the process!). Next puzzle? :P
anyone had the time to review this with a view toward inclusion? i'm
waiting to use this for entrance, so it not just an entrance internal
library.

Also, I looked thru ecore_exe and at first glance, it looks to me like
it would not be beneficial to graft this ontop of the existing
ecore_exe. also, it *feels* like a unique enuff subsystem on its own.

Cheers,

Essien
>
>> int
>> func(int x)
>> {
>>   int y, z;
>>     y = 0;
>>   z = y;
>>   if (x)     {
>>       blah(x);
>>       blah(y);
>>     }
>>
>>   if ((y == z) && (x))
>>     blah(z);
>>   return x;
>> }
>>
>> etc.
>>
>> see existing code. vim indent rules:
>>
>> /*
>>  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
>>  */
>>
>> :)
>>
>> the reason for this is - it is hard to follow code when it keeps
>> hanging style
>> as you read it - a consistent style maks it easier to follow -
>> regardless of
>> the style itself :) choice of style is fairly arbitrary though, but that
>> choice was made a long time ago.
>>
>>
>>> Hiya all,
>>>
>>> Doing some more cleanups in Entrance has led me to require a proper
>>> daemon library in the EFL. After acertaining that none such existed,
>>> I've ported a small library which i use for my personal coding to an
>>> Ecore subsystem Ecore_Daemon.
>>>
>>> The process I followed are outlined here:
>>> http://www.linuxprofilm.com/articles/linux-daemon-howto.html
>>>
>>> The patch contains the first incarnation of Ecore_Daemon after
>>> porting it from my code to an Ecore subsystem. The patch also
>>> contains an example in examples/daemon_example.c
>>>
>>> Its a small contained body of code, so here we go.
>>>
>>> The library is designed around ecore_daemon_daemonize(), which does
>>> all the work. You can set params before calling daemonize, but you
>>> can just use it as it is, as ecore_daemon_init() sets sane params
>>> for you already.
>>>
>>> Please review [*hint* rephorm, handyande *end-hint* :D] and advice.
>>> (Especially all them autoKUNGfoo. I tested it properly, but i'm not
>>> a 3rd dan autoKUNGfoo practitioner so I may invariably break stuff?)
>>>
>>> Once this is sorted out, I can get back to using it from within
>>> Entrance. Makes things a whole lot more nicer.
>>>
>>> Cheers,
>>> Essien
>>>
>>>
>>>
>>
>>
>>
>
>
>
> ------------------------------------------------------------------------
>
> diff -Naur ecore/configure.in ecore.daemon/configure.in
> --- ecore/configure.in        2006-07-25 23:21:52.000000000 +0100
> +++ ecore.daemon/configure.in 2006-07-26 00:34:47.000000000 +0100
> @@ -975,6 +975,52 @@
>  AC_SUBST(ecore_dbus_cflags)
>  AC_SUBST(ecore_dbus_libs)
>
> +AC_MSG_CHECKING(whether ecore_daemon module is to be built)
> +want_ecore_daemon="yes";
> +have_ecore_daemon="no";
> +ecore_daemon_cflags="";
> +ecore_daemon_libs="";
> +daemon_dir="";
> +daemon_includes="";
> +daemon_cflags="";
> +daemon_libs="";
> +
> +AC_ARG_ENABLE(ecore-daemon,
> +  [  --disable-ecore-daemon        disable the ecore_daemon module],
> +  [
> +    if test x"$enableval" = x"yes" ; then
> +      AC_MSG_RESULT(yes)
> +    else
> +      AC_MSG_RESULT(no)
> +      want_ecore_daemon="no"
> +    fi
> +  ], [
> +    AC_MSG_RESULT(yes)
> +  ]
> +)
> +
> +if test "x$want_ecore_daemon" = "xyes"; then
> +  AM_CONDITIONAL(BUILD_ECORE_DAEMON, true)
> +  AC_DEFINE(BUILD_ECORE_DAEMON, 1, [Build Ecore_Daemon Module])
> +  have_ecore_daemon="yes"
> +  #daemon_dir="/usr";
> +  #daemon_includes="";
> +  #daemon_cflags="-I"$daemon_dir"/include/daemon-1.0 -I"$daemon_dir"/lib/daemon-1.0/include"
> +  #daemon_libs="-L"$daemon_dir"/lib"
> +  #daemon_ldflags="-ldaemon-1";
> +  ecore_daemon_libs="-lecore_daemon";
> +else
> +  AM_CONDITIONAL(BUILD_ECORE_DAEMON, false)
> +fi
> +
> +AC_SUBST(daemon_cflags)
> +AC_SUBST(daemon_includes)
> +AC_SUBST(daemon_ldflags)
> +AC_SUBST(daemon_libs)
> +
> +AC_SUBST(ecore_daemon_cflags)
> +AC_SUBST(ecore_daemon_libs)
> +
>
>  AC_MSG_CHECKING(whether ecore_config module is to be built)
>
> @@ -1231,6 +1277,7 @@
>  src/lib/ecore_config/Makefile
>  src/lib/ecore_file/Makefile
>  src/lib/ecore_dbus/Makefile
> +src/lib/ecore_daemon/Makefile
>  src/lib/ecore_directfb/Makefile
>  examples/Makefile
>  ecore-config
> @@ -1261,6 +1308,7 @@
>  echo "  Ecore_Ipc....................: $have_ecore_ipc (OpenSSL: $use_openssl)"
>  echo "  Ecore_Config.................: $have_ecore_config"
>  echo "  Ecore_DBUS...................: $have_ecore_dbus"
> +echo "  Ecore_Daemon.................: $have_ecore_daemon"
>  #echo "  Ecore_File...................: $have_ecore_file (Inotify: $use_inotify) (FAM: $use_fam) (Poll: $use_poll)"
>  echo "  Ecore_File...................: $have_ecore_file (Inotify: $use_inotify) (Poll: $use_poll) (CURL: $use_curl)"
>  echo
> diff -Naur ecore/ecore-config.in ecore.daemon/ecore-config.in
> --- ecore/ecore-config.in     2006-06-25 20:28:26.000000000 +0100
> +++ ecore.daemon/ecore- config.in      2006-07-26 00:34:47.000000000 +0100
> @@ -6,7 +6,7 @@
>
>  usage() {
>        echo "Usage: ecore-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--libs] [--cflags]" 1>&2
> -      echo "                    [--libs-con] [--libs-config] [--libs-dbus] [--libs-evas] [--libs-fb]" 1>&2
> +      echo "                    [--libs-con] [--libs-config] [--libs-dbus] [--libs-daemon] [--libs-evas] [--libs-fb]" 1>&2
>        echo "                    [--libs-file] [--libs-ipc] [--libs-job] [--libs-txt] [--libs-x]" 1>&2
>  }
>
> @@ -49,7 +49,7 @@
>        ;;
>      --libs)
>        libdirs=- [EMAIL PROTECTED]@
> -      echo $libdirs -lecore @ecore_job_libs@ @ecore_x_libs@ @ecore_evas_libs@ @ecore_con_libs@ @ecore_ipc_libs@ @ecore_txt_libs@ @ecore_fb_libs@ @ecore_config_libs@ @ecore_file_libs@ @ecore_dbus_libs@ @EET_LIBS@ -lm
> +      echo $libdirs -lecore @ecore_job_libs@ @ecore_x_libs@ @ecore_evas_libs@ @ecore_con_libs@ @ecore_ipc_libs@ @ecore_txt_libs@ @ecore_fb_libs@ @ecore_config_libs@ @ecore_file_libs@ @ecore_dbus_libs@ @ecore_daemon_libs@ @EET_LIBS@ -lm
>        ;;
>      --libs-con)
>        [EMAIL PROTECTED]@
> @@ -63,7 +63,11 @@
>        [EMAIL PROTECTED]@
>        echo $libdirs -lecore @ecore_dbus_libs@ -lm
>        ;;
> -    --libs-evas)
> +    --libs-daemon)
> +      [EMAIL PROTECTED]@
> +      echo $libdirs -lecore @ecore_daemon_libs@ -lm
> +      ;;
> +     --libs-evas)
>        [EMAIL PROTECTED]@
>        echo $libdirs -lecore @ecore_evas_libs@ -lm
>        ;;
> diff -Naur ecore/ecore.spec.in ecore.daemon/ecore.spec.in
> --- ecore/ecore.spec.in       2006-06-02 00:13:28.000000000 +0100
> +++ ecore.daemon/ecore.spec.in        2006-07-26 00:34: 47.000000000 +0100
> @@ -27,7 +27,7 @@
>  Group: Development/Libraries
>  Requires: %{name} = %{version}
>  Requires: openssl-devel, evas-devel, eet-devel
> -Requires: ecore-con, ecore-config, ecore-dbus, ecore-evas, ecore-fb, ecore-file, ecore-ipc, ecore-job, ecore-txt, ecore-x
> +Requires: ecore-con, ecore-config, ecore-dbus, ecore-daemon, ecore-evas, ecore-fb, ecore-file, ecore-ipc, ecore-job, ecore-txt, ecore-x
>
>  %description devel
>  Ecore development files
> @@ -72,6 +72,14 @@
>  %description dbus
>  Ecore DBus Library
>
> +%package daemon
> +Summary: Ecore Daemon Library
> +Group: Development/Libraries
> +Requires: %{name} = %{version}
> +
> +%description daemon
> +Ecore Daemon Library
> +
>  %package evas
>  Summary: Ecore Evas Wrapper Library
>  Group: Development/Libraries
> @@ -189,6 +197,10 @@
>  %defattr(-, root, root)
>  %{_libdir}/libecore_dbus.so.*
>
> +%files daemon
> +%defattr(-, root, root)
> +%{_libdir}/libecore_daemon.so.*
> +
>  %files evas
>  %defattr(-, root, root)
>  %{_libdir}/libecore_evas.so.*
> diff -Naur ecore/examples/Makefile.am ecore.daemon/examples/Makefile.am
> --- ecore/examples/Makefile.am        2006-01-23 18:36:04.000000000 +0100
> +++ ecore.daemon/examples/Makefile.am 2006-07-26 00:34:47.000000000 +0100
> @@ -22,13 +22,18 @@
>  X_EXAMPLES = x_window_example
>  endif
>
> -noinst_PROGRAMS = $(EXAMPLES) $(CON_EXAMPLES) $(CONFIG_EXAMPLES) $(X_EXAMPLES)
> +if BUILD_ECORE_DAEMON
> +DAEMON_EXAMPLES = daemon_example
> +endif
> +
> +noinst_PROGRAMS = $(EXAMPLES) $(CON_EXAMPLES) $(CONFIG_EXAMPLES) $(X_EXAMPLES) $(DAEMON_EXAMPLES)
>
>  INCLUDES = \
>  -I$(top_srcdir)/src/lib/ecore \
>  -I$(top_srcdir)/src/lib/ecore_config \
>  -I$(top_srcdir)/src/lib/ecore_x \
>  -I$(top_srcdir)/src/lib/ecore_con \
> +-I$(top_srcdir)/src/lib/ecore_daemon
>  @EVAS_CFLAGS@
>
>  LDADD = \
> @@ -77,3 +82,8 @@
>                                  $(top_builddir)/src/lib/ecore_x/libecore_x.la
>
>  endif
> +
> +if BUILD_ECORE_DAEMON
> +daemon_example_SOURCES      = daemon_example.c
> +daemon_example_LDADD        = $(top_builddir)/src/lib/ecore_daemon/libecore_daemon.la
> +endif
> diff -Naur ecore/examples/daemon_example.c ecore.daemon/examples/daemon_example.c
> --- ecore/examples/daemon_example.c   1970-01-01 01:00:00.000000000 +0100
> +++ ecore.daemon/examples/daemon_example.c    2006-07-26 00:38: 14.000000000 +0100
> @@ -0,0 +1,30 @@
> +/*
> + * vim:ts=8:sw=3:sts=3:noexpandtab:cino=>5n-3f0^-2{2
> + */
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include < unistd.h>
> +#include <Ecore_Daemon.h>
> +
> +int main()
> +{
> +     if(!ecore_daemon_init())
> +     {
> +             fprintf(stderr, "Error init'ing ecore_daemon subsystem\n");
> +             exit(EXIT_FAILURE);
> +     }
> +
> +     printf("doing nothing in the foreground for 5 secs! You'll see this\n");
> +     sleep(5);
> +     printf("Going into daemon mode now!\n"
> +                     "From now on, you won't see anything.\n"
> +                     "Do a 'px aux | grep daemon_example' to see if its still there and running.\n"
> +                     "It will run for 20 secs\n"
> +                     "Watch that the pid has changed.\n");
> +     ecore_daemon_daemonize();
> +     printf("Now a daemon. You WONT see this\n");
> +     sleep(20);
> +
> +     ecore_daemon_shutdown();
> +     exit(EXIT_SUCCESS);
> +}
> diff -Naur ecore/src/lib/Makefile.am ecore.daemon/src/lib/Makefile.am
> --- ecore/src/lib/Makefile.am 2005-10-15 11:37:37.000000000 +0100
> +++ ecore.daemon/src/lib/Makefile.am  2006-07-26 00:34:47.000000000 +0100
> @@ -11,4 +11,5 @@
>  ecore_evas \
>  ecore_config \
>  ecore_file \
> -ecore_dbus
> +ecore_dbus \
> +ecore_daemon
> diff -Naur ecore/src/lib/ecore_daemon/Ecore_Daemon.h ecore.daemon/src/lib/ecore_daemon/Ecore_Daemon.h
> --- ecore/src/lib/ecore_daemon/Ecore_Daemon.h 1970-01-01 01:00:00.000000000 +0100
> +++ ecore.daemon/src/lib/ecore_daemon/Ecore_Daemon.h  2006-07-26 00:35:58.000000000 +0100
> @@ -0,0 +1,59 @@
> +/*
> + * vim:ts=8:sw=3:sts=3:noexpandtab:cino=>5n-3f0^-2{2
> + */
> +#ifndef _ECORE_DAEMON_H
> +#define _ECORE_DAEMON_H
> +#endif
> +
> +#ifdef EAPI
> +#undef EAPI
> +#endif
> +#ifdef WIN32
> +# ifdef BUILDING_DLL
> +#  define EAPI __declspec(dllexport)
> +# else
> +#  define EAPI __declspec(dllimport)
> +# endif
> +#else
> +# ifdef __GNUC__
> +#  if __GNUC__ >= 4
> +#   define EAPI __attribute__ ((visibility("default")))
> +#  else
> +#   define EAPI
> +#  endif
> +# else
> +#  define EAPI
> +# endif
> +#endif
> +
> +#define ECORE_DAEMON_MAJOR_PROTOCOL_VERSION 1
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +
> +
> +     EAPI int ecore_daemon_init();
> +     EAPI void ecore_daemon_shutdown();
> +
> +     EAPI pid_t ecore_daemon_daemonize();
> +
> +     EAPI int ecore_daemon_get_umask();
> +     EAPI void  ecore_daemon_set_umask(int);
> +
> +     EAPI char* ecore_daemon_get_work_dir();
> +     EAPI void ecore_daemon_set_work_dir(const char*);
> +
> +     EAPI char* ecore_daemon_get_stdin();
> +     EAPI void ecore_daemon_set_stdin(const char*);
> +
> +     EAPI char* ecore_daemon_get_stdout();
> +     EAPI void ecore_daemon_set_stdout(const char*);
> +
> +     EAPI char* ecore_daemon_get_stderr();
> +     EAPI void ecore_daemon_set_stderr(const char*);
> +
> +#ifdef __cplusplus
> +}
> +#endif
> diff -Naur ecore/src/lib/ecore_daemon/Makefile.am ecore.daemon/src/lib/ecore_daemon/Makefile.am
> --- ecore/src/lib/ecore_daemon/Makefile.am    1970-01-01 01:00:00.000000000 +0100
> +++ ecore.daemon/src/lib/ecore_daemon/Makefile.am     2006-07-26 00:35:58.000000000 +0100
> @@ -0,0 +1,32 @@
> +MAINTAINERCLEANFILES = Makefile.in
> +
> +INCLUDES = \
> +-I$(top_builddir)/src/lib/ecore \
> +-I$(top_builddir)/src/lib/ecore_daemon \
> +-I$(top_srcdir)/src/lib/ecore \
> +-I$(top_srcdir)/src/lib/ecore_daemon \
> [EMAIL PROTECTED]@
> +
> +libecore_daemon_la_LDFLAGS = -version-info 1:0:0 \
> +-L$(top_builddir)/src/lib/ecore/.libs
> +
> +if BUILD_ECORE_DAEMON
> +
> +lib_LTLIBRARIES = libecore_daemon.la
> +include_HEADERS = \
> +Ecore_Daemon.h
> +
> +libecore_daemon_la_SOURCES = \
> +ecore_daemon.c
> +
> +libecore_daemon_la_LIBADD = \
> +$(top_builddir)/src/lib/ecore/libecore.la \
> [EMAIL PROTECTED]@
> +
> +libecore_daemon_la_DEPENDENCIES = \
> +$(top_builddir)/src/lib/ecore/libecore.la
> +
> +endif
> +
> +EXTRA_DIST = \
> +ecore_daemon.c
> diff -Naur ecore/src/lib/ecore_daemon/ecore_daemon.c ecore.daemon/src/lib/ecore_daemon/ecore_daemon.c
> --- ecore/src/lib/ecore_daemon/ecore_daemon.c 1970-01-01 01:00: 00.000000000 +0100
> +++ ecore.daemon/src/lib/ecore_daemon/ecore_daemon.c  2006-07-26 00:36:33.000000000 +0100
> @@ -0,0 +1,203 @@
> +/*
> + * vim:ts=8:sw=3:sts=3:noexpandtab:cino=>5n-3f0^-2{2
> + */
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <string.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +
> +
> +struct __Ecore_Daemon
> +{
> +   int umask;
> +   char* work_dir;
> +   char* fstdin;
> +   char* fstdout;
> +   char* fstderr;
> +};
> +
> +typedef struct __Ecore_Daemon _Ecore_Daemon;
> +typedef struct __Ecore_Daemon *Ecore_Daemon;
> +
> +static Ecore_Daemon _ecore_daemon_new();
> +static void _ecore_daemon_free(Ecore_Daemon);
> +
> +static int _do_fork();
> +static void _close_fds();
> +static void _reopen_std_fds(const char*, const char*, const char*);
> +
> +static Ecore_Daemon _ecd;
> +
> +int
> +ecore_daemon_init()
> +{
> +   _ecd = _ecore_daemon_new();
> +   if(_ecd)
> +     return 1;
> +   else
> +     return 0;
> +}
> +
> +void
> +ecore_daemon_shutdown()
> +{
> +   _ecore_daemon_free(_ecd);
> +}
> +
> +pid_t
> +ecore_daemon_daemonize()
> +{
> +   if(!_ecd)
> +     return 0;
> +
> +   if(!_do_fork())
> +     return 0;
> +
> +   if(!setsid())
> +     return 0;
> +
> +   if(!_do_fork())
> +     return 0;
> +
> +   /*TODO how do we handle errno and perror so apps
> +    * can still access similar? How does the rest of Ecore
> +    * handle such?
> +    * */
> +   if(chdir(_ecd->work_dir) == -1)
> +     return 0;
> +
> +   umask(_ecd->umask);
> +
> +   _close_fds();
> +   _reopen_std_fds(_ecd->fstdin, _ecd->fstdout, _ecd->fstderr);
> +
> +   return getpid();
> +}
> +
> +int
> +ecore_daemon_get_umask()
> +{
> +   return _ecd->umask;
> +}
> +
> +void
> +ecore_daemon_set_umask(int mask)
> +{
> +   _ecd->umask = mask;
> +}
> +
> +char*
> +ecore_daemon_get_work_dir()
> +{
> +   return _ecd->work_dir;
> +}
> +
> +void
> +ecore_daemon_set_work_dir(const char *work_dir)
> +{
> +   free(_ecd->work_dir);
> +   _ecd->work_dir = strdup(work_dir);
> +}
> +
> +char*
> +ecore_daemon_get_stdin()
> +{
> +   return _ecd->fstdin;
> +}
> +
> +void
> +ecore_daemon_set_stdin(const char *f)
> +{
> +   free(_ecd->fstdin);
> +   _ecd->fstdin = strdup(f);
> +}
> +
> +char*
> +ecore_daemon_get_stdout()
> +{
> +   return _ecd->fstdout;
> +}
> +
> +void
> +ecore_daemon_set_stdout(const char *f)
> +{
> +   free(_ecd->fstdout);
> +   _ecd->fstdout = strdup(f);
> +}
> +
> +char*
> +ecore_daemon_get_stderr()
> +{
> +   return _ecd->fstderr;
> +}
> +
> +void
> +ecore_daemon_set_stderr(const char *f)
> +{
> +   free(_ecd->fstderr);
> +   _ecd->fstderr = strdup(f);
> +}
> +
> +
> +/*privates*/
> +
> +static Ecore_Daemon
> +_ecore_daemon_new()
> +{
> +   Ecore_Daemon d = calloc(1, sizeof(_Ecore_Daemon));
> +
> +   if(!d)
> +     return NULL;
> +
> +   d->umask = 0;
> +   d->work_dir = strdup("/");
> +   d->fstdin = strdup("/dev/null");
> +   d->fstdout = strdup("/dev/null");
> +   d->fstderr = strdup("/dev/null");
> +
> +   return d;
> +}
> +
> +static void
> +_ecore_daemon_free(Ecore_Daemon _ecd)
> +{
> +   free(_ecd->work_dir);
> +
> +   free(_ecd->fstdin);
> +   free(_ecd->fstdout);
> +   free(_ecd->fstderr);
> +
> +   free(_ecd);
> +}
> +
> +static int
> +_do_fork()
> +{
> +   int pid = fork();
> +   if(pid < 0)
> +     return 0;
> +   else if(pid > 0) /*this is parent*/
> +     _exit(EXIT_SUCCESS);
> +
> +   return 1;
> +}
> +
> +
> +static void
> +_close_fds()
> +{
> +   close(0);
> +   close(1);
> +   close(2);
> +}
> +
> +static void
> +_reopen_std_fds(const char* fin, const char *fout, const char *ferr)
> +{
> +   /*TODO: Error checks and proper status messages*/
> +   freopen(fin, "r", stdin);
> +   freopen(fout, "w", stdout);
> +   freopen(ferr, "w", stderr);
> +}
>
>
> ------------------------------------------------------------------------
>
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys -- and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> ------------------------------------------------------------------------
>
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel



--
Stephen Houston
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to