Branching for libisoburn release 1.2.2
This commit is contained in:
15
libisoburn/branches/1.2.2/xorriso/AUTHORS_gnu_xorriso
Normal file
15
libisoburn/branches/1.2.2/xorriso/AUTHORS_gnu_xorriso
Normal file
@ -0,0 +1,15 @@
|
||||
Derek Foreman
|
||||
Ben Jansens
|
||||
Thomas Schmitt
|
||||
Mario Danic
|
||||
Vreixo Formoso Lopes
|
||||
Colin Plumb
|
||||
Tatu Ylonen
|
||||
Jim Kingdon
|
||||
Scott G. Miller
|
||||
Ulrich Drepper
|
||||
Richard Atterer
|
||||
Steve McIntyre
|
||||
George Danchev
|
||||
and possibly others who gave their copyright to Free Software Foundation, Inc.
|
||||
|
674
libisoburn/branches/1.2.2/xorriso/COPYING_gnu_xorriso
Normal file
674
libisoburn/branches/1.2.2/xorriso/COPYING_gnu_xorriso
Normal file
@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://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 <http://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
|
||||
<http://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
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
34
libisoburn/branches/1.2.2/xorriso/COPYRIGHT_gnu_xorriso
Normal file
34
libisoburn/branches/1.2.2/xorriso/COPYRIGHT_gnu_xorriso
Normal file
@ -0,0 +1,34 @@
|
||||
Derek Foreman <derek@signalmarketing.com>
|
||||
Ben Jansens <xor@orodu.net>
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
Mario Danic <mario.danic@gmail.com>,
|
||||
Vreixo Formoso <metalpain2002@yahoo.es>
|
||||
Steve McIntyre <steve@einval.com>
|
||||
George Danchev <danchev@spnet.net>
|
||||
|
||||
GNU xorriso is a compilation of modules from libburnia-project.org :
|
||||
xorriso Copyright (C) 2007-2011 Thomas Schmitt
|
||||
libisoburn Copyright (C) 2007-2011 Vreixo Formoso, Thomas Schmitt
|
||||
libisofs Copyright (C) 2007-2011 Vreixo Formoso, Mario Danic, Thomas Schmitt
|
||||
libburn Copyright (C) 2002-2006 Derek Foreman, Ben Jansens
|
||||
2006-2011 Mario Danic, Thomas Schmitt
|
||||
Further included is :
|
||||
libjte Copyright (C) 2000-2007 Free Software Foundation, Inc.
|
||||
2004-2011 Steve McIntyre
|
||||
2010-2011 George Danchev, Thomas Schmitt
|
||||
|
||||
Originally they all are licensed directly or indirectly as GPLv2+.
|
||||
GNU xorriso is licensed by the following statement:
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 3
|
||||
or later as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
460
libisoburn/branches/1.2.2/xorriso/README_gnu_xorriso
Normal file
460
libisoburn/branches/1.2.2/xorriso/README_gnu_xorriso
Normal file
@ -0,0 +1,460 @@
|
||||
------------------------------------------------------------------------------
|
||||
Contribution of libburnia-project.org to the GNU Operating System
|
||||
------------------------------------------------------------------------------
|
||||
GNU xorriso. By Thomas Schmitt <scdbackup@gmx.net>
|
||||
Derived from and supported by libburnia-project.org, published via:
|
||||
http://www.gnu.org/software/xorriso/xorriso_eng.html
|
||||
http://www.gnu.org/software/xorriso/xorriso-1.2.1.tar.gz
|
||||
Provided under GPL version 3 or later. No warranty.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
xorriso is a program which copies file objects from POSIX compliant
|
||||
filesystems into Rock Ridge enhanced ISO 9660 filesystems and allows
|
||||
session-wise manipulation of such filesystems. It can load the management
|
||||
information of existing ISO images and it writes the session results to
|
||||
optical media or to filesystem objects.
|
||||
Vice versa xorriso is able to restore file objects from ISO 9660 filesystems.
|
||||
|
||||
A special property of xorriso is that it needs neither an external ISO 9660
|
||||
formatter program nor an external burn program for CD or DVD but rather
|
||||
incorporates the libraries of libburnia-project.org .
|
||||
|
||||
Currently it is fully supported on GNU/Linux with kernels >= 2.4,
|
||||
on FreeBSD with ATAPI/CAM support enabled in the kernel, see atapicam(4),
|
||||
and on OpenSolaris (tested with kernel 5.11).
|
||||
On other X/Open compliant systems there will only be POSIX i/o with disk
|
||||
file objects, but no direct MMC operation on CD/DVD/BD drives.
|
||||
|
||||
By using this software you agree to the disclaimer at the end of this text:
|
||||
"... without even the implied warranty ..."
|
||||
|
||||
|
||||
Compilation, First Glimpse, Installation
|
||||
|
||||
The most simple way to get xorriso from source code is the GNU xorriso tarball.
|
||||
|
||||
Prerequisites:
|
||||
The tarball contains everything that is needed except the following system
|
||||
components:
|
||||
libc, libpthread
|
||||
plus on FreeBSD: libiconv, libcam, IDE and SATA drives need atapicam
|
||||
Optional at compile time are:
|
||||
libreadline and the readline-dev headers make dialog mode more convenient.
|
||||
zlib and zlib-devel allow zisofs compression.
|
||||
on GNU/Linux: libacl and libacl-devel allow getting and setting ACLs.
|
||||
If they were present at compile time, then the optional libraries have to
|
||||
be present at runtime, too.
|
||||
|
||||
Obtain xorriso-1.2.1.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf xorriso-1.2.1.tar.gz
|
||||
cd xorriso-1.2.1
|
||||
|
||||
Within that directory execute:
|
||||
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
|
||||
This will produce a binary named
|
||||
./xorriso/xorriso
|
||||
|
||||
If you want xorriso to report a "Build timestamp" with its option -version :
|
||||
make buildstamped
|
||||
|
||||
You may strip the binary to reduce it in size
|
||||
strip ./xorriso/xorriso
|
||||
|
||||
You may copy or move it to a directory where it can be found by the shell,
|
||||
or you may execute xorriso at the place where it was built,
|
||||
or you may execute as superuser:
|
||||
make install
|
||||
|
||||
For general concepts, options and usage examples see
|
||||
info xorriso
|
||||
info xorrisofs
|
||||
info xorrecord
|
||||
man 1 xorriso
|
||||
man 1 xorrisofs
|
||||
man 1 xorrecord
|
||||
|
||||
You may get a first glimpse by e.g.
|
||||
info ./xorriso/xorriso.info
|
||||
man ./xorriso/xorriso.1
|
||||
|
||||
The installation creates several alias links pointing to the xorriso binary:
|
||||
xorrisofs starts xorriso with -as mkisofs emulation already enabled
|
||||
xorrecord starts xorriso with -as cdrecord emulation already enabled
|
||||
osirrox starts with -osirrox image-to-disk copying already enabled
|
||||
|
||||
|
||||
If you want to avoid dependecy on libreadline although the libreadline
|
||||
development package is installed, then rather build xorriso by:
|
||||
./configure --prefix=/usr --disable-libreadline
|
||||
make clean ; make
|
||||
Never omit the "make clean" command after switching libreadline enabling.
|
||||
Other deliberate dependency reduction options of ./configure are:
|
||||
--disable-libacl avoid use of ACL functions like acl_to_text()
|
||||
--disable-xattr avoid use of xattr functions like listxattr() on Linux
|
||||
resp. extattr_list_file() on FreeBSD
|
||||
--disable-zlib avoid use of zlib functions like compress2()
|
||||
this also avoids the use of libjte and option -jigdo.
|
||||
|
||||
xorriso brings own system adapters which allow burning optical media on
|
||||
GNU/Linux, FreeBSD, Solaris.
|
||||
Alternatively it can use libcdio-0.83 or later for sending commands to
|
||||
optical drives:
|
||||
--enable-libcdio
|
||||
|
||||
xorriso allows to use external processes as file content filters. This is
|
||||
a potential security risk which may be avoided by ./configure option
|
||||
--disable-external-filters
|
||||
|
||||
By default the filter feature is disabled if effective user id and real
|
||||
user id differ. This ban can be lifted by
|
||||
--enable-external-filters-setuid
|
||||
|
||||
Sometimes xorriso will yield better write performance on GNU/Linux if 64 KB are
|
||||
transmitted in each write operation rather than 32 KB. See option -dvd_obs .
|
||||
64k can be made default at configure time by:
|
||||
--enable-dvd-obs-64k
|
||||
|
||||
For xorriso -as cdrecord emulation only:
|
||||
In some situations GNU/Linux may deliver a better write performance to drives
|
||||
if the track input is read with O_DIRECT (see man 2 open). The included libburn
|
||||
and the cdrecord emulation of xorriso can be told to use this peculiar read
|
||||
mode by:
|
||||
--enable-track-src-odirect
|
||||
|
||||
Linux only:
|
||||
libburn tries to avoid a collision with udev's drive examination by waiting
|
||||
0.1 seconds before opening the device file for a longer time, after udev
|
||||
might have been alarmed by drive scanning activities.
|
||||
The waiting time can be set at ./configure time with microsecond granularity.
|
||||
E.g. 2 seconds:
|
||||
CFLAGS="$CFLAGS -DLibburn_udev_wait_useC=2000000"
|
||||
./configure ...options...
|
||||
Waiting can be disabled by zero waiting time:
|
||||
CFLAGS="$CFLAGS -DLibburn_udev_wait_useC=0"
|
||||
Alternatively, libburn can try to be nice by opening the device file,
|
||||
closing it immediately, waiting, and only then opening it for real:
|
||||
CFLAGS="$CFLAGS -DLibburn_udev_extra_open_cyclE -DLibburn_udev_wait_useC=500000"
|
||||
|
||||
|
||||
Drives and Disk File Objects
|
||||
|
||||
The user of libisoburn applications needs rw-permission for the CD/DVD/BD
|
||||
drives which shall be used, even if only reading is intended.
|
||||
A list of rw-accessible drives can be obtained by
|
||||
|
||||
xorriso -devices
|
||||
|
||||
CD devices which offer not enough permission are invisible to normal users.
|
||||
The superuser should be able to see any usable drive and then set the
|
||||
permissions as needed.
|
||||
On Linux and FreeBSD, rw-permissions are needed.
|
||||
On Solaris, the privilege "sys_devices" and r-permission are needed.
|
||||
|
||||
The output of xorriso -devices might look like
|
||||
|
||||
0 -dev '/dev/sr0' rwrw-- : 'TSSTcorp' 'CDDVDW SH-S203B'
|
||||
1 -dev '/dev/hda' rwrw-- : 'HL-DT-ST' 'DVD-ROM GDR8162B'
|
||||
|
||||
On Linux, full and insecure enabling of both for everybody would look like
|
||||
chmod a+rw /dev/sr0 /dev/hda
|
||||
This is equivalent to the traditional setup chmod a+x,u+s cdrecord.
|
||||
|
||||
On FreeBSD, device permissions are to be set in /etc/devfs.rules.
|
||||
On Solaris, pfexec privileges may be restricted to "basic,sys_devices".
|
||||
See below "System Dependend Drive Permission Examples".
|
||||
|
||||
I strongly discourage to run xorriso with setuid root or via sudo !
|
||||
It is not checked for the necessary degree of hacker safety.
|
||||
Better consider to grant the necessary permissions to group "floppy"
|
||||
and to add users to it.
|
||||
|
||||
|
||||
A possible source of problems are hald or other automounters.
|
||||
If you can spot a process "hald-addon-storage" with the address of
|
||||
your desired drive, then consider to kill it.
|
||||
A similar process "udisks-daemon: polling ..." can be seen on newer Linuxes.
|
||||
|
||||
On Debian GNU/Linux 6.0.2 amd64 there is
|
||||
/lib/udev/rules.d/80-udisks.rules
|
||||
where one can remove all CD drives ("sr*") from the list of automountable
|
||||
devices:
|
||||
KERNEL=="sd*|hd*|mmcblk*|mspblk*", ENV{UDISKS_PRESENTATION_NOPOLICY}="0"
|
||||
# KERNEL=="sd*|hd*|sr*|mmcblk*|mspblk*", ENV{UDISKS_PRESENTATION_NOPOLICY}="0"
|
||||
Copying the recognition criterion from
|
||||
/etc/udev/rules.d/70-persistent-cd.rules
|
||||
one can prevent automounting a single drive, too:
|
||||
SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:11.0-scsi-2:0:0:0", ENV{UDISKS_PRESENTATION_NOPOLICY}:="1"
|
||||
|
||||
If you cannot get rid of the automounter, try whether it helps to always load
|
||||
the drive tray manually before starting a write run of xorriso. Wait until the
|
||||
drive light is off and the mounted media appears.
|
||||
Then try to unmount the mounted media before a write run.
|
||||
|
||||
|
||||
Besides true optical drives, xorriso can also address disk files as input or
|
||||
output drives. By default paths to files under /dev are accepted only if the
|
||||
device represents a real optical drive. Other device files may be addressed
|
||||
by prepending "stdio:" to the path.
|
||||
Like:
|
||||
xorriso -dev stdio:/dev/sdb ...more arguments...
|
||||
This rule may be changed by xorriso option -drive_class.
|
||||
Prefix "mmc:" causes a path to be accepted only if it is a real optical drive
|
||||
which is accessible by generic SCSI/MMC commands.
|
||||
|
||||
|
||||
Testing
|
||||
|
||||
We are quite sure that libisofs produces accurate representations of the disk
|
||||
files. This opinion is founded on a lot of test burns and checks by a little
|
||||
test program which compares files from the mounted image with the orignals
|
||||
on disk. It uses the normal POSIX filesystem calls, i.e. no libburnia stuff.
|
||||
|
||||
This program is not installed systemwide but stays in the installation
|
||||
directory of the xorriso tarball as test/compare_file . Usually it is
|
||||
run as -exec payload of a find command. It demands at least three arguments:
|
||||
The path of the first file to compare, the prefix1 to be cut off from path
|
||||
and the prefix2 which gets prepended afterwards to obtain the path of the
|
||||
second file to compare.
|
||||
As further argument there can be -no_ctime which suppresses the comparison
|
||||
of ctime date stamps.
|
||||
The exit value is 0 if no difference was detected, non-0 else.
|
||||
|
||||
Example: After
|
||||
xorriso ... -pathspecs on -add /=/original/dir -- -commit_eject all
|
||||
mount /media/dvd
|
||||
cd test
|
||||
compare tree /media/dvd with tree /original/dir :
|
||||
find /original/dir -exec ./compare_file '{}' /original/dir /media/dvd ';' \
|
||||
| less
|
||||
and vice versa:
|
||||
find /media/dvd -exec ./compare_file '{}' /media/dvd /original/dir ';' \
|
||||
| less
|
||||
|
||||
|
||||
File Formats
|
||||
|
||||
Sector Maps
|
||||
|
||||
Sector maps describe the valid and invalid blocks on a media or a disk copy of
|
||||
a media. xorriso creates and reads these file with its option -check_media.
|
||||
|
||||
The file begins with 32 bytes of cleartext of which the last one is a
|
||||
newline character. The first 25 say "xorriso sector bitmap v2 ", the
|
||||
remaining six characters give the size of the info text as decimal number.
|
||||
This number of bytes follows the first 32 and will not be interpreted
|
||||
by xorriso. They are rather to inform a human reader about the media type
|
||||
and its track layout.
|
||||
After the info text there are two 4 byte signed integers, most significant
|
||||
byte first. The first one, N, gives the number of bits in the following bitmap
|
||||
and the second number S gives the number of 2 KiB blocks governed by a single
|
||||
bit in the map. Then come the bits in form of 8-bit bytes.
|
||||
Data block M is covered by bit B=M/S in the map, bit number B is stored in
|
||||
byte B/8 as bit B%8. A valid readable data block has its bit set to 1.
|
||||
|
||||
Checksum Tags
|
||||
|
||||
Checksum tags are data blocks inside an ISO 9660 image which do not belong to
|
||||
any file but rather tell the MD5 of a certain range of data blocks.
|
||||
|
||||
The superblock checksum tag is written after the ECMA-119 volume descriptors.
|
||||
The tree checksum tag is written after the ECMA-119 directory entries.
|
||||
The session checksum tag is written after all payload including the checksum
|
||||
array. (Then follows padding.)
|
||||
|
||||
The tags are single lines of printable text, padded by 0 bytes. They have
|
||||
the following format:
|
||||
|
||||
Tag_id pos=# range_start=# range_size=# [session_start|next=#] md5=# self=#\n
|
||||
|
||||
Parameters md5= and self= are 32 digit hex, the others are decimal numbers.
|
||||
|
||||
Tag_id distinguishes the following tag types
|
||||
"libisofs_rlsb32_checksum_tag_v1" Relocated 64 kB superblock tag
|
||||
"libisofs_sb_checksum_tag_v1" Superblock tag
|
||||
"libisofs_tree_checksum_tag_v1" Directory tree tag
|
||||
"libisofs_checksum_tag_v1" Session end tag
|
||||
|
||||
A relocated superblock may appear at LBA 0 of an image which was produced for
|
||||
being stored in a disk file or on overwriteable media (e.g. DVD+RW, BD-RE).
|
||||
xorriso records the first session at LBA 32. A follow-up session
|
||||
begins at the next block address which is divisible by 32 and higher than the
|
||||
address of the previous session's end tag. Normally no session starts after the
|
||||
address given by relocated superblock parameter session_start=.
|
||||
Session oriented media like CD-R[W], DVD-R, DVD+R, BD-R will have no relocated
|
||||
superblock but rather bear a table-of-content on media level.
|
||||
|
||||
A tag is valid if pos= tells its own block address and self= tells its own MD5
|
||||
up to the last hex digit of md5=. range_start= tells the first block that is
|
||||
covered by md5=, range_size= tells the number of blocks covered by md5=.
|
||||
Relocated superblocks tell the block address of their session by session_start=.
|
||||
Superblock and tree tag tell the block address of the next tag by next=.
|
||||
The newline character at the end is mandatory.
|
||||
|
||||
|
||||
libisoburn
|
||||
|
||||
xorriso is based on libisofs which does ISO 9660 filesystem aspects and on
|
||||
libburn which does the input and output aspects. Parts of this foundation
|
||||
are accessed via libisoburn, which is closely related to xorriso.
|
||||
|
||||
libisoburn provides several services:
|
||||
- Encapsulation of coordination between libisofs and libburn.
|
||||
- Emulation of ISO 9660 multi-session on overwriteable media
|
||||
or random access files.
|
||||
- Implementation of the xorriso API.
|
||||
|
||||
The sourcecode of all three libraries is included in the xorriso standalone
|
||||
tarball. It is compiled with xorriso and linked statically.
|
||||
But you may as well get and install releases of libburn and libisofs, in order
|
||||
to be able to install a release of libisoburn which produces libisoburn.so.1
|
||||
and a matching dynamically linked xorriso binary.
|
||||
This binary is very lean but depends on properly installed libraries of
|
||||
suitable revision.
|
||||
|
||||
Dynamic library and compile time header requirements for libisoburn-1.2.0 :
|
||||
- libburn.so.4 , version libburn-1.2.0 or higher
|
||||
- libisofs.so.6 , version libisofs-1.2.0 or higher
|
||||
libisoburn and xorriso will not start with libraries which are older than their
|
||||
headers seen at compile time. So compile in the oldest possible installation
|
||||
setup unless you have reason to enforce a newer bug fix level.
|
||||
|
||||
GNU xorriso has less runtime dependencies and can be moved more freely.
|
||||
|
||||
|
||||
System Dependend Drive Permission Examples
|
||||
|
||||
Accessing the optical drives requires privileges which usually are granted
|
||||
only to the superuser. GNU/Linux, FreeBSD and Solaris offer quite different
|
||||
approaches for avoiding the need for unrestricted privileges.
|
||||
|
||||
First check whether some friendly system setting already allows you to
|
||||
access the drives as normal user:
|
||||
xorriso -devices
|
||||
Those drives of which you see address and type strings are already usable.
|
||||
|
||||
If there remain drives invisible which the superuser can see by the same
|
||||
command, then the following examples might help:
|
||||
|
||||
---------------------
|
||||
On all three systems:
|
||||
---------------------
|
||||
Add the authorized users of CD drives to group "floppy" in /etc/group.
|
||||
If missing: create this group.
|
||||
Changes to /etc/group often only affect new login sessions. So log out and in
|
||||
before making the first tests.
|
||||
|
||||
-------------
|
||||
On GNU/Linux:
|
||||
-------------
|
||||
Allow rw-access to the drives
|
||||
chgrp floppy /dev/sr0 /dev/sr1
|
||||
chmod g+rw /dev/sr0 /dev/sr1
|
||||
It might be necessary to perform chgrp and chmod after each reboot or to
|
||||
edit distro dependent device configuration files for permanent settings.
|
||||
|
||||
-----------
|
||||
On FreeBSD:
|
||||
-----------
|
||||
Edit /etc/devfs.rules and make sure to have these lines
|
||||
[localrules=10]
|
||||
add path 'acd*' mode 0664 group floppy
|
||||
add path 'cd*' mode 0664 group floppy
|
||||
add path 'pass*' mode 0664 group floppy
|
||||
add path 'xpt*' mode 0664 group floppy
|
||||
[localrules=5]
|
||||
add path 'pass*' mode 0664 group floppy
|
||||
add path 'cd*' mode 0664 group floppy
|
||||
add path 'xpt*' mode 0664 group floppy
|
||||
add path 'acd*' mode 0664 group floppy
|
||||
|
||||
Edit /etc/rc.conf and add the following line if missing
|
||||
devfs_system_ruleset="localrules"
|
||||
|
||||
This gets into effect by reboot or by command
|
||||
/etc/rc.d/devfs start
|
||||
|
||||
-----------
|
||||
On Solaris:
|
||||
-----------
|
||||
Run xorriso by
|
||||
pfexec xorriso ...arguments...
|
||||
|
||||
The following settings will make pfexec keep original UID and EUID and prevent
|
||||
most superuser powers. Be aware that you still can manipulate all device files
|
||||
if you have the file permissions for that.
|
||||
Full root privileges for xorriso can then be acquired only by command su.
|
||||
|
||||
Edit /etc/security/exec_attr and add this line to the other "Media Backup"
|
||||
lines:
|
||||
Media Backup:solaris:cmd:::/usr/local/bin/xorriso:privs=basic,sys_devices
|
||||
Edit /etc/user_attr and add profile "Media Backup" to the user's line:
|
||||
thomas::::profiles=Media Backup,Primary Administrator;roles=root
|
||||
See also man privileges, man exec_attr, man user_attr.
|
||||
|
||||
Then allow the group r-access to the drives
|
||||
pfexec chgrp floppy /dev/rdsk/c3t0d0s2 /dev/rdsk/c4t0d0s2
|
||||
pfexec chmod g+r /dev/rdsk/c3t0d0s2 /dev/rdsk/c4t0d0s2
|
||||
The last two commands have to be executed after each boot. I do not know
|
||||
the relevant device configuration files yet.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 3 or later
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
GNU xorriso is feature-wise equivalent to the dynamic compilation of
|
||||
libburnia libraries and libburnia program xorriso.
|
||||
It restricts itself to a technical form where the legal commitments of the
|
||||
libburnia project and the legal intentions of FSF match completely.
|
||||
|
||||
Libburnia project is committed to provide support for this copy in the same
|
||||
way as for its own software releases. It is further committed to keep its
|
||||
own licenses open for obtaining future copies under GPLv2+.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
libburnia program xorriso is based on and sub project of:
|
||||
libburnia-project.org
|
||||
By Mario Danic <mario.danic@gmail.com>, libburn, libisofs
|
||||
Vreixo Formoso <metalpain2002@yahoo.es>, libisofs, libisoburn
|
||||
Thomas Schmitt <scdbackup@gmx.net>, libburn, libisofs,
|
||||
libisoburn, xorriso
|
||||
Copyright (C) 2006-2012 Mario Danic, Vreixo Formoso, Thomas Schmitt.
|
||||
|
||||
libburnia-project.org is inspired by and in libburn still containing parts
|
||||
of old
|
||||
Libburn. By Derek Foreman <derek@signalmarketing.com> and
|
||||
Ben Jansens <xor@orodu.net>
|
||||
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
|
||||
GNU xorriso contains libjte out of source package jigit >= 1.17
|
||||
Copyright (C) 2000-2007 Free Software Foundation, Inc.
|
||||
2004-2011 Steve McIntyre
|
||||
2010-2011 George Danchev, Thomas Schmitt
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This text itself is
|
||||
Copyright (c) 2007 - 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
and is freely distributable.
|
||||
It shall only be modified in sync with the technical properties of xorriso.
|
||||
If you make use of the license to derive modified versions of xorriso
|
||||
then you are entitled to modify this text under that same license.
|
||||
|
1019
libisoburn/branches/1.2.2/xorriso/aux_objects.c
Normal file
1019
libisoburn/branches/1.2.2/xorriso/aux_objects.c
Normal file
File diff suppressed because it is too large
Load Diff
183
libisoburn/branches/1.2.2/xorriso/aux_objects.h
Normal file
183
libisoburn/branches/1.2.2/xorriso/aux_objects.h
Normal file
@ -0,0 +1,183 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of classes:
|
||||
|
||||
- SplitparT which represents byte intervals of data files.
|
||||
|
||||
- DirseQ which crawls along a directory's content list.
|
||||
|
||||
- ExclusionS which manages the list of excluded file paths and
|
||||
leaf patterns.
|
||||
|
||||
- Xorriso_lsT which provides a generic double-linked list.
|
||||
|
||||
- LinkiteM, PermiteM which temporarily record relations and states.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_auxobj_includeD
|
||||
#define Xorriso_pvt_auxobj_includeD yes
|
||||
|
||||
struct SplitparT;
|
||||
|
||||
int Splitparts_new(struct SplitparT **o, int count, int flag);
|
||||
|
||||
int Splitparts_destroy(struct SplitparT **o, int count, int flag);
|
||||
|
||||
int Splitparts_set(struct SplitparT *o, int idx,
|
||||
char *name, int partno, int total_parts,
|
||||
off_t offset, off_t bytes, off_t total_bytes, int flag);
|
||||
|
||||
int Splitparts_get(struct SplitparT *o, int idx, char **name, int *partno,
|
||||
int *total_parts, off_t *offset, off_t *bytes,
|
||||
off_t *total_bytes, int flag);
|
||||
|
||||
int Splitpart__parse(char *name, int *partno, int *total_parts,
|
||||
off_t *offset, off_t *bytes, off_t *total_bytes, int flag);
|
||||
|
||||
int Splitpart__is_part_path(char *path, int flag);
|
||||
|
||||
int Splitpart__compose(char *adr, int partno, int total_parts,
|
||||
off_t offset, off_t bytes, off_t total_bytes, int flag);
|
||||
|
||||
int Splitpart__read_next_num(char *base_pt, char **next_pt, off_t *num,
|
||||
int flag);
|
||||
|
||||
int Splitparts_sort(struct SplitparT *o, int count, int flag);
|
||||
|
||||
|
||||
|
||||
struct DirseQ;
|
||||
|
||||
int Dirseq_new(struct DirseQ **o, char *adr, int flag);
|
||||
|
||||
int Dirseq_destroy(struct DirseQ **o, int flag);
|
||||
|
||||
int Dirseq_next_adr(struct DirseQ *o, char reply[SfileadrL], int flag);
|
||||
|
||||
int Dirseq_rewind(struct DirseQ *o, int flag);
|
||||
|
||||
|
||||
|
||||
struct Xorriso_lsT {
|
||||
char *text;
|
||||
struct Xorriso_lsT *prev,*next;
|
||||
};
|
||||
|
||||
/** Create a new list item with arbitrary byte content.
|
||||
@param lstring The newly created object or NULL on failure
|
||||
@param data An array of bytes to be copied into the new object
|
||||
@param data_len Number of bytes to be copied
|
||||
@param link Xorriso_lsT object to which the new object shall be linked
|
||||
@param flag Bitfield for control purposes
|
||||
bit0= insert before link rather than after it
|
||||
bit1= do not copy data (e.g. because *data is invalid)
|
||||
bit2= attach data directly by pointer rather than by copying
|
||||
@return <=0 error, 1 ok
|
||||
*/
|
||||
int Xorriso_lst_new_binary(struct Xorriso_lsT **lstring, char *data,
|
||||
int data_len, struct Xorriso_lsT *link, int flag);
|
||||
|
||||
|
||||
/** Create a new list item with a 0-terminated text as content.
|
||||
@param lstring The newly created object or NULL on failure
|
||||
@param text A 0-terminated array of bytes
|
||||
@param link Xorriso_lsT object to which the new object shall be linked
|
||||
@param flag see Xorriso_lst_new_binary
|
||||
@return <=0 error, 1 ok
|
||||
*/
|
||||
int Xorriso_lst_new(struct Xorriso_lsT **lstring, char *text,
|
||||
struct Xorriso_lsT *link, int flag);
|
||||
|
||||
|
||||
/** Create a new list item at the end of a given list.
|
||||
@param entry Contains as input a pointer to a pointer to any existing
|
||||
list item. As output this list item pointer may be
|
||||
changed to the address of the new list item:
|
||||
if ((*entry == 0) || (flag & 1))
|
||||
@param data An array of bytes to be copied into the new object
|
||||
@param data_len Number of bytes to be copied
|
||||
@param flag Bitfield for control purposes
|
||||
bit0= Return new object address in *entry
|
||||
bit1= do not copy data (e.g. because *data is invalid)
|
||||
bit2= attach data directly by pointer rather than by copying
|
||||
bit2= attach data directly by pointer rather than by copying
|
||||
@return <=0 error, 1 ok
|
||||
*/
|
||||
int Xorriso_lst_append_binary(struct Xorriso_lsT **entry,
|
||||
char *data, int data_len, int flag);
|
||||
|
||||
|
||||
/** Destroy a single list item and connect its eventual list neighbors.
|
||||
@param lstring pointer to the pointer to be freed and set to NULL
|
||||
@param flag unused yet, submit 0
|
||||
@return 0= *lstring was alredy NULL, 1= ok
|
||||
*/
|
||||
int Xorriso_lst_destroy(struct Xorriso_lsT **lstring, int flag);
|
||||
|
||||
|
||||
struct Xorriso_lsT *Xorriso_lst_get_next(struct Xorriso_lsT *entry, int flag);
|
||||
|
||||
struct Xorriso_lsT *Xorriso_lst_get_prev(struct Xorriso_lsT *entry, int flag);
|
||||
|
||||
char *Xorriso_lst_get_text(struct Xorriso_lsT *entry, int flag);
|
||||
|
||||
int Xorriso_lst_detach_text(struct Xorriso_lsT *entry, int flag);
|
||||
|
||||
int Xorriso_lst_get_last(struct Xorriso_lsT *entry, struct Xorriso_lsT **last,
|
||||
int flag);
|
||||
|
||||
|
||||
int Exclusions_new(struct ExclusionS **o, int flag);
|
||||
|
||||
int Exclusions_destroy(struct ExclusionS **o, int flag);
|
||||
|
||||
int Exclusions_get_descrs(struct ExclusionS *o,
|
||||
struct Xorriso_lsT **not_paths_descr,
|
||||
struct Xorriso_lsT **not_leafs_descr, int flag);
|
||||
|
||||
/* @param flag bit0= whole subtree is banned with -not_paths
|
||||
@return 0=no match , 1=not_paths , 2=not_leafs, <0=error
|
||||
*/
|
||||
int Exclusions_match(struct ExclusionS *o, char *abs_path, int flag);
|
||||
|
||||
int Exclusions_add_not_leafs(struct ExclusionS *o, char *not_leafs_descr,
|
||||
regex_t *re, int flag);
|
||||
|
||||
int Exclusions_add_not_paths(struct ExclusionS *o, int descrc, char **descrs,
|
||||
int pathc, char **paths, int flag);
|
||||
|
||||
|
||||
|
||||
struct LinkiteM; /* Trace of hops during symbolic link resolution */
|
||||
|
||||
int Linkitem_new(struct LinkiteM **o, char *link_path, dev_t target_dev,
|
||||
ino_t target_ino, struct LinkiteM *next, int flag);
|
||||
|
||||
int Linkitem_destroy(struct LinkiteM **o, int flag);
|
||||
|
||||
int Linkitem_reset_stack(struct LinkiteM **o, struct LinkiteM *to, int flag);
|
||||
|
||||
int Linkitem_find(struct LinkiteM *stack, dev_t target_dev, ino_t target_ino,
|
||||
struct LinkiteM **result, int flag);
|
||||
|
||||
int Linkitem_get_link_count(struct LinkiteM *item, int flag);
|
||||
|
||||
|
||||
struct PermiteM; /* Stack of temporarily altered access permissions */
|
||||
|
||||
int Permstack_push(struct PermiteM **o, char *disk_path, struct stat *stbuf,
|
||||
int flag);
|
||||
|
||||
int Permstack_pop(struct PermiteM **o, struct PermiteM *stopper,
|
||||
struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_auxobj_includeD */
|
||||
|
657
libisoburn/branches/1.2.2/xorriso/base_obj.c
Normal file
657
libisoburn/branches/1.2.2/xorriso/base_obj.c
Normal file
@ -0,0 +1,657 @@
|
||||
|
||||
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2012 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains functions which are needed to read data
|
||||
from ISO image.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#else
|
||||
#ifdef HAVE_INTTYPES_H
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef Xorriso_standalonE
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
#include "../libjte/libjte.h"
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
#include <libjte/libjte.h>
|
||||
#endif
|
||||
|
||||
#endif /* ! Xorriso_standalonE */
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
|
||||
#include "base_obj.h"
|
||||
#include "lib_mgt.h"
|
||||
|
||||
|
||||
|
||||
/* See Xorriso__preset_signal_behavior() */
|
||||
static int Xorriso_signal_behavioR= 1;
|
||||
|
||||
|
||||
void Xorriso__version(int *major, int *minor, int *micro)
|
||||
{
|
||||
*major= Xorriso_header_version_majoR;
|
||||
*minor= Xorriso_header_version_minoR;
|
||||
*micro= Xorriso_header_version_micrO;
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__is_compatible(int major, int minor, int micro, int flag)
|
||||
{
|
||||
int own_major, own_minor, own_micro;
|
||||
|
||||
Xorriso__version(&own_major, &own_minor, &own_micro);
|
||||
return(own_major > major ||
|
||||
(own_major == major && (own_minor > minor ||
|
||||
(own_minor == minor && own_micro >= micro))));
|
||||
}
|
||||
|
||||
|
||||
char *Xorriso__get_patch_level_text(int flag)
|
||||
{
|
||||
return(Xorriso_program_patch_leveL);
|
||||
}
|
||||
|
||||
|
||||
/** The list of startup file names */
|
||||
#define Xorriso_rc_nuM 4
|
||||
|
||||
static char Xorriso_sys_rc_nameS[Xorriso_rc_nuM][80]= {
|
||||
"/etc/default/xorriso",
|
||||
"/etc/opt/xorriso/rc",
|
||||
"/etc/xorriso/xorriso.conf",
|
||||
"placeholder for $HOME/.xorrisorc"
|
||||
};
|
||||
|
||||
|
||||
int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
|
||||
{
|
||||
int i, ret;
|
||||
struct XorrisO *m;
|
||||
char *leafname= NULL;
|
||||
|
||||
leafname= TSOB_FELD(char, SfileadrL);
|
||||
if(leafname == NULL)
|
||||
return(-1);
|
||||
*xorriso= m= TSOB_FELD(struct XorrisO,1);
|
||||
if(m==NULL) {
|
||||
free(leafname);
|
||||
return(-1);
|
||||
}
|
||||
m->libs_are_started= 0;
|
||||
strncpy(m->progname,progname,sizeof(m->progname)-1);
|
||||
m->progname[sizeof(m->progname)-1]= 0;
|
||||
if(getcwd(m->initial_wdx,sizeof(m->initial_wdx)-1)==NULL)
|
||||
m->initial_wdx[0]= 0;
|
||||
m->no_rc= 0;
|
||||
m->argument_emulation= 0;
|
||||
|
||||
m->rc_filename_count= Xorriso_rc_nuM;
|
||||
for(i=0;i<m->rc_filename_count-1;i++)
|
||||
strcpy(m->rc_filenames[i],Xorriso_sys_rc_nameS[i]);
|
||||
m->rc_filenames[m->rc_filename_count-1][0]= 0;
|
||||
m->arrange_args= 0;
|
||||
m->mkisofsrc_done= 0;
|
||||
|
||||
m->wdi[0]= 0;
|
||||
strcpy(m->wdx, m->initial_wdx);
|
||||
m->did_something_useful= 0;
|
||||
m->add_plainly= 0;
|
||||
m->split_size= 0;
|
||||
strcpy(m->list_delimiter, "--");
|
||||
m->ino_behavior= 7;
|
||||
m->iso_level= 3;
|
||||
m->do_joliet= 0;
|
||||
m->do_iso1999= 0;
|
||||
m->do_aaip= 0;
|
||||
m->do_md5= 0;
|
||||
m->no_emul_toc= 0;
|
||||
m->do_old_empty= 0;
|
||||
m->scdbackup_tag_name[0]= 0;
|
||||
m->scdbackup_tag_time[0]= 0;
|
||||
m->scdbackup_tag_written[0]= 0;
|
||||
m->scdbackup_tag_listname[0]= 0;
|
||||
m->relax_compliance= 0;
|
||||
m->rr_reloc_dir[0]= 0;
|
||||
m->rr_reloc_flags= 1;
|
||||
m->untranslated_name_len= 0;
|
||||
m->do_follow_pattern= 1;
|
||||
m->do_follow_param= 0;
|
||||
m->do_follow_links= 0;
|
||||
m->follow_link_limit= 100;
|
||||
m->do_follow_mount= 1;
|
||||
m->do_global_uid= 0;
|
||||
m->global_uid= 0;
|
||||
strcpy(m->volid, "ISOIMAGE");
|
||||
m->volid_default= 1;
|
||||
m->loaded_volid[0]= 0;
|
||||
m->assert_volid[0]= 0;
|
||||
m->assert_volid_sev[0]= 0;
|
||||
m->preparer_id[0]= 0;
|
||||
m->publisher[0]= 0;
|
||||
m->application_id[0]= 0;
|
||||
m->system_id[0]= 0;
|
||||
m->volset_id[0]= 0;
|
||||
m->copyright_file[0]= 0;
|
||||
m->biblio_file[0]= 0;
|
||||
m->abstract_file[0]= 0;
|
||||
m->session_logfile[0]= 0;
|
||||
m->session_lba= -1;
|
||||
m->session_blocks= 0;
|
||||
m->do_global_gid= 0;
|
||||
m->global_gid= 0;
|
||||
m->do_global_mode= 0;
|
||||
m->global_dir_mode= 0555;
|
||||
m->global_file_mode= 0444;
|
||||
m->filters= NULL;
|
||||
m->filter_list_closed= 0;
|
||||
m->zlib_level_default= m->zlib_level= 6;
|
||||
m->zisofs_block_size= m->zisofs_block_size_default= (1 << 15);
|
||||
m->zisofs_by_magic= 0;
|
||||
m->do_overwrite= 2;
|
||||
m->do_reassure= 0;
|
||||
m->drive_blacklist= NULL;
|
||||
m->drive_greylist= NULL;
|
||||
m->drive_whitelist= NULL;
|
||||
m->toc_emulation_flag= 0;
|
||||
m->image_start_mode= 0;
|
||||
m->image_start_value[0]= 0;
|
||||
m->displacement= 0;
|
||||
m->displacement_sign= 0;
|
||||
m->drives_exclusive= 1;
|
||||
m->early_stdio_test= 0;
|
||||
m->cache_num_tiles= 0;
|
||||
m->cache_tile_blocks= 0;
|
||||
m->cache_default= 1 | 2;
|
||||
m->do_calm_drive= 1;
|
||||
m->indev[0]= 0;
|
||||
m->in_drive_handle= NULL;
|
||||
m->in_volset_handle= NULL;
|
||||
m->in_charset= NULL;
|
||||
m->isofs_st_out= time(0) - 1;
|
||||
m->indev_is_exclusive= 1;
|
||||
m->indev_off_adr[0]= 0;
|
||||
m->isofs_st_in= 0;
|
||||
m->volset_change_pending= 0;
|
||||
m->no_volset_present= 0;
|
||||
m->in_sector_map= NULL;
|
||||
m->check_media_default= NULL;
|
||||
m->check_media_bad_limit= Xorriso_read_quality_invaliD;
|
||||
m->outdev[0]= 0;
|
||||
m->out_drive_handle= NULL;
|
||||
m->out_charset= NULL;
|
||||
m->dev_fd_1= -1;
|
||||
m->outdev_is_exclusive= 1;
|
||||
m->outdev_off_adr[0]= 0;
|
||||
m->grow_blindly_msc2= -1;
|
||||
m->ban_stdio_write= 0;
|
||||
m->do_dummy= 0;
|
||||
m->do_close= 0;
|
||||
m->speed= 0;
|
||||
m->fs= 4*512; /* 4 MiB */
|
||||
m->padding= 300*1024;
|
||||
m->do_padding_by_libisofs= 0;
|
||||
m->alignment= 0;
|
||||
m->do_stream_recording= 0;
|
||||
m->dvd_obs= 0;
|
||||
m->stdio_sync= 0;
|
||||
m->keep_boot_image= 0;
|
||||
m->boot_image_cat_path[0]= 0;
|
||||
m->boot_image_cat_hidden= 0;
|
||||
m->boot_count= 0;
|
||||
m->boot_platform_id= 0x00; /* El Torito Boot Catalog Platform ID: 0 = 80x86 */
|
||||
m->patch_isolinux_image= 0;
|
||||
m->boot_image_bin_path[0]= 0;
|
||||
m->boot_image_bin_form[0]= 0;
|
||||
m->boot_image_emul= 0;
|
||||
m->boot_image_load_size= 4 * 512; /* hearsay out of libisofs/demo/iso.c */
|
||||
memset(m->boot_id_string, 0, sizeof(m->boot_id_string));
|
||||
memset(m->boot_selection_crit, 0, sizeof(m->boot_selection_crit));
|
||||
|
||||
#ifdef Xorriso_with_isohybriD
|
||||
m->boot_image_isohybrid= 1;
|
||||
#else
|
||||
m->boot_image_isohybrid= 0;
|
||||
#endif
|
||||
|
||||
m->boot_efi_default= 0;
|
||||
m->system_area_disk_path[0]= 0;
|
||||
m->system_area_options= 0;
|
||||
m->patch_system_area= 0;
|
||||
m->partition_offset= 0;
|
||||
m->partition_secs_per_head= 0;
|
||||
m->partition_heads_per_cyl= 0;
|
||||
for(i= 0; i < Xorriso_max_appended_partitionS; i++) {
|
||||
m->appended_partitions[i]= NULL;
|
||||
m->appended_part_types[i]= 0;
|
||||
}
|
||||
m->ascii_disc_label[0]= 0;
|
||||
m->vol_creation_time= 0;
|
||||
m->vol_modification_time= 0;
|
||||
m->vol_expiration_time= 0;
|
||||
m->vol_effective_time= 0;
|
||||
m->vol_uuid[0]= 0;
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
m->libjte_handle= NULL;
|
||||
#endif
|
||||
|
||||
m->jigdo_params= NULL;
|
||||
m->jigdo_values= NULL;
|
||||
m->libjte_params_given= 0;
|
||||
m->loaded_boot_bin_lba= 0;
|
||||
m->loaded_boot_cat_path[0]= 0;
|
||||
m->allow_graft_points= 0;
|
||||
m->allow_restore= 0;
|
||||
m->do_concat_split= 1;
|
||||
m->do_auto_chmod= 0;
|
||||
m->do_restore_sort_lba= 0;
|
||||
m->do_strict_acl= 0;
|
||||
m->dialog= 0;
|
||||
m->bsl_interpretation= 0;
|
||||
m->search_mode= 0;
|
||||
m->structured_search= 1;
|
||||
m->do_iso_rr_pattern= 1;
|
||||
m->do_disk_pattern= 2;
|
||||
m->temp_mem_limit= 16*1024*1024;
|
||||
m->file_size_limit= Xorriso_default_file_size_limiT;
|
||||
m->disk_exclusions= NULL;
|
||||
m->iso_rr_hidings= NULL;
|
||||
m->joliet_hidings= NULL;
|
||||
m->disk_excl_mode= 1;
|
||||
m->use_stdin= 0;
|
||||
m->result_page_length= 0;
|
||||
m->result_page_width= 80;
|
||||
m->mark_text[0]= 0;
|
||||
m->packet_output= 0;
|
||||
for(i=0; i<4; i++) {
|
||||
m->logfile[i][0]= 0;
|
||||
m->logfile_fp[i]= NULL;
|
||||
}
|
||||
m->pktlog_fp= NULL;
|
||||
for(i= 0; i < Xorriso_max_outlist_stacK; i++) {
|
||||
m->result_msglists[i]= NULL;
|
||||
m->info_msglists[i]= NULL;
|
||||
m->msglist_flags[i]= 0;
|
||||
}
|
||||
m->msglist_stackfill= 0;
|
||||
m->status_history_max= Xorriso_status_history_maX;
|
||||
m->scsi_log= 0;
|
||||
strcpy(m->report_about_text, "UPDATE");
|
||||
Xorriso__text_to_sev(m->report_about_text, &m->report_about_severity, 0);
|
||||
m->library_msg_direct_print= 0;
|
||||
strcpy(m->abort_on_text,"FAILURE");
|
||||
Xorriso__text_to_sev(m->abort_on_text, &m->abort_on_severity, 0);
|
||||
m->abort_on_is_default= 1;
|
||||
m->problem_status= 0;
|
||||
m->problem_status_text[0]= 0;
|
||||
m->errfile_log[0]= 0;
|
||||
m->errfile_mode= 0;
|
||||
m->errfile_fp= NULL;
|
||||
|
||||
m->img_read_error_mode= 1; /* abort faulty image reading with FAILURE */
|
||||
m->extract_error_mode= 1; /* keep extracted files after read error */
|
||||
strcpy(m->return_with_text, "SORRY");
|
||||
Xorriso__text_to_sev(m->return_with_text, &m->return_with_severity, 0);
|
||||
m->return_with_value= 32;
|
||||
m->eternal_problem_status= 0;
|
||||
m->eternal_problem_status_text[0]= 0;
|
||||
m->re= NULL;
|
||||
/* >>> ??? how to initialize m->match[0] ? */
|
||||
m->re_constants= NULL;
|
||||
m->re_count= 0;
|
||||
m->re_fill= 0;
|
||||
m->reg_expr[0]= 0;
|
||||
m->run_state= 0;
|
||||
m->is_dialog= 0;
|
||||
m->bar_is_fresh= 0;
|
||||
m->pending_option[0]= 0;
|
||||
m->request_to_abort= 0;
|
||||
m->request_not_to_ask= 0;
|
||||
m->idle_time= 0.0;
|
||||
m->re_failed_at= -1;
|
||||
m->prepended_wd= 0;
|
||||
m->insert_count= 0;
|
||||
m->insert_bytes= 0;
|
||||
m->error_count= 0;
|
||||
m->pacifier_style= 0;
|
||||
m->pacifier_interval= 1.0;
|
||||
m->pacifier_count= 0;
|
||||
m->pacifier_prev_count= 0;
|
||||
m->pacifier_total= 0;
|
||||
m->pacifier_byte_count= 0;
|
||||
m->pacifier_fifo= NULL;
|
||||
m->start_time= 0.0;
|
||||
m->last_update_time= 0.0;
|
||||
m->find_compare_result= 1;
|
||||
m->find_check_md5_result= 0;
|
||||
m->last_abort_file_time= 0.0;
|
||||
|
||||
m->node_counter= 0;
|
||||
m->node_array_size= 0;
|
||||
m->node_array= NULL;
|
||||
m->node_disk_prefixes= NULL;
|
||||
m->node_img_prefixes= NULL;
|
||||
|
||||
m->hln_count= 0;
|
||||
m->hln_array= NULL;
|
||||
m->hln_targets= NULL;
|
||||
m->hln_change_pending= 0;
|
||||
m->di_do_widen= NULL;
|
||||
m->di_disk_paths= NULL;
|
||||
m->di_iso_paths= NULL;
|
||||
|
||||
m->node_targets_availmem= 0;
|
||||
|
||||
m->di_count= 0;
|
||||
m->di_array= NULL;
|
||||
|
||||
m->perm_stack= NULL;
|
||||
|
||||
m->update_flags= 0;
|
||||
|
||||
m->result_line[0]= 0;
|
||||
m->result_line_counter= 0;
|
||||
m->result_page_counter= 0;
|
||||
m->result_open_line_len= 0;
|
||||
|
||||
m->info_text[0]= 0;
|
||||
|
||||
ret= Sfile_leafname(progname, leafname, 0);
|
||||
if(ret<=0)
|
||||
goto failure;
|
||||
if(strcmp(leafname, "osirrox")==0) {
|
||||
m->allow_restore= 1;
|
||||
m->drives_exclusive= 0;
|
||||
} else if(strcmp(leafname, "xorrisofs")==0 || strcmp(leafname, "genisofs")==0 ||
|
||||
strcmp(leafname, "mkisofs")==0 || strcmp(leafname, "genisoimage")==0) {
|
||||
m->argument_emulation= 1;
|
||||
m->pacifier_style= 1;
|
||||
Xorriso_protect_stdout(*xorriso, 0);
|
||||
} else if(strcmp(leafname, "xorrecord")==0 || strcmp(leafname, "wodim")==0 ||
|
||||
strcmp(leafname, "cdrecord")==0 || strcmp(leafname, "cdrskin")==0) {
|
||||
m->argument_emulation= 2;
|
||||
m->pacifier_style= 2;
|
||||
}
|
||||
ret= Exclusions_new(&(m->disk_exclusions), 0);
|
||||
if(ret<=0)
|
||||
goto failure;
|
||||
ret= Exclusions_new(&(m->iso_rr_hidings), 0);
|
||||
if(ret<=0)
|
||||
goto failure;
|
||||
ret= Exclusions_new(&(m->joliet_hidings), 0);
|
||||
if(ret<=0)
|
||||
goto failure;
|
||||
Xorriso_relax_compliance(m, "default", 0);
|
||||
ret= Xorriso_lst_new(&(m->drive_greylist), "/dev", m->drive_greylist, 1);
|
||||
if(ret <= 0)
|
||||
goto failure;
|
||||
Xorriso_preparer_string(m, m->preparer_id, 1); /* avoids library calls */
|
||||
|
||||
if(leafname != NULL)
|
||||
free(leafname);
|
||||
return(1);
|
||||
failure:;
|
||||
Xorriso_destroy(xorriso, 0);
|
||||
if(leafname != NULL)
|
||||
free(leafname);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_destroy_re(struct XorrisO *m, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(m->re!=NULL) {
|
||||
for(i=0;i<m->re_fill;i++) {
|
||||
if(m->re_constants!=NULL)
|
||||
if(m->re_constants[i]!=NULL)
|
||||
continue; /* ,->re[i] was never subject to regcomp() */
|
||||
regfree(&(m->re[i]));
|
||||
}
|
||||
free((char *) m->re);
|
||||
m->re= NULL;
|
||||
}
|
||||
|
||||
if(m->re_constants!=NULL) {
|
||||
for(i=0;i<m->re_fill;i++)
|
||||
if(m->re_constants[i]!=NULL)
|
||||
free(m->re_constants[i]);
|
||||
free((char *) m->re_constants);
|
||||
m->re_constants= NULL;
|
||||
}
|
||||
m->re_count= 0;
|
||||
m->re_fill= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= global shutdown of libraries */
|
||||
int Xorriso_destroy(struct XorrisO **xorriso, int flag)
|
||||
{
|
||||
struct XorrisO *m;
|
||||
int i;
|
||||
|
||||
m= *xorriso;
|
||||
if(m==NULL)
|
||||
return(0);
|
||||
|
||||
/* Give up drives and image to unref all connected xorriso objects */
|
||||
Xorriso_give_up_drive(m, 3);
|
||||
|
||||
if(m->in_charset!=NULL)
|
||||
free(m->in_charset);
|
||||
if(m->out_charset!=NULL)
|
||||
free(m->out_charset);
|
||||
Xorriso_destroy_re(m,0);
|
||||
Exclusions_destroy(&(m->disk_exclusions), 0);
|
||||
Exclusions_destroy(&(m->iso_rr_hidings), 0);
|
||||
Exclusions_destroy(&(m->joliet_hidings), 0);
|
||||
Xorriso_destroy_all_extf(m, 0);
|
||||
Xorriso_lst_destroy_all(&(m->drive_blacklist), 0);
|
||||
Xorriso_lst_destroy_all(&(m->drive_greylist), 0);
|
||||
Xorriso_lst_destroy_all(&(m->drive_whitelist), 0);
|
||||
Xorriso_destroy_node_array(m, 0);
|
||||
Xorriso_destroy_hln_array(m, 0);
|
||||
Xorriso_destroy_di_array(m, 0);
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
if(m->libjte_handle)
|
||||
libjte_destroy(&(m->libjte_handle));
|
||||
#endif
|
||||
|
||||
Xorriso_lst_destroy_all(&(m->jigdo_params), 0);
|
||||
Xorriso_lst_destroy_all(&(m->jigdo_values), 0);
|
||||
for(i= 0; i < Xorriso_max_appended_partitionS; i++)
|
||||
if(m->appended_partitions[i] != NULL)
|
||||
free(m->appended_partitions[i]);
|
||||
|
||||
Xorriso_detach_libraries(m, flag&1);
|
||||
|
||||
free((char *) m);
|
||||
*xorriso= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_destroy_node_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(xorriso->node_array != NULL) {
|
||||
for(i= 0; i < xorriso->node_counter; i++)
|
||||
iso_node_unref((IsoNode *) xorriso->node_array[i]);
|
||||
free(xorriso->node_array);
|
||||
}
|
||||
xorriso->node_array= NULL;
|
||||
xorriso->node_counter= xorriso->node_array_size= 0;
|
||||
Xorriso_lst_destroy_all(&(xorriso->node_disk_prefixes), 0);
|
||||
Xorriso_lst_destroy_all(&(xorriso->node_img_prefixes), 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not destroy hln_array but only hln_targets
|
||||
*/
|
||||
int Xorriso_destroy_hln_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
if(xorriso->hln_array != NULL && !(flag & 1)) {
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
iso_node_unref((IsoNode *) xorriso->hln_array[i]);
|
||||
free(xorriso->hln_array);
|
||||
xorriso->hln_array= NULL;
|
||||
xorriso->hln_count= 0;
|
||||
}
|
||||
if(xorriso->hln_targets != NULL) {
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
if(xorriso->hln_targets[i] != NULL)
|
||||
free(xorriso->hln_targets[i]);
|
||||
free(xorriso->hln_targets);
|
||||
xorriso->hln_targets= NULL;
|
||||
}
|
||||
xorriso->node_targets_availmem= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_destroy_di_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(xorriso->di_array != NULL) {
|
||||
for(i= 0; i < xorriso->di_count; i++)
|
||||
if(xorriso->di_array[i] != NULL)
|
||||
iso_node_unref((IsoNode *) xorriso->di_array[i]);
|
||||
free(xorriso->di_array);
|
||||
xorriso->di_array= NULL;
|
||||
}
|
||||
if(xorriso->di_do_widen != NULL) {
|
||||
free(xorriso->di_do_widen);
|
||||
xorriso->di_do_widen= NULL;
|
||||
}
|
||||
Xorriso_lst_destroy_all(&(xorriso->di_disk_paths), 0);
|
||||
Xorriso_lst_destroy_all(&(xorriso->di_iso_paths), 0);
|
||||
xorriso->di_count= 0;
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
fprintf(stderr, "xorriso_DEBUG: get_di_count= %lu\n",
|
||||
Xorriso_get_di_counteR);
|
||||
#endif /* NIX */
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_new_node_array(struct XorrisO *xorriso, off_t mem_limit,
|
||||
int addon_nodes, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(xorriso->node_counter <= 0)
|
||||
return(1);
|
||||
|
||||
xorriso->node_array= calloc(xorriso->node_counter + addon_nodes,
|
||||
sizeof(IsoNode *));
|
||||
if(xorriso->node_array == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
for(i= 0; i < xorriso->node_counter + addon_nodes; i++)
|
||||
xorriso->node_array[i]= NULL;
|
||||
xorriso->node_array_size= xorriso->node_counter + addon_nodes;
|
||||
xorriso->node_counter= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not allocate hln_array but only hln_targets
|
||||
*/
|
||||
int Xorriso_new_hln_array(struct XorrisO *xorriso, off_t mem_limit, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
Xorriso_destroy_hln_array(xorriso, flag & 1);
|
||||
if(xorriso->hln_count <= 0)
|
||||
return(1);
|
||||
|
||||
if(!(flag & 1)) {
|
||||
xorriso->hln_array= calloc(xorriso->hln_count, sizeof(char *));
|
||||
if(xorriso->hln_array == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
xorriso->hln_array[i]= NULL;
|
||||
}
|
||||
|
||||
xorriso->hln_targets= calloc(xorriso->hln_count, sizeof(char *));
|
||||
if(xorriso->hln_targets == NULL) {
|
||||
if(!(flag & 1)) {
|
||||
free(xorriso->hln_array);
|
||||
xorriso->hln_array= NULL;
|
||||
}
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
xorriso->hln_targets[i]= NULL;
|
||||
xorriso->node_targets_availmem= mem_limit
|
||||
- xorriso->hln_count * sizeof(void *)
|
||||
- xorriso->hln_count * sizeof(char *);
|
||||
if(xorriso->node_targets_availmem < 0)
|
||||
xorriso->node_targets_availmem= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__preset_signal_behavior(int behavior, int flag)
|
||||
{
|
||||
if(behavior < 0 || behavior > 3)
|
||||
return(0);
|
||||
Xorriso_signal_behavioR= behavior;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__get_signal_behavior(int flag)
|
||||
{
|
||||
return(Xorriso_signal_behavioR);
|
||||
}
|
||||
|
31
libisoburn/branches/1.2.2/xorriso/base_obj.h
Normal file
31
libisoburn/branches/1.2.2/xorriso/base_obj.h
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which perform the
|
||||
fundamental operations of the XorrisO object.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_base_obj_includeD
|
||||
#define Xorriso_pvt_base_obj_includeD yes
|
||||
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
unsigned long Xorriso_get_di_counteR= 0;
|
||||
#endif /* NIX */
|
||||
|
||||
struct XorrisO;
|
||||
|
||||
|
||||
int Xorriso_destroy_re(struct XorrisO *m, int flag);
|
||||
|
||||
int Xorriso__get_signal_behavior(int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_base_obj_includeD */
|
||||
|
12656
libisoburn/branches/1.2.2/xorriso/changelog.txt
Normal file
12656
libisoburn/branches/1.2.2/xorriso/changelog.txt
Normal file
File diff suppressed because it is too large
Load Diff
1115
libisoburn/branches/1.2.2/xorriso/check_media.c
Normal file
1115
libisoburn/branches/1.2.2/xorriso/check_media.c
Normal file
File diff suppressed because it is too large
Load Diff
181
libisoburn/branches/1.2.2/xorriso/check_media.h
Normal file
181
libisoburn/branches/1.2.2/xorriso/check_media.h
Normal file
@ -0,0 +1,181 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of classes SpotlistiteM, SpotlisT,
|
||||
SectorbitmaP, CheckmediajoB which represent media checks and their outcome.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_check_includeD
|
||||
#define Xorriso_pvt_check_includeD yes
|
||||
|
||||
struct SpotlisT; /* List of intervals with different read qualities */
|
||||
struct CheckmediajoB; /* Parameters for Xorriso_check_media() */
|
||||
|
||||
int Xorriso_check_media_setup_job(struct XorrisO *xorriso,
|
||||
struct CheckmediajoB *job,
|
||||
char **argv, int old_idx, int end_idx, int flag);
|
||||
|
||||
int Xorriso_sectormap_to_spotlist(struct XorrisO *xorriso,
|
||||
struct CheckmediajoB *job,
|
||||
struct SpotlisT **spotlist,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= mark untested areas as valid
|
||||
*/
|
||||
int Xorriso_spotlist_to_sectormap(struct XorrisO *xorriso,
|
||||
struct SpotlisT *spotlist,
|
||||
int read_chunk,
|
||||
struct SectorbitmaP **map,
|
||||
int flag);
|
||||
|
||||
/* Opens the -check_media data copy in for reading and writing
|
||||
*/
|
||||
int Xorriso_open_job_data_to(struct XorrisO *xorriso,
|
||||
struct CheckmediajoB *job, int flag);
|
||||
|
||||
/* @param report Buffer of at least 10*SfileadrL
|
||||
@param flag bit0= only report non-default settings
|
||||
@return <=0 error , 1 ok , 2 with bit0: every option is on default setting
|
||||
*/
|
||||
int Xorriso_check_media_list_job(struct XorrisO *xorriso,
|
||||
struct CheckmediajoB *job,
|
||||
char *report, int flag);
|
||||
|
||||
int Xorriso_update_in_sector_map(struct XorrisO *xorriso,
|
||||
struct SpotlisT *spotlist, int read_chunk,
|
||||
struct CheckmediajoB *job, int flag);
|
||||
|
||||
|
||||
/* Distiniction between valid and invalid sectors */
|
||||
struct SectorbitmaP {
|
||||
int sectors;
|
||||
int sector_size;
|
||||
unsigned char *map;
|
||||
int map_size;
|
||||
};
|
||||
|
||||
int Spotlist_new(struct SpotlisT **o, int flag);
|
||||
|
||||
int Spotlist_destroy(struct SpotlisT **o, int flag);
|
||||
|
||||
int Spotlist_add_item(struct SpotlisT *o, int start_lba, int blocks,
|
||||
int quality, int flag);
|
||||
|
||||
int Spotlist_count(struct SpotlisT *o, int flag);
|
||||
|
||||
int Spotlist_block_count(struct SpotlisT *o, int flag);
|
||||
|
||||
int Spotlist_sector_size(struct SpotlisT *o, int read_chunk, int flag);
|
||||
|
||||
int Spotlist_get_item(struct SpotlisT *o, int idx,
|
||||
int *start_lba, int *blocks, int *quality, int flag);
|
||||
|
||||
char *Spotlist__quality_name(int quality, char name[80], int bad_limit,
|
||||
int flag);
|
||||
|
||||
|
||||
#define Xorriso_read_quality_gooD 0x7fffffff
|
||||
#define Xorriso_read_quality_md5_matcH 0x70000000
|
||||
#define Xorriso_read_quality_sloW 0x60000000
|
||||
#define Xorriso_read_quality_partiaL 0x50000000
|
||||
#define Xorriso_read_quality_valiD 0x40000000
|
||||
#define Xorriso_read_quality_untesteD 0x3fffffff
|
||||
#define Xorriso_read_quality_invaliD 0x3ffffffe
|
||||
#define Xorriso_read_quality_tao_enD 0x28000000
|
||||
#define Xorriso_read_quality_off_tracK 0x20000000
|
||||
#define Xorriso_read_quality_md5_mismatcH 0x10000000
|
||||
#define Xorriso_read_quality_unreadablE 0x00000000
|
||||
|
||||
|
||||
struct CheckmediajoB {
|
||||
int use_dev; /* 0= use indev , 1= use outdev , 2= use sector map*/
|
||||
|
||||
int min_lba; /* if >=0 : begin checking at this address */
|
||||
int max_lba; /* if >=0 : read up to this address, else use mode */
|
||||
|
||||
int min_block_size; /* granularity desired by user
|
||||
*/
|
||||
int mode; /* 0= track by track
|
||||
1= single sweep over libisoburn medium capacity
|
||||
2= single sweep over libburn medium capacity
|
||||
*/
|
||||
time_t start_time;
|
||||
int time_limit; /* Number of seconds after which to abort */
|
||||
|
||||
int item_limit; /* Maximum number of medium check list items as result */
|
||||
|
||||
char abort_file_path[SfileadrL];
|
||||
|
||||
char data_to_path[SfileadrL];
|
||||
int data_to_fd;
|
||||
off_t data_to_offset; /* usually 0 with image copy, negative with file copy */
|
||||
off_t data_to_limit; /* used with file copy */
|
||||
int patch_lba0;
|
||||
int patch_lba0_msc1;
|
||||
|
||||
char sector_map_path[SfileadrL];
|
||||
struct SectorbitmaP *sector_map;
|
||||
int map_with_volid; /* 0=add quick toc to map file,
|
||||
1=read ISO heads for toc
|
||||
*/
|
||||
|
||||
int retry; /* -1= only try full read_chunk, 1=retry with 2k blocks
|
||||
0= retry with CD, full chunk else
|
||||
*/
|
||||
|
||||
int report_mode; /* 0= print MCL items
|
||||
1= print damaged files
|
||||
*/
|
||||
|
||||
char event_severity[20]; /* If not "ALL": trigger event of given severity
|
||||
at the end of a check job if bad blocks were
|
||||
discovered.
|
||||
*/
|
||||
|
||||
double slow_threshold_seq; /* Time limit in seconds for the decision whether
|
||||
a read operation is considered slow. This does
|
||||
not apply to thr first read of an interval.
|
||||
*/
|
||||
|
||||
int untested_valid; /* 1= mark untested data blocks as valid when calling
|
||||
Xorriso_spotlist_to_sectormap()
|
||||
*/
|
||||
};
|
||||
|
||||
int Checkmediajob_new(struct CheckmediajoB **o, int flag);
|
||||
|
||||
int Checkmediajob_destroy(struct CheckmediajoB **o, int flag);
|
||||
|
||||
int Checkmediajob_copy(struct CheckmediajoB *from, struct CheckmediajoB *to,
|
||||
int flag);
|
||||
|
||||
int Sectorbitmap_new(struct SectorbitmaP **o, int sectors, int sector_size,
|
||||
int flag);
|
||||
int Sectorbitmap_destroy(struct SectorbitmaP **o, int flag);
|
||||
int Sectorbitmap_from_file(struct SectorbitmaP **o, char *path, char *msg,
|
||||
int *os_errno, int flag);
|
||||
int Sectorbitmap_to_file(struct SectorbitmaP *o, char *path, char *info,
|
||||
char *msg, int *os_errno, int flag);
|
||||
int Sectorbitmap_set(struct SectorbitmaP *o, int sector, int flag);
|
||||
int Sectorbitmap_set_range(struct SectorbitmaP *o,
|
||||
int start_sector, int sectors, int flag);
|
||||
int Sectorbitmap_is_set(struct SectorbitmaP *o, int sector, int flag);
|
||||
int Sectorbitmap_bytes_are_set(struct SectorbitmaP *o,
|
||||
off_t start_byte, off_t end_byte, int flag);
|
||||
|
||||
int Sectorbitmap_get_layout(struct SectorbitmaP *o,
|
||||
int *sectors, int *sector_size, int flag);
|
||||
|
||||
int Sectorbitmap_copy(struct SectorbitmaP *from, struct SectorbitmaP *to,
|
||||
int flag);
|
||||
|
||||
int Sectorbitmap_clone(struct SectorbitmaP *from, struct SectorbitmaP **clone,
|
||||
int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_check_includeD */
|
||||
|
1013
libisoburn/branches/1.2.2/xorriso/cmp_update.c
Normal file
1013
libisoburn/branches/1.2.2/xorriso/cmp_update.c
Normal file
File diff suppressed because it is too large
Load Diff
45
libisoburn/branches/1.2.2/xorriso/cmp_update.h
Normal file
45
libisoburn/branches/1.2.2/xorriso/cmp_update.h
Normal file
@ -0,0 +1,45 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of class DirseQ which
|
||||
crawls along a directory's content list.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_cmp_includeD
|
||||
#define Xorriso_pvt_cmp_includeD yes
|
||||
|
||||
int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
||||
char *iso_adr, char *adr_common_tail,
|
||||
int *result, int flag);
|
||||
|
||||
int Xorriso_pfx_disk_path(struct XorrisO *xorriso, char *iso_path,
|
||||
char *iso_prefix, char *disk_prefix,
|
||||
char disk_path[SfileadrL], int flag);
|
||||
|
||||
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
@param node Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
@param flag bit0= update rather than compare
|
||||
*/
|
||||
int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter, void *node,
|
||||
char *iso_path, char *iso_prefix, char *disk_prefix,
|
||||
int flag);
|
||||
|
||||
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
@param @node Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
*/
|
||||
int Xorriso_update_interpreter(struct XorrisO *xorriso,
|
||||
void *boss_iter, void *node,
|
||||
int compare_result, char *disk_path,
|
||||
char *iso_rr_path, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_cmp_includeD */
|
||||
|
218
libisoburn/branches/1.2.2/xorriso/compile_xorriso.sh
Executable file
218
libisoburn/branches/1.2.2/xorriso/compile_xorriso.sh
Executable file
@ -0,0 +1,218 @@
|
||||
#!/bin/sh
|
||||
|
||||
# compile_xorriso.sh
|
||||
# Copyright 2005 - 2010 Thomas Schmitt, scdbackup@gmx.net, GPL version 2
|
||||
#
|
||||
# Not intended for general use in production installations !
|
||||
# Rather use: ./bootstrap ; ./configure ; make
|
||||
#
|
||||
# This is a development tool which expects a special setup of directories
|
||||
# on a Linux system (e.g. SuSE 10.2).
|
||||
# It is to be executed in a common parent of the directories given with
|
||||
# $isofs $isoburn $burn $xorr
|
||||
|
||||
isofs=./nglibisofs-develop/libisofs/libisofs_libisofs_la-
|
||||
isofs_filter=./nglibisofs-develop/libisofs/filters/libisofs_libisofs_la-
|
||||
burn=./libburn-develop/libburn
|
||||
isoburn=./libisoburn-develop/libisoburn
|
||||
xorr=./libisoburn-develop/xorriso
|
||||
|
||||
debug_opts="-O2"
|
||||
def_opts="-DXorriso_allow_external_filterS"
|
||||
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
|
||||
do_strip=0
|
||||
static_opts=
|
||||
warn_opts="-Wall -Wextra -Wno-unused-parameter"
|
||||
# warn_opts="-Wall -Wsign-compare"
|
||||
nglibisofs=1
|
||||
def_have="-DHAVE_STDINT_H"
|
||||
def_libreadline="-DXorriso_with_readlinE"
|
||||
def_libjte="-DXorriso_with_libjtE -DLibisofs_with_libjtE"
|
||||
link_libreadline="-lreadline"
|
||||
link_libcdio=
|
||||
link_libjte="-ljte"
|
||||
|
||||
for i in "$@"
|
||||
do
|
||||
if test "$i" = "-do_diet"
|
||||
then
|
||||
def_opts="$def_opts -DXorriso_no_helP"
|
||||
warn_opts=
|
||||
elif test "$i" = "-do_strip"
|
||||
then
|
||||
do_strip=1
|
||||
elif test "$i" = "-g"
|
||||
then
|
||||
debug_opts="-g -O0"
|
||||
elif test "$i" = "-no_libreadline"
|
||||
then
|
||||
def_libreadline=""
|
||||
link_libreadline=""
|
||||
elif test "$i" = "-dvd_obs_64k"
|
||||
then
|
||||
def_opts="$def_opts -DXorriso_dvd_obs_default_64K"
|
||||
elif test "$i" = "-use_libcdio"
|
||||
then
|
||||
link_libcdio="-lcdio"
|
||||
elif test "$i" = "-no_libjte"
|
||||
then
|
||||
def_libjte=""
|
||||
link_libjte=""
|
||||
elif test "$i" = "-help" -o "$i" = "--help" -o "$i" = "-h"
|
||||
then
|
||||
echo \
|
||||
"$xorr/compile_xorriso.sh : to be executed above top level directories"
|
||||
echo "Options:"
|
||||
echo " -dvd_obs_64k 64 KB default size for DVD/BD writing."
|
||||
echo " -no_libreadline do not compile for and link with libreadline."
|
||||
echo " -use_libcdio link with -lcdio because libburn uses it."
|
||||
echo " -no_libjte do not compile for and link with libjte."
|
||||
echo " -do_diet produce capability reduced lean version."
|
||||
echo " -do_strip apply program strip to compiled programs."
|
||||
echo " -g produce debuggable programm."
|
||||
echo " -static compile with cc option -static."
|
||||
exit 0
|
||||
elif test "$i" = "-static"
|
||||
then
|
||||
static_opts="-static"
|
||||
fi
|
||||
done
|
||||
|
||||
libisofs=
|
||||
libisofs="$libisofs $isofs"buffer.o
|
||||
libisofs="$libisofs $isofs"builder.o
|
||||
libisofs="$libisofs $isofs"data_source.o
|
||||
libisofs="$libisofs $isofs"ecma119.o
|
||||
libisofs="$libisofs $isofs"ecma119_tree.o
|
||||
libisofs="$libisofs $isofs"eltorito.o
|
||||
libisofs="$libisofs $isofs"filesrc.o
|
||||
libisofs="$libisofs $isofs"fs_image.o
|
||||
libisofs="$libisofs $isofs"fs_local.o
|
||||
libisofs="$libisofs $isofs"fsource.o
|
||||
libisofs="$libisofs $isofs"image.o
|
||||
libisofs="$libisofs $isofs"iso1999.o
|
||||
libisofs="$libisofs $isofs"joliet.o
|
||||
libisofs="$libisofs $isofs"libiso_msgs.o
|
||||
libisofs="$libisofs $isofs"messages.o
|
||||
libisofs="$libisofs $isofs"node.o
|
||||
libisofs="$libisofs $isofs"rockridge.o
|
||||
libisofs="$libisofs $isofs"rockridge_read.o
|
||||
libisofs="$libisofs $isofs"stream.o
|
||||
libisofs="$libisofs $isofs"tree.o
|
||||
libisofs="$libisofs $isofs"util.o
|
||||
libisofs="$libisofs $isofs"util_htable.o
|
||||
libisofs="$libisofs $isofs"util_rbtree.o
|
||||
libisofs="$libisofs $isofs"system_area.o
|
||||
libisofs="$libisofs $isofs"make_isohybrid_mbr.o
|
||||
libisofs="$libisofs $isofs"aaip_0_2.o
|
||||
libisofs="$libisofs $isofs"filter.o
|
||||
libisofs="$libisofs $isofs_filter"external.o
|
||||
libisofs="$libisofs $isofs_filter"zisofs.o
|
||||
libisofs="$libisofs $isofs_filter"gzip.o
|
||||
libisofs="$libisofs $isofs"md5.o
|
||||
|
||||
echo "Version timestamp : $(sed -e 's/#define Xorriso_timestamP "//' -e 's/"$//' "$xorr"/xorriso_timestamp.h)"
|
||||
|
||||
date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >"$xorr"/xorriso_buildstamp.h
|
||||
echo "Build timestamp : $(sed -e 's/#define Xorriso_build_timestamP "//' -e 's/"$//' "$xorr"/xorriso_buildstamp.h)"
|
||||
|
||||
echo "compiling program $xorr/xorriso.c $static_opts $debug_opts $def_opts $link_libcdio"
|
||||
cc -I. -DXorriso_with_maiN $def_have $def_libreadline $def_libjte \
|
||||
$warn_opts \
|
||||
$static_opts \
|
||||
$debug_opts \
|
||||
$def_opts \
|
||||
$largefile_opts \
|
||||
\
|
||||
-o "$xorr"/xorriso \
|
||||
\
|
||||
"$xorr"/xorriso_main.c \
|
||||
"$xorr"/sfile.c \
|
||||
"$xorr"/aux_objects.c \
|
||||
"$xorr"/findjob.c \
|
||||
"$xorr"/check_media.c \
|
||||
"$xorr"/misc_funct.c \
|
||||
"$xorr"/text_io.c \
|
||||
"$xorr"/match.c \
|
||||
"$xorr"/emulators.c \
|
||||
"$xorr"/disk_ops.c \
|
||||
"$xorr"/cmp_update.c \
|
||||
"$xorr"/parse_exec.c \
|
||||
"$xorr"/opts_a_c.c \
|
||||
"$xorr"/opts_d_h.c \
|
||||
"$xorr"/opts_i_o.c \
|
||||
"$xorr"/opts_p_z.c \
|
||||
\
|
||||
"$xorr"/base_obj.c \
|
||||
"$xorr"/lib_mgt.c \
|
||||
"$xorr"/sort_cmp.c \
|
||||
"$xorr"/drive_mgt.c \
|
||||
"$xorr"/iso_img.c \
|
||||
"$xorr"/iso_tree.c \
|
||||
"$xorr"/iso_manip.c \
|
||||
"$xorr"/write_run.c \
|
||||
"$xorr"/read_run.c \
|
||||
"$xorr"/filters.c \
|
||||
\
|
||||
"$isoburn"/isoburn.c \
|
||||
"$isoburn"/burn_wrap.c \
|
||||
"$isoburn"/data_source.c \
|
||||
"$isoburn"/isofs_wrap.c \
|
||||
\
|
||||
"$burn"/async.o \
|
||||
"$burn"/debug.o \
|
||||
"$burn"/drive.o \
|
||||
"$burn"/file.o \
|
||||
"$burn"/init.o \
|
||||
"$burn"/options.o \
|
||||
"$burn"/source.o \
|
||||
"$burn"/structure.o \
|
||||
\
|
||||
"$burn"/sg.o \
|
||||
"$burn"/write.o \
|
||||
"$burn"/read.o \
|
||||
"$burn"/libdax_audioxtr.o \
|
||||
"$burn"/libdax_msgs.o \
|
||||
"$burn"/cleanup.o \
|
||||
"$burn"/cdtext.o \
|
||||
\
|
||||
"$burn"/mmc.o \
|
||||
"$burn"/sbc.o \
|
||||
"$burn"/spc.o \
|
||||
"$burn"/util.o \
|
||||
\
|
||||
"$burn"/sector.o \
|
||||
"$burn"/toc.o \
|
||||
\
|
||||
"$burn"/crc.o \
|
||||
"$burn"/ecma130ab.o \
|
||||
\
|
||||
$libisofs \
|
||||
\
|
||||
$link_libreadline \
|
||||
$link_libcdio \
|
||||
$link_libjte \
|
||||
\
|
||||
-lpthread \
|
||||
-lacl \
|
||||
-lz
|
||||
|
||||
ret=$?
|
||||
if test "$ret" = 0
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo >&2
|
||||
echo "+++ FATAL : Compilation of xorriso failed" >&2
|
||||
echo >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
if test "$do_strip" = 1
|
||||
then
|
||||
echo "stripping result $xorr/xorriso"
|
||||
strip "$xorr"/xorriso
|
||||
fi
|
||||
|
||||
echo 'done.'
|
441
libisoburn/branches/1.2.2/xorriso/configure_ac.txt
Normal file
441
libisoburn/branches/1.2.2/xorriso/configure_ac.txt
Normal file
@ -0,0 +1,441 @@
|
||||
|
||||
# configure.ac stems from xorriso/configure_ac.txt and leads to ./configure
|
||||
# Copyright (c) 2007 - 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
# Provided under GPL version 2 or later.
|
||||
|
||||
AC_INIT([xorriso], [1.2.1], [http://libburnia-project.org])
|
||||
AC_PREREQ([2.50])
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
AC_CANONICAL_TARGET
|
||||
|
||||
LIBBURNIA_SET_FLAGS
|
||||
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
AC_CONFIG_MACRO_DIR([./])
|
||||
|
||||
dnl Let autoheader produce config.h.in and let configure produce config.h
|
||||
dnl This saves about 500 characters of compile message per source file.
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
||||
AH_TEMPLATE([Xorriso_standalonE], [Define to prepare sources for statically linked xorriso])
|
||||
AC_DEFINE([Xorriso_standalonE], [])
|
||||
|
||||
BURN_MAJOR_VERSION=1
|
||||
BURN_MINOR_VERSION=2
|
||||
BURN_MICRO_VERSION=1
|
||||
AC_SUBST(BURN_MAJOR_VERSION)
|
||||
AC_SUBST(BURN_MINOR_VERSION)
|
||||
AC_SUBST(BURN_MICRO_VERSION)
|
||||
|
||||
LIBISOFS_MAJOR_VERSION=1
|
||||
LIBISOFS_MINOR_VERSION=2
|
||||
LIBISOFS_MICRO_VERSION=1
|
||||
AC_SUBST(LIBISOFS_MAJOR_VERSION)
|
||||
AC_SUBST(LIBISOFS_MINOR_VERSION)
|
||||
AC_SUBST(LIBISOFS_MICRO_VERSION)
|
||||
|
||||
dnl The API version codes are defined in libisoburn/libisoburn.h
|
||||
dnl #define isoburn_header_version_*
|
||||
|
||||
|
||||
AC_PREFIX_DEFAULT([/usr/local])
|
||||
test "$prefix" = "NONE" && prefix=$ac_default_prefix
|
||||
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
AM_PROG_CC_C_O
|
||||
AC_C_CONST
|
||||
AC_C_INLINE
|
||||
AC_C_BIGENDIAN
|
||||
|
||||
dnl Large file support
|
||||
AC_SYS_LARGEFILE
|
||||
AC_FUNC_FSEEKO
|
||||
AC_CHECK_FUNC([fseeko])
|
||||
if test ! $ac_cv_func_fseeko; then
|
||||
AC_ERROR([Libburn requires largefile support.])
|
||||
fi
|
||||
|
||||
AH_TEMPLATE([ICONV_CONST], [Whether to apply const qualifier to iconv inbuf])
|
||||
if test x$XORRISO_OLD_ICONV_CONFIGURE = x
|
||||
then
|
||||
|
||||
dnl ts B00410 : To detect the need for -liconv and const argument of iconv()
|
||||
LIBBURNIA_CHECK_ICONV
|
||||
dnl ts B00411 : To abort configuration if iconv() still cannot be compiled
|
||||
LIBBURNIA_ASSERT_ICONV
|
||||
|
||||
else
|
||||
|
||||
dnl Outdated: produces double -liconv and warnings about parameter mismatch
|
||||
dnl If iconv(3) is in an extra libiconv, then it gets added to variable LIBS.
|
||||
dnl If not, then no -liconv will be added.
|
||||
AC_CHECK_LIB(iconv, iconv, , )
|
||||
dnl GNU iconv has no function iconv() but libiconv() and a macro iconv()
|
||||
AC_CHECK_LIB(iconv, libiconv, , )
|
||||
|
||||
fi
|
||||
|
||||
AC_PROG_LIBTOOL
|
||||
AC_SUBST(LIBTOOL_DEPS)
|
||||
LIBTOOL="$LIBTOOL --silent"
|
||||
|
||||
AC_PROG_INSTALL
|
||||
|
||||
AC_CHECK_HEADERS()
|
||||
|
||||
AC_CHECK_MEMBER([struct tm.tm_gmtoff],
|
||||
[AC_DEFINE(HAVE_TM_GMTOFF, 1,
|
||||
[Define this if tm structure includes a tm_gmtoff entry.])],
|
||||
,
|
||||
[#include <time.h>])
|
||||
|
||||
dnl Check if non standard timegm() function is available
|
||||
AC_CHECK_DECL([timegm],
|
||||
[AC_DEFINE(HAVE_TIMEGM, 1, [Define this if timegm function is available])],
|
||||
,
|
||||
[#include <time.h>])
|
||||
|
||||
dnl Check if non standard eaccess() function is available
|
||||
AC_CHECK_DECL([eaccess],
|
||||
[AC_DEFINE(HAVE_EACCESS, 1, [Define this if eaccess function is available])],
|
||||
,
|
||||
[#include <unistd.h>])
|
||||
|
||||
THREAD_LIBS=-lpthread
|
||||
AC_SUBST(THREAD_LIBS)
|
||||
|
||||
TARGET_SHIZZLE
|
||||
AC_SUBST(ARCH)
|
||||
AC_SUBST(LIBBURNIA_PKGCONFDIR)
|
||||
AC_SUBST(LIBBURN_ARCH_LIBS)
|
||||
|
||||
dnl Check the preconditions for using statvfs() in sg-dummy
|
||||
dnl (sg-linux and sg-freebsd use statvfs() unconditionally)
|
||||
AH_TEMPLATE([Libburn_os_has_statvfS], [Define to use statvfs() with libburn stdio])
|
||||
STATVFS_DEF=-DLibburn_os_has_statvfS
|
||||
AC_CHECK_HEADER(sys/statvfs.h, X=, STATVFS_DEF=)
|
||||
AC_CHECK_FUNC([statvfs], X=, STATVFS_DEF=)
|
||||
if test x$STATVFS_DEF = x-DLibburn_os_has_statvfS
|
||||
then
|
||||
AC_DEFINE([Libburn_os_has_statvfS], [])
|
||||
fi
|
||||
|
||||
|
||||
dnl Add compiler-specific flags
|
||||
|
||||
dnl See if the user wants aggressive optimizations of the code
|
||||
AC_ARG_ENABLE(debug,
|
||||
[ --enable-debug Disable aggressive optimizations [default=yes]],
|
||||
, enable_debug=yes)
|
||||
if test x$enable_debug != xyes; then
|
||||
if test x$GCC = xyes; then
|
||||
CFLAGS="-O3 $CFLAGS"
|
||||
CFLAGS="-fexpensive-optimizations $CFLAGS"
|
||||
fi
|
||||
CFLAGS="-DNDEBUG $CFLAGS"
|
||||
else
|
||||
if test x$GCC = xyes; then
|
||||
CFLAGS="-g -pedantic -Wall -Wextra -Wno-unused-parameter $CFLAGS"
|
||||
fi
|
||||
CFLAGS="-DDEBUG $CFLAGS"
|
||||
fi
|
||||
|
||||
|
||||
dnl Determine target directory for libisoburn-*.pc
|
||||
dnl Important: Must be performed _after_ TARGET_SHIZZLE
|
||||
dnl
|
||||
LIBBURNIA_SET_PKGCONFIG
|
||||
|
||||
|
||||
AH_TEMPLATE([Xorriso_with_readlinE], [Define to use libreadline])
|
||||
AC_ARG_ENABLE(libreadline,
|
||||
[ --enable-libreadline Enable use of libreadline by xorriso, default=yes],
|
||||
, enable_libreadline=yes)
|
||||
if test x$enable_libreadline = xyes; then
|
||||
dnl Check whether there is readline-devel and readline-runtime.
|
||||
dnl If not, erase this macro which would enable use of readline(),add_history()
|
||||
READLINE_DEF="-DXorriso_with_readlinE"
|
||||
|
||||
if test x$XORRISO_OLD_READLINE_CONFIGURE = x
|
||||
then
|
||||
|
||||
dnl ts B00411 : To disable readline if not all needed functions are present
|
||||
LIBBURNIA_ASSERT_READLINE
|
||||
|
||||
else
|
||||
dnl The empty yes case obviously causes -lreadline to be linked
|
||||
AC_CHECK_HEADER(readline/readline.h, AC_CHECK_LIB(readline, readline, , READLINE_DEF= ), READLINE_DEF= )
|
||||
dnl The X= in the yes case prevents that -lreadline gets linked twice
|
||||
AC_CHECK_HEADER(readline/history.h, AC_CHECK_LIB(readline, add_history, X= , READLINE_DEF= ), READLINE_DEF= )
|
||||
|
||||
fi
|
||||
else
|
||||
READLINE_DEF=
|
||||
fi
|
||||
if test x$READLINE_DEF = x-DXorriso_with_readlinE
|
||||
then
|
||||
AC_DEFINE([Xorriso_with_readlinE], [])
|
||||
fi
|
||||
|
||||
AH_TEMPLATE([Libisofs_with_aaip_acL], [Define to use ACL capabilities])
|
||||
AC_ARG_ENABLE(libacl,
|
||||
[ --enable-libacl Enable use of ACL functions by libisofs, default=yes],
|
||||
, enable_libacl=yes)
|
||||
if test x$enable_libacl = xyes; then
|
||||
dnl Check whether there is libacl-devel and libacl-runtime.
|
||||
dnl If not, erase this macro which would enable use of acl_to_text and others
|
||||
LIBACL_DEF="-DLibisofs_with_aaip_acL"
|
||||
dnl The empty yes case obviously causes -lacl to be linked
|
||||
has_acl_h_but_no_func=0
|
||||
AC_CHECK_HEADER(sys/acl.h, AC_CHECK_LIB(acl, acl_to_text, , has_acl_h_but_no_libacl=1 ), LIBACL_DEF= )
|
||||
if test "$has_acl_h_but_no_libacl" = 1
|
||||
then
|
||||
AC_CHECK_LIB(c, acl_to_text, X= , LIBACL_DEF= )
|
||||
fi
|
||||
else
|
||||
LIBACL_DEF=
|
||||
fi
|
||||
if test x$LIBACL_DEF = x-DLibisofs_with_aaip_acL
|
||||
then
|
||||
AC_DEFINE([Libisofs_with_aaip_acL], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Libisofs_with_aaip_xattR], [Define to use xattr capabilities])
|
||||
AH_TEMPLATE([Libisofs_with_freebsd_extattR], [Define to use extattr capabilities])
|
||||
AC_ARG_ENABLE(xattr,
|
||||
[ --enable-xattr Enable use of xattr by libisofs, default=yes],
|
||||
, enable_xattr=yes)
|
||||
if test x$enable_xattr = xyes; then
|
||||
dnl Check whether there is the header for GNU/Linux xattr.
|
||||
dnl If not, erase this macro which would enable use of listxattr and others
|
||||
XATTR_DEF="-DLibisofs_with_aaip_xattR"
|
||||
AC_CHECK_HEADER(attr/xattr.h, AC_CHECK_LIB(c, listxattr, X= , XATTR_DEF= ), XATTR_DEF= )
|
||||
if test "x$XATTR_DEF" = x
|
||||
then
|
||||
XATTR_DEF="-DLibisofs_with_freebsd_extattR"
|
||||
AC_CHECK_HEADER(sys/extattr.h, AC_CHECK_LIB(c, extattr_list_file, X=, XATTR_DEF= ), XATTR_DEF= )
|
||||
fi
|
||||
else
|
||||
XATTR_DEF=
|
||||
fi
|
||||
if test x$XATTR_DEF = x-DLibisofs_with_aaip_xattR
|
||||
then
|
||||
AC_DEFINE([Libisofs_with_aaip_xattR], [])
|
||||
fi
|
||||
if test x$XATTR_DEF = x-DLibisofs_with_freebsd_extattR
|
||||
then
|
||||
AC_DEFINE([Libisofs_with_freebsd_extattR], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Libisofs_with_zliB], [Define to use compression via zlib])
|
||||
AH_TEMPLATE([LIBJTE_WITH_ZLIB], [Allow libjte to use zlib])
|
||||
AC_ARG_ENABLE(zlib,
|
||||
[ --enable-zlib Enable use of zlib by libisofs, default=yes],
|
||||
, enable_zlib=yes)
|
||||
if test x$enable_zlib = xyes; then
|
||||
dnl Check whether there is the header for zlib.
|
||||
dnl If not, erase this macro which would enable use of compress2() and others.
|
||||
dnl Linking fails on SuSE 9.0 because zlib has compress2() but lacks
|
||||
dnl compressBound(). So compressBound is the more modern thing to test.
|
||||
dnl The empty parameter after "compressBound" causes -lz.
|
||||
ZLIB_DEF=yes
|
||||
AC_CHECK_HEADER(zlib.h, AC_CHECK_LIB(z, compressBound, , ZLIB_DEF= ), ZLIB_DEF= )
|
||||
else
|
||||
ZLIB_DEF=
|
||||
fi
|
||||
if test x$ZLIB_DEF = xyes
|
||||
then
|
||||
AC_DEFINE([Libisofs_with_zliB], [])
|
||||
AC_DEFINE([LIBJTE_WITH_ZLIB], [])
|
||||
fi
|
||||
|
||||
|
||||
# libjte source is included in GNU xorriso. Enable it if zlib is enabled.
|
||||
AH_TEMPLATE([Xorriso_with_libjtE],
|
||||
[Define to use Jigdo Template Extraction via libjte])
|
||||
AH_TEMPLATE([Libisofs_with_libjtE],
|
||||
[Define to use Jigdo Template Extraction via libjte])
|
||||
if test x$ZLIB_DEF = xyes
|
||||
then
|
||||
AC_DEFINE([Xorriso_with_libjtE], [])
|
||||
AC_DEFINE([Libisofs_with_libjtE], [])
|
||||
LIBJTE_DEF=yes
|
||||
echo "enabled built-in libjte"
|
||||
else
|
||||
LIBJTE_DEF=
|
||||
echo "disabled libjte because zlib not enabled or not available"
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([THREADED_CHECKSUMS],
|
||||
[Define to use multi-threading in built-in libjte])
|
||||
AC_ARG_ENABLE(jtethreads,
|
||||
[ --enable-jtethreads Enable multi-threading in libjte, default=yes],
|
||||
, enable_jtethreads=yes)
|
||||
if test x$LIBJTE_DEF = xyes
|
||||
then
|
||||
if test "x$enable_jtethreads" = xyes; then
|
||||
AC_DEFINE([THREADED_CHECKSUMS], [])
|
||||
echo "enabled multi-threading in libjte"
|
||||
else
|
||||
echo "disabled multi-threading in libjte"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([LIBJTE_WITH_LIBBZ2],
|
||||
[Define to use libbz2 by built-in libjte])
|
||||
AC_ARG_ENABLE(libbz2,
|
||||
[ --enable-libbz2 Enable use of libbz2 by libjte, default=yes],
|
||||
, enable_libbz2=yes)
|
||||
if test "x$enable_libbz2" = xyes -a x$LIBJTE_DEF = xyes ; then
|
||||
dnl Check whether there is the header for libbz2.
|
||||
BZIP2_DEF=yes
|
||||
AC_CHECK_HEADER(bzlib.h, AC_CHECK_LIB(bz2, BZ2_bzCompressInit, , BZIP2_DEF= ), BZIP2_DEF= )
|
||||
else
|
||||
BZIP2_DEF=
|
||||
fi
|
||||
if test x$BZIP2_DEF = xyes
|
||||
then
|
||||
AC_DEFINE([LIBJTE_WITH_LIBBZ2], [])
|
||||
BZIP2_DEF="-DLIBJTE_WITH_LIBBZ2"
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Libburn_use_libcdiO], [Define to use libcdio as system adapter])
|
||||
AC_ARG_ENABLE(libcdio,
|
||||
[ --enable-libcdio Enable EXPERIMENTAL use of libcdio as system adapter, default=no],
|
||||
, enable_libcdio=no)
|
||||
if test x$enable_libcdio = xyes; then
|
||||
dnl Check whether there is libcdio-devel and libcdio-runtime.
|
||||
dnl If not, erase this macro
|
||||
LIBCDIO_DEF="-DLibburn_use_libcdiO"
|
||||
dnl The empty yes case obviously causes -lcdio to be linked
|
||||
AC_CHECK_HEADER(cdio/cdio.h, AC_CHECK_LIB(cdio, mmc_last_cmd_sense, , LIBCDIO_DEF= ), LIBCDIO_DEF= )
|
||||
else
|
||||
LIBCDIO_DEF=
|
||||
fi
|
||||
if test x$LIBCDIO_DEF = x
|
||||
then
|
||||
if test x$enable_libcdio = xyes
|
||||
then
|
||||
echo "WARNING: could not enable use of libcdio as system adapter"
|
||||
fi
|
||||
else
|
||||
echo "enabled EXPERIMENTAL use of libcdio as system adapter"
|
||||
fi
|
||||
if test x$LIBCDIO_DEF = x-DLibburn_use_libcdiO
|
||||
then
|
||||
AC_DEFINE([Libburn_use_libcdiO], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Xorriso_allow_external_filterS], [Define to allow xorriso to start external filter processes])
|
||||
AC_ARG_ENABLE(external-filters,
|
||||
[ --enable-external-filters Enable use of external filter programs by xorriso, default=yes],
|
||||
, enable_external_filters=yes)
|
||||
if test x"$enable_external_filters" = xyes; then
|
||||
EXTF_DEF="-DXorriso_allow_external_filterS"
|
||||
echo "enabled xorriso external filter programs"
|
||||
else
|
||||
EXTF_DEF=
|
||||
echo "disabled xorriso external filter programs"
|
||||
fi
|
||||
if test x$EXTF_DEF = x-DXorriso_allow_external_filterS
|
||||
then
|
||||
AC_DEFINE([Xorriso_allow_external_filterS], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Xorriso_allow_extf_suiD], [Define to allow external filters to xorriso when running under setuid])
|
||||
AC_ARG_ENABLE(external-filters-setuid,
|
||||
[ --enable-external-filters-setuid Enable xorriso external filter programs under setuid, default=no],
|
||||
, enable_external_filters_setuid=no)
|
||||
if test x$enable_external_filters_setuid = xyes; then
|
||||
EXTF_SUID_DEF="-DXorriso_allow_extf_suiD"
|
||||
echo "enabled xorriso external filter programs under setuid"
|
||||
else
|
||||
EXTF_SUID_DEF=
|
||||
echo "disabled xorriso external filter programs under setuid"
|
||||
fi
|
||||
if test x$EXTF_SUID_DEF = x-DXorriso_allow_extf_suiD
|
||||
then
|
||||
AC_DEFINE([Xorriso_allow_extf_suiD], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Xorriso_dvd_obs_default_64K], [Define to make 64 KB default size for DVD/BD writing])
|
||||
AC_ARG_ENABLE(dvd-obs-64k,
|
||||
[ --enable-dvd-obs-64k 64 KB default size for DVD/BD writing, default=no],
|
||||
, enable_dvd_obs=no)
|
||||
if test x$enable_dvd_obs_64k = xyes; then
|
||||
XORRISO_DVD_OBS_64K="-DXorriso_dvd_obs_default_64K"
|
||||
echo "enabled xorriso write size default 64 KB on DVD and BD"
|
||||
else
|
||||
XORRISO_DVD_OBS_64K=
|
||||
echo "disabled xorriso write size default 64 KB on DVD and BD"
|
||||
fi
|
||||
if test x$XORRISO_DVD_OBS_64K = x-DXorriso_dvd_obs_default_64K
|
||||
then
|
||||
AC_DEFINE([Xorriso_dvd_obs_default_64K], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Libburn_read_o_direcT], [Define to use O_DIRECT with -as cdrskin])
|
||||
AC_ARG_ENABLE(track-src-odirect,
|
||||
[ --enable-track-src-odirect Enable use of O_DIRECT with -as cdrskin, default=no],
|
||||
, enable_track_src_odirect=no)
|
||||
if test x$enable_track_src_odirect = xyes; then
|
||||
LIBBURN_O_DIRECT_DEF="-DLibburn_read_o_direcT"
|
||||
echo "enabled use of O_DIRECT with input of -as cdrskin"
|
||||
else
|
||||
LIBBURN_O_DIRECT_DEF=
|
||||
echo "disabled use of O_DIRECT with input of -as cdrskin"
|
||||
fi
|
||||
if test x$LIBBURN_O_DIRECT_DEF = x-DLibburn_read_o_direcT
|
||||
then
|
||||
AC_DEFINE([Libburn_read_o_direcT], [])
|
||||
fi
|
||||
|
||||
|
||||
# ------- Visible mark in configure : Start of library check
|
||||
|
||||
# Check for proper library versions if this is desired.
|
||||
# (It fails too often on too many systems.)
|
||||
AC_ARG_ENABLE(pkg-check-modules,
|
||||
[ --enable-pkg-check-modules Enable pkg-config check for libburn and libisofs , default=no],
|
||||
, enable_pkg_check_modules=no)
|
||||
if test x$enable_pkg_check_modules = xyes; then
|
||||
|
||||
dnl If PKG_CHECK_MODULES is to be used after this if-block,
|
||||
dnl then it might be necessary to perform PKG_PROG_PKG_CONFIG before the block.
|
||||
|
||||
if test x$LIBCDIO_DEF = x; then
|
||||
dummy=dummy
|
||||
else
|
||||
LIBCDIO_REQUIRED=0.83
|
||||
PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED)
|
||||
fi
|
||||
else
|
||||
if test x$LIBCDIO_DEF = x; then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "checking for LIBCDIO... skipped, no --enable-pkg-check-modules"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ------- Visible mark in configure : End of library check
|
||||
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
version.h
|
||||
])
|
||||
AC_OUTPUT
|
||||
# xorriso.pc
|
||||
|
14
libisoburn/branches/1.2.2/xorriso/convert_man_to_html.sh
Executable file
14
libisoburn/branches/1.2.2/xorriso/convert_man_to_html.sh
Executable file
@ -0,0 +1,14 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# convert_man_to_html.sh - ts B11024
|
||||
#
|
||||
# Generates a HTML version of man pages xorriso.1 , xorrisofs.1 , xorrecord.1
|
||||
#
|
||||
# To be executed in the libisoburn toplevel directory (eg. ./libisoburn-1.1.8)
|
||||
#
|
||||
|
||||
xorriso/man_xorriso_to_html.sh
|
||||
xorriso/man_xorrisofs_to_html.sh
|
||||
xorriso/man_xorrecord_to_html.sh
|
||||
|
1929
libisoburn/branches/1.2.2/xorriso/disk_ops.c
Normal file
1929
libisoburn/branches/1.2.2/xorriso/disk_ops.c
Normal file
File diff suppressed because it is too large
Load Diff
117
libisoburn/branches/1.2.2/xorriso/disk_ops.h
Normal file
117
libisoburn/branches/1.2.2/xorriso/disk_ops.h
Normal file
@ -0,0 +1,117 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of class DirseQ which
|
||||
crawls along a directory's content list.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_diskop_includeD
|
||||
#define Xorriso_pvt_diskop_includeD yes
|
||||
|
||||
|
||||
/* @param flag bit0= simple readlink(): no normalization, no multi-hop
|
||||
*/
|
||||
int Xorriso_resolve_link(struct XorrisO *xorriso,
|
||||
char *link_path, char result_path[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_convert_gidstring(struct XorrisO *xorriso, char *gid_string,
|
||||
gid_t *gid, int flag);
|
||||
|
||||
int Xorriso_convert_modstring(struct XorrisO *xorriso, char *cmd, char *mode,
|
||||
mode_t *mode_and, mode_t *mode_or, int flag);
|
||||
|
||||
int Xorriso_convert_uidstring(struct XorrisO *xorriso, char *uid_string,
|
||||
uid_t *uid, int flag);
|
||||
|
||||
/* @param flag bit0= for Xorriso_msgs_submit: use pager
|
||||
*/
|
||||
int Xorriso_hop_link(struct XorrisO *xorriso, char *link_path,
|
||||
struct LinkiteM **link_stack, struct stat *stbuf, int flag);
|
||||
|
||||
int Xorriso__mode_to_perms(mode_t st_mode, char perms[11], int flag);
|
||||
|
||||
int Xorriso_format_ls_l(struct XorrisO *xorriso, struct stat *stbuf, int flag);
|
||||
|
||||
/* @param flag bit0= long format
|
||||
bit1= do not print count of nodes
|
||||
bit2= du format
|
||||
bit3= print directories as themselves (ls -d)
|
||||
*/
|
||||
int Xorriso_lsx_filev(struct XorrisO *xorriso, char *wd,
|
||||
int filec, char **filev, off_t boss_mem, int flag);
|
||||
|
||||
/*
|
||||
@param flag >>> bit0= remove whole sub tree: rm -r
|
||||
bit1= remove empty directory: rmdir
|
||||
bit2= recursion: do not reassure in mode 2 "tree"
|
||||
bit3= this is for overwriting and not for plain removal
|
||||
bit4= count deleted files in xorriso->pacifier_count
|
||||
bit5= with bit0 only remove directory content, not the directory
|
||||
@return <=0 = error
|
||||
1 = removed leaf file object
|
||||
2 = removed directory or tree
|
||||
3 = did not remove on user revocation
|
||||
*/
|
||||
int Xorriso_rmx(struct XorrisO *xorriso, off_t boss_mem, char *path, int flag);
|
||||
|
||||
int Xorriso_findx(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
char *abs_dir_parm, char *dir_path,
|
||||
struct stat *dir_stbuf, int depth,
|
||||
struct LinkiteM *link_stack, int flag);
|
||||
|
||||
/* @param flag bit0= no hardlink reconstruction
|
||||
bit1= do not set xorriso->node_*_prefixes
|
||||
bit5= -extract_single: eventually do not insert directory tree
|
||||
*/
|
||||
int Xorriso_restore_sorted(struct XorrisO *xorriso, int count,
|
||||
char **src_array, char **tgt_array,
|
||||
int *problem_count, int flag);
|
||||
|
||||
/* @param flag bit0= path is a directory
|
||||
bit2= recursion: do not reassure in mode 2 "tree"
|
||||
bit3= this is for overwriting and not for plain removal
|
||||
*/
|
||||
int Xorriso_reassure_restore(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
/* @param flag bit7= return 4 if restore fails from denied permission
|
||||
do not issue error message
|
||||
@return <=0 failure , 1 success ,
|
||||
4 with bit7: permission to create file was denied
|
||||
*/
|
||||
int Xorriso_make_tmp_path(struct XorrisO *xorriso, char *orig_path,
|
||||
char *tmp_path, int *fd, int flag);
|
||||
|
||||
/* @param flag bit0= change regardless of xorriso->do_auto_chmod
|
||||
bit1= desired is only rx
|
||||
*/
|
||||
int Xorriso_auto_chmod(struct XorrisO *xorriso, char *disk_path, int flag);
|
||||
|
||||
int Xorriso_make_accessible(struct XorrisO *xorriso, char *disk_path,int flag);
|
||||
|
||||
/* @param flag bit0= prefer to find a match after *img_prefixes
|
||||
(but deliver img_prefixes if no other can be found)
|
||||
*/
|
||||
int Xorriso_make_restore_path(struct XorrisO *xorriso,
|
||||
struct Xorriso_lsT **img_prefixes, struct Xorriso_lsT **disk_prefixes,
|
||||
char img_path[SfileadrL], char disk_path[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_restore_make_hl(struct XorrisO *xorriso,
|
||||
char *old_path, char *new_path, int flag);
|
||||
|
||||
int Xorriso_afile_fopen(struct XorrisO *xorriso,
|
||||
char *filename, char *mode, FILE **ret_fp, int flag);
|
||||
|
||||
int Xorriso_make_mount_cmd(struct XorrisO *xorriso, char *cmd,
|
||||
int lba, int track, int session, char *volid,
|
||||
char *devadr, char result[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_append_scdbackup_record(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_diskop_includeD */
|
||||
|
2790
libisoburn/branches/1.2.2/xorriso/drive_mgt.c
Normal file
2790
libisoburn/branches/1.2.2/xorriso/drive_mgt.c
Normal file
File diff suppressed because it is too large
Load Diff
42
libisoburn/branches/1.2.2/xorriso/drive_mgt.h
Normal file
42
libisoburn/branches/1.2.2/xorriso/drive_mgt.h
Normal file
@ -0,0 +1,42 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which operate on drives
|
||||
and media.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_drive_mgt_includeD
|
||||
#define Xorriso_pvt_drive_mgt_includeD yes
|
||||
|
||||
|
||||
int Xorriso_may_burn(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_toc_line(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_media_product(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_check_md5_range(struct XorrisO *xorriso, off_t start_lba,
|
||||
off_t end_lba, char md5[16], int flag);
|
||||
|
||||
int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
|
||||
struct CheckmediajoB *job,
|
||||
int from_lba, int block_count, int read_chunk,
|
||||
int md5_start, int flag);
|
||||
|
||||
int Xorriso_get_drive_handles(struct XorrisO *xorriso,
|
||||
struct burn_drive_info **dinfo,
|
||||
struct burn_drive **drive,
|
||||
char *attempt, int flag);
|
||||
|
||||
int Xorriso_check_for_abort(struct XorrisO *xorriso,
|
||||
char *abort_file_path,
|
||||
double post_read_time,
|
||||
double *last_abort_file_time, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_drive_mgt_includeD */
|
||||
|
2058
libisoburn/branches/1.2.2/xorriso/emulators.c
Normal file
2058
libisoburn/branches/1.2.2/xorriso/emulators.c
Normal file
File diff suppressed because it is too large
Load Diff
37
libisoburn/branches/1.2.2/xorriso/emulators.h
Normal file
37
libisoburn/branches/1.2.2/xorriso/emulators.h
Normal file
@ -0,0 +1,37 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of emulators for mkisofs and cdrecord.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_emul_includeD
|
||||
#define Xorriso_pvt_emul_includeD yes
|
||||
|
||||
/* micro version of cdrskin */
|
||||
int Xorriso_cdrskin(struct XorrisO *xorriso, char *whom, int argc, char **argv,
|
||||
int flag);
|
||||
|
||||
int Xorriso_cdrskin_help(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_cdrskin_uses_stdout(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int flag);
|
||||
|
||||
int Xorriso_as_cdrskin(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
|
||||
/* micro emulation of mkisofs */
|
||||
int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
|
||||
int argc, char **argv, int flag);
|
||||
|
||||
int Xorriso_genisofs_help(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_as_genisofs(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_emul_includeD */
|
||||
|
701
libisoburn/branches/1.2.2/xorriso/filters.c
Normal file
701
libisoburn/branches/1.2.2/xorriso/filters.c
Normal file
@ -0,0 +1,701 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains functions which operate on data filter objects.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "lib_mgt.h"
|
||||
#include "iso_tree.h"
|
||||
|
||||
/*
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#include "iso_img.h"
|
||||
#include "iso_manip.h"
|
||||
#include "sort_cmp.h"
|
||||
|
||||
*/
|
||||
|
||||
|
||||
struct Xorriso_extF {
|
||||
|
||||
int flag; /* unused yet */
|
||||
|
||||
IsoExternalFilterCommand *cmd;
|
||||
|
||||
};
|
||||
|
||||
int Xorriso_extf_destroy(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
int flag);
|
||||
|
||||
|
||||
/* @param flag see struct Xorriso_extF.flag */
|
||||
int Xorriso_extf_new(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
char *path, int argc, char **argv, int behavior,
|
||||
char *suffix, char *name, int flag)
|
||||
{
|
||||
int i;
|
||||
struct Xorriso_extF *o= NULL;
|
||||
IsoExternalFilterCommand *cmd;
|
||||
|
||||
*filter= o= calloc(sizeof(struct Xorriso_extF), 1);
|
||||
if(o == NULL)
|
||||
goto failure;
|
||||
o->flag= flag;
|
||||
o->cmd= NULL;
|
||||
o->cmd= cmd= calloc(sizeof(IsoExternalFilterCommand), 1);
|
||||
if(cmd == NULL)
|
||||
goto failure;
|
||||
cmd->version= 0;
|
||||
cmd->refcount= 0;
|
||||
cmd->name= NULL;
|
||||
cmd->path= NULL;
|
||||
cmd->argv= NULL;
|
||||
cmd->argc= argc + 1;
|
||||
cmd->behavior= behavior;
|
||||
cmd->suffix= NULL;
|
||||
cmd->suffix= strdup(suffix);
|
||||
if(cmd->suffix == NULL)
|
||||
goto failure;
|
||||
|
||||
cmd->path= strdup(path);
|
||||
if(cmd->path == NULL)
|
||||
goto failure;
|
||||
cmd->argv= calloc(sizeof(char *), argc + 2);
|
||||
if(cmd->argv == NULL)
|
||||
goto failure;
|
||||
for(i= 0; i < argc + 2; i++)
|
||||
cmd->argv[i]= NULL;
|
||||
cmd->argv[0]= strdup(path);
|
||||
if(cmd->argv[0] == NULL)
|
||||
goto failure;
|
||||
for(i= 0; i < argc; i++) {
|
||||
cmd->argv[i + 1]= strdup(argv[i]);
|
||||
if(cmd->argv[i] == NULL)
|
||||
goto failure;
|
||||
}
|
||||
cmd->name= strdup(name);
|
||||
if(cmd->name == NULL)
|
||||
goto failure;
|
||||
return(1);
|
||||
failure:;
|
||||
Xorriso_extf_destroy(xorriso, filter, 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_extf_destroy(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
int flag)
|
||||
{
|
||||
int i;
|
||||
IsoExternalFilterCommand *cmd;
|
||||
|
||||
if(*filter == NULL)
|
||||
return(0);
|
||||
cmd= (*filter)->cmd;
|
||||
if(cmd != NULL) {
|
||||
if(cmd->refcount > 0)
|
||||
return(0);
|
||||
if(cmd->path != NULL)
|
||||
free(cmd->path);
|
||||
if(cmd->suffix != NULL)
|
||||
free(cmd->suffix);
|
||||
if(cmd->argv != NULL) {
|
||||
for(i= 0; i < cmd->argc; i++)
|
||||
if(cmd->argv[i] != NULL)
|
||||
free(cmd->argv[i]);
|
||||
free((char *) cmd->argv);
|
||||
}
|
||||
if(cmd->name != NULL)
|
||||
free(cmd->name);
|
||||
free((char *) cmd);
|
||||
}
|
||||
free((char *) *filter);
|
||||
*filter= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_lookup_extf(struct XorrisO *xorriso, char *name,
|
||||
struct Xorriso_lsT **found_lst, int flag)
|
||||
{
|
||||
struct Xorriso_extF *filter;
|
||||
struct Xorriso_lsT *lst;
|
||||
|
||||
for(lst= xorriso->filters; lst != NULL; lst= Xorriso_lst_get_next(lst, 0)) {
|
||||
filter= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
|
||||
if(strcmp(filter->cmd->name, name) == 0) {
|
||||
*found_lst= lst;
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_destroy_all_extf(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
struct Xorriso_extF *filter;
|
||||
struct Xorriso_lsT *lst, *next_lst;
|
||||
|
||||
for(lst= xorriso->filters; lst != NULL; lst= next_lst) {
|
||||
filter= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
|
||||
Xorriso_lst_detach_text(lst, 0);
|
||||
next_lst= Xorriso_lst_get_next(lst, 0);
|
||||
Xorriso_lst_destroy(&lst, 0);
|
||||
Xorriso_extf_destroy(xorriso, &filter, 0);
|
||||
}
|
||||
xorriso->filters= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@param flag bit0= return 2 if renaming is not possible by libisofs
|
||||
(always: if demanded strip suffix is missing
|
||||
or if suffix makes name length > 255)
|
||||
bit1= strip suffix rather than appending it
|
||||
*/
|
||||
int Xorriso_rename_suffix(struct XorrisO *xorriso, IsoNode *node, char *suffix,
|
||||
char *show_path, char new_name[], int flag)
|
||||
{
|
||||
int ret, lo= 0, ls= 0, strip_suffix;
|
||||
char *old_name= NULL, *show_name;
|
||||
|
||||
strip_suffix= !!(flag & 2);
|
||||
|
||||
old_name= strdup((char *) iso_node_get_name(node));
|
||||
show_name= old_name;
|
||||
if(show_path != NULL)
|
||||
if(show_path[0] != 0)
|
||||
show_name= show_path;
|
||||
lo= strlen(old_name);
|
||||
ls= strlen(suffix);
|
||||
if(strip_suffix) {
|
||||
if(lo <= ls) {
|
||||
/* refuse gracefully */
|
||||
ret= 2; goto ex;
|
||||
}
|
||||
if(strcmp(old_name + lo - ls, suffix) != 0) {
|
||||
ret= 2; goto ex;
|
||||
}
|
||||
if(lo >= SfileadrL)
|
||||
goto cannot_remove_suffix;
|
||||
strcpy(new_name, old_name);
|
||||
new_name[lo - ls]= 0;
|
||||
ret = iso_node_set_name(node, new_name);
|
||||
if (ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if (!(flag & 1))
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when renaming ISO node", 0, "FAILURE", 1);
|
||||
cannot_remove_suffix:;
|
||||
strcpy(xorriso->info_text, "-set_filter: Cannot remove suffix from ");
|
||||
Text_shellsafe(show_name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag & 1) ? "WARNING" : "FAILURE", 0);
|
||||
ret= 2 * (flag & 1); goto ex;
|
||||
}
|
||||
} else {
|
||||
/* check whether suffix already present */
|
||||
if(lo >= ls)
|
||||
if(strcmp(old_name + lo - ls, suffix) == 0) {
|
||||
/* refuse gracefully */
|
||||
ret= 2; goto ex;
|
||||
}
|
||||
if(lo + ls > 255) {
|
||||
cannot_append_suffix:;
|
||||
strcpy(xorriso->info_text, "-set_filter: Cannot append suffix to ");
|
||||
Text_shellsafe(show_name, xorriso->info_text, 1);
|
||||
strcat(xorriso->info_text, ". Left unfiltered.");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag & 1) ? "WARNING" : "FAILURE", 0);
|
||||
ret= 2 * (flag & 1); goto ex;
|
||||
}
|
||||
sprintf(new_name, "%s%s", old_name, suffix);
|
||||
ret = iso_node_set_name(node, new_name);
|
||||
if (ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if (!(flag & 1))
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when renaming ISO node", 0, "FAILURE", 1);
|
||||
goto cannot_append_suffix;
|
||||
}
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(old_name != NULL)
|
||||
free(old_name);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@param flag bit0= return 2 if renaming is not possible
|
||||
bit1= print pacifier messages
|
||||
*/
|
||||
int Xorriso_set_filter(struct XorrisO *xorriso, void *in_node,
|
||||
char *path, char *filter_name, int flag)
|
||||
{
|
||||
int ret, strip_suffix= 0, strip_filter= 0, filter_ret= 0;
|
||||
int explicit_suffix= 0, internal_filter= 0;
|
||||
IsoNode *node;
|
||||
IsoFile *file;
|
||||
struct Xorriso_lsT *found_lst;
|
||||
struct Xorriso_extF *found_filter;
|
||||
IsoExternalFilterCommand *cmd = NULL;
|
||||
char *old_name= NULL, *new_name= NULL, *suffix= "";
|
||||
IsoStream *stream;
|
||||
|
||||
Xorriso_alloc_meM(new_name, char, SfileadrL);
|
||||
new_name[0]= 0;
|
||||
|
||||
node= (IsoNode *) in_node;
|
||||
if(node == NULL) {
|
||||
ret= Xorriso_get_node_by_path(xorriso, path, NULL, &node, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
if(!LIBISO_ISREG(node)) {
|
||||
strcpy(xorriso->info_text, "-set_filter: Not a regular data file node ");
|
||||
Text_shellsafe(path, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
file= (IsoFile *) node;
|
||||
|
||||
if(strncmp(filter_name, "--remove-all-filters", 20) == 0) {
|
||||
strip_filter= 1;
|
||||
strip_suffix= 1;
|
||||
if(strlen(filter_name) > 21) {
|
||||
strip_suffix= (filter_name[20] != '+');
|
||||
suffix= filter_name + 21;
|
||||
explicit_suffix= 1;
|
||||
}
|
||||
} else if(strcmp(filter_name, "--zisofs") == 0) {
|
||||
internal_filter= 1;
|
||||
} else if(strcmp(filter_name, "--zisofs-decode") == 0) {
|
||||
internal_filter= 2;
|
||||
} else if(strcmp(filter_name, "--gzip") == 0) {
|
||||
internal_filter= 3;
|
||||
suffix= ".gz";
|
||||
strip_suffix= 0;
|
||||
explicit_suffix= 1;
|
||||
} else if(strcmp(filter_name, "--gunzip") == 0 ||
|
||||
strcmp(filter_name, "--gzip-decode") == 0) {
|
||||
internal_filter= 4;
|
||||
suffix= ".gz";
|
||||
strip_suffix= 1;
|
||||
explicit_suffix= 1;
|
||||
} else {
|
||||
ret= Xorriso_lookup_extf(xorriso, filter_name, &found_lst, 0);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 0) {
|
||||
strcpy(xorriso->info_text, "-set_filter: Not a registered filter name ");
|
||||
Text_shellsafe(filter_name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
found_filter= (struct Xorriso_extF *) Xorriso_lst_get_text(found_lst, 0);
|
||||
cmd= found_filter->cmd;
|
||||
suffix= cmd->suffix;
|
||||
strip_suffix= cmd->behavior & 8;
|
||||
}
|
||||
|
||||
if(suffix[0]) {
|
||||
|
||||
/* >>> would need full iso_rr_path of node for showing */;
|
||||
|
||||
old_name= strdup((char *) iso_node_get_name(node));
|
||||
ret= Xorriso_rename_suffix(xorriso, node, suffix, path, new_name,
|
||||
(flag & 1) | (strip_suffix ? 2 : 0));
|
||||
if(ret <= 0 || ret == 2)
|
||||
goto ex;
|
||||
}
|
||||
|
||||
if(strip_filter) {
|
||||
while(1) {
|
||||
if(!explicit_suffix) {
|
||||
stream= iso_file_get_stream(file);
|
||||
|
||||
if(strncmp(stream->class->type, "gzip", 4) == 0) {
|
||||
suffix= ".gz";
|
||||
strip_suffix= 1;
|
||||
} else if(strncmp(stream->class->type, "pizg", 4) == 0) {
|
||||
suffix= ".gz";
|
||||
strip_suffix= 0;
|
||||
} else {
|
||||
ret= iso_stream_get_external_filter(stream, &cmd, 0);
|
||||
if(ret > 0) {
|
||||
suffix= cmd->suffix;
|
||||
strip_suffix= !(cmd->behavior & 8);
|
||||
}
|
||||
}
|
||||
if(suffix[0]) {
|
||||
|
||||
/* >>> would need the current renaming state of path */;
|
||||
|
||||
ret= Xorriso_rename_suffix(xorriso, node, suffix, NULL, new_name,
|
||||
(flag & 1) | (strip_suffix << 1));
|
||||
if(ret <= 0 || ret == 2)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
ret= iso_file_remove_filter(file, 0);
|
||||
if(ret != 1)
|
||||
break;
|
||||
}
|
||||
filter_ret= 1;
|
||||
} else if (internal_filter == 1 || internal_filter == 2) {
|
||||
filter_ret = iso_file_add_zisofs_filter(file, 1 | (internal_filter & 2));
|
||||
if(filter_ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(!(internal_filter == 2 && filter_ret == (int) ISO_ZISOFS_WRONG_INPUT))
|
||||
Xorriso_report_iso_error(xorriso, "", filter_ret,
|
||||
"Error when setting filter to ISO node", 0, "FAILURE", 1);
|
||||
}
|
||||
} else if (internal_filter == 3 || internal_filter == 4) {
|
||||
filter_ret = iso_file_add_gzip_filter(file,
|
||||
1 | ((internal_filter == 4) << 1));
|
||||
if(filter_ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
Xorriso_report_iso_error(xorriso, "", filter_ret,
|
||||
"Error when setting filter to ISO node", 0, "FAILURE", 1);
|
||||
}
|
||||
} else {
|
||||
|
||||
#ifndef Xorriso_allow_extf_suiD
|
||||
/* This is a final safety precaution before iso_file_add_external_filter()
|
||||
performs fork() and executes the alleged filter program.
|
||||
*/
|
||||
if(getuid() != geteuid()) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-set_filter: UID and EUID differ. Will not run external programs.");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
#endif /* ! Xorriso_allow_extf_suiD */
|
||||
|
||||
filter_ret = iso_file_add_external_filter(file, cmd, 0);
|
||||
if(filter_ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
Xorriso_report_iso_error(xorriso, "", filter_ret,
|
||||
"Error when setting filter to ISO node", 0, "FAILURE", 1);
|
||||
}
|
||||
}
|
||||
if(filter_ret != 1 && new_name[0] && old_name != NULL) {
|
||||
ret = iso_node_set_name(node, old_name);
|
||||
if (ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if (!(flag & 1))
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when renaming ISO node", 0, "FAILURE", 1);
|
||||
}
|
||||
}
|
||||
if(flag & 2) {
|
||||
xorriso->pacifier_count++;
|
||||
Xorriso_pacifier_callback(xorriso, "file filters processed",
|
||||
xorriso->pacifier_count, xorriso->pacifier_total, "", 0);
|
||||
}
|
||||
if(filter_ret < 0) {
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
|
||||
ret= filter_ret;
|
||||
ex:;
|
||||
if(old_name != NULL)
|
||||
free(old_name);
|
||||
Xorriso_free_meM(new_name);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= delete filter with the given name
|
||||
*/
|
||||
int Xorriso_external_filter(struct XorrisO *xorriso,
|
||||
char *name, char *options, char *path,
|
||||
int argc, char **argv, int flag)
|
||||
{
|
||||
int ret, delete= 0, behavior= 0, extf_flag= 0, is_banned= 0;
|
||||
char *what, *what_next, *suffix= "";
|
||||
struct Xorriso_lsT *lst;
|
||||
struct Xorriso_extF *found_filter, *new_filter= NULL;
|
||||
|
||||
#ifndef Xorriso_allow_external_filterS
|
||||
/* To be controlled by: configure --enable-external-filters */
|
||||
|
||||
sprintf(xorriso->info_text, "%s : Banned at compile time.",
|
||||
flag & 1 ? "-unregister_filter" : "-external_filter");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
sprintf(xorriso->info_text,
|
||||
"This may be changed at compile time by ./configure option --enable-external-filters");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "HINT", 0);
|
||||
is_banned= 1;
|
||||
|
||||
#endif /* ! Xorriso_allow_external_filterS */
|
||||
|
||||
#ifndef Xorriso_allow_extf_suiD
|
||||
/* To be controlled by: configure --enable-external-filters-setuid */
|
||||
|
||||
if(getuid() != geteuid()) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-set_filter: UID and EUID differ. Will not run external programs.");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
sprintf(xorriso->info_text,
|
||||
"This may be changed at compile time by ./configure option --enable-external-filters-setuid");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "HINT", 0);
|
||||
is_banned= 1;
|
||||
}
|
||||
#endif /* ! Xorriso_allow_extf_suiD */
|
||||
|
||||
if(is_banned)
|
||||
return(0);
|
||||
|
||||
if(xorriso->filter_list_closed) {
|
||||
sprintf(xorriso->info_text,
|
||||
"%s : Banned by previous command -close_filter_list",
|
||||
flag & 1 ? "-unregister_filter" : "-external_filter");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
if((!(flag & 1)) && path[0] != '/') {
|
||||
sprintf(xorriso->info_text,
|
||||
"-external_filter : Given command path does not begin by '/' : ");
|
||||
Text_shellsafe(path, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
delete= flag & 1;
|
||||
ret= Xorriso_lookup_extf(xorriso, name, &lst, 0);
|
||||
if(ret < 0)
|
||||
return(ret);
|
||||
if(ret > 0) {
|
||||
if(delete) {
|
||||
found_filter= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
|
||||
if(found_filter->cmd->refcount > 0) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-external_filter: Cannot remove filter because it is in use by %.f nodes : ",
|
||||
(double) found_filter->cmd->refcount);
|
||||
Text_shellsafe(name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
Xorriso_lst_detach_text(lst, 0);
|
||||
if(xorriso->filters == lst)
|
||||
xorriso->filters= Xorriso_lst_get_next(lst, 0);
|
||||
Xorriso_lst_destroy(&lst, 0);
|
||||
Xorriso_extf_destroy(xorriso, &found_filter, 0);
|
||||
ret= 1; goto ex;
|
||||
}
|
||||
strcpy(xorriso->info_text,
|
||||
"-external_filter: filter with given name already existing: ");
|
||||
Text_shellsafe(name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
if(delete) {
|
||||
strcpy(xorriso->info_text,
|
||||
"-external_filter: filter with given name does not exist: ");
|
||||
Text_shellsafe(name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
|
||||
for(what= options; what!=NULL; what= what_next) {
|
||||
what_next= strchr(what, ':');
|
||||
if(what_next!=NULL) {
|
||||
*what_next= 0;
|
||||
what_next++;
|
||||
}
|
||||
if(strncmp(what, "default", 7) == 0) {
|
||||
suffix= "";
|
||||
behavior= 0;
|
||||
} else if(strncmp(what, "suffix=", 7) == 0) {
|
||||
suffix= what + 7;
|
||||
} else if(strcmp(what, "remove_suffix") == 0) {
|
||||
behavior|= 8;
|
||||
} else if(strcmp(what, "if_nonempty") == 0) {
|
||||
behavior|= 1;
|
||||
} else if(strcmp(what, "if_reduction") == 0) {
|
||||
behavior|= 2;
|
||||
} else if(strcmp(what, "if_block_reduction") == 0) {
|
||||
behavior|= 4;
|
||||
} else if(strncmp(what, "used=", 5) == 0) {
|
||||
; /* this is informational output from -status */
|
||||
} else if(what[0]) {
|
||||
strcpy(xorriso->info_text,
|
||||
"-external_filter: unknown option ");
|
||||
Text_shellsafe(what, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
ret= Xorriso_extf_new(xorriso, &new_filter, path, argc, argv, behavior,
|
||||
suffix, name, extf_flag);
|
||||
if(ret <= 0) {
|
||||
could_not_create:;
|
||||
strcpy(xorriso->info_text,
|
||||
"-external_filter: Could not create filter object");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
goto ex;
|
||||
}
|
||||
ret= Xorriso_lst_append_binary(&(xorriso->filters), (char *) new_filter,0, 4);
|
||||
if(ret <= 0)
|
||||
goto could_not_create;
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(ret <= 0) {
|
||||
if(new_filter != NULL)
|
||||
Xorriso_extf_destroy(xorriso, &new_filter, 0);
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_status_extf(struct XorrisO *xorriso, char *filter, FILE *fp,
|
||||
int flag)
|
||||
/*
|
||||
bit1= do only report to fp
|
||||
*/
|
||||
{
|
||||
int i, maxl= 4 * SfileadrL;
|
||||
struct Xorriso_extF *extf;
|
||||
struct Xorriso_lsT *lst;
|
||||
char *line;
|
||||
|
||||
line= xorriso->result_line;
|
||||
for(lst= xorriso->filters; lst != NULL; lst= Xorriso_lst_get_next(lst, 0)) {
|
||||
extf= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
|
||||
|
||||
strcpy(xorriso->result_line, "-external_filter ");
|
||||
Text_shellsafe(extf->cmd->name, line, 1);
|
||||
if((int) strlen(line) > maxl)
|
||||
continue;
|
||||
strcat(line, " ");
|
||||
if(extf->cmd->suffix[0]) {
|
||||
strcat(line, "suffix=");
|
||||
Text_shellsafe(extf->cmd->suffix, line, 1);
|
||||
if((int) strlen(line) > maxl)
|
||||
continue;
|
||||
strcat(line, ":");
|
||||
}
|
||||
if(extf->cmd->behavior & 8)
|
||||
strcat(line, "remove_suffix:");
|
||||
if(extf->cmd->behavior & 1)
|
||||
strcat(line, "if_nonempty:");
|
||||
if(extf->cmd->behavior & 2)
|
||||
strcat(line, "if_reduction:");
|
||||
if(extf->cmd->behavior & 4)
|
||||
strcat(line, "if_block_reduction:");
|
||||
sprintf(line + strlen(line), "used=%.f ", (double) extf->cmd->refcount);
|
||||
if((int) strlen(line) > maxl)
|
||||
continue;
|
||||
Text_shellsafe(extf->cmd->path, line, 1);
|
||||
if((int) strlen(line) > maxl)
|
||||
continue;
|
||||
for(i= 1; i < extf->cmd->argc; i++) {
|
||||
strcat(line, " ");
|
||||
Text_shellsafe(extf->cmd->argv[i], line, 1);
|
||||
if((int) strlen(line) > maxl)
|
||||
break;
|
||||
}
|
||||
if(i < extf->cmd->argc)
|
||||
continue;
|
||||
strcat(line, " --\n");
|
||||
Xorriso_status_result(xorriso, filter, fp, flag&2);
|
||||
}
|
||||
if(xorriso->filter_list_closed) {
|
||||
strcpy(line, "-close_filter_list\n");
|
||||
Xorriso_status_result(xorriso, filter, fp, flag&2);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_set_zisofs_params(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
struct iso_zisofs_ctrl ctrl;
|
||||
|
||||
ctrl.version= 0;
|
||||
ctrl.compression_level= xorriso->zlib_level;
|
||||
if(xorriso->zisofs_block_size == (1 << 16))
|
||||
ctrl.block_size_log2= 16;
|
||||
else if(xorriso->zisofs_block_size == (1 << 17))
|
||||
ctrl.block_size_log2= 17;
|
||||
else
|
||||
ctrl.block_size_log2= 15;
|
||||
ret= iso_zisofs_set_params(&ctrl, 0);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret < 0) {
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when setting zisofs parameters", 0, "FAILURE", 1);
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_status_zisofs(struct XorrisO *xorriso, char *filter, FILE *fp,
|
||||
int flag)
|
||||
/*
|
||||
bit0= do only report non-default settings
|
||||
bit1= do only report to fp
|
||||
*/
|
||||
{
|
||||
off_t ziso_count= 0, osiz_count= 0;
|
||||
off_t gzip_count= 0, gunzip_count= 0;
|
||||
|
||||
iso_zisofs_get_refcounts(&ziso_count, &osiz_count, 0);
|
||||
iso_gzip_get_refcounts(&gzip_count, &gunzip_count, 0);
|
||||
if((flag & 1) && xorriso->zlib_level == xorriso->zlib_level_default &&
|
||||
xorriso->zisofs_block_size == xorriso->zisofs_block_size_default &&
|
||||
xorriso->zisofs_by_magic == 0 &&
|
||||
ziso_count == 0 && osiz_count == 0 &&
|
||||
gzip_count == 0 && gunzip_count == 0) {
|
||||
if(filter == NULL)
|
||||
return(2);
|
||||
if(filter[0] == 0)
|
||||
return 2;
|
||||
}
|
||||
sprintf(xorriso->result_line,
|
||||
"-zisofs level=%d:block_size=%dk:by_magic=%s:ziso_used=%.f:osiz_used=%.f",
|
||||
xorriso->zlib_level, xorriso->zisofs_block_size / 1024,
|
||||
xorriso->zisofs_by_magic ? "on" : "off",
|
||||
(double) ziso_count, (double) osiz_count);
|
||||
sprintf(xorriso->result_line + strlen(xorriso->result_line),
|
||||
":gzip_used=%.f:gunzip_used=%.f\n",
|
||||
(double) gzip_count, (double) gunzip_count);
|
||||
Xorriso_status_result(xorriso, filter, fp, flag&2);
|
||||
return(1);
|
||||
}
|
||||
|
31
libisoburn/branches/1.2.2/xorriso/filters.h
Normal file
31
libisoburn/branches/1.2.2/xorriso/filters.h
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which operate on
|
||||
data filter objects.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_filters_includeD
|
||||
#define Xorriso_pvt_filters_includeD yes
|
||||
|
||||
int Xorriso_extf_new(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
char *path, int argc, char **argv, int behavior,
|
||||
char *suffix, char *name, int flag);
|
||||
|
||||
int Xorriso_extf_destroy(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
int flag);
|
||||
|
||||
int Xorriso_lookup_extf(struct XorrisO *xorriso, char *name,
|
||||
struct Xorriso_lsT **found_lst, int flag);
|
||||
|
||||
int Xorriso_rename_suffix(struct XorrisO *xorriso, IsoNode *node, char *suffix,
|
||||
char *show_path, char new_name[], int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_filters_includeD */
|
||||
|
1219
libisoburn/branches/1.2.2/xorriso/findjob.c
Normal file
1219
libisoburn/branches/1.2.2/xorriso/findjob.c
Normal file
File diff suppressed because it is too large
Load Diff
412
libisoburn/branches/1.2.2/xorriso/findjob.h
Normal file
412
libisoburn/branches/1.2.2/xorriso/findjob.h
Normal file
@ -0,0 +1,412 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of classes FindjoB, ExprnodE, ExprtesT
|
||||
which perform tree searches in libisofs or in POSIX filesystem.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_findjob_includeD
|
||||
#define Xorriso_pvt_findjob_includeD yes
|
||||
|
||||
|
||||
#define Xorriso_findjob_on_expR yes
|
||||
|
||||
#ifdef Xorriso_findjob_on_expR
|
||||
|
||||
/*
|
||||
A single Testnode.
|
||||
*/
|
||||
struct ExprtesT {
|
||||
|
||||
struct FindjoB *boss;
|
||||
|
||||
int invert; /* 0=normal 1=invert result */
|
||||
|
||||
/*
|
||||
0= -false (with invert : -true)
|
||||
1= -name char *arg1 (regex_t in *arg2)
|
||||
2= -type char *arg1
|
||||
3= -damaged
|
||||
4= -lba_range int *arg1 int *arg2
|
||||
5= -has_acl
|
||||
6= -has_xattr
|
||||
7= -has_aaip
|
||||
8= -has_filter
|
||||
9= -wanted_node IsoNode *arg1 (for internal use, arg1 not allocated)
|
||||
10= -pending_data
|
||||
11= -decision char *arg1 ("yes", "no")
|
||||
12= -prune
|
||||
13= -wholename char *arg1 (regex_t in *arg2)
|
||||
14= -has_any_xattr
|
||||
15= -has_md5
|
||||
16= -disk_name char *arg1 (regex_t in *arg2)
|
||||
17= -hidden int *arg1 (bit0=iso_rr, bit1=joliet)
|
||||
*/
|
||||
int test_type;
|
||||
|
||||
void *arg1;
|
||||
void *arg2;
|
||||
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
A computational node.
|
||||
A tree of these nodes forms the expression.
|
||||
Sequences of AND/OR operations form branches, brackets spawn new branches,
|
||||
NOT inverts node's test resp. subtree result.
|
||||
*/
|
||||
struct ExprnodE {
|
||||
|
||||
struct ExprnodE *up;
|
||||
|
||||
char origin[8];
|
||||
|
||||
/* Operators */
|
||||
int invert; /* 0=normal 1=invert own result (subtree or test, but not op) */
|
||||
|
||||
int assoc; /*
|
||||
0= left : compute own value, combine with left value,
|
||||
compute right value, combine with current value
|
||||
1= right: compute own value, compute right value,
|
||||
combine own and right, combine with left value
|
||||
*/
|
||||
|
||||
int use_shortcuts; /* 0= evaluate all tests of -and and -or,
|
||||
1= evaluate only until the combined result is known
|
||||
*/
|
||||
|
||||
struct ExprnodE *left;
|
||||
int left_op; /* 0=OR , 1=AND */
|
||||
|
||||
struct ExprnodE *right;
|
||||
int right_op; /* see left_op */
|
||||
|
||||
/* Brackets : a pointer to the first node in a subchain */
|
||||
struct ExprnodE *sub;
|
||||
|
||||
int is_if_then_else;
|
||||
struct ExprnodE *true_branch;
|
||||
struct ExprnodE *false_branch;
|
||||
|
||||
/* elementary test : if sub!=NULL , test is ignored */
|
||||
struct ExprtesT *test;
|
||||
|
||||
/* Result */
|
||||
int own_value;
|
||||
int composed_value;
|
||||
|
||||
};
|
||||
|
||||
|
||||
struct FindjoB {
|
||||
|
||||
char *start_path;
|
||||
|
||||
struct ExprnodE *test_tree;
|
||||
|
||||
struct ExprnodE *cursor;
|
||||
int invert; /* 0=normal 1=set invert-property for next new test node */
|
||||
int use_shortcuts;
|
||||
|
||||
/* 0= echo
|
||||
1= rm (also rmdir)
|
||||
2= rm_r
|
||||
>>> 3= mv target
|
||||
4= chown user
|
||||
5= chgrp group
|
||||
6= chmod mode_and mode_or
|
||||
7= alter_date type date
|
||||
8= lsdl
|
||||
9= chown_r user
|
||||
10= chgrp_r group
|
||||
11= chmod_r mode_and mode_or
|
||||
12= alter_date_r type date
|
||||
13= find
|
||||
14= compare disk_equivalent_of_start_path
|
||||
15= in_iso iso_rr_equivalent_of_start_path
|
||||
16= not_in_iso iso_rr_equiv
|
||||
17= update disk_equiv
|
||||
18= add_missing iso_rr_equiv
|
||||
19= empty_iso_dir iso_rr_equiv
|
||||
20= is_full_in_iso iso_rr_equiv
|
||||
21= report_damage
|
||||
22= report_lba
|
||||
23= internal: memorize path of last matching node in found_path
|
||||
24= getfacl
|
||||
25= setfacl access_acl default_acl
|
||||
26= getfattr
|
||||
27= setfattr
|
||||
28= set_filter name
|
||||
29= show_stream
|
||||
30= internal: count by xorriso->node_counter
|
||||
31= internal: register in xorriso->node_array
|
||||
32= internal: widen_hardlinks disk_equiv: update nodes marked in di_do_widen
|
||||
33= get_any_xattr
|
||||
34= get_md5
|
||||
35= check_md5
|
||||
36= make_md5
|
||||
37= mkisofs_r
|
||||
38= sort_weight number
|
||||
39= hide on|iso_rr|joliet|off
|
||||
40= estimate_size
|
||||
41= update_merge disk_equiv
|
||||
42= rm_merge
|
||||
43= clear_merge
|
||||
44= list_extattr
|
||||
*/
|
||||
int action;
|
||||
int prune;
|
||||
|
||||
/* action specific parameters */
|
||||
char *target;
|
||||
char *text_2;
|
||||
uid_t user;
|
||||
gid_t group;
|
||||
mode_t mode_and, mode_or;
|
||||
int type; /* see Xorriso_set_time flag, also used as weight */
|
||||
time_t date;
|
||||
char *found_path;
|
||||
off_t estim_upper_size;
|
||||
off_t estim_lower_size;
|
||||
struct FindjoB *subjob;
|
||||
|
||||
/* Errors */
|
||||
char errmsg[4096];
|
||||
int errn; /*
|
||||
>0 = UNIX errno
|
||||
-1 = close_bracket: no bracket open
|
||||
-2 = binary operator or closing bracket expected
|
||||
-3 = unexpected binary operator or closing bracket
|
||||
-4 = unsupported command
|
||||
-5 = -then -elseif -else -endif without -if or at wrong place
|
||||
*/
|
||||
};
|
||||
|
||||
|
||||
int Exprnode_destroy(struct ExprnodE **fnode, int flag);
|
||||
|
||||
int Exprnode_tree_value(struct XorrisO *xorriso, struct ExprnodE *fnode,
|
||||
int left_value, void *node, char *name, char *path,
|
||||
struct stat *boss_stbuf, struct stat *stbuf, int flag);
|
||||
|
||||
|
||||
int Findjob_new(struct FindjoB **o, char *start_path, int flag);
|
||||
|
||||
int Findjob_destroy(struct FindjoB **o, int flag);
|
||||
|
||||
int Findjob_set_start_path(struct FindjoB *o, char *start_path, int flag);
|
||||
|
||||
int Findjob_get_start_path(struct FindjoB *o, char **start_path, int flag);
|
||||
|
||||
int Findjob_set_commit_filter_2(struct FindjoB *o, int flag);
|
||||
|
||||
int Findjob_set_lba_range(struct FindjoB *o, int start_lba, int count,
|
||||
int flag);
|
||||
|
||||
int Findjob_set_wanted_node(struct FindjoB *o, void *wanted_node, int flag);
|
||||
|
||||
/* @param value -1= only undamaged files, 1= only damaged files
|
||||
*/
|
||||
int Findjob_set_damage_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
int Findjob_set_test_hidden(struct FindjoB *o, int mode, int flag);
|
||||
|
||||
|
||||
int Findjob_set_decision(struct FindjoB *o, char *decision, int flag);
|
||||
|
||||
int Findjob_open_bracket(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_close_bracket(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_not(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_and(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_or(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_if(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_then(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_else(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_elseif(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_endif(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_test_2(struct XorrisO *xorriso, struct FindjoB *o,
|
||||
void *node, char *name, char *path,
|
||||
struct stat *boss_stbuf, struct stat *stbuf, int flag);
|
||||
|
||||
int Findjob_set_action_found_path(struct FindjoB *o, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_target(struct FindjoB *o, int action, char *target,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_ad(struct FindjoB *o, int type, time_t date, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chgrp(struct FindjoB *o, gid_t group, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chmod(struct FindjoB *o,
|
||||
mode_t mode_and, mode_t mode_or, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chown(struct FindjoB *o, uid_t user,int flag);
|
||||
|
||||
/* @param flag bit0= -wholename rather than -name
|
||||
*/
|
||||
int Findjob_set_name_expr(struct FindjoB *o, char *name_expr, int flag);
|
||||
|
||||
int Findjob_set_file_type(struct FindjoB *o, char file_type, int flag);
|
||||
|
||||
/* @param value -1= files without ACL, 1= only files with ACL
|
||||
*/
|
||||
int Findjob_set_acl_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
/* @param value -1= files without xattr, 1= only files with xattr
|
||||
@param flag bit0=-has_any_xattr rather than -has_xattr
|
||||
*/
|
||||
int Findjob_set_xattr_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
/* @param value -1= files without aaip, 1= only files with aaip
|
||||
*/
|
||||
int Findjob_set_aaip_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
/* @param value -1= files without filter, 1= files with filter
|
||||
*/
|
||||
int Findjob_set_filter_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
/* @param value -1= only without property, 1= only with property
|
||||
@param flag bit0= pseudo-test:
|
||||
if no operator is open, do nothing and return 2
|
||||
*/
|
||||
int Findjob_set_prop_filter(struct FindjoB *o, int test_type, int value,
|
||||
int flag);
|
||||
|
||||
/* @param value -1= true, 1= false
|
||||
@param flag bit0= pseudo-test:
|
||||
if no operator is open, do nothing and return 2
|
||||
*/
|
||||
int Findjob_set_false(struct FindjoB *o, int value, int flag);
|
||||
|
||||
int Findjob_set_prune(struct FindjoB *o, int flag);
|
||||
|
||||
|
||||
int Findjob_set_action_subjob(struct FindjoB *o, int action,
|
||||
struct FindjoB *subjob, int flag);
|
||||
|
||||
int Findjob_set_action_text_2(struct FindjoB *o, int action, char *target,
|
||||
char* text_2, int flag);
|
||||
|
||||
int Findjob_set_action_type(struct FindjoB *o, int action, int type, int flag);
|
||||
|
||||
|
||||
int Findjob_get_action(struct FindjoB *o, int flag);
|
||||
|
||||
int Findjob_get_action_parms(struct FindjoB *o, char **target, char **text_2,
|
||||
uid_t *user, gid_t *group,
|
||||
mode_t *mode_and, mode_t *mode_or,
|
||||
int *type, time_t *date, struct FindjoB **subjob,
|
||||
int flag);
|
||||
|
||||
int Findjob_set_found_path(struct FindjoB *o, char *path, int flag);
|
||||
|
||||
int Findjob_get_found_path(struct FindjoB *o, char **path, int flag);
|
||||
|
||||
#else /* Xorriso_findjob_on_expR */
|
||||
|
||||
|
||||
struct FindjoB;
|
||||
|
||||
|
||||
int Findjob_new(struct FindjoB **o, char *start_path, int flag);
|
||||
|
||||
int Findjob_destroy(struct FindjoB **job, int flag);
|
||||
|
||||
|
||||
/* @return 0=no match , 1=match , <0 = error
|
||||
*/
|
||||
int Findjob_test(struct FindjoB *job, char *name,
|
||||
struct stat *boss_stbuf, struct stat *stbuf,
|
||||
int depth, int flag);
|
||||
|
||||
/* @return <0 error, >=0 see xorriso.c struct FindjoB.action
|
||||
*/
|
||||
int Findjob_get_action(struct FindjoB *o, int flag);
|
||||
|
||||
/* @return <0 error, >=0 see xorriso.c struct FindjoB.action
|
||||
*/
|
||||
int Findjob_get_action_parms(struct FindjoB *o, char **target, char **text_2,
|
||||
uid_t *user, gid_t *group,
|
||||
mode_t *mode_and, mode_t *mode_or,
|
||||
int *type, time_t *date, struct FindjoB **subjob,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_target(struct FindjoB *o, int action, char *target,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chgrp(struct FindjoB *o, gid_t group, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chmod(struct FindjoB *o,
|
||||
mode_t mode_and, mode_t mode_or, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_ad(struct FindjoB *o, int type, time_t date, int flag);
|
||||
|
||||
int Findjob_set_start_path(struct FindjoB *o, char *start_path, int flag);
|
||||
|
||||
int Findjob_set_action_found_path(struct FindjoB *o, int flag);
|
||||
|
||||
int Findjob_get_start_path(struct FindjoB *o, char **start_path, int flag);
|
||||
|
||||
int Findjob_set_lba_range(struct FindjoB *o, int start_lba, int count,
|
||||
int flag);
|
||||
|
||||
int Findjob_get_lba_damage_filter(struct FindjoB *o, int *start_lba,
|
||||
int *end_lba, int *damage_filter, int flag);
|
||||
|
||||
int Findjob_get_commit_filter(struct FindjoB *o, int *commit_filter, int flag);
|
||||
|
||||
int Findjob_get_acl_filter(struct FindjoB *o, int *acl_filter, int flag);
|
||||
|
||||
int Findjob_get_xattr_filter(struct FindjoB *o, int *xattr_filter, int flag);
|
||||
|
||||
int Findjob_get_aaip_filter(struct FindjoB *o, int *aaip_filter, int flag);
|
||||
|
||||
int Findjob_get_filter_filter(struct FindjoB *o, int *value, int flag);
|
||||
|
||||
int Findjob_set_wanted_node(struct FindjoB *o, void *wanted_node, int flag);
|
||||
|
||||
int Findjob_get_wanted_node(struct FindjoB *o, void **wanted_node, int flag);
|
||||
|
||||
int Findjob_set_found_path(struct FindjoB *o, char *path, int flag);
|
||||
|
||||
int Findjob_get_found_path(struct FindjoB *o, char **path, int flag);
|
||||
|
||||
#endif /* ! Xorriso_findjob_on_expR */
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_findjob_includeD */
|
||||
|
1180
libisoburn/branches/1.2.2/xorriso/iso_img.c
Normal file
1180
libisoburn/branches/1.2.2/xorriso/iso_img.c
Normal file
File diff suppressed because it is too large
Load Diff
44
libisoburn/branches/1.2.2/xorriso/iso_img.h
Normal file
44
libisoburn/branches/1.2.2/xorriso/iso_img.h
Normal file
@ -0,0 +1,44 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which operate on ISO images
|
||||
and their global properties.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_iso_img_includeD
|
||||
#define Xorriso_pvt_iso_img_includeD yes
|
||||
|
||||
|
||||
int Xorriso_update_volid(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_record_boot_info(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_assert_volid(struct XorrisO *xorriso, int msc1, int flag);
|
||||
|
||||
int Xorriso_is_isohybrid(struct XorrisO *xorriso, IsoFile *bootimg_node,
|
||||
int flag);
|
||||
|
||||
int Xorriso_boot_item_status(struct XorrisO *xorriso, char *cat_path,
|
||||
char *bin_path, int platform_id,
|
||||
int patch_isolinux, int emul, off_t load_size,
|
||||
unsigned char *id_string,
|
||||
unsigned char *selection_crit, char *form,
|
||||
char *filter, FILE *fp, int flag);
|
||||
|
||||
int Xorriso__append_boot_params(char *line, ElToritoBootImage *bootimg,
|
||||
int flag);
|
||||
|
||||
int Xorriso_get_volume(struct XorrisO *xorriso, IsoImage **volume,
|
||||
int flag);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_iso_img_includeD */
|
||||
|
3463
libisoburn/branches/1.2.2/xorriso/iso_manip.c
Normal file
3463
libisoburn/branches/1.2.2/xorriso/iso_manip.c
Normal file
File diff suppressed because it is too large
Load Diff
74
libisoburn/branches/1.2.2/xorriso/iso_manip.h
Normal file
74
libisoburn/branches/1.2.2/xorriso/iso_manip.h
Normal file
@ -0,0 +1,74 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which manipulate the
|
||||
libisofs tree model.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_iso_manip_includeD
|
||||
#define Xorriso_pvt_iso_manip_includeD yes
|
||||
|
||||
|
||||
int Xorriso_transfer_properties(struct XorrisO *xorriso, struct stat *stbuf,
|
||||
char *disk_path, IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_graft_split(struct XorrisO *xorriso, IsoImage *volume,
|
||||
IsoDir *dir, char *disk_path, char *img_name,
|
||||
char *nominal_source, char *nominal_target,
|
||||
off_t size, IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
|
||||
IsoDir *dir, char *disk_path, char *img_name,
|
||||
char *nominal_source, char *nominal_target,
|
||||
off_t offset, off_t cut_size,
|
||||
IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_add_tree(struct XorrisO *xorriso, IsoDir *dir,
|
||||
char *img_dir_path, char *disk_dir_path,
|
||||
struct LinkiteM *link_stack, int flag);
|
||||
|
||||
int Xorriso_copy_implicit_properties(struct XorrisO *xorriso, IsoDir *dir,
|
||||
char *full_img_path, char *img_path, char *full_disk_path, int flag);
|
||||
|
||||
int Xorriso_mkisofs_lower_r(struct XorrisO *xorriso, IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_widen_hardlink(struct XorrisO *xorriso, void * boss_iter,
|
||||
IsoNode *node,
|
||||
char *abs_path, char *iso_prefix, char *disk_prefix,
|
||||
int flag);
|
||||
|
||||
|
||||
int Xorriso_cannot_create_iter(struct XorrisO *xorriso, int iso_error,
|
||||
int flag);
|
||||
|
||||
int Xorriso_findi_iter(struct XorrisO *xorriso, IsoDir *dir_node, off_t *mem,
|
||||
IsoDirIter **iter,
|
||||
IsoNode ***node_array, int *node_count, int *node_idx,
|
||||
IsoNode **iterated_node, int flag);
|
||||
|
||||
int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
IsoDirIter *boss_iter, off_t boss_mem,
|
||||
char *abs_path, char *show_path,
|
||||
IsoNode *node, int depth, int flag);
|
||||
|
||||
int Xorriso_findi_headline(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
int flag);
|
||||
|
||||
int Xorriso_findi_sorted(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
off_t boss_mem, int filec, char **filev, int flag);
|
||||
|
||||
int Xorriso_all_node_array(struct XorrisO *xorriso, int addon_nodes, int flag);
|
||||
|
||||
|
||||
int Xorriso__file_start_lba(IsoNode *node, int *lba, int flag);
|
||||
|
||||
int Xorriso__mark_update_xinfo(void *data, int flag);
|
||||
int Xorriso__mark_update_cloner(void *old_data, void **new_data, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_iso_manip_includeD */
|
||||
|
2451
libisoburn/branches/1.2.2/xorriso/iso_tree.c
Normal file
2451
libisoburn/branches/1.2.2/xorriso/iso_tree.c
Normal file
File diff suppressed because it is too large
Load Diff
97
libisoburn/branches/1.2.2/xorriso/iso_tree.h
Normal file
97
libisoburn/branches/1.2.2/xorriso/iso_tree.h
Normal file
@ -0,0 +1,97 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which access nodes of the
|
||||
libisofs tree model.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_iso_tree_includeD
|
||||
#define Xorriso_pvt_iso_tree_includeD yes
|
||||
|
||||
|
||||
#define LIBISO_ISDIR(node) (iso_node_get_type(node) == LIBISO_DIR)
|
||||
#define LIBISO_ISREG(node) (iso_node_get_type(node) == LIBISO_FILE)
|
||||
#define LIBISO_ISLNK(node) (iso_node_get_type(node) == LIBISO_SYMLINK)
|
||||
#define LIBISO_ISCHR(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
|
||||
S_ISCHR(iso_node_get_mode(node)))
|
||||
#define LIBISO_ISBLK(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
|
||||
S_ISBLK(iso_node_get_mode(node)))
|
||||
#define LIBISO_ISFIFO(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
|
||||
S_ISFIFO(iso_node_get_mode(node)))
|
||||
#define LIBISO_ISSOCK(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
|
||||
S_ISSOCK(iso_node_get_mode(node)))
|
||||
#define LIBISO_ISBOOT(node) (iso_node_get_type(node) == LIBISO_BOOT)
|
||||
|
||||
|
||||
int Xorriso_node_from_path(struct XorrisO *xorriso, IsoImage *volume,
|
||||
char *path, IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_get_node_by_path(struct XorrisO *xorriso,
|
||||
char *in_path, char *eff_path,
|
||||
IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_dir_from_path(struct XorrisO *xorriso, char *purpose,
|
||||
char *path, IsoDir **dir_node, int flag);
|
||||
|
||||
int Xorriso_node_get_dev(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *path, dev_t *dev, int flag);
|
||||
|
||||
int Xorriso_fake_stbuf(struct XorrisO *xorriso, char *path, struct stat *stbuf,
|
||||
IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_node_is_valid(struct XorrisO *xorriso, IsoNode *in_node, int flag);
|
||||
|
||||
int Xorriso_path_from_node(struct XorrisO *xorriso, IsoNode *in_node,
|
||||
char path[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_path_from_lba(struct XorrisO *xorriso, IsoNode *node, int lba,
|
||||
char path[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_get_attr_value(struct XorrisO *xorriso, void *in_node, char *path,
|
||||
char *name, size_t *value_length, char **value, int flag);
|
||||
|
||||
int Xorriso_stream_type(struct XorrisO *xorriso, IsoNode *node,
|
||||
IsoStream *stream, char type_text[], int flag);
|
||||
|
||||
|
||||
int Xorriso_show_du_subs(struct XorrisO *xorriso, IsoDir *dir_node,
|
||||
char *abs_path, char *rel_path, off_t *size,
|
||||
off_t boss_mem, int flag);
|
||||
|
||||
int Xorriso_sorted_dir_i(struct XorrisO *xorriso, IsoDir *dir_node,
|
||||
int *filec, char ***filev, off_t boss_mem, int flag);
|
||||
|
||||
int Xorriso_obtain_pattern_files_i(
|
||||
struct XorrisO *xorriso, char *wd, IsoDir *dir,
|
||||
int *filec, char **filev, int count_limit, off_t *mem,
|
||||
int *dive_count, int flag);
|
||||
|
||||
int Xorriso__start_end_lbas(IsoNode *node,
|
||||
int *lba_count, int **start_lbas, int **end_lbas,
|
||||
off_t *size, int flag);
|
||||
|
||||
int Xorriso__file_start_lba(IsoNode *node,
|
||||
int *lba, int flag);
|
||||
|
||||
int Xorriso_file_eval_damage(struct XorrisO *xorriso, IsoNode *node,
|
||||
off_t *damage_start, off_t *damage_end,
|
||||
int flag);
|
||||
|
||||
int Xorriso_report_lba(struct XorrisO *xorriso, char *show_path,
|
||||
IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_report_damage(struct XorrisO *xorriso, char *show_path,
|
||||
IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_getfname(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
int Xorriso_retrieve_disk_path(struct XorrisO *xorriso, IsoNode *node,
|
||||
char disk_path[SfileadrL], int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_iso_tree_includeD */
|
||||
|
888
libisoburn/branches/1.2.2/xorriso/lib_mgt.c
Normal file
888
libisoburn/branches/1.2.2/xorriso/lib_mgt.c
Normal file
@ -0,0 +1,888 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains functions which manage the relation between xorriso
|
||||
and the libraries: libburn, libisofs, libisoburn.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#else
|
||||
#ifdef HAVE_INTTYPES_H
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* for -charset */
|
||||
#include <iconv.h>
|
||||
#include <langinfo.h>
|
||||
|
||||
#ifdef Xorriso_standalonE
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
#include "../libjte/libjte.h"
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
#include <libjte/libjte.h>
|
||||
#endif
|
||||
|
||||
#endif /* ! Xorriso_standalonE */
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#include "lib_mgt.h"
|
||||
#include "iso_manip.h"
|
||||
|
||||
|
||||
int Xorriso_abort(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= burn_abort(4440, burn_abort_pacifier, "xorriso : ");
|
||||
if(ret<=0) {
|
||||
fprintf(stderr,
|
||||
"\nxorriso : ABORT : Cannot cancel burn session and release drive.\n");
|
||||
return(0);
|
||||
}
|
||||
fprintf(stderr,
|
||||
"xorriso : ABORT : Drive is released and library is shut down now.\n");
|
||||
fprintf(stderr,
|
||||
"xorriso : ABORT : Program done. Even if you do not see a shell prompt.\n");
|
||||
fprintf(stderr, "\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= asynchronous handling (else catch thread, wait, and exit)
|
||||
bit1= dealing with MMC drive in critical state
|
||||
behavior 2 -> behavior 1
|
||||
*/
|
||||
int Xorriso_set_signal_handling(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
char *handler_prefix= NULL;
|
||||
int behavior, mode;
|
||||
|
||||
behavior= Xorriso__get_signal_behavior(0);
|
||||
if(behavior == 0)
|
||||
return(2);
|
||||
if(behavior == 2 && !(flag & 2))
|
||||
mode= 1;
|
||||
else if(behavior == 3)
|
||||
mode= 2;
|
||||
else
|
||||
mode= (flag & 1) * 0x30;
|
||||
handler_prefix= calloc(strlen(xorriso->progname)+3+1, 1);
|
||||
if(handler_prefix==NULL) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot allocate memory for setting signal handler");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/* <<< */
|
||||
sprintf(xorriso->info_text, "burn_set_signal_handling(%d)", mode);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
|
||||
sprintf(handler_prefix, "%s : ", xorriso->progname);
|
||||
burn_set_signal_handling(handler_prefix, NULL, mode);
|
||||
free(handler_prefix);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_startup_libraries(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, major, minor, micro;
|
||||
char *queue_sev, *print_sev, reason[1024];
|
||||
struct iso_zisofs_ctrl zisofs_ctrl= {0, 6, 15};
|
||||
|
||||
|
||||
/* First an ugly compile time check for header version compatibility.
|
||||
If everthing matches, then no C code is produced. In case of mismatch,
|
||||
intentionally faulty C code will be inserted.
|
||||
*/
|
||||
|
||||
/* The minimum requirement of xorriso towards the libisoburn header
|
||||
at compile time is defined in xorriso/xorrisoburn.h
|
||||
xorriso_libisoburn_req_major
|
||||
xorriso_libisoburn_req_minor
|
||||
xorriso_libisoburn_req_micro
|
||||
It gets compared against the version macros in libburn/libburn.h :
|
||||
isoburn_header_version_major
|
||||
isoburn_header_version_minor
|
||||
isoburn_header_version_micro
|
||||
If the header is too old then the following code shall cause failure of
|
||||
cdrskin compilation rather than to allow production of a program with
|
||||
unpredictable bugs or memory corruption.
|
||||
The compiler messages supposed to appear in this case are:
|
||||
error: 'LIBISOBURN_MISCONFIGURATION' undeclared (first use in this function)
|
||||
error: 'INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libisoburn_dot_h_TOO_OLD__SEE_xorrisoburn_dot_c' undeclared (first use in this function)
|
||||
error: 'LIBISOBURN_MISCONFIGURATION_' undeclared (first use in this function)
|
||||
*/
|
||||
/* The indendation is an advise of man gcc to help old compilers ignoring */
|
||||
#if xorriso_libisoburn_req_major > isoburn_header_version_major
|
||||
#define Isoburn_libisoburn_dot_h_too_olD 1
|
||||
#endif
|
||||
#if xorriso_libisoburn_req_major == isoburn_header_version_major && xorriso_libisoburn_req_minor > isoburn_header_version_minor
|
||||
#define Isoburn_libisoburn_dot_h_too_olD 1
|
||||
#endif
|
||||
#if xorriso_libisoburn_req_minor == isoburn_header_version_minor && xorriso_libisoburn_req_micro > isoburn_header_version_micro
|
||||
#define Isoburn_libisoburn_dot_h_too_olD 1
|
||||
#endif
|
||||
|
||||
#ifdef Isoburn_libisoburn_dot_h_too_olD
|
||||
LIBISOBURN_MISCONFIGURATION = 0;
|
||||
INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libisoburn_dot_h_TOO_OLD__SEE_xorrisoburn_dot_c = 0;
|
||||
LIBISOBURN_MISCONFIGURATION_ = 0;
|
||||
#endif
|
||||
|
||||
/* End of ugly compile time test (scroll up for explanation) */
|
||||
|
||||
reason[0]= 0;
|
||||
ret= isoburn_initialize(reason, 0);
|
||||
if(ret==0) {
|
||||
sprintf(xorriso->info_text, "Cannot initialize libraries");
|
||||
if(reason[0])
|
||||
sprintf(xorriso->info_text+strlen(xorriso->info_text),
|
||||
". Reason given:\n%s", reason);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(0);
|
||||
}
|
||||
ret= isoburn_is_compatible(isoburn_header_version_major,
|
||||
isoburn_header_version_minor,
|
||||
isoburn_header_version_micro, 0);
|
||||
if(ret<=0) {
|
||||
isoburn_version(&major, &minor, µ);
|
||||
sprintf(xorriso->info_text,
|
||||
"libisoburn version too old: %d.%d.%d . Need at least: %d.%d.%d .\n",
|
||||
major, minor, micro,
|
||||
isoburn_header_version_major, isoburn_header_version_minor,
|
||||
isoburn_header_version_micro);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
xorriso->libs_are_started= 1;
|
||||
|
||||
queue_sev= "ALL";
|
||||
if(xorriso->library_msg_direct_print) {
|
||||
|
||||
/* >>> need option for controlling this in XorrisO.
|
||||
See also Xorriso_msgs_submit */;
|
||||
|
||||
print_sev= xorriso->report_about_text;
|
||||
} else
|
||||
print_sev= "NEVER";
|
||||
|
||||
iso_set_msgs_severities(queue_sev, print_sev, "libsofs : ");
|
||||
burn_msgs_set_severities(queue_sev, print_sev, "libburn : ");
|
||||
|
||||
/* ??? >>> do we want united queues ? */
|
||||
/* burn_set_messenger(iso_get_messenger()); */
|
||||
|
||||
isoburn_set_msgs_submit(Xorriso_msgs_submit_void, (void *) xorriso,
|
||||
(3<<2) | 128 , 0);
|
||||
|
||||
ret= Xorriso_set_signal_handling(xorriso, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
ret = iso_zisofs_get_params(&zisofs_ctrl, 0);
|
||||
if (ret == 1) {
|
||||
xorriso->zisofs_block_size= xorriso->zisofs_block_size_default=
|
||||
(1 << zisofs_ctrl.block_size_log2);
|
||||
xorriso->zlib_level= xorriso->zlib_level_default=
|
||||
zisofs_ctrl.compression_level;
|
||||
}
|
||||
|
||||
iso_node_xinfo_make_clonable(Xorriso__mark_update_xinfo,
|
||||
Xorriso__mark_update_cloner, 0);
|
||||
|
||||
/* Second initialization. This time with libs. */
|
||||
Xorriso_preparer_string(xorriso, xorriso->preparer_id, 0);
|
||||
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(reason[0]) {
|
||||
sprintf(xorriso->info_text, "%s", reason);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
}
|
||||
strcpy(xorriso->info_text, "Using ");
|
||||
strncat(xorriso->info_text, burn_scsi_transport_id(0), 1024);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= global shutdown of libraries */
|
||||
int Xorriso_detach_libraries(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
Xorriso_give_up_drive(xorriso, 3);
|
||||
if(xorriso->in_volset_handle!=NULL) { /* standalone image */
|
||||
iso_image_unref((IsoImage *) xorriso->in_volset_handle);
|
||||
xorriso->in_volset_handle= NULL;
|
||||
Sectorbitmap_destroy(&(xorriso->in_sector_map), 0);
|
||||
Xorriso_destroy_di_array(xorriso, 0);
|
||||
Xorriso_destroy_hln_array(xorriso, 0);
|
||||
xorriso->boot_count= 0;
|
||||
}
|
||||
if(flag&1) {
|
||||
if(xorriso->libs_are_started==0)
|
||||
return(0);
|
||||
isoburn_finish();
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= suppress messages below UPDATE
|
||||
bit1= suppress messages below FAILURE
|
||||
*/
|
||||
int Xorriso_set_image_severities(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
char *queue_sev, *print_sev;
|
||||
|
||||
if(flag&2)
|
||||
queue_sev= "FAILURE";
|
||||
else if(flag&1)
|
||||
queue_sev= "UPDATE";
|
||||
else
|
||||
queue_sev= "ALL";
|
||||
if(xorriso->library_msg_direct_print)
|
||||
print_sev= xorriso->report_about_text;
|
||||
else
|
||||
print_sev= "NEVER";
|
||||
iso_set_msgs_severities(queue_sev, print_sev, "libisofs : ");
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0=prepare for a burn run */
|
||||
int Xorriso_set_abort_severity(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, abort_on_number;
|
||||
char *sev_text;
|
||||
static int note_number= -1, failure_number= -1;
|
||||
|
||||
if(note_number==-1)
|
||||
Xorriso__text_to_sev("NOTE", ¬e_number, 0);
|
||||
if(failure_number==-1)
|
||||
Xorriso__text_to_sev("FAILURE", &failure_number, 0);
|
||||
sev_text= xorriso->abort_on_text;
|
||||
ret= Xorriso__text_to_sev(xorriso->abort_on_text, &abort_on_number, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
if(abort_on_number<note_number)
|
||||
sev_text= "NOTE";
|
||||
else if(abort_on_number>failure_number)
|
||||
sev_text= "FAILURE";
|
||||
ret= iso_set_abort_severity(sev_text);
|
||||
return(ret>=0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_report_lib_versions(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int major, minor, micro;
|
||||
int req_major, req_minor, req_micro;
|
||||
|
||||
iso_lib_version(&major, &minor, µ);
|
||||
isoburn_libisofs_req(&req_major, &req_minor, &req_micro);
|
||||
sprintf(xorriso->result_line,
|
||||
"libisofs in use : %d.%d.%d (min. %d.%d.%d)\n",
|
||||
major, minor, micro, req_major, req_minor, req_micro);
|
||||
Xorriso_result(xorriso, 0);
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
libjte__version(&major, &minor, µ);
|
||||
isoburn_libjte_req(&req_major, &req_minor, &req_micro);
|
||||
sprintf(xorriso->result_line,
|
||||
"libjte in use : %d.%d.%d (min. %d.%d.%d)\n",
|
||||
major, minor, micro, req_major, req_minor, req_micro);
|
||||
Xorriso_result(xorriso, 0);
|
||||
#endif
|
||||
|
||||
burn_version(&major, &minor, µ);
|
||||
isoburn_libburn_req(&req_major, &req_minor, &req_micro);
|
||||
sprintf(xorriso->result_line,
|
||||
"libburn in use : %d.%d.%d (min. %d.%d.%d)\n",
|
||||
major, minor, micro, req_major, req_minor, req_micro);
|
||||
Xorriso_result(xorriso, 0);
|
||||
strcpy(xorriso->result_line, "libburn OS adapter: ");
|
||||
strncat(xorriso->result_line, burn_scsi_transport_id(0), 1024);
|
||||
strcat(xorriso->result_line, "\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
isoburn_version(&major, &minor, µ);
|
||||
sprintf(xorriso->result_line,
|
||||
"libisoburn in use : %d.%d.%d (min. %d.%d.%d)\n",
|
||||
major, minor, micro,
|
||||
isoburn_header_version_major, isoburn_header_version_minor,
|
||||
isoburn_header_version_micro);
|
||||
Xorriso_result(xorriso, 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__sev_to_text(int severity, char **severity_name,
|
||||
int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= iso_sev_to_text(severity, severity_name);
|
||||
if(ret>0)
|
||||
return(ret);
|
||||
ret= burn_sev_to_text(severity, severity_name, 0);
|
||||
if(ret>0)
|
||||
return(ret);
|
||||
*severity_name= "";
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__text_to_sev(char *severity_name, int *severity_number, int flag)
|
||||
{
|
||||
int ret= 1;
|
||||
char severity[20];
|
||||
|
||||
Xorriso__to_upper(severity_name, severity, (int) sizeof(severity), 0);
|
||||
ret= iso_text_to_sev(severity, severity_number);
|
||||
if(ret>0)
|
||||
return(ret);
|
||||
ret= burn_text_to_sev(severity, severity_number, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= report libisofs error text
|
||||
bit1= victim is disk_path
|
||||
bit2= do not inquire libisofs, report msg_text and min_severity
|
||||
*/
|
||||
int Xorriso_report_iso_error(struct XorrisO *xorriso, char *victim,
|
||||
int iso_error_code, char msg_text[], int os_errno,
|
||||
char min_severity[], int flag)
|
||||
{
|
||||
int error_code, iso_sev, min_sev, ret;
|
||||
char *sev_text_pt, *msg_text_pt= NULL;
|
||||
char *sfe= NULL;
|
||||
static int sorry_sev= -1;
|
||||
|
||||
Xorriso_alloc_meM(sfe, char, 6 * SfileadrL);
|
||||
|
||||
if(sorry_sev<0)
|
||||
Xorriso__text_to_sev("SORRY", &sorry_sev, 0);
|
||||
|
||||
if(flag&4) {
|
||||
error_code= 0x00050000;
|
||||
Xorriso__text_to_sev(min_severity, &iso_sev, 0);
|
||||
} else {
|
||||
error_code= iso_error_get_code(iso_error_code);
|
||||
if(error_code < 0x00030000 || error_code >= 0x00040000)
|
||||
error_code= (error_code & 0xffff) | 0x00050000;
|
||||
if(flag&1)
|
||||
msg_text_pt= (char *) iso_error_to_msg(iso_error_code);
|
||||
iso_sev= iso_error_get_severity(iso_error_code);
|
||||
}
|
||||
if(msg_text_pt==NULL)
|
||||
msg_text_pt= msg_text;
|
||||
|
||||
if(iso_sev >= sorry_sev && (flag & 2) && victim[0])
|
||||
Xorriso_msgs_submit(xorriso, 0, victim, 0, "ERRFILE", 0);
|
||||
sev_text_pt= min_severity;
|
||||
Xorriso__text_to_sev(min_severity, &min_sev, 0);
|
||||
if(min_sev < iso_sev && !(flag&4))
|
||||
Xorriso__sev_to_text(iso_sev, &sev_text_pt, 0);
|
||||
strcpy(sfe, msg_text_pt);
|
||||
if(victim[0]) {
|
||||
strcat(sfe, ": ");
|
||||
Text_shellsafe(victim, sfe+strlen(sfe), 0);
|
||||
}
|
||||
ret= Xorriso_msgs_submit(xorriso, error_code, sfe, os_errno, sev_text_pt, 4);
|
||||
ex:;
|
||||
Xorriso_free_meM(sfe);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_get_local_charset(struct XorrisO *xorriso, char **name, int flag)
|
||||
{
|
||||
(*name)= iso_get_local_charset(0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_set_local_charset(struct XorrisO *xorriso, char *name, int flag)
|
||||
{
|
||||
int ret;
|
||||
char *nl_charset;
|
||||
iconv_t iconv_ret= (iconv_t) -1;
|
||||
|
||||
nl_charset= nl_langinfo(CODESET);
|
||||
if(name == NULL)
|
||||
name= nl_charset;
|
||||
|
||||
if(name != NULL) {
|
||||
iconv_ret= iconv_open(nl_charset, name);
|
||||
if(iconv_ret == (iconv_t) -1)
|
||||
goto cannot;
|
||||
else
|
||||
iconv_close(iconv_ret);
|
||||
}
|
||||
ret= iso_set_local_charset(name, 0);
|
||||
if(ret <= 0) {
|
||||
cannot:;
|
||||
sprintf(xorriso->info_text,
|
||||
"-local_charset: Cannot assume as local character set: ");
|
||||
Text_shellsafe(name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
return(0);
|
||||
}
|
||||
sprintf(xorriso->info_text, "Local character set is now assumed as: ");
|
||||
Text_shellsafe(name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_process_msg_queues(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, error_code= 0, os_errno= 0, count= 0, pass, imgid, tunneled;
|
||||
int name_prefix_code;
|
||||
char severity[80];
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
char *msg;
|
||||
#endif
|
||||
|
||||
if(!xorriso->libs_are_started)
|
||||
return(1);
|
||||
for(pass= 0; pass< 3; pass++) {
|
||||
while(1) {
|
||||
tunneled= 0;
|
||||
if(pass==0) {
|
||||
|
||||
ret= 0;
|
||||
#ifdef Xorriso_with_libjtE
|
||||
if(xorriso->libjte_handle != NULL) {
|
||||
msg= libjte_get_next_message(xorriso->libjte_handle);
|
||||
if(msg != NULL) {
|
||||
sprintf(xorriso->info_text, "%1.4095s", msg);
|
||||
free(msg);
|
||||
strcpy(severity, "NOTE");
|
||||
error_code= 0;
|
||||
os_errno= 0;
|
||||
ret= 1;
|
||||
}
|
||||
}
|
||||
#endif /* Xorriso_with_libjtE */
|
||||
|
||||
} else if(pass==1)
|
||||
ret= iso_obtain_msgs("ALL", &error_code, &imgid,
|
||||
xorriso->info_text, severity);
|
||||
else {
|
||||
ret= burn_msgs_obtain("ALL", &error_code, xorriso->info_text, &os_errno,
|
||||
severity);
|
||||
if((error_code>=0x00030000 && error_code<0x00040000) ||
|
||||
(error_code>=0x00050000 && error_code<0x00060000))
|
||||
tunneled= -1; /* "libisofs:" */
|
||||
else if(error_code>=0x00060000 && error_code<0x00070000)
|
||||
tunneled= 1; /* "libisoburn:" */
|
||||
}
|
||||
if(ret<=0)
|
||||
break;
|
||||
|
||||
/* <<< tunneled MISHAP from libisoburn through libburn
|
||||
or well known error codes of MISHAP events
|
||||
With libburn-0.4.4 this is not necessary */
|
||||
if(error_code==0x5ff73 || error_code==0x3ff73 ||
|
||||
error_code==0x3feb9 || error_code==0x3feb2)
|
||||
strcpy(severity, "MISHAP");
|
||||
else if(error_code==0x51001)
|
||||
strcpy(severity, "ERRFILE");
|
||||
|
||||
if(pass == 0)
|
||||
name_prefix_code= 0;
|
||||
else
|
||||
name_prefix_code= pass + tunneled;
|
||||
Xorriso_msgs_submit(xorriso, error_code, xorriso->info_text, os_errno,
|
||||
severity, name_prefix_code << 2);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if(xorriso->library_msg_direct_print && count>0) {
|
||||
sprintf(xorriso->info_text," (%d library messages repeated by xorriso)\n",
|
||||
count);
|
||||
Xorriso_info(xorriso, 0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_md5_start(struct XorrisO *xorriso, void **ctx, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= iso_md5_start(ctx);
|
||||
if(ret == 1)
|
||||
return(1);
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_md5_compute(struct XorrisO *xorriso, void *ctx,
|
||||
char *data, int datalen, int flag)
|
||||
{
|
||||
iso_md5_compute(ctx, data, datalen);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_md5_end(struct XorrisO *xorriso, void **ctx, char md5[16],
|
||||
int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= iso_md5_end(ctx, md5);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret <= 0)
|
||||
return(0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= avoid library calls
|
||||
*/
|
||||
int Xorriso_preparer_string(struct XorrisO *xorriso, char xorriso_id[129],
|
||||
int flag)
|
||||
{
|
||||
int major, minor, micro;
|
||||
|
||||
xorriso_id[0]= 0;
|
||||
sprintf(xorriso_id, "XORRISO-%d.%d.%d ",
|
||||
Xorriso_header_version_majoR, Xorriso_header_version_minoR,
|
||||
Xorriso_header_version_micrO);
|
||||
if(strlen(xorriso_id) + strlen(Xorriso_timestamP) < 128)
|
||||
strcat(xorriso_id, Xorriso_timestamP);
|
||||
if(flag & 1)
|
||||
return(1);
|
||||
isoburn_version(&major, &minor, µ);
|
||||
if(strlen(xorriso_id) < 100)
|
||||
sprintf(xorriso_id + strlen(xorriso_id),
|
||||
", LIBISOBURN-%d.%d.%d", major, minor, micro);
|
||||
iso_lib_version(&major, &minor, µ);
|
||||
if(strlen(xorriso_id) < 100)
|
||||
sprintf(xorriso_id + strlen(xorriso_id),
|
||||
", LIBISOFS-%d.%d.%d", major, minor, micro);
|
||||
burn_version(&major, &minor, µ);
|
||||
if(strlen(xorriso_id) < 100)
|
||||
sprintf(xorriso_id + strlen(xorriso_id),
|
||||
", LIBBURN-%d.%d.%d", major, minor, micro);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
|
||||
int Xorriso_assert_jte_handle(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if(xorriso->libjte_handle == NULL) {
|
||||
ret= libjte_new(&(xorriso->libjte_handle), 0);
|
||||
if(ret <= 0 || xorriso->libjte_handle == NULL) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-jigdo: Failed to create libjte environment object");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(-1);
|
||||
}
|
||||
/* no stderr, no exit() */
|
||||
libjte_set_error_behavior(xorriso->libjte_handle, 0, 0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
#endif /* Xorriso_with_libjtE */
|
||||
|
||||
|
||||
int Xorriso_jigdo_interpreter(struct XorrisO *xorriso, char *aspect, char *arg,
|
||||
int flag)
|
||||
{
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
|
||||
int ret, num;
|
||||
struct libjte_env *jte;
|
||||
char *msg = NULL;
|
||||
|
||||
if(strcmp(aspect, "clear") == 0) {
|
||||
if(xorriso->libjte_handle != NULL)
|
||||
libjte_destroy(&(xorriso->libjte_handle));
|
||||
Xorriso_lst_destroy_all(&(xorriso->jigdo_params), 0);
|
||||
Xorriso_lst_destroy_all(&(xorriso->jigdo_values), 0);
|
||||
xorriso->libjte_params_given= 0;
|
||||
return(1);
|
||||
}
|
||||
ret= Xorriso_assert_jte_handle(xorriso, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
jte= xorriso->libjte_handle;
|
||||
|
||||
if(strcmp(aspect, "verbose") == 0) {
|
||||
if(strcmp(arg, "on") == 0) {
|
||||
libjte_set_verbose(jte, 1);
|
||||
/* Direct libjte messages to stderr, rather than message list */
|
||||
libjte_set_error_behavior(xorriso->libjte_handle, 1, 0);
|
||||
xorriso->libjte_params_given|= 2;
|
||||
} else if(strcmp(arg, "off") == 0) {
|
||||
libjte_set_verbose(jte, 0);
|
||||
libjte_set_error_behavior(xorriso->libjte_handle, 0, 0);
|
||||
xorriso->libjte_params_given&= ~2;
|
||||
} else
|
||||
goto bad_arg;
|
||||
} else if(strcmp(aspect, "template_path") == 0 ||
|
||||
strcmp(aspect, "-jigdo-template") == 0) {
|
||||
ret= libjte_set_template_path(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 4;
|
||||
} else if(strcmp(aspect, "jigdo_path") == 0 ||
|
||||
strcmp(aspect, "-jigdo-jigdo") == 0) {
|
||||
ret= libjte_set_jigdo_path(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 8;
|
||||
} else if(strcmp(aspect, "md5_path") == 0 ||
|
||||
strcmp(aspect, "-md5-list") == 0) {
|
||||
ret= libjte_set_md5_path(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 16;
|
||||
} else if(strcmp(aspect, "min_size") == 0 ||
|
||||
strcmp(aspect, "-jigdo-min-file-size") == 0) {
|
||||
num= Scanf_io_size(arg, 0);
|
||||
ret= libjte_set_min_size(jte, num);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 32;
|
||||
} else if(strcmp(aspect, "checksum_iso") == 0 ||
|
||||
strcmp(aspect, "-checksum_algorithm_iso") == 0) {
|
||||
ret= libjte_set_checksum_iso(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 64;
|
||||
} else if(strcmp(aspect, "checksum_template") == 0 ||
|
||||
strcmp(aspect, "-checksum_algorithm_template") == 0) {
|
||||
ret= libjte_set_checksum_template(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 128;
|
||||
} else if(strcmp(aspect, "compression") == 0 ||
|
||||
strcmp(aspect, "-jigdo-template-compress") == 0) {
|
||||
ret= libjte_set_compression(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 256;
|
||||
} else if(strcmp(aspect, "exclude") == 0 ||
|
||||
strcmp(aspect, "-jigdo-exclude") == 0) {
|
||||
ret= libjte_add_exclude(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 512;
|
||||
} else if(strcmp(aspect, "demand_md5") == 0 ||
|
||||
strcmp(aspect, "-jigdo-force-md5") == 0) {
|
||||
ret= libjte_add_md5_demand(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 1024;
|
||||
} else if(strcmp(aspect, "mapping") == 0 ||
|
||||
strcmp(aspect, "-jigdo-map") == 0) {
|
||||
ret= libjte_add_mapping(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 2048;
|
||||
} else {
|
||||
sprintf(xorriso->info_text, "-jigdo: unknown aspect '%s'", aspect);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
ret= Xorriso_lst_new(&(xorriso->jigdo_params), aspect, xorriso->jigdo_params,
|
||||
1);
|
||||
if(ret > 0)
|
||||
ret= Xorriso_lst_new(&(xorriso->jigdo_values), arg, xorriso->jigdo_values,
|
||||
1);
|
||||
if(ret <= 0) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
Xorriso_process_msg_queues(xorriso, 0);
|
||||
return(1);
|
||||
|
||||
bad_arg:
|
||||
sprintf(xorriso->info_text, "-jigdo %s : unknown argument '%s'", aspect, arg);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
|
||||
jte_failed:
|
||||
while(1) {
|
||||
msg= libjte_get_next_message(xorriso->libjte_handle);
|
||||
if(msg == NULL)
|
||||
break;
|
||||
sprintf(xorriso->info_text, "%1.4095s", msg);
|
||||
free(msg);
|
||||
msg= NULL;
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
}
|
||||
sprintf(xorriso->info_text, "Experienced libjte failure with: -jigdo %s %s",
|
||||
aspect, arg);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
|
||||
#else /* Xorriso_with_libjtE */
|
||||
|
||||
sprintf(xorriso->info_text,
|
||||
"Jigdo Template Extraction was not enabled at compile time");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
|
||||
#endif /* ! Xorriso_with_libjtE */
|
||||
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_list_extras_result(struct XorrisO *xorriso, char *mode,
|
||||
char *what, int flag)
|
||||
{
|
||||
if(mode[0] != 0 && strcmp(mode, "all") != 0) {
|
||||
if(strcmp(mode, what) != 0 &&
|
||||
(mode[0] != '-' || strcmp(mode + 1, what) != 0))
|
||||
return(2);
|
||||
}
|
||||
Xorriso_result(xorriso, 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_list_extras(struct XorrisO *xorriso, char *mode, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if(strcmp(mode, "codes") == 0) {
|
||||
sprintf(xorriso->result_line,
|
||||
"List of xorriso extra feature codes. Usable with or without dash.\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
sprintf(xorriso->result_line, "Local ACL : -acl\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
sprintf(xorriso->result_line, "Local xattr : -xattr\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
sprintf(xorriso->result_line, "Jigdo files : -jigdo\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
sprintf(xorriso->result_line, "zisofs : -zisofs\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
sprintf(xorriso->result_line, "Ext. filters : -external_filter\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
sprintf(xorriso->result_line, "DVD obs 64 kB: -dvd_obs\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
sprintf(xorriso->result_line, "Readline : -use_readline\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
return(1);
|
||||
}
|
||||
sprintf(xorriso->result_line,
|
||||
"List of xorriso extra features. yes = enabled , no = disabled\n");
|
||||
Xorriso_list_extras_result(xorriso, mode, "list_extras", 0);
|
||||
|
||||
ret= iso_local_attr_support(3);
|
||||
sprintf(xorriso->result_line, "Local ACL : %s\n", ret & 1 ? "yes" : "no");
|
||||
Xorriso_list_extras_result(xorriso, mode, "acl", 0);
|
||||
sprintf(xorriso->result_line, "Local xattr : %s\n", ret & 2 ? "yes" : "no");
|
||||
Xorriso_list_extras_result(xorriso, mode, "xattr", 0);
|
||||
|
||||
sprintf(xorriso->result_line, "Jigdo files : %s\n",
|
||||
#ifdef Xorriso_with_libjtE
|
||||
"yes");
|
||||
#else
|
||||
"no");
|
||||
#endif
|
||||
Xorriso_list_extras_result(xorriso, mode, "jigdo", 0);
|
||||
|
||||
ret= iso_file_add_zisofs_filter(NULL, 4);
|
||||
sprintf(xorriso->result_line, "zisofs : %s\n", ret == 2 ? "yes" : "no");
|
||||
Xorriso_list_extras_result(xorriso, mode, "zisofs", 0);
|
||||
|
||||
sprintf(xorriso->result_line, "Ext. filters : %s\n",
|
||||
#ifdef Xorriso_allow_external_filterS
|
||||
#ifdef Xorriso_allow_extf_suiD
|
||||
"yes , setuid allowed");
|
||||
#else
|
||||
"yes , setuid banned");
|
||||
#endif
|
||||
#else
|
||||
"no");
|
||||
#endif
|
||||
Xorriso_list_extras_result(xorriso, mode, "external_filter", 0);
|
||||
|
||||
sprintf(xorriso->result_line, "DVD obs 64 kB: %s\n",
|
||||
#ifdef Xorriso_dvd_obs_default_64K
|
||||
"yes");
|
||||
#else
|
||||
"no");
|
||||
#endif
|
||||
Xorriso_list_extras_result(xorriso, mode, "dvd_obs", 0);
|
||||
|
||||
sprintf(xorriso->result_line, "Readline : %s\n",
|
||||
#ifdef Xorriso_with_readlinE
|
||||
"yes");
|
||||
#else
|
||||
"no");
|
||||
#endif
|
||||
Xorriso_list_extras_result(xorriso, mode, "use_readline", 0);
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= set num_tiles to default value
|
||||
bit1= set tile_blocks to default value
|
||||
*/
|
||||
int Xorriso_set_data_cache(struct XorrisO *xorriso, void *o,
|
||||
int num_tiles, int tile_blocks, int flag)
|
||||
{
|
||||
int ret, tiles, blocks, set_flag;
|
||||
struct isoburn_read_opts *ropts;
|
||||
|
||||
ropts= (struct isoburn_read_opts *) o;
|
||||
if(flag & (1 | 2)) {
|
||||
isoburn_ropt_get_data_cache(ropts, &tiles, &blocks, &set_flag, 1);
|
||||
if(flag & 1)
|
||||
num_tiles= tiles;
|
||||
if(flag & 2)
|
||||
tile_blocks= blocks;
|
||||
}
|
||||
ret= isoburn_ropt_set_data_cache(ropts, num_tiles, tile_blocks, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
73
libisoburn/branches/1.2.2/xorriso/lib_mgt.h
Normal file
73
libisoburn/branches/1.2.2/xorriso/lib_mgt.h
Normal file
@ -0,0 +1,73 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which manage the relation
|
||||
between xorriso and the libraries: libburn, libisofs, and libisoburn.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_x_includeD
|
||||
#define Xorriso_pvt_x_includeD yes
|
||||
|
||||
|
||||
#ifndef Xorriso_standalonE
|
||||
|
||||
/* The library which does the ISO 9660 / RockRidge manipulations */
|
||||
#include <libisofs/libisofs.h>
|
||||
|
||||
/* The library which does MMC optical drive operations */
|
||||
#include <libburn/libburn.h>
|
||||
|
||||
/* The library which enhances overwriteable media with ISO 9660 multi-session
|
||||
capabilities via the method invented by Andy Polyakov for growisofs */
|
||||
#include <libisoburn/libisoburn.h>
|
||||
|
||||
/* The official xorriso options API. "No shortcuts" */
|
||||
#include "xorriso.h"
|
||||
|
||||
/* The inner description of XorrisO */
|
||||
#include "xorriso_private.h"
|
||||
|
||||
/* The inner isofs- and burn-library interface */
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#else /* ! Xorriso_standalonE */
|
||||
|
||||
#include "../libisofs/libisofs.h"
|
||||
#include "../libburn/libburn.h"
|
||||
#include "../libisoburn/libisoburn.h"
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#endif /* Xorriso_standalonE */
|
||||
|
||||
|
||||
int Xorriso_abort(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* @param flag bit0= suppress messages below UPDATE
|
||||
bit1= suppress messages below FAILURE
|
||||
*/
|
||||
int Xorriso_set_image_severities(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso__sev_to_text(int severity, char **severity_name,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= report libisofs error text
|
||||
bit1= victim is disk_path
|
||||
bit2= do not inquire libisofs, report msg_text and min_severity
|
||||
*/
|
||||
int Xorriso_report_iso_error(struct XorrisO *xorriso, char *victim,
|
||||
int iso_error_code, char msg_text[], int os_errno,
|
||||
char min_severity[], int flag);
|
||||
|
||||
int Xorriso_process_msg_queues(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_x_includeD */
|
||||
|
15
libisoburn/branches/1.2.2/xorriso/make_docs.sh
Executable file
15
libisoburn/branches/1.2.2/xorriso/make_docs.sh
Executable file
@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Produce man page xorriso/xorriso.1 and info file xorriso/xorriso.info
|
||||
# from base file xorriso/xorriso.texi.
|
||||
# Same for xorriso/xorrisofs.texi and xorriso/xorrecord.texi.
|
||||
|
||||
( cd xorriso ; makeinfo ./xorriso.texi )
|
||||
( cd xorriso ; makeinfo ./xorrisofs.texi )
|
||||
( cd xorriso ; makeinfo ./xorrecord.texi )
|
||||
|
||||
xorriso/make_xorriso_1 -auto
|
||||
xorriso/make_xorriso_1 -auto -xorrisofs
|
||||
xorriso/make_xorriso_1 -auto -xorrecord
|
||||
|
||||
|
9
libisoburn/branches/1.2.2/xorriso/make_timestamp.sh
Executable file
9
libisoburn/branches/1.2.2/xorriso/make_timestamp.sh
Executable file
@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Create version timestamp xorriso/xorriso_timestamp.h
|
||||
# to be executed within ./libisoburn-develop
|
||||
|
||||
timestamp="$(date -u '+%Y.%m.%d.%H%M%S')"
|
||||
echo "Version timestamp : $timestamp"
|
||||
echo '#define Xorriso_timestamP "'"$timestamp"'"' >xorriso/xorriso_timestamp.h
|
||||
|
527
libisoburn/branches/1.2.2/xorriso/make_xorriso_1.c
Normal file
527
libisoburn/branches/1.2.2/xorriso/make_xorriso_1.c
Normal file
@ -0,0 +1,527 @@
|
||||
|
||||
/*
|
||||
( cd xorriso ; cc -g -Wall -o make_xorriso_1 make_xorriso_1.c )
|
||||
*/
|
||||
/*
|
||||
Specialized converter from xorriso/xorriso.texi to xorriso/xorriso.1
|
||||
resp. from xorriso/xorrisofs.texi to xorriso/xorrisofs.1
|
||||
|
||||
The conversion rules are described at the beginning of xorriso/xorriso.texi
|
||||
|
||||
Copyright 2010 - 2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
/* The conversion state
|
||||
*/
|
||||
struct Mx1 {
|
||||
|
||||
char prog[4096];
|
||||
|
||||
int count_in;
|
||||
int count_out;
|
||||
|
||||
int skipping; /* <0 stacked skipping , 0= no , >0 counting down */
|
||||
|
||||
};
|
||||
|
||||
int Mx1_substitute(struct Mx1 *m, char line_in[256], char line_out[256],
|
||||
int raw, int upto, int flag);
|
||||
|
||||
|
||||
|
||||
int Mx1_init(struct Mx1 *m, char *prog, int flag)
|
||||
{
|
||||
strncpy(m->prog, prog, sizeof(m->prog) - 1);
|
||||
m->prog[sizeof(m->prog) - 1]= 0;
|
||||
m->count_in= 0;
|
||||
m->count_out= 0;
|
||||
m->skipping= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_report_error(struct Mx1 *m, char *text, int flag)
|
||||
{
|
||||
fprintf(stderr, "%s : line %d : %s\n", m->prog, m->count_in, text);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Mx1__get_word(char *line, char word[256], char **remainder, int flag)
|
||||
{
|
||||
char *cpt, *start;
|
||||
int l;
|
||||
|
||||
word[0]= 0;
|
||||
*remainder= NULL;
|
||||
for(cpt= line; *cpt != 0 && isspace(*cpt); cpt++);
|
||||
if(*cpt == 0)
|
||||
return(0);
|
||||
start= cpt;
|
||||
for(cpt= line; *cpt != 0 && ! isspace(*cpt); cpt++);
|
||||
l= cpt - start;
|
||||
if(l > 0)
|
||||
strncpy(word, start, l);
|
||||
word[l]= 0;
|
||||
*remainder= cpt;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_is_wrap(struct Mx1 *m, char wraps[][20], char *start, char **found,
|
||||
int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i= 0; wraps[i][0] != 0; i++)
|
||||
if(strncmp(start, wraps[i], strlen(wraps[i])) == 0)
|
||||
break;
|
||||
if(wraps[i][0] != 0) {
|
||||
if(found != NULL)
|
||||
*found= wraps[i];
|
||||
return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_is_bold_wrap(struct Mx1 *m, char *start, char **found, int flag)
|
||||
{
|
||||
int ret;
|
||||
static char bold_wraps[][20]= {
|
||||
"@b{", "@dfn{", "@emph{", "@strong{", "@command{",
|
||||
"" };
|
||||
|
||||
ret= Mx1_is_wrap(m, bold_wraps, start, found, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_is_normal_wrap(struct Mx1 *m, char *start, char **found, int flag)
|
||||
{
|
||||
int ret;
|
||||
static char normal_wraps[][20]= {
|
||||
"@var{", "@code{", "@i{", "@abbr{", "@file{", "@option{", "@samp{", "@r{",
|
||||
"" };
|
||||
|
||||
ret= Mx1_is_wrap(m, normal_wraps, start, found, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_is_ignored_wrap(struct Mx1 *m, char *start, char **found, int flag)
|
||||
{
|
||||
int ret;
|
||||
static char ignored_wraps[][20]= {
|
||||
"@ref{", "@xref{",
|
||||
"" };
|
||||
|
||||
ret= Mx1_is_wrap(m, ignored_wraps, start, found, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_is_any_wrap(struct Mx1 *m, char *start, char **found, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= Mx1_is_bold_wrap(m, start, found, 0);
|
||||
if(ret > 0)
|
||||
return(1);
|
||||
ret= Mx1_is_normal_wrap(m, start, found, 0);
|
||||
if(ret > 0)
|
||||
return(2);
|
||||
ret= Mx1_is_ignored_wrap(m, start, found, 0);
|
||||
if(ret > 0)
|
||||
return(3);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= recursion
|
||||
bit1= drop content of brackets
|
||||
*/
|
||||
int Mx1_rewrap(struct Mx1 *m, char **read_pt, char **write_pt,
|
||||
char *write_base, char *envelope,
|
||||
char *front, char *back, int flag)
|
||||
{
|
||||
char *rpt, *wpt, *ept, content[256], msg[256];
|
||||
int l, ret;
|
||||
|
||||
rpt= *read_pt;
|
||||
wpt= *write_pt;
|
||||
|
||||
ept= strchr(rpt, '}');
|
||||
if(ept == NULL) {
|
||||
sprintf(msg, "No closing bracket found for '%s'", envelope);
|
||||
Mx1_report_error(m, msg, 0);
|
||||
return(-1);
|
||||
}
|
||||
/* Mapped {...} content is subject to the rules except {...} mapping. */
|
||||
l= ept - rpt;
|
||||
if(flag & 2)
|
||||
l= 0;
|
||||
if(l > 0) {
|
||||
ret= Mx1_substitute(m, rpt, content, 0, l, 1);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
l= strlen(content);
|
||||
}
|
||||
if((wpt - write_base) + l + strlen(front) + strlen(back) > 255) {
|
||||
Mx1_report_error(m, "Line length overflow while text substitution", 0);
|
||||
return(-1);
|
||||
}
|
||||
strcpy(wpt, front);
|
||||
wpt+= strlen(front);
|
||||
if(l > 0)
|
||||
strncpy(wpt, content, l);
|
||||
wpt+= l;
|
||||
strcpy(wpt, back);
|
||||
wpt+= strlen(back);
|
||||
|
||||
(*read_pt)+= ept - rpt;
|
||||
(*write_pt)= wpt;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= recursion
|
||||
*/
|
||||
int Mx1_substitute(struct Mx1 *m, char line_in[256], char line_out[256],
|
||||
int raw, int upto, int flag)
|
||||
{
|
||||
char *rpt, *wpt, *found;
|
||||
int ret, typ= 0;
|
||||
|
||||
wpt= line_out;
|
||||
for(rpt= line_in; rpt - line_in < upto && *rpt != 0; rpt++) {
|
||||
if(rpt - line_in < raw) {
|
||||
*(wpt++)= *rpt;
|
||||
continue;
|
||||
}
|
||||
if(*rpt == '@') {
|
||||
typ= 0;
|
||||
if(!(flag & 1))
|
||||
typ= Mx1_is_any_wrap(m, rpt, &found, 0);
|
||||
if(typ == 1) {
|
||||
/* @b{...}, @command{...}, @dfn{...}, @emph{...}, @strong{...}
|
||||
get mapped to \fB...\fR .
|
||||
*/
|
||||
rpt+= strlen(found);
|
||||
ret= Mx1_rewrap(m, &rpt, &wpt, line_out,
|
||||
found , "\\fB", "\\fR", flag & 1);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
} else if(typ == 2) {
|
||||
/* @abbr{...}, @code{...}, @file{...}, @i{...}, @option{...}, @r{...},
|
||||
@ref{...}, @samp{...},@var{...}, get mapped to ... .
|
||||
*/
|
||||
rpt+= strlen(found);
|
||||
ret= Mx1_rewrap(m, &rpt, &wpt, line_out, found, "", "", flag & 1);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
} else if(typ == 3) {
|
||||
/* @ref{...}, @xref{...} get mapped to empty text.
|
||||
*/
|
||||
rpt+= strlen(found);
|
||||
ret= Mx1_rewrap(m, &rpt, &wpt, line_out, found , "", "",
|
||||
(flag & 1) | 2);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
} else if(strncmp(rpt, "@email{", 7) == 0 && !(flag & 1)) {
|
||||
/* @email{...} gets mapped to <...> . */
|
||||
rpt+= 7;
|
||||
ret= Mx1_rewrap(m, &rpt, &wpt, line_out, "@email{", "<", ">", 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
} else if(strncmp(rpt, "@minus{}", 8) == 0) {
|
||||
/* @minus{} will become "-". */
|
||||
if((wpt - line_out) + 1 > 255)
|
||||
goto overflow;
|
||||
*(wpt++)= '-';
|
||||
rpt+= 7;
|
||||
|
||||
} else if(strncmp(rpt, "@@", 2) == 0 ||
|
||||
strncmp(rpt, "@{", 2) == 0 ||
|
||||
strncmp(rpt, "@}", 2) == 0) {
|
||||
/* @@ , @{, @} will get stripped of their first @. */
|
||||
if((wpt - line_out) + 1 > 255)
|
||||
goto overflow;
|
||||
*(wpt++)= *(rpt + 1);
|
||||
rpt++;
|
||||
|
||||
} else {
|
||||
if((wpt - line_out) + 1 > 255)
|
||||
goto overflow;
|
||||
*(wpt++)= *(rpt);
|
||||
|
||||
}
|
||||
|
||||
} else if(*rpt == '\\') {
|
||||
/* "\" becomes "\\" */
|
||||
if((wpt - line_out) + 2 > 255)
|
||||
goto overflow;
|
||||
*(wpt++)= '\\';
|
||||
*(wpt++)= '\\';
|
||||
|
||||
} else if((wpt - line_out) + 1 > 255) {
|
||||
overflow:;
|
||||
Mx1_report_error(m, "Line length overflow while text substitution", 0);
|
||||
return(-1);
|
||||
} else
|
||||
*(wpt++)= *rpt;
|
||||
|
||||
}
|
||||
*wpt= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@return 1= line_out is valid, 0= do not put out line_out, -1 = error
|
||||
*/
|
||||
int Mx1_convert(struct Mx1 *m, char line_in[256], char line_out[256], int flag)
|
||||
{
|
||||
int l, num, keep= 0, ret, raw, i, backslash_count;
|
||||
char word[256], buf[256], *remainder, *wpt;
|
||||
|
||||
m->count_in++;
|
||||
l= strlen(line_in);
|
||||
|
||||
if(m->skipping > 0) {
|
||||
m->skipping--;
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* The first line gets discarded. */
|
||||
if(m->count_in == 1)
|
||||
return(0);
|
||||
|
||||
/* Line start "@c man " will become "", the remainder is put out unaltered. */
|
||||
if(strncmp(line_in, "@c man ", 7) == 0) {
|
||||
strcpy(line_out, line_in + 7);
|
||||
m->count_out++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* Lines "@*" will be converted to ".br" */
|
||||
if(strcmp(line_in, "@*") == 0) {
|
||||
strcpy(line_out, ".br");
|
||||
m->count_out++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* @c man-ignore-lines N will discard N following lines.
|
||||
"@c man-ignore-lines begin" discards all following lines
|
||||
up to "@c man-ignore-lines end".
|
||||
*/
|
||||
if(strncmp(line_in, "@c man-ignore-lines ", 20) == 0) {
|
||||
if(strcmp(line_in + 20, "begin") == 0) {
|
||||
m->skipping--;
|
||||
return(0);
|
||||
} else if(strcmp(line_in + 20, "end") == 0) {
|
||||
if(m->skipping < 0)
|
||||
m->skipping++;
|
||||
return(0);
|
||||
} else if(m->skipping == 0) {
|
||||
num= 0;
|
||||
sscanf(line_in + 20, "%d", &num);
|
||||
if(num > 0) {
|
||||
m->skipping= num;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
Mx1_report_error(m, "Inappropriate use of '@c man-ignore-lines'", 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/* Line blocks of "@menu" "@end menu" will be discarded. */
|
||||
if(strcmp(line_in, "@menu") == 0) {
|
||||
m->skipping--;
|
||||
return(0);
|
||||
}
|
||||
if(strcmp(line_in, "@end menu") == 0) {
|
||||
if(m->skipping < 0)
|
||||
m->skipping++;
|
||||
return(0);
|
||||
}
|
||||
if(m->skipping)
|
||||
return(0);
|
||||
|
||||
/* "@item -word words" becomes "\fB\-word\fR words". */
|
||||
/* "@item word words" becomes "\fBword\fR words". */
|
||||
if(strncmp(line_in, "@item ", 6) == 0) {
|
||||
ret= Mx1__get_word(line_in + 6, word, &remainder, 0);
|
||||
if(ret <= 0) {
|
||||
Mx1_report_error(m, "Found no word after @item", 0);
|
||||
return(0);
|
||||
}
|
||||
strcpy(buf, "\\fB");
|
||||
if(word[0] == '-') {
|
||||
if(l >= 255) {
|
||||
Mx1_report_error(m, "Line length overflow while converting @item", 0);
|
||||
return(-1);
|
||||
}
|
||||
strcat(buf, "\\");
|
||||
}
|
||||
|
||||
/* Substitute option text */
|
||||
raw= strlen(buf);
|
||||
strcat(buf, word);
|
||||
ret= Mx1_substitute(m, buf, line_out, raw, strlen(buf), 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
strcpy(buf, line_out);
|
||||
|
||||
strcat(buf, "\\fR");
|
||||
raw= strlen(buf);
|
||||
strcat(buf, remainder);
|
||||
|
||||
/* Substitute arguments text */
|
||||
ret= Mx1_substitute(m, buf, line_out, raw, strlen(buf), 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
m->count_out++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* @strong{... } gets mapped to \fB...\fR . */
|
||||
/* @command{... } gets mapped to \fB...\fR . */
|
||||
/* @minus{} will become "-". */
|
||||
/* Mapped {...} content is subject to the rules except {...} mapping. */
|
||||
/* @@ , @{, @} will get stripped of their first @. */
|
||||
/* "\" becomes "\\" */
|
||||
|
||||
if(line_in[0] != '@' ||
|
||||
Mx1_is_any_wrap(m, line_in, NULL, 0) > 0 ||
|
||||
strncmp(line_in, "@minus{}", 8) == 0 ||
|
||||
strncmp(line_in, "@@", 2) == 0 ||
|
||||
strncmp(line_in, "@{", 2) == 0 ||
|
||||
strncmp(line_in, "@}", 2) == 0 ) {
|
||||
keep= 1;
|
||||
ret= Mx1_substitute(m, line_in, line_out, 0, strlen(line_in), 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/* Other lines which begin by "@" will be discarded. */
|
||||
if(! keep) {
|
||||
if(line_in[0] == '@')
|
||||
return(0);
|
||||
strcpy(line_out, line_in);
|
||||
}
|
||||
|
||||
/* "-" which are not preceded by an uneven number of "\" will get
|
||||
prepended one "\".
|
||||
*/
|
||||
l= strlen(line_out);
|
||||
backslash_count= 0;
|
||||
wpt= buf;
|
||||
for(i= 0; i < l; i++) {
|
||||
if(line_out[i] == '\\')
|
||||
backslash_count++;
|
||||
else if(line_out[i] == '-') {
|
||||
if(backslash_count % 2 == 0)
|
||||
*(wpt++)= '\\';
|
||||
backslash_count= 0;
|
||||
} else
|
||||
backslash_count= 0;
|
||||
*(wpt++)= line_out[i];
|
||||
}
|
||||
*wpt= 0;
|
||||
strcpy(line_out, buf);
|
||||
m->count_out++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ret, l, as_filter= 0, i;
|
||||
char line_in[256], line_out[256], *got;
|
||||
static char name_in[1024]= {"xorriso/xorriso.texi"};
|
||||
static char name_out[1024]= {"xorriso/xorriso.1"};
|
||||
struct Mx1 m;
|
||||
FILE *fp_in= stdin, *fp_out= stdout;
|
||||
|
||||
Mx1_init(&m, argv[0], 0);
|
||||
|
||||
if(argc < 2) {
|
||||
usage:;
|
||||
fprintf(stderr, "usage: %s -auto|-filter [-xorrisofs]\n", argv[0]);
|
||||
fprintf(stderr, " -auto xorriso/xorriso.texi -> xorriso/xorriso.1\n");
|
||||
fprintf(stderr, " -filter stdin -> stdout\n");
|
||||
fprintf(stderr, " -xorrisofs process xorriso/xorrisofs.texi\n");
|
||||
fprintf(stderr, " -xorrecord process xorriso/xorrecord.texi\n");
|
||||
exit(2);
|
||||
}
|
||||
for(i= 1; i < argc; i++) {
|
||||
if(strcmp(argv[i], "-filter") == 0) {
|
||||
as_filter= 1;
|
||||
} else if(strcmp(argv[i], "-auto") == 0) {
|
||||
as_filter= 0;
|
||||
} else if(strcmp(argv[i], "-xorrisofs") == 0) {
|
||||
strcpy(name_in, "xorriso/xorrisofs.texi");
|
||||
strcpy(name_out, "xorriso/xorrisofs.1");
|
||||
} else if(strcmp(argv[i], "-xorrecord") == 0) {
|
||||
strcpy(name_in, "xorriso/xorrecord.texi");
|
||||
strcpy(name_out, "xorriso/xorrecord.1");
|
||||
} else {
|
||||
fprintf(stderr, "%s : unknown option %s\n", argv[0], argv[i]);
|
||||
goto usage;
|
||||
}
|
||||
}
|
||||
|
||||
if(!as_filter) {
|
||||
fp_in= fopen(name_in, "r");
|
||||
if(fp_in == NULL) {
|
||||
fprintf(stderr, "%s : failed to fopen( %s ,r) : %d %s\n",
|
||||
argv[0], name_in, errno, strerror(errno));
|
||||
exit(3);
|
||||
}
|
||||
fp_out= fopen(name_out, "w");
|
||||
if(fp_out == NULL) {
|
||||
fprintf(stderr, "%s : failed to fopen( %s ,w) : %d %s\n",
|
||||
argv[0], name_out, errno, strerror(errno));
|
||||
exit(4);
|
||||
}
|
||||
}
|
||||
while(1) {
|
||||
got= fgets(line_in, sizeof(line_in), fp_in);
|
||||
if(got == NULL)
|
||||
break;
|
||||
l= strlen(line_in);
|
||||
while(l > 0) {
|
||||
if(line_in[l - 1] == '\r' || line_in[l - 1] == '\n') {
|
||||
line_in[l - 1] = 0;
|
||||
l--;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
ret= Mx1_convert(&m, line_in, line_out, 0);
|
||||
if(ret < 0)
|
||||
exit(1);
|
||||
if(ret == 0)
|
||||
continue;
|
||||
fprintf(fp_out, "%s\n", line_out);
|
||||
}
|
||||
exit(0);
|
||||
}
|
345
libisoburn/branches/1.2.2/xorriso/make_xorriso_standalone.sh
Executable file
345
libisoburn/branches/1.2.2/xorriso/make_xorriso_standalone.sh
Executable file
@ -0,0 +1,345 @@
|
||||
#!/bin/sh
|
||||
|
||||
# make_xorriso_standalone.sh
|
||||
# Copyright 2008 - 2012 Thomas Schmitt, scdbackup@gmx.net, GPLv2+
|
||||
#
|
||||
# Not intended for general use in production installations !
|
||||
#
|
||||
# This is a development tool which expects a special setup of directories.
|
||||
# It is to be executed in a common parent of the directories
|
||||
# nglibisofs-develop jte-develop libburn-develop libisoburn-develop
|
||||
# where tarballs or repository copies have been installed of
|
||||
# libisofs jte libburn libisoburn
|
||||
# obtained according to instructions on http://libburnia-project.org.
|
||||
#
|
||||
# It creates a new directory tree
|
||||
# xorriso-standalone
|
||||
# for building GNU xorriso.
|
||||
#
|
||||
# The ./bootstrap script gets applied and a source tarball
|
||||
# is made.
|
||||
#
|
||||
# From that tree can be build a binary xorriso/xorriso which at runtime
|
||||
# does not depend on installed libburnia libraries.
|
||||
# Execute in xorriso-standalone :
|
||||
#
|
||||
# ./configure && make
|
||||
#
|
||||
|
||||
# By the variable setting create_gnu_xorriso="yes"
|
||||
# the result will become a GNU xorriso tarball under GPLv3+.
|
||||
# Without this setting, the result is technically equivalent but
|
||||
# stays under GPLv2+. In that case the files xorriso/*_gnu_xorriso
|
||||
# are merely informative.
|
||||
# Note that it is not permissible to revert the transition from
|
||||
# GPLv2+ to GPLv3+. (Rather derive a new GPLv2+ from libburnia.)
|
||||
|
||||
create_gnu_xorriso="yes"
|
||||
|
||||
|
||||
current_dir=$(pwd)
|
||||
lone_dir="$current_dir"/"xorriso-standalone"
|
||||
|
||||
xorriso_rev=1.2.1
|
||||
# For unstable uploads and patch level 0 of stable releases:
|
||||
xorriso_pl=""
|
||||
# For higher patch levels of stable releases:
|
||||
## xorriso_pl=".pl01"
|
||||
|
||||
with_bootstrap_tarball=1
|
||||
|
||||
create_dir() {
|
||||
if mkdir "$1"
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "Failed to create : $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
goto_dir() {
|
||||
if cd "$1"
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "Failed to cd $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
copy_files() {
|
||||
if cp "$@"
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "Failed to : cp " "$@" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
if test -e "$lone_dir"
|
||||
then
|
||||
echo "Already existing : $lone_dir" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Top level directory
|
||||
|
||||
goto_dir "$current_dir"/libisoburn-develop
|
||||
|
||||
create_dir "$lone_dir"
|
||||
|
||||
copy_files \
|
||||
AUTHORS \
|
||||
CONTRIBUTORS \
|
||||
COPYRIGHT \
|
||||
COPYING \
|
||||
ChangeLog \
|
||||
INSTALL \
|
||||
acinclude.m4 \
|
||||
aclocal.m4 \
|
||||
bootstrap \
|
||||
compile \
|
||||
config.guess \
|
||||
config.status \
|
||||
config.sub \
|
||||
depcomp \
|
||||
install-sh \
|
||||
libtool \
|
||||
ltmain.sh \
|
||||
missing \
|
||||
mkinstalldirs \
|
||||
version.h.in \
|
||||
\
|
||||
"$lone_dir"
|
||||
|
||||
copy_files xorriso/xorriso_bootstrap.txt "$lone_dir"/bootstrap
|
||||
|
||||
copy_files xorriso/configure_ac.txt "$lone_dir"/configure.ac
|
||||
|
||||
copy_files xorriso/xorriso_makefile_am.txt "$lone_dir"/Makefile.am
|
||||
|
||||
|
||||
# libisoburn
|
||||
|
||||
create_dir "$lone_dir"/libisoburn
|
||||
copy_files \
|
||||
libisoburn/*.[ch] \
|
||||
"$lone_dir"/libisoburn
|
||||
copy_files COPYRIGHT "$lone_dir"/libisoburn
|
||||
|
||||
xorriso/convert_man_to_html.sh
|
||||
|
||||
create_dir "$lone_dir"/xorriso
|
||||
copy_files \
|
||||
xorriso/xorriso.h \
|
||||
xorriso/xorriso_private.h \
|
||||
xorriso/sfile.h \
|
||||
xorriso/sfile.c \
|
||||
xorriso/aux_objects.h \
|
||||
xorriso/aux_objects.c \
|
||||
xorriso/findjob.h \
|
||||
xorriso/findjob.c \
|
||||
xorriso/check_media.h \
|
||||
xorriso/check_media.c \
|
||||
xorriso/misc_funct.h \
|
||||
xorriso/misc_funct.c \
|
||||
xorriso/text_io.h \
|
||||
xorriso/text_io.c \
|
||||
xorriso/match.h \
|
||||
xorriso/match.c \
|
||||
xorriso/emulators.h \
|
||||
xorriso/emulators.c \
|
||||
xorriso/disk_ops.h \
|
||||
xorriso/disk_ops.c \
|
||||
xorriso/cmp_update.h \
|
||||
xorriso/cmp_update.c \
|
||||
xorriso/parse_exec.h \
|
||||
xorriso/parse_exec.c \
|
||||
xorriso/opts_a_c.c \
|
||||
xorriso/opts_d_h.c \
|
||||
xorriso/opts_i_o.c \
|
||||
xorriso/opts_p_z.c \
|
||||
\
|
||||
xorriso/xorrisoburn.h \
|
||||
xorriso/base_obj.h \
|
||||
xorriso/base_obj.c \
|
||||
xorriso/lib_mgt.h \
|
||||
xorriso/lib_mgt.c \
|
||||
xorriso/sort_cmp.h \
|
||||
xorriso/sort_cmp.c \
|
||||
xorriso/drive_mgt.h \
|
||||
xorriso/drive_mgt.c \
|
||||
xorriso/iso_img.h \
|
||||
xorriso/iso_img.c \
|
||||
xorriso/iso_tree.h \
|
||||
xorriso/iso_tree.c \
|
||||
xorriso/iso_manip.h \
|
||||
xorriso/iso_manip.c \
|
||||
xorriso/write_run.h \
|
||||
xorriso/write_run.c \
|
||||
xorriso/read_run.h \
|
||||
xorriso/read_run.c \
|
||||
xorriso/filters.h \
|
||||
xorriso/filters.c \
|
||||
\
|
||||
xorriso/xorriso_main.c \
|
||||
xorriso/xorriso_timestamp.h \
|
||||
\
|
||||
xorriso/changelog.txt \
|
||||
xorriso/xorriso_eng.html \
|
||||
xorriso/make_docs.sh \
|
||||
xorriso/xorriso.texi \
|
||||
xorriso/xorriso.info \
|
||||
xorriso/xorrisofs.texi \
|
||||
xorriso/xorrisofs.info \
|
||||
xorriso/xorrecord.texi \
|
||||
xorriso/xorrecord.info \
|
||||
xorriso/make_xorriso_1.c \
|
||||
xorriso/xorriso.1 \
|
||||
xorriso/xorrisofs.1 \
|
||||
xorriso/xorrecord.1 \
|
||||
xorriso/man_1_xorriso.html \
|
||||
xorriso/man_1_xorrisofs.html \
|
||||
xorriso/man_1_xorrecord.html \
|
||||
"$lone_dir"/xorriso
|
||||
copy_files COPYRIGHT "$lone_dir"/xorriso
|
||||
|
||||
copy_files xorriso/xorriso_buildstamp_none.h \
|
||||
"$lone_dir"/xorriso/xorriso_buildstamp.h
|
||||
copy_files xorriso/xorriso_buildstamp_none.h \
|
||||
"$lone_dir"/xorriso/xorriso_buildstamp_none.h
|
||||
|
||||
create_dir "$lone_dir"/doc
|
||||
copy_files doc/partition_offset.wiki \
|
||||
doc/startup_file.txt \
|
||||
doc/qemu_xorriso.wiki \
|
||||
"$lone_dir"/doc
|
||||
|
||||
create_dir "$lone_dir"/test
|
||||
copy_files \
|
||||
test/compare_file.c \
|
||||
"$lone_dir"/test/compare_file.c
|
||||
|
||||
|
||||
# nglibisofs
|
||||
|
||||
create_dir "$lone_dir"/libisofs
|
||||
create_dir "$lone_dir"/libisofs/filters
|
||||
goto_dir "$current_dir"/nglibisofs-develop
|
||||
copy_files libisofs/*.[ch] "$lone_dir"/libisofs
|
||||
copy_files libisofs/filters/*.[ch] "$lone_dir"/libisofs/filters
|
||||
copy_files doc/susp_aaip*.txt "$lone_dir"/doc
|
||||
copy_files doc/zisofs_format.txt "$lone_dir"/doc
|
||||
copy_files doc/checksums.txt "$lone_dir"/doc
|
||||
copy_files doc/boot_sectors.txt "$lone_dir"/doc
|
||||
copy_files COPYRIGHT "$lone_dir"/libisofs
|
||||
test -e CONTRIBUTORS && cat CONTRIBUTORS >>"$lone_dir"/CONTRIBUTORS
|
||||
|
||||
# To get a common version.h
|
||||
cat version.h.in >> "$lone_dir"/version.h.in
|
||||
|
||||
|
||||
# libjte
|
||||
|
||||
create_dir "$lone_dir"/libjte
|
||||
goto_dir "$current_dir"/jte-develop
|
||||
copy_files *.[ch] "$lone_dir"/libjte
|
||||
copy_files COPYRIGHT "$lone_dir"/libjte
|
||||
#
|
||||
# Now using libisoburn/releng/jigdo-gen-md5-list because in jigit it is
|
||||
# restricted to Linux and FreeBSD.
|
||||
goto_dir "$current_dir"/libisoburn-develop/releng
|
||||
copy_files jigdo-gen-md5-list jigdo-gen-md5-list.1 "$lone_dir"/libjte
|
||||
|
||||
|
||||
# libburn
|
||||
|
||||
create_dir "$lone_dir"/libburn
|
||||
goto_dir "$current_dir"/libburn-develop
|
||||
copy_files libburn/*.[ch] "$lone_dir"/libburn
|
||||
copy_files COPYRIGHT "$lone_dir"/libburn
|
||||
cat CONTRIBUTORS >>"$lone_dir"/CONTRIBUTORS
|
||||
|
||||
# Delete a source module of yet unclear ancestry.
|
||||
# The build process will avoid to use it.
|
||||
rm "$lone_dir"/libburn/crc.c
|
||||
|
||||
|
||||
# To get a common version.h
|
||||
cat version.h.in >> "$lone_dir"/version.h.in
|
||||
|
||||
# Decision about legal situation
|
||||
goto_dir "$current_dir"/libisoburn-develop
|
||||
if test "$create_gnu_xorriso" = "yes"
|
||||
then
|
||||
copy_files xorriso/README_gnu_xorriso "$lone_dir"/README
|
||||
copy_files xorriso/COPYRIGHT_gnu_xorriso "$lone_dir"/COPYRIGHT
|
||||
copy_files xorriso/COPYING_gnu_xorriso "$lone_dir"/COPYING
|
||||
copy_files xorriso/AUTHORS_gnu_xorriso "$lone_dir"/AUTHORS
|
||||
|
||||
# patch xorriso/xorriso.h to be GNU xorriso
|
||||
sed -e's/define Xorriso_libburnia_xorrisO/define Xorriso_GNU_xorrisO/' \
|
||||
-e's/This may be changed to Xorriso_GNU_xorrisO in order to c/C/' \
|
||||
<xorriso/xorriso.h >"$lone_dir"/xorriso/xorriso.h
|
||||
|
||||
else
|
||||
|
||||
copy_files README "$lone_dir"/README
|
||||
|
||||
fi
|
||||
|
||||
|
||||
# tarball
|
||||
|
||||
if test "$with_bootstrap_tarball" = 1
|
||||
then
|
||||
|
||||
tarball_dir="$current_dir"/xorriso-"$xorriso_rev""$xorriso_pl"
|
||||
mv "$lone_dir" "$tarball_dir"
|
||||
|
||||
goto_dir "$tarball_dir"
|
||||
|
||||
./bootstrap
|
||||
|
||||
# Remove unneeded temporary data from ./bootstrap
|
||||
rm -r ./autom4te.cache
|
||||
|
||||
# Repair non-portable shell code output of ./bootstrap
|
||||
(
|
||||
cd "$compile_dir" || exit 1
|
||||
sed -e 's/^for ac_header in$/test -z 1 \&\& for ac_header in dummy/' \
|
||||
< ./configure > ./configure-repaired
|
||||
if test "$?" = 0
|
||||
then
|
||||
echo "$0: Empty 'for ac_header in' found in configure." >&2
|
||||
fi
|
||||
mv ./configure-repaired ./configure
|
||||
chmod a+rx,go-w,u+w ./configure
|
||||
)
|
||||
|
||||
if test "$create_gnu_xorriso" = "yes"
|
||||
then
|
||||
# ftp-upload@gnu.org rejects Makefile.in with a dangerous chmod on make dist
|
||||
sed -e 's/-perm -777 -exec chmod a+rwx/-perm -755 -exec chmod u+rwx,go+rx/' \
|
||||
< Makefile.in > new_Makefile.in
|
||||
|
||||
mv new_Makefile.in Makefile.in
|
||||
fi
|
||||
|
||||
|
||||
cd "$current_dir"
|
||||
tar czf ./xorriso-"$xorriso_rev""$xorriso_pl".tar.gz $(basename "$tarball_dir")
|
||||
|
||||
ls -l $(pwd)/xorriso-"$xorriso_rev""$xorriso_pl".tar.gz
|
||||
|
||||
mv "$tarball_dir" "$lone_dir"
|
||||
|
||||
fi
|
||||
|
||||
echo "Done"
|
||||
echo "HINT: Now build xorriso/xorriso by:"
|
||||
echo " cd '$lone_dir' && ./configure && make"
|
||||
echo
|
73
libisoburn/branches/1.2.2/xorriso/man_xorrecord_to_html.sh
Executable file
73
libisoburn/branches/1.2.2/xorriso/man_xorrecord_to_html.sh
Executable file
@ -0,0 +1,73 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# man_xorrecord_to_html.sh - ts A80118 , B10309
|
||||
#
|
||||
# Generates a HTML version of man page xorrecord.1
|
||||
#
|
||||
# To be executed in the libisoburn toplevel directory (eg. ./libisoburn-0.1.0)
|
||||
#
|
||||
|
||||
# set -x
|
||||
|
||||
man_dir=$(pwd)"/xorriso"
|
||||
export MANPATH="$man_dir"
|
||||
manpage="xorrecord"
|
||||
raw_html=$(pwd)/"xorriso/raw_man_1_xorrecord.html"
|
||||
htmlpage=$(pwd)/"xorriso/man_1_xorrecord.html"
|
||||
|
||||
if test -r "$man_dir"/"$manpage".1
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "Cannot find readable man page source $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -e "$man_dir"/man1
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
ln -s . "$man_dir"/man1
|
||||
fi
|
||||
|
||||
if test "$1" = "-work_as_filter"
|
||||
then
|
||||
|
||||
# set -x
|
||||
|
||||
sed \
|
||||
-e 's/<meta name="generator" content="groff -Thtml, see www.gnu.org">/<meta name="generator" content="groff -Thtml, via man -H, via xorriso\/convert_man_to_html.sh">/' \
|
||||
-e 's/<meta name="Content-Style" content="text\/css">/<meta name="Content-Style" content="text\/css"><META NAME="description" CONTENT="man page of xorriso"><META NAME="keywords" CONTENT="man xorrecord, manual, xorrecord, CD, DVD, BD, cdrecord, compatible"><META NAME="robots" CONTENT="follow">/' \
|
||||
-e 's/<title>XORRECORD<\/title>/<title>man 1 xorrecord<\/title>/' \
|
||||
-e 's/<h1 align=center>XORRECORD<\/h1>/<h1 align=center>man 1 xorrecord<\/h1>/' \
|
||||
-e 's/<body>/<body BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000>/' \
|
||||
-e 's/<b>MMC, Session, Track, Media types:<\/b>/\ <BR><b>MMC, Session, Track, Media types:<\/b>/' \
|
||||
-e 's/<b>MMC, Session, Track, Media types:<\/b>/\ <BR><b>MMC, Session, Track, Media types:<\/b>/' \
|
||||
-e 's/<b>Relation to program xorriso:<\/b>/\ <BR><b>Relation to program xorriso:<\/b>/' \
|
||||
-e 's/EXAMPLES):<br>/<A HREF="#EXAMPLES">EXAMPLES<\/A>):<br>/' \
|
||||
-e 's/<b>Drive addressing:<\/b>/\ <BR><b>Drive addressing:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Inquiring drive and media:<\/b>/\ <BR><b>Inquiring drive and media:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Settings for the burn run<\/b>/\ <BR><b>Settings for the burn run:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Program version and verbosity:<\/b>/\ <BR><b>Program version and verbosity:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Options not compatible to cdrecord:<\/b>/\ <BR><b>Options not compatible to cdrecord:<\/b><BR>\ <BR>/' \
|
||||
\
|
||||
-e 's/<\/body>/<BR><HR><FONT SIZE=-1><CENTER>(HTML generated from '"$manpage"'.1 on '"$(date)"' by '$(basename "$0")' )<\/CENTER><\/FONT><\/body>/' \
|
||||
-e 's/−/-/g' \
|
||||
<"$2" >"$htmlpage"
|
||||
|
||||
set +x
|
||||
|
||||
chmod u+rw,go+r,go-w "$htmlpage"
|
||||
echo "Emerged file:"
|
||||
ls -lL "$htmlpage"
|
||||
|
||||
else
|
||||
|
||||
export BROWSER='cp "%s" '"$raw_html"
|
||||
man -H "$manpage"
|
||||
"$0" -work_as_filter "$raw_html"
|
||||
rm "$raw_html"
|
||||
rm "$man_dir"/man1
|
||||
|
||||
fi
|
127
libisoburn/branches/1.2.2/xorriso/man_xorriso_to_html.sh
Executable file
127
libisoburn/branches/1.2.2/xorriso/man_xorriso_to_html.sh
Executable file
@ -0,0 +1,127 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# man_xorriso_to_html.sh - ts A80118 , B10309
|
||||
#
|
||||
# Generates a HTML version of man page xorriso.1
|
||||
#
|
||||
# To be executed in the libisoburn toplevel directory (eg. ./libisoburn-0.1.0)
|
||||
#
|
||||
|
||||
# set -x
|
||||
|
||||
man_dir=$(pwd)"/xorriso"
|
||||
export MANPATH="$man_dir"
|
||||
manpage="xorriso"
|
||||
raw_html=$(pwd)/"xorriso/raw_man_1_xorriso.html"
|
||||
htmlpage=$(pwd)/"xorriso/man_1_xorriso.html"
|
||||
|
||||
if test -r "$man_dir"/"$manpage".1
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "Cannot find readable man page source $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -e "$man_dir"/man1
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
ln -s . "$man_dir"/man1
|
||||
fi
|
||||
|
||||
if test "$1" = "-work_as_filter"
|
||||
then
|
||||
|
||||
# set -x
|
||||
|
||||
sed \
|
||||
-e 's/<meta name="generator" content="groff -Thtml, see www.gnu.org">/<meta name="generator" content="groff -Thtml, via man -H, via xorriso\/convert_man_to_html.sh">/' \
|
||||
-e 's/<meta name="Content-Style" content="text\/css">/<meta name="Content-Style" content="text\/css"><META NAME="description" CONTENT="man page of xorriso"><META NAME="keywords" CONTENT="man xorriso, manual, xorriso, CD, CD-RW, CD-R, burning, cdrecord, compatible"><META NAME="robots" CONTENT="follow">/' \
|
||||
-e 's/<title>XORRISO<\/title>/<title>man 1 xorriso<\/title>/' \
|
||||
-e 's/<h1 align=center>XORRISO<\/h1>/<h1 align=center>man 1 xorriso<\/h1>/' \
|
||||
-e 's/<body>/<body BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000>/' \
|
||||
-e 's/<b>Overview of features:<\/b>/\ <BR><A NAME="Overview"><\/A><b>Overview of features:<\/b>/' \
|
||||
-e 's/<b>General information paragraphs:<\/b>/\ <BR><A NAME="General"><\/A><b>General information paragraphs:<\/b>/' \
|
||||
-e 's/^<p>Session model<br>/<p><A HREF="#Model">Session model<\/A><br>/' \
|
||||
-e 's/^Media types and states/<A HREF="#Media">Media types and states/' \
|
||||
-e 's/^Creating, Growing, Modifying, Blind Growing/<A HREF="#Methods">Creating, Growing, Modifying, Blind Growing<\/A>/' \
|
||||
-e 's/^Libburn drives/<A HREF="#Drives">Libburn drives<\/A>/' \
|
||||
-e 's/^Rock Ridge, POSIX, X\/Open, El Torito, ACL, xattr/<A HREF="#Extras">Rock Ridge, POSIX, X\/Open, El Torito, ACL, xattr<\/A>/' \
|
||||
-e 's/^Command processing/<A HREF="#Processing">Command processing<\/A>/' \
|
||||
-e 's/^Dialog, Readline, Result pager/<A HREF="#Dialog">Dialog, Readline, Result pager<\/A>/' \
|
||||
-e 's/have a look at section EXAMPLES/have a look at section <A HREF="#EXAMPLES">EXAMPLES<\/A>/' \
|
||||
-e 's/<b>Session model:<\/b>/\ <BR><A NAME="Model"><\/A><b>Session model:<\/b>/' \
|
||||
-e 's/<b>Media types and states:<\/b>/\ <BR><A NAME="Media"><\/A><b>Media types and states:<\/b>/' \
|
||||
-e 's/<b>Creating, Growing, Modifying, Blind/\ <BR><A NAME="Methods"><\/A><b>Creating, Growing, Modifying, Blind/' \
|
||||
-e 's/<b>Libburn drives:<\/b>/\ <BR><b>Libburn drives:<\/b><A NAME="Drives"><\/A>/' \
|
||||
-e 's/^-dev /\ \ -dev /' \
|
||||
-e 's/^-devices /\ \ -devices /' \
|
||||
-e 's/<b>Rock Ridge, POSIX, X\/Open, El Torito, ACL,/\ <BR><A NAME="Extras"><\/A><b>Rock Ridge, POSIX, X\/Open, El Torito, ACL,/' \
|
||||
-e 's/<b>Command processing:<\/b>/\ <BR><A NAME="Processing"><\/A><b>Command processing:<\/b>/' \
|
||||
-e 's/<b>Dialog, Readline, Result pager:<\/b>/\ <BR><A NAME="Dialog"><\/A<b>Dialog, Readline, Result pager:<\/b>/' \
|
||||
-e 's/<b>Execution order of program arguments:<\/b>/\ <BR><A NAME="ArgSort"><\/A><b>Execution order of program arguments:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Acquiring source and target drive:<\/b>/\ <BR><A NAME="AqDrive"><\/A><b>Acquiring source and target drive:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Influencing the behavior of image/\ <BR><A NAME="Loading"><\/A><b>Influencing the behavior of image/' \
|
||||
-e 's/<b>Inserting files into ISO image:<\/b>/\ <BR><A NAME="Insert"><\/A><b>Inserting files into ISO image:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Settings for file insertion:<\/b>/\ <BR><A NAME="SetInsert"><\/A><b>Settings for file insertion:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>File manipulations:<\/b>/\ <BR><A NAME="Manip"><\/A><b>File manipulations:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Tree traversal command -find:<\/b>/\ <BR><A NAME="CmdFind"><\/A><b>Tree traversal command -find:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^<p><b>−iso_rr_pattern/<p>\ <BR><b>\−iso_rr_pattern/' \
|
||||
-e 's/EXAMPLES):<br>/<A HREF="#EXAMPLES">EXAMPLES<\/A>):<br>/' \
|
||||
-e 's/<b>Filters for data file content:<\/b>/\ <BR><A NAME="Filter"><\/A><b>Filters for data file content:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Writing the result, drive control:<\/b>/\ <BR><A NAME="Writing"><\/A><b>Writing the result, drive control:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^-find \/ /\ \ -find \/ /' \
|
||||
-e 's/^$<\/b> ln -s/\ \ $<\/b> ln -s/' \
|
||||
-e 's/<b>Settings for result writing:<\/b>/\ <BR><A NAME="SetWrite"><\/A><b>Settings for result writing:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^706k = 706kB/\ \ 706k = 706kB/' \
|
||||
-e 's/^5540k = 5540kB/\ \ 5540k = 5540kB/' \
|
||||
-e 's/<b>Bootable ISO images:<\/b>/\ <BR><A NAME="Bootable"><\/A><b>Bootable ISO images:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Jigdo Template Extraction:<\/b>/\ <BR><A NAME="Jigdo"><\/A><b>Jigdo Template Extraction:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Character sets:<\/b>/\ <BR><A NAME="Charset"><\/A><b>Character sets:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Exception processing:<\/b>/\ <BR><A NAME="Exception"><\/A><b>Exception processing:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Dialog mode control:<\/b>/\ <BR><A NAME="DialogCtl"><\/A><b>Dialog mode control:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Drive and media related inquiry actions:<\/b>/\ <BR><A NAME="Inquiry"><\/A><b>Drive and media related inquiry actions:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Navigation in ISO image/\ <BR><A NAME="Navigate"><\/A><b>Navigation in ISO image/' \
|
||||
-e 's/^filesystem:<\/b>/filesystem:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Evaluation of readability and recovery:<\/b>/\ <BR><A NAME="Verify"><\/A><b>Evaluation of readability and recovery:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>osirrox ISO-to-disk restore commands:<\/b>/\ <BR><A NAME="Restore"><\/A><b>osirrox ISO-to-disk restore commands:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Command compatibility emulations:<\/b>/\ <BR><A NAME="Emulation"><\/A><b>Command compatibility emulations:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^<p><b>−as</<p>\ <BR><b>\−as</' \
|
||||
-e 's/<b>Scripting, dialog and/\ <BR><A NAME="Scripting"><\/A><b>Scripting, dialog and/' \
|
||||
-e 's/^features:<\/b>/features:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Support for frontend/\ <BR><A NAME="Frontend"><\/A><b>Support for frontend/' \
|
||||
-e 's/^listening at stdout:<\/b>/listening at stdout:<\/b><BR>\ <BR>/' \
|
||||
-e 's/xorriso -outdev \/dev\/sr2 \\ -blank fast \\ -pathspecs on/xorriso -outdev \/dev\/sr2 -blank fast -pathspecs on/' \
|
||||
-e 's/\\ -add \\ \/sounds=\/home\/me\/sounds \\ \/pictures \\ -- \\ -rm_r \\/ -add \/sounds=\/home\/me\/sounds \/pictures -- -rm_r /' \
|
||||
-e 's/\/sounds\/indecent \\ \’\/pictures\/\*private\*\’ \\/\/sounds\/indecent \’\/pictures\/*private*\’ /' \
|
||||
-e 's/\/pictures\/confidential \\ -- \\ -add \\/\/pictures\/confidential -- -add/' \
|
||||
-e 's/xorriso -dev \/dev\/sr2 \\ -rm_r \/sounds -- \\ -mv \\/xorriso -dev \/dev\/sr2 -rm_r \/sounds -- -mv /' \
|
||||
-e 's/\/pictures\/confidential \\ \/pictures\/restricted \\ -- \\ -chmod/\/pictures\/confidential \/pictures\/restricted -- -chmod/' \
|
||||
-e 's/go-rwx \/pictures\/restricted -- \\ -pathsspecs on \\ -add \\/go-rwx \/pictures\/restricted -- -pathsspecs on -add /' \
|
||||
-e 's/\/sounds=\/home\/me\/prepared_for_dvd\/sounds_dummy /\/sounds=\/home\/me\/prepared_for_dvd\/sounds_dummy/' \
|
||||
-e 's/\/movies=\/home\/me\/prepared_for_dvd\/movies \\ -- \\ -commit/\/movies=\/home\/me\/prepared_for_dvd\/movies -- -commit/' \
|
||||
-e 's/xorriso -indev \/dev\/sr2 \\ -rm_r \/sounds -- \\/xorriso -indev \/dev\/sr2 -rm_r \/sounds -- /' \
|
||||
-e 's/-outdev \/dev\/sr0 -blank fast \\ -commit -eject all/-outdev \/dev\/sr0 -blank fast -commit -eject all/' \
|
||||
-e 's/See section FILES/See section <A HREF="#FILES">FILES<\/A>/' \
|
||||
-e 's/See section EXAMPLES/See section <A HREF="#EXAMPLES">EXAMPLES<\/A>/' \
|
||||
-e 's/<\/body>/<BR><HR><FONT SIZE=-1><CENTER>(HTML generated from '"$manpage"'.1 on '"$(date)"' by '$(basename "$0")' )<\/CENTER><\/FONT><\/body>/' \
|
||||
-e 's/−/-/g' \
|
||||
<"$2" >"$htmlpage"
|
||||
|
||||
set +x
|
||||
|
||||
chmod u+rw,go+r,go-w "$htmlpage"
|
||||
echo "Emerged file:"
|
||||
ls -lL "$htmlpage"
|
||||
|
||||
else
|
||||
|
||||
export BROWSER='cp "%s" '"$raw_html"
|
||||
man -H "$manpage"
|
||||
"$0" -work_as_filter "$raw_html"
|
||||
rm "$raw_html"
|
||||
rm "$man_dir"/man1
|
||||
|
||||
fi
|
80
libisoburn/branches/1.2.2/xorriso/man_xorrisofs_to_html.sh
Executable file
80
libisoburn/branches/1.2.2/xorriso/man_xorrisofs_to_html.sh
Executable file
@ -0,0 +1,80 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# man_xorrisofs_to_html.sh - ts A80118 , B10309
|
||||
#
|
||||
# Generates a HTML version of man page xorrisofs.1
|
||||
#
|
||||
# To be executed in the libisoburn toplevel directory (eg. ./libisoburn-0.1.0)
|
||||
#
|
||||
|
||||
# set -x
|
||||
|
||||
man_dir=$(pwd)"/xorriso"
|
||||
export MANPATH="$man_dir"
|
||||
manpage="xorrisofs"
|
||||
raw_html=$(pwd)/"xorriso/raw_man_1_xorrisofs.html"
|
||||
htmlpage=$(pwd)/"xorriso/man_1_xorrisofs.html"
|
||||
|
||||
if test -r "$man_dir"/"$manpage".1
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "Cannot find readable man page source $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -e "$man_dir"/man1
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
ln -s . "$man_dir"/man1
|
||||
fi
|
||||
|
||||
if test "$1" = "-work_as_filter"
|
||||
then
|
||||
|
||||
# set -x
|
||||
|
||||
sed \
|
||||
-e 's/<meta name="generator" content="groff -Thtml, see www.gnu.org">/<meta name="generator" content="groff -Thtml, via man -H, via xorriso\/convert_man_to_html.sh">/' \
|
||||
-e 's/<meta name="Content-Style" content="text\/css">/<meta name="Content-Style" content="text\/css"><META NAME="description" CONTENT="man page of xorriso"><META NAME="keywords" CONTENT="man xorrisofs, manual, xorrisofs, ISO 9660, mkisofs, compatible"><META NAME="robots" CONTENT="follow">/' \
|
||||
-e 's/<title>XORRISOFS<\/title>/<title>man 1 xorrisofs<\/title>/' \
|
||||
-e 's/<h1 align=center>XORRISOFS<\/h1>/<h1 align=center>man 1 xorrisofs<\/h1>/' \
|
||||
-e 's/<body>/<body BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000>/' \
|
||||
-e 's/<b>ISO 9660, Rock Ridge, Joliet:<\/b>/\ <BR><b>ISO 9660, Rock Ridge, Joliet:<\/b>/' \
|
||||
-e 's/<b>Inserting files into the ISO image:<\/b>/\ <BR><b>Inserting files into the ISO image:<\/b>/' \
|
||||
-e 's/<b>Relation to program xorriso:<\/b>/\ <BR><b>Relation to program xorriso:<\/b>/' \
|
||||
-e 's/EXAMPLES):<br>/<A HREF="#EXAMPLES">EXAMPLES<\/A>):<br>/' \
|
||||
-e 's/<b>Image loading:<\/b>/\ <BR><b>Image loading:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Settings for file insertion:<\/b>/\ <BR><b>Settings for file insertion:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Settings for image production:<\/b>/\ <BR><b>Settings for image production:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Settings for standards compliance:<\/b>/\ <BR><b>Settings for standards compliance:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Settings for standards extensions:<\/b>/\ <BR><b>Settings for standards extensions:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Settings for file hiding:<\/b>/\ <BR><b>Settings for file hiding:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>ISO image ID strings:<\/b>/\ <BR><b>ISO image ID strings:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>El Torito Bootable ISO images:<\/b>/\ <BR><b>El Torito Bootable ISO images:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>System Area, MBR, other boot blocks:<\/b>/\ <BR><b>System Area, MBR, other boot blocks:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Character sets:<\/b>/\ <BR><b>Character sets:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Jigdo Template Extraction:<\/b>/\ <BR><b>Jigdo Template Extraction:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Miscellaneous options:<\/b>/\ <BR><b>Miscellaneous options:<\/b><BR>\ <BR>/' \
|
||||
\
|
||||
-e 's/<\/body>/<BR><HR><FONT SIZE=-1><CENTER>(HTML generated from '"$manpage"'.1 on '"$(date)"' by '$(basename "$0")' )<\/CENTER><\/FONT><\/body>/' \
|
||||
-e 's/−/-/g' \
|
||||
<"$2" >"$htmlpage"
|
||||
|
||||
set +x
|
||||
|
||||
chmod u+rw,go+r,go-w "$htmlpage"
|
||||
echo "Emerged file:"
|
||||
ls -lL "$htmlpage"
|
||||
|
||||
else
|
||||
|
||||
export BROWSER='cp "%s" '"$raw_html"
|
||||
man -H "$manpage"
|
||||
"$0" -work_as_filter "$raw_html"
|
||||
rm "$raw_html"
|
||||
rm "$man_dir"/man1
|
||||
|
||||
fi
|
773
libisoburn/branches/1.2.2/xorriso/match.c
Normal file
773
libisoburn/branches/1.2.2/xorriso/match.c
Normal file
@ -0,0 +1,773 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains the implementation of functions for pattern matching.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
|
||||
/* @param flag bit0= do not augment relative structured search by xorriso->wdi
|
||||
bit1= return 2 if bonked at start point by ..
|
||||
(caller then aborts or retries without bit0)
|
||||
bit2= eventually prepend wdx rather than wdi
|
||||
@return <=0 error, 1= ok, 2= with bit1: relative pattern exceeds start point
|
||||
*/
|
||||
int Xorriso_prepare_regex(struct XorrisO *xorriso, char *adr, int flag)
|
||||
{
|
||||
int l,ret,i,count,bonked= 0,is_constant,is_still_relative= 0, adr_size;
|
||||
char *cpt,*npt,*adr_part= NULL, *absolute_adr= NULL, *adr_start,*wd;
|
||||
|
||||
adr_size= 2 * SfileadrL;
|
||||
Xorriso_alloc_meM(adr_part, char, adr_size);
|
||||
Xorriso_alloc_meM(absolute_adr, char, adr_size);
|
||||
|
||||
if(flag&4)
|
||||
wd= xorriso->wdx;
|
||||
else
|
||||
wd= xorriso->wdi;
|
||||
|
||||
if(xorriso->search_mode>=2 && xorriso->search_mode<=4) {
|
||||
if(xorriso->search_mode==3 || xorriso->search_mode==4) {
|
||||
l= strlen(adr)+strlen(wd)+1;
|
||||
if(l * 2 + 2 > ((int) sizeof(xorriso->reg_expr)) || l * 2 + 2 > adr_size){
|
||||
sprintf(xorriso->info_text,"Search pattern too long");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
}
|
||||
Xorriso_destroy_re(xorriso,0);
|
||||
if(xorriso->structured_search && xorriso->search_mode==3) {
|
||||
if(adr[0]!='/')
|
||||
is_still_relative= 1;
|
||||
if(is_still_relative && !(flag&1)) {
|
||||
/* relative expression : prepend working directory */
|
||||
sprintf(absolute_adr,"%s/%s",wd,adr);
|
||||
adr_start= absolute_adr;
|
||||
xorriso->prepended_wd= 1;
|
||||
is_still_relative= 0;
|
||||
} else
|
||||
adr_start= adr;
|
||||
/* count slashes */;
|
||||
cpt= adr_start;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
for(i= 0;1;i++) {
|
||||
cpt= strchr(cpt,'/');
|
||||
if(cpt==NULL)
|
||||
break;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
}
|
||||
count= i+1;
|
||||
xorriso->re= TSOB_FELD(regex_t,count);
|
||||
if(xorriso->re==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
xorriso->re_constants= TSOB_FELD(char *,count);
|
||||
if(xorriso->re_constants==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
for(i= 0;i<count;i++)
|
||||
xorriso->re_constants[i]= NULL;
|
||||
xorriso->re_count= count;
|
||||
xorriso->re_fill= 0;
|
||||
|
||||
/* loop over slash chunks*/;
|
||||
cpt= adr_start;
|
||||
xorriso->re_fill= 0;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
for(i= 0;i<count;i++) {
|
||||
npt= strchr(cpt,'/');
|
||||
if(npt==NULL) {
|
||||
if((int) strlen(cpt) >= adr_size)
|
||||
{ret= -1; goto ex;}
|
||||
strcpy(adr_part,cpt);
|
||||
} else {
|
||||
if(npt-cpt >= adr_size)
|
||||
{ret= -1; goto ex;}
|
||||
strncpy(adr_part,cpt,npt-cpt);
|
||||
adr_part[npt-cpt]= 0;
|
||||
}
|
||||
|
||||
if(adr_part[0]==0)
|
||||
goto next_adr_part;
|
||||
if(adr_part[0]=='.' && adr_part[1]==0 &&
|
||||
(xorriso->re_fill>0 || i<count-1))
|
||||
goto next_adr_part;
|
||||
if(adr_part[0]=='.' && adr_part[1]=='.' && adr_part[2]==0) {
|
||||
/* delete previous part */
|
||||
if(xorriso->re_fill <= 0) {
|
||||
bonked= 1;
|
||||
goto next_adr_part;
|
||||
}
|
||||
if(xorriso->re_constants[xorriso->re_fill-1]!=NULL) {
|
||||
free(xorriso->re_constants[xorriso->re_fill-1]);
|
||||
xorriso->re_constants[xorriso->re_fill-1]= NULL;
|
||||
} else
|
||||
regfree(&(xorriso->re[xorriso->re_fill-1]));
|
||||
(xorriso->re_fill)--;
|
||||
goto next_adr_part;
|
||||
}
|
||||
if(strcmp(adr_part,"*")==0) {
|
||||
adr_part[0]= 0;
|
||||
ret= 2;
|
||||
} else
|
||||
ret= Xorriso__bourne_to_reg(adr_part,xorriso->reg_expr,0);
|
||||
if(ret==2) {
|
||||
if(Sregex_string(&(xorriso->re_constants[xorriso->re_fill]),adr_part,0)
|
||||
<=0)
|
||||
{ret= -1; goto ex;}
|
||||
} else {
|
||||
if(regcomp(&(xorriso->re[xorriso->re_fill]),xorriso->reg_expr,0)!=0)
|
||||
goto cannot_compile;
|
||||
}
|
||||
xorriso->re_fill++;
|
||||
next_adr_part:;
|
||||
if(i==count-1)
|
||||
break;
|
||||
cpt= npt+1;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
}
|
||||
if(bonked) {
|
||||
if(flag&2)
|
||||
{ret= 2; goto ex;}
|
||||
sprintf(xorriso->info_text, "Your '..' bonked at the %s directory.",
|
||||
is_still_relative ? "working" : "root");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE",0);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
|
||||
Xorriso__bourne_to_reg(adr_start,xorriso->reg_expr,0); /* just for show */
|
||||
|
||||
} else {
|
||||
is_constant= 0;
|
||||
if(strcmp(adr,"*")==0 || adr[0]==0) {
|
||||
is_constant= 1;
|
||||
} else if(xorriso->search_mode==3 || xorriso->search_mode==4) {
|
||||
ret= Xorriso__bourne_to_reg(adr,xorriso->reg_expr,0);
|
||||
is_constant= (ret==2);
|
||||
} else {
|
||||
if(strlen(adr)>=sizeof(xorriso->reg_expr))
|
||||
{ret= -1; goto ex;}
|
||||
strcpy(xorriso->reg_expr,adr);
|
||||
}
|
||||
xorriso->re_count= 0; /* tells matcher that this is not structured */
|
||||
xorriso->re_constants= TSOB_FELD(char *,1);
|
||||
if(xorriso->re_constants==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
xorriso->re_constants[0]= NULL;
|
||||
if(is_constant) {
|
||||
if(strcmp(adr,"*")==0) {
|
||||
if(Sregex_string(&(xorriso->re_constants[0]),"",0)<=0)
|
||||
{ret= -1; goto ex;}
|
||||
} else {
|
||||
if(Sregex_string(&(xorriso->re_constants[0]),adr,0)<=0)
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
xorriso->re_fill= 1;
|
||||
} else {
|
||||
xorriso->re= TSOB_FELD(regex_t,1);
|
||||
if(xorriso->re==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
if(regcomp(&(xorriso->re[0]),xorriso->reg_expr,0)!=0) {
|
||||
cannot_compile:;
|
||||
sprintf(xorriso->info_text, "Cannot compile regular expression : %s",
|
||||
xorriso->reg_expr);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE",0);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
Xorriso_free_meM(adr_part);
|
||||
Xorriso_free_meM(absolute_adr);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not shortcut last component of to_match
|
||||
bit1= consider match if regex matches parent of path
|
||||
bit2= retry beginning at failed last component
|
||||
|
||||
@return 0=match , else no match
|
||||
*/
|
||||
int Xorriso_regexec(struct XorrisO *xorriso, char *to_match, int *failed_at,
|
||||
int flag)
|
||||
{
|
||||
int ret,i,re_start= 0,reg_nomatch= -1;
|
||||
char *cpt,*npt, *adr_part= NULL, *mpt;
|
||||
|
||||
Xorriso_alloc_meM(adr_part, char, SfileadrL);
|
||||
|
||||
reg_nomatch= REG_NOMATCH;
|
||||
|
||||
*failed_at= 0;
|
||||
if(!(xorriso->structured_search && xorriso->re_count>0)) {
|
||||
if(xorriso->re_constants!=NULL)
|
||||
if(xorriso->re_constants[0]!=NULL) {
|
||||
if(xorriso->re_constants[0][0]==0)
|
||||
{ret= 0; goto ex;}
|
||||
if(strcmp(xorriso->re_constants[0],to_match)!=0)
|
||||
{ret= reg_nomatch; goto ex;}
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
ret= regexec(&(xorriso->re[0]),to_match,1,xorriso->match,0);
|
||||
goto ex;
|
||||
}
|
||||
|
||||
cpt= to_match;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
if(flag&4)
|
||||
re_start= xorriso->re_failed_at;
|
||||
if(re_start<0)
|
||||
re_start= 0;
|
||||
for(i= re_start;i<xorriso->re_fill;i++) {
|
||||
*failed_at= i;
|
||||
npt= strchr(cpt,'/');
|
||||
if(npt==NULL) {
|
||||
if(i<xorriso->re_fill-1 && !(flag&1))
|
||||
{ret= reg_nomatch; goto ex;} /* this must be the last expression part */
|
||||
mpt= cpt;
|
||||
} else {
|
||||
strncpy(adr_part,cpt,npt-cpt);
|
||||
adr_part[npt-cpt]= 0;
|
||||
mpt= adr_part;
|
||||
}
|
||||
if(xorriso->re_constants[i]!=NULL) {
|
||||
if(xorriso->re_constants[i][0]!=0) /* empty constant matches anything */
|
||||
if(strcmp(xorriso->re_constants[i],mpt)!=0)
|
||||
{ret= reg_nomatch; goto ex;}
|
||||
} else {
|
||||
ret= regexec(&(xorriso->re[i]),mpt,1,xorriso->match,0);
|
||||
if(ret!=0)
|
||||
goto ex;
|
||||
}
|
||||
if(npt==NULL) {
|
||||
if(i>=xorriso->re_fill-1)
|
||||
{ret= 0; goto ex;} /* MATCH */
|
||||
*failed_at= i+1;
|
||||
{ret= reg_nomatch; goto ex;}
|
||||
}
|
||||
cpt= npt+1;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
}
|
||||
*failed_at= xorriso->re_fill;
|
||||
if(flag & 2)
|
||||
{ret= 0; goto ex;} /* MATCH */
|
||||
ret= reg_nomatch;
|
||||
ex:;
|
||||
Xorriso_free_meM(adr_part);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_is_in_patternlist(struct XorrisO *xorriso,
|
||||
struct Xorriso_lsT *patternlist, char *path,
|
||||
int flag)
|
||||
{
|
||||
int ret, failed_at, i= 0;
|
||||
struct Xorriso_lsT *s;
|
||||
|
||||
xorriso->search_mode= 3;
|
||||
xorriso->structured_search= 1;
|
||||
|
||||
for(s= patternlist; s != NULL; s= Xorriso_lst_get_next(s, 0)) {
|
||||
ret= Xorriso_prepare_regex(xorriso, Xorriso_lst_get_text(s, 0), 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
/* Match path or parent of path */
|
||||
ret= Xorriso_regexec(xorriso, path, &failed_at, 2);
|
||||
if(ret == 0)
|
||||
return(i + 1);
|
||||
i++;
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
char *Xorriso_get_pattern(struct XorrisO *xorriso,
|
||||
struct Xorriso_lsT *patternlist, int index, int flag)
|
||||
{
|
||||
int i= 0;
|
||||
struct Xorriso_lsT *s;
|
||||
|
||||
for(s= patternlist; s != NULL; s= Xorriso_lst_get_next(s, 0)) {
|
||||
if(i == index)
|
||||
return(Xorriso_lst_get_text(s, 0));
|
||||
i++;
|
||||
}
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* @param flag bit2= this is a disk_pattern
|
||||
@return <=0 failure , 1 pattern ok , 2 pattern needed prepended wd */
|
||||
int Xorriso_prepare_expansion_pattern(struct XorrisO *xorriso, char *pattern,
|
||||
int flag)
|
||||
{
|
||||
int ret, prepwd= 0;
|
||||
|
||||
ret= Xorriso_prepare_regex(xorriso, pattern, 1|2|(flag&4));
|
||||
if(ret==2) {
|
||||
ret= Xorriso_prepare_regex(xorriso, pattern, flag&4);
|
||||
prepwd= 1;
|
||||
}
|
||||
if(ret<=0) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot compile pattern to regular expression: %s", pattern);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
return(1+prepwd);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= count results rather than storing them
|
||||
bit1= unexpected change of number is a FATAL event
|
||||
@return <=0 error , 1 is root (end processing) ,
|
||||
2 is not root (go on processing)
|
||||
*/
|
||||
int Xorriso_check_for_root_pattern(struct XorrisO *xorriso,
|
||||
int *filec, char **filev, int count_limit, off_t *mem, int flag)
|
||||
{
|
||||
if(xorriso->re_fill!=0)
|
||||
return(2);
|
||||
/* This is the empty pattern representing root */
|
||||
if(flag&1) {
|
||||
(*filec)++;
|
||||
(*mem)+= 8;
|
||||
} else {
|
||||
if(*filec >= count_limit) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Number of matching files changed unexpectedly (> %d)",
|
||||
count_limit);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag&2 ? "FATAL" : "WARNING"), 0);
|
||||
return(flag&2 ? -1 : 0);
|
||||
}
|
||||
filev[*filec]= strdup("/");
|
||||
if(filev[*filec]==NULL) {
|
||||
Xorriso_no_pattern_memory(xorriso, (off_t) 2, 0);
|
||||
return(-1);
|
||||
}
|
||||
(*filec)++;
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= count result rather than storing it
|
||||
bit1= unexpected change of number is a FATAL event
|
||||
*/
|
||||
int Xorriso_register_matched_adr(struct XorrisO *xorriso,
|
||||
char *adr, int count_limit,
|
||||
int *filec, char **filev, off_t *mem, int flag)
|
||||
{
|
||||
int l;
|
||||
|
||||
if(flag&1) {
|
||||
(*filec)++;
|
||||
l= strlen(adr)+1;
|
||||
(*mem)+= sizeof(char *)+l;
|
||||
if(l % sizeof(char *))
|
||||
(*mem)+= sizeof(char *)-(l % sizeof(char *));
|
||||
} else {
|
||||
if(*filec >= count_limit) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Number of matching files changed unexpectedly (> %d)",
|
||||
count_limit);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag&2 ? "FATAL" : "WARNING"), 0);
|
||||
return(flag&2 ? -1 : 0);
|
||||
}
|
||||
filev[*filec]= strdup(adr);
|
||||
if(filev[*filec]==NULL) {
|
||||
Xorriso_no_pattern_memory(xorriso, (off_t) (strlen(adr)+1), 0);
|
||||
return(-1);
|
||||
}
|
||||
(*filec)++;
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= count results rather than storing them
|
||||
bit1= this is a recursion
|
||||
bit2= prepend wd (automatically done if wd[0]!=0)
|
||||
@return <=0 error , 1 ok , 2 could not open directory
|
||||
*/
|
||||
int Xorriso_obtain_pattern_files_x(
|
||||
struct XorrisO *xorriso, char *wd, char *dir_adr,
|
||||
int *filec, char **filev, int count_limit, off_t *mem,
|
||||
int *dive_count, int flag)
|
||||
{
|
||||
int ret, failed_at, follow_mount, follow_links;
|
||||
struct DirseQ *dirseq= NULL;
|
||||
struct stat stbuf;
|
||||
dev_t dir_dev;
|
||||
char *path;
|
||||
char *adr= NULL, *name= NULL, *path_data= NULL;
|
||||
|
||||
adr= malloc(SfileadrL);
|
||||
name= malloc(SfileadrL);
|
||||
path_data= malloc(SfileadrL);
|
||||
if(adr==NULL || name==NULL || path_data==NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, &adr, 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
follow_mount= (xorriso->do_follow_mount || xorriso->do_follow_pattern);
|
||||
follow_links= (xorriso->do_follow_links || xorriso->do_follow_pattern);
|
||||
if(!(flag&2))
|
||||
*dive_count= 0;
|
||||
else
|
||||
(*dive_count)++;
|
||||
|
||||
ret= Xorriso_check_for_root_pattern(xorriso, filec, filev, count_limit,
|
||||
mem, flag&1);
|
||||
if(ret!=2)
|
||||
goto ex;
|
||||
|
||||
if(lstat(dir_adr, &stbuf)==-1)
|
||||
{ret= 2; goto ex;}
|
||||
dir_dev= stbuf.st_dev;
|
||||
if(S_ISLNK(stbuf.st_mode)) {
|
||||
if(stat(dir_adr, &stbuf)==-1)
|
||||
{ret= 2; goto ex;}
|
||||
if(dir_dev != stbuf.st_dev && !follow_mount)
|
||||
{ret= 2; goto ex;}
|
||||
}
|
||||
ret= Dirseq_new(&dirseq, dir_adr, 1);
|
||||
if(ret<0) {
|
||||
sprintf(xorriso->info_text, "Cannot obtain disk directory iterator");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
if(ret==0)
|
||||
{ret= 2; goto ex;}
|
||||
|
||||
while(1) {
|
||||
ret= Dirseq_next_adr(dirseq,name,0);
|
||||
if(ret==0)
|
||||
break;
|
||||
if(ret<0) {
|
||||
sprintf(xorriso->info_text,"Failed to obtain next directory entry");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
|
||||
ret= Xorriso_make_abs_adr(xorriso, wd, name, adr, flag&4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
ret= Xorriso_regexec(xorriso, adr, &failed_at, 1);
|
||||
if(ret>0) { /* no match */
|
||||
if(failed_at <= *dive_count) /* no hope for a match */
|
||||
continue;
|
||||
path= adr;
|
||||
if(adr[0]!='/') {
|
||||
path= path_data;
|
||||
ret= Xorriso_make_abs_adr(xorriso, xorriso->wdx, adr, path, 1|4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
|
||||
if(follow_links)
|
||||
ret= stat(path,&stbuf);
|
||||
else
|
||||
ret= lstat(path,&stbuf);
|
||||
if(ret==-1)
|
||||
continue;
|
||||
if(!S_ISDIR(stbuf.st_mode))
|
||||
continue;
|
||||
if(dir_dev != stbuf.st_dev && !follow_mount)
|
||||
continue;
|
||||
|
||||
/* dive deeper */
|
||||
ret= Xorriso_obtain_pattern_files_x(xorriso, adr, path,
|
||||
filec, filev, count_limit, mem, dive_count, flag|2);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
} else {
|
||||
ret= Xorriso_register_matched_adr(xorriso, adr, count_limit,
|
||||
filec, filev, mem, flag&1);
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
if(ret==0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(adr!=NULL)
|
||||
free(adr);
|
||||
if(name!=NULL)
|
||||
free(name);
|
||||
if(path_data!=NULL)
|
||||
free(path_data);
|
||||
Dirseq_destroy(&dirseq,0);
|
||||
if(flag&2)
|
||||
(*dive_count)--;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_eval_nonmatch(struct XorrisO *xorriso, char *pattern,
|
||||
int *nonconst_mismatches, off_t *mem, int flag)
|
||||
{
|
||||
int k,l;
|
||||
|
||||
/* Is this a constant pattern ? */
|
||||
for(k= 0; k<xorriso->re_fill; k++) {
|
||||
if(xorriso->re_constants[k]==NULL)
|
||||
break;
|
||||
if(xorriso->re_constants[k][0]==0)
|
||||
break;
|
||||
}
|
||||
if(k<xorriso->re_fill)
|
||||
(*nonconst_mismatches)++; /* it is not */
|
||||
|
||||
l= strlen(pattern)+1;
|
||||
(*mem)+= sizeof(char *)+l;
|
||||
if(l % sizeof(char *))
|
||||
(*mem)+= sizeof(char *)-(l % sizeof(char *));
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= a match count !=1 is a SORRY event
|
||||
bit1= a match count !=1 is a FAILURE event
|
||||
*/
|
||||
int Xorriso_check_matchcount(struct XorrisO *xorriso,
|
||||
int count, int nonconst_mismatches, int num_patterns,
|
||||
char **patterns, int flag)
|
||||
{
|
||||
|
||||
if((flag&1) && (count!=1 || nonconst_mismatches)){
|
||||
if(count-nonconst_mismatches>0)
|
||||
sprintf(xorriso->info_text,
|
||||
"Pattern match with more than one file object");
|
||||
else
|
||||
sprintf(xorriso->info_text, "No pattern match with any file object");
|
||||
if(num_patterns==1)
|
||||
sprintf(xorriso->info_text+strlen(xorriso->info_text), ": ");
|
||||
Text_shellsafe(patterns[0], xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag&2 ? "FAILURE" : "SORRY"), 0);
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_no_pattern_memory(struct XorrisO *xorriso, off_t mem, int flag)
|
||||
{
|
||||
char mem_text[80];
|
||||
|
||||
Sfile_scale((double) mem, mem_text,5,1e4,1);
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot allocate enough memory (%s) for pattern expansion",
|
||||
mem_text);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_alloc_pattern_mem(struct XorrisO *xorriso, off_t mem,
|
||||
int count, char ***filev, int flag)
|
||||
{
|
||||
char mem_text[80], limit_text[80];
|
||||
|
||||
Sfile_scale((double) mem, mem_text,5,1e4,0);
|
||||
sprintf(xorriso->info_text,
|
||||
"Temporary memory needed for pattern expansion : %s", mem_text);
|
||||
if(!(flag&1))
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
if(mem > xorriso->temp_mem_limit) {
|
||||
Sfile_scale((double) xorriso->temp_mem_limit, limit_text,5,1e4,1);
|
||||
sprintf(xorriso->info_text,
|
||||
"List of matching file addresses exceeds -temp_mem_limit (%s > %s)",
|
||||
mem_text, limit_text);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
(*filev)= (char **) calloc(count, sizeof(char *));
|
||||
if(*filev==NULL) {
|
||||
Xorriso_no_pattern_memory(xorriso, mem, 0);
|
||||
return(-1);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= a match count !=1 is a FAILURE event
|
||||
bit1= with bit0 tolerate 0 matches if pattern is a constant
|
||||
*/
|
||||
int Xorriso_expand_disk_pattern(struct XorrisO *xorriso,
|
||||
int num_patterns, char **patterns, int extra_filec,
|
||||
int *filec, char ***filev, off_t *mem, int flag)
|
||||
{
|
||||
int ret, count= 0, abs_adr= 0, i, was_count, was_filec;
|
||||
int nonconst_mismatches= 0, dive_count= 0;
|
||||
char *dir_adr= NULL;
|
||||
|
||||
Xorriso_alloc_meM(dir_adr, char, SfileadrL);
|
||||
|
||||
*filec= 0;
|
||||
*filev= NULL;
|
||||
|
||||
xorriso->search_mode= 3;
|
||||
xorriso->structured_search= 1;
|
||||
|
||||
for(i= 0; i<num_patterns; i++) {
|
||||
|
||||
ret= Xorriso_prepare_expansion_pattern(xorriso, patterns[i], 4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
if(ret==2)
|
||||
abs_adr= 4;
|
||||
|
||||
if(patterns[i][0]=='/' || abs_adr) {
|
||||
strcpy(dir_adr, "/");
|
||||
abs_adr= 4;
|
||||
} else {
|
||||
strcpy(dir_adr, xorriso->wdx);
|
||||
if(dir_adr[0]==0)
|
||||
strcpy(dir_adr, "/");
|
||||
ret= Sfile_type(dir_adr, 1|4);
|
||||
if(ret!=2) {
|
||||
Xorriso_msgs_submit(xorriso, 0, dir_adr, 0, "ERRFILE", 0);
|
||||
sprintf(xorriso->info_text, "Address set by -cdx is not a directory: ");
|
||||
Text_shellsafe(dir_adr, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
/* count the matches */
|
||||
was_count= count;
|
||||
ret= Xorriso_obtain_pattern_files_x(xorriso, "", dir_adr, &count, NULL, 0,
|
||||
mem, &dive_count, 1 | abs_adr);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
if(was_count==count && strcmp(patterns[i],"*")!=0 && (flag&3)!=1) {
|
||||
count++;
|
||||
ret= Xorriso_eval_nonmatch(xorriso, patterns[i],
|
||||
&nonconst_mismatches, mem, 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
ret= Xorriso_check_matchcount(xorriso, count, nonconst_mismatches,
|
||||
num_patterns, patterns, (flag&1)|2);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
count+= extra_filec;
|
||||
mem+= extra_filec*sizeof(char *);
|
||||
|
||||
if(count<=0)
|
||||
{ret= 0; goto ex;}
|
||||
|
||||
ret= Xorriso_alloc_pattern_mem(xorriso, *mem, count, filev, 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
/* now store addresses */
|
||||
for(i= 0; i<num_patterns; i++) {
|
||||
|
||||
ret= Xorriso_prepare_expansion_pattern(xorriso, patterns[i], 4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
if(patterns[i][0]=='/' || abs_adr) {
|
||||
strcpy(dir_adr, "/");
|
||||
abs_adr= 4;
|
||||
} else {
|
||||
strcpy(dir_adr, xorriso->wdx);
|
||||
if(dir_adr[0]==0)
|
||||
strcpy(dir_adr, "/");
|
||||
}
|
||||
|
||||
was_filec= *filec;
|
||||
ret= Xorriso_obtain_pattern_files_x(xorriso, "", dir_adr, filec, *filev,
|
||||
count, mem, &dive_count, abs_adr);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
if(was_filec == *filec && strcmp(patterns[i],"*")!=0) {
|
||||
(*filev)[*filec]= strdup(patterns[i]);
|
||||
if((*filev)[*filec]==NULL) {
|
||||
(*mem)= strlen(patterns[i])+1;
|
||||
Xorriso_no_pattern_memory(xorriso, *mem, 0);
|
||||
ret= -1; goto ex;
|
||||
}
|
||||
(*filec)++;
|
||||
}
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(ret<=0) {
|
||||
if(filev!=NULL)
|
||||
Sfile_destroy_argv(&count, filev, 0);
|
||||
*filec= 0;
|
||||
}
|
||||
Xorriso_free_meM(dir_adr);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= command without pattern capability
|
||||
bit1= disk_pattern rather than iso_rr_pattern
|
||||
*/
|
||||
int Xorriso_warn_of_wildcards(struct XorrisO *xorriso, char *path, int flag)
|
||||
{
|
||||
if(strchr(path,'*')!=NULL || strchr(path,'?')!=NULL ||
|
||||
strchr(path,'[')!=NULL) {
|
||||
if(flag&1) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Pattern expansion of wildcards \"*?[\" does not apply to this command");
|
||||
} else {
|
||||
sprintf(xorriso->info_text,
|
||||
"Pattern expansion of wildcards \"*?[\" is disabled by command %s",
|
||||
(flag&2) ? "-disk_pattern or -pathspecs" : "-iso_rr_pattern");
|
||||
}
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
|
||||
sprintf(xorriso->info_text,"Pattern seen: %s\n", path);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
|
||||
return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
74
libisoburn/branches/1.2.2/xorriso/match.h
Normal file
74
libisoburn/branches/1.2.2/xorriso/match.h
Normal file
@ -0,0 +1,74 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains the implementation of functions for pattern matching.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_match_includeD
|
||||
#define Xorriso_pvt_match_includeD yes
|
||||
|
||||
|
||||
int Xorriso_prepare_regex(struct XorrisO *xorriso, char *adr, int flag);
|
||||
|
||||
/* @return 0=match , else no match
|
||||
*/
|
||||
int Xorriso_regexec(struct XorrisO *xorriso, char *to_match, int *failed_at,
|
||||
int flag);
|
||||
|
||||
int Xorriso_is_in_patternlist(struct XorrisO *xorriso,
|
||||
struct Xorriso_lsT *patternlist, char *path, int flag);
|
||||
|
||||
char *Xorriso_get_pattern(struct XorrisO *xorriso,
|
||||
struct Xorriso_lsT *patternlist, int index, int flag);
|
||||
|
||||
int Xorriso_prepare_expansion_pattern(struct XorrisO *xorriso, char *pattern,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= count results rather than storing them
|
||||
@return <=0 error , 1 is root (end processing) ,
|
||||
2 is not root (go on processing)
|
||||
*/
|
||||
int Xorriso_check_for_root_pattern(struct XorrisO *xorriso,
|
||||
int *filec, char **filev, int count_limit, off_t *mem, int flag);
|
||||
|
||||
/* @param flag bit0= count result rather than storing it
|
||||
bit1= unexpected change of number is a FATAL event
|
||||
*/
|
||||
int Xorriso_register_matched_adr(struct XorrisO *xorriso,
|
||||
char *adr, int count_limit,
|
||||
int *filec, char **filev, off_t *mem, int flag);
|
||||
|
||||
int Xorriso_eval_nonmatch(struct XorrisO *xorriso, char *pattern,
|
||||
int *nonconst_mismatches, off_t *mem, int flag);
|
||||
|
||||
/* @param flag bit0= a match count !=1 is a SORRY event
|
||||
*/
|
||||
int Xorriso_check_matchcount(struct XorrisO *xorriso,
|
||||
int count, int nonconst_mismatches, int num_patterns,
|
||||
char **patterns, int flag);
|
||||
|
||||
int Xorriso_no_pattern_memory(struct XorrisO *xorriso, off_t mem, int flag);
|
||||
|
||||
int Xorriso_alloc_pattern_mem(struct XorrisO *xorriso, off_t mem,
|
||||
int count, char ***filev, int flag);
|
||||
|
||||
/* @param flag bit0= command without pattern capability
|
||||
bit1= disk_pattern rather than iso_rr_pattern
|
||||
*/
|
||||
int Xorriso_warn_of_wildcards(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
/* @param flag bit0= a match count !=1 is a FAILURE event
|
||||
bit1= with bit0 tolerate 0 matches if pattern is a constant
|
||||
*/
|
||||
int Xorriso_expand_disk_pattern(struct XorrisO *xorriso,
|
||||
int num_patterns, char **patterns, int extra_filec,
|
||||
int *filec, char ***filev, off_t *mem, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_match_includeD */
|
||||
|
1258
libisoburn/branches/1.2.2/xorriso/misc_funct.c
Normal file
1258
libisoburn/branches/1.2.2/xorriso/misc_funct.c
Normal file
File diff suppressed because it is too large
Load Diff
99
libisoburn/branches/1.2.2/xorriso/misc_funct.h
Normal file
99
libisoburn/branches/1.2.2/xorriso/misc_funct.h
Normal file
@ -0,0 +1,99 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2012 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of cellaneous helper functions of xorriso.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_misc_includeD
|
||||
#define Xorriso_pvt_misc_includeD yes
|
||||
|
||||
#include <regex.h>
|
||||
|
||||
|
||||
char *Text_shellsafe(char *in_text, char *out_text, int flag);
|
||||
|
||||
int Sort_argv(int argc, char **argv, int flag);
|
||||
|
||||
/* @param flag bit0= single letters */
|
||||
char *Ftypetxt(mode_t st_mode, int flag);
|
||||
|
||||
/* @param flag bit0=with year and seconds
|
||||
bit1=timestamp format YYYY.MM.DD.hhmmss
|
||||
*/
|
||||
char *Ftimetxt(time_t t, char timetext[40], int flag);
|
||||
|
||||
int System_uname(char **sysname, char **release, char **version,
|
||||
char **machine, int flag);
|
||||
|
||||
/** Convert a text into a number of type double and multiply it by unit code
|
||||
[kmgtpe] (2^10 to 2^60) or [s] (2048). (Also accepts capital letters.)
|
||||
@param text Input like "42", "2k", "3.14m" or "-1g"
|
||||
@param flag Bitfield for control purposes:
|
||||
bit0= return -1 rathern than 0 on failure
|
||||
@return The derived double value
|
||||
*/
|
||||
double Scanf_io_size(char *text, int flag);
|
||||
|
||||
/*
|
||||
@flag bit0= do not initialize *diff_count
|
||||
@return <0 error , 0 = mismatch , 1 = match
|
||||
*/
|
||||
int Compare_text_lines(char *text1, char *text2, int *diff_count, int flag);
|
||||
|
||||
time_t Decode_timestring(char *code, time_t *date, int flag);
|
||||
|
||||
int Decode_ecma119_format(struct tm *erg, char *text, int flag);
|
||||
|
||||
int Wait_for_input(int fd, int microsec, int flag);
|
||||
|
||||
int Fileliste__target_source_limit(char *line, char sep, char **limit_pt,
|
||||
int flag);
|
||||
|
||||
int Fileliste__escape_source_path(char *line, int size, int flag);
|
||||
|
||||
int Hex_to_bin(char *hex,
|
||||
int bin_size, int *bin_count, unsigned char *bin_data, int flag);
|
||||
|
||||
|
||||
/* bit0= append (text!=NULL) */
|
||||
int Sregex_string(char **handle, char *text, int flag);
|
||||
|
||||
/* @param flag bit0= only test expression whether compilable
|
||||
*/
|
||||
int Sregex_match(char *pattern, char *text, int flag);
|
||||
|
||||
/*
|
||||
vars[][0] points to the variable names, vars[][1] to their contents.
|
||||
start marks the begin of variable names. It must be non-empty. esc before
|
||||
start disables this meaning. start and esc may be equal but else they must
|
||||
have disjoint character sets.
|
||||
end marks the end of a variable name. It may be empty but if non-empty it
|
||||
must not appear in vars[][0].
|
||||
@param flag bit0= Substitute unknown variables by empty text
|
||||
(else copy start,name,end unaltered to result).
|
||||
Parameter end must be non-empty for that.
|
||||
*/
|
||||
int Sregex_resolve_var(char *form, char *vars[][2], int num_vars,
|
||||
char *start, char *end, char *esc,
|
||||
char *result, int result_size, int flag);
|
||||
|
||||
/* reg_expr should be twice as large as bourne_expr ( + 2 to be exact) */
|
||||
/* return: 2= bourne_expr is surely a constant */
|
||||
int Xorriso__bourne_to_reg(char bourne_expr[], char reg_expr[], int flag);
|
||||
|
||||
|
||||
int Xorriso__hide_mode(char *mode, int flag);
|
||||
|
||||
char *Xorriso__hide_mode_text(int hide_mode, int flag);
|
||||
|
||||
/* @return 0=truncated, 1=ok
|
||||
*/
|
||||
int Xorriso__to_upper(char *in, char *out, int out_size, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_misc_includeD */
|
||||
|
2368
libisoburn/branches/1.2.2/xorriso/opts_a_c.c
Normal file
2368
libisoburn/branches/1.2.2/xorriso/opts_a_c.c
Normal file
File diff suppressed because it is too large
Load Diff
2143
libisoburn/branches/1.2.2/xorriso/opts_d_h.c
Normal file
2143
libisoburn/branches/1.2.2/xorriso/opts_d_h.c
Normal file
File diff suppressed because it is too large
Load Diff
1331
libisoburn/branches/1.2.2/xorriso/opts_i_o.c
Normal file
1331
libisoburn/branches/1.2.2/xorriso/opts_i_o.c
Normal file
File diff suppressed because it is too large
Load Diff
2005
libisoburn/branches/1.2.2/xorriso/opts_p_z.c
Normal file
2005
libisoburn/branches/1.2.2/xorriso/opts_p_z.c
Normal file
File diff suppressed because it is too large
Load Diff
2713
libisoburn/branches/1.2.2/xorriso/parse_exec.c
Normal file
2713
libisoburn/branches/1.2.2/xorriso/parse_exec.c
Normal file
File diff suppressed because it is too large
Load Diff
97
libisoburn/branches/1.2.2/xorriso/parse_exec.h
Normal file
97
libisoburn/branches/1.2.2/xorriso/parse_exec.h
Normal file
@ -0,0 +1,97 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which deal with parsing
|
||||
and interpretation of command input.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_cmd_includeD
|
||||
#define Xorriso_pvt_cmd_includeD yes
|
||||
|
||||
|
||||
/* @param flag bit0= do not warn of wildcards
|
||||
bit1= these are disk_paths
|
||||
*/
|
||||
int Xorriso_end_idx(struct XorrisO *xorriso,
|
||||
int argc, char **argv, int idx, int flag);
|
||||
|
||||
int Xorriso_opt_args(struct XorrisO *xorriso, char *cmd,
|
||||
int argc, char **argv, int idx,
|
||||
int *end_idx, int *optc, char ***optv, int flag);
|
||||
|
||||
int Xorriso_get_problem_status(struct XorrisO *xorriso, char severity[80],
|
||||
int flag);
|
||||
|
||||
int Xorriso_set_problem_status(struct XorrisO *xorriso, char *severity,
|
||||
int flag);
|
||||
|
||||
/**
|
||||
@param flag bit0= do not issue own event messages
|
||||
bit1= take xorriso->request_to_abort as reason for abort
|
||||
@return Gives the advice:
|
||||
2= pardon was given, go on
|
||||
1= no problem, go on
|
||||
0= function failed but xorriso would not abort, go on
|
||||
<0= do abort
|
||||
-1 = due to problem_status
|
||||
-2 = due to xorriso->request_to_abort
|
||||
*/
|
||||
int Xorriso_eval_problem_status(struct XorrisO *xorriso, int ret, int flag);
|
||||
|
||||
int Xorriso_cpmv_args(struct XorrisO *xorriso, char *cmd,
|
||||
int argc, char **argv, int *idx,
|
||||
int *optc, char ***optv, char eff_dest[SfileadrL],
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= with adr_mode sbsector: adr_value is possibly 16 too high
|
||||
*/
|
||||
int Xorriso_decode_load_adr(struct XorrisO *xorriso, char *cmd,
|
||||
char *adr_mode, char *adr_value,
|
||||
int *entity_code, char entity_id[81],
|
||||
int flag);
|
||||
|
||||
int Xorriso_check_name_len(struct XorrisO *xorriso, char *name, int size,
|
||||
char *cmd, int flag);
|
||||
|
||||
/* @param flag bit0= prepend wd only if name does not begin by '/'
|
||||
bit2= prepend wd (automatically done if wd[0]!=0)
|
||||
*/
|
||||
int Xorriso_make_abs_adr(struct XorrisO *xorriso, char *wd, char *name,
|
||||
char adr[], int flag);
|
||||
|
||||
/* @param flag bit0= do not complain in case of error, but set info_text */
|
||||
int Xorriso_convert_datestring(struct XorrisO *xorriso, char *cmd,
|
||||
char *time_type, char *timestring,
|
||||
int *t_type, time_t *t, int flag);
|
||||
|
||||
int Xorriso_check_temp_mem_limit(struct XorrisO *xorriso, off_t mem, int flag);
|
||||
|
||||
/* @param flag bit0= use env_path to find the desired program
|
||||
*/
|
||||
int Xorriso_execv(struct XorrisO *xorriso, char *cmd, char *env_path,
|
||||
int *status, int flag);
|
||||
|
||||
int Xorriso_path_is_excluded(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
int Xorriso_path_is_hidden(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
|
||||
/* Normalize ACL and sort apart "access" ACL from "default" ACL.
|
||||
*/
|
||||
int Xorriso_normalize_acl_text(struct XorrisO *xorriso, char *in_text,
|
||||
char **access_acl_text, char **default_acl_text, int flag);
|
||||
|
||||
int Xorriso_read_mkisofsrc(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* @param flag bit0= list sorting order rather than looking for argv[idx]
|
||||
*/
|
||||
int Xorriso_cmd_sorting_rank(struct XorrisO *xorriso,
|
||||
int argc, char **argv, int idx, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_cmd_includeD */
|
||||
|
2143
libisoburn/branches/1.2.2/xorriso/read_run.c
Normal file
2143
libisoburn/branches/1.2.2/xorriso/read_run.c
Normal file
File diff suppressed because it is too large
Load Diff
70
libisoburn/branches/1.2.2/xorriso/read_run.h
Normal file
70
libisoburn/branches/1.2.2/xorriso/read_run.h
Normal file
@ -0,0 +1,70 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_read_run_includeD
|
||||
#define Xorriso_pvt_read_run_includeD yes
|
||||
|
||||
|
||||
int Xorriso__read_pacifier(IsoImage *image, IsoFileSource *filesource);
|
||||
|
||||
int Xorriso_restore_properties(struct XorrisO *xorriso, char *disk_path,
|
||||
IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_restore_implicit_properties(struct XorrisO *xorriso,
|
||||
char *full_disk_path, char *disk_path, char *full_img_path, int flag);
|
||||
|
||||
int Xorriso_tree_restore_node(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *img_path, off_t img_offset,
|
||||
char *disk_path, off_t disk_offset, off_t bytes,
|
||||
int flag);
|
||||
|
||||
int Xorriso_restore_overwrite(struct XorrisO *xorriso,
|
||||
IsoNode *node, char *img_path,
|
||||
char *path, char *nominal_path,
|
||||
struct stat *stbuf, int flag);
|
||||
|
||||
int Xorriso_restore_target_hl(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *disk_path, int *node_idx, int flag);
|
||||
|
||||
int Xorriso_restore_prefix_hl(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *disk_path, int node_idx, int flag);
|
||||
|
||||
int Xorriso_register_node_target(struct XorrisO *xorriso, int node_idx,
|
||||
char *disk_path, int flag);
|
||||
|
||||
int Xorriso_restore_disk_object(struct XorrisO *xorriso,
|
||||
char *img_path, IsoNode *node,
|
||||
char *disk_path,
|
||||
off_t offset, off_t bytes, int flag);
|
||||
|
||||
int Xorriso_handle_collision(struct XorrisO *xorriso,
|
||||
IsoNode *node, char *img_path,
|
||||
char *disk_path, char *nominal_disk_path,
|
||||
int *stbuf_ret, int flag);
|
||||
|
||||
int Xorriso_restore_tree(struct XorrisO *xorriso, IsoDir *dir,
|
||||
char *img_dir_path, char *disk_dir_path,
|
||||
off_t boss_mem,
|
||||
struct LinkiteM *link_stack, int flag);
|
||||
|
||||
int Xorriso_read_file_data(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *img_path, char *disk_path,
|
||||
off_t img_offset, off_t disk_offset,
|
||||
off_t bytes, int flag);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_read_run_includeD */
|
||||
|
905
libisoburn/branches/1.2.2/xorriso/sfile.c
Normal file
905
libisoburn/branches/1.2.2/xorriso/sfile.c
Normal file
@ -0,0 +1,905 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains the implementation of functions around files and strings.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
|
||||
|
||||
#include "sfile.h"
|
||||
|
||||
|
||||
/* @param flag bit0= do not clip off carriage return at line end
|
||||
*/
|
||||
char *Sfile_fgets_n(char *line, int maxl, FILE *fp, int flag)
|
||||
{
|
||||
int l;
|
||||
char *ret;
|
||||
|
||||
ret= fgets(line,maxl,fp);
|
||||
if(ret==NULL)
|
||||
return(NULL);
|
||||
l= strlen(line);
|
||||
if(l > 0 && !(flag & 1)) if(line[l-1] == '\r') line[--l]= 0;
|
||||
if(l > 0) if(line[l-1] == '\n') line[--l]= 0;
|
||||
if(l > 0 && !(flag & 1)) if(line[l-1] == '\r') line[--l]= 0;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_count_components(char *path, int flag)
|
||||
/*
|
||||
bit0= do not ignore trailing slash
|
||||
bit1= do not ignore empty components (other than the empty root name)
|
||||
*/
|
||||
{
|
||||
int l,count= 0;
|
||||
char *cpt;
|
||||
|
||||
l= strlen(path);
|
||||
if(l==0)
|
||||
return(0);
|
||||
count= 1;
|
||||
for(cpt= path+l-1;cpt>=path;cpt--) {
|
||||
if(*cpt=='/') {
|
||||
if(*(cpt+1)==0 && !(flag&1))
|
||||
continue;
|
||||
if(*(cpt+1)=='/' && !(flag&2))
|
||||
continue;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return(count);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_component_pointer(char *path, char **sourcept, int idx, int flag)
|
||||
/*
|
||||
bit0= do not ignore trailing slash
|
||||
bit1= do not ignore empty components (other than the empty root name)
|
||||
bit2= accept 0 as '/'
|
||||
*/
|
||||
{
|
||||
int count= 0;
|
||||
char *spt;
|
||||
|
||||
for(spt= path;*spt!=0 || (flag&4);spt++) {
|
||||
if(count>=idx) {
|
||||
*sourcept= spt;
|
||||
return(1);
|
||||
}
|
||||
if(*spt=='/' || *spt==0) {
|
||||
if(*(spt+1)=='/' && !(flag&2))
|
||||
continue;
|
||||
if(*(spt+1)==0 && !(flag&1))
|
||||
continue;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if((flag&1) && count>=idx)
|
||||
return(1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_leafname(char *path, char leafname[SfileadrL], int flag)
|
||||
{
|
||||
int count, ret;
|
||||
char *lpt;
|
||||
|
||||
leafname[0]= 0;
|
||||
count= Sfile_count_components(path, 0);
|
||||
if(count==0)
|
||||
return(0);
|
||||
ret= Sfile_component_pointer(path, &lpt, count-1, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
if(Sfile_str(leafname, lpt, 0)<=0)
|
||||
return(0);
|
||||
lpt= strchr(leafname, '/');
|
||||
if(lpt!=NULL)
|
||||
*lpt= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_add_to_path(char path[SfileadrL], char *addon, int flag)
|
||||
{
|
||||
int l;
|
||||
|
||||
l= strlen(path);
|
||||
if(l+1>=SfileadrL)
|
||||
return(0);
|
||||
if(l==0) {
|
||||
strcpy(path,"/");
|
||||
l= 1;
|
||||
} else if(path[l-1]!='/') {
|
||||
path[l++]= '/';
|
||||
path[l]= 0;
|
||||
}
|
||||
if(l+strlen(addon)>=SfileadrL)
|
||||
return(0);
|
||||
if(addon[0]=='/')
|
||||
strcpy(path+l,addon+1);
|
||||
else
|
||||
strcpy(path+l,addon);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_prepend_path(char *prefix, char path[SfileadrL], int flag)
|
||||
{
|
||||
int l, i, slashes, prefix_len, path_len;
|
||||
|
||||
l= strlen(prefix);
|
||||
if(l == 0)
|
||||
return(1);
|
||||
|
||||
/* Do not copy slashes between both parts */
|
||||
for(prefix_len= l; prefix_len > 0; prefix_len--)
|
||||
if(prefix[prefix_len - 1] != '/')
|
||||
break;
|
||||
if(prefix_len == 0)
|
||||
prefix_len= strlen(prefix) - 1;
|
||||
path_len= strlen(path);
|
||||
for(slashes= 0; slashes < path_len; slashes++)
|
||||
if(path[slashes] != '/')
|
||||
break;
|
||||
|
||||
l= (strlen(path) - slashes) + prefix_len + 1;
|
||||
if(l>=SfileadrL) {
|
||||
|
||||
#ifdef Not_yeT
|
||||
/* >>> ??? how to transport messages to xorriso ? */
|
||||
sprintf(xorriso->info_text,
|
||||
"Combination of wd and relative address too long (%d > %d)",
|
||||
l,SfileadrL-1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
#endif
|
||||
|
||||
return(-1);
|
||||
}
|
||||
l-= strlen(path);
|
||||
if(l < 0) {
|
||||
for(i= slashes; i <= path_len + 1; i++)
|
||||
path[i+l]= path[i];
|
||||
} else if(l > 0) {
|
||||
for(i= path_len + 1; i >= slashes; i--)
|
||||
path[i+l]= path[i];
|
||||
}
|
||||
if(prefix_len > 0)
|
||||
memcpy(path, prefix, prefix_len);
|
||||
path[l - 1 + slashes]= '/';
|
||||
return(1);
|
||||
}
|
||||
|
||||
int Sfile_being_group_member(struct stat *stbuf, int flag)
|
||||
{
|
||||
int i, suppl_groups;
|
||||
gid_t *suppl_glist;
|
||||
|
||||
if (getegid()==stbuf->st_gid)
|
||||
return(1);
|
||||
suppl_groups= getgroups(0, NULL);
|
||||
suppl_glist= (gid_t *) malloc((suppl_groups + 1) * sizeof(gid_t));
|
||||
if (suppl_glist==NULL)
|
||||
return(-1);
|
||||
suppl_groups= getgroups(suppl_groups+1,suppl_glist);
|
||||
for (i= 0; i<suppl_groups; i++) {
|
||||
if (suppl_glist[i]==stbuf->st_gid) {
|
||||
free((char *) suppl_glist);
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
free((char *) suppl_glist);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_type(char *filename, int flag)
|
||||
/*
|
||||
bit0= return -1 if file is missing
|
||||
bit1= return a hardlink with siblings as type 5
|
||||
bit2= evaluate eventual link target rather than the link object itself
|
||||
bit3= return a socket or a char device as types 7 or 8 rather than 0
|
||||
*/
|
||||
/*
|
||||
return:
|
||||
0=unknown
|
||||
1=regular
|
||||
2=directory
|
||||
3=symbolic link
|
||||
4=named pipe
|
||||
5=multiple hardlink (with bit1)
|
||||
6=block device
|
||||
7=socket (with bit3)
|
||||
8=character device (with bit3)
|
||||
*/
|
||||
{
|
||||
struct stat stbuf;
|
||||
if(flag&4) {
|
||||
if(stat(filename,&stbuf)==-1) {
|
||||
if(flag&1) return(-1);
|
||||
else return(0);
|
||||
}
|
||||
} else {
|
||||
if(lstat(filename,&stbuf)==-1) {
|
||||
if(flag&1) return(-1);
|
||||
else return(0);
|
||||
}
|
||||
}
|
||||
if(S_ISREG(stbuf.st_mode)) {
|
||||
if(flag&2)
|
||||
if(stbuf.st_nlink>1)
|
||||
return(5);
|
||||
return(1);
|
||||
}
|
||||
if(S_ISDIR(stbuf.st_mode))
|
||||
return(2);
|
||||
if((stbuf.st_mode&S_IFMT)==S_IFLNK)
|
||||
return(3);
|
||||
if(S_ISFIFO(stbuf.st_mode))
|
||||
return(4);
|
||||
if(S_ISBLK(stbuf.st_mode))
|
||||
return(6);
|
||||
if(flag&8)
|
||||
if((stbuf.st_mode&S_IFMT)==S_IFSOCK)
|
||||
return(7);
|
||||
if(flag&8)
|
||||
if(S_ISCHR(stbuf.st_mode))
|
||||
return(8);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
char *Sfile_datestr(time_t tim, short int flag)
|
||||
/*
|
||||
bit0=with hours+minutes
|
||||
bit1=with seconds
|
||||
|
||||
bit8= local time rather than UTC
|
||||
*/
|
||||
{
|
||||
static char zeitcode[80]={"000000"};
|
||||
char puff[80];
|
||||
struct tm *azt;
|
||||
|
||||
if(flag&256)
|
||||
azt = localtime(&tim);
|
||||
else
|
||||
azt = gmtime(&tim);
|
||||
|
||||
if(azt->tm_year>99)
|
||||
sprintf(zeitcode,"%c%1.1d%2.2d%2.2d",
|
||||
'A'+(azt->tm_year-100)/10,azt->tm_year%10,
|
||||
azt->tm_mon+1,azt->tm_mday);
|
||||
else
|
||||
sprintf(zeitcode,"%2.2d%2.2d%2.2d",
|
||||
azt->tm_year,azt->tm_mon+1,azt->tm_mday);
|
||||
if(flag&1){
|
||||
sprintf(puff,".%2.2d%2.2d",azt->tm_hour,azt->tm_min);
|
||||
strcat(zeitcode,puff);
|
||||
}
|
||||
if(flag&2){
|
||||
sprintf(puff,"%2.2d",azt->tm_sec);
|
||||
strcat(zeitcode,puff);
|
||||
}
|
||||
|
||||
return(zeitcode);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_scale(double value, char *result, int siz, double thresh, int flag)
|
||||
/*
|
||||
bit0= eventually ommit 'b'
|
||||
bit1= make text as short as possible
|
||||
bit2= no fraction (if it would fit at all)
|
||||
*/
|
||||
{
|
||||
char scale_c,scales[7],form[80], *negpt= NULL, *cpt;
|
||||
int i,dec_siz= 0,avail_siz= 1;
|
||||
|
||||
if(value<0) {
|
||||
value= -value;
|
||||
siz--;
|
||||
result[0]= '-';
|
||||
negpt= result;
|
||||
result++;
|
||||
}
|
||||
strcpy(scales,"bkmgtp");
|
||||
scale_c= scales[0];
|
||||
for(i=1;scales[i]!=0;i++) {
|
||||
if(value<thresh-0.5)
|
||||
break;
|
||||
value/= 1024.0;
|
||||
scale_c= scales[i];
|
||||
}
|
||||
if(scale_c!='b' && !(flag&4)) { /* is there room for fractional part ? */
|
||||
avail_siz= siz-1;
|
||||
sprintf(form,"%%.f");
|
||||
sprintf(result,"%.f",value);
|
||||
if(((int) strlen(result)) <= avail_siz - 2)
|
||||
dec_siz= 1; /* we are very modest */
|
||||
}
|
||||
if(scale_c=='b' && (flag&1)) {
|
||||
if(flag&2)
|
||||
sprintf(form,"%%.f");
|
||||
else
|
||||
sprintf(form,"%%%d.f",siz);
|
||||
sprintf(result,form,value);
|
||||
} else {
|
||||
if(flag&2)
|
||||
sprintf(form,"%%.f%%c");
|
||||
else if(dec_siz>0)
|
||||
sprintf(form,"%%%d.%df%%c",avail_siz,dec_siz);
|
||||
else
|
||||
sprintf(form,"%%%d.f%%c",siz-1);
|
||||
sprintf(result,form,value,scale_c);
|
||||
}
|
||||
if(negpt != NULL) {
|
||||
for(cpt= result; *cpt==' '; cpt++);
|
||||
if(cpt > result) {
|
||||
*negpt= ' ';
|
||||
*(cpt - 1)= '-';
|
||||
}
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_off_t_text(char text[80], off_t num, int flag)
|
||||
{
|
||||
char *tpt;
|
||||
off_t hnum, scale= 1;
|
||||
int digits= 0, d, i;
|
||||
|
||||
tpt= text;
|
||||
hnum= num;
|
||||
if(hnum<0) {
|
||||
*(tpt++)= '-';
|
||||
hnum= -num;
|
||||
}
|
||||
if(hnum<0) { /* it can stay nastily persistent */
|
||||
strcpy(text, "_overflow_");
|
||||
return(0);
|
||||
}
|
||||
for(i= 0; i<23; i++) { /* good for up to 70 bit = 10 exp 21.07... */
|
||||
if(hnum==0)
|
||||
break;
|
||||
hnum/= 10;
|
||||
if(hnum)
|
||||
scale*= 10;
|
||||
}
|
||||
if(i==0) {
|
||||
strcpy(text, "0");
|
||||
return(1);
|
||||
}
|
||||
if(i==23) {
|
||||
strcpy(text, "_overflow_");
|
||||
return(0);
|
||||
}
|
||||
digits= i;
|
||||
hnum= num;
|
||||
for(; i>0; i--) {
|
||||
d= hnum/scale;
|
||||
tpt[digits-i]= '0'+d;
|
||||
hnum= hnum%scale;
|
||||
scale/= 10;
|
||||
}
|
||||
tpt[digits]= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* Converts backslash codes into single characters:
|
||||
\a BEL 7 , \b BS 8 , \e ESC 27 , \f FF 12 , \n LF 10 , \r CR 13 ,
|
||||
\t HT 9 , \v VT 11 , \\ \ 92
|
||||
\[0-9][0-9][0-9] octal code , \x[0-9a-f][0-9a-f] hex code ,
|
||||
\cX control-x (ascii(X)-64)
|
||||
@param upto maximum number of characters to examine for backslash.
|
||||
The scope of a backslash (0 to 3 characters) is not affected.
|
||||
@param eaten returns the difference in length between input and output
|
||||
@param flag bit0= only determine *eaten, do not convert
|
||||
bit1= allow to convert \000 to binary 0
|
||||
*/
|
||||
int Sfile_bsl_interpreter(char *text, int upto, int *eaten, int flag)
|
||||
{
|
||||
char *rpt, *wpt, num_text[8], wdummy[8];
|
||||
unsigned int num= 0;
|
||||
|
||||
*eaten= 0;
|
||||
wpt= text;
|
||||
for(rpt= text; *rpt != 0 && rpt - text < upto; rpt++) {
|
||||
if(flag & 1)
|
||||
wpt= wdummy;
|
||||
if(*rpt == '\\') {
|
||||
rpt++;
|
||||
(*eaten)++;
|
||||
if(*rpt == 'a') {
|
||||
*(wpt++)= 7;
|
||||
} else if(*rpt == 'b') {
|
||||
*(wpt++)= 8;
|
||||
} else if(*rpt == 'e') {
|
||||
*(wpt++)= 27;
|
||||
} else if(*rpt == 'f') {
|
||||
*(wpt++)= 12;
|
||||
} else if(*rpt == 'n') {
|
||||
*(wpt++)= 10;
|
||||
} else if(*rpt == 'r') {
|
||||
*(wpt++)= 13;
|
||||
} else if(*rpt == 't') {
|
||||
*(wpt++)= 9;
|
||||
} else if(*rpt == 'v') {
|
||||
*(wpt++)= 11;
|
||||
} else if(*rpt == '\\') {
|
||||
*(wpt++)= '\\';
|
||||
} else if(rpt[0] >= '0' && rpt[0] <= '7' &&
|
||||
rpt[1] >= '0' && rpt[1] <= '7' &&
|
||||
rpt[2] >= '0' && rpt[2] <= '7') {
|
||||
num_text[0]= '0';
|
||||
num_text[1]= *(rpt + 0);
|
||||
num_text[2]= *(rpt + 1);
|
||||
num_text[3]= *(rpt + 2);
|
||||
num_text[4]= 0;
|
||||
sscanf(num_text, "%o", &num);
|
||||
if((num > 0 || (flag & 2)) && num <= 255) {
|
||||
rpt+= 2;
|
||||
(*eaten)+= 2;
|
||||
*(wpt++)= num;
|
||||
} else
|
||||
goto not_a_code;
|
||||
} else if(rpt[0] == 'x' &&
|
||||
((rpt[1] >= '0' && rpt[1] <= '9') ||
|
||||
(rpt[1] >= 'A' && rpt[1] <= 'F') ||
|
||||
(rpt[1] >= 'a' && rpt[1] <= 'f'))
|
||||
&&
|
||||
((rpt[2] >= '0' && rpt[2] <= '9') ||
|
||||
(rpt[2] >= 'A' && rpt[2] <= 'F') ||
|
||||
(rpt[2] >= 'a' && rpt[2] <= 'f'))
|
||||
) {
|
||||
num_text[0]= *(rpt + 1);
|
||||
num_text[1]= *(rpt + 2);
|
||||
num_text[2]= 0;
|
||||
sscanf(num_text, "%x", &num);
|
||||
if(num > 0 && num <= 255) {
|
||||
rpt+= 2;
|
||||
(*eaten)+= 2;
|
||||
*(wpt++)= num;
|
||||
} else
|
||||
goto not_a_code;
|
||||
} else if(*rpt == 'c') {
|
||||
if(rpt[1] > 64 && rpt[1] < 96) {
|
||||
*(wpt++)= rpt[1] - 64;
|
||||
rpt++;
|
||||
(*eaten)++;
|
||||
} else
|
||||
goto not_a_code;
|
||||
} else {
|
||||
not_a_code:;
|
||||
*(wpt++)= '\\';
|
||||
rpt--;
|
||||
(*eaten)--;
|
||||
}
|
||||
} else
|
||||
*(wpt++)= *rpt;
|
||||
}
|
||||
*wpt= *rpt;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_argv_bsl(int argc, char ***argv, int flag)
|
||||
{
|
||||
int i, ret, eaten;
|
||||
char **new_argv= NULL;
|
||||
|
||||
if(argc <= 0)
|
||||
return(0);
|
||||
new_argv= (char **) Smem_malloC(argc * sizeof(char *));
|
||||
if(new_argv == NULL)
|
||||
return(-1);
|
||||
for(i= 0; i < argc; i++) {
|
||||
new_argv[i]= strdup((*argv)[i]);
|
||||
if(new_argv[i] == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
ret= Sfile_bsl_interpreter(new_argv[i], strlen(new_argv[i]), &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(ret <= 0) {
|
||||
if(new_argv != NULL)
|
||||
free((char *) new_argv);
|
||||
} else
|
||||
*argv= new_argv;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= only encode inside quotes
|
||||
bit1= encode < 32 outside quotes except 7, 8, 9, 10, 12, 13
|
||||
bit2= encode in any case above 126
|
||||
bit3= encode in any case shellsafe and name-value-safe:
|
||||
<=42 , 59, 60, 61, 62, 63, 92, 94, 96, >=123
|
||||
*/
|
||||
int Sfile_bsl_encoder(char **result, char *text, size_t text_len, int flag)
|
||||
{
|
||||
signed char *rpt;
|
||||
char *wpt;
|
||||
int count, sq_open= 0, dq_open= 0;
|
||||
|
||||
count= 0;
|
||||
for(rpt= (signed char *) text; (size_t) (((char *) rpt) - text) < text_len;
|
||||
rpt++) {
|
||||
count++;
|
||||
if(flag & 8) {
|
||||
if(!(*rpt <= 42 || (*rpt >= 59 && *rpt <= 63) ||
|
||||
*rpt == 92 || *rpt == 94 || *rpt == 96 || *rpt >= 123))
|
||||
continue;
|
||||
} else if(*rpt >= 32 && *rpt <= 126 && *rpt != '\\')
|
||||
continue;
|
||||
if(((*rpt >= 7 && *rpt <= 13) || *rpt == 27 || *rpt == '\\') && !(flag & 8))
|
||||
count++;
|
||||
else
|
||||
count+= 3;
|
||||
}
|
||||
(*result)= wpt= calloc(count + 1, 1);
|
||||
if(wpt == NULL)
|
||||
return(-1);
|
||||
for(rpt= (signed char *) text; (size_t) (((char *) rpt) - text) < text_len;
|
||||
rpt++) {
|
||||
if(*rpt == '\'')
|
||||
sq_open= !(sq_open || dq_open);
|
||||
if(*rpt == '"')
|
||||
dq_open= !(sq_open || dq_open);
|
||||
|
||||
if(flag & 8) {
|
||||
if(!(*rpt <= 42 || (*rpt >= 59 && *rpt <= 63) ||
|
||||
*rpt == 92 || *rpt == 94 || *rpt == 96 || *rpt >= 123)) {
|
||||
*(wpt++)= *rpt;
|
||||
continue;
|
||||
}
|
||||
} else if(*rpt >= 32 && *rpt <= 126 && *rpt != '\\') {
|
||||
*(wpt++)= *rpt;
|
||||
continue;
|
||||
} else if( ((flag & 1) && !(sq_open || dq_open)) &&
|
||||
!((flag & 2) && (*rpt >= 1 && * rpt <= 31 &&
|
||||
!(*rpt == 7 || *rpt == 8 || *rpt == 9 || *rpt == 10 ||
|
||||
*rpt == 12 || *rpt == 13))) &&
|
||||
!((flag & 4) && (*rpt > 126 || *rpt < 0)) &&
|
||||
!((flag & 6) && *rpt == '\\')) {
|
||||
*(wpt++)= *rpt;
|
||||
continue;
|
||||
}
|
||||
*(wpt++)= '\\';
|
||||
if(((*rpt >= 7 && *rpt <= 13) || *rpt == 27 || *rpt == '\\') && !(flag&8)) {
|
||||
if(*rpt == 7)
|
||||
*(wpt++)= 'a';
|
||||
else if(*rpt == 8)
|
||||
*(wpt++)= 'b';
|
||||
else if(*rpt == 9)
|
||||
*(wpt++)= 't';
|
||||
else if(*rpt == 10) {
|
||||
*(wpt++)= 'n';
|
||||
} else if(*rpt == 11)
|
||||
*(wpt++)= 'v';
|
||||
else if(*rpt == 12)
|
||||
*(wpt++)= 'f';
|
||||
else if(*rpt == 13)
|
||||
*(wpt++)= 'c';
|
||||
else if(*rpt == 27)
|
||||
*(wpt++)= 'e';
|
||||
else if(*rpt == '\\')
|
||||
*(wpt++)= '\\';
|
||||
} else {
|
||||
sprintf(wpt, "%-3.3o", (unsigned int) *((unsigned char *) rpt));
|
||||
wpt+= 3;
|
||||
}
|
||||
}
|
||||
*wpt= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_destroy_argv(int *argc, char ***argv, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(*argc>0 && *argv!=NULL){
|
||||
for(i=0;i<*argc;i++){
|
||||
if((*argv)[i]!=NULL)
|
||||
Smem_freE((*argv)[i]);
|
||||
}
|
||||
Smem_freE((char *) *argv);
|
||||
}
|
||||
*argc= 0;
|
||||
*argv= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv,
|
||||
int flag)
|
||||
/*
|
||||
bit0= read progname as first argument from line
|
||||
bit1= just release argument list argv and return
|
||||
bit2= abort with return(0) if incomplete quotes are found
|
||||
bit3= eventually prepend missing '-' to first argument read from line
|
||||
bit4= like bit2 but only check quote completeness, do not allocate memory
|
||||
bit5+6= interpretation of backslashes:
|
||||
0= no interpretation, leave unchanged
|
||||
1= only inside double quotes
|
||||
2= outside single quotes
|
||||
3= everywhere
|
||||
bit7= append a NULL element to argv
|
||||
*/
|
||||
{
|
||||
int i,pass,maxl=0,l,argzaehl=0,bufl,line_start_argc, bsl_mode, ret= 0, eaten;
|
||||
char *cpt,*start;
|
||||
char *buf= NULL;
|
||||
|
||||
Sfile_destroy_argv(argc,argv,0);
|
||||
if(flag&2)
|
||||
{ret= 1; goto ex;}
|
||||
|
||||
if(flag & 16)
|
||||
flag|= 4;
|
||||
bsl_mode= (flag >> 5) & 3;
|
||||
|
||||
buf= calloc(strlen(line) + SfileadrL, 1);
|
||||
if(buf == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
for(pass=0;pass<2;pass++) {
|
||||
cpt= line-1;
|
||||
if(!(flag&1)){
|
||||
argzaehl= line_start_argc= 1;
|
||||
if(pass==0)
|
||||
maxl= strlen(progname);
|
||||
else
|
||||
strcpy((*argv)[0],progname);
|
||||
} else {
|
||||
argzaehl= line_start_argc= 0;
|
||||
if(pass==0) maxl= 0;
|
||||
}
|
||||
while(*(++cpt)!=0){
|
||||
if(isspace(*cpt)) continue;
|
||||
start= cpt;
|
||||
buf[0]= 0;
|
||||
cpt--;
|
||||
while(*(++cpt)!=0) {
|
||||
if(isspace(*cpt)) break;
|
||||
if(*cpt=='"'){
|
||||
l= cpt-start; bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
|
||||
if(bsl_mode >= 3) {
|
||||
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
l= strlen(buf);
|
||||
start= cpt+1;
|
||||
while(*(++cpt)!=0) if(*cpt=='"') break;
|
||||
if((flag&4) && *cpt==0)
|
||||
{ret= 0; goto ex;}
|
||||
l= cpt-start; bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncpy(buf + bufl, start, l);
|
||||
buf[bufl + l]= 0;
|
||||
if(bsl_mode >= 1) {
|
||||
ret= Sfile_bsl_interpreter(buf + bufl, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
start= cpt+1;
|
||||
}else if(*cpt=='\''){
|
||||
l= cpt-start; bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
|
||||
if(bsl_mode >= 3) {
|
||||
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
l= strlen(buf);
|
||||
start= cpt+1;
|
||||
while(*(++cpt)!=0) if(*cpt=='\'') break;
|
||||
if((flag&4) && *cpt==0)
|
||||
{ret= 0; goto ex;}
|
||||
l= cpt-start; bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncat(buf,start,l);buf[bufl+l]= 0;
|
||||
if(bsl_mode >= 2) {
|
||||
ret= Sfile_bsl_interpreter(buf + bufl, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
start= cpt+1;
|
||||
}
|
||||
if(*cpt==0) break;
|
||||
}
|
||||
l= cpt-start;
|
||||
bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
|
||||
if(bsl_mode >= 3) {
|
||||
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
l= strlen(buf);
|
||||
if(pass==0){
|
||||
if(argzaehl==line_start_argc && (flag&8))
|
||||
if(buf[0]!='-' && buf[0]!=0 && buf[0]!='#')
|
||||
l++;
|
||||
if(l>maxl) maxl= l;
|
||||
}else{
|
||||
strcpy((*argv)[argzaehl],buf);
|
||||
if(argzaehl==line_start_argc && (flag&8))
|
||||
if(buf[0]!='-' && buf[0]!=0 && buf[0]!='#')
|
||||
sprintf((*argv)[argzaehl],"-%s", buf);
|
||||
}
|
||||
argzaehl++;
|
||||
if(*cpt==0) break;
|
||||
}
|
||||
if(pass==0){
|
||||
if(flag & 16)
|
||||
{ret= 1; goto ex;}
|
||||
*argc= argzaehl;
|
||||
if(argzaehl>0 || (flag & 128)) {
|
||||
*argv= (char **) Smem_malloC((argzaehl + !!(flag & 128))
|
||||
* sizeof(char *));
|
||||
if(*argv==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
for(i=0;i<*argc;i++) {
|
||||
(*argv)[i]= (char *) Smem_malloC((maxl+1));
|
||||
if((*argv)[i]==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
if(flag & 128)
|
||||
(*argv)[*argc]= NULL;
|
||||
}
|
||||
}
|
||||
ret= 1;
|
||||
ex:
|
||||
if(buf != NULL)
|
||||
free(buf);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= append */
|
||||
int Sfile_str(char target[SfileadrL], char *source, int flag)
|
||||
{
|
||||
int l;
|
||||
|
||||
l= strlen(source);
|
||||
if(flag&1)
|
||||
l+= strlen(target);
|
||||
if(l>=SfileadrL) {
|
||||
fprintf(stderr, "--- Path string overflow (%d > %d). Malicious input ?\n",
|
||||
l,SfileadrL-1);
|
||||
return(0);
|
||||
}
|
||||
if(flag&1)
|
||||
strcat(target, source);
|
||||
else
|
||||
strcpy(target, source);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/** Combine environment variable HOME with given filename
|
||||
@param filename Address relative to $HOME
|
||||
@param fileadr Resulting combined address
|
||||
@param fa_size Size of array fileadr
|
||||
@param flag Unused yet
|
||||
@return 1=ok , 0=no HOME variable , -1=result address too long
|
||||
*/
|
||||
int Sfile_home_adr_s(char *filename, char *fileadr, int fa_size, int flag)
|
||||
{
|
||||
char *home;
|
||||
|
||||
strcpy(fileadr,filename);
|
||||
home= getenv("HOME");
|
||||
if(home==NULL)
|
||||
return(0);
|
||||
if((int) (strlen(home) + strlen(filename) + 1) >= fa_size)
|
||||
return(-1);
|
||||
strcpy(fileadr,home);
|
||||
if(filename[0]!=0){
|
||||
strcat(fileadr,"/");
|
||||
strcat(fileadr,filename);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/** Return a double representing seconds and microseconds since 1 Jan 1970 */
|
||||
double Sfile_microtime(int flag)
|
||||
{
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
gettimeofday(&tv,&tz);
|
||||
return((double) (tv.tv_sec+1.0e-6*tv.tv_usec));
|
||||
}
|
||||
|
||||
|
||||
int Sfile_decode_datestr(struct tm *reply, char *text, int flag)
|
||||
/* YYMMDD[.hhmm[ss]] */
|
||||
{
|
||||
int i,l;
|
||||
time_t current_time;
|
||||
struct tm *now;
|
||||
|
||||
current_time= time(0);
|
||||
now= localtime(¤t_time);
|
||||
for(i=0; i < (int) sizeof(struct tm); i++)
|
||||
((char *) reply)[i]= ((char *) now)[i];
|
||||
|
||||
if(text[0]<'0'|| (text[0]>'9' && text[0]<'A') || text[0]>'Z')
|
||||
return(0);
|
||||
l= strlen(text);
|
||||
for(i=1;i<l;i++)
|
||||
if(text[i]<'0'||text[i]>'9')
|
||||
break;
|
||||
if(i!=6)
|
||||
return(0);
|
||||
if(text[i]==0)
|
||||
goto decode;
|
||||
if(text[i]!='.' || (l!=11 && l!=13))
|
||||
return(0);
|
||||
for(i++;i<l;i++)
|
||||
if(text[i]<'0'||text[i]>'9')
|
||||
break;
|
||||
if(i!=l)
|
||||
return(0);
|
||||
|
||||
decode:;
|
||||
reply->tm_hour= 0;
|
||||
reply->tm_min= 0;
|
||||
reply->tm_sec= 0;
|
||||
i= 0;
|
||||
if(text[0]>='A')
|
||||
reply->tm_year= 100+(text[i]-'A')*10+text[1]-'0';
|
||||
else
|
||||
reply->tm_year= 10*(text[0]-'0')+text[1]-'0';
|
||||
reply->tm_mon= 10*(text[2]-'0')+text[3]-'0'-1;
|
||||
reply->tm_mday= 10*(text[4]-'0')+text[5]-'0';
|
||||
if(l==6)
|
||||
return(1);
|
||||
reply->tm_hour= 10*(text[7]-'0')+text[8]-'0';
|
||||
reply->tm_min= 10*(text[9]-'0')+text[10]-'0';
|
||||
if(l==11)
|
||||
return(1);
|
||||
reply->tm_sec= 10*(text[11]-'0')+text[12]-'0';
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
135
libisoburn/branches/1.2.2/xorriso/sfile.h
Normal file
135
libisoburn/branches/1.2.2/xorriso/sfile.h
Normal file
@ -0,0 +1,135 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions around files and strings.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_sfile_includeD
|
||||
#define Xorriso_pvt_sfile_includeD yes
|
||||
|
||||
#define TSOB_FELD(typ, count) (typ *) calloc(1, (count)*sizeof(typ));
|
||||
#define Smem_malloC malloc
|
||||
#define Smem_freE free
|
||||
|
||||
#define Xorriso_alloc_meM(pt, typ, count) { \
|
||||
pt= (typ *) calloc(1, (count) * sizeof(typ)); \
|
||||
if(pt == NULL) { \
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0); \
|
||||
ret= -1; \
|
||||
goto ex; \
|
||||
} }
|
||||
|
||||
#define Xorriso_free_meM(pt) { \
|
||||
if(pt != NULL) \
|
||||
free((char *) pt); \
|
||||
}
|
||||
|
||||
|
||||
#define SfileadrL 4096
|
||||
|
||||
|
||||
int Sfile_str(char target[SfileadrL], char *source, int flag);
|
||||
|
||||
double Sfile_microtime(int flag);
|
||||
|
||||
int Sfile_add_to_path(char path[SfileadrL], char *addon, int flag);
|
||||
|
||||
int Sfile_scale(double value, char *result, int siz, double thresh, int flag);
|
||||
|
||||
int Sfile_destroy_argv(int *argc, char ***argv, int flag);
|
||||
|
||||
/*
|
||||
bit0= do not ignore trailing slash
|
||||
bit1= do not ignore empty components (other than the empty root name)
|
||||
*/
|
||||
int Sfile_count_components(char *path, int flag);
|
||||
|
||||
/*
|
||||
@param flag
|
||||
bit0= return -1 if file is missing
|
||||
bit1= return a hardlink with siblings as type 5
|
||||
bit2= evaluate eventual link target rather than the link object itself
|
||||
bit3= return a socket or a char device as types 7 or 8 rather than 0
|
||||
@return
|
||||
0=unknown
|
||||
1=regular
|
||||
2=directory
|
||||
3=symbolic link
|
||||
4=named pipe
|
||||
5=multiple hardlink (with bit1)
|
||||
6=block device
|
||||
7=socket (with bit3)
|
||||
8=character device (with bit3)
|
||||
*/
|
||||
int Sfile_type(char *filename, int flag);
|
||||
|
||||
/* @param flag bit0= only encode inside quotes
|
||||
bit1= encode < 32 outside quotes except 7, 8, 9, 10, 12, 13
|
||||
bit2= encode in any case above 126
|
||||
bit3= encode in any case shellsafe:
|
||||
<=42 , 59, 60, 62, 63, 92, 94, 96, >=123
|
||||
*/
|
||||
int Sfile_bsl_encoder(char **result, char *text, size_t text_len, int flag);
|
||||
|
||||
int Sfile_argv_bsl(int argc, char ***argv, int flag);
|
||||
|
||||
/*
|
||||
bit0= read progname as first argument from line
|
||||
bit1= just release argument list argv and return
|
||||
bit2= abort with return(0) if incomplete quotes are found
|
||||
bit3= eventually prepend missing '-' to first argument read from line
|
||||
bit4= like bit2 but only check quote completeness, do not allocate memory
|
||||
bit5+6= interpretation of backslashes:
|
||||
0= no interpretation, leave unchanged
|
||||
1= only inside double quotes
|
||||
2= outside single quotes
|
||||
3= everywhere
|
||||
bit7= append a NULL element to argv
|
||||
*/
|
||||
int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv,
|
||||
int flag);
|
||||
|
||||
/* YYMMDD[.hhmm[ss]] */
|
||||
int Sfile_decode_datestr(struct tm *reply, char *text, int flag);
|
||||
|
||||
int Sfile_off_t_text(char text[80], off_t num, int flag);
|
||||
|
||||
int Sfile_leafname(char *path, char leafname[SfileadrL], int flag);
|
||||
|
||||
/* @param flag bit0= do not clip of carriage return at line end
|
||||
*/
|
||||
char *Sfile_fgets_n(char *line, int maxl, FILE *fp, int flag);
|
||||
|
||||
/*
|
||||
bit0=with hours+minutes
|
||||
bit1=with seconds
|
||||
|
||||
bit8= local time rather than UTC
|
||||
*/
|
||||
char *Sfile_datestr(time_t tim, short int flag);
|
||||
|
||||
/* Converts backslash codes into single characters:
|
||||
\a BEL 7 , \b BS 8 , \e ESC 27 , \f FF 12 , \n LF 10 , \r CR 13 ,
|
||||
\t HT 9 , \v VT 11 , \\ \ 92
|
||||
\[0-9][0-9][0-9] octal code , \x[0-9a-f][0-9a-f] hex code ,
|
||||
\cX control-x (ascii(X)-64)
|
||||
@param upto maximum number of characters to examine for backslash.
|
||||
The scope of a backslash (0 to 3 characters) is not affected.
|
||||
@param eaten returns the difference in length between input and output
|
||||
@param flag bit0= only determine *eaten, do not convert
|
||||
bit1= allow to convert \000 to binary 0
|
||||
*/
|
||||
int Sfile_bsl_interpreter(char *text, int upto, int *eaten, int flag);
|
||||
|
||||
int Sfile_prepend_path(char *prefix, char path[SfileadrL], int flag);
|
||||
|
||||
int Sfile_home_adr_s(char *filename, char *fileadr, int fa_size, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_sfile_includeD */
|
||||
|
722
libisoburn/branches/1.2.2/xorriso/sort_cmp.c
Normal file
722
libisoburn/branches/1.2.2/xorriso/sort_cmp.c
Normal file
@ -0,0 +1,722 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains functions which sort and compare tree nodes.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
#include "base_obj.h"
|
||||
#include "lib_mgt.h"
|
||||
#include "sort_cmp.h"
|
||||
#include "iso_tree.h"
|
||||
#include "iso_manip.h"
|
||||
|
||||
|
||||
int Xorriso__findi_sorted_ino_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
IsoNode *n1, *n2;
|
||||
|
||||
n1= *((IsoNode **) p1);
|
||||
n2= *((IsoNode **) p2);
|
||||
|
||||
ret= Xorriso__node_lba_cmp(&n1, &n2);
|
||||
if(ret)
|
||||
return (ret > 0 ? 1 : -1);
|
||||
ret= iso_node_cmp_ino(n1, n2, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* Not suitable for qsort() but for cross-array comparisons.
|
||||
p1 and p2 are actually IsoNode *p1, IsoNode *p2
|
||||
*/
|
||||
int Xorriso__hln_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= Xorriso__findi_sorted_ino_cmp(&p1, &p2);
|
||||
if(ret)
|
||||
return (ret > 0 ? 1 : -1);
|
||||
if(p1 != p2)
|
||||
return(p1 < p2 ? -1 : 1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
p1 and p2 are actually IsoNode **p1, IsoNode **p2
|
||||
*/
|
||||
int Xorriso__findi_sorted_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= Xorriso__findi_sorted_ino_cmp(p1, p2);
|
||||
if(ret)
|
||||
return (ret > 0 ? 1 : -1);
|
||||
if(p1 != p2)
|
||||
return(p1 < p2 ? -1 : 1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_sort_node_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
if(xorriso->node_counter <= 0)
|
||||
return(0);
|
||||
qsort(xorriso->node_array, xorriso->node_counter, sizeof(IsoNode *),
|
||||
Xorriso__findi_sorted_cmp);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__search_node(void *node_array[], int n,
|
||||
int (*cmp)(const void *p1, const void *p2),
|
||||
void *node, int *idx, int flag)
|
||||
{
|
||||
int ret, l, r, p, pos;
|
||||
|
||||
if(n == 0)
|
||||
return(0);
|
||||
l= 0;
|
||||
r= n + 1;
|
||||
while(1) {
|
||||
p= (r - l) / 2;
|
||||
if(p == 0)
|
||||
break;
|
||||
p+= l;
|
||||
|
||||
/* NULL elements may indicate invalid nodes. Their first valid right neigbor
|
||||
will serve as proxy. If none exists, then the test pushes leftwards.
|
||||
*/
|
||||
for(pos= p - 1; pos < n; pos++)
|
||||
if(node_array[pos] != NULL)
|
||||
break;
|
||||
if(pos < n)
|
||||
ret= (*cmp)(&(node_array[pos]), &node);
|
||||
else
|
||||
ret= 1;
|
||||
|
||||
if(ret < 0)
|
||||
l= p;
|
||||
else if(ret > 0)
|
||||
r= p;
|
||||
else {
|
||||
*idx= pos;
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_search_in_hln_array(struct XorrisO *xorriso,
|
||||
void *node, int *idx, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if(xorriso->hln_array == NULL || xorriso->hln_count <= 0)
|
||||
return(0);
|
||||
ret= Xorriso__search_node(xorriso->hln_array, xorriso->hln_count,
|
||||
Xorriso__findi_sorted_ino_cmp, node, idx, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__get_di(IsoNode *node, dev_t *dev, ino_t *ino, int flag)
|
||||
{
|
||||
int ret, i, i_end, imgid, error_code;
|
||||
size_t value_length= 0;
|
||||
char *value= NULL, *msg= NULL, severity[80];
|
||||
unsigned char *vpt;
|
||||
static char *name= "isofs.di";
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
Xorriso_get_di_counteR++;
|
||||
#endif /* NIX */
|
||||
|
||||
msg= TSOB_FELD(char, ISO_MSGS_MESSAGE_LEN);
|
||||
if(msg == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
*dev= 0;
|
||||
*ino= 0;
|
||||
ret= iso_node_lookup_attr(node, name, &value_length, &value, 0);
|
||||
if(ret <= 0) {
|
||||
/* Drop any pending messages because there is no xorriso to take them */
|
||||
iso_obtain_msgs("NEVER", &error_code, &imgid, msg, severity);
|
||||
goto ex;
|
||||
}
|
||||
vpt= (unsigned char *) value;
|
||||
for(i= 1; i <= vpt[0] && i < (int) value_length; i++)
|
||||
*dev= ((*dev) << 8) | vpt[i];
|
||||
i_end= i + vpt[i] + 1;
|
||||
for(i++; i < i_end && i < (int) value_length; i++)
|
||||
*ino= ((*ino) << 8) | vpt[i];
|
||||
free(value);
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(msg != NULL)
|
||||
free(msg);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__di_ino_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
IsoNode *n1, *n2;
|
||||
dev_t d1, d2;
|
||||
ino_t i1, i2;
|
||||
|
||||
n1= *((IsoNode **) p1);
|
||||
n2= *((IsoNode **) p2);
|
||||
|
||||
ret= Xorriso__get_di(n1, &d1, &i1, 0);
|
||||
if(ret <= 0)
|
||||
{d1= 0; i1= 0;}
|
||||
ret= Xorriso__get_di(n2, &d2, &i2, 0);
|
||||
if(ret <= 0)
|
||||
{d2= 0; i2= 0;}
|
||||
|
||||
if(d1 < d2)
|
||||
return(-1);
|
||||
if(d1 > d2)
|
||||
return(1);
|
||||
if(i1 < i2)
|
||||
return(-1);
|
||||
if(i1 > i2)
|
||||
return(1);
|
||||
if(d1 == 0 && i1 == 0 && n1 != n2)
|
||||
return(n1 < n2 ? -1 : 1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__di_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
IsoNode *n1, *n2;
|
||||
|
||||
ret= Xorriso__di_ino_cmp(p1, p2);
|
||||
if(ret)
|
||||
return(ret);
|
||||
n1= *((IsoNode **) p1);
|
||||
n2= *((IsoNode **) p2);
|
||||
if(n1 != n2)
|
||||
return(n1 < n2 ? -1 : 1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__sort_di(void *node_array[], int count, int flag)
|
||||
{
|
||||
if(count <= 0)
|
||||
return(0);
|
||||
qsort(node_array, count, sizeof(IsoNode *), Xorriso__di_cmp);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_invalidate_di_item(struct XorrisO *xorriso, IsoNode *node,
|
||||
int flag)
|
||||
{
|
||||
int ret, idx;
|
||||
|
||||
if(xorriso->di_array == NULL)
|
||||
return(1);
|
||||
ret= Xorriso__search_node(xorriso->di_array, xorriso->di_count,
|
||||
Xorriso__di_cmp, node, &idx, 0);
|
||||
if(ret <= 0)
|
||||
return(ret == 0);
|
||||
if(xorriso->di_array[idx] != NULL)
|
||||
iso_node_unref(xorriso->di_array[idx]);
|
||||
xorriso->di_array[idx]= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= return 1 even if matching nodes were found but node is
|
||||
not among them
|
||||
bit1= use Xorriso__di_cmp() rather than Xorriso__di_ino_cmp()
|
||||
*/
|
||||
int Xorriso_search_di_range(struct XorrisO *xorriso, IsoNode *node,
|
||||
int *idx, int *low, int *high, int flag)
|
||||
{
|
||||
int ret, i, found;
|
||||
int (*cmp)(const void *p1, const void *p2)= Xorriso__di_ino_cmp;
|
||||
|
||||
if(flag & 2)
|
||||
cmp= Xorriso__di_cmp;
|
||||
|
||||
*high= *low= *idx= -1;
|
||||
ret= Xorriso__search_node(xorriso->di_array, xorriso->di_count,
|
||||
cmp, node, &found, 0);
|
||||
if(ret <= 0)
|
||||
return(0);
|
||||
*low= *high= found;
|
||||
for(i= found + 1; i < xorriso->di_count; i++)
|
||||
if(xorriso->di_array[i] != NULL) {
|
||||
if((*cmp)(&node, &(xorriso->di_array[i])) != 0)
|
||||
break;
|
||||
*high= i;
|
||||
}
|
||||
for(i= found - 1; i >= 0; i--)
|
||||
if(xorriso->di_array[i] != NULL) {
|
||||
if((*cmp)(&node, &(xorriso->di_array[i])) != 0)
|
||||
break;
|
||||
*low= i;
|
||||
}
|
||||
for(i= *low; i <= *high; i++)
|
||||
if(xorriso->di_array[i] == node) {
|
||||
*idx= i;
|
||||
break;
|
||||
}
|
||||
return(*idx >= 0 || (flag & 1));
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__node_lba_cmp(const void *node1, const void *node2)
|
||||
{
|
||||
int ret;
|
||||
int lba1= 0, lba2= 0;
|
||||
|
||||
ret= Xorriso__file_start_lba(*((IsoNode **) node1), &lba1, 0);
|
||||
if(ret!=1)
|
||||
lba1= 0;
|
||||
ret= Xorriso__file_start_lba(*((IsoNode **) node2), &lba2, 0);
|
||||
if(ret!=1)
|
||||
lba2= 0;
|
||||
return(lba1-lba2);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__node_name_cmp(const void *node1, const void *node2)
|
||||
{
|
||||
char *name1, *name2;
|
||||
|
||||
name1= (char *) iso_node_get_name(*((IsoNode **) node1));
|
||||
name2= (char *) iso_node_get_name(*((IsoNode **) node2));
|
||||
return(strcmp(name1,name2));
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= only accept directory nodes
|
||||
bit1= do not report memory usage as DEBUG
|
||||
bit2= do not apply search pattern but accept any node
|
||||
*/
|
||||
int Xorriso_sorted_node_array(struct XorrisO *xorriso,
|
||||
IsoDir *dir_node,
|
||||
int *nodec, IsoNode ***node_array,
|
||||
off_t boss_mem, int flag)
|
||||
{
|
||||
int i, ret, failed_at;
|
||||
char *npt;
|
||||
IsoDirIter *iter= NULL;
|
||||
IsoNode *node;
|
||||
off_t mem;
|
||||
|
||||
mem= ((*nodec)+1)*sizeof(IsoNode *);
|
||||
ret= Xorriso_check_temp_mem_limit(xorriso, mem+boss_mem, flag&2);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
|
||||
*node_array= calloc(sizeof(IsoNode *), (*nodec)+1);
|
||||
if(*node_array==NULL) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot allocate memory for %d directory entries", *nodec);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
ret= iso_dir_get_children(dir_node, &iter);
|
||||
if(ret<0) {
|
||||
Xorriso_cannot_create_iter(xorriso, ret, 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
for(i= 0; iso_dir_iter_next(iter, &node) == 1 && i<*nodec; ) {
|
||||
npt= (char *) iso_node_get_name(node);
|
||||
if(!(flag&4)) {
|
||||
ret= Xorriso_regexec(xorriso, npt, &failed_at, 0);
|
||||
if(ret)
|
||||
continue; /* no match */
|
||||
}
|
||||
if(flag&1)
|
||||
if(!LIBISO_ISDIR(node))
|
||||
continue;
|
||||
(*node_array)[i++]= node;
|
||||
}
|
||||
iso_dir_iter_free(iter);
|
||||
*nodec= i;
|
||||
if(*nodec<=0)
|
||||
return(1);
|
||||
qsort(*node_array, *nodec, sizeof(IsoNode *), Xorriso__node_name_cmp);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_remake_hln_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, addon_nodes= 0, i, old_count, old_pt, new_pt;
|
||||
IsoNode **old_nodes;
|
||||
char **old_targets;
|
||||
|
||||
/* Count hln_targets of which the node has been deleted meanwhile */
|
||||
for(i= 0; i < xorriso->hln_count; i++) {
|
||||
if(xorriso->hln_targets[i] == NULL)
|
||||
continue;
|
||||
if(Xorriso_node_is_valid(xorriso, xorriso->hln_array[i], 0))
|
||||
continue;
|
||||
addon_nodes++;
|
||||
}
|
||||
ret= Xorriso_all_node_array(xorriso, addon_nodes, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
if(addon_nodes > 0) {
|
||||
/* Transfer delete nodes with hln_target to node array */
|
||||
for(i= 0; i < xorriso->hln_count; i++) {
|
||||
if(xorriso->hln_targets[i] == NULL)
|
||||
continue;
|
||||
if(Xorriso_node_is_valid(xorriso, xorriso->hln_array[i], 0))
|
||||
continue;
|
||||
if(xorriso->node_counter < xorriso->node_array_size) {
|
||||
xorriso->node_array[xorriso->node_counter++]= xorriso->hln_array[i];
|
||||
iso_node_ref(xorriso->node_array[xorriso->node_counter - 1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Xorriso_sort_node_array(xorriso, 0);
|
||||
old_nodes= (IsoNode **) xorriso->hln_array;
|
||||
old_targets= (char **) xorriso->hln_targets;
|
||||
old_count= xorriso->hln_count;
|
||||
xorriso->hln_array= 0;
|
||||
xorriso->hln_targets= NULL;
|
||||
|
||||
/* Transfer node_array to di_array without unrefering nodes */
|
||||
xorriso->hln_count= xorriso->node_counter;
|
||||
xorriso->hln_array= xorriso->node_array;
|
||||
xorriso->node_counter= 0;
|
||||
xorriso->node_array_size= 0;
|
||||
xorriso->node_array= NULL;
|
||||
|
||||
/* Allocate hln_targets */
|
||||
ret= Xorriso_new_hln_array(xorriso, xorriso->temp_mem_limit, 1);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
xorriso->node_targets_availmem= xorriso->temp_mem_limit;
|
||||
if(old_targets != NULL) {
|
||||
/* Transfer targets from old target array */;
|
||||
new_pt= old_pt= 0;
|
||||
while(new_pt < xorriso->hln_count && old_pt < old_count) {
|
||||
ret= Xorriso__hln_cmp(xorriso->hln_array[new_pt], old_nodes[old_pt]);
|
||||
if(ret < 0) {
|
||||
new_pt++;
|
||||
} else if(ret > 0) {
|
||||
old_pt++;
|
||||
} else {
|
||||
xorriso->hln_targets[new_pt]= old_targets[old_pt];
|
||||
if(old_targets[old_pt] != NULL)
|
||||
xorriso->temp_mem_limit-= strlen(old_targets[old_pt]) + 1;
|
||||
old_targets[old_pt]= NULL;
|
||||
new_pt++;
|
||||
old_pt++;
|
||||
}
|
||||
}
|
||||
for(old_pt= 0; old_pt < old_count; old_pt++)
|
||||
if(old_targets[old_pt] != NULL) /* (should not happen) */
|
||||
free(old_targets[old_pt]);
|
||||
free((char *) old_targets);
|
||||
}
|
||||
if(old_nodes != NULL) {
|
||||
for(old_pt= 0; old_pt < old_count; old_pt++)
|
||||
if(old_nodes[old_pt] != NULL)
|
||||
iso_node_unref(old_nodes[old_pt]);
|
||||
free((char *) old_nodes);
|
||||
}
|
||||
xorriso->hln_change_pending= 0;
|
||||
ret= 1;
|
||||
ex:;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= overwrite existing hln_array (else return 2)
|
||||
*/
|
||||
int Xorriso_make_hln_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if(xorriso->hln_array != NULL && !(flag & 1)) {
|
||||
/* If no fresh image manipulations occured: keep old array */
|
||||
if(!xorriso->hln_change_pending)
|
||||
return(2);
|
||||
ret= Xorriso_remake_hln_array(xorriso, 0);
|
||||
return(ret);
|
||||
}
|
||||
Xorriso_destroy_hln_array(xorriso, 0);
|
||||
|
||||
ret= Xorriso_all_node_array(xorriso, 0, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
Xorriso_sort_node_array(xorriso, 0);
|
||||
|
||||
/* Transfer node_array to di_array without unrefering nodes */
|
||||
xorriso->hln_count= xorriso->node_counter;
|
||||
xorriso->hln_array= xorriso->node_array;
|
||||
xorriso->node_counter= 0;
|
||||
xorriso->node_array_size= 0;
|
||||
xorriso->node_array= NULL;
|
||||
|
||||
/* Allocate hln_targets */
|
||||
ret= Xorriso_new_hln_array(xorriso, xorriso->temp_mem_limit, 1);
|
||||
if(ret<=0) {
|
||||
Xorriso_destroy_hln_array(xorriso, 0);
|
||||
goto ex;
|
||||
}
|
||||
xorriso->node_targets_availmem= xorriso->temp_mem_limit;
|
||||
xorriso->hln_change_pending= 0;
|
||||
ret= 1;
|
||||
ex:;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= overwrite existing di_array (else return 2)
|
||||
bit1= make di_array despite xorriso->ino_behavior bit 3
|
||||
*/
|
||||
int Xorriso_make_di_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, bytes;
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
unsigned long old_gdic;
|
||||
old_gdic= Xorriso_get_di_counteR;
|
||||
#endif /* NIX */
|
||||
|
||||
if((xorriso->ino_behavior & 8 ) && !(flag & 2))
|
||||
return(2);
|
||||
if(xorriso->di_array != NULL && !(flag & 1))
|
||||
return(2);
|
||||
Xorriso_finish_hl_update(xorriso, 0);
|
||||
|
||||
ret= Xorriso_all_node_array(xorriso, 0, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
bytes= xorriso->node_array_size / 8 + 1;
|
||||
xorriso->di_do_widen= calloc(bytes, 1);
|
||||
if(xorriso->di_do_widen == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
ret= -1; goto ex;
|
||||
}
|
||||
|
||||
/* Transfer node_array to di_array without unrefering nodes */
|
||||
xorriso->di_count= xorriso->node_counter;
|
||||
xorriso->di_array= xorriso->node_array;
|
||||
xorriso->node_counter= 0;
|
||||
xorriso->node_array_size= 0;
|
||||
xorriso->node_array= NULL;
|
||||
|
||||
Xorriso__sort_di((void *) xorriso->di_array, xorriso->di_count, 0);
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
fprintf(stderr, "xorriso_DEBUG: sort_count= %lu\n",
|
||||
Xorriso_get_di_counteR - old_gdic);
|
||||
#endif /* NIX */
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@param flag bit0= iso_rr_path is freshly added and up to date
|
||||
bit1= do not mark as changed content (implied by bit0 too)
|
||||
bit2= -follow: this is not a command parameter
|
||||
@return -1= severe error
|
||||
0= not applicable for hard links
|
||||
1= go on with processing
|
||||
2= iso_rr_path is fully updated
|
||||
*/
|
||||
int Xorriso_hardlink_update(struct XorrisO *xorriso, int *compare_result,
|
||||
char *disk_path, char *iso_rr_path, int flag)
|
||||
{
|
||||
int ret, hret, idx, low, high, i, do_overwrite= 0, did_fake_di= 0;
|
||||
int follow_links, old_idx= -1;
|
||||
IsoNode *node;
|
||||
struct stat stbuf;
|
||||
dev_t old_dev;
|
||||
ino_t old_ino;
|
||||
|
||||
if(xorriso->di_array == NULL)
|
||||
return(1);
|
||||
follow_links= xorriso->do_follow_links ||
|
||||
(xorriso->do_follow_param && !(flag & 4));
|
||||
ret= Xorriso_node_from_path(xorriso, NULL, iso_rr_path, &node, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
if(LIBISO_ISDIR(node))
|
||||
return(1);
|
||||
|
||||
/* Handle eventual hardlink split : */
|
||||
/* This is achieved by setting the content change bit. Reason:
|
||||
The node needs to be removed from di_array because its di is
|
||||
not matching its array index any more. So it becomes invisible for
|
||||
the join check of eventual later hardlink siblings. Therefore
|
||||
it must be updated now, even if it has currently no siblings
|
||||
which it leaves or which it joins.
|
||||
*/
|
||||
if(!(flag & (1 | 2)))
|
||||
do_overwrite= 1;
|
||||
|
||||
Xorriso__get_di(node, &old_dev, &old_ino, 0);
|
||||
ret= Xorriso__search_node(xorriso->di_array, xorriso->di_count,
|
||||
Xorriso__di_cmp, node, &idx, 0);
|
||||
if(ret < 0)
|
||||
{ret= 0; goto ex;}
|
||||
if(ret > 0)
|
||||
old_idx= idx;
|
||||
|
||||
/* Handle eventual hardlink joining : */
|
||||
|
||||
if(follow_links)
|
||||
ret= stat(disk_path, &stbuf);
|
||||
else
|
||||
ret= lstat(disk_path, &stbuf);
|
||||
if(ret==-1)
|
||||
{ret= 0; goto ex;}
|
||||
|
||||
/* Are there new dev-ino-siblings in the image ? */
|
||||
/* Fake isofs.di */
|
||||
if(!(flag & 1)) {
|
||||
ret= Xorriso_record_dev_inode(xorriso, disk_path, stbuf.st_dev,
|
||||
stbuf.st_ino, node, iso_rr_path, 1);
|
||||
if(ret <= 0)
|
||||
{ret= -1; goto ex;}
|
||||
did_fake_di= 1;
|
||||
/* temporarily remove node from di_array so it does not disturb
|
||||
search by its fake di info */;
|
||||
if(old_idx >= 0)
|
||||
xorriso->di_array[old_idx]= NULL;
|
||||
}
|
||||
ret= Xorriso_search_di_range(xorriso, node, &idx, &low, &high, 1);
|
||||
if(did_fake_di) {
|
||||
/* Revoke fake of isofs.di */
|
||||
hret= Xorriso_record_dev_inode(xorriso, disk_path, old_dev, old_ino,
|
||||
node, iso_rr_path, 1);
|
||||
if(hret <= 0)
|
||||
{ret= -1; goto ex;}
|
||||
if(old_idx >= 0)
|
||||
xorriso->di_array[old_idx]= node;
|
||||
}
|
||||
if(ret == 0)
|
||||
{ret= 1; goto ex;}
|
||||
if(ret < 0)
|
||||
{ret= 0; goto ex;}
|
||||
|
||||
|
||||
#ifdef Xorriso_hardlink_update_debuG
|
||||
/* <<< */
|
||||
if(low < high || idx < 0) {
|
||||
fprintf(stderr,
|
||||
"xorriso_DEBUG: old_idx= %d , low= %d , high= %d , iso= '%s' , disk='%s'\n",
|
||||
old_idx, low, high, iso_rr_path, disk_path);
|
||||
fprintf(stderr,
|
||||
"xorriso_DEBUG: old_dev= %lu , old_ino= %lu , dev= %lu , ino= %lu\n",
|
||||
(unsigned long) old_dev, (unsigned long) old_ino,
|
||||
(unsigned long) stbuf.st_dev, (unsigned long) stbuf.st_ino);
|
||||
|
||||
if(idx >= 0 && idx != old_idx)
|
||||
fprintf(stderr, "xorriso_DEBUG: idx= %d , old_idx = %d\n", idx, old_idx);
|
||||
}
|
||||
#endif /* Xorriso_hardlink_update_debuG */
|
||||
|
||||
/* Overwrite all valid siblings : */
|
||||
for(i= low; i <= high; i++) {
|
||||
if(i == idx || xorriso->di_array[i] == NULL)
|
||||
continue;
|
||||
|
||||
#ifdef Xorriso_hardlink_update_debuG
|
||||
/* <<< */
|
||||
{
|
||||
ino_t ino;
|
||||
dev_t dev;
|
||||
|
||||
Xorriso__get_di(xorriso->di_array[i], &dev, &ino, 0);
|
||||
fprintf(stderr, "xorriso_DEBUG: iso_sibling= '%s' , dev= %lu , ino= %lu\n",
|
||||
node_path, (unsigned long) dev, (unsigned long) ino);
|
||||
}
|
||||
#endif /* Xorriso_hardlink_update_debuG */
|
||||
|
||||
xorriso->di_do_widen[i / 8]|= 1 << (i % 8);
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(do_overwrite)
|
||||
*compare_result|= (1<<15);
|
||||
if(old_idx >= 0 && (*compare_result & (3 << 21))) {
|
||||
/* The old di info is obsolete */
|
||||
if(xorriso->di_array[old_idx] != NULL)
|
||||
iso_node_unref(xorriso->di_array[old_idx]);
|
||||
xorriso->di_array[old_idx]= NULL;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not destroy di_array
|
||||
*/
|
||||
int Xorriso_finish_hl_update(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, zero= 0;
|
||||
char *argv[4];
|
||||
struct Xorriso_lsT *disk_lst, *iso_lst;
|
||||
|
||||
if(xorriso->di_array == NULL)
|
||||
{ret= 1; goto ex;}
|
||||
disk_lst= xorriso->di_disk_paths;
|
||||
iso_lst= xorriso->di_iso_paths;
|
||||
while(disk_lst != NULL && iso_lst != NULL) {
|
||||
argv[0]= Xorriso_lst_get_text(iso_lst, 0);
|
||||
argv[1]= "-exec";
|
||||
argv[2]= "widen_hardlinks";
|
||||
argv[3]= Xorriso_lst_get_text(disk_lst, 0);
|
||||
zero= 0;
|
||||
ret= Xorriso_option_find(xorriso, 4, argv, &zero, 0); /* -findi */
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
disk_lst= Xorriso_lst_get_next(disk_lst, 0);
|
||||
iso_lst= Xorriso_lst_get_next(iso_lst, 0);
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(!(flag & 1))
|
||||
Xorriso_destroy_di_array(xorriso, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
62
libisoburn/branches/1.2.2/xorriso/sort_cmp.h
Normal file
62
libisoburn/branches/1.2.2/xorriso/sort_cmp.h
Normal file
@ -0,0 +1,62 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which sort and compare
|
||||
tree nodes.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_sort_cmp_includeD
|
||||
#define Xorriso_pvt_sort_cmp_includeD yes
|
||||
|
||||
|
||||
int Xorriso__findi_sorted_ino_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__hln_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__findi_sorted_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__search_node(void *node_array[], int n,
|
||||
int (*cmp)(const void *p1, const void *p2),
|
||||
void *node, int *idx, int flag);
|
||||
|
||||
int Xorriso_search_in_hln_array(struct XorrisO *xorriso,
|
||||
void *node, int *idx, int flag);
|
||||
|
||||
int Xorriso__get_di(IsoNode *node, dev_t *dev, ino_t *ino, int flag);
|
||||
|
||||
int Xorriso__di_ino_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__di_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__sort_di(void *node_array[], int count, int flag);
|
||||
|
||||
int Xorriso_invalidate_di_item(struct XorrisO *xorriso, IsoNode *node,
|
||||
int flag);
|
||||
|
||||
int Xorriso_search_di_range(struct XorrisO *xorriso, IsoNode *node,
|
||||
int *idx, int *low, int *high, int flag);
|
||||
|
||||
int Xorriso__node_lba_cmp(const void *node1, const void *node2);
|
||||
|
||||
int Xorriso__node_name_cmp(const void *node1, const void *node2);
|
||||
|
||||
int Xorriso_sorted_node_array(struct XorrisO *xorriso,
|
||||
IsoDir *dir_node,
|
||||
int *nodec, IsoNode ***node_array,
|
||||
off_t boss_mem, int flag);
|
||||
|
||||
int Xorriso_remake_hln_array(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_make_di_array(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_search_hardlinks(struct XorrisO *xorriso, IsoNode *node,
|
||||
int *node_idx, int *min_hl, int *max_hl, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_sort_cmp_includeD */
|
||||
|
2203
libisoburn/branches/1.2.2/xorriso/text_io.c
Normal file
2203
libisoburn/branches/1.2.2/xorriso/text_io.c
Normal file
File diff suppressed because it is too large
Load Diff
90
libisoburn/branches/1.2.2/xorriso/text_io.h
Normal file
90
libisoburn/branches/1.2.2/xorriso/text_io.h
Normal file
@ -0,0 +1,90 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of text i/o functions.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_textio_includeD
|
||||
#define Xorriso_pvt_textio_includeD yes
|
||||
|
||||
|
||||
int Xorriso_dialog_input(struct XorrisO *xorriso, char line[], int linesize,
|
||||
int flag);
|
||||
|
||||
/** @return -1= abort , 0= no , 1= yes
|
||||
*/
|
||||
int Xorriso_reassure(struct XorrisO *xorriso, char *cmd, char *which_will,
|
||||
int flag);
|
||||
|
||||
int Xorriso_request_confirmation(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* @param flag bit0= quoted multiline mode
|
||||
bit1= release allocated memory and return 1
|
||||
bit2= with bit0: warn of empty text arguments
|
||||
bit3= deliver as single quoted text including all whitespace
|
||||
and without any backslash interpretation
|
||||
@return -1=out of memory , 0=line format error , 1=ok, go on , 2=done
|
||||
*/
|
||||
int Xorriso_read_lines(struct XorrisO *xorriso, FILE *fp, int *linecount,
|
||||
int *argc, char ***argv, int flag);
|
||||
|
||||
int Xorriso_write_to_channel(struct XorrisO *xorriso,
|
||||
char *in_text, int channel_no, int flag);
|
||||
|
||||
int Xorriso_result(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_restxt(struct XorrisO *xorriso, char *text);
|
||||
|
||||
int Xorriso_info(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_mark(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
int Xorriso_write_session_log(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
int Xorriso_status_result(struct XorrisO *xorriso, char *filter, FILE *fp,
|
||||
int flag);
|
||||
|
||||
int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag);
|
||||
|
||||
int Xorriso_pacifier_reset(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* This call is to be issued by long running workers in short intervals.
|
||||
It will check whether enough time has elapsed since the last pacifier
|
||||
message and eventually issue an update message.
|
||||
@param what_done A sparse description of the action, preferrably in past
|
||||
tense. E.g. "done" , "files added".
|
||||
@param count The number of objects processed so far.
|
||||
Is ignored if <=0.
|
||||
@param todo The number of objects to be done in total.
|
||||
Is ignored if <=0.
|
||||
@param current_object A string telling the object currently processed.
|
||||
Ignored if "".
|
||||
@param flag bit0= report unconditionally, no time check
|
||||
*/
|
||||
int Xorriso_pacifier_callback(struct XorrisO *xorriso, char *what_done,
|
||||
off_t count, off_t todo, char *current_object,
|
||||
int flag);
|
||||
|
||||
int Xorriso_reset_counters(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_no_malloc_memory(struct XorrisO *xorriso, char **to_free,
|
||||
int flag);
|
||||
|
||||
int Xorriso_much_too_long(struct XorrisO *xorriso, int len, int flag);
|
||||
|
||||
int Xorriso_no_findjob(struct XorrisO *xorriso, char *cmd, int flag);
|
||||
|
||||
int Xorriso_report_md5_outcome(struct XorrisO *xorriso, char *severity,
|
||||
int flag);
|
||||
|
||||
int Xorriso_protect_stdout(struct XorrisO *xorriso, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_textio_includeD */
|
||||
|
2569
libisoburn/branches/1.2.2/xorriso/write_run.c
Normal file
2569
libisoburn/branches/1.2.2/xorriso/write_run.c
Normal file
File diff suppressed because it is too large
Load Diff
53
libisoburn/branches/1.2.2/xorriso/write_run.h
Normal file
53
libisoburn/branches/1.2.2/xorriso/write_run.h
Normal file
@ -0,0 +1,53 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which are needed to write
|
||||
sessions.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_write_run_includeD
|
||||
#define Xorriso_pvt_write_run_includeD yes
|
||||
|
||||
|
||||
/* CD specs say one shall not write tracks < 600 kiB */
|
||||
#define Xorriso_cd_min_track_sizE 300
|
||||
|
||||
|
||||
/* Default setting for -compliance */
|
||||
#define Xorriso_relax_compliance_defaulT \
|
||||
(isoburn_igopt_allow_deep_paths | isoburn_igopt_allow_longer_paths | \
|
||||
isoburn_igopt_always_gmt | isoburn_igopt_dir_rec_mtime | \
|
||||
isoburn_igopt_rrip_version_1_10 | isoburn_igopt_aaip_susp_1_10 | \
|
||||
isoburn_igopt_only_iso_versions | isoburn_igopt_no_j_force_dots)
|
||||
|
||||
|
||||
int Xorriso_make_write_options(
|
||||
struct XorrisO *xorriso, struct burn_drive *drive,
|
||||
struct burn_write_opts **burn_options, int flag);
|
||||
|
||||
int Xorriso_sanitize_image_size(struct XorrisO *xorriso,
|
||||
struct burn_drive *drive, struct burn_disc *disc,
|
||||
struct burn_write_opts *burn_options, int flag);
|
||||
|
||||
int Xorriso_auto_format(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_set_system_area(struct XorrisO *xorriso, struct burn_drive *drive,
|
||||
IsoImage *img, struct isoburn_imgen_opts *sopts,
|
||||
int flag);
|
||||
|
||||
int Xorriso_check_burn_abort(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive,
|
||||
int flag);
|
||||
|
||||
int Xorriso_set_isolinux_options(struct XorrisO *xorriso,
|
||||
IsoImage *image, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_write_run_includeD */
|
||||
|
758
libisoburn/branches/1.2.2/xorriso/xorrecord.1
Normal file
758
libisoburn/branches/1.2.2/xorriso/xorrecord.1
Normal file
@ -0,0 +1,758 @@
|
||||
.\" Hey, EMACS: -*- nroff -*-
|
||||
.\"
|
||||
.\" IMPORTANT NOTE:
|
||||
.\"
|
||||
.\" The original of this file is kept in xorriso/xorrecord.texi
|
||||
.\" This here was generated by program xorriso/make_xorriso_1
|
||||
.\"
|
||||
.\"
|
||||
.\" First parameter, NAME, should be all caps
|
||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||
.\" other parameters are allowed: see man(7), man(1)
|
||||
.TH XORRECORD 1 "Version 1.2.1, Jan 27, 2012"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
.\" .nh disable hyphenation
|
||||
.\" .hy enable hyphenation
|
||||
.\" .ad l left justify
|
||||
.\" .ad b justify to both left and right margins
|
||||
.\" .nf disable filling
|
||||
.\" .fi enable filling
|
||||
.\" .br insert line break
|
||||
.\" .sp <n> insert n+1 empty lines
|
||||
.\" for manpage-specific macros, see man(7)
|
||||
.nh
|
||||
.SH NAME
|
||||
xorrecord \- Emulation of CD/DVD/BD program cdrecord by program xorriso
|
||||
.SH SYNOPSIS
|
||||
.B xorrecord
|
||||
[ options ] dev=device [track_source]
|
||||
.br
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
\fBxorrecord\fR
|
||||
writes preformatted data to CD, DVD, and BD media.
|
||||
.br
|
||||
.PP
|
||||
It understands some options of program cdrecord from cdrtools by
|
||||
Joerg Schilling.
|
||||
Its implementation is part of program xorriso which shares no source
|
||||
code with cdrtools, but rather makes use of libburn for communicating
|
||||
with the drive.
|
||||
.br
|
||||
Another, more complete cdrecord emulator is program \fBcdrskin\fR
|
||||
which uses the same burn functions as \fBxorrecord\fR.
|
||||
.SS
|
||||
\fBMMC, Session, Track, Media types:\fR
|
||||
.br
|
||||
\fBMMC\fR
|
||||
is a standard out of the SCSI family which defines the interaction between
|
||||
computers and optical drives. Since more than a decade all CD, DVD, or BD
|
||||
recorders obey this standard regardless by what bus cabling they are
|
||||
attached to the computer. libburn relies on this standard compliance and
|
||||
on the capability of the operating system to perform SCSI transactions
|
||||
over the particular bus cabling.
|
||||
.br
|
||||
A \fBSession\fR is a data region on an optical disc which usually
|
||||
gets written in a single sweep. It contains at least one
|
||||
\fBTrack\fR which is a contiguous string of readable blocks.
|
||||
\fBxorrecord\fR produces a single session with a single data track
|
||||
which consists of blocks with 2048 bytes each. It chooses the write mode
|
||||
automatically according to media type, medium state, and option \-multi.
|
||||
.br
|
||||
On CD media there are other track types, like audio, and particular write
|
||||
modes like TAO and SAO. CD and DVD\- media can put more than one track into
|
||||
a session. Some of these features can be addressed by program \fBcdrskin\fR.
|
||||
.br
|
||||
MMC describes several recordable \fBmedia types\fR which roughly form two
|
||||
families.
|
||||
.br
|
||||
\fBSequentially recordable media\fR
|
||||
are CD\-R, CD\-RW, DVD\-R, DVD\-R DL, DVD\-RW, DVD+R, DVD+R DL, BD\-R.
|
||||
Except DVD\-R DL they can store more than one session if there is still
|
||||
unwritten space and if the previous session was written with option
|
||||
\fB\-multi\fR. CD\-RW and DVD\-RW can be blanked in order to be re\-usable
|
||||
from scratch.
|
||||
.br
|
||||
\fBOverwritable media\fR are DVD\-RAM, DVD+RW, formatted DVD\-RW, BD\-RE.
|
||||
They offer a single session with a single track for random access writing.
|
||||
There is no need to blank overwritable media before re\-use.
|
||||
.br
|
||||
DVD\-RW media are sold in sequentially recordable state but can be
|
||||
formatted once to become overwritable. See options
|
||||
\fBblank=format_overwrite\fR and \fBblank=deformat\fR.
|
||||
.br
|
||||
If ISO 9660 filesystems are to be stored on overwritable media, then it
|
||||
is possible to emulate multiple sessions, by using option
|
||||
\fB\-\-grow_overriteable_iso\fR. In this case, the need for
|
||||
blanking before re\-use is emulated too.
|
||||
.SS
|
||||
.B Drive preparation and addressing:
|
||||
.PP
|
||||
The drives, CD, DVD, or BD burners, are accessed via file addresses which
|
||||
are specific to libburn and the operating system. Those addresses get listed
|
||||
by a run of \fBxorrecord \-\-devices\fR or \fBxorriso \-device_links\fR.
|
||||
.br
|
||||
On GNU/Linux and FreeBSD, the user needs rw\-permission for the device file.
|
||||
On Solaris, the user needs r\-permission and privilege "sys_devices",
|
||||
which is usually gained by running \fBxorrecord\fR via command pfexec.
|
||||
.br
|
||||
These permissions resp. privileges are needed already for listing a drive.
|
||||
So it might be necessary to get the overview as superuser resp. via pfexec.
|
||||
.br
|
||||
\fBxorrecord\fR does not perform cdrecord option \-scanbus and does
|
||||
not accept the addresses of form Bus,Target,Lun which are told by \-scanbus.
|
||||
If support for these addresses is necessary, consider to use program cdrskin.
|
||||
.br
|
||||
It is possible to let \fBxorrecord\fR work on emulated drives.
|
||||
Their addresses begin by prefix "stdio:" followed by a file address.
|
||||
The emulated media behavior depends on the file type.
|
||||
See man xorriso for details.
|
||||
.br
|
||||
If standard output is chosen as emulated drive, then all program result
|
||||
texts, which usually appear on standard output, will get redirected to
|
||||
standard error.
|
||||
.SS
|
||||
\fBRelation to program xorriso:\fR
|
||||
.br
|
||||
\fBxorrecord\fR is actually a command mode of program \fBxorriso\fR,
|
||||
which gets entered either by xorriso command "\-as cdrecord" or by
|
||||
starting the program by one of the names "xorrecord", "cdrecord",
|
||||
"wodim", or "cdrskin".
|
||||
.br
|
||||
This command mode can be left by argument "\-\-" which leads
|
||||
to generic xorriso command mode. See \fBman xorriso\fR for its description.
|
||||
Other than in xorriso command mode, the sequence of the cdrecord emulation
|
||||
options does not matter.
|
||||
All pending actions get performed in a fixed sequence before the program
|
||||
run ends resp. before cdrecord emulation ends.
|
||||
.SS
|
||||
.br
|
||||
.SH OPTIONS
|
||||
.br
|
||||
.PP
|
||||
.TP
|
||||
.B Addressing the drive:
|
||||
.TP
|
||||
\fB--devices\fR
|
||||
Print the list of accessible CD, DVD, or BD drives to standard output.
|
||||
Drives might be inaccessible if the user lacks of permissions to use them
|
||||
or if the drive is in use by another program.
|
||||
.br
|
||||
Each accessible drive is shown by a line like:
|
||||
.br
|
||||
0 \-dev '/dev/sr0' rwrw\-\- : 'TSSTcorp' 'CDDVDW SH\-S203B'
|
||||
.br
|
||||
The libburn address of this drive is '/dev/sr0'. 'TSSTcorp' is the
|
||||
name of the vendor (in this case: Toshiba Samsung Storage Technologies
|
||||
Corporation), 'CDDVDW SH\-S203B' is the model name (in this case: a DVD burner).
|
||||
.br
|
||||
Afterwards end emulation without performing any further drive operation.
|
||||
.TP
|
||||
\fBdev=drive_address\fR
|
||||
Set the libburn address of the drive to be used.
|
||||
.br
|
||||
E.g. on GNU/Linux: dev=/dev/sr0
|
||||
.br
|
||||
E.g. on FreeBSD: dev=/dev/cd0
|
||||
.br
|
||||
E.g. on Solaris: dev=/dev/rdsk/c2t2d0s2
|
||||
.br
|
||||
See also above "Drive preparation and addressing".
|
||||
.br
|
||||
The medium in the drive should not be mounted or be otherwise in use.
|
||||
.br
|
||||
This option will only get into effect if a track source, a blank= option,
|
||||
or a drive inquiry option is given. Else it will lead to a SORRY event
|
||||
and normally cause a non\-zero exit value.
|
||||
.TP
|
||||
.B Inquiring drive and media:
|
||||
.TP
|
||||
\fB\-inq\fR
|
||||
Print to standard output: vendor, model name, and firmware revision
|
||||
of the drive.
|
||||
.TP
|
||||
\fB\-checkdrive\fR
|
||||
Print unconditionally that the drive supports burnfree, SAO, and TAO.
|
||||
Also print the output of option \-inq.
|
||||
.TP
|
||||
\fB\-atip\fR
|
||||
Print the output of \-checkdrive, the most capable profile of the medium
|
||||
in the drive, the list of profiles which are supported by the drive,
|
||||
whether it is erasable (i.e. can be blanked), the media manufacturer, and
|
||||
the medium product name.
|
||||
.br
|
||||
Profiles are usage models, which are often tied to a particular media type
|
||||
(e.g. CD\-RW), but may also apply to a family of media. E.g. profile CD\-ROM
|
||||
applies to all CD media which contain data.
|
||||
.TP
|
||||
\fB\-toc\fR
|
||||
Print a table of content of the medium in the drive. The output is not
|
||||
compatible to
|
||||
cdrecord option \-toc, but rather the one of \fBxorriso\fR command \-toc.
|
||||
It lists the address, vendor, model name, and firmware revision of the drive.
|
||||
.br
|
||||
About the medium it tells product name and manufacturer, whether there
|
||||
is already content written, and if so, whether the medium is closed or
|
||||
appendable. Appendable media can take another session.
|
||||
The amount of readable and writable data is told.
|
||||
If there are sessions, then their start block address and size is reported.
|
||||
If a session contains an ISO 9660 filesystem, then its Volume Id is reported.
|
||||
If the medium is writable, then the next writable block address is reported.
|
||||
.br
|
||||
If not option \fB\-\-grow_overriteable_iso\fR is given or no ISO 9660
|
||||
file system is present on the medium, then overwritable media are reported
|
||||
as being blank. This is due to the fact that they can be written from
|
||||
scratch without further preparation, and that MMC does not distinguish
|
||||
between data written by the most previous burn run and older data
|
||||
which have not been overwritten by that burn run.
|
||||
Consequently, these media are reported with 0 readable blocks, although
|
||||
all their writable blocks normally are readable, too.
|
||||
.TP
|
||||
\fB\-msinfo\fR
|
||||
Print the argument text for option \-C of programs mkisofs, genisoimage,
|
||||
or xorrisofs. It consists of two numbers separated by a comma.
|
||||
.br
|
||||
The first number tells the first block of the first track of the last recorded
|
||||
session. This is also the address used by default when operating systems
|
||||
mount a medium with e.g. ISO 9660 filesystem.
|
||||
.br
|
||||
The second number tells the next writable address, where \fBxorrecord\fR
|
||||
will begin to write the next session.
|
||||
.br
|
||||
This option is only valid for written, appendable media. In all other
|
||||
cases it will yield no output text but will abort the program
|
||||
with non\-zero exit value.
|
||||
.TP
|
||||
.B Settings for the burn run:
|
||||
.PP
|
||||
A burn run requires exactly one track source address argument, which
|
||||
tells from where to read the data wich shall be put into the upcomming
|
||||
session. The medium state must be either blank or appendable.
|
||||
.br
|
||||
Track source may be "\-" for standard input or the address of a readable
|
||||
file of any type except directories. Nearly all media types accept a track
|
||||
source with unpredictable byte count, like standard input or named pipes.
|
||||
Nevertheless, DVD\-R DL and DVD\-RW blanked by mode deformat_quickest
|
||||
demand exact in\-advance reservation of the track size, so that they either
|
||||
need to be read from a source of
|
||||
predictable length, or need to be accompanied by option \fBtsize=\fR or
|
||||
by option \fB\-isosize\fR.
|
||||
.br
|
||||
Several options expect a size value as argument. A number with a trailing
|
||||
letter "b" or without a trailing letter is a plain byte count. Other trailing
|
||||
letters cause multiplication of the given number by a scaling factor:
|
||||
.br
|
||||
"k" or "K" = 1024 , "m" or "M" = 1024k , "g" or "G" = 1024m , "s" or "S" = 2048
|
||||
.br
|
||||
E.g. tsize=234567s means a size of 234567 * 2048 = 480393216 bytes.
|
||||
.TP
|
||||
\fBblank=mode\fR
|
||||
Blank a CD\-RW or DVD\-RW to make it re\-usable from scratch.
|
||||
Format a DVD\-RW, DVD+RW, DVD\-RAM, BD\-R, or BD\-RE if not yet formatted.
|
||||
.br
|
||||
This operation normally makes any recorded data on the medium unreadable.
|
||||
It is combinable with burning in the same run of \fBxorrecord\fR,
|
||||
or it may be performed without a track source, leaving the medium empty.
|
||||
.br
|
||||
The mode given with blank= selects the particular behavior:
|
||||
.RS
|
||||
.TP
|
||||
.br
|
||||
as_needed
|
||||
.br
|
||||
Try to make the media ready for writing from scratch. If it needs formatting,
|
||||
then format it. If it is not blank, then try to apply blank=fast.
|
||||
It is a reason to abort if the medium cannot assume thoroughly writeable
|
||||
state, e.g. if it is a non\-blank write\-once.
|
||||
.br
|
||||
This leaves unformatted DVD\-RW in unformatted blank state. To format DVD\-RW use
|
||||
blank=format_overwrite. Blank unformatted BD\-R stay unformatted.
|
||||
.br
|
||||
(Note: blank=as_needed is not an original cdrecord option.)
|
||||
.TP
|
||||
.br
|
||||
all
|
||||
.br
|
||||
Blank an entire CD\-RW or an unformatted DVD\-RW.
|
||||
.TP
|
||||
.br
|
||||
fast
|
||||
.br
|
||||
Minimally blank an entire CD\-RW or blank an unformatted DVD\-RW.
|
||||
.TP
|
||||
.br
|
||||
deformat
|
||||
.br
|
||||
Like blank=all but with the additional ability to blank overwriteable DVD\-RW.
|
||||
This will destroy their formatting and make them sequentially recordable.
|
||||
.br
|
||||
(Note: blank=deformat is not an original cdrecord options)
|
||||
.TP
|
||||
.br
|
||||
deformat_quickest
|
||||
.br
|
||||
Like blank=deformat but blanking DVD\-RW only minimally.
|
||||
This is faster than full blanking but yields media incapable of
|
||||
writing tracks of unpredicatable size.
|
||||
Multi\-session will not be possible either.
|
||||
.br
|
||||
(Note: blank=deformat_quickest is not an original cdrecord option.)
|
||||
.TP
|
||||
.br
|
||||
format_overwrite
|
||||
.br
|
||||
Format a DVD\-RW to "Restricted Overwrite". The user should bring some patience.
|
||||
.br
|
||||
Format unformatted DVD+RW, BD\-RE or blank BD\-R to their default size.
|
||||
It is not mandatory to do this with DVD+RW and BD\-RE media, because they
|
||||
will get formatted automatically on the first write attempt.
|
||||
.br
|
||||
BD\-R media may be written in unformatted state. This keeps disabled the
|
||||
replacement of bad blocks and enables full nominal write speed. Once BD\-R
|
||||
media are written, they cannot be formatted any more.
|
||||
.br
|
||||
For re\-formatting already formatted media or for formatting with
|
||||
non\-default size, use program \fBxorriso\fR with command \fB\-format\fR.
|
||||
.br
|
||||
(Note: blank=format_overwrite is not an original cdrecord options)
|
||||
.TP
|
||||
.br
|
||||
help
|
||||
.br
|
||||
Print a short overview of blank modes to standard error output.
|
||||
.br
|
||||
Afterwards end emulation without performing any drive operation.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-multi\fR
|
||||
This option keeps CD, unformatted DVD\-R[W], DVD+R, or BD\-R appendable
|
||||
after the current session has been written.
|
||||
Without it the disc gets closed and may not be written any more \- unless it
|
||||
is a \-RW and gets blanked, which causes loss of its content.
|
||||
.br
|
||||
This option cannot be applied to DVD\-R DL and DVD\-RW which were blanked
|
||||
by type deformat_quickest.
|
||||
.br
|
||||
In order to have all filesystem content accessible, the eventual ISO\-9660
|
||||
filesystem of a follow\-up
|
||||
session needs to be prepared in a special way by the filesystem formatter
|
||||
program. mkisofs, genisoimage, and xorrisofs expect particular info about
|
||||
the situation which can be retrieved by \fBxorrecord\fR option \-msinfo.
|
||||
.br
|
||||
With overwriteable DVD or BD media, \-multi cannot mark the end of the session.
|
||||
So when adding a new session, this end has to be determined from the payload.
|
||||
Currently only ISO\-9660 filesystems can be used that way. See option
|
||||
\fB\-\-grow_overwriteable_iso\fR.
|
||||
.TP
|
||||
\fB\-dummy\fR
|
||||
Try to perform the drive operations without actually affecting the inserted
|
||||
media. There is no warranty that this will work with a particular combination
|
||||
of drive and media. Blanking is prevented reliably, though.
|
||||
To avoid inadverted real burning, \-dummy refuses burn runs on anything but
|
||||
CD\-R[W], DVD\-R[W], or emulated stdio\-drives.
|
||||
.TP
|
||||
\fB\-waiti\fR
|
||||
Wait until input data is available at stdin or EOF occurs at stdin.
|
||||
Only then begin to access any drives.
|
||||
.br
|
||||
One should use this if xorrisofs is working at the end of a pipe where the
|
||||
feeder process reads from the drive before it starts writing its output into
|
||||
xorrisofs. Example:
|
||||
.br
|
||||
xorrisofs ... \-C 0,12800 \-M /dev/sr0 ... | \\
|
||||
.br
|
||||
xorrecord dev=/dev/sr0 ... \-waiti \-
|
||||
.br
|
||||
This option works even if standard input is not the track source. If no process
|
||||
is piping in, then the Enter key of your terminal will act as trigger for
|
||||
\fBxorrecord\fR. Note that this input line will not be consumed by
|
||||
cdrskin if standard input is not the track source. It will end up as shell
|
||||
command, usually.
|
||||
.TP
|
||||
\fBtsize=size\fR
|
||||
Announce the exact size of the track source. This is necessary with
|
||||
DVD\-R DL media and with quickest blanked DVD\-RW, if the size cannot be
|
||||
determined in advance from the track source. E.g. if it is standard input
|
||||
or a named pipe.
|
||||
.br
|
||||
If the track source does not deliver the predicted amount of bytes, the
|
||||
remainder of the track is padded with zeros. This is not considered an error.
|
||||
If on the other hand the track source delivers more than the announced bytes
|
||||
then the track on media gets truncated to the predicted size and xorrecord
|
||||
exits with non\-zero value.
|
||||
.TP
|
||||
\fB\-isosize\fR
|
||||
Try to obtain the track size from the content of the track source.
|
||||
This works only if the track source bears an ISO 9660 filesystem.
|
||||
Any other track source content will cause the burn run to abort.
|
||||
.br
|
||||
If the track source is not a regular file or block device, then this option
|
||||
will work only if the program's fifo size is at least 64k. See option fs=.
|
||||
.TP
|
||||
\fBpadsize=size\fR
|
||||
Add the given amount of trailing zeros to the upcomming track.
|
||||
This feature can be disabled by size 0. Default is 300 kB in order to
|
||||
work around a problem with GNU/Linux which often fails to read the last few
|
||||
blocks of a CD track which was written in write mode TAO. TAO is used
|
||||
by \fBxorrecord\fR if the track size cannot be predicted or if the CD
|
||||
medium is not blank but appendable.
|
||||
.TP
|
||||
\fB\-nopad\fR
|
||||
The same as padsize=0.
|
||||
.TP
|
||||
\fB\-pad\fR
|
||||
The same as padsize=15s. This was once sufficient with older GNU/Linux
|
||||
kernels. Meanwhile one should at least use padsize=128k, if not padsize=300k.
|
||||
.TP
|
||||
\fB\-data\fR
|
||||
Explicitely announce that the track source shall be recorded as data track,
|
||||
and not as audio track. This option has no effect with \fBxorrecord\fR,
|
||||
because there is no support for other track formats anyway.
|
||||
.TP
|
||||
\fBfs=size\fR
|
||||
Set the size of the program fifo buffer to the given value
|
||||
rather than the default of 4m.
|
||||
.br
|
||||
The fifo buffers a temporary surplus of track source data in order to
|
||||
provide the drive with a steady stream during times of temporary lack of track
|
||||
source supply.
|
||||
.br
|
||||
Other than cdrecord, xorrecord enables drive buffer underrun protection by
|
||||
default and does not wait with writing until the fifo is full for a first
|
||||
time.
|
||||
On very old CD drives and slow computers, this might cause aborted burn runs.
|
||||
In this case, consider to use program \fBcdrskin\fR for CD burning.
|
||||
DVD and BD drives tolerate buffer underrun without problems.
|
||||
.br
|
||||
The larger the fifo, the longer periods of poor source supply can be
|
||||
compensated. But a large fifo can deprive the operating system of read cache
|
||||
for better filesystem performance.
|
||||
.TP
|
||||
\fBspeed=value\fR
|
||||
Set the write speed. Default is 0 = maximum speed.
|
||||
Speed can be given in media type dependent x\-speed numbers or as a
|
||||
desired throughput per second in MMC compliant kB (= 1000)
|
||||
or MB (= 1000 kB). Media x\-speed factor can be set explicity
|
||||
by appending "c" for CD, "d" for DVD, "b" for BD. "x" is optional.
|
||||
.br
|
||||
Example speeds:
|
||||
.br
|
||||
706k = 706kB/s = 4c = 4xCD
|
||||
.br
|
||||
5540k = 5540kB/s = 4d = 4xDVD
|
||||
.br
|
||||
If there is no hint about the speed unit attached, then the
|
||||
medium in the drive will decide.
|
||||
Default unit is CD, 1x = 176,400 raw bytes/second.
|
||||
With DVD, 1x = 1,385,000 bytes/second.
|
||||
With BD, 1x = 4,495,625 bytes/second.
|
||||
.br
|
||||
MMC drives usually activate their own idea of speed and take
|
||||
the speed value given by the burn program only as a hint
|
||||
for their own decision.
|
||||
.TP
|
||||
\fB\-eject\fR
|
||||
Eject the drive tray after alll other work is done.
|
||||
.TP
|
||||
.B Program version and verbosity:
|
||||
.TP
|
||||
\fB\-version\fR
|
||||
Print to standard output a line beginning by
|
||||
.br
|
||||
"Cdrecord 2.01\-Emulation Copyright"
|
||||
.br
|
||||
and further lines which report the version of xorriso and its
|
||||
supporting libraries. They also state the license under which the program
|
||||
is provided, and disclaim any warranty, to the extent permitted by law.
|
||||
.br
|
||||
Afterwards end emulation without performing any drive operation.
|
||||
.TP
|
||||
\fB\-v\fR
|
||||
Increase program verbosity by one level. There are four verbosity levels
|
||||
from nearly silent to debugging verbosity. The both highest levels can
|
||||
be enabled by repeated \-v or by \-vv resp. \-vvv.
|
||||
.TP
|
||||
\fB\-V\fR
|
||||
Log SCSI commands and drive replies to standard error.
|
||||
This might be of interest if \fBxorrecord\fR and a particular drive
|
||||
or medium do not cooperate as expected, or if you just want to know
|
||||
how libburn interacts with the drive.
|
||||
To understand this extremely verbous log, one needs to read SCSI
|
||||
specs SPC, SBC, and MMC.
|
||||
.br
|
||||
Please do not add such a log to a bug report on the first hand,
|
||||
unless you want to point out a particular deviation
|
||||
from said specs, or if you get asked for this log by a maintainer of
|
||||
\fBxorrecord\fR who feels in charge for your bug report.
|
||||
.TP
|
||||
\fB\-help\fR
|
||||
Print a sparse list of program options to standard error
|
||||
and declare not to be cdrecord.
|
||||
.br
|
||||
Afterwards end emulation without performing any drive operation.
|
||||
.TP
|
||||
.B Options not compatible to cdrecord:
|
||||
.TP
|
||||
\fB--no_rc\fR
|
||||
Only if used as first command line argument this option
|
||||
prevents reading and interpretation of startup files. See section FILES below.
|
||||
.TP
|
||||
\fB--grow_overwriteable_iso\fR
|
||||
Enable emulation of multi\-session writing on overwriteable media which
|
||||
contain an ISO 9660 filesystem. This emulation is learned from growisofs \-M
|
||||
but adapted to the usage model of
|
||||
.br
|
||||
xorrecord \-msinfo
|
||||
.br
|
||||
xorrisofs \-C \-M | xorrecord \-waiti \-multi \-
|
||||
.br
|
||||
for sequential media.
|
||||
.br
|
||||
\-\-grow_overwriteable_iso does not hamper the use of true multi\-session media.
|
||||
I.e. it is possible to use the same \fBxorrecord\fR options with both
|
||||
kinds of media
|
||||
and to achieve similar results if ISO 9660 filesystem images are to be written.
|
||||
This option implies option \-isosize and therefore demands that the track
|
||||
source is a ISO 9660 filesystem image.
|
||||
.br
|
||||
With overwriteable media and no option blank=fast|all present it expands an
|
||||
eventual ISO 9660 filesystem on media. It is assumed that this image's inner
|
||||
size description points to the end of the valuable data.
|
||||
Overwriteable media with a recognizable ISO 9660 size will be regarded as
|
||||
appendable rather than as blank. I.e. options \-msinfo and \-toc will work.
|
||||
\-toc will always show a single session with its size increasing with
|
||||
every added ISO 9660 image.
|
||||
.TP
|
||||
\fBstream_recording="on"|"off"|number\fR
|
||||
Mode "on" requests that compliance to the desired speed setting is
|
||||
preferred over management of write errors. With DVD\-RAM and BD this can
|
||||
bring effective write speed near to the nominal write speed of the media.
|
||||
But it will also disable the automatic use of replacement blocks
|
||||
if write errors occur. It might as well be disliked or ignored by the drive.
|
||||
.br
|
||||
If a number is given, then error management stays enabled for all byte
|
||||
addresses below that number. Any number below 16s is the same as "off".
|
||||
.TP
|
||||
\fBdvd_obs="default"|"32k"|"64k"\fR
|
||||
Linux specific:
|
||||
Set the number of bytes to be transmitted with each write operation to DVD
|
||||
or BD media. Tracks get padded up to the next multiple of this write
|
||||
size. A number of 64 KB may improve throughput with bus systems which
|
||||
show latency problems. The default depends on media type, option
|
||||
stream_recording=, and on compile time options.
|
||||
.TP
|
||||
\fBwrite_start_address=value\fR
|
||||
Set the block address on overwritable media where to start writing the track.
|
||||
With DVD+RW, DVD\-RAM or BD\-RE, byte_offset must be aligned to 2 kiB blocks,
|
||||
but better is 32 kiB on DVD and 64 kiB on BD.
|
||||
With formatted DVD\-RW 32 kiB alignment is mandatory.
|
||||
.br
|
||||
Other media are not suitable for this option.
|
||||
.TP
|
||||
\fBstdio_sync="on"|"off"|number\fR
|
||||
Set the number of bytes after which to force output to emulated stdio: drives.
|
||||
This forcing keeps the memory from being clogged with lots of
|
||||
pending data for slow devices. Default "on" is the same as "16m".
|
||||
Forced output can be disabled by "off".
|
||||
.SH EXAMPLES
|
||||
.SS
|
||||
.B Overview of examples:
|
||||
Get an overview of drives and their addresses
|
||||
.br
|
||||
Get info about a particular drive or loaded media
|
||||
.br
|
||||
Prepare CD-RW or DVD-RW for re-use, BD-R for bad block handling
|
||||
.br
|
||||
Format DVD-RW to avoid need for blanking before re-use
|
||||
.br
|
||||
De-format DVD-RW to make it capable of multi-session again
|
||||
.br
|
||||
Write a single ISO 9660 filesystem image
|
||||
.br
|
||||
Write multiple ISO 9660 sessions
|
||||
.br
|
||||
Write ISO 9660 session on-the-fly
|
||||
.br
|
||||
Write compressed afio archive on-the-fly
|
||||
.br
|
||||
.SS
|
||||
.B Get an overview of drives and their addresses:
|
||||
$ xorrecord \-\-devices
|
||||
.SS
|
||||
.B Get info about a particular drive and loaded media:
|
||||
$ xorrecord dev=/dev/sr0 \-atip \-toc \-\-grow_overwriteable_iso
|
||||
.SS
|
||||
.B Prepare CD-RW or DVD-RW for re-use:
|
||||
$ xorrecord \-v dev=/dev/sr0 blank=as_needed \-eject
|
||||
.SS
|
||||
.B Format DVD-RW to avoid need for blanking before re-use:
|
||||
$ xorrecord \-v dev=/dev/sr0 blank=format_overwrite \-eject
|
||||
.br
|
||||
This command may also be used to format BD\-R media before first use,
|
||||
in order to enable handling of write errors. Several hundred MB of spare
|
||||
blocks will be reserved and write runs on such media will perform
|
||||
with less than half nominal speed.
|
||||
.SS
|
||||
.B De-format DVD-RW to make it capable of multi-session again:
|
||||
$ xorrecord \-v dev=/dev/sr0 blank=deformat
|
||||
.SS
|
||||
.B Write a single ISO 9660 filesystem image:
|
||||
$ xorrecord \-v dev=/dev/sr0 speed=12 fs=8m \\
|
||||
blank=as_needed \-eject padsize=300k my_image.iso
|
||||
.SS
|
||||
.B Write multiple ISO 9660 sessions:
|
||||
This is possible with all media except minimally blanked DVD\-RW and DVD\-R DL,
|
||||
which cannot do multi\-session.
|
||||
.br
|
||||
The first session is written like in the previous example, except that
|
||||
option \-multi is used. It will contain the files of hard disk
|
||||
directory ./tree1 under the ISO 9660 directory /dir1:
|
||||
.br
|
||||
$ xorrisofs \-o image_1.iso \-J \-graft\-points /dir1=./tree1
|
||||
.br
|
||||
$ xorrecord \-v dev=/dev/sr0 speed=12 fs=8m \\
|
||||
.br
|
||||
\-multi \-\-grow_overwritable_iso \\
|
||||
.br
|
||||
blank=as_needed \-eject padsize=300k image_1.iso
|
||||
.br
|
||||
For the second session xorrisofs needs to know the \-msinfo numbers
|
||||
of the medium. Further it will read data from the medium by using the
|
||||
system's read\-only CD\-ROM driver.
|
||||
.br
|
||||
It is advised to load the tray manually
|
||||
or via dd by the CD\-ROM driver, rather than letting xorrecord do this
|
||||
by its own SCSI driver. Many system CD\-ROM drivers do not take notice
|
||||
of xorrecord's activities.
|
||||
.br
|
||||
$ dd if=/dev/sr0 count=1 >/dev/null 2>&1
|
||||
.br
|
||||
Now get the \-msinfo numbers:
|
||||
.br
|
||||
$ m=$(xorrecord dev=/dev/sr0 \-msinfo)
|
||||
.br
|
||||
and use them with xorrisofs to add ./tree2 to the image as /dir2:
|
||||
.br
|
||||
$ xorrisofs \-M /dev/sr0 \-C $m \-o image_2.iso \\
|
||||
.br
|
||||
\-J \-graft\-points /dir2=./tree2
|
||||
.br
|
||||
Now burn the new session onto the same medium. This time without blanking:
|
||||
.br
|
||||
$ xorrecord \-v dev=/dev/sr0 speed=12 fs=8m \\
|
||||
.br
|
||||
\-multi \-\-grow_overwritable_iso \\
|
||||
.br
|
||||
\-eject padsize=300k image_2.iso
|
||||
.br
|
||||
Operating systems which mount this medium will read the superblock
|
||||
of the second session and show both directories /dir1 and /dir2.
|
||||
.SS
|
||||
.B Write ISO 9660 session on-the-fly:
|
||||
It is possible to combine the run of \fBxorrisofs\fR and \fBxorrecord\fR
|
||||
in a pipeline without storing the ISO 9660 image as file on hard disk:
|
||||
.br
|
||||
$ xorrisofs \-M /dev/sr0 \-C $m \\
|
||||
.br
|
||||
\-J \-graft\-points /dir2=./tree2 \\
|
||||
.br
|
||||
| xorrecord \-v dev=/dev/sr0 speed=12 fs=8m \\
|
||||
.br
|
||||
\-waiti \-multi \-\-grow_overwritable_iso \\
|
||||
.br
|
||||
\-eject padsize=300k \-
|
||||
.br
|
||||
This is also the main use case of program \fBxorriso\fR itself,
|
||||
where this run would look like:
|
||||
.br
|
||||
$ xorriso \-dev /dev/sr0 \-joliet on \-speed 12 \-fs 8m \\
|
||||
.br
|
||||
\-map ./tree2 /dir2 \-commit_eject all
|
||||
.SS
|
||||
.B Write compressed afio archive on-the-fly:
|
||||
This is possible with all media except minimally blanked DVD\-RW and DVD\-R DL.
|
||||
Since the compressed output stream is of very variable speed, a larger fifo
|
||||
is advised. Nevertheless, this example is not suitable for very old CD drives
|
||||
which have no underrun protection and thus would abort the burn run on
|
||||
temporary data shortage.
|
||||
.br
|
||||
$ find . | afio \-oZ \- | \\
|
||||
.br
|
||||
xorrecord \-v dev=/dev/sr0 speed=12 fs=64m \\
|
||||
.br
|
||||
\-multi padsize=300k \-
|
||||
.br
|
||||
afio archives do not contain references to absolute data block addresses. So
|
||||
they need no special precautions for multi\-session. One may get the session
|
||||
start addresses by option \-toc, and then use dd option skip= to begin reading
|
||||
at one of those addresses. E.g. for listing its content:
|
||||
.br
|
||||
$ dd if=/dev/sr0 bs=2048 skip=64046 | afio \-tvZ \-
|
||||
.br
|
||||
afio will know when the end of the archive is reached.
|
||||
.SH FILES
|
||||
.SS
|
||||
.B Startup files:
|
||||
.br
|
||||
If not \-\-no_rc is given as the first argument then \fBxorrecord\fR
|
||||
attempts on startup to read and execute lines from the following files:
|
||||
.br
|
||||
/etc/default/xorriso
|
||||
.br
|
||||
/etc/opt/xorriso/rc
|
||||
.br
|
||||
/etc/xorriso/xorriso.conf
|
||||
.br
|
||||
$HOME/.xorrisorc
|
||||
.br
|
||||
The files are read in the sequence given here, but none of them is required
|
||||
to exist. The lines are not interpreted as \fBxorrecord\fR options but
|
||||
as generic \fBxorriso\fR commands. See man xorriso.
|
||||
.SH SEE ALSO
|
||||
.TP
|
||||
For generic xorriso command mode
|
||||
.BR xorriso(1)
|
||||
.TP
|
||||
Formatting track sources for xorrecord:
|
||||
.BR xorrisofs(1),
|
||||
.BR mkisofs(8),
|
||||
.BR genisoimage(8),
|
||||
.BR afio(1),
|
||||
.BR star(1)
|
||||
.TP
|
||||
Other programs which burn sessions to optical media
|
||||
.BR growisofs(1),
|
||||
.BR cdrecord(1),
|
||||
.BR wodim(1),
|
||||
.BR cdrskin(1)
|
||||
.SH BUGS
|
||||
To report bugs, request help, or suggest enhancements for \fBxorriso\fR,
|
||||
please send electronic mail to the public list <bug\-xorriso@gnu.org>.
|
||||
If more privacy is desired, mail to <scdbackup@gmx.net>.
|
||||
.br
|
||||
Please describe what you expect \fBxorriso\fR to do,
|
||||
the program arguments resp. commands by which you tried to achieve it,
|
||||
the messages of \fBxorriso\fR, and the undesirable outcome of your
|
||||
program run.
|
||||
.br
|
||||
Expect to get asked more questions before solutions can be proposed.
|
||||
.SH AUTHOR
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
.br
|
||||
for libburnia\-project.org
|
||||
.SH COPYRIGHT
|
||||
Copyright (c) 2011 \- 2012 Thomas Schmitt
|
||||
.br
|
||||
Permission is granted to distribute this text freely. It shall only be
|
||||
modified in sync with the technical properties of xorriso. If you make use
|
||||
of the license to derive modified versions of xorriso then you are entitled
|
||||
to modify this text under that same license.
|
||||
.SH CREDITS
|
||||
\fBxorriso\fR is in part based on work by Vreixo Formoso who provides
|
||||
libisofs together with Mario Danic who also leads the libburnia team.
|
||||
Thanks to Andy Polyakov who invented emulated growing,
|
||||
to Derek Foreman and Ben Jansens who once founded libburn.
|
||||
.br
|
||||
Compliments towards Joerg Schilling whose cdrtools served me for ten years.
|
939
libisoburn/branches/1.2.2/xorriso/xorrecord.info
Normal file
939
libisoburn/branches/1.2.2/xorriso/xorrecord.info
Normal file
@ -0,0 +1,939 @@
|
||||
This is xorrecord.info, produced by makeinfo version 4.8 from
|
||||
./xorrecord.texi.
|
||||
|
||||
INFO-DIR-SECTION Archiving
|
||||
START-INFO-DIR-ENTRY
|
||||
* Xorrecord: (xorrecord). Emulates CD/DVD/BD program cdrecord
|
||||
END-INFO-DIR-ENTRY
|
||||
xorrecord - Emulation of CD/DVD/BD program cdrecord by program
|
||||
xorriso
|
||||
|
||||
Copyright (C) 2011 - 2012 Thomas Schmitt
|
||||
|
||||
Permission is granted to distrubute this text freely.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: Top, Next: Overview, Up: (dir)
|
||||
|
||||
xorrecord 1.2.1
|
||||
***************
|
||||
|
||||
xorrecord - Emulation of CD/DVD/BD program cdrecord by program xorriso
|
||||
|
||||
* Menu:
|
||||
|
||||
* Overview:: Overview
|
||||
* Standards:: MMC, Session, Track, Media types
|
||||
* Drive:: Drive preparation and addressing
|
||||
* Xorriso:: Relation to program xorriso
|
||||
* Options:: Options
|
||||
* Examples:: Examples
|
||||
* Files:: Files
|
||||
* Seealso:: See also
|
||||
* Bugreport:: Reporting bugs
|
||||
* Legal:: Author, Copyright, Credits
|
||||
* CommandIdx:: Alphabetic Command List
|
||||
* ConceptIdx:: Alphabetic List of Concepts and Objects
|
||||
|
||||
|
||||
File: xorrecord.info, Node: Overview, Next: Standards, Prev: Top, Up: Top
|
||||
|
||||
1 Overview
|
||||
**********
|
||||
|
||||
`xorrecord' writes preformatted data to CD, DVD, and BD media.
|
||||
|
||||
It understands some options of program cdrecord from cdrtools by Joerg
|
||||
Schilling. Its implementation is part of program xorriso which shares
|
||||
no source code with cdrtools, but rather makes use of libburn for
|
||||
communicating with the drive.
|
||||
|
||||
Another, more complete cdrecord emulator is program *cdrskin* which
|
||||
uses the same burn functions as *xorrecord*.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: Standards, Next: Drive, Prev: Overview, Up: Top
|
||||
|
||||
2 MMC, Session, Track, Media types
|
||||
**********************************
|
||||
|
||||
*MMC* is a standard out of the SCSI family which defines the
|
||||
interaction between computers and optical drives. Since more than a
|
||||
decade all CD, DVD, or BD recorders obey this standard regardless by
|
||||
what bus cabling they are attached to the computer. libburn relies on
|
||||
this standard compliance and on the capability of the operating system
|
||||
to perform SCSI transactions over the particular bus cabling.
|
||||
A *Session* is a data region on an optical disc which usually gets
|
||||
written in a single sweep. It contains at least one *Track* which is a
|
||||
contiguous string of readable blocks. `xorrecord' produces a single
|
||||
session with a single data track which consists of blocks with 2048
|
||||
bytes each. It chooses the write mode automatically according to media
|
||||
type, medium state, and option -multi.
|
||||
On CD media there are other track types, like audio, and particular
|
||||
write modes like TAO and SAO. CD and DVD- media can put more than one
|
||||
track into a session. Some of these features can be addressed by
|
||||
program *cdrskin*.
|
||||
|
||||
MMC describes several recordable *media types* which roughly form two
|
||||
families.
|
||||
*Sequentially recordable media* are CD-R, CD-RW, DVD-R, DVD-R DL,
|
||||
DVD-RW, DVD+R, DVD+R DL, BD-R. Except DVD-R DL they can store more
|
||||
than one session if there is still unwritten space and if the previous
|
||||
session was written with option *-multi*. CD-RW and DVD-RW can be
|
||||
blanked in order to be re-usable from scratch.
|
||||
*Overwritable media* are DVD-RAM, DVD+RW, formatted DVD-RW, BD-RE.
|
||||
They offer a single session with a single track for random access
|
||||
writing. There is no need to blank overwritable media before re-use.
|
||||
DVD-RW media are sold in sequentially recordable state but can be
|
||||
formatted once to become overwritable. See options
|
||||
*blank=format_overwrite* and *blank=deformat*.
|
||||
If ISO 9660 filesystems are to be stored on overwritable media, then it
|
||||
is possible to emulate multiple sessions, by using option
|
||||
*-grow_overriteable_iso*. In this case, the need for blanking before
|
||||
re-use is emulated too.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: Drive, Next: Xorriso, Prev: Standards, Up: Top
|
||||
|
||||
3 Drive preparation and addressing
|
||||
**********************************
|
||||
|
||||
The drives, CD, DVD, or BD burners, are accessed via file addresses
|
||||
which are specific to libburn and the operating system. Those addresses
|
||||
get listed by a run of `xorrecord --devices' or `xorriso -device_links'.
|
||||
On GNU/Linux and FreeBSD, the user needs rw-permission for the device
|
||||
file. On Solaris, the user needs r-permission and privilege
|
||||
"sys_devices", which is usually gained by running `xorrecord' via
|
||||
command pfexec.
|
||||
These permissions resp. privileges are needed already for listing a
|
||||
drive. So it might be necessary to get the overview as superuser resp.
|
||||
via pfexec.
|
||||
`xorrecord' does not perform cdrecord option -scanbus and does not
|
||||
accept the addresses of form Bus,Target,Lun which are told by -scanbus.
|
||||
If support for these addresses is necessary, consider to use program
|
||||
cdrskin.
|
||||
|
||||
It is possible to let `xorrecord' work on emulated drives. Their
|
||||
addresses begin by prefix "stdio:" followed by a file address. The
|
||||
emulated media behavior depends on the file type. See man xorriso for
|
||||
details.
|
||||
If standard output is chosen as emulated drive, then all program result
|
||||
texts, which usually appear on standard output, will get redirected to
|
||||
standard error.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: Xorriso, Next: Options, Prev: Drive, Up: Top
|
||||
|
||||
4 Relation to program xorriso
|
||||
*****************************
|
||||
|
||||
`xorrecord' is actually a command mode of program *xorriso*, which gets
|
||||
entered either by xorriso command "-as cdrecord" or by starting the
|
||||
program by one of the names "xorrecord", "cdrecord", "wodim", or
|
||||
"cdrskin".
|
||||
This command mode can be left by argument "--" which leads to generic
|
||||
xorriso command mode. See *man xorriso* for its description. Other
|
||||
than in xorriso command mode, the sequence of the cdrecord emulation
|
||||
options does not matter. All pending actions get performed in a fixed
|
||||
sequence before the program run ends resp. before cdrecord emulation
|
||||
ends.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: Options, Next: Examples, Prev: Xorriso, Up: Top
|
||||
|
||||
5 Options
|
||||
*********
|
||||
|
||||
* Menu:
|
||||
|
||||
* DriveAddr:: Drive addressing
|
||||
* Inquire:: Inquiring drive and media
|
||||
* SetBurn:: Settings for the burn run
|
||||
* Verbous:: Program version and verbosity
|
||||
* NonCdrecord:: Options not compatible to cdrecord
|
||||
|
||||
|
||||
File: xorrecord.info, Node: DriveAddr, Next: Inquire, Prev: Options, Up: Options
|
||||
|
||||
5.1 Addressing the drive
|
||||
========================
|
||||
|
||||
|
||||
--devices
|
||||
Print the list of accessible CD, DVD, or BD drives to standard
|
||||
output. Drives might be inaccessible if the user lacks of
|
||||
permissions to use them or if the drive is in use by another
|
||||
program.
|
||||
Each accessible drive is shown by a line like:
|
||||
0 -dev '/dev/sr0' rwrw- : 'TSSTcorp' 'CDDVDW SH-S203B'
|
||||
The libburn address of this drive is '/dev/sr0'. 'TSSTcorp' is the
|
||||
name of the vendor (in this case: Toshiba Samsung Storage
|
||||
Technologies Corporation), 'CDDVDW SH-S203B' is the model name (in
|
||||
this case: a DVD burner).
|
||||
Afterwards end emulation without performing any further drive
|
||||
operation.
|
||||
|
||||
dev=drive_address
|
||||
Set the libburn address of the drive to be used.
|
||||
E.g. on GNU/Linux: dev=/dev/sr0
|
||||
E.g. on FreeBSD: dev=/dev/cd0
|
||||
E.g. on Solaris: dev=/dev/rdsk/c2t2d0s2
|
||||
See also above "Drive preparation and addressing".
|
||||
The medium in the drive should not be mounted or be otherwise in
|
||||
use.
|
||||
This option will only get into effect if a track source, a blank=
|
||||
option, or a drive inquiry option is given. Else it will lead to a
|
||||
SORRY event and normally cause a non-zero exit value.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: Inquire, Next: SetBurn, Prev: DriveAddr, Up: Options
|
||||
|
||||
5.2 Inquiring drive and media
|
||||
=============================
|
||||
|
||||
|
||||
-inq
|
||||
Print to standard output: vendor, model name, and firmware revision
|
||||
of the drive.
|
||||
|
||||
-checkdrive
|
||||
Print unconditionally that the drive supports burnfree, SAO, and
|
||||
TAO. Also print the output of option -inq.
|
||||
|
||||
-atip
|
||||
Print the output of -checkdrive, the most capable profile of the
|
||||
medium in the drive, the list of profiles which are supported by
|
||||
the drive, whether it is erasable (i.e. can be blanked), the media
|
||||
manufacturer, and the medium product name.
|
||||
Profiles are usage models, which are often tied to a particular
|
||||
media type (e.g. CD-RW), but may also apply to a family of media.
|
||||
E.g. profile CD-ROM applies to all CD media which contain data.
|
||||
|
||||
-toc
|
||||
Print a table of content of the medium in the drive. The output is
|
||||
not compatible to cdrecord option -toc, but rather the one of
|
||||
`xorriso' command -toc. It lists the address, vendor, model name,
|
||||
and firmware revision of the drive.
|
||||
About the medium it tells product name and manufacturer, whether
|
||||
there is already content written, and if so, whether the medium is
|
||||
closed or appendable. Appendable media can take another session.
|
||||
The amount of readable and writable data is told. If there are
|
||||
sessions, then their start block address and size is reported. If
|
||||
a session contains an ISO 9660 filesystem, then its Volume Id is
|
||||
reported. If the medium is writable, then the next writable block
|
||||
address is reported.
|
||||
If not option *-grow_overriteable_iso* is given or no ISO 9660
|
||||
file system is present on the medium, then overwritable media are
|
||||
reported as being blank. This is due to the fact that they can be
|
||||
written from scratch without further preparation, and that MMC
|
||||
does not distinguish between data written by the most previous
|
||||
burn run and older data which have not been overwritten by that
|
||||
burn run. Consequently, these media are reported with 0 readable
|
||||
blocks, although all their writable blocks normally are readable,
|
||||
too.
|
||||
|
||||
-msinfo
|
||||
Print the argument text for option -C of programs mkisofs,
|
||||
genisoimage, or xorrisofs. It consists of two numbers separated by
|
||||
a comma.
|
||||
The first number tells the first block of the first track of the
|
||||
last recorded session. This is also the address used by default
|
||||
when operating systems mount a medium with e.g. ISO 9660
|
||||
filesystem.
|
||||
The second number tells the next writable address, where
|
||||
`xorrecord' will begin to write the next session.
|
||||
This option is only valid for written, appendable media. In all
|
||||
other cases it will yield no output text but will abort the program
|
||||
with non-zero exit value.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: SetBurn, Next: Verbous, Prev: Inquire, Up: Options
|
||||
|
||||
5.3 Settings for the burn run
|
||||
=============================
|
||||
|
||||
A burn run requires exactly one track source address argument,
|
||||
which tells from where to read the data wich shall be put into the
|
||||
upcomming session. The medium state must be either blank or
|
||||
appendable.
|
||||
Track source may be "-" for standard input or the address of a
|
||||
readable file of any type except directories. Nearly all media
|
||||
types accept a track source with unpredictable byte count, like
|
||||
standard input or named pipes. Nevertheless, DVD-R DL and DVD-RW
|
||||
blanked by mode deformat_quickest demand exact in-advance
|
||||
reservation of the track size, so that they either need to be read
|
||||
from a source of predictable length, or need to be accompanied by
|
||||
option *tsize=* or by option *-isosize*.
|
||||
Several options expect a size value as argument. A number with a
|
||||
trailing letter "b" or without a trailing letter is a plain byte
|
||||
count. Other trailing letters cause multiplication of the given
|
||||
number by a scaling factor:
|
||||
"k" or "K" = 1024 , "m" or "M" = 1024k , "g" or "G" = 1024m , "s"
|
||||
or "S" = 2048
|
||||
E.g. tsize=234567s means a size of 234567 * 2048 = 480393216 bytes.
|
||||
|
||||
blank=mode
|
||||
Blank a CD-RW or DVD-RW to make it re-usable from scratch. Format
|
||||
a DVD-RW, DVD+RW, DVD-RAM, BD-R, or BD-RE if not yet formatted.
|
||||
This operation normally makes any recorded data on the medium
|
||||
unreadable. It is combinable with burning in the same run of
|
||||
`xorrecord', or it may be performed without a track source,
|
||||
leaving the medium empty.
|
||||
The mode given with blank= selects the particular behavior:
|
||||
|
||||
as_needed
|
||||
Try to make the media ready for writing from scratch. If it needs
|
||||
formatting, then format it. If it is not blank, then try to apply
|
||||
blank=fast. It is a reason to abort if the medium cannot assume
|
||||
thoroughly writeable state, e.g. if it is a non-blank write-once.
|
||||
This leaves unformatted DVD-RW in unformatted blank state. To
|
||||
format DVD-RW use blank=format_overwrite. Blank unformatted BD-R
|
||||
stay unformatted.
|
||||
(Note: blank=as_needed is not an original cdrecord option.)
|
||||
|
||||
all
|
||||
Blank an entire CD-RW or an unformatted DVD-RW.
|
||||
|
||||
fast
|
||||
Minimally blank an entire CD-RW or blank an unformatted DVD-RW.
|
||||
|
||||
deformat
|
||||
Like blank=all but with the additional ability to blank
|
||||
overwriteable DVD-RW. This will destroy their formatting and make
|
||||
them sequentially recordable.
|
||||
(Note: blank=deformat is not an original cdrecord options)
|
||||
|
||||
deformat_quickest
|
||||
Like blank=deformat but blanking DVD-RW only minimally. This is
|
||||
faster than full blanking but yields media incapable of writing
|
||||
tracks of unpredicatable size. Multi-session will not be possible
|
||||
either.
|
||||
(Note: blank=deformat_quickest is not an original cdrecord option.)
|
||||
|
||||
format_overwrite
|
||||
Format a DVD-RW to "Restricted Overwrite". The user should bring
|
||||
some patience.
|
||||
Format unformatted DVD+RW, BD-RE or blank BD-R to their default
|
||||
size. It is not mandatory to do this with DVD+RW and BD-RE media,
|
||||
because they will get formatted automatically on the first write
|
||||
attempt.
|
||||
BD-R media may be written in unformatted state. This keeps
|
||||
disabled the replacement of bad blocks and enables full nominal
|
||||
write speed. Once BD-R media are written, they cannot be formatted
|
||||
any more.
|
||||
For re-formatting already formatted media or for formatting with
|
||||
non-default size, use program *xorriso* with command *-format*.
|
||||
(Note: blank=format_overwrite is not an original cdrecord options)
|
||||
|
||||
help
|
||||
Print a short overview of blank modes to standard error output.
|
||||
Afterwards end emulation without performing any drive operation.
|
||||
|
||||
-multi
|
||||
This option keeps CD, unformatted DVD-R[W], DVD+R, or BD-R
|
||||
appendable after the current session has been written. Without it
|
||||
the disc gets closed and may not be written any more - unless it
|
||||
is a -RW and gets blanked, which causes loss of its content.
|
||||
This option cannot be applied to DVD-R DL and DVD-RW which were
|
||||
blanked by type deformat_quickest.
|
||||
In order to have all filesystem content accessible, the eventual
|
||||
ISO-9660 filesystem of a follow-up session needs to be prepared in
|
||||
a special way by the filesystem formatter program. mkisofs,
|
||||
genisoimage, and xorrisofs expect particular info about the
|
||||
situation which can be retrieved by `xorrecord' option -msinfo.
|
||||
With overwriteable DVD or BD media, -multi cannot mark the end of
|
||||
the session. So when adding a new session, this end has to be
|
||||
determined from the payload. Currently only ISO-9660 filesystems
|
||||
can be used that way. See option *-grow_overwriteable_iso*.
|
||||
|
||||
-dummy
|
||||
Try to perform the drive operations without actually affecting the
|
||||
inserted media. There is no warranty that this will work with a
|
||||
particular combination of drive and media. Blanking is prevented
|
||||
reliably, though. To avoid inadverted real burning, -dummy
|
||||
refuses burn runs on anything but CD-R[W], DVD-R[W], or emulated
|
||||
stdio-drives.
|
||||
|
||||
-waiti
|
||||
Wait until input data is available at stdin or EOF occurs at stdin.
|
||||
Only then begin to access any drives.
|
||||
One should use this if xorrisofs is working at the end of a pipe
|
||||
where the feeder process reads from the drive before it starts
|
||||
writing its output into xorrisofs. Example:
|
||||
xorrisofs ... -C 0,12800 -M /dev/sr0 ... | \
|
||||
xorrecord dev=/dev/sr0 ... -waiti -
|
||||
This option works even if standard input is not the track source.
|
||||
If no process is piping in, then the Enter key of your terminal
|
||||
will act as trigger for `xorrecord'. Note that this input line
|
||||
will not be consumed by cdrskin if standard input is not the track
|
||||
source. It will end up as shell command, usually.
|
||||
|
||||
tsize=size
|
||||
Announce the exact size of the track source. This is necessary with
|
||||
DVD-R DL media and with quickest blanked DVD-RW, if the size
|
||||
cannot be determined in advance from the track source. E.g. if it
|
||||
is standard input or a named pipe.
|
||||
If the track source does not deliver the predicted amount of
|
||||
bytes, the remainder of the track is padded with zeros. This is
|
||||
not considered an error. If on the other hand the track source
|
||||
delivers more than the announced bytes then the track on media
|
||||
gets truncated to the predicted size and xorrecord exits with
|
||||
non-zero value.
|
||||
|
||||
-isosize
|
||||
Try to obtain the track size from the content of the track source.
|
||||
This works only if the track source bears an ISO 9660 filesystem.
|
||||
Any other track source content will cause the burn run to abort.
|
||||
If the track source is not a regular file or block device, then
|
||||
this option will work only if the program's fifo size is at least
|
||||
64k. See option fs=.
|
||||
|
||||
padsize=size
|
||||
Add the given amount of trailing zeros to the upcomming track.
|
||||
This feature can be disabled by size 0. Default is 300 kB in order
|
||||
to work around a problem with GNU/Linux which often fails to read
|
||||
the last few blocks of a CD track which was written in write mode
|
||||
TAO. TAO is used by `xorrecord' if the track size cannot be
|
||||
predicted or if the CD medium is not blank but appendable.
|
||||
|
||||
-nopad
|
||||
The same as padsize=0.
|
||||
|
||||
-pad
|
||||
The same as padsize=15s. This was once sufficient with older
|
||||
GNU/Linux kernels. Meanwhile one should at least use padsize=128k,
|
||||
if not padsize=300k.
|
||||
|
||||
-data
|
||||
Explicitely announce that the track source shall be recorded as
|
||||
data track, and not as audio track. This option has no effect with
|
||||
`xorrecord', because there is no support for other track formats
|
||||
anyway.
|
||||
|
||||
fs=size
|
||||
Set the size of the program fifo buffer to the given value rather
|
||||
than the default of 4m.
|
||||
The fifo buffers a temporary surplus of track source data in order
|
||||
to provide the drive with a steady stream during times of
|
||||
temporary lack of track source supply.
|
||||
Other than cdrecord, xorrecord enables drive buffer underrun
|
||||
protection by default and does not wait with writing until the
|
||||
fifo is full for a first time. On very old CD drives and slow
|
||||
computers, this might cause aborted burn runs. In this case,
|
||||
consider to use program *cdrskin* for CD burning. DVD and BD
|
||||
drives tolerate buffer underrun without problems.
|
||||
The larger the fifo, the longer periods of poor source supply can
|
||||
be compensated. But a large fifo can deprive the operating system
|
||||
of read cache for better filesystem performance.
|
||||
|
||||
speed=value
|
||||
Set the write speed. Default is 0 = maximum speed. Speed can be
|
||||
given in media type dependent x-speed numbers or as a desired
|
||||
throughput per second in MMC compliant kB (= 1000) or MB (= 1000
|
||||
kB). Media x-speed factor can be set explicity by appending "c"
|
||||
for CD, "d" for DVD, "b" for BD. "x" is optional.
|
||||
Example speeds:
|
||||
706k = 706kB/s = 4c = 4xCD
|
||||
5540k = 5540kB/s = 4d = 4xDVD
|
||||
If there is no hint about the speed unit attached, then the medium
|
||||
in the drive will decide. Default unit is CD, 1x = 176,400 raw
|
||||
bytes/second. With DVD, 1x = 1,385,000 bytes/second. With BD, 1x
|
||||
= 4,495,625 bytes/second.
|
||||
MMC drives usually activate their own idea of speed and take the
|
||||
speed value given by the burn program only as a hint for their own
|
||||
decision.
|
||||
|
||||
-eject
|
||||
Eject the drive tray after alll other work is done.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: Verbous, Next: NonCdrecord, Prev: SetBurn, Up: Options
|
||||
|
||||
5.4 Program version and verbosity
|
||||
=================================
|
||||
|
||||
|
||||
-version
|
||||
Print to standard output a line beginning by
|
||||
"Cdrecord 2.01-Emulation Copyright"
|
||||
and further lines which report the version of xorriso and its
|
||||
supporting libraries. They also state the license under which the
|
||||
program is provided, and disclaim any warranty, to the extent
|
||||
permitted by law.
|
||||
Afterwards end emulation without performing any drive operation.
|
||||
|
||||
-v
|
||||
Increase program verbosity by one level. There are four verbosity
|
||||
levels from nearly silent to debugging verbosity. The both highest
|
||||
levels can be enabled by repeated -v or by -vv resp. -vvv.
|
||||
|
||||
-V
|
||||
Log SCSI commands and drive replies to standard error. This might
|
||||
be of interest if *xorrecord* and a particular drive or medium do
|
||||
not cooperate as expected, or if you just want to know how libburn
|
||||
interacts with the drive. To understand this extremely verbous
|
||||
log, one needs to read SCSI specs SPC, SBC, and MMC.
|
||||
Please do not add such a log to a bug report on the first hand,
|
||||
unless you want to point out a particular deviation from said
|
||||
specs, or if you get asked for this log by a maintainer of
|
||||
`xorrecord' who feels in charge for your bug report.
|
||||
|
||||
-help
|
||||
Print a sparse list of program options to standard error and
|
||||
declare not to be cdrecord.
|
||||
Afterwards end emulation without performing any drive operation.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: NonCdrecord, Next: ExDevices, Prev: Verbous, Up: Options
|
||||
|
||||
5.5 Options not compatible to cdrecord
|
||||
======================================
|
||||
|
||||
|
||||
--no_rc
|
||||
Only if used as first command line argument this option prevents
|
||||
reading and interpretation of startup files. See section FILES
|
||||
below.
|
||||
|
||||
--grow_overwriteable_iso
|
||||
Enable emulation of multi-session writing on overwriteable media
|
||||
which contain an ISO 9660 filesystem. This emulation is learned
|
||||
from growisofs -M but adapted to the usage model of
|
||||
xorrecord -msinfo
|
||||
xorrisofs -C -M | xorrecord -waiti -multi -
|
||||
for sequential media.
|
||||
-grow_overwriteable_iso does not hamper the use of true
|
||||
multi-session media. I.e. it is possible to use the same
|
||||
`xorrecord' options with both kinds of media and to achieve
|
||||
similar results if ISO 9660 filesystem images are to be written.
|
||||
This option implies option -isosize and therefore demands that the
|
||||
track source is a ISO 9660 filesystem image.
|
||||
With overwriteable media and no option blank=fast|all present it
|
||||
expands an eventual ISO 9660 filesystem on media. It is assumed
|
||||
that this image's inner size description points to the end of the
|
||||
valuable data. Overwriteable media with a recognizable ISO 9660
|
||||
size will be regarded as appendable rather than as blank. I.e.
|
||||
options -msinfo and -toc will work. -toc will always show a
|
||||
single session with its size increasing with every added ISO 9660
|
||||
image.
|
||||
|
||||
stream_recording="on"|"off"|number
|
||||
Mode "on" requests that compliance to the desired speed setting is
|
||||
preferred over management of write errors. With DVD-RAM and BD
|
||||
this can bring effective write speed near to the nominal write
|
||||
speed of the media. But it will also disable the automatic use of
|
||||
replacement blocks if write errors occur. It might as well be
|
||||
disliked or ignored by the drive.
|
||||
If a number is given, then error management stays enabled for all
|
||||
byte addresses below that number. Any number below 16s is the same
|
||||
as "off".
|
||||
|
||||
dvd_obs="default"|"32k"|"64k"
|
||||
Linux specific: Set the number of bytes to be transmitted with
|
||||
each write operation to DVD or BD media. Tracks get padded up to
|
||||
the next multiple of this write size. A number of 64 KB may
|
||||
improve throughput with bus systems which show latency problems.
|
||||
The default depends on media type, option stream_recording=, and
|
||||
on compile time options.
|
||||
|
||||
write_start_address=value
|
||||
Set the block address on overwritable media where to start writing
|
||||
the track. With DVD+RW, DVD-RAM or BD-RE, byte_offset must be
|
||||
aligned to 2 kiB blocks, but better is 32 kiB on DVD and 64 kiB on
|
||||
BD. With formatted DVD-RW 32 kiB alignment is mandatory.
|
||||
Other media are not suitable for this option.
|
||||
|
||||
stdio_sync="on"|"off"|number
|
||||
Set the number of bytes after which to force output to emulated
|
||||
stdio: drives. This forcing keeps the memory from being clogged
|
||||
with lots of pending data for slow devices. Default "on" is the
|
||||
same as "16m". Forced output can be disabled by "off".
|
||||
|
||||
|
||||
File: xorrecord.info, Node: Examples, Next: Files, Prev: Options, Up: Top
|
||||
|
||||
6 Examples
|
||||
**********
|
||||
|
||||
* Menu:
|
||||
|
||||
* ExDevices:: Get an overview of drives and their addresses
|
||||
* ExMedium:: Get info about a particular drive or loaded media
|
||||
* ExBlank:: Prepare CD-RW or DVD-RW for re-use
|
||||
* ExFormat:: Format DVD-RW to avoid need for blanking before re-use
|
||||
* ExDeformat:: De-format DVD-RW to make it capable of multi-session again
|
||||
* ExIsoSingle:: Write a single ISO 9660 filesystem image
|
||||
* ExIsoMulti:: Write multiple ISO 9660 sessions
|
||||
* ExIsoFly:: Write ISO 9660 session on-the-fly
|
||||
* ExAfio:: Write compressed afio archive on-the-fly
|
||||
|
||||
|
||||
File: xorrecord.info, Node: ExDevices, Next: ExMedium, Prev: NonCdrecord, Up: Examples
|
||||
|
||||
6.1 Get an overview of drives and their addresses
|
||||
=================================================
|
||||
|
||||
|
||||
$ xorrecord -devices
|
||||
|
||||
|
||||
File: xorrecord.info, Node: ExMedium, Next: ExBlank, Prev: ExDevices, Up: Examples
|
||||
|
||||
6.2 Get info about a particular drive and loaded media
|
||||
======================================================
|
||||
|
||||
|
||||
$ xorrecord dev=/dev/sr0 -atip -toc -grow_overwriteable_iso
|
||||
|
||||
|
||||
File: xorrecord.info, Node: ExBlank, Next: ExFormat, Prev: ExMedium, Up: Examples
|
||||
|
||||
6.3 Prepare CD-RW or DVD-RW for re-use
|
||||
======================================
|
||||
|
||||
|
||||
$ xorrecord -v dev=/dev/sr0 blank=as_needed -eject
|
||||
|
||||
|
||||
File: xorrecord.info, Node: ExFormat, Next: ExDeformat, Prev: ExBlank, Up: Examples
|
||||
|
||||
6.4 Format DVD-RW to avoid need for blanking before re-use
|
||||
==========================================================
|
||||
|
||||
|
||||
$ xorrecord -v dev=/dev/sr0 blank=format_overwrite -eject
|
||||
|
||||
This command may also be used to format BD-R media before first use, in
|
||||
order to enable handling of write errors. Several hundred MB of spare
|
||||
blocks will be reserved and write runs on such media will perform with
|
||||
less than half nominal speed.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: ExDeformat, Next: ExIsoSingle, Prev: ExFormat, Up: Examples
|
||||
|
||||
6.5 De-format DVD-RW to make it capable of multi-session again
|
||||
==============================================================
|
||||
|
||||
|
||||
$ xorrecord -v dev=/dev/sr0 blank=deformat
|
||||
|
||||
|
||||
File: xorrecord.info, Node: ExIsoSingle, Next: ExIsoMulti, Prev: ExDeformat, Up: Examples
|
||||
|
||||
6.6 Write a single ISO 9660 filesystem image
|
||||
============================================
|
||||
|
||||
|
||||
$ xorrecord -v dev=/dev/sr0 speed=12 fs=8m \
|
||||
blank=as_needed -eject padsize=300k my_image.iso
|
||||
|
||||
|
||||
File: xorrecord.info, Node: ExIsoMulti, Next: ExIsoFly, Prev: ExIsoSingle, Up: Examples
|
||||
|
||||
6.7 Write multiple ISO 9660 sessions
|
||||
====================================
|
||||
|
||||
This is possible with all media except minimally blanked DVD-RW and
|
||||
DVD-R DL, which cannot do multi-session.
|
||||
The first session is written like in the previous example, except that
|
||||
option -multi is used. It will contain the files of hard disk directory
|
||||
./tree1 under the ISO 9660 directory /dir1:
|
||||
|
||||
$ xorrisofs -o image_1.iso -J -graft-points /dir1=./tree1
|
||||
$ xorrecord -v dev=/dev/sr0 speed=12 fs=8m \
|
||||
-multi -grow_overwritable_iso \
|
||||
blank=as_needed -eject padsize=300k image_1.iso
|
||||
|
||||
For the second session xorrisofs needs to know the -msinfo numbers of
|
||||
the medium. Further it will read data from the medium by using the
|
||||
system's read-only CD-ROM driver.
|
||||
It is advised to load the tray manually or via dd by the CD-ROM driver,
|
||||
rather than letting xorrecord do this by its own SCSI driver. Many
|
||||
system CD-ROM drivers do not take notice of xorrecord's activities.
|
||||
|
||||
$ dd if=/dev/sr0 count=1 >/dev/null 2>&1
|
||||
Now get the -msinfo numbers:
|
||||
$ m=$(xorrecord dev=/dev/sr0 -msinfo)
|
||||
|
||||
and use them with xorrisofs to add ./tree2 to the image as /dir2:
|
||||
|
||||
$ xorrisofs -M /dev/sr0 -C $m -o image_2.iso \
|
||||
-J -graft-points /dir2=./tree2
|
||||
|
||||
Now burn the new session onto the same medium. This time without
|
||||
blanking:
|
||||
|
||||
$ xorrecord -v dev=/dev/sr0 speed=12 fs=8m \
|
||||
-multi -grow_overwritable_iso \
|
||||
-eject padsize=300k image_2.iso
|
||||
|
||||
Operating systems which mount this medium will read the superblock of
|
||||
the second session and show both directories /dir1 and /dir2.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: ExIsoFly, Next: ExAfio, Prev: ExIsoMulti, Up: Examples
|
||||
|
||||
6.8 Write ISO 9660 session on-the-fly
|
||||
=====================================
|
||||
|
||||
It is possible to combine the run of *xorrisofs* and `xorrecord' in a
|
||||
pipeline without storing the ISO 9660 image as file on hard disk:
|
||||
|
||||
$ xorrisofs -M /dev/sr0 -C $m \
|
||||
-J -graft-points /dir2=./tree2 \
|
||||
| xorrecord -v dev=/dev/sr0 speed=12 fs=8m \
|
||||
-waiti -multi -grow_overwritable_iso \
|
||||
-eject padsize=300k -
|
||||
|
||||
This is also the main use case of program *xorriso* itself, where this
|
||||
run would look like:
|
||||
|
||||
$ xorriso -dev /dev/sr0 -joliet on -speed 12 -fs 8m \
|
||||
-map ./tree2 /dir2 -commit_eject all
|
||||
|
||||
|
||||
File: xorrecord.info, Node: ExAfio, Prev: ExIsoFly, Up: Examples
|
||||
|
||||
6.9 Write compressed afio archive on-the-fly
|
||||
============================================
|
||||
|
||||
This is possible with all media except minimally blanked DVD-RW and
|
||||
DVD-R DL. Since the compressed output stream is of very variable
|
||||
speed, a larger fifo is advised. Nevertheless, this example is not
|
||||
suitable for very old CD drives which have no underrun protection and
|
||||
thus would abort the burn run on temporary data shortage.
|
||||
|
||||
$ find . | afio -oZ - | \
|
||||
xorrecord -v dev=/dev/sr0 speed=12 fs=64m \
|
||||
-multi padsize=300k -
|
||||
|
||||
afio archives do not contain references to absolute data block
|
||||
addresses. So they need no special precautions for multi-session. One
|
||||
may get the session start addresses by option -toc, and then use dd
|
||||
option skip= to begin reading at one of those addresses. E.g. for
|
||||
listing its content:
|
||||
|
||||
$ dd if=/dev/sr0 bs=2048 skip=64046 | afio -tvZ -
|
||||
|
||||
afio will know when the end of the archive is reached.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: Files, Next: Seealso, Prev: Examples, Up: Top
|
||||
|
||||
7 Files
|
||||
*******
|
||||
|
||||
7.1 Startup Files
|
||||
=================
|
||||
|
||||
If not -no_rc is given as the first argument then `xorrecord' attempts
|
||||
on startup to read and execute lines from the following files:
|
||||
|
||||
/etc/default/xorriso
|
||||
/etc/opt/xorriso/rc
|
||||
/etc/xorriso/xorriso.conf
|
||||
$HOME/.xorrisorc
|
||||
|
||||
The files are read in the sequence given here, but none of them is
|
||||
required to exist. The lines are not interpreted as `xorrecord' options
|
||||
but as generic *xorriso* commands. See man xorriso.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: Seealso, Next: Bugreport, Prev: Files, Up: Top
|
||||
|
||||
8 See also
|
||||
**********
|
||||
|
||||
For generic xorriso command mode
|
||||
xorriso(1)
|
||||
|
||||
Formatting track sources for xorrecord
|
||||
xorrisofs(1), mkisofs(8), genisoimage(8), afio(1), star(1)
|
||||
|
||||
Other programs which burn sessions to optical media
|
||||
growisofs(1), cdrecord(1), wodim(1), cdrskin(1)
|
||||
|
||||
|
||||
File: xorrecord.info, Node: Bugreport, Next: Legal, Prev: Seealso, Up: Top
|
||||
|
||||
9 Reporting bugs
|
||||
****************
|
||||
|
||||
To report bugs, request help, or suggest enhancements for `xorriso',
|
||||
please send electronic mail to the public list <bug-xorriso@gnu.org>.
|
||||
If more privacy is desired, mail to <scdbackup@gmx.net>.
|
||||
|
||||
Please describe what you expect `xorriso' to do, the program arguments
|
||||
resp. commands by which you tried to achieve it, the messages of
|
||||
`xorriso', and the undesirable outcome of your program run.
|
||||
|
||||
Expect to get asked more questions before solutions can be proposed.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: Legal, Next: CommandIdx, Prev: Bugreport, Up: Top
|
||||
|
||||
10 Author, Copyright, Credits
|
||||
*****************************
|
||||
|
||||
10.1 Author
|
||||
===========
|
||||
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
for libburnia-project.org
|
||||
|
||||
10.2 Copyright
|
||||
==============
|
||||
|
||||
Copyright (c) 2011 - 2012 Thomas Schmitt
|
||||
Permission is granted to distribute this text freely. It shall only be
|
||||
modified in sync with the technical properties of xorriso. If you make
|
||||
use of the license to derive modified versions of xorriso then you are
|
||||
entitled to modify this text under that same license.
|
||||
|
||||
10.3 Credits
|
||||
============
|
||||
|
||||
`xorriso' is in part based on work by Vreixo Formoso who provides
|
||||
libisofs together with Mario Danic who also leads the libburnia team.
|
||||
Thanks to Andy Polyakov who invented emulated growing, to Derek Foreman
|
||||
and Ben Jansens who once founded libburn.
|
||||
Compliments towards Joerg Schilling whose cdrtools served me for ten
|
||||
years.
|
||||
|
||||
|
||||
File: xorrecord.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top
|
||||
|
||||
11 Alphabetic Command List
|
||||
**************************
|
||||
|
||||
|