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