forked from enlightenment/efl
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: 33862
This commit is contained in:
parent
621d8f73af
commit
a5d43225dc
|
@ -0,0 +1,3 @@
|
||||||
|
Main Authors:
|
||||||
|
Vincent Torri <vtorri at univ-evry dot fr>
|
||||||
|
ashikase
|
|
@ -0,0 +1,340 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
|
@ -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().
|
||||||
|
*
|
||||||
|
* According to the OS, the search order of the module can change,
|
||||||
|
* according to the value of SafeDllSearchMode.
|
||||||
|
*
|
||||||
|
* - For Windows Vista, Windows Server 2003, and Windows XP SP2:
|
||||||
|
* SafeDLLSearchMode is enabled by default.
|
||||||
|
* - For Windows XP and Windows 2000 SP4: SafeDLLSearchMode is disabled
|
||||||
|
* by default.
|
||||||
|
*
|
||||||
|
* If SafeDllSearchMode is enabled
|
||||||
|
* - The directory from which the application loaded.
|
||||||
|
* - The system directory. Use the GetSystemDirectory() function
|
||||||
|
* to get the path of this directory.
|
||||||
|
* - The 16-bit system directory. There is no function that obtains
|
||||||
|
* the path of this directory, but it is searched.
|
||||||
|
* - The Windows directory. Use the GetWindowsDirectory() function
|
||||||
|
* to get the path of this directory.
|
||||||
|
* - The current directory.
|
||||||
|
* - The directories that are listed in the PATH environment variable.
|
||||||
|
* Note that this does not include the per-application path specified
|
||||||
|
* by the App Paths registry key.
|
||||||
|
*
|
||||||
|
* If SafeDllSearchMode is disabled
|
||||||
|
* - The directory from which the application loaded.
|
||||||
|
* - The current directory.
|
||||||
|
* - The system directory. Use the GetSystemDirectory() function
|
||||||
|
* to get the path of this directory.
|
||||||
|
* - The 16-bit system directory. There is no function that obtains
|
||||||
|
* the path of this directory, but it is searched.
|
||||||
|
* - The Windows directory. Use the GetWindowsDirectory() function
|
||||||
|
* to get the path of this directory.
|
||||||
|
* - The directories that are listed in the PATH environment variable.
|
||||||
|
* Note that this does not include the per-application path specified
|
||||||
|
* by the App Paths registry key.
|
||||||
|
*
|
||||||
|
* Conformity: None.
|
||||||
|
*
|
||||||
|
* Supported OS: Windows Vista, Windows XP or Windows 2000
|
||||||
|
* Professional.
|
||||||
|
*
|
||||||
|
* @ingroup Dlfcn
|
||||||
|
*/
|
||||||
|
EAPI void *dlopen(const char* path, int mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close a dynamic-link library.
|
||||||
|
*
|
||||||
|
* @param handle Handle that references a dynamic-link library.
|
||||||
|
* @return O on sucess, -1 otherwise.
|
||||||
|
*
|
||||||
|
* Release a reference to the dynamic-link library referenced
|
||||||
|
* by @p handle. If the reference count drops to 0, the handle is
|
||||||
|
* removed from the address space and is rendered invalid. @p handle
|
||||||
|
* is the value returned by a previous call to dlopen().
|
||||||
|
*
|
||||||
|
* If no error occurred, the returned value is 0, otherwise the
|
||||||
|
* returned value is -1 and an error string can be retrived with
|
||||||
|
* dlerror().
|
||||||
|
*
|
||||||
|
* Conformity: None.
|
||||||
|
*
|
||||||
|
* Supported OS: Windows Vista, Windows XP or Windows 2000
|
||||||
|
* Professional.
|
||||||
|
*
|
||||||
|
* @ingroup Dlfcn
|
||||||
|
*/
|
||||||
|
EAPI int dlclose(void* handle);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the address of a symbol.
|
||||||
|
*
|
||||||
|
* @param handle Handle that references a dynamic-link library.
|
||||||
|
* @param symbol @c NULL-terminated string.
|
||||||
|
* @return O on sucess, NULL otherwise.
|
||||||
|
*
|
||||||
|
* Return the address of the code or data location specified by the
|
||||||
|
* string @p symbol. @p handle references a library that contains
|
||||||
|
* the function or variable @p symbol.
|
||||||
|
*
|
||||||
|
* If no error occurred, the returned value is the code or data
|
||||||
|
* location, otherwise the returned value is NULL and an error
|
||||||
|
* string can be retrived with dlerror().
|
||||||
|
*
|
||||||
|
* Conformity: None.
|
||||||
|
*
|
||||||
|
* Supported OS: Windows Vista, Windows XP or Windows 2000
|
||||||
|
* Professional.
|
||||||
|
*
|
||||||
|
* @ingroup Dlfcn
|
||||||
|
*/
|
||||||
|
EAPI void *dlsym(void* handle, const char* symbol);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get diagnostic information
|
||||||
|
*
|
||||||
|
* @return A @c NULL-terminated string if an error occured, @c NULL
|
||||||
|
* otherwise.
|
||||||
|
*
|
||||||
|
* Return a @c NULL-terminated character string describing the last
|
||||||
|
* error that occurred on this thread during a call to dlopen(),
|
||||||
|
* dlsym(), or dlclose(). If no such error has occurred, dlerror()
|
||||||
|
* returns a null pointer. At each call to dlerror(), the error
|
||||||
|
* indication is reset. Thus in the case of two calls to dlerror(),
|
||||||
|
* where the second call follows the first immediately, the second
|
||||||
|
* call will always return a null pointer.
|
||||||
|
*
|
||||||
|
* Conformity: None.
|
||||||
|
*
|
||||||
|
* Supported OS: Windows Vista, Windows XP or Windows 2000
|
||||||
|
* Professional.
|
||||||
|
*
|
||||||
|
* @ingroup Dlfcn
|
||||||
|
*/
|
||||||
|
EAPI char *dlerror (void);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __E_WIN32_DLFCN_H__ */
|
|
@ -0,0 +1,347 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifndef __CEGCC__
|
||||||
|
# include <errno.h>
|
||||||
|
# define WIN32_LEAN_AND_MEAN
|
||||||
|
# include <winsock2.h>
|
||||||
|
# undef WIN32_LEAN_AND_MEAN
|
||||||
|
# include <sys/locking.h>
|
||||||
|
# include <io.h>
|
||||||
|
# include <share.h>
|
||||||
|
# include <shlobj.h>
|
||||||
|
# include <objidl.h>
|
||||||
|
#endif /* ! __CEGCC__ */
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/timeb.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
|
#if HAVE___ATTRIBUTE__
|
||||||
|
# define __UNUSED__ __attribute__((unused))
|
||||||
|
#else
|
||||||
|
# define __UNUSED__
|
||||||
|
#endif /* HAVE___ATTRIBUTE__ */
|
||||||
|
|
||||||
|
#include "Evil.h"
|
||||||
|
|
||||||
|
#ifndef __CEGCC__
|
||||||
|
|
||||||
|
int fcntl(int fd, int cmd, ...)
|
||||||
|
{
|
||||||
|
va_list va;
|
||||||
|
HANDLE h;
|
||||||
|
int res = -1;
|
||||||
|
|
||||||
|
va_start (va, cmd);
|
||||||
|
|
||||||
|
h = (HANDLE)_get_osfhandle(fd);
|
||||||
|
if (h == INVALID_HANDLE_VALUE)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (cmd == F_SETFD)
|
||||||
|
{
|
||||||
|
long flag;
|
||||||
|
|
||||||
|
flag = va_arg(va, long);
|
||||||
|
if (flag == FD_CLOEXEC)
|
||||||
|
{
|
||||||
|
if (SetHandleInformation(h, HANDLE_FLAG_INHERIT, 0))
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((cmd == F_SETLK) || (cmd == F_SETLKW))
|
||||||
|
{
|
||||||
|
struct flock fl;
|
||||||
|
off_t length = 0;
|
||||||
|
long pos;
|
||||||
|
|
||||||
|
fl = va_arg(va, struct flock);
|
||||||
|
|
||||||
|
if (fl.l_len == 0)
|
||||||
|
{
|
||||||
|
length = _lseek(fd, 0L, SEEK_END);
|
||||||
|
if (length != -1L)
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
fl.l_len = length - fl.l_start - 1;
|
||||||
|
|
||||||
|
pos = _lseek(fd, fl.l_start, fl.l_whence);
|
||||||
|
if (pos != -1L)
|
||||||
|
res = 0;
|
||||||
|
|
||||||
|
if ((fl.l_type == F_RDLCK) || (fl.l_type == F_WRLCK))
|
||||||
|
{
|
||||||
|
if (cmd == F_SETLK)
|
||||||
|
res = _locking(fd, _LK_NBLCK, fl.l_len); /* if cannot be locked, we return immediatly */
|
||||||
|
else /* F_SETLKW */
|
||||||
|
res = _locking(fd, _LK_LOCK, fl.l_len); /* otherwise, we try several times */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fl.l_type == F_UNLCK)
|
||||||
|
res = _locking(fd, _LK_UNLCK, fl.l_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
va_end(va);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
mkstemp(char *template)
|
||||||
|
{
|
||||||
|
char *filename;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
filename = _mktemp(template);
|
||||||
|
if (!filename)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
fd = _sopen(filename, _O_RDWR | _O_BINARY | _O_CREAT | _O_EXCL, _SH_DENYNO, _S_IREAD | _S_IWRITE);
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* REMARK: Windows has no symbolic link. */
|
||||||
|
/* Nevertheless, it can create and read .lnk files */
|
||||||
|
int
|
||||||
|
symlink(const char *oldpath, const char *newpath)
|
||||||
|
{
|
||||||
|
wchar_t new_path[MB_CUR_MAX];
|
||||||
|
IShellLink *pISL;
|
||||||
|
IShellLink **shell_link;
|
||||||
|
IPersistFile *pIPF;
|
||||||
|
IPersistFile **persit_file;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
res = CoInitialize(NULL);
|
||||||
|
if (FAILED(res))
|
||||||
|
{
|
||||||
|
if (res == E_OUTOFMEMORY)
|
||||||
|
errno = ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hack to cleanly remove a warning */
|
||||||
|
shell_link = &pISL;
|
||||||
|
if (FAILED(CoCreateInstance(&CLSID_ShellLink,
|
||||||
|
NULL,
|
||||||
|
CLSCTX_INPROC_SERVER,
|
||||||
|
&IID_IShellLink,
|
||||||
|
(void **)shell_link)))
|
||||||
|
goto no_instance;
|
||||||
|
|
||||||
|
if (FAILED(pISL->lpVtbl->SetPath(pISL, oldpath)))
|
||||||
|
goto no_setpath;
|
||||||
|
|
||||||
|
/* Hack to cleanly remove a warning */
|
||||||
|
persit_file = &pIPF;
|
||||||
|
if (FAILED(pISL->lpVtbl->QueryInterface(pISL, &IID_IPersistFile, (void **)persit_file)))
|
||||||
|
goto no_queryinterface;
|
||||||
|
|
||||||
|
mbstowcs(new_path, newpath, MB_CUR_MAX);
|
||||||
|
if (FAILED(pIPF->lpVtbl->Save(pIPF, new_path, FALSE)))
|
||||||
|
goto no_save;
|
||||||
|
|
||||||
|
pIPF->lpVtbl->Release(pIPF);
|
||||||
|
pISL->lpVtbl->Release(pISL);
|
||||||
|
CoUninitialize();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
no_save:
|
||||||
|
pIPF->lpVtbl->Release(pIPF);
|
||||||
|
no_queryinterface:
|
||||||
|
no_setpath:
|
||||||
|
pISL->lpVtbl->Release(pISL);
|
||||||
|
no_instance:
|
||||||
|
CoUninitialize();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
readlink(const char *path, char *buf, size_t bufsiz)
|
||||||
|
{
|
||||||
|
wchar_t old_path[MB_CUR_MAX];
|
||||||
|
char new_path[MB_CUR_MAX];
|
||||||
|
IShellLink *pISL;
|
||||||
|
IShellLink **shell_link;
|
||||||
|
IPersistFile *pIPF;
|
||||||
|
IPersistFile **persit_file;
|
||||||
|
unsigned int length;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
res = CoInitialize(NULL);
|
||||||
|
if (FAILED(res))
|
||||||
|
{
|
||||||
|
if (res == E_OUTOFMEMORY)
|
||||||
|
errno = ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hack to cleanly remove a warning */
|
||||||
|
persit_file = &pIPF;
|
||||||
|
if (FAILED(CoCreateInstance(&CLSID_ShellLink,
|
||||||
|
NULL,
|
||||||
|
CLSCTX_INPROC_SERVER,
|
||||||
|
&IID_IPersistFile,
|
||||||
|
(void **)persit_file)))
|
||||||
|
goto no_instance;
|
||||||
|
|
||||||
|
mbstowcs(old_path, path, MB_CUR_MAX);
|
||||||
|
if (FAILED(pIPF->lpVtbl->Load(pIPF, old_path, STGM_READWRITE)))
|
||||||
|
goto no_load;
|
||||||
|
|
||||||
|
shell_link = &pISL;
|
||||||
|
if (FAILED(pIPF->lpVtbl->QueryInterface(pIPF, &IID_IShellLink, (void **)shell_link)))
|
||||||
|
goto no_queryinterface;
|
||||||
|
|
||||||
|
if (FAILED(pISL->lpVtbl->GetPath(pISL, new_path, MB_CUR_MAX, NULL, 0)))
|
||||||
|
goto no_getpath;
|
||||||
|
|
||||||
|
length = strlen(new_path);
|
||||||
|
if (length > bufsiz)
|
||||||
|
length = bufsiz;
|
||||||
|
|
||||||
|
memcpy(buf, new_path, length);
|
||||||
|
|
||||||
|
pISL->lpVtbl->Release(pISL);
|
||||||
|
pIPF->lpVtbl->Release(pIPF);
|
||||||
|
CoUninitialize();
|
||||||
|
|
||||||
|
return length;
|
||||||
|
|
||||||
|
no_getpath:
|
||||||
|
pISL->lpVtbl->Release(pISL);
|
||||||
|
no_queryinterface:
|
||||||
|
no_load:
|
||||||
|
pIPF->lpVtbl->Release(pIPF);
|
||||||
|
no_instance:
|
||||||
|
CoUninitialize();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
pipe(int *fds)
|
||||||
|
{
|
||||||
|
struct sockaddr_in saddr;
|
||||||
|
struct timeval tv;
|
||||||
|
SOCKET temp;
|
||||||
|
SOCKET socket1 = INVALID_SOCKET;
|
||||||
|
SOCKET socket2 = INVALID_SOCKET;
|
||||||
|
u_long arg;
|
||||||
|
fd_set read_set;
|
||||||
|
fd_set write_set;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
temp = socket (AF_INET, SOCK_STREAM, 0);
|
||||||
|
|
||||||
|
if (temp == INVALID_SOCKET)
|
||||||
|
goto out0;
|
||||||
|
|
||||||
|
arg = 1;
|
||||||
|
if (ioctlsocket (temp, FIONBIO, &arg) == SOCKET_ERROR)
|
||||||
|
goto out0;
|
||||||
|
|
||||||
|
memset (&saddr, 0, sizeof (saddr));
|
||||||
|
saddr.sin_family = AF_INET;
|
||||||
|
saddr.sin_port = 0;
|
||||||
|
saddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
|
||||||
|
|
||||||
|
if (bind (temp, (struct sockaddr *)&saddr, sizeof (saddr)))
|
||||||
|
goto out0;
|
||||||
|
|
||||||
|
if (listen (temp, 1) == SOCKET_ERROR)
|
||||||
|
goto out0;
|
||||||
|
|
||||||
|
len = sizeof (saddr);
|
||||||
|
if (getsockname (temp, (struct sockaddr *)&saddr, &len))
|
||||||
|
goto out0;
|
||||||
|
|
||||||
|
socket1 = socket (AF_INET, SOCK_STREAM, 0);
|
||||||
|
|
||||||
|
if (socket1 == INVALID_SOCKET)
|
||||||
|
goto out0;
|
||||||
|
|
||||||
|
arg = 1;
|
||||||
|
if (ioctlsocket (socket1, FIONBIO, &arg) == SOCKET_ERROR)
|
||||||
|
goto out1;
|
||||||
|
|
||||||
|
if ((connect (socket1, (struct sockaddr *)&saddr, len) == SOCKET_ERROR) &&
|
||||||
|
(WSAGetLastError () != WSAEWOULDBLOCK))
|
||||||
|
goto out1;
|
||||||
|
|
||||||
|
FD_ZERO (&read_set);
|
||||||
|
FD_SET (temp, &read_set);
|
||||||
|
|
||||||
|
tv.tv_sec = 0;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
|
if (select (0, &read_set, NULL, NULL, NULL) == SOCKET_ERROR)
|
||||||
|
goto out1;
|
||||||
|
|
||||||
|
if (!FD_ISSET (temp, &read_set))
|
||||||
|
goto out1;
|
||||||
|
|
||||||
|
socket2 = accept (temp, (struct sockaddr *) &saddr, &len);
|
||||||
|
if (socket2 == INVALID_SOCKET)
|
||||||
|
goto out1;
|
||||||
|
|
||||||
|
FD_ZERO (&write_set);
|
||||||
|
FD_SET (socket1, &write_set);
|
||||||
|
|
||||||
|
tv.tv_sec = 0;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
|
if (select (0, NULL, &write_set, NULL, NULL) == SOCKET_ERROR)
|
||||||
|
goto out2;
|
||||||
|
|
||||||
|
if (!FD_ISSET (socket1, &write_set))
|
||||||
|
goto out2;
|
||||||
|
|
||||||
|
arg = 0;
|
||||||
|
if (ioctlsocket (socket1, FIONBIO, &arg) == SOCKET_ERROR)
|
||||||
|
goto out2;
|
||||||
|
|
||||||
|
arg = 0;
|
||||||
|
if (ioctlsocket (socket2, FIONBIO, &arg) == SOCKET_ERROR)
|
||||||
|
goto out2;
|
||||||
|
|
||||||
|
fds[0] = socket1;
|
||||||
|
fds[1] = socket2;
|
||||||
|
|
||||||
|
closesocket (temp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
out2:
|
||||||
|
closesocket (socket2);
|
||||||
|
out1:
|
||||||
|
closesocket (socket1);
|
||||||
|
out0:
|
||||||
|
closesocket (temp);
|
||||||
|
|
||||||
|
fds[0] = INVALID_SOCKET;
|
||||||
|
fds[1] = INVALID_SOCKET;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ! __CEGCC__ */
|
||||||
|
|
||||||
|
char *
|
||||||
|
evil_tmpdir_get(void)
|
||||||
|
{
|
||||||
|
char *tmpdir;
|
||||||
|
|
||||||
|
tmpdir = getenv("TMP");
|
||||||
|
if (!tmpdir) tmpdir = getenv("TEMP");
|
||||||
|
if (!tmpdir) tmpdir = getenv("USERPROFILE");
|
||||||
|
if (!tmpdir) tmpdir = getenv("WINDIR");
|
||||||
|
if (!tmpdir) tmpdir="C:\\";
|
||||||
|
|
||||||
|
return tmpdir;
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libmman.la
|
||||||
|
|
||||||
|
nobase_include_HEADERS = sys/mman.h
|
||||||
|
libmman_la_SOURCES = mman.c
|
||||||
|
|
||||||
|
libmman_la_LDFLAGS = -no-undefined -version-info @version_info@
|
|
@ -0,0 +1,119 @@
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
#undef WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
#ifndef __CEGCC__
|
||||||
|
# include <io.h>
|
||||||
|
#endif /* ! __CEGCC__ */
|
||||||
|
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
|
#if HAVE___ATTRIBUTE__
|
||||||
|
# define __UNUSED__ __attribute__((unused))
|
||||||
|
#else
|
||||||
|
# define __UNUSED__
|
||||||
|
#endif /* HAVE___ATTRIBUTE__ */
|
||||||
|
|
||||||
|
#ifdef __CEGCC__
|
||||||
|
# define CreateFileMapping CreateFileMappingW
|
||||||
|
# define _get_osfhandle get_osfhandle
|
||||||
|
#endif /* __CEGCC__ */
|
||||||
|
|
||||||
|
|
||||||
|
void *
|
||||||
|
mmap(void *addr __UNUSED__,
|
||||||
|
size_t len,
|
||||||
|
int prot,
|
||||||
|
int flags,
|
||||||
|
int fd,
|
||||||
|
off_t offset)
|
||||||
|
{
|
||||||
|
void *data;
|
||||||
|
HANDLE fm;
|
||||||
|
DWORD protect = PAGE_NOACCESS;
|
||||||
|
DWORD access = 0;
|
||||||
|
|
||||||
|
/* support only MAP_SHARED */
|
||||||
|
if (!(flags & MAP_SHARED)) return (void *)~0;
|
||||||
|
|
||||||
|
if (prot & PROT_EXEC)
|
||||||
|
{
|
||||||
|
if (prot & PROT_READ)
|
||||||
|
{
|
||||||
|
if (prot & PROT_WRITE)
|
||||||
|
protect = PAGE_EXECUTE_READWRITE;
|
||||||
|
else
|
||||||
|
protect = PAGE_EXECUTE_READ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (prot & PROT_WRITE)
|
||||||
|
protect = PAGE_EXECUTE_WRITECOPY;
|
||||||
|
else
|
||||||
|
protect = PAGE_EXECUTE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (prot & PROT_READ)
|
||||||
|
{
|
||||||
|
if (prot & PROT_WRITE)
|
||||||
|
protect = PAGE_READWRITE;
|
||||||
|
else
|
||||||
|
protect = PAGE_READONLY;
|
||||||
|
}
|
||||||
|
else if (prot & PROT_WRITE)
|
||||||
|
protect = PAGE_WRITECOPY;
|
||||||
|
}
|
||||||
|
|
||||||
|
fm = CreateFileMapping((HANDLE)_get_osfhandle (fd),
|
||||||
|
NULL,
|
||||||
|
protect,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
NULL);
|
||||||
|
if (!fm) return (void *)~0;
|
||||||
|
|
||||||
|
if (protect & PAGE_READWRITE)
|
||||||
|
access = FILE_MAP_ALL_ACCESS;
|
||||||
|
if (protect & PAGE_WRITECOPY)
|
||||||
|
access = FILE_MAP_COPY;
|
||||||
|
#if 0
|
||||||
|
if (protect & (PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_READ))
|
||||||
|
access = FILE_MAP_EXECUTE;
|
||||||
|
#endif
|
||||||
|
if (protect & (PAGE_READWRITE | PAGE_READONLY))
|
||||||
|
access = FILE_MAP_READ;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (protect & PAGE_READWRITE)
|
||||||
|
access = FILE_MAP_WRITE;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = MapViewOfFile(fm,
|
||||||
|
access,
|
||||||
|
offset & 0xffff0000,
|
||||||
|
offset & 0x0000ffff,
|
||||||
|
len);
|
||||||
|
CloseHandle(fm);
|
||||||
|
|
||||||
|
if (!data) return (void *)~0;
|
||||||
|
else return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
munmap(void *addr,
|
||||||
|
size_t len __UNUSED__)
|
||||||
|
{
|
||||||
|
BOOL res;
|
||||||
|
|
||||||
|
res = UnmapViewOfFile(addr);
|
||||||
|
|
||||||
|
return (res == 0) ? -1 : 0;
|
||||||
|
}
|
|
@ -0,0 +1,115 @@
|
||||||
|
#ifndef __E_WIN32_SYS_MMAN_H__
|
||||||
|
#define __E_WIN32_SYS_MMAN_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 PROT_NONE 0x00
|
||||||
|
#define PROT_READ 0x01
|
||||||
|
#define PROT_WRITE 0x02
|
||||||
|
#define PROT_EXEC 0x04
|
||||||
|
|
||||||
|
#define MAP_SHARED 0x0001
|
||||||
|
#define MAP_PRIVATE 0x0002
|
||||||
|
#define MAP_FIXED 0x0010
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file mman.h
|
||||||
|
* @brief The file that provides the memory map functions
|
||||||
|
* @defgroup Mman Functions that manage memory mappping.
|
||||||
|
*
|
||||||
|
* This header provides the meomry map functions mmap and munmap.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates or opens a named or unnamed file mapping object for a
|
||||||
|
* specified file and maps a view of a file mapping into the
|
||||||
|
* address space of a calling process.
|
||||||
|
*
|
||||||
|
* @param addr Unused
|
||||||
|
* @param len Number of bytes to be mapped.
|
||||||
|
* @param prot Protections.
|
||||||
|
* @param flags Type of the mapped object.
|
||||||
|
* @param fd File descriptor that describes the object to map.
|
||||||
|
* @param offset Number of bytes from which to start the mapping.
|
||||||
|
* @return The starting address of the mapped view on success, -1 otherwise.
|
||||||
|
*
|
||||||
|
* Create or open an unnamed file mapping object for a specified
|
||||||
|
* file described by the file descriptor @p fd. The number of
|
||||||
|
* bytes that are mapped is given by @p len and start after
|
||||||
|
* @p offset bytes. The parameter @p addr is unused.
|
||||||
|
*
|
||||||
|
* The only type of the mapped object that is supported is
|
||||||
|
* @c MAP_SHARED. If another value if given, -1 is returned.
|
||||||
|
*
|
||||||
|
* @p prot specifies the protection of the mapped region. If
|
||||||
|
* PROT_EXEC is used, it set the execute access. If PROT_READ
|
||||||
|
* is used, it sets the read access. If PROT_WRITE is used, it
|
||||||
|
* sets the write access.
|
||||||
|
*
|
||||||
|
* If the map view of file can not be created, -1 is returned.
|
||||||
|
* If the mappping can not be done, -1 is returned.
|
||||||
|
*
|
||||||
|
* If no error occured, the starting address of the mapped view
|
||||||
|
* is returned.
|
||||||
|
*
|
||||||
|
* Conformity: None.
|
||||||
|
*
|
||||||
|
* Supported OS: Windows Vista, Windows XP or Windows 2000
|
||||||
|
* Professional.
|
||||||
|
*
|
||||||
|
* @ingroup Mman
|
||||||
|
*/
|
||||||
|
EAPI void *mmap(void *addr,
|
||||||
|
size_t len,
|
||||||
|
int prot,
|
||||||
|
int flags,
|
||||||
|
int fd,
|
||||||
|
off_t offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unmaps a mapped view of a file from the calling process's
|
||||||
|
* address space.
|
||||||
|
*
|
||||||
|
* @param addr Pointer to the base address.
|
||||||
|
* @param len Unused.
|
||||||
|
* @return 0 on success, -1 otherwise.
|
||||||
|
*
|
||||||
|
* Unmaps a mapped view of a file from the calling process's
|
||||||
|
* address space. @p addr is the pointer to the base address.
|
||||||
|
* This value must be identical to the value returned by a
|
||||||
|
* previous call to mmap(). The parameter @p len is unsed.
|
||||||
|
*
|
||||||
|
* Conformity: None.
|
||||||
|
*
|
||||||
|
* Supported OS: Windows Vista, Windows XP or Windows 2000
|
||||||
|
* Professional.
|
||||||
|
*
|
||||||
|
* @ingroup Mman
|
||||||
|
*/
|
||||||
|
EAPI int munmap(void *addr,
|
||||||
|
size_t len);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __E_WIN32_SYS_MMAN_H__ */
|
||||||
|
|
Loading…
Reference in New Issue