mirror of https://gitee.com/openkylin/wget.git
Import Upstream version 1.20.3
This commit is contained in:
commit
c0a4694faf
|
@ -0,0 +1 @@
|
||||||
|
1.20.3
|
|
@ -0,0 +1,58 @@
|
||||||
|
Authors of GNU Wget.
|
||||||
|
|
||||||
|
[ Note that this file does not attempt to list all the contributors to
|
||||||
|
Wget; look at the ChangeLogs for that. This is a list of people who
|
||||||
|
contributed sizeable amounts of code and assigned the copyright to
|
||||||
|
the FSF. ]
|
||||||
|
|
||||||
|
Hrvoje Niksic. Designed and implemented Wget.
|
||||||
|
|
||||||
|
Gordon Matzigkeit. Wrote netrc.c and netrc.h.
|
||||||
|
|
||||||
|
Darko Budor. Wrote initial support for Windows, wrote wsstartup.c,
|
||||||
|
wsstartup.h and windecl.h. (The files were later renamed, but his
|
||||||
|
code and ideas remained present.)
|
||||||
|
|
||||||
|
Junio Hamano. Added support for FTP Opie and HTTP digest
|
||||||
|
authentication.
|
||||||
|
|
||||||
|
Dan Harkless. Added --backup-converted, --follow-tags, --html-extension,
|
||||||
|
--ignore-tags, and --page-requisites; improved documentation; etc. Was
|
||||||
|
the principle maintainer of GNU Wget for some time.
|
||||||
|
|
||||||
|
Christian Fraenkel. Initially implemented SSL support.
|
||||||
|
|
||||||
|
Thomas Lussnig. Initially implemented IPv6 support.
|
||||||
|
|
||||||
|
Ian Abbott. Contributed bugfixes, Windows-related fixes, provided a
|
||||||
|
prototype implementation of the new recursive code, and more.
|
||||||
|
Co-maintained Wget during the 1.8 release cycle.
|
||||||
|
|
||||||
|
Gisle Vanem. Contributed Windows and MS-DOS improvements, including a
|
||||||
|
port of run_with_timeout to Windows, additions to Makefiles, and many
|
||||||
|
bug reports and fixes.
|
||||||
|
|
||||||
|
Mauro Tortonesi. Improved IPv6 support, adding support for dual
|
||||||
|
family systems. Refactored and enhanced FTP IPv6 code. Maintained GNU
|
||||||
|
Wget from 2004-2007.
|
||||||
|
|
||||||
|
Nicolas Schodet. Contributed to cookie code and documentation.
|
||||||
|
|
||||||
|
Daniel Stenberg. NTLM authentication in http-ntlm.c and http-ntlm.h
|
||||||
|
originally written for curl donated for use in GNU Wget.
|
||||||
|
|
||||||
|
Micah Cowan. Maintained Wget from mid-2007 to mid-2010.
|
||||||
|
|
||||||
|
Ralf Wildenhues. Contributed patches to convert Wget to use Automake as
|
||||||
|
part of its build process, and various bugfixes.
|
||||||
|
|
||||||
|
Steven Schubiger. Many helpful patches, bugfixes and improvements.
|
||||||
|
Notably, conversion of Wget to use the Gnulib quotes and quoteargs
|
||||||
|
modules, and the addition of password prompts at the console, via the
|
||||||
|
Gnulib getpasswd-gnu module.
|
||||||
|
|
||||||
|
Ted Mielczarek. Support for parsing links from CSS.
|
||||||
|
|
||||||
|
Saint Xavier. Support for IRIs (RFC 3987).
|
||||||
|
|
||||||
|
Giuseppe Scrivano. Added support for HTTP/1.1. Current Wget maintainer.
|
|
@ -0,0 +1,674 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
the GNU General Public License is intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users. We, the Free Software Foundation, use the
|
||||||
|
GNU General Public License for most of our software; it applies also to
|
||||||
|
any other work released this way by its authors. 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
|
||||||
|
them 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 prevent others from denying you
|
||||||
|
these rights or asking you to surrender the rights. Therefore, you have
|
||||||
|
certain responsibilities if you distribute copies of the software, or if
|
||||||
|
you modify it: responsibilities to respect the freedom of others.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must pass on to the recipients the same
|
||||||
|
freedoms that you received. 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.
|
||||||
|
|
||||||
|
Developers that use the GNU GPL protect your rights with two steps:
|
||||||
|
(1) assert copyright on the software, and (2) offer you this License
|
||||||
|
giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
|
||||||
|
For the developers' and authors' protection, the GPL clearly explains
|
||||||
|
that there is no warranty for this free software. For both users' and
|
||||||
|
authors' sake, the GPL requires that modified versions be marked as
|
||||||
|
changed, so that their problems will not be attributed erroneously to
|
||||||
|
authors of previous versions.
|
||||||
|
|
||||||
|
Some devices are designed to deny users access to install or run
|
||||||
|
modified versions of the software inside them, although the manufacturer
|
||||||
|
can do so. This is fundamentally incompatible with the aim of
|
||||||
|
protecting users' freedom to change the software. The systematic
|
||||||
|
pattern of such abuse occurs in the area of products for individuals to
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we
|
||||||
|
have designed this version of the GPL to prohibit the practice for those
|
||||||
|
products. If such problems arise substantially in other domains, we
|
||||||
|
stand ready to extend this provision to those domains in future versions
|
||||||
|
of the GPL, as needed to protect the freedom of users.
|
||||||
|
|
||||||
|
Finally, every program is threatened constantly by software patents.
|
||||||
|
States should not allow patents to restrict development and use of
|
||||||
|
software on general-purpose computers, but in those that do, we wish to
|
||||||
|
avoid the special danger that patents applied to a free program could
|
||||||
|
make it effectively proprietary. To prevent this, the GPL assures that
|
||||||
|
patents cannot be used to render the program non-free.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey 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;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If 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 convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Use with the GNU Affero General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU Affero General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the special requirements of the GNU Affero General Public License,
|
||||||
|
section 13, concerning interaction through a network will apply to the
|
||||||
|
combination as such.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU 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 that a certain numbered version of the GNU General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
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.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
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
|
||||||
|
state 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 3 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program does terminal interaction, make it output a short
|
||||||
|
notice like this when it starts in an interactive mode:
|
||||||
|
|
||||||
|
<program> Copyright (C) <year> <name of author>
|
||||||
|
This program 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, your program's commands
|
||||||
|
might be different; for a GUI interface, you would use an "about box".
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
|
<https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
The GNU 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 Lesser General
|
||||||
|
Public License instead of this License. But first, please read
|
||||||
|
<https://www.gnu.org/philosophy/why-not-lgpl.html>.
|
|
@ -0,0 +1,127 @@
|
||||||
|
# Having a separate GNUmakefile lets me 'include' the dynamically
|
||||||
|
# generated rules created via cfg.mk (package-local configuration)
|
||||||
|
# as well as maint.mk (generic maintainer rules).
|
||||||
|
# This makefile is used only if you run GNU Make.
|
||||||
|
# It is necessary if you want to build targets usually of interest
|
||||||
|
# only to the maintainer.
|
||||||
|
|
||||||
|
# Copyright (C) 2001, 2003, 2006-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# 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 3 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# If the user runs GNU make but has not yet run ./configure,
|
||||||
|
# give them a diagnostic.
|
||||||
|
_gl-Makefile := $(wildcard [M]akefile)
|
||||||
|
ifneq ($(_gl-Makefile),)
|
||||||
|
|
||||||
|
# Make tar archive easier to reproduce.
|
||||||
|
export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner
|
||||||
|
|
||||||
|
# Allow the user to add to this in the Makefile.
|
||||||
|
ALL_RECURSIVE_TARGETS =
|
||||||
|
|
||||||
|
include Makefile
|
||||||
|
|
||||||
|
# Some projects override e.g., _autoreconf here.
|
||||||
|
-include $(srcdir)/cfg.mk
|
||||||
|
|
||||||
|
# Allow cfg.mk to override these.
|
||||||
|
_build-aux ?= build-aux
|
||||||
|
_autoreconf ?= autoreconf -v
|
||||||
|
|
||||||
|
include $(srcdir)/maint.mk
|
||||||
|
|
||||||
|
# Ensure that $(VERSION) is up to date for dist-related targets, but not
|
||||||
|
# for others: rerunning autoreconf and recompiling everything isn't cheap.
|
||||||
|
_have-git-version-gen := \
|
||||||
|
$(shell test -f $(srcdir)/$(_build-aux)/git-version-gen && echo yes)
|
||||||
|
ifeq ($(_have-git-version-gen)0,yes$(MAKELEVEL))
|
||||||
|
_is-dist-target ?= $(filter-out %clean, \
|
||||||
|
$(filter maintainer-% dist% alpha beta stable,$(MAKECMDGOALS)))
|
||||||
|
_is-install-target ?= $(filter-out %check, $(filter install%,$(MAKECMDGOALS)))
|
||||||
|
ifneq (,$(_is-dist-target)$(_is-install-target))
|
||||||
|
_curr-ver := $(shell cd $(srcdir) \
|
||||||
|
&& $(_build-aux)/git-version-gen \
|
||||||
|
.tarball-version \
|
||||||
|
$(git-version-gen-tag-sed-script))
|
||||||
|
ifneq ($(_curr-ver),$(VERSION))
|
||||||
|
ifeq ($(_curr-ver),UNKNOWN)
|
||||||
|
$(info WARNING: unable to verify if $(VERSION) is the correct version)
|
||||||
|
else
|
||||||
|
ifneq (,$(_is-install-target))
|
||||||
|
# GNU Coding Standards state that 'make install' should not cause
|
||||||
|
# recompilation after 'make all'. But as long as changing the version
|
||||||
|
# string alters config.h, the cost of having 'make all' always have an
|
||||||
|
# up-to-date version is prohibitive. So, as a compromise, we merely
|
||||||
|
# warn when installing a version string that is out of date; the user
|
||||||
|
# should run 'autoreconf' (or something like 'make distcheck') to
|
||||||
|
# fix the version, 'make all' to propagate it, then 'make install'.
|
||||||
|
$(info WARNING: version string $(VERSION) is out of date;)
|
||||||
|
$(info run '$(MAKE) _version' to fix it)
|
||||||
|
else
|
||||||
|
$(info INFO: running autoreconf for new version string: $(_curr-ver))
|
||||||
|
GNUmakefile: _version
|
||||||
|
touch GNUmakefile
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PHONY: _version
|
||||||
|
_version:
|
||||||
|
cd $(srcdir) && rm -rf autom4te.cache .version && $(_autoreconf)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) Makefile
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
.DEFAULT_GOAL := abort-due-to-no-makefile
|
||||||
|
srcdir = .
|
||||||
|
|
||||||
|
# The package can override .DEFAULT_GOAL to run actions like autoreconf.
|
||||||
|
-include ./cfg.mk
|
||||||
|
|
||||||
|
# Allow cfg.mk to override these.
|
||||||
|
_build-aux ?= build-aux
|
||||||
|
_autoreconf ?= autoreconf -v
|
||||||
|
|
||||||
|
include ./maint.mk
|
||||||
|
|
||||||
|
ifeq ($(.DEFAULT_GOAL),abort-due-to-no-makefile)
|
||||||
|
$(MAKECMDGOALS): abort-due-to-no-makefile
|
||||||
|
endif
|
||||||
|
|
||||||
|
abort-due-to-no-makefile:
|
||||||
|
@echo There seems to be no Makefile in this directory. 1>&2
|
||||||
|
@echo "You must run ./configure before running 'make'." 1>&2
|
||||||
|
@exit 1
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Tell version 3.79 and up of GNU make to not build goals in this
|
||||||
|
# directory in parallel, in case someone tries to build multiple
|
||||||
|
# targets, and one of them can cause a recursive target to be invoked.
|
||||||
|
|
||||||
|
# Only set this if Automake doesn't provide it.
|
||||||
|
AM_RECURSIVE_TARGETS ?= $(RECURSIVE_TARGETS:-recursive=) \
|
||||||
|
$(RECURSIVE_CLEAN_TARGETS:-recursive=) \
|
||||||
|
dist distcheck tags ctags
|
||||||
|
|
||||||
|
ALL_RECURSIVE_TARGETS += $(AM_RECURSIVE_TARGETS)
|
||||||
|
|
||||||
|
ifneq ($(word 2, $(MAKECMDGOALS)), )
|
||||||
|
ifneq ($(filter $(ALL_RECURSIVE_TARGETS), $(MAKECMDGOALS)), )
|
||||||
|
.NOTPARALLEL:
|
||||||
|
endif
|
||||||
|
endif
|
|
@ -0,0 +1,368 @@
|
||||||
|
Installation Instructions
|
||||||
|
*************************
|
||||||
|
|
||||||
|
Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
|
||||||
|
Foundation, Inc.
|
||||||
|
|
||||||
|
Copying and distribution of this file, with or without modification,
|
||||||
|
are permitted in any medium without royalty provided the copyright
|
||||||
|
notice and this notice are preserved. This file is offered as-is,
|
||||||
|
without warranty of any kind.
|
||||||
|
|
||||||
|
Basic Installation
|
||||||
|
==================
|
||||||
|
|
||||||
|
Briefly, the shell command './configure && make && make install'
|
||||||
|
should configure, build, and install this package. The following
|
||||||
|
more-detailed instructions are generic; see the 'README' file for
|
||||||
|
instructions specific to this package. Some packages provide this
|
||||||
|
'INSTALL' file but do not implement all of the features documented
|
||||||
|
below. The lack of an optional feature in a given package is not
|
||||||
|
necessarily a bug. More recommendations for GNU packages can be found
|
||||||
|
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||||
|
|
||||||
|
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 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.
|
||||||
|
|
||||||
|
Running 'configure' might take a while. 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, generally using the just-built uninstalled binaries.
|
||||||
|
|
||||||
|
4. Type 'make install' to install the programs and any data files and
|
||||||
|
documentation. When installing into a prefix owned by root, it is
|
||||||
|
recommended that the package be configured and built as a regular
|
||||||
|
user, and only the 'make install' phase executed with root
|
||||||
|
privileges.
|
||||||
|
|
||||||
|
5. Optionally, type 'make installcheck' to repeat any self-tests, but
|
||||||
|
this time using the binaries in their final installed location.
|
||||||
|
This target does not install anything. Running this target as a
|
||||||
|
regular user, particularly if the prior 'make install' required
|
||||||
|
root privileges, verifies that the installation completed
|
||||||
|
correctly.
|
||||||
|
|
||||||
|
6. 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.
|
||||||
|
|
||||||
|
7. Often, you can also type 'make uninstall' to remove the installed
|
||||||
|
files again. In practice, not all packages have tested that
|
||||||
|
uninstallation works correctly, even though it is required by the
|
||||||
|
GNU Coding Standards.
|
||||||
|
|
||||||
|
8. Some packages, particularly those that use Automake, provide 'make
|
||||||
|
distcheck', which can by used by developers to test that all other
|
||||||
|
targets like 'make install' and 'make uninstall' work correctly.
|
||||||
|
This target is generally not run by end users.
|
||||||
|
|
||||||
|
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=c99 CFLAGS=-g 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 can use 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 '..'. This is known
|
||||||
|
as a "VPATH" build.
|
||||||
|
|
||||||
|
With a non-GNU 'make', it is safer 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.
|
||||||
|
|
||||||
|
On MacOS X 10.5 and later systems, you can create libraries and
|
||||||
|
executables that work on multiple system types--known as "fat" or
|
||||||
|
"universal" binaries--by specifying multiple '-arch' options to the
|
||||||
|
compiler but only a single '-arch' option to the preprocessor. Like
|
||||||
|
this:
|
||||||
|
|
||||||
|
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
CPP="gcc -E" CXXCPP="g++ -E"
|
||||||
|
|
||||||
|
This is not guaranteed to produce working output in all cases, you
|
||||||
|
may have to build one architecture at a time and combine the results
|
||||||
|
using the 'lipo' tool if you have problems.
|
||||||
|
|
||||||
|
Installation Names
|
||||||
|
==================
|
||||||
|
|
||||||
|
By default, 'make install' installs the package's commands under
|
||||||
|
'/usr/local/bin', include files under '/usr/local/include', etc. You
|
||||||
|
can specify an installation prefix other than '/usr/local' by giving
|
||||||
|
'configure' the option '--prefix=PREFIX', where PREFIX must be an
|
||||||
|
absolute file name.
|
||||||
|
|
||||||
|
You can specify separate installation prefixes for
|
||||||
|
architecture-specific files and architecture-independent files. If you
|
||||||
|
pass the option '--exec-prefix=PREFIX' to 'configure', the package uses
|
||||||
|
PREFIX as the prefix for installing programs and libraries.
|
||||||
|
Documentation and other data files still use the regular prefix.
|
||||||
|
|
||||||
|
In addition, if you use an unusual directory layout you can give
|
||||||
|
options like '--bindir=DIR' 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. In general, the default
|
||||||
|
for these options is expressed in terms of '${prefix}', so that
|
||||||
|
specifying just '--prefix' will affect all of the other directory
|
||||||
|
specifications that were not explicitly provided.
|
||||||
|
|
||||||
|
The most portable way to affect installation locations is to pass the
|
||||||
|
correct locations to 'configure'; however, many packages provide one or
|
||||||
|
both of the following shortcuts of passing variable assignments to the
|
||||||
|
'make install' command line to change installation locations without
|
||||||
|
having to reconfigure or recompile.
|
||||||
|
|
||||||
|
The first method involves providing an override variable for each
|
||||||
|
affected directory. For example, 'make install
|
||||||
|
prefix=/alternate/directory' will choose an alternate location for all
|
||||||
|
directory configuration variables that were expressed in terms of
|
||||||
|
'${prefix}'. Any directories that were specified during 'configure',
|
||||||
|
but not in terms of '${prefix}', must each be overridden at install time
|
||||||
|
for the entire installation to be relocated. The approach of makefile
|
||||||
|
variable overrides for each directory variable is required by the GNU
|
||||||
|
Coding Standards, and ideally causes no recompilation. However, some
|
||||||
|
platforms have known limitations with the semantics of shared libraries
|
||||||
|
that end up requiring recompilation when using this method, particularly
|
||||||
|
noticeable in packages that use GNU Libtool.
|
||||||
|
|
||||||
|
The second method involves providing the 'DESTDIR' variable. For
|
||||||
|
example, 'make install DESTDIR=/alternate/directory' will prepend
|
||||||
|
'/alternate/directory' before all installation names. The approach of
|
||||||
|
'DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||||
|
does not work on platforms that have drive letters. On the other hand,
|
||||||
|
it does better at avoiding recompilation issues, and works well even
|
||||||
|
when some directory options were not specified in terms of '${prefix}'
|
||||||
|
at 'configure' time.
|
||||||
|
|
||||||
|
Optional Features
|
||||||
|
=================
|
||||||
|
|
||||||
|
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'.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Some packages offer the ability to configure how verbose the
|
||||||
|
execution of 'make' will be. For these packages, running './configure
|
||||||
|
--enable-silent-rules' sets the default to minimal output, which can be
|
||||||
|
overridden with 'make V=1'; while running './configure
|
||||||
|
--disable-silent-rules' sets the default to verbose, which can be
|
||||||
|
overridden with 'make V=0'.
|
||||||
|
|
||||||
|
Particular systems
|
||||||
|
==================
|
||||||
|
|
||||||
|
On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC
|
||||||
|
is not installed, it is recommended to use the following options in
|
||||||
|
order to use an ANSI C compiler:
|
||||||
|
|
||||||
|
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||||
|
|
||||||
|
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||||
|
|
||||||
|
HP-UX 'make' updates targets which have the same time stamps as their
|
||||||
|
prerequisites, which makes it generally unusable when shipped generated
|
||||||
|
files such as 'configure' are involved. Use GNU 'make' instead.
|
||||||
|
|
||||||
|
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||||
|
parse its '<wchar.h>' header file. The option '-nodtk' can be used as a
|
||||||
|
workaround. If GNU CC is not installed, it is therefore recommended to
|
||||||
|
try
|
||||||
|
|
||||||
|
./configure CC="cc"
|
||||||
|
|
||||||
|
and if that doesn't work, try
|
||||||
|
|
||||||
|
./configure CC="cc -nodtk"
|
||||||
|
|
||||||
|
On Solaris, don't put '/usr/ucb' early in your 'PATH'. This
|
||||||
|
directory contains several dysfunctional programs; working variants of
|
||||||
|
these programs are available in '/usr/bin'. So, if you need '/usr/ucb'
|
||||||
|
in your 'PATH', put it _after_ '/usr/bin'.
|
||||||
|
|
||||||
|
On Haiku, software installed for all users goes in '/boot/common',
|
||||||
|
not '/usr/local'. It is recommended to use the following options:
|
||||||
|
|
||||||
|
./configure --prefix=/boot/common
|
||||||
|
|
||||||
|
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 option '--target=TYPE' 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
|
||||||
|
|
||||||
|
causes the specified 'gcc' to be used as the C compiler (unless it is
|
||||||
|
overridden in the site shell script).
|
||||||
|
|
||||||
|
Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an
|
||||||
|
Autoconf limitation. Until the limitation is lifted, you can use this
|
||||||
|
workaround:
|
||||||
|
|
||||||
|
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||||
|
|
||||||
|
'configure' Invocation
|
||||||
|
======================
|
||||||
|
|
||||||
|
'configure' recognizes the following options to control how it
|
||||||
|
operates.
|
||||||
|
|
||||||
|
'--help'
|
||||||
|
'-h'
|
||||||
|
Print a summary of all of the options to 'configure', and exit.
|
||||||
|
|
||||||
|
'--help=short'
|
||||||
|
'--help=recursive'
|
||||||
|
Print a summary of the options unique to this package's
|
||||||
|
'configure', and exit. The 'short' variant lists options used only
|
||||||
|
in the top level, while the 'recursive' variant lists options also
|
||||||
|
present in any nested packages.
|
||||||
|
|
||||||
|
'--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.
|
||||||
|
|
||||||
|
'--prefix=DIR'
|
||||||
|
Use DIR as the installation prefix. *note Installation Names:: for
|
||||||
|
more details, including other options available for fine-tuning the
|
||||||
|
installation locations.
|
||||||
|
|
||||||
|
'--no-create'
|
||||||
|
'-n'
|
||||||
|
Run the configure checks, but stop before creating any output
|
||||||
|
files.
|
||||||
|
|
||||||
|
'configure' also accepts some other, not widely useful, options. Run
|
||||||
|
'configure --help' for more details.
|
|
@ -0,0 +1,30 @@
|
||||||
|
Mailing Lists
|
||||||
|
=============
|
||||||
|
|
||||||
|
Primary List
|
||||||
|
------------
|
||||||
|
|
||||||
|
The primary mailinglist for discussion, bug-reports, or questions about
|
||||||
|
GNU Wget is at <bug-wget@gnu.org>. To subscribe, send an email to
|
||||||
|
<bug-wget-join@gnu.org>, or visit
|
||||||
|
`https://lists.gnu.org/mailman/listinfo/bug-wget'.
|
||||||
|
|
||||||
|
You do not need to subscribe to send a message to the list; however,
|
||||||
|
please note that unsubscribed messages are moderated, and may take a
|
||||||
|
while before they hit the list--*usually around a day*. If you want
|
||||||
|
your message to show up immediately, please subscribe to the list
|
||||||
|
before posting. Archives for the list may be found at
|
||||||
|
`https://lists.gnu.org/pipermail/bug-wget/'.
|
||||||
|
|
||||||
|
Obsolete Lists
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Previously, the mailing list <wget@sunsite.dk> was used as the main
|
||||||
|
discussion list, and another list, <wget-patches@sunsite.dk> was used
|
||||||
|
for submitting and discussing patches to GNU Wget.
|
||||||
|
|
||||||
|
Messages from <wget@sunsite.dk> are archived at
|
||||||
|
`https://www.mail-archive.com/wget%40sunsite.dk/' and at
|
||||||
|
|
||||||
|
Messages from <wget-patches@sunsite.dk> are archived at
|
||||||
|
`https://news.gmane.org/gmane.comp.web.wget.patches'.
|
|
@ -0,0 +1,82 @@
|
||||||
|
# Makefile for `Wget' utility
|
||||||
|
# Copyright (C) 1995-1997, 2006-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# 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 3 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Additional permission under GNU GPL version 3 section 7
|
||||||
|
|
||||||
|
# If you modify this program, or any covered work, by linking or
|
||||||
|
# combining it with the OpenSSL project's OpenSSL library (or a
|
||||||
|
# modified version of that library), containing parts covered by the
|
||||||
|
# terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
|
||||||
|
# grants you additional permission to convey the resulting work.
|
||||||
|
# Corresponding Source for a non-source form of such a combination
|
||||||
|
# shall include the source code for the parts of OpenSSL used as well
|
||||||
|
# as that of the covered work.
|
||||||
|
|
||||||
|
#
|
||||||
|
# Version: @VERSION@
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
# We can't help that installing wget.info leaves /usr/share/info/dir
|
||||||
|
# around, and we need to prevent uninstallation of the possibly
|
||||||
|
# previously-existing /etc/wgetrc.
|
||||||
|
distuninstallcheck_listfiles = find . -type f | \
|
||||||
|
grep -Ev '(/share/info/dir|/etc/wgetrc)$$'
|
||||||
|
|
||||||
|
# Search for macros in the m4 subdirectory:
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
|
# subdirectories in the distribution
|
||||||
|
SUBDIRS = lib src doc po util fuzz tests testenv
|
||||||
|
|
||||||
|
EXTRA_DIST = MAILING-LIST \
|
||||||
|
msdos/config.h msdos/Makefile.DJ \
|
||||||
|
msdos/Makefile.WC ABOUT-NLS \
|
||||||
|
build-aux/build_info.pl build-aux/git-version-gen .version
|
||||||
|
|
||||||
|
CLEANFILES = *~ *.bak $(DISTNAME).tar.gz
|
||||||
|
DISTCLEANFILES = po/stamp-po
|
||||||
|
|
||||||
|
BUILT_SOURCES = .version
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
rm -f install-info
|
||||||
|
|
||||||
|
.version:
|
||||||
|
echo $(VERSION) > $@-t && mv $@-t $@
|
||||||
|
|
||||||
|
# Arrange so that .tarball-version appears only in the distribution
|
||||||
|
# tarball, and never in a checked-out repository.
|
||||||
|
dist-hook: gen-ChangeLog
|
||||||
|
$(AM_V_GEN)echo $(VERSION) > $(distdir)/.tarball-version
|
||||||
|
|
||||||
|
gen_start_date = 2014-12-10
|
||||||
|
.PHONY: gen-ChangeLog
|
||||||
|
gen-ChangeLog:
|
||||||
|
$(AM_V_GEN)if test -d .git; then \
|
||||||
|
log_fix="$(srcdir)/build-aux/git-log-fix"; \
|
||||||
|
test -e "$$log_fix" \
|
||||||
|
|| amend_git_log=; \
|
||||||
|
$(top_srcdir)/build-aux/gitlog-to-changelog \
|
||||||
|
$$amend_git_log --since=$(gen_start_date) > $(distdir)/cl-t && \
|
||||||
|
echo >> $(distdir)/cl-t && \
|
||||||
|
cat ChangeLog-2014-12-10 >> $(distdir)/cl-t && \
|
||||||
|
{ rm -f $(distdir)/ChangeLog && \
|
||||||
|
mv $(distdir)/cl-t $(distdir)/ChangeLog; } \
|
||||||
|
fi
|
||||||
|
|
||||||
|
check-valgrind:
|
||||||
|
TESTS_ENVIRONMENT="VALGRIND_TESTS=1" $(MAKE) check
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,90 @@
|
||||||
|
-*- text -*-
|
||||||
|
GNU Wget
|
||||||
|
========
|
||||||
|
Current Web home: https://www.gnu.org/software/wget/
|
||||||
|
|
||||||
|
GNU Wget is a free utility for non-interactive download of files from
|
||||||
|
the Web. It supports HTTP, HTTPS, and FTP protocols, as well as
|
||||||
|
retrieval through HTTP proxies.
|
||||||
|
|
||||||
|
It can follow links in HTML pages and create local versions of remote
|
||||||
|
web sites, fully recreating the directory structure of the original
|
||||||
|
site. This is sometimes referred to as "recursive downloading."
|
||||||
|
While doing that, Wget respects the Robot Exclusion Standard
|
||||||
|
(/robots.txt). Wget can be instructed to convert the links in
|
||||||
|
downloaded HTML files to the local files for offline viewing.
|
||||||
|
|
||||||
|
Recursive downloading also works with FTP, where Wget can retrieves a
|
||||||
|
hierarchy of directories and files.
|
||||||
|
|
||||||
|
With both HTTP and FTP, Wget can check whether a remote file has
|
||||||
|
changed on the server since the previous run, and only download the
|
||||||
|
newer files.
|
||||||
|
|
||||||
|
Wget has been designed for robustness over slow or unstable network
|
||||||
|
connections; if a download fails due to a network problem, it will
|
||||||
|
keep retrying until the whole file has been retrieved. If the server
|
||||||
|
supports regetting, it will instruct the server to continue the
|
||||||
|
download from where it left off.
|
||||||
|
|
||||||
|
If you are behind a firewall that requires the use of a socks style
|
||||||
|
gateway, you can get the socks library and compile wget with support
|
||||||
|
for socks.
|
||||||
|
|
||||||
|
Most of the features are configurable, either through command-line
|
||||||
|
options, or via initialization file .wgetrc. Wget allows you to
|
||||||
|
install a global startup file (/usr/local/etc/wgetrc by default) for
|
||||||
|
site settings.
|
||||||
|
|
||||||
|
Wget works under almost all Unix variants in use today and, unlike
|
||||||
|
many of its historical predecessors, is written entirely in C, thus
|
||||||
|
requiring no additional software, such as Perl. The external software
|
||||||
|
it does work with, such as OpenSSL, is optional. As Wget uses the GNU
|
||||||
|
Autoconf, it is easily built on and ported to new Unix-like systems.
|
||||||
|
The installation procedure is described in the INSTALL file.
|
||||||
|
|
||||||
|
As with other GNU software, the latest version of Wget can be found at
|
||||||
|
the master GNU archive site ftp.gnu.org, and its mirrors. Wget
|
||||||
|
resides at <ftp://ftp.gnu.org/pub/gnu/wget/>.
|
||||||
|
|
||||||
|
Please report bugs in Wget to <bug-wget@gnu.org>.
|
||||||
|
|
||||||
|
See the file `MAILING-LIST' for information about Wget mailing lists.
|
||||||
|
Wget's home page is at <https://www.gnu.org/software/wget/>.
|
||||||
|
|
||||||
|
If you would like to contribute code for Wget, please read
|
||||||
|
https://wget.addictivecode.org/PatchGuidelines.
|
||||||
|
|
||||||
|
Wget was originally written and mainained by Hrvoje Niksic. Please see
|
||||||
|
the file AUTHORS for a list of major contributors, and the ChangeLogs
|
||||||
|
for a detailed listing of all contributions.
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
|
||||||
|
2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
|
||||||
|
USA.
|
||||||
|
|
||||||
|
Additional permission under GNU GPL version 3 section 7
|
||||||
|
|
||||||
|
If you modify this program, or any covered work, by linking or
|
||||||
|
combining it with the OpenSSL project's OpenSSL library (or a
|
||||||
|
modified version of that library), containing parts covered by the
|
||||||
|
terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
|
||||||
|
grants you additional permission to convey the resulting work.
|
||||||
|
Corresponding Source for a non-source form of such a combination
|
||||||
|
shall include the source code for the parts of OpenSSL used as well
|
||||||
|
as that of the covered work.
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,557 @@
|
||||||
|
eval '(exit $?0)' && eval 'exec perl -wS "$0" "$@"'
|
||||||
|
& eval 'exec perl -wS "$0" $argv:q'
|
||||||
|
if 0;
|
||||||
|
# Generate a release announcement message.
|
||||||
|
|
||||||
|
my $VERSION = '2018-03-07 03:46'; # UTC
|
||||||
|
# The definition above must lie within the first 8 lines in order
|
||||||
|
# for the Emacs time-stamp write hook (at end) to update it.
|
||||||
|
# If you change this file with Emacs, please let the write hook
|
||||||
|
# do its job. Otherwise, update this string manually.
|
||||||
|
|
||||||
|
# Copyright (C) 2002-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# 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 3 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Written by Jim Meyering
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
use Getopt::Long;
|
||||||
|
use POSIX qw(strftime);
|
||||||
|
|
||||||
|
(my $ME = $0) =~ s|.*/||;
|
||||||
|
|
||||||
|
my %valid_release_types = map {$_ => 1} qw (alpha beta stable);
|
||||||
|
my @archive_suffixes = ('tar.gz', 'tar.bz2', 'tar.lzma', 'tar.xz');
|
||||||
|
my %digest_classes =
|
||||||
|
(
|
||||||
|
'md5' => (eval { require Digest::MD5; } and 'Digest::MD5'),
|
||||||
|
'sha1' => ((eval { require Digest::SHA; } and 'Digest::SHA')
|
||||||
|
or (eval { require Digest::SHA1; } and 'Digest::SHA1'))
|
||||||
|
);
|
||||||
|
my $srcdir = '.';
|
||||||
|
|
||||||
|
sub usage ($)
|
||||||
|
{
|
||||||
|
my ($exit_code) = @_;
|
||||||
|
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
|
||||||
|
if ($exit_code != 0)
|
||||||
|
{
|
||||||
|
print $STREAM "Try '$ME --help' for more information.\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
my @types = sort keys %valid_release_types;
|
||||||
|
print $STREAM <<EOF;
|
||||||
|
Usage: $ME [OPTIONS]
|
||||||
|
Generate an announcement message. Run this from builddir.
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
|
||||||
|
These options must be specified:
|
||||||
|
|
||||||
|
--release-type=TYPE TYPE must be one of @types
|
||||||
|
--package-name=PACKAGE_NAME
|
||||||
|
--previous-version=VER
|
||||||
|
--current-version=VER
|
||||||
|
--gpg-key-id=ID The GnuPG ID of the key used to sign the tarballs
|
||||||
|
--url-directory=URL_DIR
|
||||||
|
|
||||||
|
The following are optional:
|
||||||
|
|
||||||
|
--news=NEWS_FILE include the NEWS section about this release
|
||||||
|
from this NEWS_FILE; accumulates.
|
||||||
|
--srcdir=DIR where to find the NEWS_FILEs (default: $srcdir)
|
||||||
|
--bootstrap-tools=TOOL_LIST a comma-separated list of tools, e.g.,
|
||||||
|
autoconf,automake,bison,gnulib
|
||||||
|
--gnulib-version=VERSION report VERSION as the gnulib version, where
|
||||||
|
VERSION is the result of running git describe
|
||||||
|
in the gnulib source directory.
|
||||||
|
required if gnulib is in TOOL_LIST.
|
||||||
|
--no-print-checksums do not emit MD5 or SHA1 checksums
|
||||||
|
--archive-suffix=SUF add SUF to the list of archive suffixes
|
||||||
|
--mail-headers=HEADERS a space-separated list of mail headers, e.g.,
|
||||||
|
To: x\@example.com Cc: y-announce\@example.com,...
|
||||||
|
|
||||||
|
--help display this help and exit
|
||||||
|
--version output version information and exit
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
exit $exit_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
=item C<%size> = C<sizes (@file)>
|
||||||
|
|
||||||
|
Compute the sizes of the C<@file> and return them as a hash. Return
|
||||||
|
C<undef> if one of the computation failed.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub sizes (@)
|
||||||
|
{
|
||||||
|
my (@file) = @_;
|
||||||
|
|
||||||
|
my $fail = 0;
|
||||||
|
my %res;
|
||||||
|
foreach my $f (@file)
|
||||||
|
{
|
||||||
|
my $cmd = "du -h $f";
|
||||||
|
my $t = `$cmd`;
|
||||||
|
# FIXME-someday: give a better diagnostic, a la $PROCESS_STATUS
|
||||||
|
$@
|
||||||
|
and (warn "command failed: '$cmd'\n"), $fail = 1;
|
||||||
|
chomp $t;
|
||||||
|
$t =~ s/^\s*([\d.]+[MkK]).*/${1}B/;
|
||||||
|
$res{$f} = $t;
|
||||||
|
}
|
||||||
|
return $fail ? undef : %res;
|
||||||
|
}
|
||||||
|
|
||||||
|
=item C<print_locations ($title, \@url, \%size, @file)
|
||||||
|
|
||||||
|
Print a section C<$title> dedicated to the list of <@file>, which
|
||||||
|
sizes are stored in C<%size>, and which are available from the C<@url>.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub print_locations ($\@\%@)
|
||||||
|
{
|
||||||
|
my ($title, $url, $size, @file) = @_;
|
||||||
|
print "Here are the $title:\n";
|
||||||
|
foreach my $url (@{$url})
|
||||||
|
{
|
||||||
|
for my $file (@file)
|
||||||
|
{
|
||||||
|
print " $url/$file";
|
||||||
|
print " (", $$size{$file}, ")"
|
||||||
|
if exists $$size{$file};
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
=item C<print_checksums (@file)
|
||||||
|
|
||||||
|
Print the MD5 and SHA1 signature section for each C<@file>.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub print_checksums (@)
|
||||||
|
{
|
||||||
|
my (@file) = @_;
|
||||||
|
|
||||||
|
print "Here are the MD5 and SHA1 checksums:\n";
|
||||||
|
print "\n";
|
||||||
|
|
||||||
|
foreach my $meth (qw (md5 sha1))
|
||||||
|
{
|
||||||
|
my $class = $digest_classes{$meth} or next;
|
||||||
|
foreach my $f (@file)
|
||||||
|
{
|
||||||
|
open IN, '<', $f
|
||||||
|
or die "$ME: $f: cannot open for reading: $!\n";
|
||||||
|
binmode IN;
|
||||||
|
my $dig = $class->new->addfile(*IN)->hexdigest;
|
||||||
|
close IN;
|
||||||
|
print "$dig $f\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
=item C<print_news_deltas ($news_file, $prev_version, $curr_version)
|
||||||
|
|
||||||
|
Print the section of the NEWS file C<$news_file> addressing changes
|
||||||
|
between versions C<$prev_version> and C<$curr_version>.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub print_news_deltas ($$$)
|
||||||
|
{
|
||||||
|
my ($news_file, $prev_version, $curr_version) = @_;
|
||||||
|
|
||||||
|
my $news_name = $news_file;
|
||||||
|
$news_name =~ s|^\Q$srcdir\E/||;
|
||||||
|
|
||||||
|
print "\n$news_name\n\n";
|
||||||
|
|
||||||
|
# Print all lines from $news_file, starting with the first one
|
||||||
|
# that mentions $curr_version up to but not including
|
||||||
|
# the first occurrence of $prev_version.
|
||||||
|
my $in_items;
|
||||||
|
|
||||||
|
my $re_prefix = qr/(?:\* )?(?:Noteworthy c|Major c|C)(?i:hanges)/;
|
||||||
|
|
||||||
|
my $found_news;
|
||||||
|
open NEWS, '<', $news_file
|
||||||
|
or die "$ME: $news_file: cannot open for reading: $!\n";
|
||||||
|
while (defined (my $line = <NEWS>))
|
||||||
|
{
|
||||||
|
if ( ! $in_items)
|
||||||
|
{
|
||||||
|
# Match lines like these:
|
||||||
|
# * Major changes in release 5.0.1:
|
||||||
|
# * Noteworthy changes in release 6.6 (2006-11-22) [stable]
|
||||||
|
$line =~ /^$re_prefix.*(?:[^\d.]|$)\Q$curr_version\E(?:[^\d.]|$)/o
|
||||||
|
or next;
|
||||||
|
$in_items = 1;
|
||||||
|
print $line;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# This regexp must not match version numbers in NEWS items.
|
||||||
|
# For example, they might well say "introduced in 4.5.5",
|
||||||
|
# and we don't want that to match.
|
||||||
|
$line =~ /^$re_prefix.*(?:[^\d.]|$)\Q$prev_version\E(?:[^\d.]|$)/o
|
||||||
|
and last;
|
||||||
|
print $line;
|
||||||
|
$line =~ /\S/
|
||||||
|
and $found_news = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close NEWS;
|
||||||
|
|
||||||
|
$in_items
|
||||||
|
or die "$ME: $news_file: no matching lines for '$curr_version'\n";
|
||||||
|
$found_news
|
||||||
|
or die "$ME: $news_file: no news item found for '$curr_version'\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub print_changelog_deltas ($$)
|
||||||
|
{
|
||||||
|
my ($package_name, $prev_version) = @_;
|
||||||
|
|
||||||
|
# Print new ChangeLog entries.
|
||||||
|
|
||||||
|
# First find all CVS-controlled ChangeLog files.
|
||||||
|
use File::Find;
|
||||||
|
my @changelog;
|
||||||
|
find ({wanted => sub {$_ eq 'ChangeLog' && -d 'CVS'
|
||||||
|
and push @changelog, $File::Find::name}},
|
||||||
|
'.');
|
||||||
|
|
||||||
|
# If there are no ChangeLog files, we're done.
|
||||||
|
@changelog
|
||||||
|
or return;
|
||||||
|
my %changelog = map {$_ => 1} @changelog;
|
||||||
|
|
||||||
|
# Reorder the list of files so that if there are ChangeLog
|
||||||
|
# files in the specified directories, they're listed first,
|
||||||
|
# in this order:
|
||||||
|
my @dir = qw ( . src lib m4 config doc );
|
||||||
|
|
||||||
|
# A typical @changelog array might look like this:
|
||||||
|
# ./ChangeLog
|
||||||
|
# ./po/ChangeLog
|
||||||
|
# ./m4/ChangeLog
|
||||||
|
# ./lib/ChangeLog
|
||||||
|
# ./doc/ChangeLog
|
||||||
|
# ./config/ChangeLog
|
||||||
|
my @reordered;
|
||||||
|
foreach my $d (@dir)
|
||||||
|
{
|
||||||
|
my $dot_slash = $d eq '.' ? $d : "./$d";
|
||||||
|
my $target = "$dot_slash/ChangeLog";
|
||||||
|
delete $changelog{$target}
|
||||||
|
and push @reordered, $target;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Append any remaining ChangeLog files.
|
||||||
|
push @reordered, sort keys %changelog;
|
||||||
|
|
||||||
|
# Remove leading './'.
|
||||||
|
@reordered = map { s!^\./!!; $_ } @reordered;
|
||||||
|
|
||||||
|
print "\nChangeLog entries:\n\n";
|
||||||
|
# print join ("\n", @reordered), "\n";
|
||||||
|
|
||||||
|
$prev_version =~ s/\./_/g;
|
||||||
|
my $prev_cvs_tag = "\U$package_name\E-$prev_version";
|
||||||
|
|
||||||
|
my $cmd = "cvs -n diff -u -r$prev_cvs_tag -rHEAD @reordered";
|
||||||
|
open DIFF, '-|', $cmd
|
||||||
|
or die "$ME: cannot run '$cmd': $!\n";
|
||||||
|
# Print two types of lines, making minor changes:
|
||||||
|
# Lines starting with '+++ ', e.g.,
|
||||||
|
# +++ ChangeLog 22 Feb 2003 16:52:51 -0000 1.247
|
||||||
|
# and those starting with '+'.
|
||||||
|
# Don't print the others.
|
||||||
|
my $prev_printed_line_empty = 1;
|
||||||
|
while (defined (my $line = <DIFF>))
|
||||||
|
{
|
||||||
|
if ($line =~ /^\+\+\+ /)
|
||||||
|
{
|
||||||
|
my $separator = "*"x70 ."\n";
|
||||||
|
$line =~ s///;
|
||||||
|
$line =~ s/\s.*//;
|
||||||
|
$prev_printed_line_empty
|
||||||
|
or print "\n";
|
||||||
|
print $separator, $line, $separator;
|
||||||
|
}
|
||||||
|
elsif ($line =~ /^\+/)
|
||||||
|
{
|
||||||
|
$line =~ s///;
|
||||||
|
print $line;
|
||||||
|
$prev_printed_line_empty = ($line =~ /^$/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close DIFF;
|
||||||
|
|
||||||
|
# The exit code should be 1.
|
||||||
|
# Allow in case there are no modified ChangeLog entries.
|
||||||
|
$? == 256 || $? == 128
|
||||||
|
or warn "warning: '$cmd' had unexpected exit code or signal ($?)\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_tool_versions ($$)
|
||||||
|
{
|
||||||
|
my ($tool_list, $gnulib_version) = @_;
|
||||||
|
@$tool_list
|
||||||
|
or return ();
|
||||||
|
|
||||||
|
my $fail;
|
||||||
|
my @tool_version_pair;
|
||||||
|
foreach my $t (@$tool_list)
|
||||||
|
{
|
||||||
|
if ($t eq 'gnulib')
|
||||||
|
{
|
||||||
|
push @tool_version_pair, ucfirst $t . ' ' . $gnulib_version;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
# Assume that the last "word" on the first line of
|
||||||
|
# 'tool --version' output is the version string.
|
||||||
|
my ($first_line, undef) = split ("\n", `$t --version`);
|
||||||
|
if ($first_line =~ /.* (\d[\w.-]+)$/)
|
||||||
|
{
|
||||||
|
$t = ucfirst $t;
|
||||||
|
push @tool_version_pair, "$t $1";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
defined $first_line
|
||||||
|
and $first_line = '';
|
||||||
|
warn "$t: unexpected --version output\n:$first_line";
|
||||||
|
$fail = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$fail
|
||||||
|
and exit 1;
|
||||||
|
|
||||||
|
return @tool_version_pair;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
# Neutralize the locale, so that, for instance, "du" does not
|
||||||
|
# issue "1,2" instead of "1.2", what confuses our regexps.
|
||||||
|
$ENV{LC_ALL} = "C";
|
||||||
|
|
||||||
|
my $mail_headers;
|
||||||
|
my $release_type;
|
||||||
|
my $package_name;
|
||||||
|
my $prev_version;
|
||||||
|
my $curr_version;
|
||||||
|
my $gpg_key_id;
|
||||||
|
my @url_dir_list;
|
||||||
|
my @news_file;
|
||||||
|
my $bootstrap_tools;
|
||||||
|
my $gnulib_version;
|
||||||
|
my $print_checksums_p = 1;
|
||||||
|
|
||||||
|
# Reformat the warnings before displaying them.
|
||||||
|
local $SIG{__WARN__} = sub
|
||||||
|
{
|
||||||
|
my ($msg) = @_;
|
||||||
|
# Warnings from GetOptions.
|
||||||
|
$msg =~ s/Option (\w)/option --$1/;
|
||||||
|
warn "$ME: $msg";
|
||||||
|
};
|
||||||
|
|
||||||
|
GetOptions
|
||||||
|
(
|
||||||
|
'mail-headers=s' => \$mail_headers,
|
||||||
|
'release-type=s' => \$release_type,
|
||||||
|
'package-name=s' => \$package_name,
|
||||||
|
'previous-version=s' => \$prev_version,
|
||||||
|
'current-version=s' => \$curr_version,
|
||||||
|
'gpg-key-id=s' => \$gpg_key_id,
|
||||||
|
'url-directory=s' => \@url_dir_list,
|
||||||
|
'news=s' => \@news_file,
|
||||||
|
'srcdir=s' => \$srcdir,
|
||||||
|
'bootstrap-tools=s' => \$bootstrap_tools,
|
||||||
|
'gnulib-version=s' => \$gnulib_version,
|
||||||
|
'print-checksums!' => \$print_checksums_p,
|
||||||
|
'archive-suffix=s' => \@archive_suffixes,
|
||||||
|
|
||||||
|
help => sub { usage 0 },
|
||||||
|
version => sub { print "$ME version $VERSION\n"; exit },
|
||||||
|
) or usage 1;
|
||||||
|
|
||||||
|
my $fail = 0;
|
||||||
|
# Ensure that each required option is specified.
|
||||||
|
$release_type
|
||||||
|
or (warn "release type not specified\n"), $fail = 1;
|
||||||
|
$package_name
|
||||||
|
or (warn "package name not specified\n"), $fail = 1;
|
||||||
|
$prev_version
|
||||||
|
or (warn "previous version string not specified\n"), $fail = 1;
|
||||||
|
$curr_version
|
||||||
|
or (warn "current version string not specified\n"), $fail = 1;
|
||||||
|
$gpg_key_id
|
||||||
|
or (warn "GnuPG key ID not specified\n"), $fail = 1;
|
||||||
|
@url_dir_list
|
||||||
|
or (warn "URL directory name(s) not specified\n"), $fail = 1;
|
||||||
|
|
||||||
|
my @tool_list = split ',', $bootstrap_tools
|
||||||
|
if $bootstrap_tools;
|
||||||
|
|
||||||
|
grep (/^gnulib$/, @tool_list) ^ defined $gnulib_version
|
||||||
|
and (warn "when specifying gnulib as a tool, you must also specify\n"
|
||||||
|
. "--gnulib-version=V, where V is the result of running git describe\n"
|
||||||
|
. "in the gnulib source directory.\n"), $fail = 1;
|
||||||
|
|
||||||
|
!$release_type || exists $valid_release_types{$release_type}
|
||||||
|
or (warn "'$release_type': invalid release type\n"), $fail = 1;
|
||||||
|
|
||||||
|
@ARGV
|
||||||
|
and (warn "too many arguments:\n", join ("\n", @ARGV), "\n"),
|
||||||
|
$fail = 1;
|
||||||
|
$fail
|
||||||
|
and usage 1;
|
||||||
|
|
||||||
|
my $my_distdir = "$package_name-$curr_version";
|
||||||
|
|
||||||
|
my $xd = "$package_name-$prev_version-$curr_version.xdelta";
|
||||||
|
|
||||||
|
my @candidates = map { "$my_distdir.$_" } @archive_suffixes;
|
||||||
|
my @tarballs = grep {-f $_} @candidates;
|
||||||
|
|
||||||
|
@tarballs
|
||||||
|
or die "$ME: none of " . join(', ', @candidates) . " were found\n";
|
||||||
|
my @sizable = @tarballs;
|
||||||
|
-f $xd
|
||||||
|
and push @sizable, $xd;
|
||||||
|
my %size = sizes (@sizable);
|
||||||
|
%size
|
||||||
|
or exit 1;
|
||||||
|
|
||||||
|
my $headers = '';
|
||||||
|
if (defined $mail_headers)
|
||||||
|
{
|
||||||
|
($headers = $mail_headers) =~ s/\s+(\S+:)/\n$1/g;
|
||||||
|
$headers .= "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
# The markup is escaped as <\# so that when this script is sent by
|
||||||
|
# mail (or part of a diff), Gnus is not triggered.
|
||||||
|
print <<EOF;
|
||||||
|
|
||||||
|
${headers}Subject: $my_distdir released [$release_type]
|
||||||
|
|
||||||
|
<\#secure method=pgpmime mode=sign>
|
||||||
|
|
||||||
|
FIXME: put comments here
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
if (@url_dir_list == 1 && @tarballs == 1)
|
||||||
|
{
|
||||||
|
# When there's only one tarball and one URL, use a more concise form.
|
||||||
|
my $m = "$url_dir_list[0]/$tarballs[0]";
|
||||||
|
print "Here are the compressed sources and a GPG detached signature[*]:\n"
|
||||||
|
. " $m\n"
|
||||||
|
. " $m.sig\n\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print_locations ("compressed sources", @url_dir_list, %size, @tarballs);
|
||||||
|
-f $xd
|
||||||
|
and print_locations ("xdelta diffs (useful? if so, "
|
||||||
|
. "please tell bug-gnulib\@gnu.org)",
|
||||||
|
@url_dir_list, %size, $xd);
|
||||||
|
my @sig_files = map { "$_.sig" } @tarballs;
|
||||||
|
print_locations ("GPG detached signatures[*]", @url_dir_list, %size,
|
||||||
|
@sig_files);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($url_dir_list[0] =~ "gnu\.org")
|
||||||
|
{
|
||||||
|
print "Use a mirror for higher download bandwidth:\n";
|
||||||
|
if (@tarballs == 1 && $url_dir_list[0] =~ m!https://ftp\.gnu\.org/gnu/!)
|
||||||
|
{
|
||||||
|
(my $m = "$url_dir_list[0]/$tarballs[0]")
|
||||||
|
=~ s!https://ftp\.gnu\.org/gnu/!https://ftpmirror\.gnu\.org/!;
|
||||||
|
print " $m\n"
|
||||||
|
. " $m.sig\n\n";
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print " https://www.gnu.org/order/ftp.html\n\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$print_checksums_p
|
||||||
|
and print_checksums (@sizable);
|
||||||
|
|
||||||
|
print <<EOF;
|
||||||
|
[*] Use a .sig file to verify that the corresponding file (without the
|
||||||
|
.sig suffix) is intact. First, be sure to download both the .sig file
|
||||||
|
and the corresponding tarball. Then, run a command like this:
|
||||||
|
|
||||||
|
gpg --verify $tarballs[0].sig
|
||||||
|
|
||||||
|
If that command fails because you don't have the required public key,
|
||||||
|
then run this command to import it:
|
||||||
|
|
||||||
|
gpg --keyserver keys.gnupg.net --recv-keys $gpg_key_id
|
||||||
|
|
||||||
|
and rerun the 'gpg --verify' command.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
my @tool_versions = get_tool_versions (\@tool_list, $gnulib_version);
|
||||||
|
@tool_versions
|
||||||
|
and print "\nThis release was bootstrapped with the following tools:",
|
||||||
|
join ('', map {"\n $_"} @tool_versions), "\n";
|
||||||
|
|
||||||
|
print_news_deltas ($_, $prev_version, $curr_version)
|
||||||
|
foreach @news_file;
|
||||||
|
|
||||||
|
$release_type eq 'stable'
|
||||||
|
or print_changelog_deltas ($package_name, $prev_version);
|
||||||
|
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
### Setup "GNU" style for perl-mode and cperl-mode.
|
||||||
|
## Local Variables:
|
||||||
|
## mode: perl
|
||||||
|
## perl-indent-level: 2
|
||||||
|
## perl-continued-statement-offset: 2
|
||||||
|
## perl-continued-brace-offset: 0
|
||||||
|
## perl-brace-offset: 0
|
||||||
|
## perl-brace-imaginary-offset: 0
|
||||||
|
## perl-label-offset: -2
|
||||||
|
## perl-extra-newline-before-brace: t
|
||||||
|
## perl-merge-trailing-else: nil
|
||||||
|
## eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
## time-stamp-start: "my $VERSION = '"
|
||||||
|
## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
|
||||||
|
## time-stamp-time-zone: "UTC0"
|
||||||
|
## time-stamp-end: "'; # UTC"
|
||||||
|
## End:
|
|
@ -0,0 +1,140 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
# Generate build_info.c.
|
||||||
|
|
||||||
|
# Copyright (C) 2009-2011, 2018-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use Carp qw(croak);
|
||||||
|
|
||||||
|
my $file = shift @ARGV;
|
||||||
|
|
||||||
|
{
|
||||||
|
my $data = parse_config();
|
||||||
|
output_code($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub parse_config
|
||||||
|
{
|
||||||
|
my $features = [];
|
||||||
|
my $choice_key;
|
||||||
|
my $choice = [];
|
||||||
|
my $list = $features;
|
||||||
|
|
||||||
|
open(my $fh, '<', "$file.in") or die "Cannot open $file.in: $!";
|
||||||
|
|
||||||
|
while (<$fh>) {
|
||||||
|
next if /^\s*$/;
|
||||||
|
|
||||||
|
if ($list eq $choice) {
|
||||||
|
unless (s/^\s+//) {
|
||||||
|
$list = $features;
|
||||||
|
push @$features, [$choice_key, $choice];
|
||||||
|
$choice = [];
|
||||||
|
undef $choice_key;
|
||||||
|
}
|
||||||
|
} elsif (/^([A-Za-z0-9_-]+) \s+ choice:\s*$/x) {
|
||||||
|
$choice_key = $1;
|
||||||
|
$list = $choice;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/^([A-Za-z0-9_-]+) \s+ (.*)$/x) {
|
||||||
|
push @$list, [$1, $2];
|
||||||
|
} else {
|
||||||
|
croak "Can't parse line: $_";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($list eq $choice) {
|
||||||
|
push @$features, [$choice_key, $choice];
|
||||||
|
}
|
||||||
|
|
||||||
|
close($fh);
|
||||||
|
|
||||||
|
return $features;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub output_code
|
||||||
|
{
|
||||||
|
my $features = shift;
|
||||||
|
|
||||||
|
open(my $fh, '>', "$file") or die "Cannot open $file: $!";
|
||||||
|
|
||||||
|
print $fh do { local $/; <DATA> }, "\n";
|
||||||
|
print $fh <<EOC;
|
||||||
|
const char *compiled_features[] =
|
||||||
|
{
|
||||||
|
|
||||||
|
EOC
|
||||||
|
foreach my $feature (sort { $a->[0] cmp $b->[0] } @$features) {
|
||||||
|
my ($name, $check) = @$feature;
|
||||||
|
|
||||||
|
if (ref $check eq 'ARRAY') {
|
||||||
|
my ($ch_name, $ch_check) = @{ shift @$check };
|
||||||
|
print $fh <<EOC;
|
||||||
|
#if $ch_check
|
||||||
|
"+$name/$ch_name",
|
||||||
|
EOC
|
||||||
|
foreach my $choice (@$check) {
|
||||||
|
($ch_name, $ch_check) = @$choice;
|
||||||
|
|
||||||
|
print $fh <<EOC;
|
||||||
|
#elif $ch_check
|
||||||
|
"+$name/$ch_name",
|
||||||
|
EOC
|
||||||
|
}
|
||||||
|
print $fh <<EOC;
|
||||||
|
#else
|
||||||
|
"-$name",
|
||||||
|
#endif
|
||||||
|
|
||||||
|
EOC
|
||||||
|
} else {
|
||||||
|
print $fh <<EOC;
|
||||||
|
#if $check
|
||||||
|
"+$name",
|
||||||
|
#else
|
||||||
|
"-$name",
|
||||||
|
#endif
|
||||||
|
|
||||||
|
EOC
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print $fh <<EOC;
|
||||||
|
|
||||||
|
/* sentinel value */
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
EOC
|
||||||
|
}
|
||||||
|
|
||||||
|
__DATA__
|
||||||
|
/* Autogenerated by build_info.pl - DO NOT EDIT */
|
||||||
|
|
||||||
|
/* This stores global variables that are initialized with
|
||||||
|
preprocessor declarations for output with the --version flag.
|
||||||
|
|
||||||
|
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
|
||||||
|
2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. */
|
||||||
|
|
||||||
|
#include "wget.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "version.h"
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,684 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# Output a system dependent set of variables, describing how to set the
|
||||||
|
# run time search path of shared libraries in an executable.
|
||||||
|
#
|
||||||
|
# Copyright 1996-2019 Free Software Foundation, Inc.
|
||||||
|
# Taken from GNU libtool, 2001
|
||||||
|
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
|
||||||
|
#
|
||||||
|
# This file is free software; the Free Software Foundation gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
#
|
||||||
|
# The first argument passed to this file is the canonical host specification,
|
||||||
|
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
|
||||||
|
# or
|
||||||
|
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
|
||||||
|
# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
|
||||||
|
# should be set by the caller.
|
||||||
|
#
|
||||||
|
# The set of defined variables is at the end of this script.
|
||||||
|
|
||||||
|
# Known limitations:
|
||||||
|
# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
|
||||||
|
# than 256 bytes, otherwise the compiler driver will dump core. The only
|
||||||
|
# known workaround is to choose shorter directory names for the build
|
||||||
|
# directory and/or the installation directory.
|
||||||
|
|
||||||
|
# All known linkers require a '.a' archive for static linking (except MSVC,
|
||||||
|
# which needs '.lib').
|
||||||
|
libext=a
|
||||||
|
shrext=.so
|
||||||
|
|
||||||
|
host="$1"
|
||||||
|
host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
|
||||||
|
host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
|
||||||
|
host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
|
||||||
|
|
||||||
|
# Code taken from libtool.m4's _LT_CC_BASENAME.
|
||||||
|
|
||||||
|
for cc_temp in $CC""; do
|
||||||
|
case $cc_temp in
|
||||||
|
compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
|
||||||
|
distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
|
||||||
|
\-*) ;;
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
|
||||||
|
|
||||||
|
# Code taken from libtool.m4's _LT_COMPILER_PIC.
|
||||||
|
|
||||||
|
wl=
|
||||||
|
if test "$GCC" = yes; then
|
||||||
|
wl='-Wl,'
|
||||||
|
else
|
||||||
|
case "$host_os" in
|
||||||
|
aix*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
mingw* | cygwin* | pw32* | os2* | cegcc*)
|
||||||
|
;;
|
||||||
|
hpux9* | hpux10* | hpux11*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
irix5* | irix6* | nonstopux*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
linux* | k*bsd*-gnu | kopensolaris*-gnu)
|
||||||
|
case $cc_basename in
|
||||||
|
ecc*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
icc* | ifort*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
lf95*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
nagfor*)
|
||||||
|
wl='-Wl,-Wl,,'
|
||||||
|
;;
|
||||||
|
pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
ccc*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
xl* | bgxl* | bgf* | mpixl*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
como)
|
||||||
|
wl='-lopt='
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
case `$CC -V 2>&1 | sed 5q` in
|
||||||
|
*Sun\ F* | *Sun*Fortran*)
|
||||||
|
wl=
|
||||||
|
;;
|
||||||
|
*Sun\ C*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
newsos6)
|
||||||
|
;;
|
||||||
|
*nto* | *qnx*)
|
||||||
|
;;
|
||||||
|
osf3* | osf4* | osf5*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
rdos*)
|
||||||
|
;;
|
||||||
|
solaris*)
|
||||||
|
case $cc_basename in
|
||||||
|
f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
|
||||||
|
wl='-Qoption ld '
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
sunos4*)
|
||||||
|
wl='-Qoption ld '
|
||||||
|
;;
|
||||||
|
sysv4 | sysv4.2uw2* | sysv4.3*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
sysv4*MP*)
|
||||||
|
;;
|
||||||
|
sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
unicos*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
uts4*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
|
||||||
|
|
||||||
|
hardcode_libdir_flag_spec=
|
||||||
|
hardcode_libdir_separator=
|
||||||
|
hardcode_direct=no
|
||||||
|
hardcode_minus_L=no
|
||||||
|
|
||||||
|
case "$host_os" in
|
||||||
|
cygwin* | mingw* | pw32* | cegcc*)
|
||||||
|
# FIXME: the MSVC++ port hasn't been tested in a loooong time
|
||||||
|
# When not using gcc, we currently assume that we are using
|
||||||
|
# Microsoft Visual C++.
|
||||||
|
if test "$GCC" != yes; then
|
||||||
|
with_gnu_ld=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
interix*)
|
||||||
|
# we just hope/assume this is gcc and not c89 (= MSVC++)
|
||||||
|
with_gnu_ld=yes
|
||||||
|
;;
|
||||||
|
openbsd*)
|
||||||
|
with_gnu_ld=no
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
ld_shlibs=yes
|
||||||
|
if test "$with_gnu_ld" = yes; then
|
||||||
|
# Set some defaults for GNU ld with shared library support. These
|
||||||
|
# are reset later if shared libraries are not supported. Putting them
|
||||||
|
# here allows them to be overridden if necessary.
|
||||||
|
# Unlike libtool, we use -rpath here, not --rpath, since the documented
|
||||||
|
# option of GNU ld is called -rpath, not --rpath.
|
||||||
|
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||||
|
case "$host_os" in
|
||||||
|
aix[3-9]*)
|
||||||
|
# On AIX/PPC, the GNU linker is very broken
|
||||||
|
if test "$host_cpu" != ia64; then
|
||||||
|
ld_shlibs=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
amigaos*)
|
||||||
|
case "$host_cpu" in
|
||||||
|
powerpc)
|
||||||
|
;;
|
||||||
|
m68k)
|
||||||
|
hardcode_libdir_flag_spec='-L$libdir'
|
||||||
|
hardcode_minus_L=yes
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
beos*)
|
||||||
|
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
ld_shlibs=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
cygwin* | mingw* | pw32* | cegcc*)
|
||||||
|
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
||||||
|
# no search path for DLLs.
|
||||||
|
hardcode_libdir_flag_spec='-L$libdir'
|
||||||
|
if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
ld_shlibs=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
haiku*)
|
||||||
|
;;
|
||||||
|
interix[3-9]*)
|
||||||
|
hardcode_direct=no
|
||||||
|
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||||
|
;;
|
||||||
|
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
|
||||||
|
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
ld_shlibs=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
netbsd*)
|
||||||
|
;;
|
||||||
|
solaris*)
|
||||||
|
if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
|
||||||
|
ld_shlibs=no
|
||||||
|
elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
ld_shlibs=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
|
||||||
|
case `$LD -v 2>&1` in
|
||||||
|
*\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
|
||||||
|
ld_shlibs=no
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||||
|
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
|
||||||
|
else
|
||||||
|
ld_shlibs=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
sunos4*)
|
||||||
|
hardcode_direct=yes
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
ld_shlibs=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if test "$ld_shlibs" = no; then
|
||||||
|
hardcode_libdir_flag_spec=
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
case "$host_os" in
|
||||||
|
aix3*)
|
||||||
|
# Note: this linker hardcodes the directories in LIBPATH if there
|
||||||
|
# are no directories specified by -L.
|
||||||
|
hardcode_minus_L=yes
|
||||||
|
if test "$GCC" = yes; then
|
||||||
|
# Neither direct hardcoding nor static linking is supported with a
|
||||||
|
# broken collect2.
|
||||||
|
hardcode_direct=unsupported
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
aix[4-9]*)
|
||||||
|
if test "$host_cpu" = ia64; then
|
||||||
|
# On IA64, the linker does run time linking by default, so we don't
|
||||||
|
# have to do anything special.
|
||||||
|
aix_use_runtimelinking=no
|
||||||
|
else
|
||||||
|
aix_use_runtimelinking=no
|
||||||
|
# Test if we are trying to use run time linking or normal
|
||||||
|
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
|
||||||
|
# need to do runtime linking.
|
||||||
|
case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
|
||||||
|
for ld_flag in $LDFLAGS; do
|
||||||
|
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
|
||||||
|
aix_use_runtimelinking=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
hardcode_direct=yes
|
||||||
|
hardcode_libdir_separator=':'
|
||||||
|
if test "$GCC" = yes; then
|
||||||
|
case $host_os in aix4.[012]|aix4.[012].*)
|
||||||
|
collect2name=`${CC} -print-prog-name=collect2`
|
||||||
|
if test -f "$collect2name" && \
|
||||||
|
strings "$collect2name" | grep resolve_lib_name >/dev/null
|
||||||
|
then
|
||||||
|
# We have reworked collect2
|
||||||
|
:
|
||||||
|
else
|
||||||
|
# We have old collect2
|
||||||
|
hardcode_direct=unsupported
|
||||||
|
hardcode_minus_L=yes
|
||||||
|
hardcode_libdir_flag_spec='-L$libdir'
|
||||||
|
hardcode_libdir_separator=
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
# Begin _LT_AC_SYS_LIBPATH_AIX.
|
||||||
|
echo 'int main () { return 0; }' > conftest.c
|
||||||
|
${CC} ${LDFLAGS} conftest.c -o conftest
|
||||||
|
aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
|
||||||
|
}'`
|
||||||
|
if test -z "$aix_libpath"; then
|
||||||
|
aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
|
||||||
|
}'`
|
||||||
|
fi
|
||||||
|
if test -z "$aix_libpath"; then
|
||||||
|
aix_libpath="/usr/lib:/lib"
|
||||||
|
fi
|
||||||
|
rm -f conftest.c conftest
|
||||||
|
# End _LT_AC_SYS_LIBPATH_AIX.
|
||||||
|
if test "$aix_use_runtimelinking" = yes; then
|
||||||
|
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
|
||||||
|
else
|
||||||
|
if test "$host_cpu" = ia64; then
|
||||||
|
hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
|
||||||
|
else
|
||||||
|
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
amigaos*)
|
||||||
|
case "$host_cpu" in
|
||||||
|
powerpc)
|
||||||
|
;;
|
||||||
|
m68k)
|
||||||
|
hardcode_libdir_flag_spec='-L$libdir'
|
||||||
|
hardcode_minus_L=yes
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
bsdi[45]*)
|
||||||
|
;;
|
||||||
|
cygwin* | mingw* | pw32* | cegcc*)
|
||||||
|
# When not using gcc, we currently assume that we are using
|
||||||
|
# Microsoft Visual C++.
|
||||||
|
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
||||||
|
# no search path for DLLs.
|
||||||
|
hardcode_libdir_flag_spec=' '
|
||||||
|
libext=lib
|
||||||
|
;;
|
||||||
|
darwin* | rhapsody*)
|
||||||
|
hardcode_direct=no
|
||||||
|
if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
ld_shlibs=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
dgux*)
|
||||||
|
hardcode_libdir_flag_spec='-L$libdir'
|
||||||
|
;;
|
||||||
|
freebsd2.[01]*)
|
||||||
|
hardcode_direct=yes
|
||||||
|
hardcode_minus_L=yes
|
||||||
|
;;
|
||||||
|
freebsd* | dragonfly*)
|
||||||
|
hardcode_libdir_flag_spec='-R$libdir'
|
||||||
|
hardcode_direct=yes
|
||||||
|
;;
|
||||||
|
hpux9*)
|
||||||
|
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
|
||||||
|
hardcode_libdir_separator=:
|
||||||
|
hardcode_direct=yes
|
||||||
|
# hardcode_minus_L: Not really in the search PATH,
|
||||||
|
# but as the default location of the library.
|
||||||
|
hardcode_minus_L=yes
|
||||||
|
;;
|
||||||
|
hpux10*)
|
||||||
|
if test "$with_gnu_ld" = no; then
|
||||||
|
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
|
||||||
|
hardcode_libdir_separator=:
|
||||||
|
hardcode_direct=yes
|
||||||
|
# hardcode_minus_L: Not really in the search PATH,
|
||||||
|
# but as the default location of the library.
|
||||||
|
hardcode_minus_L=yes
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
hpux11*)
|
||||||
|
if test "$with_gnu_ld" = no; then
|
||||||
|
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
|
||||||
|
hardcode_libdir_separator=:
|
||||||
|
case $host_cpu in
|
||||||
|
hppa*64*|ia64*)
|
||||||
|
hardcode_direct=no
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
hardcode_direct=yes
|
||||||
|
# hardcode_minus_L: Not really in the search PATH,
|
||||||
|
# but as the default location of the library.
|
||||||
|
hardcode_minus_L=yes
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
irix5* | irix6* | nonstopux*)
|
||||||
|
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||||
|
hardcode_libdir_separator=:
|
||||||
|
;;
|
||||||
|
netbsd*)
|
||||||
|
hardcode_libdir_flag_spec='-R$libdir'
|
||||||
|
hardcode_direct=yes
|
||||||
|
;;
|
||||||
|
newsos6)
|
||||||
|
hardcode_direct=yes
|
||||||
|
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||||
|
hardcode_libdir_separator=:
|
||||||
|
;;
|
||||||
|
*nto* | *qnx*)
|
||||||
|
;;
|
||||||
|
openbsd*)
|
||||||
|
if test -f /usr/libexec/ld.so; then
|
||||||
|
hardcode_direct=yes
|
||||||
|
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
|
||||||
|
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||||
|
else
|
||||||
|
case "$host_os" in
|
||||||
|
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
|
||||||
|
hardcode_libdir_flag_spec='-R$libdir'
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
ld_shlibs=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
os2*)
|
||||||
|
hardcode_libdir_flag_spec='-L$libdir'
|
||||||
|
hardcode_minus_L=yes
|
||||||
|
;;
|
||||||
|
osf3*)
|
||||||
|
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||||
|
hardcode_libdir_separator=:
|
||||||
|
;;
|
||||||
|
osf4* | osf5*)
|
||||||
|
if test "$GCC" = yes; then
|
||||||
|
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||||
|
else
|
||||||
|
# Both cc and cxx compiler support -rpath directly
|
||||||
|
hardcode_libdir_flag_spec='-rpath $libdir'
|
||||||
|
fi
|
||||||
|
hardcode_libdir_separator=:
|
||||||
|
;;
|
||||||
|
solaris*)
|
||||||
|
hardcode_libdir_flag_spec='-R$libdir'
|
||||||
|
;;
|
||||||
|
sunos4*)
|
||||||
|
hardcode_libdir_flag_spec='-L$libdir'
|
||||||
|
hardcode_direct=yes
|
||||||
|
hardcode_minus_L=yes
|
||||||
|
;;
|
||||||
|
sysv4)
|
||||||
|
case $host_vendor in
|
||||||
|
sni)
|
||||||
|
hardcode_direct=yes # is this really true???
|
||||||
|
;;
|
||||||
|
siemens)
|
||||||
|
hardcode_direct=no
|
||||||
|
;;
|
||||||
|
motorola)
|
||||||
|
hardcode_direct=no #Motorola manual says yes, but my tests say they lie
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
sysv4.3*)
|
||||||
|
;;
|
||||||
|
sysv4*MP*)
|
||||||
|
if test -d /usr/nec; then
|
||||||
|
ld_shlibs=yes
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
|
||||||
|
;;
|
||||||
|
sysv5* | sco3.2v5* | sco5v6*)
|
||||||
|
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
|
||||||
|
hardcode_libdir_separator=':'
|
||||||
|
;;
|
||||||
|
uts4*)
|
||||||
|
hardcode_libdir_flag_spec='-L$libdir'
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
ld_shlibs=no
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check dynamic linker characteristics
|
||||||
|
# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
|
||||||
|
# Unlike libtool.m4, here we don't care about _all_ names of the library, but
|
||||||
|
# only about the one the linker finds when passed -lNAME. This is the last
|
||||||
|
# element of library_names_spec in libtool.m4, or possibly two of them if the
|
||||||
|
# linker has special search rules.
|
||||||
|
library_names_spec= # the last element of library_names_spec in libtool.m4
|
||||||
|
libname_spec='lib$name'
|
||||||
|
case "$host_os" in
|
||||||
|
aix3*)
|
||||||
|
library_names_spec='$libname.a'
|
||||||
|
;;
|
||||||
|
aix[4-9]*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
amigaos*)
|
||||||
|
case "$host_cpu" in
|
||||||
|
powerpc*)
|
||||||
|
library_names_spec='$libname$shrext' ;;
|
||||||
|
m68k)
|
||||||
|
library_names_spec='$libname.a' ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
beos*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
bsdi[45]*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
cygwin* | mingw* | pw32* | cegcc*)
|
||||||
|
shrext=.dll
|
||||||
|
library_names_spec='$libname.dll.a $libname.lib'
|
||||||
|
;;
|
||||||
|
darwin* | rhapsody*)
|
||||||
|
shrext=.dylib
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
dgux*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
freebsd[23].*)
|
||||||
|
library_names_spec='$libname$shrext$versuffix'
|
||||||
|
;;
|
||||||
|
freebsd* | dragonfly*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
gnu*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
haiku*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
hpux9* | hpux10* | hpux11*)
|
||||||
|
case $host_cpu in
|
||||||
|
ia64*)
|
||||||
|
shrext=.so
|
||||||
|
;;
|
||||||
|
hppa*64*)
|
||||||
|
shrext=.sl
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
shrext=.sl
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
interix[3-9]*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
irix5* | irix6* | nonstopux*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
case "$host_os" in
|
||||||
|
irix5* | nonstopux*)
|
||||||
|
libsuff= shlibsuff=
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
case $LD in
|
||||||
|
*-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
|
||||||
|
*-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
|
||||||
|
*-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
|
||||||
|
*) libsuff= shlibsuff= ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
linux*oldld* | linux*aout* | linux*coff*)
|
||||||
|
;;
|
||||||
|
linux* | k*bsd*-gnu | kopensolaris*-gnu)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
knetbsd*-gnu)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
netbsd*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
newsos6)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
*nto* | *qnx*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
openbsd*)
|
||||||
|
library_names_spec='$libname$shrext$versuffix'
|
||||||
|
;;
|
||||||
|
os2*)
|
||||||
|
libname_spec='$name'
|
||||||
|
shrext=.dll
|
||||||
|
library_names_spec='$libname.a'
|
||||||
|
;;
|
||||||
|
osf3* | osf4* | osf5*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
rdos*)
|
||||||
|
;;
|
||||||
|
solaris*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
sunos4*)
|
||||||
|
library_names_spec='$libname$shrext$versuffix'
|
||||||
|
;;
|
||||||
|
sysv4 | sysv4.3*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
sysv4*MP*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
tpf*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
uts4*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
|
||||||
|
escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||||
|
shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
|
||||||
|
escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||||
|
escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||||
|
escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||||
|
|
||||||
|
LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
|
||||||
|
|
||||||
|
# How to pass a linker flag through the compiler.
|
||||||
|
wl="$escaped_wl"
|
||||||
|
|
||||||
|
# Static library suffix (normally "a").
|
||||||
|
libext="$libext"
|
||||||
|
|
||||||
|
# Shared library suffix (normally "so").
|
||||||
|
shlibext="$shlibext"
|
||||||
|
|
||||||
|
# Format of library name prefix.
|
||||||
|
libname_spec="$escaped_libname_spec"
|
||||||
|
|
||||||
|
# Library names that the linker finds when passed -lNAME.
|
||||||
|
library_names_spec="$escaped_library_names_spec"
|
||||||
|
|
||||||
|
# Flag to hardcode \$libdir into a binary during linking.
|
||||||
|
# This must work even if \$libdir does not exist.
|
||||||
|
hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
|
||||||
|
|
||||||
|
# Whether we need a single -rpath flag with a separated argument.
|
||||||
|
hardcode_libdir_separator="$hardcode_libdir_separator"
|
||||||
|
|
||||||
|
# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
|
||||||
|
# resulting binary.
|
||||||
|
hardcode_direct="$hardcode_direct"
|
||||||
|
|
||||||
|
# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
|
||||||
|
# resulting binary.
|
||||||
|
hardcode_minus_L="$hardcode_minus_L"
|
||||||
|
|
||||||
|
EOF
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,791 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# depcomp - compile a program generating dependencies as side-effects
|
||||||
|
|
||||||
|
scriptversion=2018-03-07.03; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# 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, 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
'')
|
||||||
|
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||||
|
exit 1;
|
||||||
|
;;
|
||||||
|
-h | --h*)
|
||||||
|
cat <<\EOF
|
||||||
|
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
||||||
|
|
||||||
|
Run PROGRAMS ARGS to compile a file, generating dependencies
|
||||||
|
as side-effects.
|
||||||
|
|
||||||
|
Environment variables:
|
||||||
|
depmode Dependency tracking mode.
|
||||||
|
source Source file read by 'PROGRAMS ARGS'.
|
||||||
|
object Object file output by 'PROGRAMS ARGS'.
|
||||||
|
DEPDIR directory where to store dependencies.
|
||||||
|
depfile Dependency file to output.
|
||||||
|
tmpdepfile Temporary file to use when outputting dependencies.
|
||||||
|
libtool Whether libtool is used (yes/no).
|
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "depcomp $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Get the directory component of the given path, and save it in the
|
||||||
|
# global variables '$dir'. Note that this directory component will
|
||||||
|
# be either empty or ending with a '/' character. This is deliberate.
|
||||||
|
set_dir_from ()
|
||||||
|
{
|
||||||
|
case $1 in
|
||||||
|
*/*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
|
||||||
|
*) dir=;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the suffix-stripped basename of the given path, and save it the
|
||||||
|
# global variable '$base'.
|
||||||
|
set_base_from ()
|
||||||
|
{
|
||||||
|
base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
|
||||||
|
}
|
||||||
|
|
||||||
|
# If no dependency file was actually created by the compiler invocation,
|
||||||
|
# we still have to create a dummy depfile, to avoid errors with the
|
||||||
|
# Makefile "include basename.Plo" scheme.
|
||||||
|
make_dummy_depfile ()
|
||||||
|
{
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Factor out some common post-processing of the generated depfile.
|
||||||
|
# Requires the auxiliary global variable '$tmpdepfile' to be set.
|
||||||
|
aix_post_process_depfile ()
|
||||||
|
{
|
||||||
|
# If the compiler actually managed to produce a dependency file,
|
||||||
|
# post-process it.
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
# Each line is of the form 'foo.o: dependency.h'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# $object: dependency.h
|
||||||
|
# and one to simply output
|
||||||
|
# dependency.h:
|
||||||
|
# which is needed to avoid the deleted-header problem.
|
||||||
|
{ sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
|
||||||
|
sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
|
||||||
|
} > "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
else
|
||||||
|
make_dummy_depfile
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# A tabulation character.
|
||||||
|
tab=' '
|
||||||
|
# A newline character.
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
# Character ranges might be problematic outside the C locale.
|
||||||
|
# These definitions help.
|
||||||
|
upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||||
|
lower=abcdefghijklmnopqrstuvwxyz
|
||||||
|
digits=0123456789
|
||||||
|
alpha=${upper}${lower}
|
||||||
|
|
||||||
|
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
||||||
|
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
||||||
|
depfile=${depfile-`echo "$object" |
|
||||||
|
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
||||||
|
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
||||||
|
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
|
||||||
|
# Avoid interferences from the environment.
|
||||||
|
gccflag= dashmflag=
|
||||||
|
|
||||||
|
# Some modes work just like other modes, but use different flags. We
|
||||||
|
# parameterize here, but still list the modes in the big case below,
|
||||||
|
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
||||||
|
# here, because this file can only contain one case statement.
|
||||||
|
if test "$depmode" = hp; then
|
||||||
|
# HP compiler uses -M and no extra arg.
|
||||||
|
gccflag=-M
|
||||||
|
depmode=gcc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = dashXmstdout; then
|
||||||
|
# This is just like dashmstdout with a different argument.
|
||||||
|
dashmflag=-xM
|
||||||
|
depmode=dashmstdout
|
||||||
|
fi
|
||||||
|
|
||||||
|
cygpath_u="cygpath -u -f -"
|
||||||
|
if test "$depmode" = msvcmsys; then
|
||||||
|
# This is just like msvisualcpp but w/o cygpath translation.
|
||||||
|
# Just convert the backslash-escaped backslashes to single forward
|
||||||
|
# slashes to satisfy depend.m4
|
||||||
|
cygpath_u='sed s,\\\\,/,g'
|
||||||
|
depmode=msvisualcpp
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = msvc7msys; then
|
||||||
|
# This is just like msvc7 but w/o cygpath translation.
|
||||||
|
# Just convert the backslash-escaped backslashes to single forward
|
||||||
|
# slashes to satisfy depend.m4
|
||||||
|
cygpath_u='sed s,\\\\,/,g'
|
||||||
|
depmode=msvc7
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = xlc; then
|
||||||
|
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
|
||||||
|
gccflag=-qmakedep=gcc,-MF
|
||||||
|
depmode=gcc
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$depmode" in
|
||||||
|
gcc3)
|
||||||
|
## gcc 3 implements dependency tracking that does exactly what
|
||||||
|
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
||||||
|
## it if -MD -MP comes after the -MF stuff. Hmm.
|
||||||
|
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
||||||
|
## the command line argument order; so add the flags where they
|
||||||
|
## appear in depend2.am. Note that the slowdown incurred here
|
||||||
|
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
||||||
|
*) set fnord "$@" "$arg" ;;
|
||||||
|
esac
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
done
|
||||||
|
"$@"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
mv "$tmpdepfile" "$depfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
gcc)
|
||||||
|
## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
|
||||||
|
## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
|
||||||
|
## (see the conditional assignment to $gccflag above).
|
||||||
|
## There are various ways to get dependency output from gcc. Here's
|
||||||
|
## why we pick this rather obscure method:
|
||||||
|
## - Don't want to use -MD because we'd like the dependencies to end
|
||||||
|
## up in a subdir. Having to rename by hand is ugly.
|
||||||
|
## (We might end up doing this anyway to support other compilers.)
|
||||||
|
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
||||||
|
## -MM, not -M (despite what the docs say). Also, it might not be
|
||||||
|
## supported by the other compilers which use the 'gcc' depmode.
|
||||||
|
## - Using -M directly means running the compiler twice (even worse
|
||||||
|
## than renaming).
|
||||||
|
if test -z "$gccflag"; then
|
||||||
|
gccflag=-MD,
|
||||||
|
fi
|
||||||
|
"$@" -Wp,"$gccflag$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
# The second -e expression handles DOS-style file names with drive
|
||||||
|
# letters.
|
||||||
|
sed -e 's/^[^:]*: / /' \
|
||||||
|
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
||||||
|
## This next piece of magic avoids the "deleted header file" problem.
|
||||||
|
## The problem is that when a header file which appears in a .P file
|
||||||
|
## is deleted, the dependency causes make to die (because there is
|
||||||
|
## typically no way to rebuild the header). We avoid this by adding
|
||||||
|
## dummy dependencies for each header file. Too bad gcc doesn't do
|
||||||
|
## this for us directly.
|
||||||
|
## Some versions of gcc put a space before the ':'. On the theory
|
||||||
|
## that the space means something, we add a space to the output as
|
||||||
|
## well. hp depmode also adds that space, but also prefixes the VPATH
|
||||||
|
## to the object. Take care to not repeat it in the output.
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
hp)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
sgi)
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
||||||
|
else
|
||||||
|
"$@" -MDupdate "$tmpdepfile"
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
|
||||||
|
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
# Clip off the initial element (the dependent). Don't try to be
|
||||||
|
# clever and replace this with sed code, as IRIX sed won't handle
|
||||||
|
# lines with more than a fixed number of characters (4096 in
|
||||||
|
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
||||||
|
# the IRIX cc adds comments like '#:fec' to the end of the
|
||||||
|
# dependency line.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
|
||||||
|
| tr "$nl" ' ' >> "$depfile"
|
||||||
|
echo >> "$depfile"
|
||||||
|
# The second pass generates a dummy entry for each header file.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||||
|
>> "$depfile"
|
||||||
|
else
|
||||||
|
make_dummy_depfile
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
xlc)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
aix)
|
||||||
|
# The C for AIX Compiler uses -M and outputs the dependencies
|
||||||
|
# in a .u file. In older versions, this file always lives in the
|
||||||
|
# current directory. Also, the AIX compiler puts '$object:' at the
|
||||||
|
# start of each line; $object doesn't have directory information.
|
||||||
|
# Version 6 uses the directory in both cases.
|
||||||
|
set_dir_from "$object"
|
||||||
|
set_base_from "$object"
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
tmpdepfile1=$dir$base.u
|
||||||
|
tmpdepfile2=$base.u
|
||||||
|
tmpdepfile3=$dir.libs/$base.u
|
||||||
|
"$@" -Wc,-M
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.u
|
||||||
|
tmpdepfile2=$dir$base.u
|
||||||
|
tmpdepfile3=$dir$base.u
|
||||||
|
"$@" -M
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
aix_post_process_depfile
|
||||||
|
;;
|
||||||
|
|
||||||
|
tcc)
|
||||||
|
# tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
|
||||||
|
# FIXME: That version still under development at the moment of writing.
|
||||||
|
# Make that this statement remains true also for stable, released
|
||||||
|
# versions.
|
||||||
|
# It will wrap lines (doesn't matter whether long or short) with a
|
||||||
|
# trailing '\', as in:
|
||||||
|
#
|
||||||
|
# foo.o : \
|
||||||
|
# foo.c \
|
||||||
|
# foo.h \
|
||||||
|
#
|
||||||
|
# It will put a trailing '\' even on the last line, and will use leading
|
||||||
|
# spaces rather than leading tabs (at least since its commit 0394caf7
|
||||||
|
# "Emit spaces for -MD").
|
||||||
|
"$@" -MD -MF "$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
# Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
|
||||||
|
# We have to change lines of the first kind to '$object: \'.
|
||||||
|
sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
|
||||||
|
# And for each line of the second kind, we have to emit a 'dep.h:'
|
||||||
|
# dummy dependency, to avoid the deleted-header problem.
|
||||||
|
sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
## The order of this option in the case statement is important, since the
|
||||||
|
## shell code in configure will try each of these formats in the order
|
||||||
|
## listed in this file. A plain '-MD' option would be understood by many
|
||||||
|
## compilers, so we must ensure this comes after the gcc and icc options.
|
||||||
|
pgcc)
|
||||||
|
# Portland's C compiler understands '-MD'.
|
||||||
|
# Will always output deps to 'file.d' where file is the root name of the
|
||||||
|
# source file under compilation, even if file resides in a subdirectory.
|
||||||
|
# The object file name does not affect the name of the '.d' file.
|
||||||
|
# pgcc 10.2 will output
|
||||||
|
# foo.o: sub/foo.c sub/foo.h
|
||||||
|
# and will wrap long lines using '\' :
|
||||||
|
# foo.o: sub/foo.c ... \
|
||||||
|
# sub/foo.h ... \
|
||||||
|
# ...
|
||||||
|
set_dir_from "$object"
|
||||||
|
# Use the source, not the object, to determine the base name, since
|
||||||
|
# that's sadly what pgcc will do too.
|
||||||
|
set_base_from "$source"
|
||||||
|
tmpdepfile=$base.d
|
||||||
|
|
||||||
|
# For projects that build the same source file twice into different object
|
||||||
|
# files, the pgcc approach of using the *source* file root name can cause
|
||||||
|
# problems in parallel builds. Use a locking strategy to avoid stomping on
|
||||||
|
# the same $tmpdepfile.
|
||||||
|
lockdir=$base.d-lock
|
||||||
|
trap "
|
||||||
|
echo '$0: caught signal, cleaning up...' >&2
|
||||||
|
rmdir '$lockdir'
|
||||||
|
exit 1
|
||||||
|
" 1 2 13 15
|
||||||
|
numtries=100
|
||||||
|
i=$numtries
|
||||||
|
while test $i -gt 0; do
|
||||||
|
# mkdir is a portable test-and-set.
|
||||||
|
if mkdir "$lockdir" 2>/dev/null; then
|
||||||
|
# This process acquired the lock.
|
||||||
|
"$@" -MD
|
||||||
|
stat=$?
|
||||||
|
# Release the lock.
|
||||||
|
rmdir "$lockdir"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
# If the lock is being held by a different process, wait
|
||||||
|
# until the winning process is done or we timeout.
|
||||||
|
while test -d "$lockdir" && test $i -gt 0; do
|
||||||
|
sleep 1
|
||||||
|
i=`expr $i - 1`
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
i=`expr $i - 1`
|
||||||
|
done
|
||||||
|
trap - 1 2 13 15
|
||||||
|
if test $i -le 0; then
|
||||||
|
echo "$0: failed to acquire lock after $numtries attempts" >&2
|
||||||
|
echo "$0: check lockdir '$lockdir'" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
# Each line is of the form `foo.o: dependent.h',
|
||||||
|
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||||
|
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
||||||
|
# Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
# correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
hp2)
|
||||||
|
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
||||||
|
# compilers, which have integrated preprocessors. The correct option
|
||||||
|
# to use with these is +Maked; it writes dependencies to a file named
|
||||||
|
# 'foo.d', which lands next to the object file, wherever that
|
||||||
|
# happens to be.
|
||||||
|
# Much of this is similar to the tru64 case; see comments there.
|
||||||
|
set_dir_from "$object"
|
||||||
|
set_base_from "$object"
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir.libs/$base.d
|
||||||
|
"$@" -Wc,+Maked
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
"$@" +Maked
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||||
|
# Add 'dependent.h:' lines.
|
||||||
|
sed -ne '2,${
|
||||||
|
s/^ *//
|
||||||
|
s/ \\*$//
|
||||||
|
s/$/:/
|
||||||
|
p
|
||||||
|
}' "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
make_dummy_depfile
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile2"
|
||||||
|
;;
|
||||||
|
|
||||||
|
tru64)
|
||||||
|
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||||
|
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
|
||||||
|
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
||||||
|
# dependencies in 'foo.d' instead, so we check for that too.
|
||||||
|
# Subdirectories are respected.
|
||||||
|
set_dir_from "$object"
|
||||||
|
set_base_from "$object"
|
||||||
|
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
# Libtool generates 2 separate objects for the 2 libraries. These
|
||||||
|
# two compilations output dependencies in $dir.libs/$base.o.d and
|
||||||
|
# in $dir$base.o.d. We have to check for both files, because
|
||||||
|
# one of the two compilations can be disabled. We should prefer
|
||||||
|
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
||||||
|
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||||
|
# the former would cause a distcleancheck panic.
|
||||||
|
tmpdepfile1=$dir$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile2=$dir.libs/$base.o.d # Likewise.
|
||||||
|
tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||||
|
"$@" -Wc,-MD
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
tmpdepfile3=$dir$base.d
|
||||||
|
"$@" -MD
|
||||||
|
fi
|
||||||
|
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
# Same post-processing that is required for AIX mode.
|
||||||
|
aix_post_process_depfile
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvc7)
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
showIncludes=-Wc,-showIncludes
|
||||||
|
else
|
||||||
|
showIncludes=-showIncludes
|
||||||
|
fi
|
||||||
|
"$@" $showIncludes > "$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
grep -v '^Note: including file: ' "$tmpdepfile"
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
# The first sed program below extracts the file names and escapes
|
||||||
|
# backslashes for cygpath. The second sed program outputs the file
|
||||||
|
# name when reading, but also accumulates all include files in the
|
||||||
|
# hold buffer in order to output them again at the end. This only
|
||||||
|
# works with sed implementations that can handle large buffers.
|
||||||
|
sed < "$tmpdepfile" -n '
|
||||||
|
/^Note: including file: *\(.*\)/ {
|
||||||
|
s//\1/
|
||||||
|
s/\\/\\\\/g
|
||||||
|
p
|
||||||
|
}' | $cygpath_u | sort -u | sed -n '
|
||||||
|
s/ /\\ /g
|
||||||
|
s/\(.*\)/'"$tab"'\1 \\/p
|
||||||
|
s/.\(.*\) \\/\1:/
|
||||||
|
H
|
||||||
|
$ {
|
||||||
|
s/.*/'"$tab"'/
|
||||||
|
G
|
||||||
|
p
|
||||||
|
}' >> "$depfile"
|
||||||
|
echo >> "$depfile" # make sure the fragment doesn't end with a backslash
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvc7msys)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
#nosideeffect)
|
||||||
|
# This comment above is used by automake to tell side-effect
|
||||||
|
# dependency tracking mechanisms from slower ones.
|
||||||
|
|
||||||
|
dashmstdout)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout, regardless of -o.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove '-o $object'.
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
test -z "$dashmflag" && dashmflag=-M
|
||||||
|
# Require at least two characters before searching for ':'
|
||||||
|
# in the target name. This is to cope with DOS-style filenames:
|
||||||
|
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
|
||||||
|
"$@" $dashmflag |
|
||||||
|
sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
cat < "$tmpdepfile" > "$depfile"
|
||||||
|
# Some versions of the HPUX 10.20 sed can't process this sed invocation
|
||||||
|
# correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
dashXmstdout)
|
||||||
|
# This case only exists to satisfy depend.m4. It is never actually
|
||||||
|
# run, as this mode is specially recognized in the preamble.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
makedepend)
|
||||||
|
"$@" || exit $?
|
||||||
|
# Remove any Libtool call
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
# X makedepend
|
||||||
|
shift
|
||||||
|
cleared=no eat=no
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $cleared in
|
||||||
|
no)
|
||||||
|
set ""; shift
|
||||||
|
cleared=yes ;;
|
||||||
|
esac
|
||||||
|
if test $eat = yes; then
|
||||||
|
eat=no
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
case "$arg" in
|
||||||
|
-D*|-I*)
|
||||||
|
set fnord "$@" "$arg"; shift ;;
|
||||||
|
# Strip any option that makedepend may not understand. Remove
|
||||||
|
# the object too, otherwise makedepend will parse it as a source file.
|
||||||
|
-arch)
|
||||||
|
eat=yes ;;
|
||||||
|
-*|$object)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"; shift ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
||||||
|
touch "$tmpdepfile"
|
||||||
|
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
||||||
|
rm -f "$depfile"
|
||||||
|
# makedepend may prepend the VPATH from the source file name to the object.
|
||||||
|
# No need to regex-escape $object, excess matching of '.' is harmless.
|
||||||
|
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
|
||||||
|
# Some versions of the HPUX 10.20 sed can't process the last invocation
|
||||||
|
# correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed '1,2d' "$tmpdepfile" \
|
||||||
|
| tr ' ' "$nl" \
|
||||||
|
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
||||||
|
;;
|
||||||
|
|
||||||
|
cpp)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove '-o $object'.
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
"$@" -E \
|
||||||
|
| sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||||
|
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||||
|
| sed '$ s: \\$::' > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
cat < "$tmpdepfile" >> "$depfile"
|
||||||
|
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvisualcpp)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case "$arg" in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
||||||
|
set fnord "$@"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
"$@" -E 2>/dev/null |
|
||||||
|
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
||||||
|
echo "$tab" >> "$depfile"
|
||||||
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvcmsys)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
none)
|
||||||
|
exec "$@"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Unknown depmode $depmode" 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
|
@ -0,0 +1,228 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Print a version string.
|
||||||
|
scriptversion=2018-03-07.03; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 2007-2019 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# 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 3 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# This script is derived from GIT-VERSION-GEN from GIT: https://git-scm.com/.
|
||||||
|
# It may be run two ways:
|
||||||
|
# - from a git repository in which the "git describe" command below
|
||||||
|
# produces useful output (thus requiring at least one signed tag)
|
||||||
|
# - from a non-git-repo directory containing a .tarball-version file, which
|
||||||
|
# presumes this script is invoked like "./git-version-gen .tarball-version".
|
||||||
|
|
||||||
|
# In order to use intra-version strings in your project, you will need two
|
||||||
|
# separate generated version string files:
|
||||||
|
#
|
||||||
|
# .tarball-version - present only in a distribution tarball, and not in
|
||||||
|
# a checked-out repository. Created with contents that were learned at
|
||||||
|
# the last time autoconf was run, and used by git-version-gen. Must not
|
||||||
|
# be present in either $(srcdir) or $(builddir) for git-version-gen to
|
||||||
|
# give accurate answers during normal development with a checked out tree,
|
||||||
|
# but must be present in a tarball when there is no version control system.
|
||||||
|
# Therefore, it cannot be used in any dependencies. GNUmakefile has
|
||||||
|
# hooks to force a reconfigure at distribution time to get the value
|
||||||
|
# correct, without penalizing normal development with extra reconfigures.
|
||||||
|
#
|
||||||
|
# .version - present in a checked-out repository and in a distribution
|
||||||
|
# tarball. Usable in dependencies, particularly for files that don't
|
||||||
|
# want to depend on config.h but do want to track version changes.
|
||||||
|
# Delete this file prior to any autoconf run where you want to rebuild
|
||||||
|
# files to pick up a version string change; and leave it stale to
|
||||||
|
# minimize rebuild time after unrelated changes to configure sources.
|
||||||
|
#
|
||||||
|
# As with any generated file in a VC'd directory, you should add
|
||||||
|
# /.version to .gitignore, so that you don't accidentally commit it.
|
||||||
|
# .tarball-version is never generated in a VC'd directory, so needn't
|
||||||
|
# be listed there.
|
||||||
|
#
|
||||||
|
# Use the following line in your configure.ac, so that $(VERSION) will
|
||||||
|
# automatically be up-to-date each time configure is run (and note that
|
||||||
|
# since configure.ac no longer includes a version string, Makefile rules
|
||||||
|
# should not depend on configure.ac for version updates).
|
||||||
|
#
|
||||||
|
# AC_INIT([GNU project],
|
||||||
|
# m4_esyscmd([build-aux/git-version-gen .tarball-version]),
|
||||||
|
# [bug-project@example])
|
||||||
|
#
|
||||||
|
# Then use the following lines in your Makefile.am, so that .version
|
||||||
|
# will be present for dependencies, and so that .version and
|
||||||
|
# .tarball-version will exist in distribution tarballs.
|
||||||
|
#
|
||||||
|
# EXTRA_DIST = $(top_srcdir)/.version
|
||||||
|
# BUILT_SOURCES = $(top_srcdir)/.version
|
||||||
|
# $(top_srcdir)/.version:
|
||||||
|
# echo $(VERSION) > $@-t && mv $@-t $@
|
||||||
|
# dist-hook:
|
||||||
|
# echo $(VERSION) > $(distdir)/.tarball-version
|
||||||
|
|
||||||
|
|
||||||
|
me=$0
|
||||||
|
|
||||||
|
year=`expr "$scriptversion" : '\([^-]*\)'`
|
||||||
|
version="git-version-gen $scriptversion
|
||||||
|
|
||||||
|
Copyright $year Free Software Foundation, Inc.
|
||||||
|
There is NO warranty. You may redistribute this software
|
||||||
|
under the terms of the GNU General Public License.
|
||||||
|
For more information about these matters, see the files named COPYING."
|
||||||
|
|
||||||
|
usage="\
|
||||||
|
Usage: $me [OPTION]... \$srcdir/.tarball-version [TAG-NORMALIZATION-SED-SCRIPT]
|
||||||
|
Print a version string.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
--prefix PREFIX prefix of git tags (default 'v')
|
||||||
|
--fallback VERSION
|
||||||
|
fallback version to use if \"git --version\" fails
|
||||||
|
|
||||||
|
--help display this help and exit
|
||||||
|
--version output version information and exit
|
||||||
|
|
||||||
|
Running without arguments will suffice in most cases."
|
||||||
|
|
||||||
|
prefix=v
|
||||||
|
fallback=
|
||||||
|
|
||||||
|
while test $# -gt 0; do
|
||||||
|
case $1 in
|
||||||
|
--help) echo "$usage"; exit 0;;
|
||||||
|
--version) echo "$version"; exit 0;;
|
||||||
|
--prefix) shift; prefix=${1?};;
|
||||||
|
--fallback) shift; fallback=${1?};;
|
||||||
|
-*)
|
||||||
|
echo "$0: Unknown option '$1'." >&2
|
||||||
|
echo "$0: Try '--help' for more information." >&2
|
||||||
|
exit 1;;
|
||||||
|
*)
|
||||||
|
if test "x$tarball_version_file" = x; then
|
||||||
|
tarball_version_file="$1"
|
||||||
|
elif test "x$tag_sed_script" = x; then
|
||||||
|
tag_sed_script="$1"
|
||||||
|
else
|
||||||
|
echo "$0: extra non-option argument '$1'." >&2
|
||||||
|
exit 1
|
||||||
|
fi;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if test "x$tarball_version_file" = x; then
|
||||||
|
echo "$usage"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
tag_sed_script="${tag_sed_script:-s/x/x/}"
|
||||||
|
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
|
||||||
|
# Avoid meddling by environment variable of the same name.
|
||||||
|
v=
|
||||||
|
v_from_git=
|
||||||
|
|
||||||
|
# First see if there is a tarball-only version file.
|
||||||
|
# then try "git describe", then default.
|
||||||
|
if test -f $tarball_version_file
|
||||||
|
then
|
||||||
|
v=`cat $tarball_version_file` || v=
|
||||||
|
case $v in
|
||||||
|
*$nl*) v= ;; # reject multi-line output
|
||||||
|
[0-9]*) ;;
|
||||||
|
*) v= ;;
|
||||||
|
esac
|
||||||
|
test "x$v" = x \
|
||||||
|
&& echo "$0: WARNING: $tarball_version_file is missing or damaged" 1>&2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$v" != x
|
||||||
|
then
|
||||||
|
: # use $v
|
||||||
|
# Otherwise, if there is at least one git commit involving the working
|
||||||
|
# directory, and "git describe" output looks sensible, use that to
|
||||||
|
# derive a version string.
|
||||||
|
elif test "`git log -1 --pretty=format:x . 2>&1`" = x \
|
||||||
|
&& v=`git describe --abbrev=4 --match="$prefix*" HEAD 2>/dev/null \
|
||||||
|
|| git describe --abbrev=4 HEAD 2>/dev/null` \
|
||||||
|
&& v=`printf '%s\n' "$v" | sed "$tag_sed_script"` \
|
||||||
|
&& case $v in
|
||||||
|
$prefix[0-9]*) ;;
|
||||||
|
*) (exit 1) ;;
|
||||||
|
esac
|
||||||
|
then
|
||||||
|
# Is this a new git that lists number of commits since the last
|
||||||
|
# tag or the previous older version that did not?
|
||||||
|
# Newer: v6.10-77-g0f8faeb
|
||||||
|
# Older: v6.10-g0f8faeb
|
||||||
|
vprefix=`expr "X$v" : 'X\(.*\)-g[^-]*$'` || vprefix=$v
|
||||||
|
case $vprefix in
|
||||||
|
*-*) : git describe is probably okay three part flavor ;;
|
||||||
|
*)
|
||||||
|
: git describe is older two part flavor
|
||||||
|
# Recreate the number of commits and rewrite such that the
|
||||||
|
# result is the same as if we were using the newer version
|
||||||
|
# of git describe.
|
||||||
|
vtag=`echo "$v" | sed 's/-.*//'`
|
||||||
|
commit_list=`git rev-list "$vtag"..HEAD 2>/dev/null` \
|
||||||
|
|| { commit_list=failed;
|
||||||
|
echo "$0: WARNING: git rev-list failed" 1>&2; }
|
||||||
|
numcommits=`echo "$commit_list" | wc -l`
|
||||||
|
v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`;
|
||||||
|
test "$commit_list" = failed && v=UNKNOWN
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Change the penultimate "-" to ".", for version-comparing tools.
|
||||||
|
# Remove the "g" to save a byte.
|
||||||
|
v=`echo "$v" | sed 's/-\([^-]*\)-g\([^-]*\)$/.\1-\2/'`;
|
||||||
|
v_from_git=1
|
||||||
|
elif test "x$fallback" = x || git --version >/dev/null 2>&1; then
|
||||||
|
v=UNKNOWN
|
||||||
|
else
|
||||||
|
v=$fallback
|
||||||
|
fi
|
||||||
|
|
||||||
|
v=`echo "$v" |sed "s/^$prefix//"`
|
||||||
|
|
||||||
|
# Test whether to append the "-dirty" suffix only if the version
|
||||||
|
# string we're using came from git. I.e., skip the test if it's "UNKNOWN"
|
||||||
|
# or if it came from .tarball-version.
|
||||||
|
if test "x$v_from_git" != x; then
|
||||||
|
# Don't declare a version "dirty" merely because a timestamp has changed.
|
||||||
|
git update-index --refresh > /dev/null 2>&1
|
||||||
|
|
||||||
|
dirty=`exec 2>/dev/null;git diff-index --name-only HEAD` || dirty=
|
||||||
|
case "$dirty" in
|
||||||
|
'') ;;
|
||||||
|
*) # Append the suffix only if there isn't one already.
|
||||||
|
case $v in
|
||||||
|
*-dirty) ;;
|
||||||
|
*) v="$v-dirty" ;;
|
||||||
|
esac ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Omit the trailing newline, so that m4_esyscmd can use the result directly.
|
||||||
|
printf %s "$v"
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
|
@ -0,0 +1,499 @@
|
||||||
|
eval '(exit $?0)' && eval 'exec perl -wS "$0" "$@"'
|
||||||
|
& eval 'exec perl -wS "$0" $argv:q'
|
||||||
|
if 0;
|
||||||
|
# Convert git log output to ChangeLog format.
|
||||||
|
|
||||||
|
my $VERSION = '2018-03-07 03:47'; # UTC
|
||||||
|
# The definition above must lie within the first 8 lines in order
|
||||||
|
# for the Emacs time-stamp write hook (at end) to update it.
|
||||||
|
# If you change this file with Emacs, please let the write hook
|
||||||
|
# do its job. Otherwise, update this string manually.
|
||||||
|
|
||||||
|
# Copyright (C) 2008-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# 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 3 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Written by Jim Meyering
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Getopt::Long;
|
||||||
|
use POSIX qw(strftime);
|
||||||
|
|
||||||
|
(my $ME = $0) =~ s|.*/||;
|
||||||
|
|
||||||
|
# use File::Coda; # https://meyering.net/code/Coda/
|
||||||
|
END {
|
||||||
|
defined fileno STDOUT or return;
|
||||||
|
close STDOUT and return;
|
||||||
|
warn "$ME: failed to close standard output: $!\n";
|
||||||
|
$? ||= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub usage ($)
|
||||||
|
{
|
||||||
|
my ($exit_code) = @_;
|
||||||
|
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
|
||||||
|
if ($exit_code != 0)
|
||||||
|
{
|
||||||
|
print $STREAM "Try '$ME --help' for more information.\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print $STREAM <<EOF;
|
||||||
|
Usage: $ME [OPTIONS] [ARGS]
|
||||||
|
|
||||||
|
Convert git log output to ChangeLog format. If present, any ARGS
|
||||||
|
are passed to "git log". To avoid ARGS being parsed as options to
|
||||||
|
$ME, they may be preceded by '--'.
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
|
||||||
|
--amend=FILE FILE maps from an SHA1 to perl code (i.e., s/old/new/) that
|
||||||
|
makes a change to SHA1's commit log text or metadata.
|
||||||
|
--append-dot append a dot to the first line of each commit message if
|
||||||
|
there is no other punctuation or blank at the end.
|
||||||
|
--no-cluster never cluster commit messages under the same date/author
|
||||||
|
header; the default is to cluster adjacent commit messages
|
||||||
|
if their headers are the same and neither commit message
|
||||||
|
contains multiple paragraphs.
|
||||||
|
--srcdir=DIR the root of the source tree, from which the .git/
|
||||||
|
directory can be derived.
|
||||||
|
--since=DATE convert only the logs since DATE;
|
||||||
|
the default is to convert all log entries.
|
||||||
|
--until=DATE convert only the logs older than DATE.
|
||||||
|
--ignore-matching=PAT ignore commit messages whose first lines match PAT.
|
||||||
|
--ignore-line=PAT ignore lines of commit messages that match PAT.
|
||||||
|
--format=FMT set format string for commit subject and body;
|
||||||
|
see 'man git-log' for the list of format metacharacters;
|
||||||
|
the default is '%s%n%b%n'
|
||||||
|
--strip-tab remove one additional leading TAB from commit message lines.
|
||||||
|
--strip-cherry-pick remove data inserted by "git cherry-pick";
|
||||||
|
this includes the "cherry picked from commit ..." line,
|
||||||
|
and the possible final "Conflicts:" paragraph.
|
||||||
|
--help display this help and exit
|
||||||
|
--version output version information and exit
|
||||||
|
|
||||||
|
EXAMPLE:
|
||||||
|
|
||||||
|
$ME --since=2008-01-01 > ChangeLog
|
||||||
|
$ME -- -n 5 foo > last-5-commits-to-branch-foo
|
||||||
|
|
||||||
|
SPECIAL SYNTAX:
|
||||||
|
|
||||||
|
The following types of strings are interpreted specially when they appear
|
||||||
|
at the beginning of a log message line. They are not copied to the output.
|
||||||
|
|
||||||
|
Copyright-paperwork-exempt: Yes
|
||||||
|
Append the "(tiny change)" notation to the usual "date name email"
|
||||||
|
ChangeLog header to mark a change that does not require a copyright
|
||||||
|
assignment.
|
||||||
|
Co-authored-by: Joe User <user\@example.com>
|
||||||
|
List the specified name and email address on a second
|
||||||
|
ChangeLog header, denoting a co-author.
|
||||||
|
Signed-off-by: Joe User <user\@example.com>
|
||||||
|
These lines are simply elided.
|
||||||
|
|
||||||
|
In a FILE specified via --amend, comment lines (starting with "#") are ignored.
|
||||||
|
FILE must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1 (alone on
|
||||||
|
a line) referring to a commit in the current project, and CODE refers to one
|
||||||
|
or more consecutive lines of Perl code. Pairs must be separated by one or
|
||||||
|
more blank line.
|
||||||
|
|
||||||
|
Here is sample input for use with --amend=FILE, from coreutils:
|
||||||
|
|
||||||
|
3a169f4c5d9159283548178668d2fae6fced3030
|
||||||
|
# fix typo in title:
|
||||||
|
s/all tile types/all file types/
|
||||||
|
|
||||||
|
1379ed974f1fa39b12e2ffab18b3f7a607082202
|
||||||
|
# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself.
|
||||||
|
# Change the author to be Paul. Note the escaped "@":
|
||||||
|
s,Jim .*>,Paul Eggert <eggert\\\@cs.ucla.edu>,
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
exit $exit_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
# If the string $S is a well-behaved file name, simply return it.
|
||||||
|
# If it contains white space, quotes, etc., quote it, and return the new string.
|
||||||
|
sub shell_quote($)
|
||||||
|
{
|
||||||
|
my ($s) = @_;
|
||||||
|
if ($s =~ m![^\w+/.,-]!)
|
||||||
|
{
|
||||||
|
# Convert each single quote to '\''
|
||||||
|
$s =~ s/\'/\'\\\'\'/g;
|
||||||
|
# Then single quote the string.
|
||||||
|
$s = "'$s'";
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub quoted_cmd(@)
|
||||||
|
{
|
||||||
|
return join (' ', map {shell_quote $_} @_);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse file F.
|
||||||
|
# Comment lines (starting with "#") are ignored.
|
||||||
|
# F must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1
|
||||||
|
# (alone on a line) referring to a commit in the current project, and
|
||||||
|
# CODE refers to one or more consecutive lines of Perl code.
|
||||||
|
# Pairs must be separated by one or more blank line.
|
||||||
|
sub parse_amend_file($)
|
||||||
|
{
|
||||||
|
my ($f) = @_;
|
||||||
|
|
||||||
|
open F, '<', $f
|
||||||
|
or die "$ME: $f: failed to open for reading: $!\n";
|
||||||
|
|
||||||
|
my $fail;
|
||||||
|
my $h = {};
|
||||||
|
my $in_code = 0;
|
||||||
|
my $sha;
|
||||||
|
while (defined (my $line = <F>))
|
||||||
|
{
|
||||||
|
$line =~ /^\#/
|
||||||
|
and next;
|
||||||
|
chomp $line;
|
||||||
|
$line eq ''
|
||||||
|
and $in_code = 0, next;
|
||||||
|
|
||||||
|
if (!$in_code)
|
||||||
|
{
|
||||||
|
$line =~ /^([0-9a-fA-F]{40})$/
|
||||||
|
or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"),
|
||||||
|
$fail = 1, next;
|
||||||
|
$sha = lc $1;
|
||||||
|
$in_code = 1;
|
||||||
|
exists $h->{$sha}
|
||||||
|
and (warn "$ME: $f:$.: duplicate SHA1\n"),
|
||||||
|
$fail = 1, next;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$h->{$sha} ||= '';
|
||||||
|
$h->{$sha} .= "$line\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close F;
|
||||||
|
|
||||||
|
$fail
|
||||||
|
and exit 1;
|
||||||
|
|
||||||
|
return $h;
|
||||||
|
}
|
||||||
|
|
||||||
|
# git_dir_option $SRCDIR
|
||||||
|
#
|
||||||
|
# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR
|
||||||
|
# is undef). Return as a list (0 or 1 element).
|
||||||
|
sub git_dir_option($)
|
||||||
|
{
|
||||||
|
my ($srcdir) = @_;
|
||||||
|
my @res = ();
|
||||||
|
if (defined $srcdir)
|
||||||
|
{
|
||||||
|
my $qdir = shell_quote $srcdir;
|
||||||
|
my $cmd = "cd $qdir && git rev-parse --show-toplevel";
|
||||||
|
my $qcmd = shell_quote $cmd;
|
||||||
|
my $git_dir = qx($cmd);
|
||||||
|
defined $git_dir
|
||||||
|
or die "$ME: cannot run $qcmd: $!\n";
|
||||||
|
$? == 0
|
||||||
|
or die "$ME: $qcmd had unexpected exit code or signal ($?)\n";
|
||||||
|
chomp $git_dir;
|
||||||
|
push @res, "--git-dir=$git_dir/.git";
|
||||||
|
}
|
||||||
|
@res;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
my $since_date;
|
||||||
|
my $until_date;
|
||||||
|
my $format_string = '%s%n%b%n';
|
||||||
|
my $amend_file;
|
||||||
|
my $append_dot = 0;
|
||||||
|
my $cluster = 1;
|
||||||
|
my $ignore_matching;
|
||||||
|
my $ignore_line;
|
||||||
|
my $strip_tab = 0;
|
||||||
|
my $strip_cherry_pick = 0;
|
||||||
|
my $srcdir;
|
||||||
|
GetOptions
|
||||||
|
(
|
||||||
|
help => sub { usage 0 },
|
||||||
|
version => sub { print "$ME version $VERSION\n"; exit },
|
||||||
|
'since=s' => \$since_date,
|
||||||
|
'until=s' => \$until_date,
|
||||||
|
'format=s' => \$format_string,
|
||||||
|
'amend=s' => \$amend_file,
|
||||||
|
'append-dot' => \$append_dot,
|
||||||
|
'cluster!' => \$cluster,
|
||||||
|
'ignore-matching=s' => \$ignore_matching,
|
||||||
|
'ignore-line=s' => \$ignore_line,
|
||||||
|
'strip-tab' => \$strip_tab,
|
||||||
|
'strip-cherry-pick' => \$strip_cherry_pick,
|
||||||
|
'srcdir=s' => \$srcdir,
|
||||||
|
) or usage 1;
|
||||||
|
|
||||||
|
defined $since_date
|
||||||
|
and unshift @ARGV, "--since=$since_date";
|
||||||
|
defined $until_date
|
||||||
|
and unshift @ARGV, "--until=$until_date";
|
||||||
|
|
||||||
|
# This is a hash that maps an SHA1 to perl code (i.e., s/old/new/)
|
||||||
|
# that makes a correction in the log or attribution of that commit.
|
||||||
|
my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {};
|
||||||
|
|
||||||
|
my @cmd = ('git',
|
||||||
|
git_dir_option $srcdir,
|
||||||
|
qw(log --log-size),
|
||||||
|
'--pretty=format:%H:%ct %an <%ae>%n%n'.$format_string, @ARGV);
|
||||||
|
open PIPE, '-|', @cmd
|
||||||
|
or die ("$ME: failed to run '". quoted_cmd (@cmd) ."': $!\n"
|
||||||
|
. "(Is your Git too old? Version 1.5.1 or later is required.)\n");
|
||||||
|
|
||||||
|
my $prev_multi_paragraph;
|
||||||
|
my $prev_date_line = '';
|
||||||
|
my @prev_coauthors = ();
|
||||||
|
my @skipshas = ();
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
defined (my $in = <PIPE>)
|
||||||
|
or last;
|
||||||
|
$in =~ /^log size (\d+)$/
|
||||||
|
or die "$ME:$.: Invalid line (expected log size):\n$in";
|
||||||
|
my $log_nbytes = $1;
|
||||||
|
|
||||||
|
my $log;
|
||||||
|
my $n_read = read PIPE, $log, $log_nbytes;
|
||||||
|
$n_read == $log_nbytes
|
||||||
|
or die "$ME:$.: unexpected EOF\n";
|
||||||
|
|
||||||
|
# Extract leading hash.
|
||||||
|
my ($sha, $rest) = split ':', $log, 2;
|
||||||
|
defined $sha
|
||||||
|
or die "$ME:$.: malformed log entry\n";
|
||||||
|
$sha =~ /^[0-9a-fA-F]{40}$/
|
||||||
|
or die "$ME:$.: invalid SHA1: $sha\n";
|
||||||
|
|
||||||
|
my $skipflag = 0;
|
||||||
|
if (@skipshas)
|
||||||
|
{
|
||||||
|
foreach(@skipshas)
|
||||||
|
{
|
||||||
|
if ($sha =~ /^$_/)
|
||||||
|
{
|
||||||
|
$skipflag = $_;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# If this commit's log requires any transformation, do it now.
|
||||||
|
my $code = $amend_code->{$sha};
|
||||||
|
if (defined $code)
|
||||||
|
{
|
||||||
|
eval 'use Safe';
|
||||||
|
my $s = new Safe;
|
||||||
|
# Put the unpreprocessed entry into "$_".
|
||||||
|
$_ = $rest;
|
||||||
|
|
||||||
|
# Let $code operate on it, safely.
|
||||||
|
my $r = $s->reval("$code")
|
||||||
|
or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n";
|
||||||
|
|
||||||
|
# Note that we've used this entry.
|
||||||
|
delete $amend_code->{$sha};
|
||||||
|
|
||||||
|
# Update $rest upon success.
|
||||||
|
$rest = $_;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Remove lines inserted by "git cherry-pick".
|
||||||
|
if ($strip_cherry_pick)
|
||||||
|
{
|
||||||
|
$rest =~ s/^\s*Conflicts:\n.*//sm;
|
||||||
|
$rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m;
|
||||||
|
}
|
||||||
|
|
||||||
|
my @line = split /[ \t]*\n/, $rest;
|
||||||
|
my $author_line = shift @line;
|
||||||
|
defined $author_line
|
||||||
|
or die "$ME:$.: unexpected EOF\n";
|
||||||
|
$author_line =~ /^(\d+) (.*>)$/
|
||||||
|
or die "$ME:$.: Invalid line "
|
||||||
|
. "(expected date/author/email):\n$author_line\n";
|
||||||
|
|
||||||
|
# Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog
|
||||||
|
# `(tiny change)' annotation.
|
||||||
|
my $tiny = (grep (/^(?:Copyright-paperwork-exempt|Tiny-change):\s+[Yy]es$/, @line)
|
||||||
|
? ' (tiny change)' : '');
|
||||||
|
|
||||||
|
my $date_line = sprintf "%s %s$tiny\n",
|
||||||
|
strftime ("%Y-%m-%d", localtime ($1)), $2;
|
||||||
|
|
||||||
|
my @coauthors = grep /^Co-authored-by:.*$/, @line;
|
||||||
|
# Omit meta-data lines we've already interpreted.
|
||||||
|
@line = grep !/^(?:Signed-off-by:[ ].*>$
|
||||||
|
|Co-authored-by:[ ]
|
||||||
|
|Copyright-paperwork-exempt:[ ]
|
||||||
|
|Tiny-change:[ ]
|
||||||
|
)/x, @line;
|
||||||
|
|
||||||
|
# Remove leading and trailing blank lines.
|
||||||
|
if (@line)
|
||||||
|
{
|
||||||
|
while ($line[0] =~ /^\s*$/) { shift @line; }
|
||||||
|
while ($line[$#line] =~ /^\s*$/) { pop @line; }
|
||||||
|
}
|
||||||
|
|
||||||
|
# Handle Emacs gitmerge.el "skipped" commits.
|
||||||
|
# Yes, this should be controlled by an option. So sue me.
|
||||||
|
if ( grep /^(; )?Merge from /, @line )
|
||||||
|
{
|
||||||
|
my $found = 0;
|
||||||
|
foreach (@line)
|
||||||
|
{
|
||||||
|
if (grep /^The following commit.*skipped:$/, $_)
|
||||||
|
{
|
||||||
|
$found = 1;
|
||||||
|
## Reset at each merge to reduce chance of false matches.
|
||||||
|
@skipshas = ();
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
if ($found && $_ =~ /^([0-9a-fA-F]{7,}) [^ ]/)
|
||||||
|
{
|
||||||
|
push ( @skipshas, $1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ignore commits that match the --ignore-matching pattern, if specified.
|
||||||
|
if (defined $ignore_matching && @line && $line[0] =~ /$ignore_matching/)
|
||||||
|
{
|
||||||
|
$skipflag = 1;
|
||||||
|
}
|
||||||
|
elsif ($skipflag)
|
||||||
|
{
|
||||||
|
## Perhaps only warn if a pattern matches more than once?
|
||||||
|
warn "$ME: warning: skipping $sha due to $skipflag\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $skipflag)
|
||||||
|
{
|
||||||
|
if (defined $ignore_line && @line)
|
||||||
|
{
|
||||||
|
@line = grep ! /$ignore_line/, @line;
|
||||||
|
while ($line[$#line] =~ /^\s*$/) { pop @line; }
|
||||||
|
}
|
||||||
|
|
||||||
|
# Record whether there are two or more paragraphs.
|
||||||
|
my $multi_paragraph = grep /^\s*$/, @line;
|
||||||
|
|
||||||
|
# Format 'Co-authored-by: A U Thor <email@example.com>' lines in
|
||||||
|
# standard multi-author ChangeLog format.
|
||||||
|
for (@coauthors)
|
||||||
|
{
|
||||||
|
s/^Co-authored-by:\s*/\t /;
|
||||||
|
s/\s*</ </;
|
||||||
|
|
||||||
|
/<.*?@.*\..*>/
|
||||||
|
or warn "$ME: warning: missing email address for "
|
||||||
|
. substr ($_, 5) . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
# If clustering of commit messages has been disabled, if this header
|
||||||
|
# would be different from the previous date/name/etc. header,
|
||||||
|
# or if this or the previous entry consists of two or more paragraphs,
|
||||||
|
# then print the header.
|
||||||
|
if ( ! $cluster
|
||||||
|
|| $date_line ne $prev_date_line
|
||||||
|
|| "@coauthors" ne "@prev_coauthors"
|
||||||
|
|| $multi_paragraph
|
||||||
|
|| $prev_multi_paragraph)
|
||||||
|
{
|
||||||
|
$prev_date_line eq ''
|
||||||
|
or print "\n";
|
||||||
|
print $date_line;
|
||||||
|
@coauthors
|
||||||
|
and print join ("\n", @coauthors), "\n";
|
||||||
|
}
|
||||||
|
$prev_date_line = $date_line;
|
||||||
|
@prev_coauthors = @coauthors;
|
||||||
|
$prev_multi_paragraph = $multi_paragraph;
|
||||||
|
|
||||||
|
# If there were any lines
|
||||||
|
if (@line == 0)
|
||||||
|
{
|
||||||
|
warn "$ME: warning: empty commit message:\n $date_line\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ($append_dot)
|
||||||
|
{
|
||||||
|
# If the first line of the message has enough room, then
|
||||||
|
if (length $line[0] < 72)
|
||||||
|
{
|
||||||
|
# append a dot if there is no other punctuation or blank
|
||||||
|
# at the end.
|
||||||
|
$line[0] =~ /[[:punct:]\s]$/
|
||||||
|
or $line[0] .= '.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Remove one additional leading TAB from each line.
|
||||||
|
$strip_tab
|
||||||
|
and map { s/^\t// } @line;
|
||||||
|
|
||||||
|
# Prefix each non-empty line with a TAB.
|
||||||
|
@line = map { length $_ ? "\t$_" : '' } @line;
|
||||||
|
|
||||||
|
print "\n", join ("\n", @line), "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defined ($in = <PIPE>)
|
||||||
|
or last;
|
||||||
|
$in ne "\n"
|
||||||
|
and die "$ME:$.: unexpected line:\n$in";
|
||||||
|
}
|
||||||
|
|
||||||
|
close PIPE
|
||||||
|
or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n";
|
||||||
|
# FIXME-someday: include $PROCESS_STATUS in the diagnostic
|
||||||
|
|
||||||
|
# Complain about any unused entry in the --amend=F specified file.
|
||||||
|
my $fail = 0;
|
||||||
|
foreach my $sha (keys %$amend_code)
|
||||||
|
{
|
||||||
|
warn "$ME:$amend_file: unused entry: $sha\n";
|
||||||
|
$fail = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
exit $fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: perl
|
||||||
|
# indent-tabs-mode: nil
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "my $VERSION = '"
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d %02H:%02M"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "'; # UTC"
|
||||||
|
# End:
|
|
@ -0,0 +1,463 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Sign files and upload them.
|
||||||
|
|
||||||
|
scriptversion=2018-05-19.18; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 2004-2019 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# 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 3, 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Originally written by Alexandre Duret-Lutz <adl@gnu.org>.
|
||||||
|
# The master copy of this file is maintained in the gnulib Git repository.
|
||||||
|
# Please send bug reports and feature requests to bug-gnulib@gnu.org.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
GPG=gpg
|
||||||
|
# Choose the proper version of gpg, so as to avoid a
|
||||||
|
# "gpg-agent is not available in this session" error
|
||||||
|
# when gpg-agent is version 3 but gpg is still version 1.
|
||||||
|
# FIXME-2020: remove, once all major distros ship gpg version 3 as /usr/bin/gpg
|
||||||
|
gpg_agent_version=`(gpg-agent --version) 2>/dev/null | sed -e '2,$d' -e 's/^[^0-9]*//'`
|
||||||
|
case "$gpg_agent_version" in
|
||||||
|
2.*)
|
||||||
|
gpg_version=`(gpg --version) 2>/dev/null | sed -e '2,$d' -e 's/^[^0-9]*//'`
|
||||||
|
case "$gpg_version" in
|
||||||
|
1.*)
|
||||||
|
if (type gpg2) >/dev/null 2>/dev/null; then
|
||||||
|
# gpg2 is present.
|
||||||
|
GPG=gpg2
|
||||||
|
else
|
||||||
|
# gpg2 is missing. Ubuntu users should install the package 'gnupg2'.
|
||||||
|
echo "WARNING: Using 'gpg', which is too old. You should install 'gpg2'." 1>&2
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
GPG="${GPG} --batch --no-tty"
|
||||||
|
conffile=.gnuploadrc
|
||||||
|
to=
|
||||||
|
dry_run=false
|
||||||
|
replace=
|
||||||
|
symlink_files=
|
||||||
|
delete_files=
|
||||||
|
delete_symlinks=
|
||||||
|
collect_var=
|
||||||
|
dbg=
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
|
||||||
|
usage="Usage: $0 [OPTION]... [CMD] FILE... [[CMD] FILE...]
|
||||||
|
|
||||||
|
Sign all FILES, and process them at the destinations specified with --to.
|
||||||
|
If CMD is not given, it defaults to uploading. See examples below.
|
||||||
|
|
||||||
|
Commands:
|
||||||
|
--delete delete FILES from destination
|
||||||
|
--symlink create symbolic links
|
||||||
|
--rmsymlink remove symbolic links
|
||||||
|
-- treat the remaining arguments as files to upload
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--to DEST specify a destination DEST for FILES
|
||||||
|
(multiple --to options are allowed)
|
||||||
|
--user NAME sign with key NAME
|
||||||
|
--replace allow replacements of existing files
|
||||||
|
--symlink-regex[=EXPR] use sed script EXPR to compute symbolic link names
|
||||||
|
-n, --dry-run do nothing, show what would have been done
|
||||||
|
(including the constructed directive file)
|
||||||
|
--version output version information and exit
|
||||||
|
-h, --help print this help text and exit
|
||||||
|
|
||||||
|
If --symlink-regex is given without EXPR, then the link target name
|
||||||
|
is created by replacing the version information with '-latest', e.g.:
|
||||||
|
foo-1.3.4.tar.gz -> foo-latest.tar.gz
|
||||||
|
|
||||||
|
Recognized destinations are:
|
||||||
|
alpha.gnu.org:DIRECTORY
|
||||||
|
savannah.gnu.org:DIRECTORY
|
||||||
|
savannah.nongnu.org:DIRECTORY
|
||||||
|
ftp.gnu.org:DIRECTORY
|
||||||
|
build directive files and upload files by FTP
|
||||||
|
download.gnu.org.ua:{alpha|ftp}/DIRECTORY
|
||||||
|
build directive files and upload files by SFTP
|
||||||
|
[user@]host:DIRECTORY upload files with scp
|
||||||
|
|
||||||
|
Options and commands are applied in order. If the file $conffile exists
|
||||||
|
in the current working directory, its contents are prepended to the
|
||||||
|
actual command line options. Use this to keep your defaults. Comments
|
||||||
|
(#) and empty lines in $conffile are allowed.
|
||||||
|
|
||||||
|
<https://www.gnu.org/prep/maintain/html_node/Automated-FTP-Uploads.html>
|
||||||
|
gives some further background.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
1. Upload foobar-1.0.tar.gz to ftp.gnu.org:
|
||||||
|
gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz
|
||||||
|
|
||||||
|
2. Upload foobar-1.0.tar.gz and foobar-1.0.tar.xz to ftp.gnu.org:
|
||||||
|
gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz foobar-1.0.tar.xz
|
||||||
|
|
||||||
|
3. Same as above, and also create symbolic links to foobar-latest.tar.*:
|
||||||
|
gnupload --to ftp.gnu.org:foobar \\
|
||||||
|
--symlink-regex \\
|
||||||
|
foobar-1.0.tar.gz foobar-1.0.tar.xz
|
||||||
|
|
||||||
|
4. Upload foobar-0.9.90.tar.gz to two sites:
|
||||||
|
gnupload --to alpha.gnu.org:foobar \\
|
||||||
|
--to sources.redhat.com:~ftp/pub/foobar \\
|
||||||
|
foobar-0.9.90.tar.gz
|
||||||
|
|
||||||
|
5. Delete oopsbar-0.9.91.tar.gz and upload foobar-0.9.91.tar.gz
|
||||||
|
(the -- terminates the list of files to delete):
|
||||||
|
gnupload --to alpha.gnu.org:foobar \\
|
||||||
|
--to sources.redhat.com:~ftp/pub/foobar \\
|
||||||
|
--delete oopsbar-0.9.91.tar.gz \\
|
||||||
|
-- foobar-0.9.91.tar.gz
|
||||||
|
|
||||||
|
gnupload executes a program ncftpput to do the transfers; if you don't
|
||||||
|
happen to have an ncftp package installed, the ncftpput-ftp script in
|
||||||
|
the build-aux/ directory of the gnulib package
|
||||||
|
(https://savannah.gnu.org/projects/gnulib) may serve as a replacement.
|
||||||
|
|
||||||
|
Send patches and bug reports to <bug-gnulib@gnu.org>."
|
||||||
|
|
||||||
|
# Read local configuration file
|
||||||
|
if test -r "$conffile"; then
|
||||||
|
echo "$0: Reading configuration file $conffile"
|
||||||
|
conf=`sed 's/#.*$//;/^$/d' "$conffile" | tr "\015$nl" ' '`
|
||||||
|
eval set x "$conf \"\$@\""
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
while test -n "$1"; do
|
||||||
|
case $1 in
|
||||||
|
-*)
|
||||||
|
collect_var=
|
||||||
|
case $1 in
|
||||||
|
-h | --help)
|
||||||
|
echo "$usage"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
--to)
|
||||||
|
if test -z "$2"; then
|
||||||
|
echo "$0: Missing argument for --to" 1>&2
|
||||||
|
exit 1
|
||||||
|
elif echo "$2" | grep 'ftp-upload\.gnu\.org' >/dev/null; then
|
||||||
|
echo "$0: Use ftp.gnu.org:PKGNAME or alpha.gnu.org:PKGNAME" >&2
|
||||||
|
echo "$0: for the destination, not ftp-upload.gnu.org (which" >&2
|
||||||
|
echo "$0: is used for direct ftp uploads, not with gnupload)." >&2
|
||||||
|
echo "$0: See --help and its examples if need be." >&2
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
to="$to $2"
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
--user)
|
||||||
|
if test -z "$2"; then
|
||||||
|
echo "$0: Missing argument for --user" 1>&2
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
GPG="$GPG --local-user $2"
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
--delete)
|
||||||
|
collect_var=delete_files
|
||||||
|
;;
|
||||||
|
--replace)
|
||||||
|
replace="replace: true"
|
||||||
|
;;
|
||||||
|
--rmsymlink)
|
||||||
|
collect_var=delete_symlinks
|
||||||
|
;;
|
||||||
|
--symlink-regex=*)
|
||||||
|
symlink_expr=`expr "$1" : '[^=]*=\(.*\)'`
|
||||||
|
;;
|
||||||
|
--symlink-regex)
|
||||||
|
symlink_expr='s|-[0-9][0-9\.]*\(-[0-9][0-9]*\)\{0,1\}\.|-latest.|'
|
||||||
|
;;
|
||||||
|
--symlink)
|
||||||
|
collect_var=symlink_files
|
||||||
|
;;
|
||||||
|
-n | --dry-run)
|
||||||
|
dry_run=:
|
||||||
|
;;
|
||||||
|
--version)
|
||||||
|
echo "gnupload $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
--)
|
||||||
|
shift
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
echo "$0: Unknown option '$1', try '$0 --help'" 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if test -z "$collect_var"; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
eval "$collect_var=\"\$$collect_var $1\""
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
dprint()
|
||||||
|
{
|
||||||
|
echo "Running $* ..."
|
||||||
|
}
|
||||||
|
|
||||||
|
if $dry_run; then
|
||||||
|
dbg=dprint
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$to"; then
|
||||||
|
echo "$0: Missing destination sites" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$symlink_files"; then
|
||||||
|
x=`echo "$symlink_files" | sed 's/[^ ]//g;s/ //g'`
|
||||||
|
if test -n "$x"; then
|
||||||
|
echo "$0: Odd number of symlink arguments" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# = 0; then
|
||||||
|
if test -z "${symlink_files}${delete_files}${delete_symlinks}"; then
|
||||||
|
echo "$0: No file to upload" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Make sure all files exist. We don't want to ask
|
||||||
|
# for the passphrase if the script will fail.
|
||||||
|
for file
|
||||||
|
do
|
||||||
|
if test ! -f $file; then
|
||||||
|
echo "$0: Cannot find '$file'" 1>&2
|
||||||
|
exit 1
|
||||||
|
elif test -n "$symlink_expr"; then
|
||||||
|
linkname=`echo $file | sed "$symlink_expr"`
|
||||||
|
if test -z "$linkname"; then
|
||||||
|
echo "$0: symlink expression produces empty results" >&2
|
||||||
|
exit 1
|
||||||
|
elif test "$linkname" = $file; then
|
||||||
|
echo "$0: symlink expression does not alter file name" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure passphrase is not exported in the environment.
|
||||||
|
unset passphrase
|
||||||
|
unset passphrase_fd_0
|
||||||
|
GNUPGHOME=${GNUPGHOME:-$HOME/.gnupg}
|
||||||
|
|
||||||
|
# Reset PATH to be sure that echo is a built-in. We will later use
|
||||||
|
# 'echo $passphrase' to output the passphrase, so it is important that
|
||||||
|
# it is a built-in (third-party programs tend to appear in 'ps'
|
||||||
|
# listings with their arguments...).
|
||||||
|
# Remember this script runs with 'set -e', so if echo is not built-in
|
||||||
|
# it will exit now.
|
||||||
|
if $dry_run || grep -q "^use-agent" $GNUPGHOME/gpg.conf; then :; else
|
||||||
|
PATH=/empty echo -n "Enter GPG passphrase: "
|
||||||
|
stty -echo
|
||||||
|
read -r passphrase
|
||||||
|
stty echo
|
||||||
|
echo
|
||||||
|
passphrase_fd_0="--passphrase-fd 0"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -ne 0; then
|
||||||
|
for file
|
||||||
|
do
|
||||||
|
echo "Signing $file ..."
|
||||||
|
rm -f $file.sig
|
||||||
|
echo "$passphrase" | $dbg $GPG $passphrase_fd_0 -ba -o $file.sig $file
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# mkdirective DESTDIR BASE FILE STMT
|
||||||
|
# Arguments: See upload, below
|
||||||
|
mkdirective ()
|
||||||
|
{
|
||||||
|
stmt="$4"
|
||||||
|
if test -n "$3"; then
|
||||||
|
stmt="
|
||||||
|
filename: $3$stmt"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat >${2}.directive<<EOF
|
||||||
|
version: 1.2
|
||||||
|
directory: $1
|
||||||
|
comment: gnupload v. $scriptversion$stmt
|
||||||
|
EOF
|
||||||
|
if $dry_run; then
|
||||||
|
echo "File ${2}.directive:"
|
||||||
|
cat ${2}.directive
|
||||||
|
echo "File ${2}.directive:" | sed 's/./-/g'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
mksymlink ()
|
||||||
|
{
|
||||||
|
while test $# -ne 0
|
||||||
|
do
|
||||||
|
echo "symlink: $1 $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# upload DEST DESTDIR BASE FILE STMT FILES
|
||||||
|
# Arguments:
|
||||||
|
# DEST Destination site;
|
||||||
|
# DESTDIR Destination directory;
|
||||||
|
# BASE Base name for the directive file;
|
||||||
|
# FILE Name of the file to distribute (may be empty);
|
||||||
|
# STMT Additional statements for the directive file;
|
||||||
|
# FILES List of files to upload.
|
||||||
|
upload ()
|
||||||
|
{
|
||||||
|
dest=$1
|
||||||
|
destdir=$2
|
||||||
|
base=$3
|
||||||
|
file=$4
|
||||||
|
stmt=$5
|
||||||
|
files=$6
|
||||||
|
|
||||||
|
rm -f $base.directive $base.directive.asc
|
||||||
|
case $dest in
|
||||||
|
alpha.gnu.org:*)
|
||||||
|
mkdirective "$destdir" "$base" "$file" "$stmt"
|
||||||
|
echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
|
||||||
|
$dbg ncftpput ftp-upload.gnu.org /incoming/alpha $files $base.directive.asc
|
||||||
|
;;
|
||||||
|
ftp.gnu.org:*)
|
||||||
|
mkdirective "$destdir" "$base" "$file" "$stmt"
|
||||||
|
echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
|
||||||
|
$dbg ncftpput ftp-upload.gnu.org /incoming/ftp $files $base.directive.asc
|
||||||
|
;;
|
||||||
|
savannah.gnu.org:*)
|
||||||
|
if test -z "$files"; then
|
||||||
|
echo "$0: warning: standalone directives not applicable for $dest" >&2
|
||||||
|
fi
|
||||||
|
$dbg ncftpput savannah.gnu.org /incoming/savannah/$destdir $files
|
||||||
|
;;
|
||||||
|
savannah.nongnu.org:*)
|
||||||
|
if test -z "$files"; then
|
||||||
|
echo "$0: warning: standalone directives not applicable for $dest" >&2
|
||||||
|
fi
|
||||||
|
$dbg ncftpput savannah.nongnu.org /incoming/savannah/$destdir $files
|
||||||
|
;;
|
||||||
|
download.gnu.org.ua:alpha/*|download.gnu.org.ua:ftp/*)
|
||||||
|
destdir_p1=`echo "$destdir" | sed 's,^[^/]*/,,'`
|
||||||
|
destdir_topdir=`echo "$destdir" | sed 's,/.*,,'`
|
||||||
|
mkdirective "$destdir_p1" "$base" "$file" "$stmt"
|
||||||
|
echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
|
||||||
|
for f in $files $base.directive.asc
|
||||||
|
do
|
||||||
|
echo put $f
|
||||||
|
done | $dbg sftp -b - puszcza.gnu.org.ua:/incoming/$destdir_topdir
|
||||||
|
;;
|
||||||
|
/*)
|
||||||
|
dest_host=`echo "$dest" | sed 's,:.*,,'`
|
||||||
|
mkdirective "$destdir" "$base" "$file" "$stmt"
|
||||||
|
echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
|
||||||
|
$dbg cp $files $base.directive.asc $dest_host
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if test -z "$files"; then
|
||||||
|
echo "$0: warning: standalone directives not applicable for $dest" >&2
|
||||||
|
fi
|
||||||
|
$dbg scp $files $dest
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
rm -f $base.directive $base.directive.asc
|
||||||
|
}
|
||||||
|
|
||||||
|
#####
|
||||||
|
# Process any standalone directives
|
||||||
|
stmt=
|
||||||
|
if test -n "$symlink_files"; then
|
||||||
|
stmt="$stmt
|
||||||
|
`mksymlink $symlink_files`"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for file in $delete_files
|
||||||
|
do
|
||||||
|
stmt="$stmt
|
||||||
|
archive: $file"
|
||||||
|
done
|
||||||
|
|
||||||
|
for file in $delete_symlinks
|
||||||
|
do
|
||||||
|
stmt="$stmt
|
||||||
|
rmsymlink: $file"
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -n "$stmt"; then
|
||||||
|
for dest in $to
|
||||||
|
do
|
||||||
|
destdir=`echo $dest | sed 's/[^:]*://'`
|
||||||
|
upload "$dest" "$destdir" "`hostname`-$$" "" "$stmt"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Process actual uploads
|
||||||
|
for dest in $to
|
||||||
|
do
|
||||||
|
for file
|
||||||
|
do
|
||||||
|
echo "Uploading $file to $dest ..."
|
||||||
|
stmt=
|
||||||
|
#
|
||||||
|
# allowing file replacement is all or nothing.
|
||||||
|
if test -n "$replace"; then stmt="$stmt
|
||||||
|
$replace"
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
files="$file $file.sig"
|
||||||
|
destdir=`echo $dest | sed 's/[^:]*://'`
|
||||||
|
if test -n "$symlink_expr"; then
|
||||||
|
linkname=`echo $file | sed "$symlink_expr"`
|
||||||
|
stmt="$stmt
|
||||||
|
symlink: $file $linkname
|
||||||
|
symlink: $file.sig $linkname.sig"
|
||||||
|
fi
|
||||||
|
upload "$dest" "$destdir" "$file" "$file" "$stmt" "$files"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
|
@ -0,0 +1,518 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
|
scriptversion=2018-03-11.20; # UTC
|
||||||
|
|
||||||
|
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||||
|
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||||
|
# following copyright and license.
|
||||||
|
#
|
||||||
|
# Copyright (C) 1994 X Consortium
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to
|
||||||
|
# deal in the Software without restriction, including without limitation the
|
||||||
|
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
# sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||||
|
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||||
|
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# Except as contained in this notice, the name of the X Consortium shall not
|
||||||
|
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||||
|
# ings in this Software without prior written authorization from the X Consor-
|
||||||
|
# tium.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# FSF changes to this file are in the public domain.
|
||||||
|
#
|
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||||
|
# 'make' implicit rules from creating a file called install from it
|
||||||
|
# when there is no Makefile.
|
||||||
|
#
|
||||||
|
# This script is compatible with the BSD install script, but was written
|
||||||
|
# from scratch.
|
||||||
|
|
||||||
|
tab=' '
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
IFS=" $tab$nl"
|
||||||
|
|
||||||
|
# Set DOITPROG to "echo" to test this script.
|
||||||
|
|
||||||
|
doit=${DOITPROG-}
|
||||||
|
doit_exec=${doit:-exec}
|
||||||
|
|
||||||
|
# Put in absolute file names if you don't have them in your path;
|
||||||
|
# or use environment vars.
|
||||||
|
|
||||||
|
chgrpprog=${CHGRPPROG-chgrp}
|
||||||
|
chmodprog=${CHMODPROG-chmod}
|
||||||
|
chownprog=${CHOWNPROG-chown}
|
||||||
|
cmpprog=${CMPPROG-cmp}
|
||||||
|
cpprog=${CPPROG-cp}
|
||||||
|
mkdirprog=${MKDIRPROG-mkdir}
|
||||||
|
mvprog=${MVPROG-mv}
|
||||||
|
rmprog=${RMPROG-rm}
|
||||||
|
stripprog=${STRIPPROG-strip}
|
||||||
|
|
||||||
|
posix_mkdir=
|
||||||
|
|
||||||
|
# Desired mode of installed file.
|
||||||
|
mode=0755
|
||||||
|
|
||||||
|
chgrpcmd=
|
||||||
|
chmodcmd=$chmodprog
|
||||||
|
chowncmd=
|
||||||
|
mvcmd=$mvprog
|
||||||
|
rmcmd="$rmprog -f"
|
||||||
|
stripcmd=
|
||||||
|
|
||||||
|
src=
|
||||||
|
dst=
|
||||||
|
dir_arg=
|
||||||
|
dst_arg=
|
||||||
|
|
||||||
|
copy_on_change=false
|
||||||
|
is_target_a_directory=possibly
|
||||||
|
|
||||||
|
usage="\
|
||||||
|
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||||
|
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||||
|
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||||
|
or: $0 [OPTION]... -d DIRECTORIES...
|
||||||
|
|
||||||
|
In the 1st form, copy SRCFILE to DSTFILE.
|
||||||
|
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||||
|
In the 4th, create DIRECTORIES.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help display this help and exit.
|
||||||
|
--version display version info and exit.
|
||||||
|
|
||||||
|
-c (ignored)
|
||||||
|
-C install only if different (preserve the last data modification time)
|
||||||
|
-d create directories instead of installing files.
|
||||||
|
-g GROUP $chgrpprog installed files to GROUP.
|
||||||
|
-m MODE $chmodprog installed files to MODE.
|
||||||
|
-o USER $chownprog installed files to USER.
|
||||||
|
-s $stripprog installed files.
|
||||||
|
-t DIRECTORY install into DIRECTORY.
|
||||||
|
-T report an error if DSTFILE is a directory.
|
||||||
|
|
||||||
|
Environment variables override the default commands:
|
||||||
|
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||||
|
RMPROG STRIPPROG
|
||||||
|
"
|
||||||
|
|
||||||
|
while test $# -ne 0; do
|
||||||
|
case $1 in
|
||||||
|
-c) ;;
|
||||||
|
|
||||||
|
-C) copy_on_change=true;;
|
||||||
|
|
||||||
|
-d) dir_arg=true;;
|
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
--help) echo "$usage"; exit $?;;
|
||||||
|
|
||||||
|
-m) mode=$2
|
||||||
|
case $mode in
|
||||||
|
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
|
||||||
|
echo "$0: invalid mode: $mode" >&2
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-s) stripcmd=$stripprog;;
|
||||||
|
|
||||||
|
-t)
|
||||||
|
is_target_a_directory=always
|
||||||
|
dst_arg=$2
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-T) is_target_a_directory=never;;
|
||||||
|
|
||||||
|
--version) echo "$0 $scriptversion"; exit $?;;
|
||||||
|
|
||||||
|
--) shift
|
||||||
|
break;;
|
||||||
|
|
||||||
|
-*) echo "$0: invalid option: $1" >&2
|
||||||
|
exit 1;;
|
||||||
|
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# We allow the use of options -d and -T together, by making -d
|
||||||
|
# take the precedence; this is for compatibility with GNU install.
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
echo "$0: target directory not allowed when installing a directory." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||||
|
# When -d is used, all remaining arguments are directories to create.
|
||||||
|
# When -t is used, the destination is already specified.
|
||||||
|
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
# $@ is not empty: it contains at least $arg.
|
||||||
|
set fnord "$@" "$dst_arg"
|
||||||
|
shift # fnord
|
||||||
|
fi
|
||||||
|
shift # arg
|
||||||
|
dst_arg=$arg
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
echo "$0: no input file specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# It's OK to call 'install-sh -d' without argument.
|
||||||
|
# This can happen when creating conditional directories.
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
if test $# -gt 1 || test "$is_target_a_directory" = always; then
|
||||||
|
if test ! -d "$dst_arg"; then
|
||||||
|
echo "$0: $dst_arg: Is not a directory." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
do_exit='(exit $ret); exit $ret'
|
||||||
|
trap "ret=129; $do_exit" 1
|
||||||
|
trap "ret=130; $do_exit" 2
|
||||||
|
trap "ret=141; $do_exit" 13
|
||||||
|
trap "ret=143; $do_exit" 15
|
||||||
|
|
||||||
|
# Set umask so as not to create temps with too-generous modes.
|
||||||
|
# However, 'strip' requires both read and write access to temps.
|
||||||
|
case $mode in
|
||||||
|
# Optimize common cases.
|
||||||
|
*644) cp_umask=133;;
|
||||||
|
*755) cp_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw='% 200'
|
||||||
|
fi
|
||||||
|
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||||
|
*)
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw=,u+rw
|
||||||
|
fi
|
||||||
|
cp_umask=$mode$u_plus_rw;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
for src
|
||||||
|
do
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $src in
|
||||||
|
-* | [=\(\)!]) src=./$src;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
dst=$src
|
||||||
|
dstdir=$dst
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
else
|
||||||
|
|
||||||
|
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||||
|
# might cause directories to be created, which would be especially bad
|
||||||
|
# if $src (and thus $dsttmp) contains '*'.
|
||||||
|
if test ! -f "$src" && test ! -d "$src"; then
|
||||||
|
echo "$0: $src does not exist." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dst_arg"; then
|
||||||
|
echo "$0: no destination specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dst=$dst_arg
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename.
|
||||||
|
if test -d "$dst"; then
|
||||||
|
if test "$is_target_a_directory" = never; then
|
||||||
|
echo "$0: $dst_arg: Is a directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dstdir=$dst
|
||||||
|
dstbase=`basename "$src"`
|
||||||
|
case $dst in
|
||||||
|
*/) dst=$dst$dstbase;;
|
||||||
|
*) dst=$dst/$dstbase;;
|
||||||
|
esac
|
||||||
|
dstdir_status=0
|
||||||
|
else
|
||||||
|
dstdir=`dirname "$dst"`
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $dstdir in
|
||||||
|
*/) dstdirslash=$dstdir;;
|
||||||
|
*) dstdirslash=$dstdir/;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
obsolete_mkdir_used=false
|
||||||
|
|
||||||
|
if test $dstdir_status != 0; then
|
||||||
|
case $posix_mkdir in
|
||||||
|
'')
|
||||||
|
# Create intermediate dirs using mode 755 as modified by the umask.
|
||||||
|
# This is like FreeBSD 'install' as of 1997-10-28.
|
||||||
|
umask=`umask`
|
||||||
|
case $stripcmd.$umask in
|
||||||
|
# Optimize common cases.
|
||||||
|
*[2367][2367]) mkdir_umask=$umask;;
|
||||||
|
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
mkdir_umask=`expr $umask + 22 \
|
||||||
|
- $umask % 100 % 40 + $umask % 20 \
|
||||||
|
- $umask % 10 % 4 + $umask % 2
|
||||||
|
`;;
|
||||||
|
*) mkdir_umask=$umask,go-w;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# With -d, create the new directory with the user-specified mode.
|
||||||
|
# Otherwise, rely on $mkdir_umask.
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
mkdir_mode=-m$mode
|
||||||
|
else
|
||||||
|
mkdir_mode=
|
||||||
|
fi
|
||||||
|
|
||||||
|
posix_mkdir=false
|
||||||
|
case $umask in
|
||||||
|
*[123567][0-7][0-7])
|
||||||
|
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
||||||
|
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Note that $RANDOM variable is not portable (e.g. dash); Use it
|
||||||
|
# here however when possible just to lower collision chance.
|
||||||
|
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||||
|
|
||||||
|
trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
|
||||||
|
|
||||||
|
# Because "mkdir -p" follows existing symlinks and we likely work
|
||||||
|
# directly in world-writeable /tmp, make sure that the '$tmpdir'
|
||||||
|
# directory is successfully created first before we actually test
|
||||||
|
# 'mkdir -p' feature.
|
||||||
|
if (umask $mkdir_umask &&
|
||||||
|
$mkdirprog $mkdir_mode "$tmpdir" &&
|
||||||
|
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
if test -z "$dir_arg" || {
|
||||||
|
# Check for POSIX incompatibilities with -m.
|
||||||
|
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||||
|
# other-writable bit of parent directory when it shouldn't.
|
||||||
|
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||||
|
test_tmpdir="$tmpdir/a"
|
||||||
|
ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
|
||||||
|
case $ls_ld_tmpdir in
|
||||||
|
d????-?r-*) different_mode=700;;
|
||||||
|
d????-?--*) different_mode=755;;
|
||||||
|
*) false;;
|
||||||
|
esac &&
|
||||||
|
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
|
||||||
|
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
|
||||||
|
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
then posix_mkdir=:
|
||||||
|
fi
|
||||||
|
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
|
||||||
|
else
|
||||||
|
# Remove any dirs left behind by ancient mkdir implementations.
|
||||||
|
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
|
||||||
|
fi
|
||||||
|
trap '' 0;;
|
||||||
|
esac;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if
|
||||||
|
$posix_mkdir && (
|
||||||
|
umask $mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||||
|
)
|
||||||
|
then :
|
||||||
|
else
|
||||||
|
|
||||||
|
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
||||||
|
# or it failed possibly due to a race condition. Create the
|
||||||
|
# directory the slow way, step by step, checking for races as we go.
|
||||||
|
|
||||||
|
case $dstdir in
|
||||||
|
/*) prefix='/';;
|
||||||
|
[-=\(\)!]*) prefix='./';;
|
||||||
|
*) prefix='';;
|
||||||
|
esac
|
||||||
|
|
||||||
|
oIFS=$IFS
|
||||||
|
IFS=/
|
||||||
|
set -f
|
||||||
|
set fnord $dstdir
|
||||||
|
shift
|
||||||
|
set +f
|
||||||
|
IFS=$oIFS
|
||||||
|
|
||||||
|
prefixes=
|
||||||
|
|
||||||
|
for d
|
||||||
|
do
|
||||||
|
test X"$d" = X && continue
|
||||||
|
|
||||||
|
prefix=$prefix$d
|
||||||
|
if test -d "$prefix"; then
|
||||||
|
prefixes=
|
||||||
|
else
|
||||||
|
if $posix_mkdir; then
|
||||||
|
(umask=$mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
test -d "$prefix" || exit 1
|
||||||
|
else
|
||||||
|
case $prefix in
|
||||||
|
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||||
|
*) qprefix=$prefix;;
|
||||||
|
esac
|
||||||
|
prefixes="$prefixes '$qprefix'"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
prefix=$prefix/
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -n "$prefixes"; then
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
(umask $mkdir_umask &&
|
||||||
|
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||||
|
test -d "$dstdir" || exit 1
|
||||||
|
obsolete_mkdir_used=true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||||
|
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||||
|
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||||
|
else
|
||||||
|
|
||||||
|
# Make a couple of temp file names in the proper directory.
|
||||||
|
dsttmp=${dstdirslash}_inst.$$_
|
||||||
|
rmtmp=${dstdirslash}_rm.$$_
|
||||||
|
|
||||||
|
# Trap to clean up those temp files at exit.
|
||||||
|
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||||
|
|
||||||
|
# Copy the file name to the temp name.
|
||||||
|
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits.
|
||||||
|
#
|
||||||
|
# If any of these fail, we abort the whole thing. If we want to
|
||||||
|
# ignore errors from any of these, just make sure not to ignore
|
||||||
|
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||||
|
#
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||||
|
|
||||||
|
# If -C, don't bother to copy if it wouldn't change the file.
|
||||||
|
if $copy_on_change &&
|
||||||
|
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||||
|
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||||
|
set -f &&
|
||||||
|
set X $old && old=:$2:$4:$5:$6 &&
|
||||||
|
set X $new && new=:$2:$4:$5:$6 &&
|
||||||
|
set +f &&
|
||||||
|
test "$old" = "$new" &&
|
||||||
|
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
rm -f "$dsttmp"
|
||||||
|
else
|
||||||
|
# Rename the file to the real destination.
|
||||||
|
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||||
|
|
||||||
|
# The rename failed, perhaps because mv can't rename something else
|
||||||
|
# to itself, or perhaps because mv is so ancient that it does not
|
||||||
|
# support -f.
|
||||||
|
{
|
||||||
|
# Now remove or move aside any old file at destination location.
|
||||||
|
# We try this two ways since rm can't unlink itself on some
|
||||||
|
# systems and the destination file might be busy for other
|
||||||
|
# reasons. In this case, the final cleanup might fail but the new
|
||||||
|
# file should still install successfully.
|
||||||
|
{
|
||||||
|
test ! -f "$dst" ||
|
||||||
|
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||||
|
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||||
|
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||||
|
} ||
|
||||||
|
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||||
|
(exit 1); exit 1
|
||||||
|
}
|
||||||
|
} &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
$doit $mvcmd "$dsttmp" "$dst"
|
||||||
|
}
|
||||||
|
fi || exit 1
|
||||||
|
|
||||||
|
trap '' 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
|
@ -0,0 +1,228 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Get modification time of a file or directory and pretty-print it.
|
||||||
|
|
||||||
|
scriptversion=2018-03-07.03; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1995-2018 Free Software Foundation, Inc.
|
||||||
|
# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
|
||||||
|
#
|
||||||
|
# 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, 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# This file is maintained in Automake, please report
|
||||||
|
# bugs to <bug-automake@gnu.org> or send patches to
|
||||||
|
# <automake-patches@gnu.org>.
|
||||||
|
|
||||||
|
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
|
||||||
|
emulate sh
|
||||||
|
NULLCMD=:
|
||||||
|
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
|
||||||
|
# is contrary to our usage. Disable this feature.
|
||||||
|
alias -g '${1+"$@"}'='"$@"'
|
||||||
|
setopt NO_GLOB_SUBST
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
'')
|
||||||
|
echo "$0: No file. Try '$0 --help' for more information." 1>&2
|
||||||
|
exit 1;
|
||||||
|
;;
|
||||||
|
-h | --h*)
|
||||||
|
cat <<\EOF
|
||||||
|
Usage: mdate-sh [--help] [--version] FILE
|
||||||
|
|
||||||
|
Pretty-print the modification day of FILE, in the format:
|
||||||
|
1 January 1970
|
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "mdate-sh $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
error ()
|
||||||
|
{
|
||||||
|
echo "$0: $1" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Prevent date giving response in another language.
|
||||||
|
LANG=C
|
||||||
|
export LANG
|
||||||
|
LC_ALL=C
|
||||||
|
export LC_ALL
|
||||||
|
LC_TIME=C
|
||||||
|
export LC_TIME
|
||||||
|
|
||||||
|
# Use UTC to get reproducible result.
|
||||||
|
TZ=UTC0
|
||||||
|
export TZ
|
||||||
|
|
||||||
|
# GNU ls changes its time format in response to the TIME_STYLE
|
||||||
|
# variable. Since we cannot assume 'unset' works, revert this
|
||||||
|
# variable to its documented default.
|
||||||
|
if test "${TIME_STYLE+set}" = set; then
|
||||||
|
TIME_STYLE=posix-long-iso
|
||||||
|
export TIME_STYLE
|
||||||
|
fi
|
||||||
|
|
||||||
|
save_arg1=$1
|
||||||
|
|
||||||
|
# Find out how to get the extended ls output of a file or directory.
|
||||||
|
if ls -L /dev/null 1>/dev/null 2>&1; then
|
||||||
|
ls_command='ls -L -l -d'
|
||||||
|
else
|
||||||
|
ls_command='ls -l -d'
|
||||||
|
fi
|
||||||
|
# Avoid user/group names that might have spaces, when possible.
|
||||||
|
if ls -n /dev/null 1>/dev/null 2>&1; then
|
||||||
|
ls_command="$ls_command -n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# A 'ls -l' line looks as follows on OS/2.
|
||||||
|
# drwxrwx--- 0 Aug 11 2001 foo
|
||||||
|
# This differs from Unix, which adds ownership information.
|
||||||
|
# drwxrwx--- 2 root root 4096 Aug 11 2001 foo
|
||||||
|
#
|
||||||
|
# To find the date, we split the line on spaces and iterate on words
|
||||||
|
# until we find a month. This cannot work with files whose owner is a
|
||||||
|
# user named "Jan", or "Feb", etc. However, it's unlikely that '/'
|
||||||
|
# will be owned by a user whose name is a month. So we first look at
|
||||||
|
# the extended ls output of the root directory to decide how many
|
||||||
|
# words should be skipped to get the date.
|
||||||
|
|
||||||
|
# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
|
||||||
|
set x`$ls_command /`
|
||||||
|
|
||||||
|
# Find which argument is the month.
|
||||||
|
month=
|
||||||
|
command=
|
||||||
|
until test $month
|
||||||
|
do
|
||||||
|
test $# -gt 0 || error "failed parsing '$ls_command /' output"
|
||||||
|
shift
|
||||||
|
# Add another shift to the command.
|
||||||
|
command="$command shift;"
|
||||||
|
case $1 in
|
||||||
|
Jan) month=January; nummonth=1;;
|
||||||
|
Feb) month=February; nummonth=2;;
|
||||||
|
Mar) month=March; nummonth=3;;
|
||||||
|
Apr) month=April; nummonth=4;;
|
||||||
|
May) month=May; nummonth=5;;
|
||||||
|
Jun) month=June; nummonth=6;;
|
||||||
|
Jul) month=July; nummonth=7;;
|
||||||
|
Aug) month=August; nummonth=8;;
|
||||||
|
Sep) month=September; nummonth=9;;
|
||||||
|
Oct) month=October; nummonth=10;;
|
||||||
|
Nov) month=November; nummonth=11;;
|
||||||
|
Dec) month=December; nummonth=12;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
test -n "$month" || error "failed parsing '$ls_command /' output"
|
||||||
|
|
||||||
|
# Get the extended ls output of the file or directory.
|
||||||
|
set dummy x`eval "$ls_command \"\\\$save_arg1\""`
|
||||||
|
|
||||||
|
# Remove all preceding arguments
|
||||||
|
eval $command
|
||||||
|
|
||||||
|
# Because of the dummy argument above, month is in $2.
|
||||||
|
#
|
||||||
|
# On a POSIX system, we should have
|
||||||
|
#
|
||||||
|
# $# = 5
|
||||||
|
# $1 = file size
|
||||||
|
# $2 = month
|
||||||
|
# $3 = day
|
||||||
|
# $4 = year or time
|
||||||
|
# $5 = filename
|
||||||
|
#
|
||||||
|
# On Darwin 7.7.0 and 7.6.0, we have
|
||||||
|
#
|
||||||
|
# $# = 4
|
||||||
|
# $1 = day
|
||||||
|
# $2 = month
|
||||||
|
# $3 = year or time
|
||||||
|
# $4 = filename
|
||||||
|
|
||||||
|
# Get the month.
|
||||||
|
case $2 in
|
||||||
|
Jan) month=January; nummonth=1;;
|
||||||
|
Feb) month=February; nummonth=2;;
|
||||||
|
Mar) month=March; nummonth=3;;
|
||||||
|
Apr) month=April; nummonth=4;;
|
||||||
|
May) month=May; nummonth=5;;
|
||||||
|
Jun) month=June; nummonth=6;;
|
||||||
|
Jul) month=July; nummonth=7;;
|
||||||
|
Aug) month=August; nummonth=8;;
|
||||||
|
Sep) month=September; nummonth=9;;
|
||||||
|
Oct) month=October; nummonth=10;;
|
||||||
|
Nov) month=November; nummonth=11;;
|
||||||
|
Dec) month=December; nummonth=12;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case $3 in
|
||||||
|
???*) day=$1;;
|
||||||
|
*) day=$3; shift;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Here we have to deal with the problem that the ls output gives either
|
||||||
|
# the time of day or the year.
|
||||||
|
case $3 in
|
||||||
|
*:*) set `date`; eval year=\$$#
|
||||||
|
case $2 in
|
||||||
|
Jan) nummonthtod=1;;
|
||||||
|
Feb) nummonthtod=2;;
|
||||||
|
Mar) nummonthtod=3;;
|
||||||
|
Apr) nummonthtod=4;;
|
||||||
|
May) nummonthtod=5;;
|
||||||
|
Jun) nummonthtod=6;;
|
||||||
|
Jul) nummonthtod=7;;
|
||||||
|
Aug) nummonthtod=8;;
|
||||||
|
Sep) nummonthtod=9;;
|
||||||
|
Oct) nummonthtod=10;;
|
||||||
|
Nov) nummonthtod=11;;
|
||||||
|
Dec) nummonthtod=12;;
|
||||||
|
esac
|
||||||
|
# For the first six month of the year the time notation can also
|
||||||
|
# be used for files modified in the last year.
|
||||||
|
if (expr $nummonth \> $nummonthtod) > /dev/null;
|
||||||
|
then
|
||||||
|
year=`expr $year - 1`
|
||||||
|
fi;;
|
||||||
|
*) year=$3;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# The result.
|
||||||
|
echo $day $month $year
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
|
@ -0,0 +1,215 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# Common wrapper for a few potentially missing GNU programs.
|
||||||
|
|
||||||
|
scriptversion=2018-03-07.03; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
||||||
|
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||||
|
|
||||||
|
# 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, 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
echo 1>&2 "Try '$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
|
||||||
|
--is-lightweight)
|
||||||
|
# Used by our autoconf macros to check whether the available missing
|
||||||
|
# script is modern enough.
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
|
||||||
|
--run)
|
||||||
|
# Back-compat with the calling convention used by older automake.
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
|
-h|--h|--he|--hel|--help)
|
||||||
|
echo "\
|
||||||
|
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||||
|
|
||||||
|
Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
|
||||||
|
to PROGRAM being missing or too old.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help display this help and exit
|
||||||
|
-v, --version output version information and exit
|
||||||
|
|
||||||
|
Supported PROGRAM values:
|
||||||
|
aclocal autoconf autoheader autom4te automake makeinfo
|
||||||
|
bison yacc flex lex help2man
|
||||||
|
|
||||||
|
Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
|
||||||
|
'g' are ignored when checking the name.
|
||||||
|
|
||||||
|
Send bug reports to <bug-automake@gnu.org>."
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
||||||
|
echo "missing $scriptversion (GNU Automake)"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
-*)
|
||||||
|
echo 1>&2 "$0: unknown '$1' option"
|
||||||
|
echo 1>&2 "Try '$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Run the given program, remember its exit status.
|
||||||
|
"$@"; st=$?
|
||||||
|
|
||||||
|
# If it succeeded, we are done.
|
||||||
|
test $st -eq 0 && exit 0
|
||||||
|
|
||||||
|
# Also exit now if we it failed (or wasn't found), and '--version' was
|
||||||
|
# passed; such an option is passed most likely to detect whether the
|
||||||
|
# program is present and works.
|
||||||
|
case $2 in --version|--help) exit $st;; esac
|
||||||
|
|
||||||
|
# Exit code 63 means version mismatch. This often happens when the user
|
||||||
|
# tries to use an ancient version of a tool on a file that requires a
|
||||||
|
# minimum version.
|
||||||
|
if test $st -eq 63; then
|
||||||
|
msg="probably too old"
|
||||||
|
elif test $st -eq 127; then
|
||||||
|
# Program was missing.
|
||||||
|
msg="missing on your system"
|
||||||
|
else
|
||||||
|
# Program was found and executed, but failed. Give up.
|
||||||
|
exit $st
|
||||||
|
fi
|
||||||
|
|
||||||
|
perl_URL=https://www.perl.org/
|
||||||
|
flex_URL=https://github.com/westes/flex
|
||||||
|
gnu_software_URL=https://www.gnu.org/software
|
||||||
|
|
||||||
|
program_details ()
|
||||||
|
{
|
||||||
|
case $1 in
|
||||||
|
aclocal|automake)
|
||||||
|
echo "The '$1' program is part of the GNU Automake package:"
|
||||||
|
echo "<$gnu_software_URL/automake>"
|
||||||
|
echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
|
||||||
|
echo "<$gnu_software_URL/autoconf>"
|
||||||
|
echo "<$gnu_software_URL/m4/>"
|
||||||
|
echo "<$perl_URL>"
|
||||||
|
;;
|
||||||
|
autoconf|autom4te|autoheader)
|
||||||
|
echo "The '$1' program is part of the GNU Autoconf package:"
|
||||||
|
echo "<$gnu_software_URL/autoconf/>"
|
||||||
|
echo "It also requires GNU m4 and Perl in order to run:"
|
||||||
|
echo "<$gnu_software_URL/m4/>"
|
||||||
|
echo "<$perl_URL>"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
give_advice ()
|
||||||
|
{
|
||||||
|
# Normalize program name to check for.
|
||||||
|
normalized_program=`echo "$1" | sed '
|
||||||
|
s/^gnu-//; t
|
||||||
|
s/^gnu//; t
|
||||||
|
s/^g//; t'`
|
||||||
|
|
||||||
|
printf '%s\n' "'$1' is $msg."
|
||||||
|
|
||||||
|
configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
|
||||||
|
case $normalized_program in
|
||||||
|
autoconf*)
|
||||||
|
echo "You should only need it if you modified 'configure.ac',"
|
||||||
|
echo "or m4 files included by it."
|
||||||
|
program_details 'autoconf'
|
||||||
|
;;
|
||||||
|
autoheader*)
|
||||||
|
echo "You should only need it if you modified 'acconfig.h' or"
|
||||||
|
echo "$configure_deps."
|
||||||
|
program_details 'autoheader'
|
||||||
|
;;
|
||||||
|
automake*)
|
||||||
|
echo "You should only need it if you modified 'Makefile.am' or"
|
||||||
|
echo "$configure_deps."
|
||||||
|
program_details 'automake'
|
||||||
|
;;
|
||||||
|
aclocal*)
|
||||||
|
echo "You should only need it if you modified 'acinclude.m4' or"
|
||||||
|
echo "$configure_deps."
|
||||||
|
program_details 'aclocal'
|
||||||
|
;;
|
||||||
|
autom4te*)
|
||||||
|
echo "You might have modified some maintainer files that require"
|
||||||
|
echo "the 'autom4te' program to be rebuilt."
|
||||||
|
program_details 'autom4te'
|
||||||
|
;;
|
||||||
|
bison*|yacc*)
|
||||||
|
echo "You should only need it if you modified a '.y' file."
|
||||||
|
echo "You may want to install the GNU Bison package:"
|
||||||
|
echo "<$gnu_software_URL/bison/>"
|
||||||
|
;;
|
||||||
|
lex*|flex*)
|
||||||
|
echo "You should only need it if you modified a '.l' file."
|
||||||
|
echo "You may want to install the Fast Lexical Analyzer package:"
|
||||||
|
echo "<$flex_URL>"
|
||||||
|
;;
|
||||||
|
help2man*)
|
||||||
|
echo "You should only need it if you modified a dependency" \
|
||||||
|
"of a man page."
|
||||||
|
echo "You may want to install the GNU Help2man package:"
|
||||||
|
echo "<$gnu_software_URL/help2man/>"
|
||||||
|
;;
|
||||||
|
makeinfo*)
|
||||||
|
echo "You should only need it if you modified a '.texi' file, or"
|
||||||
|
echo "any other file indirectly affecting the aspect of the manual."
|
||||||
|
echo "You might want to install the Texinfo package:"
|
||||||
|
echo "<$gnu_software_URL/texinfo/>"
|
||||||
|
echo "The spurious makeinfo call might also be the consequence of"
|
||||||
|
echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
|
||||||
|
echo "want to install GNU make:"
|
||||||
|
echo "<$gnu_software_URL/make/>"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "You might have modified some files without having the proper"
|
||||||
|
echo "tools for further handling them. Check the 'README' file, it"
|
||||||
|
echo "often tells you about the needed prerequisites for installing"
|
||||||
|
echo "this package. You may also peek at any GNU archive site, in"
|
||||||
|
echo "case some other package contains this missing '$1' program."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
give_advice "$1" | sed -e '1s/^/WARNING: /' \
|
||||||
|
-e '2,$s/^/ /' >&2
|
||||||
|
|
||||||
|
# Propagate the correct exit status (expected to be 127 for a program
|
||||||
|
# not found, 63 for a program that failed due to version mismatch).
|
||||||
|
exit $st
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
|
@ -0,0 +1,148 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# test-driver - basic testsuite driver script.
|
||||||
|
|
||||||
|
scriptversion=2018-03-07.03; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 2011-2018 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# 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, 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# This file is maintained in Automake, please report
|
||||||
|
# bugs to <bug-automake@gnu.org> or send patches to
|
||||||
|
# <automake-patches@gnu.org>.
|
||||||
|
|
||||||
|
# Make unconditional expansion of undefined variables an error. This
|
||||||
|
# helps a lot in preventing typo-related bugs.
|
||||||
|
set -u
|
||||||
|
|
||||||
|
usage_error ()
|
||||||
|
{
|
||||||
|
echo "$0: $*" >&2
|
||||||
|
print_usage >&2
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
print_usage ()
|
||||||
|
{
|
||||||
|
cat <<END
|
||||||
|
Usage:
|
||||||
|
test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
|
||||||
|
[--expect-failure={yes|no}] [--color-tests={yes|no}]
|
||||||
|
[--enable-hard-errors={yes|no}] [--]
|
||||||
|
TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
|
||||||
|
The '--test-name', '--log-file' and '--trs-file' options are mandatory.
|
||||||
|
END
|
||||||
|
}
|
||||||
|
|
||||||
|
test_name= # Used for reporting.
|
||||||
|
log_file= # Where to save the output of the test script.
|
||||||
|
trs_file= # Where to save the metadata of the test run.
|
||||||
|
expect_failure=no
|
||||||
|
color_tests=no
|
||||||
|
enable_hard_errors=yes
|
||||||
|
while test $# -gt 0; do
|
||||||
|
case $1 in
|
||||||
|
--help) print_usage; exit $?;;
|
||||||
|
--version) echo "test-driver $scriptversion"; exit $?;;
|
||||||
|
--test-name) test_name=$2; shift;;
|
||||||
|
--log-file) log_file=$2; shift;;
|
||||||
|
--trs-file) trs_file=$2; shift;;
|
||||||
|
--color-tests) color_tests=$2; shift;;
|
||||||
|
--expect-failure) expect_failure=$2; shift;;
|
||||||
|
--enable-hard-errors) enable_hard_errors=$2; shift;;
|
||||||
|
--) shift; break;;
|
||||||
|
-*) usage_error "invalid option: '$1'";;
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
missing_opts=
|
||||||
|
test x"$test_name" = x && missing_opts="$missing_opts --test-name"
|
||||||
|
test x"$log_file" = x && missing_opts="$missing_opts --log-file"
|
||||||
|
test x"$trs_file" = x && missing_opts="$missing_opts --trs-file"
|
||||||
|
if test x"$missing_opts" != x; then
|
||||||
|
usage_error "the following mandatory options are missing:$missing_opts"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
usage_error "missing argument"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $color_tests = yes; then
|
||||||
|
# Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
|
||||||
|
red='[0;31m' # Red.
|
||||||
|
grn='[0;32m' # Green.
|
||||||
|
lgn='[1;32m' # Light green.
|
||||||
|
blu='[1;34m' # Blue.
|
||||||
|
mgn='[0;35m' # Magenta.
|
||||||
|
std='[m' # No color.
|
||||||
|
else
|
||||||
|
red= grn= lgn= blu= mgn= std=
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
|
||||||
|
trap "st=129; $do_exit" 1
|
||||||
|
trap "st=130; $do_exit" 2
|
||||||
|
trap "st=141; $do_exit" 13
|
||||||
|
trap "st=143; $do_exit" 15
|
||||||
|
|
||||||
|
# Test script is run here.
|
||||||
|
"$@" >$log_file 2>&1
|
||||||
|
estatus=$?
|
||||||
|
|
||||||
|
if test $enable_hard_errors = no && test $estatus -eq 99; then
|
||||||
|
tweaked_estatus=1
|
||||||
|
else
|
||||||
|
tweaked_estatus=$estatus
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $tweaked_estatus:$expect_failure in
|
||||||
|
0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
|
||||||
|
0:*) col=$grn res=PASS recheck=no gcopy=no;;
|
||||||
|
77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
|
||||||
|
99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;;
|
||||||
|
*:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;;
|
||||||
|
*:*) col=$red res=FAIL recheck=yes gcopy=yes;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Report the test outcome and exit status in the logs, so that one can
|
||||||
|
# know whether the test passed or failed simply by looking at the '.log'
|
||||||
|
# file, without the need of also peaking into the corresponding '.trs'
|
||||||
|
# file (automake bug#11814).
|
||||||
|
echo "$res $test_name (exit status: $estatus)" >>$log_file
|
||||||
|
|
||||||
|
# Report outcome to console.
|
||||||
|
echo "${col}${res}${std}: $test_name"
|
||||||
|
|
||||||
|
# Register the test result, and other relevant metadata.
|
||||||
|
echo ":test-result: $res" > $trs_file
|
||||||
|
echo ":global-test-result: $res" >> $trs_file
|
||||||
|
echo ":recheck: $recheck" >> $trs_file
|
||||||
|
echo ":copy-in-global-log: $gcopy" >> $trs_file
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,277 @@
|
||||||
|
eval '(exit $?0)' && eval 'exec perl -wS -0777 -pi "$0" "$@"'
|
||||||
|
& eval 'exec perl -wS -0777 -pi "$0" $argv:q'
|
||||||
|
if 0;
|
||||||
|
# Update an FSF copyright year list to include the current year.
|
||||||
|
|
||||||
|
my $VERSION = '2018-03-07.03:47'; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 2009-2019 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# 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 3, 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Written by Jim Meyering and Joel E. Denny
|
||||||
|
|
||||||
|
# The arguments to this script should be names of files that contain
|
||||||
|
# copyright statements to be updated. The copyright holder's name
|
||||||
|
# defaults to "Free Software Foundation, Inc." but may be changed to
|
||||||
|
# any other name by using the "UPDATE_COPYRIGHT_HOLDER" environment
|
||||||
|
# variable.
|
||||||
|
#
|
||||||
|
# For example, you might wish to use the update-copyright target rule
|
||||||
|
# in maint.mk from gnulib's maintainer-makefile module.
|
||||||
|
#
|
||||||
|
# Iff a copyright statement is recognized in a file and the final
|
||||||
|
# year is not the current year, then the statement is updated for the
|
||||||
|
# new year and it is reformatted to:
|
||||||
|
#
|
||||||
|
# 1. Fit within 72 columns.
|
||||||
|
# 2. Convert 2-digit years to 4-digit years by prepending "19".
|
||||||
|
# 3. Expand copyright year intervals. (See "Environment variables"
|
||||||
|
# below.)
|
||||||
|
#
|
||||||
|
# A warning is printed for every file for which no copyright
|
||||||
|
# statement is recognized.
|
||||||
|
#
|
||||||
|
# Each file's copyright statement must be formatted correctly in
|
||||||
|
# order to be recognized. For example, each of these is fine:
|
||||||
|
#
|
||||||
|
# Copyright @copyright{} 1990-2005, 2007-2009 Free Software
|
||||||
|
# Foundation, Inc.
|
||||||
|
#
|
||||||
|
# # Copyright (C) 1990-2005, 2007-2009 Free Software
|
||||||
|
# # Foundation, Inc.
|
||||||
|
#
|
||||||
|
# /*
|
||||||
|
# * Copyright © 90,2005,2007-2009
|
||||||
|
# * Free Software Foundation, Inc.
|
||||||
|
# */
|
||||||
|
#
|
||||||
|
# However, the following format is not recognized because the line
|
||||||
|
# prefix changes after the first line:
|
||||||
|
#
|
||||||
|
# ## Copyright (C) 1990-2005, 2007-2009 Free Software
|
||||||
|
# # Foundation, Inc.
|
||||||
|
#
|
||||||
|
# However, any correctly formatted copyright statement following
|
||||||
|
# a non-matching copyright statements would be recognized.
|
||||||
|
#
|
||||||
|
# The exact conditions that a file's copyright statement must meet
|
||||||
|
# to be recognized are:
|
||||||
|
#
|
||||||
|
# 1. It is the first copyright statement that meets all of the
|
||||||
|
# following conditions. Subsequent copyright statements are
|
||||||
|
# ignored.
|
||||||
|
# 2. Its format is "Copyright (C)", then a list of copyright years,
|
||||||
|
# and then the name of the copyright holder.
|
||||||
|
# 3. The "(C)" takes one of the following forms or is omitted
|
||||||
|
# entirely:
|
||||||
|
#
|
||||||
|
# A. (C)
|
||||||
|
# B. (c)
|
||||||
|
# C. @copyright{}
|
||||||
|
# D. ©
|
||||||
|
# E. ©
|
||||||
|
#
|
||||||
|
# 4. The "Copyright" appears at the beginning of a line, except that it
|
||||||
|
# may be prefixed by any sequence (e.g., a comment) of no more than
|
||||||
|
# 5 characters -- including white space.
|
||||||
|
# 5. Iff such a prefix is present, the same prefix appears at the
|
||||||
|
# beginning of each remaining line within the FSF copyright
|
||||||
|
# statement. There is one exception in order to support C-style
|
||||||
|
# comments: if the first line's prefix contains nothing but
|
||||||
|
# whitespace surrounding a "/*", then the prefix for all subsequent
|
||||||
|
# lines is the same as the first line's prefix except with each of
|
||||||
|
# "/" and possibly "*" replaced by a " ". The replacement of "*"
|
||||||
|
# by " " is consistent throughout all subsequent lines.
|
||||||
|
# 6. Blank lines, even if preceded by the prefix, do not appear
|
||||||
|
# within the FSF copyright statement.
|
||||||
|
# 7. Each copyright year is 2 or 4 digits, and years are separated by
|
||||||
|
# commas or dashes. Whitespace may appear after commas.
|
||||||
|
#
|
||||||
|
# Environment variables:
|
||||||
|
#
|
||||||
|
# 1. If UPDATE_COPYRIGHT_FORCE=1, a recognized FSF copyright statement
|
||||||
|
# is reformatted even if it does not need updating for the new
|
||||||
|
# year. If unset or set to 0, only updated FSF copyright
|
||||||
|
# statements are reformatted.
|
||||||
|
# 2. If UPDATE_COPYRIGHT_USE_INTERVALS=1, every series of consecutive
|
||||||
|
# copyright years (such as 90, 1991, 1992-2007, 2008) in a
|
||||||
|
# reformatted FSF copyright statement is collapsed to a single
|
||||||
|
# interval (such as 1990-2008). If unset or set to 0, all existing
|
||||||
|
# copyright year intervals in a reformatted FSF copyright statement
|
||||||
|
# are expanded instead.
|
||||||
|
# If UPDATE_COPYRIGHT_USE_INTERVALS=2, convert a sequence with gaps
|
||||||
|
# to the minimal containing range. For example, convert
|
||||||
|
# 2000, 2004-2007, 2009 to 2000-2009.
|
||||||
|
# 3. For testing purposes, you can set the assumed current year in
|
||||||
|
# UPDATE_COPYRIGHT_YEAR.
|
||||||
|
# 4. The default maximum line length for a copyright line is 72.
|
||||||
|
# Set UPDATE_COPYRIGHT_MAX_LINE_LENGTH to use a different length.
|
||||||
|
# 5. Set UPDATE_COPYRIGHT_HOLDER if the copyright holder is other
|
||||||
|
# than "Free Software Foundation, Inc.".
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
my $copyright_re = 'Copyright';
|
||||||
|
my $circle_c_re = '(?:\([cC]\)|@copyright\{}|\\\\\(co|©|©)';
|
||||||
|
my $holder = $ENV{UPDATE_COPYRIGHT_HOLDER};
|
||||||
|
$holder ||= 'Free Software Foundation, Inc.';
|
||||||
|
my $prefix_max = 5;
|
||||||
|
my $margin = $ENV{UPDATE_COPYRIGHT_MAX_LINE_LENGTH};
|
||||||
|
!$margin || $margin !~ m/^\d+$/
|
||||||
|
and $margin = 72;
|
||||||
|
|
||||||
|
my $tab_width = 8;
|
||||||
|
|
||||||
|
my $this_year = $ENV{UPDATE_COPYRIGHT_YEAR};
|
||||||
|
if (!$this_year || $this_year !~ m/^\d{4}$/)
|
||||||
|
{
|
||||||
|
my ($sec, $min, $hour, $mday, $month, $year) = localtime (time ());
|
||||||
|
$this_year = $year + 1900;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Unless the file consistently uses "\r\n" as the EOL, use "\n" instead.
|
||||||
|
my $eol = /(?:^|[^\r])\n/ ? "\n" : "\r\n";
|
||||||
|
|
||||||
|
my $leading;
|
||||||
|
my $prefix;
|
||||||
|
my $ws_re;
|
||||||
|
my $stmt_re;
|
||||||
|
while (/(^|\n)(.{0,$prefix_max})$copyright_re/g)
|
||||||
|
{
|
||||||
|
$leading = "$1$2";
|
||||||
|
$prefix = $2;
|
||||||
|
if ($prefix =~ /^(\s*\/)\*(\s*)$/)
|
||||||
|
{
|
||||||
|
$prefix =~ s,/, ,;
|
||||||
|
my $prefix_ws = $prefix;
|
||||||
|
$prefix_ws =~ s/\*/ /; # Only whitespace.
|
||||||
|
if (/\G(?:[^*\n]|\*[^\/\n])*\*?\n$prefix_ws/)
|
||||||
|
{
|
||||||
|
$prefix = $prefix_ws;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$ws_re = '[ \t\r\f]'; # \s without \n
|
||||||
|
$ws_re =
|
||||||
|
"(?:$ws_re*(?:$ws_re|\\n" . quotemeta($prefix) . ")$ws_re*)";
|
||||||
|
my $holder_re = $holder;
|
||||||
|
$holder_re =~ s/\s/$ws_re/g;
|
||||||
|
my $stmt_remainder_re =
|
||||||
|
"(?:$ws_re$circle_c_re)?"
|
||||||
|
. "$ws_re(?:(?:\\d\\d)?\\d\\d(?:,$ws_re?|-))*"
|
||||||
|
. "((?:\\d\\d)?\\d\\d)$ws_re$holder_re";
|
||||||
|
if (/\G$stmt_remainder_re/)
|
||||||
|
{
|
||||||
|
$stmt_re =
|
||||||
|
quotemeta($leading) . "($copyright_re$stmt_remainder_re)";
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (defined $stmt_re)
|
||||||
|
{
|
||||||
|
/$stmt_re/ or die; # Should never die.
|
||||||
|
my $stmt = $1;
|
||||||
|
my $final_year_orig = $2;
|
||||||
|
|
||||||
|
# Handle two-digit year numbers like "98" and "99".
|
||||||
|
my $final_year = $final_year_orig;
|
||||||
|
$final_year <= 99
|
||||||
|
and $final_year += 1900;
|
||||||
|
|
||||||
|
if ($final_year != $this_year)
|
||||||
|
{
|
||||||
|
# Update the year.
|
||||||
|
$stmt =~ s/\b$final_year_orig\b/$final_year, $this_year/;
|
||||||
|
}
|
||||||
|
if ($final_year != $this_year || $ENV{'UPDATE_COPYRIGHT_FORCE'})
|
||||||
|
{
|
||||||
|
# Normalize all whitespace including newline-prefix sequences.
|
||||||
|
$stmt =~ s/$ws_re/ /g;
|
||||||
|
|
||||||
|
# Put spaces after commas.
|
||||||
|
$stmt =~ s/, ?/, /g;
|
||||||
|
|
||||||
|
# Convert 2-digit to 4-digit years.
|
||||||
|
$stmt =~ s/(\b\d\d\b)/19$1/g;
|
||||||
|
|
||||||
|
# Make the use of intervals consistent.
|
||||||
|
if (!$ENV{UPDATE_COPYRIGHT_USE_INTERVALS})
|
||||||
|
{
|
||||||
|
$stmt =~ s/(\d{4})-(\d{4})/join(', ', $1..$2)/eg;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$stmt =~
|
||||||
|
s/
|
||||||
|
(\d{4})
|
||||||
|
(?:
|
||||||
|
(,\ |-)
|
||||||
|
((??{
|
||||||
|
if ($2 eq '-') { '\d{4}'; }
|
||||||
|
elsif (!$3) { $1 + 1; }
|
||||||
|
else { $3 + 1; }
|
||||||
|
}))
|
||||||
|
)+
|
||||||
|
/$1-$3/gx;
|
||||||
|
|
||||||
|
# When it's 2, emit a single range encompassing all year numbers.
|
||||||
|
$ENV{UPDATE_COPYRIGHT_USE_INTERVALS} == 2
|
||||||
|
and $stmt =~ s/\b(\d{4})\b.*\b(\d{4})\b/$1-$2/;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Format within margin.
|
||||||
|
my $stmt_wrapped;
|
||||||
|
my $text_margin = $margin - length($prefix);
|
||||||
|
if ($prefix =~ /^(\t+)/)
|
||||||
|
{
|
||||||
|
$text_margin -= length($1) * ($tab_width - 1);
|
||||||
|
}
|
||||||
|
while (length $stmt)
|
||||||
|
{
|
||||||
|
if (($stmt =~ s/^(.{1,$text_margin})(?: |$)//)
|
||||||
|
|| ($stmt =~ s/^([\S]+)(?: |$)//))
|
||||||
|
{
|
||||||
|
my $line = $1;
|
||||||
|
$stmt_wrapped .= $stmt_wrapped ? "$eol$prefix" : $leading;
|
||||||
|
$stmt_wrapped .= $line;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# Should be unreachable, but we don't want an infinite
|
||||||
|
# loop if it can be reached.
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Replace the old copyright statement.
|
||||||
|
s/$stmt_re/$stmt_wrapped/;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print STDERR "$ARGV: warning: copyright statement not found\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
# Hey Emacs!
|
||||||
|
# Local variables:
|
||||||
|
# coding: utf-8
|
||||||
|
# mode: perl
|
||||||
|
# indent-tabs-mode: nil
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "my $VERSION = '"
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H:%02M"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "'; # UTC"
|
||||||
|
# End:
|
|
@ -0,0 +1,210 @@
|
||||||
|
eval '(exit $?0)' && eval 'exec perl -wST "$0" "$@"'
|
||||||
|
& eval 'exec perl -wST "$0" $argv:q'
|
||||||
|
if 0;
|
||||||
|
# Detect instances of "if (p) free (p);".
|
||||||
|
# Likewise "if (p != 0)", "if (0 != p)", or with NULL; and with braces.
|
||||||
|
|
||||||
|
my $VERSION = '2018-03-07 03:47'; # UTC
|
||||||
|
# The definition above must lie within the first 8 lines in order
|
||||||
|
# for the Emacs time-stamp write hook (at end) to update it.
|
||||||
|
# If you change this file with Emacs, please let the write hook
|
||||||
|
# do its job. Otherwise, update this string manually.
|
||||||
|
|
||||||
|
# Copyright (C) 2008-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# 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 3 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Written by Jim Meyering
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Getopt::Long;
|
||||||
|
|
||||||
|
(my $ME = $0) =~ s|.*/||;
|
||||||
|
|
||||||
|
# use File::Coda; # https://meyering.net/code/Coda/
|
||||||
|
END {
|
||||||
|
defined fileno STDOUT or return;
|
||||||
|
close STDOUT and return;
|
||||||
|
warn "$ME: failed to close standard output: $!\n";
|
||||||
|
$? ||= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub usage ($)
|
||||||
|
{
|
||||||
|
my ($exit_code) = @_;
|
||||||
|
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
|
||||||
|
if ($exit_code != 0)
|
||||||
|
{
|
||||||
|
print $STREAM "Try '$ME --help' for more information.\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print $STREAM <<EOF;
|
||||||
|
Usage: $ME [OPTIONS] FILE...
|
||||||
|
|
||||||
|
Detect any instance in FILE of a useless "if" test before a free call, e.g.,
|
||||||
|
"if (p) free (p);". Any such test may be safely removed without affecting
|
||||||
|
the semantics of the C code in FILE. Use --name=FOO --name=BAR to also
|
||||||
|
detect free-like functions named FOO and BAR.
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
|
||||||
|
--list print only the name of each matching FILE (\\0-terminated)
|
||||||
|
--name=N add name N to the list of \'free\'-like functions to detect;
|
||||||
|
may be repeated
|
||||||
|
|
||||||
|
--help display this help and exit
|
||||||
|
--version output version information and exit
|
||||||
|
|
||||||
|
Exit status:
|
||||||
|
|
||||||
|
0 one or more matches
|
||||||
|
1 no match
|
||||||
|
2 an error
|
||||||
|
|
||||||
|
EXAMPLE:
|
||||||
|
|
||||||
|
For example, this command prints all removable "if" tests before "free"
|
||||||
|
and "kfree" calls in the linux kernel sources:
|
||||||
|
|
||||||
|
git ls-files -z |xargs -0 $ME --name=kfree
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
exit $exit_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub is_NULL ($)
|
||||||
|
{
|
||||||
|
my ($expr) = @_;
|
||||||
|
return ($expr eq 'NULL' || $expr eq '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
sub EXIT_MATCH {0}
|
||||||
|
sub EXIT_NO_MATCH {1}
|
||||||
|
sub EXIT_ERROR {2}
|
||||||
|
my $err = EXIT_NO_MATCH;
|
||||||
|
|
||||||
|
my $list;
|
||||||
|
my @name = qw(free);
|
||||||
|
GetOptions
|
||||||
|
(
|
||||||
|
help => sub { usage 0 },
|
||||||
|
version => sub { print "$ME version $VERSION\n"; exit },
|
||||||
|
list => \$list,
|
||||||
|
'name=s@' => \@name,
|
||||||
|
) or usage 1;
|
||||||
|
|
||||||
|
# Make sure we have the right number of non-option arguments.
|
||||||
|
# Always tell the user why we fail.
|
||||||
|
@ARGV < 1
|
||||||
|
and (warn "$ME: missing FILE argument\n"), usage EXIT_ERROR;
|
||||||
|
|
||||||
|
my $or = join '|', @name;
|
||||||
|
my $regexp = qr/(?:$or)/;
|
||||||
|
|
||||||
|
# Set the input record separator.
|
||||||
|
# Note: this makes it impractical to print line numbers.
|
||||||
|
$/ = '"';
|
||||||
|
|
||||||
|
my $found_match = 0;
|
||||||
|
FILE:
|
||||||
|
foreach my $file (@ARGV)
|
||||||
|
{
|
||||||
|
open FH, '<', $file
|
||||||
|
or (warn "$ME: can't open '$file' for reading: $!\n"),
|
||||||
|
$err = EXIT_ERROR, next;
|
||||||
|
while (defined (my $line = <FH>))
|
||||||
|
{
|
||||||
|
# Skip non-matching lines early to save time
|
||||||
|
$line =~ /\bif\b/
|
||||||
|
or next;
|
||||||
|
while ($line =~
|
||||||
|
/\b(if\s*\(\s*([^)]+?)(?:\s*!=\s*([^)]+?))?\s*\)
|
||||||
|
# 1 2 3
|
||||||
|
(?: \s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;|
|
||||||
|
\s*\{\s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;\s*\}))/sxg)
|
||||||
|
{
|
||||||
|
my $all = $1;
|
||||||
|
my ($lhs, $rhs) = ($2, $3);
|
||||||
|
my ($free_opnd, $braced_free_opnd) = ($4, $5);
|
||||||
|
my $non_NULL;
|
||||||
|
if (!defined $rhs) { $non_NULL = $lhs }
|
||||||
|
elsif (is_NULL $rhs) { $non_NULL = $lhs }
|
||||||
|
elsif (is_NULL $lhs) { $non_NULL = $rhs }
|
||||||
|
else { next }
|
||||||
|
|
||||||
|
# Compare the non-NULL part of the "if" expression and the
|
||||||
|
# free'd expression, without regard to white space.
|
||||||
|
$non_NULL =~ tr/ \t//d;
|
||||||
|
my $e2 = defined $free_opnd ? $free_opnd : $braced_free_opnd;
|
||||||
|
$e2 =~ tr/ \t//d;
|
||||||
|
if ($non_NULL eq $e2)
|
||||||
|
{
|
||||||
|
$found_match = 1;
|
||||||
|
$list
|
||||||
|
and (print "$file\0"), next FILE;
|
||||||
|
print "$file: $all\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
{
|
||||||
|
close FH;
|
||||||
|
}
|
||||||
|
|
||||||
|
$found_match && $err == EXIT_NO_MATCH
|
||||||
|
and $err = EXIT_MATCH;
|
||||||
|
|
||||||
|
exit $err;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $foo = <<'EOF';
|
||||||
|
# The above is to *find* them.
|
||||||
|
# This adjusts them, removing the unnecessary "if (p)" part.
|
||||||
|
|
||||||
|
# FIXME: do something like this as an option (doesn't do braces):
|
||||||
|
free=xfree
|
||||||
|
git grep -l -z "$free *(" \
|
||||||
|
| xargs -0 useless-if-before-free -l --name="$free" \
|
||||||
|
| xargs -0 perl -0x3b -pi -e \
|
||||||
|
's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s+('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\)\s*;)/$2/s'
|
||||||
|
|
||||||
|
# Use the following to remove redundant uses of kfree inside braces.
|
||||||
|
# Note that -0777 puts perl in slurp-whole-file mode;
|
||||||
|
# but we have plenty of memory, these days...
|
||||||
|
free=kfree
|
||||||
|
git grep -l -z "$free *(" \
|
||||||
|
| xargs -0 useless-if-before-free -l --name="$free" \
|
||||||
|
| xargs -0 perl -0777 -pi -e \
|
||||||
|
's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s*\{\s*('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\);)\s*\}[^\n]*$/$2/gms'
|
||||||
|
|
||||||
|
Be careful that the result of the above transformation is valid.
|
||||||
|
If the matched string is followed by "else", then obviously, it won't be.
|
||||||
|
|
||||||
|
When modifying files, refuse to process anything other than a regular file.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
## Local Variables:
|
||||||
|
## mode: perl
|
||||||
|
## indent-tabs-mode: nil
|
||||||
|
## eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
## time-stamp-start: "my $VERSION = '"
|
||||||
|
## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
|
||||||
|
## time-stamp-time-zone: "UTC0"
|
||||||
|
## time-stamp-end: "'; # UTC"
|
||||||
|
## End:
|
|
@ -0,0 +1,113 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# List version-controlled file names.
|
||||||
|
|
||||||
|
# Print a version string.
|
||||||
|
scriptversion=2018-03-07.03; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 2006-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# 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 3 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
# List the specified version-controlled files.
|
||||||
|
# With no argument, list them all. With a single DIRECTORY argument,
|
||||||
|
# list the version-controlled files in that directory.
|
||||||
|
|
||||||
|
# If there's an argument, it must be a single, "."-relative directory name.
|
||||||
|
# cvsu is part of the cvsutils package: http://www.red-bean.com/cvsutils/
|
||||||
|
|
||||||
|
postprocess=
|
||||||
|
case $1 in
|
||||||
|
--help) cat <<EOF
|
||||||
|
Usage: $0 [-C SRCDIR] [DIR...]
|
||||||
|
|
||||||
|
Output a list of version-controlled files in DIR (default .), relative to
|
||||||
|
SRCDIR (default .). SRCDIR must be the top directory of a checkout.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help print this help, then exit
|
||||||
|
--version print version number, then exit
|
||||||
|
-C SRCDIR change directory to SRCDIR before generating list
|
||||||
|
|
||||||
|
Report bugs and patches to <bug-gnulib@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit ;;
|
||||||
|
|
||||||
|
--version)
|
||||||
|
year=`echo "$scriptversion" | sed 's/[^0-9].*//'`
|
||||||
|
cat <<EOF
|
||||||
|
vc-list-files $scriptversion
|
||||||
|
Copyright (C) $year Free Software Foundation, Inc,
|
||||||
|
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
|
||||||
|
This is free software: you are free to change and redistribute it.
|
||||||
|
There is NO WARRANTY, to the extent permitted by law.
|
||||||
|
EOF
|
||||||
|
exit ;;
|
||||||
|
|
||||||
|
-C)
|
||||||
|
test "$2" = . || postprocess="| sed 's|^|$2/|'"
|
||||||
|
cd "$2" || exit 1
|
||||||
|
shift; shift ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
test $# = 0 && set .
|
||||||
|
|
||||||
|
for dir
|
||||||
|
do
|
||||||
|
if test -d .git || test -f .git; then
|
||||||
|
test "x$dir" = x. \
|
||||||
|
&& dir= sed_esc= \
|
||||||
|
|| { dir="$dir/"; sed_esc=`echo "$dir"|env sed 's,\([\\/]\),\\\\\1,g'`; }
|
||||||
|
# Ignore git symlinks - either they point into the tree, in which case
|
||||||
|
# we don't need to visit the target twice, or they point somewhere
|
||||||
|
# else (often into a submodule), in which case the content does not
|
||||||
|
# belong to this package.
|
||||||
|
eval exec git ls-tree -r 'HEAD:"$dir"' \
|
||||||
|
\| sed -n '"s/^100[^ ]*./$sed_esc/p"' $postprocess
|
||||||
|
elif test -d .hg; then
|
||||||
|
eval exec hg locate '"$dir/*"' $postprocess
|
||||||
|
elif test -d .bzr; then
|
||||||
|
test "$postprocess" = '' && postprocess="| sed 's|^\./||'"
|
||||||
|
eval exec bzr ls -R --versioned '"$dir"' $postprocess
|
||||||
|
elif test -d CVS; then
|
||||||
|
test "$postprocess" = '' && postprocess="| sed 's|^\./||'"
|
||||||
|
if test -x build-aux/cvsu; then
|
||||||
|
eval build-aux/cvsu --find --types=AFGM '"$dir"' $postprocess
|
||||||
|
elif (cvsu --help) >/dev/null 2>&1; then
|
||||||
|
eval cvsu --find --types=AFGM '"$dir"' $postprocess
|
||||||
|
else
|
||||||
|
eval awk -F/ \''{ \
|
||||||
|
if (!$1 && $3 !~ /^-/) { \
|
||||||
|
f=FILENAME; \
|
||||||
|
if (f ~ /CVS\/Entries$/) \
|
||||||
|
f = substr(f, 1, length(f)-11); \
|
||||||
|
print f $2; \
|
||||||
|
}}'\'' \
|
||||||
|
`find "$dir" -name Entries -print` /dev/null' $postprocess
|
||||||
|
fi
|
||||||
|
elif test -d .svn; then
|
||||||
|
eval exec svn list -R '"$dir"' $postprocess
|
||||||
|
else
|
||||||
|
echo "$0: Failed to determine type of version control used in `pwd`" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,867 @@
|
||||||
|
dnl Template file for GNU Autoconf
|
||||||
|
dnl Copyright (C) 1995-1997, 2001, 2007-2014, 2018-2019 Free Software
|
||||||
|
dnl Foundation, Inc.
|
||||||
|
|
||||||
|
dnl This program is free software; you can redistribute it and/or modify
|
||||||
|
dnl it under the terms of the GNU General Public License as published by
|
||||||
|
dnl the Free Software Foundation; either version 3 of the License, or
|
||||||
|
dnl (at your option) any later version.
|
||||||
|
|
||||||
|
dnl This program is distributed in the hope that it will be useful,
|
||||||
|
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
dnl GNU General Public License for more details.
|
||||||
|
|
||||||
|
dnl You should have received a copy of the GNU General Public License
|
||||||
|
dnl along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
dnl Additional permission under GNU GPL version 3 section 7
|
||||||
|
|
||||||
|
dnl If you modify this program, or any covered work, by linking or
|
||||||
|
dnl combining it with the OpenSSL project's OpenSSL library (or a
|
||||||
|
dnl modified version of that library), containing parts covered by the
|
||||||
|
dnl terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
|
||||||
|
dnl grants you additional permission to convey the resulting work.
|
||||||
|
dnl Corresponding Source for a non-source form of such a combination
|
||||||
|
dnl shall include the source code for the parts of OpenSSL used as well
|
||||||
|
dnl as that of the covered work.
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
dnl
|
||||||
|
|
||||||
|
AC_INIT([wget],
|
||||||
|
m4_esyscmd([build-aux/git-version-gen .tarball-version]),
|
||||||
|
[bug-wget@gnu.org])
|
||||||
|
AC_PREREQ(2.63)
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl What version of Wget are we building?
|
||||||
|
dnl
|
||||||
|
AC_MSG_NOTICE([configuring for GNU Wget $PACKAGE_VERSION])
|
||||||
|
|
||||||
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
|
|
||||||
|
AC_CONFIG_SRCDIR([src/wget.h])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Automake setup
|
||||||
|
dnl
|
||||||
|
AM_INIT_AUTOMAKE([1.9])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Get canonical host
|
||||||
|
dnl
|
||||||
|
AC_CANONICAL_HOST
|
||||||
|
AC_DEFINE_UNQUOTED([OS_TYPE], "$host_os",
|
||||||
|
[Define to be the name of the operating system.])
|
||||||
|
|
||||||
|
dnl Non-verbose make
|
||||||
|
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Process External Libraries
|
||||||
|
dnl
|
||||||
|
|
||||||
|
dnl Libpsl: Public Suffix List checking
|
||||||
|
AC_ARG_WITH([libpsl],
|
||||||
|
[AS_HELP_STRING([--without-libpsl], [disable support for libpsl cookie checking.])])
|
||||||
|
|
||||||
|
dnl SSL: Configure SSL backend to use
|
||||||
|
AC_ARG_WITH([ssl],
|
||||||
|
[AS_HELP_STRING([--with-ssl={gnutls,openssl}], [specify SSL backend. GNU TLS is the default.])])
|
||||||
|
|
||||||
|
dnl Zlib: Configure use of zlib for compression
|
||||||
|
AC_ARG_WITH([zlib],
|
||||||
|
[AS_HELP_STRING([--without-zlib], [disable zlib.])])
|
||||||
|
|
||||||
|
dnl Metalink: Configure use of the Metalink library
|
||||||
|
AC_ARG_WITH([metalink],
|
||||||
|
[AS_HELP_STRING([--with-metalink], [enable support for metalinks.])])
|
||||||
|
|
||||||
|
dnl C-Ares: Configure use of the c-ares library for DNS lookup
|
||||||
|
AC_ARG_WITH(cares, AS_HELP_STRING([--with-cares], [enable support for C-Ares DNS lookup.]), with_cares=$withval, with_cares=no)
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Process features
|
||||||
|
dnl
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([fuzzing],
|
||||||
|
[AS_HELP_STRING([--enable-fuzzing], [Turn on fuzzing build (for developers)])],
|
||||||
|
[enable_fuzzing=yes;
|
||||||
|
AC_SUBST([LIB_FUZZING_ENGINE])
|
||||||
|
AC_DEFINE([FUZZING], 1, [Define to 1 if this is a fuzzing build])
|
||||||
|
], [enable_fuzzing=no; LIB_FUZZING_ENGINE=""])
|
||||||
|
#FUZZ_LIBS=$LIBS
|
||||||
|
#if test $enable_fuzzing = "yes"; then
|
||||||
|
# OLD_LIBS=$LIBS
|
||||||
|
# AC_SEARCH_LIBS([dlsym], [dl dld])
|
||||||
|
# FUZZ_LIBS=$LIBS
|
||||||
|
# LIBS=$OLD_LIBS
|
||||||
|
#fi
|
||||||
|
#AC_SUBST([FUZZ_LIBS])
|
||||||
|
AM_CONDITIONAL([FUZZING], [test "$enable_fuzzing" = "yes"])
|
||||||
|
|
||||||
|
dnl needed for some fuzzers
|
||||||
|
OLD_LIBS="$LIBS"
|
||||||
|
AC_SEARCH_LIBS([dlopen], [dl dld])
|
||||||
|
if [[ "${ac_cv_search_dlopen#-l}" != "${ac_cv_search_dlopen}" ]]; then
|
||||||
|
FUZZ_LIBS="${ac_cv_search_dlopen}"
|
||||||
|
AC_SUBST([FUZZ_LIBS])
|
||||||
|
fi
|
||||||
|
LIBS="$OLD_LIBS"
|
||||||
|
|
||||||
|
dnl Opie: Support for opie s/key FTP logins
|
||||||
|
AC_ARG_ENABLE([opie],
|
||||||
|
[AS_HELP_STRING([--disable-opie], [disable support for opie or s/key FTP login])],
|
||||||
|
[ENABLE_OPIE=$enableval],
|
||||||
|
[ENABLE_OPIE=yes])
|
||||||
|
|
||||||
|
AS_IF([test "x$ENABLE_OPIE" = xyes],
|
||||||
|
[AC_DEFINE([ENABLE_OPIE], [1], [Define if you want Opie support for FTP compiled in.])],
|
||||||
|
[]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
dnl Digest: Support for HTTP Digest Authentication
|
||||||
|
AC_ARG_ENABLE([digest],
|
||||||
|
[AS_HELP_STRING([--disable-digest], [disable support for HTTP digest authorization])],
|
||||||
|
[ENABLE_DIGEST=$enableval],
|
||||||
|
[ENABLE_DIGEST=yes])
|
||||||
|
|
||||||
|
AS_IF([test "x$ENABLE_DIGEST" = xyes],
|
||||||
|
[AC_DEFINE([ENABLE_DIGEST], [1], [Define if you want the HTTP Digest Authorization compiled in.])],
|
||||||
|
[]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
dnl NTLM: Support for HTTP NTLM Authentication
|
||||||
|
AC_ARG_ENABLE([ntlm],
|
||||||
|
[AS_HELP_STRING([--disable-ntlm], [disable support for NTLM authorization])],
|
||||||
|
[ENABLE_NTLM=$enableval],
|
||||||
|
[ENABLE_NTLM=auto]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
dnl Debug: Support for printing debugging output
|
||||||
|
AC_ARG_ENABLE([debug],
|
||||||
|
[AS_HELP_STRING([--disable-debug], [disable support for debugging output])],
|
||||||
|
[ENABLE_DEBUG=$enableval],
|
||||||
|
[ENABLE_DEBUG=yes])
|
||||||
|
|
||||||
|
AS_IF([test "x$ENABLE_DEBUG" = xyes],
|
||||||
|
[AC_DEFINE([ENABLE_DEBUG], [1], [Define if you want the debug output support compiled in.])],
|
||||||
|
[]
|
||||||
|
)
|
||||||
|
|
||||||
|
dnl Valgrind-tests: Should test suite be run under valgrind?
|
||||||
|
AC_ARG_ENABLE(valgrind-tests,
|
||||||
|
[AS_HELP_STRING([--enable-valgrind-tests], [enable using Valgrind for tests])],
|
||||||
|
[ENABLE_VALGRIND=$enableval],
|
||||||
|
[ENABLE_VALGRIND=no])
|
||||||
|
|
||||||
|
AS_IF([test "x$ENABLE_VALGRIND" != xno], [
|
||||||
|
AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no)
|
||||||
|
AS_IF([test "x$HAVE_VALGRIND" = xyes], [
|
||||||
|
VALGRIND_TESTS="1"
|
||||||
|
AC_SUBST(VALGRIND_TESTS)
|
||||||
|
VALGRIND_INFO="Test suite will be run under Valgrind"
|
||||||
|
], [
|
||||||
|
VALGRIND_INFO="Valgrind not found"
|
||||||
|
])
|
||||||
|
], [
|
||||||
|
VALGRIND_INFO="Valgrind testing not enabled"
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(assert,
|
||||||
|
[AS_HELP_STRING([--enable-assert], [enable assertions in code base])],
|
||||||
|
[ENABLE_ASSERTION=$enableval],
|
||||||
|
[ENABLE_ASSERTION=no]
|
||||||
|
)
|
||||||
|
|
||||||
|
AS_IF([test "x$ENABLE_ASSERTION" != xyes], [
|
||||||
|
CFLAGS="-DNDEBUG $CFLAGS"
|
||||||
|
],
|
||||||
|
[])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Find the compiler
|
||||||
|
dnl
|
||||||
|
|
||||||
|
dnl We want these before the checks, so the checks can modify their values.
|
||||||
|
test -z "$CFLAGS" && CFLAGS= auto_cflags=1
|
||||||
|
test -z "$CC" && cc_specified=yes
|
||||||
|
|
||||||
|
AC_PROG_CC
|
||||||
|
AM_PROG_CC_C_O
|
||||||
|
AC_AIX
|
||||||
|
|
||||||
|
gl_EARLY
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Find python3
|
||||||
|
dnl
|
||||||
|
AM_PATH_PYTHON([3.0],,[:])
|
||||||
|
AM_CONDITIONAL([HAVE_PYTHON3], [test "$PYTHON" != :])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Gettext
|
||||||
|
dnl
|
||||||
|
AM_GNU_GETTEXT([external],[need-ngettext])
|
||||||
|
AM_GNU_GETTEXT_VERSION([0.17])
|
||||||
|
|
||||||
|
AC_PROG_RANLIB
|
||||||
|
|
||||||
|
AC_PROG_LEX
|
||||||
|
|
||||||
|
dnl Turn on optimization by default. Specifically:
|
||||||
|
dnl
|
||||||
|
dnl if the user hasn't specified CFLAGS, then
|
||||||
|
dnl if compiler is gcc, then
|
||||||
|
dnl use -O2 and some warning flags
|
||||||
|
dnl else
|
||||||
|
dnl use os-specific flags or -O
|
||||||
|
dnl
|
||||||
|
dnl For these tests, the system considers clang to be gcc
|
||||||
|
if test -n "$auto_cflags"; then
|
||||||
|
if test -n "$GCC"; then
|
||||||
|
CFLAGS="$CFLAGS -O2 -Wall -Wextra"
|
||||||
|
else
|
||||||
|
case "$host_os" in
|
||||||
|
*hpux*) CFLAGS="$CFLAGS +O3" ;;
|
||||||
|
*ultrix* | *osf*) CFLAGS="$CFLAGS -O -Olimit 2000" ;;
|
||||||
|
*) CFLAGS="$CFLAGS -O" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Checks for basic compiler characteristics.
|
||||||
|
dnl
|
||||||
|
AC_C_CONST
|
||||||
|
AC_C_INLINE
|
||||||
|
AC_C_VOLATILE
|
||||||
|
|
||||||
|
dnl Check for basic headers, even though we expect them to exist and
|
||||||
|
dnl #include them unconditionally in the code. Their detection is
|
||||||
|
dnl still needed because test programs used by Autoconf macros check.
|
||||||
|
dnl Without the checks they will fail to be included in test programs,
|
||||||
|
dnl which will subsequently fail.
|
||||||
|
AC_HEADER_STDC
|
||||||
|
|
||||||
|
dnl Check for large file support. This check needs to come fairly
|
||||||
|
dnl early because it could (in principle) affect whether functions and
|
||||||
|
dnl headers are available, whether they work, etc.
|
||||||
|
AC_SYS_LARGEFILE
|
||||||
|
AC_CHECK_SIZEOF(off_t)
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Checks for system header files that might be missing.
|
||||||
|
dnl
|
||||||
|
AC_HEADER_STDBOOL
|
||||||
|
AC_CHECK_HEADERS(unistd.h sys/time.h)
|
||||||
|
AC_CHECK_HEADERS(termios.h sys/ioctl.h sys/select.h utime.h sys/utime.h)
|
||||||
|
AC_CHECK_HEADERS(stdint.h inttypes.h pwd.h wchar.h dlfcn.h)
|
||||||
|
|
||||||
|
AC_CHECK_DECLS(h_errno,,,[#include <netdb.h>])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Check sizes of integer types. These are used to find n-bit
|
||||||
|
dnl integral types on older systems that fail to provide intN_t and
|
||||||
|
dnl uintN_t typedefs.
|
||||||
|
dnl
|
||||||
|
AC_CHECK_SIZEOF([short])
|
||||||
|
AC_CHECK_SIZEOF([int])
|
||||||
|
AC_CHECK_SIZEOF([long])
|
||||||
|
AC_CHECK_SIZEOF([long long])
|
||||||
|
AC_CHECK_SIZEOF([void *])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Checks for non-universal or system-specific types.
|
||||||
|
dnl
|
||||||
|
AC_TYPE_SIZE_T
|
||||||
|
AC_TYPE_PID_T
|
||||||
|
AC_CHECK_TYPES([uint32_t, uintptr_t, intptr_t, int64_t])
|
||||||
|
AC_CHECK_TYPES(sig_atomic_t, [], [], [
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <signal.h>
|
||||||
|
])
|
||||||
|
|
||||||
|
# gnulib, AM_ICONV should be placed before gl_INIT
|
||||||
|
AM_ICONV
|
||||||
|
gl_INIT
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Checks for library functions.
|
||||||
|
dnl
|
||||||
|
AC_FUNC_MMAP
|
||||||
|
AC_FUNC_FSEEKO
|
||||||
|
AC_CHECK_FUNCS(strptime timegm vsnprintf vasprintf drand48 pathconf)
|
||||||
|
AC_CHECK_FUNCS(strtoll usleep ftello sigblock sigsetjmp memrchr wcwidth mbtowc)
|
||||||
|
AC_CHECK_FUNCS(sleep symlink utime strlcpy random fmemopen)
|
||||||
|
|
||||||
|
if test x"$ENABLE_OPIE" = xyes; then
|
||||||
|
AC_LIBOBJ([ftp-opie])
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl We expect to have these functions on Unix-like systems configure
|
||||||
|
dnl runs on. The defines are provided to get them in config.h.in so
|
||||||
|
dnl Wget can still be ported to non-Unix systems (such as Windows)
|
||||||
|
dnl that lack some of these functions.
|
||||||
|
AC_DEFINE([HAVE_STRCASECMP], 1, [Define to 1 if you have the `strcasecmp' function.])
|
||||||
|
AC_DEFINE([HAVE_STRNCASECMP], 1, [Define to 1 if you have the `strncasecmp' function.])
|
||||||
|
AC_DEFINE([HAVE_STRDUP], 1, [Define to 1 if you have the `strdup' function.])
|
||||||
|
AC_DEFINE([HAVE_ISATTY], 1, [Define to 1 if you have the `isatty' function.])
|
||||||
|
|
||||||
|
dnl Deal with specific hosts
|
||||||
|
case $host_os in
|
||||||
|
*mingw32* )
|
||||||
|
LIBS+=' -lws2_32'
|
||||||
|
AC_LIBOBJ([mswindows])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Checks for libraries.
|
||||||
|
dnl
|
||||||
|
|
||||||
|
PKG_PROG_PKG_CONFIG
|
||||||
|
|
||||||
|
AS_IF([test "x$with_libpsl" != xno], [
|
||||||
|
PKG_CHECK_MODULES([LIBPSL], libpsl, [
|
||||||
|
with_libpsl=yes
|
||||||
|
# correct $LIBPSL_LIBS (in libpsl <= 0.6.0)
|
||||||
|
AS_IF([test "x$LIBPSL_LIBS" = "x-llibpsl "], [LIBPSL_LIBS="-lpsl"])
|
||||||
|
LIBS="$LIBPSL_LIBS $LIBS"
|
||||||
|
CFLAGS="$LIBPSL_CFLAGS $CFLAGS"
|
||||||
|
AC_DEFINE([HAVE_LIBPSL], [1], [PSL support enabled])
|
||||||
|
], [
|
||||||
|
AC_SEARCH_LIBS(psl_builtin, psl,
|
||||||
|
[with_libpsl=yes; AC_DEFINE([HAVE_LIBPSL], [1], [PSL support enabled])],
|
||||||
|
[with_libpsl=no; AC_MSG_WARN(*** libpsl was not found. Fallback to builtin cookie checking.)])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
AS_IF([test x"$with_libpsl" = xyes], [
|
||||||
|
AC_CHECK_FUNCS(psl_latest)
|
||||||
|
])
|
||||||
|
|
||||||
|
AS_IF([test x"$with_zlib" != xno], [
|
||||||
|
with_zlib=yes
|
||||||
|
PKG_CHECK_MODULES([ZLIB], zlib, [
|
||||||
|
LIBS="$ZLIB_LIBS $LIBS"
|
||||||
|
CFLAGS="$ZLIB_CFLAGS $CFLAGS"
|
||||||
|
AC_DEFINE([HAVE_LIBZ], [1], [Define if using zlib.])
|
||||||
|
], [
|
||||||
|
AC_CHECK_LIB(z, compress)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
AS_IF([test x"$with_ssl" = xopenssl], [
|
||||||
|
if [test x"$with_libssl_prefix" = x]; then
|
||||||
|
PKG_CHECK_MODULES([OPENSSL], [openssl], [
|
||||||
|
AC_MSG_NOTICE([compiling in support for SSL via OpenSSL])
|
||||||
|
AC_LIBOBJ([openssl])
|
||||||
|
LIBS="$OPENSSL_LIBS $LIBS"
|
||||||
|
CFLAGS="$OPENSSL_CFLAGS -DHAVE_LIBSSL $CFLAGS"
|
||||||
|
LIBSSL=" " # ntlm check below wants this
|
||||||
|
AC_CHECK_FUNCS([RAND_egd])
|
||||||
|
AC_DEFINE([HAVE_LIBSSL], [1], [Define if using openssl.])
|
||||||
|
ssl_found=yes
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
if [test x"$ssl_found" != xyes]; then
|
||||||
|
dnl As of this writing (OpenSSL 0.9.6), the libcrypto shared library
|
||||||
|
dnl doesn't record its dependency on libdl, so we need to make sure
|
||||||
|
dnl -ldl ends up in LIBS on systems that have it. Most OSes use
|
||||||
|
dnl dlopen(), but HP-UX uses shl_load().
|
||||||
|
AC_CHECK_LIB(dl, dlopen, [], [
|
||||||
|
AC_CHECK_LIB(dl, shl_load)
|
||||||
|
])
|
||||||
|
|
||||||
|
ssl_found=no
|
||||||
|
case $host_os in
|
||||||
|
*mingw32* )
|
||||||
|
dnl prefer link to openssl dlls if possible. if not then fallback on static libs. if not then error
|
||||||
|
|
||||||
|
AC_CHECK_LIB(eay32, EVP_MD_CTX_init)
|
||||||
|
if test x"$ac_cv_lib_eay32_EVP_MD_CTX_init" != xno
|
||||||
|
then
|
||||||
|
AC_CHECK_LIB(ssl32, SSL_connect, [
|
||||||
|
ssl_found=yes
|
||||||
|
AC_MSG_NOTICE([Enabling support for SSL via OpenSSL (shared)])
|
||||||
|
AC_LIBOBJ([openssl])
|
||||||
|
LIBS="${LIBS} -lssl32"
|
||||||
|
AC_DEFINE([HAVE_LIBSSL32], [1], [Define to 1 if you have the `ssl32' library (-lssl32).])
|
||||||
|
],
|
||||||
|
AC_MSG_ERROR([openssl not found: shared lib eay32 found but ssl32 not found]))
|
||||||
|
|
||||||
|
else
|
||||||
|
LIBS+=' -lgdi32'
|
||||||
|
dnl fallback and test static libs
|
||||||
|
fi
|
||||||
|
dnl add zdll lib as dep for above tests?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AS_IF([test x$ssl_found != xyes], [
|
||||||
|
dnl Now actually check for -lssl if it wasn't already found
|
||||||
|
AC_LIB_HAVE_LINKFLAGS([ssl], [crypto], [
|
||||||
|
#include <openssl/ssl.h>
|
||||||
|
#include <openssl/x509.h>
|
||||||
|
#include <openssl/err.h>
|
||||||
|
#include <openssl/rand.h>
|
||||||
|
#include <openssl/des.h>
|
||||||
|
#include <openssl/md4.h>
|
||||||
|
#include <openssl/md5.h>
|
||||||
|
], [SSL_library_init ()])
|
||||||
|
if test x"$LIBSSL" != x
|
||||||
|
then
|
||||||
|
ssl_found=yes
|
||||||
|
AC_MSG_NOTICE([compiling in support for SSL via OpenSSL])
|
||||||
|
AC_LIBOBJ([openssl])
|
||||||
|
LIBS="$LIBSSL $LIBS"
|
||||||
|
AC_CHECK_FUNCS([RAND_egd])
|
||||||
|
elif test x"$with_ssl" != x
|
||||||
|
then
|
||||||
|
AC_MSG_ERROR([--with-ssl=openssl was given, but SSL is not available.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
], [
|
||||||
|
# --with-ssl is not openssl: check if it's no
|
||||||
|
AS_IF([test x"$with_ssl" != xno], [
|
||||||
|
dnl default is -lgnutls
|
||||||
|
with_ssl=gnutls
|
||||||
|
|
||||||
|
dnl Now actually check for -lgnutls
|
||||||
|
if [test x"$with_libgnutls_prefix" = x]; then
|
||||||
|
PKG_CHECK_MODULES([GNUTLS], [gnutls], [
|
||||||
|
AC_MSG_NOTICE([compiling in support for SSL via GnuTLS])
|
||||||
|
AC_LIBOBJ([gnutls])
|
||||||
|
LIBS="$GNUTLS_LIBS $LIBS"
|
||||||
|
CFLAGS="$GNUTLS_CFLAGS -DHAVE_LIBGNUTLS $CFLAGS"
|
||||||
|
AC_DEFINE([HAVE_LIBGNUTLS], [1], [Define if using gnutls.])
|
||||||
|
ssl_found=yes
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
if [test x"$ssl_found" != xyes]; then
|
||||||
|
AC_LIB_HAVE_LINKFLAGS([gnutls], [], [
|
||||||
|
#include <gnutls/gnutls.h>
|
||||||
|
], [gnutls_global_init()])
|
||||||
|
if test x"$LIBGNUTLS" != x
|
||||||
|
then
|
||||||
|
ssl_found=yes
|
||||||
|
AC_MSG_NOTICE([compiling in support for SSL via GnuTLS])
|
||||||
|
AC_LIBOBJ([gnutls])
|
||||||
|
LIBS="$LIBGNUTLS $LIBS"
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([GnuTLS has not been found. Use --with-ssl=openssl if you explicitly want OpenSSL.])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_CHECK_FUNCS(gnutls_priority_set_direct)
|
||||||
|
]) # endif: --with-ssl != no?
|
||||||
|
]) # endif: --with-ssl == openssl?
|
||||||
|
|
||||||
|
dnl Enable NTLM if requested and if SSL is available.
|
||||||
|
if test x"$LIBSSL" != x || test "$ac_cv_lib_ssl32_SSL_connect" = yes
|
||||||
|
then
|
||||||
|
if test x"$ENABLE_NTLM" != xno
|
||||||
|
then
|
||||||
|
ENABLE_NTLM=yes
|
||||||
|
AC_DEFINE([ENABLE_NTLM], 1,
|
||||||
|
[Define if you want the NTLM authorization support compiled in.])
|
||||||
|
AC_LIBOBJ([http-ntlm])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
AC_CHECK_LIB(nettle, nettle_md4_init, [HAVE_NETTLE=yes], [HAVE_NETTLE=no; AC_MSG_WARN(*** libnettle was not found. You will not be able to use NTLM)])
|
||||||
|
|
||||||
|
if test x"$HAVE_NETTLE" = xyes
|
||||||
|
then
|
||||||
|
AC_SUBST(NETTLE_LIBS, "-lnettle")
|
||||||
|
AC_DEFINE([HAVE_NETTLE], [1], [Use libnettle])
|
||||||
|
if test x"$ENABLE_NTLM" != xno
|
||||||
|
then
|
||||||
|
ENABLE_NTLM=yes
|
||||||
|
AC_DEFINE([ENABLE_NTLM], 1,
|
||||||
|
[Define if you want the NTLM authorization support compiled in.])
|
||||||
|
AC_LIBOBJ([http-ntlm])
|
||||||
|
LIBS="$NETTLE_LIBS $LIBS"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
dnl If SSL is unavailable and the user explicitly requested NTLM,
|
||||||
|
dnl abort.
|
||||||
|
if test x"$ENABLE_NTLM" = xyes
|
||||||
|
then
|
||||||
|
AC_MSG_ERROR([NTLM authorization requested and SSL not enabled; aborting])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl **********************************************************************
|
||||||
|
dnl Checks for IPv6
|
||||||
|
dnl **********************************************************************
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl We test for IPv6 by checking, in turn, for availability of
|
||||||
|
dnl presence of the INET6 address/protocol family and the existence of
|
||||||
|
dnl struct sockaddr_in6. If any of them is missing, IPv6 is disabled,
|
||||||
|
dnl and the code reverts to old-style gethostbyname.
|
||||||
|
dnl
|
||||||
|
dnl If --enable-ipv6 is explicitly specified on the configure command
|
||||||
|
dnl line, we check for IPv6 and abort if not found. If --disable-ipv6
|
||||||
|
dnl is specified, we disable IPv6 and don't check for it. The default
|
||||||
|
dnl is to autodetect IPv6 and use it where available.
|
||||||
|
dnl
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(ipv6,
|
||||||
|
AC_HELP_STRING([--disable-ipv6],[disable IPv6 support]),
|
||||||
|
[case "${enable_ipv6}" in
|
||||||
|
no)
|
||||||
|
AC_MSG_NOTICE([disabling IPv6 at user request])
|
||||||
|
dnl Disable IPv6 checking
|
||||||
|
ipv6=no
|
||||||
|
;;
|
||||||
|
yes)
|
||||||
|
dnl IPv6 explicitly enabled: force its use (abort if unavailable).
|
||||||
|
ipv6=yes
|
||||||
|
force_ipv6=yes
|
||||||
|
;;
|
||||||
|
auto)
|
||||||
|
dnl Auto-detect IPv6, i.e. check for IPv6, but don't force it.
|
||||||
|
ipv6=yes
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
AC_MSG_ERROR([Invalid --enable-ipv6 argument \`$enable_ipv6'])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
], [
|
||||||
|
dnl If nothing is specified, assume auto-detection.
|
||||||
|
ipv6=yes
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
if test "X$ipv6" = "Xyes"; then
|
||||||
|
PROTO_INET6([], [
|
||||||
|
AC_MSG_NOTICE([Disabling IPv6 support: your system does not support the PF_INET6 protocol family])
|
||||||
|
ipv6=no
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "X$ipv6" = "Xyes"; then
|
||||||
|
TYPE_STRUCT_SOCKADDR_IN6([],[
|
||||||
|
AC_MSG_NOTICE([Disabling IPv6 support: your system does not support \`struct sockaddr_in6'])
|
||||||
|
ipv6=no
|
||||||
|
])
|
||||||
|
if test "X$ipv6" = "Xyes"; then
|
||||||
|
WGET_STRUCT_SOCKADDR_STORAGE
|
||||||
|
MEMBER_SIN6_SCOPE_ID
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "X$ipv6" = "Xyes"; then
|
||||||
|
AC_DEFINE([ENABLE_IPV6], 1, [Define if IPv6 support is enabled.])
|
||||||
|
AC_MSG_NOTICE([Enabling support for IPv6.])
|
||||||
|
elif test "x$force_ipv6" = "xyes"; then
|
||||||
|
AC_MSG_ERROR([IPv6 support requested but not found; aborting])
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Find makeinfo. We used to provide support for Emacs processing
|
||||||
|
dnl Texinfo using `emacs -batch -eval ...' where makeinfo is
|
||||||
|
dnl unavailable, but that broke with the addition of makeinfo-specific
|
||||||
|
dnl command-line options, such as `-I'. Now we depend on makeinfo to
|
||||||
|
dnl build the Info documentation.
|
||||||
|
dnl
|
||||||
|
|
||||||
|
AC_CHECK_PROGS(MAKEINFO, [makeinfo], [true])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Find perl and pod2man
|
||||||
|
dnl
|
||||||
|
|
||||||
|
AC_PATH_PROGS(PERL, [perl5 perl], no)
|
||||||
|
AC_PATH_PROG(POD2MAN, pod2man, no)
|
||||||
|
|
||||||
|
if test "x${POD2MAN}" = xno; then
|
||||||
|
COMMENT_IF_NO_POD2MAN="# "
|
||||||
|
else
|
||||||
|
COMMENT_IF_NO_POD2MAN=
|
||||||
|
fi
|
||||||
|
AC_SUBST(COMMENT_IF_NO_POD2MAN)
|
||||||
|
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Check for IDN/IRIs
|
||||||
|
dnl
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(iri,
|
||||||
|
AC_HELP_STRING([--disable-iri],[disable IDN/IRIs support]),
|
||||||
|
[case "${enable_iri}" in
|
||||||
|
no)
|
||||||
|
dnl Disable IRIs checking
|
||||||
|
AC_MSG_NOTICE([disabling IRIs at user request])
|
||||||
|
iri=no
|
||||||
|
;;
|
||||||
|
yes)
|
||||||
|
dnl IRIs explicitly enabled
|
||||||
|
iri=yes
|
||||||
|
force_iri=yes
|
||||||
|
;;
|
||||||
|
auto)
|
||||||
|
dnl Auto-detect IRI
|
||||||
|
iri=yes
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
AC_MSG_ERROR([Invalid --enable-iri argument \`$enable_iri'])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
], [
|
||||||
|
dnl If nothing is specified, assume auto-detection
|
||||||
|
iri=yes
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
AS_IF([test "X$iri" != "Xno"],[
|
||||||
|
if test "X$am_cv_func_iconv" != "Xyes"; then
|
||||||
|
iri=no
|
||||||
|
if test "X$force_iri" = "Xyes"; then
|
||||||
|
AC_MSG_ERROR([Libiconv is required for IRIs support])
|
||||||
|
else
|
||||||
|
AC_MSG_NOTICE([disabling IRIs because libiconv wasn't found])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_ARG_WITH(libidn, AC_HELP_STRING([--with-libidn=[DIR]],
|
||||||
|
[Support IDN2008/IRIs (needs GNU libidn2 + libunicode)]),
|
||||||
|
libidn=$withval, libidn="")
|
||||||
|
if test "X$iri" != "Xno"; then
|
||||||
|
AS_IF([test "x$with_libidn2" != xno], [
|
||||||
|
AC_SEARCH_LIBS(idn2_lookup_u8, idn2,
|
||||||
|
[with_libidn2=yes; AC_DEFINE([ENABLE_IRI], 1, [Define if IRI support is enabled.])],
|
||||||
|
[with_libidn2=no; iri=no; AC_MSG_WARN(*** LIBIDN2 was not found. You will not be able to use IDN2008 support)])
|
||||||
|
|
||||||
|
# AS_IF([test "x$with_libidn2" = xyes], [
|
||||||
|
# AC_SEARCH_LIBS(u8_tolower, unistring,
|
||||||
|
# [AC_DEFINE([ENABLE_IRI], 1, [Define if IRI support is enabled.])],
|
||||||
|
# [iri=no; AC_MSG_WARN(*** LIBUNISTRING was not found. You will not be able to use IDN2008 support)])
|
||||||
|
# ])
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Check for UUID
|
||||||
|
dnl
|
||||||
|
|
||||||
|
AC_ARG_WITH(libuuid, AC_HELP_STRING([--without-libuuid],
|
||||||
|
[Generate UUIDs for WARC files via libuuid]))
|
||||||
|
|
||||||
|
AS_IF([test "x$with_libuuid" = xyes], [
|
||||||
|
# libuuid was explicitly requested
|
||||||
|
PKG_CHECK_MODULES([UUID], uuid, [
|
||||||
|
LIBS="$UUID_LIBS $LIBS"
|
||||||
|
CFLAGS="$UUID_CFLAGS $CFLAGS"
|
||||||
|
uuid_mode=1
|
||||||
|
], [
|
||||||
|
AC_SEARCH_LIBS(uuid_generate, uuid,
|
||||||
|
[uuid_mode=1],
|
||||||
|
[AC_MSG_ERROR(*** libuuid was explicitly requested but wasn't found.)])
|
||||||
|
])
|
||||||
|
], [test "x$with_libuuid" = xno], [
|
||||||
|
# libuuid was explicitly *not* requested
|
||||||
|
AC_CHECK_HEADER(uuid.h,
|
||||||
|
AC_CHECK_FUNC(uuid_create, [uuid_mode=2]))
|
||||||
|
], [
|
||||||
|
# default:
|
||||||
|
AC_CHECK_HEADER(uuid.h, [
|
||||||
|
AC_CHECK_FUNC(uuid_create, [uuid_mode=2])
|
||||||
|
], [
|
||||||
|
AC_CHECK_HEADER(uuid/uuid.h,
|
||||||
|
AC_SEARCH_LIBS(uuid_generate, uuid, [uuid_mode=1]))
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
AS_IF([test "x$uuid_mode" = x1], [
|
||||||
|
AC_DEFINE([HAVE_LIBUUID], [1], [Define if using libuuid.])
|
||||||
|
], [test "x$uuid_mode" = x2], [
|
||||||
|
AC_DEFINE([HAVE_UUID_CREATE], 1, [Define if uuid_create is available.])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Check for PCRE2 / PCRE
|
||||||
|
dnl
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(pcre2, AC_HELP_STRING([--disable-pcre2],
|
||||||
|
[Disable PCRE2 style regular expressions]))
|
||||||
|
AC_ARG_ENABLE(pcre, AC_HELP_STRING([--disable-pcre],
|
||||||
|
[Disable PCRE style regular expressions]))
|
||||||
|
|
||||||
|
AS_IF([test "X$enable_pcre2" != "Xno"],[
|
||||||
|
enable_pcre2=no
|
||||||
|
PKG_CHECK_MODULES([PCRE2], libpcre2-8, [
|
||||||
|
CFLAGS="$PCRE2_CFLAGS $CFLAGS"
|
||||||
|
LIBS="$PCRE2_LIBS $LIBS"
|
||||||
|
AC_DEFINE([HAVE_LIBPCRE2], [1], [Define if libpcre2 is available.])
|
||||||
|
enable_pcre2=yes
|
||||||
|
], [
|
||||||
|
AC_CHECK_HEADER(pcre2.h, [
|
||||||
|
AC_CHECK_LIB(pcre2-8, pcre2_compile_8, [
|
||||||
|
LIBS="${LIBS} -lpcre2-8"
|
||||||
|
AC_DEFINE([HAVE_LIBPCRE2], 1, [Define if libpcre2 is available.])
|
||||||
|
enable_pcre2=yes
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
AS_IF([test "X$enable_pcre" != "Xno" && test "X$enable_pcre2" != "Xyes"],[
|
||||||
|
PKG_CHECK_MODULES([PCRE], libpcre, [
|
||||||
|
CFLAGS="$PCRE_CFLAGS $CFLAGS"
|
||||||
|
AC_CHECK_HEADER(pcre.h, [
|
||||||
|
LIBS="$PCRE_LIBS $LIBS"
|
||||||
|
AC_DEFINE([HAVE_LIBPCRE], [1], [Define if libpcre is available.])
|
||||||
|
enable_pcre=yes
|
||||||
|
])
|
||||||
|
], [
|
||||||
|
AC_CHECK_HEADER(pcre.h, [
|
||||||
|
AC_CHECK_LIB(pcre, pcre_compile, [
|
||||||
|
LIBS="${LIBS} -lpcre"
|
||||||
|
AC_DEFINE([HAVE_LIBPCRE], 1, [Define if libpcre is available.])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
AS_IF([test "X$enable_pcre2" = Xyes], [PCRE_INFO="yes, via libpcre2"], [test "X$enable_pcre" = Xyes], [PCRE_INFO="yes, via libpcre"], [PCRE_INFO=no])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Check for libcares (resolver library)
|
||||||
|
dnl
|
||||||
|
|
||||||
|
AS_IF([test "X$with_cares" = "Xyes"],[
|
||||||
|
PKG_CHECK_MODULES([CARES], libcares, [
|
||||||
|
CFLAGS="$CARES_CFLAGS $CFLAGS"
|
||||||
|
AC_CHECK_HEADER(ares.h, [
|
||||||
|
LIBS="$CARES_LIBS $LIBS"
|
||||||
|
AC_DEFINE([HAVE_LIBCARES], [1], [Define if libcares is available.])
|
||||||
|
RESOLVER_INFO="libcares, --bind-dns-address and --dns-servers available"
|
||||||
|
])
|
||||||
|
], [
|
||||||
|
AC_CHECK_HEADER(ares.h, [
|
||||||
|
AC_CHECK_LIB(cares, ares_set_local_ip4, [
|
||||||
|
LIBS="-lcares ${LIBS}"
|
||||||
|
AC_DEFINE([HAVE_LIBCARES], 1, [Define if libcares is available.])
|
||||||
|
RESOLVER_INFO="libcares, --bind-dns-address and --dns-servers available"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
], [
|
||||||
|
RESOLVER_INFO="libc, --bind-dns-address and --dns-servers not available"
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Check for libmetalink
|
||||||
|
dnl
|
||||||
|
AS_IF([test x"$with_metalink" != xno], [
|
||||||
|
PKG_CHECK_MODULES([METALINK], libmetalink, [
|
||||||
|
LIBS="$METALINK_LIBS $LIBS"
|
||||||
|
CFLAGS="$METALINK_CFLAGS $CFLAGS"
|
||||||
|
AC_DEFINE([HAVE_METALINK], [1], [Define if using metalink.])
|
||||||
|
with_metalink=yes
|
||||||
|
], [
|
||||||
|
with_metalink=no
|
||||||
|
])
|
||||||
|
|
||||||
|
have_gpg=no
|
||||||
|
AS_IF([test x"$with_metalink" = xyes], [
|
||||||
|
dnl
|
||||||
|
dnl Check for GPGME
|
||||||
|
dnl
|
||||||
|
m4_ifdef([AM_PATH_GPGME], [
|
||||||
|
AM_PATH_GPGME([], [
|
||||||
|
# Put libgpgme to the end of the library list since it introduces a -L linker flags.
|
||||||
|
# That -L might break the build if there are two different version of
|
||||||
|
# a library (e.g. GnuTLS) in /usr/local and in the system directory.
|
||||||
|
LIBS="$LIBS $GPGME_LIBS"
|
||||||
|
CFLAGS="$GPGME_CFLAGS $CFLAGS"
|
||||||
|
AC_DEFINE([HAVE_GPGME], [1], [Define if GPGME is available.])
|
||||||
|
have_gpg=yes
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Extended Attribute support
|
||||||
|
dnl
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([xattr],
|
||||||
|
[AS_HELP_STRING([--disable-xattr], [disable support for POSIX Extended Attributes])],
|
||||||
|
[ENABLE_XATTR=$enableval],
|
||||||
|
[ENABLE_XATTR=yes])
|
||||||
|
|
||||||
|
case "$host_os" in
|
||||||
|
*linux* | *darwin*) xattr_syscalls="fsetxattr" ;;
|
||||||
|
freebsd*) xattr_syscalls="extattr_set_fd" ;;
|
||||||
|
*) AC_MSG_NOTICE([Disabling Extended Attribute support: your system is not known to support extended attributes.])
|
||||||
|
ENABLE_XATTR=no
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test "X${ENABLE_XATTR}" = "Xyes"; then
|
||||||
|
AC_CHECK_FUNCS([$xattr_syscalls], [], [
|
||||||
|
AC_MSG_NOTICE([Disabling Extended Attribute support: your system does not support $xattr_syscalls])
|
||||||
|
ENABLE_XATTR=no
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
|
||||||
|
test "X${ENABLE_XATTR}" = "Xyes" && AC_DEFINE([ENABLE_XATTR], 1,
|
||||||
|
[Define if you want file meta-data storing into POSIX Extended Attributes compiled in.])
|
||||||
|
|
||||||
|
dnl Needed by src/Makefile.am
|
||||||
|
AM_CONDITIONAL([IRI_IS_ENABLED], [test "X$iri" != "Xno"])
|
||||||
|
AM_CONDITIONAL([WITH_SSL], [test "X$with_ssl" != "Xno"])
|
||||||
|
AM_CONDITIONAL([METALINK_IS_ENABLED], [test "X$with_metalink" != "Xno"])
|
||||||
|
AM_CONDITIONAL([WITH_XATTR], [test "X$ENABLE_XATTR" != "Xno"])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Create output
|
||||||
|
dnl
|
||||||
|
AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile util/Makefile
|
||||||
|
po/Makefile.in tests/Makefile fuzz/Makefile
|
||||||
|
lib/Makefile testenv/Makefile
|
||||||
|
tests/certs/interca.conf tests/certs/rootca.conf])
|
||||||
|
AC_CONFIG_HEADERS([src/config.h])
|
||||||
|
AC_OUTPUT
|
||||||
|
|
||||||
|
AC_MSG_NOTICE([Summary of build options:
|
||||||
|
|
||||||
|
Version: $PACKAGE_VERSION
|
||||||
|
Host OS: $host_os
|
||||||
|
Install prefix: $prefix
|
||||||
|
Compiler: $CC
|
||||||
|
CFlags: $CFLAGS $CPPFLAGS
|
||||||
|
LDFlags: $LDFLAGS
|
||||||
|
Libs: $LIBS
|
||||||
|
SSL: $with_ssl
|
||||||
|
Zlib: $with_zlib
|
||||||
|
PSL: $with_libpsl
|
||||||
|
PCRE: $PCRE_INFO
|
||||||
|
Digest: $ENABLE_DIGEST
|
||||||
|
NTLM: $ENABLE_NTLM
|
||||||
|
OPIE: $ENABLE_OPIE
|
||||||
|
POSIX xattr: $ENABLE_XATTR
|
||||||
|
Debugging: $ENABLE_DEBUG
|
||||||
|
Assertions: $ENABLE_ASSERTION
|
||||||
|
Valgrind: $VALGRIND_INFO
|
||||||
|
Metalink: $with_metalink
|
||||||
|
Resolver: $RESOLVER_INFO
|
||||||
|
GPGME: $have_gpg
|
||||||
|
IRI: $iri
|
||||||
|
Fuzzing build: $enable_fuzzing, $LIB_FUZZING_ENGINE
|
||||||
|
])
|
|
@ -0,0 +1,119 @@
|
||||||
|
# Makefile for `wget' utility
|
||||||
|
# Copyright (C) 1995-1997, 2007-2011, 2015, 2018-2019 Free Software
|
||||||
|
# Foundation, Inc.
|
||||||
|
|
||||||
|
# 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#
|
||||||
|
# Version: @VERSION@
|
||||||
|
#
|
||||||
|
|
||||||
|
# Program to convert DVI files to PostScript
|
||||||
|
DVIPS = dvips -D 300
|
||||||
|
# Program to convert texinfo files to html
|
||||||
|
TEXI2HTML = texi2html -expandinfo -split_chapter
|
||||||
|
|
||||||
|
manext = 1
|
||||||
|
RM = rm -f
|
||||||
|
|
||||||
|
TEXI2POD = $(srcdir)/texi2pod.pl
|
||||||
|
POD2MAN = @POD2MAN@
|
||||||
|
MAN = wget.$(manext)
|
||||||
|
WGETRC = $(sysconfdir)/wgetrc
|
||||||
|
SAMPLERCTEXI = sample.wgetrc.munged_for_texi_inclusion
|
||||||
|
|
||||||
|
#
|
||||||
|
# Dependencies for building
|
||||||
|
#
|
||||||
|
|
||||||
|
man_MANS = $(MAN)
|
||||||
|
|
||||||
|
all: wget.info @COMMENT_IF_NO_POD2MAN@$(MAN)
|
||||||
|
|
||||||
|
everything: all wget_us.ps wget_a4.ps wget_toc.html
|
||||||
|
|
||||||
|
$(SAMPLERCTEXI): $(srcdir)/sample.wgetrc
|
||||||
|
sed s/@/@@/g $? > $@
|
||||||
|
|
||||||
|
info_TEXINFOS = wget.texi
|
||||||
|
wget_TEXINFOS = fdl.texi sample.wgetrc.munged_for_texi_inclusion
|
||||||
|
|
||||||
|
EXTRA_DIST = sample.wgetrc \
|
||||||
|
$(SAMPLERCTEXI) \
|
||||||
|
texi2pod.pl
|
||||||
|
|
||||||
|
wget.pod: $(srcdir)/wget.texi version.texi
|
||||||
|
$(TEXI2POD) -D VERSION="$(VERSION)" $(srcdir)/wget.texi $@
|
||||||
|
|
||||||
|
$(MAN): wget.pod
|
||||||
|
$(POD2MAN) --center="GNU Wget" --release="GNU Wget @VERSION@" --utf8 $? > $@ || \
|
||||||
|
$(POD2MAN) --center="GNU Wget" --release="GNU Wget @VERSION@" $? > $@
|
||||||
|
|
||||||
|
#wget.cat: $(MAN)
|
||||||
|
# nroff -man $? > $@
|
||||||
|
|
||||||
|
wget_us.ps: wget.dvi
|
||||||
|
$(DVIPS) -t letter -o $@ wget.dvi
|
||||||
|
|
||||||
|
wget_a4.ps: wget.dvi
|
||||||
|
$(DVIPS) -t a4 -o $@ wget.dvi
|
||||||
|
|
||||||
|
wget_toc.html: $(srcdir)/wget.texi
|
||||||
|
$(TEXI2HTML) $(srcdir)/wget.texi
|
||||||
|
|
||||||
|
#
|
||||||
|
# Dependencies for installing
|
||||||
|
#
|
||||||
|
|
||||||
|
# install all the documentation
|
||||||
|
install-data-local: install.wgetrc @COMMENT_IF_NO_POD2MAN@install.man
|
||||||
|
|
||||||
|
# uninstall all the documentation
|
||||||
|
uninstall-local: @COMMENT_IF_NO_POD2MAN@uninstall.man
|
||||||
|
|
||||||
|
|
||||||
|
# install man page, creating install directory if necessary
|
||||||
|
install.man: $(MAN)
|
||||||
|
$(mkinstalldirs) $(DESTDIR)$(mandir)/man$(manext)
|
||||||
|
$(INSTALL_DATA) $(MAN) $(DESTDIR)$(mandir)/man$(manext)/$(MAN)
|
||||||
|
|
||||||
|
# install sample.wgetrc
|
||||||
|
install.wgetrc: $(srcdir)/sample.wgetrc
|
||||||
|
$(mkinstalldirs) $(DESTDIR)$(sysconfdir)
|
||||||
|
@if test -f $(DESTDIR)$(WGETRC); then \
|
||||||
|
if cmp -s $(srcdir)/sample.wgetrc $(DESTDIR)$(WGETRC); then echo ""; \
|
||||||
|
else \
|
||||||
|
echo ' $(INSTALL_DATA) $(srcdir)/sample.wgetrc $(DESTDIR)$(WGETRC).new'; \
|
||||||
|
$(INSTALL_DATA) $(srcdir)/sample.wgetrc $(DESTDIR)$(WGETRC).new; \
|
||||||
|
echo; \
|
||||||
|
echo "WARNING: Differing \`$(DESTDIR)$(WGETRC)'"; \
|
||||||
|
echo " exists and has been spared. You might want to"; \
|
||||||
|
echo " consider merging in the new lines from"; \
|
||||||
|
echo " \`$(DESTDIR)$(WGETRC).new'."; \
|
||||||
|
echo; \
|
||||||
|
fi; \
|
||||||
|
else \
|
||||||
|
$(INSTALL_DATA) $(srcdir)/sample.wgetrc $(DESTDIR)$(WGETRC); \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# uninstall man page
|
||||||
|
uninstall.man:
|
||||||
|
$(RM) $(DESTDIR)$(mandir)/man$(manext)/$(MAN)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Dependencies for cleanup
|
||||||
|
#
|
||||||
|
|
||||||
|
CLEANFILES = *~ *.bak *.cat *.pod
|
||||||
|
DISTCLEANFILES = $(MAN)
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,506 @@
|
||||||
|
@c The GNU Free Documentation License.
|
||||||
|
@center Version 1.3, 3 November 2008
|
||||||
|
|
||||||
|
@c This file is intended to be included within another document,
|
||||||
|
@c hence no sectioning command or @node.
|
||||||
|
|
||||||
|
@display
|
||||||
|
Copyright @copyright{} 2000-2002, 2007-2008, 2015, 2018-2019 Free
|
||||||
|
Software Foundation, Inc.
|
||||||
|
@uref{http://fsf.org/}
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
@end display
|
||||||
|
|
||||||
|
@enumerate 0
|
||||||
|
@item
|
||||||
|
PREAMBLE
|
||||||
|
|
||||||
|
The purpose of this License is to make a manual, textbook, or other
|
||||||
|
functional and useful document @dfn{free} in the sense of freedom: to
|
||||||
|
assure everyone the effective freedom to copy and redistribute it,
|
||||||
|
with or without modifying it, either commercially or noncommercially.
|
||||||
|
Secondarily, this License preserves for the author and publisher a way
|
||||||
|
to get credit for their work, while not being considered responsible
|
||||||
|
for modifications made by others.
|
||||||
|
|
||||||
|
This License is a kind of ``copyleft'', which means that derivative
|
||||||
|
works of the document must themselves be free in the same sense. It
|
||||||
|
complements the GNU General Public License, which is a copyleft
|
||||||
|
license designed for free software.
|
||||||
|
|
||||||
|
We have designed this License in order to use it for manuals for free
|
||||||
|
software, because free software needs free documentation: a free
|
||||||
|
program should come with manuals providing the same freedoms that the
|
||||||
|
software does. But this License is not limited to software manuals;
|
||||||
|
it can be used for any textual work, regardless of subject matter or
|
||||||
|
whether it is published as a printed book. We recommend this License
|
||||||
|
principally for works whose purpose is instruction or reference.
|
||||||
|
|
||||||
|
@item
|
||||||
|
APPLICABILITY AND DEFINITIONS
|
||||||
|
|
||||||
|
This License applies to any manual or other work, in any medium, that
|
||||||
|
contains a notice placed by the copyright holder saying it can be
|
||||||
|
distributed under the terms of this License. Such a notice grants a
|
||||||
|
world-wide, royalty-free license, unlimited in duration, to use that
|
||||||
|
work under the conditions stated herein. The ``Document'', below,
|
||||||
|
refers to any such manual or work. Any member of the public is a
|
||||||
|
licensee, and is addressed as ``you''. You accept the license if you
|
||||||
|
copy, modify or distribute the work in a way requiring permission
|
||||||
|
under copyright law.
|
||||||
|
|
||||||
|
A ``Modified Version'' of the Document means any work containing the
|
||||||
|
Document or a portion of it, either copied verbatim, or with
|
||||||
|
modifications and/or translated into another language.
|
||||||
|
|
||||||
|
A ``Secondary Section'' is a named appendix or a front-matter section
|
||||||
|
of the Document that deals exclusively with the relationship of the
|
||||||
|
publishers or authors of the Document to the Document's overall
|
||||||
|
subject (or to related matters) and contains nothing that could fall
|
||||||
|
directly within that overall subject. (Thus, if the Document is in
|
||||||
|
part a textbook of mathematics, a Secondary Section may not explain
|
||||||
|
any mathematics.) The relationship could be a matter of historical
|
||||||
|
connection with the subject or with related matters, or of legal,
|
||||||
|
commercial, philosophical, ethical or political position regarding
|
||||||
|
them.
|
||||||
|
|
||||||
|
The ``Invariant Sections'' are certain Secondary Sections whose titles
|
||||||
|
are designated, as being those of Invariant Sections, in the notice
|
||||||
|
that says that the Document is released under this License. If a
|
||||||
|
section does not fit the above definition of Secondary then it is not
|
||||||
|
allowed to be designated as Invariant. The Document may contain zero
|
||||||
|
Invariant Sections. If the Document does not identify any Invariant
|
||||||
|
Sections then there are none.
|
||||||
|
|
||||||
|
The ``Cover Texts'' are certain short passages of text that are listed,
|
||||||
|
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
|
||||||
|
the Document is released under this License. A Front-Cover Text may
|
||||||
|
be at most 5 words, and a Back-Cover Text may be at most 25 words.
|
||||||
|
|
||||||
|
A ``Transparent'' copy of the Document means a machine-readable copy,
|
||||||
|
represented in a format whose specification is available to the
|
||||||
|
general public, that is suitable for revising the document
|
||||||
|
straightforwardly with generic text editors or (for images composed of
|
||||||
|
pixels) generic paint programs or (for drawings) some widely available
|
||||||
|
drawing editor, and that is suitable for input to text formatters or
|
||||||
|
for automatic translation to a variety of formats suitable for input
|
||||||
|
to text formatters. A copy made in an otherwise Transparent file
|
||||||
|
format whose markup, or absence of markup, has been arranged to thwart
|
||||||
|
or discourage subsequent modification by readers is not Transparent.
|
||||||
|
An image format is not Transparent if used for any substantial amount
|
||||||
|
of text. A copy that is not ``Transparent'' is called ``Opaque''.
|
||||||
|
|
||||||
|
Examples of suitable formats for Transparent copies include plain
|
||||||
|
ASCII without markup, Texinfo input format, La@TeX{} input
|
||||||
|
format, SGML or XML using a publicly available
|
||||||
|
DTD, and standard-conforming simple HTML,
|
||||||
|
PostScript or PDF designed for human modification. Examples
|
||||||
|
of transparent image formats include PNG, XCF and
|
||||||
|
JPG@. Opaque formats include proprietary formats that can be
|
||||||
|
read and edited only by proprietary word processors, SGML or
|
||||||
|
XML for which the DTD and/or processing tools are
|
||||||
|
not generally available, and the machine-generated HTML,
|
||||||
|
PostScript or PDF produced by some word processors for
|
||||||
|
output purposes only.
|
||||||
|
|
||||||
|
The ``Title Page'' means, for a printed book, the title page itself,
|
||||||
|
plus such following pages as are needed to hold, legibly, the material
|
||||||
|
this License requires to appear in the title page. For works in
|
||||||
|
formats which do not have any title page as such, ``Title Page'' means
|
||||||
|
the text near the most prominent appearance of the work's title,
|
||||||
|
preceding the beginning of the body of the text.
|
||||||
|
|
||||||
|
The ``publisher'' means any person or entity that distributes copies
|
||||||
|
of the Document to the public.
|
||||||
|
|
||||||
|
A section ``Entitled XYZ'' means a named subunit of the Document whose
|
||||||
|
title either is precisely XYZ or contains XYZ in parentheses following
|
||||||
|
text that translates XYZ in another language. (Here XYZ stands for a
|
||||||
|
specific section name mentioned below, such as ``Acknowledgements'',
|
||||||
|
``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
|
||||||
|
of such a section when you modify the Document means that it remains a
|
||||||
|
section ``Entitled XYZ'' according to this definition.
|
||||||
|
|
||||||
|
The Document may include Warranty Disclaimers next to the notice which
|
||||||
|
states that this License applies to the Document. These Warranty
|
||||||
|
Disclaimers are considered to be included by reference in this
|
||||||
|
License, but only as regards disclaiming warranties: any other
|
||||||
|
implication that these Warranty Disclaimers may have is void and has
|
||||||
|
no effect on the meaning of this License.
|
||||||
|
|
||||||
|
@item
|
||||||
|
VERBATIM COPYING
|
||||||
|
|
||||||
|
You may copy and distribute the Document in any medium, either
|
||||||
|
commercially or noncommercially, provided that this License, the
|
||||||
|
copyright notices, and the license notice saying this License applies
|
||||||
|
to the Document are reproduced in all copies, and that you add no other
|
||||||
|
conditions whatsoever to those of this License. You may not use
|
||||||
|
technical measures to obstruct or control the reading or further
|
||||||
|
copying of the copies you make or distribute. However, you may accept
|
||||||
|
compensation in exchange for copies. If you distribute a large enough
|
||||||
|
number of copies you must also follow the conditions in section 3.
|
||||||
|
|
||||||
|
You may also lend copies, under the same conditions stated above, and
|
||||||
|
you may publicly display copies.
|
||||||
|
|
||||||
|
@item
|
||||||
|
COPYING IN QUANTITY
|
||||||
|
|
||||||
|
If you publish printed copies (or copies in media that commonly have
|
||||||
|
printed covers) of the Document, numbering more than 100, and the
|
||||||
|
Document's license notice requires Cover Texts, you must enclose the
|
||||||
|
copies in covers that carry, clearly and legibly, all these Cover
|
||||||
|
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
|
||||||
|
the back cover. Both covers must also clearly and legibly identify
|
||||||
|
you as the publisher of these copies. The front cover must present
|
||||||
|
the full title with all words of the title equally prominent and
|
||||||
|
visible. You may add other material on the covers in addition.
|
||||||
|
Copying with changes limited to the covers, as long as they preserve
|
||||||
|
the title of the Document and satisfy these conditions, can be treated
|
||||||
|
as verbatim copying in other respects.
|
||||||
|
|
||||||
|
If the required texts for either cover are too voluminous to fit
|
||||||
|
legibly, you should put the first ones listed (as many as fit
|
||||||
|
reasonably) on the actual cover, and continue the rest onto adjacent
|
||||||
|
pages.
|
||||||
|
|
||||||
|
If you publish or distribute Opaque copies of the Document numbering
|
||||||
|
more than 100, you must either include a machine-readable Transparent
|
||||||
|
copy along with each Opaque copy, or state in or with each Opaque copy
|
||||||
|
a computer-network location from which the general network-using
|
||||||
|
public has access to download using public-standard network protocols
|
||||||
|
a complete Transparent copy of the Document, free of added material.
|
||||||
|
If you use the latter option, you must take reasonably prudent steps,
|
||||||
|
when you begin distribution of Opaque copies in quantity, to ensure
|
||||||
|
that this Transparent copy will remain thus accessible at the stated
|
||||||
|
location until at least one year after the last time you distribute an
|
||||||
|
Opaque copy (directly or through your agents or retailers) of that
|
||||||
|
edition to the public.
|
||||||
|
|
||||||
|
It is requested, but not required, that you contact the authors of the
|
||||||
|
Document well before redistributing any large number of copies, to give
|
||||||
|
them a chance to provide you with an updated version of the Document.
|
||||||
|
|
||||||
|
@item
|
||||||
|
MODIFICATIONS
|
||||||
|
|
||||||
|
You may copy and distribute a Modified Version of the Document under
|
||||||
|
the conditions of sections 2 and 3 above, provided that you release
|
||||||
|
the Modified Version under precisely this License, with the Modified
|
||||||
|
Version filling the role of the Document, thus licensing distribution
|
||||||
|
and modification of the Modified Version to whoever possesses a copy
|
||||||
|
of it. In addition, you must do these things in the Modified Version:
|
||||||
|
|
||||||
|
@enumerate A
|
||||||
|
@item
|
||||||
|
Use in the Title Page (and on the covers, if any) a title distinct
|
||||||
|
from that of the Document, and from those of previous versions
|
||||||
|
(which should, if there were any, be listed in the History section
|
||||||
|
of the Document). You may use the same title as a previous version
|
||||||
|
if the original publisher of that version gives permission.
|
||||||
|
|
||||||
|
@item
|
||||||
|
List on the Title Page, as authors, one or more persons or entities
|
||||||
|
responsible for authorship of the modifications in the Modified
|
||||||
|
Version, together with at least five of the principal authors of the
|
||||||
|
Document (all of its principal authors, if it has fewer than five),
|
||||||
|
unless they release you from this requirement.
|
||||||
|
|
||||||
|
@item
|
||||||
|
State on the Title page the name of the publisher of the
|
||||||
|
Modified Version, as the publisher.
|
||||||
|
|
||||||
|
@item
|
||||||
|
Preserve all the copyright notices of the Document.
|
||||||
|
|
||||||
|
@item
|
||||||
|
Add an appropriate copyright notice for your modifications
|
||||||
|
adjacent to the other copyright notices.
|
||||||
|
|
||||||
|
@item
|
||||||
|
Include, immediately after the copyright notices, a license notice
|
||||||
|
giving the public permission to use the Modified Version under the
|
||||||
|
terms of this License, in the form shown in the Addendum below.
|
||||||
|
|
||||||
|
@item
|
||||||
|
Preserve in that license notice the full lists of Invariant Sections
|
||||||
|
and required Cover Texts given in the Document's license notice.
|
||||||
|
|
||||||
|
@item
|
||||||
|
Include an unaltered copy of this License.
|
||||||
|
|
||||||
|
@item
|
||||||
|
Preserve the section Entitled ``History'', Preserve its Title, and add
|
||||||
|
to it an item stating at least the title, year, new authors, and
|
||||||
|
publisher of the Modified Version as given on the Title Page. If
|
||||||
|
there is no section Entitled ``History'' in the Document, create one
|
||||||
|
stating the title, year, authors, and publisher of the Document as
|
||||||
|
given on its Title Page, then add an item describing the Modified
|
||||||
|
Version as stated in the previous sentence.
|
||||||
|
|
||||||
|
@item
|
||||||
|
Preserve the network location, if any, given in the Document for
|
||||||
|
public access to a Transparent copy of the Document, and likewise
|
||||||
|
the network locations given in the Document for previous versions
|
||||||
|
it was based on. These may be placed in the ``History'' section.
|
||||||
|
You may omit a network location for a work that was published at
|
||||||
|
least four years before the Document itself, or if the original
|
||||||
|
publisher of the version it refers to gives permission.
|
||||||
|
|
||||||
|
@item
|
||||||
|
For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
|
||||||
|
the Title of the section, and preserve in the section all the
|
||||||
|
substance and tone of each of the contributor acknowledgements and/or
|
||||||
|
dedications given therein.
|
||||||
|
|
||||||
|
@item
|
||||||
|
Preserve all the Invariant Sections of the Document,
|
||||||
|
unaltered in their text and in their titles. Section numbers
|
||||||
|
or the equivalent are not considered part of the section titles.
|
||||||
|
|
||||||
|
@item
|
||||||
|
Delete any section Entitled ``Endorsements''. Such a section
|
||||||
|
may not be included in the Modified Version.
|
||||||
|
|
||||||
|
@item
|
||||||
|
Do not retitle any existing section to be Entitled ``Endorsements'' or
|
||||||
|
to conflict in title with any Invariant Section.
|
||||||
|
|
||||||
|
@item
|
||||||
|
Preserve any Warranty Disclaimers.
|
||||||
|
@end enumerate
|
||||||
|
|
||||||
|
If the Modified Version includes new front-matter sections or
|
||||||
|
appendices that qualify as Secondary Sections and contain no material
|
||||||
|
copied from the Document, you may at your option designate some or all
|
||||||
|
of these sections as invariant. To do this, add their titles to the
|
||||||
|
list of Invariant Sections in the Modified Version's license notice.
|
||||||
|
These titles must be distinct from any other section titles.
|
||||||
|
|
||||||
|
You may add a section Entitled ``Endorsements'', provided it contains
|
||||||
|
nothing but endorsements of your Modified Version by various
|
||||||
|
parties---for example, statements of peer review or that the text has
|
||||||
|
been approved by an organization as the authoritative definition of a
|
||||||
|
standard.
|
||||||
|
|
||||||
|
You may add a passage of up to five words as a Front-Cover Text, and a
|
||||||
|
passage of up to 25 words as a Back-Cover Text, to the end of the list
|
||||||
|
of Cover Texts in the Modified Version. Only one passage of
|
||||||
|
Front-Cover Text and one of Back-Cover Text may be added by (or
|
||||||
|
through arrangements made by) any one entity. If the Document already
|
||||||
|
includes a cover text for the same cover, previously added by you or
|
||||||
|
by arrangement made by the same entity you are acting on behalf of,
|
||||||
|
you may not add another; but you may replace the old one, on explicit
|
||||||
|
permission from the previous publisher that added the old one.
|
||||||
|
|
||||||
|
The author(s) and publisher(s) of the Document do not by this License
|
||||||
|
give permission to use their names for publicity for or to assert or
|
||||||
|
imply endorsement of any Modified Version.
|
||||||
|
|
||||||
|
@item
|
||||||
|
COMBINING DOCUMENTS
|
||||||
|
|
||||||
|
You may combine the Document with other documents released under this
|
||||||
|
License, under the terms defined in section 4 above for modified
|
||||||
|
versions, provided that you include in the combination all of the
|
||||||
|
Invariant Sections of all of the original documents, unmodified, and
|
||||||
|
list them all as Invariant Sections of your combined work in its
|
||||||
|
license notice, and that you preserve all their Warranty Disclaimers.
|
||||||
|
|
||||||
|
The combined work need only contain one copy of this License, and
|
||||||
|
multiple identical Invariant Sections may be replaced with a single
|
||||||
|
copy. If there are multiple Invariant Sections with the same name but
|
||||||
|
different contents, make the title of each such section unique by
|
||||||
|
adding at the end of it, in parentheses, the name of the original
|
||||||
|
author or publisher of that section if known, or else a unique number.
|
||||||
|
Make the same adjustment to the section titles in the list of
|
||||||
|
Invariant Sections in the license notice of the combined work.
|
||||||
|
|
||||||
|
In the combination, you must combine any sections Entitled ``History''
|
||||||
|
in the various original documents, forming one section Entitled
|
||||||
|
``History''; likewise combine any sections Entitled ``Acknowledgements'',
|
||||||
|
and any sections Entitled ``Dedications''. You must delete all
|
||||||
|
sections Entitled ``Endorsements.''
|
||||||
|
|
||||||
|
@item
|
||||||
|
COLLECTIONS OF DOCUMENTS
|
||||||
|
|
||||||
|
You may make a collection consisting of the Document and other documents
|
||||||
|
released under this License, and replace the individual copies of this
|
||||||
|
License in the various documents with a single copy that is included in
|
||||||
|
the collection, provided that you follow the rules of this License for
|
||||||
|
verbatim copying of each of the documents in all other respects.
|
||||||
|
|
||||||
|
You may extract a single document from such a collection, and distribute
|
||||||
|
it individually under this License, provided you insert a copy of this
|
||||||
|
License into the extracted document, and follow this License in all
|
||||||
|
other respects regarding verbatim copying of that document.
|
||||||
|
|
||||||
|
@item
|
||||||
|
AGGREGATION WITH INDEPENDENT WORKS
|
||||||
|
|
||||||
|
A compilation of the Document or its derivatives with other separate
|
||||||
|
and independent documents or works, in or on a volume of a storage or
|
||||||
|
distribution medium, is called an ``aggregate'' if the copyright
|
||||||
|
resulting from the compilation is not used to limit the legal rights
|
||||||
|
of the compilation's users beyond what the individual works permit.
|
||||||
|
When the Document is included in an aggregate, this License does not
|
||||||
|
apply to the other works in the aggregate which are not themselves
|
||||||
|
derivative works of the Document.
|
||||||
|
|
||||||
|
If the Cover Text requirement of section 3 is applicable to these
|
||||||
|
copies of the Document, then if the Document is less than one half of
|
||||||
|
the entire aggregate, the Document's Cover Texts may be placed on
|
||||||
|
covers that bracket the Document within the aggregate, or the
|
||||||
|
electronic equivalent of covers if the Document is in electronic form.
|
||||||
|
Otherwise they must appear on printed covers that bracket the whole
|
||||||
|
aggregate.
|
||||||
|
|
||||||
|
@item
|
||||||
|
TRANSLATION
|
||||||
|
|
||||||
|
Translation is considered a kind of modification, so you may
|
||||||
|
distribute translations of the Document under the terms of section 4.
|
||||||
|
Replacing Invariant Sections with translations requires special
|
||||||
|
permission from their copyright holders, but you may include
|
||||||
|
translations of some or all Invariant Sections in addition to the
|
||||||
|
original versions of these Invariant Sections. You may include a
|
||||||
|
translation of this License, and all the license notices in the
|
||||||
|
Document, and any Warranty Disclaimers, provided that you also include
|
||||||
|
the original English version of this License and the original versions
|
||||||
|
of those notices and disclaimers. In case of a disagreement between
|
||||||
|
the translation and the original version of this License or a notice
|
||||||
|
or disclaimer, the original version will prevail.
|
||||||
|
|
||||||
|
If a section in the Document is Entitled ``Acknowledgements'',
|
||||||
|
``Dedications'', or ``History'', the requirement (section 4) to Preserve
|
||||||
|
its Title (section 1) will typically require changing the actual
|
||||||
|
title.
|
||||||
|
|
||||||
|
@item
|
||||||
|
TERMINATION
|
||||||
|
|
||||||
|
You may not copy, modify, sublicense, or distribute the Document
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense, or distribute it is void, and
|
||||||
|
will automatically terminate your rights under this License.
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your license
|
||||||
|
from a particular copyright holder is reinstated (a) provisionally,
|
||||||
|
unless and until the copyright holder explicitly and finally
|
||||||
|
terminates your license, and (b) permanently, if the copyright holder
|
||||||
|
fails to notify you of the violation by some reasonable means prior to
|
||||||
|
60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, receipt of a copy of some or all of the same material does
|
||||||
|
not give you any rights to use it.
|
||||||
|
|
||||||
|
@item
|
||||||
|
FUTURE REVISIONS OF THIS LICENSE
|
||||||
|
|
||||||
|
The Free Software Foundation may publish new, revised versions
|
||||||
|
of the GNU Free Documentation 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. See
|
||||||
|
@uref{http://www.gnu.org/copyleft/}.
|
||||||
|
|
||||||
|
Each version of the License is given a distinguishing version number.
|
||||||
|
If the Document specifies that a particular numbered version of this
|
||||||
|
License ``or any later version'' applies to it, you have the option of
|
||||||
|
following the terms and conditions either of that specified version or
|
||||||
|
of any later version that has been published (not as a draft) by the
|
||||||
|
Free Software Foundation. If the Document does not specify a version
|
||||||
|
number of this License, you may choose any version ever published (not
|
||||||
|
as a draft) by the Free Software Foundation. If the Document
|
||||||
|
specifies that a proxy can decide which future versions of this
|
||||||
|
License can be used, that proxy's public statement of acceptance of a
|
||||||
|
version permanently authorizes you to choose that version for the
|
||||||
|
Document.
|
||||||
|
|
||||||
|
@item
|
||||||
|
RELICENSING
|
||||||
|
|
||||||
|
``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
|
||||||
|
World Wide Web server that publishes copyrightable works and also
|
||||||
|
provides prominent facilities for anybody to edit those works. A
|
||||||
|
public wiki that anybody can edit is an example of such a server. A
|
||||||
|
``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
|
||||||
|
site means any set of copyrightable works thus published on the MMC
|
||||||
|
site.
|
||||||
|
|
||||||
|
``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
|
||||||
|
license published by Creative Commons Corporation, a not-for-profit
|
||||||
|
corporation with a principal place of business in San Francisco,
|
||||||
|
California, as well as future copyleft versions of that license
|
||||||
|
published by that same organization.
|
||||||
|
|
||||||
|
``Incorporate'' means to publish or republish a Document, in whole or
|
||||||
|
in part, as part of another Document.
|
||||||
|
|
||||||
|
An MMC is ``eligible for relicensing'' if it is licensed under this
|
||||||
|
License, and if all works that were first published under this License
|
||||||
|
somewhere other than this MMC, and subsequently incorporated in whole
|
||||||
|
or in part into the MMC, (1) had no cover texts or invariant sections,
|
||||||
|
and (2) were thus incorporated prior to November 1, 2008.
|
||||||
|
|
||||||
|
The operator of an MMC Site may republish an MMC contained in the site
|
||||||
|
under CC-BY-SA on the same site at any time before August 1, 2009,
|
||||||
|
provided the MMC is eligible for relicensing.
|
||||||
|
|
||||||
|
@end enumerate
|
||||||
|
|
||||||
|
@page
|
||||||
|
@heading ADDENDUM: How to use this License for your documents
|
||||||
|
|
||||||
|
To use this License in a document you have written, include a copy of
|
||||||
|
the License in the document and put the following copyright and
|
||||||
|
license notices just after the title page:
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
@group
|
||||||
|
Copyright (C) @var{year} @var{your name}.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
||||||
|
Texts. A copy of the license is included in the section entitled ``GNU
|
||||||
|
Free Documentation License''.
|
||||||
|
@end group
|
||||||
|
@end smallexample
|
||||||
|
|
||||||
|
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
|
||||||
|
replace the ``with@dots{}Texts.''@: line with this:
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
@group
|
||||||
|
with the Invariant Sections being @var{list their titles}, with
|
||||||
|
the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
|
||||||
|
being @var{list}.
|
||||||
|
@end group
|
||||||
|
@end smallexample
|
||||||
|
|
||||||
|
If you have Invariant Sections without Cover Texts, or some other
|
||||||
|
combination of the three, merge those two alternatives to suit the
|
||||||
|
situation.
|
||||||
|
|
||||||
|
If your document contains nontrivial examples of program code, we
|
||||||
|
recommend releasing these examples in parallel under your choice of
|
||||||
|
free software license, such as the GNU General Public License,
|
||||||
|
to permit their use in free software.
|
||||||
|
|
||||||
|
@c Local Variables:
|
||||||
|
@c ispell-local-pdict: "ispell-dict"
|
||||||
|
@c End:
|
|
@ -0,0 +1,137 @@
|
||||||
|
###
|
||||||
|
### Sample Wget initialization file .wgetrc
|
||||||
|
###
|
||||||
|
|
||||||
|
## You can use this file to change the default behaviour of wget or to
|
||||||
|
## avoid having to type many many command-line options. This file does
|
||||||
|
## not contain a comprehensive list of commands -- look at the manual
|
||||||
|
## to find out what you can put into this file. You can find this here:
|
||||||
|
## $ info wget.info 'Startup File'
|
||||||
|
## Or online here:
|
||||||
|
## https://www.gnu.org/software/wget/manual/wget.html#Startup-File
|
||||||
|
##
|
||||||
|
## Wget initialization file can reside in /usr/local/etc/wgetrc
|
||||||
|
## (global, for all users) or $HOME/.wgetrc (for a single user).
|
||||||
|
##
|
||||||
|
## To use the settings in this file, you will have to uncomment them,
|
||||||
|
## as well as change them, in most cases, as the values on the
|
||||||
|
## commented-out lines are the default values (e.g. "off").
|
||||||
|
##
|
||||||
|
## Command are case-, underscore- and minus-insensitive.
|
||||||
|
## For example ftp_proxy, ftp-proxy and ftpproxy are the same.
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## Global settings (useful for setting up in /usr/local/etc/wgetrc).
|
||||||
|
## Think well before you change them, since they may reduce wget's
|
||||||
|
## functionality, and make it behave contrary to the documentation:
|
||||||
|
##
|
||||||
|
|
||||||
|
# You can set retrieve quota for beginners by specifying a value
|
||||||
|
# optionally followed by 'K' (kilobytes) or 'M' (megabytes). The
|
||||||
|
# default quota is unlimited.
|
||||||
|
#quota = inf
|
||||||
|
|
||||||
|
# You can lower (or raise) the default number of retries when
|
||||||
|
# downloading a file (default is 20).
|
||||||
|
#tries = 20
|
||||||
|
|
||||||
|
# Lowering the maximum depth of the recursive retrieval is handy to
|
||||||
|
# prevent newbies from going too "deep" when they unwittingly start
|
||||||
|
# the recursive retrieval. The default is 5.
|
||||||
|
#reclevel = 5
|
||||||
|
|
||||||
|
# By default Wget uses "passive FTP" transfer where the client
|
||||||
|
# initiates the data connection to the server rather than the other
|
||||||
|
# way around. That is required on systems behind NAT where the client
|
||||||
|
# computer cannot be easily reached from the Internet. However, some
|
||||||
|
# firewalls software explicitly supports active FTP and in fact has
|
||||||
|
# problems supporting passive transfer. If you are in such
|
||||||
|
# environment, use "passive_ftp = off" to revert to active FTP.
|
||||||
|
#passive_ftp = off
|
||||||
|
|
||||||
|
# The "wait" command below makes Wget wait between every connection.
|
||||||
|
# If, instead, you want Wget to wait only between retries of failed
|
||||||
|
# downloads, set waitretry to maximum number of seconds to wait (Wget
|
||||||
|
# will use "linear backoff", waiting 1 second after the first failure
|
||||||
|
# on a file, 2 seconds after the second failure, etc. up to this max).
|
||||||
|
#waitretry = 10
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## Local settings (for a user to set in his $HOME/.wgetrc). It is
|
||||||
|
## *highly* undesirable to put these settings in the global file, since
|
||||||
|
## they are potentially dangerous to "normal" users.
|
||||||
|
##
|
||||||
|
## Even when setting up your own ~/.wgetrc, you should know what you
|
||||||
|
## are doing before doing so.
|
||||||
|
##
|
||||||
|
|
||||||
|
# Set this to on to use timestamping by default:
|
||||||
|
#timestamping = off
|
||||||
|
|
||||||
|
# It is a good idea to make Wget send your email address in a `From:'
|
||||||
|
# header with your request (so that server administrators can contact
|
||||||
|
# you in case of errors). Wget does *not* send `From:' by default.
|
||||||
|
#header = From: Your Name <username@site.domain>
|
||||||
|
|
||||||
|
# You can set up other headers, like Accept-Language. Accept-Language
|
||||||
|
# is *not* sent by default.
|
||||||
|
#header = Accept-Language: en
|
||||||
|
|
||||||
|
# You can set the default proxies for Wget to use for http, https, and ftp.
|
||||||
|
# They will override the value in the environment.
|
||||||
|
#https_proxy = http://proxy.yoyodyne.com:18023/
|
||||||
|
#http_proxy = http://proxy.yoyodyne.com:18023/
|
||||||
|
#ftp_proxy = http://proxy.yoyodyne.com:18023/
|
||||||
|
|
||||||
|
# If you do not want to use proxy at all, set this to off.
|
||||||
|
#use_proxy = on
|
||||||
|
|
||||||
|
# You can customize the retrieval outlook. Valid options are default,
|
||||||
|
# binary, mega and micro.
|
||||||
|
#dot_style = default
|
||||||
|
|
||||||
|
# Setting this to off makes Wget not download /robots.txt. Be sure to
|
||||||
|
# know *exactly* what /robots.txt is and how it is used before changing
|
||||||
|
# the default!
|
||||||
|
#robots = on
|
||||||
|
|
||||||
|
# It can be useful to make Wget wait between connections. Set this to
|
||||||
|
# the number of seconds you want Wget to wait.
|
||||||
|
#wait = 0
|
||||||
|
|
||||||
|
# You can force creating directory structure, even if a single is being
|
||||||
|
# retrieved, by setting this to on.
|
||||||
|
#dirstruct = off
|
||||||
|
|
||||||
|
# You can turn on recursive retrieving by default (don't do this if
|
||||||
|
# you are not sure you know what it means) by setting this to on.
|
||||||
|
#recursive = off
|
||||||
|
|
||||||
|
# To always back up file X as X.orig before converting its links (due
|
||||||
|
# to -k / --convert-links / convert_links = on having been specified),
|
||||||
|
# set this variable to on:
|
||||||
|
#backup_converted = off
|
||||||
|
|
||||||
|
# To have Wget follow FTP links from HTML files by default, set this
|
||||||
|
# to on:
|
||||||
|
#follow_ftp = off
|
||||||
|
|
||||||
|
# To try ipv6 addresses first:
|
||||||
|
#prefer-family = IPv6
|
||||||
|
|
||||||
|
# Set default IRI support state
|
||||||
|
#iri = off
|
||||||
|
|
||||||
|
# Force the default system encoding
|
||||||
|
#localencoding = UTF-8
|
||||||
|
|
||||||
|
# Force the default remote server encoding
|
||||||
|
#remoteencoding = UTF-8
|
||||||
|
|
||||||
|
# Turn on to prevent following non-HTTPS links when in recursive mode
|
||||||
|
#httpsonly = off
|
||||||
|
|
||||||
|
# Tune HTTPS security (auto, SSLv2, SSLv3, TLSv1, PFS)
|
||||||
|
#secureprotocol = auto
|
|
@ -0,0 +1,137 @@
|
||||||
|
###
|
||||||
|
### Sample Wget initialization file .wgetrc
|
||||||
|
###
|
||||||
|
|
||||||
|
## You can use this file to change the default behaviour of wget or to
|
||||||
|
## avoid having to type many many command-line options. This file does
|
||||||
|
## not contain a comprehensive list of commands -- look at the manual
|
||||||
|
## to find out what you can put into this file. You can find this here:
|
||||||
|
## $ info wget.info 'Startup File'
|
||||||
|
## Or online here:
|
||||||
|
## https://www.gnu.org/software/wget/manual/wget.html#Startup-File
|
||||||
|
##
|
||||||
|
## Wget initialization file can reside in /usr/local/etc/wgetrc
|
||||||
|
## (global, for all users) or $HOME/.wgetrc (for a single user).
|
||||||
|
##
|
||||||
|
## To use the settings in this file, you will have to uncomment them,
|
||||||
|
## as well as change them, in most cases, as the values on the
|
||||||
|
## commented-out lines are the default values (e.g. "off").
|
||||||
|
##
|
||||||
|
## Command are case-, underscore- and minus-insensitive.
|
||||||
|
## For example ftp_proxy, ftp-proxy and ftpproxy are the same.
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## Global settings (useful for setting up in /usr/local/etc/wgetrc).
|
||||||
|
## Think well before you change them, since they may reduce wget's
|
||||||
|
## functionality, and make it behave contrary to the documentation:
|
||||||
|
##
|
||||||
|
|
||||||
|
# You can set retrieve quota for beginners by specifying a value
|
||||||
|
# optionally followed by 'K' (kilobytes) or 'M' (megabytes). The
|
||||||
|
# default quota is unlimited.
|
||||||
|
#quota = inf
|
||||||
|
|
||||||
|
# You can lower (or raise) the default number of retries when
|
||||||
|
# downloading a file (default is 20).
|
||||||
|
#tries = 20
|
||||||
|
|
||||||
|
# Lowering the maximum depth of the recursive retrieval is handy to
|
||||||
|
# prevent newbies from going too "deep" when they unwittingly start
|
||||||
|
# the recursive retrieval. The default is 5.
|
||||||
|
#reclevel = 5
|
||||||
|
|
||||||
|
# By default Wget uses "passive FTP" transfer where the client
|
||||||
|
# initiates the data connection to the server rather than the other
|
||||||
|
# way around. That is required on systems behind NAT where the client
|
||||||
|
# computer cannot be easily reached from the Internet. However, some
|
||||||
|
# firewalls software explicitly supports active FTP and in fact has
|
||||||
|
# problems supporting passive transfer. If you are in such
|
||||||
|
# environment, use "passive_ftp = off" to revert to active FTP.
|
||||||
|
#passive_ftp = off
|
||||||
|
|
||||||
|
# The "wait" command below makes Wget wait between every connection.
|
||||||
|
# If, instead, you want Wget to wait only between retries of failed
|
||||||
|
# downloads, set waitretry to maximum number of seconds to wait (Wget
|
||||||
|
# will use "linear backoff", waiting 1 second after the first failure
|
||||||
|
# on a file, 2 seconds after the second failure, etc. up to this max).
|
||||||
|
#waitretry = 10
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## Local settings (for a user to set in his $HOME/.wgetrc). It is
|
||||||
|
## *highly* undesirable to put these settings in the global file, since
|
||||||
|
## they are potentially dangerous to "normal" users.
|
||||||
|
##
|
||||||
|
## Even when setting up your own ~/.wgetrc, you should know what you
|
||||||
|
## are doing before doing so.
|
||||||
|
##
|
||||||
|
|
||||||
|
# Set this to on to use timestamping by default:
|
||||||
|
#timestamping = off
|
||||||
|
|
||||||
|
# It is a good idea to make Wget send your email address in a `From:'
|
||||||
|
# header with your request (so that server administrators can contact
|
||||||
|
# you in case of errors). Wget does *not* send `From:' by default.
|
||||||
|
#header = From: Your Name <username@@site.domain>
|
||||||
|
|
||||||
|
# You can set up other headers, like Accept-Language. Accept-Language
|
||||||
|
# is *not* sent by default.
|
||||||
|
#header = Accept-Language: en
|
||||||
|
|
||||||
|
# You can set the default proxies for Wget to use for http, https, and ftp.
|
||||||
|
# They will override the value in the environment.
|
||||||
|
#https_proxy = http://proxy.yoyodyne.com:18023/
|
||||||
|
#http_proxy = http://proxy.yoyodyne.com:18023/
|
||||||
|
#ftp_proxy = http://proxy.yoyodyne.com:18023/
|
||||||
|
|
||||||
|
# If you do not want to use proxy at all, set this to off.
|
||||||
|
#use_proxy = on
|
||||||
|
|
||||||
|
# You can customize the retrieval outlook. Valid options are default,
|
||||||
|
# binary, mega and micro.
|
||||||
|
#dot_style = default
|
||||||
|
|
||||||
|
# Setting this to off makes Wget not download /robots.txt. Be sure to
|
||||||
|
# know *exactly* what /robots.txt is and how it is used before changing
|
||||||
|
# the default!
|
||||||
|
#robots = on
|
||||||
|
|
||||||
|
# It can be useful to make Wget wait between connections. Set this to
|
||||||
|
# the number of seconds you want Wget to wait.
|
||||||
|
#wait = 0
|
||||||
|
|
||||||
|
# You can force creating directory structure, even if a single is being
|
||||||
|
# retrieved, by setting this to on.
|
||||||
|
#dirstruct = off
|
||||||
|
|
||||||
|
# You can turn on recursive retrieving by default (don't do this if
|
||||||
|
# you are not sure you know what it means) by setting this to on.
|
||||||
|
#recursive = off
|
||||||
|
|
||||||
|
# To always back up file X as X.orig before converting its links (due
|
||||||
|
# to -k / --convert-links / convert_links = on having been specified),
|
||||||
|
# set this variable to on:
|
||||||
|
#backup_converted = off
|
||||||
|
|
||||||
|
# To have Wget follow FTP links from HTML files by default, set this
|
||||||
|
# to on:
|
||||||
|
#follow_ftp = off
|
||||||
|
|
||||||
|
# To try ipv6 addresses first:
|
||||||
|
#prefer-family = IPv6
|
||||||
|
|
||||||
|
# Set default IRI support state
|
||||||
|
#iri = off
|
||||||
|
|
||||||
|
# Force the default system encoding
|
||||||
|
#localencoding = UTF-8
|
||||||
|
|
||||||
|
# Force the default remote server encoding
|
||||||
|
#remoteencoding = UTF-8
|
||||||
|
|
||||||
|
# Turn on to prevent following non-HTTPS links when in recursive mode
|
||||||
|
#httpsonly = off
|
||||||
|
|
||||||
|
# Tune HTTPS security (auto, SSLv2, SSLv3, TLSv1, PFS)
|
||||||
|
#secureprotocol = auto
|
|
@ -0,0 +1,4 @@
|
||||||
|
@set UPDATED 19 February 2019
|
||||||
|
@set UPDATED-MONTH February 2019
|
||||||
|
@set EDITION 1.20.3
|
||||||
|
@set VERSION 1.20.3
|
|
@ -0,0 +1,453 @@
|
||||||
|
#! /usr/bin/env perl
|
||||||
|
|
||||||
|
# Copyright (C) 1999-2001, 2003, 2007, 2009-2011, 2015, 2018-2019 Free
|
||||||
|
# Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This file is part of GCC.
|
||||||
|
|
||||||
|
# GCC 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 3, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# GCC 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 GCC. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# This does trivial (and I mean _trivial_) conversion of Texinfo
|
||||||
|
# markup to Perl POD format. It's intended to be used to extract
|
||||||
|
# something suitable for a manpage from a Texinfo document.
|
||||||
|
|
||||||
|
use warnings;
|
||||||
|
BEGIN { eval { require warnings; } and warnings->import; }
|
||||||
|
|
||||||
|
$output = 0;
|
||||||
|
$skipping = 0;
|
||||||
|
%sects = ();
|
||||||
|
$section = "";
|
||||||
|
@icstack = ();
|
||||||
|
@endwstack = ();
|
||||||
|
@skstack = ();
|
||||||
|
@instack = ();
|
||||||
|
$shift = "";
|
||||||
|
%defs = ();
|
||||||
|
$fnno = 1;
|
||||||
|
$inf = "";
|
||||||
|
$ibase = "";
|
||||||
|
|
||||||
|
while ($_ = shift) {
|
||||||
|
if (/^-D(.*)$/) {
|
||||||
|
if ($1 ne "") {
|
||||||
|
$flag = $1;
|
||||||
|
} else {
|
||||||
|
$flag = shift;
|
||||||
|
}
|
||||||
|
$value = "";
|
||||||
|
($flag, $value) = ($flag =~ /^([^=]+)(?:=(.+))?/);
|
||||||
|
die "no flag specified for -D\n"
|
||||||
|
unless $flag ne "";
|
||||||
|
die "flags may only contain letters, digits, hyphens, dashes and underscores\n"
|
||||||
|
unless $flag =~ /^[a-zA-Z0-9_-]+$/;
|
||||||
|
$defs{$flag} = $value;
|
||||||
|
} elsif (/^-/) {
|
||||||
|
usage();
|
||||||
|
} else {
|
||||||
|
$in = $_, next unless defined $in;
|
||||||
|
$out = $_, next unless defined $out;
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defined $in) {
|
||||||
|
$inf = gensym();
|
||||||
|
open($inf, "<$in") or die "opening \"$in\": $!\n";
|
||||||
|
$ibase = $1 if $in =~ m|^(.+)/[^/]+$|;
|
||||||
|
} else {
|
||||||
|
$inf = \*STDIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defined $out) {
|
||||||
|
open(STDOUT, ">$out") or die "opening \"$out\": $!\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
while(defined $inf) {
|
||||||
|
while(<$inf>) {
|
||||||
|
# Certain commands are discarded without further processing.
|
||||||
|
/^\@(?:
|
||||||
|
[a-z]+index # @*index: useful only in complete manual
|
||||||
|
|need # @need: useful only in printed manual
|
||||||
|
|(?:end\s+)?group # @group .. @end group: ditto
|
||||||
|
|page # @page: ditto
|
||||||
|
|node # @node: useful only in .info file
|
||||||
|
|(?:end\s+)?ifnottex # @ifnottex .. @end ifnottex: use contents
|
||||||
|
)\b/x and next;
|
||||||
|
|
||||||
|
chomp;
|
||||||
|
|
||||||
|
# Look for filename and title markers.
|
||||||
|
/^\@setfilename\s+([^.]+)/ and $fn = $1, next;
|
||||||
|
/^\@settitle\s+([^.]+)/ and $tl = postprocess($1), next;
|
||||||
|
|
||||||
|
# Identify a man title but keep only the one we are interested in.
|
||||||
|
/^\@c\s+man\s+title\s+([A-Za-z0-9-]+)\s+(.+)/ and do {
|
||||||
|
if (exists $defs{$1}) {
|
||||||
|
$fn = $1;
|
||||||
|
$tl = postprocess($2);
|
||||||
|
}
|
||||||
|
next;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Look for blocks surrounded by @c man begin SECTION ... @c man end.
|
||||||
|
# This really oughta be @ifman ... @end ifman and the like, but such
|
||||||
|
# would require rev'ing all other Texinfo translators.
|
||||||
|
/^\@c\s+man\s+begin\s+([A-Z]+)\s+([A-Za-z0-9-]+)/ and do {
|
||||||
|
$output = 1 if exists $defs{$2};
|
||||||
|
$sect = $1;
|
||||||
|
next;
|
||||||
|
};
|
||||||
|
/^\@c\s+man\s+begin\s+([A-Z]+)/ and $sect = $1, $output = 1, next;
|
||||||
|
/^\@c\s+man\s+end/ and do {
|
||||||
|
$sects{$sect} = "" unless exists $sects{$sect};
|
||||||
|
$sects{$sect} .= postprocess($section);
|
||||||
|
$section = "";
|
||||||
|
$output = 0;
|
||||||
|
next;
|
||||||
|
};
|
||||||
|
|
||||||
|
# handle variables
|
||||||
|
/^\@set\s+([a-zA-Z0-9_-]+)\s*(.*)$/ and do {
|
||||||
|
$defs{$1} = $2;
|
||||||
|
next;
|
||||||
|
};
|
||||||
|
/^\@clear\s+([a-zA-Z0-9_-]+)/ and do {
|
||||||
|
delete $defs{$1};
|
||||||
|
next;
|
||||||
|
};
|
||||||
|
|
||||||
|
next unless $output;
|
||||||
|
|
||||||
|
# Discard comments. (Can't do it above, because then we'd never see
|
||||||
|
# @c man lines.)
|
||||||
|
/^\@c\b/ and next;
|
||||||
|
|
||||||
|
# End-block handler goes up here because it needs to operate even
|
||||||
|
# if we are skipping.
|
||||||
|
/^\@end\s+([a-z]+)/ and do {
|
||||||
|
# Ignore @end foo, where foo is not an operation which may
|
||||||
|
# cause us to skip, if we are presently skipping.
|
||||||
|
my $ended = $1;
|
||||||
|
next if $skipping && $ended !~ /^(?:ifset|ifclear|ignore|menu|iftex|copying)$/;
|
||||||
|
|
||||||
|
die "\@end $ended without \@$ended at line $.\n" unless defined $endw;
|
||||||
|
die "\@$endw ended by \@end $ended at line $.\n" unless $ended eq $endw;
|
||||||
|
|
||||||
|
$endw = pop @endwstack;
|
||||||
|
|
||||||
|
if ($ended =~ /^(?:ifset|ifclear|ignore|menu|iftex)$/) {
|
||||||
|
$skipping = pop @skstack;
|
||||||
|
next;
|
||||||
|
} elsif ($ended =~ /^(?:example|smallexample|display)$/) {
|
||||||
|
$shift = "";
|
||||||
|
$_ = ""; # need a paragraph break
|
||||||
|
} elsif ($ended =~ /^(?:itemize|enumerate|[fv]?table)$/) {
|
||||||
|
$_ = "\n=back\n";
|
||||||
|
$ic = pop @icstack;
|
||||||
|
} else {
|
||||||
|
die "unknown command \@end $ended at line $.\n";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
# We must handle commands which can cause skipping even while we
|
||||||
|
# are skipping, otherwise we will not process nested conditionals
|
||||||
|
# correctly.
|
||||||
|
/^\@ifset\s+([a-zA-Z0-9_-]+)/ and do {
|
||||||
|
push @endwstack, $endw;
|
||||||
|
push @skstack, $skipping;
|
||||||
|
$endw = "ifset";
|
||||||
|
$skipping = 1 unless exists $defs{$1};
|
||||||
|
next;
|
||||||
|
};
|
||||||
|
|
||||||
|
/^\@ifclear\s+([a-zA-Z0-9_-]+)/ and do {
|
||||||
|
push @endwstack, $endw;
|
||||||
|
push @skstack, $skipping;
|
||||||
|
$endw = "ifclear";
|
||||||
|
$skipping = 1 if exists $defs{$1};
|
||||||
|
next;
|
||||||
|
};
|
||||||
|
|
||||||
|
/^\@(ignore|menu|iftex|copying)\b/ and do {
|
||||||
|
push @endwstack, $endw;
|
||||||
|
push @skstack, $skipping;
|
||||||
|
$endw = $1;
|
||||||
|
$skipping = 1;
|
||||||
|
next;
|
||||||
|
};
|
||||||
|
|
||||||
|
next if $skipping;
|
||||||
|
|
||||||
|
# Character entities. First the ones that can be replaced by raw text
|
||||||
|
# or discarded outright:
|
||||||
|
s/\@copyright\{\}/(c)/g;
|
||||||
|
s/\@dots\{\}/.../g;
|
||||||
|
s/\@enddots\{\}/..../g;
|
||||||
|
s/\@([.!? ])/$1/g;
|
||||||
|
s/\@[:-]//g;
|
||||||
|
s/\@bullet(?:\{\})?/*/g;
|
||||||
|
s/\@TeX\{\}/TeX/g;
|
||||||
|
s/\@pounds\{\}/\#/g;
|
||||||
|
s/\@minus(?:\{\})?/-/g;
|
||||||
|
s/\\,/,/g;
|
||||||
|
|
||||||
|
# Now the ones that have to be replaced by special escapes
|
||||||
|
# (which will be turned back into text by unmunge())
|
||||||
|
s/&/&/g;
|
||||||
|
s/\@\@/&at;/g;
|
||||||
|
s/\@\{/{/g;
|
||||||
|
s/\@\}/}/g;
|
||||||
|
|
||||||
|
# Inside a verbatim block, handle @var specially.
|
||||||
|
if ($shift ne "") {
|
||||||
|
s/\@var\{([^\}]*)\}/<$1>/g;
|
||||||
|
}
|
||||||
|
|
||||||
|
# POD doesn't interpret E<> inside a verbatim block.
|
||||||
|
if ($shift eq "") {
|
||||||
|
s/</</g;
|
||||||
|
s/>/>/g;
|
||||||
|
} else {
|
||||||
|
s/</</g;
|
||||||
|
s/>/>/g;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Single line command handlers.
|
||||||
|
|
||||||
|
/^\@include\s+(.+)$/ and do {
|
||||||
|
push @instack, $inf;
|
||||||
|
$inf = gensym();
|
||||||
|
$file = postprocess($1);
|
||||||
|
|
||||||
|
# Try cwd and $ibase.
|
||||||
|
open($inf, "<" . $file)
|
||||||
|
or open($inf, "<" . $ibase . "/" . $file)
|
||||||
|
or die "cannot open $file or $ibase/$file: $!\n";
|
||||||
|
next;
|
||||||
|
};
|
||||||
|
|
||||||
|
/^\@(?:section|unnumbered|unnumberedsec|center)\s+(.+)$/
|
||||||
|
and $_ = "\n=head2 $1\n";
|
||||||
|
/^\@subsection\s+(.+)$/
|
||||||
|
and $_ = "\n=head3 $1\n";
|
||||||
|
|
||||||
|
# Block command handlers:
|
||||||
|
/^\@itemize(?:\s+(\@[a-z]+|\*|-))?/ and do {
|
||||||
|
push @endwstack, $endw;
|
||||||
|
push @icstack, $ic;
|
||||||
|
if (defined $1) {
|
||||||
|
$ic = $1;
|
||||||
|
} else {
|
||||||
|
$ic = '@bullet';
|
||||||
|
}
|
||||||
|
$_ = "\n=over 4\n";
|
||||||
|
$endw = "itemize";
|
||||||
|
};
|
||||||
|
|
||||||
|
/^\@enumerate(?:\s+([a-zA-Z0-9]+))?/ and do {
|
||||||
|
push @endwstack, $endw;
|
||||||
|
push @icstack, $ic;
|
||||||
|
if (defined $1) {
|
||||||
|
$ic = $1 . ".";
|
||||||
|
} else {
|
||||||
|
$ic = "1.";
|
||||||
|
}
|
||||||
|
$_ = "\n=over 4\n";
|
||||||
|
$endw = "enumerate";
|
||||||
|
};
|
||||||
|
|
||||||
|
/^\@([fv]?table)\s+(\@[a-z]+)/ and do {
|
||||||
|
push @endwstack, $endw;
|
||||||
|
push @icstack, $ic;
|
||||||
|
$endw = $1;
|
||||||
|
$ic = $2;
|
||||||
|
$ic =~ s/\@(?:samp|strong|key|gcctabopt|env)/B/;
|
||||||
|
$ic =~ s/\@(?:code|kbd)/C/;
|
||||||
|
$ic =~ s/\@(?:dfn|var|emph|cite|i)/I/;
|
||||||
|
$ic =~ s/\@(?:file)/F/;
|
||||||
|
$_ = "\n=over 4\n";
|
||||||
|
};
|
||||||
|
|
||||||
|
/^\@((?:small)?example|display)/ and do {
|
||||||
|
push @endwstack, $endw;
|
||||||
|
$endw = $1;
|
||||||
|
$shift = "\t";
|
||||||
|
$_ = ""; # need a paragraph break
|
||||||
|
};
|
||||||
|
|
||||||
|
/^\@itemx?\s*(.+)?$/ and do {
|
||||||
|
if (defined $1) {
|
||||||
|
my $thing = $1;
|
||||||
|
if ($ic =~ /\@asis/) {
|
||||||
|
$_ = "\n=item C<$thing>\n";
|
||||||
|
} else {
|
||||||
|
# Entity escapes prevent munging by the <> processing below.
|
||||||
|
$_ = "\n=item $ic\<$thing\>\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$_ = "\n=item $ic\n";
|
||||||
|
$ic =~ y/A-Ya-y/B-Zb-z/;
|
||||||
|
$ic =~ s/(\d+)/$1 + 1/eg;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$section .= $shift.$_."\n";
|
||||||
|
}
|
||||||
|
# End of current file.
|
||||||
|
close($inf);
|
||||||
|
$inf = pop @instack;
|
||||||
|
}
|
||||||
|
|
||||||
|
die "No filename or title\n" unless defined $fn && defined $tl;
|
||||||
|
|
||||||
|
$sects{NAME} = "$fn \- $tl\n";
|
||||||
|
$sects{FOOTNOTES} .= "=back\n" if exists $sects{FOOTNOTES};
|
||||||
|
|
||||||
|
print "=encoding utf-8\n\n";
|
||||||
|
|
||||||
|
for $sect (qw(NAME SYNOPSIS DESCRIPTION OPTIONS ENVIRONMENT EXITSTATUS
|
||||||
|
FILES BUGS NOTES FOOTNOTES SEEALSO AUTHOR COPYRIGHT)) {
|
||||||
|
if(exists $sects{$sect}) {
|
||||||
|
$head = $sect;
|
||||||
|
$head =~ s/SEEALSO/SEE ALSO/;
|
||||||
|
$head =~ s/EXITSTATUS/EXIT STATUS/;
|
||||||
|
print "=head1 $head\n\n";
|
||||||
|
print scalar unmunge ($sects{$sect});
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub usage
|
||||||
|
{
|
||||||
|
die "usage: $0 [-D toggle...] [infile [outfile]]\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub postprocess
|
||||||
|
{
|
||||||
|
local $_ = $_[0];
|
||||||
|
|
||||||
|
# @value{foo} is replaced by whatever 'foo' is defined as.
|
||||||
|
while (m/(\@value\{([a-zA-Z0-9_-]+)\})/g) {
|
||||||
|
if (! exists $defs{$2}) {
|
||||||
|
print STDERR "Option $2 not defined\n";
|
||||||
|
s/\Q$1\E//;
|
||||||
|
} else {
|
||||||
|
$value = $defs{$2};
|
||||||
|
s/\Q$1\E/$value/;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Formatting commands.
|
||||||
|
# Temporary escape for @r.
|
||||||
|
s/\@r\{([^\}]*)\}/R<$1>/g;
|
||||||
|
s/\@(?:dfn|var|emph|cite|i)\{([^\}]*)\}/I<$1>/g;
|
||||||
|
s/\@(?:code|kbd)\{([^\}]*)\}/C<$1>/g;
|
||||||
|
s/\@(?:gccoptlist|samp|strong|key|option|env|command|b)\{([^\}]*)\}/B<$1>/g;
|
||||||
|
s/\@sc\{([^\}]*)\}/\U$1/g;
|
||||||
|
s/\@file\{([^\}]*)\}/F<$1>/g;
|
||||||
|
s/\@w\{([^\}]*)\}/S<$1>/g;
|
||||||
|
s/\@(?:dmn|math)\{([^\}]*)\}/$1/g;
|
||||||
|
|
||||||
|
# keep references of the form @ref{...}, print them bold
|
||||||
|
s/\@(?:ref)\{([^\}]*)\}/B<$1>/g;
|
||||||
|
|
||||||
|
# Change double single quotes to double quotes.
|
||||||
|
s/''/"/g;
|
||||||
|
s/``/"/g;
|
||||||
|
|
||||||
|
# Cross references are thrown away, as are @noindent and @refill.
|
||||||
|
# (@noindent is impossible in .pod, and @refill is unnecessary.)
|
||||||
|
# @* is also impossible in .pod; we discard it and any newline that
|
||||||
|
# follows it. Similarly, our macro @gol must be discarded.
|
||||||
|
|
||||||
|
s/\(?\@xref\{(?:[^\}]*)\}(?:[^.<]|(?:<[^<>]*>))*\.\)?//g;
|
||||||
|
s/\s+\(\@pxref\{(?:[^\}]*)\}\)//g;
|
||||||
|
s/;\s+\@pxref\{(?:[^\}]*)\}//g;
|
||||||
|
s/\@noindent\s*//g;
|
||||||
|
s/\@refill//g;
|
||||||
|
s/\@gol//g;
|
||||||
|
s/\@\*\s*\n?//g;
|
||||||
|
|
||||||
|
# @uref can take one, two, or three arguments, with different
|
||||||
|
# semantics each time. @url and @email are just like @uref with
|
||||||
|
# one argument, for our purposes.
|
||||||
|
s/\@(?:uref|url|email)\{([^\},]*)\}/<B<$1>>/g;
|
||||||
|
s/\@uref\{([^\},]*),([^\},]*)\}/$2 (C<$1>)/g;
|
||||||
|
s/\@uref\{([^\},]*),([^\},]*),([^\},]*)\}/$3/g;
|
||||||
|
|
||||||
|
# Un-escape <> at this point.
|
||||||
|
s/</</g;
|
||||||
|
s/>/>/g;
|
||||||
|
|
||||||
|
# Now un-nest all B<>, I<>, R<>. Theoretically we could have
|
||||||
|
# indefinitely deep nesting; in practice, one level suffices.
|
||||||
|
1 while s/([BIR])<([^<>]*)([BIR])<([^<>]*)>/$1<$2>$3<$4>$1</g;
|
||||||
|
|
||||||
|
# Replace R<...> with bare ...; eliminate empty markup, B<>;
|
||||||
|
# shift white space at the ends of [BI]<...> expressions outside
|
||||||
|
# the expression.
|
||||||
|
s/R<([^<>]*)>/$1/g;
|
||||||
|
s/[BI]<>//g;
|
||||||
|
s/([BI])<(\s+)([^>]+)>/$2$1<$3>/g;
|
||||||
|
s/([BI])<([^>]+?)(\s+)>/$1<$2>$3/g;
|
||||||
|
|
||||||
|
# Extract footnotes. This has to be done after all other
|
||||||
|
# processing because otherwise the regexp will choke on formatting
|
||||||
|
# inside @footnote.
|
||||||
|
while (/\@footnote/g) {
|
||||||
|
s/\@footnote\{([^\}]+)\}/[$fnno]/;
|
||||||
|
add_footnote($1, $fnno);
|
||||||
|
$fnno++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $_;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub unmunge
|
||||||
|
{
|
||||||
|
# Replace escaped symbols with their equivalents.
|
||||||
|
local $_ = $_[0];
|
||||||
|
|
||||||
|
s/</E<lt>/g;
|
||||||
|
s/>/E<gt>/g;
|
||||||
|
s/{/\{/g;
|
||||||
|
s/}/\}/g;
|
||||||
|
s/&at;/\@/g;
|
||||||
|
s/&/&/g;
|
||||||
|
return $_;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub add_footnote
|
||||||
|
{
|
||||||
|
unless (exists $sects{FOOTNOTES}) {
|
||||||
|
$sects{FOOTNOTES} = "\n=over 4\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$sects{FOOTNOTES} .= "=item $fnno.\n\n"; $fnno++;
|
||||||
|
$sects{FOOTNOTES} .= $_[0];
|
||||||
|
$sects{FOOTNOTES} .= "\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
# stolen from Symbol.pm
|
||||||
|
{
|
||||||
|
my $genseq = 0;
|
||||||
|
sub gensym
|
||||||
|
{
|
||||||
|
my $name = "GEN" . $genseq++;
|
||||||
|
my $ref = \*{$name};
|
||||||
|
delete $::{$name};
|
||||||
|
return $ref;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
@set UPDATED 19 February 2019
|
||||||
|
@set UPDATED-MONTH February 2019
|
||||||
|
@set EDITION 1.20.3
|
||||||
|
@set VERSION 1.20.3
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,91 @@
|
||||||
|
AM_CFLAGS = $(WERROR_CFLAGS) $(WARN_CFLAGS)
|
||||||
|
AM_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir) -I$(top_builddir)/lib -I$(top_srcdir)/lib \
|
||||||
|
-DSRCDIR=\"$(abs_srcdir)\"
|
||||||
|
LDADD = ../lib/libgnu.a \
|
||||||
|
$(GETADDRINFO_LIB) $(HOSTENT_LIB) $(INET_NTOP_LIB) $(INET_PTON_LIB) \
|
||||||
|
$(LIBSOCKET) $(LIB_CLOCK_GETTIME) $(LIB_CRYPTO) $(LIB_GETLOGIN) $(LIB_NANOSLEEP) $(LIB_POLL) \
|
||||||
|
$(LIB_POSIX_SPAWN) $(LIB_PTHREAD_SIGMASK) $(LIB_SELECT) $(LIBICONV) $(LIBINTL) \
|
||||||
|
$(LIBMULTITHREAD) $(LIBTHREAD) $(SERVENT_LIB) @INTL_MACOSX_LIBS@ \
|
||||||
|
$(FUZZ_LIBS)
|
||||||
|
|
||||||
|
WGET_TESTS = \
|
||||||
|
wget_css_fuzzer$(EXEEXT) \
|
||||||
|
wget_cookie_fuzzer$(EXEEXT) \
|
||||||
|
wget_ftpls_fuzzer$(EXEEXT) \
|
||||||
|
wget_html_fuzzer$(EXEEXT) \
|
||||||
|
wget_netrc_fuzzer$(EXEEXT) \
|
||||||
|
wget_options_fuzzer$(EXEEXT) \
|
||||||
|
wget_robots_fuzzer$(EXEEXT) \
|
||||||
|
wget_url_fuzzer$(EXEEXT) \
|
||||||
|
wget_read_hunk_fuzzer$(EXEEXT)
|
||||||
|
|
||||||
|
if FUZZING
|
||||||
|
bin_PROGRAMS = $(WGET_TESTS)
|
||||||
|
LDADD += $(LIB_FUZZING_ENGINE)
|
||||||
|
MAIN = fuzzer.h
|
||||||
|
# AM_LDFLAGS = -no-install -all-static
|
||||||
|
else
|
||||||
|
AM_CPPFLAGS += -DTEST_RUN
|
||||||
|
AM_TESTS_ENVIRONMENT = export VALGRIND_TESTS"=@VALGRIND_TESTS@";
|
||||||
|
TESTS = $(WGET_TESTS)
|
||||||
|
check_PROGRAMS = $(WGET_TESTS)
|
||||||
|
MAIN = main.c fuzzer.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Make libunittest "PHONY" so we're always sure we're up-to-date.
|
||||||
|
.PHONY: ../src/libunittest.a
|
||||||
|
../src/libunittest.a:
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) -C ../src libunittest.a
|
||||||
|
|
||||||
|
wget_css_fuzzer_SOURCES = wget_css_fuzzer.c $(MAIN)
|
||||||
|
wget_css_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
|
||||||
|
|
||||||
|
wget_cookie_fuzzer_SOURCES = wget_cookie_fuzzer.c $(MAIN)
|
||||||
|
wget_cookie_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
|
||||||
|
|
||||||
|
wget_ftpls_fuzzer_SOURCES = wget_ftpls_fuzzer.c $(MAIN)
|
||||||
|
wget_ftpls_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
|
||||||
|
|
||||||
|
wget_html_fuzzer_SOURCES = wget_html_fuzzer.c $(MAIN)
|
||||||
|
wget_html_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
|
||||||
|
|
||||||
|
wget_netrc_fuzzer_SOURCES = wget_netrc_fuzzer.c $(MAIN)
|
||||||
|
wget_netrc_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
|
||||||
|
|
||||||
|
wget_options_fuzzer_SOURCES = wget_options_fuzzer.c $(MAIN)
|
||||||
|
wget_options_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
|
||||||
|
|
||||||
|
wget_robots_fuzzer_SOURCES = wget_robots_fuzzer.c $(MAIN)
|
||||||
|
wget_robots_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
|
||||||
|
|
||||||
|
wget_url_fuzzer_SOURCES = wget_url_fuzzer.c $(MAIN)
|
||||||
|
wget_url_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
|
||||||
|
|
||||||
|
wget_read_hunk_fuzzer_SOURCES = wget_read_hunk_fuzzer.c $(MAIN)
|
||||||
|
wget_read_hunk_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
|
||||||
|
|
||||||
|
#EXTRA_DIST = $(wildcard *.options) $(wildcard *.dict) \
|
||||||
|
# $(wildcard *.in) $(wildcard *.repro)
|
||||||
|
|
||||||
|
dist-hook:
|
||||||
|
find $(srcdir) -name '*.options' -exec cp -v '{}' $(distdir) ';'
|
||||||
|
find $(srcdir) -name '*.dict' -exec cp -v '{}' $(distdir) ';'
|
||||||
|
# find $(srcdir) -name '*.in' -exec cp -vr '{}' $(distdir) ';'
|
||||||
|
find $(srcdir) -name '*.repro' -exec cp -vr '{}' $(distdir) ';'
|
||||||
|
|
||||||
|
clean-local:
|
||||||
|
rm -rf *.gc?? *.log lcov
|
||||||
|
|
||||||
|
oss-fuzz:
|
||||||
|
if test "$$OUT" != ""; then \
|
||||||
|
XLIBS="-lpsl -lgnutls -lhogweed -lnettle -lidn2 -lunistring"; \
|
||||||
|
for ccfile in wget*_fuzzer.c; do \
|
||||||
|
fuzzer=$$(basename $$ccfile .c); \
|
||||||
|
$$CXX $$CXXFLAGS -I$(top_srcdir)/src -I$(top_srcdir) -I$(top_srcdir)/lib \
|
||||||
|
"$${fuzzer}.c" -o "$${fuzzer}" \
|
||||||
|
../src/libunittest.a ../lib/libgnu.a $${LIB_FUZZING_ENGINE} \
|
||||||
|
-Wl,-Bstatic $${XLIBS} -Wl,-Bdynamic; \
|
||||||
|
done; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
.PHONY: oss-fuzz
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Wget.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 Wget. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stddef.h> // size_t
|
||||||
|
#include <stdint.h> // uint8_t
|
||||||
|
|
||||||
|
#define CLOSE_STDERR \
|
||||||
|
int bak = dup(STDERR_FILENO); \
|
||||||
|
int fd = open("/dev/null", O_WRONLY); \
|
||||||
|
dup2(fd, STDERR_FILENO); \
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
#define RESTORE_STDERR \
|
||||||
|
dup2(bak, STDERR_FILENO); \
|
||||||
|
close(bak);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
#endif
|
||||||
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
|
|
@ -0,0 +1,155 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Wget.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 Wget. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include "fuzzer.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
#ifdef TEST_RUN
|
||||||
|
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# define SLASH '\\'
|
||||||
|
#else
|
||||||
|
# define SLASH '/'
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int test_all_from(const char *dirname)
|
||||||
|
{
|
||||||
|
DIR *dirp;
|
||||||
|
|
||||||
|
if ((dirp = opendir(dirname))) {
|
||||||
|
struct dirent *dp;
|
||||||
|
|
||||||
|
while ((dp = readdir(dirp))) {
|
||||||
|
if (*dp->d_name == '.') continue;
|
||||||
|
|
||||||
|
char fname[strlen(dirname) + strlen(dp->d_name) + 2];
|
||||||
|
snprintf(fname, sizeof(fname), "%s/%s", dirname, dp->d_name);
|
||||||
|
|
||||||
|
struct file_memory *fmem;
|
||||||
|
if ((fmem = wget_read_file(fname))) {
|
||||||
|
printf("testing %ld bytes from '%s'\n", fmem->length, fname);
|
||||||
|
fflush(stdout);
|
||||||
|
LLVMFuzzerTestOneInput((uint8_t *)fmem->content, fmem->length);
|
||||||
|
wget_read_file_free(fmem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir(dirp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
// if VALGRIND testing is enabled, we have to call ourselves with valgrind checking
|
||||||
|
const char *valgrind = getenv("VALGRIND_TESTS");
|
||||||
|
const char *target;
|
||||||
|
size_t target_len;
|
||||||
|
|
||||||
|
if (!valgrind || !*valgrind || !strcmp(valgrind, "0")) {
|
||||||
|
// fallthrough
|
||||||
|
}
|
||||||
|
else if (!strcmp(valgrind, "1")) {
|
||||||
|
char cmd[strlen(argv[0]) + 256];
|
||||||
|
|
||||||
|
snprintf(cmd, sizeof(cmd), "VALGRIND_TESTS=\"\" valgrind --error-exitcode=301 --leak-check=yes --show-reachable=yes --track-origins=yes %s", argv[0]);
|
||||||
|
return system(cmd) != 0;
|
||||||
|
} else {
|
||||||
|
char cmd[strlen(valgrind) + strlen(argv[0]) + 32];
|
||||||
|
|
||||||
|
snprintf(cmd, sizeof(cmd), "VALGRIND_TESTS="" %s %s", valgrind, argv[0]);
|
||||||
|
return system(cmd) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((target = strrchr(argv[0], SLASH)))
|
||||||
|
target = strrchr(target, '/');
|
||||||
|
else
|
||||||
|
target = strrchr(argv[0], '/');
|
||||||
|
target = target ? target + 1 : argv[0];
|
||||||
|
|
||||||
|
if (strncmp(target, "lt-", 3) == 0)
|
||||||
|
target += 3;
|
||||||
|
|
||||||
|
target_len = strlen(target);
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
target_len -= 4; // ignore .exe
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
char corporadir[sizeof(SRCDIR) + 1 + target_len + 8];
|
||||||
|
snprintf(corporadir, sizeof(corporadir), SRCDIR "/%.*s.in", (int) target_len, target);
|
||||||
|
|
||||||
|
rc = test_all_from(corporadir);
|
||||||
|
if (rc)
|
||||||
|
fprintf(stderr, "Failed to find %s\n", corporadir);
|
||||||
|
|
||||||
|
snprintf(corporadir, sizeof(corporadir), SRCDIR "/%.*s.repro", (int) target_len, target);
|
||||||
|
if (test_all_from(corporadir) && rc)
|
||||||
|
return 77; // SKIP
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef __AFL_LOOP
|
||||||
|
static int __AFL_LOOP(int n)
|
||||||
|
{
|
||||||
|
static int first = 1;
|
||||||
|
|
||||||
|
if (first) {
|
||||||
|
first = 0;
|
||||||
|
return n && --n > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
unsigned char buf[64 * 1024];
|
||||||
|
|
||||||
|
while (__AFL_LOOP(10000)) { // only works with clang - we have to use 1 because static/global vars in wget
|
||||||
|
ret = fread(buf, 1, sizeof(buf), stdin);
|
||||||
|
if (ret < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
LLVMFuzzerTestOneInput(buf, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* #ifdef TEST_RUN */
|
|
@ -0,0 +1,92 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Wget.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 Wget. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <dirent.h> // opendir, readdir
|
||||||
|
#include <stdint.h> // uint8_t
|
||||||
|
#include <stdio.h> // fmemopen
|
||||||
|
#include <string.h> // strncmp
|
||||||
|
#include <stdlib.h> // free
|
||||||
|
#include <fcntl.h> // open flags
|
||||||
|
#include <unistd.h> // close
|
||||||
|
|
||||||
|
#include "wget.h"
|
||||||
|
#undef fopen_wgetrc
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include "cookies.h"
|
||||||
|
|
||||||
|
// declarations for wget internal functions
|
||||||
|
int main_wget(int argc, const char **argv);
|
||||||
|
void cleanup(void);
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode);
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode);
|
||||||
|
void exit_wget(int status);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "fuzzer.h"
|
||||||
|
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return fopen("/dev/null", mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef FUZZING
|
||||||
|
void exit_wget(int status)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
struct cookie_jar *cookie_jar;
|
||||||
|
char *set_cookie;
|
||||||
|
|
||||||
|
if (size > 1024) // same as max_len = ... in .options file
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
set_cookie = (char *) malloc(size + 1);
|
||||||
|
memcpy(set_cookie, data, size);
|
||||||
|
set_cookie[size] = 0;
|
||||||
|
|
||||||
|
CLOSE_STDERR
|
||||||
|
|
||||||
|
cookie_jar = cookie_jar_new();
|
||||||
|
cookie_handle_set_cookie(cookie_jar, "x", 81, "p", set_cookie);
|
||||||
|
cookie_handle_set_cookie(cookie_jar, "x", 81, "p", set_cookie);
|
||||||
|
cookie_handle_set_cookie(cookie_jar, "x", 80, "p/d/", set_cookie);
|
||||||
|
cookie_jar_delete(cookie_jar);
|
||||||
|
|
||||||
|
RESTORE_STDERR
|
||||||
|
|
||||||
|
free(set_cookie);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
tag1="expires="
|
||||||
|
tag2="path="
|
||||||
|
tag3="domain="
|
||||||
|
tag4="httponly"
|
||||||
|
tag5="secure"
|
||||||
|
tag6="max-age"
|
|
@ -0,0 +1,121 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Wget.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 Wget. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <dirent.h> // opendir, readdir
|
||||||
|
#include <stdint.h> // uint8_t
|
||||||
|
#include <stdio.h> // fmemopen
|
||||||
|
#include <string.h> // strncmp
|
||||||
|
#include <stdlib.h> // free
|
||||||
|
#include <fcntl.h> // open flags
|
||||||
|
#include <unistd.h> // close
|
||||||
|
#include <setjmp.h> // longjmp, setjmp
|
||||||
|
|
||||||
|
#include "wget.h"
|
||||||
|
#undef fopen_wgetrc
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include "html-url.h"
|
||||||
|
#include "css-url.h"
|
||||||
|
|
||||||
|
// declarations for wget internal functions
|
||||||
|
int main_wget(int argc, const char **argv);
|
||||||
|
void cleanup(void);
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode);
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode);
|
||||||
|
void exit_wget(int status);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "fuzzer.h"
|
||||||
|
|
||||||
|
static const uint8_t *g_data;
|
||||||
|
static size_t g_size;
|
||||||
|
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return fopen("/dev/null", mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_FMEMOPEN
|
||||||
|
return fmemopen((void *) g_data, g_size, mode);
|
||||||
|
#else
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_jump;
|
||||||
|
static jmp_buf jmpbuf;
|
||||||
|
#ifdef FUZZING
|
||||||
|
void exit_wget(int status)
|
||||||
|
{
|
||||||
|
longjmp(jmpbuf, 1);
|
||||||
|
}
|
||||||
|
#elif defined HAVE_DLFCN_H
|
||||||
|
#include <dlfcn.h> // dlsym
|
||||||
|
#ifndef RTLD_NEXT
|
||||||
|
#define RTLD_NEXT RTLD_GLOBAL
|
||||||
|
#endif
|
||||||
|
void exit(int status)
|
||||||
|
{
|
||||||
|
if (do_jump) {
|
||||||
|
longjmp(jmpbuf, 1);
|
||||||
|
} else {
|
||||||
|
void (*libc_exit)(int) = (void(*)(int)) dlsym (RTLD_NEXT, "exit");
|
||||||
|
libc_exit(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
if (size > 4096) // same as max_len = ... in .options file
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
struct map_context ctx = {
|
||||||
|
.text = (char *) data,
|
||||||
|
.parent_base = strdup("https://x.y"),
|
||||||
|
.document_file = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
CLOSE_STDERR
|
||||||
|
|
||||||
|
do_jump = 1;
|
||||||
|
|
||||||
|
if (setjmp(jmpbuf))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
get_urls_css(&ctx, 0, size);
|
||||||
|
free_urlpos(ctx.head);
|
||||||
|
free((void *) ctx.parent_base);
|
||||||
|
|
||||||
|
done:
|
||||||
|
do_jump = 0;
|
||||||
|
|
||||||
|
RESTORE_STDERR
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
#/*url( */ url()
|
|
@ -0,0 +1 @@
|
||||||
|
@import
|
Binary file not shown.
|
@ -0,0 +1,127 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Wget.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 Wget. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <dirent.h> // opendir, readdir
|
||||||
|
#include <stdint.h> // uint8_t
|
||||||
|
#include <stdio.h> // fmemopen
|
||||||
|
#include <string.h> // strncmp
|
||||||
|
#include <stdlib.h> // free
|
||||||
|
#include <fcntl.h> // open flags
|
||||||
|
#include <unistd.h> // close
|
||||||
|
#include <setjmp.h> // longjmp, setjmp
|
||||||
|
|
||||||
|
#include "wget.h"
|
||||||
|
#undef fopen_wgetrc
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include "ftp.h"
|
||||||
|
|
||||||
|
// declarations for wget internal functions
|
||||||
|
int main_wget(int argc, const char **argv);
|
||||||
|
void cleanup(void);
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode);
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode);
|
||||||
|
void exit_wget(int status);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "fuzzer.h"
|
||||||
|
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return fopen("/dev/null", mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_jump;
|
||||||
|
static jmp_buf jmpbuf;
|
||||||
|
#ifdef FUZZING
|
||||||
|
void exit_wget(int status)
|
||||||
|
{
|
||||||
|
longjmp(jmpbuf, 1);
|
||||||
|
}
|
||||||
|
#elif defined HAVE_DLFCN_H
|
||||||
|
#include <dlfcn.h> // dlsym
|
||||||
|
#ifndef RTLD_NEXT
|
||||||
|
#define RTLD_NEXT RTLD_GLOBAL
|
||||||
|
#endif
|
||||||
|
void exit(int status)
|
||||||
|
{
|
||||||
|
if (do_jump) {
|
||||||
|
longjmp(jmpbuf, 1);
|
||||||
|
} else {
|
||||||
|
void (*libc_exit)(int) = (void(*)(int)) dlsym (RTLD_NEXT, "exit");
|
||||||
|
libc_exit(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_FMEMOPEN
|
||||||
|
FILE *fp;
|
||||||
|
struct fileinfo *fi;
|
||||||
|
|
||||||
|
if (size > 4096) // same as max_len = ... in .options file
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fp = fmemopen((void *) data, size, "r");
|
||||||
|
if (!fp) return 0;
|
||||||
|
|
||||||
|
CLOSE_STDERR
|
||||||
|
|
||||||
|
do_jump = 1;
|
||||||
|
|
||||||
|
if (setjmp(jmpbuf))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
fi = ftp_parse_ls_fp(fp, ST_UNIX);
|
||||||
|
freefileinfo(fi);
|
||||||
|
rewind(fp);
|
||||||
|
|
||||||
|
fi = ftp_parse_ls_fp(fp, ST_VMS);
|
||||||
|
freefileinfo(fi);
|
||||||
|
rewind(fp);
|
||||||
|
|
||||||
|
fi = ftp_parse_ls_fp(fp, ST_WINNT);
|
||||||
|
freefileinfo(fi);
|
||||||
|
rewind(fp);
|
||||||
|
|
||||||
|
fi = ftp_parse_ls_fp(fp, ST_MACOS);
|
||||||
|
|
||||||
|
done:
|
||||||
|
freefileinfo(fi);
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
do_jump = 0;
|
||||||
|
|
||||||
|
RESTORE_STDERR
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
"Jan"
|
||||||
|
"Feb"
|
||||||
|
"Mar"
|
||||||
|
"Apr"
|
||||||
|
"May"
|
||||||
|
"Jun"
|
||||||
|
"Jul"
|
||||||
|
"Aug"
|
||||||
|
"Sep"
|
||||||
|
"Oct"
|
||||||
|
"Nov"
|
||||||
|
"Dec"
|
||||||
|
"total"
|
||||||
|
"0644"
|
||||||
|
"0755"
|
||||||
|
" -> "
|
||||||
|
".."
|
||||||
|
"Total of "
|
||||||
|
".DIR"
|
||||||
|
".DIR;1"
|
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Wget.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 Wget. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <dirent.h> // opendir, readdir
|
||||||
|
#include <stdint.h> // uint8_t
|
||||||
|
#include <stdio.h> // fmemopen
|
||||||
|
#include <string.h> // strncmp
|
||||||
|
#include <stdlib.h> // free
|
||||||
|
#include <fcntl.h> // open flags
|
||||||
|
#include <unistd.h> // close
|
||||||
|
#include <setjmp.h> // longjmp, setjmp
|
||||||
|
|
||||||
|
#include "wget.h"
|
||||||
|
#undef fopen_wgetrc
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include "utils.h"
|
||||||
|
#include "html-url.h"
|
||||||
|
#include "css-url.h"
|
||||||
|
|
||||||
|
// declarations for wget internal functions
|
||||||
|
int main_wget(int argc, const char **argv);
|
||||||
|
void cleanup(void);
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode);
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode);
|
||||||
|
void exit_wget(int status);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "fuzzer.h"
|
||||||
|
|
||||||
|
static const uint8_t *g_data;
|
||||||
|
static size_t g_size;
|
||||||
|
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return fopen("/dev/null", mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_FMEMOPEN
|
||||||
|
return fmemopen((void *) g_data, g_size, mode);
|
||||||
|
#else
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef FUZZING
|
||||||
|
void exit_wget(int status)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
struct urlpos *urls;
|
||||||
|
struct file_memory fm;
|
||||||
|
|
||||||
|
if (size > 4096) // same as max_len = ... in .options file
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
CLOSE_STDERR
|
||||||
|
|
||||||
|
fm.content = (char *) data;
|
||||||
|
fm.length = size;
|
||||||
|
fm.mmap_p = 0;
|
||||||
|
|
||||||
|
urls = get_urls_html_fm("xxx", &fm, "https://x.y", NULL, NULL);
|
||||||
|
free_urlpos(urls);
|
||||||
|
|
||||||
|
RESTORE_STDERR
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
"<base"
|
||||||
|
"<link"
|
||||||
|
"<meta"
|
||||||
|
"action"
|
||||||
|
"href"
|
||||||
|
"src"
|
||||||
|
"srcset"
|
||||||
|
"style"
|
||||||
|
"follow"
|
||||||
|
"nofollow"
|
||||||
|
"all"
|
||||||
|
"none"
|
||||||
|
"robots="
|
||||||
|
"name=\"robots\""
|
||||||
|
"content="
|
||||||
|
"http-equiv=\"Content-Type\""
|
||||||
|
"charset="
|
||||||
|
"style="
|
||||||
|
"rel=\"shortcut icon\""
|
||||||
|
"rel=\"stylesheet\""
|
||||||
|
"rel=\"preload\""
|
||||||
|
"srcset="
|
|
@ -0,0 +1,124 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Wget.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 Wget. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h> // uint8_t
|
||||||
|
#include <stdio.h> // fmemopen
|
||||||
|
#include <string.h> // strncmp
|
||||||
|
#include <stdlib.h> // free
|
||||||
|
#include <setjmp.h> // longjmp, setjmp
|
||||||
|
#include <fcntl.h> // open flags
|
||||||
|
#include <unistd.h> // close
|
||||||
|
|
||||||
|
#include "wget.h"
|
||||||
|
#undef fopen_wgetrc
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include "netrc.h"
|
||||||
|
|
||||||
|
// declarations for wget internal functions
|
||||||
|
int main_wget(int argc, const char **argv);
|
||||||
|
void cleanup(void);
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode);
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode);
|
||||||
|
void exit_wget(int status);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "fuzzer.h"
|
||||||
|
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return fopen("/dev/null", mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_jump;
|
||||||
|
static jmp_buf jmpbuf;
|
||||||
|
#ifdef FUZZING
|
||||||
|
void exit_wget(int status)
|
||||||
|
{
|
||||||
|
longjmp(jmpbuf, 1);
|
||||||
|
}
|
||||||
|
#elif defined HAVE_DLFCN_H
|
||||||
|
#include <dlfcn.h> // dlsym
|
||||||
|
#ifndef RTLD_NEXT
|
||||||
|
#define RTLD_NEXT RTLD_GLOBAL
|
||||||
|
#endif
|
||||||
|
void exit(int status)
|
||||||
|
{
|
||||||
|
if (do_jump) {
|
||||||
|
longjmp(jmpbuf, 1);
|
||||||
|
} else {
|
||||||
|
void (*libc_exit)(int) = (void(*)(int)) dlsym (RTLD_NEXT, "exit");
|
||||||
|
libc_exit(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_FMEMOPEN
|
||||||
|
FILE *fp;
|
||||||
|
struct fileinfo *fi;
|
||||||
|
const char *user = NULL, *pw = NULL;
|
||||||
|
|
||||||
|
if (size > 4096) // same as max_len = ... in .options file
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fp = fmemopen((void *) data, size, "r");
|
||||||
|
if (!fp) return 0;
|
||||||
|
|
||||||
|
CLOSE_STDERR
|
||||||
|
|
||||||
|
do_jump = 1;
|
||||||
|
|
||||||
|
if (setjmp(jmpbuf))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
opt.netrc = 1;
|
||||||
|
|
||||||
|
user = NULL; // get first entry
|
||||||
|
search_netrc("x", &user, &pw, 1, fp);
|
||||||
|
netrc_cleanup();
|
||||||
|
|
||||||
|
user = "u"; // get entry for user 'u'
|
||||||
|
search_netrc("x", &user, &pw, 1, fp);
|
||||||
|
|
||||||
|
done:
|
||||||
|
netrc_cleanup();
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
do_jump = 0;
|
||||||
|
|
||||||
|
RESTORE_STDERR
|
||||||
|
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
"machine"
|
||||||
|
"default"
|
||||||
|
"login"
|
||||||
|
"password"
|
||||||
|
"macdef"
|
||||||
|
"account"
|
||||||
|
"port"
|
||||||
|
"force"
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Wget.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 Wget. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <dirent.h> // opendir, readdir
|
||||||
|
#include <stdint.h> // uint8_t
|
||||||
|
#include <stdio.h> // fmemopen
|
||||||
|
#include <string.h> // strncmp
|
||||||
|
#include <fcntl.h> // open flags
|
||||||
|
#include <unistd.h> // close
|
||||||
|
#include <setjmp.h> // longjmp, setjmp
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
// declarations for wget internal functions
|
||||||
|
int main_wget(int argc, const char **argv);
|
||||||
|
void cleanup(void);
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode);
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode);
|
||||||
|
void exit_wget(int status);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "fuzzer.h"
|
||||||
|
|
||||||
|
static const uint8_t *g_data;
|
||||||
|
static size_t g_size;
|
||||||
|
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return fopen("/dev/null", mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_FMEMOPEN
|
||||||
|
return fmemopen((void *) g_data, g_size, mode);
|
||||||
|
#else
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_jump;
|
||||||
|
static jmp_buf jmpbuf;
|
||||||
|
#ifdef FUZZING
|
||||||
|
void exit_wget(int status)
|
||||||
|
{
|
||||||
|
longjmp(jmpbuf, 1);
|
||||||
|
}
|
||||||
|
#elif defined HAVE_DLFCN_H
|
||||||
|
#include <dlfcn.h> // dlsym
|
||||||
|
#ifndef RTLD_NEXT
|
||||||
|
#define RTLD_NEXT RTLD_GLOBAL
|
||||||
|
#endif
|
||||||
|
void exit(int status)
|
||||||
|
{
|
||||||
|
if (do_jump) {
|
||||||
|
longjmp(jmpbuf, 1);
|
||||||
|
} else {
|
||||||
|
void (*libc_exit)(int) = (void(*)(int)) dlsym (RTLD_NEXT, "exit");
|
||||||
|
libc_exit(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
static const char *argv[] = { "wget", "-q" };
|
||||||
|
|
||||||
|
if (size > 2048) // same as max_len = ... in .options file
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
g_data = data;
|
||||||
|
g_size = size;
|
||||||
|
|
||||||
|
CLOSE_STDERR
|
||||||
|
|
||||||
|
do_jump = 1;
|
||||||
|
|
||||||
|
if (setjmp(jmpbuf))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
main_wget(sizeof(argv)/sizeof(argv[0]), argv);
|
||||||
|
|
||||||
|
done:
|
||||||
|
cleanup();
|
||||||
|
|
||||||
|
do_jump = 0;
|
||||||
|
|
||||||
|
RESTORE_STDERR
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,195 @@
|
||||||
|
"--"
|
||||||
|
"no-"
|
||||||
|
"on"
|
||||||
|
"off"
|
||||||
|
"="
|
||||||
|
"PEM"
|
||||||
|
"DER"
|
||||||
|
"ASN1"
|
||||||
|
"INF"
|
||||||
|
"INFINITY"
|
||||||
|
"1"
|
||||||
|
"1k"
|
||||||
|
"1m"
|
||||||
|
"1g"
|
||||||
|
"1t"
|
||||||
|
"1s"
|
||||||
|
"1m"
|
||||||
|
"1h"
|
||||||
|
"1d"
|
||||||
|
"hard"
|
||||||
|
"soft"
|
||||||
|
"none"
|
||||||
|
"ipv4"
|
||||||
|
"ipv6"
|
||||||
|
"bar"
|
||||||
|
"posix"
|
||||||
|
"pcre"
|
||||||
|
"bytes"
|
||||||
|
"bits"
|
||||||
|
"human"
|
||||||
|
"csv"
|
||||||
|
"json"
|
||||||
|
"accept="
|
||||||
|
"accept-regex="
|
||||||
|
"adjust-extension="
|
||||||
|
"append-output="
|
||||||
|
"ask-password="
|
||||||
|
"auth-no-challenge="
|
||||||
|
"backup-converted="
|
||||||
|
"backups="
|
||||||
|
"base="
|
||||||
|
"bind-address="
|
||||||
|
"ca-certificate="
|
||||||
|
"cache="
|
||||||
|
"ca-directory="
|
||||||
|
"certificate="
|
||||||
|
"certificate-type="
|
||||||
|
"check-certificate="
|
||||||
|
"check-hostname="
|
||||||
|
"chunk-size="
|
||||||
|
"clobber="
|
||||||
|
"config="
|
||||||
|
"connect-timeout="
|
||||||
|
"content-disposition="
|
||||||
|
"content-on-error="
|
||||||
|
"continue="
|
||||||
|
"convert-links="
|
||||||
|
"cookies="
|
||||||
|
"cookie-suffixes="
|
||||||
|
"crl-file="
|
||||||
|
"cut-dirs="
|
||||||
|
"cut-file-get-vars="
|
||||||
|
"cut-url-get-vars="
|
||||||
|
"debug="
|
||||||
|
"default-page="
|
||||||
|
"delete-after="
|
||||||
|
"directories="
|
||||||
|
"directory-prefix="
|
||||||
|
"dns-caching="
|
||||||
|
"dns-timeout="
|
||||||
|
"domains="
|
||||||
|
"egd-file="
|
||||||
|
"exclude-domains="
|
||||||
|
"execute="
|
||||||
|
"filter-mime-type="
|
||||||
|
"filter-urls="
|
||||||
|
"follow-tags="
|
||||||
|
"force-atom="
|
||||||
|
"force-css="
|
||||||
|
"force-directories="
|
||||||
|
"force-html="
|
||||||
|
"force-metalink="
|
||||||
|
"force-progress="
|
||||||
|
"force-rss="
|
||||||
|
"force-sitemap="
|
||||||
|
"fsync-policy="
|
||||||
|
"gnupg-homedir="
|
||||||
|
"gnutls-options="
|
||||||
|
"header="
|
||||||
|
"help="
|
||||||
|
"host-directories="
|
||||||
|
"hpkp="
|
||||||
|
"hpkp-file="
|
||||||
|
"hsts="
|
||||||
|
"hsts-file="
|
||||||
|
"html-extension="
|
||||||
|
"http2="
|
||||||
|
"http2-request-window="
|
||||||
|
"http-keep-alive="
|
||||||
|
"http-password="
|
||||||
|
"http-proxy="
|
||||||
|
"http-proxy-password="
|
||||||
|
"http-proxy-user="
|
||||||
|
"https-enforce="
|
||||||
|
"https-only="
|
||||||
|
"https-proxy="
|
||||||
|
"http-user="
|
||||||
|
"ignore-case="
|
||||||
|
"ignore-tags="
|
||||||
|
"inet4-only="
|
||||||
|
"inet6-only="
|
||||||
|
"input-encoding="
|
||||||
|
"input-file="
|
||||||
|
"iri="
|
||||||
|
"keep-session-cookies="
|
||||||
|
"level="
|
||||||
|
"list-plugins="
|
||||||
|
"load-cookies="
|
||||||
|
"local-db="
|
||||||
|
"local-encoding="
|
||||||
|
"local-plugin="
|
||||||
|
"max-redirect="
|
||||||
|
"max-threads="
|
||||||
|
"metalink="
|
||||||
|
"mirror="
|
||||||
|
"netrc="
|
||||||
|
"netrc-file="
|
||||||
|
"no-quiet="
|
||||||
|
"ocsp="
|
||||||
|
"ocsp-file="
|
||||||
|
"ocsp-stapling="
|
||||||
|
"output-document="
|
||||||
|
"output-file="
|
||||||
|
"page-requisites="
|
||||||
|
"parent="
|
||||||
|
"password="
|
||||||
|
"plugin="
|
||||||
|
"plugin-dirs="
|
||||||
|
"plugin-help="
|
||||||
|
"plugin-opt="
|
||||||
|
"post-data="
|
||||||
|
"post-file="
|
||||||
|
"prefer-family="
|
||||||
|
"private-key="
|
||||||
|
"private-key-type="
|
||||||
|
"progress="
|
||||||
|
"protocol-directories="
|
||||||
|
"proxy="
|
||||||
|
"quiet="
|
||||||
|
"quota="
|
||||||
|
"random-file="
|
||||||
|
"random-wait="
|
||||||
|
"read-timeout="
|
||||||
|
"recursive="
|
||||||
|
"referer="
|
||||||
|
"regex-type="
|
||||||
|
"reject="
|
||||||
|
"reject-regex="
|
||||||
|
"remote-encoding="
|
||||||
|
"report-speed="
|
||||||
|
"restrict-file-names="
|
||||||
|
"robots="
|
||||||
|
"save-cookies="
|
||||||
|
"save-headers="
|
||||||
|
"secure-protocol="
|
||||||
|
"server-response="
|
||||||
|
"signature-extension="
|
||||||
|
"span-hosts="
|
||||||
|
"spider="
|
||||||
|
"stats-all="
|
||||||
|
"stats-dns="
|
||||||
|
"stats-ocsp="
|
||||||
|
"stats-server="
|
||||||
|
"stats-site="
|
||||||
|
"stats-tls="
|
||||||
|
"strict-comments="
|
||||||
|
"tcp-fastopen="
|
||||||
|
"timeout="
|
||||||
|
"timestamping="
|
||||||
|
"tls-false-start="
|
||||||
|
"tls-resume="
|
||||||
|
"tls-session-file="
|
||||||
|
"tries="
|
||||||
|
"trust-server-names="
|
||||||
|
"use-askpass="
|
||||||
|
"user="
|
||||||
|
"user-agent="
|
||||||
|
"use-server-timestamps="
|
||||||
|
"verbose="
|
||||||
|
"verify-save-failed="
|
||||||
|
"verify-sig="
|
||||||
|
"version="
|
||||||
|
"wait="
|
||||||
|
"waitretry="
|
||||||
|
"xattr="
|
|
@ -0,0 +1,204 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Wget.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 Wget. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h> // uint8_t
|
||||||
|
#include <stdio.h> // fmemopen
|
||||||
|
#include <string.h> // strncmp
|
||||||
|
#include <stdlib.h> // free
|
||||||
|
#include <unistd.h> // close
|
||||||
|
#include <fcntl.h> // open flags
|
||||||
|
#include <unistd.h> // close
|
||||||
|
#include <unistd.h> // close
|
||||||
|
|
||||||
|
#include "wget.h"
|
||||||
|
#include "connect.h"
|
||||||
|
#undef fopen_wgetrc
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include "retr.h"
|
||||||
|
|
||||||
|
// declarations for wget internal functions
|
||||||
|
int main_wget(int argc, const char **argv);
|
||||||
|
void cleanup(void);
|
||||||
|
// FILE *fopen_wget(const char *pathname, const char *mode);
|
||||||
|
// FILE *fopen_wgetrc(const char *pathname, const char *mode);
|
||||||
|
void exit_wget(int status);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "fuzzer.h"
|
||||||
|
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return fopen("/dev/null", mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef FUZZING
|
||||||
|
void exit_wget(int status)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const uint8_t *g_data;
|
||||||
|
static size_t g_size, g_read;
|
||||||
|
|
||||||
|
struct my_context {
|
||||||
|
int peeklen;
|
||||||
|
char peekbuf[512];
|
||||||
|
};
|
||||||
|
|
||||||
|
static int my_peek (int fd _GL_UNUSED, char *buf, int bufsize, void *arg)
|
||||||
|
{
|
||||||
|
if (g_read < g_size) {
|
||||||
|
struct my_context *ctx = (struct my_context *) arg;
|
||||||
|
int n = rand() % (g_size - g_read);
|
||||||
|
if (n > bufsize)
|
||||||
|
n = bufsize;
|
||||||
|
if (n > sizeof(ctx->peekbuf))
|
||||||
|
n = sizeof(ctx->peekbuf);
|
||||||
|
memcpy(buf, g_data + g_read, n);
|
||||||
|
memcpy(ctx->peekbuf, g_data + g_read, n);
|
||||||
|
g_read += n;
|
||||||
|
ctx->peeklen=n;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static int my_read (int fd _GL_UNUSED, char *buf, int bufsize, void *arg)
|
||||||
|
{
|
||||||
|
struct my_context *ctx = (struct my_context *) arg;
|
||||||
|
|
||||||
|
if (ctx->peeklen) {
|
||||||
|
/* If we have any peek data, simply return that. */
|
||||||
|
int copysize = MIN (bufsize, ctx->peeklen);
|
||||||
|
memcpy (buf, ctx->peekbuf, copysize);
|
||||||
|
ctx->peeklen -= copysize;
|
||||||
|
if (ctx->peeklen)
|
||||||
|
memmove (ctx->peekbuf, ctx->peekbuf + copysize, ctx->peeklen);
|
||||||
|
|
||||||
|
return copysize;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_read < g_size) {
|
||||||
|
int n = rand() % (g_size - g_read);
|
||||||
|
if (n > bufsize)
|
||||||
|
n = bufsize;
|
||||||
|
memcpy(buf, g_data + g_read, n);
|
||||||
|
g_read += n;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static int my_write (int fd _GL_UNUSED, char *buf _GL_UNUSED, int bufsize, void *arg _GL_UNUSED)
|
||||||
|
{
|
||||||
|
return bufsize;
|
||||||
|
}
|
||||||
|
static int my_poll (int fd _GL_UNUSED, double timeout _GL_UNUSED, int wait_for _GL_UNUSED, void *arg)
|
||||||
|
{
|
||||||
|
struct my_context *ctx = (struct my_context *) arg;
|
||||||
|
|
||||||
|
return ctx->peeklen || g_read < g_size;
|
||||||
|
}
|
||||||
|
static const char *my_errstr (int fd _GL_UNUSED, void *arg _GL_UNUSED)
|
||||||
|
{
|
||||||
|
return "Success";
|
||||||
|
}
|
||||||
|
static void my_close (int fd _GL_UNUSED, void *arg _GL_UNUSED)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct transport_implementation my_transport =
|
||||||
|
{
|
||||||
|
my_read, my_write, my_poll,
|
||||||
|
my_peek, my_errstr, my_close
|
||||||
|
};
|
||||||
|
|
||||||
|
/* copied from wget's http.c */
|
||||||
|
static const char *
|
||||||
|
response_head_terminator (const char *start, const char *peeked, int peeklen)
|
||||||
|
{
|
||||||
|
const char *p, *end;
|
||||||
|
|
||||||
|
/* If at first peek, verify whether HUNK starts with "HTTP". If
|
||||||
|
not, this is a HTTP/0.9 request and we must bail out without
|
||||||
|
reading anything. */
|
||||||
|
if (start == peeked && 0 != memcmp (start, "HTTP", MIN (peeklen, 4)))
|
||||||
|
return start;
|
||||||
|
|
||||||
|
/* Look for "\n[\r]\n", and return the following position if found.
|
||||||
|
Start two chars before the current to cover the possibility that
|
||||||
|
part of the terminator (e.g. "\n\r") arrived in the previous
|
||||||
|
batch. */
|
||||||
|
p = peeked - start < 2 ? start : peeked - 2;
|
||||||
|
end = peeked + peeklen;
|
||||||
|
|
||||||
|
/* Check for \n\r\n or \n\n anywhere in [p, end-2). */
|
||||||
|
for (; p < end - 2; p++)
|
||||||
|
if (*p == '\n')
|
||||||
|
{
|
||||||
|
if (p[1] == '\r' && p[2] == '\n')
|
||||||
|
return p + 3;
|
||||||
|
else if (p[1] == '\n')
|
||||||
|
return p + 2;
|
||||||
|
}
|
||||||
|
/* p==end-2: check for \n\n directly preceding END. */
|
||||||
|
if (peeklen >= 2 && p[0] == '\n' && p[1] == '\n')
|
||||||
|
return p + 2;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
char *hunk;
|
||||||
|
|
||||||
|
if (size > 4096) // same as max_len = ... in .options file
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// CLOSE_STDERR
|
||||||
|
|
||||||
|
g_data = data;
|
||||||
|
g_size = size;
|
||||||
|
g_read = 0;
|
||||||
|
|
||||||
|
struct my_context *ctx = calloc(1, sizeof(struct my_context));
|
||||||
|
fd_register_transport(99, &my_transport, ctx);
|
||||||
|
|
||||||
|
while ((hunk = fd_read_hunk(99, response_head_terminator, 512, 65536)))
|
||||||
|
free(hunk);
|
||||||
|
|
||||||
|
connect_cleanup();
|
||||||
|
free(ctx);
|
||||||
|
|
||||||
|
// RESTORE_STDERR
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,90 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Wget.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 Wget. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <dirent.h> // opendir, readdir
|
||||||
|
#include <stdint.h> // uint8_t
|
||||||
|
#include <stdio.h> // fmemopen
|
||||||
|
#include <string.h> // strncmp
|
||||||
|
#include <stdlib.h> // free
|
||||||
|
#include <fcntl.h> // open flags
|
||||||
|
#include <unistd.h> // close
|
||||||
|
#include <setjmp.h> // longjmp, setjmp
|
||||||
|
|
||||||
|
#include "wget.h"
|
||||||
|
#undef fopen_wgetrc
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include "res.h"
|
||||||
|
|
||||||
|
// declarations for wget internal functions
|
||||||
|
int main_wget(int argc, const char **argv);
|
||||||
|
void cleanup(void);
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode);
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode);
|
||||||
|
void exit_wget(int status);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "fuzzer.h"
|
||||||
|
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return fopen("/dev/null", mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef FUZZING
|
||||||
|
void exit_wget(int status)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
struct robot_specs *specs;
|
||||||
|
|
||||||
|
if (size > 4096) // same as max_len = ... in .options file
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
CLOSE_STDERR
|
||||||
|
|
||||||
|
specs = res_parse((char *) data, (int) size);
|
||||||
|
if (!specs)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
res_match_path(specs, "a%ff%a");
|
||||||
|
|
||||||
|
res_register_specs("host", 80, specs);
|
||||||
|
|
||||||
|
res_cleanup();
|
||||||
|
|
||||||
|
RESTORE_STDERR
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Wget.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Wget 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 Wget. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h> // uint8_t
|
||||||
|
#include <stdio.h> // fmemopen
|
||||||
|
#include <string.h> // strncmp
|
||||||
|
#include <stdlib.h> // free
|
||||||
|
#include <unistd.h> // close
|
||||||
|
#include <fcntl.h> // open flags
|
||||||
|
#include <unistd.h> // close
|
||||||
|
|
||||||
|
#include "wget.h"
|
||||||
|
#undef fopen_wgetrc
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include "url.h"
|
||||||
|
|
||||||
|
// declarations for wget internal functions
|
||||||
|
int main_wget(int argc, const char **argv);
|
||||||
|
void cleanup(void);
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode);
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode);
|
||||||
|
void exit_wget(int status);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "fuzzer.h"
|
||||||
|
|
||||||
|
FILE *fopen_wget(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return fopen("/dev/null", mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *fopen_wgetrc(const char *pathname, const char *mode)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef FUZZING
|
||||||
|
void exit_wget(int status)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
struct url *url;
|
||||||
|
struct iri iri;
|
||||||
|
char *in;
|
||||||
|
|
||||||
|
if (size > 4096) // same as max_len = ... in .options file
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
CLOSE_STDERR
|
||||||
|
|
||||||
|
in = (char *) malloc(size + 1);
|
||||||
|
memcpy(in, data, size);
|
||||||
|
in[size] = 0;
|
||||||
|
|
||||||
|
iri.uri_encoding = (char *) "iso-8859-1";
|
||||||
|
iri.orig_url = NULL;
|
||||||
|
|
||||||
|
iri.utf8_encode = 0;
|
||||||
|
url = url_parse(in, NULL, &iri, 0);
|
||||||
|
url_free(url);
|
||||||
|
|
||||||
|
url = url_parse(in, NULL, &iri, 1);
|
||||||
|
url_free(url);
|
||||||
|
|
||||||
|
iri.utf8_encode = 1;
|
||||||
|
url = url_parse(in, NULL, &iri, 0);
|
||||||
|
url_free(url);
|
||||||
|
|
||||||
|
url = url_parse(in, NULL, &iri, 1);
|
||||||
|
url_free(url);
|
||||||
|
|
||||||
|
free(iri.orig_url);
|
||||||
|
free(in);
|
||||||
|
|
||||||
|
RESTORE_STDERR
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef _Noreturn
|
||||||
|
# if (defined __cplusplus \
|
||||||
|
&& ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
|
||||||
|
|| (defined _MSC_VER && 1900 <= _MSC_VER)))
|
||||||
|
# define _Noreturn [[noreturn]]
|
||||||
|
# elif ((!defined __cplusplus || defined __clang__) \
|
||||||
|
&& (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
|
||||||
|
|| 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
|
||||||
|
/* _Noreturn works as-is. */
|
||||||
|
# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
|
||||||
|
# define _Noreturn __attribute__ ((__noreturn__))
|
||||||
|
# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
|
||||||
|
# define _Noreturn __declspec (noreturn)
|
||||||
|
# else
|
||||||
|
# define _Noreturn
|
||||||
|
# endif
|
||||||
|
#endif
|
|
@ -0,0 +1,52 @@
|
||||||
|
/* accept.c --- wrappers for Windows accept function
|
||||||
|
|
||||||
|
Copyright (C) 2008-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Paolo Bonzini */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
/* Get winsock2.h. */
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
/* Get set_winsock_errno, FD_TO_SOCKET etc. */
|
||||||
|
#include "w32sock.h"
|
||||||
|
|
||||||
|
#undef accept
|
||||||
|
|
||||||
|
int
|
||||||
|
rpl_accept (int fd, struct sockaddr *addr, socklen_t *addrlen)
|
||||||
|
{
|
||||||
|
SOCKET sock = FD_TO_SOCKET (fd);
|
||||||
|
|
||||||
|
if (sock == INVALID_SOCKET)
|
||||||
|
{
|
||||||
|
errno = EBADF;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SOCKET fh = accept (sock, addr, addrlen);
|
||||||
|
if (fh == INVALID_SOCKET)
|
||||||
|
{
|
||||||
|
set_winsock_errno ();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return SOCKET_TO_FD (fh);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,213 @@
|
||||||
|
/* af_alg.c - Compute message digests from file streams and buffers.
|
||||||
|
Copyright (C) 2018-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3, 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Matteo Croce <mcroce@redhat.com>, 2018. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#if USE_LINUX_CRYPTO_API
|
||||||
|
|
||||||
|
#include "af_alg.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <linux/if_alg.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/sendfile.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
#include "sys-limits.h"
|
||||||
|
|
||||||
|
#define BLOCKSIZE 32768
|
||||||
|
|
||||||
|
/* Return a newly created socket for ALG.
|
||||||
|
On error, return a negative error number. */
|
||||||
|
static int
|
||||||
|
alg_socket (char const *alg)
|
||||||
|
{
|
||||||
|
struct sockaddr_alg salg = {
|
||||||
|
.salg_family = AF_ALG,
|
||||||
|
.salg_type = "hash",
|
||||||
|
};
|
||||||
|
/* Copy alg into salg.salg_name, without calling strcpy nor strlen. */
|
||||||
|
for (size_t i = 0; (salg.salg_name[i] = alg[i]) != '\0'; i++)
|
||||||
|
if (i == sizeof salg.salg_name - 1)
|
||||||
|
/* alg is too long. */
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
int cfd = socket (AF_ALG, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
|
||||||
|
if (cfd < 0)
|
||||||
|
return -EAFNOSUPPORT;
|
||||||
|
int ofd = (bind (cfd, (struct sockaddr *) &salg, sizeof salg) == 0
|
||||||
|
? accept4 (cfd, NULL, 0, SOCK_CLOEXEC)
|
||||||
|
: -1);
|
||||||
|
close (cfd);
|
||||||
|
return ofd < 0 ? -EAFNOSUPPORT : ofd;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
afalg_buffer (const char *buffer, size_t len, const char *alg,
|
||||||
|
void *resblock, ssize_t hashlen)
|
||||||
|
{
|
||||||
|
/* On Linux < 4.9, the value for an empty stream is wrong (all zeroes).
|
||||||
|
See <https://patchwork.kernel.org/patch/9308641/>.
|
||||||
|
This was not fixed properly until November 2016,
|
||||||
|
see <https://patchwork.kernel.org/patch/9434741/>. */
|
||||||
|
if (len == 0)
|
||||||
|
return -EAFNOSUPPORT;
|
||||||
|
|
||||||
|
int ofd = alg_socket (alg);
|
||||||
|
if (ofd < 0)
|
||||||
|
return ofd;
|
||||||
|
|
||||||
|
int result;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
ssize_t size = (len > BLOCKSIZE ? BLOCKSIZE : len);
|
||||||
|
if (send (ofd, buffer, size, MSG_MORE) != size)
|
||||||
|
{
|
||||||
|
result = -EAFNOSUPPORT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
buffer += size;
|
||||||
|
len -= size;
|
||||||
|
if (len == 0)
|
||||||
|
{
|
||||||
|
result = read (ofd, resblock, hashlen) == hashlen ? 0 : -EAFNOSUPPORT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close (ofd);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
afalg_stream (FILE *stream, const char *alg,
|
||||||
|
void *resblock, ssize_t hashlen)
|
||||||
|
{
|
||||||
|
int ofd = alg_socket (alg);
|
||||||
|
if (ofd < 0)
|
||||||
|
return ofd;
|
||||||
|
|
||||||
|
/* If STREAM's size is known and nonzero and not too large, attempt
|
||||||
|
sendfile to pipe the data. The nonzero restriction avoids issues
|
||||||
|
with /proc files that pretend to be empty, and lets the classic
|
||||||
|
read-write loop work around an empty-input bug noted below. */
|
||||||
|
int fd = fileno (stream);
|
||||||
|
int result;
|
||||||
|
struct stat st;
|
||||||
|
off_t off = ftello (stream);
|
||||||
|
if (0 <= off && fstat (fd, &st) == 0
|
||||||
|
&& (S_ISREG (st.st_mode) || S_TYPEISSHM (&st) || S_TYPEISTMO (&st))
|
||||||
|
&& off < st.st_size && st.st_size - off < SYS_BUFSIZE_MAX)
|
||||||
|
{
|
||||||
|
/* Make sure the offset of fileno (stream) reflects how many bytes
|
||||||
|
have been read from stream before this function got invoked.
|
||||||
|
Note: fflush on an input stream after ungetc does not work as expected
|
||||||
|
on some platforms. Therefore this situation is not supported here. */
|
||||||
|
if (fflush (stream))
|
||||||
|
result = -EIO;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
off_t nbytes = st.st_size - off;
|
||||||
|
if (sendfile (ofd, fd, &off, nbytes) == nbytes)
|
||||||
|
{
|
||||||
|
if (read (ofd, resblock, hashlen) == hashlen)
|
||||||
|
{
|
||||||
|
/* The input buffers of stream are no longer valid. */
|
||||||
|
if (lseek (fd, off, SEEK_SET) != (off_t)-1)
|
||||||
|
result = 0;
|
||||||
|
else
|
||||||
|
/* The file position of fd has not changed. */
|
||||||
|
result = -EAFNOSUPPORT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* The file position of fd has not changed. */
|
||||||
|
result = -EAFNOSUPPORT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* The file position of fd has not changed. */
|
||||||
|
result = -EAFNOSUPPORT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* sendfile not possible, do a classic read-write loop. */
|
||||||
|
|
||||||
|
/* Number of bytes to seek (backwards) in case of error. */
|
||||||
|
off_t nseek = 0;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
char buf[BLOCKSIZE];
|
||||||
|
/* When the stream is not seekable, start with a single-byte block,
|
||||||
|
so that we can use ungetc() in the case that send() fails. */
|
||||||
|
size_t blocksize = (nseek == 0 && off < 0 ? 1 : BLOCKSIZE);
|
||||||
|
ssize_t size = fread (buf, 1, blocksize, stream);
|
||||||
|
if (size == 0)
|
||||||
|
{
|
||||||
|
/* On Linux < 4.9, the value for an empty stream is wrong (all 0).
|
||||||
|
See <https://patchwork.kernel.org/patch/9308641/>.
|
||||||
|
This was not fixed properly until November 2016,
|
||||||
|
see <https://patchwork.kernel.org/patch/9434741/>. */
|
||||||
|
result = ferror (stream) ? -EIO : nseek == 0 ? -EAFNOSUPPORT : 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
nseek -= size;
|
||||||
|
if (send (ofd, buf, size, MSG_MORE) != size)
|
||||||
|
{
|
||||||
|
if (nseek == -1)
|
||||||
|
{
|
||||||
|
/* 1 byte of pushback buffer is guaranteed on stream, even
|
||||||
|
if stream is not seekable. */
|
||||||
|
ungetc ((unsigned char) buf[0], stream);
|
||||||
|
result = -EAFNOSUPPORT;
|
||||||
|
}
|
||||||
|
else if (fseeko (stream, nseek, SEEK_CUR) == 0)
|
||||||
|
/* The position of stream has been restored. */
|
||||||
|
result = -EAFNOSUPPORT;
|
||||||
|
else
|
||||||
|
result = -EIO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Don't assume that EOF is sticky. See:
|
||||||
|
<https://sourceware.org/bugzilla/show_bug.cgi?id=19476>. */
|
||||||
|
if (feof (stream))
|
||||||
|
{
|
||||||
|
result = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result == 0 && read (ofd, resblock, hashlen) != hashlen)
|
||||||
|
{
|
||||||
|
if (nseek == 0 || fseeko (stream, nseek, SEEK_CUR) == 0)
|
||||||
|
/* The position of stream has been restored. */
|
||||||
|
result = -EAFNOSUPPORT;
|
||||||
|
else
|
||||||
|
result = -EIO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close (ofd);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,115 @@
|
||||||
|
/* af_alg.h - Compute message digests from file streams and buffers.
|
||||||
|
Copyright (C) 2018-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3, 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Matteo Croce <mcroce@redhat.com>, 2018.
|
||||||
|
Documentation by Bruno Haible <bruno@clisp.org>, 2018. */
|
||||||
|
|
||||||
|
/* Declare specific functions for computing message digests
|
||||||
|
using the Linux kernel crypto API, if available. This kernel API gives
|
||||||
|
access to specialized crypto instructions (that would also be available
|
||||||
|
in user space) or to crypto devices (not directly available in user space).
|
||||||
|
|
||||||
|
For a more complete set of facilities that use the Linux kernel crypto API,
|
||||||
|
look at libkcapi. */
|
||||||
|
|
||||||
|
#ifndef AF_ALG_H
|
||||||
|
# define AF_ALG_H 1
|
||||||
|
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <errno.h>
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if USE_LINUX_CRYPTO_API
|
||||||
|
|
||||||
|
/* Compute a message digest of a memory region.
|
||||||
|
|
||||||
|
The memory region starts at BUFFER and is LEN bytes long.
|
||||||
|
|
||||||
|
ALG is the message digest algorithm; see the file /proc/crypto.
|
||||||
|
|
||||||
|
RESBLOCK points to a block of HASHLEN bytes, for the result.
|
||||||
|
HASHLEN must be the length of the message digest, in bytes, in particular:
|
||||||
|
|
||||||
|
alg | hashlen
|
||||||
|
-------+--------
|
||||||
|
md5 | 16
|
||||||
|
sha1 | 20
|
||||||
|
sha224 | 28
|
||||||
|
sha256 | 32
|
||||||
|
sha384 | 48
|
||||||
|
sha512 | 64
|
||||||
|
|
||||||
|
If successful, fill RESBLOCK and return 0.
|
||||||
|
Upon failure, return a negated error number. */
|
||||||
|
int
|
||||||
|
afalg_buffer (const char *buffer, size_t len, const char *alg,
|
||||||
|
void *resblock, ssize_t hashlen);
|
||||||
|
|
||||||
|
/* Compute a message digest of data read from STREAM.
|
||||||
|
|
||||||
|
STREAM is an open file stream. The last operation on STREAM should
|
||||||
|
not be 'ungetc', and if STREAM is also open for writing it should
|
||||||
|
have been fflushed since its last write. Read from the current
|
||||||
|
position to the end of STREAM. Handle regular files efficiently.
|
||||||
|
|
||||||
|
ALG is the message digest algorithm; see the file /proc/crypto.
|
||||||
|
|
||||||
|
RESBLOCK points to a block of HASHLEN bytes, for the result.
|
||||||
|
HASHLEN must be the length of the message digest, in bytes, in particular:
|
||||||
|
|
||||||
|
alg | hashlen
|
||||||
|
-------+--------
|
||||||
|
md5 | 16
|
||||||
|
sha1 | 20
|
||||||
|
sha224 | 28
|
||||||
|
sha256 | 32
|
||||||
|
sha384 | 48
|
||||||
|
sha512 | 64
|
||||||
|
|
||||||
|
If successful, fill RESBLOCK and return 0.
|
||||||
|
Upon failure, return a negated error number.
|
||||||
|
Unless returning 0 or -EIO, restore STREAM's file position so that
|
||||||
|
the caller can fall back on some other method. */
|
||||||
|
int
|
||||||
|
afalg_stream (FILE *stream, const char *alg,
|
||||||
|
void *resblock, ssize_t hashlen);
|
||||||
|
|
||||||
|
# else
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
afalg_buffer (const char *buffer, size_t len, const char *alg,
|
||||||
|
void *resblock, ssize_t hashlen)
|
||||||
|
{
|
||||||
|
return -EAFNOSUPPORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
afalg_stream (FILE *stream, const char *alg,
|
||||||
|
void *resblock, ssize_t hashlen)
|
||||||
|
{
|
||||||
|
return -EAFNOSUPPORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif /* AF_ALG_H */
|
|
@ -0,0 +1,478 @@
|
||||||
|
/* alloca.c -- allocate automatically reclaimed memory
|
||||||
|
(Mostly) portable public-domain implementation -- D A Gwyn
|
||||||
|
|
||||||
|
This implementation of the PWB library alloca function,
|
||||||
|
which is used to allocate space off the run-time stack so
|
||||||
|
that it is automatically reclaimed upon procedure exit,
|
||||||
|
was inspired by discussions with J. Q. Johnson of Cornell.
|
||||||
|
J.Otto Tennant <jot@cray.com> contributed the Cray support.
|
||||||
|
|
||||||
|
There are some preprocessor constants that can
|
||||||
|
be defined when compiling for your specific system, for
|
||||||
|
improved efficiency; however, the defaults should be okay.
|
||||||
|
|
||||||
|
The general concept of this implementation is to keep
|
||||||
|
track of all alloca-allocated blocks, and reclaim any
|
||||||
|
that are found to be deeper in the stack than the current
|
||||||
|
invocation. This heuristic does not reclaim storage as
|
||||||
|
soon as it becomes invalid, but it will do so eventually.
|
||||||
|
|
||||||
|
As a special case, alloca(0) reclaims storage without
|
||||||
|
allocating any. It is a good idea to use alloca(0) in
|
||||||
|
your main control loop, etc. to force garbage collection. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <alloca.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifdef emacs
|
||||||
|
# include "lisp.h"
|
||||||
|
# include "blockinput.h"
|
||||||
|
# ifdef EMACS_FREE
|
||||||
|
# undef free
|
||||||
|
# define free EMACS_FREE
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define memory_full() abort ()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If compiling with GCC 2, this file's not needed. */
|
||||||
|
#if !defined (__GNUC__) || __GNUC__ < 2
|
||||||
|
|
||||||
|
/* If someone has defined alloca as a macro,
|
||||||
|
there must be some other way alloca is supposed to work. */
|
||||||
|
# ifndef alloca
|
||||||
|
|
||||||
|
# ifdef emacs
|
||||||
|
# ifdef static
|
||||||
|
/* actually, only want this if static is defined as ""
|
||||||
|
-- this is for usg, in which emacs must undefine static
|
||||||
|
in order to make unexec workable
|
||||||
|
*/
|
||||||
|
# ifndef STACK_DIRECTION
|
||||||
|
you
|
||||||
|
lose
|
||||||
|
-- must know STACK_DIRECTION at compile-time
|
||||||
|
/* Using #error here is not wise since this file should work for
|
||||||
|
old and obscure compilers. */
|
||||||
|
# endif /* STACK_DIRECTION undefined */
|
||||||
|
# endif /* static */
|
||||||
|
# endif /* emacs */
|
||||||
|
|
||||||
|
/* If your stack is a linked list of frames, you have to
|
||||||
|
provide an "address metric" ADDRESS_FUNCTION macro. */
|
||||||
|
|
||||||
|
# if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||||
|
long i00afunc ();
|
||||||
|
# define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
|
||||||
|
# else
|
||||||
|
# define ADDRESS_FUNCTION(arg) &(arg)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Define STACK_DIRECTION if you know the direction of stack
|
||||||
|
growth for your system; otherwise it will be automatically
|
||||||
|
deduced at run-time.
|
||||||
|
|
||||||
|
STACK_DIRECTION > 0 => grows toward higher addresses
|
||||||
|
STACK_DIRECTION < 0 => grows toward lower addresses
|
||||||
|
STACK_DIRECTION = 0 => direction of growth unknown */
|
||||||
|
|
||||||
|
# ifndef STACK_DIRECTION
|
||||||
|
# define STACK_DIRECTION 0 /* Direction unknown. */
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if STACK_DIRECTION != 0
|
||||||
|
|
||||||
|
# define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
|
||||||
|
|
||||||
|
# else /* STACK_DIRECTION == 0; need run-time code. */
|
||||||
|
|
||||||
|
static int stack_dir; /* 1 or -1 once known. */
|
||||||
|
# define STACK_DIR stack_dir
|
||||||
|
|
||||||
|
static int
|
||||||
|
find_stack_direction (int *addr, int depth)
|
||||||
|
{
|
||||||
|
int dir, dummy = 0;
|
||||||
|
if (! addr)
|
||||||
|
addr = &dummy;
|
||||||
|
*addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
|
||||||
|
dir = depth ? find_stack_direction (addr, depth - 1) : 0;
|
||||||
|
return dir + dummy;
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif /* STACK_DIRECTION == 0 */
|
||||||
|
|
||||||
|
/* An "alloca header" is used to:
|
||||||
|
(a) chain together all alloca'ed blocks;
|
||||||
|
(b) keep track of stack depth.
|
||||||
|
|
||||||
|
It is very important that sizeof(header) agree with malloc
|
||||||
|
alignment chunk size. The following default should work okay. */
|
||||||
|
|
||||||
|
# ifndef ALIGN_SIZE
|
||||||
|
# define ALIGN_SIZE sizeof(double)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
typedef union hdr
|
||||||
|
{
|
||||||
|
char align[ALIGN_SIZE]; /* To force sizeof(header). */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
union hdr *next; /* For chaining headers. */
|
||||||
|
char *deep; /* For stack depth measure. */
|
||||||
|
} h;
|
||||||
|
} header;
|
||||||
|
|
||||||
|
static header *last_alloca_header = NULL; /* -> last alloca header. */
|
||||||
|
|
||||||
|
/* Return a pointer to at least SIZE bytes of storage,
|
||||||
|
which will be automatically reclaimed upon exit from
|
||||||
|
the procedure that called alloca. Originally, this space
|
||||||
|
was supposed to be taken from the current stack frame of the
|
||||||
|
caller, but that method cannot be made to work for some
|
||||||
|
implementations of C, for example under Gould's UTX/32. */
|
||||||
|
|
||||||
|
void *
|
||||||
|
alloca (size_t size)
|
||||||
|
{
|
||||||
|
auto char probe; /* Probes stack depth: */
|
||||||
|
register char *depth = ADDRESS_FUNCTION (probe);
|
||||||
|
|
||||||
|
# if STACK_DIRECTION == 0
|
||||||
|
if (STACK_DIR == 0) /* Unknown growth direction. */
|
||||||
|
STACK_DIR = find_stack_direction (NULL, (size & 1) + 20);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Reclaim garbage, defined as all alloca'd storage that
|
||||||
|
was allocated from deeper in the stack than currently. */
|
||||||
|
|
||||||
|
{
|
||||||
|
register header *hp; /* Traverses linked list. */
|
||||||
|
|
||||||
|
# ifdef emacs
|
||||||
|
BLOCK_INPUT;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
for (hp = last_alloca_header; hp != NULL;)
|
||||||
|
if ((STACK_DIR > 0 && hp->h.deep > depth)
|
||||||
|
|| (STACK_DIR < 0 && hp->h.deep < depth))
|
||||||
|
{
|
||||||
|
register header *np = hp->h.next;
|
||||||
|
|
||||||
|
free (hp); /* Collect garbage. */
|
||||||
|
|
||||||
|
hp = np; /* -> next header. */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break; /* Rest are not deeper. */
|
||||||
|
|
||||||
|
last_alloca_header = hp; /* -> last valid storage. */
|
||||||
|
|
||||||
|
# ifdef emacs
|
||||||
|
UNBLOCK_INPUT;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size == 0)
|
||||||
|
return NULL; /* No allocation required. */
|
||||||
|
|
||||||
|
/* Allocate combined header + user data storage. */
|
||||||
|
|
||||||
|
{
|
||||||
|
/* Address of header. */
|
||||||
|
register header *new;
|
||||||
|
|
||||||
|
size_t combined_size = sizeof (header) + size;
|
||||||
|
if (combined_size < sizeof (header))
|
||||||
|
memory_full ();
|
||||||
|
|
||||||
|
new = malloc (combined_size);
|
||||||
|
|
||||||
|
if (! new)
|
||||||
|
memory_full ();
|
||||||
|
|
||||||
|
new->h.next = last_alloca_header;
|
||||||
|
new->h.deep = depth;
|
||||||
|
|
||||||
|
last_alloca_header = new;
|
||||||
|
|
||||||
|
/* User storage begins just after header. */
|
||||||
|
|
||||||
|
return (void *) (new + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||||
|
|
||||||
|
# ifdef DEBUG_I00AFUNC
|
||||||
|
# include <stdio.h>
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef CRAY_STACK
|
||||||
|
# define CRAY_STACK
|
||||||
|
# ifndef CRAY2
|
||||||
|
/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
|
||||||
|
struct stack_control_header
|
||||||
|
{
|
||||||
|
long shgrow:32; /* Number of times stack has grown. */
|
||||||
|
long shaseg:32; /* Size of increments to stack. */
|
||||||
|
long shhwm:32; /* High water mark of stack. */
|
||||||
|
long shsize:32; /* Current size of stack (all segments). */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The stack segment linkage control information occurs at
|
||||||
|
the high-address end of a stack segment. (The stack
|
||||||
|
grows from low addresses to high addresses.) The initial
|
||||||
|
part of the stack segment linkage control information is
|
||||||
|
0200 (octal) words. This provides for register storage
|
||||||
|
for the routine which overflows the stack. */
|
||||||
|
|
||||||
|
struct stack_segment_linkage
|
||||||
|
{
|
||||||
|
long ss[0200]; /* 0200 overflow words. */
|
||||||
|
long sssize:32; /* Number of words in this segment. */
|
||||||
|
long ssbase:32; /* Offset to stack base. */
|
||||||
|
long:32;
|
||||||
|
long sspseg:32; /* Offset to linkage control of previous
|
||||||
|
segment of stack. */
|
||||||
|
long:32;
|
||||||
|
long sstcpt:32; /* Pointer to task common address block. */
|
||||||
|
long sscsnm; /* Private control structure number for
|
||||||
|
microtasking. */
|
||||||
|
long ssusr1; /* Reserved for user. */
|
||||||
|
long ssusr2; /* Reserved for user. */
|
||||||
|
long sstpid; /* Process ID for pid based multi-tasking. */
|
||||||
|
long ssgvup; /* Pointer to multitasking thread giveup. */
|
||||||
|
long sscray[7]; /* Reserved for Cray Research. */
|
||||||
|
long ssa0;
|
||||||
|
long ssa1;
|
||||||
|
long ssa2;
|
||||||
|
long ssa3;
|
||||||
|
long ssa4;
|
||||||
|
long ssa5;
|
||||||
|
long ssa6;
|
||||||
|
long ssa7;
|
||||||
|
long sss0;
|
||||||
|
long sss1;
|
||||||
|
long sss2;
|
||||||
|
long sss3;
|
||||||
|
long sss4;
|
||||||
|
long sss5;
|
||||||
|
long sss6;
|
||||||
|
long sss7;
|
||||||
|
};
|
||||||
|
|
||||||
|
# else /* CRAY2 */
|
||||||
|
/* The following structure defines the vector of words
|
||||||
|
returned by the STKSTAT library routine. */
|
||||||
|
struct stk_stat
|
||||||
|
{
|
||||||
|
long now; /* Current total stack size. */
|
||||||
|
long maxc; /* Amount of contiguous space which would
|
||||||
|
be required to satisfy the maximum
|
||||||
|
stack demand to date. */
|
||||||
|
long high_water; /* Stack high-water mark. */
|
||||||
|
long overflows; /* Number of stack overflow ($STKOFEN) calls. */
|
||||||
|
long hits; /* Number of internal buffer hits. */
|
||||||
|
long extends; /* Number of block extensions. */
|
||||||
|
long stko_mallocs; /* Block allocations by $STKOFEN. */
|
||||||
|
long underflows; /* Number of stack underflow calls ($STKRETN). */
|
||||||
|
long stko_free; /* Number of deallocations by $STKRETN. */
|
||||||
|
long stkm_free; /* Number of deallocations by $STKMRET. */
|
||||||
|
long segments; /* Current number of stack segments. */
|
||||||
|
long maxs; /* Maximum number of stack segments so far. */
|
||||||
|
long pad_size; /* Stack pad size. */
|
||||||
|
long current_address; /* Current stack segment address. */
|
||||||
|
long current_size; /* Current stack segment size. This
|
||||||
|
number is actually corrupted by STKSTAT to
|
||||||
|
include the fifteen word trailer area. */
|
||||||
|
long initial_address; /* Address of initial segment. */
|
||||||
|
long initial_size; /* Size of initial segment. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The following structure describes the data structure which trails
|
||||||
|
any stack segment. I think that the description in 'asdef' is
|
||||||
|
out of date. I only describe the parts that I am sure about. */
|
||||||
|
|
||||||
|
struct stk_trailer
|
||||||
|
{
|
||||||
|
long this_address; /* Address of this block. */
|
||||||
|
long this_size; /* Size of this block (does not include
|
||||||
|
this trailer). */
|
||||||
|
long unknown2;
|
||||||
|
long unknown3;
|
||||||
|
long link; /* Address of trailer block of previous
|
||||||
|
segment. */
|
||||||
|
long unknown5;
|
||||||
|
long unknown6;
|
||||||
|
long unknown7;
|
||||||
|
long unknown8;
|
||||||
|
long unknown9;
|
||||||
|
long unknown10;
|
||||||
|
long unknown11;
|
||||||
|
long unknown12;
|
||||||
|
long unknown13;
|
||||||
|
long unknown14;
|
||||||
|
};
|
||||||
|
|
||||||
|
# endif /* CRAY2 */
|
||||||
|
# endif /* not CRAY_STACK */
|
||||||
|
|
||||||
|
# ifdef CRAY2
|
||||||
|
/* Determine a "stack measure" for an arbitrary ADDRESS.
|
||||||
|
I doubt that "lint" will like this much. */
|
||||||
|
|
||||||
|
static long
|
||||||
|
i00afunc (long *address)
|
||||||
|
{
|
||||||
|
struct stk_stat status;
|
||||||
|
struct stk_trailer *trailer;
|
||||||
|
long *block, size;
|
||||||
|
long result = 0;
|
||||||
|
|
||||||
|
/* We want to iterate through all of the segments. The first
|
||||||
|
step is to get the stack status structure. We could do this
|
||||||
|
more quickly and more directly, perhaps, by referencing the
|
||||||
|
$LM00 common block, but I know that this works. */
|
||||||
|
|
||||||
|
STKSTAT (&status);
|
||||||
|
|
||||||
|
/* Set up the iteration. */
|
||||||
|
|
||||||
|
trailer = (struct stk_trailer *) (status.current_address
|
||||||
|
+ status.current_size
|
||||||
|
- 15);
|
||||||
|
|
||||||
|
/* There must be at least one stack segment. Therefore it is
|
||||||
|
a fatal error if "trailer" is null. */
|
||||||
|
|
||||||
|
if (trailer == NULL)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
/* Discard segments that do not contain our argument address. */
|
||||||
|
|
||||||
|
while (trailer != NULL)
|
||||||
|
{
|
||||||
|
block = (long *) trailer->this_address;
|
||||||
|
size = trailer->this_size;
|
||||||
|
if (block == NULL || size == 0)
|
||||||
|
abort ();
|
||||||
|
trailer = (struct stk_trailer *) trailer->link;
|
||||||
|
if ((block <= address) && (address < (block + size)))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the result to the offset in this segment and add the sizes
|
||||||
|
of all predecessor segments. */
|
||||||
|
|
||||||
|
result = address - block;
|
||||||
|
|
||||||
|
if (trailer == NULL)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (trailer->this_size <= 0)
|
||||||
|
abort ();
|
||||||
|
result += trailer->this_size;
|
||||||
|
trailer = (struct stk_trailer *) trailer->link;
|
||||||
|
}
|
||||||
|
while (trailer != NULL);
|
||||||
|
|
||||||
|
/* We are done. Note that if you present a bogus address (one
|
||||||
|
not in any segment), you will get a different number back, formed
|
||||||
|
from subtracting the address of the first block. This is probably
|
||||||
|
not what you want. */
|
||||||
|
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
# else /* not CRAY2 */
|
||||||
|
/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
|
||||||
|
Determine the number of the cell within the stack,
|
||||||
|
given the address of the cell. The purpose of this
|
||||||
|
routine is to linearize, in some sense, stack addresses
|
||||||
|
for alloca. */
|
||||||
|
|
||||||
|
static long
|
||||||
|
i00afunc (long address)
|
||||||
|
{
|
||||||
|
long stkl = 0;
|
||||||
|
|
||||||
|
long size, pseg, this_segment, stack;
|
||||||
|
long result = 0;
|
||||||
|
|
||||||
|
struct stack_segment_linkage *ssptr;
|
||||||
|
|
||||||
|
/* Register B67 contains the address of the end of the
|
||||||
|
current stack segment. If you (as a subprogram) store
|
||||||
|
your registers on the stack and find that you are past
|
||||||
|
the contents of B67, you have overflowed the segment.
|
||||||
|
|
||||||
|
B67 also points to the stack segment linkage control
|
||||||
|
area, which is what we are really interested in. */
|
||||||
|
|
||||||
|
stkl = CRAY_STACKSEG_END ();
|
||||||
|
ssptr = (struct stack_segment_linkage *) stkl;
|
||||||
|
|
||||||
|
/* If one subtracts 'size' from the end of the segment,
|
||||||
|
one has the address of the first word of the segment.
|
||||||
|
|
||||||
|
If this is not the first segment, 'pseg' will be
|
||||||
|
nonzero. */
|
||||||
|
|
||||||
|
pseg = ssptr->sspseg;
|
||||||
|
size = ssptr->sssize;
|
||||||
|
|
||||||
|
this_segment = stkl - size;
|
||||||
|
|
||||||
|
/* It is possible that calling this routine itself caused
|
||||||
|
a stack overflow. Discard stack segments which do not
|
||||||
|
contain the target address. */
|
||||||
|
|
||||||
|
while (!(this_segment <= address && address <= stkl))
|
||||||
|
{
|
||||||
|
# ifdef DEBUG_I00AFUNC
|
||||||
|
fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
|
||||||
|
# endif
|
||||||
|
if (pseg == 0)
|
||||||
|
break;
|
||||||
|
stkl = stkl - pseg;
|
||||||
|
ssptr = (struct stack_segment_linkage *) stkl;
|
||||||
|
size = ssptr->sssize;
|
||||||
|
pseg = ssptr->sspseg;
|
||||||
|
this_segment = stkl - size;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = address - this_segment;
|
||||||
|
|
||||||
|
/* If you subtract pseg from the current end of the stack,
|
||||||
|
you get the address of the previous stack segment's end.
|
||||||
|
This seems a little convoluted to me, but I'll bet you save
|
||||||
|
a cycle somewhere. */
|
||||||
|
|
||||||
|
while (pseg != 0)
|
||||||
|
{
|
||||||
|
# ifdef DEBUG_I00AFUNC
|
||||||
|
fprintf (stderr, "%011o %011o\n", pseg, size);
|
||||||
|
# endif
|
||||||
|
stkl = stkl - pseg;
|
||||||
|
ssptr = (struct stack_segment_linkage *) stkl;
|
||||||
|
size = ssptr->sssize;
|
||||||
|
pseg = ssptr->sspseg;
|
||||||
|
result += size;
|
||||||
|
}
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif /* not CRAY2 */
|
||||||
|
# endif /* CRAY */
|
||||||
|
|
||||||
|
# endif /* no alloca */
|
||||||
|
#endif /* not GCC 2 */
|
|
@ -0,0 +1,71 @@
|
||||||
|
/* Memory allocation on the stack.
|
||||||
|
|
||||||
|
Copyright (C) 1995, 1999, 2001-2004, 2006-2019 Free Software Foundation,
|
||||||
|
Inc.
|
||||||
|
|
||||||
|
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 3, 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, see
|
||||||
|
<https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
|
||||||
|
means there is a real alloca function. */
|
||||||
|
#ifndef _GL_ALLOCA_H
|
||||||
|
#define _GL_ALLOCA_H
|
||||||
|
|
||||||
|
/* alloca (N) returns a pointer to N bytes of memory
|
||||||
|
allocated on the stack, which will last until the function returns.
|
||||||
|
Use of alloca should be avoided:
|
||||||
|
- inside arguments of function calls - undefined behaviour,
|
||||||
|
- in inline functions - the allocation may actually last until the
|
||||||
|
calling function returns,
|
||||||
|
- for huge N (say, N >= 65536) - you never know how large (or small)
|
||||||
|
the stack is, and when the stack cannot fulfill the memory allocation
|
||||||
|
request, the program just crashes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef alloca
|
||||||
|
# ifdef __GNUC__
|
||||||
|
/* Some version of mingw have an <alloca.h> that causes trouble when
|
||||||
|
included after 'alloca' gets defined as a macro. As a workaround, include
|
||||||
|
this <alloca.h> first and define 'alloca' as a macro afterwards. */
|
||||||
|
# if (defined _WIN32 && ! defined __CYGWIN__) && @HAVE_ALLOCA_H@
|
||||||
|
# include_next <alloca.h>
|
||||||
|
# endif
|
||||||
|
# define alloca __builtin_alloca
|
||||||
|
# elif defined _AIX
|
||||||
|
# define alloca __alloca
|
||||||
|
# elif defined _MSC_VER
|
||||||
|
# include <malloc.h>
|
||||||
|
# define alloca _alloca
|
||||||
|
# elif defined __DECC && defined __VMS
|
||||||
|
# define alloca __ALLOCA
|
||||||
|
# elif defined __TANDEM && defined _TNS_E_TARGET
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
# endif
|
||||||
|
void *_alloca (unsigned short);
|
||||||
|
# pragma intrinsic (_alloca)
|
||||||
|
# define alloca _alloca
|
||||||
|
# elif defined __MVS__
|
||||||
|
# include <stdlib.h>
|
||||||
|
# else
|
||||||
|
# include <stddef.h>
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
# endif
|
||||||
|
void *alloca (size_t);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _GL_ALLOCA_H */
|
|
@ -0,0 +1,26 @@
|
||||||
|
/* A C macro for declaring that specific arguments must not be NULL.
|
||||||
|
Copyright (C) 2009-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
|
||||||
|
that the values passed as arguments n, ..., m must be non-NULL pointers.
|
||||||
|
n = 1 stands for the first argument, n = 2 for the second argument etc. */
|
||||||
|
#ifndef _GL_ARG_NONNULL
|
||||||
|
# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
|
||||||
|
# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
|
||||||
|
# else
|
||||||
|
# define _GL_ARG_NONNULL(params)
|
||||||
|
# endif
|
||||||
|
#endif
|
|
@ -0,0 +1,140 @@
|
||||||
|
/* A GNU-like <arpa/inet.h>.
|
||||||
|
|
||||||
|
Copyright (C) 2005-2006, 2008-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3, 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_ARPA_INET_H
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
#if @HAVE_FEATURES_H@
|
||||||
|
# include <features.h> /* for __GLIBC__ */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Gnulib's sys/socket.h is responsible for defining socklen_t (used below) and
|
||||||
|
for pulling in winsock2.h etc. under MinGW.
|
||||||
|
But avoid namespace pollution on glibc systems. */
|
||||||
|
#ifndef __GLIBC__
|
||||||
|
# include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* On NonStop Kernel, inet_ntop and inet_pton are declared in <netdb.h>.
|
||||||
|
But avoid namespace pollution on glibc systems. */
|
||||||
|
#if defined __TANDEM && !defined __GLIBC__
|
||||||
|
# include <netdb.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @HAVE_ARPA_INET_H@
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
# @INCLUDE_NEXT@ @NEXT_ARPA_INET_H@
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_ARPA_INET_H
|
||||||
|
#define _@GUARD_PREFIX@_ARPA_INET_H
|
||||||
|
|
||||||
|
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
|
||||||
|
|
||||||
|
/* The definition of _GL_ARG_NONNULL is copied here. */
|
||||||
|
|
||||||
|
/* The definition of _GL_WARN_ON_USE is copied here. */
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_INET_NTOP@
|
||||||
|
/* Converts an internet address from internal format to a printable,
|
||||||
|
presentable format.
|
||||||
|
AF is an internet address family, such as AF_INET or AF_INET6.
|
||||||
|
SRC points to a 'struct in_addr' (for AF_INET) or 'struct in6_addr'
|
||||||
|
(for AF_INET6).
|
||||||
|
DST points to a buffer having room for CNT bytes.
|
||||||
|
The printable representation of the address (in numeric form, not
|
||||||
|
surrounded by [...], no reverse DNS is done) is placed in DST, and
|
||||||
|
DST is returned. If an error occurs, the return value is NULL and
|
||||||
|
errno is set. If CNT bytes are not sufficient to hold the result,
|
||||||
|
the return value is NULL and errno is set to ENOSPC. A good value
|
||||||
|
for CNT is 46.
|
||||||
|
|
||||||
|
For more details, see the POSIX:2001 specification
|
||||||
|
<http://www.opengroup.org/susv3xsh/inet_ntop.html>. */
|
||||||
|
# if @REPLACE_INET_NTOP@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef inet_ntop
|
||||||
|
# define inet_ntop rpl_inet_ntop
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (inet_ntop, const char *,
|
||||||
|
(int af, const void *restrict src,
|
||||||
|
char *restrict dst, socklen_t cnt)
|
||||||
|
_GL_ARG_NONNULL ((2, 3)));
|
||||||
|
_GL_CXXALIAS_RPL (inet_ntop, const char *,
|
||||||
|
(int af, const void *restrict src,
|
||||||
|
char *restrict dst, socklen_t cnt));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_DECL_INET_NTOP@
|
||||||
|
_GL_FUNCDECL_SYS (inet_ntop, const char *,
|
||||||
|
(int af, const void *restrict src,
|
||||||
|
char *restrict dst, socklen_t cnt)
|
||||||
|
_GL_ARG_NONNULL ((2, 3)));
|
||||||
|
# endif
|
||||||
|
/* Need to cast, because on NonStop Kernel, the fourth parameter is
|
||||||
|
size_t cnt. */
|
||||||
|
_GL_CXXALIAS_SYS_CAST (inet_ntop, const char *,
|
||||||
|
(int af, const void *restrict src,
|
||||||
|
char *restrict dst, socklen_t cnt));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (inet_ntop);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef inet_ntop
|
||||||
|
# if HAVE_RAW_DECL_INET_NTOP
|
||||||
|
_GL_WARN_ON_USE (inet_ntop, "inet_ntop is unportable - "
|
||||||
|
"use gnulib module inet_ntop for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_INET_PTON@
|
||||||
|
# if @REPLACE_INET_PTON@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef inet_pton
|
||||||
|
# define inet_pton rpl_inet_pton
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (inet_pton, int,
|
||||||
|
(int af, const char *restrict src, void *restrict dst)
|
||||||
|
_GL_ARG_NONNULL ((2, 3)));
|
||||||
|
_GL_CXXALIAS_RPL (inet_pton, int,
|
||||||
|
(int af, const char *restrict src, void *restrict dst));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_DECL_INET_PTON@
|
||||||
|
_GL_FUNCDECL_SYS (inet_pton, int,
|
||||||
|
(int af, const char *restrict src, void *restrict dst)
|
||||||
|
_GL_ARG_NONNULL ((2, 3)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (inet_pton, int,
|
||||||
|
(int af, const char *restrict src, void *restrict dst));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (inet_pton);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef inet_pton
|
||||||
|
# if HAVE_RAW_DECL_INET_PTON
|
||||||
|
_GL_WARN_ON_USE (inet_pton, "inet_pton is unportable - "
|
||||||
|
"use gnulib module inet_pton for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_ARPA_INET_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_ARPA_INET_H */
|
|
@ -0,0 +1,274 @@
|
||||||
|
/* Stable-sorting of an array using mergesort.
|
||||||
|
Copyright (C) 2009-2019 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2009.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* This file implements stable sorting of an array, using the mergesort
|
||||||
|
algorithm.
|
||||||
|
Worst-case running time for an array of length N is O(N log N).
|
||||||
|
Unlike the mpsort module, the algorithm here attempts to minimize not
|
||||||
|
only the number of comparisons, but also the number of copying operations.
|
||||||
|
|
||||||
|
Before including this file, you need to define
|
||||||
|
ELEMENT The type of every array element.
|
||||||
|
COMPARE A two-argument macro that takes two 'const ELEMENT *'
|
||||||
|
pointers and returns a negative, zero, or positive 'int'
|
||||||
|
value if the element pointed to by the first argument is,
|
||||||
|
respectively, less, equal, or greater than the element
|
||||||
|
pointed to by the second argument.
|
||||||
|
STATIC The storage class of the functions being defined.
|
||||||
|
Before including this file, you also need to include:
|
||||||
|
#include <stddef.h>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Merge the sorted arrays src1[0..n1-1] and src2[0..n2-1] into
|
||||||
|
dst[0..n1+n2-1]. In case of ambiguity, put the elements of src1
|
||||||
|
before the elements of src2.
|
||||||
|
n1 and n2 must be > 0.
|
||||||
|
The arrays src1 and src2 must not overlap the dst array, except that
|
||||||
|
src1 may be dst[n2..n1+n2-1], or src2 may be dst[n1..n1+n2-1]. */
|
||||||
|
static void
|
||||||
|
merge (const ELEMENT *src1, size_t n1,
|
||||||
|
const ELEMENT *src2, size_t n2,
|
||||||
|
ELEMENT *dst)
|
||||||
|
{
|
||||||
|
for (;;) /* while (n1 > 0 && n2 > 0) */
|
||||||
|
{
|
||||||
|
if (COMPARE (src1, src2) <= 0)
|
||||||
|
{
|
||||||
|
*dst++ = *src1++;
|
||||||
|
n1--;
|
||||||
|
if (n1 == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*dst++ = *src2++;
|
||||||
|
n2--;
|
||||||
|
if (n2 == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Here n1 == 0 || n2 == 0 but also n1 > 0 || n2 > 0. */
|
||||||
|
if (n1 > 0)
|
||||||
|
{
|
||||||
|
if (dst != src1)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
*dst++ = *src1++;
|
||||||
|
n1--;
|
||||||
|
}
|
||||||
|
while (n1 > 0);
|
||||||
|
}
|
||||||
|
else /* n2 > 0 */
|
||||||
|
{
|
||||||
|
if (dst != src2)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
*dst++ = *src2++;
|
||||||
|
n2--;
|
||||||
|
}
|
||||||
|
while (n2 > 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sort src[0..n-1] into dst[0..n-1], using tmp[0..n/2-1] as temporary
|
||||||
|
(scratch) storage.
|
||||||
|
The arrays src, dst, tmp must not overlap. */
|
||||||
|
STATIC void
|
||||||
|
merge_sort_fromto (const ELEMENT *src, ELEMENT *dst, size_t n, ELEMENT *tmp)
|
||||||
|
{
|
||||||
|
switch (n)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return;
|
||||||
|
case 1:
|
||||||
|
/* Nothing to do. */
|
||||||
|
dst[0] = src[0];
|
||||||
|
return;
|
||||||
|
case 2:
|
||||||
|
/* Trivial case. */
|
||||||
|
if (COMPARE (&src[0], &src[1]) <= 0)
|
||||||
|
{
|
||||||
|
/* src[0] <= src[1] */
|
||||||
|
dst[0] = src[0];
|
||||||
|
dst[1] = src[1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dst[0] = src[1];
|
||||||
|
dst[1] = src[0];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
/* Simple case. */
|
||||||
|
if (COMPARE (&src[0], &src[1]) <= 0)
|
||||||
|
{
|
||||||
|
if (COMPARE (&src[1], &src[2]) <= 0)
|
||||||
|
{
|
||||||
|
/* src[0] <= src[1] <= src[2] */
|
||||||
|
dst[0] = src[0];
|
||||||
|
dst[1] = src[1];
|
||||||
|
dst[2] = src[2];
|
||||||
|
}
|
||||||
|
else if (COMPARE (&src[0], &src[2]) <= 0)
|
||||||
|
{
|
||||||
|
/* src[0] <= src[2] < src[1] */
|
||||||
|
dst[0] = src[0];
|
||||||
|
dst[1] = src[2];
|
||||||
|
dst[2] = src[1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* src[2] < src[0] <= src[1] */
|
||||||
|
dst[0] = src[2];
|
||||||
|
dst[1] = src[0];
|
||||||
|
dst[2] = src[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (COMPARE (&src[0], &src[2]) <= 0)
|
||||||
|
{
|
||||||
|
/* src[1] < src[0] <= src[2] */
|
||||||
|
dst[0] = src[1];
|
||||||
|
dst[1] = src[0];
|
||||||
|
dst[2] = src[2];
|
||||||
|
}
|
||||||
|
else if (COMPARE (&src[1], &src[2]) <= 0)
|
||||||
|
{
|
||||||
|
/* src[1] <= src[2] < src[0] */
|
||||||
|
dst[0] = src[1];
|
||||||
|
dst[1] = src[2];
|
||||||
|
dst[2] = src[0];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* src[2] < src[1] < src[0] */
|
||||||
|
dst[0] = src[2];
|
||||||
|
dst[1] = src[1];
|
||||||
|
dst[2] = src[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
size_t n1 = n / 2;
|
||||||
|
size_t n2 = (n + 1) / 2;
|
||||||
|
/* Note: n1 + n2 = n, n1 <= n2. */
|
||||||
|
/* Sort src[n1..n-1] into dst[n1..n-1], scratching tmp[0..n2/2-1]. */
|
||||||
|
merge_sort_fromto (src + n1, dst + n1, n2, tmp);
|
||||||
|
/* Sort src[0..n1-1] into tmp[0..n1-1], scratching dst[0..n1-1]. */
|
||||||
|
merge_sort_fromto (src, tmp, n1, dst);
|
||||||
|
/* Merge the two half results. */
|
||||||
|
merge (tmp, n1, dst + n1, n2, dst);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sort src[0..n-1], using tmp[0..n-1] as temporary (scratch) storage.
|
||||||
|
The arrays src, tmp must not overlap. */
|
||||||
|
STATIC void
|
||||||
|
merge_sort_inplace (ELEMENT *src, size_t n, ELEMENT *tmp)
|
||||||
|
{
|
||||||
|
switch (n)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
/* Nothing to do. */
|
||||||
|
return;
|
||||||
|
case 2:
|
||||||
|
/* Trivial case. */
|
||||||
|
if (COMPARE (&src[0], &src[1]) <= 0)
|
||||||
|
{
|
||||||
|
/* src[0] <= src[1] */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ELEMENT t = src[0];
|
||||||
|
src[0] = src[1];
|
||||||
|
src[1] = t;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
/* Simple case. */
|
||||||
|
if (COMPARE (&src[0], &src[1]) <= 0)
|
||||||
|
{
|
||||||
|
if (COMPARE (&src[1], &src[2]) <= 0)
|
||||||
|
{
|
||||||
|
/* src[0] <= src[1] <= src[2] */
|
||||||
|
}
|
||||||
|
else if (COMPARE (&src[0], &src[2]) <= 0)
|
||||||
|
{
|
||||||
|
/* src[0] <= src[2] < src[1] */
|
||||||
|
ELEMENT t = src[1];
|
||||||
|
src[1] = src[2];
|
||||||
|
src[2] = t;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* src[2] < src[0] <= src[1] */
|
||||||
|
ELEMENT t = src[0];
|
||||||
|
src[0] = src[2];
|
||||||
|
src[2] = src[1];
|
||||||
|
src[1] = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (COMPARE (&src[0], &src[2]) <= 0)
|
||||||
|
{
|
||||||
|
/* src[1] < src[0] <= src[2] */
|
||||||
|
ELEMENT t = src[0];
|
||||||
|
src[0] = src[1];
|
||||||
|
src[1] = t;
|
||||||
|
}
|
||||||
|
else if (COMPARE (&src[1], &src[2]) <= 0)
|
||||||
|
{
|
||||||
|
/* src[1] <= src[2] < src[0] */
|
||||||
|
ELEMENT t = src[0];
|
||||||
|
src[0] = src[1];
|
||||||
|
src[1] = src[2];
|
||||||
|
src[2] = t;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* src[2] < src[1] < src[0] */
|
||||||
|
ELEMENT t = src[0];
|
||||||
|
src[0] = src[2];
|
||||||
|
src[2] = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
size_t n1 = n / 2;
|
||||||
|
size_t n2 = (n + 1) / 2;
|
||||||
|
/* Note: n1 + n2 = n, n1 <= n2. */
|
||||||
|
/* Sort src[n1..n-1], scratching tmp[0..n2-1]. */
|
||||||
|
merge_sort_inplace (src + n1, n2, tmp);
|
||||||
|
/* Sort src[0..n1-1] into tmp[0..n1-1], scratching tmp[n1..2*n1-1]. */
|
||||||
|
merge_sort_fromto (src, tmp, n1, tmp + n1);
|
||||||
|
/* Merge the two half results. */
|
||||||
|
merge (tmp, n1, src + n1, n2, src);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef ELEMENT
|
||||||
|
#undef COMPARE
|
||||||
|
#undef STATIC
|
|
@ -0,0 +1,34 @@
|
||||||
|
/* Formatted output to strings.
|
||||||
|
Copyright (C) 1999, 2002, 2006, 2009-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3, 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "vasnprintf.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
char *
|
||||||
|
asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
char *result;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
result = vasnprintf (resultbuf, lengthp, format, args);
|
||||||
|
va_end (args);
|
||||||
|
return result;
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
/* Formatted output to strings.
|
||||||
|
Copyright (C) 1999, 2002, 2006-2007, 2009-2019 Free Software Foundation,
|
||||||
|
Inc.
|
||||||
|
|
||||||
|
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 3, 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#ifdef IN_LIBASPRINTF
|
||||||
|
# include "vasprintf.h"
|
||||||
|
#else
|
||||||
|
# include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
asprintf (char **resultp, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
result = vasprintf (resultp, format, args);
|
||||||
|
va_end (args);
|
||||||
|
return result;
|
||||||
|
}
|
|
@ -0,0 +1,587 @@
|
||||||
|
/* base32.c -- Encode binary data using printable characters.
|
||||||
|
Copyright (C) 1999-2001, 2004-2006, 2009-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3, 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Adapted from Simon Josefsson's base64 code by Gijs van Tulder.
|
||||||
|
*
|
||||||
|
* See also RFC 4648 <https://www.ietf.org/rfc/rfc4648.txt>.
|
||||||
|
*
|
||||||
|
* Be careful with error checking. Here is how you would typically
|
||||||
|
* use these functions:
|
||||||
|
*
|
||||||
|
* bool ok = base32_decode_alloc (in, inlen, &out, &outlen);
|
||||||
|
* if (!ok)
|
||||||
|
* FAIL: input was not valid base32
|
||||||
|
* if (out == NULL)
|
||||||
|
* FAIL: memory allocation error
|
||||||
|
* OK: data in OUT/OUTLEN
|
||||||
|
*
|
||||||
|
* size_t outlen = base32_encode_alloc (in, inlen, &out);
|
||||||
|
* if (out == NULL && outlen == 0 && inlen != 0)
|
||||||
|
* FAIL: input too long
|
||||||
|
* if (out == NULL)
|
||||||
|
* FAIL: memory allocation error
|
||||||
|
* OK: data in OUT/OUTLEN.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Get prototype. */
|
||||||
|
#include "base32.h"
|
||||||
|
|
||||||
|
/* Get malloc. */
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* Get UCHAR_MAX. */
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* C89 compliant way to cast 'char' to 'unsigned char'. */
|
||||||
|
static unsigned char
|
||||||
|
to_uchar (char ch)
|
||||||
|
{
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Base32 encode IN array of size INLEN into OUT array of size OUTLEN.
|
||||||
|
If OUTLEN is less than BASE32_LENGTH(INLEN), write as many bytes as
|
||||||
|
possible. If OUTLEN is larger than BASE32_LENGTH(INLEN), also zero
|
||||||
|
terminate the output buffer. */
|
||||||
|
void
|
||||||
|
base32_encode (const char *restrict in, size_t inlen,
|
||||||
|
char *restrict out, size_t outlen)
|
||||||
|
{
|
||||||
|
static const char b32str[32] =
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
||||||
|
|
||||||
|
while (inlen && outlen)
|
||||||
|
{
|
||||||
|
*out++ = b32str[(to_uchar (in[0]) >> 3) & 0x1f];
|
||||||
|
if (!--outlen)
|
||||||
|
break;
|
||||||
|
*out++ = b32str[((to_uchar (in[0]) << 2)
|
||||||
|
+ (--inlen ? to_uchar (in[1]) >> 6 : 0))
|
||||||
|
& 0x1f];
|
||||||
|
if (!--outlen)
|
||||||
|
break;
|
||||||
|
*out++ =
|
||||||
|
(inlen
|
||||||
|
? b32str[(to_uchar (in[1]) >> 1) & 0x1f]
|
||||||
|
: '=');
|
||||||
|
if (!--outlen)
|
||||||
|
break;
|
||||||
|
*out++ =
|
||||||
|
(inlen
|
||||||
|
? b32str[((to_uchar (in[1]) << 4)
|
||||||
|
+ (--inlen ? to_uchar (in[2]) >> 4 : 0))
|
||||||
|
& 0x1f]
|
||||||
|
: '=');
|
||||||
|
if (!--outlen)
|
||||||
|
break;
|
||||||
|
*out++ =
|
||||||
|
(inlen
|
||||||
|
? b32str[((to_uchar (in[2]) << 1)
|
||||||
|
+ (--inlen ? to_uchar (in[3]) >> 7 : 0))
|
||||||
|
& 0x1f]
|
||||||
|
: '=');
|
||||||
|
if (!--outlen)
|
||||||
|
break;
|
||||||
|
*out++ =
|
||||||
|
(inlen
|
||||||
|
? b32str[(to_uchar (in[3]) >> 2) & 0x1f]
|
||||||
|
: '=');
|
||||||
|
if (!--outlen)
|
||||||
|
break;
|
||||||
|
*out++ =
|
||||||
|
(inlen
|
||||||
|
? b32str[((to_uchar (in[3]) << 3)
|
||||||
|
+ (--inlen ? to_uchar (in[4]) >> 5 : 0))
|
||||||
|
& 0x1f]
|
||||||
|
: '=');
|
||||||
|
if (!--outlen)
|
||||||
|
break;
|
||||||
|
*out++ = inlen ? b32str[to_uchar (in[4]) & 0x1f] : '=';
|
||||||
|
if (!--outlen)
|
||||||
|
break;
|
||||||
|
if (inlen)
|
||||||
|
inlen--;
|
||||||
|
if (inlen)
|
||||||
|
in += 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outlen)
|
||||||
|
*out = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate a buffer and store zero terminated base32 encoded data
|
||||||
|
from array IN of size INLEN, returning BASE32_LENGTH(INLEN), i.e.,
|
||||||
|
the length of the encoded data, excluding the terminating zero. On
|
||||||
|
return, the OUT variable will hold a pointer to newly allocated
|
||||||
|
memory that must be deallocated by the caller. If output string
|
||||||
|
length would overflow, 0 is returned and OUT is set to NULL. If
|
||||||
|
memory allocation failed, OUT is set to NULL, and the return value
|
||||||
|
indicates length of the requested memory block, i.e.,
|
||||||
|
BASE32_LENGTH(inlen) + 1. */
|
||||||
|
size_t
|
||||||
|
base32_encode_alloc (const char *in, size_t inlen, char **out)
|
||||||
|
{
|
||||||
|
size_t outlen = 1 + BASE32_LENGTH (inlen);
|
||||||
|
|
||||||
|
/* Check for overflow in outlen computation.
|
||||||
|
*
|
||||||
|
* If there is no overflow, outlen >= inlen.
|
||||||
|
*
|
||||||
|
* TODO Is this a sufficient check? (See the notes in base64.c.)
|
||||||
|
*/
|
||||||
|
if (inlen > outlen)
|
||||||
|
{
|
||||||
|
*out = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*out = malloc (outlen);
|
||||||
|
if (!*out)
|
||||||
|
return outlen;
|
||||||
|
|
||||||
|
base32_encode (in, inlen, *out, outlen);
|
||||||
|
|
||||||
|
return outlen - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* With this approach this file works independent of the charset used
|
||||||
|
(think EBCDIC). However, it does assume that the characters in the
|
||||||
|
Base32 alphabet (A-Z2-7) are encoded in 0..255. POSIX
|
||||||
|
1003.1-2001 require that char and unsigned char are 8-bit
|
||||||
|
quantities, though, taking care of that problem. But this may be a
|
||||||
|
potential problem on non-POSIX C99 platforms.
|
||||||
|
|
||||||
|
IBM C V6 for AIX mishandles "#define B32(x) ...'x'...", so use "_"
|
||||||
|
as the formal parameter rather than "x". */
|
||||||
|
#define B32(_) \
|
||||||
|
((_) == 'A' ? 0 \
|
||||||
|
: (_) == 'B' ? 1 \
|
||||||
|
: (_) == 'C' ? 2 \
|
||||||
|
: (_) == 'D' ? 3 \
|
||||||
|
: (_) == 'E' ? 4 \
|
||||||
|
: (_) == 'F' ? 5 \
|
||||||
|
: (_) == 'G' ? 6 \
|
||||||
|
: (_) == 'H' ? 7 \
|
||||||
|
: (_) == 'I' ? 8 \
|
||||||
|
: (_) == 'J' ? 9 \
|
||||||
|
: (_) == 'K' ? 10 \
|
||||||
|
: (_) == 'L' ? 11 \
|
||||||
|
: (_) == 'M' ? 12 \
|
||||||
|
: (_) == 'N' ? 13 \
|
||||||
|
: (_) == 'O' ? 14 \
|
||||||
|
: (_) == 'P' ? 15 \
|
||||||
|
: (_) == 'Q' ? 16 \
|
||||||
|
: (_) == 'R' ? 17 \
|
||||||
|
: (_) == 'S' ? 18 \
|
||||||
|
: (_) == 'T' ? 19 \
|
||||||
|
: (_) == 'U' ? 20 \
|
||||||
|
: (_) == 'V' ? 21 \
|
||||||
|
: (_) == 'W' ? 22 \
|
||||||
|
: (_) == 'X' ? 23 \
|
||||||
|
: (_) == 'Y' ? 24 \
|
||||||
|
: (_) == 'Z' ? 25 \
|
||||||
|
: (_) == '2' ? 26 \
|
||||||
|
: (_) == '3' ? 27 \
|
||||||
|
: (_) == '4' ? 28 \
|
||||||
|
: (_) == '5' ? 29 \
|
||||||
|
: (_) == '6' ? 30 \
|
||||||
|
: (_) == '7' ? 31 \
|
||||||
|
: -1)
|
||||||
|
|
||||||
|
static const signed char b32[0x100] = {
|
||||||
|
B32 (0), B32 (1), B32 (2), B32 (3),
|
||||||
|
B32 (4), B32 (5), B32 (6), B32 (7),
|
||||||
|
B32 (8), B32 (9), B32 (10), B32 (11),
|
||||||
|
B32 (12), B32 (13), B32 (14), B32 (15),
|
||||||
|
B32 (16), B32 (17), B32 (18), B32 (19),
|
||||||
|
B32 (20), B32 (21), B32 (22), B32 (23),
|
||||||
|
B32 (24), B32 (25), B32 (26), B32 (27),
|
||||||
|
B32 (28), B32 (29), B32 (30), B32 (31),
|
||||||
|
B32 (32), B32 (33), B32 (34), B32 (35),
|
||||||
|
B32 (36), B32 (37), B32 (38), B32 (39),
|
||||||
|
B32 (40), B32 (41), B32 (42), B32 (43),
|
||||||
|
B32 (44), B32 (45), B32 (46), B32 (47),
|
||||||
|
B32 (48), B32 (49), B32 (50), B32 (51),
|
||||||
|
B32 (52), B32 (53), B32 (54), B32 (55),
|
||||||
|
B32 (56), B32 (57), B32 (58), B32 (59),
|
||||||
|
B32 (60), B32 (61), B32 (62), B32 (63),
|
||||||
|
B32 (32), B32 (65), B32 (66), B32 (67),
|
||||||
|
B32 (68), B32 (69), B32 (70), B32 (71),
|
||||||
|
B32 (72), B32 (73), B32 (74), B32 (75),
|
||||||
|
B32 (76), B32 (77), B32 (78), B32 (79),
|
||||||
|
B32 (80), B32 (81), B32 (82), B32 (83),
|
||||||
|
B32 (84), B32 (85), B32 (86), B32 (87),
|
||||||
|
B32 (88), B32 (89), B32 (90), B32 (91),
|
||||||
|
B32 (92), B32 (93), B32 (94), B32 (95),
|
||||||
|
B32 (96), B32 (97), B32 (98), B32 (99),
|
||||||
|
B32 (100), B32 (101), B32 (102), B32 (103),
|
||||||
|
B32 (104), B32 (105), B32 (106), B32 (107),
|
||||||
|
B32 (108), B32 (109), B32 (110), B32 (111),
|
||||||
|
B32 (112), B32 (113), B32 (114), B32 (115),
|
||||||
|
B32 (116), B32 (117), B32 (118), B32 (119),
|
||||||
|
B32 (120), B32 (121), B32 (122), B32 (123),
|
||||||
|
B32 (124), B32 (125), B32 (126), B32 (127),
|
||||||
|
B32 (128), B32 (129), B32 (130), B32 (131),
|
||||||
|
B32 (132), B32 (133), B32 (134), B32 (135),
|
||||||
|
B32 (136), B32 (137), B32 (138), B32 (139),
|
||||||
|
B32 (140), B32 (141), B32 (142), B32 (143),
|
||||||
|
B32 (144), B32 (145), B32 (146), B32 (147),
|
||||||
|
B32 (148), B32 (149), B32 (150), B32 (151),
|
||||||
|
B32 (152), B32 (153), B32 (154), B32 (155),
|
||||||
|
B32 (156), B32 (157), B32 (158), B32 (159),
|
||||||
|
B32 (160), B32 (161), B32 (162), B32 (163),
|
||||||
|
B32 (132), B32 (165), B32 (166), B32 (167),
|
||||||
|
B32 (168), B32 (169), B32 (170), B32 (171),
|
||||||
|
B32 (172), B32 (173), B32 (174), B32 (175),
|
||||||
|
B32 (176), B32 (177), B32 (178), B32 (179),
|
||||||
|
B32 (180), B32 (181), B32 (182), B32 (183),
|
||||||
|
B32 (184), B32 (185), B32 (186), B32 (187),
|
||||||
|
B32 (188), B32 (189), B32 (190), B32 (191),
|
||||||
|
B32 (192), B32 (193), B32 (194), B32 (195),
|
||||||
|
B32 (196), B32 (197), B32 (198), B32 (199),
|
||||||
|
B32 (200), B32 (201), B32 (202), B32 (203),
|
||||||
|
B32 (204), B32 (205), B32 (206), B32 (207),
|
||||||
|
B32 (208), B32 (209), B32 (210), B32 (211),
|
||||||
|
B32 (212), B32 (213), B32 (214), B32 (215),
|
||||||
|
B32 (216), B32 (217), B32 (218), B32 (219),
|
||||||
|
B32 (220), B32 (221), B32 (222), B32 (223),
|
||||||
|
B32 (224), B32 (225), B32 (226), B32 (227),
|
||||||
|
B32 (228), B32 (229), B32 (230), B32 (231),
|
||||||
|
B32 (232), B32 (233), B32 (234), B32 (235),
|
||||||
|
B32 (236), B32 (237), B32 (238), B32 (239),
|
||||||
|
B32 (240), B32 (241), B32 (242), B32 (243),
|
||||||
|
B32 (244), B32 (245), B32 (246), B32 (247),
|
||||||
|
B32 (248), B32 (249), B32 (250), B32 (251),
|
||||||
|
B32 (252), B32 (253), B32 (254), B32 (255)
|
||||||
|
};
|
||||||
|
|
||||||
|
#if UCHAR_MAX == 255
|
||||||
|
# define uchar_in_range(c) true
|
||||||
|
#else
|
||||||
|
# define uchar_in_range(c) ((c) <= 255)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Return true if CH is a character from the Base32 alphabet, and
|
||||||
|
false otherwise. Note that '=' is padding and not considered to be
|
||||||
|
part of the alphabet. */
|
||||||
|
bool
|
||||||
|
isbase32 (char ch)
|
||||||
|
{
|
||||||
|
return uchar_in_range (to_uchar (ch)) && 0 <= b32[to_uchar (ch)];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize decode-context buffer, CTX. */
|
||||||
|
void
|
||||||
|
base32_decode_ctx_init (struct base32_decode_context *ctx)
|
||||||
|
{
|
||||||
|
ctx->i = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If CTX->i is 0 or 8, there are eight or more bytes in [*IN..IN_END), and
|
||||||
|
none of those eight is a newline, then return *IN. Otherwise, copy up to
|
||||||
|
4 - CTX->i non-newline bytes from that range into CTX->buf, starting at
|
||||||
|
index CTX->i and setting CTX->i to reflect the number of bytes copied,
|
||||||
|
and return CTX->buf. In either case, advance *IN to point to the byte
|
||||||
|
after the last one processed, and set *N_NON_NEWLINE to the number of
|
||||||
|
verified non-newline bytes accessible through the returned pointer. */
|
||||||
|
static char *
|
||||||
|
get_8 (struct base32_decode_context *ctx,
|
||||||
|
char const *restrict *in, char const *restrict in_end,
|
||||||
|
size_t *n_non_newline)
|
||||||
|
{
|
||||||
|
if (ctx->i == 8)
|
||||||
|
ctx->i = 0;
|
||||||
|
|
||||||
|
if (ctx->i == 0)
|
||||||
|
{
|
||||||
|
char const *t = *in;
|
||||||
|
if (8 <= in_end - *in && memchr (t, '\n', 8) == NULL)
|
||||||
|
{
|
||||||
|
/* This is the common case: no newline. */
|
||||||
|
*in += 8;
|
||||||
|
*n_non_newline = 8;
|
||||||
|
return (char *) t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
/* Copy non-newline bytes into BUF. */
|
||||||
|
char const *p = *in;
|
||||||
|
while (p < in_end)
|
||||||
|
{
|
||||||
|
char c = *p++;
|
||||||
|
if (c != '\n')
|
||||||
|
{
|
||||||
|
ctx->buf[ctx->i++] = c;
|
||||||
|
if (ctx->i == 8)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*in = p;
|
||||||
|
*n_non_newline = ctx->i;
|
||||||
|
return ctx->buf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define return_false \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
*outp = out; \
|
||||||
|
return false; \
|
||||||
|
} \
|
||||||
|
while (false)
|
||||||
|
|
||||||
|
/* Decode eight bytes of base32-encoded data, IN, of length INLEN
|
||||||
|
into the output buffer, *OUT, of size *OUTLEN bytes. Return true if
|
||||||
|
decoding is successful, false otherwise. If *OUTLEN is too small,
|
||||||
|
as many bytes as possible are written to *OUT. On return, advance
|
||||||
|
*OUT to point to the byte after the last one written, and decrement
|
||||||
|
*OUTLEN to reflect the number of bytes remaining in *OUT. */
|
||||||
|
static bool
|
||||||
|
decode_8 (char const *restrict in, size_t inlen,
|
||||||
|
char *restrict *outp, size_t *outleft)
|
||||||
|
{
|
||||||
|
char *out = *outp;
|
||||||
|
if (inlen < 8)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!isbase32 (in[0]) || !isbase32 (in[1]) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (*outleft)
|
||||||
|
{
|
||||||
|
*out++ = ((b32[to_uchar (in[0])] << 3)
|
||||||
|
| (b32[to_uchar (in[1])] >> 2));
|
||||||
|
--*outleft;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in[2] == '=')
|
||||||
|
{
|
||||||
|
if (in[3] != '=' || in[4] != '=' || in[5] != '='
|
||||||
|
|| in[6] != '=' || in[7] != '=')
|
||||||
|
return_false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!isbase32 (in[2]) || !isbase32 (in[3]))
|
||||||
|
return_false;
|
||||||
|
|
||||||
|
if (*outleft)
|
||||||
|
{
|
||||||
|
*out++ = ((b32[to_uchar (in[1])] << 6)
|
||||||
|
| (b32[to_uchar (in[2])] << 1)
|
||||||
|
| (b32[to_uchar (in[3])] >> 4));
|
||||||
|
--*outleft;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in[4] == '=')
|
||||||
|
{
|
||||||
|
if (in[5] != '=' || in[6] != '=' || in[7] != '=')
|
||||||
|
return_false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!isbase32 (in[4]))
|
||||||
|
return_false;
|
||||||
|
|
||||||
|
if (*outleft)
|
||||||
|
{
|
||||||
|
*out++ = ((b32[to_uchar (in[3])] << 4)
|
||||||
|
| (b32[to_uchar (in[4])] >> 1));
|
||||||
|
--*outleft;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in[5] == '=')
|
||||||
|
{
|
||||||
|
if (in[6] != '=' || in[7] != '=')
|
||||||
|
return_false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!isbase32 (in[5]) || !isbase32 (in[6]))
|
||||||
|
return_false;
|
||||||
|
|
||||||
|
if (*outleft)
|
||||||
|
{
|
||||||
|
*out++ = ((b32[to_uchar (in[4])] << 7)
|
||||||
|
| (b32[to_uchar (in[5])] << 2)
|
||||||
|
| (b32[to_uchar (in[6])] >> 3));
|
||||||
|
--*outleft;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in[7] != '=')
|
||||||
|
{
|
||||||
|
if (!isbase32 (in[7]))
|
||||||
|
return_false;
|
||||||
|
|
||||||
|
if (*outleft)
|
||||||
|
{
|
||||||
|
*out++ = ((b32[to_uchar (in[6])] << 5)
|
||||||
|
| (b32[to_uchar (in[7])]));
|
||||||
|
--*outleft;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*outp = out;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decode base32-encoded input array IN of length INLEN to output array
|
||||||
|
OUT that can hold *OUTLEN bytes. The input data may be interspersed
|
||||||
|
with newlines. Return true if decoding was successful, i.e. if the
|
||||||
|
input was valid base32 data, false otherwise. If *OUTLEN is too
|
||||||
|
small, as many bytes as possible will be written to OUT. On return,
|
||||||
|
*OUTLEN holds the length of decoded bytes in OUT. Note that as soon
|
||||||
|
as any non-alphabet, non-newline character is encountered, decoding
|
||||||
|
is stopped and false is returned. If INLEN is zero, then process
|
||||||
|
only whatever data is stored in CTX.
|
||||||
|
|
||||||
|
Initially, CTX must have been initialized via base32_decode_ctx_init.
|
||||||
|
Subsequent calls to this function must reuse whatever state is recorded
|
||||||
|
in that buffer. It is necessary for when a octuple of base32 input
|
||||||
|
bytes spans two input buffers.
|
||||||
|
|
||||||
|
If CTX is NULL then newlines are treated as garbage and the input
|
||||||
|
buffer is processed as a unit. */
|
||||||
|
|
||||||
|
bool
|
||||||
|
base32_decode_ctx (struct base32_decode_context *ctx,
|
||||||
|
const char *restrict in, size_t inlen,
|
||||||
|
char *restrict out, size_t *outlen)
|
||||||
|
{
|
||||||
|
size_t outleft = *outlen;
|
||||||
|
bool ignore_newlines = ctx != NULL;
|
||||||
|
bool flush_ctx = false;
|
||||||
|
unsigned int ctx_i = 0;
|
||||||
|
|
||||||
|
if (ignore_newlines)
|
||||||
|
{
|
||||||
|
ctx_i = ctx->i;
|
||||||
|
flush_ctx = inlen == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
size_t outleft_save = outleft;
|
||||||
|
if (ctx_i == 0 && !flush_ctx)
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
/* Save a copy of outleft, in case we need to re-parse this
|
||||||
|
block of four bytes. */
|
||||||
|
outleft_save = outleft;
|
||||||
|
if (!decode_8 (in, inlen, &out, &outleft))
|
||||||
|
break;
|
||||||
|
|
||||||
|
in += 8;
|
||||||
|
inlen -= 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inlen == 0 && !flush_ctx)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Handle the common case of 72-byte wrapped lines.
|
||||||
|
This also handles any other multiple-of-8-byte wrapping. */
|
||||||
|
if (inlen && *in == '\n' && ignore_newlines)
|
||||||
|
{
|
||||||
|
++in;
|
||||||
|
--inlen;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restore OUT and OUTLEFT. */
|
||||||
|
out -= outleft_save - outleft;
|
||||||
|
outleft = outleft_save;
|
||||||
|
|
||||||
|
{
|
||||||
|
char const *in_end = in + inlen;
|
||||||
|
char const *non_nl;
|
||||||
|
|
||||||
|
if (ignore_newlines)
|
||||||
|
non_nl = get_8 (ctx, &in, in_end, &inlen);
|
||||||
|
else
|
||||||
|
non_nl = in; /* Might have nl in this case. */
|
||||||
|
|
||||||
|
/* If the input is empty or consists solely of newlines (0 non-newlines),
|
||||||
|
then we're done. Likewise if there are fewer than 8 bytes when not
|
||||||
|
flushing context and not treating newlines as garbage. */
|
||||||
|
if (inlen == 0 || (inlen < 8 && !flush_ctx && ignore_newlines))
|
||||||
|
{
|
||||||
|
inlen = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!decode_8 (non_nl, inlen, &out, &outleft))
|
||||||
|
break;
|
||||||
|
|
||||||
|
inlen = in_end - in;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*outlen -= outleft;
|
||||||
|
|
||||||
|
return inlen == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate an output buffer in *OUT, and decode the base32 encoded
|
||||||
|
data stored in IN of size INLEN to the *OUT buffer. On return, the
|
||||||
|
size of the decoded data is stored in *OUTLEN. OUTLEN may be NULL,
|
||||||
|
if the caller is not interested in the decoded length. *OUT may be
|
||||||
|
NULL to indicate an out of memory error, in which case *OUTLEN
|
||||||
|
contains the size of the memory block needed. The function returns
|
||||||
|
true on successful decoding and memory allocation errors. (Use the
|
||||||
|
*OUT and *OUTLEN parameters to differentiate between successful
|
||||||
|
decoding and memory error.) The function returns false if the
|
||||||
|
input was invalid, in which case *OUT is NULL and *OUTLEN is
|
||||||
|
undefined. */
|
||||||
|
bool
|
||||||
|
base32_decode_alloc_ctx (struct base32_decode_context *ctx,
|
||||||
|
const char *in, size_t inlen, char **out,
|
||||||
|
size_t *outlen)
|
||||||
|
{
|
||||||
|
/* This may allocate a few bytes too many, depending on input,
|
||||||
|
but it's not worth the extra CPU time to compute the exact size.
|
||||||
|
The exact size is 5 * inlen / 8, minus one or more bytes if the
|
||||||
|
input is padded with one or more "=".
|
||||||
|
Dividing before multiplying avoids the possibility of overflow. */
|
||||||
|
size_t needlen = 5 * (inlen / 8) + 5;
|
||||||
|
|
||||||
|
*out = malloc (needlen);
|
||||||
|
if (!*out)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (!base32_decode_ctx (ctx, in, inlen, *out, &needlen))
|
||||||
|
{
|
||||||
|
free (*out);
|
||||||
|
*out = NULL;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outlen)
|
||||||
|
*outlen = needlen;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
/* base32.h -- Encode binary data using printable characters.
|
||||||
|
Copyright (C) 2004-2006, 2009-2019 Free Software Foundation, Inc.
|
||||||
|
Adapted from Simon Josefsson's base64 code by Gijs van Tulder.
|
||||||
|
|
||||||
|
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 3, 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef BASE32_H
|
||||||
|
# define BASE32_H
|
||||||
|
|
||||||
|
/* Get size_t. */
|
||||||
|
# include <stddef.h>
|
||||||
|
|
||||||
|
/* Get bool. */
|
||||||
|
# include <stdbool.h>
|
||||||
|
|
||||||
|
/* This uses that the expression (n+(k-1))/k means the smallest
|
||||||
|
integer >= n/k, i.e., the ceiling of n/k. */
|
||||||
|
# define BASE32_LENGTH(inlen) ((((inlen) + 4) / 5) * 8)
|
||||||
|
|
||||||
|
struct base32_decode_context
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
char buf[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
extern bool isbase32 (char ch) _GL_ATTRIBUTE_CONST;
|
||||||
|
|
||||||
|
extern void base32_encode (const char *restrict in, size_t inlen,
|
||||||
|
char *restrict out, size_t outlen);
|
||||||
|
|
||||||
|
extern size_t base32_encode_alloc (const char *in, size_t inlen, char **out);
|
||||||
|
|
||||||
|
extern void base32_decode_ctx_init (struct base32_decode_context *ctx);
|
||||||
|
|
||||||
|
extern bool base32_decode_ctx (struct base32_decode_context *ctx,
|
||||||
|
const char *restrict in, size_t inlen,
|
||||||
|
char *restrict out, size_t *outlen);
|
||||||
|
|
||||||
|
extern bool base32_decode_alloc_ctx (struct base32_decode_context *ctx,
|
||||||
|
const char *in, size_t inlen,
|
||||||
|
char **out, size_t *outlen);
|
||||||
|
|
||||||
|
#define base32_decode(in, inlen, out, outlen) \
|
||||||
|
base32_decode_ctx (NULL, in, inlen, out, outlen)
|
||||||
|
|
||||||
|
#define base32_decode_alloc(in, inlen, out, outlen) \
|
||||||
|
base32_decode_alloc_ctx (NULL, in, inlen, out, outlen)
|
||||||
|
|
||||||
|
#endif /* BASE32_H */
|
|
@ -0,0 +1,75 @@
|
||||||
|
/* basename.c -- return the last element in a file name
|
||||||
|
|
||||||
|
Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2019 Free Software
|
||||||
|
Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "dirname.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* Return the address of the last file name component of NAME. If
|
||||||
|
NAME has no relative file name components because it is a file
|
||||||
|
system root, return the empty string. */
|
||||||
|
|
||||||
|
char *
|
||||||
|
last_component (char const *name)
|
||||||
|
{
|
||||||
|
char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
|
||||||
|
char const *p;
|
||||||
|
bool saw_slash = false;
|
||||||
|
|
||||||
|
while (ISSLASH (*base))
|
||||||
|
base++;
|
||||||
|
|
||||||
|
for (p = base; *p; p++)
|
||||||
|
{
|
||||||
|
if (ISSLASH (*p))
|
||||||
|
saw_slash = true;
|
||||||
|
else if (saw_slash)
|
||||||
|
{
|
||||||
|
base = p;
|
||||||
|
saw_slash = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (char *) base;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the length of the basename NAME. Typically NAME is the
|
||||||
|
value returned by base_name or last_component. Act like strlen
|
||||||
|
(NAME), except omit all trailing slashes. */
|
||||||
|
|
||||||
|
size_t
|
||||||
|
base_len (char const *name)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
|
||||||
|
|
||||||
|
for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1
|
||||||
|
&& ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2])
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len
|
||||||
|
&& len == prefix_len && ISSLASH (name[prefix_len]))
|
||||||
|
return prefix_len + 1;
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
/* basename.c -- return the last element in a file name
|
||||||
|
|
||||||
|
Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2019 Free Software
|
||||||
|
Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "dirname.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include "xalloc.h"
|
||||||
|
#include "xstrndup.h"
|
||||||
|
|
||||||
|
char *
|
||||||
|
base_name (char const *name)
|
||||||
|
{
|
||||||
|
char const *base = last_component (name);
|
||||||
|
size_t length;
|
||||||
|
|
||||||
|
/* If there is no last component, then name is a file system root or the
|
||||||
|
empty string. */
|
||||||
|
if (! *base)
|
||||||
|
return xstrndup (name, base_len (name));
|
||||||
|
|
||||||
|
/* Collapse a sequence of trailing slashes into one. */
|
||||||
|
length = base_len (base);
|
||||||
|
if (ISSLASH (base[length]))
|
||||||
|
length++;
|
||||||
|
|
||||||
|
/* On systems with drive letters, "a/b:c" must return "./b:c" rather
|
||||||
|
than "b:c" to avoid confusion with a drive letter. On systems
|
||||||
|
with pure POSIX semantics, this is not an issue. */
|
||||||
|
if (FILE_SYSTEM_PREFIX_LEN (base))
|
||||||
|
{
|
||||||
|
char *p = xmalloc (length + 3);
|
||||||
|
p[0] = '.';
|
||||||
|
p[1] = '/';
|
||||||
|
memcpy (p + 2, base, length);
|
||||||
|
p[length + 2] = '\0';
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finally, copy the basename. */
|
||||||
|
return xstrndup (base, length);
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/* Binary mode I/O.
|
||||||
|
Copyright 2017-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#define BINARY_IO_INLINE _GL_EXTERN_INLINE
|
||||||
|
#include "binary-io.h"
|
||||||
|
|
||||||
|
#if defined __DJGPP__ || defined __EMX__
|
||||||
|
# include <errno.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
__gl_setmode_check (int fd)
|
||||||
|
{
|
||||||
|
if (isatty (fd))
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,81 @@
|
||||||
|
/* Binary mode I/O.
|
||||||
|
Copyright (C) 2001, 2003, 2005, 2008-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _BINARY_H
|
||||||
|
#define _BINARY_H
|
||||||
|
|
||||||
|
/* For systems that distinguish between text and binary I/O.
|
||||||
|
O_BINARY is guaranteed by the gnulib <fcntl.h>. */
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
/* The MSVC7 <stdio.h> doesn't like to be included after '#define fileno ...',
|
||||||
|
so we include it here first. */
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifndef _GL_INLINE_HEADER_BEGIN
|
||||||
|
#error "Please include config.h first."
|
||||||
|
#endif
|
||||||
|
_GL_INLINE_HEADER_BEGIN
|
||||||
|
#ifndef BINARY_IO_INLINE
|
||||||
|
# define BINARY_IO_INLINE _GL_INLINE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if O_BINARY
|
||||||
|
# if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__
|
||||||
|
# include <io.h> /* declares setmode() */
|
||||||
|
# define __gl_setmode setmode
|
||||||
|
# else
|
||||||
|
# define __gl_setmode _setmode
|
||||||
|
# undef fileno
|
||||||
|
# define fileno _fileno
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
/* On reasonable systems, binary I/O is the only choice. */
|
||||||
|
/* Use a function rather than a macro, to avoid gcc warnings
|
||||||
|
"warning: statement with no effect". */
|
||||||
|
BINARY_IO_INLINE int
|
||||||
|
__gl_setmode (int fd _GL_UNUSED, int mode _GL_UNUSED)
|
||||||
|
{
|
||||||
|
return O_BINARY;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined __DJGPP__ || defined __EMX__
|
||||||
|
extern int __gl_setmode_check (int);
|
||||||
|
#else
|
||||||
|
BINARY_IO_INLINE int
|
||||||
|
__gl_setmode_check (int fd _GL_UNUSED) { return 0; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set FD's mode to MODE, which should be either O_TEXT or O_BINARY.
|
||||||
|
Return the old mode if successful, -1 (setting errno) on failure.
|
||||||
|
Ordinarily this function would be called 'setmode', since that is
|
||||||
|
its name on MS-Windows, but it is called 'set_binary_mode' here
|
||||||
|
to avoid colliding with a BSD function of another name. */
|
||||||
|
|
||||||
|
BINARY_IO_INLINE int
|
||||||
|
set_binary_mode (int fd, int mode)
|
||||||
|
{
|
||||||
|
int r = __gl_setmode_check (fd);
|
||||||
|
return r != 0 ? r : __gl_setmode (fd, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This macro is obsolescent. */
|
||||||
|
#define SET_BINARY(fd) ((void) set_binary_mode (fd, O_BINARY))
|
||||||
|
|
||||||
|
_GL_INLINE_HEADER_END
|
||||||
|
|
||||||
|
#endif /* _BINARY_H */
|
|
@ -0,0 +1,49 @@
|
||||||
|
/* bind.c --- wrappers for Windows bind function
|
||||||
|
|
||||||
|
Copyright (C) 2008-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Paolo Bonzini */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
/* Get winsock2.h. */
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
/* Get set_winsock_errno, FD_TO_SOCKET etc. */
|
||||||
|
#include "w32sock.h"
|
||||||
|
|
||||||
|
#undef bind
|
||||||
|
|
||||||
|
int
|
||||||
|
rpl_bind (int fd, const struct sockaddr *sockaddr, socklen_t len)
|
||||||
|
{
|
||||||
|
SOCKET sock = FD_TO_SOCKET (fd);
|
||||||
|
|
||||||
|
if (sock == INVALID_SOCKET)
|
||||||
|
{
|
||||||
|
errno = EBADF;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int r = bind (sock, sockaddr, len);
|
||||||
|
if (r < 0)
|
||||||
|
set_winsock_errno ();
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
/* Convert unibyte character to wide character.
|
||||||
|
Copyright (C) 2008, 2010-2019 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
wint_t
|
||||||
|
btowc (int c)
|
||||||
|
{
|
||||||
|
if (c != EOF)
|
||||||
|
{
|
||||||
|
char buf[1];
|
||||||
|
wchar_t wc;
|
||||||
|
|
||||||
|
buf[0] = c;
|
||||||
|
if (mbtowc (&wc, buf, 1) >= 0)
|
||||||
|
return wc;
|
||||||
|
}
|
||||||
|
return WEOF;
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
/* byteswap.h - Byte swapping
|
||||||
|
Copyright (C) 2005, 2007, 2009-2019 Free Software Foundation, Inc.
|
||||||
|
Written by Oskar Liljeblad <oskar@osk.mine.nu>, 2005.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _GL_BYTESWAP_H
|
||||||
|
#define _GL_BYTESWAP_H
|
||||||
|
|
||||||
|
/* Given an unsigned 16-bit argument X, return the value corresponding to
|
||||||
|
X with reversed byte order. */
|
||||||
|
#define bswap_16(x) ((((x) & 0x00FF) << 8) | \
|
||||||
|
(((x) & 0xFF00) >> 8))
|
||||||
|
|
||||||
|
/* Given an unsigned 32-bit argument X, return the value corresponding to
|
||||||
|
X with reversed byte order. */
|
||||||
|
#define bswap_32(x) ((((x) & 0x000000FF) << 24) | \
|
||||||
|
(((x) & 0x0000FF00) << 8) | \
|
||||||
|
(((x) & 0x00FF0000) >> 8) | \
|
||||||
|
(((x) & 0xFF000000) >> 24))
|
||||||
|
|
||||||
|
/* Given an unsigned 64-bit argument X, return the value corresponding to
|
||||||
|
X with reversed byte order. */
|
||||||
|
#define bswap_64(x) ((((x) & 0x00000000000000FFULL) << 56) | \
|
||||||
|
(((x) & 0x000000000000FF00ULL) << 40) | \
|
||||||
|
(((x) & 0x0000000000FF0000ULL) << 24) | \
|
||||||
|
(((x) & 0x00000000FF000000ULL) << 8) | \
|
||||||
|
(((x) & 0x000000FF00000000ULL) >> 8) | \
|
||||||
|
(((x) & 0x0000FF0000000000ULL) >> 24) | \
|
||||||
|
(((x) & 0x00FF000000000000ULL) >> 40) | \
|
||||||
|
(((x) & 0xFF00000000000000ULL) >> 56))
|
||||||
|
|
||||||
|
#endif /* _GL_BYTESWAP_H */
|
|
@ -0,0 +1,316 @@
|
||||||
|
/* C++ compatible function declaration macros.
|
||||||
|
Copyright (C) 2010-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _GL_CXXDEFS_H
|
||||||
|
#define _GL_CXXDEFS_H
|
||||||
|
|
||||||
|
/* Begin/end the GNULIB_NAMESPACE namespace. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
|
||||||
|
# define _GL_END_NAMESPACE }
|
||||||
|
#else
|
||||||
|
# define _GL_BEGIN_NAMESPACE
|
||||||
|
# define _GL_END_NAMESPACE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The three most frequent use cases of these macros are:
|
||||||
|
|
||||||
|
* For providing a substitute for a function that is missing on some
|
||||||
|
platforms, but is declared and works fine on the platforms on which
|
||||||
|
it exists:
|
||||||
|
|
||||||
|
#if @GNULIB_FOO@
|
||||||
|
# if !@HAVE_FOO@
|
||||||
|
_GL_FUNCDECL_SYS (foo, ...);
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (foo, ...);
|
||||||
|
_GL_CXXALIASWARN (foo);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
...
|
||||||
|
#endif
|
||||||
|
|
||||||
|
* For providing a replacement for a function that exists on all platforms,
|
||||||
|
but is broken/insufficient and needs to be replaced on some platforms:
|
||||||
|
|
||||||
|
#if @GNULIB_FOO@
|
||||||
|
# if @REPLACE_FOO@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef foo
|
||||||
|
# define foo rpl_foo
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (foo, ...);
|
||||||
|
_GL_CXXALIAS_RPL (foo, ...);
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (foo, ...);
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (foo);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
...
|
||||||
|
#endif
|
||||||
|
|
||||||
|
* For providing a replacement for a function that exists on some platforms
|
||||||
|
but is broken/insufficient and needs to be replaced on some of them and
|
||||||
|
is additionally either missing or undeclared on some other platforms:
|
||||||
|
|
||||||
|
#if @GNULIB_FOO@
|
||||||
|
# if @REPLACE_FOO@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef foo
|
||||||
|
# define foo rpl_foo
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (foo, ...);
|
||||||
|
_GL_CXXALIAS_RPL (foo, ...);
|
||||||
|
# else
|
||||||
|
# if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@
|
||||||
|
_GL_FUNCDECL_SYS (foo, ...);
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (foo, ...);
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (foo);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
...
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* _GL_EXTERN_C declaration;
|
||||||
|
performs the declaration with C linkage. */
|
||||||
|
#if defined __cplusplus
|
||||||
|
# define _GL_EXTERN_C extern "C"
|
||||||
|
#else
|
||||||
|
# define _GL_EXTERN_C extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
|
||||||
|
declares a replacement function, named rpl_func, with the given prototype,
|
||||||
|
consisting of return type, parameters, and attributes.
|
||||||
|
Example:
|
||||||
|
_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
*/
|
||||||
|
#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
|
||||||
|
#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_EXTERN_C rettype rpl_func parameters_and_attributes
|
||||||
|
|
||||||
|
/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
|
||||||
|
declares the system function, named func, with the given prototype,
|
||||||
|
consisting of return type, parameters, and attributes.
|
||||||
|
Example:
|
||||||
|
_GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
*/
|
||||||
|
#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_EXTERN_C rettype func parameters_and_attributes
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_RPL (func, rettype, parameters);
|
||||||
|
declares a C++ alias called GNULIB_NAMESPACE::func
|
||||||
|
that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
|
||||||
|
Example:
|
||||||
|
_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
|
||||||
|
|
||||||
|
Wrapping rpl_func in an object with an inline conversion operator
|
||||||
|
avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
|
||||||
|
actually used in the program. */
|
||||||
|
#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
|
||||||
|
_GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
static const struct _gl_ ## func ## _wrapper \
|
||||||
|
{ \
|
||||||
|
typedef rettype (*type) parameters; \
|
||||||
|
\
|
||||||
|
inline operator type () const \
|
||||||
|
{ \
|
||||||
|
return ::rpl_func; \
|
||||||
|
} \
|
||||||
|
} func = {}; \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
|
||||||
|
is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
|
||||||
|
except that the C function rpl_func may have a slightly different
|
||||||
|
declaration. A cast is used to silence the "invalid conversion" error
|
||||||
|
that would otherwise occur. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
static const struct _gl_ ## func ## _wrapper \
|
||||||
|
{ \
|
||||||
|
typedef rettype (*type) parameters; \
|
||||||
|
\
|
||||||
|
inline operator type () const \
|
||||||
|
{ \
|
||||||
|
return reinterpret_cast<type>(::rpl_func); \
|
||||||
|
} \
|
||||||
|
} func = {}; \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_SYS (func, rettype, parameters);
|
||||||
|
declares a C++ alias called GNULIB_NAMESPACE::func
|
||||||
|
that redirects to the system provided function func, if GNULIB_NAMESPACE
|
||||||
|
is defined.
|
||||||
|
Example:
|
||||||
|
_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
|
||||||
|
|
||||||
|
Wrapping func in an object with an inline conversion operator
|
||||||
|
avoids a reference to func unless GNULIB_NAMESPACE::func is
|
||||||
|
actually used in the program. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
static const struct _gl_ ## func ## _wrapper \
|
||||||
|
{ \
|
||||||
|
typedef rettype (*type) parameters; \
|
||||||
|
\
|
||||||
|
inline operator type () const \
|
||||||
|
{ \
|
||||||
|
return ::func; \
|
||||||
|
} \
|
||||||
|
} func = {}; \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
|
||||||
|
is like _GL_CXXALIAS_SYS (func, rettype, parameters);
|
||||||
|
except that the C function func may have a slightly different declaration.
|
||||||
|
A cast is used to silence the "invalid conversion" error that would
|
||||||
|
otherwise occur. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
static const struct _gl_ ## func ## _wrapper \
|
||||||
|
{ \
|
||||||
|
typedef rettype (*type) parameters; \
|
||||||
|
\
|
||||||
|
inline operator type () const \
|
||||||
|
{ \
|
||||||
|
return reinterpret_cast<type>(::func); \
|
||||||
|
} \
|
||||||
|
} func = {}; \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
|
||||||
|
is like _GL_CXXALIAS_SYS (func, rettype, parameters);
|
||||||
|
except that the C function is picked among a set of overloaded functions,
|
||||||
|
namely the one with rettype2 and parameters2. Two consecutive casts
|
||||||
|
are used to silence the "cannot find a match" and "invalid conversion"
|
||||||
|
errors that would otherwise occur. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
/* The outer cast must be a reinterpret_cast.
|
||||||
|
The inner cast: When the function is defined as a set of overloaded
|
||||||
|
functions, it works as a static_cast<>, choosing the designated variant.
|
||||||
|
When the function is defined as a single variant, it works as a
|
||||||
|
reinterpret_cast<>. The parenthesized cast syntax works both ways. */
|
||||||
|
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
static const struct _gl_ ## func ## _wrapper \
|
||||||
|
{ \
|
||||||
|
typedef rettype (*type) parameters; \
|
||||||
|
\
|
||||||
|
inline operator type () const \
|
||||||
|
{ \
|
||||||
|
return reinterpret_cast<type>((rettype2 (*) parameters2)(::func)); \
|
||||||
|
} \
|
||||||
|
} func = {}; \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIASWARN (func);
|
||||||
|
causes a warning to be emitted when ::func is used but not when
|
||||||
|
GNULIB_NAMESPACE::func is used. func must be defined without overloaded
|
||||||
|
variants. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIASWARN(func) \
|
||||||
|
_GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
|
||||||
|
# define _GL_CXXALIASWARN_1(func,namespace) \
|
||||||
|
_GL_CXXALIASWARN_2 (func, namespace)
|
||||||
|
/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||||
|
we enable the warning only when not optimizing. */
|
||||||
|
# if !__OPTIMIZE__
|
||||||
|
# define _GL_CXXALIASWARN_2(func,namespace) \
|
||||||
|
_GL_WARN_ON_USE (func, \
|
||||||
|
"The symbol ::" #func " refers to the system function. " \
|
||||||
|
"Use " #namespace "::" #func " instead.")
|
||||||
|
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||||
|
# define _GL_CXXALIASWARN_2(func,namespace) \
|
||||||
|
extern __typeof__ (func) func
|
||||||
|
# else
|
||||||
|
# define _GL_CXXALIASWARN_2(func,namespace) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIASWARN(func) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
|
||||||
|
causes a warning to be emitted when the given overloaded variant of ::func
|
||||||
|
is used but not when GNULIB_NAMESPACE::func is used. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
|
||||||
|
GNULIB_NAMESPACE)
|
||||||
|
# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
|
||||||
|
_GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
|
||||||
|
/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||||
|
we enable the warning only when not optimizing. */
|
||||||
|
# if !__OPTIMIZE__
|
||||||
|
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||||
|
_GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
|
||||||
|
"The symbol ::" #func " refers to the system function. " \
|
||||||
|
"Use " #namespace "::" #func " instead.")
|
||||||
|
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||||
|
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||||
|
extern __typeof__ (func) func
|
||||||
|
# else
|
||||||
|
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _GL_CXXDEFS_H */
|
|
@ -0,0 +1,3 @@
|
||||||
|
#include <config.h>
|
||||||
|
#define C_CTYPE_INLINE _GL_EXTERN_INLINE
|
||||||
|
#include "c-ctype.h"
|
|
@ -0,0 +1,366 @@
|
||||||
|
/* Character handling in C locale.
|
||||||
|
|
||||||
|
These functions work like the corresponding functions in <ctype.h>,
|
||||||
|
except that they have the C (POSIX) locale hardwired, whereas the
|
||||||
|
<ctype.h> functions' behaviour depends on the current locale set via
|
||||||
|
setlocale.
|
||||||
|
|
||||||
|
Copyright (C) 2000-2003, 2006, 2008-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef C_CTYPE_H
|
||||||
|
#define C_CTYPE_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#ifndef _GL_INLINE_HEADER_BEGIN
|
||||||
|
#error "Please include config.h first."
|
||||||
|
#endif
|
||||||
|
_GL_INLINE_HEADER_BEGIN
|
||||||
|
#ifndef C_CTYPE_INLINE
|
||||||
|
# define C_CTYPE_INLINE _GL_INLINE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* The functions defined in this file assume the "C" locale and a character
|
||||||
|
set without diacritics (ASCII-US or EBCDIC-US or something like that).
|
||||||
|
Even if the "C" locale on a particular system is an extension of the ASCII
|
||||||
|
character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it
|
||||||
|
is ISO-8859-1), the functions in this file recognize only the ASCII
|
||||||
|
characters. */
|
||||||
|
|
||||||
|
|
||||||
|
#if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
|
||||||
|
&& ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
|
||||||
|
&& (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
|
||||||
|
&& ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
|
||||||
|
&& ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
|
||||||
|
&& ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
|
||||||
|
&& ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
|
||||||
|
&& ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
|
||||||
|
&& ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
|
||||||
|
&& ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
|
||||||
|
&& ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
|
||||||
|
&& ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
|
||||||
|
&& ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
|
||||||
|
&& ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
|
||||||
|
&& ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
|
||||||
|
&& ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
|
||||||
|
&& ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
|
||||||
|
&& ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
|
||||||
|
&& ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
|
||||||
|
&& ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
|
||||||
|
&& ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
|
||||||
|
&& ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
|
||||||
|
&& ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)
|
||||||
|
/* The character set is ASCII or one of its variants or extensions, not EBCDIC.
|
||||||
|
Testing the value of '\n' and '\r' is not relevant. */
|
||||||
|
# define C_CTYPE_ASCII 1
|
||||||
|
#elif ! (' ' == '\x40' && '0' == '\xf0' \
|
||||||
|
&& 'A' == '\xc1' && 'J' == '\xd1' && 'S' == '\xe2' \
|
||||||
|
&& 'a' == '\x81' && 'j' == '\x91' && 's' == '\xa2')
|
||||||
|
# error "Only ASCII and EBCDIC are supported"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 'A' < 0
|
||||||
|
# error "EBCDIC and char is signed -- not supported"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Cases for control characters. */
|
||||||
|
|
||||||
|
#define _C_CTYPE_CNTRL \
|
||||||
|
case '\a': case '\b': case '\f': case '\n': \
|
||||||
|
case '\r': case '\t': case '\v': \
|
||||||
|
_C_CTYPE_OTHER_CNTRL
|
||||||
|
|
||||||
|
/* ASCII control characters other than those with \-letter escapes. */
|
||||||
|
|
||||||
|
#if C_CTYPE_ASCII
|
||||||
|
# define _C_CTYPE_OTHER_CNTRL \
|
||||||
|
case '\x00': case '\x01': case '\x02': case '\x03': \
|
||||||
|
case '\x04': case '\x05': case '\x06': case '\x0e': \
|
||||||
|
case '\x0f': case '\x10': case '\x11': case '\x12': \
|
||||||
|
case '\x13': case '\x14': case '\x15': case '\x16': \
|
||||||
|
case '\x17': case '\x18': case '\x19': case '\x1a': \
|
||||||
|
case '\x1b': case '\x1c': case '\x1d': case '\x1e': \
|
||||||
|
case '\x1f': case '\x7f'
|
||||||
|
#else
|
||||||
|
/* Use EBCDIC code page 1047's assignments for ASCII control chars;
|
||||||
|
assume all EBCDIC code pages agree about these assignments. */
|
||||||
|
# define _C_CTYPE_OTHER_CNTRL \
|
||||||
|
case '\x00': case '\x01': case '\x02': case '\x03': \
|
||||||
|
case '\x07': case '\x0e': case '\x0f': case '\x10': \
|
||||||
|
case '\x11': case '\x12': case '\x13': case '\x18': \
|
||||||
|
case '\x19': case '\x1c': case '\x1d': case '\x1e': \
|
||||||
|
case '\x1f': case '\x26': case '\x27': case '\x2d': \
|
||||||
|
case '\x2e': case '\x32': case '\x37': case '\x3c': \
|
||||||
|
case '\x3d': case '\x3f'
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Cases for lowercase hex letters, and lowercase letters, all offset by N. */
|
||||||
|
|
||||||
|
#define _C_CTYPE_LOWER_A_THRU_F_N(N) \
|
||||||
|
case 'a' + (N): case 'b' + (N): case 'c' + (N): case 'd' + (N): \
|
||||||
|
case 'e' + (N): case 'f' + (N)
|
||||||
|
#define _C_CTYPE_LOWER_N(N) \
|
||||||
|
_C_CTYPE_LOWER_A_THRU_F_N(N): \
|
||||||
|
case 'g' + (N): case 'h' + (N): case 'i' + (N): case 'j' + (N): \
|
||||||
|
case 'k' + (N): case 'l' + (N): case 'm' + (N): case 'n' + (N): \
|
||||||
|
case 'o' + (N): case 'p' + (N): case 'q' + (N): case 'r' + (N): \
|
||||||
|
case 's' + (N): case 't' + (N): case 'u' + (N): case 'v' + (N): \
|
||||||
|
case 'w' + (N): case 'x' + (N): case 'y' + (N): case 'z' + (N)
|
||||||
|
|
||||||
|
/* Cases for hex letters, digits, lower, punct, and upper. */
|
||||||
|
|
||||||
|
#define _C_CTYPE_A_THRU_F \
|
||||||
|
_C_CTYPE_LOWER_A_THRU_F_N (0): \
|
||||||
|
_C_CTYPE_LOWER_A_THRU_F_N ('A' - 'a')
|
||||||
|
#define _C_CTYPE_DIGIT \
|
||||||
|
case '0': case '1': case '2': case '3': \
|
||||||
|
case '4': case '5': case '6': case '7': \
|
||||||
|
case '8': case '9'
|
||||||
|
#define _C_CTYPE_LOWER _C_CTYPE_LOWER_N (0)
|
||||||
|
#define _C_CTYPE_PUNCT \
|
||||||
|
case '!': case '"': case '#': case '$': \
|
||||||
|
case '%': case '&': case '\'': case '(': \
|
||||||
|
case ')': case '*': case '+': case ',': \
|
||||||
|
case '-': case '.': case '/': case ':': \
|
||||||
|
case ';': case '<': case '=': case '>': \
|
||||||
|
case '?': case '@': case '[': case '\\': \
|
||||||
|
case ']': case '^': case '_': case '`': \
|
||||||
|
case '{': case '|': case '}': case '~'
|
||||||
|
#define _C_CTYPE_UPPER _C_CTYPE_LOWER_N ('A' - 'a')
|
||||||
|
|
||||||
|
|
||||||
|
/* Function definitions. */
|
||||||
|
|
||||||
|
/* Unlike the functions in <ctype.h>, which require an argument in the range
|
||||||
|
of the 'unsigned char' type, the functions here operate on values that are
|
||||||
|
in the 'unsigned char' range or in the 'char' range. In other words,
|
||||||
|
when you have a 'char' value, you need to cast it before using it as
|
||||||
|
argument to a <ctype.h> function:
|
||||||
|
|
||||||
|
const char *s = ...;
|
||||||
|
if (isalpha ((unsigned char) *s)) ...
|
||||||
|
|
||||||
|
but you don't need to cast it for the functions defined in this file:
|
||||||
|
|
||||||
|
const char *s = ...;
|
||||||
|
if (c_isalpha (*s)) ...
|
||||||
|
*/
|
||||||
|
|
||||||
|
C_CTYPE_INLINE bool
|
||||||
|
c_isalnum (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
_C_CTYPE_DIGIT:
|
||||||
|
_C_CTYPE_LOWER:
|
||||||
|
_C_CTYPE_UPPER:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
C_CTYPE_INLINE bool
|
||||||
|
c_isalpha (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
_C_CTYPE_LOWER:
|
||||||
|
_C_CTYPE_UPPER:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The function isascii is not locale dependent.
|
||||||
|
Its use in EBCDIC is questionable. */
|
||||||
|
C_CTYPE_INLINE bool
|
||||||
|
c_isascii (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case ' ':
|
||||||
|
_C_CTYPE_CNTRL:
|
||||||
|
_C_CTYPE_DIGIT:
|
||||||
|
_C_CTYPE_LOWER:
|
||||||
|
_C_CTYPE_PUNCT:
|
||||||
|
_C_CTYPE_UPPER:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
C_CTYPE_INLINE bool
|
||||||
|
c_isblank (int c)
|
||||||
|
{
|
||||||
|
return c == ' ' || c == '\t';
|
||||||
|
}
|
||||||
|
|
||||||
|
C_CTYPE_INLINE bool
|
||||||
|
c_iscntrl (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
_C_CTYPE_CNTRL:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
C_CTYPE_INLINE bool
|
||||||
|
c_isdigit (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
_C_CTYPE_DIGIT:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
C_CTYPE_INLINE bool
|
||||||
|
c_isgraph (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
_C_CTYPE_DIGIT:
|
||||||
|
_C_CTYPE_LOWER:
|
||||||
|
_C_CTYPE_PUNCT:
|
||||||
|
_C_CTYPE_UPPER:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
C_CTYPE_INLINE bool
|
||||||
|
c_islower (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
_C_CTYPE_LOWER:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
C_CTYPE_INLINE bool
|
||||||
|
c_isprint (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case ' ':
|
||||||
|
_C_CTYPE_DIGIT:
|
||||||
|
_C_CTYPE_LOWER:
|
||||||
|
_C_CTYPE_PUNCT:
|
||||||
|
_C_CTYPE_UPPER:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
C_CTYPE_INLINE bool
|
||||||
|
c_ispunct (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
_C_CTYPE_PUNCT:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
C_CTYPE_INLINE bool
|
||||||
|
c_isspace (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case ' ': case '\t': case '\n': case '\v': case '\f': case '\r':
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
C_CTYPE_INLINE bool
|
||||||
|
c_isupper (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
_C_CTYPE_UPPER:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
C_CTYPE_INLINE bool
|
||||||
|
c_isxdigit (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
_C_CTYPE_DIGIT:
|
||||||
|
_C_CTYPE_A_THRU_F:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
C_CTYPE_INLINE int
|
||||||
|
c_tolower (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
_C_CTYPE_UPPER:
|
||||||
|
return c - 'A' + 'a';
|
||||||
|
default:
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
C_CTYPE_INLINE int
|
||||||
|
c_toupper (int c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
_C_CTYPE_LOWER:
|
||||||
|
return c - 'a' + 'A';
|
||||||
|
default:
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_GL_INLINE_HEADER_END
|
||||||
|
|
||||||
|
#endif /* C_CTYPE_H */
|
|
@ -0,0 +1,56 @@
|
||||||
|
/* Case-insensitive string comparison functions in C locale.
|
||||||
|
Copyright (C) 1995-1996, 2001, 2003, 2005, 2009-2019 Free Software
|
||||||
|
Foundation, Inc.
|
||||||
|
|
||||||
|
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 3, 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef C_STRCASE_H
|
||||||
|
#define C_STRCASE_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* The functions defined in this file assume the "C" locale and a character
|
||||||
|
set without diacritics (ASCII-US or EBCDIC-US or something like that).
|
||||||
|
Even if the "C" locale on a particular system is an extension of the ASCII
|
||||||
|
character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it
|
||||||
|
is ISO-8859-1), the functions in this file recognize only the ASCII
|
||||||
|
characters. More precisely, one of the string arguments must be an ASCII
|
||||||
|
string; the other one can also contain non-ASCII characters (but then
|
||||||
|
the comparison result will be nonzero). */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
|
||||||
|
greater than zero if S1 is lexicographically less than, equal to or greater
|
||||||
|
than S2. */
|
||||||
|
extern int c_strcasecmp (const char *s1, const char *s2) _GL_ATTRIBUTE_PURE;
|
||||||
|
|
||||||
|
/* Compare no more than N characters of strings S1 and S2, ignoring case,
|
||||||
|
returning less than, equal to or greater than zero if S1 is
|
||||||
|
lexicographically less than, equal to or greater than S2. */
|
||||||
|
extern int c_strncasecmp (const char *s1, const char *s2, size_t n)
|
||||||
|
_GL_ATTRIBUTE_PURE;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* C_STRCASE_H */
|
|
@ -0,0 +1,56 @@
|
||||||
|
/* c-strcasecmp.c -- case insensitive string comparator in C locale
|
||||||
|
Copyright (C) 1998-1999, 2005-2006, 2009-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3, 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "c-strcase.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include "c-ctype.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
c_strcasecmp (const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
register const unsigned char *p1 = (const unsigned char *) s1;
|
||||||
|
register const unsigned char *p2 = (const unsigned char *) s2;
|
||||||
|
unsigned char c1, c2;
|
||||||
|
|
||||||
|
if (p1 == p2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
c1 = c_tolower (*p1);
|
||||||
|
c2 = c_tolower (*p2);
|
||||||
|
|
||||||
|
if (c1 == '\0')
|
||||||
|
break;
|
||||||
|
|
||||||
|
++p1;
|
||||||
|
++p2;
|
||||||
|
}
|
||||||
|
while (c1 == c2);
|
||||||
|
|
||||||
|
if (UCHAR_MAX <= INT_MAX)
|
||||||
|
return c1 - c2;
|
||||||
|
else
|
||||||
|
/* On machines where 'char' and 'int' are types of the same size, the
|
||||||
|
difference of two 'unsigned char' values - including the sign bit -
|
||||||
|
doesn't fit in an 'int'. */
|
||||||
|
return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
|
||||||
|
}
|
|
@ -0,0 +1,181 @@
|
||||||
|
/* Optimized case-insensitive string comparison in C locale.
|
||||||
|
Copyright (C) 2001-2002, 2007, 2009-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Bruno Haible <bruno@clisp.org>. */
|
||||||
|
|
||||||
|
#include "c-strcase.h"
|
||||||
|
#include "c-ctype.h"
|
||||||
|
|
||||||
|
/* STRCASEEQ allows to optimize string comparison with a small literal string.
|
||||||
|
STRCASEEQ (s, "UTF-8", 'U','T','F','-','8',0,0,0,0)
|
||||||
|
is semantically equivalent to
|
||||||
|
c_strcasecmp (s, "UTF-8") == 0
|
||||||
|
just faster. */
|
||||||
|
|
||||||
|
/* Help GCC to generate good code for string comparisons with
|
||||||
|
immediate strings. */
|
||||||
|
#if defined (__GNUC__) && defined (__OPTIMIZE__)
|
||||||
|
|
||||||
|
/* Case insensitive comparison of ASCII characters. */
|
||||||
|
# if C_CTYPE_ASCII
|
||||||
|
# define CASEEQ(other,upper) \
|
||||||
|
(c_isupper (upper) ? ((other) & ~0x20) == (upper) : (other) == (upper))
|
||||||
|
# else
|
||||||
|
# define CASEEQ(other,upper) \
|
||||||
|
(c_toupper (other) == (upper))
|
||||||
|
# endif
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
strcaseeq9 (const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
return c_strcasecmp (s1 + 9, s2 + 9) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
strcaseeq8 (const char *s1, const char *s2, char s28)
|
||||||
|
{
|
||||||
|
if (CASEEQ (s1[8], s28))
|
||||||
|
{
|
||||||
|
if (s28 == 0)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return strcaseeq9 (s1, s2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
strcaseeq7 (const char *s1, const char *s2, char s27, char s28)
|
||||||
|
{
|
||||||
|
if (CASEEQ (s1[7], s27))
|
||||||
|
{
|
||||||
|
if (s27 == 0)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return strcaseeq8 (s1, s2, s28);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
strcaseeq6 (const char *s1, const char *s2, char s26, char s27, char s28)
|
||||||
|
{
|
||||||
|
if (CASEEQ (s1[6], s26))
|
||||||
|
{
|
||||||
|
if (s26 == 0)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return strcaseeq7 (s1, s2, s27, s28);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
strcaseeq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
|
||||||
|
{
|
||||||
|
if (CASEEQ (s1[5], s25))
|
||||||
|
{
|
||||||
|
if (s25 == 0)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return strcaseeq6 (s1, s2, s26, s27, s28);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
strcaseeq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
|
||||||
|
{
|
||||||
|
if (CASEEQ (s1[4], s24))
|
||||||
|
{
|
||||||
|
if (s24 == 0)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return strcaseeq5 (s1, s2, s25, s26, s27, s28);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
strcaseeq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
|
||||||
|
{
|
||||||
|
if (CASEEQ (s1[3], s23))
|
||||||
|
{
|
||||||
|
if (s23 == 0)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return strcaseeq4 (s1, s2, s24, s25, s26, s27, s28);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
strcaseeq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
|
||||||
|
{
|
||||||
|
if (CASEEQ (s1[2], s22))
|
||||||
|
{
|
||||||
|
if (s22 == 0)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return strcaseeq3 (s1, s2, s23, s24, s25, s26, s27, s28);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
strcaseeq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
|
||||||
|
{
|
||||||
|
if (CASEEQ (s1[1], s21))
|
||||||
|
{
|
||||||
|
if (s21 == 0)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return strcaseeq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
strcaseeq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
|
||||||
|
{
|
||||||
|
if (CASEEQ (s1[0], s20))
|
||||||
|
{
|
||||||
|
if (s20 == 0)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return strcaseeq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
|
||||||
|
strcaseeq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
|
||||||
|
(c_strcasecmp (s1, s2) == 0)
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,77 @@
|
||||||
|
/* c-strcasestr.c -- case insensitive substring search in C locale
|
||||||
|
Copyright (C) 2005-2019 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2005.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "c-strcasestr.h"
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "c-ctype.h"
|
||||||
|
#include "c-strcase.h"
|
||||||
|
|
||||||
|
/* Two-Way algorithm. */
|
||||||
|
#define RETURN_TYPE char *
|
||||||
|
#define AVAILABLE(h, h_l, j, n_l) \
|
||||||
|
(!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \
|
||||||
|
&& ((h_l) = (j) + (n_l)))
|
||||||
|
#define CANON_ELEMENT c_tolower
|
||||||
|
#define CMP_FUNC(p1, p2, l) \
|
||||||
|
c_strncasecmp ((const char *) (p1), (const char *) (p2), l)
|
||||||
|
#include "str-two-way.h"
|
||||||
|
|
||||||
|
/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
|
||||||
|
comparison from the C locale, regardless of the current locale. */
|
||||||
|
char *
|
||||||
|
c_strcasestr (const char *haystack_start, const char *needle_start)
|
||||||
|
{
|
||||||
|
const char *haystack = haystack_start;
|
||||||
|
const char *needle = needle_start;
|
||||||
|
size_t needle_len; /* Length of NEEDLE. */
|
||||||
|
size_t haystack_len; /* Known minimum length of HAYSTACK. */
|
||||||
|
bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */
|
||||||
|
|
||||||
|
/* Determine length of NEEDLE, and in the process, make sure
|
||||||
|
HAYSTACK is at least as long (no point processing all of a long
|
||||||
|
NEEDLE if HAYSTACK is too short). */
|
||||||
|
while (*haystack && *needle)
|
||||||
|
ok &= (c_tolower ((unsigned char) *haystack++)
|
||||||
|
== c_tolower ((unsigned char) *needle++));
|
||||||
|
if (*needle)
|
||||||
|
return NULL;
|
||||||
|
if (ok)
|
||||||
|
return (char *) haystack_start;
|
||||||
|
needle_len = needle - needle_start;
|
||||||
|
haystack = haystack_start + 1;
|
||||||
|
haystack_len = needle_len - 1;
|
||||||
|
|
||||||
|
/* Perform the search. Abstract memory is considered to be an array
|
||||||
|
of 'unsigned char' values, not an array of 'char' values. See
|
||||||
|
ISO C 99 section 6.2.6.1. */
|
||||||
|
if (needle_len < LONG_NEEDLE_THRESHOLD)
|
||||||
|
return two_way_short_needle ((const unsigned char *) haystack,
|
||||||
|
haystack_len,
|
||||||
|
(const unsigned char *) needle_start,
|
||||||
|
needle_len);
|
||||||
|
return two_way_long_needle ((const unsigned char *) haystack, haystack_len,
|
||||||
|
(const unsigned char *) needle_start,
|
||||||
|
needle_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef LONG_NEEDLE_THRESHOLD
|
|
@ -0,0 +1,36 @@
|
||||||
|
/* Case-insensitive searching in a string in C locale.
|
||||||
|
Copyright (C) 2005, 2009-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef C_STRCASESTR_H
|
||||||
|
#define C_STRCASESTR_H
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
|
||||||
|
comparison. */
|
||||||
|
extern char *c_strcasestr (const char *haystack, const char *needle);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* C_STRCASESTR_H */
|
|
@ -0,0 +1,56 @@
|
||||||
|
/* c-strncasecmp.c -- case insensitive string comparator in C locale
|
||||||
|
Copyright (C) 1998-1999, 2005-2006, 2009-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3, 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "c-strcase.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include "c-ctype.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
c_strncasecmp (const char *s1, const char *s2, size_t n)
|
||||||
|
{
|
||||||
|
register const unsigned char *p1 = (const unsigned char *) s1;
|
||||||
|
register const unsigned char *p2 = (const unsigned char *) s2;
|
||||||
|
unsigned char c1, c2;
|
||||||
|
|
||||||
|
if (p1 == p2 || n == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
c1 = c_tolower (*p1);
|
||||||
|
c2 = c_tolower (*p2);
|
||||||
|
|
||||||
|
if (--n == 0 || c1 == '\0')
|
||||||
|
break;
|
||||||
|
|
||||||
|
++p1;
|
||||||
|
++p2;
|
||||||
|
}
|
||||||
|
while (c1 == c2);
|
||||||
|
|
||||||
|
if (UCHAR_MAX <= INT_MAX)
|
||||||
|
return c1 - c2;
|
||||||
|
else
|
||||||
|
/* On machines where 'char' and 'int' are types of the same size, the
|
||||||
|
difference of two 'unsigned char' values - including the sign bit -
|
||||||
|
doesn't fit in an 'int'. */
|
||||||
|
return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
|
||||||
|
}
|
|
@ -0,0 +1,514 @@
|
||||||
|
/* Copyright (C) 1992-2019 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library 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 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library 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 the GNU C Library; if not, see
|
||||||
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _SYS_CDEFS_H
|
||||||
|
#define _SYS_CDEFS_H 1
|
||||||
|
|
||||||
|
/* We are almost always included from features.h. */
|
||||||
|
#ifndef _FEATURES_H
|
||||||
|
# include <features.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The GNU libc does not support any K&R compilers or the traditional mode
|
||||||
|
of ISO C compilers anymore. Check for some of the combinations not
|
||||||
|
anymore supported. */
|
||||||
|
#if defined __GNUC__ && !defined __STDC__
|
||||||
|
# error "You need a ISO C conforming compiler to use the glibc headers"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Some user header file might have defined this before. */
|
||||||
|
#undef __P
|
||||||
|
#undef __PMT
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
|
||||||
|
/* All functions, except those with callbacks or those that
|
||||||
|
synchronize memory, are leaf functions. */
|
||||||
|
# if __GNUC_PREREQ (4, 6) && !defined _LIBC
|
||||||
|
# define __LEAF , __leaf__
|
||||||
|
# define __LEAF_ATTR __attribute__ ((__leaf__))
|
||||||
|
# else
|
||||||
|
# define __LEAF
|
||||||
|
# define __LEAF_ATTR
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* GCC can always grok prototypes. For C++ programs we add throw()
|
||||||
|
to help it optimize the function calls. But this works only with
|
||||||
|
gcc 2.8.x and egcs. For gcc 3.2 and up we even mark C functions
|
||||||
|
as non-throwing using a function attribute since programs can use
|
||||||
|
the -fexceptions options for C code as well. */
|
||||||
|
# if !defined __cplusplus && __GNUC_PREREQ (3, 3)
|
||||||
|
# define __THROW __attribute__ ((__nothrow__ __LEAF))
|
||||||
|
# define __THROWNL __attribute__ ((__nothrow__))
|
||||||
|
# define __NTH(fct) __attribute__ ((__nothrow__ __LEAF)) fct
|
||||||
|
# define __NTHNL(fct) __attribute__ ((__nothrow__)) fct
|
||||||
|
# else
|
||||||
|
# if defined __cplusplus && __GNUC_PREREQ (2,8)
|
||||||
|
# define __THROW throw ()
|
||||||
|
# define __THROWNL throw ()
|
||||||
|
# define __NTH(fct) __LEAF_ATTR fct throw ()
|
||||||
|
# define __NTHNL(fct) fct throw ()
|
||||||
|
# else
|
||||||
|
# define __THROW
|
||||||
|
# define __THROWNL
|
||||||
|
# define __NTH(fct) fct
|
||||||
|
# define __NTHNL(fct) fct
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else /* Not GCC. */
|
||||||
|
|
||||||
|
# if (defined __cplusplus \
|
||||||
|
|| (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L))
|
||||||
|
# define __inline inline
|
||||||
|
# else
|
||||||
|
# define __inline /* No inline functions. */
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# define __THROW
|
||||||
|
# define __THROWNL
|
||||||
|
# define __NTH(fct) fct
|
||||||
|
|
||||||
|
#endif /* GCC. */
|
||||||
|
|
||||||
|
/* Compilers that are not clang may object to
|
||||||
|
#if defined __clang__ && __has_extension(...)
|
||||||
|
even though they do not need to evaluate the right-hand side of the &&. */
|
||||||
|
#if defined __clang__ && defined __has_extension
|
||||||
|
# define __glibc_clang_has_extension(ext) __has_extension (ext)
|
||||||
|
#else
|
||||||
|
# define __glibc_clang_has_extension(ext) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* These two macros are not used in glibc anymore. They are kept here
|
||||||
|
only because some other projects expect the macros to be defined. */
|
||||||
|
#define __P(args) args
|
||||||
|
#define __PMT(args) args
|
||||||
|
|
||||||
|
/* For these things, GCC behaves the ANSI way normally,
|
||||||
|
and the non-ANSI way under -traditional. */
|
||||||
|
|
||||||
|
#define __CONCAT(x,y) x ## y
|
||||||
|
#define __STRING(x) #x
|
||||||
|
|
||||||
|
/* This is not a typedef so `const __ptr_t' does the right thing. */
|
||||||
|
#define __ptr_t void *
|
||||||
|
|
||||||
|
|
||||||
|
/* C++ needs to know that types and declarations are C, not C++. */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
# define __BEGIN_DECLS extern "C" {
|
||||||
|
# define __END_DECLS }
|
||||||
|
#else
|
||||||
|
# define __BEGIN_DECLS
|
||||||
|
# define __END_DECLS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Fortify support. */
|
||||||
|
#define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1)
|
||||||
|
#define __bos0(ptr) __builtin_object_size (ptr, 0)
|
||||||
|
|
||||||
|
#if __GNUC_PREREQ (4,3)
|
||||||
|
# define __warndecl(name, msg) \
|
||||||
|
extern void name (void) __attribute__((__warning__ (msg)))
|
||||||
|
# define __warnattr(msg) __attribute__((__warning__ (msg)))
|
||||||
|
# define __errordecl(name, msg) \
|
||||||
|
extern void name (void) __attribute__((__error__ (msg)))
|
||||||
|
#else
|
||||||
|
# define __warndecl(name, msg) extern void name (void)
|
||||||
|
# define __warnattr(msg)
|
||||||
|
# define __errordecl(name, msg) extern void name (void)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Support for flexible arrays.
|
||||||
|
Headers that should use flexible arrays only if they're "real"
|
||||||
|
(e.g. only if they won't affect sizeof()) should test
|
||||||
|
#if __glibc_c99_flexarr_available. */
|
||||||
|
#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L && !defined __HP_cc
|
||||||
|
# define __flexarr []
|
||||||
|
# define __glibc_c99_flexarr_available 1
|
||||||
|
#elif __GNUC_PREREQ (2,97)
|
||||||
|
/* GCC 2.97 supports C99 flexible array members as an extension,
|
||||||
|
even when in C89 mode or compiling C++ (any version). */
|
||||||
|
# define __flexarr []
|
||||||
|
# define __glibc_c99_flexarr_available 1
|
||||||
|
#elif defined __GNUC__
|
||||||
|
/* Pre-2.97 GCC did not support C99 flexible arrays but did have
|
||||||
|
an equivalent extension with slightly different notation. */
|
||||||
|
# define __flexarr [0]
|
||||||
|
# define __glibc_c99_flexarr_available 1
|
||||||
|
#else
|
||||||
|
/* Some other non-C99 compiler. Approximate with [1]. */
|
||||||
|
# define __flexarr [1]
|
||||||
|
# define __glibc_c99_flexarr_available 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* __asm__ ("xyz") is used throughout the headers to rename functions
|
||||||
|
at the assembly language level. This is wrapped by the __REDIRECT
|
||||||
|
macro, in order to support compilers that can do this some other
|
||||||
|
way. When compilers don't support asm-names at all, we have to do
|
||||||
|
preprocessor tricks instead (which don't have exactly the right
|
||||||
|
semantics, but it's the best we can do).
|
||||||
|
|
||||||
|
Example:
|
||||||
|
int __REDIRECT(setpgrp, (__pid_t pid, __pid_t pgrp), setpgid); */
|
||||||
|
|
||||||
|
#if defined __GNUC__ && __GNUC__ >= 2
|
||||||
|
|
||||||
|
# define __REDIRECT(name, proto, alias) name proto __asm__ (__ASMNAME (#alias))
|
||||||
|
# ifdef __cplusplus
|
||||||
|
# define __REDIRECT_NTH(name, proto, alias) \
|
||||||
|
name proto __THROW __asm__ (__ASMNAME (#alias))
|
||||||
|
# define __REDIRECT_NTHNL(name, proto, alias) \
|
||||||
|
name proto __THROWNL __asm__ (__ASMNAME (#alias))
|
||||||
|
# else
|
||||||
|
# define __REDIRECT_NTH(name, proto, alias) \
|
||||||
|
name proto __asm__ (__ASMNAME (#alias)) __THROW
|
||||||
|
# define __REDIRECT_NTHNL(name, proto, alias) \
|
||||||
|
name proto __asm__ (__ASMNAME (#alias)) __THROWNL
|
||||||
|
# endif
|
||||||
|
# define __ASMNAME(cname) __ASMNAME2 (__USER_LABEL_PREFIX__, cname)
|
||||||
|
# define __ASMNAME2(prefix, cname) __STRING (prefix) cname
|
||||||
|
|
||||||
|
/*
|
||||||
|
#elif __SOME_OTHER_COMPILER__
|
||||||
|
|
||||||
|
# define __REDIRECT(name, proto, alias) name proto; \
|
||||||
|
_Pragma("let " #name " = " #alias)
|
||||||
|
*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* GCC has various useful declarations that can be made with the
|
||||||
|
`__attribute__' syntax. All of the ways we use this do fine if
|
||||||
|
they are omitted for compilers that don't understand it. */
|
||||||
|
#if !defined __GNUC__ || __GNUC__ < 2
|
||||||
|
# define __attribute__(xyz) /* Ignore */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* At some point during the gcc 2.96 development the `malloc' attribute
|
||||||
|
for functions was introduced. We don't want to use it unconditionally
|
||||||
|
(although this would be possible) since it generates warnings. */
|
||||||
|
#if __GNUC_PREREQ (2,96)
|
||||||
|
# define __attribute_malloc__ __attribute__ ((__malloc__))
|
||||||
|
#else
|
||||||
|
# define __attribute_malloc__ /* Ignore */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Tell the compiler which arguments to an allocation function
|
||||||
|
indicate the size of the allocation. */
|
||||||
|
#if __GNUC_PREREQ (4, 3)
|
||||||
|
# define __attribute_alloc_size__(params) \
|
||||||
|
__attribute__ ((__alloc_size__ params))
|
||||||
|
#else
|
||||||
|
# define __attribute_alloc_size__(params) /* Ignore. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* At some point during the gcc 2.96 development the `pure' attribute
|
||||||
|
for functions was introduced. We don't want to use it unconditionally
|
||||||
|
(although this would be possible) since it generates warnings. */
|
||||||
|
#if __GNUC_PREREQ (2,96)
|
||||||
|
# define __attribute_pure__ __attribute__ ((__pure__))
|
||||||
|
#else
|
||||||
|
# define __attribute_pure__ /* Ignore */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This declaration tells the compiler that the value is constant. */
|
||||||
|
#if __GNUC_PREREQ (2,5)
|
||||||
|
# define __attribute_const__ __attribute__ ((__const__))
|
||||||
|
#else
|
||||||
|
# define __attribute_const__ /* Ignore */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* At some point during the gcc 3.1 development the `used' attribute
|
||||||
|
for functions was introduced. We don't want to use it unconditionally
|
||||||
|
(although this would be possible) since it generates warnings. */
|
||||||
|
#if __GNUC_PREREQ (3,1)
|
||||||
|
# define __attribute_used__ __attribute__ ((__used__))
|
||||||
|
# define __attribute_noinline__ __attribute__ ((__noinline__))
|
||||||
|
#else
|
||||||
|
# define __attribute_used__ __attribute__ ((__unused__))
|
||||||
|
# define __attribute_noinline__ /* Ignore */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Since version 3.2, gcc allows marking deprecated functions. */
|
||||||
|
#if __GNUC_PREREQ (3,2)
|
||||||
|
# define __attribute_deprecated__ __attribute__ ((__deprecated__))
|
||||||
|
#else
|
||||||
|
# define __attribute_deprecated__ /* Ignore */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Since version 4.5, gcc also allows one to specify the message printed
|
||||||
|
when a deprecated function is used. clang claims to be gcc 4.2, but
|
||||||
|
may also support this feature. */
|
||||||
|
#if __GNUC_PREREQ (4,5) || \
|
||||||
|
__glibc_clang_has_extension (__attribute_deprecated_with_message__)
|
||||||
|
# define __attribute_deprecated_msg__(msg) \
|
||||||
|
__attribute__ ((__deprecated__ (msg)))
|
||||||
|
#else
|
||||||
|
# define __attribute_deprecated_msg__(msg) __attribute_deprecated__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* At some point during the gcc 2.8 development the `format_arg' attribute
|
||||||
|
for functions was introduced. We don't want to use it unconditionally
|
||||||
|
(although this would be possible) since it generates warnings.
|
||||||
|
If several `format_arg' attributes are given for the same function, in
|
||||||
|
gcc-3.0 and older, all but the last one are ignored. In newer gccs,
|
||||||
|
all designated arguments are considered. */
|
||||||
|
#if __GNUC_PREREQ (2,8)
|
||||||
|
# define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x)))
|
||||||
|
#else
|
||||||
|
# define __attribute_format_arg__(x) /* Ignore */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* At some point during the gcc 2.97 development the `strfmon' format
|
||||||
|
attribute for functions was introduced. We don't want to use it
|
||||||
|
unconditionally (although this would be possible) since it
|
||||||
|
generates warnings. */
|
||||||
|
#if __GNUC_PREREQ (2,97)
|
||||||
|
# define __attribute_format_strfmon__(a,b) \
|
||||||
|
__attribute__ ((__format__ (__strfmon__, a, b)))
|
||||||
|
#else
|
||||||
|
# define __attribute_format_strfmon__(a,b) /* Ignore */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The nonnull function attribute marks pointer parameters that
|
||||||
|
must not be NULL. Do not define __nonnull if it is already defined,
|
||||||
|
for portability when this file is used in Gnulib. */
|
||||||
|
#ifndef __nonnull
|
||||||
|
# if __GNUC_PREREQ (3,3)
|
||||||
|
# define __nonnull(params) __attribute__ ((__nonnull__ params))
|
||||||
|
# else
|
||||||
|
# define __nonnull(params)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If fortification mode, we warn about unused results of certain
|
||||||
|
function calls which can lead to problems. */
|
||||||
|
#if __GNUC_PREREQ (3,4)
|
||||||
|
# define __attribute_warn_unused_result__ \
|
||||||
|
__attribute__ ((__warn_unused_result__))
|
||||||
|
# if defined __USE_FORTIFY_LEVEL && __USE_FORTIFY_LEVEL > 0
|
||||||
|
# define __wur __attribute_warn_unused_result__
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define __attribute_warn_unused_result__ /* empty */
|
||||||
|
#endif
|
||||||
|
#ifndef __wur
|
||||||
|
# define __wur /* Ignore */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Forces a function to be always inlined. */
|
||||||
|
#if __GNUC_PREREQ (3,2)
|
||||||
|
/* The Linux kernel defines __always_inline in stddef.h (283d7573), and
|
||||||
|
it conflicts with this definition. Therefore undefine it first to
|
||||||
|
allow either header to be included first. */
|
||||||
|
# undef __always_inline
|
||||||
|
# define __always_inline __inline __attribute__ ((__always_inline__))
|
||||||
|
#else
|
||||||
|
# undef __always_inline
|
||||||
|
# define __always_inline __inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Associate error messages with the source location of the call site rather
|
||||||
|
than with the source location inside the function. */
|
||||||
|
#if __GNUC_PREREQ (4,3)
|
||||||
|
# define __attribute_artificial__ __attribute__ ((__artificial__))
|
||||||
|
#else
|
||||||
|
# define __attribute_artificial__ /* Ignore */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
|
||||||
|
inline semantics, unless -fgnu89-inline is used. Using __GNUC_STDC_INLINE__
|
||||||
|
or __GNUC_GNU_INLINE is not a good enough check for gcc because gcc versions
|
||||||
|
older than 4.3 may define these macros and still not guarantee GNU inlining
|
||||||
|
semantics.
|
||||||
|
|
||||||
|
clang++ identifies itself as gcc-4.2, but has support for GNU inlining
|
||||||
|
semantics, that can be checked for by using the __GNUC_STDC_INLINE_ and
|
||||||
|
__GNUC_GNU_INLINE__ macro definitions. */
|
||||||
|
#if (!defined __cplusplus || __GNUC_PREREQ (4,3) \
|
||||||
|
|| (defined __clang__ && (defined __GNUC_STDC_INLINE__ \
|
||||||
|
|| defined __GNUC_GNU_INLINE__)))
|
||||||
|
# if defined __GNUC_STDC_INLINE__ || defined __cplusplus
|
||||||
|
# define __extern_inline extern __inline __attribute__ ((__gnu_inline__))
|
||||||
|
# define __extern_always_inline \
|
||||||
|
extern __always_inline __attribute__ ((__gnu_inline__))
|
||||||
|
# else
|
||||||
|
# define __extern_inline extern __inline
|
||||||
|
# define __extern_always_inline extern __always_inline
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __extern_always_inline
|
||||||
|
# define __fortify_function __extern_always_inline __attribute_artificial__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* GCC 4.3 and above allow passing all anonymous arguments of an
|
||||||
|
__extern_always_inline function to some other vararg function. */
|
||||||
|
#if __GNUC_PREREQ (4,3)
|
||||||
|
# define __va_arg_pack() __builtin_va_arg_pack ()
|
||||||
|
# define __va_arg_pack_len() __builtin_va_arg_pack_len ()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* It is possible to compile containing GCC extensions even if GCC is
|
||||||
|
run in pedantic mode if the uses are carefully marked using the
|
||||||
|
`__extension__' keyword. But this is not generally available before
|
||||||
|
version 2.8. */
|
||||||
|
#if !__GNUC_PREREQ (2,8)
|
||||||
|
# define __extension__ /* Ignore */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* __restrict is known in EGCS 1.2 and above. */
|
||||||
|
#if !__GNUC_PREREQ (2,92)
|
||||||
|
# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
|
||||||
|
# define __restrict restrict
|
||||||
|
# else
|
||||||
|
# define __restrict /* Ignore */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ISO C99 also allows to declare arrays as non-overlapping. The syntax is
|
||||||
|
array_name[restrict]
|
||||||
|
GCC 3.1 supports this. */
|
||||||
|
#if __GNUC_PREREQ (3,1) && !defined __GNUG__
|
||||||
|
# define __restrict_arr __restrict
|
||||||
|
#else
|
||||||
|
# ifdef __GNUC__
|
||||||
|
# define __restrict_arr /* Not supported in old GCC. */
|
||||||
|
# else
|
||||||
|
# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
|
||||||
|
# define __restrict_arr restrict
|
||||||
|
# else
|
||||||
|
/* Some other non-C99 compiler. */
|
||||||
|
# define __restrict_arr /* Not supported. */
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
# define __glibc_unlikely(cond) __builtin_expect ((cond), 0)
|
||||||
|
# define __glibc_likely(cond) __builtin_expect ((cond), 1)
|
||||||
|
#else
|
||||||
|
# define __glibc_unlikely(cond) (cond)
|
||||||
|
# define __glibc_likely(cond) (cond)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __has_attribute
|
||||||
|
# define __glibc_has_attribute(attr) __has_attribute (attr)
|
||||||
|
#else
|
||||||
|
# define __glibc_has_attribute(attr) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (!defined _Noreturn \
|
||||||
|
&& (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
|
||||||
|
&& !__GNUC_PREREQ (4,7))
|
||||||
|
# if __GNUC_PREREQ (2,8)
|
||||||
|
# define _Noreturn __attribute__ ((__noreturn__))
|
||||||
|
# else
|
||||||
|
# define _Noreturn
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __GNUC_PREREQ (8, 0)
|
||||||
|
/* Describes a char array whose address can safely be passed as the first
|
||||||
|
argument to strncpy and strncat, as the char array is not necessarily
|
||||||
|
a NUL-terminated string. */
|
||||||
|
# define __attribute_nonstring__ __attribute__ ((__nonstring__))
|
||||||
|
#else
|
||||||
|
# define __attribute_nonstring__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (!defined _Static_assert && !defined __cplusplus \
|
||||||
|
&& (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
|
||||||
|
&& (!__GNUC_PREREQ (4, 6) || defined __STRICT_ANSI__))
|
||||||
|
# define _Static_assert(expr, diagnostic) \
|
||||||
|
extern int (*__Static_assert_function (void)) \
|
||||||
|
[!!sizeof (struct { int __error_if_negative: (expr) ? 2 : -1; })]
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The #ifndef lets Gnulib avoid including these on non-glibc
|
||||||
|
platforms, where the includes typically do not exist. */
|
||||||
|
#ifndef __WORDSIZE
|
||||||
|
# include <bits/wordsize.h>
|
||||||
|
# include <bits/long-double.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH
|
||||||
|
# define __LDBL_COMPAT 1
|
||||||
|
# ifdef __REDIRECT
|
||||||
|
# define __LDBL_REDIR1(name, proto, alias) __REDIRECT (name, proto, alias)
|
||||||
|
# define __LDBL_REDIR(name, proto) \
|
||||||
|
__LDBL_REDIR1 (name, proto, __nldbl_##name)
|
||||||
|
# define __LDBL_REDIR1_NTH(name, proto, alias) __REDIRECT_NTH (name, proto, alias)
|
||||||
|
# define __LDBL_REDIR_NTH(name, proto) \
|
||||||
|
__LDBL_REDIR1_NTH (name, proto, __nldbl_##name)
|
||||||
|
# define __LDBL_REDIR1_DECL(name, alias) \
|
||||||
|
extern __typeof (name) name __asm (__ASMNAME (#alias));
|
||||||
|
# define __LDBL_REDIR_DECL(name) \
|
||||||
|
extern __typeof (name) name __asm (__ASMNAME ("__nldbl_" #name));
|
||||||
|
# define __REDIRECT_LDBL(name, proto, alias) \
|
||||||
|
__LDBL_REDIR1 (name, proto, __nldbl_##alias)
|
||||||
|
# define __REDIRECT_NTH_LDBL(name, proto, alias) \
|
||||||
|
__LDBL_REDIR1_NTH (name, proto, __nldbl_##alias)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if !defined __LDBL_COMPAT || !defined __REDIRECT
|
||||||
|
# define __LDBL_REDIR1(name, proto, alias) name proto
|
||||||
|
# define __LDBL_REDIR(name, proto) name proto
|
||||||
|
# define __LDBL_REDIR1_NTH(name, proto, alias) name proto __THROW
|
||||||
|
# define __LDBL_REDIR_NTH(name, proto) name proto __THROW
|
||||||
|
# define __LDBL_REDIR_DECL(name)
|
||||||
|
# ifdef __REDIRECT
|
||||||
|
# define __REDIRECT_LDBL(name, proto, alias) __REDIRECT (name, proto, alias)
|
||||||
|
# define __REDIRECT_NTH_LDBL(name, proto, alias) \
|
||||||
|
__REDIRECT_NTH (name, proto, alias)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* __glibc_macro_warning (MESSAGE) issues warning MESSAGE. This is
|
||||||
|
intended for use in preprocessor macros.
|
||||||
|
|
||||||
|
Note: MESSAGE must be a _single_ string; concatenation of string
|
||||||
|
literals is not supported. */
|
||||||
|
#if __GNUC_PREREQ (4,8) || __glibc_clang_prereq (3,5)
|
||||||
|
# define __glibc_macro_warning1(message) _Pragma (#message)
|
||||||
|
# define __glibc_macro_warning(message) \
|
||||||
|
__glibc_macro_warning1 (GCC warning message)
|
||||||
|
#else
|
||||||
|
# define __glibc_macro_warning(msg)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Generic selection (ISO C11) is a C-only feature, available in GCC
|
||||||
|
since version 4.9. Previous versions do not provide generic
|
||||||
|
selection, even though they might set __STDC_VERSION__ to 201112L,
|
||||||
|
when in -std=c11 mode. Thus, we must check for !defined __GNUC__
|
||||||
|
when testing __STDC_VERSION__ for generic selection support.
|
||||||
|
On the other hand, Clang also defines __GNUC__, so a clang-specific
|
||||||
|
check is required to enable the use of generic selection. */
|
||||||
|
#if !defined __cplusplus \
|
||||||
|
&& (__GNUC_PREREQ (4, 9) \
|
||||||
|
|| __glibc_clang_has_extension (c_generic_selections) \
|
||||||
|
|| (!defined __GNUC__ && defined __STDC_VERSION__ \
|
||||||
|
&& __STDC_VERSION__ >= 201112L))
|
||||||
|
# define __HAVE_GENERIC_SELECTION 1
|
||||||
|
#else
|
||||||
|
# define __HAVE_GENERIC_SELECTION 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* sys/cdefs.h */
|
|
@ -0,0 +1,83 @@
|
||||||
|
/* cloexec.c - set or clear the close-on-exec descriptor flag
|
||||||
|
|
||||||
|
Copyright (C) 1991, 2004-2006, 2009-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
The code is taken from glibc/manual/llio.texi */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "cloexec.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/* Set the 'FD_CLOEXEC' flag of DESC if VALUE is true,
|
||||||
|
or clear the flag if VALUE is false.
|
||||||
|
Return 0 on success, or -1 on error with 'errno' set.
|
||||||
|
|
||||||
|
Note that on MingW, this function does NOT protect DESC from being
|
||||||
|
inherited into spawned children. Instead, either use dup_cloexec
|
||||||
|
followed by closing the original DESC, or use interfaces such as
|
||||||
|
open or pipe2 that accept flags like O_CLOEXEC to create DESC
|
||||||
|
non-inheritable in the first place. */
|
||||||
|
|
||||||
|
int
|
||||||
|
set_cloexec_flag (int desc, bool value)
|
||||||
|
{
|
||||||
|
#ifdef F_SETFD
|
||||||
|
|
||||||
|
int flags = fcntl (desc, F_GETFD, 0);
|
||||||
|
|
||||||
|
if (0 <= flags)
|
||||||
|
{
|
||||||
|
int newflags = (value ? flags | FD_CLOEXEC : flags & ~FD_CLOEXEC);
|
||||||
|
|
||||||
|
if (flags == newflags
|
||||||
|
|| fcntl (desc, F_SETFD, newflags) != -1)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
#else /* !F_SETFD */
|
||||||
|
|
||||||
|
/* Use dup2 to reject invalid file descriptors; the cloexec flag
|
||||||
|
will be unaffected. */
|
||||||
|
if (desc < 0)
|
||||||
|
{
|
||||||
|
errno = EBADF;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (dup2 (desc, desc) < 0)
|
||||||
|
/* errno is EBADF here. */
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* There is nothing we can do on this kind of platform. Punt. */
|
||||||
|
return 0;
|
||||||
|
#endif /* !F_SETFD */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Duplicates a file handle FD, while marking the copy to be closed
|
||||||
|
prior to exec or spawn. Returns -1 and sets errno if FD could not
|
||||||
|
be duplicated. */
|
||||||
|
|
||||||
|
int
|
||||||
|
dup_cloexec (int fd)
|
||||||
|
{
|
||||||
|
return fcntl (fd, F_DUPFD_CLOEXEC, 0);
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/* cloexec.c - set or clear the close-on-exec descriptor flag
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2009-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
/* Set the 'FD_CLOEXEC' flag of DESC if VALUE is true,
|
||||||
|
or clear the flag if VALUE is false.
|
||||||
|
Return 0 on success, or -1 on error with 'errno' set.
|
||||||
|
|
||||||
|
Note that on MingW, this function does NOT protect DESC from being
|
||||||
|
inherited into spawned children. Instead, either use dup_cloexec
|
||||||
|
followed by closing the original DESC, or use interfaces such as
|
||||||
|
open or pipe2 that accept flags like O_CLOEXEC to create DESC
|
||||||
|
non-inheritable in the first place. */
|
||||||
|
|
||||||
|
int set_cloexec_flag (int desc, bool value);
|
||||||
|
|
||||||
|
/* Duplicates a file handle FD, while marking the copy to be closed
|
||||||
|
prior to exec or spawn. Returns -1 and sets errno if FD could not
|
||||||
|
be duplicated. */
|
||||||
|
|
||||||
|
int dup_cloexec (int fd);
|
|
@ -0,0 +1,71 @@
|
||||||
|
/* close replacement.
|
||||||
|
Copyright (C) 2008-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "fd-hook.h"
|
||||||
|
#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
|
||||||
|
# include "msvc-inval.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef close
|
||||||
|
|
||||||
|
#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
|
||||||
|
static int
|
||||||
|
close_nothrow (int fd)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
TRY_MSVC_INVAL
|
||||||
|
{
|
||||||
|
result = close (fd);
|
||||||
|
}
|
||||||
|
CATCH_MSVC_INVAL
|
||||||
|
{
|
||||||
|
result = -1;
|
||||||
|
errno = EBADF;
|
||||||
|
}
|
||||||
|
DONE_MSVC_INVAL;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define close_nothrow close
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Override close() to call into other gnulib modules. */
|
||||||
|
|
||||||
|
int
|
||||||
|
rpl_close (int fd)
|
||||||
|
{
|
||||||
|
#if WINDOWS_SOCKETS
|
||||||
|
int retval = execute_all_close_hooks (close_nothrow, fd);
|
||||||
|
#else
|
||||||
|
int retval = close_nothrow (fd);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if REPLACE_FCHDIR
|
||||||
|
if (retval >= 0)
|
||||||
|
_gl_unregister_fd (fd);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
/* connect.c --- wrappers for Windows connect function
|
||||||
|
|
||||||
|
Copyright (C) 2008-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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 3 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, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Paolo Bonzini */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
/* Get winsock2.h. */
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
/* Get set_winsock_errno, FD_TO_SOCKET etc. */
|
||||||
|
#include "w32sock.h"
|
||||||
|
|
||||||
|
#undef connect
|
||||||
|
|
||||||
|
int
|
||||||
|
rpl_connect (int fd, const struct sockaddr *sockaddr, socklen_t len)
|
||||||
|
{
|
||||||
|
SOCKET sock = FD_TO_SOCKET (fd);
|
||||||
|
|
||||||
|
if (sock == INVALID_SOCKET)
|
||||||
|
{
|
||||||
|
errno = EBADF;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int r = connect (sock, sockaddr, len);
|
||||||
|
if (r < 0)
|
||||||
|
{
|
||||||
|
/* EINPROGRESS is not returned by WinSock 2.0; for backwards
|
||||||
|
compatibility, connect(2) uses EWOULDBLOCK. */
|
||||||
|
if (WSAGetLastError () == WSAEWOULDBLOCK)
|
||||||
|
WSASetLastError (WSAEINPROGRESS);
|
||||||
|
|
||||||
|
set_winsock_errno ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue