Here is the Evil library, which provides, for the Windows platform (XP or Mobile), a set of Unix functions used in the EFL and which do not exist on that evil platform
SVN revision: 33862devs/devilhorns/wayland_egl
parent
621d8f73af
commit
a5d43225dc
25 changed files with 3503 additions and 0 deletions
@ -0,0 +1,3 @@ |
||||
Main Authors: |
||||
Vincent Torri <vtorri at univ-evry dot fr> |
||||
ashikase |
@ -0,0 +1,3 @@ |
||||
2008-02-27 Vincent Torri <doursse at users dot sf dot net> |
||||
|
||||
* initial release |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,229 @@ |
||||
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software |
||||
Foundation, Inc. |
||||
|
||||
This file is free documentation; the Free Software Foundation gives |
||||
unlimited permission to copy, distribute and modify it. |
||||
|
||||
Basic Installation |
||||
================== |
||||
|
||||
These are generic installation instructions. |
||||
|
||||
The `configure' shell script attempts to guess correct values for |
||||
various system-dependent variables used during compilation. It uses |
||||
those values to create a `Makefile' in each directory of the package. |
||||
It may also create one or more `.h' files containing system-dependent |
||||
definitions. Finally, it creates a shell script `config.status' that |
||||
you can run in the future to recreate the current configuration, and a |
||||
file `config.log' containing compiler output (useful mainly for |
||||
debugging `configure'). |
||||
|
||||
It can also use an optional file (typically called `config.cache' |
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves |
||||
the results of its tests to speed up reconfiguring. (Caching is |
||||
disabled by default to prevent problems with accidental use of stale |
||||
cache files.) |
||||
|
||||
If you need to do unusual things to compile the package, please try |
||||
to figure out how `configure' could check whether to do them, and mail |
||||
diffs or instructions to the address given in the `README' so they can |
||||
be considered for the next release. If you are using the cache, and at |
||||
some point `config.cache' contains results you don't want to keep, you |
||||
may remove or edit it. |
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create |
||||
`configure' by a program called `autoconf'. You only need |
||||
`configure.ac' if you want to change it or regenerate `configure' using |
||||
a newer version of `autoconf'. |
||||
|
||||
The simplest way to compile this package is: |
||||
|
||||
1. `cd' to the directory containing the package's source code and type |
||||
`./configure' to configure the package for your system. If you're |
||||
using `csh' on an old version of System V, you might need to type |
||||
`sh ./configure' instead to prevent `csh' from trying to execute |
||||
`configure' itself. |
||||
|
||||
Running `configure' takes awhile. While running, it prints some |
||||
messages telling which features it is checking for. |
||||
|
||||
2. Type `make' to compile the package. |
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with |
||||
the package. |
||||
|
||||
4. Type `make install' to install the programs and any data files and |
||||
documentation. |
||||
|
||||
5. You can remove the program binaries and object files from the |
||||
source code directory by typing `make clean'. To also remove the |
||||
files that `configure' created (so you can compile the package for |
||||
a different kind of computer), type `make distclean'. There is |
||||
also a `make maintainer-clean' target, but that is intended mainly |
||||
for the package's developers. If you use it, you may have to get |
||||
all sorts of other programs in order to regenerate files that came |
||||
with the distribution. |
||||
|
||||
Compilers and Options |
||||
===================== |
||||
|
||||
Some systems require unusual options for compilation or linking that |
||||
the `configure' script does not know about. Run `./configure --help' |
||||
for details on some of the pertinent environment variables. |
||||
|
||||
You can give `configure' initial values for configuration parameters |
||||
by setting variables in the command line or in the environment. Here |
||||
is an example: |
||||
|
||||
./configure CC=c89 CFLAGS=-O2 LIBS=-lposix |
||||
|
||||
*Note Defining Variables::, for more details. |
||||
|
||||
Compiling For Multiple Architectures |
||||
==================================== |
||||
|
||||
You can compile the package for more than one kind of computer at the |
||||
same time, by placing the object files for each architecture in their |
||||
own directory. To do this, you must use a version of `make' that |
||||
supports the `VPATH' variable, such as GNU `make'. `cd' to the |
||||
directory where you want the object files and executables to go and run |
||||
the `configure' script. `configure' automatically checks for the |
||||
source code in the directory that `configure' is in and in `..'. |
||||
|
||||
If you have to use a `make' that does not support the `VPATH' |
||||
variable, you have to compile the package for one architecture at a |
||||
time in the source code directory. After you have installed the |
||||
package for one architecture, use `make distclean' before reconfiguring |
||||
for another architecture. |
||||
|
||||
Installation Names |
||||
================== |
||||
|
||||
By default, `make install' will install the package's files in |
||||
`/usr/local/bin', `/usr/local/man', etc. You can specify an |
||||
installation prefix other than `/usr/local' by giving `configure' the |
||||
option `--prefix=PATH'. |
||||
|
||||
You can specify separate installation prefixes for |
||||
architecture-specific files and architecture-independent files. If you |
||||
give `configure' the option `--exec-prefix=PATH', the package will use |
||||
PATH as the prefix for installing programs and libraries. |
||||
Documentation and other data files will still use the regular prefix. |
||||
|
||||
In addition, if you use an unusual directory layout you can give |
||||
options like `--bindir=PATH' to specify different values for particular |
||||
kinds of files. Run `configure --help' for a list of the directories |
||||
you can set and what kinds of files go in them. |
||||
|
||||
If the package supports it, you can cause programs to be installed |
||||
with an extra prefix or suffix on their names by giving `configure' the |
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. |
||||
|
||||
Optional Features |
||||
================= |
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to |
||||
`configure', where FEATURE indicates an optional part of the package. |
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE |
||||
is something like `gnu-as' or `x' (for the X Window System). The |
||||
`README' should mention any `--enable-' and `--with-' options that the |
||||
package recognizes. |
||||
|
||||
For packages that use the X Window System, `configure' can usually |
||||
find the X include and library files automatically, but if it doesn't, |
||||
you can use the `configure' options `--x-includes=DIR' and |
||||
`--x-libraries=DIR' to specify their locations. |
||||
|
||||
Specifying the System Type |
||||
========================== |
||||
|
||||
There may be some features `configure' cannot figure out |
||||
automatically, but needs to determine by the type of machine the package |
||||
will run on. Usually, assuming the package is built to be run on the |
||||
_same_ architectures, `configure' can figure that out, but if it prints |
||||
a message saying it cannot guess the machine type, give it the |
||||
`--build=TYPE' option. TYPE can either be a short name for the system |
||||
type, such as `sun4', or a canonical name which has the form: |
||||
|
||||
CPU-COMPANY-SYSTEM |
||||
|
||||
where SYSTEM can have one of these forms: |
||||
|
||||
OS KERNEL-OS |
||||
|
||||
See the file `config.sub' for the possible values of each field. If |
||||
`config.sub' isn't included in this package, then this package doesn't |
||||
need to know the machine type. |
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should |
||||
use the `--target=TYPE' option to select the type of system they will |
||||
produce code for. |
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a |
||||
platform different from the build platform, you should specify the |
||||
"host" platform (i.e., that on which the generated programs will |
||||
eventually be run) with `--host=TYPE'. |
||||
|
||||
Sharing Defaults |
||||
================ |
||||
|
||||
If you want to set default values for `configure' scripts to share, |
||||
you can create a site shell script called `config.site' that gives |
||||
default values for variables like `CC', `cache_file', and `prefix'. |
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then |
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the |
||||
`CONFIG_SITE' environment variable to the location of the site script. |
||||
A warning: not all `configure' scripts look for a site script. |
||||
|
||||
Defining Variables |
||||
================== |
||||
|
||||
Variables not defined in a site shell script can be set in the |
||||
environment passed to `configure'. However, some packages may run |
||||
configure again during the build, and the customized values of these |
||||
variables may be lost. In order to avoid this problem, you should set |
||||
them in the `configure' command line, using `VAR=value'. For example: |
||||
|
||||
./configure CC=/usr/local2/bin/gcc |
||||
|
||||
will cause the specified gcc to be used as the C compiler (unless it is |
||||
overridden in the site shell script). |
||||
|
||||
`configure' Invocation |
||||
====================== |
||||
|
||||
`configure' recognizes the following options to control how it |
||||
operates. |
||||
|
||||
`--help' |
||||
`-h' |
||||
Print a summary of the options to `configure', and exit. |
||||
|
||||
`--version' |
||||
`-V' |
||||
Print the version of Autoconf used to generate the `configure' |
||||
script, and exit. |
||||
|
||||
`--cache-file=FILE' |
||||
Enable the cache: use and save the results of the tests in FILE, |
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to |
||||
disable caching. |
||||
|
||||
`--config-cache' |
||||
`-C' |
||||
Alias for `--cache-file=config.cache'. |
||||
|
||||
`--quiet' |
||||
`--silent' |
||||
`-q' |
||||
Do not print messages saying which checks are being made. To |
||||
suppress all normal output, redirect it to `/dev/null' (any error |
||||
messages will still be shown). |
||||
|
||||
`--srcdir=DIR' |
||||
Look for the package's source code in directory DIR. Usually |
||||
`configure' can determine that directory automatically. |
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run |
||||
`configure --help' for more details. |
||||
|
@ -0,0 +1,28 @@ |
||||
|
||||
MAINTAINERCLEANFILES = \
|
||||
aclocal.m4 \ |
||||
compile \ |
||||
config.guess \ |
||||
config.h.in \ |
||||
config.sub \ |
||||
configure \ |
||||
evil.pc \ |
||||
depcomp \ |
||||
install-sh \ |
||||
ltmain.sh \ |
||||
Makefile.in \ |
||||
missing \ |
||||
mkinstalldirs \ |
||||
$(PACKAGE_TARNAME)-$(PACKAGE_VERSION)* |
||||
|
||||
maintainer-clean-local: |
||||
rm -rf doc/
|
||||
|
||||
SUBDIRS = src
|
||||
|
||||
EXTRA_DIST = \
|
||||
Doxyfile \ |
||||
evil.pc.in |
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = evil.pc
|
@ -0,0 +1,11 @@ |
||||
|
||||
The Evil library tried to port some convenient Unix functions |
||||
to the Windows (XP, maybe below, or Mobile) platform. They |
||||
are planned to be used in the Enlightenment Fundations Libaries. |
||||
|
||||
To get the description of the API, behavior, etc.. run |
||||
doxygen.exe in the top level directory, then open in your |
||||
favorite browser named Firefox the file index.html located in |
||||
the subdirectory doc/html/. |
||||
|
||||
Enjoy ! |
@ -0,0 +1,7 @@ |
||||
#!/bin/sh |
||||
|
||||
autoreconf -f -i |
||||
|
||||
if [ -z "$NOCONFIGURE" ]; then |
||||
./configure "$@" |
||||
fi |
@ -0,0 +1,96 @@ |
||||
|
||||
AC_INIT(evil, 0.0.1, enlightenment-devel@lists.sourceforge.net) |
||||
AC_PREREQ(2.52) |
||||
AC_CONFIG_SRCDIR([configure.ac]) |
||||
AC_CONFIG_HEADERS([config.h]) |
||||
AC_CANONICAL_HOST |
||||
|
||||
dnl If the host is not windows, we exit, |
||||
dnl otherwise, we set the correct flags |
||||
dnl for each platform. |
||||
mingw_libs="" |
||||
cegcc_libs="" |
||||
case "$host_os" in |
||||
mingw|mingw32) |
||||
mingw_libs="-lole32 -luuid -lws2_32" |
||||
;; |
||||
cegcc) |
||||
cegcc_cflags="-mwin32" |
||||
;; |
||||
*) |
||||
AC_MSG_ERROR([OS must be Windows. Exiting...]) |
||||
;; |
||||
esac |
||||
win32_cflags="${cegcc_cflags}" |
||||
win32_libs="${mingw_libs}" |
||||
AC_SUBST(win32_cflags) |
||||
AC_SUBST(win32_libs) |
||||
|
||||
AM_INIT_AUTOMAKE(1.6 dist-bzip2) |
||||
|
||||
AC_LIBTOOL_WIN32_DLL |
||||
define([AC_LIBTOOL_LANG_CXX_CONFIG], [:])dnl |
||||
define([AC_LIBTOOL_LANG_F77_CONFIG], [:])dnl |
||||
AC_PROG_LIBTOOL |
||||
|
||||
VMAJ=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $1);}'` |
||||
VMIN=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $2);}'` |
||||
VMIC=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $3);}'` |
||||
SNAP=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $4);}'` |
||||
version_info=`expr $VMAJ + $VMIN`":$VMIC:$VMIN" |
||||
AC_SUBST(version_info) |
||||
|
||||
AC_LANG(C) |
||||
AC_PROG_CPP |
||||
AC_PROG_CC |
||||
AC_C_CONST |
||||
|
||||
AC_MSG_CHECKING([for __attribute__]) |
||||
AC_CACHE_VAL(have___attribute__, |
||||
[ |
||||
AC_TRY_COMPILE([#include <stdlib.h>], |
||||
[int func(int x); int foo(int x __attribute__ ((unused))) { exit(1); }], |
||||
[have___attribute__="yes"], |
||||
[have___attribute__="no"]) |
||||
] |
||||
) |
||||
|
||||
if test "x${have___attribute__}" = "xyes" ; then |
||||
AC_DEFINE(HAVE___ATTRIBUTE__, 1, [Define to 1 if your compiler has __attribute__]) |
||||
fi |
||||
AC_MSG_RESULT(${have___attribute__}) |
||||
|
||||
|
||||
AC_CONFIG_FILES([ |
||||
Makefile |
||||
evil.pc |
||||
src/Makefile |
||||
src/bin/Makefile |
||||
src/lib/Makefile |
||||
src/lib/dlfcn/Makefile |
||||
src/lib/mman/Makefile |
||||
]) |
||||
|
||||
AC_OUTPUT |
||||
|
||||
|
||||
##################################################################### |
||||
## Info |
||||
|
||||
echo |
||||
echo |
||||
echo |
||||
echo "------------------------------------------------------------------------" |
||||
echo "$PACKAGE_NAME $PACKAGE_VERSION $PACKAGE_TARNAME" |
||||
echo "------------------------------------------------------------------------" |
||||
echo |
||||
echo "Configuration Options Summary:" |
||||
echo |
||||
echo " OS...................: ${host_os}" |
||||
echo |
||||
echo " Compilation..........: make" |
||||
echo |
||||
echo " Installation.........: make install" |
||||
echo |
||||
echo " prefix.............: $prefix" |
||||
echo |
@ -0,0 +1,11 @@ |
||||
prefix=@prefix@ |
||||
exec_prefix=@exec_prefix@ |
||||
libdir=@libdir@ |
||||
includedir=@includedir@ |
||||
|
||||
Name: evil |
||||
Description: Library that ports on Windows some specific Unix functions. |
||||
Version: @VERSION@ |
||||
Libs: -L${libdir} -levil -lmman -ldl |
||||
Libs.private: |
||||
Cflags: -I${includedir} |
@ -0,0 +1,4 @@ |
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
|
||||
SUBDIRS = lib bin
|
@ -0,0 +1,24 @@ |
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir) \ |
||||
-I$(top_srcdir)/bin \ |
||||
-I$(top_srcdir)/src/lib \ |
||||
-I$(top_srcdir)/src/lib/dlfcn |
||||
|
||||
AM_CFLAGS = @win32_cflags@
|
||||
|
||||
bin_PROGRAMS = test_dlfcn test_pipe test_evil
|
||||
|
||||
test_dlfcn_SOURCES = test_dlfcn.c
|
||||
test_dlfcn_LDADD = $(top_builddir)/src/lib/libevil.la $(top_builddir)/src/lib/dlfcn/libdl.la
|
||||
test_dlfcn_DEPENDENCIES = $(top_builddir)/src/lib/libevil.la $(top_builddir)/src/lib/dlfcn/libdl.la
|
||||
|
||||
test_pipe_SOURCES = test_pipe.c
|
||||
test_pipe_LDADD = $(top_builddir)/src/lib/libevil.la
|
||||
test_pipe_DEPENDENCIES = $(top_builddir)/src/lib/libevil.la
|
||||
|
||||
test_evil_SOURCES = test_evil.c
|
||||
test_evil_LDADD = $(top_builddir)/src/lib/libevil.la
|
||||
test_evil_DEPENDENCIES = $(top_builddir)/src/lib/libevil.la
|
@ -0,0 +1,54 @@ |
||||
#include <stdlib.h> |
||||
#include <stdio.h> |
||||
#include <sys/time.h> |
||||
|
||||
#include <dlfcn.h> |
||||
|
||||
#include <windows.h> |
||||
|
||||
|
||||
|
||||
int |
||||
main() |
||||
{ |
||||
struct timeval tv; |
||||
void *module; |
||||
double t1 = 0.0; |
||||
double t2 = 0.0; |
||||
|
||||
int (*time)(struct timeval *tv, void *tz); |
||||
|
||||
module = dlopen("d:\\msys\\1.0\\local\\bin\\libevil-0.dll", 0); |
||||
if (!module) |
||||
{ |
||||
printf ("%s\n", dlerror()); |
||||
return EXIT_FAILURE; |
||||
} |
||||
|
||||
time = dlsym(module, "gettimeofday"); |
||||
if (!time) |
||||
{ |
||||
printf ("%s\n", dlerror()); |
||||
if (dlclose(module)) |
||||
printf ("%s\n", dlerror()); |
||||
return EXIT_FAILURE; |
||||
} |
||||
|
||||
if (time(&tv, NULL) == 0) |
||||
t1 = tv.tv_sec + tv.tv_usec / 1000000.0; |
||||
|
||||
Sleep(3000); |
||||
|
||||
if (time(&tv, NULL) == 0) |
||||
t2 = tv.tv_sec + tv.tv_usec / 1000000.0; |
||||
|
||||
printf ("3 seconds ? %f\n", t2 - t1); |
||||
|
||||
if (dlclose(module)) |
||||
{ |
||||
printf ("%s\n", dlerror()); |
||||
return EXIT_FAILURE; |
||||
} |
||||
|
||||
return EXIT_SUCCESS; |
||||
} |
@ -0,0 +1,27 @@ |
||||
#include <stdlib.h> |
||||
#include <stdio.h> |
||||
#include <sys/time.h> |
||||
|
||||
#include <windows.h> |
||||
|
||||
|
||||
|
||||
int |
||||
main() |
||||
{ |
||||
struct timeval tv; |
||||
double t1 = 0.0; |
||||
double t2 = 0.0; |
||||
|
||||
if (gettimeofday(&tv, NULL) == 0) |
||||
t1 = tv.tv_sec + tv.tv_usec / 1000000.0; |
||||
|
||||
Sleep(3000); |
||||
|
||||
if (gettimeofday(&tv, NULL) == 0) |
||||
t2 = tv.tv_sec + tv.tv_usec / 1000000.0; |
||||
|
||||
printf ("3 seconds ? %f\n", t2 - t1); |
||||
|
||||
return EXIT_SUCCESS; |
||||
} |
@ -0,0 +1,101 @@ |
||||
#include <stdio.h> |
||||
|
||||
# define WIN32_LEAN_AND_MEAN |
||||
# include <winsock2.h> |
||||
# undef WIN32_LEAN_AND_MEAN |
||||
|
||||
#include "Evil.h" |
||||
|
||||
#define FDREAD 0 |
||||
#define FDWRITE 1 |
||||
|
||||
typedef struct |
||||
{ |
||||
int val; |
||||
int fd_write; |
||||
} data; |
||||
|
||||
|
||||
DWORD WINAPI |
||||
thread (void *param) |
||||
{ |
||||
data *d; |
||||
void *buf[1]; |
||||
|
||||
Sleep (2 * 1000); |
||||
d = (data *)param; |
||||
buf[0] = d; |
||||
printf ("writing...\n"); |
||||
send(d->fd_write, (char *)buf, sizeof(buf), 0); |
||||
printf ("end of writing...\n"); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
int |
||||
main (int argc, char *argv[]) |
||||
{ |
||||
int sockets[2]; |
||||
WSADATA version_data; |
||||
int ret; |
||||
fd_set rfds; |
||||
struct timeval t; |
||||
data *d; |
||||
DWORD thread_id; |
||||
HANDLE h; |
||||
|
||||
FD_ZERO(&rfds); |
||||
|
||||
t.tv_sec = 5; |
||||
t.tv_usec = 0; |
||||
|
||||
WSAStartup(MAKEWORD(2, 2), &version_data); |
||||
|
||||
if (pipe(sockets) < 0) |
||||
{ |
||||
printf ("error\n"); |
||||
return -1; |
||||
} |
||||
FD_SET(sockets[FDREAD], &rfds); |
||||
d = (data *)malloc(sizeof (data)); |
||||
d->val = 14; |
||||
d->fd_write = sockets[FDWRITE]; |
||||
printf (" pointeur 0 : %p\n", d); |
||||
|
||||
h = CreateThread (NULL, 0, thread, d, 0, &thread_id); |
||||
|
||||
printf (" * select : %d %d\n", sockets[0], sockets[1]); |
||||
ret = select(sockets[FDREAD] + 1, &rfds, NULL, NULL, &t); |
||||
printf (" * select : ret %d\n", ret); |
||||
|
||||
if (ret < 0) return -1; |
||||
|
||||
if (ret == 0) { |
||||
printf ("temps expire\n"); |
||||
} |
||||
|
||||
if (ret > 0) |
||||
{ |
||||
data *d; |
||||
int len; |
||||
int j = 0; |
||||
void *buf[1]; |
||||
|
||||
printf ("bon \n"); |
||||
while ((len = recv(sockets[FDREAD], (char *)buf, sizeof(buf), 0)) > 0) |
||||
{ |
||||
printf ("len : %d\n", len); |
||||
if (len == sizeof(buf)) |
||||
{ |
||||
d = buf[0]; |
||||
printf (" pointeur 1 : %p\n", d); |
||||
j = d->val; |
||||
printf ("reussite : %d\n", j); |
||||
} |
||||
} |
||||
} |
||||
|
||||
CloseHandle (h); |
||||
|
||||
return 0; |
||||
} |
@ -0,0 +1,256 @@ |
||||
#ifndef __E_WIN32_H__ |
||||
#define __E_WIN32_H__ |
||||
|
||||
#ifdef EAPI |
||||
# undef EAPI |
||||
#endif /* EAPI */ |
||||
|
||||
#ifdef _WIN32 |
||||
# ifdef DLL_EXPORT |
||||
# define EAPI __declspec(dllexport) |
||||
# else |
||||
# define EAPI __declspec(dllimport) |
||||
# endif |
||||
#endif /* _WIN32 */ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
|
||||
/**
|
||||
* @mainpage Evil |
||||
* |
||||
* @section intro_sec Introduction |
||||
* |
||||
* The Evil library is an evil library that ports some evil Unix |
||||
* functions to the Windows (XP or Mobile) platform. The evilness is |
||||
* so huge that the most of the functions are not POSIX or BSD |
||||
* compliant. |
||||
* |
||||
* These functions are intended to be used in the Enlightenment |
||||
* Fundations Libraries only and can be compiled only on Windows. |
||||
* |
||||
* @section evil_sec Evil API Documentation |
||||
* |
||||
* Take a look at the evil documentation of the @ref Dlfcn. |
||||
* |
||||
* Take a look at the demoniac documentation of the @ref Mman. |
||||
* |
||||
* Take a look at the satanic documentation of the @ref Evil. |
||||
*/ |
||||
|
||||
/**
|
||||
* @file evil.h |
||||
* @brief The file that provides miscellaneous functions ported from Unix. |
||||
* @defgroup Evil Miscellaneous functions ported from Unix. |
||||
* |
||||
* This header provides miscallenaous functions that exist on Unix |
||||
* but not on Windows platform. They try to follow the conformance of |
||||
* the Unix versions. |
||||
*/ |
||||
|
||||
#include <stdlib.h> |
||||
#include <sys/time.h> |
||||
|
||||
#ifndef __CEGCC__ |
||||
|
||||
# include <sys/types.h> |
||||
|
||||
/**
|
||||
* @def FD_CLOEXEC |
||||
* Specifies that the file descriptor should be closed when an exec() |
||||
* function is invoked. |
||||
*/ |
||||
# define FD_CLOEXEC 1 |
||||
|
||||
/**
|
||||
* @def F_SETFD |
||||
* Specifies that fcntl() should set the file descriptor flags |
||||
* associated with the filedes argument. |
||||
*/ |
||||
|
||||
/**
|
||||
* @def F_SETLK |
||||
* Specifies that fcntl() should set or clear a file segment lock |
||||
* according to the lock description pointed to by the third argument. |
||||
*/ |
||||
|
||||
/**
|
||||
* @def F_SETLKW |
||||
* Equivalent to F_SETLK except that if a shared or exclusive lock |
||||
* is blocked by other locks, the thread shall wait until the request |
||||
* can be satisfied. |
||||
*/ |
||||
|
||||
# define F_SETFD 2 |
||||
# define F_SETLK 6 |
||||
# define F_SETLKW 7 |
||||
|
||||
# ifndef F_RDLCK |
||||
# define F_RDLCK 0 |
||||
# define F_WRLCK 1 |
||||
# define F_UNLCK 2 |
||||
# endif /* ! F_RDLCK */ |
||||
|
||||
/**
|
||||
* @struct flock |
||||
* @brief A structure that control the lock of a file descriptor. |
||||
*/ |
||||
struct flock |
||||
{ |
||||
short int l_type; /**< lock type: read, write, ... */ |
||||
short int l_whence; /**< type of l_start */ |
||||
off_t l_start; /**< starting offset */ |
||||
off_t l_len; /**< 0 means end of the file */ |
||||
pid_t l_pid; /**< lock owner */ |
||||
}; |
||||
|
||||
/**
|
||||
* @brief Provide control over file descriptors. |
||||
* |
||||
* @param fd The file descriptor. |
||||
* @param cmd The type of control. |
||||
* @return 0 on success, -1 otherwise. |
||||
* |
||||
* Performs one of various miscellaneous operations on @p fd. |
||||
* The operation in question is determined by @p cmd: |
||||
* |
||||
* - F_SETFD: Set the close-on-exec flag to the value specified |
||||
* by the argument after command (only the least significant |
||||
* bit is used). |
||||
* - F_SETLK and F_SETLKW: used to manage discretionary file locks. |
||||
* The third argument must be a pointer to a struct flock (that |
||||
* may be overwritten by this call). |
||||
* |
||||
* This function returns 0 on success, -1 otherwise. |
||||
* |
||||
* Conformity: None. |
||||
* |
||||
* Supported OS: Windows Vista, Windows XP or Windows 2000 |
||||
* Professional. |
||||
* |
||||
* @ingroup Evil |
||||
*/ |
||||
EAPI int fcntl(int fd, int cmd, ...); |
||||
|
||||
/**
|
||||
* @brief Make temporay unique file name. |
||||
* |
||||
* @param template Template of the file to create. |
||||
* @return A file descriptor on success, -1 otherwise. |
||||
* |
||||
* Take the given file name @p template and overwrite a portion of it |
||||
* to create a file name. This file is guaranted not to exist at the |
||||
* time invocation and is suitable for use by the function. |
||||
* |
||||
* The @p template parameter can be any file name with some number of |
||||
* 'Xs' appended to it, for example @em baseXXXXXX, where @em base is |
||||
* the part of the new file that you supply and eacg 'X' is a placeholder |
||||
* for a character supplied by mkstemp(). The trailing 'Xs' are replaced |
||||
* with a five-digit value; this value is a unique number. Each successful |
||||
* call to mkstemp() modifes @p template. |
||||
* |
||||
* When mkstemp() succeeds, it creates and opens the template file for |
||||
* reading and writing. |
||||
* |
||||
* On success, the function returns the file descriptor of the |
||||
* temporary file. Otherwise, it returns -1 and errno is set to the |
||||
* following values: |
||||
* - EACCESS: Given path is a directory, or file is read-only, but an |
||||
* open-for-writing operation was attempted. |
||||
* - EEXISTS: File name already exists. |
||||
* - EMFILE: No more file descriptors available. |
||||
* - ENOENT: File or path not found. |
||||
* |
||||
* Conformity: Should follow BSD conformity. |
||||
* |
||||
* Supported OS: Windows 98, Windows Me, Windows NT, Windows 2000, |
||||
* Windows XP. |
||||
* |
||||
* @ingroup Evil |
||||
*/ |
||||
EAPI int mkstemp(char *template); |
||||
|
||||
/**
|
||||
* @brief Create a shell link. |
||||
* |
||||
* @param oldpath The file name to be linked. |
||||
* @param newpath The file name to create. |
||||
* @return 0 on success, -1 otherwise. |
||||
* |
||||
* Create a shell link @p newpath to @p oldpath (@p newpath is the |
||||
* name of the file created, @p oldpath is the string used in |
||||
* creating the shell link). |
||||
* |
||||
* On success, this function returns 0. Otherwise, it returns -1 and |
||||
* errno may be set to the following value: |
||||
* - ENOMEM: Not enough memory. |
||||
* |
||||
* On Windows, the symbolic links do not exist. Nevertheless |
||||
* shell links can be created. This function is named like the Unix |
||||
* function for portability reasons. |
||||
* |
||||
* Conformity: None. |
||||
* |
||||
* Supported OS: Windows 95, Windows 98, Windows Me, Windows NT, Windows 2000, |
||||
* Windows XP. |
||||
* |
||||
* @ingroup Evil |
||||
*/ |
||||
EAPI int symlink(const char *oldpath, const char *newpath); |
||||
|
||||
/**
|
||||
* @brief Read value of a shell link. |
||||
* |
||||
* @param path The file name to be linked. |
||||
* @param buf The file name to create. |
||||
* @param bufsiz The size of the buffer. |
||||
* @return 0 on success, -1 otherwise. |
||||
* |
||||
* Place the content of the shell link @p path in the buffer |
||||
* @p buf, which has size @p bufzsiz. |
||||
* |
||||
* On success, this function returns the count of characters |
||||
* placed in the buffer. Otherwise, it returns -1 and errno may |
||||
* be set to the following value: |
||||
* - ENOMEM: Not enough memory. |
||||
* |
||||
* On Windows, the symbolic links do not exist. Nevertheless |
||||
* shell links can be managed. This function is named like the Unix |
||||
* function for portability reasons. |
||||
* |
||||
* Conformity: None. |
||||
* |
||||
* Supported OS: Windows 95, Windows 98, Windows Me, Windows NT, Windows 2000, |
||||
* Windows XP. |
||||
* |
||||
* @ingroup Evil |
||||
*/ |
||||
EAPI ssize_t readlink(const char *path, char *buf, size_t bufsiz); |
||||
|
||||
EAPI int pipe(int *fds); |
||||
|
||||
#endif /* ! __CEGCC__ */ |
||||
|
||||
#if defined(__MSDOS__) || defined(__EMX__) || \ |
||||
(defined(_WIN32) && !defined(_UWIN) && !defined(__CYGWIN__) && !defined(__CEGCC__)) |
||||
# if defined(_MSC_VER) || defined(__MINGW32__) |
||||
# define open(path,flag,mode) EAPI _open((path),(flag),(mode)) |
||||
# define close(fd) EAPI _close(fd) |
||||
# define read(fd,buffer,count) EAPI _read((fd),(buffer),(count)) |
||||
# define write(fd,buffer,count) EAPI _write((fd),(buffer),(count)) |
||||
# define mkdir(p,m) EAPI _mkdir(p) |
||||
# endif |
||||
#endif |
||||
|
||||
#define realpath(file_name, resolved_name) EAPI _fullpath((resolved_name), (file_name), PATH_MAX) |
||||
|
||||
EAPI char *evil_tmpdir_get(void); |
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __E_WIN32_H__ */ |
@ -0,0 +1,14 @@ |
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
|
||||
SUBDIRS = dlfcn mman
|
||||
|
||||
lib_LTLIBRARIES = libevil.la
|
||||
|
||||
include_HEADERS = Evil.h
|
||||
libevil_la_SOURCES = evil.c
|
||||
|
||||
libevil_la_CFLAGS = @win32_cflags@
|
||||
libevil_la_LIBADD = @win32_libs@
|
||||
libevil_la_LDFLAGS = -no-undefined -version-info @version_info@
|
||||
|
@ -0,0 +1,9 @@ |
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
|
||||
lib_LTLIBRARIES = libdl.la
|
||||
|
||||
include_HEADERS = dlfcn.h
|
||||
libdl_la_SOURCES = dlfcn.c
|
||||
|
||||
libdl_la_LDFLAGS = -no-undefined -version-info @version_info@
|
@ -0,0 +1,212 @@ |
||||
#include <stdlib.h> |
||||
|
||||
#define WIN32_LEAN_AND_MEAN |
||||
#include <windows.h> |
||||
#undef WIN32_LEAN_AND_MEAN |
||||
|
||||
#ifdef HAVE_CONFIG_H |
||||
# include "config.h" |
||||
#endif /* HAVE_CONFIG_H */ |
||||
|
||||
#if HAVE___ATTRIBUTE__ |
||||
# define __UNUSED__ __attribute__((unused)) |
||||
#else |
||||
# define __UNUSED__ |
||||
#endif /* HAVE___ATTRIBUTE__ */ |
||||
|
||||
|
||||
static char *dl_err = NULL; |
||||
static int dl_err_viewed = 0; |
||||
|
||||
#ifdef __CEGCC__ |
||||
|
||||
static wchar_t * |
||||
string_to_wchar(const char *text) |
||||
{ |
||||
wchar_t *wtext; |
||||
int wsize; |
||||
|
||||
wsize = MultiByteToWideChar(CP_ACP, 0, text, strlen(text) + 1, NULL, 0); |
||||
if (wsize == 0 || wsize > ULONG_MAX/sizeof(wchar_t)) |
||||
return NULL; |
||||
|
||||
wtext = malloc(wsize * sizeof(wchar_t)); |
||||
if (wtext) |
||||
if (!MultiByteToWideChar(CP_ACP, 0, text, strlen(text) + 1, wtext, wsize)) |
||||
return NULL; |
||||
|
||||
return wtext; |
||||
} |
||||
|
||||
static char * |
||||
wchar_to_string(const wchar_t *text) |
||||
{ |
||||
char * atext; |
||||
int size; |
||||
int asize; |
||||
|
||||
size = wcslen(text) + 1; |
||||
|
||||
asize = WideCharToMultiByte(CP_ACP, 0, text, size, NULL, 0, NULL, NULL); |
||||
if (asize == 0) |
||||
return NULL; |
||||
|
||||
atext = (char*)malloc((asize + 1) * sizeof(char)); |
||||
|
||||
if (atext) |
||||
if (!WideCharToMultiByte(CP_ACP, 0, text, size, atext, asize, NULL, NULL)) |
||||
return NULL; |
||||
atext[asize] = '\0'; |
||||
|
||||
return atext; |
||||
} |
||||
|
||||
|
||||
#endif /* __CEGCC__ */ |
||||
|
||||
static void |
||||
get_last_error(char *desc) |
||||
{ |
||||
TCHAR *str; |
||||
char *str2; |
||||
int l1; |
||||
int l2; |
||||
|
||||
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | |
||||
FORMAT_MESSAGE_FROM_SYSTEM | |
||||
FORMAT_MESSAGE_IGNORE_INSERTS, |
||||
NULL, GetLastError(), |
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), |
||||
(LPTSTR)&str, 0, NULL); |
||||
|
||||
#ifdef __CEGCC__ |
||||
str2 = wchar_to_string(str); |
||||
#else |
||||
str2 = str; |
||||
#endif /* __CEGCC__ */ |
||||
|
||||
l1 = strlen(desc); |
||||
l2 = strlen(str2); |
||||
|
||||
if (dl_err) |
||||
free(dl_err); |
||||
|
||||
dl_err = (char *)malloc(sizeof(char) * (l1 + l2 + 1)); |
||||
if (!dl_err) |
||||
dl_err = strdup("not enough resource"); |
||||
else |
||||
{ |
||||
memcpy(dl_err, desc, l1); |
||||
memcpy(dl_err + l1, str2, l2); |
||||
dl_err[l1 + l2] = '\0'; |
||||
} |
||||
LocalFree(str2); |
||||
dl_err_viewed = 0; |
||||
} |
||||
|
||||
void * |
||||
dlopen(const char* path, int mode __UNUSED__) |
||||
{ |
||||
HMODULE module = NULL; |
||||
|
||||
if (!path) |
||||
{ |
||||
module = GetModuleHandle(NULL); |
||||
if (!module) |
||||
get_last_error("GetModuleHandle returned: "); |
||||
} |
||||
else |
||||
{ |
||||
char *new_path; |
||||
int l; |
||||
int i; |
||||
|
||||
/* according to MSDN, we must change the slash to backslash */ |
||||
l = strlen(path); |
||||
new_path = (char *)malloc(sizeof(char) * (l + 1)); |
||||
if (!new_path) |
||||
{ |
||||
if (dl_err) |
||||
free(dl_err); |
||||
dl_err = strdup("not enough resource"); |
||||
dl_err_viewed = 0; |
||||
return NULL; |
||||
} |
||||
for (i = 0; i <= l; i++) |
||||
{ |
||||
if (path[i] == '/') |
||||
new_path[i] = '\\'; |
||||
else |
||||
new_path[i] = path[i]; |
||||
} |
||||
#ifdef __CEGCC__ |
||||
{ |
||||
wchar_t *wpath; |
||||
|
||||
wpath = string_to_wchar(new_path); |
||||
module = LoadLibraryEx(wpath, NULL, |
||||
LOAD_WITH_ALTERED_SEARCH_PATH); |
||||
free(wpath); |
||||
} |
||||
#else |
||||
module = LoadLibraryEx(new_path, NULL, |
||||
LOAD_WITH_ALTERED_SEARCH_PATH); |
||||
#endif /* __CEGCC__ */ |
||||
if (!module) |
||||
get_last_error("LoadLibraryEx returned: "); |
||||
|
||||
free(new_path); |
||||
} |
||||
|
||||
return module; |
||||
} |
||||
|
||||
int |
||||
dlclose(void* handle) |
||||
{ |
||||
if (FreeLibrary(handle)) |
||||
return 0; |
||||
else |
||||
{ |
||||
get_last_error("FreeLibrary returned: "); |
||||
return -1; |
||||
} |
||||
} |
||||
|
||||
void * |
||||
dlsym(void *handle, const char *symbol) |
||||
{ |
||||
FARPROC fp; |
||||
|
||||
#ifdef __CEGCC__ |
||||
{ |
||||
wchar_t *wsymbol; |
||||
|
||||
wsymbol = string_to_wchar(symbol); |
||||
fp = GetProcAddress(handle, wsymbol); |
||||
free(wsymbol); |
||||
} |
||||
#else |
||||
fp = GetProcAddress(handle, symbol); |
||||
#endif /* __CEGCC__ */ |
||||
if (!fp) |
||||
get_last_error("GetProcAddress returned: "); |
||||
|
||||
return fp; |
||||
} |
||||
|
||||
char * |
||||
dlerror (void) |
||||
{ |
||||
if (!dl_err_viewed) |
||||
{ |
||||
dl_err_viewed = 1; |
||||
return dl_err; |
||||
} |
||||
else |
||||
{ |
||||
if (dl_err) |
||||
free(dl_err); |
||||
return NULL; |
||||
} |
||||
} |
@ -0,0 +1,174 @@ |
||||
#ifndef __E_WIN32_DLFCN_H__ |
||||
#define __E_WIN32_DLFCN_H__ |
||||
|
||||
#ifdef EAPI |
||||
# undef EAPI |
||||
#endif /* EAPI */ |
||||
|
||||
#ifdef _WIN32 |
||||
# ifdef DLL_EXPORT |
||||
# define EAPI __declspec(dllexport) |
||||
# else |
||||
# define EAPI __declspec(dllimport) |
||||
# endif |
||||
#endif /* _WIN32 */ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
|
||||
# define RTLD_LAZY 1 /* lazy function call binding */ |
||||
# define RTLD_NOW 2 /* immediate function call binding */ |
||||
# define RTLD_GLOBAL 4 /* symbols in this dlopen'ed obj are visible |
||||
to other dlopen'ed objs */ |
||||
|
||||
/**
|
||||
* @file dlfcn.h |
||||
* @brief The file that provides functions to manage dynamic-link libraries |
||||
* @defgroup Dlfcn Functions that manage dynamic-link libraries. |
||||
* |
||||
* This header provides functions to load and unload dynamic-link |
||||
* libaries, to get the address of a symbol, and to get diagnostic |
||||
* information. |
||||
* |
||||
*/ |
||||
|
||||
/**
|
||||
* Map a specified executable module (either a .dll or .exe file) |
||||
* into the address space of the user process. |
||||
* |
||||
* @param path Name of the module. |
||||
* @param mode Unused. |
||||
* @return A pointer that represent the module, or @c NULL on failure. |
||||
* |
||||
* Map a specified executable module (either a .dll or .exe file) |
||||
* into the address space of the user process. If @p path is @c NULL, |
||||
* then the module corresponding to the current process is returned. |
||||
* Otherwise the module specified by @p path is loaded if it exists. |
||||
* If not, @c NULL is returned. The directory separators can be forward |
||||
* slash, or backward ones. Mapping a module can map other modules. |
||||
* @p mode is unused. |
||||
* |
||||
* If an error occurred, an error string can be retrived with dlerror(). |
||||
* |