summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-03 18:28:20 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-03 18:28:20 -0800
commita64f6715e8c4b7b510470ee12a51686fb246f57e (patch)
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904
parenta8edb359b0b8957cc6cc97ed335234f141f7d63d (diff)
downloaddosfstools-a64f6715e8c4b7b510470ee12a51686fb246f57e.tar.gz
auto import from //depot/cupcake/@135843
-rw-r--r--Android.mk3
-rw-r--r--COPYING674
-rw-r--r--ChangeLog345
-rw-r--r--Makefile112
-rw-r--r--NOTICE674
-rw-r--r--debian/changelog427
-rw-r--r--debian/compat1
-rw-r--r--debian/control35
-rw-r--r--debian/copyright88
-rw-r--r--debian/doc/HISTORY20
-rw-r--r--debian/docs1
-rw-r--r--debian/patches/14-bootcode.dpatch235
-rwxr-xr-xdebian/rules46
-rw-r--r--doc/ANNOUNCE.mkdosfs41
-rw-r--r--doc/ChangeLog.dosfsck10
-rw-r--r--doc/ChangeLog.dosfstools-2.x161
-rw-r--r--doc/ChangeLog.mkdosfs18
-rw-r--r--doc/README.dosfsck60
-rw-r--r--doc/README.dosfstools-2.x60
-rw-r--r--doc/README.mkdosfs50
-rw-r--r--doc/TODO.dosfstools-2.x14
-rw-r--r--man/dosfsck.8147
-rw-r--r--man/dosfslabel.853
-rw-r--r--man/mkdosfs.8211
-rw-r--r--src/Android.mk20
-rw-r--r--src/boot.c463
-rw-r--r--src/boot.h31
-rw-r--r--src/check.c883
-rw-r--r--src/check.h40
-rw-r--r--src/common.c125
-rw-r--r--src/common.h57
-rw-r--r--src/dosfsck.c207
-rw-r--r--src/dosfsck.h220
-rw-r--r--src/dosfslabel.c126
-rw-r--r--src/fat.c381
-rw-r--r--src/fat.h81
-rw-r--r--src/file.c263
-rw-r--r--src/file.h72
-rw-r--r--src/io.c209
-rw-r--r--src/io.h71
-rw-r--r--src/lfn.c495
-rw-r--r--src/lfn.h36
-rw-r--r--src/mkdosfs.c1761
-rw-r--r--src/version.h28
44 files changed, 0 insertions, 9055 deletions
diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index 3c3cb61..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,3 +0,0 @@
-ifneq ($(TARGET_SIMULATOR),true)
- include $(call all-subdir-makefiles)
-endif
diff --git a/COPYING b/COPYING
deleted file mode 100644
index 94a9ed0..0000000
--- a/COPYING
+++ /dev/null
@@ -1,674 +0,0 @@
- 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>.
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644
index 4a53630..0000000
--- a/ChangeLog
+++ /dev/null
@@ -1,345 +0,0 @@
-commit 41574812a2586f0b6aa1d4f6e2276e557e9cbbcf
-Author: Daniel Baumann <daniel@debian.org>
-Date: Sun Nov 23 18:41:01 2008 +0100
-
- Applying Fedoras dosfstools-vfat-timingfix.diff from Bill Nottingham
- <notting@redhat.com> to fix vfat timing issue. See
- https://bugzilla.redhat.com/show_bug.cgi?id=448247 for more information.
-
-commit b80656109cc5cffdefd626c2ec9d45e3cf63a03e
-Author: Ulrich Mueller <ulm@gentoo.org>
-Date: Tue Oct 7 07:55:37 2008 +0200
-
- Patch to check for bad number of clusters in dosfsck:
-
- * FAT16 filesystems with 65525 clusters or more will be rejected
- (Before, this was not tested for. Up to 65535 clusters were accepted
- as good).
-
- * For FAT32 filesystems with less than 65525 a warning message will be
- output.
-
- Macro MSDOS_FAT12 is now replaced by FAT12_THRESHOLD to make it
- consistent with the definition in mkdosfs and to remove the dependency
- on the kernel version.
-
-commit b9c13d143c420a3ec6e1dcb652cafa407621e9c7
-Author: Dann Frazier <dannf@hp.com>
-Date: Tue Sep 30 07:25:19 2008 +0200
-
- Changing some wording to make the indended meaning of "full-disk device"
- more obvious.
-
-commit 4df18ad463f41ae368c3c51bfb5a033072605663
-Author: Daniel Baumann <daniel@debian.org>
-Date: Sun Sep 28 11:43:19 2008 +0200
-
- Releasing upstream version 3.0.0.
-
-commit 17fbf2a6dc9255a6bb832472ae7cda674b55e961
-Author: Daniel Baumann <daniel@debian.org>
-Date: Sun Sep 28 11:29:01 2008 +0200
-
- Adding GPL headers to all files.
-
-commit d2039e12c8d53472411c91eb8e7a7c0544e13d6d
-Author: Daniel Baumann <daniel@debian.org>
-Date: Sun Sep 28 10:51:55 2008 +0200
-
- Adding new GPL license file.
-
-commit e4e457f4b57090ecf0539f48dc682ab9afd14ab8
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 23:31:12 2008 +0200
-
- Redoing Makefile from scratch.
-
-commit 216568ca3a01ed38962b22c7bf838d15d5a4d98d
-Author: Daniel Baumann <daniel@debian.org>
-Date: Sat Sep 27 00:17:38 2008 +0200
-
- Removing whitespaces in all files at EOL and EOF.
-
-commit f59157e06561c525605279145057361afa721042
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 23:48:56 2008 +0200
-
- Adding Debians dosfslabel.8 manpage from Francois Wendling
- <frwendling@free.fr>.
-
-commit c1bacab212d2b7f6ea93914976cb60056ff8276d
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 18:36:04 2008 +0200
-
- Updating version.h includes to new location of version.h file.
-
-commit 1dae9f522062037d3539cadf344e0359c644171f
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 18:19:36 2008 +0200
-
- Removing old lsm file.
-
-commit d843bec0b987f5582fe048f70e42df18c34d3ae4
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 18:07:47 2008 +0200
-
- Removing old cvsignore files.
-
-commit 77fddbc03016752286b26913c62b98f86ee63211
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 18:18:39 2008 +0200
-
- Removing old build file.
-
-commit f3e7168fc9eb6f32a6c85021186d84944cefeba8
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 18:19:16 2008 +0200
-
- Removing old GPL license files.
-
-commit 68089477036e97911791516ee2167286f26ff819
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 18:21:57 2008 +0200
-
- Unifying dosfsck and mkdosfs Makefiles in common src/Makefile.
-
-commit 9432a02d6e7c38872d7b1042f1b8be1b24a57427
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 18:04:02 2008 +0200
-
- Unifying dosfsck and mkdosfs sources in common src directory.
-
-commit 0c179b9ee47174d0f34d9fc796d540012740ac01
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 18:05:27 2008 +0200
-
- Unifying dosfsck and mkdosfs manpages in common man directory.
-
-commit 2d246c28ba6cfd43be2e44b11283891d922f352b
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 18:12:29 2008 +0200
-
- Unifying dosfsck and mkdosfs documents in common doc directory.
-
-commit e5b16990515d0214fd103dd8aa22ff6a3cda4b64
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 15:39:51 2008 +0200
-
- Applying Gentoos dosfstools-2.11-preen.patch from Roy Marples
- <uberlord@gentoo.org> to alias dosfsck -p to -a:
-
- * Map -p to -a for baselayout-2, #177514.
-
-commit 6a1d974251a9f9a142775ace3a8048149abfa90c
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 15:49:43 2008 +0200
-
- Applying Gentoos dosfstools-2.11-build.patch from Mike Frysinger
- <vapier@gentoo.org> to improve Makefile:
-
- * Respect user settings #157785/#157786 by Diego Petteno.
-
-commit 1ea49f00e61b554dc833d44e1a3617e923be667e
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 15:37:34 2008 +0200
-
- Applying Gentoos dosfstools-2.11-verify-double-count-fix.patch from
- Robin H. Johnson <robbat2@gentoo.org> to fix double count of files
- during verification:
-
- * Don't double-count n_files during a verification pass.
- Bugzilla: http://bugs.gentoo.org/show_bug.cgi?id=99845
-
-commit 2d2f20b2c495fa620c7bb3ec5a0838b08f65ab05
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 15:33:36 2008 +0200
-
- Applying Gentoos dosfstools-2.11-fat32size.patch from Mike Frysinger
- <vapier@gentoo.org> to fix generation of filesystems on 256meg devices:
-
- * Fix generation of FAT filesystems on devices that are 256meg in size
- Patch by Ulrich Mueller and accepted upstream
- http://bugs.gentoo.org/112504
-
-commit a86564a9317b2bf9f7734feacdce794f20af74a7
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 15:22:06 2008 +0200
-
- Applying Suses dosfstools-2.11-unsupported-sector-size.patch from Petr
- Gajdos <pgajdos@suse.cz> to add sector size warning:
-
- * added warning for creation msdos on filesystem with sector size
- greater than 4096 [fate#303325]
-
-commit 8171e51f4e02bd9f92bb515ca7896d3cb1b564b5
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 15:18:35 2008 +0200
-
- Applying Suses dosfstools-2.11-mkdosfs-geo0.diff from Ludwig Nussel
- <lnussel@suse.de> to fix handling of zero heads and sectors:
-
- * the HDIO_GETGEO ioctl works on device mapper devices but returns
- zero heads and sectors. Therefore let's a) assume dummy values in
- that case in mkdosfs and b) don't consider such fat file systems as
- invalid in dosfsck. The Linux kernel accepts them anyways.
-
-commit db887df619f4e995db0ab112334f31464a03fa0e
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 15:15:40 2008 +0200
-
- Applying Suses dosfstools-2.11-linuxfs.patch from Ruediger Oertel
- <ro@suse.de> to not include linux/fs.h.
-
-commit 7fe3fa643494b26962d542fac38d988ac60f8c09
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 15:11:50 2008 +0200
-
- Applying Fedoras dosfstools-2.11-assumeKernel26.patch from Peter Vrabec
- <pvrabec@redhat.com> to remove linux 2.6 conditionals:
-
- * LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) does not work with
- glibc-kernheaders-2.4-9.1.94
-
-commit 90c1c93c100722a03e48be51b1312fe65c1cb156
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 15:05:00 2008 +0200
-
- Applying Debians 99-conglomeration.dpatch (no other information
- available).
-
-commit bb6541bf4735e3a7f1c71b4722c6d03bb4549eea
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 14:26:41 2008 +0200
-
- Applying Debians 15-manpage-files.dpatch from Daniel Baumann
- <daniel@debian.org> to improve dosfsck manpage:
-
- * Lists fsckNNNN.rec files in FILES section (Closes: #444596).
-
-commit 49282165866be19d3bc54a3f4bdee2cf3a63ba6c
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 14:34:42 2008 +0200
-
- Applying Debians 13-getopt.dpatch from Adonikam Virgo
- <adonikam@virgonet.org> to fix mkdosfs getopt:
-
- * Fixes backup sector getopt (Closes: #232387, #479794).
-
-commit c32e44b85f4eac6f6a94bd620eea4abba257042a
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 14:34:17 2008 +0200
-
- Applying Debians 12-zero-slot.dpatch by Karl Tomlinson
- <karlt@karlt.net> to fix dosfsck zero slot crashes:
-
- * Fixes crashes due to zero slot numbers causing a negative offset in
- the call to copy_lfn_part in lfn_add_slot. On amd64 this results in
- a SIGSEGV in copy_lfn_part. On x86 the result is heap corruption
- and thus sometimes a SIGSEGV or double free abort later. (Closes:
- #152550, #353198, #356377, #401798).
-
-commit 370847af533e628aa9e38710e6d50af09f2b71ba
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 14:33:54 2008 +0200
-
- Applying Debians 11-memory-efficiency.dpatch from Eero Tamminen
- <eero.tamminen@nokia.com> to improve dosfsck memory efficiency:
-
- * Improves memory efficiency when checking filesystems.
-
-commit 28da9f286a52acec7df7ad06cb0679e5f828e7f3
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 14:33:28 2008 +0200
-
- Applying Debians 10-manpage-synopsis.dpatch from Daniel Baumann
- <daniel@debian.org> to fix manpage synopsis:
-
- * List alternative binary names in manpage synopsis (Closes: #284983).
-
-commit f253073021551c9b58d0f2ac262deb3c1b950b06
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 14:32:46 2008 +0200
-
- Applying Debians 09-manpage-fat32.dpatch from Daniel Baumann
- <daniel@debian.org> to improve mkdosfs manpage:
-
- * Don't claim that FAT32 is not choosed automatically (Closes:
- #414183).
-
-commit f37c07aec3972cfc0db374d544ee3b27c0b4b20b
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 14:32:23 2008 +0200
-
- Applying Debians 08-manpage-drop.dpatch from Daniel Baumann
- <daniel@debian.org> to improve dosfsck manpage:
-
- * Don't use confusing word 'drop' when 'delete' is meant (Closes:
- #134100).
-
-commit 3f970c65586da2f44d2a49b639e89341bbaf1fba
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 14:31:50 2008 +0200
-
- Applying Debians 07-manpage-spelling.dpatch from Justin Pryzby
- <justinpryzby@users.sourceforge.net> to fix mkdosfs manpage typos.
-
-commit 18678ba5f3a10c2a54ffee735651d7a265ae7d54
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 14:30:31 2008 +0200
-
- Applying Suses dosfstools-2.11_determine-sector-size.patch from Petr
- Gajdos <pgajdos@suse.cz> to determine mkdosfs sector size automatically:
-
- * determine sector size of device automatically or if -S parameter
- present, verify, that it's not under physical sector size
-
-commit 29753931b078856d78f473cfb6273e111a26891e
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 14:30:03 2008 +0200
-
- Applying Suses dosfstools-2.11-o_excl.patch from Pavol Rusnak
- <prusnak@suse.cz> to use O_EXCL in mkdosfs:
-
- * mkdosfs now opens device with O_EXCL [#238687]
-
-commit 16bb7b09ad9eaf0fe37a732cabcdbdf975b77d3e
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 14:29:36 2008 +0200
-
- Applying Debians 04-unaligned-memory.dpatch from Khalid Aziz
- <khalid_aziz@hp.com> to fix dosfsck unaligned memory accesses:
-
- * Fix unaligned memory accesses which cause warnings to appear
- everytime the elilo bootloader script runs. This has led a number
- of users to believe their install has failed (Closes: #258839).
-
-commit 1298cc8f37eaa27ca542b8b7186ea5a47a63cd7e
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 13:47:40 2008 +0200
-
- Applying Fedoras dosfstools-2.11-label.patch from Jeremy Katz
- <katzj@redhat.com> to add dosfslabel (originally by Peter Jones).
-
-commit d23890e1d89770d6d2ba58362c2fc4ebafbde15c
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 13:41:14 2008 +0200
-
- Applying Fedoras dosfstools-2.11-fortify.patch from Jakub Jelinek
- <jakub@redhat.com> to make it build with -D_FORTIFY_SOURCE=2:
-
- * This violates -D_FORTIFY_SOURCE=2 (which is stricter than C
- standard), but isn't actually any buffer overflow. But using memcpy
- is more efficient anyway.
-
-commit 7dbd82000e59246c1c2f8c280c4491259e10a767
-Author: Daniel Baumann <daniel@debian.org>
-Date: Fri Sep 26 13:40:47 2008 +0200
-
- Applying Fedoras dosfstools-2.7-argfix.patch (no other information
- available).
-
-commit 88f3b3139c72ac11cb3dd3f5afa8dbb2198a8de5
-Author: Daniel Baumann <daniel@debian.org>
-Date: Thu Jun 26 12:45:36 2008 +0200
-
- Adding upstream version 2.11.
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 148b53a..0000000
--- a/Makefile
+++ /dev/null
@@ -1,112 +0,0 @@
-# Makefile
-#
-# Copyright (C) 2008 Daniel Baumann <daniel@debian.org>
-#
-# 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/>.
-#
-# On Debian systems, the complete text of the GNU General Public License
-# can be found in /usr/share/common-licenses/GPL-3 file.
-
-DESTDIR =
-PREFIX = /usr/local
-SBINDIR = $(PREFIX)/sbin
-DOCDIR = $(PREFIX)/share/doc
-MANDIR = $(PREFIX)/share/man
-
-#OPTFLAGS = -O2 -fomit-frame-pointer -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
-OPTFLAGS = -O2 -fomit-frame-pointer $(shell getconf LFS_CFLAGS)
-#WARNFLAGS = -Wall -pedantic -std=c99
-WARNFLAGS = -Wall
-DEBUGFLAGS = -g
-CFLAGS += $(OPTFLAGS) $(WARNFLAGS) $(DEBUGFLAGS)
-
-VPATH = src
-
-all: build
-
-build: dosfsck dosfslabel mkdosfs
-
-dosfsck: boot.o check.o common.o fat.o file.o io.o lfn.o dosfsck.o
-
-dosfslabel: boot.o check.o common.o fat.o file.o io.o lfn.o dosfslabel.o
-
-mkdosfs: mkdosfs.o
-
-rebuild: distclean build
-
-install: install-bin install-doc install-man
-
-install-bin: build
- install -d -m 0755 $(DESTDIR)/$(SBINDIR)
- install -m 0755 dosfsck dosfslabel mkdosfs $(DESTDIR)/$(SBINDIR)
-
- ln -sf dosfsck $(DESTDIR)/$(SBINDIR)/fsck.msdos
- ln -sf dosfsck $(DESTDIR)/$(SBINDIR)/fsck.vfat
- ln -sf mkdosfs $(DESTDIR)/$(SBINDIR)/mkfs.msdos
- ln -sf mkdosfs $(DESTDIR)/$(SBINDIR)/mkfs.vfat
-
-install-doc:
- install -d -m 0755 $(DESTDIR)/$(DOCDIR)/dosfstools
- install -m 0644 doc/* $(DESTDIR)/$(DOCDIR)/dosfstools
-
-install-man:
- install -d -m 0755 $(DESTDIR)/$(MANDIR)/man8
- install -m 0644 man/*.8 $(DESTDIR)/$(MANDIR)/man8
-
- ln -sf dosfsck.8 $(DESTDIR)/$(MANDIR)/man8/fsck.msdos.8
- ln -sf dosfsck.8 $(DESTDIR)/$(MANDIR)/man8/fsck.vfat.8
- ln -sf mkdosfs.8 $(DESTDIR)/$(MANDIR)/man8/mkfs.msdos.8
- ln -sf mkdosfs.8 $(DESTDIR)/$(MANDIR)/man8/mkfs.vfat.8
-
-uninstall: uninstall-bin uninstall-doc uninstall-man
-
-uninstall-bin:
- rm -f $(DESTDIR)/$(SBINDIR)/dosfsck
- rm -f $(DESTDIR)/$(SBINDIR)/dosfslabel
- rm -f $(DESTDIR)/$(SBINDIR)/mkdosfs
-
- rm -f $(DESTDIR)/$(SBINDIR)/fsck.msdos
- rm -f $(DESTDIR)/$(SBINDIR)/fsck.vfat
- rm -f $(DESTDIR)/$(SBINDIR)/mkfs.msdos
- rm -f $(DESTDIR)/$(SBINDIR)/mkfs.vfat
-
- rmdir --ignore-fail-on-non-empty $(DESTDIR)/$(SBINDIR)
-
-uninstall-doc:
- rm -rf $(DESTDIR)/$(DOCDIR)/dosfstools
-
- rmdir --ignore-fail-on-non-empty $(DESTDIR)/$(DOCDIR)
-
-uninstall-man:
- rm -f $(DESTDIR)/$(MANDIR)/man8/dosfsck.8
- rm -f $(DESTDIR)/$(MANDIR)/man8/dosfslabel.8
- rm -f $(DESTDIR)/$(MANDIR)/man8/mkdosfs.8
-
- rm -f $(DESTDIR)/$(MANDIR)/man8/fsck.msdos.8
- rm -f $(DESTDIR)/$(MANDIR)/man8/fsck.vfat.8
- rm -f $(DESTDIR)/$(MANDIR)/man8/mkfs.msdos.8
- rm -f $(DESTDIR)/$(MANDIR)/man8/mkfs.vfat.8
-
- rmdir --ignore-fail-on-non-empty $(DESTDIR)/$(MANDIR)/man8
- rmdir --ignore-fail-on-non-empty $(DESTDIR)/$(MANDIR)
-
-reinstall: distclean install
-
-clean:
- rm -f *.o
-
-distclean: clean
- rm -f dosfsck dosfslabel mkdosfs
-
-.PHONY: build rebuild install install-bin install-doc install-man uninstall uninstall-bin uninstall-doc uninstall-man reinstall clean distclean
diff --git a/NOTICE b/NOTICE
deleted file mode 100644
index 94a9ed0..0000000
--- a/NOTICE
+++ /dev/null
@@ -1,674 +0,0 @@
- 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>.
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index 0aa9676..0000000
--- a/debian/changelog
+++ /dev/null
@@ -1,427 +0,0 @@
-dosfstools (3.0.1-1) unstable; urgency=low
-
- * Replacing obsolete dh_clean -k with dh_prep.
- * Merging upstream version 3.0.1:
- - Changing some wording to make the indended meaning of "full-disk device"
- more obvious (Closes: #500623).
-
- -- Daniel Baumann <daniel@debian.org> Sun, 23 Nov 2008 22:51:46 +0100
-
-dosfstools (3.0.0-1) unstable; urgency=low
-
- * Merging upstream version 3.0.0.
- * Updating homepage field in control.
- * Updating upstream information in copyright file.
- * Removing now useless lintian override.
- * Removing now useless manpage.
- * Removing now useless patches.
- * Removing now useless docs.
- * Updating rules to for new upstream.
-
- -- Daniel Baumann <daniel@debian.org> Sun, 28 Sep 2008 11:56:00 +0200
-
-dosfstools (2.11-8) unstable; urgency=low
-
- * Adding debug package.
-
- -- Daniel Baumann <daniel@debian.org> Sat, 20 Sep 2008 21:52:00 +0200
-
-dosfstools (2.11-7) unstable; urgency=low
-
- * Adding manpage for dosfslabel, thanks to Francois Wendling
- <frwendling@free.fr> (Closes: #496760).
- * Updating vcs fields in control file.
- * Using patch-stamp rather than patch in rules file.
-
- -- Daniel Baumann <daniel@debian.org> Sat, 20 Sep 2008 21:48:00 +0200
-
-dosfstools (2.11-6) unstable; urgency=high
-
- * Temporarily disabling bootcode.dpatch since it breaks syslinux,
- thanks to Joey Hess <joeyh@debian.org> (Closes: #489292).
-
- -- Daniel Baumann <daniel@debian.org> Fri, 4 Jul 2008 20:28:00 +0200
-
-dosfstools (2.11-5) unstable; urgency=medium
-
- * Adding patch to mention fsckNNNN.rec files in dosfsck manpage
- (Closes: #444596).
- * Adding patch from Sam Bingner <sam@bingner.com> to add option for using a
- bootcode template (Closes: #303442).
- * Adding patch from Adonikam Virgo <adonikam@virgonet.org> to fix backup
- sector getopt (Closes: #232387, #479794).
- * Adding patch from Karl Tomlinson <karlt@karlt.net> to fix segfaults with
- zero slots in lfn (Closes: #152550, #353198, #356377, #401798).
- * Rediffing 99-conglomeration.dpatch.
- * Adding patch from Eero Tamminen <eero.tamminen@nokia.com> to improve memory
- efficiencey when checking filesystems.
- * Adding patch to list alternative binary names in manpage synopsis
- (Closes: #284983).
- * Adding patch to not deny FAT32 auto-selection in mkdosfs manpage
- (Closes: #414183).
- * Adding patch to not use confusing 'drop' in dosfsck manpage where 'delete'
- in dosfsck manpage where 'delete' is meant (Closes: #134100).
- * Listing alternative binary names in long-description (Closes: #434381).
- * Updating manpage spelling patch to also cover wrong acknowledge header
- (Closes: #306659).
- * Breaking out manpage typos patch.
-
- -- Daniel Baumann <daniel@debian.org> Fri, 27 Jun 2008 09:03:00 +0200
-
-dosfstools (2.11-4) unstable; urgency=low
-
- * Redone debian packaging from scratch.
- * Both stop avoiding -O2 and stop adding -fno-strict-aliasing to OPTFLAGS on
- alpha; seems not to be required anymore.
- * Added patch from Jakub Jelinek <jakub@redhat.com> to support
- -D_FORTIFY_SOURCE=2 (for future use).
- * Added patch from Jeremy Katz <katzj@redhat.com> to add dosfslabel
- (originally by Peter Jones).
- * Added patch from Pavol Rusnak <prusnak@suse.cz> to use O_EXCL in mkdosfs.
- * Added patch from Petr Gajdos <pgajdos@suse.cz> to automatically determine
- sector size of the device.
-
- -- Daniel Baumann <daniel@debian.org> Thu, 26 Jun 2008 13:13:00 +0200
-
-dosfstools (2.11-3) unstable; urgency=low
-
- * New maintainer (Closes: #488018).
-
- -- Daniel Baumann <daniel@debian.org> Thu, 26 Jun 2008 12:31:00 +0200
-
-dosfstools (2.11-2.3) unstable; urgency=low
-
- * NMU
- * dpkg --print-gnu-build-architecture is gone, use dpkg-architecture
- instead. Closes: #407192
- * Fixed errors in the mkdosfs manpage that could cause confusion to
- readers, Thanks to Onno Benschop. Closes: #433561 (LP: #126121)
-
- -- Joey Hess <joeyh@debian.org> Mon, 10 Sep 2007 15:57:36 -0400
-
-dosfstools (2.11-2.2) unstable; urgency=low
-
- * Non-maintainer upload.
- * Apply Ubuntu patches. Closes: #417673
-
- -- Andreas Barth <aba@not.so.argh.org> Sat, 9 Jun 2007 21:18:21 +0000
-
-dosfstools (2.11-2.1) unstable; urgency=low
-
- * Non-maintainer upload.
- * Fix unaligned memory accesses which cause warnings to appear everytime
- the elilo bootloader script runs. This has led a number of users to
- believe their install has failed. Thanks to Khalid Aziz for the patch.
- Closes: #258839.
-
- -- dann frazier <dannf@debian.org> Thu, 9 Jun 2005 18:14:45 -0600
-
-dosfstools (2.11-2) unstable; urgency=low
-
- * Oops, debian/rules overrides OPTFLAGS and therefore the
- -D_FILE_OFFSET_BITS=64 in the toplevel Makefile had no effect; added
- $(shell getconf LFS_CFLAGS) to OPTFLAGS as suggested by Lars Wirzenius in
- #300126. Sorry, I tested a version compiled by the upstream Makefile...
- Closes: #300126, #301254.
- * #302517 was indeed the same as #294177, and fix is the same (use __u8) as
- in 2.11-1. Closes: #302517.
-
- -- Roman Hodek <roman@hodek.net> Sun, 3 Apr 2005 13:56:55 +0200
-
-dosfstools (2.11-1) unstable; urgency=low
-
- * New upstream version (Closes: #293394, #295181, #294177, #270023, #258402,
- #232482, #214656, #286219, #276834, #266254, #128800)
-
- -- Roman Hodek <roman@hodek.net> Sat, 12 Mar 2005 17:19:27 +0100
-
-dosfstools (2.10-1) unstable; urgency=low
-
- * New upstream version:
- - dosfsck: various 64-bit fixes and removed some warnings by Michal
- Cihar <mcihar@suse.cz>
- - mkdosfs: better error message if called without parameters (also
- suggested by Michal)
- * recompilation removed errno@GLIBC_2.0 symbol; Closes: #168540
- (probably already 2.9-1 did)
-
- -- Roman Hodek <roman@hodek.net> Mon, 22 Sep 2003 22:15:32 +0200
-
-dosfstools (2.9-1) unstable; urgency=low
-
- * New upstream version:
- (Closes: #156266, #139198, #152769, #152868, #181196)
- - dosfsck: if EOF from stdin, exit with error code
- - dosfsck: Fix potential for "Internal error: next_cluster on bad cluster".
- - dosfsck: When clearing long file names, don't overwrite the dir
- entries with all zeros, but put 0xe5 into the first byte.
- Otherwise, some OSes stop reading the directory at that point...
- - dosfsck: in statistics printed by -v, fix 32bit overflow in number
- of data bytes.
- - dosfsck: fix an potential overflow in "too many clusters" check
- - dosfsck: fix 64bit problem in fat.c (Debian bug #152769)
- - dosfsck: allow FAT size > 32MB.
- - dosfsck: allow for only one FAT
- - dosfsck: with -v, also check that last sector of the filesystem can
- be read (in case a partition is smaller than the fs thinks)
- - mkdosfs: add note in manpage that creating bootable filesystems is
- not supported.
- - mkdosfs: better error message with pointer to -I if target is a
- full-disk device.
- * debian/control: Added build dependency on debhelper (Closes: #168388)
- * debian/control: spelling fix (Closes: #124564)
- * debian/control: metion names of tools in description (Closes: #186047)
-
- -- Roman Hodek <roman@hodek.net> Thu, 15 May 2003 20:54:04 +0200
-
-dosfstools (2.8-1) unstable; urgency=low
-
- * New upstream version fixing an endless loop.
- (Closes: #87205, #86373, #87590)
-
- -- Roman Hodek <roman@hodek.net> Wed, 28 Feb 2001 17:23:16 +0100
-
-dosfstools (2.7-1) unstable; urgency=low
-
- * New upstream version with various bug fixes. (Closes: #83883)
- * Changed maintainer e-mail addr.
-
- -- Roman Hodek <roman@hodek.net> Wed, 14 Feb 2001 12:49:00 +0100
-
-dosfstools (2.6-1) unstable; urgency=low
-
- * New upstream version with various bug fixes.
-
- -- Roman Hodek <roman@hodek.net> Tue, 28 Nov 2000 17:27:35 +0100
-
-dosfstools (2.5-1) unstable; urgency=low
-
- * New upstream version fixing llseek() on alpha (Closes: #54145)
-
- -- Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> Fri, 7 Jan 2000 09:26:51 +0100
-
-dosfstools (2.4-1) unstable; urgency=low
-
- * New upstream version fixing compilation problem on alpha (Closes: #48331)
-
- -- Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> Tue, 26 Oct 1999 09:38:39 +0200
-
-dosfstools (2.3-1) unstable; urgency=low
-
- * New upstream version:
- - Manpage fixes.
- - Fixed usage message of mkdosfs.
- - Fixed compilation on alpha (llseek).
- - Fixed unaligned accesses on alpha (Closes: #47714)
- - Fixed renaming of files in dosfsck (extension wasn't really
- written). Closes: #45774
- * Remove bashisms from debian/rules.
- * FHS transition.
- * On alpha, omit -O2 and add -fno-strict-aliasing to OPTFLAGS, as
- otherwise the programs fail with unaligned traps.
- * FHS transition (Standards-Version 3.0.1).
-
- -- Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> Fri, 22 Oct 1999 13:30:59 +0200
-
-dosfstools (2.2-1) unstable; urgency=low
-
- * New upstream version. Closes: #40533
- * Updated copyright file for new location /usr/share/common-licenses/GPL.
- * Updated Standards-Version to 3.0.0.
-
- -- Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> Tue, 6 Jul 1999 16:07:22 +0200
-
-dosfstools (2.1-1) unstable; urgency=low
-
- * New upstream version.
- * Also installs symlinks mkfs.vfat and fsck.vfat,so that also
- filesystems listed with type "vfat" in /etc/fstab can be automatically
- checked.
-
- -- Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> Fri, 28 May 1999 11:25:17 +0200
-
-dosfstools (2.0-1) unstable; urgency=low
-
- * I'm now upstream maintainer, too.
- * Adapted debian/rules for new central Makefile and rewritten to
- debhelper.
- * Fixed harmless warnings in mkdosfs.c and fat.c.
- * mkdosfs.c: Return type of getopt() must be stored in an int, not in a
- char. (Showed up on powerpc, where chars are default unsigned.)
-
- -- Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> Fri, 30 Apr 1999 14:37:37 +0200
-
-dosfstools (1.0-16) unstable; urgency=low
-
- * Both tools are not maintained upstreams anymore, so I take over
- general maintainership now...
- * Both mkdosfs and dosfsck now support the FAT32 format. dosfsck
- automatically detects it. For mkdosfs, 32 is now a valid argument to
- -F, but FAT32 format isn't selected automatically (yet). With FAT32,
- you can also set the number of reserved sectors (-R) and location of
- the boot sector backup (-b) if you like (defaults are reasonable).
- * dosfsck can handle and check VFAT-style long filenames now. It uses
- the long names in listing etc. when available. There are also some
- checks on the structures of LFNs and some fixes for possible problems.
- * Implemented Atari format in both, dosfsck and mkdosfs. Under Atari TOS
- basically the same FAT format is used as under DOS, however, there are
- some little differences. Both tools now automatically select Atari
- format if they run on an Atari. You can switch between standard MS-DOS
- and Atari format with the -A option.
- * Applied patch by Giuliano Procida <gpp10@cus.cam.ac.uk> to add loop
- device support to mkdosfs: Usual floppy sizes are detected and
- parameters (media byte,...) are set up accordingly.
- My own additions to this: Don't die on loop devices that don't have
- such a floppy size, but use some default hd params. Added endianess
- conversions to Giulianos patch.
- * More/better data in boot sector dump of dosfsck -v.
- * Fixed lots of gcc warnings in the source. Removed -Wno-parentheses flag.
- * Made dosfsck -v a bit more verbose.
- * Extended README's for FAT32/LFN.
- * Written a README for Atari format differences.
- * Some minor cleanups in debian/rules.
- * Install README files as README.{mkdosfs,dosfsck,Atari}.gz.
- * AFAIK the tools still have alignment problems on Alpha machines.
- Someone wanted to send me a patch, but I haven't heard from him for
- months...
- * Set Standards-Version to 2.5.0.0 (no changes).
-
- -- Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> Wed, 28 Apr 1999 11:06:15 +0200
-
-dosfstools (1.0-15) frozen unstable; urgency=low
-
- * Applied patch by Juan Cespedes <cespedes@debian.org> to make mkdosfs
- work with newer 2.1 kernels again. (Fixes: #20320)
- * Remove CC=gcc in debian/rules to make cross-compiling possible.
-
- -- Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> Thu, 30 Apr 1998 17:09:08 +0200
-
-dosfstools (1.0-14) frozen unstable; urgency=medium
-
- * New maintainer
- * Ignore long name directory slots of VFAT, instead of trying to correct
- that "file names". Fixes: #20711
- * Don't consider file names with chars >= 128 to be bad, they're allowed.
-
- -- Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> Thu, 30 Apr 1998 10:00:16 +0200
-
-dosfstools (1.0-13) stable; urgency=low
-
- * Fixed nasty bug that caused every file with a name like xxxxxxxx.xxx
- to be treated as bad name that needed to be fixed. (closes: Bug#17389)
-
- -- Martin Schulze <joey@finlandia.infodrom.north.de> Thu, 26 Feb 1998 01:14:40 +0100
-
-dosfstools (1.0-12) stable; urgency=low
-
- * Moved executables and their links into /sbin (Bug#15037)
- * Corrected Standards-Version to 2.3.0.1
-
- -- Martin Schulze <joey@finlandia.infodrom.north.de> Fri, 9 Jan 1998 21:49:48 +0100
-
-dosfstools (1.0-11) stable; urgency=low
-
- * Applied patches to source files from Juan Cespedes which got lost in
- the last upload (Bug#16493, Bug#16494, Bug#16490)
- * build-stamp is now removed first in clean target (Bug#16491)
-
- -- Martin Schulze <joey@finlandia.infodrom.north.de> Sat, 3 Jan 1998 15:06:27 +0100
-
-dosfstools (1.0-10) stable; urgency=low
-
- * Added links for mkfs.msdos and fsck.msdos (Bug#15037)
- * Added links for mkfs.msdos.8 and fsck.msdos.8
- * Corrected source location
- * Rewrote bad_name() (Bug#9871, part 2)
- * s/int/time_t in check.c to omit a compiler warning (Bug#9871, part 3.1)
- * Modified defaults, interactive is the default now
- * Fixed renaming of files, they are saved now (Bug#9871, part 1)
- * Fixed return type of date_dos2unix (Bug#9871, part 3.2)
-
- -- Martin Schulze <joey@finlandia.infodrom.north.de> Wed, 31 Dec 1997 18:59:53 +0100
-
-dosfstools (1.0-9.1) unstable; urgency=low
-
- * Non-maintainer release
- * .diff file was wrong in 1.0-9; fixed (Bug#13102)
- * Fixed endianess patches (fixes Bug#11648)
- * Built with libc6
-
- -- Juan Cespedes <cespedes@etsit.upm.es> Thu, 23 Oct 1997 23:19:34 +0200
-
-dosfstools (1.0-9) stable; urgency=low
-
- * Added endianess patches from Frank Neumann
- <Frank.Neumann@Informatik.Uni-Oldenburg.DE> (Bug#9959)
- * Updated Werner Almesbergers address
- * Added -I switch to mkdosfs to allow full disk devices (Bug#10789)
-
- -- Martin Schulze <joey@finlandia.infodrom.north.de> Sun, 20 Jul 1997 14:51:33 +0200
-
-dosfstools (1.0-8) stable; urgency=low
-
- * Fixed typo in mkdosfs.c (Bug#7396)
-
- * New maintainer address
-
- -- Martin Schulze <joey@infodrom.north.de> Mon, 28 Apr 1997 12:51:13 +0200
-
-dosfstools (1.0-7) stable; urgency=low
-
- * Minor fixes
-
- * Converted to Standards-Version 2.1.1.2
-
- -- Martin Schulze <joey@debian.org> Sat, 8 Feb 1997 15:03:52 +0100
-
-Mon Jan 20 22:45:23 1997 Martin Schulze <joey@finlandia.infodrom.north.de>
-
- * debian.control: Corrected otherfs to otherosfs :-)
-
-Sun Jan 19 23:57:09 1997 Martin Schulze <joey@finlandia.infodrom.north.de>
-
- * mkdosfs.c: Removed one line printing out debug information.
-
-Wed Jan 15 00:25:02 1997 Martin Schulze <joey@finlandia.infodrom.north.de>
-
- * mkdosfs.c: Modified code to work properly under AXP. Thanks to
- Matt Gundry <mjgundry@primenet.com> for contacting me and
- providing patched sources.
-
-Mon Jan 13 13:00:14 1997 Martin Schulze <joey@finlandia.infodrom.north.de>
-
- * mkdosfs.c: Added patch from Sven Rudolph <sr1@inf.tu-dresden.de>
- to support creation on disk images as well.
-
-Tue Jan 7 12:04:21 1997 Martin Schulze <joey@finlandia.infodrom.north.de>
-
- * Moved into section 'otherfs'
-
--- Released 1.0-4
-
-Sun Dec 22 11:28:03 1996 Martin Schulze <joey@finlandia.infodrom.north.de>
-
- * debian.rules: Installed ChangeLog
-
-Wed Aug 7 19:07:15 1996 Martin Schulze <joey@finlandia.infodrom.north.de>
-
- * Corrected debian.rules to provide $(package)_$(revision).diff.gz
-
-Mon Aug 5 11:13:34 1996 Martin Schulze <joey@finlandia.infodrom.north.de>
-
- * Added Conflicts: and Provides: entries in control file to really
- replace mkdosfs. Thanks to Michael Meskes for reporting this bug.
-
-Thu Jul 18 22:01:34 1996 Martin Schulze <joey@finlandia.infodrom.north.de>
-
- * added dosfscheck to the package
-
-Wed Jul 3 00:57:23 1996 Martin Schulze <joey@finlandia.infodrom.north.de>
-
- * Added debian specific files
-
- * mkdosfs.c: inserted some brackets to stop gcc from moaning
-
- * mkdosfs.8: corrected some bold/inverse text phrases
-
- * mkdosfs.c: initialized a variable to stop gcc from moaning
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index 7f8f011..0000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-7
diff --git a/debian/control b/debian/control
deleted file mode 100644
index 0c19ad0..0000000
--- a/debian/control
+++ /dev/null
@@ -1,35 +0,0 @@
-Source: dosfstools
-Section: otherosfs
-Priority: optional
-Maintainer: Daniel Baumann <daniel@debian.org>
-Build-Depends: debhelper (>= 7)
-Standards-Version: 3.8.0
-Homepage: http://www.daniel-baumann.ch/software/dosfstools/
-Vcs-Browser: http://git.debian.net/?p=debian/dosfstools.git
-Vcs-Git: git://git.debian.net/git/debian/dosfstools.git
-
-Package: dosfstools
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}
-Description: utilities for making and checking MS-DOS FAT filesystems
- The dosfstools package includes the mkdosfs (aka mkfs.dos and mkfs.vfat) and
- dosfsck (aka fsck.msdos and fsck.vfat) utilities, which respectively make and
- check MS-DOS FAT filesystems on hard drives or on floppies.
- .
- This version uses the enhanced boot sector/superblock format of DOS 3.3+ as
- well as provides a default dummy boot sector code.
-
-Package: dosfstools-dbg
-Section: devel
-Priority: extra
-Architecture: any
-Depends: dosfstools (= ${binary:Version})
-Description: utilities for making and checking MS-DOS FAT filesystems (debug)
- The dosfstools package includes the mkdosfs (aka mkfs.dos and mkfs.vfat) and
- dosfsck (aka fsck.msdos and fsck.vfat) utilities, which respectively make and
- check MS-DOS FAT filesystems on hard drives or on floppies.
- .
- This version uses the enhanced boot sector/superblock format of DOS 3.3+ as
- well as provides a default dummy boot sector code.
- .
- This package contains the debugging symbols.
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index ad967ff..0000000
--- a/debian/copyright
+++ /dev/null
@@ -1,88 +0,0 @@
-Author: Daniel Baumann <daniel@debian.org>
-Download: http://www.daniel-baumann.ch/software/dosfstools/
-
-Files: *
-Copyright: (C) 1999-2005 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-License: GPL-2+
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- .
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- .
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- .
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-2 file.
-
-Files: dosfsck/*
-Copyright:
- (C) 1999-2005 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
- (C) 1999-2005 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-License: GPL-2+
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- .
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- .
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- .
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-2 file.
-
-Files: mkdosfs/*
-Copyright:
- (C) 1993-1994 David Hudson <dave@humbug.demon.co.uk>
- (C) 1991 Linus Torvalds <torvalds@klaava.helsinki.fi>
- (C) 1992-1993 Remy Card <card@masi.ibp.fr>
- (C) 1999-2005 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-License: GPL-2+
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- .
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- .
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- .
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-2 file.
-
-Files: debian/*
-Copyright: (C) 2008 Daniel Baumann <daniel@debian.org>
-License: GPL-2+
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- .
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- .
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- .
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-2 file.
diff --git a/debian/doc/HISTORY b/debian/doc/HISTORY
deleted file mode 100644
index 1b769bd..0000000
--- a/debian/doc/HISTORY
+++ /dev/null
@@ -1,20 +0,0 @@
-This package was put together by Martin Schulze <joey@infodrom.north.de>, from
-sources obtained from:
- sunsite.unc.edu:/pub/Linux/system/filesystems/dosfs/mkdosfs-ygg-0.3b.lsm
- sunsite.unc.edu:/pub/Linux/system/filesystems/dosfs/mkdosfs-ygg-0.3b.tar.gz
- sunsite.unc.edu:/pub/Linux/system/filesystems/dosfs/dosfsck.1.tar.z
-
-Mkdosfs is copyrighted by Dave Hudson <dave@humbug.demon.co.uk>, and was later
-maintained and improved by H. Peter Anvin <hpa@yggdrasil.com>. Dave has put the
-whole package under the GPL.
-
-Dosfsck is copyrighted by Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
-and Roman Hodek. We both together put the package under the GPL.
-
-The FAT32, LFN, and Atari format additions are copyrighted by Roman Hodek
-<Roman.Hodek@informatik.uni-erlangen.de> and are under the GPL, too.
-
-Both tools (mkdosfs and dosfsck) have been unmaintained since some time, so I
-also took them over as upstream maintainer. The merged package is named
-dosfstools-2.0, and its home site is now
- ftp.uni-erlangen.de:/pub/Linux/LOCAL/dosfstools
diff --git a/debian/docs b/debian/docs
deleted file mode 100644
index 5ec07b2..0000000
--- a/debian/docs
+++ /dev/null
@@ -1 +0,0 @@
-debian/doc/*
diff --git a/debian/patches/14-bootcode.dpatch b/debian/patches/14-bootcode.dpatch
deleted file mode 100644
index 2d58349..0000000
--- a/debian/patches/14-bootcode.dpatch
+++ /dev/null
@@ -1,235 +0,0 @@
-#!/bin/sh /usr/share/dpatch/dpatch-run
-## 14-bootcode.dpatch by Sam Bingner <sam@bingner.com>
-##
-## DP: Adds option for using a bootcode template (Closes: #303442).
-
-@DPATCH@
-
-diff -Naurp dosfstools.orig/mkdosfs/ChangeLog dosfstools/mkdosfs/ChangeLog
---- dosfstools.orig/mkdosfs/ChangeLog 2008-06-27 05:37:31.000000000 +0000
-+++ dosfstools/mkdosfs/ChangeLog 2008-06-27 06:44:05.000000000 +0000
-@@ -1,3 +1,14 @@
-+19th June 2003 Sam Bingner (sam@bingner.com)
-+
-+ Added option to read in bootcode from a file so that if you have
-+ for example Windows 2000 boot code, you can have it write that
-+ as the bootcode. This is a dump of the behinning of a partition
-+ generally 512 bytes, but can be up to reserved sectors*512 bytes.
-+ Also writes 0x80 as the BIOS drive number if we are formatting a
-+ hard drive, and sets the number of hidden sectors to be the
-+ number of sectors in one track. These were required so that DOS
-+ could boot using the bootcode.
-+
- 28th January 1995 H. Peter Anvin (hpa@yggdrasil.com)
-
- Better algorithm to select cluster sizes on large filesystems.
-diff -Naurp dosfstools.orig/mkdosfs/mkdosfs.8 dosfstools/mkdosfs/mkdosfs.8
---- dosfstools.orig/mkdosfs/mkdosfs.8 2008-06-27 06:34:35.000000000 +0000
-+++ dosfstools/mkdosfs/mkdosfs.8 2008-06-27 06:44:05.000000000 +0000
-@@ -44,6 +44,10 @@
- .I message-file
- ]
- [
-+.B \-B
-+.I bootcode-file
-+]
-+[
- .B \-n
- .I volume-name
- ]
-@@ -163,6 +167,18 @@ file must not exceed 418 bytes once line
- carriage return-line feed combinations, and tabs have been expanded.
- If the filename is a hyphen (-), the text is taken from standard input.
- .TP
-+.BI \-B " bootcode-file"
-+Uses boot machine code from file "file". On any thing other than FAT32,
-+this only writes the first 3 bytes, and 480 bytes from offset 3Eh. On
-+FAT32, this writes the first 3 bytes, 420 bytes from offset 5Ah to both
-+primary and backup boot sectors. Also writes all other reserved sectors
-+excluding the sectors following boot sectors (usually sector 2 and 7).
-+Does not require that the input file be as large as reserved_sectors*512.
-+To make a FAT32 partition bootable, you will need at least the first
-+13 sectors (6656 bytes). You can also specify a partition as the argument
-+to clone the boot code from that partition.
-+i.e mkdosfs -B /dev/sda1 /dev/sda1
-+.TP
- .BI \-n " volume-name"
- Sets the volume name (label) of the file system. The volume name can
- be up to 11 characters long. The default is no label.
-diff -Naurp dosfstools.orig/mkdosfs/mkdosfs.c dosfstools/mkdosfs/mkdosfs.c
---- dosfstools.orig/mkdosfs/mkdosfs.c 2008-06-27 06:34:35.000000000 +0000
-+++ dosfstools/mkdosfs/mkdosfs.c 2008-06-27 06:50:19.000000000 +0000
-@@ -24,6 +24,12 @@
- - New options -A, -S, -C
- - Support for filesystems > 2GB
- - FAT32 support
-+
-+ Fixes/additions June 2003 by Sam Bingner
-+ <sam@bingner.com>:
-+ - Add -B option to read in bootcode from a file
-+ - Write BIOS drive number so that FS can properly boot
-+ - Set number of hidden sectors before boot code to be one track
-
- Copying: Copyright 1993, 1994 David Hudson (dave@humbug.demon.co.uk)
-
-@@ -153,6 +159,8 @@ cdiv (int a, int b)
- #define FAT_BAD 0x0ffffff7
-
- #define MSDOS_EXT_SIGN 0x29 /* extended boot sector signature */
-+#define HD_DRIVE_NUMBER 0x80 /* Boot off first hard drive */
-+#define FD_DRIVE_NUMBER 0x00 /* Boot off first floppy drive */
- #define MSDOS_FAT12_SIGN "FAT12 " /* FAT12 filesystem signature */
- #define MSDOS_FAT16_SIGN "FAT16 " /* FAT16 filesystem signature */
- #define MSDOS_FAT32_SIGN "FAT32 " /* FAT32 filesystem signature */
-@@ -175,6 +183,8 @@ cdiv (int a, int b)
- #define BOOTCODE_SIZE 448
- #define BOOTCODE_FAT32_SIZE 420
-
-+#define MAX_RESERVED 0xFFFF
-+
- /* __attribute__ ((packed)) is used on all structures to make gcc ignore any
- * alignments */
-
-@@ -202,7 +212,7 @@ struct msdos_boot_sector
- __u16 fat_length; /* sectors/FAT */
- __u16 secs_track; /* sectors per track */
- __u16 heads; /* number of heads */
-- __u32 hidden; /* hidden sectors (unused) */
-+ __u32 hidden; /* hidden sectors (one track) */
- __u32 total_sect; /* number of sectors (if sectors == 0) */
- union {
- struct {
-@@ -285,6 +295,8 @@ char dummy_boot_code[BOOTCODE_SIZE] =
-
- /* Global variables - the root of all evil :-) - see these and weep! */
-
-+static char *template_boot_code; /* Variable to store a full template boot sector in */
-+static int use_template = 0;
- static char *program_name = "mkdosfs"; /* Name of the program */
- static char *device_name = NULL; /* Name of the device on which to create the filesystem */
- static int atari_format = 0; /* Use Atari variation of MS-DOS FS format */
-@@ -837,6 +849,12 @@ setup_tables (void)
- vi->volume_id[2] = (unsigned char) ((volume_id & 0x00ff0000) >> 16);
- vi->volume_id[3] = (unsigned char) (volume_id >> 24);
- }
-+ if (bs.media == 0xf8) {
-+ vi->drive_number = HD_DRIVE_NUMBER; /* Set bios drive number to 80h */
-+ }
-+ else {
-+ vi->drive_number = FD_DRIVE_NUMBER; /* Set bios drive number to 00h */
-+ }
-
- if (!atari_format) {
- memcpy(vi->volume_label, volume_name, 11);
-@@ -881,7 +899,7 @@ setup_tables (void)
- printf( "Using %d reserved sectors\n", reserved_sectors );
- bs.fats = (char) nr_fats;
- if (!atari_format || size_fat == 32)
-- bs.hidden = CT_LE_L(hidden_sectors);
-+ bs.hidden = bs.secs_track;
- else {
- /* In Atari format, hidden is a 16 bit field */
- __u16 hidden = CT_LE_W(hidden_sectors);
-@@ -1362,6 +1380,32 @@ write_tables (void)
- * dir area on FAT12/16, and the first cluster on FAT32. */
- writebuf( (char *) root_dir, size_root_dir, "root directory" );
-
-+ if (use_template == 1) {
-+ /* dupe template into reserved sectors */
-+ seekto( 0, "Start of partition" );
-+ if (size_fat == 32) {
-+ writebuf( template_boot_code, 3, "backup jmpBoot" );
-+ seekto( 0x5a, "sector 1 boot area" );
-+ writebuf( template_boot_code+0x5a, 420, "sector 1 boot area" );
-+ seekto( 512*2, "third sector" );
-+ if (backup_boot != 0) {
-+ writebuf( template_boot_code+512*2, backup_boot*sector_size - 512*2, "data to backup boot" );
-+ seekto( backup_boot*sector_size, "backup boot sector" );
-+ writebuf( template_boot_code, 3, "backup jmpBoot" );
-+ seekto( backup_boot*sector_size+0x5a, "backup boot sector boot area" );
-+ writebuf( template_boot_code+0x5a, 420, "backup boot sector boot area" );
-+ seekto( (backup_boot+2)*sector_size, "sector following backup code" );
-+ writebuf( template_boot_code+(backup_boot+2)*sector_size, (reserved_sectors-backup_boot-2)*512, "remaining data" );
-+ } else {
-+ writebuf( template_boot_code+512*2, (reserved_sectors-2)*512, "remaining data" );
-+ }
-+ } else {
-+ writebuf( template_boot_code, 3, "jmpBoot" );
-+ seekto( 0x3e, "sector 1 boot area" );
-+ writebuf( template_boot_code+0x3e, 448, "boot code" );
-+ }
-+ }
-+
- if (blank_sector) free( blank_sector );
- if (info_sector) free( info_sector );
- free (root_dir); /* Free up the root directory space from setup_tables */
-@@ -1376,7 +1420,7 @@ usage (void)
- {
- fatal_error("\
- Usage: mkdosfs [-A] [-c] [-C] [-v] [-I] [-l bad-block-file] [-b backup-boot-sector]\n\
-- [-m boot-msg-file] [-n volume-name] [-i volume-id]\n\
-+ [-m boot-msg-file] [-n volume-name] [-i volume-id] [-B bootcode]\n\
- [-s sectors-per-cluster] [-S logical-sector-size] [-f number-of-FATs]\n\
- [-h hidden-sectors] [-F fat-size] [-r root-dir-entries] [-R reserved-sectors]\n\
- /dev/name [blocks]\n");
-@@ -1440,7 +1484,7 @@ main (int argc, char **argv)
- printf ("%s " VERSION " (" VERSION_DATE ")\n",
- program_name);
-
-- while ((c = getopt (argc, argv, "Ab:cCf:F:Ii:l:m:n:r:R:s:S:h:v")) != EOF)
-+ while ((c = getopt (argc, argv, "AB:b:cCf:F:Ii:l:m:n:r:R:s:S:h:v")) != EOF)
- /* Scan the command line for options */
- switch (c)
- {
-@@ -1510,6 +1554,51 @@ main (int argc, char **argv)
- listfile = optarg;
- break;
-
-+ case 'B': /* B : read in bootcode */
-+ if ( strcmp(optarg, "-") )
-+ {
-+ msgfile = fopen(optarg, "r");
-+ if ( !msgfile )
-+ perror(optarg);
-+ }
-+ else
-+ msgfile = stdin;
-+
-+ if ( msgfile )
-+ {
-+ if (!(template_boot_code = malloc( MAX_RESERVED )))
-+ die( "Out of memory" );
-+ /* The template boot sector including reserved must not be > 65535 */
-+ use_template = 1;
-+ i = 0;
-+ do
-+ {
-+ ch = getc(msgfile);
-+ switch (ch)
-+ {
-+ case EOF:
-+ break;
-+
-+ default:
-+ template_boot_code[i++] = ch; /* Store character */
-+ break;
-+ }
-+ }
-+ while ( ch != EOF && i < MAX_RESERVED );
-+ ch = getc(msgfile); /* find out if we're at EOF */
-+
-+ /* Fill up with zeros */
-+ while( i < MAX_RESERVED )
-+ template_boot_code[i++] = '\0';
-+
-+ if ( ch != EOF )
-+ printf ("Warning: template too long; truncated after %d bytes\n", i);
-+
-+ if ( msgfile != stdin )
-+ fclose(msgfile);
-+ }
-+ break;
-+
- case 'm': /* m : Set boot message */
- if ( strcmp(optarg, "-") )
- {
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index f1c4e7d..0000000
--- a/debian/rules
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/make -f
-
-clean:
- dh_testdir
- dh_testroot
- rm -f build-stamp
-
- $(MAKE) distclean
-
- dh_clean
-
-build: build-stamp
-build-stamp:
- dh_testdir
-
- $(MAKE)
-
- touch build-stamp
-
-install: build
- dh_testdir
- dh_testroot
- dh_prep
- dh_installdirs
-
- $(MAKE) DESTDIR=$(CURDIR)/debian/dosfstools PREFIX=/usr SBINDIR=/sbin install
-
-binary: binary-arch
-
-binary-arch: build install
- dh_testdir
- dh_testroot
- dh_installchangelogs ChangeLog
- dh_installdocs
- dh_strip --dbg-package=dosfstools-dbg
- dh_compress
- dh_fixperms
- dh_installdeb
- dh_shlibdeps
- dh_gencontrol
- dh_md5sums
- dh_builddeb
-
-binary-indep:
-
-.PHONY: clean build install binary binary-arch binary-indep
diff --git a/doc/ANNOUNCE.mkdosfs b/doc/ANNOUNCE.mkdosfs
deleted file mode 100644
index 1f02ea2..0000000
--- a/doc/ANNOUNCE.mkdosfs
+++ /dev/null
@@ -1,41 +0,0 @@
-Announcing the release of mkdosfs version 0.3b (Yggdrasil)
-
-It seems I didn't get the bug completely fixed in 0.3a. Some
-borderline cases would still allocate too many sectors for the FAT.
-Again, nothing to worry about, just a nitpick -- this one would only
-in certain cases add one sector per FAT.
-
-Announcing the release of mkdosfs version 0.3a (Yggdrasil)
-
-Fixed a bug which would cause too many sectors to be reserved for the
-FAT (filesystem will still work fine, but have slightly less space
-available).
-
-Announcing the release of mkdosfs version 0.3 (Yggdrasil)
-
-This version correctly handles even very large filesystems, and
-properly supports the modern (3.3+) DOS bootsector format, including a
-message printed on boot attempts.
-
-Peter Anvin
-Yggdrasil Computing, Inc.
-hpa@yggdrasil.com
-
- --------------
-
-Announcing the release of mkdosfs version 0.2
-
-
-I've just uploaded mkdosfs to sunsite.unc.edu. It works in a similar way
-to Remy Card's mke2fs, but creates an MS-DOS file system.
-
-The filename is mkdosfs-0.2.tar.gz.
-
-This second release should fix a small bug that could lead to FAT sizes that
-Linux's dosfs would accept but MS-DOS wouldn't.
-
-The archive contains a manual page, binary and source versions.
-
-
-Dave Hudson
-dave@humbug.demon.co.uk
diff --git a/doc/ChangeLog.dosfsck b/doc/ChangeLog.dosfsck
deleted file mode 100644
index f628ac2..0000000
--- a/doc/ChangeLog.dosfsck
+++ /dev/null
@@ -1,10 +0,0 @@
-Changes from version 0 to 1
-===========================
-
- - fixed an off-by-two error in check.c:check_file
- - fixed marking clusters bad in fat.c:set_fat
- - fat.c:reclaim_free was also reclaiming bad clusters.
- - fixed many incorrect byte sex conversions in check.c and fat.c
- - -t and -w now require -a or -r
- - added option -d to drop files.
- - added option -u to try to "undelete" non-directory files.
diff --git a/doc/ChangeLog.dosfstools-2.x b/doc/ChangeLog.dosfstools-2.x
deleted file mode 100644
index 7ed9efe..0000000
--- a/doc/ChangeLog.dosfstools-2.x
+++ /dev/null
@@ -1,161 +0,0 @@
-version 2.11
-============
-
- - all: don't use own llseek() anymore, glibc lseek() does everything we need
- - dosfsck: lfn.c: avoid segfault
- - dosfsck: check.c, lfn.c: check for orphaned LFN slots
- - dosfsck: check.c alloc_rootdir_entry(): set owner of newly alloced clusters
- - dosfsck: dosfsck.h: better use <byteswap.h> for byte swapping
- - dosfsck: io.c: added code for real DOS
- - mkdosfs: raised FAT12_THRESHOLD from 4078 to 4085, introduced MIN_CLUST_32
- - mkdosfs: fix loop device size
- - mkdosfs: by default, use FAT32 on devices >= 512MB
- - mkdosfs: fix a memory leak (blank_sector)
- - mkdosfs: fix parsing of number of blocks on command line, so that numbers
- >2G can be used
- - mkdosfs: add 'b' to getopt() string so this option can be used :)
- - mkdosfs: fix parsing of -i arg (should be unsigned)
- - mkdosfs: change default permissions of created images (-C) to 0666 & ~umask
- - mkdosfs: relax geometry check: if HDIO_GETGEO fails, print a warning and
- default to H=255,S=63
- - dosfsck: new option -n (no-op): just check non-interactively, but
- don't write anything to filesystem
- - A few #include changes to support compilation with linux 2.6
- headers (thanks to Jim Gifford <jim@jg555.com>)
- - dosfsck: remove directory entries pointing to start cluster 0, if they're
- not "." or ".." entries that should actually point to the root dir
- (pointed out by Thomas Winkler <twinkler@sysgo.de>)
- - mkdosfs: new option -h to set number of hidden sectors
- (thanks to Godwin Stewart <gstewart@spamcop.net>)
- - all: updated my mail address everywhere...
-
-version 2.10
-============
-
- - dosfsck: various 64-bit fixes and removed some warnings by Michal
- Cihar <mcihar@suse.cz>
- - mkdosfs: better error message if called without parameters (also
- suggested by Michal)
-
-version 2.9
-===========
-
- - dosfsck: if EOF from stdin, exit with error code
- - dosfsck: Fix potential for "Internal error: next_cluster on bad cluster".
- - dosfsck: When clearing long file names, don't overwrite the dir
- entries with all zeros, but put 0xe5 into the first byte.
- Otherwise, some OSes stop reading the directory at that point...
- - dosfsck: in statistics printed by -v, fix 32bit overflow in number
- of data bytes.
- - dosfsck: fix an potential overflow in "too many clusters" check
- - dosfsck: fix 64bit problem in fat.c (Debian bug #152769)
- - dosfsck: allow FAT size > 32MB.
- - dosfsck: allow for only one FAT
- - dosfsck: with -v, also check that last sector of the filesystem can
- be read (in case a partition is smaller than the fs thinks)
- - mkdosfs: add note in manpage that creating bootable filesystems is
- not supported.
- - mkdosfs: better error message with pointer to -I if target is a
- full-disk device.
-
-version 2.8
-===========
-
- - dosfsck: Fixed endless loop whenever a volume label was present.
-
-version 2.7
-===========
-
- - dosfsck: Don't check volume label for bad characters, everything
- seems to be allowed there... Also ignore duplicate names where one of
- them is a volume label.
-
-version 2.6
-===========
-
- - mkdosfs: Added correct heads definition for 2.88M floppies if not
- created via loopback.
- - dosfsck: If boot sector and its backup are different (FAT32), offer
- to write the backup to sector 0. (tnx to Pavel Roskin for this)
- - For 64 bit alpha, struct bootsector in dosfsck.h must be defined
- with __attribute__((packed)).
- - mkdosfs now actually accepts -R option. (tnx to David Kerrawn)
- - Fixed typo in dosfsck boot.c (recognition of boot signature in FSINFO)
- - Various compilation fixes for 2.4 kernel headers and for ia64.
-
-version 2.5
-===========
-
- - The llseek() implementation for alpha didn't really work; fixed it.
-
-version 2.4
-===========
-
- - Fix compiling problem on alpha (made a silly typo...)
-
-version 2.3
-===========
-
- - mkdosfs: Fixed usage message (printed only "bad address").
- - both: made man pages and usage statements more consistent.
- - both: fix llseek function for alpha.
- - dosfsck: fix reading of unaligned fields in boot sector for alpha.
- - dosfsck: fixed renaming of files (extension wasn't really written).
-
-version 2.2
-===========
-
- - Added dosfsck/COPYING, putting dosfsck officially under GPL (Werner
- and I agree that it should be GPL).
- - mkdosfs: Allow creation of a 16 bit FAT on filesystems that are too
- small for it if the user explicitly selected FAT16 (but a warning
- is printed). Formerly, you got the misleading error message "make
- the fs a bit smaller".
- - dosfsck: new option -y as synonym for -y; for compability with
- other fs checkers, which also accept this option.
- - dosfsck: Now prints messages similar to e2fsck: at start version
- and feature list; at end number of files (and directories) and
- number of used/total clusters. This makes the printouts of *fsck at
- boot time nicer.
- - dosfsck: -a (auto repair) now turns on -f (salvage files), too. -a
- should act as non-destructive as possible, so lost clusters should
- be assigned to files. Otherwise the data in them might be
- overwritten later.
- - dosfsck: Don't drop a directory with lots of bad entries in
- auto-repair mode for the same reason as above.
- - dosfsck: avoid deleting the whole FAT32 root dir if something is
- wrong with it (bad start cluster or the like).
- - general: also create symlinks {mkfs,fsck}.vfat.8 to the respective
- real man pages.
-
-version 2.1
-===========
-
- - Fix some forgotten loff_t's for filesystems > 4GB. (Thanks to
- <ki@kretz.co.at>).
- - Fix typo in mkdosfs manpage.
- - Removed inclusion of <linux/loop.h> from mkdosfs.c; it's unnecessary and
- caused problems in some environments.
- - Fix condition when to expect . and .. entries in a directory. (Was
- wrong for non-FAT32 if first entry in root dir was a directory also.)
- - Also create mkfs.vfat and fsck.vfat symlinks, so that also
- filesystems listed with type "vfat" in /etc/fstab can be
- automatically checked.
-
-version 2.0
-===========
-
- - merge of mkdosfs and dosfstools in one package
- - new maintainer: Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
- - FAT32 support in both mkdosfs and dosfsck
- - VFAT (long filename) support in dosfsck
- - Support for Atari variant of MS-DOS filesystem in both tools
- - Working support for big-endian systems in both tools
- - Better support for loop devices in mkdosfs: usual floppy sizes are
- detected and media byte etc. set accordingly; if loop fs has no
- standard floppy size, use hd params
- (mainly by Giuliano Procida <gpp10@cus.cam.ac.uk>)
- - Removed lots of gcc warnings
- - Fixed some minor calculation bugs in mkdosfs.
-
-For change logs previous to 2.0, see the CHANGES files in the subdirectories.
diff --git a/doc/ChangeLog.mkdosfs b/doc/ChangeLog.mkdosfs
deleted file mode 100644
index e39d9d6..0000000
--- a/doc/ChangeLog.mkdosfs
+++ /dev/null
@@ -1,18 +0,0 @@
-28th January 1995 H. Peter Anvin (hpa@yggdrasil.com)
-
- Better algorithm to select cluster sizes on large filesystems.
- Added bogus boot sector code that on attempts to boot prints a
- message (which can be chosen at mkdosfs time) and lets the user
- press any key and try again. Corrected support for 1.2 Mb
- floppies. mkdosfs now generates the extended bootsector
- (superblock) format of DOS 3.3+, with support for volume ID's and
- volume labels (volume labels are also written to the root
- directory, as they should).
-
-18th February 1994 Dave Hudson (dave@humbug.demon.co.uk)
-
- Released version 0.2 - clears a bug in the FAT sizing code.
-
-1st September 1993 Dave Hudson (dave@humbug.demon.co.uk)
-
- Released version 0.1 - ALPHA release of mkdosfs
diff --git a/doc/README.dosfsck b/doc/README.dosfsck
deleted file mode 100644
index 7b351aa..0000000
--- a/doc/README.dosfsck
+++ /dev/null
@@ -1,60 +0,0 @@
-dosfsck, version 1
-==================
-
-WARNING: This is ALPHA test software. Use at your own risk.
-
-dosfsck is the Linux equivalent of PC/MS-DOS' CHKDSK. It checks the
-consistency of PC/MS-DOS file systems and optionally tries to repair
-them. The tests dosfsck performs are described in the man page.
-
-dosfsck needs header files from dosfs.9 (or later) to compile.
-
-Before using dosfsck to repair a file system that contains data of any
-value, you should verify that dosfsck is able to correct all reported
-errors. (Except fatal errors and those reported as unfixable, of
-course.) In order to do this, run it with the -V option, e.g.
-
- dosfsck -V /dev/sda1 (automatic check)
-or dosfsck -V -r /dev/sda1 (interactive check and repair)
-
-dosfsck will perform two passes: in the first pass, inconsistencies are
-detected and a list of changes to correct the problems is generated. In
-the second pass, those changes are applied whenever dosfsck reads data
-from disk. Hence no fixable errors should be reported in the second
-pass if the first pass was successful.
-
-Please notify the author if fixable errors are reported in the second
-pass.
-
-After verifying that dosfsck appears to be able to perform the desired
-operations, either confirm that you want the changes to be performed
-(if dosfsck was started with -r) or re-run dosfsck with the -a option
-(if it was started without -r).
-
-Please send bug reports, comments, flames, etc. to
-almesber@nessie.cs.id.ethz.ch or almesber@bernina.ethz.ch
-
-- Werner
-
-FAT32 and LFN support
-=====================
-
-I've finally implemented some of the new features of MS-DOS
-filesystems: FAT32 and long filenames.
-
-FAT32 is automatically detected and of course the different FAT
-structure is handled. (Internally many changes were needed, so 32 bit
-variables for all cluster numbers and 64 bit vars for offsets inside
-the filesystem.) New checks for FAT32 are most notably on the backup
-boot sector and the new info sector. Also the possibility that the
-root directory resides in a cluster chain (instead of in a static
-area) on FAT32 is handled.
-
-dosfscheck also knows about VFAT long filenames now. It parses those
-names and uses them in listings etc. when available. There are also
-some checks on the (cruel) structure of how LFNs are stored and some
-attempts to fix problems.
-
-- Roman <roman@hodek.net>
-
-BTW, version 2 isn't ALPHA anymore :-)
diff --git a/doc/README.dosfstools-2.x b/doc/README.dosfstools-2.x
deleted file mode 100644
index 5fb00ed..0000000
--- a/doc/README.dosfstools-2.x
+++ /dev/null
@@ -1,60 +0,0 @@
-
-Atari format support
-====================
-
-Both mkdosfs and dosfsck now can also handle the Atari variation of
-the MS-DOS filesystem format. The Atari format has some minor
-differences, some caused by the different machine architecture (m68k),
-some being "historic" (Atari didn't change some things that M$
-changed).
-
-Both tools automatically select Atari format if they run on an Atari.
-Additionally the -A switch toggles between Atari and MS-DOS format.
-I.e., on an Atari it selects plain DOS format, on any other machine it
-switches to Atari format.
-
-The differences are in detail:
-
- - Atari TOS doesn't like cluster sizes != 2, so the usual solution
- for bigger partitions was to increase the logical sector size. So
- mkdosfs can handle sector sizes != 512 now, you can also manually
- select it with the -S option. On filesystems larger than approx. 32
- MB, the sector size is automatically increased (stead of the
- cluster size) to make the filesystem fit. mkdosfs will always use 2
- sectors per cluster (also with the floppy standard configurations),
- except when directed otherwise on the command line.
-
- - From the docs, all values between 0xfff8 and 0xffff in the FAT mark
- an end-of-file. However, DOS usually uses 0xfff8 and Atari 0xffff.
- This seems to be only an consmetic difference. At least TOS doesn't
- complain about 0xffff EOF marks. Don't know what DOS thinks of
- 0xfff8 :-) Anyway, both tools use the EOF mark common to the
- system (DOS/Atari).
-
- - Something similar of the bad cluster marks: On Atari the FAT values
- 0xfff0 to 0xfff7 are used for this, under DOS only 0xfff7 (the
- others can be normal cluster numbers, allowing 7 more clusters :-)
- However, both systems usually mark with 0xfff7. Just dosfsck has to
- interpret 0xfff0...0xfff7 differently.
-
- - Some fields in the boot sector are interpreted differently. For
- example, Atari has a disk serial number (used to aid disk change
- detection) where DOS stores the system name; the 'hidden' field is
- 32 bit for DOS, but 16 bit for Atari, and there's no 'total_sect'
- field; the 12/16 bit FAT decision is different: it's not based on
- the number of clusters, but always FAT12 on floppies and FAT16 on
- hard disks. mkdosfs nows about these differences and constructs the
- boot sector accordingly.
-
- - In dosfsck, the boot sector differences also have to known, to not
- warn about things that are no error on Atari. In addition, most
- Atari formatting tools fill the 'tracks' and 'heads' fields with 0
- for hard disks, because they're meaningless on SCSI disks (Atari
- has/had no IDE). Due to this, the check that they should be
- non-zero is switched off.
-
- - Under Atari TOS, some other characters are illegal in filenames:
- '<', '>', '|', '"', and ':' are allowed, but all non-ASCII chars
- (codes >= 128) are forbidden.
-
-- Roman <Roman.Hodek@informatik.uni-erlangen.de>
diff --git a/doc/README.mkdosfs b/doc/README.mkdosfs
deleted file mode 100644
index ae93ada..0000000
--- a/doc/README.mkdosfs
+++ /dev/null
@@ -1,50 +0,0 @@
-mkdosfs - Make DOS file system utilty.
-
-
-I wrote this, partially to complement the dosfsck utility written by Werner
-Almesberger (who graciously gave me some pointers when I asked for some
-advice about writing this code), and also to avoid me having to boot DOS
-just to create data partitions (I use Linux to back up DOS :-) ).
-
-The code is really derived from Remy Card's mke2fs utility - I used this as a
-framework, although all of the file system specific stuff was removed and the
-DOS stuff inserted. I believe originally mke2fs was based on Linus' mkfs
-code, hence the acknowledgements in the source code.
-
-Neither Remy nor Linus have had any involvement with mkdosfs, so if there are
-any bugs they're almost certainly "all my own work".
-
-The code has been available for ftp since 1st September 1993, and I have yet
-to receive any bug reports from users. I don't know of any bugs, but if you
-do find a bug or have any constructive comments, please mail me!
-
-The only bug I found with version 0.1 was an obscure fault that could lead
-to an invalid (for MS-DOS, not Linux's dos fs) number of sectors used in the
-file allocation table(s).
-
-
-Dave Hudson
-dave@humbug.demon.co.uk
-
-
-FAT32 support
-=============
-
-mkdosfs now can also create filesystems in the new FAT32 format. To do
-this, give mkdosfs a "-F 32" option. FAT32 isn't selected
-automatically (yet), even if very large clusters are needed with
-FAT16. With FAT32 you have two additional options, -R to select the
-number of reserved sectors (usually 32), and -b to select the location
-of the backup boot sector (default 6). Of course such a backup is
-created, as well as the new info sector. On FAT32, the root directory
-is always created as a cluster chain. Sorry, there's no switch to
-generate an old static root dir.
-
-One bigger bug fix besides FAT32 was to reject filesystems that need a
-16 bit FAT to fit all possible clusters, but the bigger FAT needs some
-more sectors, so the total number of clusters drop below the border
-where MS-DOS expects a 12 bit FAT. So such filesystems would be FAT16,
-but interpreted as FAT32 by DOS. The fix is to reduce filesystem size
-a bit.
-
-- Roman <roman@hodek.net>
diff --git a/doc/TODO.dosfstools-2.x b/doc/TODO.dosfstools-2.x
deleted file mode 100644
index dbc2de0..0000000
--- a/doc/TODO.dosfstools-2.x
+++ /dev/null
@@ -1,14 +0,0 @@
- -*- mode: indented-text -*-
-
- - dosfsck: Better checking of file times: ctime <= mtime <= atime
-
- - mkdosfs: If /etc/bootsect.dos (or similar) exists, use it as a
- template for generating boot sectors. This way, you can, e.g., make
- bootable DOS disks.
-
- Addendum: Don't know if that's so wise... There are really many
- variants of DOS/Windows bootcode out in the wild, and the code is
- proprietary, too.
-
- - dosfsck: read-only sector test (-t without -a or -r); just print
- out errors.
diff --git a/man/dosfsck.8 b/man/dosfsck.8
deleted file mode 100644
index 9443543..0000000
--- a/man/dosfsck.8
+++ /dev/null
@@ -1,147 +0,0 @@
-.TH DOSFSCK 8 "December 31 1997" "Linux" "MAINTENANCE COMMANDS"
-.SH NAME
-dosfsck \- check and repair MS-DOS file systems
-.SH SYNOPSIS
-.ad l
-.B dosfsck|fsck.msdos|fsck.vfat
-.RB [ \-aAflnrtvVwy ]
-.RB [ \-d\ \fIpath\fB\ \-d\ \fI...\fB ]
-.RB [ \-u\ \fIpath\fB\ \-u\ \fI...\fB ]
-.I device
-.ad b
-.SH DESCRIPTION
-.B dosfsck
-verifies the consistency of MS-DOS file systems and optionally tries to
-repair them. The following file system problems can be corrected (in this
-order):
-.IP \-
-FAT contains invalid cluster numbers. Cluster is changed to EOF.
-.PD 0
-.IP \-
-File's cluster chain contains a loop. The loop is broken.
-.IP \-
-Bad clusters (read errors). The clusters are marked bad and they are
-removed from files owning them. This check is optional.
-.IP \-
-Directories with a large number of bad entries (probably corrupt). The
-directory can be deleted.
-.IP \-
-Files . and .. are non-directories. They can be deleted or renamed.
-.IP \-
-Directories . and .. in root directory. They are deleted.
-.IP \-
-Bad file names. They can be renamed.
-.IP \-
-Duplicate directory entries. They can be deleted or renamed.
-.IP \-
-Directories with non-zero size field. Size is set to zero.
-.IP \-
-Directory . does not point to parent directory. The start pointer is
-adjusted.
-.IP \-
-Directory .. does not point to parent of parent directory. The start pointer
-is adjusted.
-.IP \-
-Start cluster number of a file is invalid. The file is truncated.
-.IP \-
-File contains bad or free clusters. The file is truncated.
-.IP \-
-File's cluster chain is longer than indicated by the size fields. The file
-is truncated.
-.IP \-
-Two or more files share the same cluster(s). All but one of the files are
-truncated. If the file being truncated is a directory file that has already
-been read, the file system check is restarted after truncation.
-.IP \-
-File's cluster chain is shorter than indicated by the size fields. The file
-is truncated.
-.IP \-
-Clusters are marked as used but are not owned by a file. They are marked
-as free.
-.PD
-.LP
-Additionally, the following problems are detected, but not repaired:
-.IP \-
-Invalid parameters in boot sector.
-.PD 0
-.IP \-
-Absence of . and .. entries in non-root directories
-.PD
-.LP
-When \fBdosfsck\fP checks a file system, it accumulates all changes in memory
-and performs them only after all checks are complete. This can be disabled
-with the \fB\-w\fP option.
-.SH OPTIONS
-.IP \fB\-a\fP
-Automatically repair the file system. No user intervention is necessary.
-Whenever there is more than one method to solve a problem, the least
-destructive approach is used.
-.IP \fB\-A\fP
-Use Atari variation of the MS-DOS filesystem. This is default if
-\fBdosfsck\fP is run on an Atari, then this option turns off Atari
-format. There are some minor differences in Atari format: Some boot
-sector fields are interpreted slightly different, and the special FAT
-entries for end-of-file and bad cluster can be different. Under
-MS-DOS 0xfff8 is used for EOF and Atari employs 0xffff by default, but
-both systems recognize all values from 0xfff8...0xffff as end-of-file.
-MS-DOS uses only 0xfff7 for bad clusters, where on Atari values
-0xfff0...0xfff7 are for this purpose (but the standard value is still
-0xfff7).
-.IP \fB\-d\fP
-Delete the specified file. If more that one file with that name exists, the
-first one is deleted.
-.IP \fB\-f\fP
-Salvage unused cluster chains to files. By default, unused clusters are
-added to the free disk space except in auto mode (\fB-a\fP).
-.IP \fB\-l\fP
-List path names of files being processed.
-.IP \fB\-n\fP
-No-operation mode: non-interactively check for errors, but don't write
-anything to the filesystem.
-.IP \fB\-r\fP
-Interactively repair the file system. The user is asked for advice whenever
-there is more than one approach to fix an inconsistency.
-.IP \fB\-t\fP
-Mark unreadable clusters as bad.
-.IP \fB-u\fP
-Try to undelete the specified file. \fBdosfsck\fP tries to allocate a chain
-of contiguous unallocated clusters beginning with the start cluster of the
-undeleted file.
-.IP \fB\-v\fP
-Verbose mode. Generates slightly more output.
-.IP \fB\-V\fP
-Perform a verification pass. The file system check is repeated after the
-first run. The second pass should never report any fixable errors. It may
-take considerably longer than the first pass, because the first pass may
-have generated long list of modifications that have to be scanned for each
-disk read.
-.IP \fB\-w\fP
-Write changes to disk immediately.
-.IP \fB\-y\fP
-Same as \fB\-a\fP (automatically repair filesystem) for compatibility
-with other fsck tools.
-.LP
-If \fB\-a\fP and \fB\-r\fP are absent, the file system is only checked,
-but not repaired.
-.SH "EXIT STATUS"
-.IP 0
-No recoverable errors have been detected.
-.IP 1
-Recoverable errors have been detected or \fBdosfsck\fP has discovered an
-internal inconsistency.
-.IP 2
-Usage error. \fBdosfsck\fP did not access the file system.
-.SH FILES
-.IP "fsck0000.rec, fsck0001.rec, ..."
-When recovering from a corrupted file system, dosfsck dumps recovered data
-into files named 'fsckNNNN.rec' in the top level directory of the file system.
-.SH BUGS
-Does not create . and .. files where necessary. Does not remove entirely
-empty directories. Should give more diagnostic messages. Undeleting files
-should use a more sophisticated algorithm.
-.\".SH "SEE ALSO"
-.\"fs(5)
-.SH AUTHORS
-Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
-Extensions (FAT32, VFAT) by and current maintainer:
-Roman Hodek <roman@hodek.net>
diff --git a/man/dosfslabel.8 b/man/dosfslabel.8
deleted file mode 100644
index 0dbc136..0000000
--- a/man/dosfslabel.8
+++ /dev/null
@@ -1,53 +0,0 @@
-.TH "dosfslabel" "8" "13 August 2008"
-
-.SH "NAME"
-dosfslabel \- set or get a MS-DOS filesystem label
-
-.SH "SYNOPSIS"
-.PP
-.B dosfslabel
-.IR device \ [ label ]
-
-
-.SH "DESCRIPTION"
-.PP
-This manual page documents briefly the
-.B dosfslabel
-command.
-.PP
-.B dosfslabel
-set or gets a MS-DOS filesystem label from a given
-.IR device .
-If
-.I label
-is omitted, then the label name of the specified
-.I device
-is written on the standard output.
-
-.I label
-can't be longer than 11 characters.
-
-.SH "OPTIONS"
-.TP
-.BR \-h , \-\-help
-Displays a help message.
-.TP
-.BR \-V , \-\-version
-Shows version.
-
-.SH "SEE ALSO"
-
-.BR mkfs.msdos (8),
-.BR mkdosfs (8)
-
-
-.SH "AUTHORS"
-.PP
-.B dosfslabel
-is Copyright 2007 Red Hat, Inc.
-.PP
-Some portions are Copyright 1998 Roman Hodek.
-.PP
-Some portions are Copyright 1993 Werner Almesberger.
-
-This manual page was written by François Wendling <frwendling@free.fr> for the Debian GNU/Linux system (but may be used by others).
diff --git a/man/mkdosfs.8 b/man/mkdosfs.8
deleted file mode 100644
index bb87ce6..0000000
--- a/man/mkdosfs.8
+++ /dev/null
@@ -1,211 +0,0 @@
-.\" -*- nroff -*-
-.TH MKDOSFS 8 "5 May 1995" "Version 2.x"
-.SH NAME
-.B mkdosfs
-\- create an MS-DOS file system under Linux
-.SH SYNOPSIS
-.B mkdosfs|mkfs.msdos|mkfs.vfat
-[
-.B \-A
-]
-[
-.B \-b
-.I sector-of-backup
-]
-[
-.B \-c
-]
-[
-.B \-l
-.I filename
-]
-[
-.B \-C
-]
-[
-.B \-f
-.I number-of-FATs
-]
-[
-.B \-F
-.I FAT-size
-]
-[
-.B \-h
-.I number-of-hidden-sectors
-]
-[
-.B \-i
-.I volume-id
-]
-.RB [ " \-I " ]
-[
-.B \-m
-.I message-file
-]
-[
-.B \-n
-.I volume-name
-]
-[
-.B \-r
-.I root-dir-entries
-]
-[
-.B \-R
-.I number-of-reserved-sectors
-]
-[
-.B \-s
-.I sectors-per-cluster
-]
-[
-.B \-S
-.I logical-sector-size
-]
-[
-.B \-v
-]
-.I device
-[
-.I block-count
-]
-.SH DESCRIPTION
-.B mkdosfs
-is used to create an MS-DOS file system under Linux on a device (usually
-a disk partition).
-.I device
-is the special file corresponding to the device (e.g /dev/hdXX).
-.I block-count
-is the number of blocks on the device. If omitted,
-.B mkdosfs
-automatically determines the file system size.
-.SH OPTIONS
-.TP
-.B \-A
-Use Atari variation of the MS-DOS file system. This is default if
-\fBmkdosfs\fP is run on an Atari, then this option turns off Atari
-format. There are some differences when using Atari format: If not
-directed otherwise by the user, \fBmkdosfs\fP will always use 2
-sectors per cluster, since GEMDOS doesn't like other values very much.
-It will also obey the maximum number of sectors GEMDOS can handle.
-Larger file systems are managed by raising the logical sector size.
-Under Atari format, an Atari-compatible serial number for the
-file system is generated, and a 12 bit FAT is used only for file systems
-that have one of the usual floppy sizes (720k, 1.2M, 1.44M, 2.88M), a
-16 bit FAT otherwise. This can be overridden with the \fB\-F\fP
-option. Some PC-specific boot sector fields aren't written, and a boot
-message (option \fB\-m\fP) is ignored.
-.TP
-.BI \-b " sector-of-backup "
-Selects the location of the backup boot sector for FAT32. Default
-depends on number of reserved sectors, but usually is sector 6. The
-backup must be within the range of reserved sectors.
-.TP
-.B \-c
-Check the device for bad blocks before creating the file system.
-.TP
-.B \-C
-Create the file given as \fIdevice\fP on the command line, and write
-the to-be-created file system to it. This can be used to create the
-new file system in a file instead of on a real device, and to avoid
-using \fBdd\fP in advance to create a file of appropriate size. With
-this option, the \fIblock-count\fP must be given, because otherwise
-the intended size of the file system wouldn't be known. The file
-created is a sparse file, which actually only contains the meta-data
-areas (boot sector, FATs, and root directory). The data portions won't
-be stored on the disk, but the file nevertheless will have the
-correct size. The resulting file can be copied later to a floppy disk
-or other device, or mounted through a loop device.
-.TP
-.BI \-f " number-of-FATs"
-Specify the number of file allocation tables in the file system. The
-default is 2. Currently the Linux MS-DOS file system does not support
-more than 2 FATs.
-.TP
-.BI \-F " FAT-size"
-Specifies the type of file allocation tables used (12, 16 or 32 bit).
-If nothing is specified, \fBmkdosfs\fR will automatically select
-between 12, 16 and 32 bit, whatever fits better for the file system size.
-.TP
-.BI \-h " number-of-hidden-sectors "
-Select the number of hidden sectors in the volume. Apparently some
-digital cameras get indigestion if you feed them a CF card without
-such hidden sectors, this option allows you to satisfy them. Assumes
-\'0\' if no value is given on the command line.
-.TP
-.I \-i " volume-id"
-Sets the volume ID of the newly created file system;
-.I volume-id
-is a 32-bit hexadecimal number (for example, 2e24ec82). The default
-is a number which depends on the file system creation time.
-.TP
-.B \-I
-It is typical for fixed disk devices to be partitioned so, by default, you are
-not permitted to create a filesystem across the entire device.
-.B mkdosfs
-will complain and tell you that it refuses to work. This is different
-when using MO disks. One doesn't always need partitions on MO disks.
-The file system can go directly to the whole disk. Under other OSes
-this is known as the 'superfloppy' format.
-
-This switch will force
-.B mkdosfs
-to work properly.
-.TP
-.BI \-l " filename"
-Read the bad blocks list from
-.IR filename .
-.TP
-.BI \-m " message-file"
-Sets the message the user receives on attempts to boot this file system
-without having properly installed an operating system. The message
-file must not exceed 418 bytes once line feeds have been converted to
-carriage return-line feed combinations, and tabs have been expanded.
-If the filename is a hyphen (-), the text is taken from standard input.
-.TP
-.BI \-n " volume-name"
-Sets the volume name (label) of the file system. The volume name can
-be up to 11 characters long. The default is no label.
-.TP
-.BI \-r " root-dir-entries"
-Select the number of entries available in the root directory. The
-default is 112 or 224 for floppies and 512 for hard disks.
-.TP
-.BI \-R " number-of-reserved-sectors "
-Select the number of reserved sectors. With FAT32 format at least 2
-reserved sectors are needed, the default is 32. Otherwise the default
-is 1 (only the boot sector).
-.TP
-.BI \-s " sectors-per-cluster"
-Specify the number of disk sectors per cluster. Must be a power of 2,
-i.e. 1, 2, 4, 8, ... 128.
-.TP
-.BI \-S " logical-sector-size"
-Specify the number of bytes per logical sector. Must be a power of 2
-and greater than or equal to 512, i.e. 512, 1024, 2048, 4096, 8192,
-16384, or 32768.
-.TP
-.B \-v
-Verbose execution.
-.SH BUGS
-.B mkdosfs
-can not create boot-able file systems. This isn't as easy as you might
-think at first glance for various reasons and has been discussed a lot
-already.
-.B mkdosfs
-simply will not support it ;)
-.SH AUTHOR
-Dave Hudson - <dave@humbug.demon.co.uk>; modified by Peter Anvin
-<hpa@yggdrasil.com>. Fixes and additions by Roman Hodek
-<roman@hodek.net> for Debian/GNU Linux.
-.SH ACKNOWLEDGMENTS
-.B mkdosfs
-is based on code from
-.BR mke2fs
-(written by Remy Card - <card@masi.ibp.fr>) which is itself based on
-.BR mkfs
-(written by Linus Torvalds - <torvalds@cs.helsinki.fi>).
-.SH SEE ALSO
-.BR dosfsck (8),
-.BR mkfs (8)
diff --git a/src/Android.mk b/src/Android.mk
deleted file mode 100644
index a76a23a..0000000
--- a/src/Android.mk
+++ /dev/null
@@ -1,20 +0,0 @@
-ifneq ($(TARGET_SIMULATOR), true)
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- boot.c check.c common.c fat.c file.c io.c lfn.c dosfsck.c
-
-LOCAL_C_INCLUDES := external/dosfstools/src
-
-LOCAL_CFLAGS := -O2 -g -W -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
-
-LOCAL_MODULE := dosfsck
-LOCAL_MODULE_TAGS :=
-LOCAL_SYSTEM_SHARED_LIBRARIES := libc
-
-include $(BUILD_EXECUTABLE)
-
-endif
diff --git a/src/boot.c b/src/boot.c
deleted file mode 100644
index 7048b7f..0000000
--- a/src/boot.c
+++ /dev/null
@@ -1,463 +0,0 @@
-/* boot.c - Read and analyze ia PC/MS-DOS boot sector
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
- Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-/* FAT32, VFAT, Atari format support, and various fixes additions May 1998
- * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
-
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <stdlib.h>
-#include <stdarg.h>
-
-#include "common.h"
-#include "dosfsck.h"
-#include "io.h"
-#include "boot.h"
-
-
-#define ROUND_TO_MULTIPLE(n,m) ((n) && (m) ? (n)+(m)-1-((n)-1)%(m) : 0)
- /* don't divide by zero */
-
-/* cut-over cluster counts for FAT12 and FAT16 */
-#define FAT12_THRESHOLD 4085
-#define FAT16_THRESHOLD 65525
-
-static struct {
- __u8 media;
- char *descr;
-} mediabytes[] = {
- { 0xf0, "5.25\" or 3.5\" HD floppy" },
- { 0xf8, "hard disk" },
- { 0xf9, "3,5\" 720k floppy 2s/80tr/9sec or "
- "5.25\" 1.2M floppy 2s/80tr/15sec" },
- { 0xfa, "5.25\" 320k floppy 1s/80tr/8sec" },
- { 0xfb, "3.5\" 640k floppy 2s/80tr/8sec" },
- { 0xfc, "5.25\" 180k floppy 1s/40tr/9sec" },
- { 0xfd, "5.25\" 360k floppy 2s/40tr/9sec" },
- { 0xfe, "5.25\" 160k floppy 1s/40tr/8sec" },
- { 0xff, "5.25\" 320k floppy 2s/40tr/8sec" },
-};
-
-#if defined __alpha || defined __ia64__ || defined __s390x__ || defined __x86_64__ || defined __ppc64__ || defined __arm__
-/* Unaligned fields must first be copied byte-wise */
-#define GET_UNALIGNED_W(f) \
- ({ \
- unsigned short __v; \
- memcpy( &__v, &f, sizeof(__v) ); \
- CF_LE_W( *(unsigned short *)&__v ); \
- })
-#else
-#define GET_UNALIGNED_W(f) CF_LE_W( *(unsigned short *)&f )
-#endif
-
-void die_notfat(char *msg,...)
-{
- va_list args;
-
- va_start(args,msg);
- vfprintf(stderr,msg,args);
- va_end(args);
- fprintf(stderr,"\n");
- exit(8);
-}
-
-
-static char *get_media_descr( unsigned char media )
-{
- unsigned int i;
-
- for( i = 0; i < sizeof(mediabytes)/sizeof(*mediabytes); ++i ) {
- if (mediabytes[i].media == media)
- return( mediabytes[i].descr );
- }
- return( "undefined" );
-}
-
-static void dump_boot(DOS_FS *fs,struct boot_sector *b,unsigned lss)
-{
- unsigned short sectors;
-
- printf("Boot sector contents:\n");
- if (!atari_format) {
- char id[9];
- strncpy(id,b->system_id,8);
- id[8] = 0;
- printf("System ID \"%s\"\n",id);
- }
- else {
- /* On Atari, a 24 bit serial number is stored at offset 8 of the boot
- * sector */
- printf("Serial number 0x%x\n",
- b->system_id[5] | (b->system_id[6]<<8) | (b->system_id[7]<<16));
- }
- printf("Media byte 0x%02x (%s)\n",b->media,get_media_descr(b->media));
- printf("%10d bytes per logical sector\n",GET_UNALIGNED_W(b->sector_size));
- printf("%10d bytes per cluster\n",fs->cluster_size);
- printf("%10d reserved sector%s\n",CF_LE_W(b->reserved),
- CF_LE_W(b->reserved) == 1 ? "" : "s");
- printf("First FAT starts at byte %llu (sector %llu)\n",
- (unsigned long long)fs->fat_start,
- (unsigned long long)fs->fat_start/lss);
- printf("%10d FATs, %d bit entries\n",b->fats,fs->fat_bits);
- printf("%10d bytes per FAT (= %u sectors)\n",fs->fat_size,
- fs->fat_size/lss);
- if (!fs->root_cluster) {
- printf("Root directory starts at byte %llu (sector %llu)\n",
- (unsigned long long)fs->root_start,
- (unsigned long long)fs->root_start/lss);
- printf("%10d root directory entries\n",fs->root_entries);
- }
- else {
- printf( "Root directory start at cluster %lu (arbitrary size)\n",
- fs->root_cluster);
- }
- printf("Data area starts at byte %llu (sector %llu)\n",
- (unsigned long long)fs->data_start,
- (unsigned long long)fs->data_start/lss);
- printf("%10lu data clusters (%llu bytes)\n",fs->clusters,
- (unsigned long long)fs->clusters*fs->cluster_size);
- printf("%u sectors/track, %u heads\n",CF_LE_W(b->secs_track),
- CF_LE_W(b->heads));
- printf("%10u hidden sectors\n",
- atari_format ?
- /* On Atari, the hidden field is only 16 bit wide and unused */
- (((unsigned char *)&b->hidden)[0] |
- ((unsigned char *)&b->hidden)[1] << 8) :
- CF_LE_L(b->hidden));
- sectors = GET_UNALIGNED_W( b->sectors );
- printf("%10u sectors total\n", sectors ? sectors : CF_LE_L(b->total_sect));
-}
-
-static void check_backup_boot(DOS_FS *fs, struct boot_sector *b, int lss)
-{
- struct boot_sector b2;
-
- if (!fs->backupboot_start) {
- printf( "There is no backup boot sector.\n" );
- if (CF_LE_W(b->reserved) < 3) {
- printf( "And there is no space for creating one!\n" );
- return;
- }
- if (interactive)
- printf( "1) Create one\n2) Do without a backup\n" );
- else printf( " Auto-creating backup boot block.\n" );
- if (!interactive || get_key("12","?") == '1') {
- int bbs;
- /* The usual place for the backup boot sector is sector 6. Choose
- * that or the last reserved sector. */
- if (CF_LE_W(b->reserved) >= 7 && CF_LE_W(b->info_sector) != 6)
- bbs = 6;
- else {
- bbs = CF_LE_W(b->reserved) - 1;
- if (bbs == CF_LE_W(b->info_sector))
- --bbs; /* this is never 0, as we checked reserved >= 3! */
- }
- fs->backupboot_start = bbs*lss;
- b->backup_boot = CT_LE_W(bbs);
- fs_write(fs->backupboot_start,sizeof(*b),b);
- fs_write((loff_t)offsetof(struct boot_sector,backup_boot),
- sizeof(b->backup_boot),&b->backup_boot);
- printf( "Created backup of boot sector in sector %d\n", bbs );
- return;
- }
- else return;
- }
-
- fs_read(fs->backupboot_start,sizeof(b2),&b2);
- if (memcmp(b,&b2,sizeof(b2)) != 0) {
- /* there are any differences */
- __u8 *p, *q;
- int i, pos, first = 1;
- char buf[20];
-
- printf( "There are differences between boot sector and its backup.\n" );
- printf( "Differences: (offset:original/backup)\n " );
- pos = 2;
- for( p = (__u8 *)b, q = (__u8 *)&b2, i = 0; i < sizeof(b2);
- ++p, ++q, ++i ) {
- if (*p != *q) {
- sprintf( buf, "%s%u:%02x/%02x", first ? "" : ", ",
- (unsigned)(p-(__u8 *)b), *p, *q );
- if (pos + strlen(buf) > 78) printf( "\n " ), pos = 2;
- printf( "%s", buf );
- pos += strlen(buf);
- first = 0;
- }
- }
- printf( "\n" );
-
- if (interactive)
- printf( "1) Copy original to backup\n"
- "2) Copy backup to original\n"
- "3) No action\n" );
- else printf( " Not automatically fixing this.\n" );
- switch (interactive ? get_key("123","?") : '3') {
- case '1':
- fs_write(fs->backupboot_start,sizeof(*b),b);
- break;
- case '2':
- fs_write(0,sizeof(b2),&b2);
- break;
- default:
- break;
- }
- }
-}
-
-static void init_fsinfo(struct info_sector *i)
-{
- i->magic = CT_LE_L(0x41615252);
- i->signature = CT_LE_L(0x61417272);
- i->free_clusters = CT_LE_L(-1);
- i->next_cluster = CT_LE_L(2);
- i->boot_sign = CT_LE_W(0xaa55);
-}
-
-static void read_fsinfo(DOS_FS *fs, struct boot_sector *b,int lss)
-{
- struct info_sector i;
-
- if (!b->info_sector) {
- printf( "No FSINFO sector\n" );
- if (interactive)
- printf( "1) Create one\n2) Do without FSINFO\n" );
- else printf( " Not automatically creating it.\n" );
- if (interactive && get_key("12","?") == '1') {
- /* search for a free reserved sector (not boot sector and not
- * backup boot sector) */
- __u32 s;
- for( s = 1; s < CF_LE_W(b->reserved); ++s )
- if (s != CF_LE_W(b->backup_boot)) break;
- if (s > 0 && s < CF_LE_W(b->reserved)) {
- init_fsinfo(&i);
- fs_write((loff_t)s*lss,sizeof(i),&i);
- b->info_sector = CT_LE_W(s);
- fs_write((loff_t)offsetof(struct boot_sector,info_sector),
- sizeof(b->info_sector),&b->info_sector);
- if (fs->backupboot_start)
- fs_write(fs->backupboot_start+
- offsetof(struct boot_sector,info_sector),
- sizeof(b->info_sector),&b->info_sector);
- }
- else {
- printf( "No free reserved sector found -- "
- "no space for FSINFO sector!\n" );
- return;
- }
- }
- else return;
- }
-
- fs->fsinfo_start = CF_LE_W(b->info_sector)*lss;
- fs_read(fs->fsinfo_start,sizeof(i),&i);
-
- if (i.magic != CT_LE_L(0x41615252) ||
- i.signature != CT_LE_L(0x61417272) ||
- i.boot_sign != CT_LE_W(0xaa55)) {
- printf( "FSINFO sector has bad magic number(s):\n" );
- if (i.magic != CT_LE_L(0x41615252))
- printf( " Offset %llu: 0x%08x != expected 0x%08x\n",
- (unsigned long long)offsetof(struct info_sector,magic),
- CF_LE_L(i.magic),0x41615252);
- if (i.signature != CT_LE_L(0x61417272))
- printf( " Offset %llu: 0x%08x != expected 0x%08x\n",
- (unsigned long long)offsetof(struct info_sector,signature),
- CF_LE_L(i.signature),0x61417272);
- if (i.boot_sign != CT_LE_W(0xaa55))
- printf( " Offset %llu: 0x%04x != expected 0x%04x\n",
- (unsigned long long)offsetof(struct info_sector,boot_sign),
- CF_LE_W(i.boot_sign),0xaa55);
- if (interactive)
- printf( "1) Correct\n2) Don't correct (FSINFO invalid then)\n" );
- else printf( " Auto-correcting it.\n" );
- if (!interactive || get_key("12","?") == '1') {
- init_fsinfo(&i);
- fs_write(fs->fsinfo_start,sizeof(i),&i);
- }
- else fs->fsinfo_start = 0;
- }
-
- if (fs->fsinfo_start)
- fs->free_clusters = CF_LE_L(i.free_clusters);
-}
-
-void read_boot(DOS_FS *fs)
-{
- struct boot_sector b;
- unsigned total_sectors;
- unsigned short logical_sector_size, sectors;
- unsigned fat_length;
- loff_t data_size;
-
- fs_read(0,sizeof(b),&b);
- logical_sector_size = GET_UNALIGNED_W(b.sector_size);
- if (!logical_sector_size) die_notfat("Logical sector size is zero.");
- fs->cluster_size = b.cluster_size*logical_sector_size;
- if (!fs->cluster_size) die_notfat("Cluster size is zero.");
- if (b.fats != 2 && b.fats != 1)
- die("Currently, only 1 or 2 FATs are supported, not %d.\n",b.fats);
- fs->nfats = b.fats;
- sectors = GET_UNALIGNED_W(b.sectors);
- total_sectors = sectors ? sectors : CF_LE_L(b.total_sect);
-
- if (verbose) printf("Checking we can access the last sector of the filesystem\n");
- /* Can't access last odd sector anyway, so round down */
- fs_test((loff_t)((total_sectors & ~1)-1)*(loff_t)logical_sector_size,
- logical_sector_size);
- fat_length = CF_LE_W(b.fat_length) ?
- CF_LE_W(b.fat_length) : CF_LE_L(b.fat32_length);
- fs->fat_start = (loff_t)CF_LE_W(b.reserved)*logical_sector_size;
- fs->root_start = ((loff_t)CF_LE_W(b.reserved)+b.fats*fat_length)*
- logical_sector_size;
- fs->root_entries = GET_UNALIGNED_W(b.dir_entries);
- fs->data_start = fs->root_start+ROUND_TO_MULTIPLE(fs->root_entries <<
- MSDOS_DIR_BITS,logical_sector_size);
- data_size = (loff_t)total_sectors*logical_sector_size-fs->data_start;
- fs->clusters = data_size/fs->cluster_size;
- fs->root_cluster = 0; /* indicates standard, pre-FAT32 root dir */
- fs->fsinfo_start = 0; /* no FSINFO structure */
- fs->free_clusters = -1; /* unknown */
- if (!b.fat_length && b.fat32_length) {
- fs->fat_bits = 32;
- fs->root_cluster = CF_LE_L(b.root_cluster);
- if (!fs->root_cluster && fs->root_entries)
- /* M$ hasn't specified this, but it looks reasonable: If
- * root_cluster is 0 but there is a separate root dir
- * (root_entries != 0), we handle the root dir the old way. Give a
- * warning, but convertig to a root dir in a cluster chain seems
- * to complex for now... */
- printf( "Warning: FAT32 root dir not in cluster chain! "
- "Compability mode...\n" );
- else if (!fs->root_cluster && !fs->root_entries)
- die_notfat("No root directory!");
- else if (fs->root_cluster && fs->root_entries)
- printf( "Warning: FAT32 root dir is in a cluster chain, but "
- "a separate root dir\n"
- " area is defined. Cannot fix this easily.\n" );
- if (fs->clusters < FAT16_THRESHOLD)
- printf("Warning: Filesystem is FAT32 according to fat_length "
- "and fat32_length fields,\n"
- " but has only %lu clusters, less than the required "
- "minimum of %d.\n"
- " This may lead to problems on some systems.\n",
- fs->clusters, FAT16_THRESHOLD);
-
- fs->backupboot_start = CF_LE_W(b.backup_boot)*logical_sector_size;
- check_backup_boot(fs,&b,logical_sector_size);
-
- read_fsinfo(fs,&b,logical_sector_size);
- }
- else if (!atari_format) {
- /* On real MS-DOS, a 16 bit FAT is used whenever there would be too
- * much clusers otherwise. */
- fs->fat_bits = (fs->clusters >= FAT12_THRESHOLD) ? 16 : 12;
- if (fs->clusters >= FAT16_THRESHOLD)
- die("Too many clusters (%lu) for FAT16 filesystem.",
- fs->clusters);
- }
- else {
- /* On Atari, things are more difficult: GEMDOS always uses 12bit FATs
- * on floppies, and always 16 bit on harddisks. */
- fs->fat_bits = 16; /* assume 16 bit FAT for now */
- /* If more clusters than fat entries in 16-bit fat, we assume
- * it's a real MSDOS FS with 12-bit fat. */
- if (fs->clusters+2 > fat_length*logical_sector_size*8/16 ||
- /* if it's a floppy disk --> 12bit fat */
- device_no == 2 ||
- /* if it's a ramdisk or loopback device and has one of the usual
- * floppy sizes -> 12bit FAT */
- ((device_no == 1 || device_no == 7) &&
- (total_sectors == 720 || total_sectors == 1440 ||
- total_sectors == 2880)))
- fs->fat_bits = 12;
- }
- /* On FAT32, the high 4 bits of a FAT entry are reserved */
- fs->eff_fat_bits = (fs->fat_bits == 32) ? 28 : fs->fat_bits;
- fs->fat_size = fat_length*logical_sector_size;
-
- fs->label = calloc(12, sizeof (__u8));
- if (fs->fat_bits == 12 || fs->fat_bits == 16) {
- struct boot_sector_16 *b16 = (struct boot_sector_16 *)&b;
- if (b16->extended_sig == 0x29)
- memmove(fs->label, b16->label, 11);
- else
- fs->label = NULL;
- } else if (fs->fat_bits == 32) {
- if (b.extended_sig == 0x29)
- memmove(fs->label, &b.label, 11);
- else
- fs->label = NULL;
- }
-
- if (fs->clusters > ((unsigned long long)fs->fat_size*8/fs->fat_bits)-2)
- die("File system has %d clusters but only space for %d FAT entries.",
- fs->clusters,((unsigned long long)fs->fat_size*8/fs->fat_bits)-2);
- if (!fs->root_entries && !fs->root_cluster)
- die("Root directory has zero size.");
- if (fs->root_entries & (MSDOS_DPS-1))
- die("Root directory (%d entries) doesn't span an integral number of "
- "sectors.",fs->root_entries);
- if (logical_sector_size & (SECTOR_SIZE-1))
- die("Logical sector size (%d bytes) is not a multiple of the physical "
- "sector size.",logical_sector_size);
-#if 0 /* linux kernel doesn't check that either */
- /* ++roman: On Atari, these two fields are often left uninitialized */
- if (!atari_format && (!b.secs_track || !b.heads))
- die("Invalid disk format in boot sector.");
-#endif
- if (verbose) dump_boot(fs,&b,logical_sector_size);
-}
-
-void write_label(DOS_FS *fs, char *label)
-{
- struct boot_sector b;
- struct boot_sector_16 *b16 = (struct boot_sector_16 *)&b;
- int l = strlen(label);
-
- while (l < 11)
- label[l++] = ' ';
-
- fs_read(0, sizeof(b), &b);
- if (fs->fat_bits == 12 || fs->fat_bits == 16) {
- if (b16->extended_sig != 0x29) {
- b16->extended_sig = 0x29;
- b16->serial = 0;
- memmove(b16->fs_type, fs->fat_bits == 12 ?"FAT12 ":"FAT16 ", 8);
- }
- memmove(b16->label, label, 11);
- } else if (fs->fat_bits == 32) {
- if (b.extended_sig != 0x29) {
- b.extended_sig = 0x29;
- b.serial = 0;
- memmove(b.fs_type, "FAT32 ", 8);
- }
- memmove(b.label, label, 11);
- }
- fs_write(0, sizeof(b), &b);
- if (fs->fat_bits == 32 && fs->backupboot_start)
- fs_write(fs->backupboot_start, sizeof(b), &b);
-}
-
-/* Local Variables: */
-/* tab-width: 8 */
-/* End: */
diff --git a/src/boot.h b/src/boot.h
deleted file mode 100644
index eedf2b0..0000000
--- a/src/boot.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* boot.h - Read and analyze ia PC/MS-DOS boot sector
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-
-#ifndef _BOOT_H
-#define _BOOT_H
-
-void read_boot(DOS_FS *fs);
-void write_label(DOS_FS *fs, char *label);
-
-/* Reads the boot sector from the currently open device and initializes *FS */
-
-#endif
diff --git a/src/check.c b/src/check.c
deleted file mode 100644
index 870fcd9..0000000
--- a/src/check.c
+++ /dev/null
@@ -1,883 +0,0 @@
-/* check.c - Check and repair a PC/MS-DOS file system
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
- Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-/* FAT32, VFAT, Atari format support, and various fixes additions May 1998
- * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <time.h>
-
-#include "common.h"
-#include "dosfsck.h"
-#include "io.h"
-#include "fat.h"
-#include "file.h"
-#include "lfn.h"
-#include "check.h"
-
-
-static DOS_FILE *root;
-
-/* get start field of a dir entry */
-#define FSTART(p,fs) \
- ((unsigned long)CF_LE_W(p->dir_ent.start) | \
- (fs->fat_bits == 32 ? CF_LE_W(p->dir_ent.starthi) << 16 : 0))
-
-#define MODIFY(p,i,v) \
- do { \
- if (p->offset) { \
- p->dir_ent.i = v; \
- fs_write(p->offset+offsetof(DIR_ENT,i), \
- sizeof(p->dir_ent.i),&p->dir_ent.i); \
- } \
- } while(0)
-
-#define MODIFY_START(p,v,fs) \
- do { \
- unsigned long __v = (v); \
- if (!p->offset) { \
- /* writing to fake entry for FAT32 root dir */ \
- if (!__v) die("Oops, deleting FAT32 root dir!"); \
- fs->root_cluster = __v; \
- p->dir_ent.start = CT_LE_W(__v&0xffff); \
- p->dir_ent.starthi = CT_LE_W(__v>>16); \
- __v = CT_LE_L(__v); \
- fs_write((loff_t)offsetof(struct boot_sector,root_cluster), \
- sizeof(((struct boot_sector *)0)->root_cluster), \
- &__v); \
- } \
- else { \
- MODIFY(p,start,CT_LE_W((__v)&0xffff)); \
- if (fs->fat_bits == 32) \
- MODIFY(p,starthi,CT_LE_W((__v)>>16)); \
- } \
- } while(0)
-
-
-loff_t alloc_rootdir_entry(DOS_FS *fs, DIR_ENT *de, const char *pattern)
-{
- static int curr_num = 0;
- loff_t offset;
-
- if (fs->root_cluster) {
- DIR_ENT d2;
- int i = 0, got = 0;
- unsigned long clu_num, prev = 0;
- loff_t offset2;
-
- clu_num = fs->root_cluster;
- offset = cluster_start(fs,clu_num);
- while (clu_num > 0 && clu_num != -1) {
- fs_read(offset,sizeof(DIR_ENT),&d2);
- if (IS_FREE(d2.name) && d2.attr != VFAT_LN_ATTR) {
- got = 1;
- break;
- }
- i += sizeof(DIR_ENT);
- offset += sizeof(DIR_ENT);
- if ((i % fs->cluster_size) == 0) {
- prev = clu_num;
- if ((clu_num = next_cluster(fs,clu_num)) == 0 || clu_num == -1)
- break;
- offset = cluster_start(fs,clu_num);
- }
- }
- if (!got) {
- /* no free slot, need to extend root dir: alloc next free cluster
- * after previous one */
- if (!prev)
- die("Root directory has no cluster allocated!");
- for (clu_num = prev+1; clu_num != prev; clu_num++) {
- if (clu_num >= fs->clusters+2) clu_num = 2;
- if (!fs->fat[clu_num].value)
- break;
- }
- if (clu_num == prev)
- die("Root directory full and no free cluster");
- set_fat(fs,prev,clu_num);
- set_fat(fs,clu_num,-1);
- set_owner(fs, clu_num, get_owner(fs, fs->root_cluster));
- /* clear new cluster */
- memset( &d2, 0, sizeof(d2) );
- offset = cluster_start(fs,clu_num);
- for( i = 0; i < fs->cluster_size; i += sizeof(DIR_ENT) )
- fs_write( offset+i, sizeof(d2), &d2 );
- }
- memset(de,0,sizeof(DIR_ENT));
- while (1) {
- sprintf(de->name,pattern,curr_num);
- clu_num = fs->root_cluster;
- i = 0;
- offset2 = cluster_start(fs,clu_num);
- while (clu_num > 0 && clu_num != -1) {
- fs_read(offset2,sizeof(DIR_ENT),&d2);
- if (offset2 != offset &&
- !strncmp(d2.name,de->name,MSDOS_NAME))
- break;
- i += sizeof(DIR_ENT);
- offset2 += sizeof(DIR_ENT);
- if ((i % fs->cluster_size) == 0) {
- if ((clu_num = next_cluster(fs,clu_num)) == 0 ||
- clu_num == -1)
- break;
- offset2 = cluster_start(fs,clu_num);
- }
- }
- if (clu_num == 0 || clu_num == -1)
- break;
- if (++curr_num >= 10000) die("Unable to create unique name");
- }
- }
- else {
- DIR_ENT *root;
- int next_free = 0, scan;
-
- root = alloc(fs->root_entries*sizeof(DIR_ENT));
- fs_read(fs->root_start,fs->root_entries*sizeof(DIR_ENT),root);
-
- while (next_free < fs->root_entries)
- if (IS_FREE(root[next_free].name) &&
- root[next_free].attr != VFAT_LN_ATTR)
- break;
- else next_free++;
- if (next_free == fs->root_entries)
- die("Root directory is full.");
- offset = fs->root_start+next_free*sizeof(DIR_ENT);
- memset(de,0,sizeof(DIR_ENT));
- while (1) {
- sprintf(de->name,pattern,curr_num);
- for (scan = 0; scan < fs->root_entries; scan++)
- if (scan != next_free &&
- !strncmp(root[scan].name,de->name,MSDOS_NAME))
- break;
- if (scan == fs->root_entries) break;
- if (++curr_num >= 10000) die("Unable to create unique name");
- }
- free(root);
- }
- ++n_files;
- return offset;
-}
-
-
-static char *path_name(DOS_FILE *file)
-{
- static char path[PATH_MAX*2];
-
- if (!file) *path = 0;
- else {
- if (strlen(path_name(file->parent)) > PATH_MAX)
- die("Path name too long.");
- if (strcmp(path,"/") != 0) strcat(path,"/");
- strcpy(strrchr(path,0),file->lfn?file->lfn:file_name(file->dir_ent.name));
- }
- return path;
-}
-
-
-static int day_n[] = { 0,31,59,90,120,151,181,212,243,273,304,334,0,0,0,0 };
- /* JanFebMarApr May Jun Jul Aug Sep Oct Nov Dec */
-
-
-/* Convert a MS-DOS time/date pair to a UNIX date (seconds since 1 1 70). */
-
-time_t date_dos2unix(unsigned short time,unsigned short date)
-{
- int month,year;
- time_t secs;
-
- month = ((date >> 5) & 15)-1;
- year = date >> 9;
- secs = (time & 31)*2+60*((time >> 5) & 63)+(time >> 11)*3600+86400*
- ((date & 31)-1+day_n[month]+(year/4)+year*365-((year & 3) == 0 &&
- month < 2 ? 1 : 0)+3653);
- /* days since 1.1.70 plus 80's leap day */
- return secs;
-}
-
-
-static char *file_stat(DOS_FILE *file)
-{
- static char temp[100];
- struct tm *tm;
- char tmp[100];
- time_t date;
-
- date = date_dos2unix(CF_LE_W(file->dir_ent.time),CF_LE_W(file->
- dir_ent.date));
- tm = localtime(&date);
- strftime(tmp,99,"%H:%M:%S %b %d %Y",tm);
- sprintf(temp," Size %u bytes, date %s",CF_LE_L(file->dir_ent.size),tmp);
- return temp;
-}
-
-
-static int bad_name(unsigned char *name)
-{
- int i, spc, suspicious = 0;
- char *bad_chars = atari_format ? "*?\\/:" : "*?<>|\"\\/:";
-
- /* Do not complain about (and auto-correct) the extended attribute files
- * of OS/2. */
- if (strncmp(name,"EA DATA SF",11) == 0 ||
- strncmp(name,"WP ROOT SF",11) == 0) return 0;
-
- for (i = 0; i < 8; i++) {
- if (name[i] < ' ' || name[i] == 0x7f) return 1;
- if (name[i] > 0x7f) ++suspicious;
- if (strchr(bad_chars,name[i])) return 1;
- }
-
- for (i = 8; i < 11; i++) {
- if (name[i] < ' ' || name[i] == 0x7f) return 1;
- if (name[i] > 0x7f) ++suspicious;
- if (strchr(bad_chars,name[i])) return 1;
- }
-
- spc = 0;
- for (i = 0; i < 8; i++) {
- if (name[i] == ' ')
- spc = 1;
- else if (spc)
- /* non-space after a space not allowed, space terminates the name
- * part */
- return 1;
- }
-
- spc = 0;
- for (i = 8; i < 11; i++) {
- if (name[i] == ' ')
- spc = 1;
- else if (spc)
- /* non-space after a space not allowed, space terminates the name
- * part */
- return 1;
- }
-
- /* Under GEMDOS, chars >= 128 are never allowed. */
- if (atari_format && suspicious)
- return 1;
-
- /* Only complain about too much suspicious chars in interactive mode,
- * never correct them automatically. The chars are all basically ok, so we
- * shouldn't auto-correct such names. */
- if (interactive && suspicious > 6)
- return 1;
- return 0;
-}
-
-
-static void drop_file(DOS_FS *fs,DOS_FILE *file)
-{
- unsigned long cluster;
-
- MODIFY(file,name[0],DELETED_FLAG);
- for (cluster = FSTART(file,fs); cluster > 0 && cluster <
- fs->clusters+2; cluster = next_cluster(fs,cluster))
- set_owner(fs,cluster,NULL);
- --n_files;
-}
-
-
-static void truncate_file(DOS_FS *fs,DOS_FILE *file,unsigned long clusters)
-{
- int deleting;
- unsigned long walk,next,prev;
-
- walk = FSTART(file,fs);
- prev = 0;
- if ((deleting = !clusters)) MODIFY_START(file,0,fs);
- while (walk > 0 && walk != -1) {
- next = next_cluster(fs,walk);
- if (deleting) set_fat(fs,walk,0);
- else if ((deleting = !--clusters)) set_fat(fs,walk,-1);
- prev = walk;
- walk = next;
- }
-}
-
-
-static void auto_rename(DOS_FILE *file)
-{
- DOS_FILE *first,*walk;
- unsigned long int number;
-
- if (!file->offset) return; /* cannot rename FAT32 root dir */
- first = file->parent ? file->parent->first : root;
- number = 0;
- while (1) {
- sprintf(file->dir_ent.name, "FSCK%04d", number / 1000);
- sprintf(file->dir_ent.name, "%03d", number % 1000);
- for (walk = first; walk; walk = walk->next)
- if (walk != file && !strncmp(walk->dir_ent.name,file->dir_ent.
- name,MSDOS_NAME)) break;
- if (!walk) {
- fs_write(file->offset,MSDOS_NAME,file->dir_ent.name);
- return;
- }
- number++;
- if (number > 9999999) {
- die("Too many files need repair.");
- }
- }
- die("Can't generate a unique name.");
-}
-
-
-static void rename_file(DOS_FILE *file)
-{
- unsigned char name[46];
- unsigned char *walk,*here;
-
- if (!file->offset) {
- printf( "Cannot rename FAT32 root dir\n" );
- return; /* cannot rename FAT32 root dir */
- }
- while (1) {
- printf("New name: ");
- fflush(stdout);
- if (fgets(name,45,stdin)) {
- if ((here = strchr(name,'\n'))) *here = 0;
- for (walk = strrchr(name,0); walk >= name && (*walk == ' ' ||
- *walk == '\t'); walk--);
- walk[1] = 0;
- for (walk = name; *walk == ' ' || *walk == '\t'; walk++);
- if (file_cvt(walk,file->dir_ent.name)) {
- fs_write(file->offset,MSDOS_NAME,file->dir_ent.name);
- return;
- }
- }
- }
-}
-
-
-static int handle_dot(DOS_FS *fs,DOS_FILE *file,int dots)
-{
- char *name;
-
- name = strncmp(file->dir_ent.name,MSDOS_DOT,MSDOS_NAME) ? ".." : ".";
- if (!(file->dir_ent.attr & ATTR_DIR)) {
- printf("%s\n Is a non-directory.\n",path_name(file));
- if (interactive)
- printf("1) Drop it\n2) Auto-rename\n3) Rename\n"
- "4) Convert to directory\n");
- else printf(" Auto-renaming it.\n");
- switch (interactive ? get_key("1234","?") : '2') {
- case '1':
- drop_file(fs,file);
- return 1;
- case '2':
- auto_rename(file);
- printf(" Renamed to %s\n",file_name(file->dir_ent.name));
- return 0;
- case '3':
- rename_file(file);
- return 0;
- case '4':
- MODIFY(file,size,CT_LE_L(0));
- MODIFY(file,attr,file->dir_ent.attr | ATTR_DIR);
- break;
- }
- }
- if (!dots) {
- printf("Root contains directory \"%s\". Dropping it.\n",name);
- drop_file(fs,file);
- return 1;
- }
- return 0;
-}
-
-
-static int check_file(DOS_FS *fs,DOS_FILE *file)
-{
- DOS_FILE *owner;
- int restart;
- unsigned long expect,curr,this,clusters,prev,walk,clusters2;
-
- if (file->dir_ent.attr & ATTR_DIR) {
- if (CF_LE_L(file->dir_ent.size)) {
- printf("%s\n Directory has non-zero size. Fixing it.\n",
- path_name(file));
- MODIFY(file,size,CT_LE_L(0));
- }
- if (file->parent && !strncmp(file->dir_ent.name,MSDOS_DOT,MSDOS_NAME)) {
- expect = FSTART(file->parent,fs);
- if (FSTART(file,fs) != expect) {
- printf("%s\n Start (%ld) does not point to parent (%ld)\n",
- path_name(file),FSTART(file,fs),expect);
- MODIFY_START(file,expect,fs);
- }
- return 0;
- }
- if (file->parent && !strncmp(file->dir_ent.name,MSDOS_DOTDOT,
- MSDOS_NAME)) {
- expect = file->parent->parent ? FSTART(file->parent->parent,fs):0;
- if (fs->root_cluster && expect == fs->root_cluster)
- expect = 0;
- if (FSTART(file,fs) != expect) {
- printf("%s\n Start (%lu) does not point to .. (%lu)\n",
- path_name(file),FSTART(file,fs),expect);
- MODIFY_START(file,expect,fs);
- }
- return 0;
- }
- if (FSTART(file,fs)==0){
- printf ("%s\n Start does point to root directory. Deleting dir. \n",
- path_name(file));
- MODIFY(file,name[0],DELETED_FLAG);
- return 0;
- }
- }
- if (FSTART(file,fs) >= fs->clusters+2) {
- printf("%s\n Start cluster beyond limit (%lu > %lu). Truncating file.\n",
- path_name(file),FSTART(file,fs),fs->clusters+1);
- if (!file->offset)
- die( "Bad FAT32 root directory! (bad start cluster)\n" );
- MODIFY_START(file,0,fs);
- }
- clusters = prev = 0;
- for (curr = FSTART(file,fs) ? FSTART(file,fs) :
- -1; curr != -1; curr = next_cluster(fs,curr)) {
- if (!fs->fat[curr].value || bad_cluster(fs,curr)) {
- printf("%s\n Contains a %s cluster (%lu). Assuming EOF.\n",
- path_name(file),fs->fat[curr].value ? "bad" : "free",curr);
- if (prev) set_fat(fs,prev,-1);
- else if (!file->offset)
- die( "FAT32 root dir starts with a bad cluster!" );
- else MODIFY_START(file,0,fs);
- break;
- }
- if (!(file->dir_ent.attr & ATTR_DIR) && CF_LE_L(file->dir_ent.size) <=
- (unsigned long long)clusters*fs->cluster_size) {
- printf("%s\n File size is %u bytes, cluster chain length is > %llu "
- "bytes.\n Truncating file to %u bytes.\n",path_name(file),
- CF_LE_L(file->dir_ent.size),(unsigned long long)clusters*fs->cluster_size,
- CF_LE_L(file->dir_ent.size));
- truncate_file(fs,file,clusters);
- break;
- }
- if ((owner = get_owner(fs,curr))) {
- int do_trunc = 0;
- printf("%s and\n",path_name(owner));
- printf("%s\n share clusters.\n",path_name(file));
- clusters2 = 0;
- for (walk = FSTART(owner,fs); walk > 0 && walk != -1; walk =
- next_cluster(fs,walk))
- if (walk == curr) break;
- else clusters2++;
- restart = file->dir_ent.attr & ATTR_DIR;
- if (!owner->offset) {
- printf( " Truncating second to %llu bytes because first "
- "is FAT32 root dir.\n", (unsigned long long)clusters2*fs->cluster_size );
- do_trunc = 2;
- }
- else if (!file->offset) {
- printf( " Truncating first to %llu bytes because second "
- "is FAT32 root dir.\n", (unsigned long long)clusters*fs->cluster_size );
- do_trunc = 1;
- }
- else if (interactive)
- printf("1) Truncate first to %llu bytes%s\n"
- "2) Truncate second to %llu bytes\n",(unsigned long long)clusters*fs->cluster_size,
- restart ? " and restart" : "",(unsigned long long)clusters2*fs->cluster_size);
- else printf(" Truncating second to %llu bytes.\n",(unsigned long long)clusters2*
- fs->cluster_size);
- if (do_trunc != 2 &&
- (do_trunc == 1 ||
- (interactive && get_key("12","?") == '1'))) {
- prev = 0;
- clusters = 0;
- for (this = FSTART(owner,fs); this > 0 && this != -1; this =
- next_cluster(fs,this)) {
- if (this == curr) {
- if (prev) set_fat(fs,prev,-1);
- else MODIFY_START(owner,0,fs);
- MODIFY(owner,size,CT_LE_L((unsigned long long)clusters*fs->cluster_size));
- if (restart) return 1;
- while (this > 0 && this != -1) {
- set_owner(fs,this,NULL);
- this = next_cluster(fs,this);
- }
- this = curr;
- break;
- }
- clusters++;
- prev = this;
- }
- if (this != curr)
- die("Internal error: didn't find cluster %d in chain"
- " starting at %d",curr,FSTART(owner,fs));
- }
- else {
- if (prev) set_fat(fs,prev,-1);
- else MODIFY_START(file,0,fs);
- break;
- }
- }
- set_owner(fs,curr,file);
- clusters++;
- prev = curr;
- }
- if (!(file->dir_ent.attr & ATTR_DIR) && CF_LE_L(file->dir_ent.size) >
- (unsigned long long)clusters*fs->cluster_size) {
- printf("%s\n File size is %u bytes, cluster chain length is %llu bytes."
- "\n Truncating file to %lu bytes.\n",path_name(file),CF_LE_L(file->
- dir_ent.size),(unsigned long long)clusters*fs->cluster_size,(unsigned long long)clusters*fs->cluster_size);
- MODIFY(file,size,CT_LE_L((unsigned long long)clusters*fs->cluster_size));
- }
- return 0;
-}
-
-
-static int check_files(DOS_FS *fs,DOS_FILE *start)
-{
- while (start) {
- if (check_file(fs,start)) return 1;
- start = start->next;
- }
- return 0;
-}
-
-
-static int check_dir(DOS_FS *fs,DOS_FILE **root,int dots)
-{
- DOS_FILE *parent,**walk,**scan;
- int dot,dotdot,skip,redo;
- int good,bad;
-
- if (!*root) return 0;
- parent = (*root)->parent;
- good = bad = 0;
- for (walk = root; *walk; walk = &(*walk)->next)
- if (bad_name((*walk)->dir_ent.name)) bad++;
- else good++;
- if (*root && parent && good+bad > 4 && bad > good/2) {
- printf("%s\n Has a large number of bad entries. (%d/%d)\n",
- path_name(parent),bad,good+bad);
- if (!dots) printf( " Not dropping root directory.\n" );
- else if (!interactive) printf(" Not dropping it in auto-mode.\n");
- else if (get_key("yn","Drop directory ? (y/n)") == 'y') {
- truncate_file(fs,parent,0);
- MODIFY(parent,name[0],DELETED_FLAG);
- /* buglet: deleted directory stays in the list. */
- return 1;
- }
- }
- dot = dotdot = redo = 0;
- walk = root;
- while (*walk) {
- if (!strncmp((*walk)->dir_ent.name,MSDOS_DOT,MSDOS_NAME) ||
- !strncmp((*walk)->dir_ent.name,MSDOS_DOTDOT,MSDOS_NAME)) {
- if (handle_dot(fs,*walk,dots)) {
- *walk = (*walk)->next;
- continue;
- }
- if (!strncmp((*walk)->dir_ent.name,MSDOS_DOT,MSDOS_NAME)) dot++;
- else dotdot++;
- }
- if (!((*walk)->dir_ent.attr & ATTR_VOLUME) &&
- bad_name((*walk)->dir_ent.name)) {
- printf("%s\n Bad file name.\n",path_name(*walk));
- if (interactive)
- printf("1) Drop file\n2) Rename file\n3) Auto-rename\n"
- "4) Keep it\n");
- else printf(" Auto-renaming it.\n");
- switch (interactive ? get_key("1234","?") : '3') {
- case '1':
- drop_file(fs,*walk);
- walk = &(*walk)->next;
- continue;
- case '2':
- rename_file(*walk);
- redo = 1;
- break;
- case '3':
- auto_rename(*walk);
- printf(" Renamed to %s\n",file_name((*walk)->dir_ent.
- name));
- break;
- case '4':
- break;
- }
- }
- /* don't check for duplicates of the volume label */
- if (!((*walk)->dir_ent.attr & ATTR_VOLUME)) {
- scan = &(*walk)->next;
- skip = 0;
- while (*scan && !skip) {
- if (!((*scan)->dir_ent.attr & ATTR_VOLUME) &&
- !strncmp((*walk)->dir_ent.name,(*scan)->dir_ent.name,MSDOS_NAME)) {
- printf("%s\n Duplicate directory entry.\n First %s\n",
- path_name(*walk),file_stat(*walk));
- printf(" Second %s\n",file_stat(*scan));
- if (interactive)
- printf("1) Drop first\n2) Drop second\n3) Rename first\n"
- "4) Rename second\n5) Auto-rename first\n"
- "6) Auto-rename second\n");
- else printf(" Auto-renaming second.\n");
- switch (interactive ? get_key("123456","?") : '6') {
- case '1':
- drop_file(fs,*walk);
- *walk = (*walk)->next;
- skip = 1;
- break;
- case '2':
- drop_file(fs,*scan);
- *scan = (*scan)->next;
- continue;
- case '3':
- rename_file(*walk);
- printf(" Renamed to %s\n",path_name(*walk));
- redo = 1;
- break;
- case '4':
- rename_file(*scan);
- printf(" Renamed to %s\n",path_name(*walk));
- redo = 1;
- break;
- case '5':
- auto_rename(*walk);
- printf(" Renamed to %s\n",file_name((*walk)->dir_ent.
- name));
- break;
- case '6':
- auto_rename(*scan);
- printf(" Renamed to %s\n",file_name((*scan)->dir_ent.
- name));
- break;
- }
- }
- scan = &(*scan)->next;
- }
- if (skip) continue;
- }
- if (!redo) walk = &(*walk)->next;
- else {
- walk = root;
- dot = dotdot = redo = 0;
- }
- }
- if (dots && !dot)
- printf("%s\n \".\" is missing. Can't fix this yet.\n",
- path_name(parent));
- if (dots && !dotdot)
- printf("%s\n \"..\" is missing. Can't fix this yet.\n",
- path_name(parent));
- return 0;
-}
-
-
-static void test_file(DOS_FS *fs,DOS_FILE *file,int read_test)
-{
- DOS_FILE *owner;
- unsigned long walk,prev,clusters,next_clu;
-
- prev = clusters = 0;
- for (walk = FSTART(file,fs); walk > 0 && walk < fs->clusters+2;
- walk = next_clu) {
- next_clu = next_cluster(fs,walk);
- if ((owner = get_owner(fs,walk))) {
- if (owner == file) {
- printf("%s\n Circular cluster chain. Truncating to %lu "
- "cluster%s.\n",path_name(file),clusters,clusters == 1 ? "" :
- "s");
- if (prev) set_fat(fs,prev,-1);
- else if (!file->offset)
- die( "Bad FAT32 root directory! (bad start cluster)\n" );
- else MODIFY_START(file,0,fs);
- }
- break;
- }
- if (bad_cluster(fs,walk)) break;
- if (read_test) {
- if (fs_test(cluster_start(fs,walk),fs->cluster_size)) {
- prev = walk;
- clusters++;
- }
- else {
- printf("%s\n Cluster %lu (%lu) is unreadable. Skipping it.\n",
- path_name(file),clusters,walk);
- if (prev) set_fat(fs,prev,next_cluster(fs,walk));
- else MODIFY_START(file,next_cluster(fs,walk),fs);
- set_fat(fs,walk,-2);
- }
- }
- set_owner(fs,walk,file);
- }
- for (walk = FSTART(file,fs); walk > 0 && walk < fs->clusters+2;
- walk = next_cluster(fs,walk))
- if (bad_cluster(fs,walk)) break;
- else if (get_owner(fs,walk) == file) set_owner(fs,walk,NULL);
- else break;
-}
-
-
-static void undelete(DOS_FS *fs,DOS_FILE *file)
-{
- unsigned long clusters,left,prev,walk;
-
- clusters = left = (CF_LE_L(file->dir_ent.size)+fs->cluster_size-1)/
- fs->cluster_size;
- prev = 0;
- for (walk = FSTART(file,fs); left && walk >= 2 && walk <
- fs->clusters+2 && !fs->fat[walk].value; walk++) {
- left--;
- if (prev) set_fat(fs,prev,walk);
- prev = walk;
- }
- if (prev) set_fat(fs,prev,-1);
- else MODIFY_START(file,0,fs);
- if (left)
- printf("Warning: Did only undelete %lu of %lu cluster%s.\n",clusters-left,
- clusters,clusters == 1 ? "" : "s");
-
-}
-
-
-static void new_dir( void )
-{
- lfn_reset();
-}
-
-
-static void add_file(DOS_FS *fs,DOS_FILE ***chain,DOS_FILE *parent,
- loff_t offset,FDSC **cp)
-{
- DOS_FILE *new;
- DIR_ENT de;
- FD_TYPE type;
-
- if (offset)
- fs_read(offset,sizeof(DIR_ENT),&de);
- else {
- memcpy(de.name," ",MSDOS_NAME);
- de.attr = ATTR_DIR;
- de.size = de.time = de.date = 0;
- de.start = CT_LE_W(fs->root_cluster & 0xffff);
- de.starthi = CT_LE_W((fs->root_cluster >> 16) & 0xffff);
- }
- if ((type = file_type(cp,de.name)) != fdt_none) {
- if (type == fdt_undelete && (de.attr & ATTR_DIR))
- die("Can't undelete directories.");
- file_modify(cp,de.name);
- fs_write(offset,1,&de);
- }
- if (IS_FREE(de.name)) {
- lfn_check_orphaned();
- return;
- }
- if (de.attr == VFAT_LN_ATTR) {
- lfn_add_slot(&de,offset);
- return;
- }
- new = qalloc(&mem_queue,sizeof(DOS_FILE));
- new->lfn = lfn_get(&de);
- new->offset = offset;
- memcpy(&new->dir_ent,&de,sizeof(de));
- new->next = new->first = NULL;
- new->parent = parent;
- if (type == fdt_undelete) undelete(fs,new);
- **chain = new;
- *chain = &new->next;
- if (list) {
- printf("Checking file %s",path_name(new));
- if (new->lfn)
- printf(" (%s)", file_name(new->dir_ent.name) );
- printf("\n");
- }
- if (offset &&
- strncmp(de.name,MSDOS_DOT,MSDOS_NAME) != 0 &&
- strncmp(de.name,MSDOS_DOTDOT,MSDOS_NAME) != 0)
- ++n_files;
- test_file(fs,new,test);
-}
-
-
-static int subdirs(DOS_FS *fs,DOS_FILE *parent,FDSC **cp);
-
-
-static int scan_dir(DOS_FS *fs,DOS_FILE *this,FDSC **cp)
-{
- DOS_FILE **chain;
- int i;
- unsigned long clu_num;
-
- chain = &this->first;
- i = 0;
- clu_num = FSTART(this,fs);
- new_dir();
- while (clu_num > 0 && clu_num != -1) {
- add_file(fs,&chain,this,cluster_start(fs,clu_num)+(i % fs->
- cluster_size),cp);
- i += sizeof(DIR_ENT);
- if (!(i % fs->cluster_size))
- if ((clu_num = next_cluster(fs,clu_num)) == 0 || clu_num == -1)
- break;
- }
- lfn_check_orphaned();
- if (check_dir(fs,&this->first,this->offset)) return 0;
- if (check_files(fs,this->first)) return 1;
- return subdirs(fs,this,cp);
-}
-
-
-static int subdirs(DOS_FS *fs,DOS_FILE *parent,FDSC **cp)
-{
- DOS_FILE *walk;
-
- for (walk = parent ? parent->first : root; walk; walk = walk->next)
- if (walk->dir_ent.attr & ATTR_DIR)
- if (strncmp(walk->dir_ent.name,MSDOS_DOT,MSDOS_NAME) &&
- strncmp(walk->dir_ent.name,MSDOS_DOTDOT,MSDOS_NAME))
- if (scan_dir(fs,walk,file_cd(cp,walk->dir_ent.name))) return 1;
- return 0;
-}
-
-
-int scan_root(DOS_FS *fs)
-{
- DOS_FILE **chain;
- int i;
-
- root = NULL;
- chain = &root;
- new_dir();
- if (fs->root_cluster) {
- add_file(fs,&chain,NULL,0,&fp_root);
- }
- else {
- for (i = 0; i < fs->root_entries; i++)
- add_file(fs,&chain,NULL,fs->root_start+i*sizeof(DIR_ENT),&fp_root);
- }
- lfn_check_orphaned();
- (void) check_dir(fs,&root,0);
- if (check_files(fs,root)) return 1;
- return subdirs(fs,NULL,&fp_root);
-}
-
-/* Local Variables: */
-/* tab-width: 8 */
-/* End: */
diff --git a/src/check.h b/src/check.h
deleted file mode 100644
index a41bb86..0000000
--- a/src/check.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* check.h - Check and repair a PC/MS-DOS file system
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-
-#ifndef _CHECK_H
-#define _CHECK_H
-
-loff_t alloc_rootdir_entry(DOS_FS *fs, DIR_ENT *de, const char *pattern);
-
-/* Allocate a free slot in the root directory for a new file. The file name is
- constructed after 'pattern', which must include a %d type format for printf
- and expand to exactly 11 characters. The name actually used is written into
- the 'de' structure, the rest of *de is cleared. The offset returned is to
- where in the filesystem the entry belongs. */
-
-int scan_root(DOS_FS *fs);
-
-/* Scans the root directory and recurses into all subdirectories. See check.c
- for all the details. Returns a non-zero integer if the file system has to
- be checked again. */
-
-#endif
diff --git a/src/common.c b/src/common.c
deleted file mode 100644
index 92312e4..0000000
--- a/src/common.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/* common.c - Common functions
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
- Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-/* FAT32, VFAT, Atari format support, and various fixes additions May 1998
- * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
-
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
-#include <errno.h>
-
-#include "common.h"
-
-
-typedef struct _link {
- void *data;
- struct _link *next;
-} LINK;
-
-
-void die(char *msg,...)
-{
- va_list args;
-
- va_start(args,msg);
- vfprintf(stderr,msg,args);
- va_end(args);
- fprintf(stderr,"\n");
- exit(1);
-}
-
-
-void pdie(char *msg,...)
-{
- va_list args;
-
- va_start(args,msg);
- vfprintf(stderr,msg,args);
- va_end(args);
- fprintf(stderr,":%s\n",strerror(errno));
- exit(1);
-}
-
-
-void *alloc(int size)
-{
- void *this;
-
- if ((this = malloc(size))) return this;
- pdie("malloc");
- return NULL; /* for GCC */
-}
-
-
-void *qalloc(void **root,int size)
-{
- LINK *link;
-
- link = alloc(sizeof(LINK));
- link->next = *root;
- *root = link;
- return link->data = alloc(size);
-}
-
-
-void qfree(void **root)
-{
- LINK *this;
-
- while (*root) {
- this = (LINK *) *root;
- *root = this->next;
- free(this->data);
- free(this);
- }
-}
-
-
-int min(int a,int b)
-{
- return a < b ? a : b;
-}
-
-
-char get_key(char *valid,char *prompt)
-{
- int ch,okay;
-
- while (1) {
- if (prompt) printf("%s ",prompt);
- fflush(stdout);
- while (ch = getchar(), ch == ' ' || ch == '\t');
- if (ch == EOF) exit(1);
- if (!strchr(valid,okay = ch)) okay = 0;
- while (ch = getchar(), ch != '\n' && ch != EOF);
- if (ch == EOF) exit(1);
- if (okay) return okay;
- printf("Invalid input.\n");
- }
-}
-
-/* Local Variables: */
-/* tab-width: 8 */
-/* End: */
diff --git a/src/common.h b/src/common.h
deleted file mode 100644
index 99e0be1..0000000
--- a/src/common.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* common.h - Common functions
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-# include <asm/types.h>
-
-#ifndef _COMMON_H
-#define _COMMON_H
-
-void die(char *msg,...) __attribute((noreturn));
-
-/* Displays a prinf-style message and terminates the program. */
-
-void pdie(char *msg,...) __attribute((noreturn));
-
-/* Like die, but appends an error message according to the state of errno. */
-
-void *alloc(int size);
-
-/* mallocs SIZE bytes and returns a pointer to the data. Terminates the program
- if malloc fails. */
-
-void *qalloc(void **root,int size);
-
-/* Like alloc, but registers the data area in a list described by ROOT. */
-
-void qfree(void **root);
-
-/* Deallocates all qalloc'ed data areas described by ROOT. */
-
-int min(int a,int b);
-
-/* Returns the smaller integer value of a and b. */
-
-char get_key(char *valid,char *prompt);
-
-/* Displays PROMPT and waits for user input. Only characters in VALID are
- accepted. Terminates the program on EOF. Returns the character. */
-
-#endif
diff --git a/src/dosfsck.c b/src/dosfsck.c
deleted file mode 100644
index c4bcf1b..0000000
--- a/src/dosfsck.c
+++ /dev/null
@@ -1,207 +0,0 @@
-/* dosfsck.c - User interface
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
- Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-/* FAT32, VFAT, Atari format support, and various fixes additions May 1998
- * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
-
-
-#include "version.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <getopt.h>
-
-#include "common.h"
-#include "dosfsck.h"
-#include "io.h"
-#include "boot.h"
-#include "fat.h"
-#include "file.h"
-#include "check.h"
-
-
-int interactive = 0,list = 0,test = 0,verbose = 0,write_immed = 0;
-int atari_format = 0;
-unsigned n_files = 0;
-void *mem_queue = NULL;
-
-
-static void usage(char *name)
-{
- fprintf(stderr,"usage: %s [-aAflrtvVwy] [-d path -d ...] "
- "[-u path -u ...]\n%15sdevice\n",name,"");
- fprintf(stderr," -a automatically repair the file system\n");
- fprintf(stderr," -A toggle Atari file system format\n");
- fprintf(stderr," -d path drop that file\n");
- fprintf(stderr," -f salvage unused chains to files\n");
- fprintf(stderr," -l list path names\n");
- fprintf(stderr," -n no-op, check non-interactively without changing\n");
- fprintf(stderr," -p same as -a, for compat with other *fsck\n");
- fprintf(stderr," -r interactively repair the file system\n");
- fprintf(stderr," -t test for bad clusters\n");
- fprintf(stderr," -u path try to undelete that (non-directory) file\n");
- fprintf(stderr," -v verbose mode\n");
- fprintf(stderr," -V perform a verification pass\n");
- fprintf(stderr," -w write changes to disk immediately\n");
- fprintf(stderr," -y same as -a, for compat with other *fsck\n");
- exit(2);
-}
-
-
-/*
- * ++roman: On m68k, check if this is an Atari; if yes, turn on Atari variant
- * of MS-DOS filesystem by default.
- */
-static void check_atari( void )
-{
-#ifdef __mc68000__
- FILE *f;
- char line[128], *p;
-
- if (!(f = fopen( "/proc/hardware", "r" ))) {
- perror( "/proc/hardware" );
- return;
- }
-
- while( fgets( line, sizeof(line), f ) ) {
- if (strncmp( line, "Model:", 6 ) == 0) {
- p = line + 6;
- p += strspn( p, " \t" );
- if (strncmp( p, "Atari ", 6 ) == 0)
- atari_format = 1;
- break;
- }
- }
- fclose( f );
-#endif
-}
-
-
-int main(int argc,char **argv)
-{
- DOS_FS fs;
- int rw,salvage_files,verify,c;
- unsigned n_files_check=0, n_files_verify=0;
- unsigned long free_clusters;
-
- rw = salvage_files = verify = 0;
- interactive = 1;
- check_atari();
-
- while ((c = getopt(argc,argv,"Aad:flnprtu:vVwy")) != EOF)
- switch (c) {
- case 'A': /* toggle Atari format */
- atari_format = !atari_format;
- break;
- case 'a':
- case 'p':
- case 'y':
- rw = 1;
- interactive = 0;
-// salvage_files = 1;
- break;
- case 'd':
- file_add(optarg,fdt_drop);
- break;
- case 'f':
- salvage_files = 1;
- break;
- case 'l':
- list = 1;
- break;
- case 'n':
- rw = 0;
- interactive = 0;
- break;
- case 'r':
- rw = 1;
- interactive = 1;
- break;
- case 't':
- test = 1;
- break;
- case 'u':
- file_add(optarg,fdt_undelete);
- break;
- case 'v':
- verbose = 1;
- printf("dosfsck " VERSION " (" VERSION_DATE ")\n");
- break;
- case 'V':
- verify = 1;
- break;
- case 'w':
- write_immed = 1;
- break;
- default:
- usage(argv[0]);
- }
- if ((test || write_immed) && !rw) {
- fprintf(stderr,"-t and -w require -a or -r\n");
- exit(2);
- }
- if (optind != argc-1) usage(argv[0]);
-
- printf( "dosfsck " VERSION ", " VERSION_DATE ", FAT32, LFN\n" );
- fs_open(argv[optind],rw);
- read_boot(&fs);
- if (verify) printf("Starting check/repair pass.\n");
- while (read_fat(&fs), scan_root(&fs)) qfree(&mem_queue);
- if (test) fix_bad(&fs);
- if (salvage_files) reclaim_file(&fs);
- else reclaim_free(&fs);
- free_clusters = update_free(&fs);
- file_unused();
- qfree(&mem_queue);
- n_files_check = n_files;
- if (verify) {
- n_files = 0;
- printf("Starting verification pass.\n");
- read_fat(&fs);
- scan_root(&fs);
- reclaim_free(&fs);
- qfree(&mem_queue);
- n_files_verify = n_files;
- }
-
- if (fs_changed()) {
- if (rw) {
- if (interactive)
- rw = get_key("yn","Perform changes ? (y/n)") == 'y';
- else printf("Performing changes.\n");
- }
- else
- printf("Leaving file system unchanged.\n");
- }
-
- printf( "%s: %u files, %lu/%lu clusters\n", argv[optind],
- n_files, fs.clusters - free_clusters, fs.clusters );
-
- exit(fs_close(rw) ? 4 : 0);
-}
-
-/* Local Variables: */
-/* tab-width: 8 */
-/* End: */
diff --git a/src/dosfsck.h b/src/dosfsck.h
deleted file mode 100644
index 3d2004c..0000000
--- a/src/dosfsck.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/* dosfsck.h - Common data structures and global variables
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
- Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-/* FAT32, VFAT, Atari format support, and various fixes additions May 1998
- * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
-
-
-#ifndef _DOSFSCK_H
-#define _DOSFSCK_H
-
-#include <sys/types.h>
-#define _LINUX_STAT_H /* hack to avoid inclusion of <linux/stat.h> */
-#define _LINUX_STRING_H_ /* hack to avoid inclusion of <linux/string.h>*/
-#define _LINUX_FS_H /* hack to avoid inclusion of <linux/fs.h> */
-
-# include <asm/types.h>
-# include <asm/byteorder.h>
-
-#include <linux/msdos_fs.h>
-
-#undef CF_LE_W
-#undef CF_LE_L
-#undef CT_LE_W
-#undef CT_LE_L
-
-#if defined __arm__
- #undef __BYTE_ORDER
- #define __BYTE_ORDER __LITTLE_ENDIAN
-#endif
-
-#if __BYTE_ORDER == __BIG_ENDIAN
-#include <byteswap.h>
-#define CF_LE_W(v) bswap_16(v)
-#define CF_LE_L(v) bswap_32(v)
-#define CT_LE_W(v) CF_LE_W(v)
-#define CT_LE_L(v) CF_LE_L(v)
-#else
-#define CF_LE_W(v) (v)
-#define CF_LE_L(v) (v)
-#define CT_LE_W(v) (v)
-#define CT_LE_L(v) (v)
-#endif /* __BIG_ENDIAN */
-
-#define VFAT_LN_ATTR (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
-
-/* ++roman: Use own definition of boot sector structure -- the kernel headers'
- * name for it is msdos_boot_sector in 2.0 and fat_boot_sector in 2.1 ... */
-struct boot_sector {
- __u8 ignored[3]; /* Boot strap short or near jump */
- __u8 system_id[8]; /* Name - can be used to special case
- partition manager volumes */
- __u8 sector_size[2]; /* bytes per logical sector */
- __u8 cluster_size; /* sectors/cluster */
- __u16 reserved; /* reserved sectors */
- __u8 fats; /* number of FATs */
- __u8 dir_entries[2]; /* root directory entries */
- __u8 sectors[2]; /* number of sectors */
- __u8 media; /* media code (unused) */
- __u16 fat_length; /* sectors/FAT */
- __u16 secs_track; /* sectors per track */
- __u16 heads; /* number of heads */
- __u32 hidden; /* hidden sectors (unused) */
- __u32 total_sect; /* number of sectors (if sectors == 0) */
-
- /* The following fields are only used by FAT32 */
- __u32 fat32_length; /* sectors/FAT */
- __u16 flags; /* bit 8: fat mirroring, low 4: active fat */
- __u8 version[2]; /* major, minor filesystem version */
- __u32 root_cluster; /* first cluster in root directory */
- __u16 info_sector; /* filesystem info sector */
- __u16 backup_boot; /* backup boot sector */
- __u8 reserved2[12]; /* Unused */
-
- __u8 drive_number; /* Logical Drive Number */
- __u8 reserved3; /* Unused */
-
- __u8 extended_sig; /* Extended Signature (0x29) */
- __u32 serial; /* Serial number */
- __u8 label[11]; /* FS label */
- __u8 fs_type[8]; /* FS Type */
-
- /* fill up to 512 bytes */
- __u8 junk[422];
-} __attribute__ ((packed));
-
-struct boot_sector_16 {
- __u8 ignored[3]; /* Boot strap short or near jump */
- __u8 system_id[8]; /* Name - can be used to special case
- partition manager volumes */
- __u8 sector_size[2]; /* bytes per logical sector */
- __u8 cluster_size; /* sectors/cluster */
- __u16 reserved; /* reserved sectors */
- __u8 fats; /* number of FATs */
- __u8 dir_entries[2]; /* root directory entries */
- __u8 sectors[2]; /* number of sectors */
- __u8 media; /* media code (unused) */
- __u16 fat_length; /* sectors/FAT */
- __u16 secs_track; /* sectors per track */
- __u16 heads; /* number of heads */
- __u32 hidden; /* hidden sectors (unused) */
- __u32 total_sect; /* number of sectors (if sectors == 0) */
-
- __u8 drive_number; /* Logical Drive Number */
- __u8 reserved2; /* Unused */
-
- __u8 extended_sig; /* Extended Signature (0x29) */
- __u32 serial; /* Serial number */
- __u8 label[11]; /* FS label */
- __u8 fs_type[8]; /* FS Type */
-
- /* fill up to 512 bytes */
- __u8 junk[450];
-} __attribute__ ((packed));
-
-struct info_sector {
- __u32 magic; /* Magic for info sector ('RRaA') */
- __u8 junk[0x1dc];
- __u32 reserved1; /* Nothing as far as I can tell */
- __u32 signature; /* 0x61417272 ('rrAa') */
- __u32 free_clusters; /* Free cluster count. -1 if unknown */
- __u32 next_cluster; /* Most recently allocated cluster. */
- __u32 reserved2[3];
- __u16 reserved3;
- __u16 boot_sign;
-};
-
-typedef struct {
- __u8 name[8],ext[3]; /* name and extension */
- __u8 attr; /* attribute bits */
- __u8 lcase; /* Case for base and extension */
- __u8 ctime_ms; /* Creation time, milliseconds */
- __u16 ctime; /* Creation time */
- __u16 cdate; /* Creation date */
- __u16 adate; /* Last access date */
- __u16 starthi; /* High 16 bits of cluster in FAT32 */
- __u16 time,date,start;/* time, date and first cluster */
- __u32 size; /* file size (in bytes) */
-} DIR_ENT;
-
-typedef struct _dos_file {
- DIR_ENT dir_ent;
- char *lfn;
- loff_t offset;
- struct _dos_file *parent; /* parent directory */
- struct _dos_file *next; /* next entry */
- struct _dos_file *first; /* first entry (directory only) */
-} DOS_FILE;
-
-typedef struct {
- unsigned long value;
- unsigned long reserved;
- DOS_FILE *owner;
- int prev; /* number of previous clusters */
-} FAT_ENTRY;
-
-typedef struct {
- int nfats;
- loff_t fat_start;
- unsigned int fat_size; /* unit is bytes */
- unsigned int fat_bits; /* size of a FAT entry */
- unsigned int eff_fat_bits; /* # of used bits in a FAT entry */
- unsigned long root_cluster; /* 0 for old-style root dir */
- loff_t root_start;
- unsigned int root_entries;
- loff_t data_start;
- unsigned int cluster_size;
- unsigned long clusters;
- loff_t fsinfo_start; /* 0 if not present */
- long free_clusters;
- loff_t backupboot_start; /* 0 if not present */
- FAT_ENTRY *fat;
- char *label;
-} DOS_FS;
-
-#ifndef offsetof
-#define offsetof(t,e) ((int)&(((t *)0)->e))
-#endif
-
-extern int interactive,list,verbose,test,write_immed;
-extern int atari_format;
-extern unsigned n_files;
-extern void *mem_queue;
-
-/* value to use as end-of-file marker */
-#define FAT_EOF(fs) ((atari_format ? 0xfff : 0xff8) | FAT_EXTD(fs))
-#define FAT_IS_EOF(fs,v) ((unsigned long)(v) >= (0xff8|FAT_EXTD(fs)))
-/* value to mark bad clusters */
-#define FAT_BAD(fs) (0xff7 | FAT_EXTD(fs))
-/* range of values used for bad clusters */
-#define FAT_MIN_BAD(fs) ((atari_format ? 0xff0 : 0xff7) | FAT_EXTD(fs))
-#define FAT_MAX_BAD(fs) ((atari_format ? 0xff7 : 0xff7) | FAT_EXTD(fs))
-#define FAT_IS_BAD(fs,v) ((v) >= FAT_MIN_BAD(fs) && (v) <= FAT_MAX_BAD(fs))
-
-/* return -16 as a number with fs->fat_bits bits */
-#define FAT_EXTD(fs) (((1 << fs->eff_fat_bits)-1) & ~0xf)
-
-#endif
-
-/* Local Variables: */
-/* tab-width: 8 */
-/* End: */
diff --git a/src/dosfslabel.c b/src/dosfslabel.c
deleted file mode 100644
index e7be1f6..0000000
--- a/src/dosfslabel.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/* dosfslabel.c - User interface
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
- Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
- Copyright (C) 2007 Red Hat, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-#include "version.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <getopt.h>
-
-#include "common.h"
-#include "dosfsck.h"
-#include "io.h"
-#include "boot.h"
-#include "fat.h"
-#include "file.h"
-#include "check.h"
-
-
-int interactive = 0,list = 0,test = 0,verbose = 0,write_immed = 0;
-int atari_format = 0;
-unsigned n_files = 0;
-void *mem_queue = NULL;
-
-
-static void usage(int error)
-{
- FILE *f = error ? stderr : stdout;
- int status = error ? 1 : 0;
-
- fprintf(f,"usage: dosfslabel device [label]\n");
- exit(status);
-}
-
-/*
- * ++roman: On m68k, check if this is an Atari; if yes, turn on Atari variant
- * of MS-DOS filesystem by default.
- */
-static void check_atari( void )
-{
-#ifdef __mc68000__
- FILE *f;
- char line[128], *p;
-
- if (!(f = fopen( "/proc/hardware", "r" ))) {
- perror( "/proc/hardware" );
- return;
- }
-
- while( fgets( line, sizeof(line), f ) ) {
- if (strncmp( line, "Model:", 6 ) == 0) {
- p = line + 6;
- p += strspn( p, " \t" );
- if (strncmp( p, "Atari ", 6 ) == 0)
- atari_format = 1;
- break;
- }
- }
- fclose( f );
-#endif
-}
-
-
-int main(int argc, char *argv[])
-{
- DOS_FS fs;
- int rw = 0;
-
- char *device = NULL;
- char *label = NULL;
-
- check_atari();
-
- if (argc < 2 || argc > 3)
- usage(1);
-
- if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))
- usage(0);
- else if (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version")) {
- printf( "dosfslabel " VERSION ", " VERSION_DATE ", FAT32, LFN\n" );
- exit(0);
- }
-
- device = argv[1];
- if (argc == 3) {
- label = argv[2];
- if (strlen(label) > 11) {
- fprintf(stderr,
- "dosfslabel: labels can be no longer than 11 characters\n");
- exit(1);
- }
- rw = 1;
- }
-
- fs_open(device, rw);
- read_boot(&fs);
- if (!rw) {
- fprintf(stdout, "%s\n", fs.label);
- exit(0);
- }
-
- write_label(&fs, label);
- return fs_close(rw) ? 1 : 0;
-}
diff --git a/src/fat.c b/src/fat.c
deleted file mode 100644
index d09d888..0000000
--- a/src/fat.c
+++ /dev/null
@@ -1,381 +0,0 @@
-/* fat.c - Read/write access to the FAT
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
- Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-/* FAT32, VFAT, Atari format support, and various fixes additions May 1998
- * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "common.h"
-#include "dosfsck.h"
-#include "io.h"
-#include "check.h"
-#include "fat.h"
-
-
-static void get_fat(FAT_ENTRY *entry,void *fat,unsigned long cluster,DOS_FS *fs)
-{
- unsigned char *ptr;
-
- switch(fs->fat_bits) {
- case 12:
- ptr = &((unsigned char *) fat)[cluster*3/2];
- entry->value = 0xfff & (cluster & 1 ? (ptr[0] >> 4) | (ptr[1] << 4) :
- (ptr[0] | ptr[1] << 8));
- break;
- case 16:
- entry->value = CF_LE_W(((unsigned short *) fat)[cluster]);
- break;
- case 32:
- /* According to M$, the high 4 bits of a FAT32 entry are reserved and
- * are not part of the cluster number. So we cut them off. */
- {
- unsigned long e = CF_LE_L(((unsigned int *) fat)[cluster]);
- entry->value = e & 0xfffffff;
- entry->reserved = e >> 28;
- }
- break;
- default:
- die("Bad FAT entry size: %d bits.",fs->fat_bits);
- }
- entry->owner = NULL;
-}
-
-
-void read_fat(DOS_FS *fs)
-{
- int eff_size;
- unsigned long i;
- void *first,*second = NULL;
- int first_ok,second_ok;
-
- eff_size = ((fs->clusters+2ULL)*fs->fat_bits+7)/8ULL;
- first = alloc(eff_size);
- fs_read(fs->fat_start,eff_size,first);
- if (fs->nfats > 1) {
- second = alloc(eff_size);
- fs_read(fs->fat_start+fs->fat_size,eff_size,second);
- }
- if (second && memcmp(first,second,eff_size) != 0) {
- FAT_ENTRY first_media, second_media;
- get_fat(&first_media,first,0,fs);
- get_fat(&second_media,second,0,fs);
- first_ok = (first_media.value & FAT_EXTD(fs)) == FAT_EXTD(fs);
- second_ok = (second_media.value & FAT_EXTD(fs)) == FAT_EXTD(fs);
- if (first_ok && !second_ok) {
- printf("FATs differ - using first FAT.\n");
- fs_write(fs->fat_start+fs->fat_size,eff_size,first);
- }
- if (!first_ok && second_ok) {
- printf("FATs differ - using second FAT.\n");
- fs_write(fs->fat_start,eff_size,second);
- memcpy(first,second,eff_size);
- }
- if (first_ok && second_ok) {
- if (interactive) {
- printf("FATs differ but appear to be intact. Use which FAT ?\n"
- "1) Use first FAT\n2) Use second FAT\n");
- if (get_key("12","?") == '1') {
- fs_write(fs->fat_start+fs->fat_size,eff_size,first);
- } else {
- fs_write(fs->fat_start,eff_size,second);
- memcpy(first,second,eff_size);
- }
- }
- else {
- printf("FATs differ but appear to be intact. Using first "
- "FAT.\n");
- fs_write(fs->fat_start+fs->fat_size,eff_size,first);
- }
- }
- if (!first_ok && !second_ok) {
- printf("Both FATs appear to be corrupt. Giving up.\n");
- exit(1);
- }
- }
- if (second) {
- free(second);
- }
- fs->fat = qalloc(&mem_queue,sizeof(FAT_ENTRY)*(fs->clusters+2ULL));
- for (i = 2; i < fs->clusters+2; i++) get_fat(&fs->fat[i],first,i,fs);
- for (i = 2; i < fs->clusters+2; i++)
- if (fs->fat[i].value >= fs->clusters+2 &&
- (fs->fat[i].value < FAT_MIN_BAD(fs))) {
- printf("Cluster %ld out of range (%ld > %ld). Setting to EOF.\n",
- i-2,fs->fat[i].value,fs->clusters+2-1);
- set_fat(fs,i,-1);
- }
- free(first);
-}
-
-
-void set_fat(DOS_FS *fs,unsigned long cluster,unsigned long new)
-{
- unsigned char data[4];
- int size;
- loff_t offs;
-
- if ((long)new == -1)
- new = FAT_EOF(fs);
- else if ((long)new == -2)
- new = FAT_BAD(fs);
- switch( fs->fat_bits ) {
- case 12:
- offs = fs->fat_start+cluster*3/2;
- if (cluster & 1) {
- data[0] = ((new & 0xf) << 4) | (fs->fat[cluster-1].value >> 8);
- data[1] = new >> 4;
- }
- else {
- data[0] = new & 0xff;
- data[1] = (new >> 8) | (cluster == fs->clusters-1 ? 0 :
- (0xff & fs->fat[cluster+1].value) << 4);
- }
- size = 2;
- break;
- case 16:
- offs = fs->fat_start+cluster*2;
- *(unsigned short *) data = CT_LE_W(new);
- size = 2;
- break;
- case 32:
- offs = fs->fat_start+cluster*4;
- /* According to M$, the high 4 bits of a FAT32 entry are reserved and
- * are not part of the cluster number. So we never touch them. */
- *(unsigned long *) data = CT_LE_L( (new & 0xfffffff) |
- (fs->fat[cluster].reserved << 28) );
- size = 4;
- break;
- default:
- die("Bad FAT entry size: %d bits.",fs->fat_bits);
- }
- fs->fat[cluster].value = new;
- fs_write(offs,size,&data);
- fs_write(offs+fs->fat_size,size,&data);
-}
-
-
-int bad_cluster(DOS_FS *fs,unsigned long cluster)
-{
- return FAT_IS_BAD(fs,fs->fat[cluster].value);
-}
-
-
-unsigned long next_cluster(DOS_FS *fs,unsigned long cluster)
-{
- unsigned long value;
-
- value = fs->fat[cluster].value;
- if (FAT_IS_BAD(fs,value))
- die("Internal error: next_cluster on bad cluster");
- return FAT_IS_EOF(fs,value) ? -1 : value;
-}
-
-
-loff_t cluster_start(DOS_FS *fs,unsigned long cluster)
-{
- return fs->data_start+((loff_t)cluster-2)*(unsigned long long)fs->cluster_size;
-}
-
-
-void set_owner(DOS_FS *fs,unsigned long cluster,DOS_FILE *owner)
-{
- if (owner && fs->fat[cluster].owner)
- die("Internal error: attempt to change file owner");
- fs->fat[cluster].owner = owner;
-}
-
-
-DOS_FILE *get_owner(DOS_FS *fs,unsigned long cluster)
-{
- return fs->fat[cluster].owner;
-}
-
-
-void fix_bad(DOS_FS *fs)
-{
- unsigned long i;
-
- if (verbose)
- printf("Checking for bad clusters.\n");
- for (i = 2; i < fs->clusters+2; i++)
- if (!get_owner(fs,i) && !FAT_IS_BAD(fs,fs->fat[i].value))
- if (!fs_test(cluster_start(fs,i),fs->cluster_size)) {
- printf("Cluster %lu is unreadable.\n",i);
- set_fat(fs,i,-2);
- }
-}
-
-
-void reclaim_free(DOS_FS *fs)
-{
- int reclaimed;
- unsigned long i;
-
- if (verbose)
- printf("Checking for unused clusters.\n");
- reclaimed = 0;
- for (i = 2; i < fs->clusters+2; i++)
- if (!get_owner(fs,i) && fs->fat[i].value &&
- !FAT_IS_BAD(fs,fs->fat[i].value)) {
- set_fat(fs,i,0);
- reclaimed++;
- }
- if (reclaimed)
- printf("Reclaimed %d unused cluster%s (%llu bytes).\n",reclaimed,
- reclaimed == 1 ? "" : "s",(unsigned long long)reclaimed*fs->cluster_size);
-}
-
-
-static void tag_free(DOS_FS *fs,DOS_FILE *ptr)
-{
- DOS_FILE *owner;
- int prev;
- unsigned long i,walk;
-
- for (i = 2; i < fs->clusters+2; i++)
- if (fs->fat[i].value && !FAT_IS_BAD(fs,fs->fat[i].value) &&
- !get_owner(fs,i) && !fs->fat[i].prev) {
- prev = 0;
- for (walk = i; walk > 0 && walk != -1;
- walk = next_cluster(fs,walk)) {
- if (!(owner = get_owner(fs,walk))) set_owner(fs,walk,ptr);
- else if (owner != ptr)
- die("Internal error: free chain collides with file");
- else {
- set_fat(fs,prev,-1);
- break;
- }
- prev = walk;
- }
- }
-}
-
-
-void reclaim_file(DOS_FS *fs)
-{
- DOS_FILE dummy;
- int reclaimed,files,changed;
- unsigned long i,next,walk;
-
- if (verbose)
- printf("Reclaiming unconnected clusters.\n");
- for (i = 2; i < fs->clusters+2; i++) fs->fat[i].prev = 0;
- for (i = 2; i < fs->clusters+2; i++) {
- next = fs->fat[i].value;
- if (!get_owner(fs,i) && next && next < fs->clusters+2) {
- if (get_owner(fs,next) || !fs->fat[next].value ||
- FAT_IS_BAD(fs,fs->fat[next].value)) set_fat(fs,i,-1);
- else fs->fat[next].prev++;
- }
- }
- do {
- tag_free(fs,&dummy);
- changed = 0;
- for (i = 2; i < fs->clusters+2; i++)
- if (fs->fat[i].value && !FAT_IS_BAD(fs,fs->fat[i].value) &&
- !get_owner(fs, i)) {
- if (!fs->fat[fs->fat[i].value].prev--)
- die("Internal error: prev going below zero");
- set_fat(fs,i,-1);
- changed = 1;
- printf("Broke cycle at cluster %lu in free chain.\n",i);
- break;
- }
- }
- while (changed);
- files = reclaimed = 0;
- for (i = 2; i < fs->clusters+2; i++)
- if (get_owner(fs,i) == &dummy && !fs->fat[i].prev) {
- DIR_ENT de;
- loff_t offset;
- files++;
- offset = alloc_rootdir_entry(fs,&de,"FSCK%04dREC");
- de.start = CT_LE_W(i&0xffff);
- if (fs->fat_bits == 32)
- de.starthi = CT_LE_W(i>>16);
- for (walk = i; walk > 0 && walk != -1;
- walk = next_cluster(fs,walk)) {
- de.size = CT_LE_L(CF_LE_L(de.size)+fs->cluster_size);
- reclaimed++;
- }
- fs_write(offset,sizeof(DIR_ENT),&de);
- }
- if (reclaimed)
- printf("Reclaimed %d unused cluster%s (%llu bytes) in %d chain%s.\n",
- reclaimed,reclaimed == 1 ? "" : "s",(unsigned long long)reclaimed*fs->cluster_size,files,
- files == 1 ? "" : "s");
-}
-
-
-unsigned long update_free(DOS_FS *fs)
-{
- unsigned long i;
- unsigned long free = 0;
- int do_set = 0;
-
- for (i = 2; i < fs->clusters+2; i++)
- if (!get_owner(fs,i) && !FAT_IS_BAD(fs,fs->fat[i].value))
- ++free;
-
- if (!fs->fsinfo_start)
- return free;
-
- if (verbose)
- printf("Checking free cluster summary.\n");
- if (fs->free_clusters >= 0) {
- if (free != fs->free_clusters) {
- printf( "Free cluster summary wrong (%ld vs. really %ld)\n",
- fs->free_clusters,free);
- if (interactive)
- printf( "1) Correct\n2) Don't correct\n" );
- else printf( " Auto-correcting.\n" );
- if (!interactive || get_key("12","?") == '1')
- do_set = 1;
- }
- }
- else {
- printf( "Free cluster summary uninitialized (should be %ld)\n", free );
- if (interactive)
- printf( "1) Set it\n2) Leave it uninitialized\n" );
- else printf( " Auto-setting.\n" );
- if (!interactive || get_key("12","?") == '1')
- do_set = 1;
- }
-
- if (do_set) {
- fs->free_clusters = free;
- free = CT_LE_L(free);
- fs_write(fs->fsinfo_start+offsetof(struct info_sector,free_clusters),
- sizeof(free),&free);
- }
-
- return free;
-}
-
-/* Local Variables: */
-/* tab-width: 8 */
-/* End: */
diff --git a/src/fat.h b/src/fat.h
deleted file mode 100644
index c5f7849..0000000
--- a/src/fat.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* fat.h - Read/write access to the FAT
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-
-#ifndef _FAT_H
-#define _FAT_H
-
-void read_fat(DOS_FS *fs);
-
-/* Loads the FAT of the file system described by FS. Initializes the FAT,
- replaces broken FATs and rejects invalid cluster entries. */
-
-void set_fat(DOS_FS *fs,unsigned long cluster,unsigned long new);
-
-/* Changes the value of the CLUSTERth cluster of the FAT of FS to NEW. Special
- values of NEW are -1 (EOF, 0xff8 or 0xfff8) and -2 (bad sector, 0xff7 or
- 0xfff7) */
-
-int bad_cluster(DOS_FS *fs,unsigned long cluster);
-
-/* Returns a non-zero integer if the CLUSTERth cluster is marked as bad or zero
- otherwise. */
-
-unsigned long next_cluster(DOS_FS *fs,unsigned long cluster);
-
-/* Returns the number of the cluster following CLUSTER, or -1 if this is the
- last cluster of the respective cluster chain. CLUSTER must not be a bad
- cluster. */
-
-loff_t cluster_start(DOS_FS *fs,unsigned long cluster);
-
-/* Returns the byte offset of CLUSTER, relative to the respective device. */
-
-void set_owner(DOS_FS *fs,unsigned long cluster,DOS_FILE *owner);
-
-/* Sets the owner pointer of the respective cluster to OWNER. If OWNER was NULL
- before, it can be set to NULL or any non-NULL value. Otherwise, only NULL is
- accepted as the new value. */
-
-DOS_FILE *get_owner(DOS_FS *fs,unsigned long cluster);
-
-/* Returns the owner of the repective cluster or NULL if the cluster has no
- owner. */
-
-void fix_bad(DOS_FS *fs);
-
-/* Scans the disk for currently unused bad clusters and marks them as bad. */
-
-void reclaim_free(DOS_FS *fs);
-
-/* Marks all allocated, but unused clusters as free. */
-
-void reclaim_file(DOS_FS *fs);
-
-/* Scans the FAT for chains of allocated, but unused clusters and creates files
- for them in the root directory. Also tries to fix all inconsistencies (e.g.
- loops, shared clusters, etc.) in the process. */
-
-unsigned long update_free(DOS_FS *fs);
-
-/* Updates free cluster count in FSINFO sector. */
-
-#endif
diff --git a/src/file.c b/src/file.c
deleted file mode 100644
index c389c60..0000000
--- a/src/file.c
+++ /dev/null
@@ -1,263 +0,0 @@
-/* file.c - Additional file attributes
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
- Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-/* FAT32, VFAT, Atari format support, and various fixes additions May 1998
- * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
-
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <unistd.h>
-
-#define _LINUX_STAT_H /* hack to avoid inclusion of <linux/stat.h> */
-#define _LINUX_STRING_H_ /* hack to avoid inclusion of <linux/string.h>*/
-#define _LINUX_FS_H /* hack to avoid inclusion of <linux/fs.h> */
-
-# include <asm/types.h>
-
-#include <linux/msdos_fs.h>
-
-#include "common.h"
-#include "file.h"
-
-
-FDSC *fp_root = NULL;
-
-
-static void put_char(char **p,unsigned char c)
-{
- if ((c >= ' ' && c < 0x7f) || c >= 0xa0) *(*p)++ = c;
- else {
- *(*p)++ = '\\';
- *(*p)++ = '0'+(c >> 6);
- *(*p)++ = '0'+((c >> 3) & 7);
- *(*p)++ = '0'+(c & 7);
- }
-}
-
-
-char *file_name(unsigned char *fixed)
-{
- static char path[MSDOS_NAME*4+2];
- char *p;
- int i,j;
-
- p = path;
- for (i = j = 0; i < 8; i++)
- if (fixed[i] != ' ') {
- while (j++ < i) *p++ = ' ';
- put_char(&p,fixed[i]);
- }
- if (strncmp(fixed+8," ",3)) {
- *p++ = '.';
- for (i = j = 0; i < 3; i++)
- if (fixed[i+8] != ' ') {
- while (j++ < i) *p++ = ' ';
- put_char(&p,fixed[i+8]);
- }
- }
- *p = 0;
- return path;
-}
-
-
-int file_cvt(unsigned char *name,unsigned char *fixed)
-{
- unsigned char c;
- int size,ext,cnt;
-
- size = 8;
- ext = 0;
- while (*name) {
- c = *name;
- if (c < ' ' || c > 0x7e || strchr("*?<>|\"/",c)) {
- printf("Invalid character in name. Use \\ooo for special "
- "characters.\n");
- return 0;
- }
- if (c == '.') {
- if (ext) {
- printf("Duplicate dots in name.\n");
- return 0;
- }
- while (size--) *fixed++ = ' ';
- size = 3;
- ext = 1;
- name++;
- continue;
- }
- if (c == '\\') {
- c = 0;
- for (cnt = 3; cnt; cnt--) {
- if (*name < '0' || *name > '7') {
- printf("Invalid octal character.\n");
- return 0;
- }
- c = c*8+*name++-'0';
- }
- if (cnt < 4) {
- printf("Expected three octal digits.\n");
- return 0;
- }
- name += 3;
- }
- if (islower(c)) c = toupper(c);
- if (size) {
- *fixed++ = c;
- size--;
- }
- name++;
- }
- if (*name || size == 8) return 0;
- if (!ext) {
- while (size--) *fixed++ = ' ';
- size = 3;
- }
- while (size--) *fixed++ = ' ';
- return 1;
-}
-
-
-void file_add(char *path,FD_TYPE type)
-{
- FDSC **current,*walk;
- char name[MSDOS_NAME];
- char *here;
-
- current = &fp_root;
- if (*path != '/') die("%s: Absolute path required.",path);
- path++;
- while (1) {
- if ((here = strchr(path,'/'))) *here = 0;
- if (!file_cvt(path,name)) exit(2);
- for (walk = *current; walk; walk = walk->next)
- if (!here && (!strncmp(name,walk->name,MSDOS_NAME) || (type ==
- fdt_undelete && !strncmp(name+1,walk->name+1,MSDOS_NAME-1))))
- die("Ambiguous name: \"%s\"",path);
- else if (here && !strncmp(name,walk->name,MSDOS_NAME)) break;
- if (!walk) {
- walk = alloc(sizeof(FDSC));
- strncpy(walk->name,name,MSDOS_NAME);
- walk->type = here ? fdt_none : type;
- walk->first = NULL;
- walk->next = *current;
- *current = walk;
- }
- current = &walk->first;
- if (!here) break;
- *here = '/';
- path = here+1;
- }
-}
-
-
-FDSC **file_cd(FDSC **curr,char *fixed)
-{
- FDSC **walk;
-
- if (!curr || !*curr) return NULL;
- for (walk = curr; *walk; walk = &(*walk)->next)
- if (!strncmp((*walk)->name,fixed,MSDOS_NAME) && (*walk)->first)
- return &(*walk)->first;
- return NULL;
-}
-
-
-static FDSC **file_find(FDSC **dir,char *fixed)
-{
- if (!dir || !*dir) return NULL;
- if (*(unsigned char *) fixed == DELETED_FLAG) {
- while (*dir) {
- if (!strncmp((*dir)->name+1,fixed+1,MSDOS_NAME-1) && !(*dir)->first)
- return dir;
- dir = &(*dir)->next;
- }
- return NULL;
- }
- while (*dir) {
- if (!strncmp((*dir)->name,fixed,MSDOS_NAME) && !(*dir)->first)
- return dir;
- dir = &(*dir)->next;
- }
- return NULL;
-}
-
-
-FD_TYPE file_type(FDSC **curr,char *fixed)
-{
- FDSC **this;
-
- if ((this = file_find(curr,fixed))) return (*this)->type;
- return fdt_none;
-}
-
-
-void file_modify(FDSC **curr,char *fixed)
-{
- FDSC **this,*next;
-
- if (!(this = file_find(curr,fixed)))
- die("Internal error: file_find failed");
- switch ((*this)->type) {
- case fdt_drop:
- printf("Dropping %s\n",file_name(fixed));
- *(unsigned char *) fixed = DELETED_FLAG;
- break;
- case fdt_undelete:
- *fixed = *(*this)->name;
- printf("Undeleting %s\n",file_name(fixed));
- break;
- default:
- die("Internal error: file_modify");
- }
- next = (*this)->next;
- free(*this);
- *this = next;
-}
-
-
-static void report_unused(FDSC *this)
-{
- FDSC *next;
-
- while (this) {
- next = this->next;
- if (this->first) report_unused(this->first);
- else if (this->type != fdt_none)
- printf("Warning: did not %s file %s\n",this->type == fdt_drop ?
- "drop" : "undelete",file_name(this->name));
- free(this);
- this = next;
- }
-}
-
-
-void file_unused(void)
-{
- report_unused(fp_root);
-}
-
-/* Local Variables: */
-/* tab-width: 8 */
-/* End: */
diff --git a/src/file.h b/src/file.h
deleted file mode 100644
index b38523b..0000000
--- a/src/file.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* file.h - Additional file attributes
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-
-#ifndef _FILE_H
-#define _FILE_H
-
-typedef enum { fdt_none,fdt_drop,fdt_undelete } FD_TYPE;
-
-typedef struct _fptr {
- char name[MSDOS_NAME];
- FD_TYPE type;
- struct _fptr *first; /* first entry */
- struct _fptr *next; /* next file in directory */
-} FDSC;
-
-
-extern FDSC *fp_root;
-
-
-char *file_name(unsigned char *fixed);
-
-/* Returns a pointer to a pretty-printed representation of a fixed MS-DOS file
- name. */
-
-int file_cvt(unsigned char *name,unsigned char *fixed);
-
-/* Converts a pretty-printed file name to the fixed MS-DOS format. Returns a
- non-zero integer on success, zero on failure. */
-
-void file_add(char *path,FD_TYPE type);
-
-/* Define special attributes for a path. TYPE can be either FDT_DROP or
- FDT_UNDELETE. */
-
-FDSC **file_cd(FDSC **curr,char *fixed);
-
-/* Returns a pointer to the directory descriptor of the subdirectory FIXED of
- CURR, or NULL if no such subdirectory exists. */
-
-FD_TYPE file_type(FDSC **curr,char *fixed);
-
-/* Returns the attribute of the file FIXED in directory CURR or FDT_NONE if no
- such file exists or if CURR is NULL. */
-
-void file_modify(FDSC **curr,char *fixed);
-
-/* Performs the necessary operation on the entry of CURR that is named FIXED. */
-
-void file_unused(void);
-
-/* Displays warnings for all unused file attributes. */
-
-#endif
diff --git a/src/io.c b/src/io.c
deleted file mode 100644
index 0ab0bbf..0000000
--- a/src/io.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/* io.c - Virtual disk input/output
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
- Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-/*
- * Thu Feb 26 01:15:36 CET 1998: Martin Schulze <joey@infodrom.north.de>
- * Fixed nasty bug that caused every file with a name like
- * xxxxxxxx.xxx to be treated as bad name that needed to be fixed.
- */
-
-/* FAT32, VFAT, Atari format support, and various fixes additions May 1998
- * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <linux/fd.h>
-
-#include "dosfsck.h"
-#include "common.h"
-#include "io.h"
-
-
-typedef struct _change {
- void *data;
- loff_t pos;
- int size;
- struct _change *next;
-} CHANGE;
-
-
-static CHANGE *changes,*last;
-static int fd,did_change = 0;
-
-unsigned device_no;
-
-
-#ifdef __DJGPP__
-#include "volume.h" /* DOS lowlevel disk access functions */
-#undef llseek
-static loff_t llseek( int fd, loff_t offset, int whence )
-{
- if ((whence != SEEK_SET) || (fd == 4711)) return -1; /* only those supported */
- return VolumeSeek(offset);
-}
-#define open OpenVolume
-#define close CloseVolume
-#define read(a,b,c) ReadVolume(b,c)
-#define write(a,b,c) WriteVolume(b,c)
-#endif
-
-void fs_open(char *path,int rw)
-{
- struct stat stbuf;
-
- if ((fd = open(path,rw ? O_RDWR : O_RDONLY)) < 0)
- pdie("open %s",path);
- changes = last = NULL;
- did_change = 0;
-
-#ifndef _DJGPP_
- if (fstat(fd,&stbuf) < 0)
- pdie("fstat %s",path);
- device_no = S_ISBLK(stbuf.st_mode) ? (stbuf.st_rdev >> 8) & 0xff : 0;
-#else
- if (IsWorkingOnImageFile()) {
- if (fstat(GetVolumeHandle(),&stbuf) < 0)
- pdie("fstat image %s",path);
- device_no = 0;
- }
- else {
- /* return 2 for floppy, 1 for ramdisk, 7 for loopback */
- /* used by boot.c in Atari mode: floppy always FAT12, */
- /* loopback / ramdisk only FAT12 if usual floppy size, */
- /* harddisk always FAT16 on Atari... */
- device_no = (GetVolumeHandle() < 2) ? 2 : 1;
- /* telling "floppy" for A:/B:, "ramdisk" for the rest */
- }
-#endif
-}
-
-
-void fs_read(loff_t pos,int size,void *data)
-{
- CHANGE *walk;
- int got;
-
- if (llseek(fd,pos,0) != pos) pdie("Seek to %lld",pos);
- if ((got = read(fd,data,size)) < 0) pdie("Read %d bytes at %lld",size,pos);
- if (got != size) die("Got %d bytes instead of %d at %lld",got,size,pos);
- for (walk = changes; walk; walk = walk->next) {
- if (walk->pos < pos+size && walk->pos+walk->size > pos) {
- if (walk->pos < pos)
- memcpy(data,(char *) walk->data+pos-walk->pos,min(size,
- walk->size-pos+walk->pos));
- else memcpy((char *) data+walk->pos-pos,walk->data,min(walk->size,
- size+pos-walk->pos));
- }
- }
-}
-
-
-int fs_test(loff_t pos,int size)
-{
- void *scratch;
- int okay;
-
- if (llseek(fd,pos,0) != pos) pdie("Seek to %lld",pos);
- scratch = alloc(size);
- okay = read(fd,scratch,size) == size;
- free(scratch);
- return okay;
-}
-
-
-void fs_write(loff_t pos,int size,void *data)
-{
- CHANGE *new;
- int did;
-
- if (write_immed) {
- did_change = 1;
- if (llseek(fd,pos,0) != pos) pdie("Seek to %lld",pos);
- if ((did = write(fd,data,size)) == size) return;
- if (did < 0) pdie("Write %d bytes at %lld",size,pos);
- die("Wrote %d bytes instead of %d at %lld",did,size,pos);
- }
- new = alloc(sizeof(CHANGE));
- new->pos = pos;
- memcpy(new->data = alloc(new->size = size),data,size);
- new->next = NULL;
- if (last) last->next = new;
- else changes = new;
- last = new;
-}
-
-
-static void fs_flush(void)
-{
- CHANGE *this;
- int size;
-
- while (changes) {
- this = changes;
- changes = changes->next;
- if (llseek(fd,this->pos,0) != this->pos)
- fprintf(stderr,"Seek to %lld failed: %s\n Did not write %d bytes.\n",
- (long long)this->pos,strerror(errno),this->size);
- else if ((size = write(fd,this->data,this->size)) < 0)
- fprintf(stderr,"Writing %d bytes at %lld failed: %s\n",this->size,
- (long long)this->pos,strerror(errno));
- else if (size != this->size)
- fprintf(stderr,"Wrote %d bytes instead of %d bytes at %lld."
- "\n",size,this->size,(long long)this->pos);
- free(this->data);
- free(this);
- }
-}
-
-
-int fs_close(int write)
-{
- CHANGE *next;
- int changed;
-
- changed = !!changes;
- if (write) fs_flush();
- else while (changes) {
- next = changes->next;
- free(changes->data);
- free(changes);
- changes = next;
- }
- if (close(fd) < 0) pdie("closing file system");
- return changed || did_change;
-}
-
-
-int fs_changed(void)
-{
- return !!changes || did_change;
-}
-
-/* Local Variables: */
-/* tab-width: 8 */
-/* End: */
diff --git a/src/io.h b/src/io.h
deleted file mode 100644
index ba0c35b..0000000
--- a/src/io.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* io.h - Virtual disk input/output
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
- Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-/* FAT32, VFAT, Atari format support, and various fixes additions May 1998
- * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
-
-
-#ifndef _IO_H
-#define _IO_H
-
-#include <sys/types.h> /* for loff_t */
-
-/* In earlier versions, an own llseek() was used, but glibc lseek() is
- * sufficient (or even better :) for 64 bit offsets in the meantime */
-#define llseek lseek64
-
-void fs_open(char *path,int rw);
-
-/* Opens the file system PATH. If RW is zero, the file system is opened
- read-only, otherwise, it is opened read-write. */
-
-void fs_read(loff_t pos,int size,void *data);
-
-/* Reads SIZE bytes starting at POS into DATA. Performs all applicable
- changes. */
-
-int fs_test(loff_t pos,int size);
-
-/* Returns a non-zero integer if SIZE bytes starting at POS can be read without
- errors. Otherwise, it returns zero. */
-
-void fs_write(loff_t pos,int size,void *data);
-
-/* If write_immed is non-zero, SIZE bytes are written from DATA to the disk,
- starting at POS. If write_immed is zero, the change is added to a list in
- memory. */
-
-int fs_close(int write);
-
-/* Closes the file system, performs all pending changes if WRITE is non-zero
- and removes the list of changes. Returns a non-zero integer if the file
- system has been changed since the last fs_open, zero otherwise. */
-
-int fs_changed(void);
-
-/* Determines whether the file system has changed. See fs_close. */
-
-extern unsigned device_no;
-
-/* Major number of device (0 if file) and size (in 512 byte sectors) */
-
-#endif
diff --git a/src/lfn.c b/src/lfn.c
deleted file mode 100644
index b0db160..0000000
--- a/src/lfn.c
+++ /dev/null
@@ -1,495 +0,0 @@
-/* lfn.c - Functions for handling VFAT long filenames
-
- Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <time.h>
-
-#include "common.h"
-#include "io.h"
-#include "dosfsck.h"
-#include "lfn.h"
-#include "file.h"
-
-typedef struct {
- __u8 id; /* sequence number for slot */
- __u8 name0_4[10]; /* first 5 characters in name */
- __u8 attr; /* attribute byte */
- __u8 reserved; /* always 0 */
- __u8 alias_checksum; /* checksum for 8.3 alias */
- __u8 name5_10[12]; /* 6 more characters in name */
- __u16 start; /* starting cluster number, 0 in long slots */
- __u8 name11_12[4]; /* last 2 characters in name */
-} LFN_ENT;
-
-#define LFN_ID_START 0x40
-#define LFN_ID_SLOTMASK 0x1f
-
-#define CHARS_PER_LFN 13
-
-/* These modul-global vars represent the state of the LFN parser */
-unsigned char *lfn_unicode = NULL;
-unsigned char lfn_checksum;
-int lfn_slot = -1;
-loff_t *lfn_offsets = NULL;
-int lfn_parts = 0;
-
-static unsigned char fat_uni2esc[64] = {
- '0', '1', '2', '3', '4', '5', '6', '7',
- '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
- 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
- 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
- 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
- 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
- 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
- 'u', 'v', 'w', 'x', 'y', 'z', '+', '-'
-};
-
-/* This defines which unicode chars are directly convertable to ISO-8859-1 */
-#define UNICODE_CONVERTABLE(cl,ch) (ch == 0 && (cl < 0x80 || cl >= 0xa0))
-
-/* for maxlen param */
-#define UNTIL_0 INT_MAX
-
-/* Convert name part in 'lfn' from unicode to ASCII */
-#define CNV_THIS_PART(lfn) \
- ({ \
- char __part_uni[CHARS_PER_LFN*2]; \
- copy_lfn_part( __part_uni, lfn ); \
- cnv_unicode( __part_uni, CHARS_PER_LFN, 0 ); \
- })
-
-/* Convert name parts collected so far (from previous slots) from unicode to
- * ASCII */
-#define CNV_PARTS_SO_FAR() \
- (cnv_unicode( lfn_unicode+(lfn_slot*CHARS_PER_LFN*2), \
- lfn_parts*CHARS_PER_LFN, 0 ))
-
-/* This function converts an unicode string to a normal ASCII string, assuming
- * ISO-8859-1 charset. Characters not in 8859-1 are converted to the same
- * escape notation as used by the kernel, i.e. the uuencode-like ":xxx" */
-static char *cnv_unicode( const unsigned char *uni, int maxlen, int use_q )
-{
- const unsigned char *up;
- unsigned char *out, *cp;
- int len, val;
-
- for( len = 0, up = uni; (up-uni)/2 < maxlen && (up[0] || up[1]); up += 2 ){
- if (UNICODE_CONVERTABLE(up[0],up[1]))
- ++len;
- else
- len += 4;
- }
- cp = out = use_q ? qalloc( &mem_queue, len+1 ) : alloc( len+1 );
-
- for( up = uni; (up-uni)/2 < maxlen && (up[0] || up[1]); up += 2 ) {
- if (UNICODE_CONVERTABLE(up[0],up[1]))
- *cp++ = up[0];
- else {
- /* here the same escape notation is used as in the Linux kernel */
- *cp++ = ':';
- val = (up[1] << 8) + up[0];
- cp[2] = fat_uni2esc[val & 0x3f];
- val >>= 6;
- cp[1] = fat_uni2esc[val & 0x3f];
- val >>= 6;
- cp[0] = fat_uni2esc[val & 0x3f];
- cp += 3;
- }
- }
- *cp = 0;
-
- return( out );
-}
-
-
-static void copy_lfn_part( char *dst, LFN_ENT *lfn )
-{
- memcpy( dst, lfn->name0_4, 10 );
- memcpy( dst+10, lfn->name5_10, 12 );
- memcpy( dst+22, lfn->name11_12, 4 );
-}
-
-
-static void clear_lfn_slots( int start, int end )
-{
- int i;
- LFN_ENT empty;
-
- /* New dir entry is zeroed except first byte, which is set to 0xe5.
- * This is to avoid that some FAT-reading OSes (not Linux! ;) stop reading
- * a directory at the first zero entry...
- */
- memset( &empty, 0, sizeof(empty) );
- empty.id = DELETED_FLAG;
-
- for( i = start; i <= end; ++i ) {
- fs_write( lfn_offsets[i], sizeof(LFN_ENT), &empty );
- }
-}
-
-void lfn_reset( void )
-{
- if (lfn_unicode)
- free( lfn_unicode );
- lfn_unicode = NULL;
- if (lfn_offsets)
- free( lfn_offsets );
- lfn_offsets = NULL;
- lfn_slot = -1;
-}
-
-
-/* This function is only called with de->attr == VFAT_LN_ATTR. It stores part
- * of the long name. */
-void lfn_add_slot( DIR_ENT *de, loff_t dir_offset )
-{
- LFN_ENT *lfn = (LFN_ENT *)de;
- int slot = lfn->id & LFN_ID_SLOTMASK;
- unsigned offset;
-
- if (lfn_slot == 0) lfn_check_orphaned();
-
- if (de->attr != VFAT_LN_ATTR)
- die("lfn_add_slot called with non-LFN directory entry");
-
- if (lfn->id & LFN_ID_START && slot != 0) {
- if (lfn_slot != -1) {
- int can_clear = 0;
- /* There is already a LFN "in progess", so it is an error that a
- * new start entry is here. */
- /* Causes: 1) if slot# == expected: start bit set mysteriously, 2)
- * old LFN overwritten by new one */
- /* Fixes: 1) delete previous LFN 2) if slot# == expected and
- * checksum ok: clear start bit */
- /* XXX: Should delay that until next LFN known (then can better
- * display the name) */
- printf( "A new long file name starts within an old one.\n" );
- if (slot == lfn_slot &&
- lfn->alias_checksum == lfn_checksum) {
- char *part1 = CNV_THIS_PART(lfn);
- char *part2 = CNV_PARTS_SO_FAR();
- printf( " It could be that the LFN start bit is wrong here\n"
- " if \"%s\" seems to match \"%s\".\n", part1, part2 );
- free( part1 );
- free( part2 );
- can_clear = 1;
- }
- if (interactive) {
- printf( "1: Delete previous LFN\n2: Leave it as it is.\n" );
- if (can_clear)
- printf( "3: Clear start bit and concatenate LFNs\n" );
- }
- else printf( " Not auto-correcting this.\n" );
- if (interactive) {
- switch( get_key( can_clear ? "123" : "12", "?" )) {
- case '1':
- clear_lfn_slots( 0, lfn_parts-1 );
- lfn_reset();
- break;
- case '2':
- break;
- case '3':
- lfn->id &= ~LFN_ID_START;
- fs_write( dir_offset+offsetof(LFN_ENT,id),
- sizeof(lfn->id), &lfn->id );
- break;
- }
- }
- }
- lfn_slot = slot;
- lfn_checksum = lfn->alias_checksum;
- lfn_unicode = alloc( (lfn_slot*CHARS_PER_LFN+1)*2 );
- lfn_offsets = alloc( lfn_slot*sizeof(loff_t) );
- lfn_parts = 0;
- }
- else if (lfn_slot == -1 && slot != 0) {
- /* No LFN in progress, but slot found; start bit missing */
- /* Causes: 1) start bit got lost, 2) Previous slot with start bit got
- * lost */
- /* Fixes: 1) delete LFN, 2) set start bit */
- char *part = CNV_THIS_PART(lfn);
- printf( "Long filename fragment \"%s\" found outside a LFN "
- "sequence.\n (Maybe the start bit is missing on the "
- "last fragment)\n", part );
- if (interactive) {
- printf( "1: Delete fragment\n2: Leave it as it is.\n"
- "3: Set start bit\n" );
- }
- else printf( " Not auto-correcting this.\n" );
- switch( interactive ? get_key( "123", "?" ) : '2') {
- case '1':
- if (!lfn_offsets)
- lfn_offsets = alloc( sizeof(loff_t) );
- lfn_offsets[0] = dir_offset;
- clear_lfn_slots( 0, 0 );
- lfn_reset();
- return;
- case '2':
- lfn_reset();
- return;
- case '3':
- lfn->id |= LFN_ID_START;
- fs_write( dir_offset+offsetof(LFN_ENT,id),
- sizeof(lfn->id), &lfn->id );
- lfn_slot = slot;
- lfn_checksum = lfn->alias_checksum;
- lfn_unicode = alloc( (lfn_slot*CHARS_PER_LFN+1)*2 );
- lfn_offsets = alloc( lfn_slot*sizeof(loff_t) );
- lfn_parts = 0;
- break;
- }
- }
- else if (slot != lfn_slot) {
- /* wrong sequence number */
- /* Causes: 1) seq-no destroyed */
- /* Fixes: 1) delete LFN, 2) fix number (maybe only if following parts
- * are ok?, maybe only if checksum is ok?) (Attention: space
- * for name was allocated before!) */
- int can_fix = 0;
- printf( "Unexpected long filename sequence number "
- "(%d vs. expected %d).\n",
- slot, lfn_slot );
- if (lfn->alias_checksum == lfn_checksum && lfn_slot > 0) {
- char *part1 = CNV_THIS_PART(lfn);
- char *part2 = CNV_PARTS_SO_FAR();
- printf( " It could be that just the number is wrong\n"
- " if \"%s\" seems to match \"%s\".\n", part1, part2 );
- free( part1 );
- free( part2 );
- can_fix = 1;
- }
- if (interactive) {
- printf( "1: Delete LFN\n2: Leave it as it is (and ignore LFN so far)\n" );
- if (can_fix)
- printf( "3: Correct sequence number\n" );
- }
- else printf( " Not auto-correcting this.\n" );
- switch( interactive ? get_key( can_fix ? "123" : "12", "?" ) : '2') {
- case '1':
- if (!lfn_offsets) {
- lfn_offsets = alloc( sizeof(loff_t) );
- lfn_parts = 0;
- }
- lfn_offsets[lfn_parts++] = dir_offset;
- clear_lfn_slots( 0, lfn_parts-1 );
- lfn_reset();
- return;
- case '2':
- lfn_reset();
- return;
- case '3':
- lfn->id = (lfn->id & ~LFN_ID_SLOTMASK) | lfn_slot;
- fs_write( dir_offset+offsetof(LFN_ENT,id),
- sizeof(lfn->id), &lfn->id );
- break;
- }
- }
-
- if (lfn->alias_checksum != lfn_checksum) {
- /* checksum mismatch */
- /* Causes: 1) checksum field here destroyed */
- /* Fixes: 1) delete LFN, 2) fix checksum */
- printf( "Checksum in long filename part wrong "
- "(%02x vs. expected %02x).\n",
- lfn->alias_checksum, lfn_checksum );
- if (interactive) {
- printf( "1: Delete LFN\n2: Leave it as it is.\n"
- "3: Correct checksum\n" );
- }
- else printf( " Not auto-correcting this.\n" );
- if (interactive) {
- switch( get_key( "123", "?" )) {
- case '1':
- lfn_offsets[lfn_parts++] = dir_offset;
- clear_lfn_slots( 0, lfn_parts-1 );
- lfn_reset();
- return;
- case '2':
- break;
- case '3':
- lfn->alias_checksum = lfn_checksum;
- fs_write( dir_offset+offsetof(LFN_ENT,alias_checksum),
- sizeof(lfn->alias_checksum), &lfn->alias_checksum );
- break;
- }
- }
- }
-
- if (lfn_slot != -1) {
- lfn_slot--;
- offset = lfn_slot * CHARS_PER_LFN*2;
- copy_lfn_part( lfn_unicode+offset, lfn );
- if (lfn->id & LFN_ID_START)
- lfn_unicode[offset+26] = lfn_unicode[offset+27] = 0;
- lfn_offsets[lfn_parts++] = dir_offset;
- }
-
- if (lfn->reserved != 0) {
- printf( "Reserved field in VFAT long filename slot is not 0 "
- "(but 0x%02x).\n", lfn->reserved );
- if (interactive)
- printf( "1: Fix.\n2: Leave it.\n" );
- else printf( "Auto-setting to 0.\n" );
- if (!interactive || get_key("12","?") == '1') {
- lfn->reserved = 0;
- fs_write( dir_offset+offsetof(LFN_ENT,reserved),
- sizeof(lfn->reserved), &lfn->reserved );
- }
- }
- if (lfn->start != CT_LE_W(0)) {
- printf( "Start cluster field in VFAT long filename slot is not 0 "
- "(but 0x%04x).\n", lfn->start );
- if (interactive)
- printf( "1: Fix.\n2: Leave it.\n" );
- else printf( "Auto-setting to 0.\n" );
- if (!interactive || get_key("12","?") == '1') {
- lfn->start = CT_LE_W(0);
- fs_write( dir_offset+offsetof(LFN_ENT,start),
- sizeof(lfn->start),&lfn->start );
- }
- }
-}
-
-
-/* This function is always called when de->attr != VFAT_LN_ATTR is found, to
- * retrieve the previously constructed LFN. */
-char *lfn_get( DIR_ENT *de )
-{
- char *lfn;
- __u8 sum;
- int i;
-
- if (de->attr == VFAT_LN_ATTR)
- die("lfn_get called with LFN directory entry");
-
-#if 0
- if (de->lcase)
- printf( "lcase=%02x\n",de->lcase );
-#endif
-
- if (lfn_slot == -1)
- /* no long name for this file */
- return NULL;
-
- if (lfn_slot != 0) {
- /* The long name isn't finished yet. */
- /* Causes: 1) LFN slot overwritten by non-VFAT aware tool */
- /* Fixes: 1) delete LFN 2) move overwriting entry to somewhere else
- * and let user enter missing part of LFN (hard to do :-()
- * 3) renumber entries and truncate name */
- char *long_name = CNV_PARTS_SO_FAR();
- char *short_name = file_name(de->name);
- printf( "Unfinished long file name \"%s\".\n"
- " (Start may have been overwritten by %s)\n",
- long_name, short_name );
- free( long_name );
- if (interactive) {
- printf( "1: Delete LFN\n2: Leave it as it is.\n"
- "3: Fix numbering (truncates long name and attaches "
- "it to short name %s)\n", short_name );
- }
- else printf( " Not auto-correcting this.\n" );
- switch( interactive ? get_key( "123", "?" ) : '2') {
- case '1':
- clear_lfn_slots( 0, lfn_parts-1 );
- lfn_reset();
- return NULL;
- case '2':
- lfn_reset();
- return NULL;
- case '3':
- for( i = 0; i < lfn_parts; ++i ) {
- __u8 id = (lfn_parts-i) | (i==0 ? LFN_ID_START : 0);
- fs_write( lfn_offsets[i]+offsetof(LFN_ENT,id),
- sizeof(id), &id );
- }
- memmove( lfn_unicode, lfn_unicode+lfn_slot*CHARS_PER_LFN*2,
- lfn_parts*CHARS_PER_LFN*2 );
- break;
- }
- }
-
- for (sum = 0, i = 0; i < 11; i++)
- sum = (((sum&1) << 7) | ((sum&0xfe) >> 1)) + de->name[i];
- if (sum != lfn_checksum) {
- /* checksum doesn't match, long name doesn't apply to this alias */
- /* Causes: 1) alias renamed */
- /* Fixes: 1) Fix checksum in LFN entries */
- char *long_name = CNV_PARTS_SO_FAR();
- char *short_name = file_name(de->name);
- printf( "Wrong checksum for long file name \"%s\".\n"
- " (Short name %s may have changed without updating the long name)\n",
- long_name, short_name );
- free( long_name );
- if (interactive) {
- printf( "1: Delete LFN\n2: Leave it as it is.\n"
- "3: Fix checksum (attaches to short name %s)\n",
- short_name );
- }
- else printf( " Not auto-correcting this.\n" );
- if (interactive) {
- switch( get_key( "123", "?" )) {
- case '1':
- clear_lfn_slots( 0, lfn_parts-1 );
- lfn_reset();
- return NULL;
- case '2':
- lfn_reset();
- return NULL;
- case '3':
- for( i = 0; i < lfn_parts; ++i ) {
- fs_write( lfn_offsets[i]+offsetof(LFN_ENT,alias_checksum),
- sizeof(sum), &sum );
- }
- break;
- }
- }
- }
-
- lfn = cnv_unicode( lfn_unicode, UNTIL_0, 1 );
- lfn_reset();
- return( lfn );
-}
-
-void lfn_check_orphaned(void)
-{
- char *long_name;
-
- if (lfn_slot == -1)
- return;
-
- long_name = CNV_PARTS_SO_FAR();
- printf("Orphaned long file name part \"%s\"\n", long_name);
- if (interactive)
- printf( "1: Delete.\n2: Leave it.\n" );
- else printf( " Auto-deleting.\n" );
- if (!interactive || get_key("12","?") == '1') {
- clear_lfn_slots(0, lfn_parts - 1);
- }
- lfn_reset();
-}
-
-/* Local Variables: */
-/* tab-width: 8 */
-/* End: */
diff --git a/src/lfn.h b/src/lfn.h
deleted file mode 100644
index 8e8f5a1..0000000
--- a/src/lfn.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* lfn.h - Functions for handling VFAT long filenames
-
- Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-#ifndef _LFN_H
-#define _LFN_H
-
-void lfn_reset( void );
-/* Reset the state of the LFN parser. */
-
-void lfn_add_slot( DIR_ENT *de, loff_t dir_offset );
-/* Process a dir slot that is a VFAT LFN entry. */
-
-char *lfn_get( DIR_ENT *de );
-/* Retrieve the long name for the proper dir entry. */
-
-void lfn_check_orphaned(void);
-
-#endif
diff --git a/src/mkdosfs.c b/src/mkdosfs.c
deleted file mode 100644
index 1264efd..0000000
--- a/src/mkdosfs.c
+++ /dev/null
@@ -1,1761 +0,0 @@
-/* mkdosfs.c - utility to create FAT/MS-DOS filesystems
-
- Copyright (C) 1991 Linus Torvalds <torvalds@klaava.helsinki.fi>
- Copyright (C) 1992-1993 Remy Card <card@masi.ibp.fr>
- Copyright (C) 1993-1994 David Hudson <dave@humbug.demon.co.uk>
- Copyright (C) 1998 H. Peter Anvin <hpa@zytor.com>
- Copyright (C) 1998-2005 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-/* Description: Utility to allow an MS-DOS filesystem to be created
- under Linux. A lot of the basic structure of this program has been
- borrowed from Remy Card's "mke2fs" code.
-
- As far as possible the aim here is to make the "mkdosfs" command
- look almost identical to the other Linux filesystem make utilties,
- eg bad blocks are still specified as blocks, not sectors, but when
- it comes down to it, DOS is tied to the idea of a sector (512 bytes
- as a rule), and not the block. For example the boot block does not
- occupy a full cluster.
-
- Fixes/additions May 1998 by Roman Hodek
- <Roman.Hodek@informatik.uni-erlangen.de>:
- - Atari format support
- - New options -A, -S, -C
- - Support for filesystems > 2GB
- - FAT32 support */
-
-/* Include the header files */
-
-#include "version.h"
-
-#include <fcntl.h>
-#include <linux/hdreg.h>
-#include <sys/mount.h>
-#include <linux/fd.h>
-#include <endian.h>
-#include <mntent.h>
-#include <signal.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <time.h>
-#include <errno.h>
-
-# include <asm/types.h>
-
-#if __BYTE_ORDER == __BIG_ENDIAN
-
-#include <asm/byteorder.h>
-#ifdef __le16_to_cpu
-/* ++roman: 2.1 kernel headers define these function, they're probably more
- * efficient then coding the swaps machine-independently. */
-#define CF_LE_W __le16_to_cpu
-#define CF_LE_L __le32_to_cpu
-#define CT_LE_W __cpu_to_le16
-#define CT_LE_L __cpu_to_le32
-#else
-#define CF_LE_W(v) ((((v) & 0xff) << 8) | (((v) >> 8) & 0xff))
-#define CF_LE_L(v) (((unsigned)(v)>>24) | (((unsigned)(v)>>8)&0xff00) | \
- (((unsigned)(v)<<8)&0xff0000) | ((unsigned)(v)<<24))
-#define CT_LE_W(v) CF_LE_W(v)
-#define CT_LE_L(v) CF_LE_L(v)
-#endif /* defined(__le16_to_cpu) */
-
-#else
-
-#define CF_LE_W(v) (v)
-#define CF_LE_L(v) (v)
-#define CT_LE_W(v) (v)
-#define CT_LE_L(v) (v)
-
-#endif /* __BIG_ENDIAN */
-
-/* In earlier versions, an own llseek() was used, but glibc lseek() is
- * sufficient (or even better :) for 64 bit offsets in the meantime */
-#define llseek lseek
-
-/* Constant definitions */
-
-#define TRUE 1 /* Boolean constants */
-#define FALSE 0
-
-#define TEST_BUFFER_BLOCKS 16
-#define HARD_SECTOR_SIZE 512
-#define SECTORS_PER_BLOCK ( BLOCK_SIZE / HARD_SECTOR_SIZE )
-
-
-/* Macro definitions */
-
-/* Report a failure message and return a failure error code */
-
-#define die( str ) fatal_error( "%s: " str "\n" )
-
-
-/* Mark a cluster in the FAT as bad */
-
-#define mark_sector_bad( sector ) mark_FAT_sector( sector, FAT_BAD )
-
-/* Compute ceil(a/b) */
-
-inline int
-cdiv (int a, int b)
-{
- return (a + b - 1) / b;
-}
-
-/* MS-DOS filesystem structures -- I included them here instead of
- including linux/msdos_fs.h since that doesn't include some fields we
- need */
-
-#define ATTR_RO 1 /* read-only */
-#define ATTR_HIDDEN 2 /* hidden */
-#define ATTR_SYS 4 /* system */
-#define ATTR_VOLUME 8 /* volume label */
-#define ATTR_DIR 16 /* directory */
-#define ATTR_ARCH 32 /* archived */
-
-#define ATTR_NONE 0 /* no attribute bits */
-#define ATTR_UNUSED (ATTR_VOLUME | ATTR_ARCH | ATTR_SYS | ATTR_HIDDEN)
- /* attribute bits that are copied "as is" */
-
-/* FAT values */
-#define FAT_EOF (atari_format ? 0x0fffffff : 0x0ffffff8)
-#define FAT_BAD 0x0ffffff7
-
-#define MSDOS_EXT_SIGN 0x29 /* extended boot sector signature */
-#define MSDOS_FAT12_SIGN "FAT12 " /* FAT12 filesystem signature */
-#define MSDOS_FAT16_SIGN "FAT16 " /* FAT16 filesystem signature */
-#define MSDOS_FAT32_SIGN "FAT32 " /* FAT32 filesystem signature */
-
-#define BOOT_SIGN 0xAA55 /* Boot sector magic number */
-
-#define MAX_CLUST_12 ((1 << 12) - 16)
-#define MAX_CLUST_16 ((1 << 16) - 16)
-#define MIN_CLUST_32 65529
-/* M$ says the high 4 bits of a FAT32 FAT entry are reserved and don't belong
- * to the cluster number. So the max. cluster# is based on 2^28 */
-#define MAX_CLUST_32 ((1 << 28) - 16)
-
-#define FAT12_THRESHOLD 4085
-
-#define OLDGEMDOS_MAX_SECTORS 32765
-#define GEMDOS_MAX_SECTORS 65531
-#define GEMDOS_MAX_SECTOR_SIZE (16*1024)
-
-#define BOOTCODE_SIZE 448
-#define BOOTCODE_FAT32_SIZE 420
-
-/* __attribute__ ((packed)) is used on all structures to make gcc ignore any
- * alignments */
-
-struct msdos_volume_info {
- __u8 drive_number; /* BIOS drive number */
- __u8 RESERVED; /* Unused */
- __u8 ext_boot_sign; /* 0x29 if fields below exist (DOS 3.3+) */
- __u8 volume_id[4]; /* Volume ID number */
- __u8 volume_label[11];/* Volume label */
- __u8 fs_type[8]; /* Typically FAT12 or FAT16 */
-} __attribute__ ((packed));
-
-struct msdos_boot_sector
-{
- __u8 boot_jump[3]; /* Boot strap short or near jump */
- __u8 system_id[8]; /* Name - can be used to special case
- partition manager volumes */
- __u8 sector_size[2]; /* bytes per logical sector */
- __u8 cluster_size; /* sectors/cluster */
- __u16 reserved; /* reserved sectors */
- __u8 fats; /* number of FATs */
- __u8 dir_entries[2]; /* root directory entries */
- __u8 sectors[2]; /* number of sectors */
- __u8 media; /* media code (unused) */
- __u16 fat_length; /* sectors/FAT */
- __u16 secs_track; /* sectors per track */
- __u16 heads; /* number of heads */
- __u32 hidden; /* hidden sectors (unused) */
- __u32 total_sect; /* number of sectors (if sectors == 0) */
- union {
- struct {
- struct msdos_volume_info vi;
- __u8 boot_code[BOOTCODE_SIZE];
- } __attribute__ ((packed)) _oldfat;
- struct {
- __u32 fat32_length; /* sectors/FAT */
- __u16 flags; /* bit 8: fat mirroring, low 4: active fat */
- __u8 version[2]; /* major, minor filesystem version */
- __u32 root_cluster; /* first cluster in root directory */
- __u16 info_sector; /* filesystem info sector */
- __u16 backup_boot; /* backup boot sector */
- __u16 reserved2[6]; /* Unused */
- struct msdos_volume_info vi;
- __u8 boot_code[BOOTCODE_FAT32_SIZE];
- } __attribute__ ((packed)) _fat32;
- } __attribute__ ((packed)) fstype;
- __u16 boot_sign;
-} __attribute__ ((packed));
-#define fat32 fstype._fat32
-#define oldfat fstype._oldfat
-
-struct fat32_fsinfo {
- __u32 reserved1; /* Nothing as far as I can tell */
- __u32 signature; /* 0x61417272L */
- __u32 free_clusters; /* Free cluster count. -1 if unknown */
- __u32 next_cluster; /* Most recently allocated cluster.
- * Unused under Linux. */
- __u32 reserved2[4];
-};
-
-struct msdos_dir_entry
- {
- char name[8], ext[3]; /* name and extension */
- __u8 attr; /* attribute bits */
- __u8 lcase; /* Case for base and extension */
- __u8 ctime_ms; /* Creation time, milliseconds */
- __u16 ctime; /* Creation time */
- __u16 cdate; /* Creation date */
- __u16 adate; /* Last access date */
- __u16 starthi; /* high 16 bits of first cl. (FAT32) */
- __u16 time, date, start; /* time, date and first cluster */
- __u32 size; /* file size (in bytes) */
- } __attribute__ ((packed));
-
-/* The "boot code" we put into the filesystem... it writes a message and
- tells the user to try again */
-
-char dummy_boot_jump[3] = { 0xeb, 0x3c, 0x90 };
-
-char dummy_boot_jump_m68k[2] = { 0x60, 0x1c };
-
-#define MSG_OFFSET_OFFSET 3
-char dummy_boot_code[BOOTCODE_SIZE] =
- "\x0e" /* push cs */
- "\x1f" /* pop ds */
- "\xbe\x5b\x7c" /* mov si, offset message_txt */
- /* write_msg: */
- "\xac" /* lodsb */
- "\x22\xc0" /* and al, al */
- "\x74\x0b" /* jz key_press */
- "\x56" /* push si */
- "\xb4\x0e" /* mov ah, 0eh */
- "\xbb\x07\x00" /* mov bx, 0007h */
- "\xcd\x10" /* int 10h */
- "\x5e" /* pop si */
- "\xeb\xf0" /* jmp write_msg */
- /* key_press: */
- "\x32\xe4" /* xor ah, ah */
- "\xcd\x16" /* int 16h */
- "\xcd\x19" /* int 19h */
- "\xeb\xfe" /* foo: jmp foo */
- /* message_txt: */
-
- "This is not a bootable disk. Please insert a bootable floppy and\r\n"
- "press any key to try again ... \r\n";
-
-#define MESSAGE_OFFSET 29 /* Offset of message in above code */
-
-/* Global variables - the root of all evil :-) - see these and weep! */
-
-static char *program_name = "mkdosfs"; /* Name of the program */
-static char *device_name = NULL; /* Name of the device on which to create the filesystem */
-static int atari_format = 0; /* Use Atari variation of MS-DOS FS format */
-static int check = FALSE; /* Default to no readablity checking */
-static int verbose = 0; /* Default to verbose mode off */
-static long volume_id; /* Volume ID number */
-static time_t create_time; /* Creation time */
-static struct timeval create_timeval; /* Creation time */
-static char volume_name[] = " "; /* Volume name */
-static unsigned long long blocks; /* Number of blocks in filesystem */
-static int sector_size = 512; /* Size of a logical sector */
-static int sector_size_set = 0; /* User selected sector size */
-static int backup_boot = 0; /* Sector# of backup boot sector */
-static int reserved_sectors = 0;/* Number of reserved sectors */
-static int badblocks = 0; /* Number of bad blocks in the filesystem */
-static int nr_fats = 2; /* Default number of FATs to produce */
-static int size_fat = 0; /* Size in bits of FAT entries */
-static int size_fat_by_user = 0; /* 1 if FAT size user selected */
-static int dev = -1; /* FS block device file handle */
-static int ignore_full_disk = 0; /* Ignore warning about 'full' disk devices */
-static off_t currently_testing = 0; /* Block currently being tested (if autodetect bad blocks) */
-static struct msdos_boot_sector bs; /* Boot sector data */
-static int start_data_sector; /* Sector number for the start of the data area */
-static int start_data_block; /* Block number for the start of the data area */
-static unsigned char *fat; /* File allocation table */
-static unsigned char *info_sector; /* FAT32 info sector */
-static struct msdos_dir_entry *root_dir; /* Root directory */
-static int size_root_dir; /* Size of the root directory in bytes */
-static int sectors_per_cluster = 0; /* Number of sectors per disk cluster */
-static int root_dir_entries = 0; /* Number of root directory entries */
-static char *blank_sector; /* Blank sector - all zeros */
-static int hidden_sectors = 0; /* Number of hidden sectors */
-
-
-/* Function prototype definitions */
-
-static void fatal_error (const char *fmt_string) __attribute__((noreturn));
-static void mark_FAT_cluster (int cluster, unsigned int value);
-static void mark_FAT_sector (int sector, unsigned int value);
-static long do_check (char *buffer, int try, off_t current_block);
-static void alarm_intr (int alnum);
-static void check_blocks (void);
-static void get_list_blocks (char *filename);
-static int valid_offset (int fd, loff_t offset);
-static unsigned long long count_blocks (char *filename);
-static void check_mount (char *device_name);
-static void establish_params (int device_num, int size);
-static void setup_tables (void);
-static void write_tables (void);
-
-
-/* The function implementations */
-
-/* Handle the reporting of fatal errors. Volatile to let gcc know that this doesn't return */
-
-static void
-fatal_error (const char *fmt_string)
-{
- fprintf (stderr, fmt_string, program_name, device_name);
- exit (1); /* The error exit code is 1! */
-}
-
-
-/* Mark the specified cluster as having a particular value */
-
-static void
-mark_FAT_cluster (int cluster, unsigned int value)
-{
- switch( size_fat ) {
- case 12:
- value &= 0x0fff;
- if (((cluster * 3) & 0x1) == 0)
- {
- fat[3 * cluster / 2] = (unsigned char) (value & 0x00ff);
- fat[(3 * cluster / 2) + 1] = (unsigned char) ((fat[(3 * cluster / 2) + 1] & 0x00f0)
- | ((value & 0x0f00) >> 8));
- }
- else
- {
- fat[3 * cluster / 2] = (unsigned char) ((fat[3 * cluster / 2] & 0x000f) | ((value & 0x000f) << 4));
- fat[(3 * cluster / 2) + 1] = (unsigned char) ((value & 0x0ff0) >> 4);
- }
- break;
-
- case 16:
- value &= 0xffff;
- fat[2 * cluster] = (unsigned char) (value & 0x00ff);
- fat[(2 * cluster) + 1] = (unsigned char) (value >> 8);
- break;
-
- case 32:
- value &= 0xfffffff;
- fat[4 * cluster] = (unsigned char) (value & 0x000000ff);
- fat[(4 * cluster) + 1] = (unsigned char) ((value & 0x0000ff00) >> 8);
- fat[(4 * cluster) + 2] = (unsigned char) ((value & 0x00ff0000) >> 16);
- fat[(4 * cluster) + 3] = (unsigned char) ((value & 0xff000000) >> 24);
- break;
-
- default:
- die("Bad FAT size (not 12, 16, or 32)");
- }
-}
-
-
-/* Mark a specified sector as having a particular value in it's FAT entry */
-
-static void
-mark_FAT_sector (int sector, unsigned int value)
-{
- int cluster;
-
- cluster = (sector - start_data_sector) / (int) (bs.cluster_size) /
- (sector_size/HARD_SECTOR_SIZE);
- if (cluster < 0)
- die ("Invalid cluster number in mark_FAT_sector: probably bug!");
-
- mark_FAT_cluster (cluster, value);
-}
-
-
-/* Perform a test on a block. Return the number of blocks that could be read successfully */
-
-static long
-do_check (char *buffer, int try, off_t current_block)
-{
- long got;
-
- if (llseek (dev, current_block * BLOCK_SIZE, SEEK_SET) /* Seek to the correct location */
- != current_block * BLOCK_SIZE)
- die ("seek failed during testing for blocks");
-
- got = read (dev, buffer, try * BLOCK_SIZE); /* Try reading! */
- if (got < 0)
- got = 0;
-
- if (got & (BLOCK_SIZE - 1))
- printf ("Unexpected values in do_check: probably bugs\n");
- got /= BLOCK_SIZE;
-
- return got;
-}
-
-
-/* Alarm clock handler - display the status of the quest for bad blocks! Then retrigger the alarm for five senconds
- later (so we can come here again) */
-
-static void
-alarm_intr (int alnum)
-{
- if (currently_testing >= blocks)
- return;
-
- signal (SIGALRM, alarm_intr);
- alarm (5);
- if (!currently_testing)
- return;
-
- printf ("%lld... ", (unsigned long long)currently_testing);
- fflush (stdout);
-}
-
-
-static void
-check_blocks (void)
-{
- int try, got;
- int i;
- static char blkbuf[BLOCK_SIZE * TEST_BUFFER_BLOCKS];
-
- if (verbose)
- {
- printf ("Searching for bad blocks ");
- fflush (stdout);
- }
- currently_testing = 0;
- if (verbose)
- {
- signal (SIGALRM, alarm_intr);
- alarm (5);
- }
- try = TEST_BUFFER_BLOCKS;
- while (currently_testing < blocks)
- {
- if (currently_testing + try > blocks)
- try = blocks - currently_testing;
- got = do_check (blkbuf, try, currently_testing);
- currently_testing += got;
- if (got == try)
- {
- try = TEST_BUFFER_BLOCKS;
- continue;
- }
- else
- try = 1;
- if (currently_testing < start_data_block)
- die ("bad blocks before data-area: cannot make fs");
-
- for (i = 0; i < SECTORS_PER_BLOCK; i++) /* Mark all of the sectors in the block as bad */
- mark_sector_bad (currently_testing * SECTORS_PER_BLOCK + i);
- badblocks++;
- currently_testing++;
- }
-
- if (verbose)
- printf ("\n");
-
- if (badblocks)
- printf ("%d bad block%s\n", badblocks,
- (badblocks > 1) ? "s" : "");
-}
-
-
-static void
-get_list_blocks (char *filename)
-{
- int i;
- FILE *listfile;
- unsigned long blockno;
-
- listfile = fopen (filename, "r");
- if (listfile == (FILE *) NULL)
- die ("Can't open file of bad blocks");
-
- while (!feof (listfile))
- {
- fscanf (listfile, "%ld\n", &blockno);
- for (i = 0; i < SECTORS_PER_BLOCK; i++) /* Mark all of the sectors in the block as bad */
- mark_sector_bad (blockno * SECTORS_PER_BLOCK + i);
- badblocks++;
- }
- fclose (listfile);
-
- if (badblocks)
- printf ("%d bad block%s\n", badblocks,
- (badblocks > 1) ? "s" : "");
-}
-
-
-/* Given a file descriptor and an offset, check whether the offset is a valid offset for the file - return FALSE if it
- isn't valid or TRUE if it is */
-
-static int
-valid_offset (int fd, loff_t offset)
-{
- char ch;
-
- if (llseek (fd, offset, SEEK_SET) < 0)
- return FALSE;
- if (read (fd, &ch, 1) < 1)
- return FALSE;
- return TRUE;
-}
-
-
-/* Given a filename, look to see how many blocks of BLOCK_SIZE are present, returning the answer */
-
-static unsigned long long
-count_blocks (char *filename)
-{
- off_t high, low;
- int fd;
-
- if ((fd = open (filename, O_RDONLY)) < 0)
- {
- perror (filename);
- exit (1);
- }
-
- /* first try SEEK_END, which should work on most devices nowadays */
- if ((low = llseek(fd, 0, SEEK_END)) <= 0) {
- low = 0;
- for (high = 1; valid_offset (fd, high); high *= 2)
- low = high;
- while (low < high - 1) {
- const loff_t mid = (low + high) / 2;
- if (valid_offset (fd, mid))
- low = mid;
- else
- high = mid;
- }
- ++low;
- }
-
- close (fd);
- return low / BLOCK_SIZE;
-}
-
-
-/* Check to see if the specified device is currently mounted - abort if it is */
-
-static void
-check_mount (char *device_name)
-{
- FILE *f;
- struct mntent *mnt;
-
- if ((f = setmntent (MOUNTED, "r")) == NULL)
- return;
- while ((mnt = getmntent (f)) != NULL)
- if (strcmp (device_name, mnt->mnt_fsname) == 0)
- die ("%s contains a mounted file system.");
- endmntent (f);
-}
-
-
-/* Establish the geometry and media parameters for the device */
-
-static void
-establish_params (int device_num,int size)
-{
- long loop_size;
- struct hd_geometry geometry;
- struct floppy_struct param;
-
- if ((0 == device_num) || ((device_num & 0xff00) == 0x0200))
- /* file image or floppy disk */
- {
- if (0 == device_num)
- {
- param.size = size/512;
- switch(param.size)
- {
- case 720:
- param.sect = 9 ;
- param.head = 2;
- break;
- case 1440:
- param.sect = 9;
- param.head = 2;
- break;
- case 2400:
- param.sect = 15;
- param.head = 2;
- break;
- case 2880:
- param.sect = 18;
- param.head = 2;
- break;
- case 5760:
- param.sect = 36;
- param.head = 2;
- break;
- default:
- /* fake values */
- param.sect = 32;
- param.head = 64;
- break;
- }
-
- }
- else /* is a floppy diskette */
- {
- if (ioctl (dev, FDGETPRM, &param)) /* Can we get the diskette geometry? */
- die ("unable to get diskette geometry for '%s'");
- }
- bs.secs_track = CT_LE_W(param.sect); /* Set up the geometry information */
- bs.heads = CT_LE_W(param.head);
- switch (param.size) /* Set up the media descriptor byte */
- {
- case 720: /* 5.25", 2, 9, 40 - 360K */
- bs.media = (char) 0xfd;
- bs.cluster_size = (char) 2;
- bs.dir_entries[0] = (char) 112;
- bs.dir_entries[1] = (char) 0;
- break;
-
- case 1440: /* 3.5", 2, 9, 80 - 720K */
- bs.media = (char) 0xf9;
- bs.cluster_size = (char) 2;
- bs.dir_entries[0] = (char) 112;
- bs.dir_entries[1] = (char) 0;
- break;
-
- case 2400: /* 5.25", 2, 15, 80 - 1200K */
- bs.media = (char) 0xf9;
- bs.cluster_size = (char)(atari_format ? 2 : 1);
- bs.dir_entries[0] = (char) 224;
- bs.dir_entries[1] = (char) 0;
- break;
-
- case 5760: /* 3.5", 2, 36, 80 - 2880K */
- bs.media = (char) 0xf0;
- bs.cluster_size = (char) 2;
- bs.dir_entries[0] = (char) 224;
- bs.dir_entries[1] = (char) 0;
- break;
-
- case 2880: /* 3.5", 2, 18, 80 - 1440K */
- floppy_default:
- bs.media = (char) 0xf0;
- bs.cluster_size = (char)(atari_format ? 2 : 1);
- bs.dir_entries[0] = (char) 224;
- bs.dir_entries[1] = (char) 0;
- break;
-
- default: /* Anything else */
- if (0 == device_num)
- goto def_hd_params;
- else
- goto floppy_default;
- }
- }
- else if ((device_num & 0xff00) == 0x0700) /* This is a loop device */
- {
- if (ioctl (dev, BLKGETSIZE, &loop_size))
- die ("unable to get loop device size");
-
- switch (loop_size) /* Assuming the loop device -> floppy later */
- {
- case 720: /* 5.25", 2, 9, 40 - 360K */
- bs.secs_track = CF_LE_W(9);
- bs.heads = CF_LE_W(2);
- bs.media = (char) 0xfd;
- bs.cluster_size = (char) 2;
- bs.dir_entries[0] = (char) 112;
- bs.dir_entries[1] = (char) 0;
- break;
-
- case 1440: /* 3.5", 2, 9, 80 - 720K */
- bs.secs_track = CF_LE_W(9);
- bs.heads = CF_LE_W(2);
- bs.media = (char) 0xf9;
- bs.cluster_size = (char) 2;
- bs.dir_entries[0] = (char) 112;
- bs.dir_entries[1] = (char) 0;
- break;
-
- case 2400: /* 5.25", 2, 15, 80 - 1200K */
- bs.secs_track = CF_LE_W(15);
- bs.heads = CF_LE_W(2);
- bs.media = (char) 0xf9;
- bs.cluster_size = (char)(atari_format ? 2 : 1);
- bs.dir_entries[0] = (char) 224;
- bs.dir_entries[1] = (char) 0;
- break;
-
- case 5760: /* 3.5", 2, 36, 80 - 2880K */
- bs.secs_track = CF_LE_W(36);
- bs.heads = CF_LE_W(2);
- bs.media = (char) 0xf0;
- bs.cluster_size = (char) 2;
- bs.dir_entries[0] = (char) 224;
- bs.dir_entries[1] = (char) 0;
- break;
-
- case 2880: /* 3.5", 2, 18, 80 - 1440K */
- bs.secs_track = CF_LE_W(18);
- bs.heads = CF_LE_W(2);
- bs.media = (char) 0xf0;
- bs.cluster_size = (char)(atari_format ? 2 : 1);
- bs.dir_entries[0] = (char) 224;
- bs.dir_entries[1] = (char) 0;
- break;
-
- default: /* Anything else: default hd setup */
- printf("Loop device does not match a floppy size, using "
- "default hd params\n");
- bs.secs_track = CT_LE_W(32); /* these are fake values... */
- bs.heads = CT_LE_W(64);
- goto def_hd_params;
- }
- }
- else
- /* Must be a hard disk then! */
- {
- /* Can we get the drive geometry? (Note I'm not too sure about */
- /* whether to use HDIO_GETGEO or HDIO_REQ) */
- if (ioctl (dev, HDIO_GETGEO, &geometry) || geometry.sectors == 0 || geometry.heads == 0) {
- printf ("unable to get drive geometry, using default 255/63\n");
- bs.secs_track = CT_LE_W(63);
- bs.heads = CT_LE_W(255);
- }
- else {
- bs.secs_track = CT_LE_W(geometry.sectors); /* Set up the geometry information */
- bs.heads = CT_LE_W(geometry.heads);
- }
- def_hd_params:
- bs.media = (char) 0xf8; /* Set up the media descriptor for a hard drive */
- bs.dir_entries[0] = (char) 0; /* Default to 512 entries */
- bs.dir_entries[1] = (char) 2;
- if (!size_fat && blocks*SECTORS_PER_BLOCK > 1064960) {
- if (verbose) printf("Auto-selecting FAT32 for large filesystem\n");
- size_fat = 32;
- }
- if (size_fat == 32) {
- /* For FAT32, try to do the same as M$'s format command
- * (see http://www.win.tue.nl/~aeb/linux/fs/fat/fatgen103.pdf p. 20):
- * fs size <= 260M: 0.5k clusters
- * fs size <= 8G: 4k clusters
- * fs size <= 16G: 8k clusters
- * fs size > 16G: 16k clusters
- */
- unsigned long sz_mb =
- (blocks+(1<<(20-BLOCK_SIZE_BITS))-1) >> (20-BLOCK_SIZE_BITS);
- bs.cluster_size = sz_mb > 16*1024 ? 32 :
- sz_mb > 8*1024 ? 16 :
- sz_mb > 260 ? 8 :
- 1;
- }
- else {
- /* FAT12 and FAT16: start at 4 sectors per cluster */
- bs.cluster_size = (char) 4;
- }
- }
-}
-
-
-/* Create the filesystem data tables */
-
-static void
-setup_tables (void)
-{
- unsigned num_sectors;
- unsigned cluster_count = 0, fat_length;
- unsigned fatdata; /* Sectors for FATs + data area */
- struct tm *ctime;
- struct msdos_volume_info *vi = (size_fat == 32 ? &bs.fat32.vi : &bs.oldfat.vi);
-
- if (atari_format)
- /* On Atari, the first few bytes of the boot sector are assigned
- * differently: The jump code is only 2 bytes (and m68k machine code
- * :-), then 6 bytes filler (ignored), then 3 byte serial number. */
- memcpy( bs.system_id-1, "mkdosf", 6 );
- else
- strcpy (bs.system_id, "mkdosfs");
- if (sectors_per_cluster)
- bs.cluster_size = (char) sectors_per_cluster;
- if (size_fat == 32)
- {
- /* Under FAT32, the root dir is in a cluster chain, and this is
- * signalled by bs.dir_entries being 0. */
- bs.dir_entries[0] = bs.dir_entries[1] = (char) 0;
- root_dir_entries = 0;
- }
- else if (root_dir_entries)
- {
- /* Override default from establish_params() */
- bs.dir_entries[0] = (char) (root_dir_entries & 0x00ff);
- bs.dir_entries[1] = (char) ((root_dir_entries & 0xff00) >> 8);
- }
- else
- root_dir_entries = bs.dir_entries[0] + (bs.dir_entries[1] << 8);
-
- if (atari_format) {
- bs.system_id[5] = (unsigned char) (volume_id & 0x000000ff);
- bs.system_id[6] = (unsigned char) ((volume_id & 0x0000ff00) >> 8);
- bs.system_id[7] = (unsigned char) ((volume_id & 0x00ff0000) >> 16);
- }
- else {
- vi->volume_id[0] = (unsigned char) (volume_id & 0x000000ff);
- vi->volume_id[1] = (unsigned char) ((volume_id & 0x0000ff00) >> 8);
- vi->volume_id[2] = (unsigned char) ((volume_id & 0x00ff0000) >> 16);
- vi->volume_id[3] = (unsigned char) (volume_id >> 24);
- }
-
- if (!atari_format) {
- memcpy(vi->volume_label, volume_name, 11);
-
- memcpy(bs.boot_jump, dummy_boot_jump, 3);
- /* Patch in the correct offset to the boot code */
- bs.boot_jump[1] = ((size_fat == 32 ?
- (char *)&bs.fat32.boot_code :
- (char *)&bs.oldfat.boot_code) -
- (char *)&bs) - 2;
-
- if (size_fat == 32) {
- int offset = (char *)&bs.fat32.boot_code -
- (char *)&bs + MESSAGE_OFFSET + 0x7c00;
- if (dummy_boot_code[BOOTCODE_FAT32_SIZE-1])
- printf ("Warning: message too long; truncated\n");
- dummy_boot_code[BOOTCODE_FAT32_SIZE-1] = 0;
- memcpy(bs.fat32.boot_code, dummy_boot_code, BOOTCODE_FAT32_SIZE);
- bs.fat32.boot_code[MSG_OFFSET_OFFSET] = offset & 0xff;
- bs.fat32.boot_code[MSG_OFFSET_OFFSET+1] = offset >> 8;
- }
- else {
- memcpy(bs.oldfat.boot_code, dummy_boot_code, BOOTCODE_SIZE);
- }
- bs.boot_sign = CT_LE_W(BOOT_SIGN);
- }
- else {
- memcpy(bs.boot_jump, dummy_boot_jump_m68k, 2);
- }
- if (verbose >= 2)
- printf( "Boot jump code is %02x %02x\n",
- bs.boot_jump[0], bs.boot_jump[1] );
-
- if (!reserved_sectors)
- reserved_sectors = (size_fat == 32) ? 32 : 1;
- else {
- if (size_fat == 32 && reserved_sectors < 2)
- die("On FAT32 at least 2 reserved sectors are needed.");
- }
- bs.reserved = CT_LE_W(reserved_sectors);
- if (verbose >= 2)
- printf( "Using %d reserved sectors\n", reserved_sectors );
- bs.fats = (char) nr_fats;
- if (!atari_format || size_fat == 32)
- bs.hidden = CT_LE_L(hidden_sectors);
- else {
- /* In Atari format, hidden is a 16 bit field */
- __u16 hidden = CT_LE_W(hidden_sectors);
- if (hidden_sectors & ~0xffff)
- die("#hidden doesn't fit in 16bit field of Atari format\n");
- memcpy( &bs.hidden, &hidden, 2 );
- }
-
- num_sectors = (long long)blocks*BLOCK_SIZE/sector_size;
- if (!atari_format) {
- unsigned fatlength12, fatlength16, fatlength32;
- unsigned maxclust12, maxclust16, maxclust32;
- unsigned clust12, clust16, clust32;
- int maxclustsize;
-
- fatdata = num_sectors - cdiv (root_dir_entries * 32, sector_size) -
- reserved_sectors;
-
- if (sectors_per_cluster)
- bs.cluster_size = maxclustsize = sectors_per_cluster;
- else
- /* An initial guess for bs.cluster_size should already be set */
- maxclustsize = 128;
-
- if (verbose >= 2)
- printf( "%d sectors for FAT+data, starting with %d sectors/cluster\n",
- fatdata, bs.cluster_size );
- do {
- if (verbose >= 2)
- printf( "Trying with %d sectors/cluster:\n", bs.cluster_size );
-
- /* The factor 2 below avoids cut-off errors for nr_fats == 1.
- * The "nr_fats*3" is for the reserved first two FAT entries */
- clust12 = 2*((long long) fatdata *sector_size + nr_fats*3) /
- (2*(int) bs.cluster_size * sector_size + nr_fats*3);
- fatlength12 = cdiv (((clust12+2) * 3 + 1) >> 1, sector_size);
- /* Need to recalculate number of clusters, since the unused parts of the
- * FATS and data area together could make up space for an additional,
- * not really present cluster. */
- clust12 = (fatdata - nr_fats*fatlength12)/bs.cluster_size;
- maxclust12 = (fatlength12 * 2 * sector_size) / 3;
- if (maxclust12 > MAX_CLUST_12)
- maxclust12 = MAX_CLUST_12;
- if (verbose >= 2)
- printf( "FAT12: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n",
- clust12, fatlength12, maxclust12, MAX_CLUST_12 );
- if (clust12 > maxclust12-2) {
- clust12 = 0;
- if (verbose >= 2)
- printf( "FAT12: too much clusters\n" );
- }
-
- clust16 = ((long long) fatdata *sector_size + nr_fats*4) /
- ((int) bs.cluster_size * sector_size + nr_fats*2);
- fatlength16 = cdiv ((clust16+2) * 2, sector_size);
- /* Need to recalculate number of clusters, since the unused parts of the
- * FATS and data area together could make up space for an additional,
- * not really present cluster. */
- clust16 = (fatdata - nr_fats*fatlength16)/bs.cluster_size;
- maxclust16 = (fatlength16 * sector_size) / 2;
- if (maxclust16 > MAX_CLUST_16)
- maxclust16 = MAX_CLUST_16;
- if (verbose >= 2)
- printf( "FAT16: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n",
- clust16, fatlength16, maxclust16, MAX_CLUST_16 );
- if (clust16 > maxclust16-2) {
- if (verbose >= 2)
- printf( "FAT16: too much clusters\n" );
- clust16 = 0;
- }
- /* The < 4078 avoids that the filesystem will be misdetected as having a
- * 12 bit FAT. */
- if (clust16 < FAT12_THRESHOLD && !(size_fat_by_user && size_fat == 16)) {
- if (verbose >= 2)
- printf( clust16 < FAT12_THRESHOLD ?
- "FAT16: would be misdetected as FAT12\n" :
- "FAT16: too much clusters\n" );
- clust16 = 0;
- }
-
- clust32 = ((long long) fatdata *sector_size + nr_fats*8) /
- ((int) bs.cluster_size * sector_size + nr_fats*4);
- fatlength32 = cdiv ((clust32+2) * 4, sector_size);
- /* Need to recalculate number of clusters, since the unused parts of the
- * FATS and data area together could make up space for an additional,
- * not really present cluster. */
- clust32 = (fatdata - nr_fats*fatlength32)/bs.cluster_size;
- maxclust32 = (fatlength32 * sector_size) / 4;
- if (maxclust32 > MAX_CLUST_32)
- maxclust32 = MAX_CLUST_32;
- if (clust32 && clust32 < MIN_CLUST_32 && !(size_fat_by_user && size_fat == 32)) {
- clust32 = 0;
- if (verbose >= 2)
- printf( "FAT32: not enough clusters (%d)\n", MIN_CLUST_32);
- }
- if (verbose >= 2)
- printf( "FAT32: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n",
- clust32, fatlength32, maxclust32, MAX_CLUST_32 );
- if (clust32 > maxclust32) {
- clust32 = 0;
- if (verbose >= 2)
- printf( "FAT32: too much clusters\n" );
- }
-
- if ((clust12 && (size_fat == 0 || size_fat == 12)) ||
- (clust16 && (size_fat == 0 || size_fat == 16)) ||
- (clust32 && size_fat == 32))
- break;
-
- bs.cluster_size <<= 1;
- } while (bs.cluster_size && bs.cluster_size <= maxclustsize);
-
- /* Use the optimal FAT size if not specified;
- * FAT32 is (not yet) choosen automatically */
- if (!size_fat) {
- size_fat = (clust16 > clust12) ? 16 : 12;
- if (verbose >= 2)
- printf( "Choosing %d bits for FAT\n", size_fat );
- }
-
- switch (size_fat) {
- case 12:
- cluster_count = clust12;
- fat_length = fatlength12;
- bs.fat_length = CT_LE_W(fatlength12);
- memcpy(vi->fs_type, MSDOS_FAT12_SIGN, 8);
- break;
-
- case 16:
- if (clust16 < FAT12_THRESHOLD) {
- if (size_fat_by_user) {
- fprintf( stderr, "WARNING: Not enough clusters for a "
- "16 bit FAT! The filesystem will be\n"
- "misinterpreted as having a 12 bit FAT without "
- "mount option \"fat=16\".\n" );
- }
- else {
- fprintf( stderr, "This filesystem has an unfortunate size. "
- "A 12 bit FAT cannot provide\n"
- "enough clusters, but a 16 bit FAT takes up a little "
- "bit more space so that\n"
- "the total number of clusters becomes less than the "
- "threshold value for\n"
- "distinction between 12 and 16 bit FATs.\n" );
- die( "Make the file system a bit smaller manually." );
- }
- }
- cluster_count = clust16;
- fat_length = fatlength16;
- bs.fat_length = CT_LE_W(fatlength16);
- memcpy(vi->fs_type, MSDOS_FAT16_SIGN, 8);
- break;
-
- case 32:
- if (clust32 < MIN_CLUST_32)
- fprintf(stderr, "WARNING: Not enough clusters for a 32 bit FAT!\n");
- cluster_count = clust32;
- fat_length = fatlength32;
- bs.fat_length = CT_LE_W(0);
- bs.fat32.fat32_length = CT_LE_L(fatlength32);
- memcpy(vi->fs_type, MSDOS_FAT32_SIGN, 8);
- break;
-
- default:
- die("FAT not 12, 16 or 32 bits");
- }
- }
- else {
- unsigned clusters, maxclust;
-
- /* GEMDOS always uses a 12 bit FAT on floppies, and always a 16 bit FAT on
- * hard disks. So use 12 bit if the size of the file system suggests that
- * this fs is for a floppy disk, if the user hasn't explicitly requested a
- * size.
- */
- if (!size_fat)
- size_fat = (num_sectors == 1440 || num_sectors == 2400 ||
- num_sectors == 2880 || num_sectors == 5760) ? 12 : 16;
- if (verbose >= 2)
- printf( "Choosing %d bits for FAT\n", size_fat );
-
- /* Atari format: cluster size should be 2, except explicitly requested by
- * the user, since GEMDOS doesn't like other cluster sizes very much.
- * Instead, tune the sector size for the FS to fit.
- */
- bs.cluster_size = sectors_per_cluster ? sectors_per_cluster : 2;
- if (!sector_size_set) {
- while( num_sectors > GEMDOS_MAX_SECTORS ) {
- num_sectors >>= 1;
- sector_size <<= 1;
- }
- }
- if (verbose >= 2)
- printf( "Sector size must be %d to have less than %d log. sectors\n",
- sector_size, GEMDOS_MAX_SECTORS );
-
- /* Check if there are enough FAT indices for how much clusters we have */
- do {
- fatdata = num_sectors - cdiv (root_dir_entries * 32, sector_size) -
- reserved_sectors;
- /* The factor 2 below avoids cut-off errors for nr_fats == 1 and
- * size_fat == 12
- * The "2*nr_fats*size_fat/8" is for the reserved first two FAT entries
- */
- clusters = (2*((long long)fatdata*sector_size - 2*nr_fats*size_fat/8)) /
- (2*((int)bs.cluster_size*sector_size + nr_fats*size_fat/8));
- fat_length = cdiv( (clusters+2)*size_fat/8, sector_size );
- /* Need to recalculate number of clusters, since the unused parts of the
- * FATS and data area together could make up space for an additional,
- * not really present cluster. */
- clusters = (fatdata - nr_fats*fat_length)/bs.cluster_size;
- maxclust = (fat_length*sector_size*8)/size_fat;
- if (verbose >= 2)
- printf( "ss=%d: #clu=%d, fat_len=%d, maxclu=%d\n",
- sector_size, clusters, fat_length, maxclust );
-
- /* last 10 cluster numbers are special (except FAT32: 4 high bits rsvd);
- * first two numbers are reserved */
- if (maxclust <= (size_fat == 32 ? MAX_CLUST_32 : (1<<size_fat)-0x10) &&
- clusters <= maxclust-2)
- break;
- if (verbose >= 2)
- printf( clusters > maxclust-2 ?
- "Too many clusters\n" : "FAT too big\n" );
-
- /* need to increment sector_size once more to */
- if (sector_size_set)
- die( "With this sector size, the maximum number of FAT entries "
- "would be exceeded." );
- num_sectors >>= 1;
- sector_size <<= 1;
- } while( sector_size <= GEMDOS_MAX_SECTOR_SIZE );
-
- if (sector_size > GEMDOS_MAX_SECTOR_SIZE)
- die( "Would need a sector size > 16k, which GEMDOS can't work with");
-
- cluster_count = clusters;
- if (size_fat != 32)
- bs.fat_length = CT_LE_W(fat_length);
- else {
- bs.fat_length = 0;
- bs.fat32.fat32_length = CT_LE_L(fat_length);
- }
- }
-
- bs.sector_size[0] = (char) (sector_size & 0x00ff);
- bs.sector_size[1] = (char) ((sector_size & 0xff00) >> 8);
-
- if (size_fat == 32)
- {
- /* set up additional FAT32 fields */
- bs.fat32.flags = CT_LE_W(0);
- bs.fat32.version[0] = 0;
- bs.fat32.version[1] = 0;
- bs.fat32.root_cluster = CT_LE_L(2);
- bs.fat32.info_sector = CT_LE_W(1);
- if (!backup_boot)
- backup_boot = (reserved_sectors >= 7) ? 6 :
- (reserved_sectors >= 2) ? reserved_sectors-1 : 0;
- else
- {
- if (backup_boot == 1)
- die("Backup boot sector must be after sector 1");
- else if (backup_boot >= reserved_sectors)
- die("Backup boot sector must be a reserved sector");
- }
- if (verbose >= 2)
- printf( "Using sector %d as backup boot sector (0 = none)\n",
- backup_boot );
- bs.fat32.backup_boot = CT_LE_W(backup_boot);
- memset( &bs.fat32.reserved2, 0, sizeof(bs.fat32.reserved2) );
- }
-
- if (atari_format) {
- /* Just some consistency checks */
- if (num_sectors >= GEMDOS_MAX_SECTORS)
- die( "GEMDOS can't handle more than 65531 sectors" );
- else if (num_sectors >= OLDGEMDOS_MAX_SECTORS)
- printf( "Warning: More than 32765 sector need TOS 1.04 "
- "or higher.\n" );
- }
- if (num_sectors >= 65536)
- {
- bs.sectors[0] = (char) 0;
- bs.sectors[1] = (char) 0;
- bs.total_sect = CT_LE_L(num_sectors);
- }
- else
- {
- bs.sectors[0] = (char) (num_sectors & 0x00ff);
- bs.sectors[1] = (char) ((num_sectors & 0xff00) >> 8);
- if (!atari_format)
- bs.total_sect = CT_LE_L(0);
- }
-
- if (!atari_format)
- vi->ext_boot_sign = MSDOS_EXT_SIGN;
-
- if (!cluster_count)
- {
- if (sectors_per_cluster) /* If yes, die if we'd spec'd sectors per cluster */
- die ("Too many clusters for file system - try more sectors per cluster");
- else
- die ("Attempting to create a too large file system");
- }
-
-
- /* The two following vars are in hard sectors, i.e. 512 byte sectors! */
- start_data_sector = (reserved_sectors + nr_fats * fat_length) *
- (sector_size/HARD_SECTOR_SIZE);
- start_data_block = (start_data_sector + SECTORS_PER_BLOCK - 1) /
- SECTORS_PER_BLOCK;
-
- if (blocks < start_data_block + 32) /* Arbitrary undersize file system! */
- die ("Too few blocks for viable file system");
-
- if (verbose)
- {
- printf("%s has %d head%s and %d sector%s per track,\n",
- device_name, CF_LE_W(bs.heads), (CF_LE_W(bs.heads) != 1) ? "s" : "",
- CF_LE_W(bs.secs_track), (CF_LE_W(bs.secs_track) != 1) ? "s" : "");
- printf("logical sector size is %d,\n",sector_size);
- printf("using 0x%02x media descriptor, with %d sectors;\n",
- (int) (bs.media), num_sectors);
- printf("file system has %d %d-bit FAT%s and %d sector%s per cluster.\n",
- (int) (bs.fats), size_fat, (bs.fats != 1) ? "s" : "",
- (int) (bs.cluster_size), (bs.cluster_size != 1) ? "s" : "");
- printf ("FAT size is %d sector%s, and provides %d cluster%s.\n",
- fat_length, (fat_length != 1) ? "s" : "",
- cluster_count, (cluster_count != 1) ? "s" : "");
- if (size_fat != 32)
- printf ("Root directory contains %d slots.\n",
- (int) (bs.dir_entries[0]) + (int) (bs.dir_entries[1]) * 256);
- printf ("Volume ID is %08lx, ", volume_id &
- (atari_format ? 0x00ffffff : 0xffffffff));
- if ( strcmp(volume_name, " ") )
- printf("volume label %s.\n", volume_name);
- else
- printf("no volume label.\n");
- }
-
- /* Make the file allocation tables! */
-
- if ((fat = (unsigned char *) malloc (fat_length * sector_size)) == NULL)
- die ("unable to allocate space for FAT image in memory");
-
- memset( fat, 0, fat_length * sector_size );
-
- mark_FAT_cluster (0, 0xffffffff); /* Initial fat entries */
- mark_FAT_cluster (1, 0xffffffff);
- fat[0] = (unsigned char) bs.media; /* Put media type in first byte! */
- if (size_fat == 32) {
- /* Mark cluster 2 as EOF (used for root dir) */
- mark_FAT_cluster (2, FAT_EOF);
- }
-
- /* Make the root directory entries */
-
- size_root_dir = (size_fat == 32) ?
- bs.cluster_size*sector_size :
- (((int)bs.dir_entries[1]*256+(int)bs.dir_entries[0]) *
- sizeof (struct msdos_dir_entry));
- if ((root_dir = (struct msdos_dir_entry *) malloc (size_root_dir)) == NULL)
- {
- free (fat); /* Tidy up before we die! */
- die ("unable to allocate space for root directory in memory");
- }
-
- memset(root_dir, 0, size_root_dir);
- if ( memcmp(volume_name, " ", 11) )
- {
- struct msdos_dir_entry *de = &root_dir[0];
- memcpy(de->name, volume_name, 11);
- de->attr = ATTR_VOLUME;
- ctime = localtime(&create_time);
- de->time = CT_LE_W((unsigned short)((ctime->tm_sec >> 1) +
- (ctime->tm_min << 5) + (ctime->tm_hour << 11)));
- de->date = CT_LE_W((unsigned short)(ctime->tm_mday +
- ((ctime->tm_mon+1) << 5) +
- ((ctime->tm_year-80) << 9)));
- de->ctime_ms = 0;
- de->ctime = de->time;
- de->cdate = de->date;
- de->adate = de->date;
- de->starthi = CT_LE_W(0);
- de->start = CT_LE_W(0);
- de->size = CT_LE_L(0);
- }
-
- if (size_fat == 32) {
- /* For FAT32, create an info sector */
- struct fat32_fsinfo *info;
-
- if (!(info_sector = malloc( sector_size )))
- die("Out of memory");
- memset(info_sector, 0, sector_size);
- /* fsinfo structure is at offset 0x1e0 in info sector by observation */
- info = (struct fat32_fsinfo *)(info_sector + 0x1e0);
-
- /* Info sector magic */
- info_sector[0] = 'R';
- info_sector[1] = 'R';
- info_sector[2] = 'a';
- info_sector[3] = 'A';
-
- /* Magic for fsinfo structure */
- info->signature = CT_LE_L(0x61417272);
- /* We've allocated cluster 2 for the root dir. */
- info->free_clusters = CT_LE_L(cluster_count - 1);
- info->next_cluster = CT_LE_L(2);
-
- /* Info sector also must have boot sign */
- *(__u16 *)(info_sector + 0x1fe) = CT_LE_W(BOOT_SIGN);
- }
-
- if (!(blank_sector = malloc( sector_size )))
- die( "Out of memory" );
- memset(blank_sector, 0, sector_size);
-}
-
-
-/* Write the new filesystem's data tables to wherever they're going to end up! */
-
-#define error(str) \
- do { \
- free (fat); \
- if (info_sector) free (info_sector); \
- free (root_dir); \
- die (str); \
- } while(0)
-
-#define seekto(pos,errstr) \
- do { \
- loff_t __pos = (pos); \
- if (llseek (dev, __pos, SEEK_SET) != __pos) \
- error ("seek to " errstr " failed whilst writing tables"); \
- } while(0)
-
-#define writebuf(buf,size,errstr) \
- do { \
- int __size = (size); \
- if (write (dev, buf, __size) != __size) \
- error ("failed whilst writing " errstr); \
- } while(0)
-
-
-static void
-write_tables (void)
-{
- int x;
- int fat_length;
-
- fat_length = (size_fat == 32) ?
- CF_LE_L(bs.fat32.fat32_length) : CF_LE_W(bs.fat_length);
-
- seekto( 0, "start of device" );
- /* clear all reserved sectors */
- for( x = 0; x < reserved_sectors; ++x )
- writebuf( blank_sector, sector_size, "reserved sector" );
- /* seek back to sector 0 and write the boot sector */
- seekto( 0, "boot sector" );
- writebuf( (char *) &bs, sizeof (struct msdos_boot_sector), "boot sector" );
- /* on FAT32, write the info sector and backup boot sector */
- if (size_fat == 32)
- {
- seekto( CF_LE_W(bs.fat32.info_sector)*sector_size, "info sector" );
- writebuf( info_sector, 512, "info sector" );
- if (backup_boot != 0)
- {
- seekto( backup_boot*sector_size, "backup boot sector" );
- writebuf( (char *) &bs, sizeof (struct msdos_boot_sector),
- "backup boot sector" );
- }
- }
- /* seek to start of FATS and write them all */
- seekto( reserved_sectors*sector_size, "first FAT" );
- for (x = 1; x <= nr_fats; x++)
- writebuf( fat, fat_length * sector_size, "FAT" );
- /* Write the root directory directly after the last FAT. This is the root
- * dir area on FAT12/16, and the first cluster on FAT32. */
- writebuf( (char *) root_dir, size_root_dir, "root directory" );
-
- if (blank_sector) free( blank_sector );
- if (info_sector) free( info_sector );
- free (root_dir); /* Free up the root directory space from setup_tables */
- free (fat); /* Free up the fat table space reserved during setup_tables */
-}
-
-
-/* Report the command usage and return a failure error code */
-
-void
-usage (void)
-{
- fatal_error("\
-Usage: mkdosfs [-A] [-c] [-C] [-v] [-I] [-l bad-block-file] [-b backup-boot-sector]\n\
- [-m boot-msg-file] [-n volume-name] [-i volume-id]\n\
- [-s sectors-per-cluster] [-S logical-sector-size] [-f number-of-FATs]\n\
- [-h hidden-sectors] [-F fat-size] [-r root-dir-entries] [-R reserved-sectors]\n\
- /dev/name [blocks]\n");
-}
-
-/*
- * ++roman: On m68k, check if this is an Atari; if yes, turn on Atari variant
- * of MS-DOS filesystem by default.
- */
-static void check_atari( void )
-{
-#ifdef __mc68000__
- FILE *f;
- char line[128], *p;
-
- if (!(f = fopen( "/proc/hardware", "r" ))) {
- perror( "/proc/hardware" );
- return;
- }
-
- while( fgets( line, sizeof(line), f ) ) {
- if (strncmp( line, "Model:", 6 ) == 0) {
- p = line + 6;
- p += strspn( p, " \t" );
- if (strncmp( p, "Atari ", 6 ) == 0)
- atari_format = 1;
- break;
- }
- }
- fclose( f );
-#endif
-}
-
-/* The "main" entry point into the utility - we pick up the options and attempt to process them in some sort of sensible
- way. In the event that some/all of the options are invalid we need to tell the user so that something can be done! */
-
-int
-main (int argc, char **argv)
-{
- int c;
- char *tmp;
- char *listfile = NULL;
- FILE *msgfile;
- struct stat statbuf;
- int i = 0, pos, ch;
- int create = 0;
- unsigned long long cblocks;
- int min_sector_size;
-
- if (argc && *argv) { /* What's the program name? */
- char *p;
- program_name = *argv;
- if ((p = strrchr( program_name, '/' )))
- program_name = p+1;
- }
-
- gettimeofday(&create_timeval, NULL);
- create_time = create_timeval.tv_sec;
- volume_id = (u_int32_t)( (create_timeval.tv_sec << 20) | create_timeval.tv_usec ); /* Default volume ID = creation time, fudged for more uniqueness */
- check_atari();
-
- printf ("%s " VERSION " (" VERSION_DATE ")\n",
- program_name);
-
- while ((c = getopt (argc, argv, "Ab:cCf:F:Ii:l:m:n:r:R:s:S:h:v")) != EOF)
- /* Scan the command line for options */
- switch (c)
- {
- case 'A': /* toggle Atari format */
- atari_format = !atari_format;
- break;
-
- case 'b': /* b : location of backup boot sector */
- backup_boot = (int) strtol (optarg, &tmp, 0);
- if (*tmp || backup_boot < 2 || backup_boot > 0xffff)
- {
- printf ("Bad location for backup boot sector : %s\n", optarg);
- usage ();
- }
- break;
-
- case 'c': /* c : Check FS as we build it */
- check = TRUE;
- break;
-
- case 'C': /* C : Create a new file */
- create = TRUE;
- break;
-
- case 'f': /* f : Choose number of FATs */
- nr_fats = (int) strtol (optarg, &tmp, 0);
- if (*tmp || nr_fats < 1 || nr_fats > 4)
- {
- printf ("Bad number of FATs : %s\n", optarg);
- usage ();
- }
- break;
-
- case 'F': /* F : Choose FAT size */
- size_fat = (int) strtol (optarg, &tmp, 0);
- if (*tmp || (size_fat != 12 && size_fat != 16 && size_fat != 32))
- {
- printf ("Bad FAT type : %s\n", optarg);
- usage ();
- }
- size_fat_by_user = 1;
- break;
-
- case 'h': /* h : number of hidden sectors */
- hidden_sectors = (int) strtol (optarg, &tmp, 0);
- if ( *tmp || hidden_sectors < 0 )
- {
- printf("Bad number of hidden sectors : %s\n", optarg);
- usage ();
- }
- break;
-
- case 'I':
- ignore_full_disk = 1;
- break;
-
- case 'i': /* i : specify volume ID */
- volume_id = strtoul(optarg, &tmp, 16);
- if ( *tmp )
- {
- printf("Volume ID must be a hexadecimal number\n");
- usage();
- }
- break;
-
- case 'l': /* l : Bad block filename */
- listfile = optarg;
- break;
-
- case 'm': /* m : Set boot message */
- if ( strcmp(optarg, "-") )
- {
- msgfile = fopen(optarg, "r");
- if ( !msgfile )
- perror(optarg);
- }
- else
- msgfile = stdin;
-
- if ( msgfile )
- {
- /* The boot code ends at offset 448 and needs a null terminator */
- i = MESSAGE_OFFSET;
- pos = 0; /* We are at beginning of line */
- do
- {
- ch = getc(msgfile);
- switch (ch)
- {
- case '\r': /* Ignore CRs */
- case '\0': /* and nulls */
- break;
-
- case '\n': /* LF -> CR+LF if necessary */
- if ( pos ) /* If not at beginning of line */
- {
- dummy_boot_code[i++] = '\r';
- pos = 0;
- }
- dummy_boot_code[i++] = '\n';
- break;
-
- case '\t': /* Expand tabs */
- do
- {
- dummy_boot_code[i++] = ' ';
- pos++;
- }
- while ( pos % 8 && i < BOOTCODE_SIZE-1 );
- break;
-
- case EOF:
- dummy_boot_code[i++] = '\0'; /* Null terminator */
- break;
-
- default:
- dummy_boot_code[i++] = ch; /* Store character */
- pos++; /* Advance position */
- break;
- }
- }
- while ( ch != EOF && i < BOOTCODE_SIZE-1 );
-
- /* Fill up with zeros */
- while( i < BOOTCODE_SIZE-1 )
- dummy_boot_code[i++] = '\0';
- dummy_boot_code[BOOTCODE_SIZE-1] = '\0'; /* Just in case */
-
- if ( ch != EOF )
- printf ("Warning: message too long; truncated\n");
-
- if ( msgfile != stdin )
- fclose(msgfile);
- }
- break;
-
- case 'n': /* n : Volume name */
- sprintf(volume_name, "%-11.11s", optarg);
- break;
-
- case 'r': /* r : Root directory entries */
- root_dir_entries = (int) strtol (optarg, &tmp, 0);
- if (*tmp || root_dir_entries < 16 || root_dir_entries > 32768)
- {
- printf ("Bad number of root directory entries : %s\n", optarg);
- usage ();
- }
- break;
-
- case 'R': /* R : number of reserved sectors */
- reserved_sectors = (int) strtol (optarg, &tmp, 0);
- if (*tmp || reserved_sectors < 1 || reserved_sectors > 0xffff)
- {
- printf ("Bad number of reserved sectors : %s\n", optarg);
- usage ();
- }
- break;
-
- case 's': /* s : Sectors per cluster */
- sectors_per_cluster = (int) strtol (optarg, &tmp, 0);
- if (*tmp || (sectors_per_cluster != 1 && sectors_per_cluster != 2
- && sectors_per_cluster != 4 && sectors_per_cluster != 8
- && sectors_per_cluster != 16 && sectors_per_cluster != 32
- && sectors_per_cluster != 64 && sectors_per_cluster != 128))
- {
- printf ("Bad number of sectors per cluster : %s\n", optarg);
- usage ();
- }
- break;
-
- case 'S': /* S : Sector size */
- sector_size = (int) strtol (optarg, &tmp, 0);
- if (*tmp || (sector_size != 512 && sector_size != 1024 &&
- sector_size != 2048 && sector_size != 4096 &&
- sector_size != 8192 && sector_size != 16384 &&
- sector_size != 32768))
- {
- printf ("Bad logical sector size : %s\n", optarg);
- usage ();
- }
- sector_size_set = 1;
- break;
-
- case 'v': /* v : Verbose execution */
- ++verbose;
- break;
-
- default:
- printf( "Unknown option: %c\n", c );
- usage ();
- }
- if (optind < argc)
- {
- device_name = argv[optind]; /* Determine the number of blocks in the FS */
-
- if (!device_name) {
- printf("No device specified.\n");
- usage();
- }
-
- if (!create)
- cblocks = count_blocks (device_name); /* Have a look and see! */
- }
- if (optind == argc - 2) /* Either check the user specified number */
- {
- blocks = strtoull (argv[optind + 1], &tmp, 0);
- if (!create && blocks != cblocks)
- {
- fprintf (stderr, "Warning: block count mismatch: ");
- fprintf (stderr, "found %llu but assuming %llu.\n",cblocks,blocks);
- }
- }
- else if (optind == argc - 1) /* Or use value found */
- {
- if (create)
- die( "Need intended size with -C." );
- blocks = cblocks;
- tmp = "";
- }
- else
- {
- fprintf (stderr, "No device specified!\n");
- usage ();
- }
- if (*tmp)
- {
- printf ("Bad block count : %s\n", argv[optind + 1]);
- usage ();
- }
-
- if (check && listfile) /* Auto and specified bad block handling are mutually */
- die ("-c and -l are incompatible"); /* exclusive of each other! */
-
- if (!create) {
- check_mount (device_name); /* Is the device already mounted? */
- dev = open (device_name, O_EXCL|O_RDWR); /* Is it a suitable device to build the FS on? */
- if (dev < 0)
- die ("unable to open %s");
- }
- else {
- off_t offset = blocks*BLOCK_SIZE - 1;
- char null = 0;
- /* create the file */
- dev = open( device_name, O_EXCL|O_RDWR|O_CREAT|O_TRUNC, 0666 );
- if (dev < 0)
- die("unable to create %s");
- /* seek to the intended end-1, and write one byte. this creates a
- * sparse-as-possible file of appropriate size. */
- if (llseek( dev, offset, SEEK_SET ) != offset)
- die( "seek failed" );
- if (write( dev, &null, 1 ) < 0)
- die( "write failed" );
- if (llseek( dev, 0, SEEK_SET ) != 0)
- die( "seek failed" );
- }
-
- if (fstat (dev, &statbuf) < 0)
- die ("unable to stat %s");
- if (!S_ISBLK (statbuf.st_mode)) {
- statbuf.st_rdev = 0;
- check = 0;
- }
- else
- /*
- * Ignore any 'full' fixed disk devices, if -I is not given.
- * On a MO-disk one doesn't need partitions. The filesytem can go
- * directly to the whole disk. Under other OSes this is known as
- * the 'superfloppy' format. As I don't know how to find out if
- * this is a MO disk I introduce a -I (ignore) switch. -Joey
- */
- if (!ignore_full_disk && (
- (statbuf.st_rdev & 0xff3f) == 0x0300 || /* hda, hdb */
- (statbuf.st_rdev & 0xff0f) == 0x0800 || /* sd */
- (statbuf.st_rdev & 0xff3f) == 0x0d00 || /* xd */
- (statbuf.st_rdev & 0xff3f) == 0x1600 ) /* hdc, hdd */
- )
- die ("Device partition expected, not making filesystem on entire device '%s' (use -I to override)");
-
- if (sector_size_set)
- {
- if (ioctl(dev, BLKSSZGET, &min_sector_size) >= 0)
- if (sector_size < min_sector_size)
- {
- sector_size = min_sector_size;
- fprintf(stderr, "Warning: sector size was set to %d (minimal for this device)\n", sector_size);
- }
- }
- else
- {
- if (ioctl(dev, BLKSSZGET, &min_sector_size) >= 0)
- {
- sector_size = min_sector_size;
- sector_size_set = 1;
- }
- }
-
- if (sector_size > 4096)
- fprintf(stderr,
- "Warning: sector size is set to %d > 4096, such filesystem will not propably mount\n",
- sector_size);
-
- establish_params (statbuf.st_rdev,statbuf.st_size);
- /* Establish the media parameters */
-
- setup_tables (); /* Establish the file system tables */
-
- if (check) /* Determine any bad block locations and mark them */
- check_blocks ();
- else if (listfile)
- get_list_blocks (listfile);
-
- write_tables (); /* Write the file system tables away! */
-
- exit (0); /* Terminate with no errors! */
-}
-
-
-/* That's All Folks */
-/* Local Variables: */
-/* tab-width: 8 */
-/* End: */
diff --git a/src/version.h b/src/version.h
deleted file mode 100644
index 5a97926..0000000
--- a/src/version.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* version.h
-
- Copyright (C) 1998-2005 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-#ifndef _version_h
-#define _version_h
-
-#define VERSION "3.0.1"
-#define VERSION_DATE "23 Nov 2008"
-
-#endif /* _version_h */