reiserfsprogs-3.6.20/0000777000175300001440000000000010412227616011504 500000000000000reiserfsprogs-3.6.20/AUTHORS0000644000175300001440000000000010412227267012460 00000000000000reiserfsprogs-3.6.20/COPYING0000644000175300001440000004311010412227267012454 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. reiserfsprogs-3.6.20/CREDITS0000644000175300001440000001004610412227267012443 00000000000000/* Copyright 1996-2004 by Hans Reiser, licensing governed by reiserfsprogs/README. */ Hans Reiser was the project initiator, source of all funding for the first 5.5 years. He is the architect and official maintainer. Vladimir Saveliev started as the most junior programmer on the team, and became the lead programmer. He is now an experienced highly productive programmer. He wrote the extent handling code for Reiser4, plus parts of the balancing code and file write and file read. Alexander Zarochentcev (zam) wrote the high low priority locking code, online resizer for V3 and V4, online repacker for V4, block allocation code, and major parts of the flush code, and maintains the transaction manager code. We give him the stuff that we know will be hard to debug, or needs to be very cleanly structured. Nikita Danilov wrote most of the core balancing code, plugin infrastructure, and directory code. He steadily worked long hours, and is the reason so much of the Reiser4 plugin infrastructure is well abstracted in its details. The carry function, and the use of non-recursive balancing, are his idea. Vladimir Demidov wrote the parser for sys_reiser4(), the V3 alpha port, part of the V3 journal relocation code, and helped Hans keep the business side of things running. Chris Mason wrote the journaling code for V3, which was enormously more useful to users than just waiting until we could create a wandering log filesystem as Hans would have unwisely done without him. Jeff Mahoney optimized the bitmap scanning code for V3, and performed the big endian cleanups. Elena Gryaznova performed testing and benchmarking. Oleg Drokin was the debugger for V3 during most of the time that V4 was under development, and was quite skilled and fast at it. He wrote the large write optimization of V3. Edward Shushkin wrote the encryption and compression file plugins, and the V3 journal relocation code. Alexander Lyamin keeps our hardware running, and was very generous to our project in many little ways. Vitaly Fertman wrote fsck for V3 and maintains the reiserfsprogs package now. He worked on libreiser4 and userspace plugins; developped librepair, userspace plugins repair code, fsck & debugfs for V4. Yury Umanets (aka Umka) developed libreiser4, userspace plugins, and all userspace tools (reiser4progs) except of fsck & debugfs. Joshua Macdonald wrote the first draft of the transaction manager. Yuri Rupasov did testing and benchmarking, plus he invented the r5 hash (also used by the dcache code). Yura Rupasov, Anatoly Pinchuk, Igor Krasheninnikov, Grigory Zaigralin, Mikhail Gilula, Igor Zagorovsky, Roman Pozlevich, Konstantin Shvachko, and Joshua MacDonald are former contributors to the project. Jeremy Fitzhardinge wrote the teahash.c code for V3. Colin Plumb also contributed to that. The Defense Advanced Research Projects Agency (DARPA, www.darpa.mil) is the primary sponsor of Reiser4. DARPA does not endorse this project; it merely sponsors it. Continuing core development of ReiserFS is mostly paid for by Hans Reiser from money made selling licenses in addition to the GPL to companies who don't want it known that they use ReiserFS as a foundation for their proprietary product. And my lawyer asked 'People pay you money for this?'. Yup. Life is good. If you buy ReiserFS, you can focus on your value add rather than reinventing an entire FS. BigStorage (www.bigstorage.com) contributes to our general fund every month, and has done so for quite a long time. SuSE (www.suse.com) pays for continuing work on journaling for version 3, paid for much of the previous version 3 work, and is paying for Chris and Jeff to do V3 maintenance. Reiserfs integration in their distro is consistently solid, and they were key to our becoming widely used. Many persons came to www.namesys.com/support.html, and got a question answered for $25, or just gave us a small donation there. Thanks to all of those sponsors, including the secret ones. Without you, we would each still have that day job. reiserfsprogs-3.6.20/ChangeLog0000644000175300001440000003742410412227267013206 000000000000002004-10-13 3.6.19 release. 2004-09-22 Some bug fixes: - stop handling directory item if it has been removed on fsck pass0 - handle correctly cases when hash functions return 0 - additional check for wrong order of hashes when generation counters differ. 2004-08-18 {get|set}_unaligned macroses fix for broken powerpc linux kernel headers. 2004-08-18 Patches from Jeff Mahoney: - warnings cleanups - sd_blocks check fix for quota - make fsck -a works quitely - fix the definition of BLKGETSIZE64 2004-08-03 3.6.18 release. 2004-06-18 Make the oid map code endian safe. 2004-05-27 Syncing host & journal devices after replaing every transaction. 2004-05-26 Do not left uninitialized fields in item headers before insertion. 2004-05-25 Fixes in unaligned access to unformatted block pointers. 2004-05-24 Make reiserfsck to handle suse's block allocator changes correctly. 2004-05-04 3.6.17 release. 2004-04-30 a few minor bugs were fixed: - mark changed leaves as dirty; - overflow at the huge hole insertion. 2004-04-05 man pages were rewritten. 2004-03-22 move 'unpack' program to 'debugreiserfs -u'. 2004-03-18 3.6.14 & 3.6.15-pre1 releases. 2004-03-16 reiserfsprogs a few bugs were fixed: in the journal replay code; in the balancing code when removing items from broken leaves; in the mount entry detection code with mtab handling. 2004-03-04 reiserfsprogs a fix for the cross compiling when generating include/credits.h 2004-02-27 reiserfsprogs a bug in the spec file was fixed. 2004-02-26 reiserfsck a bug with setting the file size limit was fixed. 2004-02-17 reiserfsprogs make bynaries to be 'position independent' when dynamically linked to libc. 2004-02-17 3.6.13 release. 2004-02-13 reiserfsprogs a few bugs were fixed in the mount entry detection code. 3.6.13-pre1 release. 2004-02-06 3.6.12 release. 2004-01-26 3.6.12-pre3 release. 2004-01-21 A few bugs were fixed: *reiserfsck - break from the pass2 loop correctly; *resizer - calculate the new fs size correctly; - parse new size parameters correctly; - checks for the new fs size are fixed; 2004-01-15 *reiserfsprogs UUID support is rewritten -- link to libuuid instead of our own UUID support. 2004-01-12 *reiserfsprogs A fix for mount entry detection. 2003-12-17 *reiserfsck A bug in rebuild-sb was fixed. 2003-11-24 *reiserfsck Reboot is needed (0x2) return code was added. 2003-10-03 *reiserfs_resizer Some checks before shrinking are added avoiding segfault in some cases. 2003-09-29 *reiserfsprogs bad block support is enabled and fixed. 2003-09-23 *reiserfsprogs fix for counting block number on block devices with block size greater then 4k. 2003-09-18 *reiserfsck ro mounted filesystems are allowed to be checked. 2003-08-22i *reiserfsck fix for the journal of the minimal size 2003-08-01 *reiserfsprogs 3.6.11 release. 2003-07-30 *reiserfsck 2 bugs were fixed: - 64bit architecture related; - object attributes related. 2003-07-16 *reiserfsprogs Credits were changed. A pair of them are printed at mkfs time. *reiserfsprogs 3.6.9 release. 2003-06-25 *reiserfsprogs Bugs were fixed: - in reiserfsck rebuild-sb of relocated journal; - in reiserfstune --no-journal-available; - in bitmap handling during resizing; - in mkreiserfs with notstandard journal on the main device with not standard offset; - in not standard journal creation. 2003-05-29 *reiserfsprogs Bugs in journal traversing and in rebuild-sb were fixed. 2003-05-20 *reiserfsck Forks another process with openned file descriptor of the partition being checked when fscking on boot and sleep for 5 secs to avoid reading of all bitmaps on mount again. 2003-05-16 *mkreiserfs A bug with not standard journal cretion was fixed. *reiserfsprogs 3.6.8 release. 2003-05-07 *reiserfsck Exit codes were fixed; --yes option was added into fsck *mkreiserfs --quiet option was added into mkfs 2003-05-06 *reiserfsprogs A bug in journal replaying code when the only transaction exists was fixed. 2003-05-01 *reiserfsprogs Make fsck to proceed when wrong journal parameters in the journal header on a fs with standard journal detected fixing them with the warning. *reiserfsprogs 3.6.7 release. 2003-04-24 *reiserfsprogs 3.6.6 release. 2003-04-01 *reiserfsprogs Bug with flushing buffers on bad file descriptor was fixed. *reiserfstune Bugs with not standard journal were fixed. 2003-03-13 *reiserfsck Leaves recovery was improved - if some items are detected, try to recover the leaf even if block head is corrupted. 2003-03-04 *reiserfsck The objectid handling was improved, significant speedup at semantic pass and lost+found pass. 2003-02-27 *reiserfsprogs The check if the last block on fs is readable was moved from bitmap check to fs_open. Check transactions content before replaying, sware on invalid content instead of replay attempts, print about results. *reiserfsprogs 3.6.5 release. 2003-02-21 *reiserfsck a critical bug on pass0 of rebuild-tree with overflowing while checking unformatted item offsets was fixed. *reiserfsprogs 3.6.5-pre2 release. 2003-02-20 *reiserfsck reiserfsck -a (started at boot) replays journal, checks error flags in sb, bitmaps, fs size, 2 levels of internal tree and switches to fixble mode if any problem is detected. For root fs fixable cannot be performed (as fs is mounted) and just --check will be done. 2003-02-14 *reiserfsck fix-fixable does not relocated shared object ids anymore. Bug in relocation - entry key was not updated correctly with the new key of relocated file. 2003-02-12 *reiserfsprogs Journal replay was improved - check blocks if they are journable before replaying; - replay only transactions which has trans_id == last replayed transaction trans_id + 1. 2003-02-10 *reiserfsprogs le bitops operations were added back to avoid arch dependence with including asm/bitops.h - we should use le operations even on be mashins. 2003-01-31 *reiserfsprogs Warning messages about the broken hardware were improved. 2003-01-30 *reiserfsprogs Check for bits in ondisk bitmaps after the last valid bit was added - all these bits should be set to 1. 2002-12-13 *reiserfsck Keep only permanent fields of the super block, but not the whole super block, in separate memory while replaying. 2002-12-11 *reiserfsck While openning the journal check that journal parameters in super block and in jheader mathches; Advice to run rebuild-sb if not. While rebuilding super block, do the same check and ask the user if he wants to rebuild the jheader or continue without the journal or he wants to change the start of the partition before using reiserfsck. 2002-12-04 *reiserfsprogs 3.6.5-pre1 is released. 2002-12-02 *reiserfsck a few bugs were fixed: - bug in balancing code led to abort when a leaf could be viewed as a super block; - bug in checking statdata size for symlinks - there cannot be a hole at the end of symlink. 2002-11-28 *reiserfsck pass0 does not need a true objectid map, just those objectids which are not used. This sppedups pass0 a lot as many memoves are eliminated. *reiserfsck bug with item format for symlinks was fixed. 2002-10-02 *reiserfsprogs 3.6.4 is released. 2002-09-24 *reiserfsck bitmap handling was improved: fix-fixable fixes not only those blocks of bitmap which are wrongly marked as unused, but those which are wrongly marked as used also. 2002-09-10 * reiserfsck fix-fixable fixes item header formats, check complains about wrong ones. * reiserfsck check/fix-fixable does not complain about/fix file sizes if safe link exists. 2002-08-30 * reiserfsck user recieves a warning if dma mode/speed is descreased - it could happen due to hardware problems. 2002-08-20 * reiserfsprogs Warning/error messages were changed to more user friendly form. 2002-08-15 * reiserfsck Correction of nlinks on fix-fixable was disabled, because fix-fixable zeroes nlinks on the first pass and wants to increment them on semantic pass. But semantic pass is skipped if there are fatal corruptions. 2002-08-11 * reiserfsck exit codes were fixed 2002-08-08 * reiserfsck a critical bug in journal replaying was fixed. * reiserfsprogs called 3.6.3. 2002-06-06 * reiserfsck speedup for pass2: avoid checking whether a file body should be rewritten every time we have another item to insert into it. 2002-05-30 * reiserfsck speedup for pass2: avoid checking whether a file should be relocated on every insertion of a new item into it. Check it only for the first time. 2002-06-27 * reiserfsprogs called 3.6.2 2002-05-20 * reiserfsck speedup for pass2: do not check whether a file should be relocated if the file body was previously deleted from the tree and is inserted again. 2002-05-15 * reiserfsck speedup for pass2: insertion by many pointers at once was added 2002-05-10 * reiserfsck fix-fixable is able to fix wrong nlinks. check makes some check about nlinks also. 2002-04-30 * reiserfsck delete direntries of old format in new format directories 2002-03-29 * reiserfsprogs bad blocks support added. 2002-03-15 * reiserfsprogs different blocksize support added. 2002-02-18 * debugreiserfs new option -J, prints a journal header. 2002-02-10 * reiserfsprogs a few speedups were added. 2002-02-05 * reiserfsprogs optimization of the work with disk buffers. 2002-01-28 * mkreiserfs zeroing the first block on the device if not SPARC 2002-01-26 * reiserfsck a few speedups were added. 2002-01-20 * debugreiserfs investigation of unused space added (-D -U options, hidden) 2002-01-16 * reiserfsprogs support for UUID and LABEL was added 2002-01-15 * reiserfstune creates a standard journal from a non-standard 2001-12-25 * reiserfsck Handles safe links. 2001-12-03 * reiserfsck Filenames output during tree scan is now nicely scrolled left and right, when entire line does not fit the screen. 2001-11-20 * reiserfsck Can rebuild superblock properly. 2001-11-03 * reiserfsck Can now backup all data which get changed during fscking and can rollback all changes. 2001-10-30 * reiserfsprogs mkreiserfs/reiserfsck/reiserfstune/debugreiserfs work with relocated journal 2001-09-30 * debugreiserfs super block editor (-C -B 16) 2001-08-23 * reiserfsck --fix-fixable becomes a mode, can fix everything what does not need to rebuild a tree. --fix-non-critical option moved to --ajust-file-size option, work in --fix-fixable and --rebuild-tree modes. 2001-07-19 * mkreiserfs can now create non-standard journal: journal size, offset, device may now vary * reiserfstune initial release. Allows to change journal parameters for existing filesystems * reisrefsck it now sets "consistency checked" flag after --rebuild-tree and --check which did not find anything broken * man pages updated 2001-06-25 * mkreiserfs long options (--journal-device, --journal-size) * library reiserfs_create, reiserfs_create_journal 2001-06-20 * global changes Jeff's patch (safe endianness) is merged (with changes) mlock is used to estimate amount of memory available 2001-06-14 * reiserfsck update journal header when transaction is replayed 2001-06-13 * reiserfsck lost+found's mode is set to drwx------ after lost+found pass 2001-06-08 * library functions to deal with journal 2001-06-05 * global change Unified access via get_/set_ macroses is added for fields of struct key, struct item_head, struct reiserfs_journal_desc/commit, struct block_head, struct disk_child 2001-05-22 * global change Access to super block's fields are unified vid get_sb_xxx and set_sb_xxx macroses 2001-05-05 * called 3.x.0k-pre4 * reiserfsck entries in lost+found are removed on pass 0 2001-05-03 * mkreiserfs first 64k get zeroed now. This kills JFS if it was there * reiserfsprogs.spec (Anthon van der Neut) prereleases can be built by rpm now link from /sbin/mkreiserfs to /sbin/mkfs.reiserfs guess about reiserfs kernel support is added 2001-04-16 * reiserfsck in --check mode it exits with 0 if there were no corruptions found, 1 if there were only corruptions fixable by --fix-fixable or 2 if --rebuild-tree is required man page updated, simple example of using reiserfsck is added 2001-04-15 * mkreiserfs bug in confirmation dialogs fixed 2001-04-13-Friday * reiserfsck --hash option makes reiserfsck to skip blocks having directory entries created with other hash. It is useful together with --scan-whole-partition --background option allows to fork fsck end exit (useful for running remotely) 2001-03-31 * reiserfsck empty lost directories do not get linked into /lost+found 2001-03-28 * reiserfsck --nolog option is added 2001-03-26 * called 3.x.0j * reiserfsck with -o it tries to fix "objectid sharing" problem * reiserfsprogs.spec (Anthon van der Neut) rpm can be built as non-root link from reiserfsck to fsck.reiserfs rpm -e reiserfsprogs should now work without rmdir of / 2001-03-13 * reiserfsck --quiet option is added --fix-bogus-files option is added to fix transprently corrupted modes and to fix sizes which are longer that real file size directory item verifying changed -u has been replaced with -b to pass reiserfsck the list of block to build tree off -c is added to have pass 0 to save bitmap fo leaves found 2001-03-10 * called 3.x.0h * configure.in RPM_OPT_FLASG is added to CFLAGS (Anthon van der Neut) * reiserfsck -u option is added. It should save time when repeating --rebuild-tree hash hits statistic is added on pass 0 2001-03-07 * reiserfsck -V option to print version and exit added --fix-fixable changed: directory's sd_size and st_blocks corrections, removing of entries pointing to nowhere * resize_reiserfs man page is added 2001-03-05 * resize_reiserfs Marcel Waldvogel 's user interface and error messages improvements 2001-03-01 * mkreiserfs -q option is added (Larry Auton ) * reiserfsck --fix-fixable changed: bitmap correction commented out. Correction of broken slots of indirect items and corrections of dir entry state added 2001-02-23 * called 3.x.0e * reiserfsck not tested on 2.2 is now able to work with regular file (2.4.x is needed for that) lost+found fixed: it now first links directories then files. Still not good as it can not pull out deep directory 2001-02-19 * called 3.x.0c * reiserfsck --fix-fixable option is added. So far it only repairs bitmaps and free block count when they mismatch * library reiserfs_find/add_entry added 2001-02-05 * mkreiserfs can make filesystem with 1 data block 3.6 format is now default 2001-01-20 * portability Zam ran the reiserfsprogs on alpha * resizer Zam managed to resize few partitions. * reiserfsck pass0 deletes items which are out of order, tries to fix items with zeroed k_objectid or k_dir_id and to throw items which are transparently out of order and tries to fix "." and ".." of directory items. Pass0 corrects also corruptions in directory items * man pages: get included into dist when doing 'make dist' * mkreisrefs explains what is mininal size of reiserfs partition which can be created 2001-01-12 * reiserfsck: --interactive option is added * debugreiserfs: few bugs fixed 2001-01-07 * reiserfs library: started with reiserfs_open, reiserfs_close, bitmap tools * reiserfsck: filesystem mounted read-only can be checked number of options decreased journal replay fixed pass 0 added. fsck can be stopped after the tree is built. (should safe time when debugging) a lot of work still left * debugreiserfs: metadata packing changed added a feature to intentionally corrupt filesystem (should be useful for fsck debugging) * resizer: not updated yet * man pages: updated for all three progs reiserfsprogs-3.6.20/INSTALL0000644000175300001440000001723010412227267012456 00000000000000Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/sbin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. reiserfsprogs-3.6.20/Makefile.am0000644000175300001440000000067010412227267013461 00000000000000SUBDIRS = include libmisc libreiserfs libutil utils EXTRA_DIST = AUTHORS COPYING NEWS README CREDITS \ reiserfsprogs.spec reiserfsprogs.spec.in depcomp # libreiserfs.m4 aclocaldir = $(datadir)/aclocal #aclocal_DATA = libreiserfs.m4 define all-sources ( find ./ -name '*.[ch]' | grep -v SCCS | grep -v "Attic" | grep -v "reiserfsprogs" ) endef TAGS: $(all-sources) | etags - tags: $(all-sources) | xargs -- ctags -w -o TAGS reiserfsprogs-3.6.20/Makefile.in0000644000175300001440000004352610412227375013501 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/reiserfsprogs.spec.in $(top_srcdir)/configure \ AUTHORS COPYING ChangeLog INSTALL NEWS compile config.guess \ config.sub depcomp install-sh missing mkinstalldirs subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = reiserfsprogs.spec SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = include libmisc libreiserfs libutil utils EXTRA_DIST = AUTHORS COPYING NEWS README CREDITS \ reiserfsprogs.spec reiserfsprogs.spec.in depcomp # libreiserfs.m4 aclocaldir = $(datadir)/aclocal all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ cd $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_srcdir) && $(AUTOHEADER) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 reiserfsprogs.spec: $(top_builddir)/config.status $(srcdir)/reiserfsprogs.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) mkdir $(distdir) $(mkdir_p) $(distdir)/. @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ check-am clean clean-generic clean-recursive ctags \ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \ dist-tarZ dist-zip distcheck distclean distclean-generic \ distclean-hdr distclean-recursive distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-recursive pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-info-am #aclocal_DATA = libreiserfs.m4 define all-sources ( find ./ -name '*.[ch]' | grep -v SCCS | grep -v "Attic" | grep -v "reiserfsprogs" ) endef TAGS: $(all-sources) | etags - tags: $(all-sources) | xargs -- ctags -w -o TAGS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/NEWS0000644000175300001440000000000010412227267012107 00000000000000reiserfsprogs-3.6.20/README0000644000175300001440000000545110412227267012307 00000000000000 Reiserfs is a file system based on balanced tree algorithms, which is described at www.namesys.com. [LICENSING] ReiserFSprogs is hereby licensed under the GNU General Public License version 2 but with the following "Anti-Plagiarism" modification: You may not remove any credits or brand marks, or cause them to not display, unless you are an end user (that is, you are not redistributing to others). Yes, there really are people with the nerve to remove credits from software they did not write, or only wrote a small part of, and they are even frequently occurring sad to say. Credits are not ads, credits describe someone's contribution to the project (e.g. labor or money) whereas an ad says something else. Source code files that contain the phrase "licensing governed by reiserfsprogs/README" are "governed files" throughout that file. Governed files are licensed under this license. The portions of them owned by Hans Reiser, or authorized to be licensed by him, have been in the past, and likely will be in the future, licensed to other parties under other licenses. If you add your code to governed files, and don't want it to be owned by Hans Reiser, put your copyright label on that code so we can keep things straight. It will be a kindness if you identify whether Hans Reiser is allowed to license code labeled as owned by you on your behalf other than under this license, because he wants to know if it is okay to do so and put a check in the mail to you (for non-trivial improvements) when he makes his next sale. He makes no guarantees as to the amount if any, though he feels motivated to motivate contributors, and you can surely discuss this with him before or after contributing. You have the right to decline to allow him to license your code contribution other than under this license or the GPL. Further licensing options are available for commercial and/or other interests directly from reiser@namesys.com

[END LICENSING] Send bug reports to reiserfs-dev@namesys.com. Hideous Commercial Pitch: Spread your development costs across other OS vendors. Select from the best in the world, not the best in your building, by buying from third party OS component suppliers. Leverage the software component development power of the internet. Be the most aggressive in taking advantage of the commercial possibilities of decentralized internet development, and add value through your branded integration that you sell as an operating system. Let your competitors be the ones to compete against the entire internet by themselves. Be hip, get with the new economic trend, before your competitors do. Send email to reiser@namesys.com. To understand the code, after reading the website, start reading the code by reading reiserfs_fs.h first. reiserfsprogs-3.6.20/aclocal.m40000644000175300001440000074120610412227340013264 00000000000000# generated automatically by aclocal 1.9.5 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # serial 47 AC_PROG_LIBTOOL # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) # ----------------------------------------------------------- # If this macro is not defined by Autoconf, define it here. m4_ifdef([AC_PROVIDE_IFELSE], [], [m4_define([AC_PROVIDE_IFELSE], [m4_ifdef([AC_PROVIDE_$1], [$2], [$3])])]) # AC_PROG_LIBTOOL # --------------- AC_DEFUN([AC_PROG_LIBTOOL], [AC_REQUIRE([_AC_PROG_LIBTOOL])dnl dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. AC_PROVIDE_IFELSE([AC_PROG_CXX], [AC_LIBTOOL_CXX], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX ])]) dnl And a similar setup for Fortran 77 support AC_PROVIDE_IFELSE([AC_PROG_F77], [AC_LIBTOOL_F77], [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 ])]) dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [ifdef([AC_PROG_GCJ], [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([A][M_PROG_GCJ], [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([LT_AC_PROG_GCJ], [define([LT_AC_PROG_GCJ], defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) ])])# AC_PROG_LIBTOOL # _AC_PROG_LIBTOOL # ---------------- AC_DEFUN([_AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl # Prevent multiple expansion define([AC_PROG_LIBTOOL], []) ])# _AC_PROG_LIBTOOL # AC_LIBTOOL_SETUP # ---------------- AC_DEFUN([AC_LIBTOOL_SETUP], [AC_PREREQ(2.50)dnl AC_REQUIRE([AC_ENABLE_SHARED])dnl AC_REQUIRE([AC_ENABLE_STATIC])dnl AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_LD])dnl AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl AC_REQUIRE([AC_PROG_NM])dnl AC_REQUIRE([AC_PROG_LN_S])dnl AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! AC_REQUIRE([AC_OBJEXT])dnl AC_REQUIRE([AC_EXEEXT])dnl dnl AC_LIBTOOL_SYS_MAX_CMD_LEN AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE AC_LIBTOOL_OBJDIR AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_PROG_ECHO_BACKSLASH case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e s/^X//' [sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] # Same as above, but do not quote variable references. [double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" AC_CHECK_TOOL(AR, ar, false) AC_CHECK_TOOL(RANLIB, ranlib, :) AC_CHECK_TOOL(STRIP, strip, :) old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ;; *) old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then AC_PATH_MAGIC fi ;; esac AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], enable_win32_dll=yes, enable_win32_dll=no) AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes AC_ARG_WITH([pic], [AC_HELP_STRING([--with-pic], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= AC_LIBTOOL_LANG_C_CONFIG _LT_AC_TAGCONFIG ])# AC_LIBTOOL_SETUP # _LT_AC_SYS_COMPILER # ------------------- AC_DEFUN([_LT_AC_SYS_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_AC_SYS_COMPILER # _LT_AC_SYS_LIBPATH_AIX # ---------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], [AC_LINK_IFELSE(AC_LANG_PROGRAM,[ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi],[]) if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ])# _LT_AC_SYS_LIBPATH_AIX # _LT_AC_SHELL_INIT(ARG) # ---------------------- AC_DEFUN([_LT_AC_SHELL_INIT], [ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], [AC_DIVERT_PUSH(NOTICE)]) $1 AC_DIVERT_POP ])# _LT_AC_SHELL_INIT # _LT_AC_PROG_ECHO_BACKSLASH # -------------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], [_LT_AC_SHELL_INIT([ # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` ;; esac echo=${ECHO-echo} if test "X[$]1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X[$]1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} fi if test "X[$]1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if (echo_test_string="`eval $cmd`") 2>/dev/null && echo_test_string="`eval $cmd`" && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL [$]0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL [$]0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "[$]0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" fi AC_SUBST(ECHO) ])])# _LT_AC_PROG_ECHO_BACKSLASH # _LT_AC_LOCK # ----------- AC_DEFUN([_LT_AC_LOCK], [AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case "`/usr/bin/file conftest.o`" in *32-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], [*-*-cygwin* | *-*-mingw* | *-*-pw32*) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; ]) esac need_locks="$enable_libtool_lock" ])# _LT_AC_LOCK # AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_REQUIRE([LT_AC_PROG_SED]) AC_CACHE_CHECK([$1], [$2], [$2=no ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then $2=yes fi fi $rm conftest* ]) if test x"[$]$2" = xyes; then ifelse([$5], , :, [$5]) else ifelse([$6], , :, [$6]) fi ])# AC_LIBTOOL_COMPILER_OPTION # AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ------------------------------------------------------------ # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD else $2=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then ifelse([$4], , :, [$4]) else ifelse([$5], , :, [$5]) fi ])# AC_LIBTOOL_LINKER_OPTION # AC_LIBTOOL_SYS_MAX_CMD_LEN # -------------------------- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [# find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for *BSD fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi ])# AC_LIBTOOL_SYS_MAX_CMD_LEN # _LT_AC_CHECK_DLFCN # -------------------- AC_DEFUN([_LT_AC_CHECK_DLFCN], [AC_CHECK_HEADERS(dlfcn.h)dnl ])# _LT_AC_CHECK_DLFCN # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ------------------------------------------------------------------ AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); }] EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_unknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_AC_TRY_DLOPEN_SELF # AC_LIBTOOL_DLOPEN_SELF # ------------------- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi ])# AC_LIBTOOL_DLOPEN_SELF # AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) # --------------------------------- # Check to see if options -c and -o are simultaneously supported by compiler AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* ]) ])# AC_LIBTOOL_PROG_CC_C_O # AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) # ----------------------------------------- # Check to see if we can do hard links to lock some files if needed AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_REQUIRE([_LT_AC_LOCK])dnl hard_links="nottested" if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi ])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS # AC_LIBTOOL_OBJDIR # ----------------- AC_DEFUN([AC_LIBTOOL_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir ])# AC_LIBTOOL_OBJDIR # AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) # ---------------------------------------------- # Check hardcoding attributes. AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_AC_TAGVAR(hardcode_action, $1)= if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existant directories. if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_AC_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_AC_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_AC_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi ])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH # AC_LIBTOOL_SYS_LIB_STRIP # ------------------------ AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], [striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi ])# AC_LIBTOOL_SYS_LIB_STRIP # AC_LIBTOOL_SYS_DYNAMIC_LINKER # ----------------------------- # PORTME Fill in your ld.so characteristics AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_MSG_CHECKING([dynamic linker characteristics]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER # _LT_AC_TAGCONFIG # ---------------- AC_DEFUN([_LT_AC_TAGCONFIG], [AC_ARG_WITH([tags], [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], [include additional configurations @<:@automatic@:>@])], [tagnames="$withval"]) if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then AC_MSG_WARN([output file `$ofile' does not exist]) fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) else AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) fi fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in "") ;; *) AC_MSG_ERROR([invalid tag name: $tagname]) ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then AC_MSG_ERROR([tag name \"$tagname\" already exists]) fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_LIBTOOL_LANG_CXX_CONFIG else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then AC_LIBTOOL_LANG_F77_CONFIG else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then AC_LIBTOOL_LANG_GCJ_CONFIG else tagname="" fi ;; RC) AC_LIBTOOL_LANG_RC_CONFIG ;; *) AC_MSG_ERROR([Unsupported tag name: $tagname]) ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" AC_MSG_ERROR([unable to update list of available tagged configurations.]) fi fi ])# _LT_AC_TAGCONFIG # AC_LIBTOOL_DLOPEN # ----------------- # enable checks for dlopen support AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_DLOPEN # AC_LIBTOOL_WIN32_DLL # -------------------- # declare package support for building win32 dll's AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_WIN32_DLL # AC_ENABLE_SHARED([DEFAULT]) # --------------------------- # implement the --enable-shared flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_SHARED], [define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([shared], [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]AC_ENABLE_SHARED_DEFAULT) ])# AC_ENABLE_SHARED # AC_DISABLE_SHARED # ----------------- #- set the default shared flag to --disable-shared AC_DEFUN([AC_DISABLE_SHARED], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_SHARED(no) ])# AC_DISABLE_SHARED # AC_ENABLE_STATIC([DEFAULT]) # --------------------------- # implement the --enable-static flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_STATIC], [define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([static], [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]AC_ENABLE_STATIC_DEFAULT) ])# AC_ENABLE_STATIC # AC_DISABLE_STATIC # ----------------- # set the default static flag to --disable-static AC_DEFUN([AC_DISABLE_STATIC], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_STATIC(no) ])# AC_DISABLE_STATIC # AC_ENABLE_FAST_INSTALL([DEFAULT]) # --------------------------------- # implement the --enable-fast-install flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_FAST_INSTALL], [define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([fast-install], [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) ])# AC_ENABLE_FAST_INSTALL # AC_DISABLE_FAST_INSTALL # ----------------------- # set the default to --disable-fast-install AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_FAST_INSTALL(no) ])# AC_DISABLE_FAST_INSTALL # AC_LIBTOOL_PICMODE([MODE]) # -------------------------- # implement the --with-pic flag # MODE is either `yes' or `no'. If omitted, it defaults to `both'. AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl pic_mode=ifelse($#,1,$1,default) ])# AC_LIBTOOL_PICMODE # AC_PROG_EGREP # ------------- # This is predefined starting with Autoconf 2.54, so this conditional # definition can be removed once we require Autoconf 2.54 or later. m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], [AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi]) EGREP=$ac_cv_prog_egrep AC_SUBST([EGREP]) ])]) # AC_PATH_TOOL_PREFIX # ------------------- # find a file program which can recognise shared library AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="ifelse([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi ])# AC_PATH_TOOL_PREFIX # AC_PATH_MAGIC # ------------- # find a file program which can recognise a shared library AC_DEFUN([AC_PATH_MAGIC], [AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# AC_PATH_MAGIC # AC_PROG_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([AC_PROG_LD], [AC_ARG_WITH([gnu-ld], [AC_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no]) AC_REQUIRE([LT_AC_PROG_SED])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case "$host_cpu" in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; sco3.2v5*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown ])# AC_DEPLIBS_CHECK_METHOD # AC_PROG_NM # ---------- # find the pathname to a BSD-compatible name lister AC_DEFUN([AC_PROG_NM], [AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/${ac_tool_prefix}nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac esac fi done IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi]) NM="$lt_cv_path_NM" ])# AC_PROG_NM # AC_CHECK_LIBM # ------------- # check for math library AC_DEFUN([AC_CHECK_LIBM], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac ])# AC_CHECK_LIBM # AC_LIBLTDL_CONVENIENCE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl convenience library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If # DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will # be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with # '${top_srcdir}/' (note the single quotes!). If your package is not # flat and you're not using automake, define top_builddir and # top_srcdir appropriately in the Makefiles. AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl case $enable_ltdl_convenience in no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; "") enable_ltdl_convenience=yes ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; esac LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_CONVENIENCE # AC_LIBLTDL_INSTALLABLE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl installable library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-install to the configure arguments. Note that LIBLTDL # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If # DIRECTORY is not provided and an installed libltdl is not found, it is # assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' # and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single # quotes!). If your package is not flat and you're not using automake, # define top_builddir and top_srcdir appropriately in the Makefiles. # In the future, this macro may have to be called after AC_PROG_LIBTOOL. AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_CHECK_LIB(ltdl, lt_dlinit, [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], [if test x"$enable_ltdl_install" = xno; then AC_MSG_WARN([libltdl not installed, but installation disabled]) else enable_ltdl_install=yes fi ]) if test x"$enable_ltdl_install" = x"yes"; then ac_configure_args="$ac_configure_args --enable-ltdl-install" LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) else ac_configure_args="$ac_configure_args --enable-ltdl-install=no" LIBLTDL="-lltdl" LTDLINCL= fi # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_INSTALLABLE # AC_LIBTOOL_CXX # -------------- # enable support for C++ libraries AC_DEFUN([AC_LIBTOOL_CXX], [AC_REQUIRE([_LT_AC_LANG_CXX]) ])# AC_LIBTOOL_CXX # _LT_AC_LANG_CXX # --------------- AC_DEFUN([_LT_AC_LANG_CXX], [AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) ])# _LT_AC_LANG_CXX # _LT_AC_PROG_CXXCPP # --------------- AC_DEFUN([_LT_AC_PROG_CXXCPP], [ AC_REQUIRE([AC_PROG_CXX]) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP fi ])# _LT_AC_PROG_CXXCPP # AC_LIBTOOL_F77 # -------------- # enable support for Fortran 77 libraries AC_DEFUN([AC_LIBTOOL_F77], [AC_REQUIRE([_LT_AC_LANG_F77]) ])# AC_LIBTOOL_F77 # _LT_AC_LANG_F77 # --------------- AC_DEFUN([_LT_AC_LANG_F77], [AC_REQUIRE([AC_PROG_F77]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) ])# _LT_AC_LANG_F77 # AC_LIBTOOL_GCJ # -------------- # enable support for GCJ libraries AC_DEFUN([AC_LIBTOOL_GCJ], [AC_REQUIRE([_LT_AC_LANG_GCJ]) ])# AC_LIBTOOL_GCJ # _LT_AC_LANG_GCJ # --------------- AC_DEFUN([_LT_AC_LANG_GCJ], [AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) ])# _LT_AC_LANG_GCJ # AC_LIBTOOL_RC # -------------- # enable support for Windows resource files AC_DEFUN([AC_LIBTOOL_RC], [AC_REQUIRE([LT_AC_PROG_RC]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) ])# AC_LIBTOOL_RC # AC_LIBTOOL_LANG_C_CONFIG # ------------------------ # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) AC_DEFUN([_LT_AC_LANG_C_CONFIG], [lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}\n' _LT_AC_SYS_COMPILER # # Check for any special shared library compilation flags. # _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= if test "$GCC" = no; then case $host_os in sco3.2v5*) _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' ;; esac fi if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : else AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no fi fi # # Check to make sure the static flag actually works. # AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), [], [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP AC_LIBTOOL_DLOPEN_SELF($1) # Report which librarie types wil actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_C_CONFIG # AC_LIBTOOL_LANG_CXX_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], [AC_LANG_PUSH(C++) AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_AC_TAGVAR(no_undefined_flag, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Dependencies to place before and after the object being linked: _LT_AC_TAGVAR(predep_objects, $1)= _LT_AC_TAGVAR(postdep_objects, $1)= _LT_AC_TAGVAR(predeps, $1)= _LT_AC_TAGVAR(postdeps, $1)= _LT_AC_TAGVAR(compiler_lib_search_path, $1)= # Source file extension for C++ test sources. ac_ext=cc # Object file extension for compiled C++ test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration AC_PROG_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_AC_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=yes else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds it's shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes ; then lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ;; dgux*) case $cc_basename in ec++) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; ghcx) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[[12]]*) # C++ shared libraries reported to be fairly broken before switch to ELF _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | kfreebsd*-gnu | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_AC_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; hpux9*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; *) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; ia64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; *) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC) case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case "$host_cpu" in ia64*|hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; irix5* | irix6*) case $cc_basename in CC) # SGI C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; linux*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC) # Portland Group C++ compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' ;; cxx) # Compaq C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; openbsd2*) # C++ shared libraries are fairly broken _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd='echo' ;; osf3*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ $rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; sco*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; lcc) # Lucid # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system # linker. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' fi ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_AC_TAGVAR(GCC, $1)="$GXX" _LT_AC_TAGVAR(LD, $1)="$LD" AC_LIBTOOL_POSTDEP_PREDEP($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP AC_LIBTOOL_DLOPEN_SELF($1) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld ])# AC_LIBTOOL_LANG_CXX_CONFIG # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) # ------------------------ # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" ifelse([$1], [], [#! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG], [# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) # Is the compiler the GNU C compiler? with_gcc=$_LT_AC_TAGVAR(GCC, $1) # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_[]_LT_AC_TAGVAR(LD, $1) # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS=$lt_AS # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) # Commands used to build and install a shared archive. archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) # Flag that forces no undefined symbols. no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" # Set to yes if exported symbols are required. always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) # The commands to list exported symbols. export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) # Symbols that must always be exported. include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) ifelse([$1],[], [# ### END LIBTOOL CONFIG], [# ### END LIBTOOL TAG CONFIG: $tagname]) __EOF__ ifelse([$1],[], [ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ]) else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ])# AC_LIBTOOL_CONFIG # AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi ])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # --------------------------------- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_PROG_NM]) AC_REQUIRE([AC_OBJEXT]) # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32*) symcode='[[ABCDGISTW]]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; linux*) if test "$host_cpu" = ia64; then symcode='[[ABCDGIRSTW]]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris* | sysv5*) symcode='[[BDRT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[[]] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -f conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi ]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) # --------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], [_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)= AC_MSG_CHECKING([for $compiler option to produce PIC]) ifelse([$1],[CXX],[ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix4* | aix5*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; dgux*) case $cc_basename in ec++) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | kfreebsd*-gnu | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux*) case $cc_basename in KCC) # KAI C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; icpc* | ecpc*) # Intel C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC) # Portland Group C++ compiler. _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; cxx) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC) # Rational C++ 2.4.1 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx) # Digital/Compaq C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; sco*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; *) ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc) # Lucid _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; unixware*) ;; vxworks*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; newsos6) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; linux*) case $cc_basename in icc* | ecc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc | pgf77 | pgf90) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; ccc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; sco3.2v5*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' ;; solaris*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sunos4*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; unicos*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" ;; esac ]) # AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) # ------------------------------------ # See if the linker supports building shared libraries. AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) ifelse([$1],[CXX],[ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix4* | aix5*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw*) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ],[ runpath_var= _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)= _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_AC_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac _LT_AC_TAGVAR(ld_shlibs, $1)=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; sunos4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $CC,$host_cpu in pgf77* | pgf90* ) # Portland Group f77 and f90 compilers tmp_addflag=' -fpic' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else _LT_AC_TAGVAR(archive_expsym_cmds, $1)=$_LT_AC_TAGVAR(archive_cmds, $1) fi else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=yes _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=yes else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds it's shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # see comment about different semantics on the GNU ld section _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; bsdi[[45]]*) _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ;; dgux*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; freebsd1*) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu | dragonfly*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; *) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; openbsd*) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi ;; os2*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; sco3.2v5*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_AC_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_AC_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4.2uw2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv5*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' ;; uts4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_AC_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_MSG_CHECKING([whether -lc should be explicitly linked in]) $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) _LT_AC_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no else _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) ;; esac fi ;; esac ])# AC_LIBTOOL_PROG_LD_SHLIBS # _LT_AC_FILE_LTDLL_C # ------------------- # Be careful that the start marker always follows a newline. AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ # /* ltdll.c starts here */ # #define WIN32_LEAN_AND_MEAN # #include # #undef WIN32_LEAN_AND_MEAN # #include # # #ifndef __CYGWIN__ # # ifdef __CYGWIN32__ # # define __CYGWIN__ __CYGWIN32__ # # endif # #endif # # #ifdef __cplusplus # extern "C" { # #endif # BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); # #ifdef __cplusplus # } # #endif # # #ifdef __CYGWIN__ # #include # DECLARE_CYGWIN_DLL( DllMain ); # #endif # HINSTANCE __hDllInstance_base; # # BOOL APIENTRY # DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) # { # __hDllInstance_base = hInst; # return TRUE; # } # /* ltdll.c ends here */ ])# _LT_AC_FILE_LTDLL_C # _LT_AC_TAGVAR(VARNAME, [TAGNAME]) # --------------------------------- AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) # old names AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) # This is just to silence aclocal about the macro not being used ifelse([AC_DISABLE_FAST_INSTALL]) AC_DEFUN([LT_AC_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj, no) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS) ]) AC_DEFUN([LT_AC_PROG_RC], [AC_CHECK_TOOL(RC, windres, no) ]) # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # # LT_AC_PROG_SED # -------------- # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. AC_DEFUN([LT_AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_MSG_RESULT([$SED]) ]) # Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.9.5])]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 7 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE]) AC_SUBST([$1_FALSE]) if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH]) ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 3 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.58])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $1 | $1:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"$am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 AC_DEFUN([AM_MAINTAINER_MODE], [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode is disabled by default AC_ARG_ENABLE(maintainer-mode, [ --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer], USE_MAINTAINER_MODE=$enableval, USE_MAINTAINER_MODE=no) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST(MAINT)dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. # # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories # created by `make install' are always world readable, even if the # installer happens to have an overly restrictive umask (e.g. 077). # This was a mistake. There are at least two reasons why we must not # use `-m 0755': # - it causes special bits like SGID to be ignored, # - it may be too restrictive (some setups expect 775 directories). # # Do not use -m 0755 and let people choose whatever they expect by # setting umask. # # We cannot accept any implementation of `mkdir' that recognizes `-p'. # Some implementations (such as Solaris 8's) are not thread-safe: if a # parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' # concurrently, both version can detect that a/ is missing, but only # one can create it and the other will error out. Consequently we # restrict ourselves to GNU make (using the --version option ensures # this.) AC_DEFUN([AM_PROG_MKDIR_P], [if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi AC_SUBST([mkdir_p])]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR reiserfsprogs-3.6.20/compile0000755000175300001440000000716710217066030013003 00000000000000#! /bin/sh # Wrapper for compilers which do not understand `-c -o'. scriptversion=2005-02-03.08 # Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand `-c -o'. Remove `-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file `INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; esac ofile= cfile= eat= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as `compile cc -o foo foo.c'. # So we strip `-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no `-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # `.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` # Create the lock directory. # Note: use `[/.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: reiserfsprogs-3.6.20/config.guess0000755000175300001440000012542210217066030013740 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2005-02-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_MACHINE}" in i?86) test -z "$VENDOR" && VENDOR=pc ;; *) test -z "$VENDOR" && VENDOR=unknown ;; esac test -f /etc/SuSE-release -o -f /.buildenv && VENDOR=suse # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; amd64:OpenBSD:*:*) echo x86_64-unknown-openbsd${UNAME_RELEASE} exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; cats:OpenBSD:*:*) echo arm-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; luna88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mips64-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit 0 ;; macppc:MirBSD:*:*) echo powerppc-unknown-mirbsd${UNAME_RELEASE} exit 0 ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit 0 ;; *:OS400:*:*) echo powerpc-ibm-os400 exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; amd64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux exit 0 ;; cris:Linux:*:*) echo cris-axis-linux exit 0 ;; crisv32:Linux:*:*) echo crisv32-axis-linux exit 0 ;; frv:Linux:*:*) echo frv-${VENDOR}-linux exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux exit 0 ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-${VENDOR}-linux" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-${VENDOR}-linux" && exit 0 ;; ppc:Linux:*:*) echo powerpc-${VENDOR}-linux exit 0 ;; ppc64:Linux:*:*) echo powerpc64-${VENDOR}-linux exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="-libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-${VENDOR}-linux${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-${VENDOR}-linux ;; PA8*) echo hppa2.0-${VENDOR}-linux ;; *) echo hppa-${VENDOR}-linux ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-${VENDOR}-linux exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux exit 0 ;; x86_64:Linux:*:*) echo x86_64-${VENDOR}-linux exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-${VENDOR}-linux" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-${VENDOR}-linuxaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-${VENDOR}-linuxcoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linuxoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-${VENDOR}-linuxoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-${VENDOR}-linux-${LIBC}" | sed 's/linux-gnu/linux/' && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in *86) UNAME_PROCESSOR=i686 ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit 0 ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit 0 ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms && exit 0 ;; I*) echo ia64-dec-vms && exit 0 ;; V*) echo vax-dec-vms && exit 0 ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: reiserfsprogs-3.6.20/config.h.in0000644000175300001440000001215010412227347013443 00000000000000/* config.h.in. Generated from configure.in by autoheader. */ /* Define for enable debug info. */ #undef ENABLE_DEBUG /* Define to 1 if you have the header file. */ #undef HAVE_ASM_UNALIGNED_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `getmntent' function. */ #undef HAVE_GETMNTENT /* Define to 1 if you have the `hasmntopt' function. */ #undef HAVE_HASMNTOPT /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `uuid' library (-luuid). */ #undef HAVE_LIBUUID /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_PRINT_H /* Define to 1 if you have the `register_printf_function' function. */ #undef HAVE_REGISTER_PRINTF_FUNCTION /* Define to 1 if you have the `statfs' function. */ #undef HAVE_STATFS /* Define to 1 if `stat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_STAT_EMPTY_STRING_BUG /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if `st_rdev' is member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_RDEV /* Define to 1 if your `struct stat' has `st_rdev'. Deprecated, use `HAVE_STRUCT_STAT_ST_RDEV' instead. */ #undef HAVE_ST_RDEV /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the `time' function. */ #undef HAVE_TIME /* Define to 1 if you have the `uname' function. */ #undef HAVE_UNAME /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_UUID_UUID_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* gets set when configure --enable-io-failure-emulation */ #undef IO_FAILURE_EMULATION /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* Define to 1 if `major', `minor', and `makedev' are declared in . */ #undef MAJOR_IN_MKDEV /* Define to 1 if `major', `minor', and `makedev' are declared in . */ #undef MAJOR_IN_SYSMACROS /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of a `blkcnt_t', as computed by sizeof. */ #undef SIZEOF_BLKCNT_T /* The size of a `off_t', as computed by sizeof. */ #undef SIZEOF_OFF_T /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ #undef WORDS_BIGENDIAN /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `unsigned' if does not define. */ #undef size_t reiserfsprogs-3.6.20/config.sub0000755000175300001440000007530610217066030013410 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2005-02-10' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | msp430-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: reiserfsprogs-3.6.20/configure0000755000175300001440000101572710412227351013340 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59. # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="include/reiserfs/libreiserfs.h" # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP LN_S RANLIB ac_ct_RANLIB EGREP LIBOBJS UUID_LIBS PROGS_LDFLAGS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-debug enable extra checks --enable-static build all static --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --disable-largefile omit support for large files --enable-io-failure-emulation Never use that. It is for debugging only Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Make sure we can run config.sub. $ac_config_sub sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 echo "$as_me: error: cannot run $ac_config_sub" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6 if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_build_alias=$build_alias test -z "$ac_cv_build_alias" && ac_cv_build_alias=`$ac_config_guess` test -z "$ac_cv_build_alias" && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6 build=$ac_cv_build build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6 if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_host_alias=$host_alias test -z "$ac_cv_host_alias" && ac_cv_host_alias=$ac_cv_build_alias ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6 host=$ac_cv_host host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` LIBREISERFS_MAJOR_VERSION=3 LIBREISERFS_MINOR_VERSION=6 LIBREISERFS_MICRO_VERSION=20 LIBREISERFS_VERSION=$LIBREISERFS_MAJOR_VERSION.$LIBREISERFS_MINOR_VERSION.$LIBREISERFS_MICRO_VERSION PACKAGE=reiserfsprogs VERSION=$LIBREISERFS_VERSION am__api_version="1.9" # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=$PACKAGE VERSION=$VERSION cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ac_config_headers="$ac_config_headers config.h" echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi; echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE # Check whether --enable-debug or --disable-debug was given. if test "${enable_debug+set}" = set; then enableval="$enable_debug" else enable_debug=no fi; PROGS_LDFLAGS="" # Check whether --enable-static or --disable-static was given. if test "${enable_static+set}" = set; then enableval="$enable_static" else enable_static=no fi; if test x$enable_static = xyes; then PROGS_LDFLAGS=-static fi PRESET_CFLAGS=$CFLAGS ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std1 is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std1. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi echo "$as_me:$LINENO: result: $_am_result" >&5 echo "${ECHO_T}$_am_result" >&6 rm -f confinc confmf # Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval="$enable_dependency_tracking" fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6 ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6 fi echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi RANLIB=$ac_ct_RANLIB else RANLIB="$ac_cv_prog_RANLIB" fi # Check whether --enable-shared or --disable-shared was given. if test "${enable_shared+set}" = set; then enableval="$enable_shared" p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi; # Check for LIBUUID LIBS="" echo "$as_me:$LINENO: checking for uuid_generate in -luuid" >&5 echo $ECHO_N "checking for uuid_generate in -luuid... $ECHO_C" >&6 if test "${ac_cv_lib_uuid_uuid_generate+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-luuid $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char uuid_generate (); int main () { uuid_generate (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_uuid_uuid_generate=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_uuid_uuid_generate=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_uuid_uuid_generate" >&5 echo "${ECHO_T}$ac_cv_lib_uuid_uuid_generate" >&6 if test $ac_cv_lib_uuid_uuid_generate = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBUUID 1 _ACEOF LIBS="-luuid $LIBS" else { echo "$as_me:$LINENO: WARNING: libuuid could not be found" >&5 echo "$as_me: WARNING: libuuid could not be found" >&2;} fi UUID_LIBS="$LIBS" echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 if test "${ac_cv_prog_egrep+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 echo "${ECHO_T}$ac_cv_prog_egrep" >&6 EGREP=$ac_cv_prog_egrep echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then echo "$as_me:$LINENO: checking for library containing opendir" >&5 echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 if test "${ac_cv_search_opendir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_opendir=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char opendir (); int main () { opendir (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_opendir="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_opendir" = no; then for ac_lib in dir; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char opendir (); int main () { opendir (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_opendir="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 echo "${ECHO_T}$ac_cv_search_opendir" >&6 if test "$ac_cv_search_opendir" != no; then test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" fi else echo "$as_me:$LINENO: checking for library containing opendir" >&5 echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 if test "${ac_cv_search_opendir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_opendir=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char opendir (); int main () { opendir (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_opendir="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_opendir" = no; then for ac_lib in x; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char opendir (); int main () { opendir (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_opendir="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 echo "${ECHO_T}$ac_cv_search_opendir" >&6 if test "$ac_cv_search_opendir" != no; then test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" fi fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in print.h errno.h fcntl.h limits.h malloc.h sys/ioctl.h unistd.h uuid/uuid.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in asm/unaligned.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done echo "$as_me:$LINENO: checking whether sys/types.h defines makedev" >&5 echo $ECHO_N "checking whether sys/types.h defines makedev... $ECHO_C" >&6 if test "${ac_cv_header_sys_types_h_makedev+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { return makedev(0, 0); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_sys_types_h_makedev=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_sys_types_h_makedev=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_header_sys_types_h_makedev" >&5 echo "${ECHO_T}$ac_cv_header_sys_types_h_makedev" >&6 if test $ac_cv_header_sys_types_h_makedev = no; then if test "${ac_cv_header_sys_mkdev_h+set}" = set; then echo "$as_me:$LINENO: checking for sys/mkdev.h" >&5 echo $ECHO_N "checking for sys/mkdev.h... $ECHO_C" >&6 if test "${ac_cv_header_sys_mkdev_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: $ac_cv_header_sys_mkdev_h" >&5 echo "${ECHO_T}$ac_cv_header_sys_mkdev_h" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking sys/mkdev.h usability" >&5 echo $ECHO_N "checking sys/mkdev.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking sys/mkdev.h presence" >&5 echo $ECHO_N "checking sys/mkdev.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: sys/mkdev.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: sys/mkdev.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: sys/mkdev.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: sys/mkdev.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: see the Autoconf documentation" >&5 echo "$as_me: WARNING: sys/mkdev.h: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: sys/mkdev.h: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: sys/mkdev.h: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: sys/mkdev.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for sys/mkdev.h" >&5 echo $ECHO_N "checking for sys/mkdev.h... $ECHO_C" >&6 if test "${ac_cv_header_sys_mkdev_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_sys_mkdev_h=$ac_header_preproc fi echo "$as_me:$LINENO: result: $ac_cv_header_sys_mkdev_h" >&5 echo "${ECHO_T}$ac_cv_header_sys_mkdev_h" >&6 fi if test $ac_cv_header_sys_mkdev_h = yes; then cat >>confdefs.h <<\_ACEOF #define MAJOR_IN_MKDEV 1 _ACEOF fi if test $ac_cv_header_sys_mkdev_h = no; then if test "${ac_cv_header_sys_sysmacros_h+set}" = set; then echo "$as_me:$LINENO: checking for sys/sysmacros.h" >&5 echo $ECHO_N "checking for sys/sysmacros.h... $ECHO_C" >&6 if test "${ac_cv_header_sys_sysmacros_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: $ac_cv_header_sys_sysmacros_h" >&5 echo "${ECHO_T}$ac_cv_header_sys_sysmacros_h" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking sys/sysmacros.h usability" >&5 echo $ECHO_N "checking sys/sysmacros.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking sys/sysmacros.h presence" >&5 echo $ECHO_N "checking sys/sysmacros.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: sys/sysmacros.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: sys/sysmacros.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: sys/sysmacros.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: sys/sysmacros.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: see the Autoconf documentation" >&5 echo "$as_me: WARNING: sys/sysmacros.h: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: sys/sysmacros.h: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: sys/sysmacros.h: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: sys/sysmacros.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for sys/sysmacros.h" >&5 echo $ECHO_N "checking for sys/sysmacros.h... $ECHO_C" >&6 if test "${ac_cv_header_sys_sysmacros_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_sys_sysmacros_h=$ac_header_preproc fi echo "$as_me:$LINENO: result: $ac_cv_header_sys_sysmacros_h" >&5 echo "${ECHO_T}$ac_cv_header_sys_sysmacros_h" >&6 fi if test $ac_cv_header_sys_sysmacros_h = yes; then cat >>confdefs.h <<\_ACEOF #define MAJOR_IN_SYSMACROS 1 _ACEOF fi fi fi echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset x; /* SunOS 4.1.1 cc rejects this. */ char const *const *ccp; char **p; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; ccp = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++ccp; p = (char**) ccp; ccp = (char const *const *) p; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6 if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const _ACEOF fi echo "$as_me:$LINENO: checking for inline" >&5 echo $ECHO_N "checking for inline... $ECHO_C" >&6 if test "${ac_cv_c_inline+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_inline=$ac_kw; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done fi echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 echo "${ECHO_T}$ac_cv_c_inline" >&6 case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac echo "$as_me:$LINENO: checking for size_t" >&5 echo $ECHO_N "checking for size_t... $ECHO_C" >&6 if test "${ac_cv_type_size_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((size_t *) 0) return 0; if (sizeof (size_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_size_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_size_t=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 echo "${ECHO_T}$ac_cv_type_size_t" >&6 if test $ac_cv_type_size_t = yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned _ACEOF fi echo "$as_me:$LINENO: checking for struct stat.st_rdev" >&5 echo $ECHO_N "checking for struct stat.st_rdev... $ECHO_C" >&6 if test "${ac_cv_member_struct_stat_st_rdev+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static struct stat ac_aggr; if (ac_aggr.st_rdev) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_member_struct_stat_st_rdev=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static struct stat ac_aggr; if (sizeof ac_aggr.st_rdev) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_member_struct_stat_st_rdev=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_member_struct_stat_st_rdev=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_rdev" >&5 echo "${ECHO_T}$ac_cv_member_struct_stat_st_rdev" >&6 if test $ac_cv_member_struct_stat_st_rdev = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_RDEV 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define HAVE_ST_RDEV 1 _ACEOF fi echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6 if test "${ac_cv_c_bigendian+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # See if sys/param.h defines the BYTE_ORDER macro. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN bogus endian macros #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then # It does; now see whether it defined to BIG_ENDIAN or not. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_bigendian=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_bigendian=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # It does not; compile a test program. if test "$cross_compiling" = yes; then # try to guess the endianness by grepping values into an object file ac_cv_c_bigendian=unknown cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } int main () { _ascii (); _ebcdic (); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long l; char c[sizeof (long)]; } u; u.l = 1; exit (u.c[sizeof (long) - 1] == 1); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_bigendian=no else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_c_bigendian=yes fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 echo "${ECHO_T}$ac_cv_c_bigendian" >&6 case $ac_cv_c_bigendian in yes) cat >>confdefs.h <<\_ACEOF #define WORDS_BIGENDIAN 1 _ACEOF ;; no) ;; *) { { echo "$as_me:$LINENO: error: unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" >&5 echo "$as_me: error: unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} { (exit 1); exit 1; }; } ;; esac echo "$as_me:$LINENO: checking whether -fPIC works" >&5 echo $ECHO_N "checking whether -fPIC works... $ECHO_C" >&6 if test "${pic+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="-fPIC -DPIC" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then pic=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 pic=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" fi echo "$as_me:$LINENO: result: $pic" >&5 echo "${ECHO_T}$pic" >&6 # Checking for compiler warning options echo "$as_me:$LINENO: checking whether -Wuninitialized works" >&5 echo $ECHO_N "checking whether -Wuninitialized works... $ECHO_C" >&6 if test "${uninitialized+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="-O1 -Wuninitialized" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then uninitialized=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 uninitialized=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" fi echo "$as_me:$LINENO: result: $uninitialized" >&5 echo "${ECHO_T}$uninitialized" >&6 echo "$as_me:$LINENO: checking whether -Wno-unused-parameter works" >&5 echo $ECHO_N "checking whether -Wno-unused-parameter works... $ECHO_C" >&6 if test "${no_unused_parameter+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="-Wno-unused-parameter" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then no_unused_parameter=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 no_unused_parameter=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" fi echo "$as_me:$LINENO: result: $no_unused_parameter" >&5 echo "${ECHO_T}$no_unused_parameter" >&6 echo "$as_me:$LINENO: checking whether -Wredundant-decls works" >&5 echo $ECHO_N "checking whether -Wredundant-decls works... $ECHO_C" >&6 if test "${redundant_decls+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="-Wredundant-decls" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then redundant_decls=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 redundant_decls=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" fi echo "$as_me:$LINENO: result: $redundant_decls" >&5 echo "${ECHO_T}$redundant_decls" >&6 # Check for large file # Check whether --enable-largefile or --disable-largefile was given. if test "${enable_largefile+set}" = set; then enableval="$enable_largefile" fi; if test "$enable_largefile" != no; then echo "$as_me:$LINENO: checking for special C compiler options needed for large files" >&5 echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6 if test "${ac_cv_sys_largefile_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext CC="$CC -n32" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sys_largefile_CC=' -n32'; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_CC" >&5 echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6 if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi echo "$as_me:$LINENO: checking for _FILE_OFFSET_BITS value needed for large files" >&5 echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6 if test "${ac_cv_sys_file_offset_bits+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else while :; do ac_cv_sys_file_offset_bits=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sys_file_offset_bits=64; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext break done fi echo "$as_me:$LINENO: result: $ac_cv_sys_file_offset_bits" >&5 echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6 if test "$ac_cv_sys_file_offset_bits" != no; then cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF fi rm -f conftest* echo "$as_me:$LINENO: checking for _LARGE_FILES value needed for large files" >&5 echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6 if test "${ac_cv_sys_large_files+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else while :; do ac_cv_sys_large_files=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sys_large_files=1; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext break done fi echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5 echo "${ECHO_T}$ac_cv_sys_large_files" >&6 if test "$ac_cv_sys_large_files" != no; then cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF fi rm -f conftest* fi if test x${ac_cv_sys_file_offset_bits} = xno; then { echo "$as_me:$LINENO: WARNING: Can't detect right _FILE_OFFSET_BITS. Will be forced to 64bit." >&5 echo "$as_me: WARNING: Can't detect right _FILE_OFFSET_BITS. Will be forced to 64bit." >&2;} ac_cv_sys_file_offset_bits=64 fi echo "$as_me:$LINENO: checking for off_t" >&5 echo $ECHO_N "checking for off_t... $ECHO_C" >&6 if test "${ac_cv_type_off_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { if ((off_t *) 0) return 0; if (sizeof (off_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_off_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_off_t=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 echo "${ECHO_T}$ac_cv_type_off_t" >&6 echo "$as_me:$LINENO: checking size of off_t" >&5 echo $ECHO_N "checking size of off_t... $ECHO_C" >&6 if test "${ac_cv_sizeof_off_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_off_t" = yes; then # The cast to unsigned long works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { static int test_array [1 - 2 * !(((long) (sizeof (off_t))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { static int test_array [1 - 2 * !(((long) (sizeof (off_t))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { static int test_array [1 - 2 * !(((long) (sizeof (off_t))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { static int test_array [1 - 2 * !(((long) (sizeof (off_t))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { static int test_array [1 - 2 * !(((long) (sizeof (off_t))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_off_t=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (off_t), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (off_t), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include long longval () { return (long) (sizeof (off_t)); } unsigned long ulongval () { return (long) (sizeof (off_t)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (off_t))) < 0) { long i = longval (); if (i != ((long) (sizeof (off_t)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (off_t)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_off_t=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (off_t), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (off_t), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val else ac_cv_sizeof_off_t=0 fi fi echo "$as_me:$LINENO: result: $ac_cv_sizeof_off_t" >&5 echo "${ECHO_T}$ac_cv_sizeof_off_t" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_OFF_T $ac_cv_sizeof_off_t _ACEOF echo "$as_me:$LINENO: checking for blkcnt_t" >&5 echo $ECHO_N "checking for blkcnt_t... $ECHO_C" >&6 if test "${ac_cv_type_blkcnt_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { if ((blkcnt_t *) 0) return 0; if (sizeof (blkcnt_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_blkcnt_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_blkcnt_t=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_blkcnt_t" >&5 echo "${ECHO_T}$ac_cv_type_blkcnt_t" >&6 echo "$as_me:$LINENO: checking size of blkcnt_t" >&5 echo $ECHO_N "checking size of blkcnt_t... $ECHO_C" >&6 if test "${ac_cv_sizeof_blkcnt_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_blkcnt_t" = yes; then # The cast to unsigned long works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { static int test_array [1 - 2 * !(((long) (sizeof (blkcnt_t))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { static int test_array [1 - 2 * !(((long) (sizeof (blkcnt_t))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { static int test_array [1 - 2 * !(((long) (sizeof (blkcnt_t))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { static int test_array [1 - 2 * !(((long) (sizeof (blkcnt_t))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { static int test_array [1 - 2 * !(((long) (sizeof (blkcnt_t))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_blkcnt_t=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (blkcnt_t), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (blkcnt_t), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include long longval () { return (long) (sizeof (blkcnt_t)); } unsigned long ulongval () { return (long) (sizeof (blkcnt_t)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (blkcnt_t))) < 0) { long i = longval (); if (i != ((long) (sizeof (blkcnt_t)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (blkcnt_t)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_blkcnt_t=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (blkcnt_t), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (blkcnt_t), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val else ac_cv_sizeof_blkcnt_t=0 fi fi echo "$as_me:$LINENO: result: $ac_cv_sizeof_blkcnt_t" >&5 echo "${ECHO_T}$ac_cv_sizeof_blkcnt_t" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_BLKCNT_T $ac_cv_sizeof_blkcnt_t _ACEOF if test $ac_cv_c_compiler_gnu = yes; then echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5 echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6 if test "${ac_cv_prog_gcc_traditional+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_pattern="Autoconf.*'x'" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5 echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6 if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi echo "$as_me:$LINENO: checking whether lstat dereferences a symlink specified with a trailing slash" >&5 echo $ECHO_N "checking whether lstat dereferences a symlink specified with a trailing slash... $ECHO_C" >&6 if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then ac_cv_func_lstat_dereferences_slashed_symlink=no else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ exit (lstat ("conftest.sym/", &sbuf) ? 0 : 1); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_lstat_dereferences_slashed_symlink=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi echo "$as_me:$LINENO: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 echo "${ECHO_T}$ac_cv_func_lstat_dereferences_slashed_symlink" >&6 test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test $ac_cv_func_lstat_dereferences_slashed_symlink = no; then case $LIBOBJS in "lstat.$ac_objext" | \ *" lstat.$ac_objext" | \ "lstat.$ac_objext "* | \ *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi echo "$as_me:$LINENO: checking whether stat accepts an empty string" >&5 echo $ECHO_N "checking whether stat accepts an empty string... $ECHO_C" >&6 if test "${ac_cv_func_stat_empty_string_bug+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_stat_empty_string_bug=yes else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; exit (stat ("", &sbuf) ? 1 : 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_stat_empty_string_bug=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_stat_empty_string_bug=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_cv_func_stat_empty_string_bug" >&5 echo "${ECHO_T}$ac_cv_func_stat_empty_string_bug" >&6 if test $ac_cv_func_stat_empty_string_bug = yes; then case $LIBOBJS in "stat.$ac_objext" | \ *" stat.$ac_objext" | \ "stat.$ac_objext "* | \ *" stat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_STAT_EMPTY_STRING_BUG 1 _ACEOF fi echo "$as_me:$LINENO: checking for working memcmp" >&5 echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6 if test "${ac_cv_func_memcmp_working+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_memcmp_working=no else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { /* Some versions of memcmp are not 8-bit clean. */ char c0 = 0x40, c1 = 0x80, c2 = 0x81; if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) exit (1); /* The Next x86 OpenStep bug shows up only when comparing 16 bytes or more and with at least one buffer not starting on a 4-byte boundary. William Lewis provided this test program. */ { char foo[21]; char bar[21]; int i; for (i = 0; i < 4; i++) { char *a = foo + i; char *b = bar + i; strcpy (a, "--------01111111"); strcpy (b, "--------10000000"); if (memcmp (a, b, 16) >= 0) exit (1); } exit (0); } ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_memcmp_working=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_memcmp_working=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_cv_func_memcmp_working" >&5 echo "${ECHO_T}$ac_cv_func_memcmp_working" >&6 test $ac_cv_func_memcmp_working = no && case $LIBOBJS in "memcmp.$ac_objext" | \ *" memcmp.$ac_objext" | \ "memcmp.$ac_objext "* | \ *" memcmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;; esac for ac_func in strftime do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else # strftime is in -lintl on SCO UNIX. echo "$as_me:$LINENO: checking for strftime in -lintl" >&5 echo $ECHO_N "checking for strftime in -lintl... $ECHO_C" >&6 if test "${ac_cv_lib_intl_strftime+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char strftime (); int main () { strftime (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_intl_strftime=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_strftime=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_intl_strftime" >&5 echo "${ECHO_T}$ac_cv_lib_intl_strftime" >&6 if test $ac_cv_lib_intl_strftime = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_STRFTIME 1 _ACEOF LIBS="-lintl $LIBS" fi fi done for ac_func in vprintf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF echo "$as_me:$LINENO: checking for _doprnt" >&5 echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6 if test "${ac_cv_func__doprnt+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define _doprnt to an innocuous variant, in case declares _doprnt. For example, HP-UX 11i declares gettimeofday. */ #define _doprnt innocuous__doprnt /* System header to define __stub macros and hopefully few prototypes, which can conflict with char _doprnt (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef _doprnt /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char _doprnt (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub__doprnt) || defined (__stub____doprnt) choke me #else char (*f) () = _doprnt; #endif #ifdef __cplusplus } #endif int main () { return f != _doprnt; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func__doprnt=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func__doprnt=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 echo "${ECHO_T}$ac_cv_func__doprnt" >&6 if test $ac_cv_func__doprnt = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_DOPRNT 1 _ACEOF fi fi done for ac_func in strerror strstr strtol register_printf_function statfs getmntent\ hasmntopt memset time uname do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Check whether --enable-io-failure-emulation or --disable-io-failure-emulation was given. if test "${enable_io_failure_emulation+set}" = set; then enableval="$enable_io_failure_emulation" if test "$enableval" = "yes" ; then echo -e "\nCarefull! IO failure emulation is ON\n" cat >>confdefs.h <<\_ACEOF #define IO_FAILURE_EMULATION 1 _ACEOF fi fi; credits="$srcdir/CREDITS" echo "$as_me:$LINENO: checking for $credits" >&5 echo $ECHO_N "checking for $credits... $ECHO_C" >&6 if test -r $credits ; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else { { echo "$as_me:$LINENO: error: Missing file $credits" >&5 echo "$as_me: error: Missing file $credits" >&2;} { (exit 1); exit 1; }; } fi $AWK ' BEGIN {in_header = 1; start = 2; count = 0} { if (in_header) { print $0 if ($0 == "") { in_header = 0; printf "char *credits[] = {\n" } } else { if (($0 == "") || (length($0) < 1)) { start = 1; count++; } else { if (!start) printf "\t\\\n" else if (start == 1) printf ",\n\n" printf "\t\"" $0 "\\n\"" start = 0; } } } END { print "\n};\n#define CREDITS_COUNT " count } ' $credits > "$srcdir/include/util/credits.h" if test x$enable_debug = xyes; then if test "x" = "x$PRESET_CFLAGS"; then CFLAGS="-g -Wall" fi if test x$no_unused_parameter = xyes; then CFLAGS="$CFLAGS -Wno-unused-parameter" else CFLAGS="$CFLAGS -Wno-unused" fi if test x$redundant_decls = xyes; then CFLAGS="$CFLAGS -Wredundant-decls" fi if test x$uninitialized = xyes; then CFLAGS="$CFLAGS -Wuninitialized -O1" else CFLAGS="$CFLAGS -O0" fi else if test "x" = "x$PRESET_CFLAGS"; then CFLAGS="-Wall -O2" fi fi if test x$pic = xyes; then CFLAGS="$CFLAGS -fPIC -DPIC" fi ac_config_files="$ac_config_files Makefile include/Makefile include/misc/Makefile include/reiserfs/Makefile include/util/Makefile libmisc/Makefile libreiserfs/Makefile libutil/Makefile utils/Makefile utils/mkfs/Makefile utils/resizer/Makefile utils/fsck/Makefile utils/debugfs/Makefile utils/tune/Makefile reiserfsprogs.spec" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # INIT-COMMANDS section. # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "include/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "include/misc/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/misc/Makefile" ;; "include/reiserfs/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/reiserfs/Makefile" ;; "include/util/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/util/Makefile" ;; "libmisc/Makefile" ) CONFIG_FILES="$CONFIG_FILES libmisc/Makefile" ;; "libreiserfs/Makefile" ) CONFIG_FILES="$CONFIG_FILES libreiserfs/Makefile" ;; "libutil/Makefile" ) CONFIG_FILES="$CONFIG_FILES libutil/Makefile" ;; "utils/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;; "utils/mkfs/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/mkfs/Makefile" ;; "utils/resizer/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/resizer/Makefile" ;; "utils/fsck/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/fsck/Makefile" ;; "utils/debugfs/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/debugfs/Makefile" ;; "utils/tune/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/tune/Makefile" ;; "reiserfsprogs.spec" ) CONFIG_FILES="$CONFIG_FILES reiserfsprogs.spec" ;; "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@build@,$build,;t t s,@build_cpu@,$build_cpu,;t t s,@build_vendor@,$build_vendor,;t t s,@build_os@,$build_os,;t t s,@host@,$host,;t t s,@host_cpu@,$host_cpu,;t t s,@host_vendor@,$host_vendor,;t t s,@host_os@,$host_os,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CYGPATH_W@,$CYGPATH_W,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@install_sh@,$install_sh,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t s,@mkdir_p@,$mkdir_p,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@am__leading_dot@,$am__leading_dot,;t t s,@AMTAR@,$AMTAR,;t t s,@am__tar@,$am__tar,;t t s,@am__untar@,$am__untar,;t t s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t s,@MAINT@,$MAINT,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@DEPDIR@,$DEPDIR,;t t s,@am__include@,$am__include,;t t s,@am__quote@,$am__quote,;t t s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t s,@CCDEPMODE@,$CCDEPMODE,;t t s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t s,@CPP@,$CPP,;t t s,@LN_S@,$LN_S,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@EGREP@,$EGREP,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@UUID_LIBS@,$UUID_LIBS,;t t s,@PROGS_LDFLAGS@,$PROGS_LDFLAGS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_HEADER section. # # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='[ ].*$,\1#\2' ac_dC=' ' ac_dD=',;t' # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='$,\1#\2define\3' ac_uC=' ' ac_uD=',;t' for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } # Do quote $f, to prevent DOS paths from being IFS'd. echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } # Remove the trailing spaces. sed 's/[ ]*$//' $ac_file_inputs >$tmp/in _ACEOF # Transform confdefs.h into two sed scripts, `conftest.defines' and # `conftest.undefs', that substitutes the proper values into # config.h.in to produce config.h. The first handles `#define' # templates, and the second `#undef' templates. # And first: Protect against being on the right side of a sed subst in # config.status. Protect against being in an unquoted here document # in config.status. rm -f conftest.defines conftest.undefs # Using a here document instead of a string reduces the quoting nightmare. # Putting comments in sed scripts is not portable. # # `end' is used to avoid that the second main sed command (meant for # 0-ary CPP macros) applies to n-ary macro definitions. # See the Autoconf documentation for `clear'. cat >confdef2sed.sed <<\_ACEOF s/[\\&,]/\\&/g s,[\\$`],\\&,g t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp t end s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp : end _ACEOF # If some macros were called several times there might be several times # the same #defines, which is useless. Nevertheless, we may not want to # sort them, since we want the *last* AC-DEFINE to be honored. uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs rm -f confdef2sed.sed # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >>conftest.undefs <<\_ACEOF s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, _ACEOF # Break up conftest.defines because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS echo ' :' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.defines >/dev/null do # Write a limited-size here document to $tmp/defines.sed. echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#define' lines. echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/defines.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines echo ' fi # grep' >>$CONFIG_STATUS echo >>$CONFIG_STATUS # Break up conftest.undefs because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #undef templates' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.undefs >/dev/null do # Write a limited-size here document to $tmp/undefs.sed. echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#undef' echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/undefs.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail rm -f conftest.undefs mv conftest.tail conftest.undefs done rm -f conftest.undefs cat >>$CONFIG_STATUS <<\_ACEOF # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then echo "/* Generated by configure. */" >$tmp/config.h else echo "/* $ac_file. Generated by configure. */" >$tmp/config.h fi cat $tmp/in >>$tmp/config.h rm -f $tmp/in if test x"$ac_file" != x-; then if diff $ac_file $tmp/config.h >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } rm -f $ac_file mv $tmp/config.h $ac_file fi else cat $tmp/config.h rm -f $tmp/config.h fi # Compute $ac_file's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $ac_file | $ac_file:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X$ac_file : 'X\(//\)[^/]' \| \ X$ac_file : 'X\(//\)$' \| \ X$ac_file : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X$ac_file | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'`/stamp-h$_am_stamp_count done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_COMMANDS section. # for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ac_dest=`echo "$ac_file" | sed 's,:.*,,'` ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_dir=`(dirname "$ac_dest") 2>/dev/null || $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_dest" : 'X\(//\)[^/]' \| \ X"$ac_dest" : 'X\(//\)$' \| \ X"$ac_dest" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_dest" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`(dirname "$mf") 2>/dev/null || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`(dirname "$file") 2>/dev/null || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p $dirpart/$fdir else as_dir=$dirpart/$fdir as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; esac done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi echo echo Type \'make\' to compile reiserfsprogs and \'make install\' to install it. reiserfsprogs-3.6.20/configure.in0000644000175300001440000001405710412227267013742 00000000000000dnl Process this file with autoconf to produce a configure script. AC_INIT(include/reiserfs/libreiserfs.h) AC_CANONICAL_HOST AC_PREREQ(2.50) AH_TEMPLATE([PACKAGE], [Define this to be the name of the package.]) AH_TEMPLATE([VERSION], [Define to the version of the package.]) AH_TEMPLATE([HAVE_LIBUUID], [Define for enable libuuid using.]) AH_TEMPLATE([ENABLE_DEBUG], [Define for enable debug info.]) dnl AH_TEMPLATE([LIBREISERFS_MAX_INTERFACE_VERSION], [Define to the max interface version.]) dnl AH_TEMPLATE([LIBREISERFS_MIN_INTERFACE_VERSION], [Define to the min interface version.]) LIBREISERFS_MAJOR_VERSION=3 LIBREISERFS_MINOR_VERSION=6 LIBREISERFS_MICRO_VERSION=20 LIBREISERFS_VERSION=$LIBREISERFS_MAJOR_VERSION.$LIBREISERFS_MINOR_VERSION.$LIBREISERFS_MICRO_VERSION dnl LIBREISERFS_INTERFACE_AGE=0 dnl LIBREISERFS_BINARY_AGE=0 dnl LT_RELEASE=$LIBREISERFS_MAJOR_VERSION.$LIBREISERFS_MINOR_VERSION dnl LT_CURRENT=`expr $LIBREISERFS_MICRO_VERSION - $LIBREISERFS_INTERFACE_AGE` dnl LT_REVISION=$LIBREISERFS_INTERFACE_AGE dnl LT_AGE=`expr $LIBREISERFS_BINARY_AGE - $LIBREISERFS_INTERFACE_AGE` PACKAGE=reiserfsprogs VERSION=$LIBREISERFS_VERSION AM_INIT_AUTOMAKE($PACKAGE, $VERSION) AM_CONFIG_HEADER(config.h) AM_MAINTAINER_MODE dnl AC_DEFINE_UNQUOTED(LIBREISERFS_MAX_INTERFACE_VERSION, $LIBREISERFS_BINARY_AGE) dnl AC_DEFINE_UNQUOTED(LIBREISERFS_MIN_INTERFACE_VERSION, $LIBREISERFS_INTERFACE_AGE) AC_ARG_ENABLE(debug, [ --enable-debug enable extra checks], , enable_debug=no ) PROGS_LDFLAGS="" AC_ARG_ENABLE(static, [ --enable-static build all static], , enable_static=no ) if test x$enable_static = xyes; then PROGS_LDFLAGS=-static fi dnl We install in /sbin, the utils are to be available on boot dnl AC_PREFIX(/) PRESET_CFLAGS=$CFLAGS dnl Checks for programs. AC_PROG_CC AC_PROG_CPP AC_PROG_AWK AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_RANLIB AM_ENABLE_SHARED dnl AM_PROG_LIBTOOL dnl Checks for libraries. # Check for LIBUUID LIBS="" AC_CHECK_LIB(uuid, uuid_generate, , AC_MSG_WARN(libuuid could not be found)) UUID_LIBS="$LIBS" dnl Checks for header files. AC_HEADER_STDC AC_HEADER_DIRENT AC_CHECK_HEADERS(print.h errno.h fcntl.h limits.h malloc.h sys/ioctl.h unistd.h uuid/uuid.h) AC_CHECK_HEADERS([asm/unaligned.h]) AC_HEADER_MAJOR dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE AC_TYPE_SIZE_T AC_STRUCT_ST_RDEV AC_C_BIGENDIAN dnl Check for the compiler pic option. AC_CACHE_CHECK([whether -fPIC works], [pic], [ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="-fPIC -DPIC" AC_TRY_COMPILE(, , [pic=yes], [pic=no]) CPPFLAGS="$saved_CPPFLAGS" ]) # Checking for compiler warning options AC_CACHE_CHECK([whether -Wuninitialized works], [uninitialized], [ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="-O1 -Wuninitialized" AC_TRY_COMPILE(, , [uninitialized=yes], [uninitialized=no]) CPPFLAGS="$saved_CPPFLAGS" ]) AC_CACHE_CHECK([whether -Wno-unused-parameter works], [no_unused_parameter], [ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="-Wno-unused-parameter" AC_TRY_COMPILE(, , [no_unused_parameter=yes], [no_unused_parameter=no]) CPPFLAGS="$saved_CPPFLAGS" ]) AC_CACHE_CHECK([whether -Wredundant-decls works], [redundant_decls], [ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="-Wredundant-decls" AC_TRY_COMPILE(, , [redundant_decls=yes], [redundant_decls=no]) CPPFLAGS="$saved_CPPFLAGS" ]) # Check for large file AC_SYS_LARGEFILE if test x${ac_cv_sys_file_offset_bits} = xno; then AC_MSG_WARN(Can't detect right _FILE_OFFSET_BITS. Will be forced to 64bit.) ac_cv_sys_file_offset_bits=64 fi AC_CHECK_SIZEOF(off_t, 64, [ #include #include #include ]) AC_CHECK_SIZEOF(blkcnt_t, 64, [ #include #include #include ]) dnl Checks for library functions. AC_PROG_GCC_TRADITIONAL AC_FUNC_STAT AC_FUNC_MEMCMP AC_FUNC_STRFTIME AC_FUNC_VPRINTF AC_CHECK_FUNCS(strerror strstr strtol register_printf_function statfs getmntent\ hasmntopt memset time uname) dnl Never enable this. It is for debugging only AC_ARG_ENABLE(io-failure-emulation, [ --enable-io-failure-emulation Never use that. It is for debugging only], [ if test "$enableval" = "yes" ; then echo -e "\nCarefull! IO failure emulation is ON\n" AC_DEFINE(IO_FAILURE_EMULATION, 1, [gets set when configure --enable-io-failure-emulation]) fi ]) credits="$srcdir/CREDITS" AC_MSG_CHECKING(for $credits) if test -r $credits ; then AC_MSG_RESULT(yes) else AC_MSG_ERROR(Missing file $credits) fi $AWK [' BEGIN {in_header = 1; start = 2; count = 0} { if (in_header) { print $0 if ($0 == "") { in_header = 0; printf "char *credits[] = {\n" } } else { if (($0 == "") || (length($0) < 1)) { start = 1; count++; } else { if (!start) printf "\t\\\n" else if (start == 1) printf ",\n\n" printf "\t\"" $0 "\\n\"" start = 0; } } } END { print "\n};\n#define CREDITS_COUNT " count } '] $credits > "$srcdir/include/util/credits.h" if test x$enable_debug = xyes; then if test "x" = "x$PRESET_CFLAGS"; then CFLAGS="-g -Wall" fi if test x$no_unused_parameter = xyes; then CFLAGS="$CFLAGS -Wno-unused-parameter" else CFLAGS="$CFLAGS -Wno-unused" fi if test x$redundant_decls = xyes; then CFLAGS="$CFLAGS -Wredundant-decls" fi if test x$uninitialized = xyes; then CFLAGS="$CFLAGS -Wuninitialized -O1" else CFLAGS="$CFLAGS -O0" fi else if test "x" = "x$PRESET_CFLAGS"; then CFLAGS="-Wall -O2" fi fi if test x$pic = xyes; then CFLAGS="$CFLAGS -fPIC -DPIC" fi dnl AC_SUBST(LT_RELEASE) dnl AC_SUBST(LT_CURRENT) dnl AC_SUBST(LT_REVISION) dnl AC_SUBST(LT_AGE) AC_SUBST(UUID_LIBS) AC_SUBST(PROGS_LDFLAGS) AC_OUTPUT( Makefile include/Makefile include/misc/Makefile include/reiserfs/Makefile include/util/Makefile libmisc/Makefile libreiserfs/Makefile libutil/Makefile utils/Makefile utils/mkfs/Makefile utils/resizer/Makefile utils/fsck/Makefile utils/debugfs/Makefile utils/tune/Makefile reiserfsprogs.spec) echo echo Type \'make\' to compile reiserfsprogs and \'make install\' to install it. reiserfsprogs-3.6.20/depcomp0000755000175300001440000003677410217066030013010 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2005-02-09.22 # Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mecanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: reiserfsprogs-3.6.20/include/0000777000175300001440000000000010412227615013126 500000000000000reiserfsprogs-3.6.20/include/Makefile.am0000644000175300001440000000003510412227267015077 00000000000000SUBDIRS = misc reiserfs util reiserfsprogs-3.6.20/include/Makefile.in0000644000175300001440000003235010412227361015110 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = include DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = misc reiserfs util all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu include/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ clean clean-generic clean-recursive ctags ctags-recursive \ distclean distclean-generic distclean-recursive distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/include/misc/0000777000175300001440000000000010412227614014060 500000000000000reiserfsprogs-3.6.20/include/misc/Makefile.am0000644000175300001440000000011610412227267016032 00000000000000noinst_HEADERS = types.h bitops.h malloc.h swab.h device.h misc.h unaligned.h reiserfsprogs-3.6.20/include/misc/Makefile.in0000644000175300001440000002315710412227362016051 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = include/misc DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ noinst_HEADERS = types.h bitops.h malloc.h swab.h device.h misc.h unaligned.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/misc/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu include/misc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ ctags distclean distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/include/misc/bitops.h0000644000175300001440000000413310412227267015452 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef MISC_BITOPS_H #define MISC_BITOPS_H #include "misc/types.h" #include "misc/misc.h" extern __u16 mask16 (int from, int count); extern __u32 mask32 (int from, int count); extern __u64 mask64 (int from, int count); #define misc_set_bitfield_XX(XX,vp,val,from,count) \ ({ \ __u##XX * p, tmp; \ \ /* make sure that given value can be put in 'count' bits */ \ if (val > (1 << count)) \ misc_die ("misc_set_bitfield: val %d is too big for %d bits", val, count); \ \ p = (__u##XX *)vp; \ tmp = le##XX##_to_cpu (*p); \ \ /* clear 'count' bits starting from 'from'-th one */ \ tmp &= ~mask##XX (from, count); \ \ /* put given value in proper bits */ \ tmp |= (val << from); \ \ *p = cpu_to_le##XX (tmp); \ }) #define misc_get_bitfield_XX(XX,vp,from,count) \ ({ \ __u##XX * p, tmp; \ \ p = (__u##XX *)vp; \ tmp = le##XX##_to_cpu (*p); \ \ /* clear all bits but 'count' bits starting from 'from'-th one */ \ tmp &= mask##XX (from, count); \ \ /* get value written in specified bits */ \ tmp >>= from; \ tmp; \ }) extern inline int misc_set_bit (unsigned long long nr, void * addr); extern inline int misc_clear_bit (unsigned long long nr, void * addr); extern inline int misc_test_bit(unsigned long long nr, const void * addr); extern inline unsigned long long misc_find_first_zero_bit (const void *vaddr, unsigned long long size); extern inline unsigned long long misc_find_next_zero_bit (const void *vaddr, unsigned long long size, unsigned long long offset); extern inline unsigned long long misc_find_next_set_bit(const void *vaddr, unsigned long long size, unsigned long long offset); extern inline unsigned long long misc_find_first_set_bit (const void *vaddr, unsigned long long size); #endif reiserfsprogs-3.6.20/include/misc/device.h0000644000175300001440000000101110412227267015401 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef MISC_DEVICE_H #define MISC_DEVICE_H #include extern int misc_device_valid_offset(int fd, long long int offset); extern unsigned long misc_device_count_blocks (char * filename, int blocksize); extern char misc_device_typec (unsigned short mode); #define STAT_FIELD_H(Field, Type) \ Type misc_device_##Field(char *device); STAT_FIELD_H(mode, mode_t); STAT_FIELD_H(rdev, dev_t); #endif reiserfsprogs-3.6.20/include/misc/malloc.h0000644000175300001440000000063510412227267015424 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef MISC_MALLOC_H #define MISC_MALLOC_H extern void *misc_getmem (int size); extern void *misc_malloc(int size); extern void misc_freemem (void * p); extern void misc_checkmem (char * p, int size); extern void *misc_expandmem (void * p, int size, int by); extern unsigned int misc_memsize (char * p); #endif reiserfsprogs-3.6.20/include/misc/misc.h0000644000175300001440000000220110412227267015077 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ /* nothing abount reiserfs here */ #ifndef MISC_H #define MISC_H #include "misc/types.h" /* n must be power of 2 */ #define MISC_UP(x,n) (((x)+(n)-1u) / (n) * (n)) #define MISC_DOWN(x,n) ((x) / (n) * (n)) /* to be ok for alpha etc we have to align structures to 8 byte boundary. */ #define MISC_ROUND_UP(x) MISC_UP(x,8LL) extern void misc_die (char * fmt, ...) __attribute__ ((format (printf, 1, 2))); typedef int (*dir_walk_func_t) (char *path, void *data); extern int misc_dir_walk(char *path, dir_walk_func_t func, void *data); extern __u32 misc_random (void); typedef int (*misc_comp_func_t) (const void *, const void *); extern int misc_device_rdev_match(char *path, void *data); extern int misc_bin_search (const void * key, void * base, __u32 num, int width, int *ppos, misc_comp_func_t comp_func); extern void blocklist__insert_in_position (void * block_h, void ** base, __u32 * count, int elem_size, int * position); extern int blockdev_list_compare (const void * block1, const void * block2); #endif reiserfsprogs-3.6.20/include/misc/swab.h0000644000175300001440000000513210412227267015106 00000000000000/* * Copyright 2002-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef MISC_SWAB_H #define MISC_SWAB_H #define __swab16(x) \ ({ \ __u16 __x = (x); \ ((__u16)( \ (((__u16)(__x) & (__u16)0x00ffU) << 8) | \ (((__u16)(__x) & (__u16)0xff00U) >> 8) )); \ }) #define __swab32(x) \ ({ \ __u32 __x = (x); \ ((__u32)( \ (((__u32)(__x) & (__u32)0x000000ffUL) << 24) | \ (((__u32)(__x) & (__u32)0x0000ff00UL) << 8) | \ (((__u32)(__x) & (__u32)0x00ff0000UL) >> 8) | \ (((__u32)(__x) & (__u32)0xff000000UL) >> 24) )); \ }) #define __swab64(x) \ ({ \ __u64 __x = (x); \ ((__u64)( \ (__u64)(((__u64)(__x) & (__u64)0x00000000000000ffULL) << 56) | \ (__u64)(((__u64)(__x) & (__u64)0x000000000000ff00ULL) << 40) | \ (__u64)(((__u64)(__x) & (__u64)0x0000000000ff0000ULL) << 24) | \ (__u64)(((__u64)(__x) & (__u64)0x00000000ff000000ULL) << 8) | \ (__u64)(((__u64)(__x) & (__u64)0x000000ff00000000ULL) >> 8) | \ (__u64)(((__u64)(__x) & (__u64)0x0000ff0000000000ULL) >> 24) | \ (__u64)(((__u64)(__x) & (__u64)0x00ff000000000000ULL) >> 40) | \ (__u64)(((__u64)(__x) & (__u64)0xff00000000000000ULL) >> 56) )); \ }) #ifndef WORDS_BIGENDIAN # define cpu_to_le16(val) (val) # define le16_to_cpu(val) (val) # define cpu_to_le32(val) (val) # define le32_to_cpu(val) (val) # define cpu_to_le64(val) (val) # define le64_to_cpu(val) (val) #elif defined(WORDS_BIGENDIAN) # define cpu_to_le16(val) __swab16(val) # define le16_to_cpu(val) __swab16(val) # define cpu_to_le32(val) __swab32(val) # define le32_to_cpu(val) __swab32(val) # define cpu_to_le64(val) __swab64(val) # define le64_to_cpu(val) __swab64(val) #else # error "nuxi/pdp-endian archs are not supported" #endif #define get_leXX(xx,p,field) (le##xx##_to_cpu ((p)->field)) #define set_leXX(xx,p,field,val) do { (p)->field = cpu_to_le##xx(val); } while (0) #define get_le16(p,field) get_leXX (16, p, field) #define set_le16(p,field,val) set_leXX (16, p, field, val) #define get_le32(p,field) get_leXX (32, p, field) #define set_le32(p,field,val) set_leXX (32, p, field, val) #define get_le64(p,field) get_leXX (64, p, field) #define set_le64(p,field,val) set_leXX (64, p, field, val) #endif /* MISC_SWAB_H */ reiserfsprogs-3.6.20/include/misc/types.h0000644000175300001440000000072410412227267015320 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef MISC_TYPES_H #define MISC_TYPES_H #include typedef unsigned char __u8; typedef unsigned short int __u16; typedef unsigned int __u32; typedef unsigned long long int __u64; #define INVAL_PTR (void *)-1 #define MAX_INT 2147483647 #define LONG_LONG_MAX 9223372036854775807LL #define LONG_LONG_MIN (-LONG_LONG_MAX - 1LL) #endif reiserfsprogs-3.6.20/include/misc/unaligned.h0000644000175300001440000000232110412227267016115 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef MISC_UNALIGNED_H #define MISC_UNALIGNED_H #ifdef HAVE_ASM_UNALIGNED_H # include #endif #ifndef get_unaligned #define get_unaligned(ptr) \ ({ \ __typeof__(*(ptr)) __tmp; \ memcpy(&__tmp, (ptr), sizeof(*(ptr))); \ __tmp; \ }) #endif #ifndef put_unaligned #define put_unaligned(val, ptr) \ ({ \ __typeof__(*(ptr)) __tmp = (val); \ memcpy((ptr), &__tmp, sizeof(*(ptr))); \ (void)0; \ }) #endif /* these operate on extent items, where you've got an array of ints ** at a possibly unaligned location. These are a noop on ia32 ** ** p is the array of __u32, i is the index into the array, v is the value ** to store there. */ #define d32_get(p, i) le32_to_cpu(get_unaligned((__u32 *)(p) + (i))) #define d32_put(p, i, v) put_unaligned(cpu_to_le32(v), (__u32 *)(p) + (i)) #endif reiserfsprogs-3.6.20/include/reiserfs/0000777000175300001440000000000010412227615014750 500000000000000reiserfsprogs-3.6.20/include/reiserfs/Makefile.am0000644000175300001440000000043710412227267016727 00000000000000noinst_HEADERS = badblock.h bitmap.h buffer.h direntry.h extent.h \ filesystem.h fix_node.h hash.h internal.h \ internal_balance.h journal.h key.h leaf.h \ leaf_balance.h node.h objmap.h policy.h print.h \ stat.h super.h tree.h tree_balance.h libreiserfs.h \ types.h reiserfsprogs-3.6.20/include/reiserfs/Makefile.in0000644000175300001440000002351510412227363016737 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = include/reiserfs DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ noinst_HEADERS = badblock.h bitmap.h buffer.h direntry.h extent.h \ filesystem.h fix_node.h hash.h internal.h \ internal_balance.h journal.h key.h leaf.h \ leaf_balance.h node.h objmap.h policy.h print.h \ stat.h super.h tree.h tree_balance.h libreiserfs.h \ types.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/reiserfs/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu include/reiserfs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ ctags distclean distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/include/reiserfs/badblock.h0000644000175300001440000000131510412227267016601 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_BADBLOCK_H #define REISERFS_BADBLOCK_H #include "reiserfs/types.h" #define REISERFS_BAD_DID 1 #define REISERFS_BAD_OID (__u32)-1 typedef void (*badblock_func_t) (reiserfs_filsys_t *fs, reiserfs_path_t *badblock_path, void *data); extern void reiserfs_badblock_extract(reiserfs_filsys_t *fs, reiserfs_path_t *badblock_path, void *data); extern void reiserfs_badblock_flush (reiserfs_filsys_t * fs, int no_badblock_in_tree_yet); extern void reiserfs_badblock_traverse(reiserfs_filsys_t * fs, badblock_func_t action, void *data); #endif reiserfsprogs-3.6.20/include/reiserfs/bitmap.h0000644000175300001440000000504710412227267016322 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_BITMAP_H #define REISERFS_BITMAP_H #include "reiserfs/types.h" #include #define reiserfs_bmap_nr(count, blk_size) \ ((count - 1) / (blk_size * 8) + 1) #define reiserfs_bmap_over(nr) (nr > ((1ll << 16) - 1)) extern reiserfs_bitmap_t *reiserfs_bitmap_create (unsigned int bit_count); extern int reiserfs_bitmap_open(reiserfs_filsys_t *); extern void reiserfs_bitmap_delete (reiserfs_bitmap_t * bm); extern void reiserfs_bitmap_free (reiserfs_filsys_t *); extern void reiserfs_bitmap_close (reiserfs_filsys_t *); extern int reiserfs_bitmap_flush (reiserfs_bitmap_t * bm, reiserfs_filsys_t * fs); extern int reiserfs_bitmap_expand (reiserfs_bitmap_t * bm, unsigned int bit_count); extern void reiserfs_bitmap_shrink (reiserfs_bitmap_t * bm, unsigned int bit_count); extern void reiserfs_bitmap_copy (reiserfs_bitmap_t * to, reiserfs_bitmap_t * from); extern int reiserfs_bitmap_compare (reiserfs_bitmap_t * bm1, reiserfs_bitmap_t * bm2); extern void reiserfs_bitmap_disjunction (reiserfs_bitmap_t * disk, reiserfs_bitmap_t * cont); extern void reiserfs_bitmap_delta (reiserfs_bitmap_t * base, reiserfs_bitmap_t * exclude); extern void reiserfs_bitmap_set_bit (reiserfs_bitmap_t * bm, unsigned int bit_number); extern void reiserfs_bitmap_clear_bit (reiserfs_bitmap_t * bm, unsigned int bit_number); extern int reiserfs_bitmap_test_bit (reiserfs_bitmap_t * bm, unsigned int bit_number); extern int reiserfs_bitmap_find_zero_bit (reiserfs_bitmap_t * bm, unsigned long * start); extern void reiserfs_bitmap_zero (reiserfs_bitmap_t * bm); extern void reiserfs_bitmap_fill (reiserfs_bitmap_t * bm); extern void reiserfs_bitmap_invert (reiserfs_bitmap_t * bm); extern unsigned int reiserfs_bitmap_ones (reiserfs_bitmap_t * bm); extern unsigned int reiserfs_bitmap_zeros (reiserfs_bitmap_t * bm); extern int reiserfs_bitmap_spread (reiserfs_filsys_t *); extern int reiserfs_bitmap_block (reiserfs_filsys_t *, unsigned long block); /* Backup copies. */ extern void reiserfs_bitmap_save (FILE * fp, reiserfs_bitmap_t *bm); extern reiserfs_bitmap_t * reiserfs_bitmap_load (FILE * fp); extern void reiserfs_bitmap_print (FILE * fp, reiserfs_filsys_t * fs, int silent); extern void reiserfs_print_bmap_block (FILE * fp, int i, unsigned long block, char * map, int blocks, int silent, int blocksize); #endif reiserfsprogs-3.6.20/include/reiserfs/buffer.h0000644000175300001440000000301610412227267016311 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_BUFFER_H #define REISERFS_BUFFER_H #include "reiserfs/types.h" #define BH_Uptodate 0 #define BH_Dirty 1 #define BH_Lock 2 #define BH_Do_not_flush 3 #define reiserfs_buffer_uptodate(bh) misc_test_bit(BH_Uptodate, &(bh)->b_state) #define reiserfs_buffer_mkuptodate(bh,i) misc_set_bit(BH_Uptodate, &(bh)->b_state) #define reiserfs_buffer_isdirty(bh) misc_test_bit(BH_Dirty, &(bh)->b_state) #define reiserfs_buffer_isclean(bh) !misc_test_bit(BH_Dirty, &(bh)->b_state) #define reiserfs_buffer_mkdirty(bh) misc_set_bit(BH_Dirty, &(bh)->b_state) #define reiserfs_buffer_mkclean(bh) misc_clear_bit(BH_Dirty, &(bh)->b_state) #define reiserfs_buffer_noflush(bh) misc_test_bit(BH_Do_not_flush, &(bh)->b_state) #define reiserfs_buffer_mknoflush(bh) misc_set_bit(BH_Do_not_flush, &(bh)->b_state) #define reiserfs_buffer_clnoflush(bh) misc_clear_bit(BH_Do_not_flush, &(bh)->b_state) extern reiserfs_bh_t * reiserfs_buffer_open (int, unsigned long, unsigned long); extern reiserfs_bh_t * reiserfs_buffer_find (int, unsigned long, unsigned long); extern reiserfs_bh_t * reiserfs_buffer_read (int, unsigned long, unsigned long); extern int reiserfs_buffer_write (reiserfs_bh_t *); extern void reiserfs_buffer_close (reiserfs_bh_t *); extern void reiserfs_buffer_forget (reiserfs_bh_t *); extern void reiserfs_buffer_flush_all(int); extern void reiserfs_buffer_free_all (void); extern void reiserfs_buffer_invalidate_all (int); #endif reiserfsprogs-3.6.20/include/reiserfs/direntry.h0000644000175300001440000001260310412227267016702 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_DIRENTRY_H #define REISERFS_DIRENTRY_H #include "reiserfs/types.h" /***************************************************************************/ /* DIRECTORY STRUCTURE */ /***************************************************************************/ /* Picture represents the structure of directory items ________________________________________________ | Array of | | | | | | | directory |N-1| N-2 | .... | 1st |0th| | entry headers | | | | | | |_______________|___|_____|________|_______|___| <---- directory entries ------> First directory item has k_offset component 1. We store "." and ".." in one item, always, we never split "." and ".." into differing items. This makes, among other things, the code for removing directories simpler. */ /* Each directory entry has its header. This header has deh_dir_id and deh_objectid fields, those are key of object, entry points to */ /* NOT IMPLEMENTED: Directory will someday contain stat data of object */ struct reiserfs_de_head { __u32 deh2_offset; /* third component of the directory entry key */ __u32 deh2_dir_id; /* objectid of the parent directory of the object, that is referenced by directory entry */ __u32 deh2_objectid;/* objectid of the object, that is referenced by directory entry */ __u16 deh2_location;/* offset of name in the whole item */ __u16 deh2_state; /* whether 1) entry contains stat data (for future), and 2) whether entry is hidden (unlinked) */ } __attribute__ ((__packed__)); typedef struct reiserfs_de_head reiserfs_deh_t; #define REISERFS_DEH_SIZE sizeof(reiserfs_deh_t) /* set/get fields of dir entry head these defines */ #define reiserfs_deh_get_off(deh) get_le32 (deh, deh2_offset) #define reiserfs_deh_set_off(deh,val) set_le32 (deh, deh2_offset, val) #define reiserfs_deh_get_did(deh) get_le32 (deh, deh2_dir_id) #define reiserfs_deh_set_did(deh,val) set_le32 (deh, deh2_dir_id, val) #define reiserfs_deh_get_obid(deh) get_le32 (deh, deh2_objectid) #define reiserfs_deh_set_obid(deh,val) set_le32 (deh, deh2_objectid, val) #define reiserfs_deh_get_loc(deh) get_le16 (deh, deh2_location) #define reiserfs_deh_set_loc(deh,val) set_le16 (deh, deh2_location, val) #define reiserfs_deh_get_state(deh) get_le16 (deh, deh2_state) #define reiserfs_deh_set_state(deh,val) set_le16 (deh, deh2_state, val) #define reiserfs_deh_name(deh, pos) \ ((char *)(deh - pos) + reiserfs_deh_get_loc(deh)) /* empty directory contains two entries "." and ".." and their headers */ #define REISERFS_DIR_MIN \ (REISERFS_DEH_SIZE * 2 + \ MISC_ROUND_UP (strlen (".")) + \ MISC_ROUND_UP (strlen (".."))) /* old format directories have this size when empty */ #define REISERFS_DIR_MIN_V1 (REISERFS_DEH_SIZE * 2 + 3) #define DEH_Statdata 0 /* not used now */ #define DEH_Visible2 2 #define DEH_Bad_offset 4 /* fsck marks entries to be deleted with this flag */ #define DEH_Bad_location 5 #define reiserfs_deh_state_bit(deh,bit) \ (reiserfs_deh_get_state (deh) & (1 << bit)) #define reiserfs_deh_state_set_bit(deh,bit) \ { \ __u16 state; \ state = reiserfs_deh_get_state (deh); \ state |= (1 << bit); \ reiserfs_deh_set_state(deh, state); \ } #define reiserfs_deh_state_clear_bit(deh,bit) \ { \ __u16 state; \ state = reiserfs_deh_get_state (deh); \ state &= ~(1 << bit); \ reiserfs_deh_set_state(deh, state); \ } /* Bad means "hashed unproperly or/and invalid location" */ #define reiserfs_deh_locbad(deh) \ reiserfs_deh_state_bit (deh, DEH_Bad_location) #define reiserfs_deh_set_locbad(deh) \ reiserfs_deh_state_set_bit (deh, DEH_Bad_location) #define reiserfs_deh_set_locok(deh) \ reiserfs_deh_state_clear_bit (deh, DEH_Bad_location) #define reiserfs_deh_offbad(deh) \ reiserfs_deh_state_bit (deh, DEH_Bad_offset) #define reiserfs_deh_set_offbad(deh) \ reiserfs_deh_state_set_bit (deh, DEH_Bad_offset) #define reiserfs_deh_bad(deh) \ (reiserfs_deh_locbad(deh) || reiserfs_deh_offbad(deh)) /* for directories st_blocks is number of 512 byte units which fit into dir size round up to blocksize */ #define REISERFS_DIR_BLOCKS(size) ((size + 511) / 512) /* array of the entry headers */ #define reiserfs_deh(bh,ih) ((reiserfs_deh_t *)(reiserfs_item_by_ih(bh,ih))) #define REISERFS_NAME_MAX 256 /* #define REISERFS_NAME_MAX(block_size) \ (block_size - REISERFS_NODEH_SIZE - \ REISERFS_IH_SIZE - REISERFS_DEH_SIZE) */ /* -REISERFS_SD_SIZE when entry will contain stat data */ extern int reiserfs_direntry_loc_check (reiserfs_deh_t * deh, reiserfs_ih_t * ih, int first); extern int reiserfs_direntry_entry_len (reiserfs_ih_t * ih, reiserfs_deh_t * deh, int pos_in_item); extern int reiserfs_direntry_name_len (reiserfs_ih_t * ih, reiserfs_deh_t * deh, int pos_in_item); extern int reiserfs_direntry_entry_estimate (char * name, int key_format); extern int reiserfs_direntry_check (reiserfs_filsys_t * fs, reiserfs_ih_t * ih, char * item, int bad_dir); extern void reiserfs_direntry_print (FILE * fp, reiserfs_filsys_t * fs, reiserfs_bh_t * bh, reiserfs_ih_t * ih); #endif reiserfsprogs-3.6.20/include/reiserfs/extent.h0000644000175300001440000000120710412227267016347 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_EXTENT_H #define REISERFS_EXTENT_H #include "reiserfs/types.h" /* Size of pointer to the unformatted node. */ #define REISERFS_EXT_SIZE (sizeof(__u32)) /* number of blocks pointed to by the extent item */ #define reiserfs_ext_count(p_s_ih) \ (reiserfs_ih_get_len(p_s_ih) / REISERFS_EXT_SIZE) extern int reiserfs_ext_check (reiserfs_filsys_t * fs, reiserfs_ih_t * ih, char * item, unfm_func_t func); extern void reiserfs_ext_print(FILE * fp, reiserfs_bh_t * bh, int item_num); #endif reiserfsprogs-3.6.20/include/reiserfs/filesystem.h0000644000175300001440000000427510412227267017234 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_FS_H #define REISERFS_FS_H #include /* ReiserFS leaves the first 64k unused, so that partition labels have enough space. If someone wants to write a fancy bootloader that needs more than 64k, let us know, and this will be increased in size. This number must be larger than than the largest block size on any platform, or code will break. -Hans */ #define REISERFS_DISK_OFFSET_IN_BYTES (64 * 1024) /*#define MD_RAID_SUPERBLOCKS_IN_BYTES (128 * 1024)*/ /* the spot for the super in versions 3.5 - 3.5.11 (inclusive) */ #define REISERFS_OLD_DISK_OFFSET_IN_BYTES (8 * 1024) #define reiserfs_ondisk_offset(block_of_super_block, block_size) \ (block_of_super_block * block_size) #define reiserfs_new_location(block_of_super_block, block_size) \ ((reiserfs_ondisk_offset(block_of_super_block, block_size) == \ REISERFS_DISK_OFFSET_IN_BYTES) ? 1 : 0) /*only 4k blocks for old location*/ #define reiserfs_old_location(block_of_super_block, block_size) \ ((reiserfs_ondisk_offset(block_of_super_block, 4096) == \ REISERFS_OLD_DISK_OFFSET_IN_BYTES) ? 1 : 0) enum reiserfs_blktype { BT_INVAL = 0x1, BT_SUPER = 0x2, BT_JOURNAL = 0x3, BT_BITMAP = 0x4, BT_UNKNOWN }; typedef enum reiserfs_blktype reiserfs_blktype_t; extern reiserfs_filsys_t * reiserfs_fs_open (char * filename, int flags, int * error, void * vp, int skip_check); extern reiserfs_filsys_t * reiserfs_fs_create (char * filename, int version, unsigned long block_count, int block_size, int default_journal, int new_format); extern void reiserfs_fs_flush (reiserfs_filsys_t *); extern void reiserfs_fs_free (reiserfs_filsys_t *); extern void reiserfs_fs_close (reiserfs_filsys_t *); extern void reiserfs_fs_reopen (reiserfs_filsys_t *, int flags); extern int reiserfs_fs_rw (reiserfs_filsys_t * fs); extern int reiserfs_fs_blksize_check (unsigned int blocksize); extern reiserfs_blktype_t reiserfs_fs_block(reiserfs_filsys_t *fs, unsigned long block); #endif reiserfsprogs-3.6.20/include/reiserfs/fix_node.h0000644000175300001440000000546110412227267016641 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_FIX_NODE_H #define REISERFS_FIX_NODE_H #include #include /* maximum number of FEB blocknrs on a single level */ #define FN_AMOUNT_MAX 2 /* To make any changes in the tree we always first find node, that contains item to be changed/deleted or place to insert a new item. We call this node S. To do balancing we need to decide what we will shift to left/right neighbor, or to a new node, where new item will be etc. To make this analysis simpler we build virtual node. Virtual node is an array of items, that will replace items of node S. (For instance if we are going to delete an item, virtual node does not contain it). Virtual node keeps information about item sizes and types, mergeability of first and last items, sizes of all entries in directory item. We use this array of items when calculating what we can shift to neighbors and how many nodes we have to have if we do not any shiftings, if we shift to left/right neighbor or to both. */ struct reiserfs_virtual_item { /* item type, mergeability */ unsigned short vi_type; /* length of item that it will have after balancing */ unsigned short vi_item_len; /* offset of item that it have before balancing */ __u64 vi_item_offset; /* number of entries in directory item (including the new one if any, or excluding entry if it must be cut) */ short vi_entry_count; /* array of entry lengths for directory item */ unsigned short * vi_entry_sizes; }; struct reiserfs_virtual_node { /* this is a pointer to the free space in the buffer */ char * vn_free_ptr; /* number of items in virtual node */ unsigned short vn_nr_item; /* size of node , that node would have if it has unlimited size and no balancing is performed */ short vn_size; /* mode of balancing (paste, insert, delete, cut) */ short vn_mode; short vn_affected_item_num; short vn_pos_in_item; /* item header of inserted item, 0 for other modes */ reiserfs_ih_t * vn_ins_ih; /* array of items (including a new one, excluding item to be deleted) */ struct reiserfs_virtual_item * vn_vi; }; extern int reiserfs_fix_nodes (int n_op_mode, reiserfs_tb_t * p_s_tb, reiserfs_ih_t * p_s_ins_ih); extern void reiserfs_unfix_nodes (reiserfs_tb_t *); /* FIXME: move these 2 into tree.h when get rid of search_by_key */ extern reiserfs_bh_t * reiserfs_tree_right_neighbor (reiserfs_filsys_t * s, reiserfs_path_t * path); extern reiserfs_bh_t * reiserfs_tree_left_neighbor (reiserfs_filsys_t * s, reiserfs_path_t * path); extern void reiserfs_fix_node_print(struct reiserfs_virtual_node * vn); #endif reiserfsprogs-3.6.20/include/reiserfs/hash.h0000644000175300001440000000232410412227267015764 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_HASH_H #define REISERFS_HASH_H #include "misc/types.h" #define UNSET_HASH 0 // read_super will guess about, what hash names // in directories were sorted with enum { REISERFS_HASH_TEA = 0x1, REISERFS_HASH_YURA = 0x2, REISERFS_HASH_R5 = 0x3, REISERFS_HASH_LAST }; #define DEFAULT_HASH REISERFS_HASH_R5 /* hashes.c */ extern __u32 reiserfs_hash_keyed (const char *msg, int len); extern __u32 reiserfs_hash_yura (const char *msg, int len); extern __u32 reiserfs_hash_r5 (const char *msg, int len); extern int reiserfs_hash_count (void); extern int reiserfs_hash_correct (hashf_t *func, char * name, int namelen, __u32 offset); extern int reiserfs_hash_find (char * name, int namelen, __u32 deh_offset, unsigned int code_to_try_first); extern char *reiserfs_hash_name (unsigned int code); extern int reiserfs_hash_code (hashf_t func); extern hashf_t reiserfs_hash_func (unsigned int code); extern hashf_t reiserfs_hash_get (char * hash); extern __u32 reiserfs_hash_value (hashf_t func, char * name, int namelen); #endif reiserfsprogs-3.6.20/include/reiserfs/internal.h0000644000175300001440000000504210412227267016655 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_INTERNAL_H #define REISERFS_INTERNAL_H /* * Picture represents an internal node of the reiserfs tree * ______________________________________________________ * | | Array of | Array of | Free | * |block | keys | pointers | space | * | head | N | N+1 | | * |______|_______________|___________________|___________| */ /* Disk child pointer: The pointer from an internal node of the tree to a node that is on disk. */ struct reiserfs_dc { __u32 dc2_block_number; /* Disk child's block number. */ __u16 dc2_size; /* Disk child's used space. */ __u16 dc2_reserved; } __attribute__ ((__packed__)); typedef struct reiserfs_dc reiserfs_dc_t; #define REISERFS_DC_SIZE (sizeof(reiserfs_dc_t)) /* set/get fields of disk_child with these defines */ #define reiserfs_dc_get_nr(dc) get_le32 (dc, dc2_block_number) #define reiserfs_dc_set_nr(dc,val) set_le32 (dc, dc2_block_number, val) #define reiserfs_dc_get_size(dc) get_le16 (dc, dc2_size) #define reiserfs_dc_set_size(dc,val) set_le16 (dc, dc2_size, val) #define reiserfs_dc_init(dc, size, blocknr) \ ({ \ reiserfs_dc_set_nr(dc, blocknr); \ reiserfs_dc_set_size(dc, size); \ set_le16(dc, dc2_reserved, 0); \ }) /* max and min number of keys in internal node */ #define REISERFS_INT_MAX(bh) \ ((REISERFS_NODE_SPACE(bh->b_size) - REISERFS_DC_SIZE) / \ (REISERFS_KEY_SIZE+REISERFS_DC_SIZE)) #define REISERFS_INT_MIN(bh) (REISERFS_INT_MAX(bh) / 2) /* get key */ #define reiserfs_int_key_at(bh,item_num) \ ((reiserfs_key_t * )((bh)->b_data + REISERFS_NODEH_SIZE) + \ (item_num) ) /* Get disk child by buffer header and position in the tree node. */ #define reiserfs_int_at(p_s_bh,n_pos) \ ((reiserfs_dc_t *) ((p_s_bh)->b_data + REISERFS_NODEH_SIZE + \ reiserfs_node_items(p_s_bh) * REISERFS_KEY_SIZE +\ REISERFS_DC_SIZE * (n_pos))) #define reiserfs_int_head(bh) \ ((reiserfs_nh_get_level (((reiserfs_node_head_t *)((bh)->b_data))) > \ LEAF_LEVEL) && \ (reiserfs_nh_get_level (((reiserfs_node_head_t *)((bh)->b_data))) <= \ REISERFS_TREE_HEIGHT_MAX)) extern int reiserfs_internal_correct (reiserfs_bh_t *bh); extern int reiserfs_internal_print (FILE * fp, reiserfs_bh_t * bh, int first, int last); extern int reiserfs_internal_get_pos (reiserfs_bh_t * bh, unsigned long block); #endif reiserfsprogs-3.6.20/include/reiserfs/internal_balance.h0000644000175300001440000000044510412227267020324 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_IB_H #define REISERFS_IB_H extern int reiserfs_ib_balance (reiserfs_tb_t * tb, int h, int child_pos, reiserfs_ih_t * insert_key, reiserfs_bh_t ** insert_ptr); #endif reiserfsprogs-3.6.20/include/reiserfs/journal.h0000644000175300001440000001612310412227267016515 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_JOURNAL_H #define REISERFS_JOURNAL_H #define reiserfs_jp_get_start(jp) get_le32(jp, jp_start) #define reiserfs_jp_set_start(jp,val) set_le32(jp, jp_start, val) #define reiserfs_jp_get_dev(jp) get_le32 (jp, jp_dev) #define reiserfs_jp_set_dev(jp,val) set_le32 (jp, jp_dev, val) #define reiserfs_jp_get_size(jp) get_le32 (jp, jp_size) #define reiserfs_jp_set_size(jp,val) set_le32 (jp, jp_size, val) #define reiserfs_jp_get_tlen(jp) get_le32 (jp, jp_tlen) #define reiserfs_jp_set_tlen(jp,val) set_le32 (jp, jp_tlen, val) #define reiserfs_jp_get_magic(jp) get_le32 (jp, jp_magic) #define reiserfs_jp_set_magic(jp,val) set_le32 (jp, jp_magic, val) #define NEED_TUNE 0xffffffff #define reiserfs_jp_get_max_batch(jp) get_le32 (jp, jp_max_batch) #define reiserfs_jp_set_max_batch(jp,val) set_le32 (jp, jp_max_batch, val) #define reiserfs_jp_get_commit_age(jp) get_le32 (jp, jp_commit_age) #define reiserfs_jp_set_commit_age(jp,val) set_le32 (jp, jp_commit_age, val) #define reiserfs_jp_get_trans_age(jp) get_le32 (jp, jp_trans_age) #define reiserfs_jp_set_trans_age(jp,val) set_le32 (jp, jp_trans_age, val) /* must be correct to keep the desc and commit structs at 4k */ /* first block written in a commit. BUG, not 64bit safe */ struct reiserfs_journal_desc { /* id of commit */ __u32 j2_trans_id ; /* length of commit. len +1 is the commit block */ __u32 j2_len ; /* mount id of this trans*/ __u32 j2_mount_id ; /* real locations for each block */ __u32 j2_realblock[1] ; }; #define reiserfs_jd_magic(bh) (bh->b_data + bh->b_size - 12) #define reiserfs_jd_head(bh) ((struct reiserfs_journal_desc *)bh->b_data) #define reiserfs_jd_get_trans(bh) get_le32 (reiserfs_jd_head (bh), j2_trans_id) #define reiserfs_jd_set_trans(bh,val) set_le32 (reiserfs_jd_head (bh), j2_trans_id, val) #define reiserfs_jd_get_len(bh) get_le32 (reiserfs_jd_head (bh), j2_len) #define reiserfs_jd_set_len(bh,val) set_le32 (reiserfs_jd_head (bh), j2_len, val) #define reiserfs_jd_get_mount(bh) get_le32 (reiserfs_jd_head (bh), j2_mount_id) #define reiserfs_jd_set_mount(bh,val) set_le32 (reiserfs_jd_head (bh), j2_mount_id, val) /* last block written in a commit BUG, not 64bit safe */ struct reiserfs_journal_commit { __u32 j3_trans_id ; /* must match j_trans_id from the desc block */ __u32 j3_len ; /* ditto */ __u32 j3_realblock[1] ; /* real locations for each block */ } ; #define reiserfs_jc_head(bh) ((struct reiserfs_journal_commit *)bh->b_data) #define reiserfs_jc_get_trans(bh) get_le32 (reiserfs_jc_head(bh), j3_trans_id) #define reiserfs_jc_set_trans(bh,val) set_le32 (reiserfs_jc_head(bh), j3_trans_id, val) #define reiserfs_jc_get_len(bh) get_le32 (reiserfs_jc_head(bh), j3_len) #define reiserfs_jc_set_len(bh,val) set_le32 (reiserfs_jc_head(bh), j3_len, val) /* set/get fields of journal header with these defines */ #define reiserfs_jh_get_mount(jh) get_le32 (jh, jh_mount_id) #define reiserfs_jh_set_mount(jh,val) set_le32 (jh, jh_mount_id, val) #define reiserfs_jh_get_flushed(jh) get_le32 (jh, jh_last_flush_trans_id) #define reiserfs_jh_set_flushed(jh,val) set_le32 (jh, jh_last_flush_trans_id, val) #define reiserfs_jh_get_start(jh) get_le32 (jh, jh_flush_offset) #define reiserfs_jh_set_start(jh,val) set_le32 (jh, jh_flush_offset, val) /* Journal Transaction Half */ #define reiserfs_jt_half(blocksize) \ ((blocksize - sizeof (struct reiserfs_journal_desc) + \ sizeof (__u32) - 12) / sizeof (__u32)) /* journal default settings */ #define JOURNAL_MIN_SIZE 512 /* biggest possible single transaction, don't change for now (8/3/99) */ #define JOURNAL_TRANS_MAX 1024 /* need to check whether it works */ #define JOURNAL_TRANS_MIN 256 /* default journal size / max trans length */ #define JOURNAL_DEFAULT_RATIO 8 #define JOURNAL_MIN_RATIO 2 /* max blocks to batch into one transaction, don't make this any bigger than 900 */ #define JOURNAL_MAX_BATCH 900 #define JOURNAL_MAX_COMMIT_AGE 30 #define JOURNAL_MAX_TRANS_AGE 30 /* journal max size is a maximum number of blocks pointed by first bitmap - REISERFS_DISK_OFFSET - superblock - first bitmap - journal herader */ #define reiserfs_journal_max(sb_nr,blocksize) \ blocksize * 8 - (sb_nr + 1 + 1 + 1) #define reiserfs_journal_default(sb_nr,blocksize) \ (unsigned long long) \ ((8192 > reiserfs_journal_max (sb_nr,blocksize)) ? \ reiserfs_journal_max (sb_nr,blocksize) : 8192) struct reiserfs_trans { unsigned long mount_id; unsigned long trans_id; unsigned long desc_blocknr; unsigned long trans_len; unsigned long commit_blocknr; unsigned long next_trans_offset; }; typedef struct reiserfs_trans reiserfs_trans_t; extern unsigned long reiserfs_journal_hostsize (reiserfs_sb_t *sb); extern int reiserfs_journal_block (reiserfs_filsys_t *, unsigned long block); extern int reiserfs_journal_desc_valid (reiserfs_bh_t *); extern int reiserfs_journal_get_transactions (reiserfs_filsys_t *, reiserfs_trans_t *, reiserfs_trans_t *); typedef void (*action_on_trans_t) (reiserfs_filsys_t *, reiserfs_trans_t *); extern void reiserfs_journal_by_transaction (reiserfs_filsys_t *, action_on_trans_t); typedef void (*action_on_block_t) (reiserfs_filsys_t *, reiserfs_trans_t *, unsigned int index, unsigned long in_journal, unsigned long in_place); extern void reiserfs_journal_foreach (reiserfs_filsys_t * fs, reiserfs_trans_t * trans, action_on_block_t action); extern int reiserfs_journal_open (reiserfs_filsys_t *, char *, int flags); extern int reiserfs_journal_params_check(reiserfs_filsys_t *fs); extern int reiserfs_journal_create (reiserfs_filsys_t * fs, char * j_filename, unsigned long offset, unsigned long len, int transaction_max_size); extern int reiserfs_journal_opened (reiserfs_filsys_t *); extern void reiserfs_journal_flush (reiserfs_filsys_t * fs); extern void reiserfs_journal_free (reiserfs_filsys_t * fs); extern void reiserfs_journal_close (reiserfs_filsys_t *); extern void reiserfs_journal_reopen (reiserfs_filsys_t * fs, int flag); extern int reiserfs_journal_replay (reiserfs_filsys_t * fs); extern __u32 reiserfs_journal_trans_age (void); extern __u32 reiserfs_journal_commit_age (void); extern __u32 reiserfs_journal_batch (unsigned long journal_trans_max); extern __u32 reiserfs_journal_tlen (__u32 desired, __u32 journal_size, int blocksize, int verbose); extern unsigned int reiserfs_journal_start_must (reiserfs_filsys_t * fs); extern int reiserfs_journal_fits (unsigned long sb_nr, unsigned int block_size, unsigned long block_count, unsigned long journal_size); extern void reiserfs_journal_print_params (FILE * fp, reiserfs_journal_param_t * jp); extern void reiserfs_journal_print_header (reiserfs_filsys_t * fs); extern void reiserfs_journal_print (reiserfs_filsys_t *); extern int reiserfs_print_jdesc (FILE * fp, reiserfs_bh_t * bh); #endif reiserfsprogs-3.6.20/include/reiserfs/key.h0000644000175300001440000001104110412227267015625 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_KEY_H #define REISERFS_KEY_H /* set/get fields of keys on disk with these defines */ #define reiserfs_key_get_did(k) get_le32 (k, k2_dir_id) #define reiserfs_key_set_did(k,val) set_le32 (k, k2_dir_id, val) #define reiserfs_key_get_oid(k) get_le32 (k, k2_objectid) #define reiserfs_key_set_oid(k,val) set_le32 (k, k2_objectid, val) #define reiserfs_key_get_off1(k) get_le32 (k, u.k2_offset_v1.k_offset) #define reiserfs_key_set_off1(k,val) set_le32 (k, u.k2_offset_v1.k_offset, val) #define reiserfs_key_get_uni(k) get_le32 (k, u.k2_offset_v1.k_uniqueness) #define reiserfs_key_set_uni(k,val) set_le32 (k, u.k2_offset_v1.k_uniqueness, val) #define REISERFS_KEY_SIZE (sizeof(reiserfs_key_t)) #define REISERFS_KEY_SHSIZE 8 // values for k_uniqueness field of the reiserfs_key_t #define UNI_SD 0 #define UNI_DE 500 #define UNI_DE 500 #define UNI_DIRECT 0xffffffff #define UNI_EXT 0xfffffffe #define UNI_UNKN 555 /* values for k_type field of the reiserfs_key_t */ #define TYPE_STAT_DATA 0x0 #define TYPE_EXTENT 0x1 #define TYPE_DIRECT 0X2 #define TYPE_DIRENTRY 0X3 #define TYPE_LAST 0x4 #define TYPE_UNKNOWN 0xf #define KEY_FORMAT_1 0 #define KEY_FORMAT_2 1 #define KEY_FORMAT_UNDEFINED 15 /* Our function for comparing keys can compare keys of different lengths. It takes as a parameter the length of the keys it is to compare. These defines are used in determining what is to be passed to it as that parameter. */ #define REISERFS_KEY_LEN 4 #define REISERFS_KEY_SHORT_LEN 2 /* there are 4 types of items: stat data, directory item, extent, direct. FIXME: This table does not describe new key format +-------------------+------------+--------------+------------+ | | k_offset | k_uniqueness | mergeable? | +-------------------+------------+--------------+------------+ | stat data | 0 | 0 | no | +-------------------+------------+--------------+------------+ | 1st directory item| OFFSET_DOT |DIRENTRY_UNIQU| no | | non 1st directory | hash value | | yes | | item | | | | +-------------------+------------+--------------+------------+ | extent item | offset + 1 |TYPE_EXTENT | if not the first object EXT item +-------------------+------------+--------------+------------+ | direct item | offset + 1 |TYPE_DIRECT | if not the first object direct item +-------------------+------------+--------------+------------+ */ #define reiserfs_key_stat(p_s_key) \ (reiserfs_key_get_type (p_s_key) == TYPE_STAT_DATA ) #define reiserfs_key_dir(p_s_key) \ (reiserfs_key_get_type (p_s_key) == TYPE_DIRENTRY ) #define reiserfs_key_direct(p_s_key) \ (reiserfs_key_get_type (p_s_key) == TYPE_DIRECT ) #define reiserfs_key_ext(p_s_key) \ (reiserfs_key_get_type (p_s_key) == TYPE_EXTENT ) #define reiserfs_key_unkn(p_s_key) \ (reiserfs_key_get_type (p_s_key) >= TYPE_LAST) #define MAX_KEY1_OFFSET 0xffffffff #define MAX_KEY2_OFFSET 0xfffffffffffffffLL /* hash value occupies 24 bits starting from 7 up to 30 */ #define OFFSET_HASH(offset) ((offset) & 0x7fffff80) /* generation number occupies 7 bits starting from 0 up to 6 */ #define OFFSET_GEN(offset) ((offset) & 0x0000007f) #define OFFSET_SD 0 #define OFFSET_DOT 1 #define OFFSET_DOT_DOT 2 extern const reiserfs_key_t MIN_KEY; extern const reiserfs_key_t MAX_KEY; extern const reiserfs_key_t root_dir_key; extern const reiserfs_key_t parent_root_dir_key; extern reiserfs_key_t lost_found_dir_key; extern void reiserfs_key_copy (reiserfs_key_t * to, const reiserfs_key_t * from); extern void reiserfs_key_copy2 (reiserfs_key_t * to, const reiserfs_key_t * from); extern int reiserfs_key_comp (const void * k1, const void * k2); extern int reiserfs_key_comp3 (const void * k1, const void * k2); extern int reiserfs_key_comp2 (const void * p_s_key1, const void * p_s_key2); extern int reiserfs_key_format (const reiserfs_key_t * key); extern unsigned long long reiserfs_key_get_off (const reiserfs_key_t * key); extern int reiserfs_key_get_type (const reiserfs_key_t * key); extern char * reiserfs_key_name (const reiserfs_key_t * key); extern void reiserfs_key_set_type (int format, reiserfs_key_t * key, int type); extern void reiserfs_key_set_off (int format, reiserfs_key_t * key, unsigned long long offset); extern void reiserfs_key_set_sec (int format, reiserfs_key_t * key, unsigned long long offset, int type); #endif reiserfsprogs-3.6.20/include/reiserfs/leaf.h0000644000175300001440000001464310412227267015757 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README * * Leaf balancing method declarations. * */ #ifndef REISERFS_LEAF_H #define REISERFS_LEAF_H #include #include /* size of item header */ #define REISERFS_IH_SIZE (sizeof(reiserfs_ih_t)) /* set/get fields of item head on disk with these defines */ #define reiserfs_ih_get_entries(ih) get_le16 (ih, u.ih2_entry_count) #define reiserfs_ih_set_entries(ih,val) set_le16 (ih, u.ih2_entry_count, val) #define reiserfs_ih_get_free(ih) get_le16 (ih, u.ih2_free_space) #define reiserfs_ih_set_free(ih,val) set_le16 (ih, u.ih2_free_space, 0) #define reiserfs_ih_get_len(ih) get_le16 (ih, ih2_item_len) #define reiserfs_ih_set_len(ih,val) set_le16 (ih, ih2_item_len, val) #define reiserfs_ih_get_loc(ih) get_le16 (ih, ih2_item_location) #define reiserfs_ih_set_loc(ih,val) set_le16 (ih, ih2_item_location, val) #define reiserfs_ih_format_v1(ih) (reiserfs_ih_get_format (ih) == KEY_FORMAT_1) #define IH_Unreachable 0 #define IH_Was_Tail 1 #define IH_Checked 2 #define IH_Writable 3 /* Unreachable bit is set on tree rebuilding and is cleared in semantic pass */ #define reiserfs_ih_clflags(ih) reiserfs_ih_set_flags (ih, 0) #define reiserfs_ih_isreach(ih) \ (!(reiserfs_ih_get_flags (ih) & (1 << IH_Unreachable))) #define reiserfs_ih_clunreach(ih) reiserfs_ih_set_flags (ih, \ reiserfs_ih_get_flags (ih) & ~(1 << IH_Unreachable)) #define reiserfs_ih_mkunreach(ih) reiserfs_ih_set_flags (ih, \ reiserfs_ih_get_flags (ih) | (1 << IH_Unreachable)) #define reiserfs_ih_wastail(ih) \ (reiserfs_ih_get_flags (ih) & (1 << IH_Was_Tail)) #define reiserfs_ih_mktail(ih) reiserfs_ih_set_flags (ih, \ reiserfs_ih_get_flags (ih) | (1 << IH_Was_Tail)) #define reiserfs_ih_cltail(ih) reiserfs_ih_set_flags (ih, \ reiserfs_ih_get_flags (ih) & ~(1 << IH_Was_Tail)) #define reiserfs_ih_ischeck(ih) \ (reiserfs_ih_get_flags (ih) & (1 << IH_Checked)) #define reiserfs_ih_mkcheck(ih) reiserfs_ih_set_flags (ih, \ reiserfs_ih_get_flags (ih) | (1 << IH_Checked)) #define reiserfs_ih_clcheck(ih) reiserfs_ih_set_flags (ih, \ reiserfs_ih_get_flags (ih) & ~(1 << IH_Checked)) #define reiserfs_ih_iswrite(ih) \ (reiserfs_ih_get_flags (ih) & (1 << IH_Writable)) #define reiserfs_ih_mkwrite(ih) reiserfs_ih_set_flags (ih, \ reiserfs_ih_get_flags (ih) | (1 << IH_Writable)) #define reiserfs_ih_clwrite(ih) reiserfs_ih_set_flags (ih, \ reiserfs_ih_get_flags (ih) & ~(1 << IH_Writable)) #define reiserfs_ih_stat(p_s_ih) reiserfs_key_stat(&((p_s_ih)->ih_key)) #define reiserfs_ih_dir(p_s_ih) reiserfs_key_dir(&((p_s_ih)->ih_key)) #define reiserfs_ih_direct(p_s_ih) reiserfs_key_direct(&((p_s_ih)->ih_key)) #define reiserfs_ih_ext(p_s_ih) reiserfs_key_ext(&((p_s_ih)->ih_key)) /* maximal length of item */ #define REISERFS_ITEM_MAX(block_size) \ (block_size - REISERFS_NODEH_SIZE - REISERFS_IH_SIZE) #define REISERFS_ITEM_MIN 1 #define REISERFS_DIRECT_MAX(size) \ ((size) - REISERFS_NODEH_SIZE - 2 * REISERFS_IH_SIZE - \ REISERFS_SD_SIZE - REISERFS_EXT_SIZE) /* get the item header */ #define reiserfs_ih_at(bh,item_num) \ ((reiserfs_ih_t * )((bh)->b_data + REISERFS_NODEH_SIZE) + (item_num)) /* get the key */ #define reiserfs_ih_key_at(bh,item_num) \ (&(reiserfs_ih_at(bh,item_num)->ih_key)) /* get item body */ #define reiserfs_item_at(bh,item_num) \ ( (bh)->b_data + reiserfs_ih_get_loc (reiserfs_ih_at((bh),(item_num)))) /* following defines use reiserfs buffer header and item header */ /* get item body */ #define reiserfs_item_by_ih(bh,ih) ((bh)->b_data + reiserfs_ih_get_loc(ih)) #define reiserfs_leaf_head(bh) \ (reiserfs_nh_get_level ((reiserfs_node_head_t *)((bh)->b_data)) \ == LEAF_LEVEL) /* check whether byte number 'offset' is in this item */ #define reiserfs_item_has_off(p_s_ih, n_offset, n_blocksize) \ (reiserfs_key_get_off(&(p_s_ih)->ih_key) <= (n_offset) && \ reiserfs_key_get_off(&(p_s_ih)->ih_key) + \ reiserfs_leaf_ibytes(p_s_ih,n_blocksize) > (n_offset) ) #define reiserfs_item_has_key(p_s_ih, p_s_key, n_blocksize) \ (!reiserfs_key_comp2(p_s_ih, p_s_key) && \ reiserfs_item_has_off(p_s_ih, reiserfs_key_get_off (p_s_key), \ n_blocksize)) #define reiserfs_item_off_at(ih, pos, bs) \ (reiserfs_key_get_off (&(ih)->ih_key) + \ (pos) * (reiserfs_ih_direct(ih) ? 1 : (bs))) #define reiserfs_dir(ih, item) \ ((reiserfs_ih_stat(ih) && !not_a_directory(item)) || \ reiserfs_ih_dir(ih)) #define reiserfs_item_count(ih) \ (reiserfs_ih_ext(ih) ? reiserfs_ext_count(ih) : \ reiserfs_ih_direct(ih) ? reiserfs_ih_get_len(ih) : \ reiserfs_ih_dir(ih) ? reiserfs_ih_get_entries(ih) : \ reiserfs_ih_stat(ih) ? 1 : 0) extern void reiserfs_leaf_mkempty (reiserfs_bh_t *bh); extern int reiserfs_leaf_mergeable (reiserfs_ih_t *left, reiserfs_ih_t *right, int bsize); extern int reiserfs_leaf_count_items(reiserfs_bh_t *bh); extern int reiserfs_leaf_free_count(reiserfs_bh_t *bh); extern int reiserfs_leaf_estimate_items(reiserfs_bh_t * bh); extern int reiserfs_leaf_valid(reiserfs_bh_t *bh); typedef void (*ih_func_t) (reiserfs_ih_t * ih); typedef void (*item_func_t) (reiserfs_bh_t * bh, reiserfs_ih_t * ih); extern void reiserfs_leaf_traverse(reiserfs_bh_t * bh, ih_func_t action, item_func_t * actions); extern void reiserfs_leaf_delete_item (reiserfs_filsys_t *, reiserfs_bh_t * bh, int item_num); extern void reiserfs_leaf_delete_entry (reiserfs_filsys_t *, reiserfs_bh_t * bh, int item_num, int entry_num, int del_count); extern int reiserfs_leaf_correct_at (reiserfs_filsys_t *, reiserfs_ih_t *, char *, unfm_func_t, int); extern __u32 reiserfs_leaf_ibytes (const reiserfs_ih_t * ih, int blocksize); extern int reiserfs_leaf_print(FILE * fp, reiserfs_filsys_t * fs, reiserfs_bh_t * bh, int print_mode, int first, int last); /* key format is stored in 12 bits starting from 0-th of item_head's ih2_format*/ extern __u16 reiserfs_ih_get_format(const reiserfs_ih_t *ih); extern void reiserfs_ih_set_format(reiserfs_ih_t *ih, __u16 val); extern __u16 reiserfs_ih_get_flags(const reiserfs_ih_t *ih); extern void reiserfs_ih_set_flags(reiserfs_ih_t *ih, __u16 val); enum leaf_print { LP_LEAF_DETAILS = 0x1, LP_DIRECT_ITEMS = 0x2, LP_LAST }; #endif reiserfsprogs-3.6.20/include/reiserfs/leaf_balance.h0000644000175300001440000000177610412227267017427 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_LB_H #define REISERFS_LB_H extern void reiserfs_lb_delete_item (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * bi, int first, int del_num); extern void reiserfs_lb_delete_unit (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * bi, int cut_item_num, int pos_in_item, int cut_size); extern void reiserfs_lb_delete (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * cur_bi, int last_first, int first, int del_num, int del_bytes); extern int reiserfs_lb_balance (reiserfs_tb_t * tb, reiserfs_ih_t * ih, const char * body, int flag, int zeros_number, reiserfs_ih_t * insert_key, reiserfs_bh_t ** insert_ptr); extern int reiserfs_lb_copy (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * dest_bi, reiserfs_bh_t * src, int last_first, int cpy_num, int cpy_bytes); #endif reiserfsprogs-3.6.20/include/reiserfs/libreiserfs.h0000644000175300001440000000211610412227267017351 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_LIBREISER4_H #define REISERFS_LIBREISER4_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef LIBREISERFS_READY extern const char *libreiserfs_version(void); extern int libreiserfs_max_interface_version(void); extern int libreiserfs_min_interface_version(void); #endif #ifdef __cplusplus } #endif #endif reiserfsprogs-3.6.20/include/reiserfs/node.h0000644000175300001440000000607510412227267015775 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_NODE_H #define REISERFS_NODE_H /* * Picture represents a leaf of internal tree * ______________________________________________________ * | | Array of | | | * |Block | Object-Item | F r e e | Objects- | * | head | Headers | S p a c e | Items | * |______|_______________|___________________|___________| */ /* Header of a disk block. More precisely, header of a formatted leaf or internal node, and not the header of an unformatted node. */ struct reiserfs_node_head { __u16 blk2_level; /* Level of a block in the tree. */ __u16 blk2_nr_item; /* Number of keys/items in a block. */ __u16 blk2_free_space; /* Block free space in bytes. */ __u16 blk_reserved; __u32 reserved [4]; }; typedef struct reiserfs_node_head reiserfs_node_head_t; #define REISERFS_NODEH_SIZE (sizeof(reiserfs_node_head_t)) /* set/get fields of block head on disk with these defines */ #define reiserfs_nh_get_level(blkh) get_le16 (blkh, blk2_level) #define reiserfs_nh_set_level(blkh,val) set_le16 (blkh, blk2_level, val) #define reiserfs_nh_get_items(blkh) get_le16 (blkh, blk2_nr_item) #define reiserfs_nh_set_items(blkh,val) set_le16 (blkh, blk2_nr_item, val) #define reiserfs_nh_get_free(blkh) get_le16 (blkh, blk2_free_space) #define reiserfs_nh_set_free(blkh,val) set_le16 (blkh, blk2_free_space, val) /* * values for blk_type field */ #define FREE_LEVEL 0 /* Node of this level is out of the tree. */ #define LEAF_LEVEL 1 /* Leaf node level. */ /* Given the buffer head of a formatted node, resolve to the block head of that node. */ #define NODE_HEAD(p_s_bh) ((reiserfs_node_head_t *)((p_s_bh)->b_data)) #define reiserfs_node_items(bh) reiserfs_nh_get_items (NODE_HEAD(bh)) #define reiserfs_node_level(bh) reiserfs_nh_get_level (NODE_HEAD(bh)) #define reiserfs_node_free(bh) reiserfs_nh_get_free (NODE_HEAD(bh)) /* Does the buffer contain a disk block which is in the tree. */ #define REISERFS_NODE_INTREE(p_s_bh) \ (reiserfs_nh_get_level(NODE_HEAD (p_s_bh)) != FREE_LEVEL) #define REISERFS_NODE_SPACE(blocksize) ((blocksize) - REISERFS_NODEH_SIZE) /* amount of used space in buffer (not including block head) */ #define reiserfs_node_used(cur) (REISERFS_NODE_SPACE(cur->b_size) - \ (reiserfs_node_free(cur))) enum node_type { NT_LEAF = 0x1, NT_INTERNAL = 0x2, NT_SUPER = 0x3, NT_JDESC = 0x4, NT_IH_ARRAY = 0x5, NT_UNKNOWN }; typedef enum node_type node_type_t; extern void reiserfs_node_replace_key (reiserfs_bh_t * dest, int n_dest, reiserfs_bh_t * src, int n_src); extern void reiserfs_node_forget(reiserfs_filsys_t *fs, unsigned long blk); extern int reiserfs_node_formatted (reiserfs_bh_t * bh, int level); extern int reiserfs_node_type (reiserfs_bh_t *bh); extern char *reiserfs_node_type_name(int code); extern void reiserfs_node_print (FILE * fp, reiserfs_filsys_t *, reiserfs_bh_t * bh, ...); #endif reiserfsprogs-3.6.20/include/reiserfs/objmap.h0000644000175300001440000000075110412227267016313 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_OBJMAP_H #define REISERFS_OBJMAP_H /* object identifier for root dir */ #define REISERFS_ROOT_OBJECTID 2 #define REISERFS_ROOT_PARENT_OBJECTID 1 extern int reiserfs_objmap_test (reiserfs_filsys_t * fs, __u32 objectid); extern void reiserfs_objmap_set (reiserfs_filsys_t * fs, __u32 objectid); extern void reiserfs_objmap_print (FILE * fp, reiserfs_filsys_t * fs); #endif reiserfsprogs-3.6.20/include/reiserfs/policy.h0000644000175300001440000000163710412227267016346 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_POLICY_H #define REISERFS_POLICY_H /* this is aggressive tail suppression policy taken from the kernel */ /* It should be REISERFS_DIRECT_MAX used here, but sometimes it is not enough, * and items got deleted. */ #define reiserfs_policy_ext(n_file_size,n_tail_size,n_block_size) \ ( \ (!(n_tail_size)) || \ (((n_tail_size) > REISERFS_ITEM_MAX(n_block_size)) || \ ( (n_file_size) >= (n_block_size) * 4 ) || \ ( ( (n_file_size) >= (n_block_size) * 3 ) && \ ( (n_tail_size) >= (REISERFS_ITEM_MAX(n_block_size))/4) ) || \ ( ( (n_file_size) >= (n_block_size) * 2 ) && \ ( (n_tail_size) >= (REISERFS_ITEM_MAX(n_block_size))/2) ) || \ ( ( (n_file_size) >= (n_block_size) ) && \ ( (n_tail_size) >= (REISERFS_ITEM_MAX(n_block_size) * 3)/4) ) ) \ ) #endif reiserfsprogs-3.6.20/include/reiserfs/print.h0000644000175300001440000000125010412227267016172 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_PRINT_H #define REISERFS_PRINT_H #include extern void reiserfs_warning (FILE * fp, const char * fmt, ...); #define reiserfs_panic(fmt, list...) \ {\ fflush (stdout);\ fprintf (stderr, "%s %d %s\n", __FILE__, __LINE__, __FUNCTION__);\ reiserfs_warning (stderr, (const char *)fmt, ## list);\ reiserfs_warning (stderr, "\n" );\ abort ();\ } #define reiserfs_exit(val, fmt, list...) \ {\ fflush (stdout);\ reiserfs_warning (stderr, (const char *)fmt, ## list);\ reiserfs_warning (stderr, "\n" );\ exit (val);\ } #endif reiserfsprogs-3.6.20/include/reiserfs/stat.h0000644000175300001440000002065710412227267016025 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_STAT_H #define REISERFS_STAT_H /* Stat Data on disk (reiserfs version of UFS disk inode minus the address blocks) */ /* The sense of adding union to stat data is to keep a value of real number of blocks used by file. The necessity of adding such information is caused by existing of files with holes. Reiserfs should keep number of used blocks for file, but not calculate it from file size (that is not correct for holed files). Thus we have to add additional information to stat data. When we have a device special file, there is no need to get number of used blocks for them, and, accordingly, we doesn't need to keep major and minor numbers for regular files, which might have holes. So this field is being overloaded. */ struct reiserfs_sd_v1 { __u16 sd_mode; /* file type, permissions */ __u16 sd_nlink; /* number of hard links */ __u16 sd_uid; /* owner */ __u16 sd_gid; /* group */ __u32 sd_size; /* file size */ __u32 sd_atime; /* time of last access */ __u32 sd_mtime; /* time file was last modified */ __u32 sd_ctime; /* time inode (stat data) was last changed (except changes to sd_atime and sd_mtime) */ union { __u32 sd_rdev; __u32 sd_blocks; /* number of blocks file uses */ } __attribute__ ((__packed__)) u; __u32 sd_fdb; /* first byte of file which is stored in a direct item: except that if it equals 1 it is a symlink and if it equals MAX_KEY_OFFSET there is no direct item. The existence of this field really grates on me. Let's replace it with a macro based on sd_size and our tail suppression policy. Someday. -Hans */ } __attribute__ ((__packed__)); typedef struct reiserfs_sd_v1 reiserfs_sd_v1_t; #define REISERFS_SD_SIZE_V1 (sizeof(reiserfs_sd_v1_t)) /* this is used to check sd_size of stat data v1 */ #define REISERFS_SD_SIZE_MAX_V1 0x7fffffff // sd_fdb is set to this when there are no direct items in a file #define REISERFS_SD_NODIRECT 0xffffffff /* Stat Data on disk (reiserfs version of UFS disk inode minus the address blocks) */ struct reiserfs_sd { __u16 sd_mode; /* file type, permissions */ __u16 sd_attrs; __u32 sd_nlink; /* 32 bit nlink! */ __u64 sd_size; /* 64 bit size!*/ __u32 sd_uid; /* 32 bit uid! */ __u32 sd_gid; /* 32 bit gid! */ __u32 sd_atime; /* time of last access */ __u32 sd_mtime; /* time file was last modified */ __u32 sd_ctime; /* time inode (stat data) was last changed (except changes to sd_atime and sd_mtime) */ __u32 sd_blocks; union { __u32 sd_rdev; __u32 sd_generation; //__u32 sd_fdb; /* first byte of file which is stored in a direct item: except that if it equals 1 it is a symlink and if it equals ~(__u32)0 there is no direct item. The existence of this field really grates on me. Let's replace it with a macro based on sd_size and our tail suppression policy? */ } __attribute__ ((__packed__)) u; } __attribute__ ((__packed__)); // // this is 44 bytes long // typedef struct reiserfs_sd reiserfs_sd_t; #define REISERFS_SD_SIZE (sizeof(reiserfs_sd_t)) /* this is used to check sd_size of stat data v2: max offset which can be reached with a key of format 2 is 60 bits */ #define REISERFS_SD_SIZE_MAX_V2 0xfffffffffffffffLL /* reiserfs_sd_v1_t* access macros */ #define reiserfs_sd_v1_mode(sd) (le16_to_cpu((sd)->sd_mode)) #define reiserfs_set_sd_v1_mode(sd,n) ((sd)->sd_mode = cpu_to_le16((n))) #define reiserfs_sd_v1_nlink(sd) (le16_to_cpu((sd)->sd_nlink)) #define reiserfs_set_sd_v1_nlink(sd,n) ((sd)->sd_nlink = cpu_to_le16((n))) #define reiserfs_sd_v1_uid(sd) (le16_to_cpu((sd)->sd_uid)) #define reiserfs_set_sd_v1_uid(sd,n) ((sd)->sd_uid = cpu_to_le16((n))) #define reiserfs_sd_v1_gid(sd) (le16_to_cpu((sd)->sd_gid)) #define reiserfs_set_sd_v1_gid(sd,n) ((sd)->sd_gid = cpu_to_le16((n))) #define reiserfs_sd_v1_size(sd) (le32_to_cpu((sd)->sd_size)) #define reiserfs_set_sd_v1_size(sd,n) ((sd)->sd_size = cpu_to_le32((n))) #define reiserfs_sd_v1_atime(sd) (le32_to_cpu((sd)->sd_atime)) #define reiserfs_set_sd_v1_atime(sd,n) ((sd)->sd_atime = cpu_to_le32((n))) #define reiserfs_sd_v1_mtime(sd) (le32_to_cpu((sd)->sd_mtime)) #define reiserfs_set_sd_v1_mtime(sd,n) ((sd)->sd_mtime = cpu_to_le32((n))) #define reiserfs_sd_v1_ctime(sd) (le32_to_cpu((sd)->sd_ctime)) #define reiserfs_set_sd_v1_ctime(sd,n) ((sd)->sd_ctime = cpu_to_le32((n))) #define reiserfs_sd_v1_blocks(sd) (le32_to_cpu((sd)->u.sd_blocks)) #define reiserfs_set_sd_v1_blocks(sd,n) ((sd)->u.sd_blocks = cpu_to_le32((n))) #define reiserfs_sd_v1_rdev(sd) (le32_to_cpu((sd)->u.sd_rdev)) #define reiserfs_set_sd_v1_rdev(sd,n) ((sd)->u.sd_rdev = cpu_to_le32((n))) #define reiserfs_sd_v1_fdb(sd) (le32_to_cpu((sd)->sd_fdb)) #define reiserfs_set_sd_v1_fdb(sd,n) ((sd)->sd_fdb = cpu_to_le32((n))) /* reiserfs_sd_t */ #define reiserfs_sd_v2_mode(sd) (le16_to_cpu((sd)->sd_mode)) #define reiserfs_set_sd_v2_mode(sd,n) ((sd)->sd_mode = cpu_to_le16((n))) #define reiserfs_sd_v2_attrs(sd) (le16_to_cpu((sd)->sd_attrs)) #define reiserfs_set_sd_v2_attrs(sd,n) ((sd)->sd_attrs = cpu_to_le16((n))) #define reiserfs_sd_v2_nlink(sd) (le32_to_cpu((sd)->sd_nlink)) #define reiserfs_set_sd_v2_nlink(sd,n) ((sd)->sd_nlink = cpu_to_le32((n))) #define reiserfs_sd_v2_size(sd) (le64_to_cpu((sd)->sd_size)) #define reiserfs_set_sd_v2_size(sd,n) ((sd)->sd_size = cpu_to_le64((n))) #define reiserfs_sd_v2_uid(sd) (le32_to_cpu((sd)->sd_uid)) #define reiserfs_set_sd_v2_uid(sd,n) ((sd)->sd_uid = cpu_to_le32((n))) #define reiserfs_sd_v2_gid(sd) (le32_to_cpu((sd)->sd_gid)) #define reiserfs_set_sd_v2_gid(sd,n) ((sd)->sd_gid = cpu_to_le32((n))) #define reiserfs_sd_v2_atime(sd) (le32_to_cpu((sd)->sd_atime)) #define reiserfs_set_sd_v2_atime(sd,n) ((sd)->sd_atime = cpu_to_le32((n))) #define reiserfs_sd_v2_mtime(sd) (le32_to_cpu((sd)->sd_mtime)) #define reiserfs_set_sd_v2_mtime(sd,n) ((sd)->sd_mtime = cpu_to_le32((n))) #define reiserfs_sd_v2_ctime(sd) (le32_to_cpu((sd)->sd_ctime)) #define reiserfs_set_sd_v2_ctime(sd,n) ((sd)->sd_ctime = cpu_to_le32((n))) #define reiserfs_sd_v2_blocks(sd) (le32_to_cpu((sd)->sd_blocks)) #define reiserfs_set_sd_v2_blocks(sd,n) ((sd)->sd_blocks = cpu_to_le32((n))) #define reiserfs_sd_v2_rdev(sd) (le32_to_cpu((sd)->u.sd_rdev)) #define reiserfs_set_sd_v2_rdev(sd,n) ((sd)->u.sd_rdev = cpu_to_le32((n))) extern void reiserfs_stat_init (int blocksize, int key_format, __u32 dirid, __u32 objectid, reiserfs_ih_t * ih, void * sd); extern void reiserfs_stat_set (int field, reiserfs_ih_t * ih, void * sd, void * value); extern void reiserfs_stat_get (int field, reiserfs_ih_t * ih, void * sd, void * value); /* access to stat data fields */ #define STAT_MODE 0 #define STAT_SIZE 1 #define STAT_NLINK 2 #define STAT_BLOCKS 3 #define STAT_FDB 4 #define reiserfs_stat_get_mode(ih, sd, pmode) \ reiserfs_stat_get(STAT_MODE, ih, sd, pmode) #define reiserfs_stat_set_mode(ih, sd, pmode) \ reiserfs_stat_set(STAT_MODE, ih, sd, pmode) #define reiserfs_stat_get_size(ih, sd, psize) \ reiserfs_stat_get(STAT_SIZE, ih, sd, psize) #define reiserfs_stat_set_size(ih, sd, psize) \ reiserfs_stat_set(STAT_SIZE, ih, sd, psize) #define reiserfs_stat_get_blocks(ih, sd, pblocks) \ reiserfs_stat_get(STAT_BLOCKS, ih, sd, pblocks) #define reiserfs_stat_set_blocks(ih, sd, pblocks) \ reiserfs_stat_set(STAT_BLOCKS, ih, sd, pblocks) #define reiserfs_stat_get_nlink(ih, sd, pnlink) \ reiserfs_stat_get(STAT_NLINK, ih, sd, pnlink) #define reiserfs_stat_set_nlink(ih, sd, pnlink) \ reiserfs_stat_set(STAT_NLINK, ih, sd, pnlink) #define reiserfs_stat_get_fdb(ih, sd, pfdb) \ reiserfs_stat_get(STAT_FDB, ih, sd, pfdb) #define reiserfs_stat_set_fdb(ih, sd, pfdb) \ reiserfs_stat_set(STAT_FDB, ih, sd, pfdb) extern int reiserfs_print_stat_data (FILE * fp, reiserfs_bh_t * bh, reiserfs_ih_t * ih, int alltimes); #endif reiserfsprogs-3.6.20/include/reiserfs/super.h0000644000175300001440000001352310412227267016202 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_SUPER_H #define REISERFS_SUPER_H #define REISERFS_SB_SIZE_V1 (sizeof(reiserfs_sb_v1_t)) /* 76 bytes */ #define reiserfs_sb_jp(sb) (&((sb)->s_v1.sb_journal)) /* values for sb_version field of struct reiserfs_super_block. sb_version is only reliable on filesystem with non-standard journal */ #define REISERFS_FORMAT_3_5 0 #define REISERFS_FORMAT_3_6 2 #define REISERFS_FORMAT_UNKNOWN -1 /* values for sb_mount_state field */ #define FS_CLEANLY_UMOUNTED 1 /* this was REISERFS_VALID_FS */ #define FS_NOT_CLEANLY_UMOUNTED 2 /* this was REISERFS_ERROR. It means that filesystem was not cleanly unmounted */ typedef enum { reiserfs_attrs_cleared = 0x00000001, } reiserfs_super_block_flags; #define REISERFS_SB_SIZE (sizeof(reiserfs_sb_t)) /* 204 bytes */ /* set/get fields of super block with these defines */ #define reiserfs_sb_get_blocks(sb) get_le32 (sb, s_v1.sb_block_count) #define reiserfs_sb_set_blocks(sb,val) set_le32 (sb, s_v1.sb_block_count, val) #define reiserfs_sb_get_free(sb) get_le32 (sb, s_v1.sb_free_blocks) #define reiserfs_sb_set_free(sb,val) set_le32 (sb, s_v1.sb_free_blocks, val) #define reiserfs_sb_get_root(sb) get_le32 (sb,s_v1.sb_root_block) #define reiserfs_sb_set_root(sb,val) set_le32 (sb, s_v1.sb_root_block, val) #if 0 #define get_sb_mount_id(sb) get_le32 (sb,s_v1.sb_mountid) #define set_sb_mount_id(sb,val) set_le32 (sb, s_v1.sb_mountid, val) #define get_sb_journal_magic(sb) get_le32 (sb, s_v1.sb_journal_magic) #define set_sb_journal_magic(sb,val) set_le32 (sb, s_v1.sb_journal_magic, val) #endif #define reiserfs_sb_get_blksize(sb) get_le16 (sb, s_v1.sb_blocksize) #define reiserfs_sb_set_blksize(sb,val) set_le16 (sb, s_v1.sb_blocksize, val) #define reiserfs_sb_get_mapmax(sb) get_le16 (sb, s_v1.sb_oid_maxsize) #define reiserfs_sb_set_mapmax(sb,val) set_le16 (sb, s_v1.sb_oid_maxsize, val) #define reiserfs_sb_get_mapcur(sb) get_le16 (sb, s_v1.sb_oid_cursize) #define reiserfs_sb_set_mapcur(sb,val) set_le16 (sb, s_v1.sb_oid_cursize, val) #define reiserfs_sb_get_umount(sb) get_le16 (sb, s_v1.sb_umount_state) #define reiserfs_sb_set_umount(sb,val) set_le16 (sb, s_v1.sb_umount_state, val) #define reiserfs_sb_get_state(sb) get_le16 (sb, s_v1.sb_fs_state) #define reiserfs_sb_set_state(sb,flag) set_le16 (sb, s_v1.sb_fs_state, flag) #define reiserfs_sb_get_hash(sb) get_le32 (sb, s_v1.sb_hash_function_code) #define reiserfs_sb_set_hash(sb,val) set_le32 (sb, s_v1.sb_hash_function_code, val) #define reiserfs_sb_get_height(sb) get_le16 (sb, s_v1.sb_tree_height) #define reiserfs_sb_set_height(sb,val) set_le16 (sb, s_v1.sb_tree_height, val) #define reiserfs_sb_get_bmaps(sb) get_le16 (sb, s_v1.sb_bmap_nr) #define reiserfs_sb_set_bmaps(sb,val) set_le16 (sb, s_v1.sb_bmap_nr, val) #define reiserfs_sb_get_version(sb) get_le16 (sb, s_v1.sb_version) #define reiserfs_sb_set_version(sb,val) set_le16 (sb, s_v1.sb_version, val) #define reiserfs_sb_get_reserved(sb) \ get_le16 (sb, s_v1.sb_reserved_for_journal) #define reiserfs_sb_set_reserved(sb,val) \ set_le16 (sb, s_v1.sb_reserved_for_journal, val) #define reiserfs_sb_get_gen(sb) get_le32 (sb, sb_inode_generation) #define reiserfs_sb_set_gen(sb,val) set_le32 (sb, sb_inode_generation, val) #define reiserfs_sb_get_flags(sb) get_le32 (sb, s_flags) #define reiserfs_sb_set_flags(sb, val) set_le32 (sb, s_flags, val) #define reiserfs_sb_isflag(sb, flag) \ (get_le32 (sb, s_flags) & flag) #define reiserfs_sb_mkflag(sb, flag) \ set_le32 (sb, s_flags, get_le32 (sb, s_flags) | flag) #define reiserfs_sb_clflag(sb, flag) \ set_le32 (sb, s_flags, get_le32 (sb, s_flags) & ~(flag)) /* 0 does not guarantee that fs is consistent */ #define reiserfs_sb_state_ok(fs) \ ((reiserfs_sb_get_umount (fs->fs_ondisk_sb) == FS_CLEANLY_UMOUNTED) && \ (reiserfs_sb_get_state (fs->fs_ondisk_sb) == FS_CONSISTENT)) /* prejournalled reiserfs had signature in the other place in super block */ #define REISERFS_SUPER_MAGIC_STRING_OFFSET_NJ 20 /* f_type of struct statfs will be set at this value by statfs(2) */ #define REISERFS_SUPER_MAGIC 0x52654973 /* various reiserfs signatures. We have 3 so far. ReIsErFs for 3.5 format with standard journal, ReIsEr2Fs for 3.6 (or converted 3.5) and ReIsEr3Fs for filesystem with non-standard journal (formats are distinguished by sb_version in that case). Those signatures should be looked for at the 64-th and at the 8-th 1k block of the device */ #define REISERFS_3_5_SUPER_MAGIC_STRING "ReIsErFs" #define REISERFS_3_6_SUPER_MAGIC_STRING "ReIsEr2Fs" #define REISERFS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs" /* JR stands for Journal Relocation */ /* these are possible values for sb_fs_state */ enum reiserfs_state_flags { /* this is set by mkreiserfs and by reiserfsck */ FS_CONSISTENT = 0x0, /* this is set by the kernel when fsck is wanted. */ FS_ERROR = 0x1, /* this is set by fsck when fatal corruption is found */ FS_FATAL = 0x2, /* this is set by kernel when io error occures */ /* IO_ERROR = 0x4, */ FS_STATE_LAST = 0x5 }; extern int reiserfs_super_35_magic (reiserfs_sb_t * rs); extern int reiserfs_super_36_magic (reiserfs_sb_t * rs); extern int reiserfs_super_jr_magic (reiserfs_sb_t * rs); extern int reiserfs_super_magic (reiserfs_sb_t * rs); extern int reiserfs_super_format (reiserfs_sb_t * sb); extern int reiserfs_super_size (reiserfs_sb_t * rs); extern int reiserfs_super_prejournaled (reiserfs_sb_t * rs); extern void reiserfs_super_print_state (FILE * fp, reiserfs_filsys_t * fs); extern int reiserfs_super_print (FILE * fp, reiserfs_filsys_t *, char * file_name, reiserfs_bh_t * bh, int short_print); extern int reiserfs_super_valid(reiserfs_bh_t *bh); #endif reiserfsprogs-3.6.20/include/reiserfs/tree.h0000644000175300001440000001251710412227267016005 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_TREE_H #define REISERFS_TREE_H #include /* Search_by_key fills up the path from the root to the leaf as it descends the tree looking for the key. It uses reiserfs_buffer_read to try to find buffers in the cache given their block number. If it does not find them in the cache it reads them from disk. For each node reiserfs_tree_search_item finds using reiserfs_buffer_read it then uses bin_search to look through that node. bin_search will find the position of the block_number of the next node if it is looking through an internal node. If it is looking through a leaf node bin_search will find the position of the item which has key either equal to given key, or which is the maximal key less than the given key. */ #define REISERFS_PATH_INIT(var) \ reiserfs_path_t var = {REISERFS_PATH_OFFILL, } /* Get path element by path and path position. */ #define REISERFS_PATH_ELEM(p_s_path,nr_elem) \ ((p_s_path)->path_elements + (nr_elem)) /* Get buffer header at the path by path and path position. */ #define REISERFS_PATH_BUFFER(p_s_path,nr_elem) \ (REISERFS_PATH_ELEM(p_s_path, nr_elem)->pe_buffer) /* Get position in the element at the path by path and path position. */ #define REISERFS_PATH_POS(p_s_path,nr_elem) \ (REISERFS_PATH_ELEM(p_s_path, nr_elem)->pe_position) #define REISERFS_PATH_LEAF(p_s_path) \ (REISERFS_PATH_BUFFER((p_s_path), (p_s_path)->path_length)) #define REISERFS_PATH_LEAF_POS(p_s_path) \ (REISERFS_PATH_POS((p_s_path), (p_s_path)->path_length)) #define REISERFS_PATH_IH(p_s_path) \ reiserfs_ih_at(REISERFS_PATH_LEAF(p_s_path), \ REISERFS_PATH_LEAF_POS(p_s_path)) /* in reiserfs_tb_balance leaf has h == 0 in contrast with path structure, where root has level == 0. That is why we need these defines */ #define REISERFS_PATH_UPBUFFER(p_s_path, h) \ (REISERFS_PATH_BUFFER (p_s_path, p_s_path->path_length - (h))) /* tb->F[h] or tb->S[0]->b_parent */ #define REISERFS_PATH_UPPARENT(path, h) \ REISERFS_PATH_UPBUFFER (path, (h) + 1) #define REISERFS_PATH_UPPOS(path, h) \ REISERFS_PATH_POS (path, path->path_length - (h)) /* tb->S[h]->b_item_order */ #define REISERFS_PATH_UPPARENT_POS(path, h) \ REISERFS_PATH_UPPOS(path, h + 1) #define REISERFS_PATH_LEVEL(p_s_path, n_h) \ ((p_s_path)->path_length - (n_h)) #define REISERFS_PATH_ITEM(path) \ ((void *) reiserfs_item_at(REISERFS_PATH_LEAF(path), \ REISERFS_PATH_LEAF_POS (path))) extern int reiserfs_tree_search_entry (reiserfs_filsys_t *fs, const reiserfs_key_t * key, reiserfs_path_t * path); extern int reiserfs_tree_search_position (reiserfs_filsys_t *fs, const reiserfs_key_t * key, reiserfs_path_t * path); extern const reiserfs_key_t * reiserfs_tree_lkey (reiserfs_path_t * path, reiserfs_filsys_t *fs); extern const reiserfs_key_t * reiserfs_tree_rkey (reiserfs_path_t * path, reiserfs_filsys_t *fs); extern const reiserfs_key_t *reiserfs_tree_next_key (reiserfs_path_t * path, reiserfs_filsys_t *fs); extern int reiserfs_tree_delete_entry (reiserfs_filsys_t *, reiserfs_key_t *); extern void reiserfs_tree_delete (reiserfs_filsys_t *, reiserfs_path_t *, int); extern void reiserfs_tree_delete_unit (reiserfs_filsys_t *, reiserfs_path_t *, int); extern void reiserfs_tree_insert_unit (reiserfs_filsys_t *, reiserfs_path_t * path, const void * body, int size); extern void reiserfs_tree_insert (reiserfs_filsys_t *, reiserfs_path_t * , reiserfs_ih_t *, const void *); extern int reiserfs_tree_search_name (reiserfs_filsys_t *, const reiserfs_key_t * dir, char * name, unsigned int * min_gen_counter, reiserfs_key_t * key); extern int reiserfs_tree_search_body (reiserfs_filsys_t * fs, const reiserfs_key_t * key, reiserfs_path_t * path); extern int reiserfs_tree_search_item (reiserfs_filsys_t * fs, const reiserfs_key_t * key, reiserfs_path_t * path); extern int reiserfs_tree_scan_name (reiserfs_filsys_t *, reiserfs_key_t * dir, char * name, reiserfs_path_t * path); extern int reiserfs_tree_insert_entry (reiserfs_filsys_t *, const reiserfs_key_t * dir, char * name, int name_len, const reiserfs_key_t * key, __u16 fsck_need); typedef void (*item_modify_t) (reiserfs_ih_t *, void *item); extern __u16 reiserfs_tree_root (reiserfs_filsys_t * fs, item_modify_t modify, __u16 ih_flags); extern int reiserfs_tree_create_stat (reiserfs_filsys_t * fs, reiserfs_path_t * path, const reiserfs_key_t * key, item_modify_t modify); extern void reiserfs_tree_pathrelse (reiserfs_path_t * p_s_search_path); extern int reiserfs_tree_left_mergeable (reiserfs_filsys_t * s, reiserfs_path_t * path); extern int reiserfs_tree_right_mergeable (reiserfs_filsys_t * s, reiserfs_path_t * path); extern int reiserfs_tree_node_mergeable (reiserfs_bh_t *left, reiserfs_bh_t *right); extern int reiserfs_tree_merge(reiserfs_filsys_t *fs, reiserfs_path_t *dst_path, reiserfs_path_t *src_path); #endif reiserfsprogs-3.6.20/include/reiserfs/tree_balance.h0000644000175300001440000001541110412227267017446 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_TB_H #define REISERFS_TB_H /* This temporary structure is used in tree balance algorithms, and constructed as we go to the extent that its various parts are needed. It contains arrays of nodes that can potentially be involved in the balancing of node S, and parameters that define how each of the nodes must be balanced. Note that in these algorithms for balancing the worst case is to need to balance the current node S and the left and right neighbors and all of their parents plus create a new node. We implement S1 balancing for the leaf nodes and S0 balancing for the internal nodes (S1 and S0 are defined in our papers.)*/ /* size of the array of buffers to free at end of reiserfs_tb_balance */ #define TB_2FREE_MAX 7 #define TB_FEB_MAX (REISERFS_TREE_HEIGHT_MAX + 1) /* someday somebody will prefix every field in this struct with tb_ */ struct reiserfs_tb { reiserfs_filsys_t * tb_fs; reiserfs_path_t * tb_path; /* array of left neighbors of nodes in the path */ reiserfs_bh_t * L[REISERFS_TREE_HEIGHT_MAX]; /* array of right neighbors of nodes in the path*/ reiserfs_bh_t * R[REISERFS_TREE_HEIGHT_MAX]; /* array of fathers of the left neighbors */ reiserfs_bh_t * FL[REISERFS_TREE_HEIGHT_MAX]; /* array of fathers of the right neighbors */ reiserfs_bh_t * FR[REISERFS_TREE_HEIGHT_MAX]; /* array of common parents of center node and its left neighbor */ reiserfs_bh_t * CFL[REISERFS_TREE_HEIGHT_MAX]; /* array of common parents of center node and its right neighbor */ reiserfs_bh_t * CFR[REISERFS_TREE_HEIGHT_MAX]; /* array of blocknr's that are free and are the nearest to the left node that are usable for writing dirty formatted leaves, using the write_next_to algorithm. */ /*unsigned long free_and_near[MAX_DIRTIABLE];*/ /* array of empty buffers. Number of buffers in array equals cur_blknum. */ reiserfs_bh_t * FEB[TB_FEB_MAX]; reiserfs_bh_t * used[TB_FEB_MAX]; /* array of number of items which must be shifted to the left in order to balance the current node; for leaves includes item that will be partially shifted; for internal nodes, it is the number of child pointers rather than items. It includes the new item being created. For preserve_shifted purposes the code sometimes subtracts one from this number to get the number of currently existing items being shifted, and even more often for leaves it subtracts one to get the number of wholly shifted items for other purposes. */ short int lnum[REISERFS_TREE_HEIGHT_MAX]; /* substitute right for left in comment above */ short int rnum[REISERFS_TREE_HEIGHT_MAX]; /* array indexed by height h mapping the key delimiting L[h] and S[h] to its item number within the node CFL[h] */ short int lkey[REISERFS_TREE_HEIGHT_MAX]; /* substitute r for l in comment above */ short int rkey[REISERFS_TREE_HEIGHT_MAX]; /* the number of bytes by we are trying to add or remove from S[h]. A negative value means removing. */ short int insert_size[REISERFS_TREE_HEIGHT_MAX]; /* number of nodes that will replace node S[h] after balancing on the level h of the tree. If 0 then S is being deleted, if 1 then S is remaining and no new nodes are being created, if 2 or 3 then 1 or 2 new nodes is being created */ short int blknum[REISERFS_TREE_HEIGHT_MAX]; /* fields that are used only for balancing leaves of the tree */ /* number of empty blocks having been already allocated */ short int cur_blknum; /* number of items that fall into left most node when S[0] splits */ short int s0num; /* number of items that fall into first new node when S[0] splits */ short int s1num; /* number of items that fall into second new node when S[0] splits */ short int s2num; /* number of bytes which can flow to the left neighbor from the left */ short int lbytes; /* most liquid item that cannot be shifted from S[0] entirely if -1 then nothing will be partially shifted */ /* number of bytes which will flow to the right neighbor from the right */ short int rbytes; /* number of bytes which flow to the first new node when S[0] splits note: if S[0] splits into 3 nodes, then items do not need to be cut */ short int s1bytes; short int s2bytes; /* buffers which are to be freed after reiserfs_tb_balance finishes by reiserfs_unfix_nodes */ reiserfs_bh_t * buf_to_free[TB_2FREE_MAX]; /* kmalloced memory. Used to create virtual node and keep map of dirtied bitmap blocks */ char * vn_buf; /* size of the vn_buf */ int vn_buf_size; /* VN starts after bitmap of bitmap blocks */ struct reiserfs_virtual_node * tb_vn; }; typedef struct reiserfs_tb reiserfs_tb_t; enum tb_return { CARRY_ON = 0x0, NO_DISK_SPACE = 0x3, IO_ERROR = 0x4, NO_BALANCING_NEEDED = 0x5, ITEM_FOUND = 0x6, ITEM_NOT_FOUND = 0x7, POSITION_FOUND = 0x8, POSITION_NOT_FOUND = 0x9, GOTO_PREVIOUS_ITEM = 0xa, POSITION_FOUND_INVISIBLE= 0xb, FILE_NOT_FOUND = 0xc, DIRECTORY_NOT_FOUND = 0xd, DIRECTORY_FOUND = 0xf, LAST_SEARCH }; /* These are modes of balancing */ /* When inserting an item. */ #define M_INSERT 'i' /* When inserting into (directories only) or appending onto an already existant item. */ #define M_PASTE 'p' /* When deleting an item. */ #define M_DELETE 'd' /* When truncating an item or removing an entry from a (directory) item. */ #define M_CUT 'c' /* used when balancing on leaf level skipped (in reiserfsck) */ #define M_INTERNAL 'n' #define FIRST_TO_LAST 0 #define LAST_TO_FIRST 1 /* used in reiserfs_tb_balance for passing parent of node information that has been gotten from tb struct */ struct reiserfs_bufinfo { reiserfs_bh_t * bi_bh; reiserfs_bh_t * bi_parent; int bi_position; }; typedef struct reiserfs_bufinfo reiserfs_bufinfo_t; extern void reiserfs_tb_attach_new (reiserfs_bufinfo_t * bi); extern reiserfs_bh_t * reiserfs_tb_FEB (reiserfs_tb_t *tb); extern int reiserfs_tb_lpos (reiserfs_tb_t * tb, int h); extern int reiserfs_tb_rpos (reiserfs_tb_t * tb, int h); extern void reiserfs_tb_balance (reiserfs_tb_t * tb, reiserfs_ih_t * ih, const char * body, int flag, int zeros_num); extern void reiserfs_tb_init (reiserfs_tb_t * tb, reiserfs_filsys_t *, reiserfs_path_t * path, int size); extern void reiserfs_tb_print_path (reiserfs_tb_t * tb, reiserfs_path_t * path); #endif reiserfsprogs-3.6.20/include/reiserfs/types.h0000644000175300001440000002321610412227267016210 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_TYPES_H #define REISERFS_TYPES_H #include "misc/types.h" #include "misc/swab.h" struct reiserfs_bitmap { unsigned long bm_byte_size; unsigned long bm_bit_size; char * bm_map; unsigned long bm_set_bits; int bm_dirty; /* used for fetched bitmap */ unsigned long bm_first_zero; }; typedef struct reiserfs_bitmap reiserfs_bitmap_t; typedef struct reiserfs_bh reiserfs_bh_t; struct reiserfs_bh { unsigned long b_blocknr; int b_dev; unsigned long b_size; char * b_data; unsigned long b_state; unsigned int b_count; unsigned int b_list ; void (*b_start_io) (unsigned long); void (*b_end_io)(reiserfs_bh_t *bh, int uptodate); reiserfs_bh_t * b_next; reiserfs_bh_t * b_prev; reiserfs_bh_t * b_hash_next; reiserfs_bh_t * b_hash_prev; }; /* magic string to find desc blocks in the journal */ #define JOURNAL_DESC_MAGIC "ReIsErLB" struct reiserfs_journal_param { /* where does journal start from on its device */ __u32 jp_start; /* journal device st_rdev */ __u32 jp_dev; /* size of the journal on FS creation. used to make sure they don't overflow it */ __u32 jp_size; /* max number of blocks in a transaction. */ __u32 jp_tlen; /* random value made on fs creation (this was sb_journal_block_count) */ __u32 jp_magic; /* max number of blocks to batch into a trans */ __u32 jp_max_batch; /* in seconds, how old can an async commit be */ __u32 jp_commit_age; /* in seconds, how old can a transaction be */ __u32 jp_trans_age; }; typedef struct reiserfs_journal_param reiserfs_journal_param_t; /* this header block gets written whenever a transaction is considered fully ** flushed, and is more recent than the last fully flushed transaction. fully ** flushed means all the log blocks and all the real blocks are on disk, and ** this transaction does not need to be replayed. */ struct reiserfs_journal_header { /* id of last fully flushed transaction */ __u32 jh_last_flush_trans_id ; /* offset in the log of where to start replay after a crash */ __u32 jh_flush_offset ; __u32 jh_mount_id ; reiserfs_journal_param_t jh_journal; /* the mount id of the fs during the last reiserfsck --check. */ __u32 jh_last_check_mount_id; }; /* this is the super from 3.5.X */ struct reiserfs_super_block_v1 { __u32 sb_block_count; /* 0 number of block on data device */ __u32 sb_free_blocks; /* 4 free blocks count */ __u32 sb_root_block; /* 8 root of the tree */ reiserfs_journal_param_t sb_journal; /* 12 */ __u16 sb_blocksize; /* 44 */ __u16 sb_oid_maxsize; /* 46 max size of object id array, see get_objectid() commentary */ __u16 sb_oid_cursize; /* 48 current size of object id array */ __u16 sb_umount_state; /* 50 this is set to 1 when filesystem was umounted, to 2 - when not */ char s_magic[10]; /* 52 reiserfs magic string indicates that file system is reiserfs: "ReIsErFs" or "ReIsEr2Fs" or "ReIsEr3Fs" */ __u16 sb_fs_state; /* 62 it is set to used by fsck to mark which phase of rebuilding is done (used for fsck debugging) */ __u32 sb_hash_function_code;/* 64 code of fuction which was/is/will be used to sort names in a directory. See codes in above */ __u16 sb_tree_height; /* 68 height of filesytem tree. Tree consisting of only one root block has 2 here */ __u16 sb_bmap_nr; /* 70 amount of bitmap blocks needed to address each block of file system */ __u16 sb_version; /* 72 this field is only reliable on filesystem with non-standard journal */ __u16 sb_reserved_for_journal; /* 74 size in blocks of journal area on main device, we need to keep after non-standard journal relocation */ }; typedef struct reiserfs_super_block_v1 reiserfs_sb_v1_t; /* Structure of super block on disk */ struct reiserfs_super_block { /* 0 */ reiserfs_sb_v1_t s_v1; /* 76 */ __u32 sb_inode_generation; /* Right now used only by inode-attributes, if enabled */ /* 80 */ __u32 s_flags; /* filesystem unique identifier */ /* 84 */ unsigned char s_uuid[16]; /* filesystem volume label */ /*100 */ unsigned char s_label[16]; /* zero filled by mkreiserfs and reiserfs_convert_objectid_map_v1() * so any additions must be updated there as well. */ /*116 */ char s_unused[88]; /*204*/ } __attribute__ ((__packed__));; typedef struct reiserfs_super_block reiserfs_sb_t; typedef __u32 (*hashf_t) (const char *, int); typedef struct reiserfs_filsys reiserfs_filsys_t; struct reiserfs_filsys { unsigned int fs_blocksize; int fs_format; /* on-disk format version */ hashf_t hash; /* pointer to function which is used to sort names in directory. It is set by reiserfs_fs_open if it is set in the super block, otherwise it is set by first reiserfs_hash_correct */ char fs_file_name[4096]; /* file name of underlying device */ int fs_dev; /* descriptor of opened block device file */ reiserfs_bh_t * fs_super_bh; /* buffer containing super block */ reiserfs_sb_t * fs_ondisk_sb; /* pointer to its b_data */ reiserfs_bitmap_t * fs_bitmap2; /* ondisk bitmap after reiserfs_bitmap_open */ /* opened journal fields */ char fs_j_file_name[4096]; /* file name of relocated journal device */ int fs_journal_dev; /* descriptor of opened journal device */ reiserfs_bh_t * fs_jh_bh; /* buffer containing journal header */ /* badblocks */ reiserfs_bitmap_t * fs_badblocks_bm; int fs_dirt; int fs_flags; void * fs_vp; int (*block_allocator) (reiserfs_filsys_t * fs, unsigned long * free_blocknrs, unsigned long start, int amount_needed); int (*block_deallocator) (reiserfs_filsys_t * fs, unsigned long block); __u16 lost_format; }; #define REISERFS_TREE_HEIGHT_MAX 6 #define REISERFS_PATH_OFFINIT 2 #define REISERFS_PATH_OFFILL 1 #define REISERFS_PATH_MAX (REISERFS_TREE_HEIGHT_MAX + \ REISERFS_PATH_OFFINIT) struct reiserfs_path_element { /* Pointer to the buffer at the path in the tree. */ reiserfs_bh_t * pe_buffer; /* Position in the tree node which is placed in the buffer above. */ int pe_position; }; typedef struct reiserfs_path_element reiserfs_path_element_t; /* We need to keep track of who the ancestors of nodes are. When we perform a search we record which nodes were visited while descending the tree looking for the node we searched for. This list of nodes is called the path. This information is used while performing balancing. Note that this path information may become invalid, and this means we must check it when using it to see if it is still valid. You'll need to read reiserfs_tree_search_item and the comments in it, especially about decrement_counters_in_path(), to understand this structure. */ struct reiserfs_path { /* Length of the array above. */ unsigned int path_length; /* Array of the path elements. */ reiserfs_path_element_t path_elements[REISERFS_PATH_MAX]; int pos_in_item; }; typedef struct reiserfs_path reiserfs_path_t; struct reiserfs_koff_v1 { __u32 k_offset; __u32 k_uniqueness; } __attribute__ ((__packed__)); struct reiserfs_koff_v2 { #if __BYTE_ORDER == __LITTLE_ENDIAN __u64 k_offset:60; __u64 k_type: 4; #elif __BYTE_ORDER == __BIG_ENDIAN __u64 k_type: 4; __u64 k_offset:60; #else # error "nuxi/pdp-endian archs are not supported" #endif } __attribute__ ((__packed__)); /* Key of the object determines object's location in the tree, composed of 4 components */ struct reiserfs_key { /* packing locality: by default parent directory object id */ __u32 k2_dir_id; /* object identifier */ __u32 k2_objectid; union { struct reiserfs_koff_v1 k2_offset_v1; struct reiserfs_koff_v2 k2_offset_v2; } __attribute__ ((__packed__)) u; } __attribute__ ((__packed__)); typedef struct reiserfs_key reiserfs_key_t; /* Everything in the filesystem is stored as a set of items. The item head contains the key of the item, its free space (for extent items) and specifies the location of the item itself within the block. */ struct reiserfs_ih { reiserfs_key_t ih_key; /* Everything in the tree is found by searching for it based on its key.*/ union { __u16 ih2_free_space; /* The free space in the last unformatted node of an extent item if this is an extent item. This equals 0xFFFF iff this is a direct item or stat data item. Note that the key, not this field, is used to determine the item type, and thus which field this union contains. */ __u16 ih2_entry_count; /* Iff this is a directory item, this field equals the number of directory entries in the directory item. */ } __attribute__ ((__packed__)) u; __u16 ih2_item_len; /* total size of the item body */ __u16 ih2_item_location; /* an offset to the item body within the block */ __u16 ih_format; /* key format is stored in bits 0-11 of this item flags are stored in bits 12-15 */ #if 0 struct { __u16 key_format : 12; /* KEY_FORMAT_1 or KEY_FORMAT_2. This is not necessary, but we have space, let use it */ __u16 flags : 4; /* fsck set here its flag (reachable/unreachable) */ } __attribute__ ((__packed__)) ih2_format; #endif } __attribute__ ((__packed__)); typedef struct reiserfs_ih reiserfs_ih_t; typedef int (*unfm_func_t) (reiserfs_filsys_t *, __u32); #endif reiserfsprogs-3.6.20/include/util/0000777000175300001440000000000010412227615014103 500000000000000reiserfsprogs-3.6.20/include/util/Makefile.am0000644000175300001440000000007510412227267016060 00000000000000noinst_HEADERS = badblock.h misc.h print.h device.h mntent.h reiserfsprogs-3.6.20/include/util/Makefile.in0000644000175300001440000002313610412227363016071 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = include/util DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ noinst_HEADERS = badblock.h misc.h print.h device.h mntent.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/util/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu include/util/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ ctags distclean distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/include/util/badblock.h0000644000175300001440000000042610412227267015736 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef UTIL_BADBLOCK_H #define UTIL_BADBLOCK_H #include "reiserfs/libreiserfs.h" extern int util_badblock_load (reiserfs_filsys_t * fs, char * badblocks_file); #endif reiserfsprogs-3.6.20/include/util/device.h0000644000175300001440000000363110412227267015435 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef UTIL_DEVICE_H #define UTIL_DEVICE_H #include "misc/types.h" #include #include #include #ifndef major #define major(rdev) ((rdev)>>8) #define minor(rdev) ((rdev) & 0xff) #endif /* major */ #ifndef SCSI_DISK_MAJOR #define SCSI_DISK_MAJOR(maj) ((maj) == SCSI_DISK0_MAJOR || \ ((maj) >= SCSI_DISK1_MAJOR && (maj) <= SCSI_DISK7_MAJOR)) #endif /* SCSI_DISK_MAJOR */ #ifndef SCSI_BLK_MAJOR #define SCSI_BLK_MAJOR(maj) (SCSI_DISK_MAJOR(maj) || (maj) == SCSI_CDROM_MAJOR) #endif /* SCSI_BLK_MAJOR */ #ifndef IDE_DISK_MAJOR #ifdef IDE9_MAJOR #define IDE_DISK_MAJOR(maj) ((maj) == IDE0_MAJOR || (maj) == IDE1_MAJOR || \ (maj) == IDE2_MAJOR || (maj) == IDE3_MAJOR || \ (maj) == IDE4_MAJOR || (maj) == IDE5_MAJOR || \ (maj) == IDE6_MAJOR || (maj) == IDE7_MAJOR || \ (maj) == IDE8_MAJOR || (maj) == IDE9_MAJOR) #else #define IDE_DISK_MAJOR(maj) ((maj) == IDE0_MAJOR || (maj) == IDE1_MAJOR || \ (maj) == IDE2_MAJOR || (maj) == IDE3_MAJOR || \ (maj) == IDE4_MAJOR || (maj) == IDE5_MAJOR) #endif /* IDE9_MAJOR */ #endif /* IDE_DISK_MAJOR */ typedef enum mount_flags { MF_NOT_MOUNTED = 0x0, MF_RO = 0x1, MF_RW = 0x2 } mount_flags_t; extern FILE * util_file_open (char * filename, char * option); typedef struct util_device_dma { int fd; int support_type; int dma; __u64 speed; dev_t st_rdev; } util_device_dma_t; extern int util_device_dma_prep(util_device_dma_t *dma_info); extern int util_device_get_dma(util_device_dma_t *dma_info); extern void util_device_dma_fini(int fd, util_device_dma_t *dma_info); extern int util_device_formatable (char * device_name, int force); extern int util_root_mounted(char *device); extern int util_device_mounted(char *device); extern int util_file_ro(char *file); #endif reiserfsprogs-3.6.20/include/util/misc.h0000644000175300001440000000116110412227267015125 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef UTIL_MISC_H #define UTIL_MISC_H #include extern void util_misc_progress (FILE * fp, unsigned long *passed, unsigned long total, unsigned int inc, int forward); extern void util_misc_speed (FILE *fp, unsigned long total, unsigned long passed, int cursor_pos, int reset_time); extern void util_misc_print_name (FILE * fp, char * name, int len); extern void util_misc_erase_name (FILE * fp, int len); extern void util_misc_fini_name (FILE *fp); #endif reiserfsprogs-3.6.20/include/util/mntent.h0000644000175300001440000000030410412227267015475 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef UTIL_MNTENT_H #define UTIL_MNTENT_H extern struct mntent *util_mntent(char *device); #endif reiserfsprogs-3.6.20/include/util/print.h0000644000175300001440000000042410412227267015327 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef UTIL_PRINT_H #define UTIL_PRINT_H #include extern int util_user_confirmed(FILE * fp, char * q, char * yes); extern void util_print_banner(char *name); #endif reiserfsprogs-3.6.20/install-sh0000755000175300001440000002202110217066030013413 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2005-02-02.21 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit $?;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit $?;; *) # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. test -n "$dir_arg$dstarg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then mkdircmd=: chmodcmd= else mkdircmd=$mkdirprog fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` shift IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test -d "$pathcomp" || exit fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $mkdircmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. $doit $cpprog "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit 1 } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" } } fi || { (exit 1); exit 1; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit 0 } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: reiserfsprogs-3.6.20/libmisc/0000777000175300001440000000000010412227615013125 500000000000000reiserfsprogs-3.6.20/libmisc/Makefile.am0000644000175300001440000000025510412227267015102 00000000000000noinst_LIBRARIES = libmisc-static.a libmisc_static_a_SOURCES = bitops.c device.c malloc.c misc.c libmisc_static_a_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include reiserfsprogs-3.6.20/libmisc/Makefile.in0000644000175300001440000004745710412227364015130 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = $(libmisc_static_a_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libmisc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libmisc_static_a_AR = $(AR) $(ARFLAGS) libmisc_static_a_LIBADD = am_libmisc_static_a_OBJECTS = libmisc_static_a-bitops.$(OBJEXT) \ libmisc_static_a-device.$(OBJEXT) \ libmisc_static_a-malloc.$(OBJEXT) \ libmisc_static_a-misc.$(OBJEXT) libmisc_static_a_OBJECTS = $(am_libmisc_static_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libmisc_static_a_SOURCES) DIST_SOURCES = $(libmisc_static_a_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ noinst_LIBRARIES = libmisc-static.a libmisc_static_a_SOURCES = bitops.c device.c malloc.c misc.c libmisc_static_a_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libmisc/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu libmisc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libmisc-static.a: $(libmisc_static_a_OBJECTS) $(libmisc_static_a_DEPENDENCIES) -rm -f libmisc-static.a $(libmisc_static_a_AR) libmisc-static.a $(libmisc_static_a_OBJECTS) $(libmisc_static_a_LIBADD) $(RANLIB) libmisc-static.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmisc_static_a-bitops.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmisc_static_a-device.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmisc_static_a-malloc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmisc_static_a-misc.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` libmisc_static_a-bitops.o: bitops.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-bitops.o -MD -MP -MF "$(DEPDIR)/libmisc_static_a-bitops.Tpo" -c -o libmisc_static_a-bitops.o `test -f 'bitops.c' || echo '$(srcdir)/'`bitops.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libmisc_static_a-bitops.Tpo" "$(DEPDIR)/libmisc_static_a-bitops.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-bitops.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bitops.c' object='libmisc_static_a-bitops.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-bitops.o `test -f 'bitops.c' || echo '$(srcdir)/'`bitops.c libmisc_static_a-bitops.obj: bitops.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-bitops.obj -MD -MP -MF "$(DEPDIR)/libmisc_static_a-bitops.Tpo" -c -o libmisc_static_a-bitops.obj `if test -f 'bitops.c'; then $(CYGPATH_W) 'bitops.c'; else $(CYGPATH_W) '$(srcdir)/bitops.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libmisc_static_a-bitops.Tpo" "$(DEPDIR)/libmisc_static_a-bitops.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-bitops.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bitops.c' object='libmisc_static_a-bitops.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-bitops.obj `if test -f 'bitops.c'; then $(CYGPATH_W) 'bitops.c'; else $(CYGPATH_W) '$(srcdir)/bitops.c'; fi` libmisc_static_a-device.o: device.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-device.o -MD -MP -MF "$(DEPDIR)/libmisc_static_a-device.Tpo" -c -o libmisc_static_a-device.o `test -f 'device.c' || echo '$(srcdir)/'`device.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libmisc_static_a-device.Tpo" "$(DEPDIR)/libmisc_static_a-device.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-device.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='device.c' object='libmisc_static_a-device.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-device.o `test -f 'device.c' || echo '$(srcdir)/'`device.c libmisc_static_a-device.obj: device.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-device.obj -MD -MP -MF "$(DEPDIR)/libmisc_static_a-device.Tpo" -c -o libmisc_static_a-device.obj `if test -f 'device.c'; then $(CYGPATH_W) 'device.c'; else $(CYGPATH_W) '$(srcdir)/device.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libmisc_static_a-device.Tpo" "$(DEPDIR)/libmisc_static_a-device.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-device.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='device.c' object='libmisc_static_a-device.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-device.obj `if test -f 'device.c'; then $(CYGPATH_W) 'device.c'; else $(CYGPATH_W) '$(srcdir)/device.c'; fi` libmisc_static_a-malloc.o: malloc.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-malloc.o -MD -MP -MF "$(DEPDIR)/libmisc_static_a-malloc.Tpo" -c -o libmisc_static_a-malloc.o `test -f 'malloc.c' || echo '$(srcdir)/'`malloc.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libmisc_static_a-malloc.Tpo" "$(DEPDIR)/libmisc_static_a-malloc.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-malloc.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='malloc.c' object='libmisc_static_a-malloc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-malloc.o `test -f 'malloc.c' || echo '$(srcdir)/'`malloc.c libmisc_static_a-malloc.obj: malloc.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-malloc.obj -MD -MP -MF "$(DEPDIR)/libmisc_static_a-malloc.Tpo" -c -o libmisc_static_a-malloc.obj `if test -f 'malloc.c'; then $(CYGPATH_W) 'malloc.c'; else $(CYGPATH_W) '$(srcdir)/malloc.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libmisc_static_a-malloc.Tpo" "$(DEPDIR)/libmisc_static_a-malloc.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-malloc.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='malloc.c' object='libmisc_static_a-malloc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-malloc.obj `if test -f 'malloc.c'; then $(CYGPATH_W) 'malloc.c'; else $(CYGPATH_W) '$(srcdir)/malloc.c'; fi` libmisc_static_a-misc.o: misc.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-misc.o -MD -MP -MF "$(DEPDIR)/libmisc_static_a-misc.Tpo" -c -o libmisc_static_a-misc.o `test -f 'misc.c' || echo '$(srcdir)/'`misc.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libmisc_static_a-misc.Tpo" "$(DEPDIR)/libmisc_static_a-misc.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-misc.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc.c' object='libmisc_static_a-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-misc.o `test -f 'misc.c' || echo '$(srcdir)/'`misc.c libmisc_static_a-misc.obj: misc.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-misc.obj -MD -MP -MF "$(DEPDIR)/libmisc_static_a-misc.Tpo" -c -o libmisc_static_a-misc.obj `if test -f 'misc.c'; then $(CYGPATH_W) 'misc.c'; else $(CYGPATH_W) '$(srcdir)/misc.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libmisc_static_a-misc.Tpo" "$(DEPDIR)/libmisc_static_a-misc.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-misc.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc.c' object='libmisc_static_a-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-misc.obj `if test -f 'misc.c'; then $(CYGPATH_W) 'misc.c'; else $(CYGPATH_W) '$(srcdir)/misc.c'; fi` uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/libmisc/bitops.c0000644000175300001440000000753210412227267014517 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "misc/bitops.h" #include "misc/types.h" /* Only le bitops operations are used. */ inline int misc_set_bit (unsigned long long nr, void * addr) { __u8 * p, mask; int retval; p = (__u8 *)addr; p += nr >> 3; mask = 1 << (nr & 0x7); /*cli();*/ retval = (mask & *p) != 0; *p |= mask; /*sti();*/ return retval; } inline int misc_clear_bit (unsigned long long nr, void * addr) { __u8 * p, mask; int retval; p = (__u8 *)addr; p += nr >> 3; mask = 1 << (nr & 0x7); /*cli();*/ retval = (mask & *p) != 0; *p &= ~mask; /*sti();*/ return retval; } inline int misc_test_bit(unsigned long long nr, const void * addr) { __u8 * p, mask; p = (__u8 *)addr; p += nr >> 3; mask = 1 << (nr & 0x7); return ((mask & *p) != 0); } inline unsigned long long misc_find_first_zero_bit (const void *vaddr, unsigned long long size) { const __u8 *p = vaddr, *addr = vaddr; unsigned long long res; if (!size) return 0; size = (size >> 3) + ((size & 0x7) > 0); while (*p++ == 255) { if (--size == 0) return (unsigned long long)(p - addr) << 3; } --p; for (res = 0; res < 8; res++) if (!misc_test_bit (res, p)) break; return res + (p - addr) * 8; } inline unsigned long long misc_find_next_zero_bit (const void *vaddr, unsigned long long size, unsigned long long offset) { const __u8 *addr = vaddr; const __u8 *p = addr + (offset >> 3); int bit = offset & 7; unsigned long long res; if (offset >= size) return size; if (bit) { /* Look for zero in first char */ for (res = bit; res < 8; res++) if (!misc_test_bit (res, p)) return res + (p - addr) * 8; p++; } /* No zero yet, search remaining full bytes for a zero */ res = misc_find_first_zero_bit (p, size - 8 * (p - addr)); return res + (p - addr) * 8; } inline unsigned long long misc_find_first_set_bit (const void *vaddr, unsigned long long size) { const __u8 *p = vaddr, *addr = vaddr; unsigned long long res; if (!size) return 0; size = (size >> 3) + ((size & 0x7) > 0); while (*p++ == 0) { if (--size == 0) return (unsigned long long)(p - addr) << 3; } --p; for (res = 0; res < 8; res++) if (misc_test_bit (res, p)) break; return res + (p - addr) * 8; } inline unsigned long long misc_find_next_set_bit(const void *vaddr, unsigned long long size, unsigned long long offset) { const __u8 *addr = vaddr; const __u8 *p = addr + (offset >> 3); int bit = offset & 7; unsigned long long res; if (offset >= size) return size; if (bit) { /* Look for zero in first char */ for (res = bit; res < 8; res++) if (misc_test_bit (res, p)) return res + (p - addr) * 8; p++; } /* No set bit yet, search remaining full bytes for a 1 */ res = misc_find_first_set_bit (p, size - 8 * (p - addr)); return res + (p - addr) * 8; } /* there are masks for certain bits */ __u16 mask16 (int from, int count) { __u16 mask; mask = (0xffff >> from); mask <<= from; mask <<= (16 - from - count); mask >>= (16 - from - count); return mask; } __u32 mask32 (int from, int count) { __u32 mask; mask = (0xffffffff >> from); mask <<= from; mask <<= (32 - from - count); mask >>= (32 - from - count); return mask; } __u64 mask64 (int from, int count) { __u64 mask; mask = (0xffffffffffffffffLL >> from); mask <<= from; mask <<= (64 - from - count); mask >>= (64 - from - count); return mask; } reiserfsprogs-3.6.20/libmisc/device.c0000644000175300001440000000565210412227267014457 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "misc/device.h" #include "misc/misc.h" #include #include #include #include #include #include #include #include #define MISC_DEVICE_STAT(Field, Type) \ Type misc_device_##Field(char *device) { \ struct stat st; \ \ if (stat(device, &st) == 0) \ return st.st_##Field; \ \ fprintf(stderr, "Stat of the device '%s' failed.\n", device); \ return (Type)-1; \ } MISC_DEVICE_STAT(mode, mode_t); MISC_DEVICE_STAT(rdev, dev_t); int misc_device_valid_offset(int fd, long long int offset) { long long int res; char ch; /*res = reiserfs_llseek (fd, offset, 0);*/ res = lseek (fd, (off_t)offset, SEEK_SET); if (res < 0) return 0; /* if (read (fd, &ch, 1) < 0) does not wirk on files */ if (read (fd, &ch, 1) < 1) return 0; return 1; } /* To not have problem with last sectors on the block device when switching to smaller one. */ #define MAX_BS (64 * 1024) /* calculates number of blocks in a file. Returns 0 for "sparse" regular files and files other than regular files and block devices */ unsigned long misc_device_count_blocks (char * filename, int blocksize) { long long int high, low; int fd; fd = open (filename, O_RDONLY); if (fd == -1) { fprintf(stderr, "Failed to open '%s': %s.\n", filename, strerror(errno)); return 0; } if (!S_ISBLK(misc_device_mode(filename)) && !S_ISREG(misc_device_mode(filename))) { close(fd); return 0; } #ifdef BLKGETSIZE64 { unsigned long long size; unsigned long sz; if (ioctl (fd, BLKGETSIZE64, &size) >= 0) { size = (size / MAX_BS) * MAX_BS / blocksize; sz = size; if ((unsigned long long)sz != size) misc_die ("misc_device_count_blocks: block device too large"); close(fd); return sz; } } #endif #ifdef BLKGETSIZE { unsigned long long size; unsigned long sz; if (ioctl (fd, BLKGETSIZE, &sz) >= 0) { size = sz; close(fd); return (size * 512 / MAX_BS) * MAX_BS / blocksize; } } #endif low = 0; for( high = 1; misc_device_valid_offset (fd, high); high *= 2 ) low = high; while (low < high - 1) { const long long int mid = ( low + high ) / 2; if (misc_device_valid_offset (fd, mid)) low = mid; else high = mid; } misc_device_valid_offset (fd, 0); close (fd); return (low + 1) * MAX_BS / MAX_BS / blocksize; } char misc_device_typec (unsigned short mode) { if (S_ISBLK ((mode_t)mode)) return 'b'; if (S_ISCHR (mode)) return 'c'; if (S_ISDIR (mode)) return 'd'; if (S_ISREG (mode)) return '-'; if (S_ISFIFO (mode)) return 'p'; if (S_ISLNK (mode)) return 'l'; if (S_ISSOCK (mode)) return 's'; return '?'; } reiserfsprogs-3.6.20/libmisc/malloc.c0000644000175300001440000000555510412227267014471 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "misc/malloc.h" #include "misc/misc.h" #include #include #define MEM_BEGIN "_mem_begin_" #define MEM_END "mem_end" #define MEM_FREED "__free_" #define CONTROL_SIZE (strlen (MEM_BEGIN) + 1 + sizeof (int) + strlen (MEM_END) + 1) unsigned int misc_memsize(char *p) { char *begin; begin = p - strlen (MEM_BEGIN) - 1 - sizeof(int); return *(int *)(begin + strlen (MEM_BEGIN) + 1); } void misc_checkmem (char * p, int size) { char * begin; char * end; begin = p - strlen (MEM_BEGIN) - 1 - sizeof (int); if (strcmp (begin, MEM_BEGIN)) misc_die ("misc_checkmem: memory corrupted - invalid head sign"); if (*(int *)(begin + strlen (MEM_BEGIN) + 1) != size) misc_die ("misc_checkmem: memory corrupted - invalid size"); end = begin + size + CONTROL_SIZE - strlen (MEM_END) - 1; if (strcmp (end, MEM_END)) misc_die ("misc_checkmem: memory corrupted - invalid end sign"); } void *misc_getmem (int size) { char * mem; if ((mem = misc_malloc(size)) == NULL) misc_die ("misc_getmem: no more memory (%d)", size); memset (mem, 0, size); // misc_checkmem (mem, size); return mem; } void *misc_malloc(int size) { char * p; char * mem; p = (char *)malloc (CONTROL_SIZE + size); if (!p) misc_die ("misc_getmem: no more memory (%d)", size); /* Write the MEM_BEGIN magic in the beginning of allocated memory. */ strcpy (p, MEM_BEGIN); p += strlen (MEM_BEGIN) + 1; /* Write the size after the magic. */ *(int *)p = size; p += sizeof (int); mem = p; p += size; strcpy (p, MEM_END); return mem; } void * misc_expandmem (void * vp, int size, int by) { int allocated; char * mem, * p = vp; int expand_by = by; if (p) { misc_checkmem (p, size); allocated = CONTROL_SIZE + size; p -= (strlen (MEM_BEGIN) + 1 + sizeof (int)); } else { allocated = 0; /* add control bytes to the new allocated area */ expand_by += CONTROL_SIZE; } p = realloc (p, allocated + expand_by); if (!p) misc_die ("misc_expandmem: no more memory (%d)", size); if (!vp) { strcpy (p, MEM_BEGIN); } mem = p + strlen (MEM_BEGIN) + 1 + sizeof (int); *(int *)(p + strlen (MEM_BEGIN) + 1) = size + by; /* fill new allocated area by 0s */ if(by > 0) memset (mem + size, 0, by); strcpy (mem + size + by, MEM_END); // misc_checkmem (mem, size + by); return mem; } void misc_freemem (void * vp) { char * p = vp; int size; if (!p) return; size = misc_memsize (vp); misc_checkmem (p, size); p -= (strlen (MEM_BEGIN) + 1 + sizeof (int)); strcpy (p, MEM_FREED); strcpy (p + size + CONTROL_SIZE - strlen (MEM_END) - 1, MEM_FREED); free (p); } reiserfsprogs-3.6.20/libmisc/misc.c0000644000175300001440000001000410412227267014136 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "misc/malloc.h" #include "misc/misc.h" #include #include #include #include #include #include #include void misc_die (char * fmt, ...) { static char buf[4096]; va_list args; va_start (args, fmt); vsprintf (buf, fmt, args); va_end (args); fprintf (stderr, "\n%s\n", buf); abort (); } __u32 misc_random (void) { srandom (time (0)); return random (); } /* this implements binary search in the array 'base' among 'num' elements each of those is 'width' bytes long. 'comp_func' is used to compare keys */ int misc_bin_search (const void * key, void * base, __u32 num, int width, int * ppos, misc_comp_func_t comp_func) { __u32 rbound, lbound, j; int ret; if (num == 0 || base == NULL) { /* objectid map may be 0 elements long */ *ppos = 0; return 0; } lbound = 0; rbound = num - 1; for (j = (rbound + lbound) / 2; lbound <= rbound; j = (rbound + lbound) / 2) { ret = comp_func ((void *)((char *)base + j * width), key ) ; if (ret < 0) { /* second is greater */ lbound = j + 1; continue; } else if (ret > 0) { /* first is greater */ if (j == 0) break; rbound = j - 1; continue; } else { /* equal */ *ppos = j; return 1; } } *ppos = lbound; return 0; } #define BLOCKLIST__ELEMENT_NUMBER 10 /*element is block number and device*/ int blockdev_list_compare (const void * block1, const void * block2) { if (*(__u32 *)block1 < *(__u32 *)block2) return -1; if (*(__u32 *)block1 > *(__u32 *)block2) return 1; if (*((__u32 *)block1 + 1) < *((__u32 *)block2 + 1)) return -1; if (*((__u32 *)block1 + 1) > *((__u32 *)block2 + 1)) return 1; return 0; } void blocklist__insert_in_position (void *elem, void **base, __u32 *count, int elem_size, int *position) { if (elem_size == 0) return; if (*base == NULL) *base = misc_getmem (BLOCKLIST__ELEMENT_NUMBER * elem_size); if (*count == misc_memsize((void *)*base) / elem_size) *base = misc_expandmem (*base, misc_memsize((void *)*base), BLOCKLIST__ELEMENT_NUMBER * elem_size); if (*position < *count) { memmove (*base + (*position + 1), *base + (*position), (*count - *position) * elem_size); } memcpy (*base + (char) *position * elem_size, elem, elem_size); *count+=1; } int misc_device_rdev_match(char *path, void *data) { dev_t *rdev = (dev_t *)data; struct stat st; /* If stat fails just continue walking. */ if (stat(path, &st)) return 0; /* Only block files are interesting. */ if (!S_ISBLK(st.st_mode)) return 0; /* Matched rdev wanted. */ if (st.st_rdev != *rdev) return 0; /* Stop walking. */ return 1; } /* The method walks through all subtree of the path, open all directories and walk through them recursevely. Return values: positive: stop walking; negative: error occured. */ int misc_dir_walk(char *path, dir_walk_func_t func, void *data) { struct dirent *dirent; struct stat st; off_t pos; DIR *dir; int len; int res; strcat(path, "/"); if (!(dir = opendir(path))) return 0; len = strlen(path); while ((dirent = readdir(dir)) != NULL) { path[len] = 0; if (strcmp(dirent->d_name, ".") == 0 || strcmp(dirent->d_name, "..") == 0) { continue; } strcat(path, dirent->d_name); if ((res = func(path, data))) { closedir(dir); return res; } if (stat(path, &st) != 0) continue; if ((S_ISDIR(st.st_mode))) { pos = telldir(dir); closedir(dir); if ((res = misc_dir_walk(path, func, data))) return res; path[len] = 0; if (!(dir = opendir(path))) return -1; seekdir(dir, pos); } } closedir(dir); return 0; } reiserfsprogs-3.6.20/libreiserfs/0000777000175300001440000000000010412227616014015 500000000000000reiserfsprogs-3.6.20/libreiserfs/Makefile.am0000644000175300001440000000171510412227267015773 00000000000000libreiserfs_sources = badblock.c fix_node.c leaf.c stat.c \ bitmap.c hash.c leaf_balance.c buffer.c \ internal.c libreiserfs.c internal_balance.c super.c \ direntry.c node.c tree.c extent.c \ journal.c objmap.c tree_balance.c filesystem.c \ key.c prints.c #lib_LIBRARIES = libreiserfs.la noinst_LIBRARIES = libreiserfs-static.a #libreiserfs_la_LIBADD = $(top_builddir)/libmisc/libmisc-static.la #libreiserfs_la_SOURCES = $(libreiserfs_sources) # libreiserfs_la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ # -release $(LT_RELEASE) #libreiserfs_la_CFLAGS = @CFLAGS@ libreiserfs_static_a_LIBADD = $(top_builddir)/libmisc/libmisc-static.a libreiserfs_static_a_SOURCES = $(libreiserfs_sources) #libreiserfs_static_a_LDFLAGS = -static libreiserfs_static_a_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include reiserfsprogs-3.6.20/libreiserfs/Makefile.in0000644000175300001440000017116010412227366016006 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = $(libreiserfs_static_a_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libreiserfs DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libreiserfs_static_a_AR = $(AR) $(ARFLAGS) libreiserfs_static_a_DEPENDENCIES = \ $(top_builddir)/libmisc/libmisc-static.a am__objects_1 = libreiserfs_static_a-badblock.$(OBJEXT) \ libreiserfs_static_a-fix_node.$(OBJEXT) \ libreiserfs_static_a-leaf.$(OBJEXT) \ libreiserfs_static_a-stat.$(OBJEXT) \ libreiserfs_static_a-bitmap.$(OBJEXT) \ libreiserfs_static_a-hash.$(OBJEXT) \ libreiserfs_static_a-leaf_balance.$(OBJEXT) \ libreiserfs_static_a-buffer.$(OBJEXT) \ libreiserfs_static_a-internal.$(OBJEXT) \ libreiserfs_static_a-libreiserfs.$(OBJEXT) \ libreiserfs_static_a-internal_balance.$(OBJEXT) \ libreiserfs_static_a-super.$(OBJEXT) \ libreiserfs_static_a-direntry.$(OBJEXT) \ libreiserfs_static_a-node.$(OBJEXT) \ libreiserfs_static_a-tree.$(OBJEXT) \ libreiserfs_static_a-extent.$(OBJEXT) \ libreiserfs_static_a-journal.$(OBJEXT) \ libreiserfs_static_a-objmap.$(OBJEXT) \ libreiserfs_static_a-tree_balance.$(OBJEXT) \ libreiserfs_static_a-filesystem.$(OBJEXT) \ libreiserfs_static_a-key.$(OBJEXT) \ libreiserfs_static_a-prints.$(OBJEXT) am_libreiserfs_static_a_OBJECTS = $(am__objects_1) libreiserfs_static_a_OBJECTS = $(am_libreiserfs_static_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libreiserfs_static_a_SOURCES) DIST_SOURCES = $(libreiserfs_static_a_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ libreiserfs_sources = badblock.c fix_node.c leaf.c stat.c \ bitmap.c hash.c leaf_balance.c buffer.c \ internal.c libreiserfs.c internal_balance.c super.c \ direntry.c node.c tree.c extent.c \ journal.c objmap.c tree_balance.c filesystem.c \ key.c prints.c #lib_LIBRARIES = libreiserfs.la noinst_LIBRARIES = libreiserfs-static.a #libreiserfs_la_LIBADD = $(top_builddir)/libmisc/libmisc-static.la #libreiserfs_la_SOURCES = $(libreiserfs_sources) # libreiserfs_la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ # -release $(LT_RELEASE) #libreiserfs_la_CFLAGS = @CFLAGS@ libreiserfs_static_a_LIBADD = $(top_builddir)/libmisc/libmisc-static.a libreiserfs_static_a_SOURCES = $(libreiserfs_sources) #libreiserfs_static_a_LDFLAGS = -static libreiserfs_static_a_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libreiserfs/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu libreiserfs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libreiserfs-static.a: $(libreiserfs_static_a_OBJECTS) $(libreiserfs_static_a_DEPENDENCIES) -rm -f libreiserfs-static.a $(libreiserfs_static_a_AR) libreiserfs-static.a $(libreiserfs_static_a_OBJECTS) $(libreiserfs_static_a_LIBADD) $(RANLIB) libreiserfs-static.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-badblock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-bitmap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-buffer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-direntry.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-extent.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-filesystem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-fix_node.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-hash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-internal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-internal_balance.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-journal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-key.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-leaf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-leaf_balance.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-libreiserfs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-node.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-objmap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-prints.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-stat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-super.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-tree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-tree_balance.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` libreiserfs_static_a-badblock.o: badblock.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-badblock.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-badblock.Tpo" -c -o libreiserfs_static_a-badblock.o `test -f 'badblock.c' || echo '$(srcdir)/'`badblock.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-badblock.Tpo" "$(DEPDIR)/libreiserfs_static_a-badblock.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-badblock.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='badblock.c' object='libreiserfs_static_a-badblock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-badblock.o `test -f 'badblock.c' || echo '$(srcdir)/'`badblock.c libreiserfs_static_a-badblock.obj: badblock.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-badblock.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-badblock.Tpo" -c -o libreiserfs_static_a-badblock.obj `if test -f 'badblock.c'; then $(CYGPATH_W) 'badblock.c'; else $(CYGPATH_W) '$(srcdir)/badblock.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-badblock.Tpo" "$(DEPDIR)/libreiserfs_static_a-badblock.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-badblock.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='badblock.c' object='libreiserfs_static_a-badblock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-badblock.obj `if test -f 'badblock.c'; then $(CYGPATH_W) 'badblock.c'; else $(CYGPATH_W) '$(srcdir)/badblock.c'; fi` libreiserfs_static_a-fix_node.o: fix_node.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-fix_node.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-fix_node.Tpo" -c -o libreiserfs_static_a-fix_node.o `test -f 'fix_node.c' || echo '$(srcdir)/'`fix_node.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-fix_node.Tpo" "$(DEPDIR)/libreiserfs_static_a-fix_node.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-fix_node.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fix_node.c' object='libreiserfs_static_a-fix_node.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-fix_node.o `test -f 'fix_node.c' || echo '$(srcdir)/'`fix_node.c libreiserfs_static_a-fix_node.obj: fix_node.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-fix_node.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-fix_node.Tpo" -c -o libreiserfs_static_a-fix_node.obj `if test -f 'fix_node.c'; then $(CYGPATH_W) 'fix_node.c'; else $(CYGPATH_W) '$(srcdir)/fix_node.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-fix_node.Tpo" "$(DEPDIR)/libreiserfs_static_a-fix_node.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-fix_node.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fix_node.c' object='libreiserfs_static_a-fix_node.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-fix_node.obj `if test -f 'fix_node.c'; then $(CYGPATH_W) 'fix_node.c'; else $(CYGPATH_W) '$(srcdir)/fix_node.c'; fi` libreiserfs_static_a-leaf.o: leaf.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-leaf.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-leaf.Tpo" -c -o libreiserfs_static_a-leaf.o `test -f 'leaf.c' || echo '$(srcdir)/'`leaf.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-leaf.Tpo" "$(DEPDIR)/libreiserfs_static_a-leaf.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-leaf.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='leaf.c' object='libreiserfs_static_a-leaf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-leaf.o `test -f 'leaf.c' || echo '$(srcdir)/'`leaf.c libreiserfs_static_a-leaf.obj: leaf.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-leaf.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-leaf.Tpo" -c -o libreiserfs_static_a-leaf.obj `if test -f 'leaf.c'; then $(CYGPATH_W) 'leaf.c'; else $(CYGPATH_W) '$(srcdir)/leaf.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-leaf.Tpo" "$(DEPDIR)/libreiserfs_static_a-leaf.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-leaf.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='leaf.c' object='libreiserfs_static_a-leaf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-leaf.obj `if test -f 'leaf.c'; then $(CYGPATH_W) 'leaf.c'; else $(CYGPATH_W) '$(srcdir)/leaf.c'; fi` libreiserfs_static_a-stat.o: stat.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-stat.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-stat.Tpo" -c -o libreiserfs_static_a-stat.o `test -f 'stat.c' || echo '$(srcdir)/'`stat.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-stat.Tpo" "$(DEPDIR)/libreiserfs_static_a-stat.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-stat.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stat.c' object='libreiserfs_static_a-stat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-stat.o `test -f 'stat.c' || echo '$(srcdir)/'`stat.c libreiserfs_static_a-stat.obj: stat.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-stat.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-stat.Tpo" -c -o libreiserfs_static_a-stat.obj `if test -f 'stat.c'; then $(CYGPATH_W) 'stat.c'; else $(CYGPATH_W) '$(srcdir)/stat.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-stat.Tpo" "$(DEPDIR)/libreiserfs_static_a-stat.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-stat.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stat.c' object='libreiserfs_static_a-stat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-stat.obj `if test -f 'stat.c'; then $(CYGPATH_W) 'stat.c'; else $(CYGPATH_W) '$(srcdir)/stat.c'; fi` libreiserfs_static_a-bitmap.o: bitmap.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-bitmap.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-bitmap.Tpo" -c -o libreiserfs_static_a-bitmap.o `test -f 'bitmap.c' || echo '$(srcdir)/'`bitmap.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-bitmap.Tpo" "$(DEPDIR)/libreiserfs_static_a-bitmap.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-bitmap.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bitmap.c' object='libreiserfs_static_a-bitmap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-bitmap.o `test -f 'bitmap.c' || echo '$(srcdir)/'`bitmap.c libreiserfs_static_a-bitmap.obj: bitmap.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-bitmap.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-bitmap.Tpo" -c -o libreiserfs_static_a-bitmap.obj `if test -f 'bitmap.c'; then $(CYGPATH_W) 'bitmap.c'; else $(CYGPATH_W) '$(srcdir)/bitmap.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-bitmap.Tpo" "$(DEPDIR)/libreiserfs_static_a-bitmap.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-bitmap.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bitmap.c' object='libreiserfs_static_a-bitmap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-bitmap.obj `if test -f 'bitmap.c'; then $(CYGPATH_W) 'bitmap.c'; else $(CYGPATH_W) '$(srcdir)/bitmap.c'; fi` libreiserfs_static_a-hash.o: hash.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-hash.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-hash.Tpo" -c -o libreiserfs_static_a-hash.o `test -f 'hash.c' || echo '$(srcdir)/'`hash.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-hash.Tpo" "$(DEPDIR)/libreiserfs_static_a-hash.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-hash.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hash.c' object='libreiserfs_static_a-hash.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-hash.o `test -f 'hash.c' || echo '$(srcdir)/'`hash.c libreiserfs_static_a-hash.obj: hash.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-hash.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-hash.Tpo" -c -o libreiserfs_static_a-hash.obj `if test -f 'hash.c'; then $(CYGPATH_W) 'hash.c'; else $(CYGPATH_W) '$(srcdir)/hash.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-hash.Tpo" "$(DEPDIR)/libreiserfs_static_a-hash.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-hash.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hash.c' object='libreiserfs_static_a-hash.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-hash.obj `if test -f 'hash.c'; then $(CYGPATH_W) 'hash.c'; else $(CYGPATH_W) '$(srcdir)/hash.c'; fi` libreiserfs_static_a-leaf_balance.o: leaf_balance.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-leaf_balance.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Tpo" -c -o libreiserfs_static_a-leaf_balance.o `test -f 'leaf_balance.c' || echo '$(srcdir)/'`leaf_balance.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Tpo" "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='leaf_balance.c' object='libreiserfs_static_a-leaf_balance.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-leaf_balance.o `test -f 'leaf_balance.c' || echo '$(srcdir)/'`leaf_balance.c libreiserfs_static_a-leaf_balance.obj: leaf_balance.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-leaf_balance.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Tpo" -c -o libreiserfs_static_a-leaf_balance.obj `if test -f 'leaf_balance.c'; then $(CYGPATH_W) 'leaf_balance.c'; else $(CYGPATH_W) '$(srcdir)/leaf_balance.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Tpo" "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='leaf_balance.c' object='libreiserfs_static_a-leaf_balance.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-leaf_balance.obj `if test -f 'leaf_balance.c'; then $(CYGPATH_W) 'leaf_balance.c'; else $(CYGPATH_W) '$(srcdir)/leaf_balance.c'; fi` libreiserfs_static_a-buffer.o: buffer.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-buffer.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-buffer.Tpo" -c -o libreiserfs_static_a-buffer.o `test -f 'buffer.c' || echo '$(srcdir)/'`buffer.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-buffer.Tpo" "$(DEPDIR)/libreiserfs_static_a-buffer.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-buffer.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='buffer.c' object='libreiserfs_static_a-buffer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-buffer.o `test -f 'buffer.c' || echo '$(srcdir)/'`buffer.c libreiserfs_static_a-buffer.obj: buffer.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-buffer.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-buffer.Tpo" -c -o libreiserfs_static_a-buffer.obj `if test -f 'buffer.c'; then $(CYGPATH_W) 'buffer.c'; else $(CYGPATH_W) '$(srcdir)/buffer.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-buffer.Tpo" "$(DEPDIR)/libreiserfs_static_a-buffer.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-buffer.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='buffer.c' object='libreiserfs_static_a-buffer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-buffer.obj `if test -f 'buffer.c'; then $(CYGPATH_W) 'buffer.c'; else $(CYGPATH_W) '$(srcdir)/buffer.c'; fi` libreiserfs_static_a-internal.o: internal.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-internal.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-internal.Tpo" -c -o libreiserfs_static_a-internal.o `test -f 'internal.c' || echo '$(srcdir)/'`internal.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-internal.Tpo" "$(DEPDIR)/libreiserfs_static_a-internal.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-internal.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='internal.c' object='libreiserfs_static_a-internal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-internal.o `test -f 'internal.c' || echo '$(srcdir)/'`internal.c libreiserfs_static_a-internal.obj: internal.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-internal.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-internal.Tpo" -c -o libreiserfs_static_a-internal.obj `if test -f 'internal.c'; then $(CYGPATH_W) 'internal.c'; else $(CYGPATH_W) '$(srcdir)/internal.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-internal.Tpo" "$(DEPDIR)/libreiserfs_static_a-internal.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-internal.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='internal.c' object='libreiserfs_static_a-internal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-internal.obj `if test -f 'internal.c'; then $(CYGPATH_W) 'internal.c'; else $(CYGPATH_W) '$(srcdir)/internal.c'; fi` libreiserfs_static_a-libreiserfs.o: libreiserfs.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-libreiserfs.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Tpo" -c -o libreiserfs_static_a-libreiserfs.o `test -f 'libreiserfs.c' || echo '$(srcdir)/'`libreiserfs.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Tpo" "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libreiserfs.c' object='libreiserfs_static_a-libreiserfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-libreiserfs.o `test -f 'libreiserfs.c' || echo '$(srcdir)/'`libreiserfs.c libreiserfs_static_a-libreiserfs.obj: libreiserfs.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-libreiserfs.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Tpo" -c -o libreiserfs_static_a-libreiserfs.obj `if test -f 'libreiserfs.c'; then $(CYGPATH_W) 'libreiserfs.c'; else $(CYGPATH_W) '$(srcdir)/libreiserfs.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Tpo" "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libreiserfs.c' object='libreiserfs_static_a-libreiserfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-libreiserfs.obj `if test -f 'libreiserfs.c'; then $(CYGPATH_W) 'libreiserfs.c'; else $(CYGPATH_W) '$(srcdir)/libreiserfs.c'; fi` libreiserfs_static_a-internal_balance.o: internal_balance.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-internal_balance.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-internal_balance.Tpo" -c -o libreiserfs_static_a-internal_balance.o `test -f 'internal_balance.c' || echo '$(srcdir)/'`internal_balance.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-internal_balance.Tpo" "$(DEPDIR)/libreiserfs_static_a-internal_balance.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-internal_balance.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='internal_balance.c' object='libreiserfs_static_a-internal_balance.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-internal_balance.o `test -f 'internal_balance.c' || echo '$(srcdir)/'`internal_balance.c libreiserfs_static_a-internal_balance.obj: internal_balance.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-internal_balance.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-internal_balance.Tpo" -c -o libreiserfs_static_a-internal_balance.obj `if test -f 'internal_balance.c'; then $(CYGPATH_W) 'internal_balance.c'; else $(CYGPATH_W) '$(srcdir)/internal_balance.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-internal_balance.Tpo" "$(DEPDIR)/libreiserfs_static_a-internal_balance.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-internal_balance.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='internal_balance.c' object='libreiserfs_static_a-internal_balance.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-internal_balance.obj `if test -f 'internal_balance.c'; then $(CYGPATH_W) 'internal_balance.c'; else $(CYGPATH_W) '$(srcdir)/internal_balance.c'; fi` libreiserfs_static_a-super.o: super.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-super.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-super.Tpo" -c -o libreiserfs_static_a-super.o `test -f 'super.c' || echo '$(srcdir)/'`super.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-super.Tpo" "$(DEPDIR)/libreiserfs_static_a-super.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-super.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='super.c' object='libreiserfs_static_a-super.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-super.o `test -f 'super.c' || echo '$(srcdir)/'`super.c libreiserfs_static_a-super.obj: super.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-super.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-super.Tpo" -c -o libreiserfs_static_a-super.obj `if test -f 'super.c'; then $(CYGPATH_W) 'super.c'; else $(CYGPATH_W) '$(srcdir)/super.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-super.Tpo" "$(DEPDIR)/libreiserfs_static_a-super.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-super.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='super.c' object='libreiserfs_static_a-super.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-super.obj `if test -f 'super.c'; then $(CYGPATH_W) 'super.c'; else $(CYGPATH_W) '$(srcdir)/super.c'; fi` libreiserfs_static_a-direntry.o: direntry.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-direntry.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-direntry.Tpo" -c -o libreiserfs_static_a-direntry.o `test -f 'direntry.c' || echo '$(srcdir)/'`direntry.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-direntry.Tpo" "$(DEPDIR)/libreiserfs_static_a-direntry.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-direntry.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='direntry.c' object='libreiserfs_static_a-direntry.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-direntry.o `test -f 'direntry.c' || echo '$(srcdir)/'`direntry.c libreiserfs_static_a-direntry.obj: direntry.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-direntry.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-direntry.Tpo" -c -o libreiserfs_static_a-direntry.obj `if test -f 'direntry.c'; then $(CYGPATH_W) 'direntry.c'; else $(CYGPATH_W) '$(srcdir)/direntry.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-direntry.Tpo" "$(DEPDIR)/libreiserfs_static_a-direntry.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-direntry.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='direntry.c' object='libreiserfs_static_a-direntry.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-direntry.obj `if test -f 'direntry.c'; then $(CYGPATH_W) 'direntry.c'; else $(CYGPATH_W) '$(srcdir)/direntry.c'; fi` libreiserfs_static_a-node.o: node.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-node.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-node.Tpo" -c -o libreiserfs_static_a-node.o `test -f 'node.c' || echo '$(srcdir)/'`node.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-node.Tpo" "$(DEPDIR)/libreiserfs_static_a-node.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-node.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='node.c' object='libreiserfs_static_a-node.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-node.o `test -f 'node.c' || echo '$(srcdir)/'`node.c libreiserfs_static_a-node.obj: node.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-node.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-node.Tpo" -c -o libreiserfs_static_a-node.obj `if test -f 'node.c'; then $(CYGPATH_W) 'node.c'; else $(CYGPATH_W) '$(srcdir)/node.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-node.Tpo" "$(DEPDIR)/libreiserfs_static_a-node.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-node.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='node.c' object='libreiserfs_static_a-node.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-node.obj `if test -f 'node.c'; then $(CYGPATH_W) 'node.c'; else $(CYGPATH_W) '$(srcdir)/node.c'; fi` libreiserfs_static_a-tree.o: tree.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-tree.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-tree.Tpo" -c -o libreiserfs_static_a-tree.o `test -f 'tree.c' || echo '$(srcdir)/'`tree.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-tree.Tpo" "$(DEPDIR)/libreiserfs_static_a-tree.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-tree.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tree.c' object='libreiserfs_static_a-tree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-tree.o `test -f 'tree.c' || echo '$(srcdir)/'`tree.c libreiserfs_static_a-tree.obj: tree.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-tree.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-tree.Tpo" -c -o libreiserfs_static_a-tree.obj `if test -f 'tree.c'; then $(CYGPATH_W) 'tree.c'; else $(CYGPATH_W) '$(srcdir)/tree.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-tree.Tpo" "$(DEPDIR)/libreiserfs_static_a-tree.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-tree.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tree.c' object='libreiserfs_static_a-tree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-tree.obj `if test -f 'tree.c'; then $(CYGPATH_W) 'tree.c'; else $(CYGPATH_W) '$(srcdir)/tree.c'; fi` libreiserfs_static_a-extent.o: extent.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-extent.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-extent.Tpo" -c -o libreiserfs_static_a-extent.o `test -f 'extent.c' || echo '$(srcdir)/'`extent.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-extent.Tpo" "$(DEPDIR)/libreiserfs_static_a-extent.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-extent.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extent.c' object='libreiserfs_static_a-extent.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-extent.o `test -f 'extent.c' || echo '$(srcdir)/'`extent.c libreiserfs_static_a-extent.obj: extent.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-extent.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-extent.Tpo" -c -o libreiserfs_static_a-extent.obj `if test -f 'extent.c'; then $(CYGPATH_W) 'extent.c'; else $(CYGPATH_W) '$(srcdir)/extent.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-extent.Tpo" "$(DEPDIR)/libreiserfs_static_a-extent.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-extent.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extent.c' object='libreiserfs_static_a-extent.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-extent.obj `if test -f 'extent.c'; then $(CYGPATH_W) 'extent.c'; else $(CYGPATH_W) '$(srcdir)/extent.c'; fi` libreiserfs_static_a-journal.o: journal.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-journal.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-journal.Tpo" -c -o libreiserfs_static_a-journal.o `test -f 'journal.c' || echo '$(srcdir)/'`journal.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-journal.Tpo" "$(DEPDIR)/libreiserfs_static_a-journal.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-journal.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='journal.c' object='libreiserfs_static_a-journal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-journal.o `test -f 'journal.c' || echo '$(srcdir)/'`journal.c libreiserfs_static_a-journal.obj: journal.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-journal.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-journal.Tpo" -c -o libreiserfs_static_a-journal.obj `if test -f 'journal.c'; then $(CYGPATH_W) 'journal.c'; else $(CYGPATH_W) '$(srcdir)/journal.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-journal.Tpo" "$(DEPDIR)/libreiserfs_static_a-journal.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-journal.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='journal.c' object='libreiserfs_static_a-journal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-journal.obj `if test -f 'journal.c'; then $(CYGPATH_W) 'journal.c'; else $(CYGPATH_W) '$(srcdir)/journal.c'; fi` libreiserfs_static_a-objmap.o: objmap.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-objmap.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-objmap.Tpo" -c -o libreiserfs_static_a-objmap.o `test -f 'objmap.c' || echo '$(srcdir)/'`objmap.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-objmap.Tpo" "$(DEPDIR)/libreiserfs_static_a-objmap.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-objmap.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='objmap.c' object='libreiserfs_static_a-objmap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-objmap.o `test -f 'objmap.c' || echo '$(srcdir)/'`objmap.c libreiserfs_static_a-objmap.obj: objmap.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-objmap.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-objmap.Tpo" -c -o libreiserfs_static_a-objmap.obj `if test -f 'objmap.c'; then $(CYGPATH_W) 'objmap.c'; else $(CYGPATH_W) '$(srcdir)/objmap.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-objmap.Tpo" "$(DEPDIR)/libreiserfs_static_a-objmap.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-objmap.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='objmap.c' object='libreiserfs_static_a-objmap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-objmap.obj `if test -f 'objmap.c'; then $(CYGPATH_W) 'objmap.c'; else $(CYGPATH_W) '$(srcdir)/objmap.c'; fi` libreiserfs_static_a-tree_balance.o: tree_balance.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-tree_balance.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-tree_balance.Tpo" -c -o libreiserfs_static_a-tree_balance.o `test -f 'tree_balance.c' || echo '$(srcdir)/'`tree_balance.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-tree_balance.Tpo" "$(DEPDIR)/libreiserfs_static_a-tree_balance.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-tree_balance.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tree_balance.c' object='libreiserfs_static_a-tree_balance.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-tree_balance.o `test -f 'tree_balance.c' || echo '$(srcdir)/'`tree_balance.c libreiserfs_static_a-tree_balance.obj: tree_balance.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-tree_balance.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-tree_balance.Tpo" -c -o libreiserfs_static_a-tree_balance.obj `if test -f 'tree_balance.c'; then $(CYGPATH_W) 'tree_balance.c'; else $(CYGPATH_W) '$(srcdir)/tree_balance.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-tree_balance.Tpo" "$(DEPDIR)/libreiserfs_static_a-tree_balance.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-tree_balance.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tree_balance.c' object='libreiserfs_static_a-tree_balance.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-tree_balance.obj `if test -f 'tree_balance.c'; then $(CYGPATH_W) 'tree_balance.c'; else $(CYGPATH_W) '$(srcdir)/tree_balance.c'; fi` libreiserfs_static_a-filesystem.o: filesystem.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-filesystem.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-filesystem.Tpo" -c -o libreiserfs_static_a-filesystem.o `test -f 'filesystem.c' || echo '$(srcdir)/'`filesystem.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-filesystem.Tpo" "$(DEPDIR)/libreiserfs_static_a-filesystem.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-filesystem.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='filesystem.c' object='libreiserfs_static_a-filesystem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-filesystem.o `test -f 'filesystem.c' || echo '$(srcdir)/'`filesystem.c libreiserfs_static_a-filesystem.obj: filesystem.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-filesystem.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-filesystem.Tpo" -c -o libreiserfs_static_a-filesystem.obj `if test -f 'filesystem.c'; then $(CYGPATH_W) 'filesystem.c'; else $(CYGPATH_W) '$(srcdir)/filesystem.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-filesystem.Tpo" "$(DEPDIR)/libreiserfs_static_a-filesystem.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-filesystem.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='filesystem.c' object='libreiserfs_static_a-filesystem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-filesystem.obj `if test -f 'filesystem.c'; then $(CYGPATH_W) 'filesystem.c'; else $(CYGPATH_W) '$(srcdir)/filesystem.c'; fi` libreiserfs_static_a-key.o: key.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-key.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-key.Tpo" -c -o libreiserfs_static_a-key.o `test -f 'key.c' || echo '$(srcdir)/'`key.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-key.Tpo" "$(DEPDIR)/libreiserfs_static_a-key.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-key.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='key.c' object='libreiserfs_static_a-key.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-key.o `test -f 'key.c' || echo '$(srcdir)/'`key.c libreiserfs_static_a-key.obj: key.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-key.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-key.Tpo" -c -o libreiserfs_static_a-key.obj `if test -f 'key.c'; then $(CYGPATH_W) 'key.c'; else $(CYGPATH_W) '$(srcdir)/key.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-key.Tpo" "$(DEPDIR)/libreiserfs_static_a-key.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-key.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='key.c' object='libreiserfs_static_a-key.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-key.obj `if test -f 'key.c'; then $(CYGPATH_W) 'key.c'; else $(CYGPATH_W) '$(srcdir)/key.c'; fi` libreiserfs_static_a-prints.o: prints.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-prints.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-prints.Tpo" -c -o libreiserfs_static_a-prints.o `test -f 'prints.c' || echo '$(srcdir)/'`prints.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-prints.Tpo" "$(DEPDIR)/libreiserfs_static_a-prints.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-prints.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prints.c' object='libreiserfs_static_a-prints.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-prints.o `test -f 'prints.c' || echo '$(srcdir)/'`prints.c libreiserfs_static_a-prints.obj: prints.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-prints.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-prints.Tpo" -c -o libreiserfs_static_a-prints.obj `if test -f 'prints.c'; then $(CYGPATH_W) 'prints.c'; else $(CYGPATH_W) '$(srcdir)/prints.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libreiserfs_static_a-prints.Tpo" "$(DEPDIR)/libreiserfs_static_a-prints.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-prints.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prints.c' object='libreiserfs_static_a-prints.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-prints.obj `if test -f 'prints.c'; then $(CYGPATH_W) 'prints.c'; else $(CYGPATH_W) '$(srcdir)/prints.c'; fi` uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/libreiserfs/badblock.c0000644000175300001440000001246110412227267015644 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #include "misc/unaligned.h" #include "misc/misc.h" reiserfs_key_t badblock_key = {REISERFS_BAD_DID, REISERFS_BAD_OID, {{0, 0},}}; void reiserfs_badblock_traverse(reiserfs_filsys_t * fs, badblock_func_t action, void *data) { reiserfs_path_t badblock_path; reiserfs_key_t rd_key = badblock_key; const reiserfs_key_t *key; badblock_path.path_length = REISERFS_PATH_OFFILL; reiserfs_key_set_sec (KEY_FORMAT_2, &badblock_key, 1, TYPE_EXTENT); while (1) { if (reiserfs_tree_search_item (fs, &rd_key, &badblock_path) == IO_ERROR) { fprintf (stderr, "%s: Some problems while searching by the key " "occured. Probably due to tree corruptions.\n", __FUNCTION__); reiserfs_tree_pathrelse (&badblock_path); break; } if (reiserfs_nh_get_items (NODE_HEAD (REISERFS_PATH_LEAF (&badblock_path))) <= REISERFS_PATH_LEAF_POS (&badblock_path)) { reiserfs_tree_pathrelse (&badblock_path); break; } rd_key = REISERFS_PATH_IH(&badblock_path)->ih_key; if (reiserfs_key_get_did(&rd_key) != REISERFS_BAD_DID || reiserfs_key_get_oid(&rd_key) != REISERFS_BAD_OID || !reiserfs_key_ext(&rd_key)) { reiserfs_tree_pathrelse (&badblock_path); break; } if ((key = reiserfs_tree_next_key(&badblock_path, fs))) rd_key = *key; else memset(&rd_key, 0, sizeof(rd_key)); action(fs, &badblock_path, data); if (reiserfs_key_get_did(&rd_key) == 0) break; } } static void callback_badblock_rm(reiserfs_filsys_t *fs, reiserfs_path_t *badblock_path, void *data) { reiserfs_tb_t tb; reiserfs_ih_t * tmp_ih; tmp_ih = REISERFS_PATH_IH(badblock_path); memset (REISERFS_PATH_ITEM (badblock_path), 0, reiserfs_ih_get_len (tmp_ih)); reiserfs_tb_init (&tb, fs, badblock_path, -(REISERFS_IH_SIZE + reiserfs_ih_get_len(REISERFS_PATH_IH(badblock_path)))); if (reiserfs_fix_nodes (M_DELETE, &tb, 0) != CARRY_ON) misc_die ("%s: reiserfs_fix_nodes failed", __FUNCTION__); reiserfs_tb_balance (&tb, 0, 0, M_DELETE, 0/*zero num*/); } void reiserfs_badblock_extract(reiserfs_filsys_t *fs, reiserfs_path_t *badblock_path, void *data) { reiserfs_ih_t *tmp_ih; __u32 *ind_item; __u32 i; if (!fs->fs_badblocks_bm) { fs->fs_badblocks_bm = reiserfs_bitmap_create(reiserfs_sb_get_blocks(fs->fs_ondisk_sb)); reiserfs_bitmap_zero (fs->fs_badblocks_bm); } tmp_ih = REISERFS_PATH_IH(badblock_path); ind_item = (__u32 *)REISERFS_PATH_ITEM(badblock_path); for (i = 0; i < reiserfs_ext_count(tmp_ih); i++) { reiserfs_bitmap_set_bit(fs->fs_badblocks_bm, d32_get(ind_item, i)); } reiserfs_tree_pathrelse (badblock_path); } static int reiserfs_alloc_blocks (reiserfs_filsys_t * fs, unsigned long *blknr, unsigned long start, int count) { int i; for (i = 0; i < count; i ++) { blknr[i] = 0; if (reiserfs_bitmap_find_zero_bit(fs->fs_bitmap2, blknr + i)) misc_die ("%s: failed to allocate a block.", __FUNCTION__); reiserfs_bitmap_set_bit(fs->fs_bitmap2, blknr[i]); } return CARRY_ON; } void reiserfs_badblock_flush (reiserfs_filsys_t * fs, int replace) { reiserfs_tb_t tb; reiserfs_path_t badblock_path; reiserfs_ih_t badblock_ih; __u32 ni; __u64 offset; __u32 i, j; if (fs->fs_badblocks_bm == NULL) return; /* delete all items with badblock_key */ if (replace) reiserfs_badblock_traverse(fs, callback_badblock_rm, NULL); memset(&badblock_ih, 0, sizeof(badblock_ih)); reiserfs_ih_set_format (&badblock_ih, KEY_FORMAT_2); reiserfs_ih_set_len (&badblock_ih, REISERFS_EXT_SIZE); reiserfs_ih_set_free (&badblock_ih, 0); reiserfs_ih_set_loc (&badblock_ih, 0); reiserfs_key_set_did (&badblock_ih.ih_key, REISERFS_BAD_DID); reiserfs_key_set_oid (&badblock_ih.ih_key, REISERFS_BAD_OID); reiserfs_key_set_type (KEY_FORMAT_2, &badblock_ih.ih_key, TYPE_EXTENT); j = 0; fs->block_allocator = reiserfs_alloc_blocks; /* insert all badblock pointers */ for (i = 0; i < fs->fs_badblocks_bm->bm_bit_size; i++) { int retval; if (!reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i)) continue; offset = j * fs->fs_blocksize + 1; reiserfs_key_set_off (KEY_FORMAT_2, &badblock_ih.ih_key, offset); ni = cpu_to_le32 (i); retval = reiserfs_tree_search_position (fs, &badblock_ih.ih_key, &badblock_path); switch (retval) { case (FILE_NOT_FOUND): reiserfs_tb_init (&tb, fs, &badblock_path, REISERFS_IH_SIZE + reiserfs_ih_get_len(&badblock_ih)); if (reiserfs_fix_nodes (M_INSERT, &tb, &badblock_ih) != CARRY_ON) misc_die ("reiserfs_badblock_flush: reiserfs_fix_nodes failed"); reiserfs_tb_balance (&tb, &badblock_ih, (void *)&ni , M_INSERT, 0); break; case (POSITION_NOT_FOUND): case (POSITION_FOUND): /* Insert the new item to the found position. */ reiserfs_tb_init (&tb, fs, &badblock_path, REISERFS_EXT_SIZE); if (reiserfs_fix_nodes (M_PASTE, &tb, 0) != CARRY_ON) misc_die ("reiserfs_badblock_flush: reiserfs_fix_nodes failed"); reiserfs_tb_balance (&tb, 0, (const char *)&ni, M_PASTE, 0); break; } j++; } } reiserfsprogs-3.6.20/libreiserfs/bitmap.c0000644000175300001440000004355610412227267015370 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #include "misc/malloc.h" #include #include /* create clean bitmap */ reiserfs_bitmap_t * reiserfs_bitmap_create (unsigned int bit_count) { reiserfs_bitmap_t * bm; bm = misc_getmem (sizeof (*bm)); if (!bm) return 0; bm->bm_bit_size = bit_count; bm->bm_byte_size = ((unsigned long long)bit_count + 7) / 8; bm->bm_map = misc_getmem (bm->bm_byte_size); if (!bm->bm_map) { misc_freemem (bm); return 0; } return bm; } /* read every bitmap block and copy their content into bitmap 'bm' */ static int reiserfs_bitmap_fetch (reiserfs_bitmap_t * bm, reiserfs_filsys_t * fs) { unsigned int last_byte_unused_bits; unsigned long block, to_copy; reiserfs_bh_t * bh; unsigned int i; int copied; int ret = 0; char * p; to_copy = (reiserfs_sb_get_blocks (fs->fs_ondisk_sb) + 7) / 8; /*reiserfs_warning (stderr, "Fetching on-disk bitmap..");*/ assert (bm->bm_byte_size == to_copy); copied = fs->fs_blocksize; p = bm->bm_map; block = fs->fs_super_bh->b_blocknr + 1; while (to_copy) { bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize); if (!bh) { reiserfs_warning (stderr, "reiserfs_bitmap_fetch: " "reiserfs_buffer_read failed reading bitmap " "(%lu)\n", block); bh = reiserfs_buffer_open (fs->fs_dev, block, fs->fs_blocksize); if (!bh) { reiserfs_exit (1, "reiserfs_bitmap_fetch: " "reiserfs_buffer_open failed"); } memset (bh->b_data, 0xff, bh->b_size); reiserfs_buffer_mkuptodate (bh, 1); } if (to_copy < fs->fs_blocksize) { for (i = to_copy; i < fs->fs_blocksize; i++) { if (bh->b_data[i] != (char)0xff) { ret = 1; break; } } copied = to_copy; } memcpy (p, bh->b_data, copied); reiserfs_buffer_close (bh); p += copied; to_copy -= copied; /* next bitmap block */ if (reiserfs_bitmap_spread (fs)) block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8); else block ++; } /* on disk bitmap has bits out of SB_BLOCK_COUNT set to 1, where as reiserfs_bitmap_t has those bits set to 0 */ last_byte_unused_bits = bm->bm_byte_size * 8 - bm->bm_bit_size; for (i = 0; i < last_byte_unused_bits; i ++) { if (misc_test_bit (bm->bm_bit_size + i, bm->bm_map) == 0) ret = 1; else misc_clear_bit (bm->bm_bit_size + i, bm->bm_map); } bm->bm_set_bits = 0; /* FIXME: optimize that */ for (i = 0; i < bm->bm_bit_size; i ++) if (reiserfs_bitmap_test_bit (bm, i)) bm->bm_set_bits ++; bm->bm_dirty = 0; return ret; } /* read bitmap blocks */ int reiserfs_bitmap_open (reiserfs_filsys_t * fs) { unsigned int bmap_nr, count; if (fs->fs_bitmap2) reiserfs_panic ("bitmap is initiaized already"); count = reiserfs_sb_get_blocks (fs->fs_ondisk_sb); fs->fs_bitmap2 = reiserfs_bitmap_create (count); if (!fs->fs_bitmap2) return -1; bmap_nr = reiserfs_bmap_nr(count, fs->fs_blocksize); bmap_nr = reiserfs_bmap_over(bmap_nr) ? 0 : bmap_nr; if (bmap_nr != reiserfs_sb_get_bmaps (fs->fs_ondisk_sb)) { reiserfs_warning (stderr, "%s: wrong either bitmaps number,\n", __FUNCTION__); reiserfs_warning (stderr, "count of blocks or blocksize, run " "with --rebuild-sb to fix it\n"); return -1; } return reiserfs_bitmap_fetch (fs->fs_bitmap2, fs); } /* bitmap destructor */ void reiserfs_bitmap_delete (reiserfs_bitmap_t * bm) { misc_freemem(bm->bm_map); bm->bm_map = NULL; /* to not reuse bitmap handle */ bm->bm_bit_size = 0; bm->bm_byte_size = 0; misc_freemem(bm); } void reiserfs_bitmap_free (reiserfs_filsys_t * fs) { if (fs->fs_bitmap2) { reiserfs_bitmap_delete (fs->fs_bitmap2); fs->fs_bitmap2 = 0; } } void reiserfs_bitmap_close (reiserfs_filsys_t * fs) { if (!fs->fs_bitmap2) return; reiserfs_bitmap_flush (fs->fs_bitmap2, fs); reiserfs_bitmap_free (fs); } /* copy bitmap 'bm' to buffers which hold on-disk bitmap if bitmap was ever changed and return 1. Otherwise - return 0 */ int reiserfs_bitmap_flush (reiserfs_bitmap_t * bm, reiserfs_filsys_t * fs) { unsigned int last_byte_unused_bits, i; unsigned long to_copy, copied, block; reiserfs_bh_t * bh; char * p; /* make sure that the device is big enough */ bh = reiserfs_buffer_read (fs->fs_dev, bm->bm_bit_size - 1, fs->fs_blocksize); if (!bh) { reiserfs_warning (stderr, "reiserfs_bitmap_flush: reiserfs_buffer_read " "failed for block %lu\n", bm->bm_bit_size - 1); /* bh = reiserfs_buffer_open (fs->fs_dev, bm->bm_bit_size - 1, fs->fs_blocksize); if (!bh) reiserfs_panic ("reiserfs_bitmap_flush: reiserfs_buffer_open failed"); reiserfs_buffer_mkuptodate (bh, 1); reiserfs_buffer_mkdirty (bh); reiserfs_buffer_write (bh);*/ } reiserfs_buffer_close (bh); if (!bm->bm_dirty) return 0; to_copy = bm->bm_byte_size; copied = fs->fs_blocksize; p = bm->bm_map; block = fs->fs_super_bh->b_blocknr + 1; while (to_copy) { /* we reiserfs_buffer_read to make sure that filesystem contains enough blocks */ bh = reiserfs_buffer_open (fs->fs_dev, block, fs->fs_blocksize); if (!bh) { reiserfs_exit (1, "Getblk failed for (%lu)\n", block); } memset (bh->b_data, 0xff, bh->b_size); reiserfs_buffer_mkuptodate (bh, 1); if (to_copy < fs->fs_blocksize) copied = to_copy; memcpy (bh->b_data, p, copied); if (copied == to_copy) { /* set unused bits of last byte of a bitmap to 1 */ last_byte_unused_bits = bm->bm_byte_size * 8 - bm->bm_bit_size; for (i = 0; i < last_byte_unused_bits; i ++) misc_set_bit ((bm->bm_bit_size % (fs->fs_blocksize * 8)) + i, bh->b_data); } reiserfs_buffer_mkdirty (bh); reiserfs_buffer_close (bh); p += copied; to_copy -= copied; /* next bitmap block */ if (reiserfs_bitmap_spread (fs)) block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8); else block ++; } return 1; } /* Expand existing bitmap. Return non-zero if can't. FIXME: it is assumed that bit_count is new number of blocks to be addressed */ int reiserfs_bitmap_expand (reiserfs_bitmap_t * bm, unsigned int bit_count) { unsigned int byte_count = ((bit_count + 7) / 8); char * new_map; new_map = misc_expandmem (bm->bm_map, bm->bm_byte_size, byte_count - bm->bm_byte_size); if (!new_map) { return 1; } bm->bm_map = new_map; bm->bm_byte_size = byte_count; bm->bm_bit_size = bit_count; bm->bm_dirty = 1; return 0; } void reiserfs_bitmap_shrink (reiserfs_bitmap_t * bm, unsigned int bit_count) { unsigned long i; assert (bm->bm_bit_size >= bit_count); bm->bm_byte_size = (bit_count + 7) / 8; bm->bm_bit_size = bit_count; bm->bm_set_bits = 0; if (bm->bm_first_zero > bm->bm_bit_size) bm->bm_first_zero = bm->bm_bit_size; bm->bm_dirty = 1; for (i = 0; i < bm->bm_bit_size; i++) { if (reiserfs_bitmap_test_bit(bm, i)) bm->bm_set_bits++; } } void reiserfs_bitmap_copy (reiserfs_bitmap_t * to, reiserfs_bitmap_t * from) { assert (to->bm_byte_size == from->bm_byte_size); memcpy (to->bm_map, from->bm_map, from->bm_byte_size); to->bm_bit_size = from->bm_bit_size; to->bm_set_bits = from->bm_set_bits; to->bm_first_zero = from->bm_first_zero; to->bm_dirty = 1; } int reiserfs_bitmap_compare (reiserfs_bitmap_t * bm1, reiserfs_bitmap_t * bm2) { unsigned long i, diff; unsigned long int bytes, bits; assert (bm1->bm_byte_size == bm2->bm_byte_size && bm1->bm_bit_size == bm2->bm_bit_size); diff = 0; /* compare full bytes */ bytes = bm1->bm_bit_size / 8; bits = bytes * 8; if (memcmp (bm1->bm_map, bm2->bm_map, bytes)) { for (i = 0; i < bits; i ++) if (reiserfs_bitmap_test_bit(bm1, i) != reiserfs_bitmap_test_bit(bm2, i)) { diff ++; } } /* compare last byte of bitmap which can be used partially */ bits = bm1->bm_bit_size % 8; for (i = bm1->bm_bit_size / 8 * 8; i < bm1->bm_bit_size / 8 * 8 + bits; i ++) { if (reiserfs_bitmap_test_bit(bm1, i) != reiserfs_bitmap_test_bit(bm2, i)) { diff ++; } /* int mask; mask = 255 >> (8 - bits); if ((bm1->bm_map [bytes] & mask) != (bm2->bm_map [bytes] & mask)) { diff ++; } */ } return diff; } /* Does X | Y for every bit of the bitmap `to`, where X - bit of the `to` bitmap, Y - `from` bitmap. Save result in the `to` bitmap. */ void reiserfs_bitmap_disjunction (reiserfs_bitmap_t * to, reiserfs_bitmap_t * from) { unsigned int i; assert (to->bm_byte_size == from->bm_byte_size && to->bm_bit_size == from->bm_bit_size); for (i = 0; i < to->bm_bit_size; i++) { if (misc_test_bit(i, from->bm_map) && !misc_test_bit(i, to->bm_map)) { misc_set_bit(i, to->bm_map); to->bm_set_bits ++; to->bm_dirty = 1; } } } /* Does X & !Y for every bit of the bitmap `base`, where X - bit of the `base` bitmap, Y - `exclude` bitmap. Save result in the `base` bitmap. */ void reiserfs_bitmap_delta (reiserfs_bitmap_t * base, reiserfs_bitmap_t * exclude) { unsigned int i; assert (base->bm_byte_size == exclude->bm_byte_size && base->bm_bit_size == exclude->bm_bit_size); for (i = 0; i < base->bm_bit_size; i++) { if (misc_test_bit(i, exclude->bm_map) && misc_test_bit(i, base->bm_map)) { misc_clear_bit(i, base->bm_map); base->bm_set_bits --; base->bm_dirty = 1; } } } void reiserfs_bitmap_set_bit (reiserfs_bitmap_t * bm, unsigned int bit_number) { assert(bit_number < bm->bm_bit_size); if (misc_test_bit (bit_number, bm->bm_map)) return; misc_set_bit(bit_number, bm->bm_map); bm->bm_set_bits ++; bm->bm_dirty = 1; } void reiserfs_bitmap_clear_bit (reiserfs_bitmap_t * bm, unsigned int bit_number) { assert(bit_number < bm->bm_bit_size); if (!misc_test_bit (bit_number, bm->bm_map)) return; misc_clear_bit (bit_number, bm->bm_map); bm->bm_set_bits --; bm->bm_dirty = 1; if (bm->bm_first_zero > bit_number) bm->bm_first_zero = bit_number; } int reiserfs_bitmap_test_bit (reiserfs_bitmap_t * bm, unsigned int bit_number) { if (bit_number >= bm->bm_bit_size) printf ("bit %u, bitsize %lu\n", bit_number, bm->bm_bit_size); assert(bit_number < bm->bm_bit_size); return misc_test_bit(bit_number, bm->bm_map); } int reiserfs_bitmap_find_zero_bit (reiserfs_bitmap_t * bm, unsigned long * first) { unsigned long bit_nr; int upd; assert(*first < bm->bm_bit_size); upd = (bm->bm_first_zero >= *first) ? 1 : 0; bit_nr = misc_find_next_zero_bit(bm->bm_map, bm->bm_bit_size, upd ? bm->bm_first_zero : *first); if (upd) bm->bm_first_zero = bit_nr; if (bit_nr >= bm->bm_bit_size) /* search failed */ return 1; *first = bit_nr; return 0; } void reiserfs_bitmap_zero (reiserfs_bitmap_t * bm) { memset (bm->bm_map, 0, bm->bm_byte_size); bm->bm_set_bits = 0; bm->bm_dirty = 1; bm->bm_first_zero = 0; } void reiserfs_bitmap_fill (reiserfs_bitmap_t * bm) { memset (bm->bm_map, 0xff, bm->bm_byte_size); bm->bm_set_bits = bm->bm_bit_size; bm->bm_dirty = 1; bm->bm_first_zero = bm->bm_set_bits; } void reiserfs_bitmap_invert (reiserfs_bitmap_t * bm) { unsigned int i; /*reiserfs_warning (stderr, "Bitmap inverting..");fflush (stderr);*/ for (i = 0; i < bm->bm_bit_size; i ++) { if (reiserfs_bitmap_test_bit (bm, i)) reiserfs_bitmap_clear_bit (bm, i); else reiserfs_bitmap_set_bit (bm, i); } /*reiserfs_warning (stderr, "done\n");*/ } unsigned int reiserfs_bitmap_zeros (reiserfs_bitmap_t * bm) { return bm->bm_bit_size - bm->bm_set_bits; } unsigned int reiserfs_bitmap_ones (reiserfs_bitmap_t * bm) { return bm->bm_set_bits; } int reiserfs_bitmap_spread (reiserfs_filsys_t * fs) { return fs->fs_super_bh->b_blocknr != 2; } /* format of bitmap saved in a file: magic number (32 bits) bm_bit_size (32 bits) number of ranges of used and free blocks (32 bits) number of contiguously used block, .. of free blocks, used, free, etc magic number (32 bits) */ #define BITMAP_START_MAGIC 374031 #define BITMAP_END_MAGIC 7786472 void reiserfs_bitmap_save (FILE * fp, reiserfs_bitmap_t * bm) { // FILE * fp; __u32 v; int zeros; int count; unsigned int i; int extents; long position; /* fp = fopen (filename, "w+"); if (!fp) { reiserfs_warning (stderr, "reiserfs_bitmap_save: could not save " "bitmap in %s: %s", filename, strerror(errno)); return; }*/ /* reiserfs_warning (stderr, "Saving bitmap in \"%s\" .. ", filename); fflush (stderr);*/ v = BITMAP_START_MAGIC; fwrite (&v, 4, 1, fp); v = bm->bm_bit_size; fwrite (&v, 4, 1, fp); /*printf ("SAVE: bit_size - %d\n", v);*/ position = ftell(fp); if (fseek (fp, 4, SEEK_CUR)) { reiserfs_warning (stderr, "reiserfs_bitmap_save: fseek failed: %s\n", strerror(errno)); // fclose (fp); return; } zeros = 0; count = 0; extents = 0; for (i = 0; i < v; i ++) { if (reiserfs_bitmap_test_bit (bm, i)) { if (zeros) { /* previous bit was not set, write amount of not set bits, switch to count set bits */ fwrite (&count, 4, 1, fp); /*printf ("SAVE: Free %d\n", count);*/ extents ++; count = 1; zeros = 0; } else { /* one more zero bit appeared */ count ++; } } else { /* zero bit found */ if (zeros) { count ++; } else { /* previous bit was set, write amount of set bits, switch to count not set bits */ fwrite (&count, 4, 1, fp); /*printf ("SAVE: Used %d\n", count);*/ extents ++; count = 1; zeros = 1; } } } fwrite (&count, 4, 1, fp); extents ++; /* if (zeros) printf ("SAVE: Free %d\n", count); else printf ("SAVE: Used %d\n", count); */ v = BITMAP_END_MAGIC; fwrite (&v, 4, 1, fp); if (fseek (fp, position, SEEK_SET)) { reiserfs_warning (stderr, "reiserfs_bitmap_save: fseek failed: %s", strerror(errno)); return; } fwrite (&extents, 4, 1, fp); if (fseek (fp, 0, SEEK_END)) { reiserfs_warning (stderr, "reiserfs_bitmap_save: fseek failed: %s", strerror(errno)); return; } } /* format of fsck dump file: after pass0 magic number (32 bits) passed stage number bitmap of leaves bitmap of good_unfm bitmap of bad_unfm magic number (32 bits) */ reiserfs_bitmap_t * reiserfs_bitmap_load (FILE * fp) { // FILE * fp; __u32 v; int count; int i, j; int extents; int bit; reiserfs_bitmap_t * bm; /* fp = fopen (filename, "r"); if (!fp) { reiserfs_warning (stderr, "reiserfs_bitmap_load: fopen failed: %s\n", strerror(errno)); return 0; }*/ fread (&v, 4, 1, fp); if (v != BITMAP_START_MAGIC) { reiserfs_warning (stderr, "reiserfs_bitmap_load: " "no bitmap start magic found"); // fclose (fp); return 0; } /* read bit size of bitmap */ fread (&v, 4, 1, fp); bm = reiserfs_bitmap_create (v); if (!bm) { reiserfs_warning (stderr, "reiserfs_bitmap_load: creation failed"); // fclose (fp); return 0; } /*printf ("LOAD: bit_size - %d\n", v);*/ fread (&extents, 4, 1, fp); /*printf ("LOAD: extents - %d\n", extents);*/ bit = 0; for (i = 0; i < extents; i ++) { fread (&count, 4, 1, fp); /* if (i % 2) printf ("LOAD: Free %d\n", count); else printf ("LOAD: Used %d\n", count); */ for (j = 0; j < count; j ++, bit ++) if (i % 2 == 0) { reiserfs_bitmap_set_bit (bm, bit); } } fread (&v, 4, 1, fp); /*printf ("LOAD: Endmagic %d\n", v);*/ // fclose (fp); if (v != BITMAP_END_MAGIC) { reiserfs_warning (stderr, "reiserfs_bitmap_load: " "no bitmap end magic found"); return 0; } /* reiserfs_warning (stderr, "%d bits set - done\n", reiserfs_bitmap_ones (bm));*/ fflush (stderr); return bm; } int reiserfs_bitmap_block (reiserfs_filsys_t * fs, unsigned long block) { unsigned int bmap_nr; if (reiserfs_bitmap_spread (fs)) { if (!(block % (fs->fs_blocksize * 8))) /* bitmap block */ return 1; return ((REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize + 1) == block); } else { bmap_nr = reiserfs_bmap_nr(reiserfs_sb_get_blocks(fs->fs_ondisk_sb), fs->fs_blocksize); /* bitmap in */ return (block > 2ul && block < 3ul + bmap_nr) ? 1 : 0; } return 0; } /* read bitmap of disk and print details */ void reiserfs_bitmap_print (FILE * fp, reiserfs_filsys_t * fs, int silent) { reiserfs_sb_t * sb; int bmap_nr; int i; int bits_per_block; int blocks; unsigned long block; reiserfs_bh_t * bh; sb = fs->fs_ondisk_sb; bits_per_block = fs->fs_blocksize * 8; blocks = bits_per_block; bmap_nr = reiserfs_bmap_nr(reiserfs_sb_get_blocks(fs->fs_ondisk_sb), fs->fs_blocksize); reiserfs_warning (fp, "Bitmap blocks are:\n"); block = fs->fs_super_bh->b_blocknr + 1; for (i = 0; i < bmap_nr; i ++) { bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize); if (!bh) { reiserfs_warning (stderr, "reiserfs_bitmap_print: reiserfs_buffer_read " "failed for %d: %lu\n", i, block); continue; } if (i == bmap_nr - 1) if (reiserfs_sb_get_blocks (sb) % bits_per_block) blocks = reiserfs_sb_get_blocks (sb) % bits_per_block; reiserfs_print_bmap_block (fp, i, block, bh->b_data, blocks, silent, fs->fs_blocksize); reiserfs_buffer_close (bh); if (reiserfs_bitmap_spread (fs)) block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8); else { block ++; } } } reiserfsprogs-3.6.20/libreiserfs/buffer.c0000644000175300001440000004461410412227267015361 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #include "misc/malloc.h" #include #include #include static int is_bad_block (unsigned long block) { #ifdef IO_FAILURE_EMULATION /* this array similates bad blocks on the device */ unsigned long bad_blocks [] = { 8208, 8209, 8210 /*, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19*/ }; int i; for (i = 0; i < sizeof (bad_blocks) / sizeof (bad_blocks[0]); i ++) if (bad_blocks [i] == block) return 1; #endif return 0; } /* All buffers are in double linked cycled list. If reiserfs_buffer_open found buffer with wanted block number in hash queue it moves buffer to the end of list. */ static int g_nr_buffers; static unsigned long buffers_memory; /* create buffers until we spend this fraction of system memory, this ** is a hard limit on the amount of buffer ram used */ #define BUFFER_MEMORY_FRACTION 10 /* number of bytes in local buffer cache before we start forcing syncs ** of dirty data and reusing unused buffers instead of allocating new ** ones. If a flush doesn't find reusable buffers, new ones are ** still allocated up to the BUFFER_MEMORY_FRACTION percentage ** */ #define BUFFER_SOFT_LIMIT (500 * 1024) static unsigned long buffer_soft_limit = BUFFER_SOFT_LIMIT; #define NR_HASH_QUEUES 4096 static reiserfs_bh_t * g_a_hash_queues [NR_HASH_QUEUES]; static reiserfs_bh_t * Buffer_list_head; static reiserfs_bh_t * g_free_buffers = NULL ; static reiserfs_bh_t * g_buffer_heads; static int buffer_hits = 0 ; static int buffer_misses = 0 ; static int buffer_reads = 0 ; static int buffer_writes = 0 ; static void _show_buffers(reiserfs_bh_t **list, int dev, unsigned long size) { int all = 0; int dirty = 0; int in_use = 0; /* count != 0 */ int free = 0; reiserfs_bh_t * next; next = *list; if (!next) return ; for (;;) { if (next->b_dev == dev && next->b_size == size) { all ++; if (next->b_count != 0) { in_use ++; } if (reiserfs_buffer_isdirty (next)) { dirty ++; } if (reiserfs_buffer_isclean (next) && next->b_count == 0) { free ++; } } next = next->b_next; if (next == *list) break; } printf("show_buffers (dev %d, size %lu): free %d, count != 0 %d, dirty %d, " "all %d\n", dev, size, free, in_use, dirty, all); } static void show_buffers (int dev, int size) { _show_buffers(&Buffer_list_head, dev, size) ; _show_buffers(&g_free_buffers, dev, size) ; } static void insert_into_hash_queue (reiserfs_bh_t * bh) { int index = bh->b_blocknr % NR_HASH_QUEUES; if (bh->b_hash_prev || bh->b_hash_next) misc_die ("insert_into_hash_queue: hash queue corrupted"); if (g_a_hash_queues[index]) { g_a_hash_queues[index]->b_hash_prev = bh; bh->b_hash_next = g_a_hash_queues[index]; } g_a_hash_queues[index] = bh; } static void remove_from_hash_queue (reiserfs_bh_t * bh) { if (bh->b_hash_next == 0 && bh->b_hash_prev == 0 && bh != g_a_hash_queues[bh->b_blocknr % NR_HASH_QUEUES]) { /* (b_dev == -1) ? */ return; } if (bh == g_a_hash_queues[bh->b_blocknr % NR_HASH_QUEUES]) { if (bh->b_hash_prev != 0) misc_die ("remove_from_hash_queue: hash queue corrupted"); g_a_hash_queues[bh->b_blocknr % NR_HASH_QUEUES] = bh->b_hash_next; } if (bh->b_hash_next) bh->b_hash_next->b_hash_prev = bh->b_hash_prev; if (bh->b_hash_prev) bh->b_hash_prev->b_hash_next = bh->b_hash_next; bh->b_hash_prev = bh->b_hash_next = 0; } static void put_buffer_list_end (reiserfs_bh_t **list, reiserfs_bh_t * bh) { reiserfs_bh_t * last = 0; if (bh->b_prev || bh->b_next) misc_die ("put_buffer_list_end: buffer list corrupted"); if (*list == 0) { bh->b_next = bh; bh->b_prev = bh; *list = bh; } else { last = (*list)->b_prev; bh->b_next = last->b_next; bh->b_prev = last; last->b_next->b_prev = bh; last->b_next = bh; } } static void remove_from_buffer_list (reiserfs_bh_t **list, reiserfs_bh_t * bh) { if (bh == bh->b_next) { *list = 0; } else { bh->b_prev->b_next = bh->b_next; bh->b_next->b_prev = bh->b_prev; if (bh == *list) *list = bh->b_next; } bh->b_next = bh->b_prev = 0; } static void put_buffer_list_head (reiserfs_bh_t **list, reiserfs_bh_t * bh) { put_buffer_list_end (list, bh); *list = bh; } /* #include static size_t estimate_memory_amount (void) { size_t len = 1; size_t max = 0; void * addr; while (len > 0) { addr = mmap (0, len, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (addr == MAP_FAILED) { if (errno != ENOMEM) misc_die ("mmap failed: %s\n", strerror(errno)); break; } if (mlock (addr, len) != 0) { if (errno == EPERM) misc_die ("No permission to run mlock"); break; } munlock (addr, len); munmap (addr, len); max = len; len *= 2; } // * If we've looped, we don't want to return 0, we want to return the // * last successful len before we looped. In the event that mmap/mlock // * failed for len = 1, max will still be 0, so we don't get an invalid // * result return max; } */ #define GROW_BUFFERS__NEW_BUFERS_PER_CALL 10 /* creates number of new buffers and insert them into head of buffer list */ static int grow_buffers (int size) { int i; reiserfs_bh_t * bh, * tmp; /* get memory for array of buffer heads */ bh = (reiserfs_bh_t *)misc_getmem (GROW_BUFFERS__NEW_BUFERS_PER_CALL * sizeof (reiserfs_bh_t) + sizeof (reiserfs_bh_t *)); if (g_buffer_heads == 0) g_buffer_heads = bh; else { /* link new array to the end of array list */ tmp = g_buffer_heads; while (*(reiserfs_bh_t **)(tmp + GROW_BUFFERS__NEW_BUFERS_PER_CALL) != 0) tmp = *(reiserfs_bh_t **)(tmp + GROW_BUFFERS__NEW_BUFERS_PER_CALL); *(reiserfs_bh_t **)(tmp + GROW_BUFFERS__NEW_BUFERS_PER_CALL) = bh; } for (i = 0; i < GROW_BUFFERS__NEW_BUFERS_PER_CALL; i ++) { tmp = bh + i; memset (tmp, 0, sizeof (reiserfs_bh_t)); tmp->b_data = misc_getmem (size); if (tmp->b_data == 0) misc_die ("grow_buffers: no memory for new buffer data"); tmp->b_dev = -1; tmp->b_size = size; put_buffer_list_head (&g_free_buffers, tmp); } buffers_memory += GROW_BUFFERS__NEW_BUFERS_PER_CALL * size; g_nr_buffers += GROW_BUFFERS__NEW_BUFERS_PER_CALL; return GROW_BUFFERS__NEW_BUFERS_PER_CALL; } reiserfs_bh_t *reiserfs_buffer_find (int dev, unsigned long block, unsigned long size) { reiserfs_bh_t * next; next = g_a_hash_queues[block % NR_HASH_QUEUES]; for (;;) { reiserfs_bh_t *tmp = next; if (!next) break; next = tmp->b_hash_next; if (tmp->b_blocknr != block || tmp->b_size != size || tmp->b_dev != dev) continue; next = tmp; break; } return next; } static reiserfs_bh_t * get_free_buffer (reiserfs_bh_t **list, unsigned long size) { reiserfs_bh_t * next; next = *list; if (!next) return 0; for (;;) { if (!next) misc_die ("get_free_buffer: buffer list is corrupted"); if (next->b_count == 0 && reiserfs_buffer_isclean (next) && next->b_size == size) { remove_from_hash_queue (next); remove_from_buffer_list (list, next); return next; } next = next->b_next; if (next == *list) break; } return 0; } /* to_write == 0 when all blocks have to be flushed. Otherwise - write only buffers with b_count == 0 */ static int sync_buffers (reiserfs_bh_t **list, int dev, int to_write) { reiserfs_bh_t * next; int written = 0; restart: next = *list; if (!next) return 0; for (;;) { if (!next) misc_die ("sync_buffers: buffer list is corrupted"); if (next->b_dev == dev && reiserfs_buffer_isdirty (next) && reiserfs_buffer_uptodate (next)) { if ((to_write == 0 || next->b_count == 0) && !reiserfs_buffer_noflush (next)) { reiserfs_buffer_write (next); } } /* if this buffer is reusable, put it onto the end of the free list */ if (next->b_count == 0 && reiserfs_buffer_isclean(next)) { remove_from_hash_queue (next); remove_from_buffer_list (list, next); put_buffer_list_end (&g_free_buffers, next); written++ ; if (written == to_write) return written; goto restart; } if (to_write && written >= to_write) return written; next = next->b_next; if (next == *list) break; } return written; } void reiserfs_buffer_flush_all (int dev) { if (dev == -1) misc_die ("reiserfs_buffer_flush_all: device is not specified"); sync_buffers (&Buffer_list_head, dev, 0/*all*/); buffer_soft_limit = BUFFER_SOFT_LIMIT; } reiserfs_bh_t * reiserfs_buffer_open (int dev, unsigned long block, unsigned long size) { reiserfs_bh_t * bh; bh = reiserfs_buffer_find (dev, block, size); if (bh) { /* move the buffer to the end of list */ /*checkmem (bh->b_data, bh->b_size);*/ remove_from_buffer_list (&Buffer_list_head, bh); put_buffer_list_end (&Buffer_list_head, bh); bh->b_count ++; buffer_hits++ ; return bh; } buffer_misses++ ; bh = get_free_buffer (&g_free_buffers, size); if (bh == NULL) { if (buffers_memory >= buffer_soft_limit) { if (sync_buffers (&Buffer_list_head, dev, 32) == 0) { grow_buffers(size); buffer_soft_limit = buffers_memory + GROW_BUFFERS__NEW_BUFERS_PER_CALL * size; } } else { if (grow_buffers(size) == 0) sync_buffers (&Buffer_list_head, dev, 32); } bh = get_free_buffer (&g_free_buffers, size); if (bh == NULL) { show_buffers (dev, size); misc_die ("reiserfs_buffer_open: no free buffers after grow_buffers " "and refill (%d)", g_nr_buffers); } } bh->b_count = 1; bh->b_dev = dev; bh->b_size = size; bh->b_blocknr = block; bh->b_end_io = NULL ; memset (bh->b_data, 0, size); misc_clear_bit(BH_Dirty, &bh->b_state); misc_clear_bit(BH_Uptodate, &bh->b_state); put_buffer_list_end (&Buffer_list_head, bh); insert_into_hash_queue (bh); /*checkmem (bh->b_data, bh->b_size);*/ return bh; } void reiserfs_buffer_close (reiserfs_bh_t * bh) { if (bh == 0) return; if (bh->b_count == 0) misc_die ("reiserfs_buffer_close: can not free a free buffer %lu", bh->b_blocknr); /*checkmem (bh->b_data, misc_memsize (bh->b_data));*/ bh->b_count --; } void reiserfs_buffer_forget (reiserfs_bh_t * bh) { if (bh) { bh->b_state = 0; reiserfs_buffer_close (bh); remove_from_hash_queue (bh); remove_from_buffer_list(&Buffer_list_head, bh); put_buffer_list_head(&Buffer_list_head, bh); } } /* Returns 0 on success; 1 - end of file; 0 - OK. */ static int f_read(reiserfs_bh_t * bh) { unsigned long long offset; ssize_t bytes; buffer_reads++ ; offset = (unsigned long long)bh->b_size * bh->b_blocknr; if (lseek (bh->b_dev, offset, SEEK_SET) < 0) return -1; bytes = read (bh->b_dev, bh->b_data, bh->b_size); return bytes < 0 ? -1 : (bytes != (ssize_t)bh->b_size ? 1 : 0); } #define check_hd_msg \ "\nThe problem has occurred looks like a hardware problem. If you have\n" \ "bad blocks, we advise you to get a new hard drive, because once you\n" \ "get one bad block that the disk drive internals cannot hide from\n" \ "your sight,the chances of getting more are generally said to become\n" \ "much higher (precise statistics are unknown to us), and this disk\n" \ "drive is probably not expensive enough for you to you to risk your\n" \ "time and data on it. If you don't want to follow that follow that\n" \ "advice then if you have just a few bad blocks, try writing to the\n" \ "bad blocks and see if the drive remaps the bad blocks (that means\n" \ "it takes a block it has in reserve and allocates it for use for\n" \ "of that block number). If it cannot remap the block, use badblock\n" \ "option (-B) with reiserfs utils to handle this block correctly.\n" \ reiserfs_bh_t *reiserfs_buffer_read (int dev, unsigned long block, unsigned long size) { reiserfs_bh_t * bh; int ret; if (is_bad_block (block)) return 0; bh = reiserfs_buffer_open (dev, block, size); /*checkmem (bh->b_data, misc_memsize(bh->b_data));*/ if (reiserfs_buffer_uptodate (bh)) return bh; ret = f_read(bh); if (ret > 0) { misc_die ("%s: End of file, cannot read the block (%lu).\n", __FUNCTION__, block); } else if (ret < 0) { /* BAD BLOCK LIST SUPPORT * misc_die ("%s: Cannot read a block # %lu. Specify list of badblocks\n",*/ if (errno == EIO) { fprintf(stderr, check_hd_msg); misc_die ("%s: Cannot read the block (%lu): (%s).\n", __FUNCTION__, block, strerror(errno)); } else { fprintf (stderr, "%s: Cannot read the block (%lu): (%s).\n", __FUNCTION__, block, strerror(errno)); return NULL; } } reiserfs_buffer_mkuptodate (bh, 0); return bh; } /* for now - just make sure that bad blocks did not get here */ int reiserfs_buffer_write (reiserfs_bh_t * bh) { off_t offset; long long bytes, size; if (is_bad_block (bh->b_blocknr)) { fprintf (stderr, "reiserfs_buffer_write: bad block is going to be written: %lu\n", bh->b_blocknr); exit(8); } if (!reiserfs_buffer_isdirty (bh) || !reiserfs_buffer_uptodate (bh)) return 0; buffer_writes++ ; if (bh->b_start_io) /* this is used by undo feature of reiserfsck */ bh->b_start_io (bh->b_blocknr); size = bh->b_size; offset = (off_t)size * bh->b_blocknr; if (lseek (bh->b_dev, offset, SEEK_SET) == (long long int)-1){ fprintf (stderr, "reiserfs_buffer_write: lseek to position %llu (block=%lu, dev=%d): %s\n", offset, bh->b_blocknr, bh->b_dev, strerror(errno)); exit(8); /* File system errors left uncorrected */ } #ifdef ROLLBACK_READY if (s_rollback_file != NULL && bh->b_size == (unsigned long)rollback_blocksize) { struct stat buf; int position; struct block_handler block_h; /*log previous content into the log*/ if (!fstat (bh->b_dev, &buf)) { block_h.blocknr = bh->b_blocknr; block_h.device = buf.st_rdev; if (misc_bin_search(&block_h, rollback_blocks_array, rollback_blocks_number, sizeof (block_h), &position, blockdev_list_compare) != 1) { /*read initial data from the disk*/ if (read(bh->b_dev, rollback_data, bh->b_size) == (long long)bh->b_size) { fwrite(&buf.st_rdev, sizeof (buf.st_rdev), 1, s_rollback_file); fwrite(&offset, sizeof (offset), 1, s_rollback_file); fwrite(rollback_data, rollback_blocksize, 1, s_rollback_file); fflush(s_rollback_file); blocklist__insert_in_position(&block_h, (void *)(&rollback_blocks_array), &rollback_blocks_number, sizeof(block_h), &position); /*if you want to know what gets saved, uncomment it*/ /* if (log_file != 0 && log_file != stdout) { fprintf (log_file, "rollback: block %lu of device %Lu was " "backed up\n", bh->b_blocknr, buf.st_rdev); } */ } else { fprintf (stderr, "reiserfs_buffer_write: read (block=%lu, dev=%d): %s\n", bh->b_blocknr, bh->b_dev, strerror (errno)); exit(8); } if (lseek (bh->b_dev, offset, SEEK_SET) == (long long int)-1) { fprintf (stderr, "reiserfs_buffer_write: lseek to position %llu (block=%lu, " "dev=%d): %s\n", offset, bh->b_blocknr, bh->b_dev, strerror(errno)); exit(8); } } } else { fprintf (stderr, "reiserfs_buffer_write: fstat of (%d) returned -1: %s\n", bh->b_dev, strerror(errno)); } } else if (s_rollback_file != NULL) { fprintf (stderr, "rollback: block (%lu) has the size different from " "the fs uses, block skipped\n", bh->b_blocknr); } #endif bytes = write(bh->b_dev, bh->b_data, size); if (bytes != size) { fprintf (stderr, "reiserfs_buffer_write: write %lld bytes returned %lld (block=%ld, " "dev=%d): %s\n", size, bytes, bh->b_blocknr, bh->b_dev, strerror(errno)); exit(8); } reiserfs_buffer_mkclean (bh); if (bh->b_end_io) { bh->b_end_io(bh, 1) ; } return 0; } static int _check_and_free_buffer_list(reiserfs_bh_t *list) { reiserfs_bh_t *next = list ; int count = 0 ; if (!list) return 0 ; for(;;) { if (next->b_count != 0) fprintf (stderr, "check_and_free_buffer_mem: not free buffer " "(%d, %ld, %ld, %d)\n", next->b_dev, next->b_blocknr, next->b_size, next->b_count); if (reiserfs_buffer_isdirty (next) && reiserfs_buffer_uptodate (next)) fprintf (stderr, "check_and_free_buffer_mem: dirty buffer " "(%d %lu) found\n", next->b_dev, next->b_blocknr); misc_freemem (next->b_data); count++; next = next->b_next; if (next == list) break; } return count; } void reiserfs_buffer_free_all (void) { int count = 0; reiserfs_bh_t * next ; // printf("check and free buffer mem, hits %d misses %d reads %d writes %d\n", // buffer_hits, buffer_misses, buffer_reads, buffer_writes) ; /*sync_buffers (0, 0);*/ count = _check_and_free_buffer_list(Buffer_list_head); count += _check_and_free_buffer_list(g_free_buffers); if (count != g_nr_buffers) misc_die ("check_and_free_buffer_mem: found %d buffers, must be %d", count, g_nr_buffers); /* free buffer heads */ while ((next = g_buffer_heads)) { g_buffer_heads = *(reiserfs_bh_t **) (next + GROW_BUFFERS__NEW_BUFERS_PER_CALL); misc_freemem (next); } return; } static void _invalidate_buffer_list(reiserfs_bh_t *list, int dev) { reiserfs_bh_t * next; if (!list) return; next = list; for (;;) { if (next->b_dev == dev) { if (reiserfs_buffer_isdirty (next) || next->b_count) fprintf (stderr, "invalidate_buffer_list: dirty " "buffer or used buffer (%d %lu) found\n", next->b_count, next->b_blocknr); next->b_state = 0; remove_from_hash_queue (next); } next = next->b_next; if (next == list) break; } } /* forget all buffers of the given device */ void reiserfs_buffer_invalidate_all (int dev) { _invalidate_buffer_list(Buffer_list_head, dev) ; _invalidate_buffer_list(g_free_buffers, dev) ; } reiserfsprogs-3.6.20/libreiserfs/direntry.c0000644000175300001440000001125510412227267015743 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ /* length of the directory entry in directory item. This define calculates length of i-th directory entry using directory entry locations from dir entry head. When it calculates length of 0-th directory entry, it uses length of whole item in place of entry location of the non-existent following entry in the calculation. See picture above.*/ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" // NOTE: this is not name length. This is length of whole entry int reiserfs_direntry_entry_len (reiserfs_ih_t * ih, reiserfs_deh_t * deh, int pos_in_item) { if (pos_in_item) return (reiserfs_deh_get_loc (deh - 1) - reiserfs_deh_get_loc (deh)); return (reiserfs_ih_get_len (ih) - reiserfs_deh_get_loc (deh)); } int reiserfs_direntry_name_len (reiserfs_ih_t * ih, reiserfs_deh_t * deh, int pos_in_item) { int len, i; char * name; len = reiserfs_direntry_entry_len (ih, deh, pos_in_item); name = reiserfs_deh_name (deh, pos_in_item); // name might be padded with 0s i = 0; while (name[i] && i < len) i++; return i; } int reiserfs_direntry_entry_estimate (char * name, int key_format) { if (key_format == KEY_FORMAT_2) return MISC_ROUND_UP (strlen(name)); else if (key_format == KEY_FORMAT_1) return strlen(name); return -1; } /* the only corruption which is not considered fatal - is hash mismatching. If bad_dir is set - directory item having such names is considered bad */ int reiserfs_direntry_check (reiserfs_filsys_t * fs, reiserfs_ih_t * ih, char * item, int bad_dir) { int i; int namelen; reiserfs_deh_t * deh = (reiserfs_deh_t *)item; __u32 prev_offset = 0; __u16 prev_location = reiserfs_ih_get_len (ih); for (i = 0; i < reiserfs_ih_get_entries (ih); i ++, deh ++) { if (reiserfs_deh_get_loc (deh) >= prev_location) return 1; prev_location = reiserfs_deh_get_loc (deh); namelen = reiserfs_direntry_name_len (ih, deh, i); if (namelen > REISERFS_NAME_MAX) return 1; if (reiserfs_deh_get_off (deh) <= prev_offset) return 1; prev_offset = reiserfs_deh_get_off (deh); /* check hash value */ if (!reiserfs_hash_correct (&fs->hash, item + prev_location, namelen, prev_offset)) { if (bad_dir) /* make is_bad_leaf to not insert whole leaf. Node will be marked not-insertable and put into tree item by item in pass 2 */ return 1; } } return 0; } int reiserfs_direntry_loc_check (reiserfs_deh_t * deh, reiserfs_ih_t * ih, int first) { if (reiserfs_deh_get_loc (deh) < REISERFS_DEH_SIZE * reiserfs_ih_get_entries (ih)) { return 1; } if (reiserfs_deh_get_loc (deh) >= reiserfs_ih_get_len (ih)) return 1; if (!first) { if (reiserfs_deh_get_loc (deh) >= reiserfs_deh_get_loc (deh - 1)) return 1; } return 0; } void reiserfs_direntry_print (FILE * fp, reiserfs_filsys_t * fs, reiserfs_bh_t * bh, reiserfs_ih_t * ih) { int i; int namelen; reiserfs_deh_t * deh; char * name; /* static char namebuf [80];*/ if (!reiserfs_ih_dir (ih)) return; /*printk ("\n%2%-25s%-30s%-15s%-15s%-15s\n", " Name", "length", "Object key", "Hash", "Gen number", "Status"); */ reiserfs_warning (fp, "%3s: %-25s%s%-22s%-12s%s\n", "###", "Name", "length", " Object key", " Hash", "Gen number"); deh = reiserfs_deh (bh, ih); for (i = 0; i < reiserfs_ih_get_entries (ih); i ++, deh ++) { if (reiserfs_direntry_loc_check (deh, ih, i == 0 ? 1 : 0)) { reiserfs_warning (fp, "%3d: wrong entry location %u, deh_offset %u\n", i, reiserfs_deh_get_loc (deh), reiserfs_deh_get_off (deh)); continue; } if (i && reiserfs_direntry_loc_check (deh - 1, ih, ((i - 1) == 0) ? 1 : 0)) /* previous entry has bad location so we can not calculate entry length */ namelen = 25; else namelen = reiserfs_direntry_name_len (ih, deh, i); name = reiserfs_deh_name (deh, i); reiserfs_warning (fp, "%3d: \"%-25.*s\"(%3d)%20K%12d%5d, loc %u, " "state %x %s\n", i, namelen, name, namelen, (reiserfs_key_t *)&(deh->deh2_dir_id), OFFSET_HASH (reiserfs_deh_get_off (deh)), OFFSET_GEN (reiserfs_deh_get_off (deh)), reiserfs_deh_get_loc (deh), reiserfs_deh_get_state (deh), reiserfs_hash_name (reiserfs_hash_find ( name, namelen, reiserfs_deh_get_off (deh), fs ? reiserfs_sb_get_hash (fs->fs_ondisk_sb) : UNSET_HASH))); /*fs ? (reiserfs_hash_correct (&fs->hash, name, namelen, deh_offset (deh)) ? "" : "(BROKEN)") : "??");*/ } } reiserfsprogs-3.6.20/libreiserfs/extent.c0000644000175300001440000000451710412227267015415 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #include "misc/unaligned.h" /* check item length, ih_free_space for pure 3.5 format, unformatted node pointers */ int reiserfs_ext_check (reiserfs_filsys_t * fs, reiserfs_ih_t * ih, char * item, unfm_func_t func) { unsigned int i; __u32 * ind = (__u32 *)item; if (reiserfs_ih_get_len (ih) % REISERFS_EXT_SIZE) return 1; for (i = 0; i < reiserfs_ext_count (ih); i ++) { if (!ind [i]) continue; if (func && func (fs, d32_get (ind, i))) return 1; } if (fs->fs_format == REISERFS_FORMAT_3_5) { /* check ih_free_space for 3.5 format only */ if (reiserfs_ih_get_free (ih) > fs->fs_blocksize - 1) return 1; } return 0; } // // printing of extent item // static void start_new_sequence (__u32 * start, int * len, __u32 new) { *start = new; *len = 1; } static int sequence_finished (__u32 start, int * len, __u32 new) { if (le32_to_cpu (start) == MAX_INT) return 1; if (start == 0 && new == 0) { (*len) ++; return 0; } if (start != 0 && (le32_to_cpu (start) + *len) == le32_to_cpu (new)) { (*len) ++; return 0; } return 1; } static void print_sequence (FILE * fp, __u32 start, int len) { if (start == MAX_INT) return; if (len == 1) reiserfs_warning (fp, " %d", le32_to_cpu (start)); else reiserfs_warning (fp, " %d(%d)", le32_to_cpu (start), len); } void reiserfs_ext_print(FILE * fp, reiserfs_bh_t * bh, int item_num) { reiserfs_ih_t * ih; unsigned int j; __u32 * unp, prev = MAX_INT; int num = 0; ih = reiserfs_ih_at (bh, item_num); unp = (__u32 *)reiserfs_item_by_ih (bh, ih); if (reiserfs_ih_get_len (ih) % REISERFS_EXT_SIZE) reiserfs_warning (fp, "reiserfs_ext_print: invalid item len"); reiserfs_warning (fp, "%d pointer%s\n[", reiserfs_ext_count (ih), reiserfs_ext_count (ih) != 1 ? "s" : "" ); for (j = 0; j < reiserfs_ext_count (ih); j ++) { if (sequence_finished (prev, &num, d32_get(unp, j))) { print_sequence (fp, prev, num); start_new_sequence (&prev, &num, d32_get(unp, j)); } } print_sequence (fp, prev, num); reiserfs_warning (fp, "]\n"); } reiserfsprogs-3.6.20/libreiserfs/filesystem.c0000644000175300001440000002763710412227267016302 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #include "misc/malloc.h" #include "misc/device.h" #include #include #include #include #include int reiserfs_fs_blksize_check (unsigned int blocksize) { return ((((blocksize & -blocksize) == blocksize) && (blocksize >= 512) && (blocksize <= 8192))); } reiserfs_blktype_t reiserfs_fs_block(reiserfs_filsys_t *fs, unsigned long block) { if (block < fs->fs_super_bh->b_blocknr || block >= reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) { return BT_INVAL; } if (block == fs->fs_super_bh->b_blocknr) return BT_SUPER; if (reiserfs_journal_block (fs, block)) return BT_JOURNAL; if (reiserfs_bitmap_block(fs, block)) return BT_BITMAP; return BT_UNKNOWN; } /* read super block. fixme: only 4k blocks, pre-journaled format is refused. Journal and bitmap are to be opened separately. skip_check is set to 1 if checks of openned SB should be omitted.*/ reiserfs_filsys_t * reiserfs_fs_open (char * filename, int flags, int *error, void * vp, int check) { reiserfs_filsys_t * fs; reiserfs_bh_t * bh; reiserfs_sb_t * sb; int fd, i; if (error) *error = 0; fd = open (filename, flags #if defined(O_LARGEFILE) | O_LARGEFILE #endif ); if (fd == -1) { if (error) *error = errno; return 0; } fs = misc_getmem (sizeof (*fs)); fs->fs_dev = fd; fs->fs_vp = vp; strncpy(fs->fs_file_name, filename, sizeof(fs->fs_file_name)); /* reiserfs super block is either in 16-th or in 2-nd 4k block of the device */ for (i = 2; i < 17; i += 14) { bh = reiserfs_buffer_read (fd, i, 4096); if (!bh) { reiserfs_warning (stderr, "reiserfs_fs_open: reiserfs_buffer_read " "failed reading block %d\n", i); } else { sb = (reiserfs_sb_t *)bh->b_data; if (reiserfs_super_magic(sb)) goto found; /* reiserfs signature is not found at the i-th 4k block */ reiserfs_buffer_close (bh); } } reiserfs_warning(stderr, "\nreiserfs_fs_open: the reiserfs superblock " "cannot be found on %s.\n", filename); misc_freemem (fs); close (fd); fs = NULL; return fs; found: if (!reiserfs_fs_blksize_check(reiserfs_sb_get_blksize(sb))) { reiserfs_warning(stderr, "reiserfs_fs_open: a superblock with " "wrong parameters was found in the block (%d).\n", i); misc_freemem (fs); close (fd); reiserfs_buffer_close(bh); return NULL; } if (check) { /* A few checks of found super block. */ reiserfs_bh_t *tmp_bh; tmp_bh = reiserfs_buffer_read (fd, reiserfs_sb_get_blocks(sb) - 1, reiserfs_sb_get_blksize(sb)); if (!tmp_bh) { reiserfs_warning (stderr, "\n%s: Your partition is not big enough " "to contain the \nfilesystem of (%lu) blocks as " "was specified in the found super block.\n", __FUNCTION__, reiserfs_sb_get_blocks(sb) - 1); misc_freemem (fs); close (fd); reiserfs_buffer_close(bh); return NULL; } reiserfs_buffer_close(tmp_bh); } fs->fs_blocksize = reiserfs_sb_get_blksize (sb); /* check block size on the filesystem */ if (fs->fs_blocksize != 4096) { i = bh->b_blocknr * 4096 / fs->fs_blocksize; reiserfs_buffer_close (bh); bh = reiserfs_buffer_read (fd, i, fs->fs_blocksize); if (!bh) { reiserfs_warning (stderr, "reiserfs_fs_open: reiserfs_buffer_read " "failed reading block %d, size %d\n", i, fs->fs_blocksize); misc_freemem (fs); return 0; } sb = (reiserfs_sb_t *)bh->b_data; } fs->hash = reiserfs_hash_func (reiserfs_sb_get_hash (sb)); fs->fs_super_bh = bh; fs->fs_ondisk_sb = sb; fs->fs_flags = flags; /* O_RDONLY or O_RDWR */ fs->fs_format = reiserfs_super_format (sb); /*reiserfs_read_bitmap_blocks(fs);*/ if (flags & O_RDWR) fs->fs_dirt = 1; else fs->fs_dirt = 0; return fs; } /* creates buffer for super block and fills it up with fields which are constant for given size and version of a filesystem */ reiserfs_filsys_t * reiserfs_fs_create (char * filename, int version, unsigned long block_count, int block_size, int default_journal, int new_format) { reiserfs_filsys_t * fs; unsigned long bmap_nr; if (misc_device_count_blocks (filename, block_size) < block_count) { reiserfs_warning (stderr, "reiserfs_fs_create: no enough " "blocks on device\n"); return 0; } if (!reiserfs_journal_fits (REISERFS_DISK_OFFSET_IN_BYTES / block_size, block_size, block_count, 0)) { reiserfs_warning (stderr, "reiserfs_fs_create: can not create that " "small (%d blocks) filesystem\n", block_count); return 0; } fs = misc_getmem (sizeof (*fs)); if (!fs) { reiserfs_warning (stderr, "reiserfs_fs_create: misc_getmem failed\n"); return 0; } fs->fs_dev = open (filename, O_RDWR #if defined(O_LARGEFILE) | O_LARGEFILE #endif ); if (fs->fs_dev == -1) { reiserfs_warning (stderr, "reiserfs_fs_create: could not open %s: %s\n", filename, strerror(errno)); misc_freemem (fs); return 0; } fs->fs_blocksize = block_size; sprintf(fs->fs_file_name, filename); fs->fs_format = version; if (new_format) fs->fs_super_bh = reiserfs_buffer_open (fs->fs_dev, REISERFS_DISK_OFFSET_IN_BYTES / block_size, block_size); else fs->fs_super_bh = reiserfs_buffer_open (fs->fs_dev, REISERFS_OLD_DISK_OFFSET_IN_BYTES / block_size, block_size); if (!fs->fs_super_bh) { reiserfs_warning (stderr, "reiserfs_fs_create: " "reiserfs_buffer_open failed\n"); return 0; } reiserfs_buffer_mkuptodate (fs->fs_super_bh, 1); fs->fs_ondisk_sb = (reiserfs_sb_t *)fs->fs_super_bh->b_data; memset (fs->fs_ondisk_sb, 0, block_size); /* fill super block fields which are constant for given version and block count */ reiserfs_sb_set_blocks (fs->fs_ondisk_sb, block_count); /* sb_free_blocks */ /* sb_root_block */ /* sb_journal_1st_block */ /* sb_journal_dev */ /* sb_orig_journal_size */ /* sb_joural_magic */ /* sb_journal magic_F */ /* sb_mount_id */ /* sb_not_used0 */ /* sb_generation_number */ reiserfs_sb_set_blksize (fs->fs_ondisk_sb, block_size); switch (version) { case REISERFS_FORMAT_3_5: reiserfs_sb_set_mapmax (fs->fs_ondisk_sb, (block_size - REISERFS_SB_SIZE_V1) / sizeof(__u32) / 2 * 2); /* sb_oid_cursize */ /* sb_state */ memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_3_5_SUPER_MAGIC_STRING, strlen (REISERFS_3_5_SUPER_MAGIC_STRING)); break; case REISERFS_FORMAT_3_6: reiserfs_sb_set_mapmax (fs->fs_ondisk_sb, (block_size - REISERFS_SB_SIZE) / sizeof(__u32) / 2 * 2); /* sb_oid_cursize */ /* sb_state */ memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_3_6_SUPER_MAGIC_STRING, strlen (REISERFS_3_6_SUPER_MAGIC_STRING)); break; } if (!default_journal) memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_JR_SUPER_MAGIC_STRING, strlen (REISERFS_JR_SUPER_MAGIC_STRING)); /* sb_fsck_state */ /* sb_hash_function_code */ /* sb_tree_height */ bmap_nr = reiserfs_bmap_nr(block_count, block_size); reiserfs_sb_set_version (fs->fs_ondisk_sb, version); reiserfs_sb_set_bmaps (fs->fs_ondisk_sb, reiserfs_bmap_over(bmap_nr) ? 0 : bmap_nr); /* sb_not_used1 */ reiserfs_buffer_mkdirty (fs->fs_super_bh); fs->fs_dirt = 1; return fs; } /* flush bitmap, reiserfs_buffer_close super block, flush all dirty buffers, close and open again the device, read super block */ static void reiserfs_only_reopen (reiserfs_filsys_t * fs, int flag) { unsigned long super_block; /* reiserfs_bitmap_flush (fs->fs_bitmap2, fs);*/ super_block = fs->fs_super_bh->b_blocknr; reiserfs_buffer_close (fs->fs_super_bh); reiserfs_buffer_flush_all(fs->fs_dev); reiserfs_buffer_invalidate_all (fs->fs_dev); if (close (fs->fs_dev)) misc_die ("reiserfs_fs_reopen: closed failed: %s", strerror(errno)); fs->fs_dev = open (fs->fs_file_name, flag #if defined(O_LARGEFILE) | O_LARGEFILE #endif ); if (fs->fs_dev == -1) misc_die ("reiserfs_fs_reopen: could not reopen device: %s", strerror(errno)); fs->fs_super_bh = reiserfs_buffer_read (fs->fs_dev, super_block, fs->fs_blocksize); if (!fs->fs_super_bh) misc_die ("reiserfs_fs_reopen: reading super block failed"); fs->fs_ondisk_sb = (reiserfs_sb_t *)fs->fs_super_bh->b_data; fs->fs_flags = flag; /* O_RDONLY or O_RDWR */ if (flag & O_RDWR) fs->fs_dirt = 1; else fs->fs_dirt = 0; } void reiserfs_fs_reopen (reiserfs_filsys_t * fs, int flag) { reiserfs_only_reopen (fs, flag); reiserfs_journal_reopen (fs, flag); } int reiserfs_fs_rw (reiserfs_filsys_t * fs) { if ((fs->fs_flags) & O_RDWR) return 1; return 0; } /* flush all changes made on a filesystem */ void reiserfs_fs_flush (reiserfs_filsys_t * fs) { if (fs->fs_dirt) { reiserfs_journal_flush (fs); reiserfs_buffer_flush_all(fs->fs_dev); } fs->fs_dirt = 0; } /* free all memory involved into manipulating with filesystem */ void reiserfs_fs_free (reiserfs_filsys_t * fs) { reiserfs_journal_free (fs); reiserfs_bitmap_free (fs); /* release super block and memory used by filesystem handler */ reiserfs_buffer_close (fs->fs_super_bh); fs->fs_super_bh = 0; reiserfs_buffer_free_all (); misc_freemem (fs); } /* this closes everything: journal. bitmap and the fs itself */ void reiserfs_fs_close (reiserfs_filsys_t * fs) { reiserfs_journal_close (fs); reiserfs_bitmap_close (fs); reiserfs_fs_flush (fs); fsync(fs->fs_dev); reiserfs_fs_free (fs); } void reiserfs_print_bmap_block (FILE * fp, int i, unsigned long block, char * map, int blocks, int silent, int blocksize) { int j, k; int bits = blocksize * 8; int zeros = 0, ones = 0; reiserfs_warning (fp, "#%d: block %lu: ", i, block); blocks = blocksize * 8; if (misc_test_bit (0, map)) { /* first block addressed by this bitmap block is used */ ones ++; if (!silent) reiserfs_warning (fp, "Busy (%d-", i * bits); for (j = 1; j < blocks; j ++) { while (misc_test_bit (j, map)) { ones ++; if (j == blocks - 1) { if (!silent) reiserfs_warning (fp, "%d)\n", j + i * bits); goto end; } j++; } if (!silent) reiserfs_warning (fp, "%d) Free(%d-", j - 1 + i * bits, j + i * bits); while (!misc_test_bit (j, map)) { zeros ++; if (j == blocks - 1) { if (!silent) reiserfs_warning (fp, "%d)\n", j + i * bits); goto end; } j++; } if (!silent) reiserfs_warning (fp, "%d) Busy(%d-", j - 1 + i * bits, j + i * bits); j --; end: /* to make gcc 3.2 do not sware here */; } } else { /* first block addressed by this bitmap is free */ zeros ++; if (!silent) reiserfs_warning (fp, "Free (%d-", i * bits); for (j = 1; j < blocks; j ++) { k = 0; while (!misc_test_bit (j, map)) { k ++; if (j == blocks - 1) { if (!silent) reiserfs_warning (fp, "%d)\n", j + i * bits); zeros += k; goto end2; } j++; } zeros += k; if (!silent) reiserfs_warning (fp, "%d) Busy(%d-", j - 1 + i * bits, j + i * bits); k = 0; while (misc_test_bit (j, map)) { ones ++; if (j == blocks - 1) { if (!silent) reiserfs_warning (fp, "%d)\n", j + i * bits); ones += k; goto end2; } j++; } ones += k; if (!silent) reiserfs_warning (fp, "%d) Free(%d-", j - 1 + i * bits, j + i * bits); j --; end2: /* to make gcc 3.2 do not sware here */; } } reiserfs_warning (fp, "used %d, free %d\n", ones, zeros); } reiserfsprogs-3.6.20/libreiserfs/fix_node.c0000644000175300001440000024546110412227267015706 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #include "misc/misc.h" #include "misc/malloc.h" #include #define VI_TYPE_STAT_DATA 1 #define VI_TYPE_DIRECT 2 #define VI_TYPE_EXTENT 4 #define VI_TYPE_DIRECTORY 8 #define VI_TYPE_FIRST_DIRECTORY_ITEM 16 #define VI_TYPE_INSERTED_DIRECTORY_ITEM 32 #define VI_TYPE_LEFT_MERGEABLE 64 #define VI_TYPE_RIGHT_MERGEABLE 128 /* Check whether a key is contained in the tree rooted from a buffer at a path. This works by looking at the left and right delimiting keys for the buffer in the last path_element in the path. These delimiting keys are stored at least one level above that buffer in the tree. If the buffer is the first or last node in the tree order then one of the delimiting keys may be absent, and in this case get_lkey and get_rkey return a special key which is MIN_KEY or MAX_KEY. */ static inline int key_in_buffer ( reiserfs_path_t * p_s_chk_path, /* Path which should be checked. */ reiserfs_key_t * p_s_key, /* Key which should be checked. */ reiserfs_filsys_t * fs /* Super block pointer. */ ) { if (reiserfs_key_comp(reiserfs_tree_lkey(p_s_chk_path, fs), p_s_key) == 1) return 0; if (reiserfs_key_comp(p_s_key, reiserfs_tree_rkey(p_s_chk_path, fs)) != -1) return 0; return 1; } /************************************************************************** * Algorithm SearchByKey * * look for item in internal tree on the disk by its key * * Input: p_s_sb - super block * * p_s_key - pointer to the key to search * * Output: true value - 1 - found, 0 - not found * * p_s_search_path - path from the root to the needed leaf * **************************************************************************/ /* This function fills up the path from the root to the leaf as it descends the tree looking for the key. It uses reiserfs_reiserfs_buffer_read to try to find buffers in the cache given their block number. If it does not find them in the cache it reads them from disk. For each node search_by_key finds using reiserfs_reiserfs_buffer_read it then uses bin_search to look through that node. bin_search will find the position of the block_number of the next node if it is looking through an internal node. If it is looking through a leaf node bin_search will find the position of the item which has key either equal to given key, or which is the maximal key less than the given key. search_by_key returns a path that must be checked for the correctness of the top of the path but need not be checked for the correctness of the bottom of the path */ static int search_by_key (reiserfs_filsys_t * fs, reiserfs_key_t * p_s_key, /* Key to search */ reiserfs_path_t * p_s_search_path,/* This structure was allocated and initialized by the calling function. It is filled up by this function. */ int n_stop_level) /* How far down the tree to search.*/ { reiserfs_sb_t * sb; int n_block_number, expected_level, n_block_size = fs->fs_blocksize; reiserfs_bh_t * p_s_bh; reiserfs_path_element_t * p_s_last_element; int n_retval; sb = fs->fs_ondisk_sb; n_block_number = reiserfs_sb_get_root (sb); expected_level = reiserfs_sb_get_height (sb); /* As we add each node to a path we increase its count. This means that we must be careful to release all nodes in a path before we either discard the path struct or re-use the path struct, as we do here. */ reiserfs_tree_pathrelse (p_s_search_path); /* With each iteration of this loop we search through the items in the current node, and calculate the next current node(next path element) for the next iteration of this loop.. */ while ( 1 ) { /* prep path to have another element added to it. */ p_s_last_element = REISERFS_PATH_ELEM(p_s_search_path, ++p_s_search_path->path_length); expected_level --; /* Read the next tree node, and set the last element in the path to have a pointer to it. */ if ( ! (p_s_bh = p_s_last_element->pe_buffer = reiserfs_buffer_read (fs->fs_dev, n_block_number, n_block_size)) ) { p_s_search_path->path_length --; reiserfs_tree_pathrelse(p_s_search_path); return IO_ERROR; } /* It is possible that schedule occured. We must check whether the key to search is still in the tree rooted from the current buffer. If not then repeat search from the root. */ if (!REISERFS_NODE_INTREE (p_s_bh) || ! key_in_buffer(p_s_search_path, p_s_key, fs)) reiserfs_panic ("search_by_key: something wrong with the tree"); /* make sure, that the node contents look like a node of certain level */ if (!reiserfs_node_formatted (p_s_bh, expected_level)) { reiserfs_node_print (stderr, 0, p_s_bh, 3, -1, -1); reiserfs_panic ("search_by_key: expected level %d", expected_level); } /* ok, we have acquired next formatted node in the tree */ n_retval = misc_bin_search (p_s_key, reiserfs_ih_at(p_s_bh, 0), reiserfs_node_items(p_s_bh), reiserfs_leaf_head (p_s_bh) ? REISERFS_IH_SIZE : REISERFS_KEY_SIZE, &(p_s_last_element->pe_position), reiserfs_key_comp); if (reiserfs_nh_get_level (NODE_HEAD (p_s_bh)) == n_stop_level) return n_retval == 1 ? POSITION_FOUND : POSITION_NOT_FOUND; /* we are not in the stop level */ if (n_retval == 1) /* item has been found, so we choose the pointer which is to the right of the found one */ p_s_last_element->pe_position++; /* if item was not found we choose the position which is to the left of the found item. This requires no code, bin_search did it already.*/ /* So we have chosen a position in the current node which is an internal node. Now we calculate child block number by position in the node. */ n_block_number = reiserfs_dc_get_nr ( reiserfs_int_at (p_s_bh, p_s_last_element->pe_position)); } } /* To make any changes in the tree we find a node, that contains item to be changed/deleted or position in the node we insert a new item to. We call this node S. To do balancing we need to decide what we will shift to left/right neighbor, or to a new node, where new item will be etc. To make this analysis simpler we build virtual node. Virtual node is an array of items, that will replace items of node S. (For instance if we are going to delete an item, virtual node does not contain it). Virtual node keeps information about item sizes and types, mergeability of first and last items, sizes of all entries in directory item. We use this array of items when calculating what we can shift to neighbors and how many nodes we have to have if we do not any shiftings, if we shift to left/right neighbor or to both. */ /* taking item number in virtual node, returns number of item, that it has in source buffer */ static inline int old_item_num (int new_num, int affected_item_num, int mode) { if (mode == M_PASTE || mode == M_CUT || new_num < affected_item_num) return new_num; if (mode == M_INSERT) return new_num - 1; /* delete mode */ return new_num + 1; } /* function returns old entry number in directory item in real node using new entry number in virtual item in virtual node */ static inline int old_entry_num (int new_num, int affected_item_num, int new_entry_num, int pos_in_item, int mode) { if ( mode == M_INSERT || mode == M_DELETE) return new_entry_num; if (new_num != affected_item_num) { /* cut or paste is applied to another item */ return new_entry_num; } if (new_entry_num < pos_in_item) return new_entry_num; if (mode == M_CUT) return new_entry_num + 1; return new_entry_num - 1; } /* * Create an array of sizes of directory entries for virtual item */ static void set_entry_sizes (reiserfs_tb_t * tb, int old_num, int new_num, reiserfs_bh_t * bh, reiserfs_ih_t * ih) { struct reiserfs_virtual_node * vn = tb->tb_vn; int i; reiserfs_deh_t * deh; struct reiserfs_virtual_item * vi; deh = reiserfs_deh (bh, ih); /* seek to given virtual item in array of virtual items */ vi = vn->vn_vi + new_num; /* virtual directory item have this amount of entry after */ vi->vi_entry_count = reiserfs_ih_get_entries (ih) + ((old_num == vn->vn_affected_item_num) ? ((vn->vn_mode == M_CUT) ? -1 : (vn->vn_mode == M_PASTE ? 1 : 0)) : 0); vi->vi_entry_sizes = (__u16 *)vn->vn_free_ptr; vn->vn_free_ptr += vi->vi_entry_count * sizeof (__u16); /* set sizes of old entries */ for (i = 0; i < vi->vi_entry_count; i ++) { int j; j = old_entry_num (old_num, vn->vn_affected_item_num, i, vn->vn_pos_in_item, vn->vn_mode); vi->vi_entry_sizes[i] = reiserfs_direntry_entry_len (ih, &(deh[j]), j) + REISERFS_DEH_SIZE; } /* set size of pasted entry */ if (old_num == vn->vn_affected_item_num && vn->vn_mode == M_PASTE) vi->vi_entry_sizes[vn->vn_pos_in_item] = tb->insert_size[0]; } static void create_reiserfs_virtual_node (reiserfs_tb_t * tb, int h) { reiserfs_ih_t * ih; struct reiserfs_virtual_node * vn = tb->tb_vn; int new_num; reiserfs_bh_t * Sh; /* this comes from tb->S[h] */ Sh = REISERFS_PATH_UPBUFFER (tb->tb_path, h); /* size of changed node */ vn->vn_size = REISERFS_NODE_SPACE (Sh->b_size) - reiserfs_nh_get_free (NODE_HEAD (Sh)) + tb->insert_size[h]; /* for internal nodes array if virtual items is not created */ if (h) { vn->vn_nr_item = (vn->vn_size - REISERFS_DC_SIZE) / (REISERFS_DC_SIZE + REISERFS_KEY_SIZE); return; } /* number of items in virtual node */ vn->vn_nr_item = reiserfs_node_items (Sh) + ((vn->vn_mode == M_INSERT)? 1 : 0) - ((vn->vn_mode == M_DELETE)? 1 : 0); /* first virtual item */ vn->vn_vi = (struct reiserfs_virtual_item *)(tb->tb_vn + 1); memset (vn->vn_vi, 0, vn->vn_nr_item * sizeof (struct reiserfs_virtual_item)); vn->vn_free_ptr += vn->vn_nr_item * sizeof (struct reiserfs_virtual_item); /* first item in the node */ ih = reiserfs_ih_at (Sh, 0); /* define the mergeability for 0-th item (if it is not being deleted) */ if (reiserfs_tree_left_mergeable (tb->tb_fs, tb->tb_path) == 1 && (vn->vn_mode != M_DELETE || vn->vn_affected_item_num)) { vn->vn_vi[0].vi_type |= VI_TYPE_LEFT_MERGEABLE; } /* go through all items those remain in the virtual node (except for the new (inserted) one) */ for (new_num = 0; new_num < vn->vn_nr_item; new_num ++) { int j; if (vn->vn_affected_item_num == new_num && vn->vn_mode == M_INSERT) continue; /* get item number in source node */ j = old_item_num (new_num, vn->vn_affected_item_num, vn->vn_mode); vn->vn_vi[new_num].vi_item_len += reiserfs_ih_get_len (&ih[j]) + REISERFS_IH_SIZE; if (reiserfs_ih_stat (ih + j)) { vn->vn_vi[new_num].vi_type |= VI_TYPE_STAT_DATA; continue; } /* set type of item */ if (reiserfs_ih_direct (ih + j)) vn->vn_vi[new_num].vi_type |= VI_TYPE_DIRECT; if (reiserfs_ih_ext (ih + j)) vn->vn_vi[new_num].vi_type |= VI_TYPE_EXTENT; if (reiserfs_ih_dir (ih + j)) { set_entry_sizes (tb, j, new_num, Sh, ih + j); vn->vn_vi[new_num].vi_type |= VI_TYPE_DIRECTORY; if (reiserfs_key_get_off1 (&ih[j].ih_key) == OFFSET_DOT) vn->vn_vi[new_num].vi_type |= VI_TYPE_FIRST_DIRECTORY_ITEM; } vn->vn_vi[new_num].vi_item_offset = reiserfs_key_get_off (&(ih + j)->ih_key); if (new_num != vn->vn_affected_item_num) /* this is not being changed */ continue; if (vn->vn_mode == M_PASTE || vn->vn_mode == M_CUT) vn->vn_vi[new_num].vi_item_len += tb->insert_size[0]; } /* virtual inserted item is not defined yet */ if (vn->vn_mode == M_INSERT) { vn->vn_vi[vn->vn_affected_item_num].vi_item_len = tb->insert_size[0]; vn->vn_vi[vn->vn_affected_item_num].vi_item_offset = reiserfs_key_get_off (&vn->vn_ins_ih->ih_key); switch (reiserfs_key_get_type (&vn->vn_ins_ih->ih_key)) { case TYPE_STAT_DATA: vn->vn_vi[vn->vn_affected_item_num].vi_type |= VI_TYPE_STAT_DATA; break; case TYPE_DIRECT: vn->vn_vi[vn->vn_affected_item_num].vi_type |= VI_TYPE_DIRECT; break; case TYPE_EXTENT: vn->vn_vi[vn->vn_affected_item_num].vi_type |= VI_TYPE_EXTENT; break; default: /* inseted item is directory (it must be item with "." and "..") */ vn->vn_vi[vn->vn_affected_item_num].vi_type |= (VI_TYPE_DIRECTORY | VI_TYPE_FIRST_DIRECTORY_ITEM | VI_TYPE_INSERTED_DIRECTORY_ITEM); /* this directory item can not be split, so do not set sizes of entries */ break; } } /* set right merge flag we take right delimiting key and check whether it is a mergeable item */ if (tb->CFR[0]) { ih = (reiserfs_ih_t *)reiserfs_int_key_at (tb->CFR[0], tb->rkey[0]); if (reiserfs_tree_right_mergeable (tb->tb_fs, tb->tb_path) == 1 && (vn->vn_mode != M_DELETE || vn->vn_affected_item_num != reiserfs_node_items (Sh) - 1)) vn->vn_vi[vn->vn_nr_item-1].vi_type |= VI_TYPE_RIGHT_MERGEABLE; } } /* using virtual node check, how many items can be shifted to left neighbor */ static int check_left (reiserfs_tb_t * tb, int h, int cur_free) { int i; struct reiserfs_virtual_node * vn = tb->tb_vn; int d_size, ih_size, bytes = -1; /* internal level */ if (h > 0) { if (!cur_free ) { tb->lnum[h] = 0; return 0; } tb->lnum[h] = cur_free / (REISERFS_DC_SIZE + REISERFS_KEY_SIZE); return -1; } /* leaf level */ if (!cur_free || !vn->vn_nr_item) { /* no free space */ tb->lnum[h] = 0; tb->lbytes = -1; return 0; } if ((unsigned int)cur_free >= (vn->vn_size - ((vn->vn_vi[0].vi_type & VI_TYPE_LEFT_MERGEABLE) ? REISERFS_IH_SIZE : 0))) { /* all contents of S[0] fits into L[0] */ tb->lnum[0] = vn->vn_nr_item; tb->lbytes = -1; return -1; } d_size = 0, ih_size = REISERFS_IH_SIZE; /* first item may be merge with last item in left neighbor */ if (vn->vn_vi[0].vi_type & VI_TYPE_LEFT_MERGEABLE) d_size = -((int)REISERFS_IH_SIZE), ih_size = 0; tb->lnum[0] = 0; for (i = 0; i < vn->vn_nr_item; i ++, ih_size = REISERFS_IH_SIZE, d_size = 0) { d_size += vn->vn_vi[i].vi_item_len; if (cur_free >= d_size) { /* the item can be shifted entirely */ cur_free -= d_size; tb->lnum[0] ++; continue; } /* the item cannot be shifted entirely, try to split it */ /* check whether L[0] can hold ih and at least one byte of the item body */ if (cur_free <= ih_size) { /* cannot shift even a part of the current item */ tb->lbytes = -1; return -1; } cur_free -= ih_size; if (vn->vn_vi[i].vi_type & VI_TYPE_STAT_DATA || vn->vn_vi[i].vi_type & VI_TYPE_INSERTED_DIRECTORY_ITEM) { /* virtual item is a stat_data or empty directory body ("." and ".."), that is not split able */ tb->lbytes = -1; return -1; } if (vn->vn_vi[i].vi_type & VI_TYPE_DIRECT) { /* body of a direct item can be split by 8 bytes */ int align = 8 - (vn->vn_vi[i].vi_item_offset - 1) % 8; // reiserfs_warning(stderr,"\nbalancing: cur_free (%d) ", cur_free); tb->lbytes = bytes = (cur_free >= align) ? (align + ((cur_free - align) / 8 * 8)) : 0; // reiserfs_warning(stderr,"offset (0x%Lx), move_left (%d), get offset (0x%Lx)", // vn->vn_vi[i].vi_item_offset, bytes, vn->vn_vi[i].vi_item_offset + bytes); } if (vn->vn_vi[i].vi_type & VI_TYPE_EXTENT) /* body of a extent item can be split at unformatted pointer bound */ tb->lbytes = bytes = cur_free - cur_free % REISERFS_EXT_SIZE; /* item is of directory type */ if (vn->vn_vi[i].vi_type & VI_TYPE_DIRECTORY) { /* directory entries are the solid granules of the directory item, they cannot be split in the middle */ /* calculate number of dir entries that can be shifted, and their total size */ int j; struct reiserfs_virtual_item * vi; tb->lbytes = 0; bytes = 0; vi = &vn->vn_vi[i]; for (j = 0; j < vi->vi_entry_count; j ++) { if (vi->vi_entry_sizes[j] > cur_free) /* j-th entry doesn't fit into L[0] */ break; bytes += vi->vi_entry_sizes[j]; cur_free -= vi->vi_entry_sizes[j]; tb->lbytes ++; } /* "." can not be cut from first directory item */ if ((vn->vn_vi[i].vi_type & VI_TYPE_FIRST_DIRECTORY_ITEM) && tb->lbytes < 2) tb->lbytes = 0; } if (tb->lbytes <= 0) { /* nothing can flow from the item */ tb->lbytes = -1; return -1; } /* something can flow from the item */ tb->lnum[0] ++; return bytes; /* part of split item in bytes */ } reiserfs_panic (0, "vs-8065: check_left: all items fit in the left neighbor"); return 0; } /* using virtual node check, how many items can be shifted to right neighbor */ static int check_right (reiserfs_tb_t * tb, int h, int cur_free) { int i; struct reiserfs_virtual_node * vn = tb->tb_vn; int d_size, ih_size, bytes = -1; /* internal level */ if (h > 0) { if (!cur_free) { tb->rnum[h] = 0; return 0; } tb->rnum[h] = cur_free / (REISERFS_DC_SIZE + REISERFS_KEY_SIZE); return -1; } /* leaf level */ if (!cur_free || !vn->vn_nr_item) { /* no free space */ tb->rnum[h] = 0; tb->rbytes = -1; return 0; } if ((unsigned int)cur_free >= (vn->vn_size - ((vn->vn_vi[vn->vn_nr_item-1].vi_type & VI_TYPE_RIGHT_MERGEABLE) ? REISERFS_IH_SIZE : 0))) { /* all contents of S[0] fits into R[0] */ tb->rnum[h] = vn->vn_nr_item; tb->rbytes = -1; return -1; } d_size = 0, ih_size = REISERFS_IH_SIZE; /* last item may be merge with first item in right neighbor */ if (vn->vn_vi[vn->vn_nr_item - 1].vi_type & VI_TYPE_RIGHT_MERGEABLE) d_size = -(int)REISERFS_IH_SIZE, ih_size = 0; tb->rnum[0] = 0; for (i = vn->vn_nr_item - 1; i >= 0; i --, d_size = 0, ih_size = REISERFS_IH_SIZE) { d_size += vn->vn_vi[i].vi_item_len; if (cur_free >= d_size) { /* the item can be shifted entirely */ cur_free -= d_size; tb->rnum[0] ++; continue; } /* the item cannot be shifted entirely, try to split it */ if (vn->vn_vi[i].vi_type & VI_TYPE_STAT_DATA || vn->vn_vi[i].vi_type & VI_TYPE_INSERTED_DIRECTORY_ITEM) { /* virtual item is a stat_data or empty directory body ("." and "..), that is not split able */ tb->rbytes = -1; return -1; } /* check whether R[0] can hold ih and at least one byte of the item body */ if ( cur_free <= ih_size ) { /* cannot shift even a part of the current item */ tb->rbytes = -1; return -1; } /* R[0] can hold the header of the item and at least one byte of its body */ cur_free -= ih_size; /* cur_free is still > 0 */ /* item is of direct type */ if (vn->vn_vi[i].vi_type & VI_TYPE_DIRECT) { /* body of a direct item can be split by 8 bytes */ int align = vn->vn_vi[i].vi_item_len % 8; // reiserfs_warning(stderr,"\nbalancing: cur_free (%d) ", cur_free); tb->rbytes = bytes = (cur_free >= align) ? (align + ((cur_free - align) / 8 * 8)) : 0; // reiserfs_warning(stderr, "offset (0x%Lx) len (%d), move right (%d), get offset (0x%Lx)", // vn->vn_vi[i].vi_item_offset, vn->vn_vi[i].vi_item_len, bytes, // vn->vn_vi[i].vi_item_offset + vn->vn_vi[i].vi_item_len - bytes); } /* item is of extent type */ if (vn->vn_vi[i].vi_type & VI_TYPE_EXTENT) /* an unformatted node pointer (having size long) is a solid granule of the item */ tb->rbytes = bytes = cur_free - cur_free % REISERFS_EXT_SIZE; /* item is of directory type */ if (vn->vn_vi[i].vi_type & VI_TYPE_DIRECTORY) { int j; struct reiserfs_virtual_item * vi; tb->rbytes = 0; bytes = 0; vi = &vn->vn_vi[i]; for (j = vi->vi_entry_count - 1; j >= 0; j --) { if (vi->vi_entry_sizes[j] > cur_free) /* j-th entry doesn't fit into L[0] */ break; bytes += vi->vi_entry_sizes[j]; cur_free -= vi->vi_entry_sizes[j]; tb->rbytes ++; } /* ".." can not be cut from first directory item */ if ((vn->vn_vi[i].vi_type & VI_TYPE_FIRST_DIRECTORY_ITEM) && tb->rbytes > vi->vi_entry_count - 2) tb->rbytes = vi->vi_entry_count - 2; } if ( tb->rbytes <= 0 ) { /* nothing can flow from the item */ tb->rbytes = -1; return -1; } /* something can flow from the item */ tb->rnum[0] ++; return bytes; /* part of split item in bytes */ } reiserfs_panic ("vs-8095: check_right: all items fit in the left neighbor"); return 0; } /* sum of entry sizes between from-th and to-th entries including both edges */ static int directory_part_size (struct reiserfs_virtual_item * vi, int from, int to) { int i, retval; retval = 0; for (i = from; i <= to; i ++) retval += vi->vi_entry_sizes[i]; return retval; } /* * from - number of items, which are shifted to left neighbor entirely * to - number of item, which are shifted to right neighbor entirely * from_bytes - number of bytes of boundary item (or directory entries) which * are shifted to left neighbor * to_bytes - number of bytes of boundary item (or directory entries) which * are shifted to right neighbor */ static int get_num_ver (int mode, reiserfs_tb_t * tb, int h, int from, int from_bytes, int to, int to_bytes, short * snum012, int flow ) { int i; int bytes; struct reiserfs_virtual_node * vn = tb->tb_vn; struct reiserfs_virtual_item * vi; int total_node_size, max_node_size, current_item_size; int needed_nodes; int start_item, /* position of item we start filling node from */ end_item, /* position of item we finish filling node by */ start_bytes,/* number of first bytes (entries for directory) of start_item-th item we do not include into node that is being filled */ end_bytes; /* number of last bytes (entries for directory) of end_item-th item we do node include into node that is being filled */ int splitted_item_positions[2]; /* these are positions in virtual item of items, that are splitted between S[0] and S1new and S1new and S2new */ max_node_size = REISERFS_NODE_SPACE (tb->tb_fs->fs_blocksize); /* snum012 [0-2] - number of items, that lay to S[0], first new node and second new node */ snum012[3] = -1; /* s1bytes */ snum012[4] = -1; /* s2bytes */ /* internal level */ if (h > 0) { i = ((to - from) * (REISERFS_KEY_SIZE + REISERFS_DC_SIZE) + REISERFS_DC_SIZE); if (i == max_node_size) return 1; return (i / max_node_size + 1); } /* leaf level */ needed_nodes = 1; total_node_size = 0; start_item = from; start_bytes = from_bytes; end_item = vn->vn_nr_item - to - 1; end_bytes = to_bytes; /* go through all items begining from the start_item-th item and ending by the end_item-th item. If start_bytes != -1 we skip first start_bytes item units (entries in case of directory). If end_bytes != -1 we skip end_bytes units of the end_item-th item. */ for (i = start_item; i <= end_item; i ++) { /* get size of current item */ current_item_size = (vi = &vn->vn_vi[i])->vi_item_len; /* do not take in calculation head part (from_bytes) of from-th item */ if (i == start_item && start_bytes != -1) { if (vi->vi_type & VI_TYPE_DIRECTORY) current_item_size -= directory_part_size (vi, 0, start_bytes - 1); else current_item_size -= start_bytes; } /* do not take in calculation tail part of (to-1)-th item */ if (i == end_item && end_bytes != -1) { if (vi->vi_type & VI_TYPE_DIRECTORY) /* first entry, that is not included */ current_item_size -= directory_part_size (vi, vi->vi_entry_count - end_bytes, vi->vi_entry_count - 1); else current_item_size -= end_bytes; } /* if item fits into current node entirely */ if (total_node_size + current_item_size <= max_node_size) { snum012[needed_nodes - 1] ++; total_node_size += current_item_size; continue; } if (current_item_size > max_node_size) /* virtual item length is longer, than max size of item in a node. It is impossible for direct item */ /* we will try to split it */ flow = 1; if (!flow) { /* as we do not split items, take new node and continue */ needed_nodes ++; i --; total_node_size = 0; continue; } if (total_node_size + (int)REISERFS_IH_SIZE >= max_node_size) { /* even minimal item does not fit into current node, take new node and continue */ needed_nodes ++, i--, total_node_size = 0; continue; } if (vi->vi_type & VI_TYPE_STAT_DATA) { /* stat data can not be split */ needed_nodes ++, i--, total_node_size = 0; continue; } /*bytes is free space in filled node*/ bytes = max_node_size - total_node_size - REISERFS_IH_SIZE; if (vi->vi_type & VI_TYPE_DIRECT) { /* body of a direct item can be split by 8 bytes. */ int align = 8 - (vn->vn_vi[i].vi_item_offset - 1) % 8; // reiserfs_warning(stderr,"\nbalancing: cur_free (%d) ", bytes); // reiserfs_warning(stderr,"offset (0x%Lx), move (%d), get offset (0x%Lx)", // vn->vn_vi[i].vi_item_offset, (bytes - align) / 8 * 8, // vn->vn_vi[i].vi_item_offset + ((bytes - align) / 8 * 8)); bytes = (bytes >= align) ? (align + ((bytes - align) / 8 * 8)) : 0; } /* item is of extent type */ if (vi->vi_type & VI_TYPE_EXTENT) /* an unformatted node pointer (having size long) is a solid granule of the item. bytes of unformatted node pointers fits into free space of filled node */ bytes -= (bytes) % REISERFS_EXT_SIZE; /* S1bytes or S2bytes. It depends from needed_nodes */ snum012[needed_nodes - 1 + 3] = bytes; /* item is of directory type */ if (vi->vi_type & VI_TYPE_DIRECTORY) { /* calculate, how many entries can be put into current node */ int j; int end_entry; snum012[needed_nodes - 1 + 3] = 0; total_node_size += REISERFS_IH_SIZE; if (start_bytes == -1 || i != start_item) start_bytes = 0; end_entry = vi->vi_entry_count - ((i == end_item && end_bytes != -1) ? end_bytes : 0); for (j = start_bytes; j < end_entry; j ++) { /* j-th entry doesn't fit into current node */ if (total_node_size + vi->vi_entry_sizes[j] > max_node_size) break; snum012[needed_nodes - 1 + 3] ++; bytes += vi->vi_entry_sizes[j]; total_node_size += vi->vi_entry_sizes[j]; } /* "." can not be cut from first directory item */ if (start_bytes == 0 && (vn->vn_vi[i].vi_type & VI_TYPE_FIRST_DIRECTORY_ITEM) && snum012[needed_nodes - 1 + 3] < 2) snum012[needed_nodes - 1 + 3] = 0; } if (snum012[needed_nodes-1+3] <= 0 ) { /* nothing fits into current node, take new node and continue */ needed_nodes ++, i--, total_node_size = 0; continue; } /* something fits into the current node */ if (vi->vi_type & VI_TYPE_DIRECTORY) start_bytes += snum012[needed_nodes - 1 + 3]; else start_bytes = bytes; snum012[needed_nodes - 1] ++; splitted_item_positions[needed_nodes - 1] = i; needed_nodes ++; /* continue from the same item with start_bytes != -1 */ start_item = i; i --; total_node_size = 0; } /* snum012[3] and snum012[4] contain how many bytes (entries) of split item can be in S[0] and S1new. s1bytes and s2bytes are how many bytes (entries) can be in S1new and S2new. Recalculate it */ if (snum012[4] > 0) { /* s2bytes */ /* get number of item that is split between S1new and S2new */ int split_item_num; int bytes_to_r, bytes_to_l; split_item_num = splitted_item_positions[1]; bytes_to_l = ((from == split_item_num && from_bytes != -1) ? from_bytes : 0); bytes_to_r = ((end_item == split_item_num && end_bytes != -1) ? end_bytes : 0); if (vn->vn_vi[split_item_num].vi_type & VI_TYPE_DIRECTORY) { int entries_to_S2new; /* calculate number of entries fit into S2new */ entries_to_S2new = vn->vn_vi[split_item_num].vi_entry_count - snum012[4] - bytes_to_r - bytes_to_l; if (snum012[3] != -1 && snum012[1] == 1) { /* directory split into 3 nodes */ int entries_to_S1new; entries_to_S2new -= snum012[3]; entries_to_S1new = snum012[4]; snum012[3] = entries_to_S1new; snum012[4] = entries_to_S2new; return needed_nodes; } snum012[4] = entries_to_S2new; } else { /* item is not of directory type */ int bytes_to_S2new; bytes_to_S2new = vn->vn_vi[split_item_num].vi_item_len - REISERFS_IH_SIZE - snum012[4] - bytes_to_r - bytes_to_l; snum012[4] = bytes_to_S2new; } } /* now we know S2bytes, calculate S1bytes */ if (snum012[3] > 0) { /* s1bytes */ /* get number of item that is split between S0 and S1new */ int split_item_num; int bytes_to_r, bytes_to_l; split_item_num = splitted_item_positions[0]; bytes_to_l = ((from == split_item_num && from_bytes != -1) ? from_bytes : 0); bytes_to_r = ((end_item == split_item_num && end_bytes != -1) ? end_bytes : 0); if (vn->vn_vi[split_item_num].vi_type & VI_TYPE_DIRECTORY) { /* entries, who go to S1new node */ snum012[3] = vn->vn_vi[split_item_num].vi_entry_count - snum012[3] - bytes_to_r - bytes_to_l; } else /* bytes, who go to S1new node (not including HI_SIZE) */ snum012[3] = vn->vn_vi[split_item_num].vi_item_len - REISERFS_IH_SIZE - snum012[3] - bytes_to_r - bytes_to_l; } return needed_nodes; } /* size of item_num-th item in bytes when regular and in entries when item is directory */ static int item_length (reiserfs_tb_t * tb, int item_num) { struct reiserfs_virtual_node * vn = tb->tb_vn; if (vn->vn_vi[item_num].vi_type & VI_TYPE_DIRECTORY) return vn->vn_vi[item_num].vi_entry_count; return vn->vn_vi[item_num].vi_item_len - REISERFS_IH_SIZE; } /* Set parameters for balancing. * Performs write of results of analysis of balancing into structure tb, * where it will later be used by the functions that actually do the balancing. * Parameters: * tb tree_balance structure; * h current level of the node; * lnum number of items from S[h] that must be shifted to L[h]; * rnum number of items from S[h] that must be shifted to R[h]; * blk_num number of blocks that S[h] will be splitted into; * s012 number of items that fall into splitted nodes. * lbytes number of bytes which flow to the left neighbor from the item that is not * not shifted entirely * rbytes number of bytes which flow to the right neighbor from the item that is not * not shifted entirely * s1bytes number of bytes which flow to the first new node when S[0] splits (this number is contained in s012 array) */ static void set_parameters (reiserfs_tb_t * tb, int h, int lnum, int rnum, int blk_num, short * s012, int lb, int rb) { tb->lnum[h] = lnum; tb->rnum[h] = rnum; tb->blknum[h] = blk_num; if (h == 0) { /* only for leaf level */ if (s012 != NULL) { tb->s0num = * s012 ++, tb->s1num = * s012 ++, tb->s2num = * s012 ++; tb->s1bytes = * s012 ++; tb->s2bytes = * s012; } tb->lbytes = lb; tb->rbytes = rb; } } static void decrement_key (reiserfs_key_t * p_s_key) { int type; type = reiserfs_key_get_type (p_s_key); switch (type) { case TYPE_STAT_DATA: reiserfs_key_set_oid (p_s_key, reiserfs_key_get_oid (p_s_key) - 1); reiserfs_key_set_sec (reiserfs_key_format (p_s_key), p_s_key, REISERFS_SD_SIZE_MAX_V2, TYPE_EXTENT); return; case TYPE_EXTENT: case TYPE_DIRECT: case TYPE_DIRENTRY: reiserfs_key_set_off (reiserfs_key_format (p_s_key), p_s_key, reiserfs_key_get_off (p_s_key) - 1); if (reiserfs_key_get_off (p_s_key) == 0) reiserfs_key_set_type (reiserfs_key_format (p_s_key), p_s_key, TYPE_STAT_DATA); return; } reiserfs_warning (stderr, "vs-8125: decrement_key: item of wrong type found %k", p_s_key); } /* get left neighbor of the leaf node */ /* FIXME: move this to tree.c when get rid of fix_node.c:search_by_key. */ reiserfs_bh_t * reiserfs_tree_left_neighbor (reiserfs_filsys_t * s, reiserfs_path_t * path) { reiserfs_key_t key; reiserfs_path_t path_to_left_neighbor; reiserfs_bh_t * bh; reiserfs_key_copy (&key, reiserfs_ih_key_at (REISERFS_PATH_LEAF (path), 0)); decrement_key (&key); path_to_left_neighbor.path_length = REISERFS_PATH_OFFILL; search_by_key (s, &key, &path_to_left_neighbor, LEAF_LEVEL); if (REISERFS_PATH_LEAF_POS (&path_to_left_neighbor) == 0) { reiserfs_tree_pathrelse (&path_to_left_neighbor); return 0; } bh = REISERFS_PATH_LEAF (&path_to_left_neighbor); bh->b_count ++; reiserfs_tree_pathrelse (&path_to_left_neighbor); return bh; } /* FIXME: move this to tree.c when get rid of fix_node.c:search_by_key. */ reiserfs_bh_t * reiserfs_tree_right_neighbor (reiserfs_filsys_t * s, reiserfs_path_t * path) { reiserfs_key_t key; const reiserfs_key_t *rkey; reiserfs_path_t path_to_right_neighbor; reiserfs_bh_t * bh; rkey = reiserfs_tree_rkey (path, s); if (reiserfs_key_comp (rkey, &MIN_KEY) == 0) { reiserfs_panic ("vs-16080: reiserfs_tree_right_neighbor: " "reiserfs_tree_rkey returned min key (path " "has changed)"); } reiserfs_key_copy (&key, rkey); path_to_right_neighbor.path_length = REISERFS_PATH_OFFILL; search_by_key (s, &key, &path_to_right_neighbor, LEAF_LEVEL); if (REISERFS_PATH_LEAF (&path_to_right_neighbor) == REISERFS_PATH_LEAF (path)) { reiserfs_tree_pathrelse (&path_to_right_neighbor); return 0; } bh = REISERFS_PATH_LEAF (&path_to_right_neighbor); bh->b_count ++; reiserfs_tree_pathrelse (&path_to_right_neighbor); return bh; } /* check, does node disappear if we shift tb->lnum[0] items to left neighbor and tb->rnum[0] to the right one. */ static int is_leaf_removable (reiserfs_tb_t * tb) { struct reiserfs_virtual_node * vn = tb->tb_vn; int to_left, to_right; int size; int remain_items; /* number of items, that will be shifted to left (right) neighbor entirely */ to_left = tb->lnum[0] - ((tb->lbytes != -1) ? 1 : 0); to_right = tb->rnum[0] - ((tb->rbytes != -1) ? 1 : 0); remain_items = vn->vn_nr_item; /* how many items remain in S[0] after shiftings to neighbors */ remain_items -= (to_left + to_right); if (remain_items < 1) { /* all content of node can be shifted to neighbors */ set_parameters (tb, 0, to_left, vn->vn_nr_item - to_left, 0, NULL, -1, -1); return 1; } if (remain_items > 1 || tb->lbytes == -1 || tb->rbytes == -1) /* S[0] is not removable */ return 0; /* check, whether we can divide 1 remaining item between neighbors */ /* get size of remaining item (in directory entry count if directory) */ size = item_length (tb, to_left); if (tb->lbytes + tb->rbytes >= size) { set_parameters (tb, 0, to_left + 1, to_right + 1, 0, NULL, tb->lbytes, -1); return 1; } return 0; } /* check whether L, S, R can be joined in one node */ static int are_leaves_removable (reiserfs_tb_t * tb, int lfree, int rfree) { struct reiserfs_virtual_node * vn = tb->tb_vn; int ih_size; reiserfs_bh_t *S0; S0 = REISERFS_PATH_UPBUFFER (tb->tb_path, 0); ih_size = 0; if (vn->vn_nr_item) { if (vn->vn_vi[0].vi_type & VI_TYPE_LEFT_MERGEABLE) ih_size += REISERFS_IH_SIZE; if (vn->vn_vi[vn->vn_nr_item-1].vi_type & VI_TYPE_RIGHT_MERGEABLE) ih_size += REISERFS_IH_SIZE; } else { /* there was only one item and it will be deleted */ reiserfs_ih_t * ih; ih = reiserfs_ih_at (S0, 0); if (tb->CFR[0] && !reiserfs_key_comp2 (&(ih->ih_key), reiserfs_int_key_at (tb->CFR[0], tb->rkey[0]))) { if (reiserfs_ih_dir(ih)) { /* we can delete any directory item in fsck (if it is unreachable) */ if (reiserfs_key_get_off (&ih->ih_key) != OFFSET_DOT) { /* must get left neighbor here to make sure, that left neighbor is of the same directory */ reiserfs_bh_t * left; left = reiserfs_tree_left_neighbor (tb->tb_fs, tb->tb_path); if (left) { reiserfs_ih_t * last; if (reiserfs_node_items (left) == 0) reiserfs_panic ("vs-8135: are_leaves_removable: " "empty node in the tree"); last = reiserfs_ih_at (left, reiserfs_node_items (left) - 1); if (!reiserfs_key_comp2 (&last->ih_key, &ih->ih_key)) ih_size = REISERFS_IH_SIZE; reiserfs_buffer_close (left); } } } } } if ((int)REISERFS_NODE_SPACE(S0->b_size) + vn->vn_size <= rfree + lfree + ih_size) { set_parameters (tb, 0, -1, -1, -1, NULL, -1, -1); return 1; } return 0; } /* when we do not split item, lnum and rnum are numbers of entire items */ #define SET_PAR_SHIFT_LEFT \ if (h)\ {\ int to_l;\ \ to_l = (REISERFS_INT_MAX(Sh)+1 - lpar + vn->vn_nr_item + 1) / 2 -\ (REISERFS_INT_MAX(Sh) + 1 - lpar);\ \ set_parameters (tb, h, to_l, 0, lnver, NULL, -1, -1);\ }\ else \ {\ if (lset==LEFT_SHIFT_FLOW)\ set_parameters (tb, h, lpar, 0, lnver, snum012+lset,\ tb->lbytes, -1);\ else\ set_parameters (tb, h, lpar - (tb->lbytes!=-1), 0, lnver, snum012+lset,\ -1, -1);\ } #define SET_PAR_SHIFT_RIGHT \ if (h)\ {\ int to_r;\ \ to_r = (REISERFS_INT_MAX(Sh)+1 - rpar + vn->vn_nr_item + 1) / 2 - (REISERFS_INT_MAX(Sh) + 1 - rpar);\ \ set_parameters (tb, h, 0, to_r, rnver, NULL, -1, -1);\ }\ else \ {\ if (rset==RIGHT_SHIFT_FLOW)\ set_parameters (tb, h, 0, rpar, rnver, snum012+rset,\ -1, tb->rbytes);\ else\ set_parameters (tb, h, 0, rpar - (tb->rbytes!=-1), rnver, snum012+rset,\ -1, -1);\ } /* Get new buffers for storing new nodes that are created while balancing. * Returns: SCHEDULE_OCCURED - schedule occured while the function worked; * CARRY_ON - schedule didn't occur while the function worked; * NO_DISK_SPACE - no disk space. */ static int get_empty_nodes (reiserfs_tb_t * p_s_tb, int n_h) { reiserfs_bh_t * p_s_new_bh, * p_s_Sh = REISERFS_PATH_UPBUFFER (p_s_tb->tb_path, n_h); unsigned long * p_n_blocknr, a_n_blocknrs[FN_AMOUNT_MAX] = {0, }; int n_counter, n_number_of_freeblk, n_amount_needed,/* number of needed empty blocks */ n_repeat; reiserfs_filsys_t * fs = p_s_tb->tb_fs; if (n_h == 0 && p_s_tb->insert_size[n_h] == 0x7fff) return CARRY_ON; /* number_of_freeblk is the number of empty blocks which have been acquired for use by the balancing algorithm minus the number of empty blocks used in the previous levels of the analysis, number_of_freeblk = tb->cur_blknum can be non-zero if a schedule occurs after empty blocks are acquired, and the balancing analysis is then restarted, amount_needed is the number needed by this level (n_h) of the balancing analysis. Note that for systems with many processes writing, it would be more layout optimal to calculate the total number needed by all levels and then to run reiserfs_new_blocks to get all of them at once. */ /* Initiate number_of_freeblk to the amount acquired prior to the restart of the analysis or 0 if not restarted, then subtract the amount needed by all of the levels of the tree below n_h. */ /* blknum includes S[n_h], so we subtract 1 in this calculation */ for ( n_counter = 0, n_number_of_freeblk = p_s_tb->cur_blknum; n_counter < n_h; n_counter++ ) n_number_of_freeblk -= ( p_s_tb->blknum[n_counter] ) ? (p_s_tb->blknum[n_counter] - 1) : 0; /* Allocate missing empty blocks. */ /* if p_s_Sh == 0 then we are getting a new root */ n_amount_needed = ( p_s_Sh ) ? (p_s_tb->blknum[n_h] - 1) : 1; /* Amount_needed = the amount that we need more than the amount that we have. */ if ( n_amount_needed > n_number_of_freeblk ) n_amount_needed -= n_number_of_freeblk; else /* If we have enough already then there is nothing to do. */ return CARRY_ON; assert(fs->block_allocator != NULL); if ( (n_repeat = fs->block_allocator (p_s_tb->tb_fs, a_n_blocknrs, REISERFS_PATH_LEAF(p_s_tb->tb_path)->b_blocknr, n_amount_needed)) != CARRY_ON ) { return n_repeat; /* Out of disk space. */ } /* for each blocknumber we just got, get a buffer and stick it on FEB */ for ( p_n_blocknr = a_n_blocknrs, n_counter = 0; n_counter < n_amount_needed; p_n_blocknr++, n_counter++ ) { p_s_new_bh = reiserfs_buffer_open (fs->fs_dev, *p_n_blocknr, fs->fs_blocksize); if (p_s_new_bh->b_count > 1) { misc_die ("get_empty_nodes: not free empty buffer"); } /* Put empty buffers into the array. */ p_s_tb->FEB[p_s_tb->cur_blknum++] = p_s_new_bh; } return CARRY_ON; } /* Get free space of the left neighbor, * which is stored in the parent node of the left neighbor. */ static int get_lfree (reiserfs_tb_t * tb, int h) { reiserfs_bh_t * l, * f; int order; if ((f = REISERFS_PATH_UPPARENT (tb->tb_path, h)) == 0 || (l = tb->FL[h]) == 0) return 0; if (f == l) order = REISERFS_PATH_UPPARENT_POS (tb->tb_path, h) - 1; else { order = reiserfs_nh_get_items (NODE_HEAD(l)); f = l; } if (reiserfs_dc_get_size (reiserfs_int_at(f,order)) == 0) { reiserfs_warning (stderr, "get_lfree: block %u block_head %z has bad child pointer %y, order %d\n", l->b_blocknr, l, reiserfs_int_at(f,order), order); } return (REISERFS_NODE_SPACE(f->b_size) - reiserfs_dc_get_size (reiserfs_int_at(f,order))); } /* Get free space of the right neighbor, which is stored in the parent node of * the right neighbor. */ static int get_rfree (reiserfs_tb_t * tb, int h) { reiserfs_bh_t * r, * f; int order; if ((f = REISERFS_PATH_UPPARENT (tb->tb_path, h)) == 0 || (r = tb->FR[h]) == 0) return 0; if (f == r) order = REISERFS_PATH_UPPARENT_POS (tb->tb_path, h) + 1; else { order = 0; f = r; } return (REISERFS_NODE_SPACE(f->b_size) - reiserfs_dc_get_size (reiserfs_int_at(f,order))); } /* Check whether left neighbor is in memory. */ static int is_left_neighbor_in_cache (reiserfs_tb_t * p_s_tb, int n_h) { reiserfs_bh_t * p_s_father; reiserfs_filsys_t * fs = p_s_tb->tb_fs; unsigned long n_left_neighbor_blocknr; int n_left_neighbor_position; if ( ! p_s_tb->FL[n_h] ) /* Father of the left neighbor does not exist. */ return 0; /* Calculate father of the node to be balanced. */ p_s_father = REISERFS_PATH_UPBUFFER(p_s_tb->tb_path, n_h + 1); /* Get position of the pointer to the left neighbor into the left father. */ n_left_neighbor_position = ( p_s_father == p_s_tb->FL[n_h] ) ? p_s_tb->lkey[n_h] : reiserfs_nh_get_items (NODE_HEAD(p_s_tb->FL[n_h])); /* Get left neighbor block number. */ n_left_neighbor_blocknr = reiserfs_dc_get_nr (reiserfs_int_at (p_s_tb->FL[n_h], n_left_neighbor_position)); /* Look for the left neighbor in the cache. */ if ( (p_s_father = reiserfs_buffer_find(fs->fs_dev, n_left_neighbor_blocknr, fs->fs_blocksize)) ) { return 1; } return 0; } #define LEFT_PARENTS 'l' #define RIGHT_PARENTS 'r' /* Calculate far left/right parent of the left/right neighbor of the current node, that * is calculate the left/right (FL[h]/FR[h]) neighbor of the parent F[h]. * Calculate left/right common parent of the current node and L[h]/R[h]. * Calculate left/right delimiting key position. * Returns: PATH_INCORRECT - path in the tree is not correct; SCHEDULE_OCCURRED - schedule occured while the function worked; * CARRY_ON - schedule didn't occur while the function worked; */ static int get_far_parent (reiserfs_tb_t * p_s_tb, int n_h, reiserfs_bh_t ** pp_s_father, reiserfs_bh_t ** pp_s_com_father, char c_lr_par) { reiserfs_bh_t * p_s_parent; reiserfs_path_t s_path_to_neighbor_father, * p_s_path = p_s_tb->tb_path; reiserfs_key_t s_lr_father_key; int n_counter, n_position = -1, n_first_last_position = 0, n_path_offset = REISERFS_PATH_LEVEL(p_s_path, n_h); /* Starting from F[n_h] go upwards in the tree, and look for the common ancestor of F[n_h], and its neighbor l/r, that should be obtained. */ n_counter = n_path_offset; for ( ; n_counter > REISERFS_PATH_OFFINIT; n_counter-- ) { /* Check whether parent of the current buffer in the path is really parent in the tree. */ if ( ! REISERFS_NODE_INTREE(p_s_parent = REISERFS_PATH_BUFFER(p_s_path, n_counter - 1)) ) reiserfs_panic ("get_far_parent: buffer of path is notin the tree"); /* Check whether position in the parent is correct. */ if ( (n_position = REISERFS_PATH_POS(p_s_path, n_counter - 1)) > reiserfs_node_items(p_s_parent) ) reiserfs_panic ("get_far_parent: incorrect position in the parent"); /* Check whether parent at the path really points to the child. */ if ( reiserfs_dc_get_nr (reiserfs_int_at (p_s_parent, n_position)) != REISERFS_PATH_BUFFER(p_s_path, n_counter)->b_blocknr ) reiserfs_panic ("get_far_parent: incorrect disk child in the parent"); /* Return delimiting key if position in the parent is not equal to first/last one. */ if ( c_lr_par == RIGHT_PARENTS ) n_first_last_position = reiserfs_nh_get_items (NODE_HEAD(p_s_parent)); if ( n_position != n_first_last_position ) { (*pp_s_com_father = p_s_parent)->b_count++; break; } } /* we are in the root of the tree. */ if ( n_counter == REISERFS_PATH_OFFINIT ) { reiserfs_sb_t * sb; sb = p_s_tb->tb_fs->fs_ondisk_sb; /* Check whether first buffer in the path is the root of the tree. */ if ( REISERFS_PATH_BUFFER(p_s_tb->tb_path, REISERFS_PATH_OFFINIT)->b_blocknr == reiserfs_sb_get_root (sb) ) { *pp_s_father = *pp_s_com_father = NULL; return CARRY_ON; } reiserfs_panic ("get_far_parent: root not found in the path"); } if (n_position == -1) reiserfs_panic ("get_far_parent: position is not defined"); /* So, we got common parent of the current node and its left/right neighbor. Now we are geting the parent of the left/right neighbor. */ /* Form key to get parent of the left/right neighbor. */ reiserfs_key_copy(&s_lr_father_key, reiserfs_int_key_at(*pp_s_com_father, ( c_lr_par == LEFT_PARENTS ) ? (p_s_tb->lkey[n_h - 1] = n_position - 1) : (p_s_tb->rkey[n_h - 1] = n_position))); if ( c_lr_par == LEFT_PARENTS ) { //reiserfs_warning ("decrememnting key %k\n", &s_lr_father_key); decrement_key(&s_lr_father_key); //reiserfs_warning ("done: %k\n", &s_lr_father_key); } s_path_to_neighbor_father.path_length = REISERFS_PATH_OFFILL; if (search_by_key(p_s_tb->tb_fs, &s_lr_father_key, &s_path_to_neighbor_father, n_h + 1) == IO_ERROR) return IO_ERROR; *pp_s_father = REISERFS_PATH_LEAF(&s_path_to_neighbor_father); s_path_to_neighbor_father.path_length--; reiserfs_tree_pathrelse (&s_path_to_neighbor_father); //decrement_counters_in_path(&s_path_to_neighbor_father); return CARRY_ON; } /* Get parents of neighbors of node in the path(S[n_path_offset]) and common parents of * S[n_path_offset] and L[n_path_offset]/R[n_path_offset]: F[n_path_offset], FL[n_path_offset], * FR[n_path_offset], CFL[n_path_offset], CFR[n_path_offset]. * Calculate numbers of left and right delimiting keys position: lkey[n_path_offset], rkey[n_path_offset]. * Returns: SCHEDULE_OCCURRED - schedule occured while the function worked; * CARRY_ON - schedule didn't occur while the function worked; */ static int get_parents (reiserfs_tb_t * p_s_tb, int n_h) { reiserfs_path_t * p_s_path = p_s_tb->tb_path; int n_position, n_ret_value, n_path_offset = REISERFS_PATH_LEVEL(p_s_tb->tb_path, n_h); reiserfs_bh_t * p_s_curf, * p_s_curcf; /* Current node is the root of the tree or will be root of the tree */ if ( n_path_offset <= REISERFS_PATH_OFFINIT ) { /* The root can not have parents. Release nodes which previously were obtained as parents of the current node neighbors. */ reiserfs_buffer_close(p_s_tb->FL[n_h]); reiserfs_buffer_close(p_s_tb->CFL[n_h]); reiserfs_buffer_close(p_s_tb->FR[n_h]); reiserfs_buffer_close(p_s_tb->CFR[n_h]); //decrement_bcount(p_s_tb->FL[n_h]); //decrement_bcount(p_s_tb->CFL[n_h]); //decrement_bcount(p_s_tb->FR[n_h]); //decrement_bcount(p_s_tb->CFR[n_h]); p_s_tb->FL[n_h] = p_s_tb->CFL[n_h] = p_s_tb->FR[n_h] = p_s_tb->CFR[n_h] = NULL; return CARRY_ON; } /* Get parent FL[n_path_offset] of L[n_path_offset]. */ if ( (n_position = REISERFS_PATH_POS(p_s_path, n_path_offset - 1)) ) { /* Current node is not the first child of its parent. */ (p_s_curf = p_s_curcf = REISERFS_PATH_BUFFER(p_s_path, n_path_offset - 1))->b_count += 2; p_s_tb->lkey[n_h] = n_position - 1; } else { /* Calculate current parent of L[n_path_offset], which is the left neighbor of the current node. Calculate current common parent of L[n_path_offset] and the current node. Note that CFL[n_path_offset] not equal FL[n_path_offset] and CFL[n_path_offset] not equal F[n_path_offset]. Calculate lkey[n_path_offset]. */ if ( (n_ret_value = get_far_parent(p_s_tb, n_h + 1, &p_s_curf, &p_s_curcf, LEFT_PARENTS)) != CARRY_ON ) return n_ret_value; /*schedule() occured or path is not correct*/ } reiserfs_buffer_close(p_s_tb->FL[n_h]); p_s_tb->FL[n_h] = p_s_curf; /* New initialization of FL[n_h]. */ reiserfs_buffer_close(p_s_tb->CFL[n_h]); p_s_tb->CFL[n_h] = p_s_curcf; /* New initialization of CFL[n_h]. */ /* Get parent FR[n_h] of R[n_h]. */ /* Current node is the last child of F[n_h]. FR[n_h] != F[n_h]. */ if ( n_position == reiserfs_nh_get_items (NODE_HEAD(REISERFS_PATH_UPBUFFER(p_s_path, n_h + 1))) ) { /* Calculate current parent of R[n_h], which is the right neighbor of F[n_h]. Calculate current common parent of R[n_h] and current node. Note that CFR[n_h] not equal FR[n_path_offset] and CFR[n_h] not equal F[n_h]. */ if ( (n_ret_value = get_far_parent(p_s_tb, n_h + 1, &p_s_curf, &p_s_curcf, RIGHT_PARENTS)) != CARRY_ON ) return n_ret_value; /*schedule() occured while get_far_parent() worked.*/ } else { /* Current node is not the last child of its parent F[n_h]. */ (p_s_curf = p_s_curcf = REISERFS_PATH_BUFFER(p_s_path, n_path_offset - 1))->b_count += 2; p_s_tb->rkey[n_h] = n_position; } reiserfs_buffer_close/*decrement_bcount*/(p_s_tb->FR[n_h]); p_s_tb->FR[n_h] = p_s_curf; /* New initialization of FR[n_path_offset]. */ reiserfs_buffer_close/*decrement_bcount*/(p_s_tb->CFR[n_h]); p_s_tb->CFR[n_h] = p_s_curcf; /* New initialization of CFR[n_path_offset]. */ return CARRY_ON; /* schedule not occured while get_parents() worked. */ } /* it is possible to remove node as result of shiftings to neighbors even when we insert or paste item. */ static inline int can_node_be_removed (int mode, int lfree, int sfree, int rfree, reiserfs_tb_t * tb, int h) { reiserfs_bh_t * Sh = REISERFS_PATH_UPBUFFER (tb->tb_path, h); int levbytes = tb->insert_size[h]; reiserfs_ih_t * r_ih = NULL; if ( tb->CFR[h] ) r_ih = (reiserfs_ih_t *)reiserfs_int_key_at(tb->CFR[h],tb->rkey[h]); if (lfree + rfree + sfree < (int)(REISERFS_NODE_SPACE(Sh->b_size) + levbytes /* shifting may merge items which might save space */ - (( ! h && reiserfs_tree_left_mergeable (tb->tb_fs, tb->tb_path) == 1 ) ? REISERFS_IH_SIZE : 0) - (( ! h && r_ih && reiserfs_tree_right_mergeable (tb->tb_fs, tb->tb_path) == 1 ) ? REISERFS_IH_SIZE : 0) + (( h ) ? REISERFS_KEY_SIZE : 0))) { /* node can not be removed */ if (sfree >= levbytes ) /* new item fits into node S[h] without any shifting */ { if ( ! h ) tb->s0num = reiserfs_node_items(Sh) + ((mode == M_INSERT ) ? 1 : 0); set_parameters (tb, h, 0, 0, 1, NULL, -1, -1); return NO_BALANCING_NEEDED; } } return !NO_BALANCING_NEEDED; } /* Check whether current node S[h] is balanced when increasing its size by * Inserting or Pasting. * Calculate parameters for balancing for current level h. * Parameters: * tb tree_balance structure; * h current level of the node; * inum item number in S[h]; * mode i - insert, p - paste; * Returns: 1 - schedule occured; * 0 - balancing for higher levels needed; * -1 - no balancing for higher levels needed; * -2 - no disk space. */ /* ip means Inserting or Pasting */ static int ip_check_balance (reiserfs_tb_t * tb, int h) { struct reiserfs_virtual_node * vn = tb->tb_vn; int levbytes, /* Number of bytes that must be inserted into (value is negative if bytes are deleted) buffer which contains node being balanced. The mnemonic is that the attempted change in node space used level is levbytes bytes. */ n_ret_value; int lfree, sfree, rfree /* free space in L, S and R */; /* nver is short for number of vertices, and lnver is the number if we shift to the left, rnver is the number if we shift to the right, and lrnver is the number if we shift in both directions. The goal is to minimize first the number of vertices, and second, the number of vertices whose contents are changed by shifting, and third the number of uncached vertices whose contents are changed by shifting and must be read from disk. */ int nver, lnver, rnver, lrnver; /* used at leaf level only, S0 = S[0] is the node being balanced, sInum [ I = 0,1,2 ] is the number of items that will remain in node SI after balancing. S1 and S2 are new nodes that might be created. */ /* we perform 8 calls to get_num_ver(). For each call we calculate five parameters. where 4th parameter is s1bytes and 5th - s2bytes */ short snum012[40] = {0,}; /* s0num, s1num, s2num for 8 cases 0,1 - do not shift and do not shift but bottle 2 - shift only whole item to left 3 - shift to left and bottle as much as possible 4,5 - shift to right (whole items and as much as possible 6,7 - shift to both directions (whole items and as much as possible) */ /* Sh is the node whose balance is currently being checked */ reiserfs_bh_t * Sh; /* special mode for insert pointer to the most low internal node */ if (h == 0 && vn->vn_mode == M_INTERNAL) { /* blk_num == 2 is to get pointer inserted to the next level */ set_parameters (tb, h, 0, 0, 2, NULL, -1, -1); return 0; } Sh = REISERFS_PATH_UPBUFFER (tb->tb_path, h); levbytes = tb->insert_size[h]; /* Calculate balance parameters for creating new root. */ if ( ! Sh ) { if ( ! h ) reiserfs_panic ("vs-8210: ip_check_balance: S[0] can not be 0"); switch ( n_ret_value = get_empty_nodes (tb, h) ) { case CARRY_ON: set_parameters (tb, h, 0, 0, 1, NULL, -1, -1); return NO_BALANCING_NEEDED; /* no balancing for higher levels needed */ case NO_DISK_SPACE: return n_ret_value; default: reiserfs_panic("vs-8215: ip_check_balance: incorrect return value of get_empty_nodes"); } } if ( (n_ret_value = get_parents (tb, h)) != CARRY_ON ) /* get parents of S[h] neighbors. */ return n_ret_value; sfree = reiserfs_nh_get_free (NODE_HEAD(Sh)); /* get free space of neighbors */ rfree = get_rfree (tb, h); lfree = get_lfree (tb, h); if (can_node_be_removed (vn->vn_mode, lfree, sfree, rfree, tb, h) == NO_BALANCING_NEEDED) /* and new item fits into node S[h] without any shifting */ return NO_BALANCING_NEEDED; create_reiserfs_virtual_node (tb, h); /* determine maximal number of items we can shift to the left neighbor (in tb structure) and the maximal number of bytes that can flow to the left neighbor from the left most liquid item that cannot be shifted from S[0] entirely (returned value) */ check_left (tb, h, lfree); /* determine maximal number of items we can shift to the right neighbor (in tb structure) and the maximal number of bytes that can flow to the right neighbor from the right most liquid item that cannot be shifted from S[0] entirely (returned value) */ check_right (tb, h, rfree); /* all contents of internal node S[h] can be moved into its neighbors, S[h] will be removed after balancing */ if (h && (tb->rnum[h] + tb->lnum[h] >= vn->vn_nr_item + 1)) { int to_r; /* Since we are working on internal nodes, and our internal nodes have fixed size entries, then we can balance by the number of items rather than the space they consume. In this routine we set the left node equal to the right node, allowing a difference of less than or equal to 1 child pointer. */ to_r = ((REISERFS_INT_MAX(Sh)<<1)+2-tb->lnum[h]-tb->rnum[h]+vn->vn_nr_item+1)/2 - (REISERFS_INT_MAX(Sh) + 1 - tb->rnum[h]); set_parameters (tb, h, vn->vn_nr_item + 1 - to_r, to_r, 0, NULL, -1, -1); return CARRY_ON; } /* all contents of S[0] can be moved into its neighbors S[0] will be removed after balancing. */ if (!h && is_leaf_removable (tb)) return CARRY_ON; /* why do we perform this check here rather than earlier?? Answer: we can win 1 node in some cases above. Moreover we checked it above, when we checked, that S[0] is not removable in principle */ if (sfree >= levbytes) { /* new item fits into node S[h] without any shifting */ if ( ! h ) tb->s0num = vn->vn_nr_item; set_parameters (tb, h, 0, 0, 1, NULL, -1, -1); return NO_BALANCING_NEEDED; } { int lpar, rpar, nset, lset, rset, lrset; /* * regular overflowing of the node */ /* get_num_ver works in 2 modes (FLOW & NO_FLOW) lpar, rpar - number of items we can shift to left/right neighbor (including splitting item) nset, lset, rset, lrset - shows, whether flowing items give better packing */ #define FLOW 1 #define NO_FLOW 0 /* do not any splitting */ /* we choose one the following */ #define NOTHING_SHIFT_NO_FLOW 0 #define NOTHING_SHIFT_FLOW 5 #define LEFT_SHIFT_NO_FLOW 10 #define LEFT_SHIFT_FLOW 15 #define RIGHT_SHIFT_NO_FLOW 20 #define RIGHT_SHIFT_FLOW 25 #define LR_SHIFT_NO_FLOW 30 #define LR_SHIFT_FLOW 35 lpar = tb->lnum[h]; rpar = tb->rnum[h]; /* calculate number of blocks S[h] must be split into when nothing is shifted to the neighbors, as well as number of items in each part of the split node (s012 numbers), and number of bytes (s1bytes) of the shared drop which flow to S1 if any */ nset = NOTHING_SHIFT_NO_FLOW; nver = get_num_ver (vn->vn_mode, tb, h, 0, -1, h?vn->vn_nr_item:0, -1, snum012, NO_FLOW); if (!h) { int nver1; /* note, that in this case we try to bottle between S[0] and S1 (S1 - the first new node) */ nver1 = get_num_ver (vn->vn_mode, tb, h, 0, -1, 0, -1, snum012 + NOTHING_SHIFT_FLOW, FLOW); if (nver > nver1) nset = NOTHING_SHIFT_FLOW, nver = nver1; } /* calculate number of blocks S[h] must be split into when l_shift_num first items and l_shift_bytes of the right most liquid item to be shifted are shifted to the left neighbor, as well as number of items in each part of the split node (s012 numbers), and number of bytes (s1bytes) of the shared drop which flow to S1 if any */ lset = LEFT_SHIFT_NO_FLOW; lnver = get_num_ver (vn->vn_mode, tb, h, lpar - (( h || tb->lbytes == -1 ) ? 0 : 1), -1, h ? vn->vn_nr_item:0, -1, snum012 + LEFT_SHIFT_NO_FLOW, NO_FLOW); if (!h) { int lnver1; lnver1 = get_num_ver (vn->vn_mode, tb, h, lpar - ((tb->lbytes != -1) ? 1 : 0), tb->lbytes, 0, -1, snum012 + LEFT_SHIFT_FLOW, FLOW); if (lnver > lnver1) lset = LEFT_SHIFT_FLOW, lnver = lnver1; } /* calculate number of blocks S[h] must be split into when r_shift_num first items and r_shift_bytes of the left most liquid item to be shifted are shifted to the right neighbor, as well as number of items in each part of the splitted node (s012 numbers), and number of bytes (s1bytes) of the shared drop which flow to S1 if any */ rset = RIGHT_SHIFT_NO_FLOW; rnver = get_num_ver (vn->vn_mode, tb, h, 0, -1, h ? (vn->vn_nr_item-rpar) : (rpar - (( tb->rbytes != -1 ) ? 1 : 0)), -1, snum012 + RIGHT_SHIFT_NO_FLOW, NO_FLOW); if (!h) { int rnver1; rnver1 = get_num_ver (vn->vn_mode, tb, h, 0, -1, (rpar - ((tb->rbytes != -1) ? 1 : 0)), tb->rbytes, snum012 + RIGHT_SHIFT_FLOW, FLOW); if (rnver > rnver1) rset = RIGHT_SHIFT_FLOW, rnver = rnver1; } /* calculate number of blocks S[h] must be split into when items are shifted in both directions, as well as number of items in each part of the splitted node (s012 numbers), and number of bytes (s1bytes) of the shared drop which flow to S1 if any */ lrset = LR_SHIFT_NO_FLOW; lrnver = get_num_ver (vn->vn_mode, tb, h, lpar - ((h || tb->lbytes == -1) ? 0 : 1), -1, h ? (vn->vn_nr_item-rpar):(rpar - ((tb->rbytes != -1) ? 1 : 0)), -1, snum012 + LR_SHIFT_NO_FLOW, NO_FLOW); if (!h) { int lrnver1; lrnver1 = get_num_ver (vn->vn_mode, tb, h, lpar - ((tb->lbytes != -1) ? 1 : 0), tb->lbytes, (rpar - ((tb->rbytes != -1) ? 1 : 0)), tb->rbytes, snum012 + LR_SHIFT_FLOW, FLOW); if (lrnver > lrnver1) lrset = LR_SHIFT_FLOW, lrnver = lrnver1; } /* Our general shifting strategy is: 1) to minimized number of new nodes; 2) to minimized number of neighbors involved in shifting; 3) to minimized number of disk reads; */ /* we can win TWO or ONE nodes by shifting in both directions */ if (lrnver < lnver && lrnver < rnver) { if (lrset == LR_SHIFT_FLOW) set_parameters (tb, h, tb->lnum[h], tb->rnum[h], lrnver, snum012 + lrset, tb->lbytes, tb->rbytes); else set_parameters (tb, h, tb->lnum[h] - ((tb->lbytes == -1) ? 0 : 1), tb->rnum[h] - ((tb->rbytes == -1) ? 0 : 1), lrnver, snum012 + lrset, -1, -1); return CARRY_ON; } /* if shifting doesn't lead to better packing then don't shift */ if (nver == lrnver) { set_parameters (tb, h, 0, 0, nver, snum012 + nset, -1, -1); return CARRY_ON; } /* now we know that for better packing shifting in only one direction either to the left or to the right is required */ /* if shifting to the left is better than shifting to the right */ if (lnver < rnver) { SET_PAR_SHIFT_LEFT; return CARRY_ON; } /* if shifting to the right is better than shifting to the left */ if (lnver > rnver) { SET_PAR_SHIFT_RIGHT; return CARRY_ON; } /* now shifting in either direction gives the same number of nodes and we can make use of the cached neighbors */ if (is_left_neighbor_in_cache (tb,h)) { SET_PAR_SHIFT_LEFT; return CARRY_ON; } /* shift to the right independently on whether the right neighbor in cache or not */ SET_PAR_SHIFT_RIGHT; return CARRY_ON; } } /* Check whether current node S[h] is balanced when Decreasing its size by * Deleting or Cutting for INTERNAL node of internal tree. * Calculate parameters for balancing for current level h. * Parameters: * tb tree_balance structure; * h current level of the node; * inum item number in S[h]; * mode i - insert, p - paste; * Returns: 1 - schedule occured; * 0 - balancing for higher levels needed; * -1 - no balancing for higher levels needed; * -2 - no disk space. * * Note: Items of internal nodes have fixed size, so the balance condition for * the internal part of internal tree is as for the B-trees. */ static int dc_check_balance_internal (reiserfs_tb_t * tb, int h) { struct reiserfs_virtual_node * vn = tb->tb_vn; /* Sh is the node whose balance is currently being checked, and Fh is its father. */ reiserfs_bh_t * Sh, * Fh; int n_ret_value; int lfree, rfree /* free space in L and R */; Sh = REISERFS_PATH_UPBUFFER (tb->tb_path, h); Fh = REISERFS_PATH_UPPARENT (tb->tb_path, h); /* using tb->insert_size[h], which is negative in this case, create_reiserfs_virtual_node calculates: new_nr_item = number of items node would have if operation is performed without balancing (new_nr_item); */ create_reiserfs_virtual_node (tb, h); if ( ! Fh ) { /* S[h] is the root. */ if ( vn->vn_nr_item > 0 ) { set_parameters (tb, h, 0, 0, 1, NULL, -1, -1); return NO_BALANCING_NEEDED; /* no balancing for higher levels needed */ } /* new_nr_item == 0. * Current root will be deleted resulting in * decrementing the tree height. */ set_parameters (tb, h, 0, 0, 0, NULL, -1, -1); return CARRY_ON; } if ( (n_ret_value = get_parents(tb,h)) != CARRY_ON ) return n_ret_value; /* get free space of neighbors */ rfree = get_rfree (tb, h); lfree = get_lfree (tb, h); /* determine maximal number of items we can fit into neighbors */ check_left (tb, h, lfree); check_right (tb, h, rfree); if ( vn->vn_nr_item >= REISERFS_INT_MIN(Sh) ) { /* Balance condition for the internal node is valid. In this case we * balance only if it leads to better packing. */ if ( vn->vn_nr_item == REISERFS_INT_MIN(Sh) ) { /* Here we join S[h] with one of its neighbors, which is * impossible with greater values of new_nr_item. */ if ( tb->lnum[h] >= vn->vn_nr_item + 1 ) { /* All contents of S[h] can be moved to L[h]. */ int n; int order_L; order_L = ((n=REISERFS_PATH_UPPARENT_POS(tb->tb_path, h))==0) ? reiserfs_node_items(tb->FL[h]) : n - 1; n = reiserfs_dc_get_size (reiserfs_int_at(tb->FL[h],order_L)) / (REISERFS_DC_SIZE + REISERFS_KEY_SIZE); set_parameters (tb, h, -n-1, 0, 0, NULL, -1, -1); return CARRY_ON; } if ( tb->rnum[h] >= vn->vn_nr_item + 1 ) { /* All contents of S[h] can be moved to R[h]. */ int n; int order_R; order_R = ((n=REISERFS_PATH_UPPARENT_POS(tb->tb_path, h))==reiserfs_node_items(Fh)) ? 0 : n + 1; n = reiserfs_dc_get_size (reiserfs_int_at(tb->FR[h],order_R)) / (REISERFS_DC_SIZE + REISERFS_KEY_SIZE); set_parameters (tb, h, 0, -n-1, 0, NULL, -1, -1); return CARRY_ON; } } if (tb->rnum[h] + tb->lnum[h] >= vn->vn_nr_item + 1) { /* All contents of S[h] can be moved to the neighbors (L[h] & R[h]). */ int to_r; to_r = ((REISERFS_INT_MAX(Sh)<<1)+2-tb->lnum[h]-tb->rnum[h]+vn->vn_nr_item+1)/2 - (REISERFS_INT_MAX(Sh) + 1 - tb->rnum[h]); set_parameters (tb, h, vn->vn_nr_item + 1 - to_r, to_r, 0, NULL, -1, -1); return CARRY_ON; } /* Balancing does not lead to better packing. */ set_parameters (tb, h, 0, 0, 1, NULL, -1, -1); return NO_BALANCING_NEEDED; } /* Current node contain insufficient number of items. Balancing is required. Check whether we can merge S[h] with left neighbor. */ if (tb->lnum[h] >= vn->vn_nr_item + 1) if (is_left_neighbor_in_cache (tb,h) || tb->rnum[h] < vn->vn_nr_item + 1 || !tb->FR[h]) { int n; int order_L; order_L = ((n=REISERFS_PATH_UPPARENT_POS(tb->tb_path, h))==0) ? reiserfs_node_items(tb->FL[h]) : n - 1; n = reiserfs_dc_get_size (reiserfs_int_at(tb->FL[h],order_L)) / (REISERFS_DC_SIZE + REISERFS_KEY_SIZE); set_parameters (tb, h, -n-1, 0, 0, NULL, -1, -1); return CARRY_ON; } /* Check whether we can merge S[h] with right neighbor. */ if (tb->rnum[h] >= vn->vn_nr_item + 1) { int n; int order_R; order_R = ((n=REISERFS_PATH_UPPARENT_POS(tb->tb_path, h))==reiserfs_node_items(Fh)) ? 0 : (n + 1); n = reiserfs_dc_get_size (reiserfs_int_at(tb->FR[h],order_R)) / (REISERFS_DC_SIZE + REISERFS_KEY_SIZE); set_parameters (tb, h, 0, -n-1, 0, NULL, -1, -1); return CARRY_ON; } /* All contents of S[h] can be moved to the neighbors (L[h] & R[h]). */ if (tb->rnum[h] + tb->lnum[h] >= vn->vn_nr_item + 1) { int to_r; to_r = ((REISERFS_INT_MAX(Sh)<<1)+2-tb->lnum[h]-tb->rnum[h]+vn->vn_nr_item+1)/2 - (REISERFS_INT_MAX(Sh) + 1 - tb->rnum[h]); set_parameters (tb, h, vn->vn_nr_item + 1 - to_r, to_r, 0, NULL, -1, -1); return CARRY_ON; } /* For internal nodes try to borrow item from a neighbor */ /* Borrow one or two items from caching neighbor */ if (is_left_neighbor_in_cache (tb,h) || !tb->FR[h]) { int from_l; from_l = (REISERFS_INT_MAX(Sh) + 1 - tb->lnum[h] + vn->vn_nr_item + 1) / 2 - (vn->vn_nr_item + 1); set_parameters (tb, h, -from_l, 0, 1, NULL, -1, -1); return CARRY_ON; } set_parameters (tb, h, 0, -((REISERFS_INT_MAX(Sh)+1-tb->rnum[h]+vn->vn_nr_item+1)/2-(vn->vn_nr_item+1)), 1, NULL, -1, -1); return CARRY_ON; } /* Check whether current node S[h] is balanced when Decreasing its size by * Deleting or Truncating for LEAF node of internal tree. * Calculate parameters for balancing for current level h. * Parameters: * tb tree_balance structure; * h current level of the node; * inum item number in S[h]; * mode i - insert, p - paste; * Returns: 1 - schedule occured; * 0 - balancing for higher levels needed; * -1 - no balancing for higher levels needed; * -2 - no disk space. */ static int dc_check_balance_leaf (reiserfs_tb_t * tb, int h) { struct reiserfs_virtual_node * vn = tb->tb_vn; /* Number of bytes that must be deleted from (value is negative if bytes are deleted) buffer which contains node being balanced. The mnemonic is that the attempted change in node space used level is levbytes bytes. */ int levbytes; /* the maximal item size */ int n_ret_value; /* F0 is the parent of the node whose balance is currently being checked */ reiserfs_bh_t * F0; int lfree, rfree /* free space in L and R */; F0 = REISERFS_PATH_UPPARENT (tb->tb_path, 0); levbytes = tb->insert_size[h]; if ( ! F0 ) { /* S[0] is the root now. */ set_parameters (tb, h, 0, 0, 1, NULL, -1, -1); return NO_BALANCING_NEEDED; } if ( (n_ret_value = get_parents(tb,h)) != CARRY_ON ) return n_ret_value; /* get free space of neighbors */ rfree = get_rfree (tb, h); lfree = get_lfree (tb, h); create_reiserfs_virtual_node (tb, h); /* if 3 leaves can be merge to one, set parameters and return */ if (are_leaves_removable (tb, lfree, rfree)) return CARRY_ON; /* determine maximal number of items we can shift to the left/right neighbor and the maximal number of bytes that can flow to the left/right neighbor from the left/right most liquid item that cannot be shifted from S[0] entirely */ check_left (tb, h, lfree); check_right (tb, h, rfree); /* check whether we can merge S with left neighbor. */ if (tb->lnum[0] >= vn->vn_nr_item && tb->lbytes == -1) if (is_left_neighbor_in_cache (tb,h) || ((tb->rnum[0] - ((tb->rbytes == -1) ? 0 : 1)) < vn->vn_nr_item) || /* S can not be merged with R */ !tb->FR[h]) { /* set parameter to merge S[0] with its left neighbor */ set_parameters (tb, h, -1, 0, 0, NULL, -1, -1); return CARRY_ON; } /* check whether we can merge S[0] with right neighbor. */ if (tb->rnum[0] >= vn->vn_nr_item && tb->rbytes == -1) { set_parameters (tb, h, 0, -1, 0, NULL, -1, -1); return CARRY_ON; } /* All contents of S[0] can be moved to the neighbors (L[0] & R[0]). Set parameters and return */ if (is_leaf_removable (tb)) return CARRY_ON; /* Balancing is not required. */ tb->s0num = vn->vn_nr_item; set_parameters (tb, h, 0, 0, 1, NULL, -1, -1); return NO_BALANCING_NEEDED; } /* Check whether current node S[h] is balanced when Decreasing its size by * Deleting or Cutting. * Calculate parameters for balancing for current level h. * Parameters: * tb tree_balance structure; * h current level of the node; * inum item number in S[h]; * mode d - delete, c - cut. * Returns: 1 - schedule occured; * 0 - balancing for higher levels needed; * -1 - no balancing for higher levels needed; * -2 - no disk space. */ static int dc_check_balance (reiserfs_tb_t * tb, int h) { if ( h ) return dc_check_balance_internal (tb, h); else return dc_check_balance_leaf (tb, h); } /* Check whether current node S[h] is balanced. * Calculate parameters for balancing for current level h. * Parameters: * * tb tree_balance structure: * * tb is a large structure that must be read about in the header file * at the same time as this procedure if the reader is to successfully * understand this procedure * * h current level of the node; * inum item number in S[h]; * mode i - insert, p - paste, d - delete, c - cut. * Returns: 1 - schedule occured; * 0 - balancing for higher levels needed; * -1 - no balancing for higher levels needed; * -2 - no disk space. */ static int check_balance (int mode, reiserfs_tb_t * tb, int h, int inum, int pos_in_item, reiserfs_ih_t * ins_ih) { struct reiserfs_virtual_node * vn; vn = tb->tb_vn = (struct reiserfs_virtual_node *)(tb->vn_buf);// + MISC_ROUND_UP(SB_BMAP_NR (tb->tb_fs) * 2 / 8 + 1, 4)); vn->vn_free_ptr = (char *)(tb->tb_vn + 1); vn->vn_mode = mode; vn->vn_affected_item_num = inum; vn->vn_pos_in_item = pos_in_item; vn->vn_ins_ih = ins_ih; if ( tb->insert_size[h] > 0 ) /* Calculate balance parameters when size of node is increasing. */ return ip_check_balance (tb, h); /* Calculate balance parameters when size of node is decreasing. */ return dc_check_balance (tb, h); } /* Check whether parent at the path is the really parent of the current node.*/ static void get_direct_parent (reiserfs_tb_t * p_s_tb, int n_h) { reiserfs_bh_t * p_s_bh; reiserfs_path_t * p_s_path = p_s_tb->tb_path; int n_position, n_path_offset = REISERFS_PATH_LEVEL(p_s_tb->tb_path, n_h); /* We are in the root or in the new root. */ if ( n_path_offset <= REISERFS_PATH_OFFINIT ) { reiserfs_sb_t * sb; if ( n_path_offset < REISERFS_PATH_OFFINIT - 1 ) reiserfs_panic ("PAP-8260: get_direct_parent: illegal offset in the path"); sb = p_s_tb->tb_fs->fs_ondisk_sb; if ( REISERFS_PATH_BUFFER(p_s_path, REISERFS_PATH_OFFINIT)->b_blocknr == reiserfs_sb_get_root (sb) ) { /* Root is not changed. */ REISERFS_PATH_BUFFER(p_s_path, n_path_offset - 1) = NULL; REISERFS_PATH_POS(p_s_path, n_path_offset - 1) = 0; return; } reiserfs_panic ("get_direct_parent: root changed"); } if ( ! REISERFS_NODE_INTREE(p_s_bh = REISERFS_PATH_BUFFER(p_s_path, n_path_offset - 1)) ) reiserfs_panic ("get_direct_parent: parent in the path is not in the tree"); if ( (n_position = REISERFS_PATH_POS(p_s_path, n_path_offset - 1)) > reiserfs_node_items(p_s_bh) ) reiserfs_panic ("get_direct_parent: wrong position in the path"); if ( reiserfs_dc_get_nr (reiserfs_int_at(p_s_bh, n_position)) != REISERFS_PATH_BUFFER(p_s_path, n_path_offset)->b_blocknr ) reiserfs_panic ("get_direct_parent: parent in the path is not parent " "of the current node in the tree"); return ; /* Parent in the path is unlocked and really parent of the current node. */ } /* Using lnum[n_h] and rnum[n_h] we should determine what neighbors * of S[n_h] we * need in order to balance S[n_h], and get them if necessary. * Returns: SCHEDULE_OCCURRED - schedule occured while the function worked; * CARRY_ON - schedule didn't occur while the function worked; */ static int get_neighbors(reiserfs_tb_t * p_s_tb, int n_h) { int n_child_position, n_path_offset = REISERFS_PATH_LEVEL(p_s_tb->tb_path, n_h + 1); unsigned long n_son_number; reiserfs_filsys_t * fs = p_s_tb->tb_fs; reiserfs_bh_t * p_s_bh; /*struct reiserfs_virtual_node * vn = p_s_tb->tb_vn;*/ if ( p_s_tb->lnum[n_h] ) { /* We need left neighbor to balance S[n_h]. */ p_s_bh = REISERFS_PATH_BUFFER(p_s_tb->tb_path, n_path_offset); n_child_position = ( p_s_bh == p_s_tb->FL[n_h] ) ? p_s_tb->lkey[n_h] : reiserfs_nh_get_items (NODE_HEAD(p_s_tb->FL[n_h])); n_son_number = reiserfs_dc_get_nr (reiserfs_int_at (p_s_tb->FL[n_h], n_child_position)); p_s_bh = reiserfs_buffer_read(fs->fs_dev, n_son_number, fs->fs_blocksize); if (!p_s_bh) return IO_ERROR; reiserfs_buffer_close (p_s_tb->L[n_h]); p_s_tb->L[n_h] = p_s_bh; } if ( p_s_tb->rnum[n_h] ) { /* We need right neighbor to balance S[n_path_offset]. */ p_s_bh = REISERFS_PATH_BUFFER(p_s_tb->tb_path, n_path_offset); n_child_position = ( p_s_bh == p_s_tb->FR[n_h] ) ? p_s_tb->rkey[n_h] + 1 : 0; n_son_number = reiserfs_dc_get_nr (reiserfs_int_at (p_s_tb->FR[n_h], n_child_position)); p_s_bh = reiserfs_buffer_read(fs->fs_dev, n_son_number, fs->fs_blocksize); if (!p_s_bh) return IO_ERROR; reiserfs_buffer_close (p_s_tb->R[n_h]); p_s_tb->R[n_h] = p_s_bh; } return CARRY_ON; } static int get_mem_for_reiserfs_virtual_node (reiserfs_tb_t * tb) { tb->vn_buf = misc_getmem (tb->tb_fs->fs_blocksize); return CARRY_ON; } static void free_reiserfs_virtual_node_mem (reiserfs_tb_t * tb) { misc_freemem (tb->vn_buf); } /* Prepare for balancing, that is * get all necessary parents, and neighbors; * analyze what and where should be moved; * get sufficient number of new nodes; * Balancing will start only after all resources will be collected at a time. * * When ported to SMP kernels, only at the last moment after all needed nodes * are collected in cache, will the resources be locked using the usual * textbook ordered lock acquisition algorithms. Note that ensuring that * this code neither write locks what it does not need to write lock nor locks out of order * will be a pain in the butt that could have been avoided. Grumble grumble. -Hans * * fix is meant in the sense of render unchanging * * Latency might be improved by first gathering a list of what buffers are needed * and then getting as many of them in parallel as possible? -Hans * * Parameters: * op_mode i - insert, d - delete, c - cut (truncate), p - paste (append) * tb tree_balance structure; * inum item number in S[h]; * pos_in_item - comment this if you can * ins_ih & ins_sd are used when inserting * Returns: 1 - schedule occurred while the function worked; * 0 - schedule didn't occur while the function worked; * -1 - if no_disk_space */ int reiserfs_fix_nodes (int n_op_mode, reiserfs_tb_t * p_s_tb, reiserfs_ih_t * p_s_ins_ih) { int n_pos_in_item = p_s_tb->tb_path->pos_in_item; int n_ret_value, n_h, n_item_num = REISERFS_PATH_LEAF_POS (p_s_tb->tb_path); /* reiserfs_bh_t * p_s_tbS0 = REISERFS_PATH_LEAF (p_s_tb->tb_path);*/ /* reiserfs_ih_t * ih = REISERFS_PATH_IH (p_s_tb->tb_path);*/ if (get_mem_for_reiserfs_virtual_node (p_s_tb) != CARRY_ON) reiserfs_panic ("reiserfs_fix_nodes: no memory for virtual node"); /* Starting from the leaf level; for all levels n_h of the tree. */ for ( n_h = 0; n_h < REISERFS_TREE_HEIGHT_MAX && p_s_tb->insert_size[n_h]; n_h++ ) { get_direct_parent(p_s_tb, n_h); if ( (n_ret_value = check_balance (/*th,*/ n_op_mode, p_s_tb, n_h, n_item_num, n_pos_in_item, p_s_ins_ih)) != CARRY_ON ) { if ( n_ret_value == NO_BALANCING_NEEDED ) { /* No balancing for higher levels needed. */ if ( (n_ret_value = get_neighbors(p_s_tb, n_h)) != CARRY_ON ) { return n_ret_value; } if ( n_h != REISERFS_TREE_HEIGHT_MAX - 1 ) p_s_tb->insert_size[n_h + 1] = 0; /* ok, analysis and resource gathering are complete */ break; } return n_ret_value; } if ( (n_ret_value = get_neighbors(p_s_tb, n_h)) != CARRY_ON ) { return n_ret_value; } if ( (n_ret_value = get_empty_nodes(/*th,*/ p_s_tb, n_h)) != CARRY_ON ) { return n_ret_value; /* No disk space */ } if ( ! REISERFS_PATH_UPBUFFER(p_s_tb->tb_path, n_h) ) { /* We have a positive insert size but no nodes exist on this level, this means that we are creating a new root. */ if ( n_h < REISERFS_TREE_HEIGHT_MAX - 1 ) p_s_tb->insert_size[n_h + 1] = 0; } else if ( ! REISERFS_PATH_UPBUFFER(p_s_tb->tb_path, n_h + 1) ) { if ( p_s_tb->blknum[n_h] > 1 ) { /* The tree needs to be grown, so this node S[n_h] which is the root node is split into two nodes, and a new node (S[n_h+1]) will be created to become the root node. */ p_s_tb->insert_size[n_h + 1] = (REISERFS_DC_SIZE + REISERFS_KEY_SIZE) * (p_s_tb->blknum[n_h] - 1) + REISERFS_DC_SIZE; } else if ( n_h < REISERFS_TREE_HEIGHT_MAX - 1 ) p_s_tb->insert_size[n_h + 1] = 0; } else p_s_tb->insert_size[n_h + 1] = (REISERFS_DC_SIZE + REISERFS_KEY_SIZE) * (p_s_tb->blknum[n_h] - 1); } return CARRY_ON; /* go ahead and balance */ } void reiserfs_unfix_nodes (reiserfs_tb_t * p_s_tb) { reiserfs_path_t * p_s_path = p_s_tb->tb_path; int n_counter; // int i, j; //reiserfs_bh_t * bh; /* Release path buffers. */ reiserfs_tree_pathrelse(p_s_path); for ( n_counter = 0; n_counter < REISERFS_TREE_HEIGHT_MAX; n_counter++ ) { /* Release fathers and neighbors. */ reiserfs_buffer_close(p_s_tb->L[n_counter]); reiserfs_buffer_close(p_s_tb->R[n_counter]); reiserfs_buffer_close(p_s_tb->FL[n_counter]); reiserfs_buffer_close(p_s_tb->FR[n_counter]); reiserfs_buffer_close(p_s_tb->CFL[n_counter]); reiserfs_buffer_close(p_s_tb->CFR[n_counter]); } /* Could be optimized. Will be done by PAP someday */ for ( n_counter = 0; n_counter < TB_FEB_MAX; n_counter++ ) { if ( p_s_tb->FEB[n_counter] ) { /* release what was not used */ assert (p_s_tb->tb_fs->block_deallocator != NULL); p_s_tb->tb_fs->block_deallocator(p_s_tb->tb_fs, p_s_tb->FEB[n_counter]->b_blocknr); reiserfs_buffer_forget(p_s_tb->FEB[n_counter]); /* tree balance bitmap of bitmaps has bit set already */ } /* release used as new nodes including a new root */ reiserfs_buffer_close (p_s_tb->used[n_counter]); } free_reiserfs_virtual_node_mem (p_s_tb); } static char * vi_type (struct reiserfs_virtual_item * vi) { static char *types[]={"directory", "direct", "extent", "stat data"}; if (vi->vi_type & VI_TYPE_STAT_DATA) return types[3]; if (vi->vi_type & VI_TYPE_EXTENT) return types[2]; if (vi->vi_type & VI_TYPE_DIRECT) return types[1]; if (vi->vi_type & VI_TYPE_DIRECTORY) return types[0]; reiserfs_panic ("vi_type: 6000: unknown type (0x%x)", vi->vi_type); return NULL; } void reiserfs_fix_node_print(struct reiserfs_virtual_node * vn) { int i, j; printf ("VIRTUAL NODE CONTAINS %d items, has size %d,%s,%s, ITEM_POS=%d " "POS_IN_ITEM=%d MODE=\'%c\'\n", vn->vn_nr_item, vn->vn_size, (vn->vn_vi[0].vi_type & VI_TYPE_LEFT_MERGEABLE )? "left mergeable" : "", (vn->vn_vi[vn->vn_nr_item - 1].vi_type & VI_TYPE_RIGHT_MERGEABLE) ? "right mergeable" : "", vn->vn_affected_item_num, vn->vn_pos_in_item, vn->vn_mode); for (i = 0; i < vn->vn_nr_item; i ++) { printf ("%s %d %d", vi_type (&vn->vn_vi[i]), i, vn->vn_vi[i].vi_item_len); if (vn->vn_vi[i].vi_entry_sizes) { printf ("It is directory with %d entries: ", vn->vn_vi[i].vi_entry_count); for (j = 0; j < vn->vn_vi[i].vi_entry_count; j ++) printf ("%d ", vn->vn_vi[i].vi_entry_sizes[j]); } printf ("\n"); } } reiserfsprogs-3.6.20/libreiserfs/hash.c0000644000175300001440000001563410412227267015033 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ /* * Keyed 32-bit hash function using TEA in a Davis-Meyer function * H0 = Key * Hi = E Mi(Hi-1) + Hi-1 * * (see Applied Cryptography, 2nd edition, p448). * * Jeremy Fitzhardinge 1998 * * Jeremy has agreed to the contents of reiserfs/README. -Hans * Yura's function is added (04/07/2000) */ // // reiserfs_hash_keyed // reiserfs_hash_yura // r5 // #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #define DELTA 0x9E3779B9 #define FULLROUNDS 10 /* 32 is overkill, 16 is strong crypto */ #define PARTROUNDS 6 /* 6 gets complete mixing */ /* a, b, c, d - data; h0, h1 - accumulated hash */ #define TEACORE(rounds) \ do { \ __u32 sum = 0; \ int n = rounds; \ __u32 b0, b1; \ \ b0 = h0; \ b1 = h1; \ \ do \ { \ sum += DELTA; \ b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b); \ b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d); \ } while(--n); \ \ h0 += b0; \ h1 += b1; \ } while(0); __u32 reiserfs_hash_keyed(const char *msg, int len) { __u32 k[] = { 0x9464a485, 0x542e1a94, 0x3e846bff, 0xb75bcfc3}; __u32 h0 = k[0], h1 = k[1]; __u32 a, b, c, d; __u32 pad; int i; pad = (__u32)len | ((__u32)len << 8); pad |= pad << 16; while(len >= 16) { a = (__u32)msg[ 0] | (__u32)msg[ 1] << 8 | (__u32)msg[ 2] << 16| (__u32)msg[ 3] << 24; b = (__u32)msg[ 4] | (__u32)msg[ 5] << 8 | (__u32)msg[ 6] << 16| (__u32)msg[ 7] << 24; c = (__u32)msg[ 8] | (__u32)msg[ 9] << 8 | (__u32)msg[10] << 16| (__u32)msg[11] << 24; d = (__u32)msg[12] | (__u32)msg[13] << 8 | (__u32)msg[14] << 16| (__u32)msg[15] << 24; TEACORE(PARTROUNDS); len -= 16; msg += 16; } if (len >= 12) { if (len >= 16) *(int *)0 = 0; a = (__u32)msg[ 0] | (__u32)msg[ 1] << 8 | (__u32)msg[ 2] << 16| (__u32)msg[ 3] << 24; b = (__u32)msg[ 4] | (__u32)msg[ 5] << 8 | (__u32)msg[ 6] << 16| (__u32)msg[ 7] << 24; c = (__u32)msg[ 8] | (__u32)msg[ 9] << 8 | (__u32)msg[10] << 16| (__u32)msg[11] << 24; d = pad; for(i = 12; i < len; i++) { d <<= 8; d |= msg[i]; } } else if (len >= 8) { if (len >= 12) *(int *)0 = 0; a = (__u32)msg[ 0] | (__u32)msg[ 1] << 8 | (__u32)msg[ 2] << 16| (__u32)msg[ 3] << 24; b = (__u32)msg[ 4] | (__u32)msg[ 5] << 8 | (__u32)msg[ 6] << 16| (__u32)msg[ 7] << 24; c = d = pad; for(i = 8; i < len; i++) { c <<= 8; c |= msg[i]; } } else if (len >= 4) { if (len >= 8) *(int *)0 = 0; a = (__u32)msg[ 0] | (__u32)msg[ 1] << 8 | (__u32)msg[ 2] << 16| (__u32)msg[ 3] << 24; b = c = d = pad; for(i = 4; i < len; i++) { b <<= 8; b |= msg[i]; } } else { if (len >= 4) *(int *)0 = 0; a = b = c = d = pad; for(i = 0; i < len; i++) { a <<= 8; a |= msg[i]; } } TEACORE(FULLROUNDS); return h0^h1; } __u32 reiserfs_hash_yura (const char *msg, int len) { int j, pow; __u32 a, c; int i; for (pow=1,i=1; i < len; i++) pow = pow * 10; if (len == 1) a = msg[0]-48; else a = (msg[0] - 48) * pow; for (i=1; i < len; i++) { c = msg[i] - 48; for (pow=1,j=i; j < len-1; j++) pow = pow * 10; a = a + c * pow; } for (; i < 40; i++) { c = '0' - 48; for (pow=1,j=i; j < len-1; j++) pow = pow * 10; a = a + c * pow; } for (; i < 256; i++) { c = i; for (pow=1,j=i; j < len-1; j++) pow = pow * 10; a = a + c * pow; } a = a << 7; return a; } __u32 reiserfs_hash_r5 (const char *msg, int len) { __u32 a=0; int i; for (i = 0; i < len; i ++) { a += msg[i] << 4; a += msg[i] >> 4; a *= 11; } return a; } static const struct { hashf_t func; char * name; } hashes[REISERFS_HASH_LAST] = {{0, "not set"}, {reiserfs_hash_keyed, "\"tea\""}, {reiserfs_hash_yura, "\"rupasov\""}, {reiserfs_hash_r5, "\"r5\""}}; #define HASH_AMOUNT (sizeof (hashes) / sizeof (hashes [0])) #define good_name(hashfn,name,namelen,deh_offset) \ (reiserfs_hash_value (hashfn, name, namelen) == OFFSET_HASH (deh_offset)) /* this also sets hash function */ int reiserfs_hash_correct (hashf_t *func, char * name, int namelen, __u32 offset) { unsigned int i; if (namelen == 1 && name[0] == '.') { if (offset == OFFSET_DOT) return 1; return 0; } if (namelen == 2 && name[0] == '.' && name[1] == '.') { if (offset == OFFSET_DOT_DOT) return 1; return 0; } if (*func == 0) { /* try to find what hash function the name is sorted with */ for (i = 1; i < HASH_AMOUNT; i ++) { if (good_name (hashes [i].func, name, namelen, offset)) { if (*func) { /* two or more hash functions give ok for this name */ fprintf (stderr, "Detecting hash code: could not detect " "hash with name \"%.*s\"\n", namelen, name); *func = 0; return 0; } /* set hash function */ *func = hashes [i].func; } } if (*func == 0) return 0; } if (good_name (*func, name, namelen, offset)) return 1; return 0; } int reiserfs_hash_find (char * name, int namelen, __u32 offset, unsigned int code_to_try_first) { unsigned int i; if (!namelen || !name[0]) return UNSET_HASH; if (code_to_try_first) { if (good_name (hashes [code_to_try_first].func, name, namelen, offset)) return code_to_try_first; } for (i = 1; i < HASH_AMOUNT; i ++) { if (i == code_to_try_first) continue; if (good_name (hashes [i].func, name, namelen, offset)) return i; } /* not matching hash found */ return UNSET_HASH; } char * reiserfs_hash_name(unsigned int code) { if (code >= HASH_AMOUNT || code < 0) return 0; return hashes [code].name; } int reiserfs_hash_code (hashf_t func) { unsigned int i; for (i = 0; i < HASH_AMOUNT; i ++) if (func == hashes [i].func) return i; reiserfs_panic ("reiserfs_hash_code: no hashes matches this function\n"); return 0; } hashf_t reiserfs_hash_func(unsigned int code) { if (code >= HASH_AMOUNT) { reiserfs_warning (stderr, "reiserfs_hash_func: wrong hash code %d.\n" "Using default %s hash function\n", code, reiserfs_hash_name (DEFAULT_HASH)); code = DEFAULT_HASH; } return hashes [code].func; } hashf_t reiserfs_hash_get (char * hash) { unsigned int i; for (i = 0; i < HASH_AMOUNT; i ++) if (!strcmp (hash, hashes [i].name)) return hashes [i].func; return 0; } __u32 reiserfs_hash_value (hashf_t func, char * name, int namelen) { __u32 res; res = func (name, namelen); res = OFFSET_HASH(res); if (res == 0) res = 128; return res; } reiserfsprogs-3.6.20/libreiserfs/internal.c0000644000175300001440000000455010412227267015717 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" /* returns 1 if buf looks like an internal node, 0 otherwise */ int reiserfs_internal_correct (reiserfs_bh_t *bh) { reiserfs_node_head_t * blkh; unsigned int nr; int used_space; blkh = (reiserfs_node_head_t *)bh->b_data; if (!reiserfs_int_head (bh)) return 0; nr = reiserfs_nh_get_items (blkh); if (nr > (bh->b_size - REISERFS_NODEH_SIZE - REISERFS_DC_SIZE) / (REISERFS_KEY_SIZE + REISERFS_DC_SIZE)) { /* for internal which is not root we might check min number of keys */ return 0; } used_space = REISERFS_NODEH_SIZE + REISERFS_KEY_SIZE * nr + REISERFS_DC_SIZE * (nr + 1); if (used_space != bh->b_size - reiserfs_nh_get_free (blkh)) return 0; // one may imagine much more checks return 1; } /* this prints internal nodes (4 keys/items in line) (dc_number, dc_size)[k_dirid, k_objectid, k_offset, k_uniqueness](dc_number, dc_size)...*/ int reiserfs_internal_print (FILE * fp, reiserfs_bh_t * bh, int first, int last) { reiserfs_key_t * key; reiserfs_dc_t * dc; int i; int from, to; if (!reiserfs_int_head (bh)) return 1; if (first == -1) { from = 0; to = reiserfs_node_items (bh); } else { from = first; to = last < reiserfs_node_items (bh) ? last : reiserfs_node_items (bh); } reiserfs_warning (fp, "INTERNAL NODE (%ld) contains %b\n", bh->b_blocknr, bh); dc = reiserfs_int_at (bh, from); reiserfs_warning (fp, "PTR %d: %y ", from, dc); for (i = from, key = reiserfs_int_key_at (bh, from), dc ++; i < to; i ++, key ++, dc ++) { reiserfs_warning (fp, "KEY %d: %20k PTR %d: %20y ", i, key, i + 1, dc); if (i && i % 4 == 0) reiserfs_warning (fp, "\n"); } reiserfs_warning (fp, "\n"); return 0; } /* internal node bh must point to block */ int reiserfs_internal_get_pos (reiserfs_bh_t * bh, unsigned long block) { int i; for (i = 0; i <= reiserfs_node_items (bh); i ++) { if (reiserfs_dc_get_nr (reiserfs_int_at (bh, i)) == block) return i; } misc_die ("An internal pointer to the block (%lu) cannot be " "found in the node (%lu)", block, bh->b_blocknr); return 0; } reiserfsprogs-3.6.20/libreiserfs/internal_balance.c0000644000175300001440000007645010412227267017374 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" /* modes of reiserfs_ib_shift_left, reiserfs_ib_shift_right and reiserfs_ib_insert */ #define INTERNAL_SHIFT_FROM_S_TO_L 0 #define INTERNAL_SHIFT_FROM_R_TO_S 1 #define INTERNAL_SHIFT_FROM_L_TO_S 2 #define INTERNAL_SHIFT_FROM_S_TO_R 3 #define INTERNAL_INSERT_TO_S 4 #define INTERNAL_INSERT_TO_L 5 #define INTERNAL_INSERT_TO_R 6 static void reiserfs_ib_shift_prep (int shift_mode, reiserfs_tb_t * tb, int h, reiserfs_bufinfo_t * dest_bi, reiserfs_bufinfo_t * src_bi, int * d_key, reiserfs_bh_t ** cf) { /* define dest, src, dest parent, dest position */ switch (shift_mode) { case INTERNAL_SHIFT_FROM_S_TO_L: /* used in reiserfs_ib_shift_left */ src_bi->bi_bh = REISERFS_PATH_UPBUFFER (tb->tb_path, h); src_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h); src_bi->bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1); dest_bi->bi_bh = tb->L[h]; dest_bi->bi_parent = tb->FL[h]; dest_bi->bi_position = reiserfs_tb_lpos (tb, h); *d_key = tb->lkey[h]; *cf = tb->CFL[h]; break; case INTERNAL_SHIFT_FROM_L_TO_S: src_bi->bi_bh = tb->L[h]; src_bi->bi_parent = tb->FL[h]; src_bi->bi_position = reiserfs_tb_lpos (tb, h); dest_bi->bi_bh = REISERFS_PATH_UPBUFFER (tb->tb_path, h); dest_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h); /* dest position is analog of dest->b_item_order */ dest_bi->bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1); *d_key = tb->lkey[h]; *cf = tb->CFL[h]; break; case INTERNAL_SHIFT_FROM_R_TO_S: /* used in reiserfs_ib_shift_left */ src_bi->bi_bh = tb->R[h]; src_bi->bi_parent = tb->FR[h]; src_bi->bi_position = reiserfs_tb_rpos (tb, h); dest_bi->bi_bh = REISERFS_PATH_UPBUFFER (tb->tb_path, h); dest_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h); dest_bi->bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1); *d_key = tb->rkey[h]; *cf = tb->CFR[h]; break; case INTERNAL_SHIFT_FROM_S_TO_R: src_bi->bi_bh = REISERFS_PATH_UPBUFFER (tb->tb_path, h); src_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h); src_bi->bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1); dest_bi->bi_bh = tb->R[h]; dest_bi->bi_parent = tb->FR[h]; dest_bi->bi_position = reiserfs_tb_rpos (tb, h); *d_key = tb->rkey[h]; *cf = tb->CFR[h]; break; case INTERNAL_INSERT_TO_L: dest_bi->bi_bh = tb->L[h]; dest_bi->bi_parent = tb->FL[h]; dest_bi->bi_position = reiserfs_tb_lpos (tb, h); break; case INTERNAL_INSERT_TO_S: dest_bi->bi_bh = REISERFS_PATH_UPBUFFER (tb->tb_path, h); dest_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h); dest_bi->bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1); break; case INTERNAL_INSERT_TO_R: dest_bi->bi_bh = tb->R[h]; dest_bi->bi_parent = tb->FR[h]; dest_bi->bi_position = reiserfs_tb_rpos (tb, h); break; default: reiserfs_panic ("reiserfs_ib_shift_prep", "shift type is unknown (%d)", shift_mode); } } /* Insert 'count' node pointers into buffer cur before position 'to' + 1. * Insert count items into buffer cur before position to. * Items and node pointers are specified by inserted and bh respectively. */ static void reiserfs_ib_insert (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * cur_bi, int to, int count, reiserfs_ih_t * inserted, reiserfs_bh_t ** bh) { reiserfs_bh_t * cur = cur_bi->bi_bh; reiserfs_node_head_t * blkh; int nr; reiserfs_key_t * key; reiserfs_dc_t new_dc[2]; reiserfs_dc_t * dc; int i; int from; if (count <= 0) return; blkh = NODE_HEAD (cur); nr = reiserfs_nh_get_items (blkh); /* prepare space for count disk_child */ dc = reiserfs_int_at (cur,to+1); memmove (dc + count, dc, (nr+1-(to+1)) * REISERFS_DC_SIZE); /* make disk child array for insertion */ for (i = 0; i < count; i ++) { reiserfs_dc_init(new_dc + i, REISERFS_NODE_SPACE(bh[i]->b_size) - reiserfs_nh_get_free (NODE_HEAD (bh[i])), bh[i]->b_blocknr); /* reiserfs_dc_set_size (new_dc + i, REISERFS_NODE_SPACE(bh[i]->b_size) - reiserfs_nh_get_free (NODE_HEAD (bh[i]))); reiserfs_dc_set_nr (new_dc + i, bh[i]->b_blocknr);*/ } memcpy (dc, new_dc, REISERFS_DC_SIZE * count); /* prepare space for 'count' items */ from = ((to == -1) ? 0 : to); key = reiserfs_int_key_at (cur, from); memmove (key + count, key, (nr - from/*to*/) * REISERFS_KEY_SIZE + (nr + 1 + count) * REISERFS_DC_SIZE); /* copy keys */ memcpy (key, inserted, REISERFS_KEY_SIZE); if ( count > 1 ) memcpy (key + 1, inserted + 1, REISERFS_KEY_SIZE); /* sizes, item number */ reiserfs_nh_set_items (blkh, nr + count); reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) - count * (REISERFS_DC_SIZE + REISERFS_KEY_SIZE)); reiserfs_buffer_mkdirty (cur); if (cur_bi->bi_parent) { dc = reiserfs_int_at (cur_bi->bi_parent,cur_bi->bi_position); reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) + count * (REISERFS_DC_SIZE + REISERFS_KEY_SIZE)); reiserfs_buffer_mkdirty (cur_bi->bi_parent); } } /* Delete del_num items and node pointers from buffer cur starting from * * the first_i'th item and first_p'th pointers respectively. */ static void reiserfs_ib_delete (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * cur_bi, int first_p, int first_i, int del_num) { reiserfs_bh_t * cur = cur_bi->bi_bh; int nr; reiserfs_node_head_t * blkh; reiserfs_key_t * key; reiserfs_dc_t * dc; if ( del_num == 0 ) return; blkh = NODE_HEAD(cur); nr = reiserfs_nh_get_items (blkh); if ( first_p == 0 && del_num == nr + 1 ) { reiserfs_tb_attach_new(cur_bi); return; } /* deleting */ dc = reiserfs_int_at (cur, first_p); memmove (dc, dc + del_num, (nr + 1 - first_p - del_num) * REISERFS_DC_SIZE); key = reiserfs_int_key_at (cur, first_i); memmove (key, key + del_num, (nr - first_i - del_num) * REISERFS_KEY_SIZE + (nr + 1 - del_num) * REISERFS_DC_SIZE); /* sizes, item number */ reiserfs_nh_set_items (blkh, reiserfs_nh_get_items (blkh) - del_num); reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) + del_num * (REISERFS_KEY_SIZE + REISERFS_DC_SIZE)); reiserfs_buffer_mkdirty (cur); if (cur_bi->bi_parent) { dc = reiserfs_int_at (cur_bi->bi_parent, cur_bi->bi_position); reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) - del_num * (REISERFS_KEY_SIZE + REISERFS_DC_SIZE)); reiserfs_buffer_mkdirty (cur_bi->bi_parent); } } /* copy cpy_num node pointers and cpy_num - 1 items from buffer src to buffer dest last_first == FIRST_TO_LAST means, that we copy first items from src to tail of dest last_first == LAST_TO_FIRST means, that we copy last items from src to head of dest */ static void reiserfs_ib_copy (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * dest_bi, reiserfs_bh_t * src, int last_first, int cpy_num) { /* ATTENTION! Number of node pointers in DEST is equal to number of items in DEST as delimiting key have already inserted to buffer dest.*/ reiserfs_bh_t * dest = dest_bi->bi_bh; int nr_dest, nr_src; int dest_order, src_order; reiserfs_node_head_t * blkh; reiserfs_key_t * key; reiserfs_dc_t * dc; nr_src = reiserfs_node_items (src); if ( cpy_num == 0 ) return; /* coping */ blkh = NODE_HEAD (dest); nr_dest = reiserfs_nh_get_items (blkh); /*dest_order = (last_first == LAST_TO_FIRST) ? 0 : nr_dest;*/ /*src_order = (last_first == LAST_TO_FIRST) ? (nr_src - cpy_num + 1) : 0;*/ (last_first == LAST_TO_FIRST) ? (dest_order = 0, src_order = nr_src - cpy_num + 1) : (dest_order = nr_dest, src_order = 0); /* prepare space for cpy_num pointers */ dc = reiserfs_int_at (dest, dest_order); memmove (dc + cpy_num, dc, (nr_dest - dest_order) * REISERFS_DC_SIZE); /* insert pointers */ memcpy (dc, reiserfs_int_at (src, src_order), REISERFS_DC_SIZE * cpy_num); /* prepare space for cpy_num - 1 item headers */ key = reiserfs_int_key_at(dest, dest_order); memmove (key + cpy_num - 1, key, REISERFS_KEY_SIZE * (nr_dest - dest_order) + REISERFS_DC_SIZE * (nr_dest + cpy_num)); /* insert headers */ memcpy (key, reiserfs_int_key_at (src, src_order), REISERFS_KEY_SIZE * (cpy_num - 1)); /* sizes, item number */ reiserfs_nh_set_items (blkh, reiserfs_nh_get_items (blkh) + cpy_num - 1); reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) - (REISERFS_KEY_SIZE * (cpy_num - 1) + REISERFS_DC_SIZE * cpy_num)); reiserfs_buffer_mkdirty (dest); if (dest_bi->bi_parent) { dc = reiserfs_int_at(dest_bi->bi_parent,dest_bi->bi_position); reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) + REISERFS_KEY_SIZE * (cpy_num - 1) + REISERFS_DC_SIZE * cpy_num); reiserfs_buffer_mkdirty (dest_bi->bi_parent); } } /* Copy cpy_num node pointers and cpy_num - 1 items from buffer src to buffer dest. Delete cpy_num - del_par items and node pointers from buffer src. last_first == FIRST_TO_LAST means, that we copy/delete first items from src. last_first == LAST_TO_FIRST means, that we copy/delete last items from src. */ static void reiserfs_ib_move (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * dest_bi, reiserfs_bufinfo_t * src_bi, int last_first, int cpy_num, int del_par) { int first_pointer; int first_item; reiserfs_ib_copy (fs, dest_bi, src_bi->bi_bh, last_first, cpy_num); if (last_first == FIRST_TO_LAST) { /* shift_left occurs */ first_pointer = 0; first_item = 0; /* delete cpy_num - del_par pointers and keys starting for pointers with first_pointer, for key - with first_item */ reiserfs_ib_delete (fs, src_bi, first_pointer, first_item, cpy_num - del_par); } else { /* shift_right occurs */ int i, j; i = ( cpy_num - del_par == ( j = reiserfs_node_items(src_bi->bi_bh)) + 1 ) ? 0 : j - cpy_num + del_par; reiserfs_ib_delete (fs, src_bi, j + 1 - cpy_num + del_par, i, cpy_num - del_par); } } /* Insert n_src'th key of buffer src before n_dest'th key of buffer dest. */ static void reiserfs_ib_insert_key (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * dest_bi, /* insert key before key with n_dest number */ int dest_position_before, reiserfs_bh_t * src, int src_position ) { reiserfs_bh_t * dest = dest_bi->bi_bh; int nr; reiserfs_node_head_t * blkh; reiserfs_key_t * key; blkh = NODE_HEAD(dest); nr = reiserfs_nh_get_items (blkh); /* prepare space for inserting key */ key = reiserfs_int_key_at (dest, dest_position_before); memmove (key + 1, key, (nr - dest_position_before) * REISERFS_KEY_SIZE + (nr + 1) * REISERFS_DC_SIZE); /* insert key */ memcpy (key, reiserfs_int_key_at(src, src_position), REISERFS_KEY_SIZE); /* Change dirt, free space, item number fields. */ reiserfs_nh_set_items (blkh, reiserfs_nh_get_items (blkh) + 1); reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) - REISERFS_KEY_SIZE); reiserfs_buffer_mkdirty (dest); if (dest_bi->bi_parent) { reiserfs_dc_t * dc; dc = reiserfs_int_at(dest_bi->bi_parent,dest_bi->bi_position); reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) + REISERFS_KEY_SIZE); reiserfs_buffer_mkdirty (dest_bi->bi_parent); } } /* Insert d_key'th (delimiting) key from buffer cfl to tail of dest. * Copy pointer_amount node pointers and pointer_amount - 1 items from * buffer src to buffer dest. * Replace d_key'th key in buffer cfl. * Delete pointer_amount items and node pointers from buffer src. */ /* this can be invoked both to shift from S to L and from R to S */ static void reiserfs_ib_shift_left (/* INTERNAL_FROM_S_TO_L | INTERNAL_FROM_R_TO_S */ int mode, reiserfs_tb_t * tb, int h, int pointer_amount) { reiserfs_bufinfo_t dest_bi, src_bi; reiserfs_bh_t * cf; int d_key_position; reiserfs_ib_shift_prep (mode, tb, h, &dest_bi, &src_bi, &d_key_position, &cf); /*printk("pointer_amount = %d\n",pointer_amount);*/ if (pointer_amount) { /* insert delimiting key from common father of dest and src to node dest into position B_NR_ITEM(dest) */ reiserfs_ib_insert_key (tb->tb_fs, &dest_bi, reiserfs_node_items(dest_bi.bi_bh), cf, d_key_position); if (reiserfs_node_items(src_bi.bi_bh) == pointer_amount - 1) { if (src_bi.bi_position/*src->b_item_order*/ == 0) reiserfs_node_replace_key (cf, d_key_position, src_bi.bi_parent, 0); } else { reiserfs_node_replace_key (cf, d_key_position, src_bi.bi_bh, pointer_amount - 1); } } /* last parameter is del_parameter */ reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, FIRST_TO_LAST, pointer_amount, 0); } /* Insert delimiting key to L[h]. * Copy n node pointers and n - 1 items from buffer S[h] to L[h]. * Delete n - 1 items and node pointers from buffer S[h]. */ /* it always shifts from S[h] to L[h] */ static void reiserfs_ib_shift1_left (reiserfs_tb_t * tb, int h, int pointer_amount) { reiserfs_bufinfo_t dest_bi, src_bi; reiserfs_bh_t * cf; int d_key_position; reiserfs_ib_shift_prep (INTERNAL_SHIFT_FROM_S_TO_L, tb, h, &dest_bi, &src_bi, &d_key_position, &cf); if ( pointer_amount > 0 ) /* insert lkey[h]-th key from CFL[h] to left neighbor L[h] */ reiserfs_ib_insert_key (tb->tb_fs, &dest_bi, reiserfs_node_items(dest_bi.bi_bh), cf, d_key_position); /* last parameter is del_parameter */ reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, FIRST_TO_LAST, pointer_amount, 1); } /* Insert d_key'th (delimiting) key from buffer cfr to head of dest. * Copy n node pointers and n - 1 items from buffer src to buffer dest. * Replace d_key'th key in buffer cfr. * Delete n items and node pointers from buffer src. */ static void reiserfs_ib_shift_right (/* INTERNAL_FROM_S_TO_R | INTERNAL_FROM_L_TO_S */ int mode, reiserfs_tb_t * tb, int h, int pointer_amount) { reiserfs_bufinfo_t dest_bi, src_bi; reiserfs_bh_t * cf; int d_key_position; int nr; reiserfs_ib_shift_prep (mode, tb, h, &dest_bi, &src_bi, &d_key_position, &cf); nr = reiserfs_node_items (src_bi.bi_bh); if (pointer_amount > 0) { /* insert delimiting key from common father of dest and src to dest node into position 0 */ reiserfs_ib_insert_key (tb->tb_fs, &dest_bi, 0, cf, d_key_position); if (nr == pointer_amount - 1) { /* when S[h] disappers replace left delemiting key as well */ if (tb->CFL[h]) { reiserfs_node_replace_key(cf, d_key_position, tb->CFL[h], tb->lkey[h]); } } else { reiserfs_node_replace_key(cf, d_key_position, src_bi.bi_bh, nr - pointer_amount); } } /* last parameter is del_parameter */ reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, LAST_TO_FIRST, pointer_amount, 0); } /* Insert delimiting key to R[h]. * Copy n node pointers and n - 1 items from buffer S[h] to R[h]. * Delete n - 1 items and node pointers from buffer S[h]. */ /* it always shift from S[h] to R[h] */ static void reiserfs_ib_shift1_right (reiserfs_tb_t * tb, int h, int pointer_amount) { reiserfs_bufinfo_t dest_bi, src_bi; reiserfs_bh_t * cf; int d_key_position; reiserfs_ib_shift_prep (INTERNAL_SHIFT_FROM_S_TO_R, tb, h, &dest_bi, &src_bi, &d_key_position, &cf); if (pointer_amount > 0) /* insert rkey from CFR[h] to right neighbor R[h] */ reiserfs_ib_insert_key (tb->tb_fs, &dest_bi, 0, cf, d_key_position); /* last parameter is del_parameter */ reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, LAST_TO_FIRST, pointer_amount, 1); } /* Delete insert_num node pointers together with their left items * and balance current node.*/ static void reiserfs_ib_balance_delete (reiserfs_tb_t * tb, int h, int child_pos) { int insert_num; int n; reiserfs_bh_t * tbSh = REISERFS_PATH_UPBUFFER (tb->tb_path, h); reiserfs_bufinfo_t bi; insert_num = tb->insert_size[h] / ((int)(REISERFS_DC_SIZE + REISERFS_KEY_SIZE)); /* delete child-node-pointer(s) together with their left item(s) */ bi.bi_bh = tbSh; bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h); bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1); reiserfs_ib_delete (tb->tb_fs, &bi, child_pos, (child_pos == 0) ? child_pos : child_pos - 1, -insert_num); n = reiserfs_node_items(tbSh); if ( tb->lnum[h] == 0 && tb->rnum[h] == 0 ) { if ( tb->blknum[h] == 0 ) { /* node S[h] (root of the tree) is empty now */ reiserfs_bh_t *new_root; reiserfs_sb_t * sb; /* choose a new root */ if ( ! tb->L[h-1] || ! reiserfs_node_items(tb->L[h-1]) ) new_root = tb->R[h-1]; else new_root = tb->L[h-1]; /* update super block's tree height and pointer to a root block */ sb = tb->tb_fs->fs_ondisk_sb; reiserfs_sb_set_root (sb, new_root->b_blocknr); reiserfs_sb_set_height (sb, reiserfs_sb_get_height (sb) - 1); reiserfs_buffer_mkdirty (tb->tb_fs->fs_super_bh); tb->tb_fs->fs_dirt = 1; /* mark buffer S[h] not uptodate and put it in free list */ reiserfs_node_forget(tb->tb_fs, tbSh->b_blocknr); return; } return; } if ( tb->L[h] && tb->lnum[h] == -reiserfs_node_items(tb->L[h]) - 1 ) { /* join S[h] with L[h] */ /*tb->L[h], tb->CFL[h], tb->lkey[h], tb->S[h], n+1);*/ reiserfs_ib_shift_left (INTERNAL_SHIFT_FROM_S_TO_L, tb, h, n + 1); /* preserve not needed, internal, 1 mean free block */ reiserfs_node_forget(tb->tb_fs, tbSh->b_blocknr); return; } if ( tb->R[h] && tb->rnum[h] == -reiserfs_node_items(tb->R[h]) - 1 ) { /* join S[h] with R[h] */ reiserfs_ib_shift_right (INTERNAL_SHIFT_FROM_S_TO_R, tb, h, n + 1); reiserfs_node_forget(tb->tb_fs, tbSh->b_blocknr); return; } if ( tb->lnum[h] < 0 ) { /* borrow from left neighbor L[h] */ reiserfs_ib_shift_right (INTERNAL_SHIFT_FROM_L_TO_S, tb, h, -tb->lnum[h]); return; } if ( tb->rnum[h] < 0 ) { /* borrow from right neighbor R[h] */ /*tb->S[h], tb->CFR[h], tb->rkey[h], tb->R[h], -tb->rnum[h]);*/ reiserfs_ib_shift_left (INTERNAL_SHIFT_FROM_R_TO_S, tb, h, -tb->rnum[h]); return; } if ( tb->lnum[h] > 0 ) { /* split S[h] into two parts and put them into neighbors */ /*tb->L[h], tb->CFL[h], tb->lkey[h], tb->S[h], tb->lnum[h]);*/ reiserfs_ib_shift_left (INTERNAL_SHIFT_FROM_S_TO_L, tb, h, tb->lnum[h]); reiserfs_ib_shift_right (INTERNAL_SHIFT_FROM_S_TO_R, tb, h, tb->rnum[h]); reiserfs_node_forget(tb->tb_fs, tbSh->b_blocknr); return; } reiserfs_panic ("reiserfs_ib_balance_delete", "unexpected " "tb->lnum[%d]==%d or tb->rnum[%d]==%d", h, tb->lnum[h], h, tb->rnum[h]); } /* Replace delimiting key of buffers L[h] and S[h] by the given key.*/ static void reiserfs_ib_set_lkey (reiserfs_tb_t * tb, int h, reiserfs_ih_t * key) { if (reiserfs_node_items(REISERFS_PATH_UPBUFFER(tb->tb_path, h)) == 0) return; memcpy (reiserfs_int_key_at(tb->CFL[h],tb->lkey[h]), key, REISERFS_KEY_SIZE); reiserfs_buffer_mkdirty (tb->CFL[h]); } /* Replace delimiting key of buffers S[h] and R[h] by the given key.*/ static void reiserfs_ib_set_rkey (reiserfs_tb_t * tb, int h, reiserfs_ih_t * key) { memcpy (reiserfs_int_key_at(tb->CFR[h],tb->rkey[h]), key, REISERFS_KEY_SIZE); reiserfs_buffer_mkdirty (tb->CFR[h]); } int reiserfs_ib_balance (reiserfs_tb_t * tb, /* level of the tree */ int h, int child_pos, /* key for insertion on higher level */ reiserfs_ih_t * insert_key, /* node for insertion on higher level*/ reiserfs_bh_t ** insert_ptr) /* if inserting/pasting { child_pos is the position of the node-pointer in S[h] that * pointed to S[h-1] before balancing of the h-1 level; * this means that new pointers and items must be inserted AFTER * child_pos } else { it is the position of the leftmost pointer that must be deleted (together with its corresponding key to the left of the pointer) as a result of the previous level's balancing. } */ { reiserfs_bh_t * tbSh = REISERFS_PATH_UPBUFFER (tb->tb_path, h); reiserfs_bufinfo_t bi; /* we return this: it is 0 if there is no S[h], else it is tb->S[h]->b_item_order */ int order; int insert_num, n, k; reiserfs_bh_t * S_new; reiserfs_ih_t new_insert_key; reiserfs_bh_t * new_insert_ptr = NULL; reiserfs_ih_t * new_insert_key_addr = insert_key; order = ( tbSh ) ? REISERFS_PATH_UPPOS (tb->tb_path, h + 1) /*tb->S[h]->b_item_order*/ : 0; /* Using insert_size[h] calculate the number insert_num of items that must be inserted to or deleted from S[h]. */ insert_num = tb->insert_size[h]/((int)(REISERFS_KEY_SIZE + REISERFS_DC_SIZE)); /* Check whether insert_num is proper **/ /* Make balance in case insert_num < 0 */ if ( insert_num < 0 ) { reiserfs_ib_balance_delete (tb, h, child_pos); return order; } k = 0; if ( tb->lnum[h] > 0 ) { /* shift lnum[h] items from S[h] to the left neighbor L[h]. check how many of new items fall into L[h] or CFL[h] after shifting */ /* number of items in L[h] */ n = reiserfs_nh_get_items (NODE_HEAD(tb->L[h])); if ( tb->lnum[h] <= child_pos ) { /* new items don't fall into L[h] or CFL[h] */ reiserfs_ib_shift_left (INTERNAL_SHIFT_FROM_S_TO_L, tb, h, tb->lnum[h]); child_pos -= tb->lnum[h]; } else if ( tb->lnum[h] > child_pos + insert_num ) { /* all new items fall into L[h] */ reiserfs_ib_shift_left (INTERNAL_SHIFT_FROM_S_TO_L, tb, h, tb->lnum[h] - insert_num); /* insert insert_num keys and node-pointers into L[h] */ bi.bi_bh = tb->L[h]; bi.bi_parent = tb->FL[h]; bi.bi_position = reiserfs_tb_lpos (tb, h); reiserfs_ib_insert (tb->tb_fs, &bi, /*tb->L[h], tb->S[h-1]->b_next*/ n + child_pos + 1, insert_num,insert_key,insert_ptr); insert_num = 0; } else { reiserfs_dc_t * dc; /* some items fall into L[h] or CFL[h], but some don't fall */ reiserfs_ib_shift1_left (tb, h, child_pos + 1); /* calculate number of new items that fall into L[h] */ k = tb->lnum[h] - child_pos - 1; bi.bi_bh = tb->L[h]; bi.bi_parent = tb->FL[h]; bi.bi_position = reiserfs_tb_lpos (tb, h); reiserfs_ib_insert (tb->tb_fs, &bi, /*tb->L[h], tb->S[h-1]->b_next,*/ n + child_pos + 1,k, insert_key,insert_ptr); reiserfs_ib_set_lkey(tb, h, insert_key + k); /* replace the first node-ptr in S[h] by node-ptr to insert_ptr[k] */ dc = reiserfs_int_at(tbSh, 0); reiserfs_dc_init(dc, REISERFS_NODE_SPACE(insert_ptr[k]->b_size) - reiserfs_nh_get_free (NODE_HEAD(insert_ptr[k])), insert_ptr[k]->b_blocknr); /* reiserfs_dc_set_size (dc, REISERFS_NODE_SPACE(insert_ptr[k]->b_size) - reiserfs_nh_get_free (NODE_HEAD(insert_ptr[k]))); reiserfs_dc_set_nr (dc, insert_ptr[k]->b_blocknr); */ reiserfs_buffer_mkdirty (tbSh); k++; insert_key += k; insert_ptr += k; insert_num -= k; child_pos = 0; } } /* tb->lnum[h] > 0 */ if ( tb->rnum[h] > 0 ) { /*shift rnum[h] items from S[h] to the right neighbor R[h]*/ /* check how many of new items fall into R or CFR after shifting */ n = reiserfs_nh_get_items (NODE_HEAD (tbSh)); /* number of items in S[h] */ if ( n - tb->rnum[h] >= child_pos ) /* new items fall into S[h] */ /*reiserfs_ib_shift_right(tb,h,tbSh,tb->CFR[h], tb->rkey[h],tb->R[h], tb->rnum[h]);*/ reiserfs_ib_shift_right (INTERNAL_SHIFT_FROM_S_TO_R, tb, h, tb->rnum[h]); else if ( n + insert_num - tb->rnum[h] < child_pos ) { /* all new items fall into R[h] */ reiserfs_ib_shift_right (INTERNAL_SHIFT_FROM_S_TO_R, tb, h, tb->rnum[h] - insert_num); /* insert insert_num keys and node-pointers into R[h] */ bi.bi_bh = tb->R[h]; bi.bi_parent = tb->FR[h]; bi.bi_position = reiserfs_tb_rpos (tb, h); reiserfs_ib_insert (tb->tb_fs, &bi, /*tb->R[h],tb->S[h-1]->b_next*/ child_pos - n - insert_num + tb->rnum[h] - 1, insert_num, insert_key,insert_ptr); insert_num = 0; } else { reiserfs_dc_t * dc; /* one of the items falls into CFR[h] */ reiserfs_ib_shift1_right(tb, h, n - child_pos + 1); /* calculate number of new items that fall into R[h] */ k = tb->rnum[h] - n + child_pos - 1; bi.bi_bh = tb->R[h]; bi.bi_parent = tb->FR[h]; bi.bi_position = reiserfs_tb_rpos (tb, h); reiserfs_ib_insert (tb->tb_fs, &bi, /*tb->R[h], tb->R[h]->b_child,*/ 0, k, insert_key + 1, insert_ptr + 1); reiserfs_ib_set_rkey(tb, h, insert_key + insert_num - k - 1); /* replace the first node-ptr in R[h] by node-ptr insert_ptr[insert_num-k-1]*/ dc = reiserfs_int_at(tb->R[h], 0); reiserfs_dc_init(dc, REISERFS_NODE_SPACE( insert_ptr[insert_num-k-1]->b_size) - reiserfs_nh_get_free(NODE_HEAD(insert_ptr[insert_num-k-1])), insert_ptr[insert_num-k-1]->b_blocknr); /* reiserfs_dc_set_size (dc, REISERFS_NODE_SPACE(insert_ptr[insert_num-k-1]->b_size) - reiserfs_nh_get_free (NODE_HEAD(insert_ptr[insert_num-k-1]))); reiserfs_dc_set_nr (dc, insert_ptr[insert_num-k-1]->b_blocknr); */ reiserfs_buffer_mkdirty (tb->R[h]); insert_num -= (k + 1); } } /** Fill new node that appears instead of S[h] **/ if ( ! tb->blknum[h] ) { /* node S[h] is empty now */ /* Mark buffer as invalid and put it to head of free list. */ /* do not preserve, internal node*/ reiserfs_node_forget(tb->tb_fs, tbSh->b_blocknr); return order; } if ( ! tbSh ) { /* create new root */ reiserfs_dc_t * dc; reiserfs_bh_t * tbSh_1 = REISERFS_PATH_UPBUFFER (tb->tb_path, h - 1); reiserfs_sb_t * sb; if ( tb->blknum[h] != 1 ) reiserfs_panic(0, "reiserfs_ib_balance", "One new node required for creating the new root"); /* S[h] = empty buffer from the list FEB. */ tbSh = reiserfs_tb_FEB (tb); reiserfs_nh_set_level (NODE_HEAD(tbSh), h + 1); /* Put the unique node-pointer to S[h] that points to S[h-1]. */ dc = reiserfs_int_at(tbSh, 0); reiserfs_dc_init(dc, REISERFS_NODE_SPACE (tbSh_1->b_size) - reiserfs_nh_get_free (NODE_HEAD(tbSh_1)), tbSh_1->b_blocknr); /* reiserfs_dc_set_size (dc, REISERFS_NODE_SPACE (tbSh_1->b_size) - reiserfs_nh_get_free (NODE_HEAD(tbSh_1))); reiserfs_dc_set_nr (dc, tbSh_1->b_blocknr); */ tb->insert_size[h] -= REISERFS_DC_SIZE; reiserfs_nh_set_free (NODE_HEAD(tbSh), reiserfs_nh_get_free (NODE_HEAD(tbSh)) - REISERFS_DC_SIZE); reiserfs_buffer_mkdirty (tbSh); /* put new root into path structure */ REISERFS_PATH_BUFFER(tb->tb_path, REISERFS_PATH_OFFILL) = tbSh; /* Change root in structure super block. */ sb = tb->tb_fs->fs_ondisk_sb; reiserfs_sb_set_root (sb, tbSh->b_blocknr); reiserfs_sb_set_height (sb, reiserfs_sb_get_height (sb) + 1); reiserfs_buffer_mkdirty (tb->tb_fs->fs_super_bh); tb->tb_fs->fs_dirt = 1; } if ( tb->blknum[h] == 2 ) { int snum; reiserfs_bufinfo_t dest_bi, src_bi; /* S_new = free buffer from list FEB */ S_new = reiserfs_tb_FEB(tb); reiserfs_nh_set_level (NODE_HEAD(S_new), h + 1); dest_bi.bi_bh = S_new; dest_bi.bi_parent = 0; dest_bi.bi_position = 0; src_bi.bi_bh = tbSh; src_bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h); src_bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1); n = reiserfs_nh_get_items (NODE_HEAD(tbSh)); /* number of items in S[h] */ snum = (insert_num + n + 1)/2; if ( n - snum >= child_pos ) { /* new items don't fall into S_new */ /* store the delimiting key for the next level */ /* new_insert_key = (n - snum)'th key in S[h] */ memcpy (&new_insert_key,reiserfs_int_key_at(tbSh,n - snum), REISERFS_KEY_SIZE); /* last parameter is del_par */ reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, LAST_TO_FIRST, snum, 0); } else if ( n + insert_num - snum < child_pos ) { /* all new items fall into S_new */ /* store the delimiting key for the next level */ /* new_insert_key = (n + insert_item - snum)'th key in S[h] */ memcpy(&new_insert_key,reiserfs_int_key_at(tbSh,n + insert_num - snum), REISERFS_KEY_SIZE); /* last parameter is del_par */ reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, LAST_TO_FIRST, snum - insert_num, 0); /* reiserfs_ib_move(S_new,tbSh,1,snum - insert_num,0);*/ /* insert insert_num keys and node-pointers into S_new */ reiserfs_ib_insert (tb->tb_fs, &dest_bi, /*S_new,tb->S[h-1]->b_next,*/ child_pos - n - insert_num + snum - 1, insert_num,insert_key,insert_ptr); insert_num = 0; } else { reiserfs_dc_t * dc; /* some items fall into S_new, but some don't fall */ /* last parameter is del_par */ reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, LAST_TO_FIRST, n - child_pos + 1, 1); /* reiserfs_ib_move(S_new,tbSh,1,n - child_pos + 1,1);*/ /* calculate number of new items that fall into S_new */ k = snum - n + child_pos - 1; reiserfs_ib_insert (tb->tb_fs, &dest_bi, /*S_new,*/ 0, k, insert_key + 1, insert_ptr+1); /* new_insert_key = insert_key[insert_num - k - 1] */ memcpy(&new_insert_key,insert_key + insert_num - k - 1, REISERFS_KEY_SIZE); /* replace first node-ptr in S_new by node-ptr to insert_ptr[insert_num-k-1] */ dc = reiserfs_int_at(S_new,0); reiserfs_dc_init(dc, REISERFS_NODE_SPACE( insert_ptr[insert_num-k-1]->b_size) - reiserfs_nh_get_free (NODE_HEAD(insert_ptr[insert_num-k-1])), insert_ptr[insert_num-k-1]->b_blocknr); /* reiserfs_dc_set_size (dc, REISERFS_NODE_SPACE(insert_ptr[insert_num-k-1]->b_size) - reiserfs_nh_get_free (NODE_HEAD(insert_ptr[insert_num-k-1]))); reiserfs_dc_set_nr (dc, insert_ptr[insert_num-k-1]->b_blocknr); */ reiserfs_buffer_mkdirty (S_new); insert_num -= (k + 1); } /* new_insert_ptr = node_pointer to S_new */ new_insert_ptr = S_new; // S_new->b_count --; } n = reiserfs_nh_get_items (NODE_HEAD(tbSh)); /*number of items in S[h] */ if ( -1 <= child_pos && child_pos <= n && insert_num > 0 ) { bi.bi_bh = tbSh; bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h); bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1); if (child_pos == -1) { /* this is a little different from original do_balance: here we insert the minimal keys in the tree, that has never happened when file system works */ if (tb->CFL[h-1] || insert_num != 1 || h != 1) misc_die ("reiserfs_ib_balance: invalid child_pos"); /* insert_child (tb->S[h], tb->S[h-1], child_pos, insert_num, B_N_ITEM_HEAD(tb->S[0],0), insert_ptr);*/ reiserfs_ib_insert (tb->tb_fs, &bi, child_pos, insert_num, reiserfs_ih_at(REISERFS_PATH_LEAF (tb->tb_path), 0), insert_ptr); } else reiserfs_ib_insert (tb->tb_fs, &bi, child_pos,insert_num, insert_key,insert_ptr); } memcpy (new_insert_key_addr,&new_insert_key,REISERFS_KEY_SIZE); insert_ptr[0] = new_insert_ptr; return order; } reiserfsprogs-3.6.20/libreiserfs/journal.c0000644000175300001440000010052510412227267015554 00000000000000/* * Copyright 2002-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #include "misc/device.h" #include #include #include #include #include /* check whether 'block' can be logged */ static int not_journalable (reiserfs_filsys_t * fs, unsigned long block) { reiserfs_blktype_t type; type = reiserfs_fs_block(fs, block); return (type == BT_INVAL || type == BT_JOURNAL); } /* compares description block with commit block. returns 0 if they differ, 1 if they match */ static int does_desc_match_commit (reiserfs_bh_t *d_bh, reiserfs_bh_t *c_bh) { return (reiserfs_jc_get_trans (c_bh) == reiserfs_jd_get_trans (d_bh) && reiserfs_jc_get_len (c_bh) == reiserfs_jd_get_len (d_bh)); } /* d_bh is descriptor, return number of block where commit block of this transaction is to be */ static unsigned long commit_expected (reiserfs_filsys_t * fs, reiserfs_bh_t * d_bh) { unsigned long offset; reiserfs_journal_param_t * sb_jp; sb_jp = reiserfs_sb_jp (fs->fs_ondisk_sb); //desc = (struct reiserfs_journal_desc *)d_bh->b_data; offset = d_bh->b_blocknr - reiserfs_jp_get_start (sb_jp); return reiserfs_jp_get_start (sb_jp) + ((offset + reiserfs_jd_get_len (d_bh) + 1) % reiserfs_jp_get_size (sb_jp)); } /* d_bh contains journal descriptor, returns number of block where descriptor block of next transaction should be */ static unsigned long next_desc_expected (reiserfs_filsys_t * fs, reiserfs_bh_t * d_bh) { unsigned long offset; reiserfs_journal_param_t * sb_jp; sb_jp = reiserfs_sb_jp (fs->fs_ondisk_sb); //desc = (struct reiserfs_journal_desc *)d_bh->b_data; offset = d_bh->b_blocknr - reiserfs_jp_get_start (sb_jp); return reiserfs_jp_get_start (sb_jp) + ((offset + reiserfs_jd_get_len (d_bh) + 2) % reiserfs_jp_get_size (sb_jp)); } /* common checks for validness of a transaction */ static int transaction_check_content (reiserfs_filsys_t * fs, reiserfs_trans_t * trans) { reiserfs_bh_t *d_bh, *c_bh; struct reiserfs_journal_desc * desc; struct reiserfs_journal_commit * commit; unsigned long block; unsigned int trans_half, i; d_bh = reiserfs_buffer_read (fs->fs_journal_dev, trans->desc_blocknr, fs->fs_blocksize); if (!d_bh || reiserfs_node_type (d_bh) != NT_JDESC) goto error_desc_brelse; /* read expected commit block and compare with descriptor block */ c_bh = reiserfs_buffer_read (fs->fs_journal_dev, commit_expected (fs, d_bh), fs->fs_blocksize); if (!c_bh) goto error_desc_brelse; if (!does_desc_match_commit (d_bh, c_bh)) goto error_commit_brelse; /* Check that all target blocks are journalable */ desc = (struct reiserfs_journal_desc *)(d_bh->b_data); commit = (struct reiserfs_journal_commit *)(c_bh->b_data); trans_half = reiserfs_jt_half (d_bh->b_size); for (i = 0; i < reiserfs_jd_get_len(d_bh); i++) { if (i < trans_half) block = le32_to_cpu (desc->j2_realblock[i]); else block = le32_to_cpu (commit->j3_realblock[i - trans_half]); if (not_journalable(fs, block)) goto error_commit_brelse; } reiserfs_buffer_close (d_bh); reiserfs_buffer_close (c_bh); return 1; error_commit_brelse: reiserfs_buffer_close (c_bh); error_desc_brelse: reiserfs_buffer_close(d_bh); return 0; } /* common checks for validness of a transaction */ static int transaction_check_desc(reiserfs_filsys_t * fs, reiserfs_bh_t * d_bh) { reiserfs_bh_t * c_bh; int ret = 1; if (!d_bh || reiserfs_node_type (d_bh) != NT_JDESC) return 0; /* read expected commit block and compare with descriptor block */ c_bh = reiserfs_buffer_read (fs->fs_journal_dev, commit_expected (fs, d_bh), fs->fs_blocksize); if (!c_bh) return 0; if (!does_desc_match_commit (d_bh, c_bh)) ret = 0; reiserfs_buffer_close (c_bh); return ret; } /* read the journal and find the oldest and newest transactions, return number of transactions found */ int reiserfs_journal_get_transactions (reiserfs_filsys_t * fs, reiserfs_trans_t * oldest, reiserfs_trans_t * newest) { reiserfs_sb_t * sb; unsigned long j_cur; unsigned long j_start; unsigned long j_size; reiserfs_bh_t * d_bh; __u32 newest_trans_id, oldest_trans_id, trans_id; int trans_nr; sb = fs->fs_ondisk_sb; j_start = reiserfs_jp_get_start (reiserfs_sb_jp (sb)); j_size = reiserfs_jp_get_size (reiserfs_sb_jp (sb)); oldest_trans_id = 0xffffffff; newest_trans_id = 0; trans_nr = 0; for (j_cur = 0; j_cur < j_size; j_cur ++) { d_bh = reiserfs_buffer_read (fs->fs_journal_dev, j_start + j_cur, fs->fs_blocksize); if (!transaction_check_desc (fs, d_bh)) { reiserfs_buffer_close (d_bh); continue; } trans_nr ++; trans_id = reiserfs_jd_get_trans (d_bh); if (trans_id < oldest_trans_id) { oldest_trans_id = trans_id; oldest->mount_id = reiserfs_jd_get_mount (d_bh); oldest->trans_id = reiserfs_jd_get_trans (d_bh); oldest->desc_blocknr = d_bh->b_blocknr; oldest->trans_len = reiserfs_jd_get_len (d_bh); oldest->commit_blocknr = commit_expected (fs, d_bh); oldest->next_trans_offset = next_desc_expected (fs, d_bh) - j_start; } if (trans_id > newest_trans_id) { newest_trans_id = trans_id; newest->mount_id = reiserfs_jd_get_mount (d_bh); newest->trans_id = reiserfs_jd_get_trans (d_bh); newest->desc_blocknr = d_bh->b_blocknr; newest->trans_len = reiserfs_jd_get_len (d_bh); newest->commit_blocknr = commit_expected (fs, d_bh); newest->next_trans_offset = next_desc_expected (fs, d_bh) - j_start; } j_cur += reiserfs_jd_get_len (d_bh) + 1; reiserfs_buffer_close (d_bh); } return trans_nr; } #define TRANS_FOUND 1 #define TRANS_NOT_FOUND 0 /* trans is a valid transaction. Look for valid transaction with smallest trans id which is greater than the id of the current one */ static int next_transaction (reiserfs_filsys_t * fs, reiserfs_trans_t * trans, reiserfs_trans_t break_trans) { reiserfs_bh_t * d_bh, * next_d_bh; int found; unsigned long j_start; unsigned long j_offset; unsigned long block; j_start = reiserfs_jp_get_start (reiserfs_sb_jp (fs->fs_ondisk_sb)); found = TRANS_NOT_FOUND; if (trans->trans_id == break_trans.trans_id) return found; /* make sure that 'trans' is a valid transaction */ d_bh = reiserfs_buffer_read (fs->fs_journal_dev, trans->desc_blocknr, fs->fs_blocksize); if (!transaction_check_desc (fs, d_bh)) misc_die ("next_transaction: valid transaction is expected"); block = next_desc_expected (fs, d_bh); j_offset = block - j_start; while (1) { next_d_bh = reiserfs_buffer_read (fs->fs_journal_dev, block, fs->fs_blocksize); if (transaction_check_desc (fs, next_d_bh)) break; reiserfs_buffer_close (next_d_bh); j_offset ++; block = j_start + (j_offset % reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb))); } //next_desc = (struct reiserfs_journal_desc *)next_d_bh->b_data; if (break_trans.trans_id >= reiserfs_jd_get_trans (next_d_bh)) { /* found transaction is newer */ trans->mount_id = reiserfs_jd_get_mount (next_d_bh); trans->trans_id = reiserfs_jd_get_trans (next_d_bh); trans->desc_blocknr = next_d_bh->b_blocknr; trans->trans_len = reiserfs_jd_get_len (next_d_bh); trans->commit_blocknr = commit_expected (fs, next_d_bh); trans->next_trans_offset = next_desc_expected (fs, next_d_bh) - j_start; found = TRANS_FOUND; } reiserfs_buffer_close (d_bh); reiserfs_buffer_close (next_d_bh); return found; } static void read_journal_write_in_place (reiserfs_filsys_t * fs, reiserfs_trans_t * trans, unsigned int index, unsigned long in_journal, unsigned long in_place) { reiserfs_bh_t * j_bh, * bh; j_bh = reiserfs_buffer_read (fs->fs_journal_dev, in_journal, fs->fs_blocksize); if (!j_bh) { fprintf (stderr, "replay_one_transaction: transaction %lu: reading " "%lu block failed\n", trans->trans_id, in_journal); return; } if (not_journalable (fs, in_place)) { fprintf (stderr, "replay_one_transaction: transaction %lu: block " "%ld should not be journalled (%lu)\n", trans->trans_id, in_journal, in_place); reiserfs_buffer_close (j_bh); return; } bh = reiserfs_buffer_open (fs->fs_dev, in_place, fs->fs_blocksize); memcpy (bh->b_data, j_bh->b_data, bh->b_size); reiserfs_buffer_mkdirty (bh); reiserfs_buffer_mkuptodate (bh, 1); reiserfs_buffer_write (bh); reiserfs_buffer_close (bh); reiserfs_buffer_close (j_bh); } /* go through all blocks of transaction and call 'action' each of them */ void reiserfs_journal_foreach (reiserfs_filsys_t * fs, reiserfs_trans_t * trans, action_on_block_t action) { reiserfs_bh_t * d_bh, * c_bh; struct reiserfs_journal_desc * desc; struct reiserfs_journal_commit * commit; unsigned long j_start, j_offset, j_size; unsigned int i, trans_half; unsigned long block; d_bh = reiserfs_buffer_read (fs->fs_journal_dev, trans->desc_blocknr, fs->fs_blocksize); if (!d_bh) { reiserfs_warning (stdout, "reading descriptor block %lu failed\n", trans->desc_blocknr); return; } c_bh = reiserfs_buffer_read (fs->fs_journal_dev, trans->commit_blocknr, fs->fs_blocksize); if (!c_bh) { reiserfs_warning (stdout, "reading commit block %lu failed\n", trans->commit_blocknr); reiserfs_buffer_close (d_bh); return; } desc = (struct reiserfs_journal_desc *)(d_bh->b_data); commit = (struct reiserfs_journal_commit *)(c_bh->b_data); /* first block of journal and size of journal */ j_start = reiserfs_jp_get_start (reiserfs_sb_jp (fs->fs_ondisk_sb)); j_size = reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb)); /* offset in the journal where the transaction starts */ j_offset = trans->desc_blocknr - j_start + 1; trans_half = reiserfs_jt_half (d_bh->b_size); for (i = 0; i < trans->trans_len; i ++, j_offset ++) { if (i < trans_half) block = le32_to_cpu (desc->j2_realblock[i]); else block = le32_to_cpu (commit->j3_realblock[i - trans_half]); action (fs, trans, i, j_start + (j_offset % j_size), block); } reiserfs_buffer_close (d_bh); reiserfs_buffer_close (c_bh); } /* transaction is supposed to be valid */ static int replay_one_transaction (reiserfs_filsys_t * fs, reiserfs_trans_t * trans) { reiserfs_journal_foreach (fs, trans, read_journal_write_in_place); fsync(fs->fs_dev); return 0; } void reiserfs_journal_by_transaction (reiserfs_filsys_t * fs, action_on_trans_t action) { reiserfs_trans_t oldest, newest; int ret = 0; if (!reiserfs_journal_get_transactions (fs, &oldest, &newest)) return; while (1) { action (fs, &oldest); if ((ret = next_transaction (fs, &oldest, newest)) == TRANS_NOT_FOUND) break; } } /* Get the size of the journal or reserved area. */ unsigned long reiserfs_journal_hostsize(reiserfs_sb_t * sb) { if (reiserfs_super_jr_magic (sb)) return reiserfs_sb_get_reserved (sb); /* with standard journal */ return reiserfs_jp_get_size (reiserfs_sb_jp (sb)) + 1; } __u32 reiserfs_journal_tlen (__u32 desired, __u32 journal_size, int blocksize, int verbose) { __u32 saved; __u32 ratio = 1; if (blocksize < 4096) ratio = 4096/blocksize; saved = desired; if (!desired) desired = JOURNAL_TRANS_MAX/ratio; if (journal_size / desired < JOURNAL_MIN_RATIO) desired = journal_size / JOURNAL_MIN_RATIO; if (desired > JOURNAL_TRANS_MAX/ratio) desired = JOURNAL_TRANS_MAX/ratio; if (desired < JOURNAL_TRANS_MIN/ratio) desired = JOURNAL_TRANS_MIN/ratio; if (verbose) { if (saved && saved != desired) reiserfs_warning (stderr, "WARNING: wrong transaction max size (%u). Changed to %u\n", saved, desired); } return desired; } #if 0 __u32 ret_val; ret_val = 0; if (!desired) ret_val = JOURNAL_TRANS_MAX; if (desiredjournal_size/2) ret_val = journal_size/2; if (desired>JOURNAL_TRANS_MAX) ret_val = JOURNAL_TRANS_MAX; if (ret_val) { reiserfs_warning (stderr, "WARNING: Journal max trans length " "is wrong seting: %u, resetting to available " "possible %u\n", desired, ret_val); } else { ret_val = desired; } return ret_val; } #endif __u32 reiserfs_journal_batch (unsigned long journal_trans_max) { return journal_trans_max*JOURNAL_MAX_BATCH/JOURNAL_TRANS_MAX; } __u32 reiserfs_journal_commit_age (void) { return JOURNAL_MAX_COMMIT_AGE; } __u32 reiserfs_journal_trans_age (void) { return JOURNAL_MAX_TRANS_AGE; } int reiserfs_journal_params_check (reiserfs_filsys_t * fs) { struct reiserfs_journal_header * j_head; reiserfs_sb_t * sb = fs->fs_ondisk_sb; j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data); /* Check the superblock's journal parameters. */ if (!reiserfs_super_jr_magic (sb)) { if ((reiserfs_jp_get_dev (reiserfs_sb_jp(sb)) != 0) || (reiserfs_jp_get_start (reiserfs_sb_jp(sb)) != reiserfs_journal_start_must (fs)) || (reiserfs_jp_get_size (reiserfs_sb_jp(sb)) != reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize))) { reiserfs_warning (stderr, "\nreiserfs_journal_open: wrong journal parameters found in the " "super block. \nYou should run reiserfsck with --rebuild-sb to " "check your superblock consistency.\n\n"); return 1; } } if (memcmp(&j_head->jh_journal, reiserfs_sb_jp (sb), sizeof(reiserfs_journal_param_t))) { if (!reiserfs_super_jr_magic (sb)) { reiserfs_warning (stderr, "\nreiserfs_journal_open: journal " "parameters from the superblock does not " "match \nto the journal headers ones. It " "looks like that you created your fs with " "old\nreiserfsprogs. Journal header is " "fixed.\n\n", fs->fs_j_file_name); memcpy(&j_head->jh_journal, reiserfs_sb_jp(sb), sizeof(reiserfs_journal_param_t)); reiserfs_buffer_mkdirty(fs->fs_jh_bh); reiserfs_buffer_write(fs->fs_jh_bh); } else { reiserfs_warning (stderr, "\nreiserfs_journal_open: journal " "parameters from the super block does not " "match \nto journal parameters from the " "journal. You should run reiserfsck with " "--rebuild-sb to check your superblock " "consistency.\n\n"); return 1; } } return 0; } /* read journal header and make sure that it matches with the filesystem opened */ int reiserfs_journal_open (reiserfs_filsys_t * fs, char * j_filename, int flags) { reiserfs_sb_t * sb; char buf[4096]; __u64 count; dev_t rdev; sb = fs->fs_ondisk_sb; if (j_filename && j_filename[0] != '\0') { if (!reiserfs_super_jr_magic (sb) && strcmp (j_filename, fs->fs_file_name)) { reiserfs_warning (stderr, "Filesystem with standard journal found, " "wrong name of specified journal device %s \n", j_filename); return 2; } } else { if (!reiserfs_super_jr_magic (sb)) { j_filename = fs->fs_file_name; } else { /* Not standard journal and no device is specified. Find the device by rdev. */ strcpy(buf, "/dev"); rdev = reiserfs_sb_jp(sb)->jp_dev; if ((misc_dir_walk(buf, misc_device_rdev_match, &rdev)) <= 0) { reiserfs_warning (stderr, "Filesystem with non-standard " "journal found, failed to find a block " "device (%u:%u) in /dev.\nCreate such " "a device in /dev or specify the journal " "device with -j option.\n", major(rdev), minor(rdev)); return 2; } j_filename = buf; } } fs->fs_journal_dev = open (j_filename, flags #if defined(O_LARGEFILE) | O_LARGEFILE #endif ); if (fs->fs_journal_dev == -1) return -1; strncpy(fs->fs_j_file_name, j_filename, sizeof(fs->fs_j_file_name)); if (reiserfs_jp_get_size(reiserfs_sb_jp(sb)) < JOURNAL_MIN_SIZE) { reiserfs_warning (stderr, "Journal of (%lu) block size found on " "specified journal device %s.\nMust be not less than (%lu).\n", reiserfs_jp_get_size (reiserfs_sb_jp (sb)) + 1, j_filename, JOURNAL_MIN_SIZE + 1); close(fs->fs_journal_dev); return 1; } if (!(count = misc_device_count_blocks (j_filename, fs->fs_blocksize))) { close(fs->fs_journal_dev); return -1; } if (reiserfs_jp_get_start (reiserfs_sb_jp (sb)) + reiserfs_jp_get_size (reiserfs_sb_jp (sb)) + 1 > count) { reiserfs_warning (stderr, "Detected journal on specified device %s " "does not fit to the device.\nStart block (%lu) + " "size (%lu) less than device size (%lu).\n", j_filename, reiserfs_jp_get_start(reiserfs_sb_jp (sb)), reiserfs_jp_get_size(reiserfs_sb_jp (sb)) + 1, count); close(fs->fs_journal_dev); return 1; } /* read journal header */ fs->fs_jh_bh = reiserfs_buffer_read (fs->fs_journal_dev, reiserfs_jp_get_start (reiserfs_sb_jp (sb)) + reiserfs_jp_get_size (reiserfs_sb_jp (sb)), fs->fs_blocksize); if (!fs->fs_jh_bh) { reiserfs_warning (stderr, "reiserfs_journal_open: reiserfs_buffer_read failed " "reading journal header.\n"); close(fs->fs_journal_dev); return -1; } return 0; } /* initialize super block's journal related fields and journal header fields. * If len is 0 - make journal of default size */ int reiserfs_journal_create( reiserfs_filsys_t * fs, char * j_device, /* journal device name */ unsigned long offset, /* journal offset on the j_device */ unsigned long len, /* including journal header */ int transaction_max_size) { struct stat st; reiserfs_bh_t * bh; struct reiserfs_journal_header * jh; reiserfs_sb_t * sb; unsigned long blocks; sb = fs->fs_ondisk_sb; if (!j_device || !strcmp (j_device, fs->fs_file_name)) { /* Journal is to be on the host device, check the amount space for the * journal on it. */ len = len ? len : reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1; offset = offset ? offset : reiserfs_journal_start_must(fs); if (offset < reiserfs_journal_start_must(fs)) { reiserfs_warning (stderr, "reiserfs_journal_create: offset is " "%lu, but it cannot be less then %llu on the device %s\n", offset, reiserfs_journal_start_must(fs), j_device); return 0; } if (!reiserfs_journal_fits(offset, fs->fs_blocksize, reiserfs_sb_get_blocks(sb), len)) { /* host device does not contain enough blocks */ reiserfs_warning (stderr, "reiserfs_journal_create: cannot create " "a journal of %lu blocks with %lu offset on %d blocks\n", len, offset, reiserfs_sb_get_blocks(sb)); return 0; } j_device = fs->fs_file_name; st.st_rdev = 0; } else { /* journal is to be on separate device */ if (!(blocks = misc_device_count_blocks (j_device, fs->fs_blocksize))) return 0; if (!len) { /* default size of a journal on a separate device is whole device */ if (blocks < offset) { reiserfs_warning (stderr, "reiserfs_journal_create: offset is " "%lu, blocks on device %lu\n", offset, blocks); return 0; } len = blocks - offset; } if (len > reiserfs_journal_default (fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1) { fflush(stderr); reiserfs_warning (stdout, "NOTE: journal new size %lu is greater " "than default size %lu:\nthis may slow down initializing and " "mounting of the journal. Hope it is ok.\n\n", len, reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1); } if (blocks < offset + len) { reiserfs_warning (stderr, "reiserfs_journal_create: no enough " "blocks on device %lu, needed %lu\n", blocks, offset + len); return 0; } if (stat (j_device, &st) == -1) { reiserfs_warning (stderr, "reiserfs_journal_create: stat %s failed" ": %s\n", j_device, strerror(errno)); return 0; } /* if (!S_ISBLK (st.st_mode)) { reiserfs_warning (stderr, "reiserfs_journal_create: " "%s is not a block device (%x)\n", j_device, st.st_rdev); return 0; } */ } fs->fs_journal_dev = open (j_device, O_RDWR #if defined(O_LARGEFILE) | O_LARGEFILE #endif ); if (fs->fs_journal_dev == -1) { reiserfs_warning (stderr, "reiserfs_journal_create: could not open " "%s: %s\n", j_device, strerror(errno)); return 0; } strncpy(fs->fs_j_file_name, j_device, sizeof(fs->fs_j_file_name)); if (len < JOURNAL_MIN_SIZE + 1) { reiserfs_warning (stderr, "WARNING: Journal size (%u) is less, than " "minimal supported journal size (%u).\n", len, JOURNAL_MIN_SIZE + 1); return 0; } /* get journal header */ bh = reiserfs_buffer_open (fs->fs_journal_dev, offset + len - 1, fs->fs_blocksize); if (!bh) { reiserfs_warning (stderr, "reiserfs_journal_create: reiserfs_buffer_open failed\n"); return 0; } /* fill journal header */ jh = (struct reiserfs_journal_header *)bh->b_data; reiserfs_jp_set_start(&jh->jh_journal, offset); reiserfs_jp_set_dev(&jh->jh_journal, st.st_rdev); reiserfs_jp_set_magic(&jh->jh_journal, misc_random()); reiserfs_jp_set_size(&jh->jh_journal, len - 1); reiserfs_jp_set_tlen(&jh->jh_journal, reiserfs_journal_tlen( transaction_max_size, len - 1, fs->fs_blocksize, 1)); reiserfs_jp_set_max_batch(&jh->jh_journal, reiserfs_journal_batch( reiserfs_jp_get_tlen(&jh->jh_journal))); reiserfs_jp_set_commit_age(&jh->jh_journal, reiserfs_journal_commit_age()); reiserfs_jp_set_trans_age(&jh->jh_journal, reiserfs_journal_trans_age ()); reiserfs_buffer_mkuptodate (bh, 1); reiserfs_buffer_mkdirty (bh); fs->fs_jh_bh = bh; /* make a copy of journal header in the super block */ memcpy (reiserfs_sb_jp (sb), &jh->jh_journal, sizeof (reiserfs_journal_param_t)); reiserfs_buffer_mkdirty (fs->fs_super_bh); return 1; } /* reiserfs_buffer_close journal header, flush all dirty buffers, close device, open, read journal header */ void reiserfs_journal_reopen (reiserfs_filsys_t * fs, int flag) { unsigned long jh_block; if (!reiserfs_journal_opened (fs)) return; jh_block = fs->fs_jh_bh->b_blocknr; reiserfs_buffer_close (fs->fs_jh_bh); reiserfs_buffer_flush_all (fs->fs_journal_dev); reiserfs_buffer_invalidate_all(fs->fs_journal_dev); if (close (fs->fs_journal_dev)) misc_die ("reiserfs_journal_reopen: closed failed: %s", strerror(errno)); fs->fs_journal_dev = open (fs->fs_j_file_name, flag #if defined(O_LARGEFILE) | O_LARGEFILE #endif ); if (fs->fs_journal_dev == -1) misc_die ("reiserfs_journal_reopen: could not reopen journal device"); fs->fs_jh_bh = reiserfs_buffer_read (fs->fs_journal_dev, jh_block, fs->fs_blocksize); if (!fs->fs_jh_bh) misc_die ("reiserfs_journal_reopen: reading journal header failed"); } int reiserfs_journal_opened (reiserfs_filsys_t * fs) { return fs->fs_jh_bh ? 1 : 0; } void reiserfs_journal_flush (reiserfs_filsys_t * fs) { if (!reiserfs_journal_opened (fs)) return; reiserfs_buffer_flush_all(fs->fs_journal_dev); } void reiserfs_journal_free (reiserfs_filsys_t * fs) { if (!reiserfs_journal_opened (fs)) return; reiserfs_buffer_close (fs->fs_jh_bh); fs->fs_jh_bh = 0; fs->fs_j_file_name[0] = '\0'; } void reiserfs_journal_close (reiserfs_filsys_t * fs) { reiserfs_journal_flush (fs); reiserfs_journal_free (fs); } /* update journal header */ static void update_journal_header (reiserfs_filsys_t * fs, reiserfs_bh_t * bh_jh, reiserfs_trans_t *trans) { struct reiserfs_journal_header * j_head; j_head = (struct reiserfs_journal_header *)(bh_jh->b_data); /* update journal header */ reiserfs_jh_set_flushed (j_head, trans->trans_id); reiserfs_jh_set_mount (j_head, trans->mount_id); reiserfs_jh_set_start (j_head, trans->next_trans_offset); reiserfs_buffer_mkdirty (bh_jh); reiserfs_buffer_write (bh_jh); fsync(fs->fs_journal_dev); } /* FIXME: what should be done when not all transactions can be replayed in proper order? */ int reiserfs_journal_replay (reiserfs_filsys_t * fs) { reiserfs_bh_t * bh; struct reiserfs_journal_header * j_head; reiserfs_trans_t cur, newest, control; int replayed, ret; if (!reiserfs_journal_opened (fs)) reiserfs_panic ("reiserfs_journal_replay: journal is not opened"); if (!reiserfs_fs_rw (fs)) { reiserfs_panic ("reiserfs_journal_replay: fs is not opened with " "write perms"); } reiserfs_warning (stderr, "Replaying journal..\n"); bh = fs->fs_jh_bh; j_head = (struct reiserfs_journal_header *)(bh->b_data); control.mount_id = reiserfs_jh_get_mount (j_head); control.trans_id = reiserfs_jh_get_flushed (j_head); control.desc_blocknr = reiserfs_jh_get_start (j_head); if (!reiserfs_journal_get_transactions (fs, &cur, &newest)) { reiserfs_warning (stderr, "No transactions found\n"); return 0; } /* Smth strange with journal header or journal. We cannot say for sure what was the last replaied transaction, but relying on JH data is preferable. */ replayed = 0; ret = TRANS_FOUND; /* Looking to the first valid not replayed transaction. */ while (1) { if (cur.mount_id == control.mount_id && cur.trans_id > control.trans_id) break; if ((ret = next_transaction (fs, &cur, newest)) != TRANS_FOUND) break; } while (ret == TRANS_FOUND) { /* If not the next transaction to be replayed, break out here. */ if ((cur.mount_id != control.mount_id) || (cur.trans_id != control.trans_id + 1 && control.trans_id)) break; if (!transaction_check_content(fs, &cur)) { reiserfs_warning (stderr, "Trans broken: mountid %lu, transid %lu, " "desc %lu, len %lu, commit %lu, next trans " "offset %lu\n", cur.mount_id, cur.trans_id, cur.desc_blocknr, cur.trans_len, cur.commit_blocknr, cur.next_trans_offset); break; } reiserfs_warning (stderr, "Trans replayed: mountid %lu, transid %lu, " "desc %lu, len %lu, commit %lu, next trans offset " "%lu\n", cur.mount_id, cur.trans_id, cur.desc_blocknr, cur.trans_len, cur.commit_blocknr, cur.next_trans_offset); replay_one_transaction (fs, &cur); update_journal_header (fs, bh, &cur); control = cur; replayed ++; ret = next_transaction (fs, &cur, newest); } reiserfs_warning (stderr, "Reiserfs journal '%s' in blocks [%u..%u]: %d " "transactions replayed\n", fs->fs_j_file_name, reiserfs_jp_get_start(reiserfs_sb_jp(fs->fs_ondisk_sb)), reiserfs_jp_get_start(reiserfs_sb_jp(fs->fs_ondisk_sb)) + reiserfs_jp_get_size(reiserfs_sb_jp(fs->fs_ondisk_sb)) + 1, replayed); reiserfs_buffer_mkdirty (fs->fs_super_bh); reiserfs_buffer_write (fs->fs_super_bh); update_journal_header (fs, bh, &newest); return 0; } int reiserfs_journal_desc_valid (reiserfs_bh_t *bh) { struct reiserfs_journal_desc *desc; desc = (struct reiserfs_journal_desc *)bh->b_data; if (!memcmp(bh->b_data + bh->b_size - 12, JOURNAL_DESC_MAGIC, 8) && le32_to_cpu (desc->j2_len) > 0) { return 1; } return 0; } int reiserfs_journal_block (reiserfs_filsys_t * fs, unsigned long block) { unsigned long start; start = reiserfs_journal_start_must(fs); if (!reiserfs_super_jr_magic (fs->fs_ondisk_sb)) { /* standard journal */ if (block >= start && block <= start + reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb))) { return 1; } return 0; } if (reiserfs_sb_get_reserved (fs->fs_ondisk_sb)) { /* there is space reserved for the journal on the host device */ if (block >= start && block < start + reiserfs_sb_get_reserved (fs->fs_ondisk_sb)) { return 1; } } return 0; } // in reiserfs version 0 (undistributed bitmap) // FIXME: what if number of bitmaps is 15? static unsigned int reiserfs_journal_oldstart_must (reiserfs_filsys_t * fs) { unsigned int bmap_nr; bmap_nr = reiserfs_bmap_nr(reiserfs_sb_get_blocks(fs->fs_ondisk_sb), fs->fs_blocksize); return (REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) + 1 + bmap_nr; } static unsigned int reiserfs_journal_newstart_must (reiserfs_filsys_t * fs) { return (REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) + 2; } unsigned int reiserfs_journal_start_must (reiserfs_filsys_t * fs) { if (reiserfs_old_location(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) return reiserfs_journal_oldstart_must (fs); return reiserfs_journal_newstart_must(fs); } void reiserfs_journal_print_params (FILE * fp, reiserfs_journal_param_t * jp) { reiserfs_warning (fp, "\tDevice [0x%x]\n", reiserfs_jp_get_dev (jp)); reiserfs_warning (fp, "\tMagic [0x%x]\n", reiserfs_jp_get_magic (jp)); reiserfs_warning (fp, "\tSize %u blocks (including 1 for journal header) (first block %u)\n", reiserfs_jp_get_size (jp) + 1, reiserfs_jp_get_start (jp)); reiserfs_warning (fp, "\tMax transaction length %u blocks\n", reiserfs_jp_get_tlen (jp)); reiserfs_warning (fp, "\tMax batch size %u blocks\n", reiserfs_jp_get_max_batch (jp)); reiserfs_warning (fp, "\tMax commit age %u\n", reiserfs_jp_get_commit_age (jp)); reiserfs_warning (fp, "\tMax transaction age %u\n", reiserfs_jp_get_trans_age (jp)); } void reiserfs_journal_print_header (reiserfs_filsys_t * fs) { struct reiserfs_journal_header * j_head; j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data); reiserfs_warning (stdout, "Journal header (block #%lu of %s):\n" "\tj_last_flush_trans_id %ld\n" "\tj_first_unflushed_offset %ld\n" "\tj_mount_id %ld\n", fs->fs_jh_bh->b_blocknr, fs->fs_j_file_name, reiserfs_jh_get_flushed (j_head), reiserfs_jh_get_start (j_head), reiserfs_jh_get_mount (j_head)); reiserfs_journal_print_params (stdout, &j_head->jh_journal); } static void print_trans_element (reiserfs_filsys_t * fs, reiserfs_trans_t * trans, unsigned int index, unsigned long in_journal, unsigned long in_place) { if (index % 8 == 0) reiserfs_warning (stdout, "#%d\t", index); reiserfs_warning (stdout, "%lu->%lu%s ", in_journal, in_place, reiserfs_bitmap_block (fs, in_place) ? "B" : ""); if ((index + 1) % 8 == 0 || index == trans->trans_len - 1) reiserfs_warning (stdout, "\n"); } static void print_one_transaction (reiserfs_filsys_t * fs, reiserfs_trans_t * trans) { reiserfs_warning (stdout, "Mountid %u, transid %u, desc %lu, length %u, " "commit %lu\n", trans->mount_id, trans->trans_id, trans->desc_blocknr, trans->trans_len, trans->commit_blocknr); reiserfs_journal_foreach (fs, trans, print_trans_element); } /* print all valid transactions and found dec blocks */ void reiserfs_journal_print (reiserfs_filsys_t * fs) { if (!reiserfs_journal_opened (fs)) { reiserfs_warning (stderr, "reiserfs_journal_print: journal is not opened\n"); return; } reiserfs_journal_print_header (fs); reiserfs_journal_by_transaction (fs, print_one_transaction); } int reiserfs_print_jdesc (FILE * fp, reiserfs_bh_t * bh) { if (memcmp(reiserfs_jd_magic (bh), JOURNAL_DESC_MAGIC, 8)) return 1; reiserfs_warning (fp, "Desc block %lu (j_trans_id %ld, j_mount_id %ld, j_len %ld)\n", bh->b_blocknr, reiserfs_jd_get_trans (bh), reiserfs_jd_get_mount (bh), reiserfs_jd_get_len (bh)); return 0; } /* reiserfs needs at least: enough blocks for journal, 64 k at the beginning, one block for super block, bitmap block and root block. Note that first bitmap block must point to all of them */ int reiserfs_journal_fits(unsigned long journal_offset, unsigned int block_size, unsigned long block_count, unsigned long journal_size) { unsigned long blocks; /* RESERVED, MD RAID SBs, super block, bitmap, root, journal size with journal header */ blocks = journal_offset + journal_size; /* we have a limit: skipped area, super block, journal and root block all have to be addressed by one first bitmap */ if (blocks > block_size * 8) return 0; if (blocks > block_count) return 0; return 1; } reiserfsprogs-3.6.20/libreiserfs/key.c0000644000175300001440000001507110412227267014673 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #include "misc/unaligned.h" const reiserfs_key_t root_dir_key = {cpu_to_le32(REISERFS_ROOT_PARENT_OBJECTID), cpu_to_le32(REISERFS_ROOT_OBJECTID), {{0, 0},}}; const reiserfs_key_t parent_root_dir_key = { 0, cpu_to_le32(REISERFS_ROOT_PARENT_OBJECTID), {{0, 0},}}; reiserfs_key_t lost_found_dir_key = {0, 0, {{0, 0}, }}; /* Minimal possible key. It is never in the tree. */ const reiserfs_key_t MIN_KEY = {0, 0, {{0, 0},}}; /* Maximal possible key. It is never in the tree. */ const reiserfs_key_t MAX_KEY = {0xffffffff, 0xffffffff, {{0xffffffff, 0xffffffff},}}; void reiserfs_key_copy (reiserfs_key_t * to, const reiserfs_key_t * from) { memcpy (to, from, REISERFS_KEY_SIZE); } void reiserfs_key_copy2 (reiserfs_key_t * to, const reiserfs_key_t * from) { memcpy (to, from, REISERFS_KEY_SHSIZE); } #if __BYTE_ORDER == __LITTLE_ENDIAN # define get_key_offset_v2(key) (__u64)((key->u.k2_offset_v2.k_offset)) # define set_key_offset_v2(key,val) (void)(key->u.k2_offset_v2.k_offset = (val)) # define get_key_type_v2(key) (__u16)((key->u.k2_offset_v2.k_type)) # define set_key_type_v2(key,val) (void)(key->u.k2_offset_v2.k_type = (val)) #elif __BYTE_ORDER == __BIG_ENDIAN typedef union { struct offset_v2 offset_v2; __u64 linear; } __attribute__ ((__packed__)) offset_v2_esafe_overlay; static inline __u64 get_key_offset_v2 (const reiserfs_key_t *key) { offset_v2_esafe_overlay tmp = *(offset_v2_esafe_overlay *) (&(key->u.k2_offset_v2)); tmp.linear = le64_to_cpu( tmp.linear ); return tmp.offset_v2.k_offset; } static inline __u32 get_key_type_v2 (const reiserfs_key_t *key) { offset_v2_esafe_overlay tmp = *(offset_v2_esafe_overlay *) (&(key->u.k2_offset_v2)); tmp.linear = le64_to_cpu( tmp.linear ); return tmp.offset_v2.k_type; } static inline void set_key_offset_v2 (reiserfs_key_t *key, __u64 offset) { offset_v2_esafe_overlay *tmp = (offset_v2_esafe_overlay *)(&(key->u.k2_offset_v2)); tmp->linear = le64_to_cpu(tmp->linear); tmp->offset_v2.k_offset = offset; tmp->linear = cpu_to_le64(tmp->linear); } static inline void set_key_type_v2 (reiserfs_key_t *key, __u32 type) { offset_v2_esafe_overlay *tmp = (offset_v2_esafe_overlay *)(&(key->u.k2_offset_v2)); if (type > 15) reiserfs_panic ("set_key_type_v2: type is too big %d", type); tmp->linear = le64_to_cpu(tmp->linear); tmp->offset_v2.k_type = type; tmp->linear = cpu_to_le64(tmp->linear); } #else # error "nuxi/pdp-endian archs are not supported" #endif static inline int is_key_format_1 (int type) { return ( (type == 0 || type == 15) ? 1 : 0); } /* old keys (on i386) have k_offset_v2.k_type == 15 (direct and extent) or == 0 (dir items and stat data) */ /* */ int reiserfs_key_format (const reiserfs_key_t * key) { int type; type = get_key_type_v2 (key); if (is_key_format_1 (type)) return KEY_FORMAT_1; return KEY_FORMAT_2; } unsigned long long reiserfs_key_get_off (const reiserfs_key_t * key) { if (reiserfs_key_format (key) == KEY_FORMAT_1) return reiserfs_key_get_off1 (key); return get_key_offset_v2 (key); } static int uniqueness2type (__u32 uniqueness) { switch (uniqueness) { case UNI_SD: return TYPE_STAT_DATA; case UNI_EXT: return TYPE_EXTENT; case UNI_DIRECT: return TYPE_DIRECT; case UNI_DE: return TYPE_DIRENTRY; } return TYPE_UNKNOWN; } static __u32 type2uniqueness (int type) { switch (type) { case TYPE_STAT_DATA: return UNI_SD; case TYPE_EXTENT: return UNI_EXT; case TYPE_DIRECT: return UNI_DIRECT; case TYPE_DIRENTRY: return UNI_DE; } return UNI_UNKN; } int reiserfs_key_get_type (const reiserfs_key_t * key) { int type_v2 = get_key_type_v2 (key); if (is_key_format_1 (type_v2)) return uniqueness2type (reiserfs_key_get_uni (key)); return type_v2; } char *key_type_name[TYPE_UNKNOWN + 1] = { [TYPE_STAT_DATA] = "SD", [TYPE_EXTENT] = "EXT", [TYPE_DIRECT] = "DRCT", [TYPE_DIRENTRY] = "DIR", [TYPE_UNKNOWN] = "???" }; char * reiserfs_key_name (const reiserfs_key_t * key) { __u32 type = reiserfs_key_get_type (key); return key_type_name[type <= TYPE_DIRENTRY ? type : TYPE_UNKNOWN]; } /* this sets key format as well as type of item key belongs to */ void reiserfs_key_set_type (int format, reiserfs_key_t * key, int type) { if (format == KEY_FORMAT_1) reiserfs_key_set_uni (key, type2uniqueness (type)); else set_key_type_v2 (key, type); } void reiserfs_key_set_off (int format, reiserfs_key_t * key, unsigned long long offset) { if (format == KEY_FORMAT_1) reiserfs_key_set_off1 (key, offset); else set_key_offset_v2 (key, offset); } /* Set secondary fields. */ void reiserfs_key_set_sec (int format, reiserfs_key_t * key, unsigned long long offset, int type) { reiserfs_key_set_type (format, key, type); reiserfs_key_set_off (format, key, offset); } /* Compare keys using REISERFS_KEY_SHORT_LEN fields. Returns: -1 if key1 < key2 0 if key1 = key2 1 if key1 > key2 */ int reiserfs_key_comp2 (const void * k1, const void * k2) { int n_key_length = REISERFS_KEY_SHORT_LEN; __u32 * p_s_key1 = (__u32 *)k1; __u32 * p_s_key2 = (__u32 *)k2; __u32 u1, u2; for( ; n_key_length--; ++p_s_key1, ++p_s_key2 ) { u1 = d32_get(p_s_key1, 0) ; u2 = d32_get(p_s_key2, 0) ; if ( u1 < u2 ) return -1; if ( u1 > u2 ) return 1; } return 0; } int reiserfs_key_comp3 (const void * p1, const void * p2) { int retval; const reiserfs_key_t * k1 = p1; const reiserfs_key_t * k2 = p2; unsigned long long off1, off2; retval = reiserfs_key_comp2 (k1, k2); if (retval) return retval; off1 = reiserfs_key_get_off(k1) ; off2 = reiserfs_key_get_off(k2) ; if (off1 < off2) return -1; if (off1 > off2) return 1; return 0; } /* Compare keys using all 4 key fields. Returns: -1 if key1 < key2 0 if key1 = key2 1 if key1 > key2 */ int reiserfs_key_comp (const void * p1, const void * p2) { int retval; const reiserfs_key_t * k1 = p1; const reiserfs_key_t * k2 = p2; __u32 u1, u2; retval = reiserfs_key_comp3 (k1, k2); if (retval) return retval; u1 = reiserfs_key_get_type (k1); u2 = reiserfs_key_get_type (k2); if (u1 < u2) return -1; if (u1 > u2) return 1; return 0; } reiserfsprogs-3.6.20/libreiserfs/leaf.c0000644000175300001440000002256010412227267015013 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #include "misc/bitops.h" void reiserfs_leaf_mkempty (reiserfs_bh_t * bh) { reiserfs_nh_set_items (NODE_HEAD (bh), 0); reiserfs_nh_set_free (NODE_HEAD (bh), REISERFS_NODE_SPACE (bh->b_size)); reiserfs_nh_set_level (NODE_HEAD (bh), LEAF_LEVEL); } __u32 reiserfs_leaf_ibytes (const reiserfs_ih_t * ih, int blocksize) { switch (reiserfs_key_get_type (&ih->ih_key)) { case TYPE_DIRECT: return reiserfs_ih_get_len (ih); case TYPE_EXTENT: return reiserfs_ext_count(ih) * blocksize;// - reiserfs_ih_get_free (ih); case TYPE_STAT_DATA: case TYPE_DIRENTRY: return 0; } reiserfs_warning (stderr, "reiserfs_leaf_ibytes: called for wrong " "type of item %h", ih); return 0; } int reiserfs_leaf_mergeable (reiserfs_ih_t * left, reiserfs_ih_t * right, int bsize) { if (reiserfs_key_comp (&left->ih_key, &right->ih_key) != -1) { reiserfs_panic ("vs-16070: reiserfs_leaf_mergeable: left %k, " "right %k", &(left->ih_key), &(right->ih_key)); } if (reiserfs_key_comp2 (&left->ih_key, &right->ih_key)) return 0; if (reiserfs_key_get_type (&left->ih_key) != reiserfs_key_get_type (&right->ih_key)) { return 0; } /* Directories are always mergeable. If fsck will need to handle dir items separaely too, move it lower. */ if (reiserfs_ih_dir (left)) return 1; /* Merge only items with the same flags. */ if (reiserfs_ih_get_flags(left) != reiserfs_ih_get_flags(right)) return 0; if ((reiserfs_ih_direct (left) || reiserfs_ih_ext (left))) { return (reiserfs_key_get_off (&left->ih_key) + reiserfs_leaf_ibytes (left, bsize) == reiserfs_key_get_off (&right->ih_key)) ? 1 : 0; } return 0; } int reiserfs_leaf_count_items(reiserfs_bh_t *bh) { reiserfs_ih_t * ih; int prev_location; int nr; /* look at the table of item head */ prev_location = bh->b_size; ih = reiserfs_ih_at(bh, 0); nr = 0; while (1) { if (reiserfs_ih_get_loc (ih) + reiserfs_ih_get_len (ih) != prev_location) break; if (reiserfs_ih_get_loc (ih) < REISERFS_IH_SIZE * (nr + 1) + REISERFS_NODEH_SIZE) { break; } if (reiserfs_ih_get_len (ih) > REISERFS_ITEM_MAX (bh->b_size)) break; prev_location = reiserfs_ih_get_loc (ih); ih ++; nr ++; } return nr; } int reiserfs_leaf_free_count(reiserfs_bh_t *bh) { reiserfs_ih_t * ih; int nr; nr = reiserfs_nh_get_items(NODE_HEAD(bh)); ih = reiserfs_ih_at(bh, nr - 1); return (nr ? reiserfs_ih_get_loc (ih) : bh->b_size) - REISERFS_NODEH_SIZE - REISERFS_IH_SIZE * nr; } static int leaf_blkh_correct(reiserfs_bh_t * bh) { unsigned int nr; nr = reiserfs_nh_get_items(NODE_HEAD(bh)); if (nr > ((bh->b_size - REISERFS_NODEH_SIZE) / (REISERFS_IH_SIZE + REISERFS_ITEM_MIN))) { /* item number is too big or too small */ return 0; } return reiserfs_leaf_free_count(bh) == reiserfs_nh_get_free (NODE_HEAD(bh)); } int reiserfs_leaf_estimate_items(reiserfs_bh_t * bh) { int nr = reiserfs_leaf_count_items(bh); return nr >= reiserfs_nh_get_items (NODE_HEAD(bh)) ? reiserfs_nh_get_items (NODE_HEAD(bh)) : nr; } /* for every item call common action and an action corresponding to item type */ void reiserfs_leaf_traverse(reiserfs_bh_t * bh, ih_func_t action, item_func_t * actions) { int i; reiserfs_ih_t * ih; item_func_t iaction; ih = reiserfs_ih_at (bh, 0); for (i = 0; i < reiserfs_nh_get_items (NODE_HEAD (bh)); i ++, ih ++) { if (action) action (ih); iaction = actions[reiserfs_key_get_type (&ih->ih_key)]; if (iaction) iaction (bh, ih); } } /* Returns 0 if not leaf, NT_LEAF if looks correct, NT_IH_ARRAY if looks like corrupted leaf. */ int reiserfs_leaf_valid(reiserfs_bh_t *bh) { int counted; int num; if (!reiserfs_leaf_head (bh)) return 0; counted = reiserfs_leaf_count_items(bh); /* if leaf block header is ok, check item count also. */ if (leaf_blkh_correct(bh)) { num = reiserfs_nh_get_items (NODE_HEAD(bh)); return counted >= num ? NT_LEAF : NT_IH_ARRAY; } /* leaf block header is corrupted, it is ih_array if some items were detected.*/ return counted ? NT_IH_ARRAY : 0; } /* wrappers for operations on one separated leaf */ void reiserfs_leaf_delete_item (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, int item_num) { reiserfs_bufinfo_t bi; bi.bi_bh = bh; bi.bi_parent = 0; bi.bi_position = 0; reiserfs_lb_delete_item (fs, &bi, item_num, 1); } void reiserfs_leaf_delete_entry (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, int item_num, int entry_num, int del_count) { reiserfs_bufinfo_t bi; bi.bi_bh = bh; bi.bi_parent = 0; bi.bi_position = 0; reiserfs_lb_delete_unit (fs, &bi, item_num, entry_num, del_count); } /* ih_key, ih_location and ih_item_len seem correct, check other fields */ static int reiserfs_leaf_ih_correct (reiserfs_ih_t * ih) { int ih_format; int format; /* key format from item_head */ ih_format = reiserfs_ih_get_format (ih); if (ih_format != KEY_FORMAT_1 && ih_format != KEY_FORMAT_2) return 0; /* key format calculated on key */ format = reiserfs_key_format (&ih->ih_key); if (reiserfs_ih_stat (ih)) { /* for stat data we can not find key format from a key itself, so look at the item length */ if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE) format = KEY_FORMAT_2; else if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE_V1) format = KEY_FORMAT_1; else return 0; } if (format != ih_format) return 0; /* we do not check ih_format.fsck_need as fsck might change it. So, debugreiserfs -p will have to dump it */ return 1; } /* used by debugreisrefs -p only yet */ int reiserfs_leaf_correct_at (reiserfs_filsys_t * fs, reiserfs_ih_t * ih, char * item, unfm_func_t func, int bad_dir) { /* if (!does_key_look_correct (fs, &ih->ih_key)) return 1; if (!reiserfs_leaf_ih_correct (ih)) return 1; */ if (!reiserfs_leaf_ih_correct (ih)) return 1; if (reiserfs_ih_stat (ih) || reiserfs_ih_direct (ih)) return 0; if (reiserfs_ih_dir (ih)) { return reiserfs_direntry_check (fs, ih, item, bad_dir); } if (reiserfs_ih_ext (ih)) { return reiserfs_ext_check (fs, ih, item, func); } return 1; } static int is_symlink = 0; int reiserfs_leaf_print(FILE * fp, reiserfs_filsys_t * fs, reiserfs_bh_t * bh, int print_mode, int first, int last) { reiserfs_ih_t * ih; int i; int from, to; int real_nr, nr; if (!reiserfs_node_formatted (bh, LEAF_LEVEL)) return 1; ih = reiserfs_ih_at (bh,0); real_nr = reiserfs_leaf_count_items(bh); nr = reiserfs_nh_get_items(NODE_HEAD(bh)); reiserfs_warning (fp, "\n===========================================" "========================\n"); reiserfs_warning (fp, "LEAF NODE (%ld) contains %b (real items %d)\n", bh->b_blocknr, bh, real_nr); if (!(misc_test_bit(LP_LEAF_DETAILS, &print_mode))) { reiserfs_warning (fp, "FIRST ITEM_KEY: %k, LAST ITEM KEY: %k\n", &(ih->ih_key), &((ih + real_nr - 1)->ih_key)); return 0; } if (first < 0 || first > real_nr - 1) from = 0; else from = first; if (last < 0 || last > real_nr) to = real_nr; else to = last; reiserfs_warning (fp, "---------------------------------------------" "----------------------------------\n" "|###|type|ilen|f/sp| loc|fmt|fsck| " " key |\n" "| | | |e/cn| | |need| " " |\n"); for (i = from; i < to; i++) { reiserfs_warning (fp, "-----------------------------------------" "--------------------------------------\n" "|%3d|%30H|%s\n", i, ih + i, i >= nr ? " DELETED" : ""); if (reiserfs_ih_stat(ih+i)) { is_symlink = reiserfs_print_stat_data (fp, bh, ih + i, 0/*all times*/); continue; } if (reiserfs_ih_dir(ih+i)) { reiserfs_direntry_print (fp, fs, bh, ih+i); continue; } if (reiserfs_ih_ext(ih+i)) { reiserfs_ext_print (fp, bh, i); continue; } if (reiserfs_ih_direct(ih+i)) { int j = 0; if (is_symlink || misc_test_bit(LP_DIRECT_ITEMS, &print_mode)) { reiserfs_warning (fp, "\""); while (j < reiserfs_ih_get_len (&ih[i])) { if (reiserfs_item_by_ih(bh,ih+i)[j] == 10) reiserfs_warning (fp, "\\n"); else reiserfs_warning (fp, "%c", reiserfs_item_by_ih(bh,ih+i)[j]); j ++; } reiserfs_warning (fp, "\"\n"); } continue; } } reiserfs_warning (fp, "=============================================" "======================\n"); return 0; } __u16 reiserfs_ih_get_format(const reiserfs_ih_t *ih) { return misc_get_bitfield_XX (16, &ih->ih_format, 0, 12); } void reiserfs_ih_set_format(reiserfs_ih_t *ih, __u16 val) { misc_set_bitfield_XX (16, &ih->ih_format, val, 0, 12); } __u16 reiserfs_ih_get_flags(const reiserfs_ih_t *ih) { return misc_get_bitfield_XX (16, &ih->ih_format, 12, 4); } void reiserfs_ih_set_flags(reiserfs_ih_t *ih, __u16 val) { misc_set_bitfield_XX (16, &ih->ih_format, val, 12, 4); } reiserfsprogs-3.6.20/libreiserfs/leaf_balance.c0000644000175300001440000023332110412227267016457 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ /* Now we have all buffers that must be used in balancing of the tree */ /* Further calculations can not cause schedule(), and thus the buffer */ /* tree will be stable until the balancing will be finished */ /* balance the tree according to the analysis made before, */ /* and using buffers obtained after all above. */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" /* modes of reiserfs_lb_move */ #define LEAF_FROM_S_TO_L 0 #define LEAF_FROM_S_TO_R 1 #define LEAF_FROM_R_TO_L 2 #define LEAF_FROM_L_TO_R 3 #define LEAF_FROM_S_TO_SNEW 4 /* summary: if deleting something ( tb->insert_size[0] < 0 ) return(reiserfs_lb_balance_delete()); (flag d handled here) else if lnum is larger than 0 we put items into the left node if rnum is larger than 0 we put items into the right node if snum1 is larger than 0 we put items into the new node s1 if snum2 is larger than 0 we put items into the new node s2 Note that all *num* count new items being created. It would be easier to read reiserfs_lb_balance() if each of these summary lines was a separate procedure rather than being inlined. I think that there are many passages here and in reiserfs_lb_balance_delete() in which two calls to one procedure can replace two passages, and it might save cache space and improve software maintenance costs to do so. Vladimir made the perceptive comment that we should offload most of the decision making in this function into reiserfs_fix_nodes/check_balance, and then create some sort of structure in tb that says what actions should be performed by reiserfs_tb_balance. -Hans */ static void print_tb (int mode, int item_pos, int pos_in_item, reiserfs_tb_t * tb, char * mes); /* insert item into the leaf node in position before */ static void reiserfs_lb_insert (reiserfs_filsys_t * s, reiserfs_bufinfo_t * bi, int before, reiserfs_ih_t * inserted_item_ih, const char * inserted_item_body, int zeros_number) { reiserfs_bh_t * bh = bi->bi_bh; int nr; reiserfs_node_head_t * blkh; reiserfs_ih_t * ih; int i; int last_loc, unmoved_loc; char * to; blkh = NODE_HEAD (bh); nr = reiserfs_nh_get_items (blkh); /* get item new item must be inserted before */ ih = reiserfs_ih_at (bh, before); /* prepare space for the body of new item */ last_loc = nr ? reiserfs_ih_get_loc (&ih[nr - before - 1]) : bh->b_size; unmoved_loc = before ? reiserfs_ih_get_loc (ih-1) : bh->b_size; memmove (bh->b_data + last_loc - reiserfs_ih_get_len (inserted_item_ih), bh->b_data + last_loc, unmoved_loc - last_loc); to = bh->b_data + unmoved_loc - reiserfs_ih_get_len (inserted_item_ih); memset (to, 0, zeros_number); to += zeros_number; /* copy body to prepared space */ if (inserted_item_body) /* if (mem_mode == REISERFS_USER_MEM) copy_from_user (to, inserted_item_body, inserted_item_ih->ih_item_len - zeros_number); else { */ memmove (to, inserted_item_body, reiserfs_ih_get_len (inserted_item_ih) - zeros_number); //} else memset(to, '\0', reiserfs_ih_get_len (inserted_item_ih) - zeros_number); /* insert item header */ memmove (ih + 1, ih, REISERFS_IH_SIZE * (nr - before)); memmove (ih, inserted_item_ih, REISERFS_IH_SIZE); /* change locations */ for (i = before; i < nr + 1; i ++) { unmoved_loc -= reiserfs_ih_get_len (&ih[i-before]); reiserfs_ih_set_loc (&ih[i-before], unmoved_loc); } /* sizes, free space, item number */ reiserfs_nh_set_items (blkh, reiserfs_nh_get_items (blkh) + 1); reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) - (REISERFS_IH_SIZE + reiserfs_ih_get_len (inserted_item_ih))); reiserfs_buffer_mkdirty(bh) ; if (bi->bi_parent) { reiserfs_dc_t * dc; dc = reiserfs_int_at (bi->bi_parent, bi->bi_position); reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) + REISERFS_IH_SIZE + reiserfs_ih_get_len (inserted_item_ih)); reiserfs_buffer_mkdirty(bi->bi_parent) ; } if (reiserfs_leaf_valid(bh) != NT_LEAF) reiserfs_panic ("reiserfs_lb_insert: bad leaf %lu: %b", bh->b_blocknr, bh); } /* paste paste_size bytes to affected_item_num-th item. When item is a directory, this only prepare space for new entries */ static void reiserfs_lb_insert_unit (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * bi, int affected_item_num, int pos_in_item, int paste_size, const char * body, int zeros_number) { reiserfs_bh_t * bh = bi->bi_bh; int nr; reiserfs_node_head_t * blkh; reiserfs_ih_t * ih; int i; int last_loc, unmoved_loc; blkh = NODE_HEAD (bh); nr = reiserfs_nh_get_items (blkh); /* item to be appended */ ih = reiserfs_ih_at(bh, affected_item_num); last_loc = reiserfs_ih_get_loc (&ih[nr - affected_item_num - 1]); unmoved_loc = affected_item_num ? reiserfs_ih_get_loc (ih-1) : bh->b_size; /* prepare space */ memmove (bh->b_data + last_loc - paste_size, bh->b_data + last_loc, unmoved_loc - last_loc); /* change locations */ for (i = affected_item_num; i < nr; i ++) reiserfs_ih_set_loc (&ih[i-affected_item_num], reiserfs_ih_get_loc (&ih[i-affected_item_num]) - paste_size); if ( body ) { if (!reiserfs_ih_dir(ih)) { /*if (mem_mode == REISERFS_USER_MEM) { memset (bh->b_data + unmoved_loc - paste_size, 0, zeros_number); copy_from_user (bh->b_data + unmoved_loc - paste_size + zeros_number, body, paste_size - zeros_number); } else */ { if (!pos_in_item) { /* shift data to right */ memmove (bh->b_data + reiserfs_ih_get_loc (ih) + paste_size, bh->b_data + reiserfs_ih_get_loc (ih), reiserfs_ih_get_len (ih)); /* paste data in the head of item */ memset (bh->b_data + reiserfs_ih_get_loc (ih), 0, zeros_number); memcpy (bh->b_data + reiserfs_ih_get_loc (ih) + zeros_number, body, paste_size - zeros_number); } else { memset (bh->b_data + unmoved_loc - paste_size, 0, zeros_number); memcpy (bh->b_data + unmoved_loc - paste_size + zeros_number, body, paste_size - zeros_number); } } } } else memset(bh->b_data + unmoved_loc - paste_size,'\0',paste_size); reiserfs_ih_set_len (ih, reiserfs_ih_get_len (ih) + paste_size); /* change free space */ reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) - paste_size); reiserfs_buffer_mkdirty(bh) ; if (bi->bi_parent) { reiserfs_dc_t * dc; dc = reiserfs_int_at (bi->bi_parent, bi->bi_position); reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) + paste_size); reiserfs_buffer_mkdirty(bi->bi_parent); } if (reiserfs_leaf_valid(bh) != NT_LEAF) reiserfs_panic ("reiserfs_lb_insert_unit: bad leaf %lu: %b", bh->b_blocknr, bh); } /* paste new_entry_count entries (new_dehs, records) into position before to item_num-th item */ static void reiserfs_lb_insert_entry (reiserfs_bh_t * bh, int item_num, int before, int new_entry_count, reiserfs_deh_t * new_dehs, const char * records, int paste_size) { reiserfs_ih_t * ih; char * item; reiserfs_deh_t * deh; char * insert_point; int i, old_entry_num; if (new_entry_count == 0) return; ih = reiserfs_ih_at(bh, item_num); /* first byte of dest item */ item = reiserfs_item_by_ih (bh, ih); /* entry head array */ deh = reiserfs_deh (bh, ih); /* new records will be pasted at this point */ insert_point = item + (before ? reiserfs_deh_get_loc (&deh[before - 1]) : (reiserfs_ih_get_len (ih) - paste_size)); /* adjust locations of records that will be AFTER new records */ for (i = reiserfs_ih_get_entries (ih) - 1; i >= before; i --) reiserfs_deh_set_loc (deh + i, reiserfs_deh_get_loc (deh + i) + REISERFS_DEH_SIZE * new_entry_count); /* adjust locations of records that will be BEFORE new records */ for (i = 0; i < before; i ++) reiserfs_deh_set_loc (deh + i, reiserfs_deh_get_loc (deh + i) + paste_size); old_entry_num = reiserfs_ih_get_entries (ih); //I_ENTRY_COUNT(ih) += new_entry_count; reiserfs_ih_set_entries (ih, old_entry_num + new_entry_count); /* prepare space for pasted records */ memmove (insert_point + paste_size, insert_point, item + (reiserfs_ih_get_len (ih) - paste_size) - insert_point); /* copy new records */ memcpy (insert_point + REISERFS_DEH_SIZE * new_entry_count, records, paste_size - REISERFS_DEH_SIZE * new_entry_count); /* prepare space for new entry heads */ deh += before; memmove ((char *)(deh + new_entry_count), deh, insert_point - (char *)deh); /* copy new entry heads */ memcpy (deh, new_dehs, REISERFS_DEH_SIZE * new_entry_count); /* set locations of new records */ for (i = 0; i < new_entry_count; i ++) reiserfs_deh_set_loc (deh + i, reiserfs_deh_get_loc (deh + i) + (- reiserfs_deh_get_loc (&new_dehs[new_entry_count - 1]) + insert_point + REISERFS_DEH_SIZE * new_entry_count - item)); /* change item key if neccessary (when we paste before 0-th entry */ if (!before) reiserfs_key_set_off1 (&ih->ih_key, reiserfs_deh_get_off (new_dehs)); } /* copy copy_count entries from source directory item to dest buffer (creating new item if needed) */ static void reiserfs_lb_copy_entry (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * dest_bi, reiserfs_bh_t * source, int last_first, int item_num, int from, int copy_count) { reiserfs_bh_t * dest = dest_bi->bi_bh; int ditem_num; /* either the number of target item, or if we must create a new item, the number of the item we will create it next to */ reiserfs_ih_t * ih; reiserfs_deh_t * deh; /* length of all records in item to be copied */ int copy_records_len; char * records; ih = reiserfs_ih_at (source, item_num); /* length of all record to be copied and first byte of the last of them */ deh = reiserfs_deh (source, ih); if (copy_count) { copy_records_len = (from ? reiserfs_deh_get_loc (&deh[from - 1]) : reiserfs_ih_get_len (ih)) - reiserfs_deh_get_loc (&deh[from + copy_count - 1]); records = source->b_data + reiserfs_ih_get_loc (ih) + reiserfs_deh_get_loc (&deh[from + copy_count - 1]); } else { copy_records_len = 0; records = 0; } /* when copy last to first, dest buffer can contain 0 items */ ditem_num = (last_first == LAST_TO_FIRST) ? (( reiserfs_node_items(dest) ) ? 0 : -1) : (reiserfs_node_items(dest) - 1); /* if there are no items in dest or the first/last item in dest is not item of the same directory */ if ( (ditem_num == - 1) || (last_first == FIRST_TO_LAST && reiserfs_leaf_mergeable (reiserfs_ih_at (dest, ditem_num), ih, dest->b_size) == 0) || (last_first == LAST_TO_FIRST && reiserfs_leaf_mergeable (ih, reiserfs_ih_at (dest, ditem_num), dest->b_size) == 0)) { /* create new item in dest */ reiserfs_ih_t new_ih; /* form item header */ memcpy (&new_ih.ih_key, &ih->ih_key, REISERFS_KEY_SIZE); /* calculate item len */ reiserfs_ih_set_len (&new_ih, REISERFS_DEH_SIZE * copy_count + copy_records_len); reiserfs_ih_set_entries (&new_ih, 0); if (last_first == LAST_TO_FIRST) { /* form key by the following way */ if (from < reiserfs_ih_get_entries (ih)) { reiserfs_key_set_off1 (&new_ih.ih_key, reiserfs_deh_get_off (&deh[from])); } else { /* no entries will be copied to this item in this function */ reiserfs_key_set_off1 (&new_ih.ih_key, MAX_KEY1_OFFSET); } reiserfs_key_set_uni (&new_ih.ih_key, UNI_DE); } reiserfs_ih_set_format (&new_ih, reiserfs_ih_get_format (ih)); reiserfs_ih_set_flags (&new_ih, reiserfs_ih_get_flags (ih)); /* insert item into dest buffer */ reiserfs_lb_insert (fs, dest_bi, (last_first == LAST_TO_FIRST) ? 0 : reiserfs_node_items(dest), &new_ih, NULL, 0); } else { /* prepare space for entries */ reiserfs_lb_insert_unit (fs, dest_bi, (last_first == FIRST_TO_LAST) ? (reiserfs_node_items(dest) - 1) : 0, 0xffff, REISERFS_DEH_SIZE * copy_count + copy_records_len, records, 0); } ditem_num = (last_first == FIRST_TO_LAST) ? (reiserfs_node_items(dest)-1) : 0; reiserfs_lb_insert_entry (dest_bi->bi_bh, ditem_num, (last_first == FIRST_TO_LAST) ? reiserfs_ih_get_entries (reiserfs_ih_at (dest, ditem_num)) : 0, copy_count, deh + from, records, REISERFS_DEH_SIZE * copy_count + copy_records_len); } /* Copy the first (if last_first == FIRST_TO_LAST) or last (last_first == LAST_TO_FIRST) item or part of it or nothing (see the return 0 below) from SOURCE to the end (if last_first) or beginning (!last_first) of the DEST */ /* returns 1 if anything was copied, else 0 */ static int reiserfs_lb_copy_boundary (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * dest_bi, reiserfs_bh_t * src, int last_first, int bytes_or_entries) { reiserfs_bh_t * dest = dest_bi->bi_bh; /* number of items in the source and destination buffers */ int dest_nr_item, src_nr_item; reiserfs_ih_t * ih; reiserfs_ih_t * dih; dest_nr_item = reiserfs_node_items(dest); if ( last_first == FIRST_TO_LAST ) { /* if ( DEST is empty or first item of SOURCE and last item of DEST are the items of different objects or of different types ) then there is no need to treat this item differently from the other items that we copy, so we return */ ih = reiserfs_ih_at (src, 0); dih = reiserfs_ih_at (dest, dest_nr_item - 1); if (!dest_nr_item || reiserfs_leaf_mergeable (dih, ih, src->b_size) == 0) { /* there is nothing to merge */ return 0; } if ( reiserfs_ih_dir(ih) ) { if ( bytes_or_entries == -1 ) /* copy all entries to dest */ bytes_or_entries = reiserfs_ih_get_entries(ih); reiserfs_lb_copy_entry (fs, dest_bi, src, FIRST_TO_LAST, 0, 0, bytes_or_entries); return 1; } /* copy part of the body of the first item of SOURCE to the end of the body of the last item of the DEST part defined by 'bytes_or_entries'; if bytes_or_entries == -1 copy whole body; don't create new item header */ if ( bytes_or_entries == -1 ) bytes_or_entries = reiserfs_ih_get_len (ih); /* merge first item (or its part) of src buffer with the last item of dest buffer. Both are of the same file */ reiserfs_lb_insert_unit (fs, dest_bi, dest_nr_item - 1, reiserfs_ih_get_len (dih), bytes_or_entries, reiserfs_item_by_ih(src,ih), 0); if (reiserfs_ih_ext(dih)) { if (bytes_or_entries == reiserfs_ih_get_len (ih)) //dih->u.ih_free_space = ih->u.ih_free_space; reiserfs_ih_set_free (dih, reiserfs_ih_get_free (ih)); } return 1; } /* copy boundary item to right (last_first == LAST_TO_FIRST) */ /* ( DEST is empty or last item of SOURCE and first item of DEST are the items of different object or of different types ) */ src_nr_item = reiserfs_node_items (src); ih = reiserfs_ih_at (src, src_nr_item - 1); dih = reiserfs_ih_at (dest, 0); if (!dest_nr_item || reiserfs_leaf_mergeable (ih, dih, src->b_size) == 0) return 0; if ( reiserfs_ih_dir(ih)) { if ( bytes_or_entries == -1 ) /* bytes_or_entries = entries number in last item body of SOURCE */ bytes_or_entries = reiserfs_ih_get_entries(ih); reiserfs_lb_copy_entry (fs, dest_bi, src, LAST_TO_FIRST, src_nr_item - 1, reiserfs_ih_get_entries(ih) - bytes_or_entries, bytes_or_entries); return 1; } /* copy part of the body of the last item of SOURCE to the begin of the body of the first item of the DEST; part defined by 'bytes_or_entries'; if byte_or_entriess == -1 copy whole body; change first item key of the DEST; don't create new item header */ if ( bytes_or_entries == -1 ) { /* bytes_or_entries = length of last item body of SOURCE */ bytes_or_entries = reiserfs_ih_get_len (ih); /* change first item key of the DEST */ //dih->ih_key.k_offset = ih->ih_key.k_offset; reiserfs_key_set_off (reiserfs_key_format (&dih->ih_key), &dih->ih_key, reiserfs_key_get_off (&ih->ih_key)); /* item becomes non-mergeable */ /* or mergeable if left item was */ //dih->ih_key.k_uniqueness = ih->ih_key.k_uniqueness; reiserfs_key_set_type (reiserfs_key_format (&dih->ih_key), &dih->ih_key, reiserfs_key_get_type (&ih->ih_key)); } else { /* merge to right only part of item */ /* change first item key of the DEST */ if ( reiserfs_ih_direct(dih) ) { //dih->ih_key.k_offset -= bytes_or_entries; reiserfs_key_set_off (reiserfs_key_format (&dih->ih_key), &dih->ih_key, reiserfs_key_get_off (&dih->ih_key) - bytes_or_entries); } else { //dih->ih_key.k_offset -= ((bytes_or_entries/REISERFS_EXT_SIZE)*dest->b_size); reiserfs_key_set_off (reiserfs_key_format (&dih->ih_key), &dih->ih_key, reiserfs_key_get_off (&dih->ih_key) - ((bytes_or_entries/REISERFS_EXT_SIZE) * dest->b_size)); } } reiserfs_lb_insert_unit (fs, dest_bi, 0, 0, bytes_or_entries, reiserfs_item_by_ih(src,ih) + reiserfs_ih_get_len (ih) - bytes_or_entries, 0); return 1; } /* This function splits the (liquid) item into two items (useful when shifting part of an item into another node.) */ static void reiserfs_lb_split (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * dest_bi, reiserfs_bh_t * src, int last_first, int item_num, int cpy_bytes) { reiserfs_bh_t * dest = dest_bi->bi_bh; reiserfs_ih_t * ih; if ( last_first == FIRST_TO_LAST ) { /* if ( if item in position item_num in buffer SOURCE is directory item ) */ if (reiserfs_ih_dir(ih = reiserfs_ih_at(src,item_num))) reiserfs_lb_copy_entry (fs, dest_bi, src, FIRST_TO_LAST, item_num, 0, cpy_bytes); else { reiserfs_ih_t n_ih; /* copy part of the body of the item number 'item_num' of SOURCE to the end of the DEST part defined by 'cpy_bytes'; create new item header; change old item_header (????); n_ih = new item_header; */ memcpy (&n_ih, ih, REISERFS_IH_SIZE); reiserfs_ih_set_len (&n_ih, cpy_bytes); if (reiserfs_ih_ext(ih)) { //n_ih.u.ih_free_space = 0; reiserfs_ih_set_free (&n_ih, 0);; } //n_ih.ih_version = ih->ih_version; reiserfs_ih_set_format (&n_ih, reiserfs_ih_get_format (ih)); reiserfs_ih_set_flags (&n_ih, reiserfs_ih_get_flags (ih)); reiserfs_lb_insert (fs, dest_bi, reiserfs_node_items(dest), &n_ih, reiserfs_item_at (src, item_num), 0); } } else { /* if ( if item in position item_num in buffer SOURCE is directory item ) */ if (reiserfs_ih_dir(ih = reiserfs_ih_at (src, item_num))) reiserfs_lb_copy_entry (fs, dest_bi, src, LAST_TO_FIRST, item_num, reiserfs_ih_get_entries(ih) - cpy_bytes, cpy_bytes); else { reiserfs_ih_t n_ih; /* copy part of the body of the item number 'item_num' of SOURCE to the begin of the DEST part defined by 'cpy_bytes'; create new item header; n_ih = new item_header; */ memcpy (&n_ih, ih, REISERFS_KEY_SHSIZE); if (reiserfs_ih_direct(ih)) { /*n_ih.ih_key.k_offset = ih->ih_key.k_offset + ih->ih_item_len - cpy_bytes; */ reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), &n_ih.ih_key, reiserfs_key_get_off (&ih->ih_key) + reiserfs_ih_get_len (ih) - cpy_bytes); //n_ih.ih_key.k_uniqueness = TYPE_DIRECT; reiserfs_key_set_type (reiserfs_key_format (&ih->ih_key), &n_ih.ih_key, TYPE_DIRECT); //n_ih.u.ih_free_space = USHRT_MAX; reiserfs_ih_set_free (&n_ih, USHRT_MAX); } else { /* extent item */ /*n_ih.ih_key.k_offset = ih->ih_key.k_offset + (ih->ih_item_len - cpy_bytes) / REISERFS_EXT_SIZE * dest->b_size;*/ reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), &n_ih.ih_key, reiserfs_key_get_off (&ih->ih_key) + (reiserfs_ih_get_len (ih) - cpy_bytes) / REISERFS_EXT_SIZE * dest->b_size); //n_ih.ih_key.k_uniqueness = TYPE_EXTENT; reiserfs_key_set_type (reiserfs_key_format (&ih->ih_key), &n_ih.ih_key, TYPE_EXTENT); //n_ih.u.ih_free_space = ih->u.ih_free_space; reiserfs_ih_set_free (&n_ih, reiserfs_ih_get_free (ih)); } /* set item length */ reiserfs_ih_set_len (&n_ih, cpy_bytes); //n_ih.ih_version = ih->ih_version; reiserfs_ih_set_format (&n_ih, reiserfs_ih_get_format (ih)); reiserfs_ih_set_flags (&n_ih, reiserfs_ih_get_flags (ih)); reiserfs_lb_insert (fs, dest_bi, 0, &n_ih, reiserfs_item_at(src,item_num) + reiserfs_ih_get_len (ih) - cpy_bytes, 0); } } } /* copy cpy_mun items from buffer src to buffer dest * last_first == FIRST_TO_LAST means, that we copy cpy_num items beginning from first-th item in src to tail of dest * last_first == LAST_TO_FIRST means, that we copy cpy_num items beginning from first-th item in src to head of dest */ static void reiserfs_lb_copy_item (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * dest_bi, reiserfs_bh_t * src, int last_first, int first, int cpy_num) { reiserfs_bh_t * dest; int nr; int dest_before; int last_loc, last_inserted_loc, location; int i, j; reiserfs_node_head_t * blkh; reiserfs_ih_t * ih; dest = dest_bi->bi_bh; if (cpy_num == 0) return; blkh = NODE_HEAD(dest); nr = reiserfs_nh_get_items (blkh); /* we will insert items before 0-th or nr-th item in dest buffer. It depends of last_first parameter */ dest_before = (last_first == LAST_TO_FIRST) ? 0 : nr; /* location of head of first new item */ ih = reiserfs_ih_at (dest, dest_before); /* prepare space for headers */ memmove (ih + cpy_num, ih, (nr-dest_before) * REISERFS_IH_SIZE); /* copy item headers */ memcpy (ih, reiserfs_ih_at (src, first), cpy_num * REISERFS_IH_SIZE); reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) - REISERFS_IH_SIZE * cpy_num); /* location of unmovable item */ j = location = (dest_before == 0) ? dest->b_size : reiserfs_ih_get_loc (ih-1); for (i = dest_before; i < nr + cpy_num; i ++) { location -= reiserfs_ih_get_len (&ih[i-dest_before]); reiserfs_ih_set_loc (&ih[i-dest_before], location); } /* prepare space for items */ last_loc = reiserfs_ih_get_loc (&ih[nr+cpy_num-1-dest_before]); last_inserted_loc = reiserfs_ih_get_loc (&ih[cpy_num-1]); /* check free space */ memmove (dest->b_data + last_loc, dest->b_data + last_loc + j - last_inserted_loc, last_inserted_loc - last_loc); /* copy items */ memcpy (dest->b_data + last_inserted_loc, reiserfs_item_at(src,(first + cpy_num - 1)), j - last_inserted_loc); /* sizes, item number */ reiserfs_nh_set_items (blkh, reiserfs_nh_get_items (blkh) + cpy_num); reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) - (j - last_inserted_loc)); reiserfs_buffer_mkdirty (dest); if (dest_bi->bi_parent) { reiserfs_dc_t * dc; dc = reiserfs_int_at (dest_bi->bi_parent, dest_bi->bi_position); reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) + j - last_inserted_loc + REISERFS_IH_SIZE * cpy_num); reiserfs_buffer_mkdirty(dest_bi->bi_parent); } } /* If cpy_bytes equals minus one than copy cpy_num whole items from SOURCE to DEST. If cpy_bytes not equal to minus one than copy cpy_num-1 whole items from SOURCE to DEST. From last item copy cpy_num bytes for regular item and cpy_num directory entries for directory item. */ int reiserfs_lb_copy (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * dest_bi, reiserfs_bh_t * src, int last_first, int cpy_num, int cpy_bytes) { reiserfs_bh_t * dest; int pos, i, src_nr_item, bytes; dest = dest_bi->bi_bh; if ( cpy_num == 0 ) return 0; if ( last_first == FIRST_TO_LAST ) { /* copy items to left */ pos = 0; if ( cpy_num == 1 ) bytes = cpy_bytes; else bytes = -1; /* copy the first item or it part or nothing to the end of the DEST (i = reiserfs_lb_copy_boundary(DEST,SOURCE,0,bytes)) */ i = reiserfs_lb_copy_boundary (fs, dest_bi, src, FIRST_TO_LAST, bytes); cpy_num -= i; if ( cpy_num == 0 ) return i; pos += i; if ( cpy_bytes == -1 ) /* copy first cpy_num items starting from position 'pos' of SOURCE to end of DEST */ reiserfs_lb_copy_item(fs, dest_bi, src, FIRST_TO_LAST, pos, cpy_num); else { /* copy first cpy_num-1 items starting from position 'pos-1' of the SOURCE to the end of the DEST */ reiserfs_lb_copy_item(fs, dest_bi, src, FIRST_TO_LAST, pos, cpy_num-1); /* copy part of the item which number is cpy_num+pos-1 to the end of the DEST */ reiserfs_lb_split (fs, dest_bi, src, FIRST_TO_LAST, cpy_num+pos-1, cpy_bytes); } } else { /* copy items to right */ src_nr_item = reiserfs_node_items (src); if ( cpy_num == 1 ) bytes = cpy_bytes; else bytes = -1; /* copy the last item or it part or nothing to the begin of the DEST (i = reiserfs_lb_copy_boundary(DEST,SOURCE,1,bytes)); */ i = reiserfs_lb_copy_boundary (fs, dest_bi, src, LAST_TO_FIRST, bytes); cpy_num -= i; if ( cpy_num == 0 ) return i; pos = src_nr_item - cpy_num - i; if ( cpy_bytes == -1 ) { /* starting from position 'pos' copy last cpy_num items of SOURCE to begin of DEST */ reiserfs_lb_copy_item(fs, dest_bi, src, LAST_TO_FIRST, pos, cpy_num); } else { /* copy last cpy_num-1 items starting from position 'pos+1' of the SOURCE to the begin of the DEST; */ reiserfs_lb_copy_item(fs, dest_bi, src, LAST_TO_FIRST, pos+1, cpy_num-1); /* copy part of the item which number is pos to the begin of the DEST */ reiserfs_lb_split (fs, dest_bi, src, LAST_TO_FIRST, pos, cpy_bytes); } } return i; } /* there are types of coping: from S[0] to L[0], from S[0] to R[0], from R[0] to L[0]. for each of these we have to define parent and positions of destination and source buffers */ static void reiserfs_lb_move_prep (int shift_mode, reiserfs_tb_t * tb, reiserfs_bufinfo_t * dest_bi, reiserfs_bufinfo_t * src_bi, int * first_last, reiserfs_bh_t * Snew) { /* define dest, src, dest parent, dest position */ switch (shift_mode) { case LEAF_FROM_S_TO_L: /* it is used in reiserfs_lb_shift_left */ src_bi->bi_bh = REISERFS_PATH_LEAF (tb->tb_path); src_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0); /* src->b_item_order */ src_bi->bi_position = REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0); dest_bi->bi_bh = tb->L[0]; dest_bi->bi_parent = tb->FL[0]; dest_bi->bi_position = reiserfs_tb_lpos (tb, 0); *first_last = FIRST_TO_LAST; break; case LEAF_FROM_S_TO_R: /* it is used in reiserfs_lb_shift_right */ src_bi->bi_bh = REISERFS_PATH_LEAF (tb->tb_path); src_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0); src_bi->bi_position = REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0); dest_bi->bi_bh = tb->R[0]; dest_bi->bi_parent = tb->FR[0]; dest_bi->bi_position = reiserfs_tb_rpos (tb, 0); *first_last = LAST_TO_FIRST; break; case LEAF_FROM_R_TO_L: /* it is used in balance_leaf_when_delete */ src_bi->bi_bh = tb->R[0]; src_bi->bi_parent = tb->FR[0]; src_bi->bi_position = reiserfs_tb_rpos (tb, 0); dest_bi->bi_bh = tb->L[0]; dest_bi->bi_parent = tb->FL[0]; dest_bi->bi_position = reiserfs_tb_lpos (tb, 0); *first_last = FIRST_TO_LAST; break; case LEAF_FROM_L_TO_R: /* it is used in balance_leaf_when_delete */ src_bi->bi_bh = tb->L[0]; src_bi->bi_parent = tb->FL[0]; src_bi->bi_position = reiserfs_tb_lpos (tb, 0); dest_bi->bi_bh = tb->R[0]; dest_bi->bi_parent = tb->FR[0]; dest_bi->bi_position = reiserfs_tb_rpos (tb, 0); *first_last = LAST_TO_FIRST; break; case LEAF_FROM_S_TO_SNEW: src_bi->bi_bh = REISERFS_PATH_LEAF (tb->tb_path); src_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0); src_bi->bi_position = REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0); dest_bi->bi_bh = Snew; dest_bi->bi_parent = 0; dest_bi->bi_position = 0; *first_last = LAST_TO_FIRST; break; default: reiserfs_panic (0, "vs-10250: reiserfs_lb_move_prep: " "shift type is unknown (%d)", shift_mode); } } /* cuts DEL_COUNT entries beginning from FROM-th entry. Directory item does not have free space, so it moves DEHs and remaining records as necessary. Return value is size of removed part of directory item in bytes. */ static int reiserfs_lb_delete_entry (reiserfs_bh_t * bh, reiserfs_ih_t * ih, int from, int del_count) { char * item; reiserfs_deh_t * deh; int prev_record_offset; /* offset of record, that is (from-1)th */ char * prev_record; /* */ int cut_records_len; /* length of all removed records */ int i; int entry_count; /* first byte of item */ item = reiserfs_item_by_ih (bh, ih); /* entry head array */ deh = reiserfs_deh (bh, ih); entry_count = reiserfs_ih_get_entries (ih); if (del_count == 0) { int shift; int last_location; last_location = reiserfs_deh_get_loc (deh + entry_count - 1); shift = last_location - REISERFS_DEH_SIZE * entry_count; memmove (deh + entry_count, item + last_location, reiserfs_ih_get_len (ih) - last_location); for (i = 0; i < entry_count; i ++) reiserfs_deh_set_loc (&deh[i], reiserfs_deh_get_loc (&deh[i]) - shift); return shift; } /* first byte of remaining entries, those are BEFORE cut entries (prev_record) and length of all removed records (cut_records_len) */ prev_record_offset = (from ? reiserfs_deh_get_loc (&deh[from - 1]) : reiserfs_ih_get_len (ih)); if (from + del_count == entry_count) { cut_records_len = prev_record_offset/*from_record*/ - REISERFS_DEH_SIZE * entry_count; } else { cut_records_len = prev_record_offset/*from_record*/ - reiserfs_deh_get_loc (&deh[from + del_count - 1]); } prev_record = item + prev_record_offset; /* adjust locations of remaining entries */ for (i = reiserfs_ih_get_entries (ih) - 1; i > from + del_count - 1; i --) { reiserfs_deh_set_loc (deh + i, reiserfs_deh_get_loc (deh + i) - (REISERFS_DEH_SIZE * del_count)); } for (i = 0; i < from; i ++) { reiserfs_deh_set_loc (deh + i, reiserfs_deh_get_loc (deh + i) - (REISERFS_DEH_SIZE * del_count + cut_records_len)); } reiserfs_ih_set_entries (ih, reiserfs_ih_get_entries (ih) - del_count); /* shift entry head array and entries those are AFTER removed entries */ memmove ((char *)(deh + from), deh + from + del_count, prev_record - cut_records_len - (char *)(deh + from + del_count)); /* shift records, those are BEFORE removed entries */ memmove (prev_record - cut_records_len - REISERFS_DEH_SIZE * del_count, prev_record, item + reiserfs_ih_get_len (ih) - prev_record); return REISERFS_DEH_SIZE * del_count + cut_records_len; } /* when cut item is part of regular file pos_in_item - first byte that must be cut cut_size - number of bytes to be cut beginning from pos_in_item when cut item is part of directory pos_in_item - number of first deleted entry cut_size - count of deleted entries */ void reiserfs_lb_delete_unit (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * bi, int cut_item_num, int pos_in_item, int cut_size) { int nr; reiserfs_bh_t * bh = bi->bi_bh; reiserfs_node_head_t * blkh; reiserfs_ih_t * ih; int last_loc, unmoved_loc; int i; blkh = NODE_HEAD (bh); nr = reiserfs_nh_get_items (blkh); /* item head of truncated item */ ih = reiserfs_ih_at (bh, cut_item_num); if (reiserfs_ih_dir (ih)) { /* first cut entry ()*/ cut_size = reiserfs_lb_delete_entry (bh, ih, pos_in_item, cut_size); if (pos_in_item == 0) { /* change item key by key of first entry in the item */ reiserfs_key_set_off1 (&ih->ih_key, reiserfs_deh_get_off (reiserfs_deh (bh, ih))); /*memcpy (&ih->ih_key.k_offset, &(reiserfs_deh (bh, ih)->deh_offset), REISERFS_KEY_SHSIZE);*/ } } else { /* item is direct or extent */ /* shift item body to left if cut is from the head of item */ if (pos_in_item == 0) { memmove (bh->b_data + reiserfs_ih_get_loc (ih), bh->b_data + reiserfs_ih_get_loc (ih) + cut_size, reiserfs_ih_get_len (ih) - cut_size); /* change key of item */ if (reiserfs_ih_direct(ih)) { //ih->ih_key.k_offset += cut_size; reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), &ih->ih_key, reiserfs_key_get_off (&ih->ih_key) + cut_size); } else { //ih->ih_key.k_offset += (cut_size / REISERFS_EXT_SIZE) * bh->b_size; reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), &ih->ih_key, reiserfs_key_get_off (&ih->ih_key) + (cut_size / REISERFS_EXT_SIZE) * bh->b_size); } } } /* location of the last item */ last_loc = reiserfs_ih_get_loc (&ih[nr - cut_item_num - 1]); /* location of the item, which is remaining at the same place */ unmoved_loc = cut_item_num ? reiserfs_ih_get_loc (ih-1) : bh->b_size; /* shift */ memmove (bh->b_data + last_loc + cut_size, bh->b_data + last_loc, unmoved_loc - last_loc - cut_size); /* change item length */ reiserfs_ih_set_len (ih, reiserfs_ih_get_len (ih) - cut_size); if (reiserfs_ih_ext(ih)) { if (pos_in_item) //ih->u.ih_free_space = 0; reiserfs_ih_set_free (ih, 0); } /* change locations */ for (i = cut_item_num; i < nr; i ++) { reiserfs_ih_set_loc (&ih[i-cut_item_num], reiserfs_ih_get_loc (&ih[i-cut_item_num]) + cut_size); } /* size, free space */ reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) + cut_size); reiserfs_buffer_mkdirty(bh); if (bi->bi_parent) { reiserfs_dc_t * dc; dc = reiserfs_int_at (bi->bi_parent, bi->bi_position); reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) - cut_size); reiserfs_buffer_mkdirty(bi->bi_parent); } if (reiserfs_leaf_valid(bh) != NT_LEAF && reiserfs_leaf_valid(bh) != NT_IH_ARRAY) { reiserfs_panic ("reiserfs_lb_delete_unit: bad leaf %lu: %b", bh->b_blocknr, bh); } } /* delete del_num items from buffer starting from the first'th item */ void reiserfs_lb_delete_item (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * bi, int first, int del_num) { reiserfs_bh_t * bh = bi->bi_bh; int nr; int i, j; int last_loc, last_removed_loc; reiserfs_node_head_t * blkh; reiserfs_ih_t * ih; if (del_num == 0) return; blkh = NODE_HEAD (bh); nr = reiserfs_nh_get_items (blkh); if (first == 0 && del_num == nr) { /* this does not work */ reiserfs_tb_attach_new (bi); reiserfs_buffer_mkdirty(bh); return; } ih = reiserfs_ih_at (bh, first); /* location of unmovable item */ j = (first == 0) ? bh->b_size : reiserfs_ih_get_loc (ih-1); /* delete items */ last_loc = reiserfs_ih_get_loc (&ih[nr - 1 - first]); last_removed_loc = reiserfs_ih_get_loc (&ih[del_num-1]); memmove (bh->b_data + last_loc + j - last_removed_loc, bh->b_data + last_loc, last_removed_loc - last_loc); /* delete item headers */ memmove (ih, ih + del_num, (nr - first - del_num) * REISERFS_IH_SIZE); /* change item location */ for (i = first; i < nr - del_num; i ++) { reiserfs_ih_set_loc (&ih[i-first], reiserfs_ih_get_loc (&ih[i-first]) + j - last_removed_loc); } /* sizes, item number */ reiserfs_nh_set_items (blkh, reiserfs_nh_get_items (blkh)/*nr*/ - del_num); reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) + j - last_removed_loc + REISERFS_IH_SIZE * del_num); reiserfs_buffer_mkdirty(bh); if (bi->bi_parent) { reiserfs_dc_t * dc; dc = reiserfs_int_at (bi->bi_parent, bi->bi_position); reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) - (j - last_removed_loc + REISERFS_IH_SIZE * del_num)); reiserfs_buffer_mkdirty(bi->bi_parent); } if (reiserfs_leaf_valid(bh) != NT_LEAF && reiserfs_leaf_valid(bh) != NT_IH_ARRAY) { reiserfs_panic ("reiserfs_lb_delete_item: bad leaf %lu: %b", bh->b_blocknr, bh); } } /* If del_bytes == -1, starting from position 'first' delete del_num items in whole in buffer CUR. If not. If last_first == 0. Starting from position 'first' delete del_num-1 items in whole. Delete part of body of the first item. Part defined by del_bytes. Don't delete first item header If last_first == 1. Starting from position 'first+1' delete del_num-1 items in whole. Delete part of body of the last item . Part defined by del_bytes. Don't delete last item header. */ void reiserfs_lb_delete (reiserfs_filsys_t * fs, reiserfs_bufinfo_t * cur_bi, int last_first, int first, int del_num, int del_bytes) { reiserfs_bh_t * bh; int item_amount = reiserfs_node_items (bh = cur_bi->bi_bh); if ( del_num == 0 ) return; if ( first == 0 && del_num == item_amount && del_bytes == -1 ) { reiserfs_tb_attach_new (cur_bi); reiserfs_buffer_mkdirty (bh); return; } if ( del_bytes == -1 ) /* delete del_num items beginning from item in position first */ reiserfs_lb_delete_item (fs, cur_bi, first, del_num); else { if ( last_first == FIRST_TO_LAST ) { /* delete del_num-1 items beginning from item in position first */ reiserfs_lb_delete_item (fs, cur_bi, first, del_num-1); /* delete the part of the first item of the bh do not delete item header */ reiserfs_lb_delete_unit (fs, cur_bi, 0, 0, del_bytes); } else { reiserfs_ih_t * ih; int len; /* delete del_num-1 items beginning from item in position first+1 */ reiserfs_lb_delete_item (fs, cur_bi, first+1, del_num-1); /* the last item is directory */ if (reiserfs_ih_dir(ih = reiserfs_ih_at(bh, reiserfs_node_items(bh)-1))) /* len = numbers of directory entries in this item */ len = reiserfs_ih_get_entries(ih); else /* len = body len of item */ len = reiserfs_ih_get_len (ih); /* delete the part of the last item of the bh do not delete item header */ reiserfs_lb_delete_unit (fs, cur_bi, reiserfs_node_items(bh) - 1, len - del_bytes, del_bytes); } } } /* copy mov_num items and mov_bytes of the (mov_num-1)th item to neighbor. Delete them from source */ int reiserfs_lb_move (int shift_mode, reiserfs_tb_t * tb, int mov_num, int mov_bytes, reiserfs_bh_t * Snew) { int ret_value; reiserfs_bufinfo_t dest_bi, src_bi; int first_last; reiserfs_lb_move_prep (shift_mode, tb, &dest_bi, &src_bi, &first_last, Snew); ret_value = reiserfs_lb_copy (tb->tb_fs, &dest_bi, src_bi.bi_bh, first_last, mov_num, mov_bytes); reiserfs_lb_delete (tb->tb_fs, &src_bi, first_last, (first_last == FIRST_TO_LAST) ? 0 : (reiserfs_node_items(src_bi.bi_bh) - mov_num), mov_num, mov_bytes); return ret_value; } /* Shift shift_num items (and shift_bytes of last shifted item if shift_bytes != -1) from S[0] to L[0] and replace the delimiting key */ int reiserfs_lb_shift_left (reiserfs_tb_t * tb, int shift_num, int shift_bytes) { reiserfs_bh_t * S0 = REISERFS_PATH_LEAF (tb->tb_path); int i; /* move shift_num (and shift_bytes bytes) items from S[0] to left neighbor L[0] */ i = reiserfs_lb_move (LEAF_FROM_S_TO_L, tb, shift_num, shift_bytes, 0); if ( shift_num ) { if (reiserfs_node_items (S0) == 0) { /* everything is moved from S[0] */ if (REISERFS_PATH_UPPOS (tb->tb_path, 1) == 0) reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0], REISERFS_PATH_UPPARENT (tb->tb_path, 0), 0); } else { /* replace lkey in CFL[0] by 0-th key from S[0]; */ reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0], S0, 0); } } return i; } /* Shift shift_num (shift_bytes) items from S[0] to the right neighbor, and replace the delimiting key */ int reiserfs_lb_shift_right (reiserfs_tb_t * tb, int shift_num, int shift_bytes) { int ret_value; /* move shift_num (and shift_bytes) items from S[0] to right neighbor R[0] */ ret_value = reiserfs_lb_move (LEAF_FROM_S_TO_R, tb, shift_num, shift_bytes, 0); /* replace rkey in CFR[0] by the 0-th key from R[0] */ if (shift_num) { reiserfs_node_replace_key(tb->CFR[0], tb->rkey[0], tb->R[0], 0); } return ret_value; } /* Balance leaf node in case of delete or cut: insert_size[0] < 0 * * lnum, rnum can have values >= -1 * -1 means that the neighbor must be joined with S * 0 means that nothing should be done with the neighbor * >0 means to shift entirely or partly the specified number of * items to the neighbor */ static int reiserfs_lb_balance_delete(reiserfs_tb_t * tb, int flag) { reiserfs_bh_t * tbS0 = REISERFS_PATH_LEAF (tb->tb_path); int item_pos = REISERFS_PATH_LEAF_POS (tb->tb_path); int pos_in_item = tb->tb_path->pos_in_item; reiserfs_bufinfo_t bi; int n; reiserfs_ih_t * ih; ih = reiserfs_ih_at (tbS0, item_pos); /* Delete or truncate the item */ switch (flag) { case M_DELETE: /* delete item in S[0] */ bi.bi_bh = tbS0; bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0); bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, 1); reiserfs_lb_delete (tb->tb_fs, &bi, 0, item_pos, 1, -1); if ( ! item_pos ) { /* we have removed first item in the node - update left delimiting key */ if ( reiserfs_node_items(tbS0) ) { reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0], tbS0, 0); } else { if ( ! REISERFS_PATH_UPPOS (tb->tb_path, 1) ) { reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0], REISERFS_PATH_UPPARENT(tb->tb_path, 0),0); } } } break; case M_CUT: { /* cut item in S[0] */ bi.bi_bh = tbS0; bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0); bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, 1); if (reiserfs_ih_dir (ih)) { /* UFS unlink semantics are such that you can only delete one directory entry at a time. */ /* when we cut a directory tb->insert_size[0] means number of entries to be cut (always 1) */ tb->insert_size[0] = -1; reiserfs_lb_delete_unit (tb->tb_fs, &bi, item_pos, pos_in_item, -tb->insert_size[0]); if ( ! item_pos && ! pos_in_item ) { reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0], tbS0, 0); } } else { reiserfs_lb_delete_unit (tb->tb_fs, &bi, item_pos, pos_in_item, -tb->insert_size[0]); } break; } default: print_tb(flag, item_pos, pos_in_item, tb,"when_del"); reiserfs_panic ("PAP-12040: reiserfs_lb_balance_delete: " "unexpectable mode: %s(%d)", (flag == M_PASTE) ? "PASTE" : ((flag == M_INSERT) ? "INSERT" : "UNKNOWN"), flag); } /* the rule is that no shifting occurs unless by shifting a node can be freed */ n = reiserfs_node_items(tbS0); if ( tb->lnum[0] ) /* L[0] takes part in balancing */ { if ( tb->lnum[0] == -1 ) /* L[0] must be joined with S[0] */ { if ( tb->rnum[0] == -1 ) /* R[0] must be also joined with S[0] */ { if ( tb->FR[0] == REISERFS_PATH_UPPARENT(tb->tb_path, 0) ) { /* all contents of all the 3 buffers will be in L[0] */ if ((REISERFS_PATH_UPPOS (tb->tb_path, 1) == 0) && (1 < reiserfs_node_items(tb->FR[0]))) { reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0], tb->FR[0], 1); } reiserfs_lb_move (LEAF_FROM_S_TO_L, tb, n, -1, 0); reiserfs_lb_move (LEAF_FROM_R_TO_L, tb, reiserfs_node_items(tb->R[0]), -1, 0); reiserfs_node_forget (tb->tb_fs, tbS0->b_blocknr); reiserfs_node_forget (tb->tb_fs, tb->R[0]->b_blocknr); return 0; } /* all contents of all the 3 buffers will be in R[0] */ reiserfs_lb_move(LEAF_FROM_S_TO_R, tb, n, -1, 0); reiserfs_lb_move(LEAF_FROM_L_TO_R, tb, reiserfs_node_items(tb->L[0]), -1, 0); /* right_delimiting_key is correct in R[0] */ reiserfs_node_replace_key(tb->CFR[0], tb->rkey[0], tb->R[0], 0); reiserfs_node_forget (tb->tb_fs, tbS0->b_blocknr); reiserfs_node_forget (tb->tb_fs, tb->L[0]->b_blocknr); return -1; } /* all contents of L[0] and S[0] will be in L[0] */ reiserfs_lb_shift_left(tb, n, -1); reiserfs_node_forget (tb->tb_fs, tbS0->b_blocknr); return 0; } /* a part of contents of S[0] will be in L[0] and the rest part of S[0] will be in R[0] */ reiserfs_lb_shift_left (tb, tb->lnum[0], tb->lbytes); reiserfs_lb_shift_right(tb, tb->rnum[0], tb->rbytes); reiserfs_node_forget (tb->tb_fs, tbS0->b_blocknr); return 0; } if ( tb->rnum[0] == -1 ) { /* all contents of R[0] and S[0] will be in R[0] */ reiserfs_lb_shift_right(tb, n, -1); reiserfs_node_forget (tb->tb_fs, tbS0->b_blocknr); return 0; } return 0; } int reiserfs_lb_balance(reiserfs_tb_t * tb, /* item header of inserted item */ reiserfs_ih_t * ih, /* body of inserted item or bytes to paste */ const char * body, /* i - insert, d - delete, c - cut, p - paste (see comment to reiserfs_tb_balance) */ int flag, /* it is always 0 */ int zeros_number, /* in our processing of one level we sometimes determine what must be inserted into the next higher level. This insertion consists of a key or two keys and their corresponding pointers */ reiserfs_ih_t * insert_key, /* inserted node-ptrs for the next level */ reiserfs_bh_t ** insert_ptr) { /* position in item, in bytes for direct and extent items, in entries for directories (for which it is an index into the array of directory entry headers.) */ int pos_in_item = tb->tb_path->pos_in_item; reiserfs_bh_t * tbS0 = REISERFS_PATH_LEAF (tb->tb_path); /* reiserfs_bh_t * tbF0 = REISERFS_PATH_UPPARENT (tb->tb_path, 0); int S0_b_item_order = REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0);*/ /* index into the array of item headers in S[0] of the affected item */ int item_pos = REISERFS_PATH_LEAF_POS (tb->tb_path); reiserfs_bufinfo_t bi; /* new nodes allocated to hold what could not fit into S */ reiserfs_bh_t *S_new[2]; /* number of items that will be placed into S_new (includes partially shifted items) */ int snum[2]; /* if an item is partially shifted into S_new then if it is a directory item it is the number of entries from the item that are shifted into S_new else it is the number of bytes from the item that are shifted into S_new */ int sbytes[2]; int n, i; int ret_val; /* Make balance in case insert_size[0] < 0 */ if ( tb->insert_size[0] < 0 ) return reiserfs_lb_balance_delete (/*th,*/ tb, flag); /* for extent item pos_in_item is measured in unformatted node pointers. Recalculate to bytes */ if (flag != M_INSERT && reiserfs_ih_ext (reiserfs_ih_at (tbS0, item_pos))) pos_in_item *= REISERFS_EXT_SIZE; if ( tb->lnum[0] > 0 ) { /* Shift lnum[0] items from S[0] to the left neighbor L[0] */ if ( item_pos < tb->lnum[0] ) { /* new item or it part falls to L[0], shift it too */ n = reiserfs_node_items(tb->L[0]); switch (flag) { case M_INSERT: /* insert item into L[0] */ if ( item_pos == tb->lnum[0] - 1 && tb->lbytes != -1 ) { /* part of new item falls into L[0] */ int new_item_len; ret_val = reiserfs_lb_shift_left (tb, tb->lnum[0]-1, -1); /* Calculate item length to insert to S[0] */ new_item_len = reiserfs_ih_get_len (ih) - tb->lbytes; /* Calculate and check item length to insert to L[0] */ reiserfs_ih_set_len (ih, reiserfs_ih_get_len (ih) - new_item_len); /* Insert new item into L[0] */ bi.bi_bh = tb->L[0]; bi.bi_parent = tb->FL[0]; bi.bi_position = reiserfs_tb_lpos (tb, 0); reiserfs_lb_insert (tb->tb_fs, &bi, n + item_pos - ret_val, ih, body, zeros_number > reiserfs_ih_get_len (ih) ? reiserfs_ih_get_len (ih) : zeros_number); /* Calculate key component, item length and body to insert into S[0] */ //ih->ih_key.k_offset += tb->lbytes; reiserfs_key_set_off ( reiserfs_key_format (&ih->ih_key), &ih->ih_key, reiserfs_key_get_off (&ih->ih_key) + tb->lbytes * (reiserfs_ih_ext(ih) ? tb->tb_fs->fs_blocksize / REISERFS_EXT_SIZE : 1) ); reiserfs_ih_set_len (ih, new_item_len); if ( tb->lbytes > zeros_number ) { body += (tb->lbytes - zeros_number); zeros_number = 0; } else zeros_number -= tb->lbytes; } else { /* new item in whole falls into L[0] */ /* Shift lnum[0]-1 items to L[0] */ ret_val = reiserfs_lb_shift_left(tb, tb->lnum[0]-1, tb->lbytes); /* Insert new item into L[0] */ bi.bi_bh = tb->L[0]; bi.bi_parent = tb->FL[0]; bi.bi_position = reiserfs_tb_lpos (tb, 0); reiserfs_lb_insert (tb->tb_fs, &bi, n + item_pos - ret_val, ih, body, zeros_number); tb->insert_size[0] = 0; zeros_number = 0; } break; case M_PASTE: /* append item in L[0] */ if ( item_pos == tb->lnum[0] - 1 && tb->lbytes != -1 ) { /* we must shift the part of the appended item */ if ( reiserfs_ih_dir (reiserfs_ih_at (tbS0, item_pos))) { /* directory item */ if ( tb->lbytes > pos_in_item ) { /* new directory entry falls into L[0] */ reiserfs_ih_t * pasted; int l_pos_in_item = pos_in_item; /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 entries from given directory item */ ret_val = reiserfs_lb_shift_left(tb, tb->lnum[0], tb->lbytes - 1); if ( ret_val && ! item_pos ) { pasted = reiserfs_ih_at(tb->L[0], reiserfs_node_items(tb->L[0])-1); l_pos_in_item += reiserfs_ih_get_entries(pasted) - (tb->lbytes-1); } /* Append given directory entry to directory item */ bi.bi_bh = tb->L[0]; bi.bi_parent = tb->FL[0]; bi.bi_position = reiserfs_tb_lpos(tb, 0); reiserfs_lb_insert_unit (tb->tb_fs, &bi, n + item_pos - ret_val, l_pos_in_item, tb->insert_size[0], body, zeros_number); /* previous string prepared space for pasting new entry, following string pastes this entry */ /* when we have merge directory item, pos_in_item has been changed too */ /* paste new directory entry. 1 is entry number */ reiserfs_lb_insert_entry (bi.bi_bh, n + item_pos - ret_val, l_pos_in_item, 1, (reiserfs_deh_t *)body, body + REISERFS_DEH_SIZE, tb->insert_size[0] ); tb->insert_size[0] = 0; } else { /* new directory item doesn't fall into L[0] */ /* Shift lnum[0]-1 items in whole. Shift lbytes directory entries from directory item number lnum[0] */ reiserfs_lb_shift_left (tb, tb->lnum[0], tb->lbytes); } /* Calculate new position to append in item body */ pos_in_item -= tb->lbytes; } else { /* regular object */ if ( tb->lbytes >= pos_in_item ) { /* appended item will be in L[0] in whole */ int l_n, temp_n; reiserfs_key_t * key; /* this bytes number must be appended to the last item of L[h] */ l_n = tb->lbytes - pos_in_item; /* Calculate new insert_size[0] */ tb->insert_size[0] -= l_n; ret_val = reiserfs_lb_shift_left(tb, tb->lnum[0], reiserfs_ih_get_len(reiserfs_ih_at(tbS0, item_pos))); /* Append to body of item in L[0] */ bi.bi_bh = tb->L[0]; bi.bi_parent = tb->FL[0]; bi.bi_position = reiserfs_tb_lpos (tb, 0); reiserfs_lb_insert_unit(tb->tb_fs, &bi,n + item_pos - ret_val, reiserfs_ih_get_len (reiserfs_ih_at(tb->L[0], n+item_pos-ret_val)), l_n,body, zeros_number > l_n ? l_n : zeros_number); /* 0-th item in S0 can be only of DIRECT type when l_n != 0*/ //reiserfs_ih_key_at (tbS0, 0)->k_offset += l_n;z key = reiserfs_ih_key_at (tbS0, 0); temp_n = reiserfs_ih_ext(reiserfs_ih_at (tb->L[0], n + item_pos - ret_val)) ? (int)((l_n / REISERFS_EXT_SIZE) * tb->tb_fs->fs_blocksize) : l_n; reiserfs_key_set_off ( reiserfs_key_format (key), key, reiserfs_key_get_off (key) + temp_n); /*reiserfs_int_key_at(tb->CFL[0], tb->lkey[0])->k_offset += l_n; */ key = reiserfs_int_key_at(tb->CFL[0],tb->lkey[0]); reiserfs_key_set_off ( reiserfs_key_format (key), key, reiserfs_key_get_off (key) + temp_n); /* Calculate new body, position in item and insert_size[0] */ if ( l_n > zeros_number ) { body += (l_n - zeros_number); zeros_number = 0; } else zeros_number -= l_n; pos_in_item = 0; } else { /* only part of the appended item will be in L[0] */ /* Calculate position in item for append in S[0] */ pos_in_item -= tb->lbytes; /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */ reiserfs_lb_shift_left(tb,tb->lnum[0], tb->lbytes); } } } else { /* appended item will be in L[0] in whole */ reiserfs_ih_t * pasted; if ( ! item_pos && reiserfs_tree_left_mergeable (tb->tb_fs, tb->tb_path) == 1 ) { /* if we paste into first item of S[0] and it is left mergable then increment pos_in_item by the size of the last item in L[0] */ pasted = reiserfs_ih_at(tb->L[0],n-1); if ( reiserfs_ih_dir(pasted) ) pos_in_item += reiserfs_ih_get_entries (pasted); else pos_in_item += reiserfs_ih_get_len (pasted); } /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */ ret_val = reiserfs_lb_shift_left(tb, tb->lnum[0], tb->lbytes); /* Append to body of item in L[0] */ bi.bi_bh = tb->L[0]; bi.bi_parent = tb->FL[0]; bi.bi_position = reiserfs_tb_lpos (tb, 0); reiserfs_lb_insert_unit (tb->tb_fs, &bi, n + item_pos - ret_val, pos_in_item, tb->insert_size[0], body, zeros_number); /* if appended item is directory, paste entry */ pasted = reiserfs_ih_at (tb->L[0], n + item_pos - ret_val); if (reiserfs_ih_dir (pasted)) reiserfs_lb_insert_entry (bi.bi_bh, n + item_pos - ret_val, pos_in_item, 1, (reiserfs_deh_t *)body, body + REISERFS_DEH_SIZE, tb->insert_size[0]); /* if appended item is extent item, put unformatted node into un list */ if (reiserfs_ih_ext (pasted)) reiserfs_ih_set_free (pasted, 0); tb->insert_size[0] = 0; zeros_number = 0; } break; default: /* cases d and t */ reiserfs_panic ("PAP-12130: reiserfs_lb_balance: " "lnum > 0: unexpectable mode: %s(%d)", (flag == M_DELETE) ? "DELETE" : ((flag == M_CUT) ? "CUT" : "UNKNOWN"), flag); } } else { /* new item doesn't fall into L[0] */ reiserfs_lb_shift_left (tb, tb->lnum[0], tb->lbytes); } } /* tb->lnum[0] > 0 */ /* Calculate new item position */ item_pos -= ( tb->lnum[0] - (( tb->lbytes != -1 ) ? 1 : 0)); if ( tb->rnum[0] > 0 ) { /* shift rnum[0] items from S[0] to the right neighbor R[0] */ n = reiserfs_node_items(tbS0); switch ( flag ) { case M_INSERT: /* insert item */ if ( n - tb->rnum[0] < item_pos ) { /* new item or its part falls to R[0] */ if ( item_pos == n - tb->rnum[0] + 1 && tb->rbytes != -1 ) { /* part of new item falls into R[0] */ long long int old_key_comp, old_len, r_zeros_number; const char * r_body; long long int multiplyer; reiserfs_lb_shift_right(tb, tb->rnum[0] - 1, -1); /* Remember key component and item length */ old_key_comp = reiserfs_key_get_off (&ih->ih_key); old_len = reiserfs_ih_get_len (ih); multiplyer = reiserfs_ih_ext(ih) ? tb->tb_fs->fs_blocksize / REISERFS_EXT_SIZE : 1; /* Calculate key component and item length to insert into R[0] */ //ih->ih_key.k_offset += (old_len - tb->rbytes); reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), &ih->ih_key, old_key_comp + (old_len - tb->rbytes) * multiplyer ); reiserfs_ih_set_len (ih, tb->rbytes); /* Insert part of the item into R[0] */ bi.bi_bh = tb->R[0]; bi.bi_parent = tb->FR[0]; bi.bi_position = reiserfs_tb_rpos (tb, 0); if (old_len - tb->rbytes > zeros_number ) { r_zeros_number = 0; r_body = body + old_len - tb->rbytes - zeros_number; } else { /* zeros_number is always 0 */ r_body = body; r_zeros_number = zeros_number - old_len - tb->rbytes; zeros_number -= r_zeros_number; } reiserfs_lb_insert (tb->tb_fs, &bi, 0, ih, r_body, r_zeros_number); /* Replace right delimiting key by first key in R[0] */ reiserfs_node_replace_key(tb->CFR[0], tb->rkey[0], tb->R[0], 0); /* Calculate key component and item length to insert into S[0] */ //ih->ih_key.k_offset = old_key_comp; reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), &ih->ih_key, old_key_comp); reiserfs_ih_set_len (ih, old_len - tb->rbytes); tb->insert_size[0] -= tb->rbytes; } else { /* whole new item falls into R[0] */ /* Shift rnum[0]-1 items to R[0] */ ret_val = reiserfs_lb_shift_right(tb, tb->rnum[0] - 1, tb->rbytes); /* Insert new item into R[0] */ bi.bi_bh = tb->R[0]; bi.bi_parent = tb->FR[0]; bi.bi_position = reiserfs_tb_rpos (tb, 0); reiserfs_lb_insert (tb->tb_fs, &bi, item_pos - n + tb->rnum[0] - 1, ih, body, zeros_number); /* If we insert new item in the begin of R[0] change the right delimiting key */ if ( item_pos - n + tb->rnum[0] - 1 == 0 ) { reiserfs_node_replace_key (tb->CFR[0], tb->rkey[0], tb->R[0], 0); } zeros_number = tb->insert_size[0] = 0; } } else { /* new item or part of it doesn't fall into R[0] */ reiserfs_lb_shift_right (tb, tb->rnum[0], tb->rbytes); } break; case M_PASTE: /* append item */ if ( n - tb->rnum[0] <= item_pos ) { /* pasted item or part of it falls to R[0] */ if ( item_pos == n - tb->rnum[0] && tb->rbytes != -1 ) { /* we must shift the part of the appended item */ if ( reiserfs_ih_dir (reiserfs_ih_at(tbS0, item_pos))) { /* we append to directory item */ int entry_count; entry_count = reiserfs_ih_get_entries(reiserfs_ih_at(tbS0, item_pos)); if ( entry_count - tb->rbytes < pos_in_item ) { /* new directory entry falls into R[0] */ int paste_entry_position; /* Shift rnum[0]-1 items in whole. Shift rbytes-1 directory entries from directory item number rnum[0] */ reiserfs_lb_shift_right (tb, tb->rnum[0], tb->rbytes - 1); /* Paste given directory entry to directory item */ paste_entry_position = pos_in_item - entry_count + tb->rbytes - 1; bi.bi_bh = tb->R[0]; bi.bi_parent = tb->FR[0]; bi.bi_position = reiserfs_tb_rpos (tb, 0); reiserfs_lb_insert_unit (tb->tb_fs, &bi, 0, paste_entry_position, tb->insert_size[0], body,zeros_number); /* paste entry */ reiserfs_lb_insert_entry ( bi.bi_bh, 0, paste_entry_position, 1, (reiserfs_deh_t *)body, body + REISERFS_DEH_SIZE, tb->insert_size[0]); if ( paste_entry_position == 0 ) { /* change delimiting keys */ reiserfs_node_replace_key(tb->CFR[0], tb->rkey[0], tb->R[0], 0); } tb->insert_size[0] = 0; pos_in_item++; } else { /* new directory entry doesn't fall into R[0] */ reiserfs_lb_shift_right (tb, tb->rnum[0], tb->rbytes); } } else { /* regular object */ int n_shift, n_rem, r_zeros_number; const char * r_body; reiserfs_key_t * key; /* Calculate number of bytes which must be shifted from appended item */ if ( (n_shift = tb->rbytes - tb->insert_size[0]) < 0 ) n_shift = 0; reiserfs_lb_shift_right (tb, tb->rnum[0], n_shift); /* Calculate number of bytes which must remain in body after appending to R[0] */ if ( (n_rem = tb->insert_size[0] - tb->rbytes) < 0 ) n_rem = 0; { unsigned long temp_rem = n_rem; if (reiserfs_key_ext(reiserfs_ih_key_at(tb->R[0],0))) temp_rem = (n_rem / REISERFS_EXT_SIZE) * tb->tb_fs->fs_blocksize; //reiserfs_ih_key_at(tb->R[0],0)->k_offset += n_rem; key = reiserfs_ih_key_at(tb->R[0],0); reiserfs_key_set_off ( reiserfs_key_format (key), key, reiserfs_key_get_off (key) + temp_rem); /*reiserfs_int_key_at(tb->CFR[0], tb->rkey[0])->k_offset += n_rem; */ key = reiserfs_int_key_at(tb->CFR[0],tb->rkey[0]); reiserfs_key_set_off ( reiserfs_key_format (key), key, reiserfs_key_get_off (key) + temp_rem); } reiserfs_buffer_mkdirty (tb->CFR[0]); /* Append part of body into R[0] */ bi.bi_bh = tb->R[0]; bi.bi_parent = tb->FR[0]; bi.bi_position = reiserfs_tb_rpos (tb, 0); if ( n_rem > zeros_number ) { r_zeros_number = 0; r_body = body + n_rem - zeros_number; } else { r_body = body; r_zeros_number = zeros_number - n_rem; zeros_number -= r_zeros_number; } reiserfs_lb_insert_unit(tb->tb_fs, &bi, 0, n_shift, tb->insert_size[0] - n_rem, r_body, r_zeros_number); if (reiserfs_ih_ext(reiserfs_ih_at(tb->R[0],0))) { reiserfs_ih_set_free (reiserfs_ih_at(tb->R[0],0), 0); } tb->insert_size[0] = n_rem; if ( ! n_rem ) pos_in_item ++; } } else { /* pasted item falls into R[0] entirely */ reiserfs_ih_t * pasted; ret_val = reiserfs_lb_shift_right (tb, tb->rnum[0], tb->rbytes); /* append item in R[0] */ if ( pos_in_item >= 0 ) { bi.bi_bh = tb->R[0]; bi.bi_parent = tb->FR[0]; bi.bi_position = reiserfs_tb_rpos (tb, 0); reiserfs_lb_insert_unit(tb->tb_fs, &bi,item_pos - n + tb->rnum[0], pos_in_item, tb->insert_size[0], body, zeros_number); } /* paste new entry, if item is directory item */ pasted = reiserfs_ih_at(tb->R[0], item_pos - n + tb->rnum[0]); if (reiserfs_ih_dir (pasted) && pos_in_item >= 0 ) { reiserfs_lb_insert_entry (bi.bi_bh, item_pos - n + tb->rnum[0], pos_in_item, 1, (reiserfs_deh_t *)body, body + REISERFS_DEH_SIZE, tb->insert_size[0]); if ( ! pos_in_item ) { /* update delimiting keys */ reiserfs_node_replace_key (tb->CFR[0], tb->rkey[0], tb->R[0], 0); } } if (reiserfs_ih_ext (pasted)) reiserfs_ih_set_free (pasted, 0); zeros_number = tb->insert_size[0] = 0; } } else { /* new item doesn't fall into R[0] */ reiserfs_lb_shift_right (tb, tb->rnum[0], tb->rbytes); } break; default: /* cases d and t */ reiserfs_panic ("PAP-12175: reiserfs_lb_balance: " "rnum > 0: unexpectable mode: %s(%d)", (flag == M_DELETE) ? "DELETE" : ((flag == M_CUT) ? "CUT" : "UNKNOWN"), flag); } } /* tb->rnum[0] > 0 */ /* if while adding to a node we discover that it is possible to split it in two, and merge the left part into the left neighbor and the right part into the right neighbor, eliminating the node */ if ( tb->blknum[0] == 0 ) { /* node S[0] is empty now */ /* if insertion was done before 0-th position in R[0], right delimiting key of the tb->L[0]'s and left delimiting key are not set correctly */ if (tb->CFL[0]) { if (!tb->CFR[0]) reiserfs_panic (tb->tb_fs, "vs-12195: reiserfs_lb_balance: " "CFR not initialized"); reiserfs_key_copy (reiserfs_int_key_at (tb->CFL[0], tb->lkey[0]), reiserfs_int_key_at (tb->CFR[0], tb->rkey[0])); reiserfs_buffer_mkdirty (tb->CFL[0]); } reiserfs_node_forget (tb->tb_fs, tbS0->b_blocknr); return 0; } /* Fill new nodes that appear in place of S[0] */ /* I am told that this copying is because we need an array to enable the looping code. -Hans */ snum[0] = tb->s1num, snum[1] = tb->s2num; sbytes[0] = tb->s1bytes; sbytes[1] = tb->s2bytes; for( i = tb->blknum[0] - 2; i >= 0; i-- ) { /* here we shift from S to S_new nodes */ S_new[i] = reiserfs_tb_FEB(tb); /* set block_head's level to leaf level */ reiserfs_nh_set_level (NODE_HEAD (S_new[i]), LEAF_LEVEL); n = reiserfs_node_items(tbS0); switch (flag) { case M_INSERT: /* insert item */ if ( n - snum[i] < item_pos ) { /* new item or it's part falls to first new node S_new[i]*/ if ( item_pos == n - snum[i] + 1 && sbytes[i] != -1 ) { /* part of new item falls into S_new[i] */ long long int old_key_comp, old_len, r_zeros_number; const char * r_body; long long int multiplyer; /* Move snum[i]-1 items from S[0] to S_new[i] */ reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, snum[i] - 1, -1, S_new[i]); /* Remember key component and item length */ old_key_comp = reiserfs_key_get_off (&ih->ih_key); old_len = reiserfs_ih_get_len (ih); multiplyer = reiserfs_ih_ext(ih) ? tb->tb_fs->fs_blocksize / REISERFS_EXT_SIZE : 1; /* Calculate key component and item length to insert into S_new[i] */ //ih->ih_key.k_offset += (old_len - sbytes[i]); reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), &ih->ih_key, old_key_comp + (old_len - sbytes[i]) *multiplyer); reiserfs_ih_set_len (ih, sbytes[i]); /* Insert part of the item into S_new[i] before 0-th item */ bi.bi_bh = S_new[i]; bi.bi_parent = 0; bi.bi_position = 0; if ( old_len - sbytes[i] > zeros_number ) { r_zeros_number = 0; r_body = body + (old_len - sbytes[i]) - zeros_number; } else { r_body = body; r_zeros_number = zeros_number - (old_len - sbytes[i]); zeros_number -= r_zeros_number; } reiserfs_lb_insert (tb->tb_fs, &bi, 0, ih, r_body, r_zeros_number); /* Calculate key component and item length to insert into S[i] */ //ih->ih_key.k_offset = old_key_comp; reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), &ih->ih_key, old_key_comp); reiserfs_ih_set_len (ih, old_len - sbytes[i]); tb->insert_size[0] -= sbytes[i]; } else /* whole new item falls into S_new[i] */ { /* Shift snum[0] - 1 items to S_new[i] (sbytes[i] of split item) */ reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, snum[i] - 1, sbytes[i], S_new[i]); /* Insert new item into S_new[i] */ bi.bi_bh = S_new[i]; bi.bi_parent = 0; bi.bi_position = 0; reiserfs_lb_insert (tb->tb_fs, &bi, item_pos - n + snum[i] - 1, ih, body, zeros_number); zeros_number = tb->insert_size[0] = 0; } } else /* new item or it part don't falls into S_new[i] */ { reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, snum[i], sbytes[i], S_new[i]); } break; case M_PASTE: /* append item */ if ( n - snum[i] <= item_pos ) /* pasted item or part if it falls to S_new[i] */ { if ( item_pos == n - snum[i] && sbytes[i] != -1 ) { /* we must shift part of the appended item */ reiserfs_ih_t * aux_ih; aux_ih = reiserfs_ih_at(tbS0,item_pos); if (reiserfs_ih_dir (aux_ih)) { /* we append to directory item */ int entry_count; entry_count = reiserfs_ih_get_entries(aux_ih); if ( entry_count - sbytes[i] < pos_in_item && pos_in_item <= entry_count ) { /* new directory entry falls into S_new[i] */ /* Shift snum[i]-1 items in whole. Shift sbytes[i] directory entries from directory item number snum[i] */ reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb,snum[i], sbytes[i]-1, S_new[i]); /* Paste given directory entry to directory item */ bi.bi_bh = S_new[i]; bi.bi_parent = 0; bi.bi_position = 0; reiserfs_lb_insert_unit (tb->tb_fs, &bi, 0, pos_in_item - entry_count + sbytes[i] - 1, tb->insert_size[0], body, zeros_number); /* paste new directory entry */ reiserfs_lb_insert_entry (bi.bi_bh, 0, pos_in_item - entry_count + sbytes[i] - 1, 1, (reiserfs_deh_t *)body, body + REISERFS_DEH_SIZE, tb->insert_size[0]); tb->insert_size[0] = 0; pos_in_item++; } else { /* new directory entry doesn't fall into S_new[i] */ reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, snum[i], sbytes[i], S_new[i]); } } else /* regular object */ { int n_shift, n_rem, r_zeros_number; const char * r_body; reiserfs_ih_t * tmp; /* Calculate number of bytes which must be shifted from appended item */ n_shift = sbytes[i] - tb->insert_size[0]; if ( n_shift < 0 ) n_shift = 0; reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, snum[i], n_shift, S_new[i]); /* Calculate number of bytes which must remain in body after append to S_new[i] */ n_rem = tb->insert_size[0] - sbytes[i]; if ( n_rem < 0 ) n_rem = 0; /* Append part of body into S_new[0] */ bi.bi_bh = S_new[i]; bi.bi_parent = 0; bi.bi_position = 0; if ( n_rem > zeros_number ) { r_zeros_number = 0; r_body = body + n_rem - zeros_number; } else { r_body = body; r_zeros_number = zeros_number - n_rem; zeros_number -= r_zeros_number; } reiserfs_lb_insert_unit(tb->tb_fs, &bi, 0, n_shift, tb->insert_size[0]-n_rem, r_body,r_zeros_number); tmp = reiserfs_ih_at (S_new[i], 0); if (reiserfs_ih_ext(tmp)) { /* if (n_rem) reiserfs_panic ("PAP-12230: reiserfs_lb_balance: " "invalid action with extent item"); reiserfs_ih_set_free (tmp, 0); */ reiserfs_ih_set_free (tmp, 0); reiserfs_key_set_off( reiserfs_key_format (&tmp->ih_key), &tmp->ih_key, reiserfs_key_get_off(&tmp->ih_key) + (n_rem / REISERFS_EXT_SIZE) * tb->tb_fs->fs_blocksize); } else reiserfs_key_set_off ( reiserfs_key_format (&tmp->ih_key), &tmp->ih_key, reiserfs_key_get_off(&tmp->ih_key) + n_rem); //reiserfs_ih_key_at(S_new[i],0)->k_offset += n_rem; // tb->insert_size[0] = n_rem; if ( ! n_rem ) pos_in_item++; } } else /* item falls wholly into S_new[i] */ { reiserfs_ih_t * pasted; reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, snum[i], sbytes[i], S_new[i]); /* paste into item */ bi.bi_bh = S_new[i]; bi.bi_parent = 0; bi.bi_position = 0; reiserfs_lb_insert_unit(tb->tb_fs, &bi, item_pos - n + snum[i], pos_in_item, tb->insert_size[0], body, zeros_number); pasted = reiserfs_ih_at(S_new[i], item_pos - n + snum[i]); if (reiserfs_ih_dir (pasted)) { reiserfs_lb_insert_entry (bi.bi_bh, item_pos - n + snum[i], pos_in_item, 1, (reiserfs_deh_t *)body, body + REISERFS_DEH_SIZE, tb->insert_size[0]); } /* if we paste to extent item update ih_free_space */ if (reiserfs_ih_ext (pasted)) reiserfs_ih_set_free (pasted, 0); zeros_number = tb->insert_size[0] = 0; } } else { /* pasted item doesn't fall into S_new[i] */ reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, snum[i], sbytes[i], S_new[i]); } break; default: /* cases d and t */ reiserfs_panic ("PAP-12245: reiserfs_lb_balance: blknum > 2: " "unexpectable mode: %s(%d)", (flag == M_DELETE) ? "DELETE" : ((flag == M_CUT) ? "CUT" : "UNKNOWN"), flag); } memcpy (insert_key + i,reiserfs_ih_key_at(S_new[i],0),REISERFS_KEY_SIZE); insert_ptr[i] = S_new[i]; } /* if the affected item was not wholly shifted then we perform all necessary operations on that part or whole of the affected item which remains in S */ if ( 0 <= item_pos && item_pos < tb->s0num ) { /* if we must insert or append into buffer S[0] */ switch (flag) { case M_INSERT: /* insert item into S[0] */ bi.bi_bh = tbS0; bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0); bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, 1); reiserfs_lb_insert (tb->tb_fs, &bi, item_pos, ih, body, zeros_number); /* If we insert the first key change the delimiting key */ if( item_pos == 0 ) { if (tb->CFL[0]) /* can be 0 in reiserfsck */ reiserfs_node_replace_key (tb->CFL[0], tb->lkey[0], tbS0, 0); } break; case M_PASTE: { /* append item in S[0] */ reiserfs_ih_t * pasted; pasted = reiserfs_ih_at (tbS0, item_pos); /* when directory, may be new entry already pasted */ if (reiserfs_ih_dir (pasted)) { if ( pos_in_item >= 0 && pos_in_item <= reiserfs_ih_get_entries (pasted) ) { /* prepare space */ bi.bi_bh = tbS0; bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0); bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, 1); reiserfs_lb_insert_unit(tb->tb_fs, &bi, item_pos, pos_in_item, tb->insert_size[0], body, zeros_number); /* paste entry */ reiserfs_lb_insert_entry (bi.bi_bh, item_pos, pos_in_item, 1, (reiserfs_deh_t *)body, body + REISERFS_DEH_SIZE, tb->insert_size[0]); if ( ! item_pos && ! pos_in_item ) { if (tb->CFL[0]) // can be 0 in reiserfsck reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0], tbS0, 0); } tb->insert_size[0] = 0; } } else { /* regular object */ if ( pos_in_item == reiserfs_ih_get_len (pasted) ) { bi.bi_bh = tbS0; bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0); bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, 1); reiserfs_lb_insert_unit (tb->tb_fs, &bi, item_pos, pos_in_item, tb->insert_size[0], body, zeros_number); if (reiserfs_ih_ext (pasted)) { reiserfs_ih_set_free (pasted, 0); } tb->insert_size[0] = 0; } } } /* case M_PASTE: */ } } return 0; } /* Leaf level of the tree is balanced (end of reiserfs_lb_balance) */ static void print_tb (int mode, int item_pos, int pos_in_item, reiserfs_tb_t * tb, char * mes) { unsigned int h = 0; reiserfs_bh_t * tbSh, * tbFh; if (!tb) return; printf ("\n********************** PRINT_TB for %s *******************\n", mes); printf ("MODE=%c, ITEM_POS=%d POS_IN_ITEM=%d\n", mode, item_pos, pos_in_item); printf ("*********************************************************************\n"); printf ("* h * S * L * R * F * FL * FR * CFL * CFR *\n"); for (h = 0; h < sizeof(tb->insert_size) / sizeof (tb->insert_size[0]); h ++) { if (REISERFS_PATH_LEVEL (tb->tb_path, h) <= tb->tb_path->path_length && REISERFS_PATH_LEVEL (tb->tb_path, h) > REISERFS_PATH_OFFILL) { tbSh = REISERFS_PATH_UPBUFFER (tb->tb_path, h); tbFh = REISERFS_PATH_UPPARENT (tb->tb_path, h); } else { /* printk ("print_tb: h=%d, REISERFS_PATH_LEVEL=%d, path_length=%d\n", h, REISERFS_PATH_LEVEL (tb->tb_path, h), tb->tb_path->path_length);*/ tbSh = 0; tbFh = 0; } printf ("* %u * %3lu(%2lu) * %3lu(%2lu) * %3lu(%2lu) * %5ld * " "%5ld * %5ld * %5ld * %5ld *\n", h, tbSh ? tbSh->b_blocknr : ~0ul, tbSh ? tbSh->b_count : ~0ul, tb->L[h] ? tb->L[h]->b_blocknr : ~0ul, tb->L[h] ? tb->L[h]->b_count : ~0ul, tb->R[h] ? tb->R[h]->b_blocknr : ~0ul, tb->R[h] ? tb->R[h]->b_count : ~0ul, tbFh ? tbFh->b_blocknr : ~0ul, tb->FL[h] ? tb->FL[h]->b_blocknr : ~0ul, tb->FR[h] ? tb->FR[h]->b_blocknr : ~0ul, tb->CFL[h] ? tb->CFL[h]->b_blocknr : ~0ul, tb->CFR[h] ? tb->CFR[h]->b_blocknr : ~0ul); } printf ("*********************************************************************\n"); /* print balance parameters for leaf level */ h = 0; printf ("* h * size * ln * lb * rn * rb * blkn * s0 * " "s1 * s1b * s2 * s2b * curb * lk * rk *\n"); printf ("* %d * %4d * %2d * %2d * %2d * %2d * %4d * %2d " "* %2d * %3d * %2d * %3d * %4d * %2d * %2d *\n", h, tb->insert_size[h], tb->lnum[h], tb->lbytes, tb->rnum[h],tb->rbytes, tb->blknum[h], tb->s0num, tb->s1num,tb->s1bytes, tb->s2num, tb->s2bytes, tb->cur_blknum, tb->lkey[h], tb->rkey[h]); /* this prints balance parameters for non-leaf levels */ do { h++; printf ("* %d * %4d * %2d * * %2d * * %2d *\n", h, tb->insert_size[h], tb->lnum[h], tb->rnum[h], tb->blknum[h]); } while (tb->insert_size[h]); printf ("*********************************************************************\n"); /* print FEB list (list of buffers in form (bh (b_blocknr, b_count), that will be used for new nodes) */ for (h = 0; h < sizeof (tb->FEB) / sizeof (tb->FEB[0]); h++) printf("%s%p (%lu %d)", h == 0 ? "FEB list: " : ", ", tb->FEB[h], tb->FEB[h] ? tb->FEB[h]->b_blocknr : 0, tb->FEB[h] ? tb->FEB[h]->b_count : 0); printf ("\n"); printf ("********************** END OF PRINT_TB *******************\n\n"); } reiserfsprogs-3.6.20/libreiserfs/libreiserfs.c0000644000175300001440000000070710412227267016414 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #ifdef LIBREISERFS_READY int libreiserfs_max_interface_version(void) { return LIBREISER4_MAX_INTERFACE_VERSION; } int libreiserfs_min_interface_version(void) { return LIBREISER4_MIN_INTERFACE_VERSION; } const char *libreiserfs_version(void) { return VERSION; } #endif reiserfsprogs-3.6.20/libreiserfs/node.c0000644000175300001440000000644310412227267015033 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #include /* Replace n_dest'th key in buffer dest by n_src'th key of buffer src.*/ void reiserfs_node_replace_key (reiserfs_bh_t * dest, int n_dest, reiserfs_bh_t * src, int n_src) { if (dest) { if (reiserfs_leaf_head (src)) { /* source buffer contains leaf node */ memcpy (reiserfs_int_key_at(dest,n_dest), reiserfs_ih_at(src,n_src), REISERFS_KEY_SIZE); } else { memcpy (reiserfs_int_key_at(dest,n_dest), reiserfs_int_key_at(src,n_src), REISERFS_KEY_SIZE); } reiserfs_buffer_mkdirty(dest); } } void reiserfs_node_forget(reiserfs_filsys_t *fs, unsigned long blk) { reiserfs_bh_t * to_be_forgotten; to_be_forgotten = reiserfs_buffer_find (fs->fs_dev, blk, fs->fs_blocksize); if (to_be_forgotten) { reiserfs_nh_set_level(NODE_HEAD(to_be_forgotten), FREE_LEVEL); to_be_forgotten->b_count ++; reiserfs_buffer_forget (to_be_forgotten); } if (fs->block_deallocator) fs->block_deallocator (fs, blk); } // make sure that bh contains formatted node of reiserfs tree of // 'level'-th level int reiserfs_node_formatted (reiserfs_bh_t * bh, int level) { if (reiserfs_node_level (bh) != level) return 0; if (reiserfs_leaf_head (bh)) return reiserfs_leaf_valid(bh); return reiserfs_internal_correct (bh); } /* returns code of reiserfs metadata block (leaf, internal, super block, journal descriptor), unformatted */ int reiserfs_node_type (reiserfs_bh_t *bh) { int res; /* super block? */ if (reiserfs_super_valid(bh)) return NT_SUPER; if ((res = reiserfs_leaf_valid(bh))) /* if block head and item head array seem matching (node level, free space, item number, item locations and length), then it is NT_LEAF, otherwise, it is NT_IH_ARRAY */ return res; if (reiserfs_internal_correct(bh)) return NT_INTERNAL; /* journal descriptor block? */ if (reiserfs_journal_desc_valid(bh)) return NT_JDESC; /* contents of buf does not look like reiserfs metadata. Bitmaps are possible here */ return NT_UNKNOWN; } char *node_name[NT_UNKNOWN + 1] = { "", "leaf", "internal", "super", "journal descriptor", "broken leaf", "unknown" }; char * reiserfs_node_type_name(int code) { return code >= NT_LEAF && code < NT_UNKNOWN ? node_name[code] : node_name[NT_UNKNOWN]; } void reiserfs_node_print (FILE * fp, reiserfs_filsys_t * fs, reiserfs_bh_t * bh, ...) /* int print_mode, int first, int last */ { va_list args; int mode, first, last; char * file_name; va_start (args, bh); if ( ! bh ) { reiserfs_warning (stderr, "reiserfs_node_print: buffer is NULL\n"); return; } mode = va_arg (args, int); first = va_arg (args, int); last = va_arg (args, int); file_name = (fs) ? fs->fs_file_name : NULL ; if (reiserfs_print_jdesc (fp, bh)) if (reiserfs_super_print (fp, fs, file_name, bh, 0)) if (reiserfs_leaf_print (fp, fs, bh, mode, first, last)) if (reiserfs_internal_print (fp, bh, first, last)) reiserfs_warning (fp, "Block %ld contains unformatted data\n", bh->b_blocknr); } reiserfsprogs-3.6.20/libreiserfs/objmap.c0000644000175300001440000001073310412227267015353 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" static int comp_ids (const void * p1, const void * p2) { __u32 id1 = le32_to_cpu(*(__u32 *)p1) ; __u32 id2 = le32_to_cpu(*(__u32 *)p2) ; if (id1 < id2) return -1; if (id1 > id2) return 1 ; return 0 ; } /* functions to manipulate with super block's objectid map */ int reiserfs_objmap_test (reiserfs_filsys_t * fs, __u32 objectid) { __u32 * objectid_map; __u32 count = reiserfs_sb_get_mapcur(fs->fs_ondisk_sb); int ret; int pos; objectid_map = (__u32 *)((char *)fs->fs_ondisk_sb + reiserfs_super_size (fs->fs_ondisk_sb)); ret = misc_bin_search(&objectid, objectid_map, count, sizeof(__u32), &pos, comp_ids); /* if the position returned is odd, the oid is in use */ if (ret == 0) return ((__u32)pos & 1); /* if the position returned is even, the oid is in use */ return !((__u32)pos & 1) ; } void reiserfs_objmap_set (reiserfs_filsys_t * fs, __u32 objectid) { int i; __u32 * objectid_map; int cursize; if (reiserfs_objmap_test (fs, objectid)) { return; } objectid_map = (__u32 *)((char *)fs->fs_ondisk_sb + reiserfs_super_size (fs->fs_ondisk_sb)); cursize = reiserfs_sb_get_mapcur (fs->fs_ondisk_sb); for (i = 0; i < cursize; i += 2) { if (objectid >= le32_to_cpu (objectid_map [i]) && objectid < le32_to_cpu (objectid_map [i + 1])) /* it is used */ return; if (objectid + 1 == le32_to_cpu (objectid_map[i])) { /* size of objectid map does not change */ objectid_map[i] = cpu_to_le32 (objectid); return; } if (objectid == le32_to_cpu (objectid_map[i + 1])) { /* size of objectid map is decreased */ objectid_map [i + 1] = cpu_to_le32 (le32_to_cpu (objectid_map [i + 1]) + 1); if (i + 2 < cursize) { if (objectid_map[i + 1] == objectid_map[i + 2]) { memmove (objectid_map + i + 1, objectid_map + i + 1 + 2, (cursize - (i + 2 + 2 - 1)) * sizeof (__u32)); reiserfs_sb_set_mapcur (fs->fs_ondisk_sb, cursize - 2); } } return; } if (objectid < le32_to_cpu (objectid_map[i])) { /* size of objectid map must be increased */ if (cursize == reiserfs_sb_get_mapmax (fs->fs_ondisk_sb)) { /* here all objectids between objectid and objectid_map[i] get used */ objectid_map[i] = cpu_to_le32 (objectid); return; } else { memmove (objectid_map + i + 2, objectid_map + i, (cursize - i) * sizeof (__u32)); reiserfs_sb_set_mapcur (fs->fs_ondisk_sb, cursize + 2); } objectid_map[i] = cpu_to_le32 (objectid); objectid_map[i+1] = cpu_to_le32 (objectid + 1); return; } } /* append to current objectid map, if we have space */ if (i < reiserfs_sb_get_mapmax (fs->fs_ondisk_sb)) { objectid_map[i] = cpu_to_le32 (objectid); objectid_map[i + 1] = cpu_to_le32 (objectid + 1); reiserfs_sb_set_mapcur (fs->fs_ondisk_sb, cursize + 2); } else if (i == reiserfs_sb_get_mapmax (fs->fs_ondisk_sb)) { objectid_map[i - 1] = cpu_to_le32 (objectid + 1); } else misc_die ("mark_objectid_as_used: objectid map corrupted"); return; } void reiserfs_objmap_print (FILE * fp, reiserfs_filsys_t * fs) { int i; reiserfs_sb_t * sb; __u32 * omap; sb = fs->fs_ondisk_sb; if (fs->fs_format == REISERFS_FORMAT_3_6) omap = (__u32 *)(sb + 1); else if (fs->fs_format == REISERFS_FORMAT_3_5) omap = (__u32 *)((reiserfs_sb_v1_t *)sb + 1); else { reiserfs_warning (fp, "reiserfs_objmap_print: proper " "signature is not found\n"); return; } reiserfs_warning (fp, "Map of objectids (super block size %d)\n", (char *)omap - (char *)sb); for (i = 0; i < reiserfs_sb_get_mapcur (sb); i ++) { if (i % 2 == 0) { reiserfs_warning(fp, "busy(%u-%u) ", le32_to_cpu (omap[i]), le32_to_cpu (omap[i+1]) - 1); } else { reiserfs_warning(fp, "free(%u-%u) ", le32_to_cpu (omap[i]), ((i+1) == reiserfs_sb_get_mapcur (sb)) ? ~(__u32)0 : (le32_to_cpu (omap[i+1]) - 1)); } } reiserfs_warning (fp, "\nObject id array has size %d (max %d):", reiserfs_sb_get_mapcur (sb), reiserfs_sb_get_mapmax (sb)); for (i = 0; i < reiserfs_sb_get_mapcur (sb); i ++) reiserfs_warning (fp, "%s%u ", i % 2 ? "" : "*", le32_to_cpu (omap[i])); reiserfs_warning (fp, "\n"); } reiserfsprogs-3.6.20/libreiserfs/prints.c0000644000175300001440000001236510412227267015425 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #include "misc/device.h" #include #include #include #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) # include #endif #define PA_KEY (PA_LAST) #define PA_BUFFER_HEAD (PA_LAST + 1) #define PA_ITEM_HEAD (PA_LAST + 2) #define PA_DISK_CHILD (PA_LAST + 3) static int _arginfo_b (const struct printf_info *info, size_t n, int *argtypes) { if (n > 0) argtypes[0] = PA_BUFFER_HEAD | PA_FLAG_PTR; return 1; } static int _arginfo_K (const struct printf_info *info, size_t n, int *argtypes) { if (n > 0) argtypes[0] = PA_KEY | PA_FLAG_PTR; return 1; } static int _arginfo_H (const struct printf_info *info, size_t n, int *argtypes) { if (n > 0) argtypes[0] = PA_ITEM_HEAD | PA_FLAG_PTR; return 1; } static int _arginfo_y (const struct printf_info *info, size_t n, int *argtypes) { if (n > 0) argtypes[0] = PA_DISK_CHILD | PA_FLAG_PTR; return 1; } static int _arginfo_M (const struct printf_info *info, size_t n, int *argtypes) { if (n > 0) argtypes[0] = PA_INT | PA_FLAG_SHORT | PA_FLAG_PTR; return 1; } static int _arginfo_U (const struct printf_info *info, size_t n, int *argtypes) { if (n > 0) argtypes[0] = (PA_CHAR|PA_FLAG_PTR); return 1; } /* %b */ static int print_block_head (FILE * stream, const struct printf_info *info, const void *const *args) { const reiserfs_bh_t * bh; bh = *((const reiserfs_bh_t **)(args[0])); return fprintf(stream, "level=%d, nr_items=%d, free_space=%d rdkey", reiserfs_node_level (bh), reiserfs_node_items (bh), reiserfs_node_free (bh)); } /* %K */ static int print_short_key (FILE * stream, const struct printf_info *info, const void *const *args) { const reiserfs_key_t * key; key = *((const reiserfs_key_t **)(args[0])); return fprintf(stream, "[%u %u]", reiserfs_key_get_did (key), reiserfs_key_get_oid (key)); } /* %k */ static int print_key (FILE * stream, const struct printf_info *info, const void *const *args) { const reiserfs_key_t * key; key = *((const reiserfs_key_t **)(args[0])); return fprintf(stream, "[%u %u 0x%Lx %s (%d)]", reiserfs_key_get_did (key), reiserfs_key_get_oid (key), (unsigned long long)reiserfs_key_get_off (key), reiserfs_key_name (key), reiserfs_key_get_type (key)); } /* %H */ static int print_item_head (FILE * stream, const struct printf_info *info, const void *const *args) { const reiserfs_ih_t * ih; ih = *((const reiserfs_ih_t **)(args[0])); return fprintf(stream, "%u %u 0x%Lx %s (%d), len %u, location " "%u entry count %u, fsck need %u, format %s", reiserfs_key_get_did (&ih->ih_key), reiserfs_key_get_oid (&ih->ih_key), (unsigned long long)reiserfs_key_get_off (&ih->ih_key), reiserfs_key_name (&ih->ih_key), reiserfs_key_get_type (&ih->ih_key), reiserfs_ih_get_len (ih), reiserfs_ih_get_loc (ih), reiserfs_ih_get_entries (ih), reiserfs_ih_get_flags (ih), reiserfs_ih_get_format (ih) == KEY_FORMAT_2 ? "new" : ((reiserfs_ih_get_format (ih) == KEY_FORMAT_1) ? "old" : "BAD")); } static int print_disk_child (FILE * stream, const struct printf_info *info, const void *const *args) { const reiserfs_dc_t * dc; dc = *((const reiserfs_dc_t **)(args[0])); return fprintf(stream, "[dc_number=%u, dc_size=%u]", reiserfs_dc_get_nr (dc), reiserfs_dc_get_size (dc)); } static int rwx (FILE * stream, mode_t mode) { return fprintf (stream, "%c%c%c", (mode & S_IRUSR) ? 'r' : '-', (mode & S_IWUSR) ? 'w' : '-', (mode & S_IXUSR) ? 'x' : '-'); } /* %M */ static int print_sd_mode (FILE * stream, const struct printf_info *info, const void *const *args) { int len = 0; __u16 mode; mode = *(mode_t *)args[0]; len = fprintf (stream, "%c", misc_device_typec (mode)); len += rwx (stream, (mode & 0700) << 0); len += rwx (stream, (mode & 0070) << 3); len += rwx (stream, (mode & 0007) << 6); return len; } /* %U */ static int print_sd_uuid (FILE * stream, const struct printf_info *info, const void *const *args) { #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) const unsigned char *uuid = *((const unsigned char **)(args[0])); char buf[37]; buf[36] = '\0'; uuid_unparse(uuid, buf); return fprintf(stream, "%s", buf); #else return fprintf(stream, ""); #endif } void reiserfs_warning (FILE * fp, const char * fmt, ...) { static int registered = 0; va_list args; if (!registered) { registered = 1; register_printf_function ('K', print_short_key, _arginfo_K); register_printf_function ('k', print_key, _arginfo_K); register_printf_function ('H', print_item_head, _arginfo_H); register_printf_function ('b', print_block_head, _arginfo_b); register_printf_function ('y', print_disk_child, _arginfo_y); register_printf_function ('M', print_sd_mode, _arginfo_M); register_printf_function ('U', print_sd_uuid, _arginfo_U); } va_start (args, fmt); vfprintf (fp, fmt, args); va_end (args); } reiserfsprogs-3.6.20/libreiserfs/stat.c0000644000175300001440000001404210412227267015053 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #include #include #include #include /* access to fields of stat data (both v1 and v2) */ static void reiserfs_stat_field (int field, reiserfs_ih_t * ih, void * sd, void * value, int set) { if (reiserfs_ih_get_format (ih) == KEY_FORMAT_1) { reiserfs_sd_v1_t * sd_v1 = sd; switch (field) { case STAT_MODE: if (set) sd_v1->sd_mode = cpu_to_le16 (*(__u16 *)value); else *(__u16 *)value = le16_to_cpu (sd_v1->sd_mode); break; case STAT_SIZE: /* value must point to 64 bit int */ if (set) sd_v1->sd_size = cpu_to_le32 (*(__u64 *)value); else *(__u64 *)value = le32_to_cpu (sd_v1->sd_size); break; case STAT_BLOCKS: if (set) sd_v1->u.sd_blocks = cpu_to_le32 (*(__u32 *)value); else *(__u32 *)value = le32_to_cpu (sd_v1->u.sd_blocks); break; case STAT_NLINK: /* value must point to 32 bit int */ if (set) sd_v1->sd_nlink = cpu_to_le16 (*(__u32 *)value); else *(__u32 *)value = le16_to_cpu (sd_v1->sd_nlink); break; case STAT_FDB: if (set) sd_v1->sd_fdb = cpu_to_le32 (*(__u32 *)value); else *(__u32 *)value = le32_to_cpu (sd_v1->sd_fdb); break; default: reiserfs_panic ("reiserfs_stat_set: unknown field of old stat data"); } } else { reiserfs_sd_t * sd_v2 = sd; switch (field) { case STAT_MODE: if (set) sd_v2->sd_mode = cpu_to_le16 (*(__u16 *)value); else *(__u16 *)value = le16_to_cpu (sd_v2->sd_mode); break; case STAT_SIZE: if (set) sd_v2->sd_size = cpu_to_le64 (*(__u64 *)value); else *(__u64 *)value = le64_to_cpu (sd_v2->sd_size); break; case STAT_BLOCKS: if (set) sd_v2->sd_blocks = cpu_to_le32 (*(__u32 *)value); else *(__u32 *)value = le32_to_cpu (sd_v2->sd_blocks); break; case STAT_NLINK: if (set) sd_v2->sd_nlink = cpu_to_le32 (*(__u32 *)value); else *(__u32 *)value = le32_to_cpu (sd_v2->sd_nlink); break; case STAT_FDB: default: reiserfs_panic ("reiserfs_stat_set: unknown field of new stat data"); } } } void reiserfs_stat_set (int field, reiserfs_ih_t * ih, void * sd, void * value) { reiserfs_stat_field(field, ih, sd, value, 1/*set*/); } void reiserfs_stat_get (int field, reiserfs_ih_t * ih, void * sd, void * value) { reiserfs_stat_field(field, ih, sd, value, 0/*get*/); } /* prepare new or old stat data for the new directory */ void reiserfs_stat_init (int blocksize, int key_format, __u32 dirid, __u32 objectid, reiserfs_ih_t * ih, void * sd) { memset (ih, 0, REISERFS_IH_SIZE); reiserfs_key_set_did (&ih->ih_key, dirid); reiserfs_key_set_oid (&ih->ih_key, objectid); reiserfs_key_set_off1 (&ih->ih_key, OFFSET_SD); reiserfs_key_set_uni (&ih->ih_key, 0); reiserfs_ih_set_format (ih, key_format); reiserfs_ih_set_free (ih, MAX_US_INT); if (key_format == KEY_FORMAT_2) { reiserfs_sd_t *sd_v2 = (reiserfs_sd_t *)sd; reiserfs_ih_set_len (ih, REISERFS_SD_SIZE); reiserfs_set_sd_v2_mode (sd_v2, S_IFDIR + 0755); reiserfs_set_sd_v2_nlink (sd_v2, 2); reiserfs_set_sd_v2_uid (sd_v2, 0); reiserfs_set_sd_v2_gid (sd_v2, 0); reiserfs_set_sd_v2_size (sd_v2, REISERFS_DIR_MIN); reiserfs_set_sd_v2_atime (sd_v2, time(NULL)); sd_v2->sd_ctime = sd_v2->sd_mtime = sd_v2->sd_atime; /* all le */ reiserfs_set_sd_v2_rdev (sd_v2, 0); reiserfs_set_sd_v2_blocks (sd_v2, REISERFS_DIR_BLOCKS (REISERFS_DIR_MIN)); }else{ reiserfs_sd_v1_t *sd_v1 = (reiserfs_sd_v1_t *)sd; reiserfs_ih_set_len (ih, REISERFS_SD_SIZE_V1); reiserfs_set_sd_v1_mode(sd_v1, S_IFDIR + 0755); reiserfs_set_sd_v1_nlink(sd_v1, 2); reiserfs_set_sd_v1_uid (sd_v1, 0); reiserfs_set_sd_v1_gid (sd_v1, 0); reiserfs_set_sd_v1_size(sd_v1, REISERFS_DIR_MIN_V1); reiserfs_set_sd_v1_atime(sd_v1, time(NULL)); sd_v1->sd_ctime = sd_v1->sd_mtime = sd_v1->sd_atime; /* all le */ reiserfs_set_sd_v1_blocks(sd_v1, REISERFS_DIR_BLOCKS(REISERFS_DIR_MIN_V1)); reiserfs_set_sd_v1_fdb(sd_v1, REISERFS_SD_NODIRECT); } } char timebuf[256]; static char * timestamp (time_t t) { strftime (timebuf, 256, "%d/%Y %T", localtime (&t)); return timebuf; } int reiserfs_print_stat_data (FILE * fp, reiserfs_bh_t * bh, reiserfs_ih_t * ih, int alltimes) { int retval; /* we cannot figure out if it is new stat data or old by key_format macro. Stat data's key looks identical in both formats */ if (reiserfs_ih_get_format (ih) == KEY_FORMAT_1) { reiserfs_sd_v1_t * sd_v1 = (reiserfs_sd_v1_t *)reiserfs_item_by_ih (bh, ih); reiserfs_warning (fp, "(OLD SD), mode %M, size %u, nlink %u, uid %u, " "FDB %u, mtime %s blocks %u", reiserfs_sd_v1_mode(sd_v1), reiserfs_sd_v1_size(sd_v1), reiserfs_sd_v1_nlink(sd_v1), reiserfs_sd_v1_uid(sd_v1), reiserfs_sd_v1_fdb(sd_v1), timestamp(reiserfs_sd_v1_mtime(sd_v1)), reiserfs_sd_v1_blocks(sd_v1)); retval = (S_ISLNK (reiserfs_sd_v1_mode(sd_v1))) ? 1 : 0; if (alltimes) reiserfs_warning (fp, "%s %s\n", timestamp (reiserfs_sd_v1_ctime(sd_v1)), timestamp (reiserfs_sd_v1_atime(sd_v1))); } else { reiserfs_sd_t * sd = (reiserfs_sd_t *)reiserfs_item_by_ih (bh, ih); reiserfs_warning (fp, "(NEW SD), mode %M, size %Lu, nlink %u, mtime " "%s blocks %u, uid %u", reiserfs_sd_v2_mode(sd), reiserfs_sd_v2_size(sd), reiserfs_sd_v2_nlink(sd), timestamp (reiserfs_sd_v2_mtime(sd)), reiserfs_sd_v2_blocks(sd), reiserfs_sd_v2_uid(sd)); retval = (S_ISLNK (reiserfs_sd_v2_mode(sd))) ? 1 : 0; if (alltimes) reiserfs_warning (fp, "%s %s\n", timestamp (reiserfs_sd_v2_ctime(sd)), timestamp (reiserfs_sd_v2_atime(sd))); } reiserfs_warning (fp, "\n"); return retval; } reiserfsprogs-3.6.20/libreiserfs/super.c0000644000175300001440000001364710412227267015250 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" int reiserfs_super_35_magic (reiserfs_sb_t * rs) { return (!strncmp (rs->s_v1.s_magic, REISERFS_3_5_SUPER_MAGIC_STRING, strlen ( REISERFS_3_5_SUPER_MAGIC_STRING))); } int reiserfs_super_36_magic (reiserfs_sb_t * rs) { return (!strncmp (rs->s_v1.s_magic, REISERFS_3_6_SUPER_MAGIC_STRING, strlen ( REISERFS_3_6_SUPER_MAGIC_STRING))); } int reiserfs_super_jr_magic (reiserfs_sb_t * rs) { return (!strncmp (rs->s_v1.s_magic, REISERFS_JR_SUPER_MAGIC_STRING, strlen ( REISERFS_JR_SUPER_MAGIC_STRING))); } int reiserfs_super_magic (reiserfs_sb_t * rs) { if (reiserfs_super_35_magic (rs) || reiserfs_super_36_magic (rs) || reiserfs_super_jr_magic (rs)) return 1; return 0; } int reiserfs_super_format (reiserfs_sb_t * sb) { /* after conversion to 3.6 format we change magic correctly, but do not change sb_format. When we create non-standard journal field format in sb get adjusted correctly. Thereby, for standard journal we should rely on magic and for non-standard - on format */ if (reiserfs_super_35_magic (sb) || (reiserfs_super_jr_magic (sb) && reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_5)) return REISERFS_FORMAT_3_5; if (reiserfs_super_36_magic (sb) || (reiserfs_super_jr_magic (sb) && reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_6)) return REISERFS_FORMAT_3_6; return REISERFS_FORMAT_UNKNOWN; } int reiserfs_super_size (reiserfs_sb_t * sb) { switch (reiserfs_super_format (sb)) { case REISERFS_FORMAT_3_5: return REISERFS_SB_SIZE_V1; case REISERFS_FORMAT_3_6: return REISERFS_SB_SIZE; } reiserfs_panic ("Unknown format found"); return 0; } /* this one had signature in different place of the super_block structure */ int reiserfs_super_prejournaled (reiserfs_sb_t * rs) { return (!strncmp((char*)rs + REISERFS_SUPER_MAGIC_STRING_OFFSET_NJ, REISERFS_3_5_SUPER_MAGIC_STRING, strlen(REISERFS_3_5_SUPER_MAGIC_STRING))); } int reiserfs_super_valid(reiserfs_bh_t *bh) { reiserfs_sb_t *sb; sb = (reiserfs_sb_t *)bh->b_data; if (!reiserfs_super_magic (sb)) return 0; if (!reiserfs_fs_blksize_check(reiserfs_sb_get_blksize (sb))) return 0; return 1; } /* return 1 if this is not super block */ int reiserfs_super_print (FILE * fp, reiserfs_filsys_t * fs, char * file_name, reiserfs_bh_t * bh, int short_print) { reiserfs_sb_t * sb = (reiserfs_sb_t *)(bh->b_data); int format = 0; __u16 state; if (!reiserfs_super_valid(bh)) return 1; /* Print volume label if it is non-empty. */ if (sb->s_label[0]) reiserfs_warning (fp, "%s: ", sb->s_label); else reiserfs_warning (fp, "%s: ", fs->fs_file_name); reiserfs_warning (fp, "Reiserfs super block in block %lu on %s of ", bh->b_blocknr, fs->fs_file_name); switch (reiserfs_super_format (sb)) { case REISERFS_FORMAT_3_5: reiserfs_warning (fp, "format 3.5 with "); format = 1; break; case REISERFS_FORMAT_3_6: reiserfs_warning (fp, "format 3.6 with "); format = 2; break; default: reiserfs_warning (fp, "unknown format with "); break; } if (reiserfs_super_jr_magic (sb)) reiserfs_warning (fp, "non-"); reiserfs_warning (fp, "standard journal\n"); if (short_print) { reiserfs_warning (fp, "Blocks (total/free): %u/%u by %d bytes\n", reiserfs_sb_get_blocks (sb), reiserfs_sb_get_free (sb), reiserfs_sb_get_blksize (sb)); } else { reiserfs_warning (fp, "Count of blocks on the device: %u\n", reiserfs_sb_get_blocks (sb)); reiserfs_warning (fp, "Number of bitmaps: %u\n", reiserfs_sb_get_bmaps (sb)); reiserfs_warning (fp, "Blocksize: %d\n", reiserfs_sb_get_blksize (sb)); reiserfs_warning (fp, "Free blocks (count of blocks - used [journal, " "bitmaps, data, reserved] blocks): %u\n", reiserfs_sb_get_free (sb)); reiserfs_warning (fp, "Root block: %u\n", reiserfs_sb_get_root (sb)); } reiserfs_warning (fp, "Filesystem is %sclean\n", (reiserfs_sb_get_umount (sb) == FS_CLEANLY_UMOUNTED) ? "" : "NOT "); if (short_print) return 0; reiserfs_warning (fp, "Tree height: %d\n", reiserfs_sb_get_height (sb)); reiserfs_warning (fp, "Hash function used to sort names: %s\n", reiserfs_hash_name (reiserfs_sb_get_hash (sb))); reiserfs_warning (fp, "Objectid map size %d, max %d\n", reiserfs_sb_get_mapcur (sb), reiserfs_sb_get_mapmax (sb)); reiserfs_warning (fp, "Journal parameters:\n"); reiserfs_journal_print_params (fp, reiserfs_sb_jp (sb)); reiserfs_warning (fp, "Blocks reserved by journal: %u\n", reiserfs_sb_get_reserved (sb)); state = reiserfs_sb_get_state (sb); reiserfs_warning (fp, "Fs state field: 0x%x:\n", state); if ((state & FS_FATAL) == FS_FATAL) reiserfs_warning (fp, "\tFATAL corruptions exist.\n"); if ((state & FS_ERROR) == FS_ERROR) reiserfs_warning (fp, "\t some corruptions exist.\n"); if ((state & IO_ERROR) == IO_ERROR) reiserfs_warning (fp, "\tI/O corruptions exist.\n"); reiserfs_warning (fp, "sb_version: %u\n", reiserfs_sb_get_version (sb)); if (format == 2) { reiserfs_warning (fp, "inode generation number: %u\n", reiserfs_sb_get_gen (sb)); reiserfs_warning (fp, "UUID: %U\n", sb->s_uuid); reiserfs_warning (fp, "LABEL: %.16s\n", sb->s_label); reiserfs_warning (fp, "Set flags in SB:\n"); if ((reiserfs_sb_isflag (sb, reiserfs_attrs_cleared))) reiserfs_warning (fp, "\tATTRIBUTES CLEAN\n"); } return 0; } void reiserfs_super_print_state (FILE * fp, reiserfs_filsys_t * fs) { reiserfs_warning (fp, "\nFilesystem state: "); if (reiserfs_sb_state_ok (fs)) reiserfs_warning (fp, "consistent\n\n"); else reiserfs_warning (fp, "consistency is not checked after last mounting\n\n"); } reiserfsprogs-3.6.20/libreiserfs/tree.c0000644000175300001440000006765610412227267015062 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" #include "misc/unaligned.h" #include "misc/malloc.h" static int reiserfs_tree_search (reiserfs_filsys_t * fs, const reiserfs_key_t * key, reiserfs_path_t * path, misc_comp_func_t comp_func) { reiserfs_bh_t * bh; unsigned long block; reiserfs_path_element_t * curr; int retval; block = reiserfs_sb_get_root (fs->fs_ondisk_sb); if (reiserfs_fs_block(fs, block) != BT_UNKNOWN) return IO_ERROR; path->path_length = REISERFS_PATH_OFFILL; while (1) { curr = REISERFS_PATH_ELEM (path, ++ path->path_length); bh = curr->pe_buffer = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize); if (bh == 0) { path->path_length --; reiserfs_tree_pathrelse (path); return ITEM_NOT_FOUND; } retval = misc_bin_search (key, reiserfs_ih_key_at (bh, 0), reiserfs_node_items (bh), reiserfs_leaf_head (bh) ? REISERFS_IH_SIZE : REISERFS_KEY_SIZE, &(curr->pe_position), comp_func); if (retval == 1) { /* key found, return if this is leaf level */ if (reiserfs_leaf_head (bh)) { path->pos_in_item = 0; return ITEM_FOUND; } curr->pe_position ++; } else { /* key not found in the node */ if (reiserfs_leaf_head (bh)) return ITEM_NOT_FOUND; } block = reiserfs_dc_get_nr (reiserfs_int_at (bh, curr->pe_position)); if (reiserfs_fs_block(fs, block) != BT_UNKNOWN) return IO_ERROR; } printf ("reiserfs_tree_search: you can not get here\n"); return ITEM_NOT_FOUND; } int reiserfs_tree_search_body (reiserfs_filsys_t * fs, const reiserfs_key_t * key, reiserfs_path_t * path) { return reiserfs_tree_search (fs, key, path, reiserfs_key_comp3); } int reiserfs_tree_search_item (reiserfs_filsys_t * fs, const reiserfs_key_t * key, reiserfs_path_t * path) { return reiserfs_tree_search (fs, key, path, reiserfs_key_comp); } /* key is key of byte in the regular file. This searches in tree through items and in the found item as well */ int reiserfs_tree_search_position (reiserfs_filsys_t * fs, const reiserfs_key_t * key, reiserfs_path_t * path) { const reiserfs_key_t * next_key; reiserfs_bh_t * bh; reiserfs_ih_t * ih; if (reiserfs_tree_search_body (fs, key, path) == ITEM_FOUND) { ih = REISERFS_PATH_IH (path); if (!reiserfs_ih_direct (ih) && !reiserfs_ih_ext (ih)) return DIRECTORY_FOUND; path->pos_in_item = 0; return POSITION_FOUND; } bh = REISERFS_PATH_LEAF (path); ih = REISERFS_PATH_IH (path); if (REISERFS_PATH_LEAF_POS (path) == 0) { /* previous item does not exist, that means we are in leftmost leaf of * the tree */ if (!reiserfs_key_comp2 (&ih->ih_key, key)) { if (!reiserfs_ih_direct (ih) && !reiserfs_ih_ext (ih)) return DIRECTORY_FOUND; return POSITION_NOT_FOUND; } return FILE_NOT_FOUND; } /* take previous item */ REISERFS_PATH_LEAF_POS (path) --; ih --; if (reiserfs_key_comp2 (&ih->ih_key, key) || reiserfs_ih_stat(ih)) { /* previous item belongs to another object or is a stat data, check * next item */ REISERFS_PATH_LEAF_POS (path) ++; if (REISERFS_PATH_LEAF_POS (path) < reiserfs_node_items (bh)) /* next key is in the same node */ next_key = reiserfs_ih_key_at (bh, REISERFS_PATH_LEAF_POS (path)); else next_key = reiserfs_tree_rkey (path, fs); if (next_key == 0 || reiserfs_key_comp2 (next_key, key)) { /* there is no any part of such file in the tree */ path->pos_in_item = 0; return FILE_NOT_FOUND; } if (reiserfs_key_dir (next_key)) { reiserfs_warning (stderr, "reiserfs_tree_search_position: looking " "for %k found a directory with the same key\n", next_key); return DIRECTORY_FOUND; } /* next item is the part of this file */ path->pos_in_item = 0; return POSITION_NOT_FOUND; } if (reiserfs_ih_dir (ih)) { return DIRECTORY_FOUND; } if (reiserfs_ih_stat(ih)) { REISERFS_PATH_LEAF_POS (path) ++; return FILE_NOT_FOUND; } /* previous item is part of desired file */ if (reiserfs_item_has_key (ih, key, bh->b_size)) { path->pos_in_item = reiserfs_key_get_off (key) - reiserfs_key_get_off (&ih->ih_key); if (reiserfs_ih_ext (ih) ) path->pos_in_item /= bh->b_size; return POSITION_FOUND; } path->pos_in_item = reiserfs_ih_ext (ih) ? reiserfs_ext_count (ih) : reiserfs_ih_get_len (ih); return POSITION_NOT_FOUND; } const reiserfs_key_t * reiserfs_tree_lkey (reiserfs_path_t * path, reiserfs_filsys_t * fs) { int pos, offset = path->path_length; reiserfs_bh_t * bh; reiserfs_sb_t * sb; sb = fs->fs_ondisk_sb; if (offset < REISERFS_PATH_OFFINIT) misc_die ("reiserfs_tree_lkey: illegal offset in the path (%d)", offset); /* While not higher in path than first element. */ while (offset-- > REISERFS_PATH_OFFINIT) { if (! reiserfs_buffer_uptodate (REISERFS_PATH_BUFFER (path, offset)) ) misc_die ("reiserfs_tree_lkey: parent is not uptodate"); /* Parent at the path is not in the tree now. */ if (! REISERFS_NODE_INTREE (bh = REISERFS_PATH_BUFFER (path, offset))) misc_die ("reiserfs_tree_lkey: buffer on the path is not in tree"); /* Check whether position in the parent is correct. */ if ((pos = REISERFS_PATH_POS (path, offset)) > reiserfs_node_items (bh)) misc_die ("reiserfs_tree_lkey: invalid position (%d) in the path", pos); /* Check whether parent at the path really points to the child. */ if (reiserfs_dc_get_nr (reiserfs_int_at (bh, pos)) != REISERFS_PATH_BUFFER (path, offset + 1)->b_blocknr) { misc_die ("reiserfs_tree_lkey: invalid block number (%d). Must be %ld", reiserfs_dc_get_nr (reiserfs_int_at (bh, pos)), REISERFS_PATH_BUFFER (path, offset + 1)->b_blocknr); } /* Return delimiting key if position in the parent is not equal to zero. */ if (pos) return reiserfs_int_key_at(bh, pos - 1); } /* Return MIN_KEY if we are in the root of the buffer tree. */ if ( REISERFS_PATH_BUFFER(path, REISERFS_PATH_OFFINIT)->b_blocknr != reiserfs_sb_get_root (sb) ) { misc_die("reiserfs_tree_lkey: invalid root block number (%lu). Must be (%u).", REISERFS_PATH_BUFFER(path, REISERFS_PATH_OFFINIT)->b_blocknr, reiserfs_sb_get_root (sb)); } /* there is no left delimiting key */ return &MIN_KEY; } const reiserfs_key_t * reiserfs_tree_rkey (reiserfs_path_t * path, reiserfs_filsys_t * fs) { int pos, offset = path->path_length; reiserfs_bh_t * bh; reiserfs_sb_t * sb; sb = fs->fs_ondisk_sb; if (offset < REISERFS_PATH_OFFINIT) misc_die ("reiserfs_tree_rkey: illegal offset in the path (%d)", offset); while (offset-- > REISERFS_PATH_OFFINIT) { if (! reiserfs_buffer_uptodate (REISERFS_PATH_BUFFER (path, offset))) misc_die ("reiserfs_tree_rkey: parent is not uptodate"); /* Parent at the path is not in the tree now. */ if (! REISERFS_NODE_INTREE (bh = REISERFS_PATH_BUFFER (path, offset))) misc_die ("reiserfs_tree_rkey: buffer on the path is not in tree"); /* Check whether position in the parrent is correct. */ if ((pos = REISERFS_PATH_POS (path, offset)) > reiserfs_node_items (bh)) misc_die ("reiserfs_tree_rkey: invalid position (%d) in the path", pos); /* Check whether parent at the path really points to the child. */ if (reiserfs_dc_get_nr (reiserfs_int_at (bh, pos)) != REISERFS_PATH_BUFFER (path, offset + 1)->b_blocknr) { misc_die ("reiserfs_tree_rkey: invalid block number (%d). Must be %ld", reiserfs_dc_get_nr (reiserfs_int_at (bh, pos)), REISERFS_PATH_BUFFER (path, offset + 1)->b_blocknr); } /* Return delimiting key if position in the parent is not the last one. */ if (pos != reiserfs_node_items (bh)) return reiserfs_int_key_at (bh, pos); } /* Return MAX_KEY if we are in the root of the buffer tree. */ if ( REISERFS_PATH_BUFFER(path, REISERFS_PATH_OFFINIT)->b_blocknr != reiserfs_sb_get_root (sb) ) { misc_die ("reiserfs_tree_rkey: invalid root block number (%lu). Must be (%u).", REISERFS_PATH_BUFFER(path, REISERFS_PATH_OFFINIT)->b_blocknr, reiserfs_sb_get_root (sb)); } /* there is no right delimiting key */ return &MAX_KEY; } const reiserfs_key_t *reiserfs_tree_next_key(reiserfs_path_t *path, reiserfs_filsys_t *fs) { if (REISERFS_PATH_LEAF_POS (path) < reiserfs_node_items (REISERFS_PATH_LEAF (path)) - 1) { return reiserfs_ih_key_at(REISERFS_PATH_LEAF (path), REISERFS_PATH_LEAF_POS (path) + 1); } return reiserfs_tree_rkey (path, fs); } static int comp_dir_entries (const void * p1, const void * p2) { __u32 off1, off2; off1 = d32_get((__u32 *)p1, 0); off2 = *(__u32 *)p2; if (off1 < off2) return -1; if (off1 > off2) return 1; return 0; } /* NOTE: this only should be used to look for keys who exists */ int reiserfs_tree_search_entry (reiserfs_filsys_t * fs, const reiserfs_key_t * key, reiserfs_path_t * path) { reiserfs_bh_t * bh; int item_pos; reiserfs_ih_t * ih; reiserfs_key_t tmpkey; __u32 offset; if (reiserfs_tree_search_item (fs, key, path) == ITEM_FOUND) { path->pos_in_item = 0; return POSITION_FOUND; } bh = REISERFS_PATH_LEAF (path); item_pos = REISERFS_PATH_LEAF_POS (path); ih = REISERFS_PATH_IH (path); if (item_pos == 0) { /* key is less than the smallest key in the tree */ if (reiserfs_key_comp2 (&(ih->ih_key), key)) /* there are no items of that directory */ return DIRECTORY_NOT_FOUND; if (!reiserfs_ih_dir (ih)) { reiserfs_panic ("reiserfs_tree_search_entry: found item " "is not of directory type %H", ih); } /* key we looked for should be here */ path->pos_in_item = 0; return POSITION_NOT_FOUND; } /* take previous item */ item_pos --; ih --; REISERFS_PATH_LEAF_POS (path) --; if (reiserfs_key_comp2 (&(ih->ih_key), key) || !reiserfs_ih_dir (ih)) { /* previous item belongs to another object or is stat data, check next item */ item_pos ++; REISERFS_PATH_LEAF_POS (path) ++; if (item_pos < reiserfs_node_items (bh)) { /* next item is in the same node */ ih ++; if (reiserfs_key_comp2 (&(ih->ih_key), key)) { /* there are no items of that directory */ path->pos_in_item = 0; return DIRECTORY_NOT_FOUND; } if (!reiserfs_ih_dir (ih)) reiserfs_panic ("reiserfs_tree_search_entry: %k is not a directory", key); } else { /* next item is in right neighboring node */ const reiserfs_key_t * next_key = reiserfs_tree_rkey (path, fs); if (next_key == 0 || reiserfs_key_comp2 (next_key, key)) { /* there are no items of that directory */ path->pos_in_item = 0; return DIRECTORY_NOT_FOUND; } if (!reiserfs_key_dir (next_key)) reiserfs_panic ("reiserfs_tree_search_entry: %k is not a directory", key); /* we got right delimiting key - search for it - the entry will be pasted in position 0 */ reiserfs_key_copy (&tmpkey, next_key); reiserfs_tree_pathrelse (path); if (reiserfs_tree_search_item (fs, &tmpkey, path) != ITEM_FOUND || REISERFS_PATH_LEAF_POS (path) != 0) { reiserfs_panic ("reiserfs_tree_search_entry: item " "corresponding to delimiting key %k " "not found", &tmpkey); } } /* next item is the part of this directory */ path->pos_in_item = 0; return POSITION_NOT_FOUND; } /* previous item is part of desired directory */ offset = reiserfs_key_get_off1 (key); if (misc_bin_search (&offset, reiserfs_deh (bh, ih), reiserfs_ih_get_entries (ih), REISERFS_DEH_SIZE, &(path->pos_in_item), comp_dir_entries) == 1) { return POSITION_FOUND; } return POSITION_NOT_FOUND; } int reiserfs_tree_delete_entry (reiserfs_filsys_t * fs, reiserfs_key_t * key) { reiserfs_path_t path; reiserfs_tb_t tb; reiserfs_ih_t * ih; reiserfs_deh_t * deh; int entry_len; if (reiserfs_tree_search_entry (fs, key, &path) != POSITION_FOUND) { reiserfs_tree_pathrelse (&path); return 1; } ih = REISERFS_PATH_IH (&path); if (reiserfs_ih_get_entries (ih) == 1) { reiserfs_tb_init (&tb, fs, &path, -(REISERFS_IH_SIZE + reiserfs_ih_get_len (ih))); if (reiserfs_fix_nodes (M_DELETE, &tb, 0) != CARRY_ON) { reiserfs_unfix_nodes (&tb); return 1; } reiserfs_tb_balance (&tb, 0, 0, M_DELETE, 0); return 0; } deh = reiserfs_deh (REISERFS_PATH_LEAF (&path), ih) + path.pos_in_item; entry_len = reiserfs_direntry_entry_len (ih, deh, path.pos_in_item); reiserfs_tb_init (&tb, fs, &path, -(REISERFS_DEH_SIZE + entry_len)); if (reiserfs_fix_nodes (M_CUT, &tb, 0) != CARRY_ON) { reiserfs_unfix_nodes (&tb); return 1; } reiserfs_tb_balance (&tb, 0, 0, M_CUT, 0); return 0; } static void free_unformatted_nodes (reiserfs_filsys_t * fs, reiserfs_path_t * path, int start, int end) { __u32 * item = REISERFS_PATH_ITEM(path); unsigned int i; for (i = start; i < end; i ++) { __u32 unfm = d32_get (item, i); if (unfm != 0) reiserfs_node_forget(fs, unfm); } } void reiserfs_tree_delete (reiserfs_filsys_t * fs, reiserfs_path_t * path, int temporary) { reiserfs_tb_t tb; reiserfs_ih_t * ih = REISERFS_PATH_IH (path); if (reiserfs_ih_ext (ih) && !temporary) free_unformatted_nodes (fs, path, 0, reiserfs_ext_count (ih)); reiserfs_tb_init (&tb, fs, path, -(REISERFS_IH_SIZE + reiserfs_ih_get_len(ih))); if (reiserfs_fix_nodes (M_DELETE, &tb, 0/*ih*/) != CARRY_ON) misc_die ("reiserfs_tree_delete: reiserfs_fix_nodes failed"); reiserfs_tb_balance (&tb, 0, 0, M_DELETE, 0/*zero num*/); } void reiserfs_tree_delete_unit (reiserfs_filsys_t *fs, reiserfs_path_t * path, int cut_size) { reiserfs_ih_t * ih = REISERFS_PATH_IH (path); reiserfs_tb_t tb; if (cut_size >= 0) { misc_die ("reiserfs_tree_delete_unit: cut size == %d", cut_size); } if (reiserfs_ih_ext (ih)) free_unformatted_nodes(fs, path, (reiserfs_ih_get_len(ih) + cut_size) / REISERFS_EXT_SIZE, reiserfs_ext_count (ih)); reiserfs_tb_init (&tb, fs, path, cut_size); if (reiserfs_fix_nodes (M_CUT, &tb, 0) != CARRY_ON) misc_die ("reiserfs_tree_delete_unit: reiserfs_fix_nodes failed"); reiserfs_tb_balance (&tb, 0, 0, M_CUT, 0/*zero num*/); } void reiserfs_tree_insert_unit (reiserfs_filsys_t * fs, reiserfs_path_t * path, const void * body, int size) { reiserfs_tb_t tb; reiserfs_tb_init (&tb, fs, path, size); if (reiserfs_fix_nodes (M_PASTE, &tb, 0/*ih*/) != CARRY_ON) reiserfs_panic ("reiserfs_tree_insert_unit: " "reiserfs_fix_nodes failed"); reiserfs_tb_balance (&tb, 0, body, M_PASTE, 0/*zero num*/); } void reiserfs_tree_insert (reiserfs_filsys_t * fs, reiserfs_path_t * path, reiserfs_ih_t * ih, const void * body) { reiserfs_tb_t tb; reiserfs_tb_init (&tb, fs, path, REISERFS_IH_SIZE + reiserfs_ih_get_len(ih)); if (reiserfs_fix_nodes (M_INSERT, &tb, ih) != CARRY_ON) misc_die ("reiserfs_tree_insert: reiserfs_fix_nodes failed"); reiserfs_tb_balance (&tb, ih, body, M_INSERT, 0/*zero num*/); } /* if name is found in a directory - return 1 and set path to the name, otherwise return 0 and reiserfs_tree_pathrelse path */ int reiserfs_tree_scan_name (reiserfs_filsys_t * fs, reiserfs_key_t * dir, char * name, reiserfs_path_t * path) { const reiserfs_key_t * rdkey; reiserfs_key_t entry_key; reiserfs_deh_t * deh; reiserfs_ih_t * ih; int i, retval; reiserfs_key_set_did (&entry_key, reiserfs_key_get_did (dir)); reiserfs_key_set_oid (&entry_key, reiserfs_key_get_oid (dir)); reiserfs_key_set_off1 (&entry_key, 0); reiserfs_key_set_uni (&entry_key, UNI_DE); if (reiserfs_tree_search_entry (fs, &entry_key, path) == DIRECTORY_NOT_FOUND) { reiserfs_tree_pathrelse (path); return 0; } do { ih = REISERFS_PATH_IH (path); deh = reiserfs_deh (REISERFS_PATH_LEAF (path), ih) + path->pos_in_item; for (i = path->pos_in_item; i < reiserfs_ih_get_entries (ih); i ++, deh ++) { /* the name in directory has the same hash as the given name */ if ((reiserfs_direntry_name_len (ih, deh, i) == (int)strlen (name)) && !memcmp (reiserfs_deh_name (deh, i), name, strlen (name))) { path->pos_in_item = i; return 1; } } rdkey = reiserfs_tree_rkey (path, fs); if (!rdkey || reiserfs_key_comp2 (rdkey, dir)) { reiserfs_tree_pathrelse (path); return 0; } if (!reiserfs_key_dir (rdkey)) reiserfs_panic ("reiserfs_tree_scan_name: can not find name in " "broken directory yet"); /* first name of that item may be a name we are looking for */ entry_key = *rdkey; reiserfs_tree_pathrelse (path); retval = reiserfs_tree_search_entry (fs, &entry_key, path); if (retval != POSITION_FOUND) reiserfs_panic ("reiserfs_tree_scan_name: wrong delimiting " "key in the tree"); } while (1); return 0; } /* returns 0 if name is not found in a directory and 1 if name is found. Stores key found in the entry in 'key'. Returns minimal not used generation counter in 'min_gen_counter'. dies if found object is not a directory. */ int reiserfs_tree_search_name (reiserfs_filsys_t * fs, const reiserfs_key_t * dir, char * name, unsigned int * min_gen_counter, reiserfs_key_t * key) { const reiserfs_key_t * rdkey; reiserfs_key_t entry_key; REISERFS_PATH_INIT (path); reiserfs_deh_t * deh; reiserfs_ih_t * ih; __u32 hash; int retval; int i; reiserfs_key_set_did (&entry_key, reiserfs_key_get_did (dir)); reiserfs_key_set_oid (&entry_key, reiserfs_key_get_oid (dir)); if (!strcmp (name, ".")) hash = OFFSET_DOT; else if (!strcmp (name, "..")) hash = OFFSET_DOT_DOT; else hash = reiserfs_hash_value (fs->hash, name, strlen (name)); reiserfs_key_set_off1 (&entry_key, hash); reiserfs_key_set_uni (&entry_key, UNI_DE); *min_gen_counter = 0; if (reiserfs_tree_search_entry (fs, &entry_key, &path) == DIRECTORY_NOT_FOUND) { reiserfs_tree_pathrelse (&path); return 0; } do { ih = REISERFS_PATH_IH (&path); deh = reiserfs_deh (REISERFS_PATH_LEAF (&path), ih) + path.pos_in_item; for (i = path.pos_in_item; i < reiserfs_ih_get_entries (ih); i ++, deh ++) { if (OFFSET_HASH (reiserfs_deh_get_off (deh)) != OFFSET_HASH (hash)) { /* all entries having the same hash were scanned */ reiserfs_tree_pathrelse (&path); return 0; } if (OFFSET_GEN (reiserfs_deh_get_off (deh)) == *min_gen_counter) { (*min_gen_counter) ++; } if ((reiserfs_direntry_name_len (ih, deh, i) == (int)strlen (name)) && (!memcmp (reiserfs_deh_name (deh, i), name, strlen (name)))) { /* entry found in the directory */ if (key) { memset (key, 0, sizeof (reiserfs_key_t)); reiserfs_key_set_did (key, reiserfs_deh_get_did (deh)); reiserfs_key_set_oid (key, reiserfs_deh_get_obid (deh)); } reiserfs_tree_pathrelse (&path); return 1;//reiserfs_deh_get_obid (deh) ? reiserfs_deh_get_obid (deh) : 1; } } rdkey = reiserfs_tree_rkey (&path, fs); if (!rdkey || reiserfs_key_comp2 (rdkey, dir)) { reiserfs_tree_pathrelse (&path); return 0; } if (!reiserfs_key_dir (rdkey)) reiserfs_panic ("reiserfs_tree_search_name: can not find name " "in broken directory yet"); /* next item is the item of the directory we are looking name in */ if (OFFSET_HASH (reiserfs_key_get_off (rdkey)) != hash) { /* but there is no names with given hash */ reiserfs_tree_pathrelse (&path); return 0; } /* first name of that item may be a name we are looking for */ entry_key = *rdkey; reiserfs_tree_pathrelse (&path); retval = reiserfs_tree_search_entry (fs, &entry_key, &path); if (retval != POSITION_FOUND) reiserfs_panic ("reiserfs_tree_search_name: wrong delimiting " "key in the tree"); } while (1); return 0; } /* compose directory entry: dir entry head and name itself */ static char * make_entry (char * entry, char * name, const reiserfs_key_t * key, __u32 offset) { reiserfs_deh_t * deh; __u16 state; if (!entry) entry = misc_getmem (REISERFS_DEH_SIZE + MISC_ROUND_UP (strlen (name))); memset (entry, 0, REISERFS_DEH_SIZE + MISC_ROUND_UP (strlen (name))); deh = (reiserfs_deh_t *)entry; reiserfs_deh_set_loc (deh, 0); reiserfs_deh_set_off (deh, offset); state = (1 << DEH_Visible2); reiserfs_deh_set_state (deh, state); /* key of object entry will point to */ reiserfs_deh_set_did (deh, reiserfs_key_get_did (key)); reiserfs_deh_set_obid (deh, reiserfs_key_get_oid (key)); memcpy ((char *)(deh + 1), name, strlen (name)); return entry; } /* add new name into a directory. If it exists in a directory - do nothing */ int reiserfs_tree_insert_entry (reiserfs_filsys_t * fs, const reiserfs_key_t * dir, char * name, int name_len, const reiserfs_key_t * key, __u16 fsck_need) { reiserfs_ih_t entry_ih = {{0,}, }; char * entry; int retval; REISERFS_PATH_INIT(path); unsigned int gen_counter; int item_len; __u32 hash; if (reiserfs_tree_search_name (fs, dir, name, &gen_counter, 0)) /* entry is in the directory already or directory was not found */ return 0; /* compose entry key to look for its place in the tree */ reiserfs_key_set_did (&(entry_ih.ih_key), reiserfs_key_get_did (dir)); reiserfs_key_set_oid (&(entry_ih.ih_key), reiserfs_key_get_oid (dir)); if (!strcmp (name, ".")) hash = OFFSET_DOT; else if (!strcmp (name, "..")) hash = OFFSET_DOT_DOT; else hash = reiserfs_hash_value (fs->hash, name, strlen (name)) + gen_counter; reiserfs_key_set_off1 (&(entry_ih.ih_key), hash); reiserfs_key_set_uni (&(entry_ih.ih_key), UNI_DE); reiserfs_ih_set_format (&entry_ih, KEY_FORMAT_1); reiserfs_ih_set_entries (&entry_ih, 1); item_len = REISERFS_DEH_SIZE + name_len; /* if (reiserfs_super_format (fs->fs_ondisk_sb) == REISERFS_FORMAT_3_5) item_len = REISERFS_DEH_SIZE + strlen (name); else if (reiserfs_super_format (fs->fs_ondisk_sb) == REISERFS_FORMAT_3_6) item_len = REISERFS_DEH_SIZE + MISC_ROUND_UP (strlen (name)); else reiserfs_panic ("unknown fs format"); */ reiserfs_ih_set_len (&entry_ih, item_len); /* fsck may need to insert item which was not reached yet */ reiserfs_ih_set_flags (&entry_ih, fsck_need); entry = make_entry (0, name, key, reiserfs_key_get_off (&(entry_ih.ih_key))); retval = reiserfs_tree_search_entry (fs, &(entry_ih.ih_key), &path); switch (retval) { case POSITION_NOT_FOUND: reiserfs_tree_insert_unit (fs, &path, entry, item_len); break; case DIRECTORY_NOT_FOUND: reiserfs_deh_set_loc ((reiserfs_deh_t *)entry, REISERFS_DEH_SIZE); reiserfs_tree_insert (fs, &path, &entry_ih, entry); break; default: reiserfs_panic ("reiserfs_tree_insert_entry: looking for %k (inserting " "name \"%s\") reiserfs_tree_search_entry returned %d", &(entry_ih.ih_key), name, retval); } misc_freemem (entry); return item_len; } /* inserts new or old stat data of a __DIRECTORY__ (unreachable, nlinks == 0) */ int reiserfs_tree_create_stat (reiserfs_filsys_t * fs, reiserfs_path_t * path, const reiserfs_key_t * key, item_modify_t modify) { reiserfs_ih_t ih; reiserfs_sd_t sd; int key_format; if (fs->fs_format == REISERFS_FORMAT_3_5) key_format = KEY_FORMAT_1; else key_format = KEY_FORMAT_2; memset(&sd, 0, sizeof(sd)); reiserfs_stat_init (fs->fs_blocksize, key_format, reiserfs_key_get_did (key), reiserfs_key_get_oid (key), &ih, &sd); if (modify) modify (&ih, &sd); reiserfs_tree_insert (fs, path, &ih, &sd); return key_format; } __u16 reiserfs_tree_root (reiserfs_filsys_t * fs, item_modify_t modify, __u16 ih_flags) { __u16 format; REISERFS_PATH_INIT (path); /* is there root's stat data */ if (reiserfs_tree_search_item (fs, &root_dir_key, &path) == ITEM_NOT_FOUND) { format = reiserfs_tree_create_stat (fs, &path, &root_dir_key, modify); } else { reiserfs_ih_t * ih = REISERFS_PATH_IH (&path); if (!reiserfs_ih_stat (ih)) reiserfs_panic ("It must be root's stat data %k\n", &ih->ih_key); format = (reiserfs_ih_get_len (REISERFS_PATH_IH (&path)) == REISERFS_SD_SIZE) ? KEY_FORMAT_2 : KEY_FORMAT_1; reiserfs_tree_pathrelse (&path); } /* add "." and ".." if any of them do not exist. Last two parameters say: 0 - entry is not added on lost_found pass and 1 - mark item unreachable */ reiserfs_tree_insert_entry (fs, &root_dir_key, ".", reiserfs_direntry_entry_estimate (".", format), &root_dir_key, ih_flags); reiserfs_tree_insert_entry (fs, &root_dir_key, "..", reiserfs_direntry_entry_estimate ("..", format), &parent_root_dir_key, ih_flags); return format; } /* Release all buffers in the path. */ void reiserfs_tree_pathrelse (reiserfs_path_t * p_s_search_path) { int n_path_offset = p_s_search_path->path_length; while ( n_path_offset > REISERFS_PATH_OFFILL ) reiserfs_buffer_close(REISERFS_PATH_BUFFER(p_s_search_path, n_path_offset--)); p_s_search_path->path_length = REISERFS_PATH_OFFILL; } int reiserfs_tree_left_mergeable (reiserfs_filsys_t * s, reiserfs_path_t * path) { reiserfs_ih_t * right; reiserfs_bh_t * bh; int retval; right = reiserfs_ih_at (REISERFS_PATH_LEAF (path), 0); bh = reiserfs_tree_left_neighbor (s, path); if (bh == 0) { return 0; } retval = reiserfs_leaf_mergeable (reiserfs_ih_at (bh, reiserfs_node_items (bh) - 1), right, bh->b_size); reiserfs_buffer_close (bh); return retval; } int reiserfs_tree_right_mergeable (reiserfs_filsys_t * s, reiserfs_path_t * path) { reiserfs_ih_t * left; reiserfs_bh_t * bh; int retval; left = reiserfs_ih_at (REISERFS_PATH_LEAF (path), reiserfs_node_items (REISERFS_PATH_LEAF (path)) - 1); bh = reiserfs_tree_right_neighbor (s, path); if (bh == 0) { return 0; } retval = reiserfs_leaf_mergeable (left, reiserfs_ih_at (bh, 0), bh->b_size); reiserfs_buffer_close (bh); return retval; } /* return 1 if left and right nodes can be packed into 1 node. 0 otherwise */ int reiserfs_tree_node_mergeable(reiserfs_bh_t * left, reiserfs_bh_t * right) { reiserfs_ih_t *ih = reiserfs_ih_at (left, reiserfs_node_items (left) - 1); if (reiserfs_node_free (left) >= reiserfs_node_used (right) - (reiserfs_leaf_mergeable (ih, reiserfs_ih_at(right, 0), left->b_size) ? REISERFS_IH_SIZE : 0)) { return 1; } return 0; } /* A simple 2 nodes merge operation. */ int reiserfs_tree_merge(reiserfs_filsys_t *fs, reiserfs_path_t *dst_path, reiserfs_path_t *src_path) { reiserfs_bufinfo_t dest_bi; reiserfs_bufinfo_t src_bi; int num, res; src_bi.bi_bh = REISERFS_PATH_LEAF (src_path); src_bi.bi_parent = REISERFS_PATH_UPPARENT (src_path, 0); src_bi.bi_position = REISERFS_PATH_UPPARENT_POS (src_path, 0); dest_bi.bi_bh = REISERFS_PATH_LEAF(dst_path); dest_bi.bi_parent = REISERFS_PATH_UPPARENT (dst_path, 0); dest_bi.bi_position = REISERFS_PATH_UPPARENT_POS (dst_path, 0); num = reiserfs_node_items(src_bi.bi_bh); res = reiserfs_lb_copy (fs, &dest_bi, src_bi.bi_bh, FIRST_TO_LAST, num, -1); /* Delete all but the very first one. */ reiserfs_lb_delete (fs, &src_bi, FIRST_TO_LAST, 1, num - 1, -1); /* Delete the very first one and rebalance the tree. */ REISERFS_PATH_LEAF_POS (src_path) = 0; reiserfs_tree_delete (fs, src_path, 0); return res; } reiserfsprogs-3.6.20/libreiserfs/tree_balance.c0000644000175300001440000001425110412227267016506 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" /* Make empty node */ void reiserfs_tb_attach_new (reiserfs_bufinfo_t * bi) { reiserfs_leaf_mkempty (bi->bi_bh); if (bi->bi_parent) reiserfs_dc_set_size (reiserfs_int_at (bi->bi_parent, bi->bi_position), 0); } /* Get first empty buffer */ reiserfs_bh_t * reiserfs_tb_FEB (reiserfs_tb_t * tb) { int i; reiserfs_bh_t * first_b; reiserfs_bufinfo_t bi; for (i = 0; i < TB_FEB_MAX; i ++) if (tb->FEB[i] != 0) break; if (i == TB_FEB_MAX) reiserfs_panic("vs-12300: reiserfs_tb_FEB: FEB list is empty"); bi.bi_bh = first_b = tb->FEB[i]; bi.bi_parent = 0; bi.bi_position = 0; reiserfs_tb_attach_new (&bi); misc_set_bit(BH_Uptodate, &first_b->b_state); tb->FEB[i] = 0; tb->used[i] = first_b; return(first_b); } int reiserfs_tb_lpos (reiserfs_tb_t * tb, int h) { int Sh_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1); if (Sh_position == 0) return reiserfs_node_items (tb->FL[h]); else return Sh_position - 1; } int reiserfs_tb_rpos (reiserfs_tb_t * tb, int h) { int Sh_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1); if (Sh_position == reiserfs_node_items (REISERFS_PATH_UPPARENT (tb->tb_path, h))) return 0; else return Sh_position + 1; } /* Now we have all of the buffers that must be used in balancing of the tree. We rely on the assumption that schedule() will not occur while reiserfs_tb_balance works. ( Only interrupt handlers are acceptable.) We balance the tree according to the analysis made before this, using buffers already obtained. For SMP support it will someday be necessary to add ordered locking of tb. */ /* Some interesting rules of balancing: we delete a maximum of two nodes per level per balancing: we never delete R, when we delete two of three nodes L, S, R then we move them into R. we only delete L if we are deleting two nodes, if we delete only one node we delete S if we shift leaves then we shift as much as we can: this is a deliberate policy of extremism in node packing which results in higher average utilization after repeated random balance operations at the cost of more memory copies and more balancing as a result of small insertions to full nodes. if we shift internal nodes we try to evenly balance the node utilization, with consequent less balancing at the cost of lower utilization. one could argue that the policy for directories in leaves should be that of internal nodes, but we will wait until another day to evaluate this.... It would be nice to someday measure and prove these assumptions as to what is optimal.... */ void reiserfs_tb_balance ( reiserfs_tb_t * tb, /* tree_balance structure */ reiserfs_ih_t * ih, /* item header of inserted item */ const char * body, /* body of inserted item or bytes to paste */ int flag, /* i - insert, d - delete c - cut, p - paste Cut means delete part of an item (includes removing an entry from a directory). Delete means delete whole item. Insert means add a new item into the tree. Paste means to append to the end of an existing file or to insert a directory entry. */ int zeros_num) { //int pos_in_item = tb->tb_path->pos_in_item; int child_pos, /* position of a child node in its parent */ h; /* level of the tree being processed */ reiserfs_ih_t insert_key[2]; /* in our processing of one level we sometimes determine what must be inserted into the next higher level. This insertion consists of a key or two keys and their corresponding pointers */ reiserfs_bh_t *insert_ptr[2]; /* inserted node-ptrs for the next level */ /* if we have no real work to do */ if ( ! tb->insert_size[0] ) { reiserfs_unfix_nodes(/*th,*/ tb); return; } if (flag == M_INTERNAL) { insert_ptr[0] = (reiserfs_bh_t *)body; /* we must prepare insert_key */ if (REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0) /*LAST_POSITION (tb->tb_path)*//*item_pos*/ == -1) { /* get delimiting key from buffer in tree */ reiserfs_key_copy (&insert_key[0].ih_key, reiserfs_ih_key_at (REISERFS_PATH_LEAF (tb->tb_path), 0)); /*insert_ptr[0]->b_item_order = 0;*/ } else { /* get delimiting key from new buffer */ reiserfs_key_copy (&insert_key[0].ih_key, reiserfs_ih_key_at((reiserfs_bh_t *)body,0)); /*insert_ptr[0]->b_item_order = item_pos;*/ } /* and insert_ptr instead of reiserfs_lb_balance */ child_pos = REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0)/*item_pos*/; } else /* balance leaf returns 0 except if combining L R and S into one node. see reiserfs_ib_balance() for explanation of this line of code.*/ child_pos = REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0) + reiserfs_lb_balance (tb, ih, body, flag, zeros_num, insert_key, insert_ptr); /* Balance internal level of the tree. */ for ( h = 1; h < REISERFS_TREE_HEIGHT_MAX && tb->insert_size[h]; h++ ) child_pos = reiserfs_ib_balance (tb, h, child_pos, insert_key, insert_ptr); /* Release all (except for S[0]) non NULL buffers fixed by reiserfs_fix_nodes() */ reiserfs_unfix_nodes(/*th,*/ tb); } void reiserfs_tb_init (reiserfs_tb_t * tb, reiserfs_filsys_t * fs, reiserfs_path_t * path, int size) { memset (tb, '\0', sizeof(reiserfs_tb_t)); tb->tb_fs = fs; tb->tb_path = path; REISERFS_PATH_BUFFER(path, REISERFS_PATH_OFFILL) = NULL; REISERFS_PATH_POS(path, REISERFS_PATH_OFFILL) = 0; tb->insert_size[0] = size; } void reiserfs_tb_print_path (reiserfs_tb_t * tb, reiserfs_path_t * path) { int offset = path->path_length; reiserfs_bh_t * bh; printf ("Offset Bh (b_blocknr, b_count) Position Nr_item\n"); while ( offset > REISERFS_PATH_OFFILL ) { bh = REISERFS_PATH_BUFFER (path, offset); printf ("%6d %10p (%9lu, %7d) %8d %7d\n", offset, bh, bh ? bh->b_blocknr : 0, bh ? bh->b_count : 0, REISERFS_PATH_POS (path, offset), bh ? reiserfs_node_items (bh) : -1); offset --; } } reiserfsprogs-3.6.20/libutil/0000777000175300001440000000000010412227616013150 500000000000000reiserfsprogs-3.6.20/libutil/Makefile.am0000644000175300001440000000042510412227267015123 00000000000000noinst_LIBRARIES = libutil-static.a libutil_static_a_SOURCES = badblock.c device.c misc.c mntent.c print.c libutil_static_a_LIBADD = $(top_builddir)/libmisc/libmisc-static.a libutil_static_a_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include reiserfsprogs-3.6.20/libutil/Makefile.in0000644000175300001440000005400310412227367015136 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = $(libutil_static_a_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libutil DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libutil_static_a_AR = $(AR) $(ARFLAGS) libutil_static_a_DEPENDENCIES = \ $(top_builddir)/libmisc/libmisc-static.a am_libutil_static_a_OBJECTS = libutil_static_a-badblock.$(OBJEXT) \ libutil_static_a-device.$(OBJEXT) \ libutil_static_a-misc.$(OBJEXT) \ libutil_static_a-mntent.$(OBJEXT) \ libutil_static_a-print.$(OBJEXT) libutil_static_a_OBJECTS = $(am_libutil_static_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libutil_static_a_SOURCES) DIST_SOURCES = $(libutil_static_a_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ noinst_LIBRARIES = libutil-static.a libutil_static_a_SOURCES = badblock.c device.c misc.c mntent.c print.c libutil_static_a_LIBADD = $(top_builddir)/libmisc/libmisc-static.a libutil_static_a_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libutil/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu libutil/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libutil-static.a: $(libutil_static_a_OBJECTS) $(libutil_static_a_DEPENDENCIES) -rm -f libutil-static.a $(libutil_static_a_AR) libutil-static.a $(libutil_static_a_OBJECTS) $(libutil_static_a_LIBADD) $(RANLIB) libutil-static.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_static_a-badblock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_static_a-device.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_static_a-misc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_static_a-mntent.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_static_a-print.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` libutil_static_a-badblock.o: badblock.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-badblock.o -MD -MP -MF "$(DEPDIR)/libutil_static_a-badblock.Tpo" -c -o libutil_static_a-badblock.o `test -f 'badblock.c' || echo '$(srcdir)/'`badblock.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libutil_static_a-badblock.Tpo" "$(DEPDIR)/libutil_static_a-badblock.Po"; else rm -f "$(DEPDIR)/libutil_static_a-badblock.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='badblock.c' object='libutil_static_a-badblock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-badblock.o `test -f 'badblock.c' || echo '$(srcdir)/'`badblock.c libutil_static_a-badblock.obj: badblock.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-badblock.obj -MD -MP -MF "$(DEPDIR)/libutil_static_a-badblock.Tpo" -c -o libutil_static_a-badblock.obj `if test -f 'badblock.c'; then $(CYGPATH_W) 'badblock.c'; else $(CYGPATH_W) '$(srcdir)/badblock.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libutil_static_a-badblock.Tpo" "$(DEPDIR)/libutil_static_a-badblock.Po"; else rm -f "$(DEPDIR)/libutil_static_a-badblock.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='badblock.c' object='libutil_static_a-badblock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-badblock.obj `if test -f 'badblock.c'; then $(CYGPATH_W) 'badblock.c'; else $(CYGPATH_W) '$(srcdir)/badblock.c'; fi` libutil_static_a-device.o: device.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-device.o -MD -MP -MF "$(DEPDIR)/libutil_static_a-device.Tpo" -c -o libutil_static_a-device.o `test -f 'device.c' || echo '$(srcdir)/'`device.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libutil_static_a-device.Tpo" "$(DEPDIR)/libutil_static_a-device.Po"; else rm -f "$(DEPDIR)/libutil_static_a-device.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='device.c' object='libutil_static_a-device.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-device.o `test -f 'device.c' || echo '$(srcdir)/'`device.c libutil_static_a-device.obj: device.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-device.obj -MD -MP -MF "$(DEPDIR)/libutil_static_a-device.Tpo" -c -o libutil_static_a-device.obj `if test -f 'device.c'; then $(CYGPATH_W) 'device.c'; else $(CYGPATH_W) '$(srcdir)/device.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libutil_static_a-device.Tpo" "$(DEPDIR)/libutil_static_a-device.Po"; else rm -f "$(DEPDIR)/libutil_static_a-device.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='device.c' object='libutil_static_a-device.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-device.obj `if test -f 'device.c'; then $(CYGPATH_W) 'device.c'; else $(CYGPATH_W) '$(srcdir)/device.c'; fi` libutil_static_a-misc.o: misc.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-misc.o -MD -MP -MF "$(DEPDIR)/libutil_static_a-misc.Tpo" -c -o libutil_static_a-misc.o `test -f 'misc.c' || echo '$(srcdir)/'`misc.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libutil_static_a-misc.Tpo" "$(DEPDIR)/libutil_static_a-misc.Po"; else rm -f "$(DEPDIR)/libutil_static_a-misc.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc.c' object='libutil_static_a-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-misc.o `test -f 'misc.c' || echo '$(srcdir)/'`misc.c libutil_static_a-misc.obj: misc.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-misc.obj -MD -MP -MF "$(DEPDIR)/libutil_static_a-misc.Tpo" -c -o libutil_static_a-misc.obj `if test -f 'misc.c'; then $(CYGPATH_W) 'misc.c'; else $(CYGPATH_W) '$(srcdir)/misc.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libutil_static_a-misc.Tpo" "$(DEPDIR)/libutil_static_a-misc.Po"; else rm -f "$(DEPDIR)/libutil_static_a-misc.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc.c' object='libutil_static_a-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-misc.obj `if test -f 'misc.c'; then $(CYGPATH_W) 'misc.c'; else $(CYGPATH_W) '$(srcdir)/misc.c'; fi` libutil_static_a-mntent.o: mntent.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-mntent.o -MD -MP -MF "$(DEPDIR)/libutil_static_a-mntent.Tpo" -c -o libutil_static_a-mntent.o `test -f 'mntent.c' || echo '$(srcdir)/'`mntent.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libutil_static_a-mntent.Tpo" "$(DEPDIR)/libutil_static_a-mntent.Po"; else rm -f "$(DEPDIR)/libutil_static_a-mntent.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mntent.c' object='libutil_static_a-mntent.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-mntent.o `test -f 'mntent.c' || echo '$(srcdir)/'`mntent.c libutil_static_a-mntent.obj: mntent.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-mntent.obj -MD -MP -MF "$(DEPDIR)/libutil_static_a-mntent.Tpo" -c -o libutil_static_a-mntent.obj `if test -f 'mntent.c'; then $(CYGPATH_W) 'mntent.c'; else $(CYGPATH_W) '$(srcdir)/mntent.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libutil_static_a-mntent.Tpo" "$(DEPDIR)/libutil_static_a-mntent.Po"; else rm -f "$(DEPDIR)/libutil_static_a-mntent.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mntent.c' object='libutil_static_a-mntent.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-mntent.obj `if test -f 'mntent.c'; then $(CYGPATH_W) 'mntent.c'; else $(CYGPATH_W) '$(srcdir)/mntent.c'; fi` libutil_static_a-print.o: print.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-print.o -MD -MP -MF "$(DEPDIR)/libutil_static_a-print.Tpo" -c -o libutil_static_a-print.o `test -f 'print.c' || echo '$(srcdir)/'`print.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libutil_static_a-print.Tpo" "$(DEPDIR)/libutil_static_a-print.Po"; else rm -f "$(DEPDIR)/libutil_static_a-print.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='print.c' object='libutil_static_a-print.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-print.o `test -f 'print.c' || echo '$(srcdir)/'`print.c libutil_static_a-print.obj: print.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-print.obj -MD -MP -MF "$(DEPDIR)/libutil_static_a-print.Tpo" -c -o libutil_static_a-print.obj `if test -f 'print.c'; then $(CYGPATH_W) 'print.c'; else $(CYGPATH_W) '$(srcdir)/print.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libutil_static_a-print.Tpo" "$(DEPDIR)/libutil_static_a-print.Po"; else rm -f "$(DEPDIR)/libutil_static_a-print.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='print.c' object='libutil_static_a-print.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-print.obj `if test -f 'print.c'; then $(CYGPATH_W) 'print.c'; else $(CYGPATH_W) '$(srcdir)/print.c'; fi` uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/libutil/badblock.c0000644000175300001440000000263110412227267014775 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "util/badblock.h" int util_badblock_load (reiserfs_filsys_t * fs, char * badblocks_file) { FILE * fd; char buf[128]; __u32 blocknr; int count; fs->fs_badblocks_bm = reiserfs_bitmap_create(reiserfs_sb_get_blocks(fs->fs_ondisk_sb)); reiserfs_bitmap_zero (fs->fs_badblocks_bm); if (!badblocks_file) return 0; fd = fopen (badblocks_file, "r"); if (fd == NULL) { fprintf (stderr, "%s: Failed to open the given badblock file '%s'.\n\n", __FUNCTION__, badblocks_file); return 1; } while (!feof (fd)) { if (fgets(buf, sizeof(buf), fd) == NULL) break; count = sscanf(buf, "%u", &blocknr); if (count <= 0) continue; if (blocknr >= reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) { fprintf (stderr, "%s: block number (%u) points out of fs size " "(%u).\n", __FUNCTION__, blocknr, reiserfs_sb_get_blocks(fs->fs_ondisk_sb)); } else if (reiserfs_fs_block(fs, blocknr) != BT_UNKNOWN) { fprintf (stderr, "%s: block number (%u) belongs to system " "reiserfs area. It cannot be relocated.\n", __FUNCTION__, blocknr); return 1; } else { reiserfs_bitmap_set_bit (fs->fs_badblocks_bm, blocknr); } } fclose (fd); return 0; } reiserfsprogs-3.6.20/libutil/device.c0000644000175300001440000001326410412227267014477 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "util/device.h" #include "util/print.h" #include "util/mntent.h" #include "misc/device.h" #include "misc/types.h" #include "misc/misc.h" #include "reiserfs/print.h" #include #include #include #include #include #include #include #include #include #include #define reiserfs_confirm(force) \ if (force < 1) {\ /* avoid formatting it without being forced */\ reiserfs_warning (stderr, "Use -f to force over\n");\ return 0;\ }\ if (force < 2) {\ if (!util_user_confirmed (stderr, "Continue (y/n):", "y\n"))\ return 0;\ }\ /* 0 - dma is not supported, scsi or regular file */ /* 1 - xt drive */ /* 2 - ide drive */ static void get_dma_support(util_device_dma_t *dma_info, struct stat *st){ if (S_ISREG(st->st_mode)) st->st_rdev = st->st_dev; if (IDE_DISK_MAJOR(major(st->st_rdev))) { dma_info->support_type = 2; return; } #ifdef XT_DISK_MAJOR if (major(st->st_rdev) == XT_DISK_MAJOR) { dma_info->support_type = 1; return; } #endif dma_info->support_type = 0; } /* * Return values: * 0 - ok; * 1 - preparation cannot be done * -1 - preparation failed */ int util_device_dma_prep(util_device_dma_t *dma_info) { struct stat st; char buf[4096]; dev_t rdev; int rem; int res; #ifndef HDIO_GET_DMA return -1; #endif if (fstat(dma_info->fd, &st)) misc_die("stat on device failed\n"); get_dma_support(dma_info, &st); /* dma should be supported */ if (dma_info->support_type == 0) return 1; if (dma_info->support_type == 1) return 0; rdev = dma_info->st_rdev = st.st_rdev; /* If it is the whole device? no preparation needed then. */ if ((rem = (minor(rdev) % 64)) == 0) return 0; dma_info->st_rdev -= rem; strcpy(buf, "/dev"); if ((res = misc_dir_walk(buf, misc_device_rdev_match, &dma_info->st_rdev)) <= 0) { dma_info->st_rdev += rem; dma_info->support_type = 1; return res; } /* Matched block device file found. Open it. */ dma_info->fd = open(buf, O_RDONLY #if defined(O_LARGEFILE) | O_LARGEFILE #endif ); return 0; } static int is_dma_on (int fd) { #ifdef HDIO_GET_DMA static long parm; if (ioctl(fd, HDIO_GET_DMA, &parm)) return -1; else return parm; #endif return 0; } static __u64 dma_speed(int fd, int support_type) { static struct hd_driveid id; __u64 speed = 0; if (support_type != 2) return 0; #ifdef HDIO_OBSOLETE_IDENTITY if (!ioctl(fd, HDIO_GET_IDENTITY, &id) || !ioctl(fd, HDIO_OBSOLETE_IDENTITY)) { #else if (!ioctl(fd, HDIO_GET_IDENTITY, &id)) { #endif speed |= (__u64)id.dma_1word & ~(__u64)0xff; speed |= ((__u64)id.dma_mword & ~(__u64)0xff) << 16; speed |= ((__u64)id.dma_ultra & ~(__u64)0xff) << 32; } else if (errno == -ENOMSG) return -1; else return -1; return speed; } int util_device_get_dma(util_device_dma_t *dma_info) { if ((dma_info->dma = is_dma_on(dma_info->fd)) == -1) return -1; if ((dma_info->speed = dma_speed(dma_info->fd, dma_info->support_type)) == (__u64)-1) return -1; return 0; } void util_device_dma_fini(int fd, util_device_dma_t *dma_info) { signal(SIGALRM, SIG_IGN); if (dma_info->fd && fd != dma_info->fd) close(dma_info->fd); } FILE * util_file_open (char * filename, char * option) { FILE * fp = fopen (filename, option); if (!fp) { reiserfs_warning (stderr, "util_file_open: could not " "open file %s\n", filename); return 0; } reiserfs_warning (stderr, "Temp file opened by fsck: " "\"%s\" .. \n", filename); return fp; } /* we only can use a file for filesystem or journal if it is either not mounted block device or regular file and we are forced to use it */ int util_device_formatable (char * device_name, int force) { mode_t mode; dev_t rdev; if (util_device_mounted(device_name) > 0) { /* device looks mounted */ reiserfs_warning (stderr, "'%s' looks mounted.", device_name); reiserfs_confirm (force); } mode = misc_device_mode(device_name); rdev = misc_device_rdev(device_name); if (!S_ISBLK (mode)) { /* file is not a block device */ reiserfs_warning (stderr, "%s is not a block special device\n", device_name); reiserfs_confirm (force); } else { if ((IDE_DISK_MAJOR (major(rdev)) && minor(rdev) % 64 == 0) || (SCSI_BLK_MAJOR (major(rdev)) && minor(rdev) % 16 == 0)) { /* /dev/hda or similar */ reiserfs_warning (stderr, "%s is entire device, not just one partition!\n", device_name); reiserfs_confirm (force); } } return 1; } int util_root_mounted(char *device) { struct stat rootst, devst; assert(device != NULL); if (stat("/", &rootst) != 0) return -1; if (stat(device, &devst) != 0) return -1; if (!S_ISBLK(devst.st_mode) || devst.st_rdev != rootst.st_dev) return 0; return 1; } int util_device_mounted(char *device) { struct mntent *mnt; /* Check for the "/" first to avoid any possible problem with reflecting the root fs info in mtab files. */ if (util_root_mounted(device) == 1) { return util_file_ro("/") ? MF_RO : MF_RW; } /* Lookup the mount entry. */ if ((mnt = util_mntent(device)) == NULL) { return MF_NOT_MOUNTED; } else if (mnt == INVAL_PTR) { return 0; } return hasmntopt(mnt, MNTOPT_RO) ? MF_RO : MF_RW; } int util_file_ro(char *file) { if (utime(file, 0) == -1) { if (errno == EROFS) return 1; } return 0; } reiserfsprogs-3.6.20/libutil/misc.c0000644000175300001440000001140210412227267014163 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "util/misc.h" #include "misc/malloc.h" #include "misc/misc.h" #include #include #include char buf1 [100]; char buf2 [100]; static time_t t0 = 0, t1 = 0, t2 = 0; void util_misc_speed (FILE *fp, unsigned long passed, unsigned long total, int cursor_pos, int reset_time) { int speed; int indent; if (passed == 0) reset_time = 1; if (reset_time) time (&t0); time (&t1); if (t1 != t0) { speed = passed / (t1 - t0); if (total - passed) { if (t1 - t2 < 1) return; t2 = t1; } } else if (reset_time) { speed = 0; } else { return; } /* what has to be written */ if (reset_time) buf1[0] = 0; else if (total) sprintf (buf1, "left %lu, %d /sec", total - passed, speed); else { /*(*passed) ++;*/ sprintf (buf1, "done %lu, %d /sec", passed, speed); } /* make indent */ indent = 79 - cursor_pos - strlen (buf1); memset (buf2, ' ', indent); buf2[indent] = 0; fprintf (fp, "%s%s", buf2, buf1); memset (buf2, '\b', indent + strlen (buf1)); buf2 [indent + strlen (buf1)] = 0; fprintf (fp, "%s", buf2); fflush (fp); } static char * strs[] = {"0%",".",".",".",".", "20%",".",".",".",".", "40%",".",".",".",".", "60%",".",".",".",".", "80%",".",".",".",".","100%"}; static char progress_to_be[1024]; static char current_progress[1024]; static void str_to_be (char * buf, int prosents) { int i; prosents -= prosents % 4; buf[0] = 0; for (i = 0; i <= prosents / 4; i ++) strcat (buf, strs[i]); } void util_misc_progress (FILE * fp, unsigned long * passed, unsigned long total, unsigned int inc, int forward) { int percent; if (*passed == 0) current_progress[0] = 0; (*passed) += inc; if (*passed > total) { /* fprintf (fp, "\nutil_misc_progress: total %lu has been " "reached already. cur=%lu\n", total, *passed);*/ return; } percent = ((*passed) * 100) / total; str_to_be (progress_to_be, percent); if (strlen (current_progress) != strlen (progress_to_be)) { fprintf (fp, "%s", progress_to_be + strlen (current_progress)); } strcat (current_progress, progress_to_be + strlen (current_progress)); if (forward != 2) { util_misc_speed(fp, *passed /* - inc*/, forward ? 0 : total, strlen (progress_to_be), (*passed == inc) ? 1 : 0); } fflush (fp); } static int screen_width = 0; static int screen_curr_pos = 0; static char *screen_savebuffer; static int screen_savebuffer_len; void screen_init() { char *width; width = getenv("COLUMNS"); if ( width ) screen_width = atoi(width); if (screen_width == 0) screen_width = 80; // We default to 80 characters wide screen screen_width--; screen_savebuffer_len=screen_width; screen_savebuffer=misc_getmem(screen_width+1); memset(screen_savebuffer,0,screen_savebuffer_len+1); } void util_misc_name (FILE * fp) { static int printed_len = 0; int i; if (screen_curr_pos == 0 || t0 == 0) { /* Start the new progress. */ time (&t0); t2 = t0; } else { time (&t1); if (t1 - t2 < 1) return; t2 = t1; } if (screen_width && screen_curr_pos >= screen_width ) { fprintf(fp, "... %.*s", screen_width - 4, screen_savebuffer + ( screen_curr_pos - (screen_width - 4))); printed_len = screen_width; } else if (screen_width) { fprintf(fp, "%s", screen_savebuffer); for (i = 0; i <= printed_len - screen_curr_pos ; i++) fprintf(fp, " "); printed_len = screen_curr_pos; } fprintf(fp, "\r"); fflush (fp); } /* semantic pass progress */ void util_misc_print_name (FILE *fp, char * name, int len) { int i; if (screen_width == 0) screen_init(); if ( len + screen_curr_pos + 1 > screen_savebuffer_len) { char *t; t = misc_expandmem(screen_savebuffer, screen_savebuffer_len + 1, len + screen_curr_pos - screen_savebuffer_len + 1); if (!t) { return; // ???? } screen_savebuffer = t; screen_savebuffer_len = len + screen_curr_pos + 1; } strcat(screen_savebuffer,"/"); strncat(screen_savebuffer,name,len); i = screen_curr_pos; screen_curr_pos += len+1; for ( ; i #endif #include "misc/types.h" #include "util/device.h" #include #include #include #include #include #include static struct mntent *util_mntent_lookup(char *mntfile, char *file, int path) { struct mntent *mnt; int name_match = 0; struct stat st; dev_t rdev = 0; dev_t dev = 0; ino_t ino = 0; char *name; FILE *fp; assert(mntfile != NULL); assert(file != NULL); if (stat(file, &st) == 0) { /* Devices is stated. */ if (S_ISBLK(st.st_mode)) { rdev = st.st_rdev; } else { dev = st.st_dev; ino = st.st_ino; } } if ((fp = setmntent(mntfile, "r")) == NULL) return INVAL_PTR; while ((mnt = getmntent(fp)) != NULL) { /* Check if names match. */ name = path ? mnt->mnt_dir : mnt->mnt_fsname; if (strcmp(file, name) == 0) name_match = 1; if (stat(name, &st)) continue; /* If names do not match, check if stats match. */ if (!name_match) { if (rdev && S_ISBLK(st.st_mode)) { if (rdev != st.st_rdev) continue; } else if (dev && !S_ISBLK(st.st_mode)) { if (dev != st.st_dev || ino != st.st_ino) continue; } else { continue; } } /* If not path and not block device do not check anything more. */ if (!path && !rdev) break; if (path) { /* Either names or stats match. Make sure the st_dev of the path is same as @mnt_fsname device rdev. */ if (stat(mnt->mnt_fsname, &st) == 0 && dev == st.st_rdev) break; } else { /* Either names or stats match. Make sure the st_dev of the mount entry is same as the given device rdev. */ if (stat(mnt->mnt_dir, &st) == 0 && rdev == st.st_dev) break; } } endmntent (fp); return mnt; } struct mntent *util_mntent(char *device) { int proc = 0, path = 0, root = 0; struct mntent *mnt; struct statfs stfs; assert(device != NULL); /* Check if the root. */ if (util_root_mounted(device) == 1) root = 1; #ifdef __linux__ /* Check if /proc is procfs. */ if (statfs("/proc", &stfs) == 0 && stfs.f_type == 0x9fa0) { proc = 1; if (root) { /* Lookup the "/" entry in /proc/mounts. Special case as root entry can present as: rootfs / rootfs rw 0 0 Look up the mount point in this case. */ mnt = util_mntent_lookup("/proc/mounts", "/", 1); } else { /* Lookup the @device /proc/mounts */ mnt = util_mntent_lookup("/proc/mounts", device, 0); } if (mnt == INVAL_PTR) proc = 0; else if (mnt) return mnt; } #endif /* __linux__ */ #if defined(MOUNTED) || defined(_PATH_MOUNTED) #ifndef MOUNTED #define MOUNTED _PATH_MOUNTED #endif /* Check in MOUNTED (/etc/mtab) if RW. */ if (!util_file_ro(MOUNTED)) { path = 1; if (root) { mnt = util_mntent_lookup(MOUNTED, "/", 1); } else { mnt = util_mntent_lookup(MOUNTED, device, 0); } if (mnt == INVAL_PTR) path = 0; else if (mnt) return mnt; } #endif /* defined(MOUNTED) || defined(_PATH_MOUNTED) */ /* If has not been checked in neither /proc/mounts nor /etc/mtab (or errors have occured), return INVAL_PTR, NULL otherwise. */ return (!proc && !path) ? INVAL_PTR : NULL; } reiserfsprogs-3.6.20/libutil/print.c0000644000175300001440000000124010412227267014363 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "util/print.h" #include int util_user_confirmed (FILE * fp, char * q, char * yes) { char answer[4096]; fprintf (fp, "%s", q); if (fgets(answer, sizeof(answer), stdin) == NULL || (strlen(answer) != strlen(yes) || strcmp(yes, answer))) { return 0; } return 1; } #define BANNER \ "Copyright (C) 2001-2005 by Hans Reiser, " \ "licensing governed by reiserfsprogs/COPYING." void util_print_banner(char *name) { fprintf(stderr, "%s %s\n%s\n", name, VERSION, BANNER); } reiserfsprogs-3.6.20/missing0000755000175300001440000002517010217066030013016 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2005-02-08.22 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case "$1" in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: reiserfsprogs-3.6.20/mkinstalldirs0000644000175300001440000000132410412227267014225 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.1.1.1 2000/08/03 10:35:16 vs Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here reiserfsprogs-3.6.20/reiserfsprogs.spec0000644000175300001440000000305110412227461015166 00000000000000Name: reiserfsprogs Version: 3.6.20 Release: 1 Summary: Utilities for reiserfs filesystems License: GPL Group: System Environment/Base URL: http://www.namesys.com/ Source: reiserfsprogs-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root %description The reiserfsprogs package contains utilities for manipulating reiserfs filesystems. %prep %setup -q -n reiserfsprogs-3.6.20 %build export CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" find . -name "config.cache" |xargs rm -f ./configure --sbindir=%{_sbindir} --mandir=%{_mandir} %install rm -rf $RPM_BUILD_ROOT %{__make} DESTDIR=$RPM_BUILD_ROOT install # __os_install_post is normally executed after \% install disable it %define ___build_post %{nil} # explicitly call it now, so manpages get compressed, exec's stripped etc. %{?__os_install_post} %define __os_install_post %{nil} # now we have all the files execpt for docs, but their owner is unimportant cd $RPM_BUILD_ROOT %clean rm -rf $RPM_BUILD_ROOT %post rm -rf $RPM_BUILD_ROOT CONFIG=/usr/src/linux/.config if [ -f $CONFIG ] ; then source $CONFIG fi if [ -z $CONFIG_REISERFS_FS ] ; then echo -e "\nIn $CONFIG , you probably have to set:" if [ "$CONFIG_EXPERIMENTAL" != "y" ] ; then echo -e 'CONFIG_EXPERIMENTAL=y' fi echo -e 'CONFIG_REISERFS_FS=y\n or' echo -e 'CONFIG_REISERFS_FS=m' echo -e 'and recompile and reboot your kernel if you cannot use the\nreiserfsprogs utilities' fi %files %defattr(-,root,root) %doc AUTHORS COPYING CREDITS INSTALL NEWS README %{_sbindir}/* %{_mandir}/man8/*.gz reiserfsprogs-3.6.20/reiserfsprogs.spec.in0000644000175300001440000000305710412227267015605 00000000000000Name: reiserfsprogs Version: @VERSION@ Release: 1 Summary: Utilities for reiserfs filesystems License: GPL Group: System Environment/Base URL: http://www.namesys.com/ Source: reiserfsprogs-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root %description The reiserfsprogs package contains utilities for manipulating reiserfs filesystems. %prep %setup -q -n reiserfsprogs-@VERSION@ %build export CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" find . -name "config.cache" |xargs rm -f ./configure --sbindir=%{_sbindir} --mandir=%{_mandir} %install rm -rf $RPM_BUILD_ROOT %{__make} DESTDIR=$RPM_BUILD_ROOT install # __os_install_post is normally executed after \% install disable it %define ___build_post %{nil} # explicitly call it now, so manpages get compressed, exec's stripped etc. %{?__os_install_post} %define __os_install_post %{nil} # now we have all the files execpt for docs, but their owner is unimportant cd $RPM_BUILD_ROOT %clean rm -rf $RPM_BUILD_ROOT %post rm -rf $RPM_BUILD_ROOT CONFIG=/usr/src/linux/.config if [ -f $CONFIG ] ; then source $CONFIG fi if [ -z $CONFIG_REISERFS_FS ] ; then echo -e "\nIn $CONFIG , you probably have to set:" if [ "$CONFIG_EXPERIMENTAL" != "y" ] ; then echo -e 'CONFIG_EXPERIMENTAL=y' fi echo -e 'CONFIG_REISERFS_FS=y\n or' echo -e 'CONFIG_REISERFS_FS=m' echo -e 'and recompile and reboot your kernel if you cannot use the\nreiserfsprogs utilities' fi %files %defattr(-,root,root) %doc AUTHORS COPYING CREDITS INSTALL NEWS README %{_sbindir}/* %{_mandir}/man8/*.gz reiserfsprogs-3.6.20/utils/0000777000175300001440000000000010412227617012645 500000000000000reiserfsprogs-3.6.20/utils/Makefile.am0000644000175300001440000000005110412227267014612 00000000000000SUBDIRS = mkfs debugfs fsck tune resizer reiserfsprogs-3.6.20/utils/Makefile.in0000644000175300001440000003235610412227367014641 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = utils DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = mkfs debugfs fsck tune resizer all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu utils/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ clean clean-generic clean-recursive ctags ctags-recursive \ distclean distclean-generic distclean-recursive distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/utils/debugfs/0000777000175300001440000000000010412227617014264 500000000000000reiserfsprogs-3.6.20/utils/debugfs/Makefile.am0000644000175300001440000000166710412227267016247 00000000000000sbin_PROGRAMS = debugfs.reiserfs man_MANS = debugfs.reiserfs.8 EXTRA_DIST = debugfs.reiserfs.8 debugfs_reiserfs_SOURCES = debugreiserfs.c pack.c unpack.c stat.c corruption.c \ scan.c recover.c debugreiserfs.h debugfs_reiserfs_LDADD = $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libmisc/libmisc-static.a debugfs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@ debugfs_reiserfs_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include uninstall-debugreiserfs: if test -f $(DESTDIR)$(sbindir)/debugreiserfs; then \ rm -f $(DESTDIR)$(sbindir)/debugreiserfs; \ fi; install-debugreiserfs: if test -f $(DESTDIR)$(sbindir)/debugfs.reiserfs; then \ rm -f $(DESTDIR)$(sbindir)/debugreiserfs; \ ln $(DESTDIR)$(sbindir)/debugfs.reiserfs $(DESTDIR)$(sbindir)/debugreiserfs; \ fi; install-data-local: install-debugreiserfs uninstall-local: uninstall-debugreiserfs reiserfsprogs-3.6.20/utils/debugfs/Makefile.in0000644000175300001440000007350110412227370016247 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = $(debugfs_reiserfs_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ sbin_PROGRAMS = debugfs.reiserfs$(EXEEXT) subdir = utils/debugfs DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(sbin_PROGRAMS) am_debugfs_reiserfs_OBJECTS = \ debugfs_reiserfs-debugreiserfs.$(OBJEXT) \ debugfs_reiserfs-pack.$(OBJEXT) \ debugfs_reiserfs-unpack.$(OBJEXT) \ debugfs_reiserfs-stat.$(OBJEXT) \ debugfs_reiserfs-corruption.$(OBJEXT) \ debugfs_reiserfs-scan.$(OBJEXT) \ debugfs_reiserfs-recover.$(OBJEXT) debugfs_reiserfs_OBJECTS = $(am_debugfs_reiserfs_OBJECTS) debugfs_reiserfs_DEPENDENCIES = \ $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libmisc/libmisc-static.a DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(debugfs_reiserfs_SOURCES) DIST_SOURCES = $(debugfs_reiserfs_SOURCES) man8dir = $(mandir)/man8 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ man_MANS = debugfs.reiserfs.8 EXTRA_DIST = debugfs.reiserfs.8 debugfs_reiserfs_SOURCES = debugreiserfs.c pack.c unpack.c stat.c corruption.c \ scan.c recover.c debugreiserfs.h debugfs_reiserfs_LDADD = $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libmisc/libmisc-static.a debugfs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@ debugfs_reiserfs_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/debugfs/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu utils/debugfs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)" @list='$(sbin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(sbin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \ rm -f "$(DESTDIR)$(sbindir)/$$f"; \ done clean-sbinPROGRAMS: -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) debugfs.reiserfs$(EXEEXT): $(debugfs_reiserfs_OBJECTS) $(debugfs_reiserfs_DEPENDENCIES) @rm -f debugfs.reiserfs$(EXEEXT) $(LINK) $(debugfs_reiserfs_LDFLAGS) $(debugfs_reiserfs_OBJECTS) $(debugfs_reiserfs_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-corruption.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-pack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-recover.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-scan.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-stat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-unpack.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` debugfs_reiserfs-debugreiserfs.o: debugreiserfs.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-debugreiserfs.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Tpo" -c -o debugfs_reiserfs-debugreiserfs.o `test -f 'debugreiserfs.c' || echo '$(srcdir)/'`debugreiserfs.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Tpo" "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debugreiserfs.c' object='debugfs_reiserfs-debugreiserfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-debugreiserfs.o `test -f 'debugreiserfs.c' || echo '$(srcdir)/'`debugreiserfs.c debugfs_reiserfs-debugreiserfs.obj: debugreiserfs.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-debugreiserfs.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Tpo" -c -o debugfs_reiserfs-debugreiserfs.obj `if test -f 'debugreiserfs.c'; then $(CYGPATH_W) 'debugreiserfs.c'; else $(CYGPATH_W) '$(srcdir)/debugreiserfs.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Tpo" "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debugreiserfs.c' object='debugfs_reiserfs-debugreiserfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-debugreiserfs.obj `if test -f 'debugreiserfs.c'; then $(CYGPATH_W) 'debugreiserfs.c'; else $(CYGPATH_W) '$(srcdir)/debugreiserfs.c'; fi` debugfs_reiserfs-pack.o: pack.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-pack.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-pack.Tpo" -c -o debugfs_reiserfs-pack.o `test -f 'pack.c' || echo '$(srcdir)/'`pack.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-pack.Tpo" "$(DEPDIR)/debugfs_reiserfs-pack.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-pack.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pack.c' object='debugfs_reiserfs-pack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-pack.o `test -f 'pack.c' || echo '$(srcdir)/'`pack.c debugfs_reiserfs-pack.obj: pack.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-pack.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-pack.Tpo" -c -o debugfs_reiserfs-pack.obj `if test -f 'pack.c'; then $(CYGPATH_W) 'pack.c'; else $(CYGPATH_W) '$(srcdir)/pack.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-pack.Tpo" "$(DEPDIR)/debugfs_reiserfs-pack.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-pack.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pack.c' object='debugfs_reiserfs-pack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-pack.obj `if test -f 'pack.c'; then $(CYGPATH_W) 'pack.c'; else $(CYGPATH_W) '$(srcdir)/pack.c'; fi` debugfs_reiserfs-unpack.o: unpack.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-unpack.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-unpack.Tpo" -c -o debugfs_reiserfs-unpack.o `test -f 'unpack.c' || echo '$(srcdir)/'`unpack.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-unpack.Tpo" "$(DEPDIR)/debugfs_reiserfs-unpack.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-unpack.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='unpack.c' object='debugfs_reiserfs-unpack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-unpack.o `test -f 'unpack.c' || echo '$(srcdir)/'`unpack.c debugfs_reiserfs-unpack.obj: unpack.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-unpack.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-unpack.Tpo" -c -o debugfs_reiserfs-unpack.obj `if test -f 'unpack.c'; then $(CYGPATH_W) 'unpack.c'; else $(CYGPATH_W) '$(srcdir)/unpack.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-unpack.Tpo" "$(DEPDIR)/debugfs_reiserfs-unpack.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-unpack.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='unpack.c' object='debugfs_reiserfs-unpack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-unpack.obj `if test -f 'unpack.c'; then $(CYGPATH_W) 'unpack.c'; else $(CYGPATH_W) '$(srcdir)/unpack.c'; fi` debugfs_reiserfs-stat.o: stat.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-stat.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-stat.Tpo" -c -o debugfs_reiserfs-stat.o `test -f 'stat.c' || echo '$(srcdir)/'`stat.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-stat.Tpo" "$(DEPDIR)/debugfs_reiserfs-stat.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-stat.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stat.c' object='debugfs_reiserfs-stat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-stat.o `test -f 'stat.c' || echo '$(srcdir)/'`stat.c debugfs_reiserfs-stat.obj: stat.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-stat.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-stat.Tpo" -c -o debugfs_reiserfs-stat.obj `if test -f 'stat.c'; then $(CYGPATH_W) 'stat.c'; else $(CYGPATH_W) '$(srcdir)/stat.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-stat.Tpo" "$(DEPDIR)/debugfs_reiserfs-stat.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-stat.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stat.c' object='debugfs_reiserfs-stat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-stat.obj `if test -f 'stat.c'; then $(CYGPATH_W) 'stat.c'; else $(CYGPATH_W) '$(srcdir)/stat.c'; fi` debugfs_reiserfs-corruption.o: corruption.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-corruption.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-corruption.Tpo" -c -o debugfs_reiserfs-corruption.o `test -f 'corruption.c' || echo '$(srcdir)/'`corruption.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-corruption.Tpo" "$(DEPDIR)/debugfs_reiserfs-corruption.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-corruption.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='corruption.c' object='debugfs_reiserfs-corruption.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-corruption.o `test -f 'corruption.c' || echo '$(srcdir)/'`corruption.c debugfs_reiserfs-corruption.obj: corruption.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-corruption.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-corruption.Tpo" -c -o debugfs_reiserfs-corruption.obj `if test -f 'corruption.c'; then $(CYGPATH_W) 'corruption.c'; else $(CYGPATH_W) '$(srcdir)/corruption.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-corruption.Tpo" "$(DEPDIR)/debugfs_reiserfs-corruption.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-corruption.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='corruption.c' object='debugfs_reiserfs-corruption.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-corruption.obj `if test -f 'corruption.c'; then $(CYGPATH_W) 'corruption.c'; else $(CYGPATH_W) '$(srcdir)/corruption.c'; fi` debugfs_reiserfs-scan.o: scan.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-scan.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-scan.Tpo" -c -o debugfs_reiserfs-scan.o `test -f 'scan.c' || echo '$(srcdir)/'`scan.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-scan.Tpo" "$(DEPDIR)/debugfs_reiserfs-scan.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-scan.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan.c' object='debugfs_reiserfs-scan.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-scan.o `test -f 'scan.c' || echo '$(srcdir)/'`scan.c debugfs_reiserfs-scan.obj: scan.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-scan.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-scan.Tpo" -c -o debugfs_reiserfs-scan.obj `if test -f 'scan.c'; then $(CYGPATH_W) 'scan.c'; else $(CYGPATH_W) '$(srcdir)/scan.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-scan.Tpo" "$(DEPDIR)/debugfs_reiserfs-scan.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-scan.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan.c' object='debugfs_reiserfs-scan.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-scan.obj `if test -f 'scan.c'; then $(CYGPATH_W) 'scan.c'; else $(CYGPATH_W) '$(srcdir)/scan.c'; fi` debugfs_reiserfs-recover.o: recover.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-recover.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-recover.Tpo" -c -o debugfs_reiserfs-recover.o `test -f 'recover.c' || echo '$(srcdir)/'`recover.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-recover.Tpo" "$(DEPDIR)/debugfs_reiserfs-recover.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-recover.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='recover.c' object='debugfs_reiserfs-recover.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-recover.o `test -f 'recover.c' || echo '$(srcdir)/'`recover.c debugfs_reiserfs-recover.obj: recover.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-recover.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-recover.Tpo" -c -o debugfs_reiserfs-recover.obj `if test -f 'recover.c'; then $(CYGPATH_W) 'recover.c'; else $(CYGPATH_W) '$(srcdir)/recover.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/debugfs_reiserfs-recover.Tpo" "$(DEPDIR)/debugfs_reiserfs-recover.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-recover.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='recover.c' object='debugfs_reiserfs-recover.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-recover.obj `if test -f 'recover.c'; then $(CYGPATH_W) 'recover.c'; else $(CYGPATH_W) '$(srcdir)/recover.c'; fi` uninstall-info-am: install-man8: $(man8_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)" @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.8*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 8*) ;; \ *) ext='8' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \ done uninstall-man8: @$(NORMAL_UNINSTALL) @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.8*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 8*) ;; \ *) ext='8' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man8dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-data-local install-man install-exec-am: install-sbinPROGRAMS install-info: install-info-am install-man: install-man8 installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am uninstall-local uninstall-man \ uninstall-sbinPROGRAMS uninstall-man: uninstall-man8 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-sbinPROGRAMS ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-exec \ install-exec-am install-info install-info-am install-man \ install-man8 install-sbinPROGRAMS install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am uninstall-local uninstall-man \ uninstall-man8 uninstall-sbinPROGRAMS uninstall-debugreiserfs: if test -f $(DESTDIR)$(sbindir)/debugreiserfs; then \ rm -f $(DESTDIR)$(sbindir)/debugreiserfs; \ fi; install-debugreiserfs: if test -f $(DESTDIR)$(sbindir)/debugfs.reiserfs; then \ rm -f $(DESTDIR)$(sbindir)/debugreiserfs; \ ln $(DESTDIR)$(sbindir)/debugfs.reiserfs $(DESTDIR)$(sbindir)/debugreiserfs; \ fi; install-data-local: install-debugreiserfs uninstall-local: uninstall-debugreiserfs # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/utils/debugfs/corruption.c0000644000175300001440000011435110412227267016556 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "debugreiserfs.h" #include "misc/unaligned.h" #include "util/print.h" #include extern struct reiserfs_fsstat g_stat_info; int do_one_ih_corrupt (reiserfs_ih_t * ih, unsigned int nr_bytes); int do_one_ih_random_corrupt (reiserfs_ih_t * ih); void do_one_corruption_in_one_block (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, char * corruption_command); int corrupt_block_header (reiserfs_node_head_t * blkh, unsigned int offset, unsigned int bytes ); void do_one_block_random_corrupt (reiserfs_bh_t * bh); static int str2int (char * str, int * res) { int val; char * tmp; val = (int) strtol (str, &tmp, 0); if (tmp == str) /* could not convert string into a number */ return 0; *res = val; return 1; } static int get_rand (double min, double max) { /* srand (time (0)); */ int ret; ret = (int)(min + (int)((max - min + 1) * rand() / (RAND_MAX + 1.0))); if ((ret < min) || (ret > max)) misc_die ("get_rand failed: min %d, max %d, returned %d\n", (int)min, (int)max, ret); return ret; } static void edit_journal_params (reiserfs_journal_param_t * jp) { char str[256]; int num; printf ("Journal parameters:\n"); printf ("\tDevice: current: %x: new:", reiserfs_jp_get_dev (jp)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_jp_set_dev (jp, num); printf ("\tFirst block: current: %d: new:", reiserfs_jp_get_start (jp)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_jp_set_start (jp, num); printf ("\tSize: current: %d: new:", reiserfs_jp_get_size (jp)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_jp_set_size (jp, num); printf ("\tMagic number: current: %d: new:", reiserfs_jp_get_magic (jp)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_jp_set_magic (jp, num); printf ("\tMax transaction size: current: %d: new:", reiserfs_jp_get_tlen (jp)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_jp_set_tlen (jp, num); printf ("\tMax batch size: current: %d: new:", reiserfs_jp_get_max_batch (jp)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_jp_set_max_batch (jp, num); printf ("\tMax commit age: current: %d: new:", reiserfs_jp_get_commit_age (jp)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_jp_set_commit_age (jp, num); } /* this allows to edit all super block fields */ static void edit_super_block (reiserfs_filsys_t * fs) { char str[256]; int num; /* bs_block_count */ printf ("\tBlock count: current: %u: new:", reiserfs_sb_get_blocks (fs->fs_ondisk_sb)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_sb_set_blocks (fs->fs_ondisk_sb, num); /* sb_free_blocks */ printf ("\tFree block count: current: %u: new:", reiserfs_sb_get_free (fs->fs_ondisk_sb)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_sb_set_free (fs->fs_ondisk_sb, num); /* sb_root_block */ printf ("\tRoot block: current: %u: new:", reiserfs_sb_get_root (fs->fs_ondisk_sb)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_sb_set_root (fs->fs_ondisk_sb, num); /* sb_journal */ edit_journal_params (reiserfs_sb_jp (fs->fs_ondisk_sb)); /* sb_blocksize */ printf ("\tBlocksize: current: %u: new:", reiserfs_sb_get_blksize (fs->fs_ondisk_sb)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_sb_set_blksize (fs->fs_ondisk_sb, num); /* sb_oid_maxsize */ printf ("\tMax objectid size: current: %u: new:", reiserfs_sb_get_mapmax (fs->fs_ondisk_sb)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_sb_set_mapmax (fs->fs_ondisk_sb, num); /* sb_oid_cursize */ printf ("\tCur objectid size: current: %u: new:", reiserfs_sb_get_mapcur (fs->fs_ondisk_sb)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_sb_set_mapcur (fs->fs_ondisk_sb, num); /* sb_state */ printf ("\tUmount state: current: %u: new:", reiserfs_sb_get_umount (fs->fs_ondisk_sb)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_sb_set_umount (fs->fs_ondisk_sb, num); /* char s_magic [10]; */ printf ("\tMagic: current: \"%s\": new:", fs->fs_ondisk_sb->s_v1.s_magic); fgets(str, sizeof(str), stdin); if (strcmp (str, "\n")) strncpy (fs->fs_ondisk_sb->s_v1.s_magic, str, strlen(str) > 10 ? 10 : strlen(str)); /* __u16 sb_fsck_state; */ printf ("\tFielsystem state: current: %u: new:", reiserfs_sb_get_state (fs->fs_ondisk_sb)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_sb_set_state (fs->fs_ondisk_sb, num); /* __u32 sb_hash_function_code; */ printf ("\tHash code: current: %u: new (tea %d, r5 %d, rupasov %d):", reiserfs_sb_get_hash (fs->fs_ondisk_sb), REISERFS_HASH_TEA, REISERFS_HASH_R5, REISERFS_HASH_YURA); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_sb_set_hash (fs->fs_ondisk_sb, num); /* __u16 sb_tree_height; */ printf ("\tTree height: current: %u: new:", reiserfs_sb_get_height (fs->fs_ondisk_sb)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_sb_set_height (fs->fs_ondisk_sb, num); /* __u16 sb_bmap_nr; */ printf ("\tNumber of bitmaps: current: %u: new:", reiserfs_sb_get_bmaps (fs->fs_ondisk_sb)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_sb_set_bmaps (fs->fs_ondisk_sb, num); /* __u16 sb_version; */ printf ("\tFilesystem format: current: %u: new:", le16_to_cpu (fs->fs_ondisk_sb->s_v1.sb_version)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_sb_set_version (fs->fs_ondisk_sb, num); /* __u16 sb_reserved_for_journal; */ printf ("\tSpace reserved for journal: current: %u: new:", reiserfs_sb_get_reserved (fs->fs_ondisk_sb)); fgets(str, sizeof(str), stdin); if (str2int (str, &num)) reiserfs_sb_set_reserved (fs->fs_ondisk_sb, num); reiserfs_node_print (stdout, fs, fs->fs_super_bh); if (util_user_confirmed (stderr, "Is this ok ? [N/Yes]: ", "Yes\n")) { reiserfs_buffer_mkdirty (fs->fs_super_bh); reiserfs_buffer_write (fs->fs_super_bh); } } static void corrupt_clobber_hash (char * name, reiserfs_ih_t * ih, reiserfs_deh_t * deh) { printf ("\tCorrupting deh_offset of entry \"%s\" of [%u %u]\n", name, reiserfs_key_get_did (&ih->ih_key), reiserfs_key_get_oid (&ih->ih_key)); reiserfs_deh_set_off (deh, 700); } /* this reads list of desired corruptions from stdin and perform the corruptions. Format of that list: A hash_code C name objectid - 'C'ut entry 'name' from directory item with 'objectid' H name objectid - clobber 'H'hash of entry 'name' of directory 'objectid' I item_num pos_in_item make pos_in_item-th slot of extent item to point out of device O item_num - destroy item 'O'rder - make 'item_num'-th to have key bigger than 'item_num' + 1-th item D item_num - 'D'elete item_num-th item S item_num value - change file size (item_num-th item must be stat data) F item_num value - change sd_fdb of stat data J item_num objectid E name objectid new - change entry's deh_objectid to new P - print the block B offset bytes_to_corrupt - corrupt bytes_to_corrupt bytes in block header, start from offset */ void do_corrupt_one_block (reiserfs_filsys_t * fs, char * fline) { reiserfs_bh_t * bh; char line[256]; size_t n = 0; unsigned long block; block = certain_block (fs); printf ("block = %lu\n", block); if (block == fs->fs_super_bh->b_blocknr) { edit_super_block (fs); return; } if (!fs->fs_bitmap2) { reiserfs_bh_t * bm_bh; unsigned long bm_block; if (reiserfs_bitmap_spread (fs)) bm_block = ( block / (fs->fs_blocksize * 8) ) ? (block / (fs->fs_blocksize * 8)) * (fs->fs_blocksize * 8) : fs->fs_super_bh->b_blocknr + 1; else bm_block = fs->fs_super_bh->b_blocknr + 1 + (block / (fs->fs_blocksize * 8)); bm_bh = reiserfs_buffer_read (fs->fs_dev, bm_block, fs->fs_blocksize); if (bm_bh) { if ( misc_test_bit((block % (fs->fs_blocksize * 8)), bm_bh->b_data) ) fprintf (stderr, "%lu is used in ondisk bitmap\n", block); else fprintf (stderr, "%lu is free in ondisk bitmap\n", block); reiserfs_buffer_close (bm_bh); } } else { if (reiserfs_bitmap_test_bit (fs->fs_bitmap2, block)) fprintf (stderr, "%lu is used in ondisk bitmap\n", block); else fprintf (stderr, "%lu is free in ondisk bitmap\n", block); } /* READ block */ bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize); if (!bh) { printf ("corrupt_one_block: reiserfs_buffer_read fialed\n"); return; } if (reiserfs_node_type (bh) != NT_LEAF) { printf ("Can not corrupt not a leaf node\n"); reiserfs_buffer_close (bh); return; } printf ("Corrupting block %lu..\n", bh->b_blocknr); if (data(fs)->log_file_name) { printf ("Log file : %s\n", data(fs)->log_file_name); } else { printf ("No Log file specified\n"); } if (fline != NULL) { do_one_corruption_in_one_block (fs, bh, fline); if ((data(fs)->log_file_name) && (data(fs)->log)) { fprintf (data(fs)->log, "%lu\n", block); fprintf (data(fs)->log, "%s\n", fline); } } else { /* Get list of corruptions from stdin */ while (fgets(line, sizeof(line), stdin)) { if ( line [0] == '\n' ) { n = 0; break; } do_one_corruption_in_one_block (fs, bh, line); if ((data(fs)->log_file_name) && (data(fs)->log)) { fprintf (data(fs)->log, "%lu\n", block); fprintf (data(fs)->log, "%s\n", line); } line[0] = '\0'; n = 0; } } printf ("Done\n"); reiserfs_buffer_write(bh); reiserfs_buffer_close (bh); return; } void do_one_corruption_in_one_block (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, char * corruption_command) { int i, j; reiserfs_ih_t * ih; int item_num; int item_numbers; int bytes_to_corrupt; char code, name [100]; __u32 objectid, new_objectid; int value; int hash_code; unsigned int pos_in_item; int type, format; printf ("corruption_command : %s", corruption_command); switch (corruption_command [0]) { case '#': case '\n': break; case '?': printf ("A hash_code - reset hAsh code in super block\n" "T item_num type (0, 1, 2, 3) format (0, 1)\n" "C name objectid - Cut entry 'name' from directory item with 'objectid'\n" "H name objectid - clobber Hash of entry 'name' of directory 'objectid'\n" "I item_num pos_in_item make pos_in_tem-th slot of Indirect item to point out of device\n" "O item_num - destroy item Order - make 'item_num'-th to have key bigger than 'item_num' + 1-th item\n" "D item_num - Delete item_num-th item\n" "S item_num value - change file Size (item_num-th item must be stat data)\n" "F item_num value - change sd_First_direct_byte of stat data\n" "J item_num objectid - set 'obJectid' of 'item_num'-th item\n" "E name objectid objectid - set deh_objectid of an entry to objectid\n" "N item_numbers bytes_to_corrupt - corrupt bytes_to_corrupt in number of bytes in item_numbers items\n" "B offset bytes_to_corrupt - corrupt bytes_to_corrupt in block_header, start corruption from offset\n"); break; case 'P': reiserfs_node_print (stderr, fs, bh, 3, -1, -1); break; case 'A': /* corrupt hash record in super block */ if (sscanf (corruption_command, "%c %d\n", &code, &hash_code) != 2) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } reiserfs_warning (stderr, "Changing %s to %s\n", reiserfs_hash_name (reiserfs_sb_get_hash (fs->fs_ondisk_sb)), reiserfs_hash_name (hash_code)); reiserfs_sb_set_hash (fs->fs_ondisk_sb, hash_code); break; case 'C': /* cut entry */ case 'H': /* make hash wrong */ if (sscanf (corruption_command, "%c %s %u\n", &code, name, &objectid) != 3) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } ih = reiserfs_ih_at (bh, 0); for (i = 0; i < reiserfs_nh_get_items (NODE_HEAD (bh)); i ++, ih ++) { reiserfs_deh_t * deh; /* look for property objectid */ if (reiserfs_key_get_oid (&ih->ih_key) != objectid || !reiserfs_ih_dir (ih)) continue; deh = reiserfs_deh (bh, ih); for (j = 0; j < reiserfs_ih_get_entries (ih); j ++, deh ++) { /* look for proper entry */ if (reiserfs_direntry_name_len (ih, deh, j) == (int)strlen (name) && !strncmp (name, reiserfs_deh_name (deh, j), strlen (name))) break; } if (j == reiserfs_ih_get_entries (ih)) { printf ("Can't find entry %s\n", name); exit (1); } switch (code) { case 'H' : /* clobber hash */ corrupt_clobber_hash (name, ih, deh); break; case 'C' : /* cut entry */ reiserfs_leaf_delete_entry (fs, bh, i, j, 1); break; default: printf ("Unknown command found\n"); } } if (!REISERFS_NODE_INTREE (bh)) { printf ("NOTE: block is deleted from the tree\n"); exit (0); } break; case 'E': /* set objectid : used to simulate objectid sharing problem */ if (sscanf (corruption_command, "%c %s %u %d\n", &code, name, &objectid, &new_objectid) != 4) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } ih = reiserfs_ih_at (bh, 0); for (i = 0; i < reiserfs_nh_get_items (NODE_HEAD (bh)); i ++, ih ++) { reiserfs_deh_t * deh; /* look for property objectid */ if (reiserfs_key_get_oid (&ih->ih_key) != objectid || !reiserfs_ih_dir (ih)) continue; deh = reiserfs_deh (bh, ih); reiserfs_deh_set_obid (deh, new_objectid); break; } break; case 'T': /* set type of item */ if (sscanf (corruption_command, "%c %d %d %d\n", &code, &item_num, &type, &format) != 4) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) { printf ("Wrong format \'%c\', wrong item_num \n", corruption_command [0]); return; } ih = reiserfs_ih_at (bh, item_num); reiserfs_ih_set_format (ih, format); reiserfs_key_set_type (format, &ih->ih_key, type); break; case 'J': /* set objectid : used to simulate objectid sharing problem */ if (sscanf (corruption_command, "%c %d %d\n", &code, &item_num, &objectid) != 3) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) { printf ("Wrong format \'%c\', wrong item_num \n", corruption_command [0]); return; } ih = reiserfs_ih_at (bh, item_num); reiserfs_key_set_oid (&ih->ih_key, objectid); break; case 'I': /* break unformatted node pointer */ if (sscanf (corruption_command, "%c %d %u\n", &code, &item_num, &pos_in_item) != 3) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) { printf ("Wrong format \'%c\', wrong item_num \n", corruption_command [0]); return; } ih = reiserfs_ih_at (bh, item_num); if (!reiserfs_ih_ext (ih) || pos_in_item >= reiserfs_ext_count (ih)) { reiserfs_warning (stderr, "Not an extent item or there is " "not so many unfm ptrs in it\n"); return; } d32_put((__u32 *)reiserfs_item_by_ih (bh, ih), pos_in_item, reiserfs_sb_get_blocks (fs->fs_ondisk_sb) + 100); break; case 'D': /* delete item */ if (sscanf (corruption_command, "%c %d\n", &code, &item_num) != 2) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) { printf ("Wrong format \'%c\', wrong item_num \n", corruption_command [0]); return; } reiserfs_leaf_delete_item (fs, bh, item_num); break; case 'O': /* make item out of order */ { reiserfs_key_t * key; if (sscanf (corruption_command, "%c %d\n", &code, &item_num) != 2) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) { printf ("Wrong format \'%c\', wrong item_num " "\n", corruption_command [0]); return; } /* destroy item order */ if (item_num == reiserfs_nh_get_items (NODE_HEAD (bh)) - 1) { printf ("can not destroy order\n"); return; } ih = reiserfs_ih_at (bh, item_num); key = &(ih + 1)->ih_key; reiserfs_key_set_did (&ih->ih_key, reiserfs_key_get_did (key) + 1); break; } case 'S': /* corrupt st_size */ { /* fixme: old stat data only */ reiserfs_sd_v1_t * sd; if (sscanf (corruption_command, "%c %d %d\n", &code, &item_num, &value) != 3) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) { printf ("Wrong format \'%c\', wrong item_num " "\n", corruption_command [0]); return; } ih = reiserfs_ih_at (bh, item_num); sd = (reiserfs_sd_v1_t *)reiserfs_item_by_ih (bh, ih); reiserfs_warning (stderr, "Changing sd_size of %k " "from %d to %d\n", &ih->ih_key, reiserfs_sd_v1_size(sd), value); reiserfs_set_sd_v1_size( sd, value ); break; } case 'F': /* st_fdb */ { /* fixme: old stat data only */ reiserfs_sd_v1_t * sd; if (sscanf (corruption_command, "%c %d %d\n", &code, &item_num, &value) != 3) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) { printf ("Wrong format \'%c\', wrong item_num " "\n", corruption_command [0]); return; } ih = reiserfs_ih_at (bh, item_num); sd = (reiserfs_sd_v1_t *)reiserfs_item_by_ih (bh, ih); reiserfs_warning (stderr, "Changing " "sd_fdb of %k from " "%d to %d\n", &ih->ih_key, reiserfs_sd_v1_fdb(sd), value); reiserfs_set_sd_v1_fdb( sd, value ); break; } case 'N': /* corrupt N number of items */ if (sscanf (corruption_command, "%c %d %d\n", &code, &item_numbers, &bytes_to_corrupt) != 3) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } if (item_numbers > reiserfs_nh_get_items (NODE_HEAD (bh))) { printf ("Wrong item_numbers %d expected not more then %d\n", item_numbers, reiserfs_nh_get_items (NODE_HEAD (bh))); return; } for (i = 0; i < item_numbers; i++) { printf ("Do corruptions : %d item header; \n", i ); ih = reiserfs_ih_at (bh, i); do_one_ih_corrupt (ih, bytes_to_corrupt); printf ("Ok\n"); } break; case 'B' : { reiserfs_node_head_t * blkh; unsigned int offset; if (sscanf (corruption_command, "%c %d %d\n", &code, &offset, &bytes_to_corrupt) != 3) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } blkh = NODE_HEAD (bh); corrupt_block_header (blkh, offset, bytes_to_corrupt); break; } default: printf ("Unknown command found\n"); } reiserfs_buffer_mkdirty (bh); return; } /* corrupt first nr_bytes bytes in item header */ int do_one_ih_corrupt (reiserfs_ih_t * ih, unsigned int nr_bytes) { if (nr_bytes > REISERFS_IH_SIZE) { printf ("Bad byte number %u expected not more then %lu\n", nr_bytes, (unsigned long)REISERFS_IH_SIZE); exit (1); } if (memset ((char *)ih, 0, nr_bytes) != ih ) { perror ("do_one_ih_corrupt: memset failed"); exit (1); } if ((data(fs)->log_file_name) && (data(fs)->log)) fprintf (data(fs)->log, "\tfirst %u bytes corrupted\n", nr_bytes); printf ("\tfirst %u bytes corrupted\n", nr_bytes); return 0; } /* item header random corruption */ int do_one_ih_random_corrupt (reiserfs_ih_t * ih) { unsigned int i; unsigned int from; unsigned int count; from = get_rand (0, REISERFS_IH_SIZE - 1); count = get_rand (1, REISERFS_IH_SIZE); if (from + count > REISERFS_IH_SIZE) count = REISERFS_IH_SIZE - from; for (i = from; i < from + count; i ++) ((char *)ih)[i] = get_rand(0, 255); if ((data(fs)->log_file_name) && (data(fs)->log)) fprintf (data(fs)->log, "\tfrom %u ( %u )\n", from, count); printf ("\tfrom %u ( %u )\n", from, count); return 0; } /* Corrupt n bytes in block header */ int corrupt_block_header (reiserfs_node_head_t * blkh, unsigned int offset, unsigned int bytes) { if ((offset + bytes) > REISERFS_NODEH_SIZE) { printf ("Bad offset number: %u or bad bytes number: %u, " "the suumary value expected not more then %lu\n", offset, bytes, (unsigned long)REISERFS_NODEH_SIZE); exit (1); } if (memset ((char *)blkh, 0, bytes) != blkh ) { perror ("corrupt_block_head: memset failed"); exit (1); } printf ("offset : %u, corrupt %u bytes\n", offset, bytes); return 0; } /* corrupt random number of bytes within block header started from random offset */ void do_one_blkh_random_corrupt (reiserfs_bh_t * bh) { reiserfs_node_head_t * blkh; unsigned int from; unsigned int count; unsigned int i; from = get_rand (0, REISERFS_NODEH_SIZE - 1); count = get_rand (1, REISERFS_NODEH_SIZE); blkh = NODE_HEAD (bh); if (from + count > REISERFS_NODEH_SIZE) count = REISERFS_NODEH_SIZE - from; for (i = from; i < from + count; i ++) ((char *)blkh)[i] = get_rand(0, 255); if ((data(fs)->log_file_name) && (data(fs)->log)) { fprintf (data(fs)->log, "# : %lu # ", bh->b_blocknr); fprintf (data(fs)->log, "from %u (%u)\n", from, count); } printf ("# : %lu # ", bh->b_blocknr); printf ("from %u (%u)\n", from, count); } void do_leaves_corruption (reiserfs_filsys_t * fs, unsigned long nr_leaves_cr) { reiserfs_bh_t * bh; unsigned long nr_leaves = 0; unsigned int i, should_be_corrupted; srand (time (0)); printf ("%lu leaves will be corrupted\n", nr_leaves_cr); if ((data(fs)->log_file_name) && (data(fs)->log)) { fprintf (data(fs)->log, "Block headers in %lu leaves " "will be corrupted\n", nr_leaves_cr); } if (reiserfs_bitmap_open (fs) < 0) reiserfs_exit (1, "Could not open ondisk bitmap"); for (i = 0; (i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) && nr_leaves < nr_leaves_cr; i ++) { if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i)) continue; bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize); if (!bh) { reiserfs_warning (stderr, "could not read " "block %lu\n", i); continue; } if (reiserfs_node_type (bh) != NT_LEAF) { reiserfs_buffer_close (bh); continue; } if ((!reiserfs_leaf_head (bh)) || (reiserfs_journal_block (fs, i))) { reiserfs_buffer_close (bh); continue; } should_be_corrupted = (unsigned int)get_rand ((double)0, (double)1); if (should_be_corrupted == 0) { reiserfs_buffer_close (bh); continue; } do_one_blkh_random_corrupt (bh); /* do_one_block_random_corrupt (bh); */ reiserfs_buffer_mkdirty (bh); reiserfs_buffer_write(bh); reiserfs_buffer_close (bh); nr_leaves ++; } if ((data(fs)->log_file_name) && (data(fs)->log)) { fprintf (data(fs)->log, "%lu leaves WERE corrupted\n", nr_leaves); } printf ("%lu leaves WERE corrupted\n", nr_leaves); reiserfs_bitmap_close (fs); return; } void do_one_block_random_corrupt (reiserfs_bh_t * bh) { unsigned int from = get_rand (0, bh->b_size - 1); unsigned int count = get_rand (1, bh->b_size); unsigned int i; if (from + count > bh->b_size) count = bh->b_size - from; for (i = from; i < from + count; i ++) ((char *)bh->b_data)[i] = get_rand(0, 255); if ((data(fs)->log_file_name) && (data(fs)->log)) { fprintf (data(fs)->log, "# block %lu: ", bh->b_blocknr); fprintf (data(fs)->log, "from %u ( %u )\n", from, count); } printf ("# block %lu: ", bh->b_blocknr); printf ("from %u ( %u )\n", from, count); } void do_bitmap_corruption (reiserfs_filsys_t * fs) { unsigned long first = fs->fs_super_bh->b_blocknr + 1; unsigned long nr_bitmap_to_corrupt; unsigned long block, bmap_nr;; reiserfs_bh_t * bh; unsigned int i; bmap_nr = reiserfs_bmap_nr( reiserfs_sb_get_blocks(fs->fs_ondisk_sb), fs->fs_blocksize); nr_bitmap_to_corrupt = (unsigned long)get_rand (1, bmap_nr - 1); if ((data(fs)->log_file_name) && (data(fs)->log)) { fprintf (data(fs)->log, "%lu bitmaps will be " "corrupted\n", nr_bitmap_to_corrupt); } printf ("%lu bitmaps will be corrupted\n", nr_bitmap_to_corrupt); for (i = 0; i < nr_bitmap_to_corrupt; i ++ ) { block = ( i == 0 ) ? first : fs->fs_blocksize * 8 * i; bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize); if (!bh) { printf ("do_bitmap_corruption: reiserfs_buffer_read " "failed for bitmap %d: %lu\n", i, block); exit (1); } do_one_block_random_corrupt (bh); reiserfs_buffer_mkdirty (bh); reiserfs_buffer_write(bh); reiserfs_buffer_close (bh); } } /* corrupt the random number of item headers in random number of leaves */ void do_ih_random_corrupt (reiserfs_filsys_t * fs, unsigned long nr_leaves_cr) { unsigned int nr_ih_cr; unsigned int i, j; reiserfs_bh_t * bh; reiserfs_ih_t * ih; unsigned long nr_leaves = 0; unsigned int should_be_corrupted = 0; srand (time (0)); printf ("item headers in %lu leaves will be corrupted\n", nr_leaves_cr); if ((data(fs)->log_file_name) && (data(fs)->log)) { fprintf (data(fs)->log, "item headers in %lu leaves will " "be corrupted\n", nr_leaves_cr); } if (reiserfs_bitmap_open (fs) < 0) reiserfs_exit (1, "Could not open ondisk bitmap"); for (i = 0; (i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) && nr_leaves < nr_leaves_cr; i ++) { if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i)) continue; bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize); if (!bh) { reiserfs_warning (stderr, "could not read " "block %lu\n", i); continue; } if (reiserfs_node_type (bh) != NT_LEAF) { reiserfs_buffer_close (bh); continue; } if ((!reiserfs_leaf_head (bh)) || (reiserfs_journal_block (fs, i))) { reiserfs_buffer_close (bh); continue; } should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1); if (should_be_corrupted == 0) { reiserfs_buffer_close (bh); continue; } nr_ih_cr = get_rand (1, reiserfs_nh_get_items (NODE_HEAD (bh))); for (j = 0; j < nr_ih_cr; j ++ ) { should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1); if (should_be_corrupted == 0) continue; if ((data(fs)->log_file_name) && (data(fs)->log)) fprintf (data(fs)->log, "# block %lu , " "item header %d\n", bh->b_blocknr, j); printf ("# block %lu , item header %d\n", bh->b_blocknr, j); ih = reiserfs_ih_at (bh, j); do_one_ih_random_corrupt (ih); } reiserfs_buffer_mkdirty (bh); reiserfs_buffer_write(bh); reiserfs_buffer_close (bh); nr_leaves ++ ; } if ((data(fs)->log_file_name) && (data(fs)->log)) fprintf (data(fs)->log, "item headers in %lu leaves " "WERE corrupted\n", nr_leaves); printf ("item headers in %lu leaves WERE corrupted\n", nr_leaves); reiserfs_bitmap_close (fs); } /* corrupt item */ void do_one_item_random_corrupt (reiserfs_bh_t * bh, reiserfs_ih_t * ih) { unsigned int i; unsigned int from; unsigned int count; char * p; p = (char *)reiserfs_item_by_ih(bh, ih); from = get_rand (0, reiserfs_ih_get_len(ih) - 1); count = get_rand (1, reiserfs_ih_get_len(ih)); if (from + count > reiserfs_ih_get_len(ih)) count = reiserfs_ih_get_len(ih) - from; for (i = from; i < from + count; i ++) ((char *)p)[i] = get_rand(0, 255); if ((data(fs)->log_file_name) && (data(fs)->log)) fprintf (data(fs)->log, "item body \tfrom %u ( %u )\n", from, count); printf ("item body \tfrom %u ( %u )\n", from, count); return ; } /* corrupt the random number of directory items in random number of leaves */ void do_dir_random_corrupt (reiserfs_filsys_t * fs, unsigned long nr_leaves_cr) { unsigned int nr_ih_cr; unsigned int i, j; reiserfs_bh_t * bh; reiserfs_ih_t * ih; unsigned long nr_leaves = 0; unsigned int should_be_corrupted = 0; srand (time (0)); printf ("DIR items in %lu leaves will be corrupted\n", nr_leaves_cr); if ((data(fs)->log_file_name) && (data(fs)->log)) { fprintf (data(fs)->log, "DIR items in %lu leaves " "will be corrupted\n", nr_leaves_cr); } if (reiserfs_bitmap_open (fs) < 0) reiserfs_exit (1, "Could not open ondisk bitmap"); for (i = 0; (i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) && nr_leaves < nr_leaves_cr; i ++) { if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i)) continue; bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize); if (!bh) { reiserfs_warning (stderr, "could not read " "block %lu\n", i); continue; } if (reiserfs_node_type (bh) != NT_LEAF) { reiserfs_buffer_close (bh); continue; } if ((!reiserfs_leaf_head (bh)) || (reiserfs_journal_block (fs, i))) { reiserfs_buffer_close (bh); continue; } should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1); if (should_be_corrupted == 0) { reiserfs_buffer_close (bh); continue; } /* get next item, look is it a DIR */ nr_ih_cr = get_rand (1, reiserfs_nh_get_items (NODE_HEAD (bh))); for (j = 0; j < nr_ih_cr; j ++ ) { should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1); if (should_be_corrupted == 0) continue; if ((data(fs)->log_file_name) && (data(fs)->log)) fprintf (data(fs)->log, "# block %lu , item " "%d\n", bh->b_blocknr, j); printf ("# block %lu , item %d\n", bh->b_blocknr, j); ih = reiserfs_ih_at (bh, j); if (reiserfs_key_get_type (&ih->ih_key) != TYPE_DIRENTRY) { continue; } do_one_item_random_corrupt (bh, ih); } reiserfs_buffer_mkdirty (bh); reiserfs_buffer_write(bh); reiserfs_buffer_close (bh); nr_leaves ++ ; } if ((data(fs)->log_file_name) && (data(fs)->log)) fprintf (data(fs)->log, "DIR items in %lu leaves WERE " "corrupted\n", nr_leaves); printf ("DIR items in %lu leaves WERE corrupted\n", nr_leaves); reiserfs_bitmap_close (fs); } /* corrupt the random number of stat data items in random number of leaves */ void do_sd_random_corrupt (reiserfs_filsys_t * fs, unsigned long nr_leaves_cr) { unsigned int nr_ih_cr; unsigned int i, j; reiserfs_bh_t * bh; reiserfs_ih_t * ih; unsigned long nr_leaves = 0; unsigned int should_be_corrupted = 0; srand (time (0)); printf ("SD items in %lu leaves will be corrupted\n", nr_leaves_cr); if ((data(fs)->log_file_name) && (data(fs)->log)) { fprintf (data(fs)->log, "SD items in %lu leaves will " "be corrupted\n", nr_leaves_cr); } if (reiserfs_bitmap_open (fs) < 0) reiserfs_exit (1, "Could not open ondisk bitmap"); for (i = 0; (i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) && nr_leaves < nr_leaves_cr; i ++) { if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i)) continue; bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize); if (!bh) { reiserfs_warning (stderr, "could not read block %lu\n", i); continue; } if (reiserfs_node_type (bh) != NT_LEAF) { reiserfs_buffer_close (bh); continue; } if ((!reiserfs_leaf_head (bh)) || (reiserfs_journal_block (fs, i))) { reiserfs_buffer_close (bh); continue; } should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1); if (should_be_corrupted == 0) { reiserfs_buffer_close (bh); continue; } /* get next item, look is it a SD */ nr_ih_cr = get_rand (1, reiserfs_nh_get_items (NODE_HEAD (bh))); for (j = 0; j < nr_ih_cr; j ++ ) { should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1); if (should_be_corrupted == 0) continue; if ((data(fs)->log_file_name) && (data(fs)->log)) fprintf (data(fs)->log, "# block %lu , item " "%d\n", bh->b_blocknr, j); printf ("# block %lu , item %d\n", bh->b_blocknr, j); ih = reiserfs_ih_at (bh, j); if (reiserfs_key_get_type (&ih->ih_key) != TYPE_STAT_DATA) { continue; } do_one_item_random_corrupt (bh, ih); } reiserfs_buffer_mkdirty (bh); reiserfs_buffer_write(bh); reiserfs_buffer_close (bh); nr_leaves ++ ; } if ((data(fs)->log_file_name) && (data(fs)->log)) fprintf (data(fs)->log, "SD items in %lu leaves " "WERE corrupted\n", nr_leaves); printf ("SD items in %lu leaves WERE corrupted\n", nr_leaves); reiserfs_bitmap_close (fs); } /* corrupt the random number of indirect items in random number of leaves */ void do_ext_random_corrupt (reiserfs_filsys_t * fs, unsigned long nr_leaves_cr) { unsigned int nr_ih_cr; unsigned int i, j; reiserfs_bh_t * bh; reiserfs_ih_t * ih; unsigned long nr_leaves = 0; unsigned int should_be_corrupted = 0; srand (time (0)); printf ("EXT items in %lu leaves will be corrupted\n", nr_leaves_cr); if ((data(fs)->log_file_name) && (data(fs)->log)) { fprintf (data(fs)->log, "EXT items in %lu leaves will " "be corrupted\n", nr_leaves_cr); } if (reiserfs_bitmap_open (fs) < 0) reiserfs_exit (1, "Could not open ondisk bitmap"); for (i = 0; (i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) && nr_leaves < nr_leaves_cr; i ++) { if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i)) continue; bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize); if (!bh) { reiserfs_warning (stderr, "could not read " "block %lu\n", i); continue; } if (reiserfs_node_type (bh) != NT_LEAF) { reiserfs_buffer_close (bh); continue; } if ((!reiserfs_leaf_head (bh)) || (reiserfs_journal_block (fs, i))) { reiserfs_buffer_close (bh); continue; } should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1); if (should_be_corrupted == 0) { reiserfs_buffer_close (bh); continue; } /* get next item, look is it an EXT */ nr_ih_cr = get_rand (1, reiserfs_nh_get_items (NODE_HEAD (bh))); for (j = 0; j < nr_ih_cr; j ++ ) { should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1); if (should_be_corrupted == 0) continue; ih = reiserfs_ih_at (bh, j); if (reiserfs_key_get_type (&ih->ih_key) != TYPE_EXTENT) { continue; } if ((data(fs)->log_file_name) && (data(fs)->log)) fprintf (data(fs)->log, "# block %lu , item " "%d\n", bh->b_blocknr, j); printf ("# block %lu , item %d\n", bh->b_blocknr, j); do_one_item_random_corrupt (bh, ih); } reiserfs_buffer_mkdirty (bh); reiserfs_buffer_write(bh); reiserfs_buffer_close (bh); nr_leaves ++ ; } if ((data(fs)->log_file_name) && (data(fs)->log)) fprintf (data(fs)->log, "EXT items in %lu leaves " "WERE corrupted\n", nr_leaves); printf ("EXT items in %lu leaves WERE corrupted\n", nr_leaves); reiserfs_bitmap_close (fs); } /* this reads list of desired corruptions from stdin and performs the corruptions. Format of that list: B - the random number of bitmap to be corrupted L nr_leaves - block headers in nr_leaves leaves to be corupted H nr_leaves - the random number of item headers in nr_leaves to be corrupted S nr_leaves - the random number of stat data items in nr_leaves to be corrupted D nr_leaves - the random number of directory items in nr_leaves to be corrupted I nr_leaves - the random number of extent items in nr_leaves to be corrupted */ void what_to_corrupt (reiserfs_filsys_t * fs, char * corruption_command) { unsigned long nr_leaves_cr; char code; switch (corruption_command [0]){ case 'B' : /* bitmap */ do_bitmap_corruption (fs); break; case 'L' : /* leaves */ if (sscanf (corruption_command, "%c %lu\n", &code, &nr_leaves_cr) != 2) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } do_leaves_corruption (fs, nr_leaves_cr); break; case 'H' : /* item headers */ if (sscanf (corruption_command, "%c %lu\n", &code, &nr_leaves_cr) != 2) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } do_ih_random_corrupt (fs, nr_leaves_cr); break; case 'D' : /* directory items */ if (sscanf (corruption_command, "%c %lu\n", &code, &nr_leaves_cr) != 2) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } do_dir_random_corrupt (fs, nr_leaves_cr); break; case 'S' : /* stat data items */ if (sscanf (corruption_command, "%c %lu\n", &code, &nr_leaves_cr) != 2) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } do_sd_random_corrupt (fs, nr_leaves_cr); break; case 'I' : /* extent items */ if (sscanf (corruption_command, "%c %lu\n", &code, &nr_leaves_cr) != 2) { printf ("Wrong format \'%c\'\n", corruption_command [0]); return; } do_ext_random_corrupt (fs, nr_leaves_cr); break; default : printf ("Unknown command specified\n"); } } void do_fs_random_corrupt (reiserfs_filsys_t * fs) { char line[256]; size_t n = 0; printf ("Corrupting fs. Please insert one of the following command\n" " B - the random number of bitmap to be corrupted\n" " L nr_leaves - block headers in nr_leaves leaves to be corupted\n" " H nr_leaves - the random number of item headers in nr_leaves to be corrupted\n" " S nr_leaves - the random number of stat data items in nr_leaves to be corrupted\n" " D nr_leaves - the random number of directory items in nr_leaves to be corrupted\n" " I nr_leaves - the random number of extent items in nr_leaves to be corrupted\n" ".. ->\n"); /* Get list of corruptions from stdin */ while (fgets(line, sizeof(line), stdin)) { if ( line [0] == '\n' ) { n = 0; break; } printf ("################## command : %s", line); if ((data(fs)->log_file_name) && (data(fs)->log)) { fprintf (data(fs)->log, "################## command : %s", line); } what_to_corrupt (fs, line); line[0] = '\0'; n = 0; } } /* Local variables: c-indentation-style: "K&R" mode-name: "LC" c-basic-offset: 4 tab-width: 4 fill-column: 80 End: */ reiserfsprogs-3.6.20/utils/debugfs/debugfs.reiserfs.80000644000175300001440000000577010412227267017543 00000000000000.\" -*- nroff -*- .\" Copyright 1996-2004 Hans Reiser. .\" .TH debugfs.reiserfs 8 "February 2004" "Reiserfsprogs 3.6.19" .SH NAME debugfs.reiserfs \- The debugging tool for the ReiserFS filesystem. .SH SYNOPSIS .B debugfs.reiserfs [ .B -dDJmoqpuSV ] [ .B -j \fIdevice ] [ .B -B \fIfile ] [ .B -1 \fIN ] .\" ] [ .\" .B -s .\" ] [ .I device .SH DESCRIPTION \fBdebugfs.reiserfs\fR sometimes helps to solve problems with reiserfs filesystems. When run without options it prints the super block of the ReiserFS filesystem found on the \fIdevice\fR. .TP .I device is the special file corresponding to the device (e.g /dev/hdXX for an IDE disk partition or /dev/sdXX for a SCSI disk partition). .SH OPTIONS .TP \fB-j\fR \fIdevice\fR prints the contents of the journal. The option -p allows it to pack the journal with other metadata into the archive. .TP \fB-J\fR prints the journal header. .TP .B -d prints the formatted nodes of the internal tree of the filesystem. .TP .B -D prints the formatted nodes of all used blocks of the filesystem. .TP .B -m prints the contents of the bitmap (slightly useful). .TP .B -o prints the objectid map (slightly useful). .TP \fB-B\fR \fIfile\fR takes the list of bad blocks stored in the internal ReiserFS tree and translates it into an ascii list written to the specified file. .TP \fB-1\fR \fIblocknumber\fR prints the specified block of the filesystem. .TP .\" \fB-s .\" scans the partition and prints a line when any kind of reiserfs .\" formatted nodes found. Can be used to find specific key in the filesystem. .\" .TP .B -p extracts the filesystem's metadata with \fBdebugfs.reiserfs\fR -p /dev/xxx | gzip -c > xxx.gz. None of your data are packed unless a filesystem corruption presents when the whole block having this corruption is packed. You send us the output, and we use it to create a filesystem with the same strucure as yours using \fBdebugfs.reiserfs -u\fR. When the data file is not too large, this usually allows us to quickly reproduce and debug the problem. .TP .B -u builds the ReiserFS filesystem image with gunzip -c xxx.gz | \fBdebugfs.reiserfs\fR -u /dev/image of the previously packed metadata with \fBdebugfs.reiserfs -p\fR. The result image is not the same as the original filesystem, because mostly only metadata were packed with \fBdebugfs.reiserfs -p\fR, but the filesystem structure is completely recreated. .TP .B -S When -S is not specified -p .\" and -s deals with blocks marked used in the filesystem bitmap only. With this option set \fBdebugfs.reiserfs\fR will work with the entire device. .TP .B -q When .\" -s or -p is in use, suppress showing the speed of progress. .SH AUTHOR This version of \fBdebugfs.reiserfs\fR has been written by Vitaly Fertman . .SH BUGS Please report bugs to the ReiserFS developers , providing as much information as possible--your hardware, kernel, patches, settings, all printed messages; check the syslog file for any related information. .SH SEE ALSO .BR fsck.reiserfs (8), .BR mkfs.reiserfs (8) reiserfsprogs-3.6.20/utils/debugfs/debugreiserfs.c0000644000175300001440000005032410412227267017202 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "debugreiserfs.h" #include "misc/unaligned.h" #include "misc/malloc.h" #include "util/misc.h" #include "util/print.h" #include #include #include reiserfs_filsys_t * fs; #define print_usage_and_exit() {\ fprintf (stderr, "Usage: %s [options] device\n\n\ Options:\n\ -d\t\tprint blocks details of the internal tree\n\ -D\t\tprint blocks details of all used blocks\n\ -B file\textract list of badblocks\n\ -m\t\tprint bitmap blocks\n\ -o\t\tprint objectid map\n\n\ -J\t\tprint journal header\n\ -j filename\n\t\tprint journal located on the device 'filename'\n\ \t\tstores the journal in the specified file 'filename.\n\ -p\t\tsend filesystem metadata to stdout\n\ -u\t\tread stdin and unpack the metadata\n\ -S\t\thandle all blocks, not only used\n\ -1 block\tblock to print\n\ -q\t\tno speed info\n\ -V\t\tprint version and exit\n\n", argv[0]);\ exit (16);\ } /* Undocumented options: -a map_file\n\tstore to the file the map of file. Is used with -n, -N, -r, -f\n -f \tprints the file map specified by -a.\n -n name\n\stcan device for specific name in reiserfs directories\n\ -N \tscan tree for specific key in reiserfs directories\n\ -k \tscan device either for specific key or for any metadata\n\ -r name\n\trecovers the file spacified by -a to the 'name' file.\n\ -S\t\tgo through whole device when running -p, -k or -n\n\ -U\t\tgo through unused blocks only when running -p, -k or -n\n\ -D\t\tprint blocks details scanning the device, not the tree as -d does\n\ -b bitmap_file\n\t\trunning -p, -k or -n read blocks marked in this bitmap only\n\ -C\tallow to change reiserfs metadata\n\ -J\tsearch block numbers in the journal\n\ -t\tstat the device\n\ -v\tverboes unpack, prints the block number of every block being unpacked\n\ -Z\tzero all data. To build a map of a file blocks by name: debugreiserfs device -a mapfile -n filename To build a map of a file blocks by key: debugreiserfs device -a mapfile -k To extract some: debugreiserfs device -a mapfile -r filename > backup */ #if 1 struct reiserfs_fsstat { int nr_internals; int nr_leaves; int nr_files; int nr_directories; int nr_unformatted; } g_stat_info; #endif static void print_disk_tree (reiserfs_filsys_t * fs, unsigned long block_nr) { reiserfs_bh_t * bh; int i, j, count; static int level = -1; if (level == -1) level = reiserfs_sb_get_height (fs->fs_ondisk_sb); bh = reiserfs_buffer_read (fs->fs_dev, block_nr, fs->fs_blocksize); if (!bh) { misc_die ("Could not read block %lu\n", block_nr); } level --; if (level < 1) misc_die ("level too small"); if (level != reiserfs_nh_get_level (NODE_HEAD (bh))) { printf ("%d expected, %d found in %lu\n", level, reiserfs_nh_get_level (NODE_HEAD (bh)), bh->b_blocknr); } if (reiserfs_int_head (bh)) { reiserfs_dc_t * dc; g_stat_info.nr_internals ++; reiserfs_node_print (stdout, fs, bh, data(fs)->options, -1, -1); dc = reiserfs_int_at (bh, 0); count = reiserfs_node_items(bh); for (i = 0; i <= count; i++, dc++) print_disk_tree (fs, reiserfs_dc_get_nr (dc)); } else if (reiserfs_leaf_head (bh)) { reiserfs_ih_t *ih; g_stat_info.nr_leaves ++; reiserfs_node_print (stdout, fs, bh, data(fs)->options, -1, -1); ih = reiserfs_ih_at (bh, 0); count = reiserfs_leaf_estimate_items(bh); for (i = 0; i < count; i++, ih++) { if (reiserfs_ih_ext(ih)) { __u32 * ind_item = (__u32 *)reiserfs_item_by_ih (bh, ih); for (j = 0; j < (int)reiserfs_ext_count (ih); j ++) { if (d32_get (ind_item, j)) { g_stat_info.nr_unformatted += 1; } } } } } else { reiserfs_node_print (stdout, fs, bh, data(fs)->options, -1, -1); reiserfs_warning (stdout, "print_disk_tree: bad block " "type (%b)\n", bh); } reiserfs_buffer_close (bh); level ++; } static void print_disk_blocks (reiserfs_filsys_t * fs) { int type; unsigned long done = 0, total; reiserfs_bh_t * bh; unsigned int j; total = reiserfs_bitmap_ones (input_bitmap(fs)); for (j = 0; j < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); j ++) { if (!reiserfs_bitmap_test_bit (input_bitmap (fs), j)) continue; if (!misc_test_bit(PRINT_QUIET, &data(fs)->options)) util_misc_progress (stderr, &done, total, 1, 0); bh = reiserfs_buffer_read (fs->fs_dev, j, fs->fs_blocksize); if (!bh) { reiserfs_warning (stderr, "could not read block %lu\n", j); continue; } type = reiserfs_node_type (bh); if (type != NT_UNKNOWN) { reiserfs_node_print (stdout, fs, bh, (1 << LP_LEAF_DETAILS) | (1 << LP_DIRECT_ITEMS), -1, -1); } if (type == NT_INTERNAL) g_stat_info.nr_internals ++; else if (type == NT_LEAF || type == NT_IH_ARRAY) g_stat_info.nr_leaves ++; reiserfs_buffer_close (bh); } fprintf (stderr, "\n"); } void pack_one_block (reiserfs_filsys_t * fs, unsigned long block); static void print_one_block (reiserfs_filsys_t * fs, unsigned long block) { reiserfs_bh_t * bh; if (!fs->fs_bitmap2) { reiserfs_bh_t * bm_bh; unsigned long bm_block; if (reiserfs_bitmap_spread (fs)) bm_block = ( block / (fs->fs_blocksize * 8) ) ? (block / (fs->fs_blocksize * 8)) * (fs->fs_blocksize * 8) : fs->fs_super_bh->b_blocknr + 1; else bm_block = fs->fs_super_bh->b_blocknr + 1 + (block / (fs->fs_blocksize * 8)); bm_bh = reiserfs_buffer_read (fs->fs_dev, bm_block, fs->fs_blocksize); if (bm_bh) { if (misc_test_bit((block % (fs->fs_blocksize * 8)), bm_bh->b_data)) { fprintf (stderr, "%lu is used in " "ondisk bitmap\n", block); } else { fprintf (stderr, "%lu is free in " "ondisk bitmap\n", block); } reiserfs_buffer_close (bm_bh); } } else { if (reiserfs_bitmap_test_bit (fs->fs_bitmap2, block)) fprintf (stderr, "%lu is used in ondisk bitmap\n", block); else fprintf (stderr, "%lu is free in ondisk bitmap\n", block); } bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize); if (!bh) { printf ("print_one_block: reiserfs_buffer_read failed\n"); return; } if (debug_mode (fs) == DO_PACK) { pack_one_block (fs, bh->b_blocknr); reiserfs_buffer_close (bh); return; } if (reiserfs_node_type (bh) != NT_UNKNOWN) reiserfs_node_print (stdout, fs, bh, (1 << LP_LEAF_DETAILS), -1, -1); else printf ("Looks like unformatted\n"); reiserfs_buffer_close (bh); return; } /* debugreiserfs -p or -P compresses reiserfs meta data: super block, journal, bitmap blocks and blocks looking like leaves. It may save "bitmap" of blocks they packed in the file of special format. Reiserfsck can then load "bitmap" saved in that file and build the tree of blocks marked used in that "bitmap" */ char * where_to_save; char * badblocks_file; char * corruption_list_file; char *program_name; static char * parse_options (struct debugreiserfs_data * data, int argc, char * argv []) { int c; char * tmp; data->scan_area = USED_BLOCKS; data->mode = DO_DUMP; program_name = strrchr( argv[ 0 ], '/' ); if (program_name) program_name++; else program_name = argv[ 0 ]; while ((c = getopt (argc, argv, "a:b:C:F:SU1:pkn:Nfr:dDomj:JqtZl:LVB:uv")) != EOF) { switch (c) { case 'a': /* -r will read this, -n and -N will write to it */ strncpy(data->map_file, optarg, sizeof(data->map_file)); break; case 'b': /* will load bitmap from a file and read only blocks marked in it. This is for -p and -k */ data->input_bitmap = optarg; data->scan_area = EXTERN_BITMAP; break; case 'S': /* have debugreiserfs -p or -k to read all the device */ data->scan_area = ALL_BLOCKS; break; case 'U': /* have debugreiserfs -p or -k to read unused blocks only */ data->scan_area = UNUSED_BLOCKS; break; case '1': /* print a single node */ data->block = strtol (optarg, &tmp, 0); if (*tmp) misc_die ("parse_options: bad block number"); break; case 'C': data->mode = DO_CORRUPT_ONE; data->block = strtol (optarg, &tmp, 0); if (*tmp) { misc_die ("parse_options: bad block number"); } break; case 'F': data->mode = DO_CORRUPT_FILE; corruption_list_file = optarg; break; case 'p': data->mode = DO_PACK; break; case 'u': data->mode = DO_UNPACK; break; case 't': data->mode = DO_STAT; break; case 'k': /* read the device and print reiserfs blocks which contain defined key */ data->mode = DO_SCAN; break; case 'n': /* scan for names matching a specified pattern */ data->mode = DO_SCAN_FOR_NAME; data->pattern = optarg; break; case 'N': /* search name in the tree */ data->mode = DO_LOOK_FOR_NAME; break; case 'f': data->mode = DO_FILE_MAP; break; case 'r': data->recovery_file = optarg; data->mode = DO_RECOVER; break; case 'd': /* print leaf details from internal tree */ misc_set_bit(LP_LEAF_DETAILS, &data->options); break; case 'D': /* print leaf details accordingly the bitmap - can be used with -S */ misc_set_bit(PRINT_DETAILS, &data->options); break; case 'o': /* print objectid map */ misc_set_bit(PRINT_OBJECTID_MAP, &data->options); break; case 'm': /* print a block map */ case 'M': /* print a block map with details */ misc_set_bit(PRINT_BITMAP, &data->options); break; case 'j': /* -j must have a parameter */ misc_set_bit(PRINT_JOURNAL, &data->options); data->journal_device_name = optarg; break; case 'J': misc_set_bit(PRINT_JOURNAL_HEADER, &data->options); break; case 'R': /* read block numbers from stdin and look for them in the journal */ data->mode = DO_SCAN_JOURNAL; data->JJ ++; break; case 'B': /*disabled for a while*/ badblocks_file = optarg; data->mode = DO_EXTRACT_BADBLOCKS; break; case 'q': /* this makes packing to not show speed info during -p or -P */ misc_set_bit(PRINT_QUIET, &data->options); break; case 'Z': data->mode = DO_ZERO; break; case 'l': /* --logfile */ data->log_file_name = optarg; data->log = fopen (optarg, "w"); if (!data->log) { fprintf (stderr, "debugreiserfs: Cannot not open " "\'%s\': %s", optarg, strerror(errno)); } break; case 'L' : /* random fs corruption */ data->mode = DO_RANDOM_CORRUPTION; break; case 'V': data->mode = DO_NOTHING; break; case 'v': misc_set_bit(PRINT_VERBOSE, &data->options); break; } } if (data->mode == DO_NOTHING) { util_print_banner(program_name); exit(0); } if (optind != argc - 1) /* only one non-option argument is permitted */ print_usage_and_exit(); util_print_banner(program_name); data->device_name = argv[optind]; return argv[optind]; } void pack_partition (reiserfs_filsys_t * fs); static void do_pack (reiserfs_filsys_t * fs) { if (certain_block (fs)) pack_one_block (fs, certain_block (fs)); else pack_partition (fs); } /* static int comp (const void * vp1, const void * vp2) { const int * p1, * p2; p1 = vp1; p2 = vp2; if (*p1 < *p2) return -1; if (*p1 > *p2) return 1; return 0; } */ static void init_bitmap (reiserfs_filsys_t * fs) { FILE * fp; unsigned long block_count; if (reiserfs_bitmap_open (fs) < 0) reiserfs_exit (1, "Could not open ondisk bitmap"); block_count = reiserfs_sb_get_blocks (fs->fs_ondisk_sb); switch (scan_area (fs)) { case ALL_BLOCKS: input_bitmap (fs) = reiserfs_bitmap_create (block_count); reiserfs_bitmap_fill (input_bitmap (fs)); reiserfs_warning (stderr, "Whole device (%d blocks) is to be scanned\n", reiserfs_bitmap_ones (input_bitmap (fs))); break; case USED_BLOCKS: reiserfs_warning (stderr, "Loading on-disk bitmap .. "); input_bitmap (fs) = reiserfs_bitmap_create (block_count); reiserfs_bitmap_copy (input_bitmap (fs), fs->fs_bitmap2); reiserfs_warning (stderr, "%d bits set - done\n", reiserfs_bitmap_ones (input_bitmap (fs))); break; case UNUSED_BLOCKS: reiserfs_warning (stderr, "Loading on-disk bitmap .. "); input_bitmap (fs) = reiserfs_bitmap_create (block_count); reiserfs_bitmap_copy (input_bitmap (fs), fs->fs_bitmap2); reiserfs_bitmap_invert (input_bitmap (fs)); reiserfs_warning (stderr, "%d bits set - done\n", reiserfs_bitmap_ones (input_bitmap (fs))); break; case EXTERN_BITMAP: fp = fopen (input_bitmap_file_name(fs), "r"); if (!fp) { reiserfs_exit (1, "init_bitmap: could not load bitmap: %m\n"); } input_bitmap (fs) = reiserfs_bitmap_load (fp); if (!input_bitmap (fs)) { reiserfs_exit (1, "could not load fitmap from \"%s\"", input_bitmap_file_name(fs)); } reiserfs_warning (stderr, "%d blocks marked in the given bitmap\n", reiserfs_bitmap_ones (input_bitmap (fs))); fclose (fp); break; default: reiserfs_panic ("No area to scan specified"); } } /* FIXME: statistics does not work */ static void do_dump_tree (reiserfs_filsys_t * fs) { if (certain_block (fs)) { print_one_block (fs, certain_block (fs)); return; } if ((misc_test_bit(PRINT_JOURNAL, &data(fs)->options) || misc_test_bit(PRINT_JOURNAL_HEADER, &data(fs)->options)) && !reiserfs_journal_opened (fs)) { if (reiserfs_journal_open (fs, data(fs)->journal_device_name, O_RDONLY)) { printf ("Could not open journal\n"); return; } } reiserfs_super_print_state (stdout, fs); reiserfs_node_print (stdout, fs, fs->fs_super_bh); if (misc_test_bit(PRINT_JOURNAL, &data(fs)->options)) reiserfs_journal_print (fs); if (misc_test_bit(PRINT_JOURNAL_HEADER, &data(fs)->options)) reiserfs_journal_print_header (fs); if (misc_test_bit(PRINT_OBJECTID_MAP, &data(fs)->options)) reiserfs_objmap_print (stdout, fs); if (misc_test_bit(PRINT_BITMAP, &data(fs)->options)) reiserfs_bitmap_print (stdout, fs, 0); if (misc_test_bit(PRINT_DETAILS, &data(fs)->options)) init_bitmap (fs); if (misc_test_bit(PRINT_DETAILS, &data(fs)->options) || misc_test_bit(LP_LEAF_DETAILS, &data(fs)->options)) { if (misc_test_bit(PRINT_DETAILS, &data(fs)->options)) { print_disk_blocks (fs); printf("The '%s' device with reiserfs has:\n", fs->fs_file_name); } else { /* DEBUGGING */ print_disk_tree (fs, reiserfs_sb_get_root(fs->fs_ondisk_sb)); printf("The internal reiserfs tree has:\n"); } /* print the statistic */ printf ("\t%d internal + %d leaves + %d " "unformatted nodes = %d blocks\n", g_stat_info.nr_internals, g_stat_info.nr_leaves, g_stat_info.nr_unformatted, g_stat_info.nr_internals + g_stat_info.nr_leaves + g_stat_info.nr_unformatted); } } static void callback_badblock_print(reiserfs_filsys_t *fs, reiserfs_path_t *badblock_path, void *data) { reiserfs_ih_t *tmp_ih; FILE *fd = (FILE *)data; __u32 *ind_item; __u32 i; tmp_ih = REISERFS_PATH_IH(badblock_path); ind_item = (__u32 *)REISERFS_PATH_ITEM(badblock_path); for (i = 0; i < reiserfs_ext_count(tmp_ih); i++) fprintf (fd, "%u\n", d32_get (ind_item, i)); reiserfs_tree_pathrelse (badblock_path); } void debug_badblock_print () { FILE *fd; if (!(fd = fopen (badblocks_file, "w"))) { reiserfs_exit(1, "debugreiserfs: could not open badblock file %s\n", badblocks_file); } reiserfs_badblock_traverse(fs, callback_badblock_print, fd); fclose (fd); } static int str2int (char * str, int * res) { int val; char * tmp; val = (int) strtol (str, &tmp, 0); if (tmp == str) /* could not convert string into a number */ return 0; *res = val; return 1; } void do_corrupt_blocks (reiserfs_filsys_t * fs) { char line[256]; FILE * fd; size_t n = 0; int numblock; fd = fopen (corruption_list_file, "r"); if (fd == NULL) { reiserfs_exit(1, "debugreiserfs: could not open corruption " "list file %s\n", corruption_list_file); } while (1) { line[0] = '\0'; n = 0; if (fgets(line, sizeof(line), fd) == NULL || strlen(line) <= 1) { break; } /* remove '\n' */ line [strlen (line) - 1] = '\0'; if (str2int(line, &numblock)) { data (fs)->block = (unsigned long) numblock; } else { do_corrupt_one_block(fs, line); } printf ("before free line : %s\n", line); printf ("after free\n"); reiserfs_fs_reopen (fs, O_RDWR); } fclose (fd); return; } void debugreiserfs_zero_reiserfs(reiserfs_filsys_t * fs) { unsigned long done, total, i; reiserfs_bh_t * bh; reiserfs_fs_reopen (fs, O_RDWR); total = reiserfs_bitmap_ones (input_bitmap (fs)); done = 0; for (i = 0; i < input_bitmap(fs)->bm_bit_size; i ++) { if (!reiserfs_bitmap_test_bit (input_bitmap(fs), i)) continue; bh = reiserfs_buffer_open(fs->fs_dev, i, fs->fs_blocksize); if (!bh) misc_die("Could not get block %lu\n", i); memset(bh->b_data, 0, fs->fs_blocksize); reiserfs_buffer_mkdirty(bh); reiserfs_buffer_mkuptodate(bh, 0); reiserfs_buffer_write(bh); reiserfs_buffer_close (bh); if (!misc_test_bit(PRINT_QUIET, &data(fs)->options)) util_misc_progress (stderr, &done, total, 1, 0); } fprintf(stderr, "\n"); fflush(stderr); } /* FIXME: need to open reiserfs filesystem first */ int main (int argc, char * argv[]) { char * file_name; int error; struct debugreiserfs_data * data; data = misc_getmem (sizeof (struct debugreiserfs_data)); file_name = parse_options (data, argc, argv); if (data->mode == DO_UNPACK) { do_unpack(file_name, data->journal_device_name, data->input_bitmap, misc_test_bit(PRINT_VERBOSE, &data->options)); return 0; } fs = reiserfs_fs_open (file_name, O_RDONLY, &error, data, 0); if (fs == NULL) { reiserfs_exit (1, "\n\ndebugreiserfs: can not open reiserfs on " "\"%s\": %s\n\n", file_name, error ? strerror(error) : "no filesystem found"); exit(1) ; } if (reiserfs_journal_open (fs, data (fs)->journal_device_name, O_RDONLY)) { fprintf(stderr,"\ndebugreiserfs: Failed to open the fs journal.\n"); } switch (debug_mode (fs)) { case DO_STAT: init_bitmap (fs); do_stat (fs); break; case DO_PACK: init_bitmap (fs); do_pack (fs); break; case DO_CORRUPT_ONE: reiserfs_fs_reopen (fs, O_RDWR); do_corrupt_one_block (fs, (char *)NULL); break; case DO_CORRUPT_FILE: reiserfs_fs_reopen (fs, O_RDWR); do_corrupt_blocks (fs); break; case DO_RANDOM_CORRUPTION: reiserfs_fs_reopen (fs, O_RDWR); /* do_leaves_corruption (fs); do_bitmap_corruption (fs); */ do_fs_random_corrupt (fs); break; case DO_DUMP: do_dump_tree (fs); break; case DO_SCAN: case DO_SCAN_FOR_NAME: case DO_LOOK_FOR_NAME: case DO_SCAN_JOURNAL: init_bitmap (fs); do_scan (fs); break; case DO_FILE_MAP: print_map(fs); break; case DO_RECOVER: do_recover (fs); break; case DO_TEST: /*do_test (fs);*/ break; case DO_EXTRACT_BADBLOCKS: reiserfs_warning (stderr, "Will try to extract list of bad blocks " "and save it to '%s' file\n", badblocks_file); debug_badblock_print (); reiserfs_warning (stderr, "Done\n\n"); break; case DO_ZERO: init_bitmap (fs); debugreiserfs_zero_reiserfs(fs); break; } if (data(fs)->log) fclose (data(fs)->log); reiserfs_fs_close (fs); return 0; } reiserfsprogs-3.6.20/utils/debugfs/debugreiserfs.h0000644000175300001440000001764010412227267017213 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #include "reiserfs/libreiserfs.h" #if 0 #define _GNU_SOURCE #include "io.h" #include "misc.h" #include "reiserfs_lib.h" #include "../version.h" #include #include #endif extern reiserfs_filsys_t * fs; /* print all items from bitmap */ #define PRINT_DETAILS LP_LAST /* * modes */ #define DO_DUMP 1 /* not a real dump, just printing to stdout contents of tree nodes */ #define DO_CORRUPT_ONE 2 /* used to make filesystem corruption and then test fsck */ #define DO_CORRUPT_FILE 3 /* used to make filesystem corruption and then test fsck, the list of corruption is set on the file */ #define DO_RANDOM_CORRUPTION 4 #define DO_SCAN 5 #define DO_RECOVER 6 #define DO_TEST 7 #define DO_PACK 8 /* -p extract meta data of reiserfs filesystem */ #define DO_UNPACK 9 /* -u create the fs by the givem metadata */ #define DO_STAT 10 #define DO_SCAN_FOR_NAME 11 /* -n */ #define DO_LOOK_FOR_NAME 12 /* -N */ #define DO_SCAN_JOURNAL 13 /* -J */ #define DO_EXTRACT_BADBLOCKS 14 #define DO_FILE_MAP 15 #define DO_ZERO 16 #define DO_NOTHING 17 /*first bits are in reiserfs_fs.b*/ enum debug_print { PRINT_JOURNAL = LP_LAST, PRINT_JOURNAL_HEADER = LP_LAST + 1, PRINT_BITMAP = LP_LAST + 2, PRINT_OBJECTID_MAP = LP_LAST + 3, PRINT_QUIET = LP_LAST + 4, PRINT_VERBOSE = LP_LAST + 5, PRINT_DEBUG_LAST }; #define debug_option(options, bit) (options & (1 << (bit))) #define debug_setoption(options, bit) (options |= (1 << (bit))) // the leaf is stored in compact form: // start magic number // block number __u32 // item number __u16 // struct packed_item // .. // end magic number /* we store hash code in high byte of 16 bits */ #define LEAF_START_MAGIC 0xa6 #define LEAF_END_MAGIC 0x5a #define FULL_BLOCK_START_MAGIC 0xb6 #define FULL_BLOCK_END_MAGIC 0x6b #define UNFORMATTED_BITMAP_START_MAGIC 0xc7 #define UNFORMATTED_BITMAP_END_MAGIC 0x7c #define END_MAGIC 0x8d #define INTERNAL_START_MAGIC #define INTERNAL_START_MAGIC #define SEPARATED_JOURNAL_START_MAGIC 0xf8 #define SEPARATED_JOURNAL_END_MAGIC 0x8f #define ITEM_START_MAGIC 0x476576 #define ITEM_END_MAGIC 0x2906504 #define MAP_MAGIC 0xe9 #define MAP_END_MAGIC 0x9e /* 12 bits of mask are used to define */ #define NEW_FORMAT 0x01 /* 1. 0 here means - old format, 1 - new format */ #define DIR_ID 0x02 /* 2. dir_id is stored */ #define OBJECT_ID 0x04 /* 3. objectid is stored */ #define OFFSET_BITS_32 0x08 /* 4. offset is stored as 32 bit */ #define OFFSET_BITS_64 0x10 /* 5. offset is stored as 64 bit */ #define IH_ENTRY_COUNT 0x20 /* 6. ih_free_space/ih_entry_count is stored */ #define IH_FREE_SPACE 0x20 #define IH_FORMAT 0x40 /* 7. ih_format is stored */ #define WITH_SD_FIRST_DIRECT_BYTE 0x80 /* 8. for old stat data first_direct_byte is stored */ #define NLINK_BITS_32 0x0100 /* 9. nlinks stored in 32 bits */ #define SIZE_BITS_64 0x0200 /* 10. size has to be stored in 64 bit */ #define WHOLE_EXTENT 0x0400 /* 11. extent item is stored with compression */ #define SAFE_LINK 0x0800 /* 11. extent item is stored with compression */ #define TYPE_MASK 0x3 /* two lowest bits are used to store item type */ //#define MASK_MASK 0xffffc /* what is packed: dirid, objectid, etc */ #define ITEM_LEN_MASK 0xfff00000 /* contents of ih_item_len of item_head */ struct packed_item { __u32 type_2_mask_18_len_12; }; /* defined as inlines in both pack.c and unpack.c */ inline void set_pi_type( struct packed_item *pi, __u32 val ); inline __u32 get_pi_type( const struct packed_item *pi ); inline void set_pi_mask( struct packed_item *pi, __u32 val ); inline __u32 get_pi_mask( const struct packed_item *pi ); inline void set_pi_item_len( struct packed_item *pi, __u32 val ); inline __u32 get_pi_item_len( const struct packed_item *pi ); #define HAS_DIR_ID 0x01 #define HAS_GEN_COUNTER 0x02 #define HAS_STATE 0x04 #define YURA 0x08 #define TEA 0x10 #define R5 0x20 struct packed_dir_entry { __u8 mask; __u16 entrylen; }; /* packed_dir_entry.mask is *always* endian safe, since it's 8 bit */ #define get_pe_entrylen(pe) (le16_to_cpu((pe)->entrylen)) #define set_pe_entrylen(pe,v) ((pe)->entrylen = cpu_to_le16(v)) #define fread8(pv) fread (pv, sizeof (__u8), 1, stdin) #define fread_le16(pv)\ {\ __u16 tmp; \ fread16(&tmp); \ *pv = le16_to_cpu(tmp); \ } #define fread_le32(pv)\ {\ __u32 tmp; \ fread32(&tmp); \ *pv = le32_to_cpu(tmp); \ } #define fread_le64(pv)\ {\ __u64 tmp; \ fread64(&tmp); \ *pv = le64_to_cpu(tmp); \ } #define fread8(pv) fread (pv, sizeof (__u8), 1, stdin) #define fread16(pv) fread (pv, sizeof (__u16), 1, stdin) #define fread32(pv) fread (pv, sizeof (__u32), 1, stdin) #define fread64(pv) fread (pv, sizeof (__u64), 1, stdin) #define fwrite_le16(pv)\ {\ __u16 tmp = cpu_to_le16(*(pv));\ fwrite16(&tmp);\ } #define fwrite_le32(pv)\ {\ __u32 tmp = cpu_to_le32(*(pv));\ fwrite32(&tmp);\ } #define fwrite_le64(pv)\ {\ __u64 tmp = cpu_to_le64(*(pv));\ fwrite64(&tmp);\ } #define fwrite8(pv) {\ if (fwrite (pv, sizeof (__u8), 1, stdout) != 1)\ reiserfs_panic ("fwrite8 failed: %m");\ sent_bytes ++;\ } #define fwrite16(pv) {\ if (fwrite (pv, sizeof (__u16), 1, stdout) != 1)\ reiserfs_panic ("fwrite16 failed: %m");\ sent_bytes += 2;\ } #define fwrite32(pv) {\ if (fwrite (pv, sizeof (__u32), 1, stdout) != 1)\ reiserfs_panic ("fwrite32 failed: %m");\ sent_bytes += 4;\ } #define fwrite64(pv) {\ if (fwrite (pv, sizeof (__u64), 1, stdout) != 1)\ reiserfs_panic ("fwrite64 failed: %m");\ sent_bytes += 8;\ } struct debugreiserfs_data { int mode; /* DO_DUMP | DO_PACK | DO_CORRUPT_ONE... */ #define USED_BLOCKS 1 #define EXTERN_BITMAP 2 #define ALL_BLOCKS 3 #define UNUSED_BLOCKS 4 int scan_area; /* for -p, -s and -n */ char * input_bitmap; /* when ->scan_area is set to EXTERN_BITMAP */ reiserfs_bitmap_t * bitmap; /* bitmap is read from ->input_bitmap */ unsigned long block; /* set by -B. this is a must for -C, option for -p and -d */ char * pattern; /* for -n */ char * device_name; char * journal_device_name; /* for -j */ char map_file[4096]; /* for -n, -N and -f */ char * recovery_file; /* for -r */ unsigned long options; /* -q only yet*/ int JJ; /* log file name and handle */ char * log_file_name; FILE * log ; }; #define data(fs) ((struct debugreiserfs_data *)((fs)->fs_vp)) #define debug_mode(fs) (data(fs)->mode) #define certain_block(fs) (data(fs)->block) #define input_bitmap(fs) (data(fs)->bitmap) #define input_bitmap_file_name(fs) (data(fs)->input_bitmap) #define scan_area(fs) (data(fs)->scan_area) #define name_pattern(fs) (data(fs)->pattern) #define device_name(fs) (data(fs)->device_name) #define journal_device_name(fs) (data(fs)->journal_device_name) #define map_file(fs) (data(fs)->map_file) #define recovery_file(fs) (data(fs)->recovery_file) /* stat.c */ void do_stat (reiserfs_filsys_t * fs); /* corruption.c */ void do_corrupt_one_block (reiserfs_filsys_t * fs, char * fline); void do_leaves_corruption (reiserfs_filsys_t * fs, unsigned long nr_leaves_cr); void do_bitmap_corruption (reiserfs_filsys_t * fs); void do_fs_random_corrupt (reiserfs_filsys_t * fs); /* recover.c */ void do_recover (reiserfs_filsys_t * fs); /* scan.c */ void do_scan (reiserfs_filsys_t * fs); /* journal.c */ void scan_journal (reiserfs_filsys_t * fs); /* unpack.c */ extern int do_unpack(char *host, char *j_filename, char *filename, int verbose); void print_map(reiserfs_filsys_t * fs); struct saved_item { reiserfs_ih_t si_ih; unsigned long si_block; int si_item_num, si_entry_pos; struct saved_item *si_next; /* list of items having the same key */ }; /* Local variables: c-indentation-style: "K&R" mode-name: "LC" c-basic-offset: 4 tab-width: 4 fill-column: 80 End: */ reiserfsprogs-3.6.20/utils/debugfs/pack.c0000644000175300001440000004604110412227267015270 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "debugreiserfs.h" #include "misc/unaligned.h" #include "util/print.h" #include "util/misc.h" /* counters for each kind of blocks */ int packed, packed_leaves, full_blocks, having_ih_array, /* blocks with broken block head */ bad_leaves, /* failed to compress */ internals, descs, others; reiserfs_bitmap_t * what_to_pack; /* these are to calculate compression */ unsigned long sent_bytes; /* how many bytes sent to stdout */ unsigned long had_to_be_sent; /* how many bytes were to be sent */ inline void set_pi_type( struct packed_item *pi, __u32 val ) { misc_set_bitfield_XX (32, pi, val, 0, 2); } inline __u32 get_pi_type( const struct packed_item *pi ) { return misc_get_bitfield_XX (32, pi, 0, 2); } inline void set_pi_mask( struct packed_item *pi, __u32 val ) { misc_set_bitfield_XX (32, pi, val, 2, 18); } __u32 get_pi_mask( const struct packed_item *pi ) { return misc_get_bitfield_XX (32, pi, 2, 18); } inline void set_pi_item_len( struct packed_item *pi, __u32 val ) { misc_set_bitfield_XX (32, pi, val, 20, 12); } inline __u32 get_pi_item_len( const struct packed_item *pi ) { return misc_get_bitfield_XX (32, pi, 20, 12); } static void pack_ih (struct packed_item * pi, reiserfs_ih_t * ih) { __u32 v32; __u16 v16; /* send packed item head first */ fwrite (pi, sizeof (*pi), 1, stdout); sent_bytes += sizeof (*pi); /* sen key components which are to be sent */ if (get_pi_mask(pi) & DIR_ID) { v32 = reiserfs_key_get_did (&ih->ih_key); fwrite_le32 (&v32); } if (get_pi_mask(pi) & OBJECT_ID) { v32 = reiserfs_key_get_oid (&ih->ih_key); fwrite_le32 (&v32); } if (get_pi_mask(pi) & OFFSET_BITS_64) { __u64 offset; offset = reiserfs_key_get_off (&ih->ih_key); fwrite_le64 (&offset); } if (get_pi_mask(pi) & OFFSET_BITS_32) { __u32 offset; offset = reiserfs_key_get_off (&ih->ih_key); fwrite_le32 (&offset); } if (get_pi_mask(pi) & IH_FREE_SPACE) { v16 = reiserfs_ih_get_entries (ih); fwrite_le16 (&v16); } if (get_pi_mask(pi) & IH_FORMAT) { /* fixme */ fwrite16 (&ih->ih_format); } } static void pack_direct (struct packed_item * pi, reiserfs_bh_t * bh, reiserfs_ih_t * ih) { if (reiserfs_ih_get_free (ih) != 0xffff) /* ih_free_space has unexpected value */ set_pi_mask (pi, get_pi_mask (pi) | IH_FREE_SPACE); if (get_pi_mask(pi) & SAFE_LINK) reiserfs_key_set_did(&ih->ih_key, d32_get((__u32 *)reiserfs_item_by_ih (bh, ih), 0) ); /* send key components which are to be sent */ pack_ih (pi, ih); } /* if there is at least one extent longer than 2 - it is worth packing */ static int should_pack_extent (__u32 * ind_item, int unfm_num) { int i, len; for (i = 1, len = 1; i < unfm_num; i ++) { if ((d32_get(ind_item, i) == 0 && d32_get(ind_item, i - 1) == 0) || d32_get(ind_item, i) == d32_get(ind_item, i - 1) + 1) { len ++; if (len > 2) return 1; } else { /* sequence of blocks or hole broke */ len = 1; } } return 0; } /* extent item can be either packed using "extents" (when it is worth doing) or be stored as is. Size of item in packed form is not stored. Unpacking will stop when full item length is reached */ static void pack_extent (struct packed_item * pi, reiserfs_bh_t * bh, reiserfs_ih_t * ih) { unsigned int i; __u32 * ind_item; __u16 len; if (reiserfs_ih_get_entries (ih)) set_pi_mask (pi, get_pi_mask (pi) | IH_FREE_SPACE); ind_item = (__u32 *)reiserfs_item_by_ih (bh, ih); if (!should_pack_extent (ind_item, reiserfs_ext_count (ih))) set_pi_mask (pi, get_pi_mask (pi) | WHOLE_EXTENT); if (get_pi_mask(pi) & SAFE_LINK) reiserfs_key_set_did(&ih->ih_key, d32_get(ind_item, 0)); pack_ih (pi, ih); if (get_pi_mask(pi) & SAFE_LINK) return; if (get_pi_mask(pi) & WHOLE_EXTENT) { fwrite (ind_item, reiserfs_ih_get_len (ih), 1, stdout); sent_bytes += reiserfs_ih_get_len (ih); return; } fwrite32 (&ind_item [0]); for (i = 1, len = 1; i < reiserfs_ext_count (ih); i ++) { if ((d32_get(ind_item, i) == 0 && d32_get(ind_item, i - 1) == 0) || d32_get(ind_item, i) == d32_get(ind_item, i - 1) + 1) { len ++; } else { fwrite_le16 (&len); fwrite32 ((char *)(ind_item + i)); len = 1; } } fwrite_le16 (&len); return; } /* directory item is packed: entry count - 16 bits for each entry mask (8 bits) - it shows whether there are any of (deh_dir_id, gen counter, deh_state) entry length 16 bits entry itself deh_objectid - 32 bits maybe deh_dir_id (32 bits) maybe gencounter (16) maybe deh_state (16) */ static void pack_direntry (reiserfs_filsys_t * fs, struct packed_item * pi, reiserfs_bh_t * bh, reiserfs_ih_t * ih) { int i; reiserfs_deh_t * deh; struct packed_dir_entry pe; __u16 entry_count, gen_counter; set_pi_mask (pi, get_pi_mask (pi) | IH_ENTRY_COUNT); /* send item_head components which are to be sent */ pack_ih (pi, ih); /* entry count is sent unconditionally */ entry_count = reiserfs_ih_get_entries (ih); deh = reiserfs_deh (bh, ih); for (i = 0; i < entry_count; i ++, deh ++) { pe.entrylen = reiserfs_direntry_entry_len (ih, deh, i); pe.mask = 0; if (reiserfs_deh_get_did (deh) != reiserfs_key_get_oid (&ih->ih_key)) /* entry points to name of another directory, store deh_dir_id */ pe.mask |= HAS_DIR_ID; gen_counter = OFFSET_GEN (reiserfs_deh_get_off (deh)); if (gen_counter != 0) /* store generation counter if it is != 0 */ pe.mask |= HAS_GEN_COUNTER; if (reiserfs_deh_get_state (deh) != 4) /* something unusual in deh_state. Store it */ pe.mask |= HAS_STATE; fwrite8 (&pe.mask); fwrite_le16 (&pe.entrylen); fwrite (reiserfs_deh_name (deh, i), pe.entrylen, 1, stdout); sent_bytes += pe.entrylen; fwrite32 (&(deh->deh2_objectid)); if (pe.mask & HAS_DIR_ID) fwrite32 (&deh->deh2_dir_id); if (pe.mask & HAS_GEN_COUNTER) fwrite_le16 (&gen_counter); if (pe.mask & HAS_STATE) fwrite16 (&deh->deh2_state); } } static void pack_stat_data (struct packed_item * pi, reiserfs_bh_t * bh, reiserfs_ih_t * ih) { if (reiserfs_ih_get_free (ih) != 0xffff) /* ih_free_space has unexpected value */ set_pi_mask (pi, get_pi_mask (pi) | IH_FREE_SPACE); if (reiserfs_ih_format_v1 (ih)) { /* for old stat data: we take mode - 16 bits nlink - 16 bits size - 32 bits blocks/rdev - 32 bits maybe first_direct byte 32 bits */ reiserfs_sd_v1_t * sd_v1; sd_v1 = (reiserfs_sd_v1_t *)reiserfs_item_by_ih (bh, ih); if (sd_v1->sd_fdb != 0xffffffff) /* ok if -1 */ set_pi_mask (pi, get_pi_mask (pi) | WITH_SD_FIRST_DIRECT_BYTE); pack_ih (pi, ih); fwrite16 (&sd_v1->sd_mode); fwrite16 (&sd_v1->sd_nlink); fwrite32 (&sd_v1->sd_size); fwrite32 (&sd_v1->u.sd_blocks); if (get_pi_mask(pi) & WITH_SD_FIRST_DIRECT_BYTE) fwrite32 (&sd_v1->sd_fdb); } else { /* for new stat data mode - 16 bits nlink in either 16 or 32 bits size in either 32 or 64 bits blocks - 32 bits */ reiserfs_sd_t * sd; /* these will maintain disk-order values */ __u16 nlink16; __u32 nlink32, size32; __u64 size64; sd = (reiserfs_sd_t *)reiserfs_item_by_ih (bh, ih); if (reiserfs_sd_v2_nlink (sd) > 0xffff) { set_pi_mask (pi, get_pi_mask (pi) | NLINK_BITS_32); nlink32 = sd->sd_nlink; } else { /* This is required to deal with big endian systems */ nlink16 = cpu_to_le16 ((__u16)reiserfs_sd_v2_nlink (sd)); } if (reiserfs_sd_v2_size (sd) > 0xffffffff) { set_pi_mask (pi, get_pi_mask (pi) | SIZE_BITS_64); size64 = sd->sd_size; } else { /* This is required to deal with big endian systems */ size32 = cpu_to_le32 ((__u32)reiserfs_sd_v2_size (sd)); } pack_ih (pi, ih); fwrite16 (&sd->sd_mode); if (get_pi_mask (pi) & NLINK_BITS_32) { fwrite32 (&nlink32); } else { fwrite16 (&nlink16); } if (get_pi_mask (pi) & SIZE_BITS_64) { fwrite64 (&size64); } else { fwrite32 (&size32); } fwrite32 (&sd->sd_blocks); } } static void pack_full_block (reiserfs_filsys_t * fs, reiserfs_bh_t * bh) { __u16 magic; __u32 block; magic = FULL_BLOCK_START_MAGIC; fwrite_le16 (&magic); block = bh->b_blocknr; fwrite_le32 (&block); fwrite (bh->b_data, fs->fs_blocksize, 1, stdout); sent_bytes += fs->fs_blocksize; had_to_be_sent += fs->fs_blocksize; full_blocks ++; } #if 0 /* unformatted node pointer is considered bad when it points either to blocks of journal, bitmap blocks, super block or is transparently out of range of disk block numbers */ static int check_unfm_ptr (reiserfs_filsys_t * fs, __u32 block) { if (block >= SB_BLOCK_COUNT (fs)) return 1; if (reiserfs_fs_block(fs, block) != BT_UNKNOWN) return 1; return 0; } #endif /* we only pack leaves which do not have any corruptions */ static int can_pack_leaf (reiserfs_filsys_t * fs, reiserfs_bh_t * bh) { int i; reiserfs_ih_t * ih; ih = reiserfs_ih_at (bh, 0); for (i = 0; i < reiserfs_nh_get_items (NODE_HEAD (bh)); i ++, ih ++) { if (reiserfs_leaf_correct_at (fs, ih, reiserfs_item_by_ih (bh, ih), 0/*check_unfm_ptr*/, 1/*bad dir*/)) { return 0; } } return 1; } /* pack leaf only if all its items are correct: keys are correct, direntries are hashed properly and hash function is defined, extent items are correct, stat data ?, */ static void pack_leaf (reiserfs_filsys_t * fs, reiserfs_bh_t * bh) { int i; reiserfs_ih_t * ih; struct packed_item pi; __u16 v16; if (!can_pack_leaf (fs, bh)) { /* something looks suspicious in this leaf - pack whole block */ bad_leaves ++; pack_full_block (fs, bh); return; } /* start magic in low 8 bits, hash code in high 8 bits */ v16 = (LEAF_START_MAGIC | (reiserfs_hash_code(fs->hash) << 8)); fwrite_le16 (&v16); /* block number */ fwrite_le32 (&bh->b_blocknr); /* item number */ v16 = reiserfs_nh_get_items (NODE_HEAD (bh)); fwrite_le16 (&v16); ih = reiserfs_ih_at (bh, 0); for (i = 0; i < v16; i ++, ih ++) { #if 0 v32 = ITEM_START_MAGIC; fwrite32 (&v32); #endif set_pi_mask (&pi, 0); set_pi_item_len (&pi, reiserfs_ih_get_len (ih)); set_pi_type (&pi, reiserfs_key_get_type (&ih->ih_key)); // format if (reiserfs_ih_get_format (ih) == KEY_FORMAT_2) set_pi_mask( &pi, get_pi_mask(&pi) | NEW_FORMAT ); // k_dir_id if (!i || (i && reiserfs_key_get_did (&ih->ih_key) != reiserfs_key_get_did (&(ih - 1)->ih_key))) { /* if item is first in the leaf or if previous item has different k_dir_id - store it */ set_pi_mask (&pi, get_pi_mask (&pi) | DIR_ID); } // k_object_id if (!i || (i && reiserfs_key_get_oid (&ih->ih_key) != reiserfs_key_get_oid (&(ih - 1)->ih_key))) { /* if item is first in the leaf or if previous item has different k_objectid - store it */ set_pi_mask (&pi, get_pi_mask (&pi) | OBJECT_ID); } /* store offset if it is != 0 in 32 or 64 bits */ if (reiserfs_key_get_off (&ih->ih_key)) { int send_offset = 1; if ((get_pi_mask (&pi) & DIR_ID) == 0 && (get_pi_mask (&pi) & OBJECT_ID) == 0) { /* previous item is of the same object, so try to avoid sending k_offset */ if ((reiserfs_ih_stat (ih - 1) && reiserfs_key_get_off (&ih->ih_key) == 1) || (reiserfs_ih_ext (ih - 1) && reiserfs_ih_direct (ih) && reiserfs_key_get_off (&(ih - 1)->ih_key) + reiserfs_leaf_ibytes (ih - 1, fs->fs_blocksize) == reiserfs_key_get_off (&ih->ih_key))) { /* unpack can calculate offset itself */ send_offset = 0; } } if (send_offset) { if (reiserfs_key_get_off (&ih->ih_key) > 0xffffffffULL) set_pi_mask (&pi, get_pi_mask (&pi) | OFFSET_BITS_64); else set_pi_mask (&pi, get_pi_mask (&pi) | OFFSET_BITS_32); } } /* ih key format is correct, check fsck_need field */ if (reiserfs_ih_get_flags (ih)) set_pi_mask (&pi, get_pi_mask (&pi) | IH_FORMAT); if ((reiserfs_key_get_did (&ih->ih_key) == (__u32)-1) && (reiserfs_ih_get_len (ih) == 4)) set_pi_mask (&pi, get_pi_mask (&pi) | SAFE_LINK); if (reiserfs_ih_direct (ih)) { pack_direct (&pi, bh, ih); } else if (reiserfs_ih_ext (ih)) pack_extent (&pi, bh, ih); else if (reiserfs_ih_dir (ih)) pack_direntry (fs, &pi, bh, ih); else if (reiserfs_ih_stat (ih)) pack_stat_data (&pi, bh, ih); else misc_die ("pack_leaf: unknown item found"); #if 0 v32 = ITEM_END_MAGIC; fwrite32 (&v32); #endif } v16 = LEAF_END_MAGIC; fwrite_le16 (&v16); had_to_be_sent += fs->fs_blocksize; packed_leaves ++; return; } static int can_pack_internal (reiserfs_filsys_t * fs, reiserfs_bh_t * bh) { return 0; } /* pack internal node as a full block */ static void pack_internal (reiserfs_filsys_t * fs, reiserfs_bh_t * bh) { internals ++; if (!can_pack_internal (fs, bh)) { pack_full_block (fs, bh); return; } reiserfs_panic ("pack_internal: packing code is not ready"); } /* packed blocks are marked free in the bitmap*/ static void send_block (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, int send_unknown) { int type; packed ++; type = reiserfs_node_type (bh); switch (type) { case NT_LEAF: pack_leaf (fs, bh); break; case NT_IH_ARRAY: having_ih_array ++; // fprintf (stderr, "BROKEN BLOCK HEAD %lu\n", bh->b_blocknr); pack_full_block (fs, bh); break; case NT_INTERNAL: pack_internal (fs, bh); break; default: if (send_unknown) pack_full_block (fs, bh); else packed --; break; } /* do not send one block twice */ reiserfs_bitmap_clear_bit (what_to_pack, bh->b_blocknr); } /* super block, journal, bitmaps */ static void pack_frozen_data (reiserfs_filsys_t * fs) { reiserfs_bh_t * bh; unsigned long block; __u16 magic16; int sent_journal_start_magic = 0; unsigned int i, bmap_nr; if (reiserfs_super_jr_magic(fs->fs_ondisk_sb) && reiserfs_jp_get_dev(reiserfs_sb_jp(fs->fs_ondisk_sb)) && !journal_device_name(fs)) { if (!util_user_confirmed (stderr,"\n File system has non-standard " "journal that hasn't been specified.\n" "Continue packing without journal? [N/Yes] " "(note need to type Yes):", "Yes\n")) { exit (0); } } /* super block */ reiserfs_warning (stderr, "super block..");fflush (stderr); send_block (fs, fs->fs_super_bh, 1/*send block even if its format is not determined */); bmap_nr = reiserfs_bmap_nr(reiserfs_sb_get_blocks (fs->fs_ondisk_sb), fs->fs_blocksize); reiserfs_warning (stderr, "ok\nbitmaps..(%d).. ", bmap_nr); fflush (stderr); /* bitmaps */ block = fs->fs_super_bh->b_blocknr + 1; for (i = 0; i < bmap_nr; i ++) { bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize); if (!bh) { fprintf (stderr, "pack_frozen_data: reiserfs_buffer_read failed: %lu\n", block); continue; } send_block (fs, bh, 1); if (reiserfs_bitmap_spread (fs)) block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8); else block ++; reiserfs_buffer_close (bh); } /* journal */ if (reiserfs_jp_get_dev (reiserfs_sb_jp (fs->fs_ondisk_sb))) { /* non-standard journal is on a separate device */ if (journal_device_name (fs) && !reiserfs_journal_opened (fs)) misc_die ("Specified journal is not available. Specify it correctly or " "don't specify at all"); else if (!journal_device_name(fs)) /* non-standard journal was not specified (that confirmed by user) - skipped packing journal */ return; else { magic16 = SEPARATED_JOURNAL_START_MAGIC; fwrite_le16 (&magic16); sent_journal_start_magic = 1; } } block = reiserfs_jp_get_start (reiserfs_sb_jp (fs->fs_ondisk_sb)); reiserfs_warning (stderr, "ok\njournal (from %lu to %lu)..", block, block + reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb))); fflush (stderr); for (i = 0; i <= reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb)); i ++) { bh = reiserfs_buffer_read (fs->fs_journal_dev, block + i, fs->fs_blocksize); if (!bh) { reiserfs_warning (stderr, "could not read %lu, skipped\n", i); continue; } send_block (fs, bh, 1); reiserfs_buffer_close (bh); } if (sent_journal_start_magic) { magic16 = SEPARATED_JOURNAL_END_MAGIC; fwrite_le16 (&magic16); } reiserfs_warning (stderr, "ok\n");fflush (stderr); reiserfs_warning (stderr, "Super block, bitmaps, journal - %d blocks - done, %d blocks left\n", packed, reiserfs_bitmap_ones (what_to_pack)); } /* pack all "not data blocks" and correct leaf */ void pack_partition (reiserfs_filsys_t * fs) { reiserfs_bh_t * bh; __u32 magic32; __u16 blocksize; __u16 magic16; unsigned long done = 0, total; unsigned int i; magic32 = REISERFS_SUPER_MAGIC; fwrite_le32 (&magic32); blocksize = fs->fs_blocksize; fwrite_le16 (&blocksize); /* will get information about what is to be packed. Bits corresponding to packed blocks will be cleared */ what_to_pack = input_bitmap(fs); /* super block, journal, bitmaps */ pack_frozen_data (fs); /* what's left */ total = reiserfs_bitmap_ones (what_to_pack); for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) { if (!reiserfs_bitmap_test_bit (what_to_pack, i)) continue; if (!misc_test_bit(PRINT_QUIET, &data(fs)->options)) { util_misc_progress (stderr, &done, total, 1, 0); } bh = reiserfs_buffer_read (fs->fs_dev, i, blocksize); if (!bh) { reiserfs_warning (stderr, "could not read block %lu\n", i); continue; } send_block (fs, bh, 0/*do not send block of not determined format */); reiserfs_buffer_close (bh); } magic16 = END_MAGIC; fwrite_le16 (&magic16); fprintf (stderr, "\nPacked %d blocks:\n" "\tcompessed %d\n" "\tfull blocks %d\n" "\t\tleaves with broken block head %d\n" "\t\tcorrupted leaves %d\n" "\t\tinternals %d\n" "\t\tdescriptors %d\n", packed, packed_leaves, full_blocks, having_ih_array, bad_leaves, internals, descs); fprintf (stderr, "data packed with ratio %.2f\n", (double)sent_bytes / had_to_be_sent); } void pack_one_block (reiserfs_filsys_t * fs, unsigned long block) { __u32 magic32; __u16 magic16; reiserfs_bh_t * bh; // reiserfs magic magic32 = REISERFS_SUPER_MAGIC; fwrite_le32 (&magic32); // blocksize fwrite_le16 (&fs->fs_blocksize); bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize); if (!bh) return; if (reiserfs_node_type (bh) == NT_LEAF) pack_leaf (fs, bh); else pack_full_block (fs, bh); reiserfs_buffer_close (bh); // end magic magic16 = END_MAGIC; fwrite_le16 (&magic16); fprintf (stderr, "Done\n"); } reiserfsprogs-3.6.20/utils/debugfs/recover.c0000644000175300001440000002504010412227267016013 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "debugreiserfs.h" #include "misc/unaligned.h" #include #if 0 /* this reads stdin and recover file of given key: */ /* the input has to be in the follwong format: K dirid objectid N name B blocknumber .. then recover_file will read every block, look there specified file and put it into */ void do_recover (reiserfs_filsys_t fs) { char name [100]; char * line = 0; int n = 0; int fd; reiserfs_key_t key = {0, 0, }; reiserfs_bh_t * bh; reiserfs_ih_t * ih; unsigned long block; char code; long long int recovered = 0; int i, j; reiserfs_bitmap_t bitmap; int used, not_used; bitmap = reiserfs_bitmap_create (SB_BLOCK_COUNT (fs)); reiserfs_fetch_disk_bitmap (bitmap, fs); /* we check how many blocks recoverd items point to are free or used */ used = 0; not_used = 0; fd = 0; while (getline (&line, &n, stdin) != -1) { if (line [0] == '#' || line [0] == '\n') continue; switch (line [0]) { case 'K': /* get a key of file which is to be recovered */ if (sscanf (line, "%c %u %u\n", &code, &key.k_dir_id, &key.k_objectid) != 3) { misc_die ("recover_file: wrong input K format"); } printf ("Recovering file (%u, %u)\n", key.k_dir_id, key.k_objectid); break; case 'N': /* get a file name */ recovered = 0; if (sscanf (line, "%c %s\n", &code, name) != 2) { misc_die ("recover_file: wrong input N format"); } fd = open (name, O_RDWR | O_CREAT | O_EXCL, 0644); if (fd == -1) misc_die ("recover_file: could not create file %s: %s", name,strerror (errno)); printf ("Recovering file %s..\n", name); break; case 'B': if (!fd) misc_die ("recover_file: file name is not specified"); if (sscanf (line, "%c %lu\n", &code, &block) != 2) { misc_die ("recover_file: wrong input B format"); } bh = reiserfs_buffer_read (fs->s_dev, block, fs->s_blocksize); if (!bh) { printf ("reading block %lu failed\n", block); continue; } printf ("working with block %lu..\n", block); ih = reiserfs_ih_at (bh, 0); for (i = 0; i < node_item_number (bh); i ++, ih ++) { __u32 * extent; reiserfs_bh_t * tmp_bh; if (!reiserfs_ih_ext (ih) || key.k_dir_id != ih->ih_key.k_dir_id || key.k_objectid != ih->ih_key.k_objectid) continue; extent = (__u32 *)reiserfs_item_by_ih (bh, ih); for (j = 0; j < reiserfs_ext_count (ih); j ++) { block = le32_to_cpu (extent [j]); if (!block) continue; tmp_bh = reiserfs_buffer_read (fs->s_dev, block, fs->s_blocksize); if (!tmp_bh) { printf ("reading block %Lu failed\n", (long long int)block * fs->s_blocksize); continue; } if (lseek64 (fd, reiserfs_key_get_off (&ih->ih_key) + j * fs->s_blocksize - 1, SEEK_SET) == (off_t)-1) { printf ("llseek failed to pos %Ld\n", (long long int)block * fs->s_blocksize); reiserfs_buffer_close (tmp_bh); continue; } if (reiserfs_bitmap_test_bit (bitmap, block)) used ++; else not_used ++; /*printf ("block of file %Ld gets block %lu\n", (reiserfs_key_get_off (&ih->ih_key) - 1) / fs->s_blocksize + j, block);*/ if (write (fd, tmp_bh->b_data, tmp_bh->b_size) != tmp_bh->b_size) { printf ("write failed to pos %Ld\n", (long long int)block * fs->s_blocksize); reiserfs_buffer_close (tmp_bh); continue; } recovered += fs->s_blocksize; reiserfs_buffer_close (tmp_bh); } } reiserfs_buffer_close (bh); break; } } printf ("recover_file: %Ld bytes recovered of file %s, key %u %u, %d blocks are free and %d are used\n", recovered, name, key.k_dir_id, key.k_objectid, not_used, used); } #endif /* read a file containing map of one or more files and either recover them or just print info */ /* static void read_map (FILE * fp) { int i; __u32 v32; char * buf; __u32 ids [4]; int do_recover = 0; buf = 0; while (1) { if (fread (&v32, sizeof (v32), 1, fp) != 1) break; if (v32 != MAP_MAGIC) reiserfs_panic ("read_map: no magic found"); // device name length and name itself fread (&v32, sizeof (v32), 1, fp); buf = realloc (buf, v32); if (!buf) reiserfs_panic ("realloc failed"); fread (buf, v32, 1, fp); reiserfs_warning (stdout, "\"%s\": ", buf); // file name length and name itself fread (&v32, sizeof (v32), 1, fp); buf = realloc (buf, v32); if (!buf) reiserfs_panic ("realloc failed"); fread (buf, v32, 1, fp); // read directory key and poined object key fread (ids, sizeof (ids), 1, fp); reiserfs_warning (stdout, "[%K]:\"%s\"-->[%K]\n", &ids[0], buf, &ids[2]); //do_recover = util_user_confirmed (stdout, "recover? (Y):", "Y\n"); //if (do_recover) // reiserfs_warning (stderr, "recovering not ready\n"); // how many data blocks are there fread (&v32, sizeof (v32), 1, fp); if (v32) { buf = realloc (buf, v32 * 4); if (!buf) reiserfs_panic ("realloc failed (%u)", v32); // read list of data block numbers fread (buf, 4, v32, fp); if (!do_recover) { for (i = 0; i < v32; i ++) reiserfs_warning (stdout, "%d ", ((__u32 *)buf)[i]); reiserfs_warning (stdout, "\n"); } } // main tail length fread (&v32, sizeof (v32), 1, fp); if (v32) { // there is tail buf = realloc (buf, v32); if (!buf) reiserfs_panic ("realloc failed"); fread (buf, v32, 1, fp); if (!do_recover) reiserfs_warning (stdout, "%d bytes long tail\n", v32); } else { if (!do_recover) reiserfs_warning (stdout, "No tail\n"); } if (fread (&v32, sizeof (v32), 1, fp) != 1) break; if (v32 != MAP_END_MAGIC) reiserfs_panic ("read_map: no magic found"); } free (buf); } void do_recover (reiserfs_filsys_t * fs) { FILE * fp; if (map_file (fs) [0] != '\0') { fp = fopen (map_file (fs), "r"); if (fp == 0) { reiserfs_warning (stderr, "do_recover: fopen failed: %m"); return; } } else { reiserfs_warning (stderr, "Reading file map from stdin..\n"); fflush (stderr); fp = stdin; } read_map (fp); if (fp != stdin) fclose (fp); } */ #include static long int get_answer(long int max) { char answer[256], *tmp; long int result = 0; do { printf("Which should be left?: "); fgets(answer, sizeof(answer), stdin); result = strtol (answer, &tmp, 0); if ((errno != ERANGE) && (result < max) && (result >= 0) && (answer != tmp)) { break; } } while (1); return result; } static void recover_items(FILE *fp, reiserfs_filsys_t * fs, FILE *target_file) { reiserfs_bh_t *bh, *bh_pointed; reiserfs_ih_t *ih; struct saved_item item, *cur; int size = sizeof(struct saved_item) - sizeof(struct saved_item *); struct saved_item *map = NULL; __u32 map_size = 0; int start = -1; unsigned int i, j; __u64 offset = 0, length; long int result = 0; unsigned long unfm_ptr; while (fread(&item, size, 1, fp) == 1) { map_size += sizeof(struct saved_item); map = realloc(map, map_size); memcpy((void *)map + map_size - sizeof(struct saved_item), &item, size); } for (i = 1, cur = map + 1; i <= map_size / sizeof(struct saved_item); i++, cur++) { bh = reiserfs_buffer_read (fs->fs_dev, (cur - 1)->si_block, fs->fs_blocksize); if (!bh) { reiserfs_warning (fp, "reiserfs_buffer_read failed\n"); continue; } if (i == map_size / sizeof(struct saved_item)) { if (start != -1) { reiserfs_leaf_print(stdout, fs, bh, 0, (cur - 1)->si_item_num, (cur - 1)->si_item_num + 1); result = get_answer(i - start) + start; } else { result = i - 1; } start = -1; } else if (reiserfs_ih_dir(&(cur - 1)->si_ih) || reiserfs_ih_stat(&(cur - 1)->si_ih)) { reiserfs_buffer_close(bh); continue; } else { length = reiserfs_leaf_ibytes(&(cur - 1)->si_ih, fs->fs_blocksize); if (offset < reiserfs_key_get_off(&(cur - 1)->si_ih.ih_key) + reiserfs_leaf_ibytes(&(cur - 1)->si_ih, fs->fs_blocksize)) offset = reiserfs_key_get_off(&(cur - 1)->si_ih.ih_key) + (length ? length - 1 : 0); if (offset >= reiserfs_key_get_off(&cur->si_ih.ih_key)) { /* Problem interval */ if (start == -1) start = i - 1; printf("Problem item %d:\n", i - start - 1); reiserfs_leaf_print(stdout, fs, bh, 0, (cur - 1)->si_item_num, (cur - 1)->si_item_num + 1); } else if (start != -1) { /* problem interval finished */ printf("Problem item %d:\n", i - start - 1); reiserfs_leaf_print(stdout, fs, bh, 0, (cur - 1)->si_item_num, (cur - 1)->si_item_num + 1); result = get_answer((long int)i - start) + start; start = -1; } else { result = i - 1; } } reiserfs_buffer_close(bh); if (start != -1) continue; bh = reiserfs_buffer_read (fs->fs_dev, (map + result)->si_block, fs->fs_blocksize); if (!bh) { reiserfs_warning (fp, "reiserfs_buffer_read failed\n"); continue; } fseek(target_file, reiserfs_key_get_off(&(map + result)->si_ih.ih_key) - 1, SEEK_SET); ih = reiserfs_ih_at (bh, (map + result)->si_item_num); if (reiserfs_ih_direct(ih)) { fwrite(reiserfs_item_by_ih(bh, ih), (map + result)->si_ih.ih2_item_len, 1, target_file); } else if (reiserfs_ih_ext(ih)) { for (j = 0; j < reiserfs_ext_count (ih); j ++) { unfm_ptr = d32_get((__u32 *)reiserfs_item_by_ih(bh, ih), j); if (!unfm_ptr) { fseek(target_file, fs->fs_blocksize, SEEK_CUR); continue; } bh_pointed = reiserfs_buffer_read (fs->fs_dev, unfm_ptr, fs->fs_blocksize); if (!bh_pointed) { reiserfs_warning (fp, "reiserfs_buffer_read failed\n"); continue; } fwrite(bh_pointed->b_data, fs->fs_blocksize, 1, target_file); reiserfs_buffer_close(bh_pointed); } } reiserfs_buffer_close(bh); } free(map); } void do_recover(reiserfs_filsys_t * fs) { FILE *fp, *recovery; if (map_file (fs)[0] != '\0') { fp = fopen (map_file (fs), "r"); if (fp == 0) { reiserfs_warning (stderr, "fopen failed: %m\n"); return; } } else { reiserfs_warning (stderr, "Reading file map from stdin..\n"); fflush (stderr); fp = stdin; } if (!(recovery = fopen(recovery_file(fs), "w+"))) { reiserfs_warning (stderr, "fopen failed: %m\n"); return; } recover_items(fp, fs, recovery); if (fp != stdin) fclose (fp); fclose(recovery); } reiserfsprogs-3.6.20/utils/debugfs/scan.c0000644000175300001440000006766710412227267015317 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "debugreiserfs.h" #include "util/misc.h" #include #include #include #define obstack_chunk_alloc malloc #define obstack_chunk_free free /* -n pattern scans the area (on-disk bitmap, or all the device or extern bitmap) and looks for every name matching the pattern. All those names get stored in 'name_store' and are indexed by name (name_index) and by a key they point to (key_index) */ struct obstack name_store; struct obstack item_store; int saved_names; int saved_items; int skipped_names; void * key_index; void * name_index; regex_t pattern; struct saved_name { unsigned int dirid; /* pointed object */ unsigned int objectid; struct saved_name * first_name; /* pointer to name which points to the same object and contains list of file items */ unsigned int parent_dirid; /* parent directory */ unsigned int parent_objectid; unsigned long block; /* where we saw the name for the first time */ unsigned short count; /* how many times the name appeared */ void * items; struct saved_name * name_next; /* list of identical names */ unsigned short name_len; char name[1]; }; /* attach item to every name in the list */ static void store_item (struct saved_name * name, reiserfs_bh_t * bh, reiserfs_ih_t * ih, int pos) { struct saved_item * new; void * vp; struct saved_item * item_in; new = obstack_alloc (&item_store, sizeof (struct saved_item)); new->si_ih = *ih; new->si_block = bh->b_blocknr; new->si_item_num = ih - reiserfs_ih_at (bh, 0); new->si_next = 0; new->si_entry_pos = pos; vp = tfind (new, &name->items, reiserfs_key_comp); if (vp) { item_in = *(void **)vp; /* add item to the end of list of items having this key */ while (1) { if (!item_in->si_next) { item_in->si_next = new; break; } item_in = item_in->si_next; } } else tsearch (new, &name->items, reiserfs_key_comp); saved_items ++; } static int comp_names (const void * p1, const void * p2) { struct saved_name * name1, * name2; name1 = (struct saved_name *)p1; name2 = (struct saved_name *)p2; return strcmp (name1->name, name2->name); } static int comp_pointed (const void * p1, const void * p2) { struct saved_name * name1, * name2; name1 = (struct saved_name *)p1; name2 = (struct saved_name *)p2; return reiserfs_key_comp2 (&name1->dirid, &name2->dirid); } /* we consider name found only if it points to the same object and from the same directory */ static int name_found (struct saved_name * name, struct saved_name ** name_in) { void * vp; struct saved_name * cur; vp = tfind (name, &name_index, comp_names); if (!vp) { *name_in = 0; return 0; } *name_in = *(void **)vp; /* check every name in the list */ cur = *name_in; while (cur) { if (!reiserfs_key_comp2 (&name->dirid, &cur->dirid) && !reiserfs_key_comp2 (&name->parent_dirid, &cur->parent_dirid)) { cur->count ++; *name_in = cur; return 1; } cur = cur->name_next; } return 0; } /* add key name is pointing to to the index of keys. If there was already name pointing to this key - add pointer to that name */ static void add_key (struct saved_name * name) { void * vp; vp = tfind (name, &key_index, comp_pointed); if (vp) { /* */ name->first_name = *(void **)vp; } else { tsearch (name, &key_index, comp_pointed); } } static void add_name (struct saved_name * name, struct saved_name * name_in) { if (name_in) { /* add name to the end of list of identical names */ while (1) { if (!name_in->name_next) { name_in->name_next = name; break; } name_in = name_in->name_next; } } else { /* add name into name index */ tsearch (name, &name_index, comp_names); } } /* take each name matching to a given pattern, */ static void scan_for_name (reiserfs_bh_t * bh) { int i, j, i_num; reiserfs_ih_t * ih; reiserfs_deh_t * deh; int namelen; char * name; struct saved_name * new, *name_in; char ch; int retval; int min_entry_size = 1; int ih_entry_count = 0; ih = reiserfs_ih_at (bh, 0); i_num = reiserfs_leaf_estimate_items(bh); for (i = 0; i < i_num; i ++, ih ++) { if (!reiserfs_ih_dir (ih)) continue; if (reiserfs_leaf_correct_at (fs, ih, reiserfs_item_by_ih (bh, ih), 0, 1)) { continue; } deh = reiserfs_deh (bh, ih); if ( (reiserfs_ih_get_entries (ih) > (reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size))) || (reiserfs_ih_get_entries (ih) == 0)) ih_entry_count = reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size); else ih_entry_count = reiserfs_ih_get_entries (ih); for (j = 0; j < ih_entry_count; j ++, deh ++) { name = reiserfs_deh_name (deh, j); namelen = reiserfs_direntry_name_len (ih, deh, j); ch = name[namelen]; name[namelen] = 0; retval = regexec (&pattern, name, 0, NULL, 0); name[namelen] = ch; if (retval != 0) continue; /* name matching given pattern found */ new = obstack_alloc (&name_store, sizeof (struct saved_name) + namelen); /* pointed object */ new->dirid = reiserfs_deh_get_did (deh); new->objectid = reiserfs_deh_get_obid (deh); /* pointer to first name which points the same key */ new->first_name = 0; /* where this name is from */ new->parent_dirid = reiserfs_key_get_did (&ih->ih_key); new->parent_objectid = reiserfs_key_get_oid (&ih->ih_key); new->block = bh->b_blocknr; new->count = 1; new->items = 0; /* name */ new->name_len = namelen; memcpy (new->name, name, namelen); new->name [namelen] = 0; new->name_next = 0; /* reiserfs_warning (stdout, "\n(%K):%s-->(%K) - ", &new->parent_dirid, new->name, &new->dirid); */ if (name_found (new, &name_in)) { /* there was already exactly this name */ obstack_free (&name_store, new); continue; } saved_names ++; add_name (new, name_in); add_key (new); } /* for each entry */ } /* for each item */ return; } static struct saved_name *scan_for_key(reiserfs_key_t *key) { struct saved_name * new, *name_in; char name[REISERFS_NAME_MAX]; sprintf(name, "%u_%u", reiserfs_key_get_did (key), reiserfs_key_get_oid (key)); new = obstack_alloc (&name_store, sizeof (struct saved_name) + strlen(name)); /* pointed object */ new->dirid = reiserfs_key_get_did (key); new->objectid = reiserfs_key_get_oid (key); /* pointer to first name which points the same key */ new->first_name = 0; /* where this name is from */ new->parent_dirid = 0; new->parent_objectid = 0; new->block = 0; new->count = 1; new->items = 0; /* name */ new->name_len = strlen(name); memcpy (new->name, name, new->name_len); new->name [new->name_len] = 0; new->name_next = 0; if (name_found (new, &name_in)) { /* there was already exactly this name */ obstack_free (&name_store, new); return name_in; } saved_names ++; add_name (new, name_in); return new; } static int comp_token_key(reiserfs_bh_t *bh, reiserfs_ih_t *ih, reiserfs_key_t *key) { reiserfs_deh_t * deh; int j, ih_entry_count = 0; int min_entry_size = 1; if ((reiserfs_key_get_did(&ih->ih_key) == reiserfs_key_get_did(key) || reiserfs_key_get_did(key) == ~(__u32)0) && (reiserfs_key_get_oid(&ih->ih_key) == reiserfs_key_get_oid(key) || reiserfs_key_get_oid(key) == ~(__u32)0)) return -1; if (!reiserfs_ih_dir (ih)) return 0; deh = reiserfs_deh (bh, ih); if ( (reiserfs_ih_get_entries (ih) > (reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size))) || (reiserfs_ih_get_entries (ih) == 0)) ih_entry_count = reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size); else ih_entry_count = reiserfs_ih_get_entries (ih); for (j = 0; j < ih_entry_count; j ++, deh ++) { if ((reiserfs_deh_get_did (deh) == reiserfs_key_get_did (key) || (int)reiserfs_key_get_did (key) == -1) && (reiserfs_deh_get_obid (deh) == reiserfs_key_get_oid (key) || (int)reiserfs_key_get_oid (key) == -1)) { return j; } } return 0; } /* take every item, look for its key in the key index, if it is found - store item in the sorted list of items of a file */ static void scan_items (reiserfs_bh_t * bh, reiserfs_key_t *key) { int i, i_num, pos; reiserfs_ih_t * ih; struct saved_name * name_in_store; void * res; ih = reiserfs_ih_at (bh, 0); i_num = reiserfs_leaf_estimate_items(bh); for (i = 0; i < i_num; i ++, ih ++) { if (key) { if (!(pos = comp_token_key(bh, ih, key))) continue; name_in_store = scan_for_key(&ih->ih_key); } else { if (!(res = tfind (&ih->ih_key, &key_index, comp_pointed))) continue; /* name pointing to this key found */ name_in_store = *(struct saved_name **)res; pos = -1; } store_item (name_in_store, bh, ih, pos); } } /* FIXME: does not work for long files */ struct version { int flag; /* direct or extent */ int len; __u32 from; int count; void * data; }; struct tail { __u32 offset; int len; char * data; }; struct file_map { int head_len; /* number of unfm pointers */ void * head; int tail_nr; /* number of tails found */ struct tail * tails; int version_nr; void * versions; /* list of range versions */ }; struct file_map map; static int have_to_append (reiserfs_ih_t * ih) { unsigned long long off = reiserfs_key_get_off (&ih->ih_key); if (reiserfs_ih_ext (ih)) { if (map.head_len * fs->fs_blocksize + 1 <= off) return 1; return 0; } else if (reiserfs_ih_direct (ih)) { int i; __u32 tail_start; tail_start = (off & ~(fs->fs_blocksize - 1)) + 1; // find correct tail first for (i = 0; i < map.tail_nr; i ++) { if (map.tails[i].offset == tail_start) { if (map.tails[i].offset + map.tails[i].len <= off) return 1; return 0; } } // there was no this tail yet return 1; } return 0; } static void do_append (reiserfs_ih_t * ih, void * data) { int i; int padd; unsigned long long off = reiserfs_key_get_off (&ih->ih_key); if (reiserfs_ih_ext (ih)) { padd = (off - 1) / fs->fs_blocksize - map.head_len; map.head = realloc (map.head, (map.head_len + padd + reiserfs_ext_count (ih)) * 4); if (!map.head) reiserfs_panic ("realloc failed"); memset ((char *)map.head + map.head_len * 4, 0, padd * 4); memcpy ((char *)map.head + (map.head_len + padd) * 4, data, reiserfs_ih_get_len (ih)); map.head_len += (padd + reiserfs_ext_count (ih)); } else if (reiserfs_ih_direct (ih)) { unsigned int tail_start, skip; // find correct tail first tail_start = (off & ~(fs->fs_blocksize - 1)) + 1; skip = (off - 1) & (fs->fs_blocksize - 1); for (i = 0; i < map.tail_nr; i ++) { if (map.tails[i].offset == tail_start) { map.tails[i].data = realloc (map.tails[i].data, off - tail_start + reiserfs_ih_get_len (ih)); if (!map.tails[i].data) reiserfs_panic ("realloc failed"); padd = skip - map.tails[i].len; memset (map.tails[i].data + map.tails[i].len, 0, padd); memcpy (map.tails[i].data + map.tails[i].len + padd, data, reiserfs_ih_get_len (ih)); map.tails[i].len += (padd + reiserfs_ih_get_len (ih)); return; } } // allocate memory for new tail map.tails = realloc (map.tails, (map.tail_nr + 1) * sizeof (struct tail)); if (!map.tails) reiserfs_panic ("realloc failed"); map.tails[map.tail_nr].offset = off; map.tails[map.tail_nr].len = skip + reiserfs_ih_get_len (ih); map.tails[map.tail_nr].data = malloc (map.tails[map.tail_nr].len); memset (map.tails[map.tail_nr].data, 0, skip); memcpy (map.tails[map.tail_nr].data + skip, data, reiserfs_ih_get_len (ih)); map.tail_nr ++; } } // map contains static void do_overwrite (reiserfs_ih_t * ih, void * data) { unsigned long long off, skip; int to_compare, to_append; reiserfs_ih_t tmp_ih; char * p; off = reiserfs_key_get_off (&ih->ih_key); if (reiserfs_ih_ext (ih)) { skip = (off - 1) / fs->fs_blocksize; to_compare = (map.head_len - skip > reiserfs_ext_count (ih)) ? reiserfs_ext_count (ih) : (map.head_len - skip); to_append = reiserfs_ext_count (ih) - to_compare; p = (char *)map.head + skip * 4; if (memcmp (p, data, to_compare * 4)) reiserfs_warning (stderr, "overwrite (extent): %H contains different data\n", ih); if (to_append) { tmp_ih = *ih; reiserfs_ih_set_len (&tmp_ih, reiserfs_ih_get_len (ih) - to_compare * 4); reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), &tmp_ih.ih_key, off + to_compare * fs->fs_blocksize); do_append (&tmp_ih, (char *)data + to_compare * 4); } } else if (reiserfs_ih_direct (ih)) { unsigned int tail_start; int i; // find correct tail first tail_start = (off & ~(fs->fs_blocksize - 1)) + 1; for (i = 0; i < map.tail_nr; i ++) { if (map.tails[i].offset == tail_start) { // ih is a part of this tail skip = (off - 1) & (fs->fs_blocksize - 1); to_compare = (map.tails[i].len - skip > reiserfs_ih_get_len (ih) ? reiserfs_ih_get_len (ih) : map.tails[i].len - skip); to_append = reiserfs_ih_get_len (ih) - to_compare; p = (char *)map.tails[i].data + skip; if (memcmp (p, data, to_compare)) reiserfs_warning (stderr, "overwrite (direct): %H contains " "different data\n", ih); if (to_append) { tmp_ih = *ih; reiserfs_ih_set_len (&tmp_ih, reiserfs_ih_get_len (ih) - to_compare); reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), &tmp_ih.ih_key, off + to_compare); do_append (&tmp_ih, (char *)data + to_compare); } return; } } reiserfs_panic ("no appropriate tail found"); } } static void map_one_item (struct saved_item * item) { reiserfs_bh_t * bh; reiserfs_ih_t * ih; void * data; // read the block containing the item bh = reiserfs_buffer_read (fs->fs_dev, item->si_block, fs->fs_blocksize); if (!bh) { reiserfs_warning (stderr, "reiserfs_buffer_read failed\n"); return; } ih = reiserfs_ih_at (bh, item->si_item_num); data = reiserfs_item_by_ih (bh, ih); if (memcmp (&item->si_ih, ih, sizeof (*ih))) reiserfs_panic ("wrong item"); if (have_to_append (ih)) { do_append (ih, data); } else do_overwrite (ih, data); reiserfs_buffer_close (bh); } // flush map which is in variable map static void flush_map (reiserfs_filsys_t * fs, reiserfs_key_t * dir, char * name, reiserfs_key_t * key) { int i; FILE * fp; __u32 v32; if (map_file (fs) == '\0') sprintf(map_file (fs), ".map"); //reiserfs_warning (stderr, "Saving maps into %s\n", map_file (fs)); fp = fopen (map_file (fs), "a"); if (fp == 0) { reiserfs_warning (stderr, "flush_map: fopen failed: %m"); return; } v32 = MAP_MAGIC; fwrite (&v32, sizeof (v32), 1, fp); // device name v32 = strlen (device_name (fs)) + 1; fwrite (&v32, sizeof (v32), 1, fp); fwrite (device_name (fs), v32, 1, fp); // name length and the name itself v32 = strlen (name) + 1; fwrite (&v32, sizeof (v32), 1, fp); fwrite (name, v32, 1, fp); // short key of a directory fwrite (dir, REISERFS_KEY_SHSIZE, 1, fp); // short key of file fwrite (key, REISERFS_KEY_SHSIZE, 1, fp); // list of data block pointers fwrite (&map.head_len, sizeof (map.head_len), 1, fp); fwrite (map.head, map.head_len * 4, 1, fp); // find correct tail first for (i = 0; i < map.tail_nr; i ++) { if (map.tails [i].offset == map.head_len * fs->fs_blocksize) { // tail length and the tail itself fwrite (&map.tails [i].len, sizeof (map.tails [i].len), 1, fp); fwrite (map.tails [i].data, map.tails [i].len, 1, fp); break; } } if (i == map.tail_nr) { // no tail v32 = 0; fwrite (&v32, sizeof (v32), 1, fp); } v32 = MAP_END_MAGIC; fwrite (&v32, sizeof (v32), 1, fp); fclose (fp); } // write map of file to a map file /* static void map_item_list (const void *nodep, VISIT value, int level) { struct saved_item * item, * longest; int bytes, max_bytes; if (value != leaf && value != postorder) return; item = *(struct saved_item **)nodep; // 1. find the longest item max_bytes = reiserfs_leaf_ibytes (&item->si_ih, fs->fs_blocksize); longest = item; while (item->si_next) { item = item->si_next; bytes = reiserfs_leaf_ibytes (&item->si_ih, fs->fs_blocksize); if (bytes > max_bytes) { longest = item; max_bytes = bytes; } } map_one_item (longest); // map other items item = *(struct saved_item **)nodep; while (item) { if (item != longest) map_one_item (item); item = item->si_next; } } static void make_file_map (const void *nodep, VISIT value, int level) { struct saved_name * name; static int nr = 0; name = *(struct saved_name **)nodep; if (value == leaf || value == postorder) { while (name) { reiserfs_warning (stdout, "%d - (%d): [%K]:\"%s\":\n", ++nr, name->count, &name->parent_dirid, name->name); if (name->items) { // initialize the map memset (&map, 0, sizeof (struct file_map)); // make a map of file twalk (name->items, map_item_list); // write map to a file flush_map (fs, (reiserfs_key_t *)&name->parent_dirid, name->name, (reiserfs_key_t *)&name->dirid); } else if (name->first_name) reiserfs_warning (stdout, "[%K]:\"%s\" has item list\n", &name->first_name->parent_dirid, name->first_name->name); else { reiserfs_warning (stdout, "No items of the file [%K] found\n", &name->dirid); } name = name->name_next; } } } */ static void print_items(FILE *fp, reiserfs_filsys_t * fs) { reiserfs_bh_t *bh; struct saved_item item; int size = sizeof(struct saved_item) - sizeof(struct saved_item *); while (fread(&item, size, 1, fp) == 1) { bh = reiserfs_buffer_read (fs->fs_dev, item.si_block, fs->fs_blocksize); if (!bh) { reiserfs_warning (fp, "reiserfs_buffer_read failed\n"); continue; } reiserfs_leaf_print(stdout, fs, bh, 0, item.si_item_num, item.si_item_num + 1); reiserfs_buffer_close(bh); } } void print_map(reiserfs_filsys_t * fs) { FILE * fp; if (map_file (fs) [0] != '\0') { fp = fopen (map_file (fs), "r"); if (fp == 0) { reiserfs_warning (stderr, "fopen failed: %m\n"); return; } } else { reiserfs_warning (stderr, "Reading file map from stdin..\n"); fflush (stderr); fp = stdin; } print_items(fp, fs); if (fp != stdin) { fclose (fp); fp = NULL; } } static FILE *fp = 0; FILE * log_to; static void save_items(const void *nodep, VISIT value, int level) { struct saved_item *item; if (value != leaf && value != postorder) return; item = *(struct saved_item **)nodep; while (item) { if (fp) { fwrite(item, sizeof(struct saved_item) - sizeof(struct saved_item *), 1, fp); } else { if (reiserfs_ih_dir (&item->si_ih) && item->si_entry_pos != -1) { reiserfs_warning(log_to, "block %lu, item %d (%H): entry %d\n", item->si_block, item->si_item_num, &item->si_ih, item->si_entry_pos); } else { reiserfs_warning(log_to, "block %lu, item %d belongs to file %K: %H\n", item->si_block, item->si_item_num, &item->si_ih.ih_key, &item->si_ih); } } item = item->si_next; } } static void make_map(const void *nodep, VISIT value, int level) { struct saved_name * name; char file_name[4096]; static int nr = 0; name = *(struct saved_name **)nodep; if (value == leaf || value == postorder) { while (name) { if (map_file(fs)[0] != '\0') { sprintf(file_name, "%s.%d", map_file(fs), ++nr); reiserfs_warning (log_to, "%d - (%d): [%K]:\"%s\": stored in the %s\n", nr, name->count, &name->parent_dirid, name->name, file_name); if (fp == 0) { fp = fopen (file_name, "w+"); if (!fp) { reiserfs_exit (1, "could open %s: %m", file_name); } } } if (name->items) twalk (name->items, save_items); name = name->name_next; if (fp) { fclose(fp); fp = NULL; } } } } /* store map if it is a regular file */ static void locate_file (reiserfs_filsys_t * fs, reiserfs_key_t * key) { REISERFS_PATH_INIT (path); const reiserfs_key_t * next_key; int retval; do { retval = reiserfs_tree_search_item (fs, key, &path); if (retval != ITEM_FOUND) break; if (!reiserfs_key_stat (key) && !reiserfs_key_dir (key)) { struct saved_item si; si.si_block = REISERFS_PATH_LEAF (&path)->b_blocknr; si.si_item_num = REISERFS_PATH_LEAF_POS (&path); si.si_ih = *REISERFS_PATH_IH (&path); map_one_item (&si); } next_key = reiserfs_tree_next_key (&path, fs); if (!next_key || reiserfs_key_comp2 (next_key, key)) break; *key = *next_key; reiserfs_tree_pathrelse (&path); } while (1); reiserfs_tree_pathrelse (&path); } /* read stdin and look for specified name in the specified directory */ static void look_for_name (reiserfs_filsys_t * fs) { char buf[256], *p; unsigned long dirid, objectid; REISERFS_PATH_INIT (path); reiserfs_key_t key = {0, }; reiserfs_warning (stderr, "Enter dirid objectid " "\"name\" or press ^D to quit\n"); while (1) { reiserfs_warning (stderr, ">"); fgets(buf, sizeof(buf), stdin); if ((p = (char *)strtok(buf, " \t\n")) == NULL) continue; if (sscanf(p, "%lu ", &dirid) <= 0) continue; if ((p = (char *)strtok(NULL, " \t\n")) == NULL) continue; if (sscanf(p, "%lu ", &objectid) <= 0) continue; if ((p = (char *)strtok(NULL, " \t\n")) == NULL) continue; reiserfs_key_set_did (&key, dirid); reiserfs_key_set_oid (&key, objectid); p [strlen(p) - 1] = '\0'; reiserfs_warning (stdout, "looking for file \"%s\" in (%K) - ", p, &key); if (reiserfs_tree_scan_name (fs, &key, p, &path)) { reiserfs_key_t fkey = {0, }; reiserfs_deh_t * deh; reiserfs_warning (stdout, "name is found in block %lu (item %d, entry %d)\n", REISERFS_PATH_LEAF (&path)->b_blocknr, REISERFS_PATH_LEAF_POS (&path), path.pos_in_item); deh = reiserfs_deh (REISERFS_PATH_LEAF (&path), REISERFS_PATH_IH (&path)) + path.pos_in_item; reiserfs_key_set_did (&fkey, reiserfs_deh_get_did (deh)); reiserfs_key_set_oid (&fkey, reiserfs_deh_get_obid (deh)); reiserfs_tree_pathrelse (&path); /* look for file and print its layout */ memset (&map, 0, sizeof (struct file_map)); locate_file (fs, &fkey); flush_map (fs, &key, p, &fkey); } else { reiserfs_warning (stdout, "name not found\n"); } } } #if 0 static void scan_for_key (reiserfs_bh_t * bh, reiserfs_key_t * key) { int i, j, i_num; reiserfs_ih_t * ih; reiserfs_deh_t * deh; int min_entry_size = 1; int ih_entry_count = 0; ih = reiserfs_ih_at (bh, 0); i_num = reiserfs_leaf_estimate_items(bh); for (i = 0; i < i_num; i ++, ih ++) { if ((reiserfs_key_get_did(&ih->ih_key) == reiserfs_key_get_did(key) || reiserfs_key_get_did(key) == ~(__u32)0) && (reiserfs_key_get_oid(&ih->ih_key) == reiserfs_key_get_oid(key) || reiserfs_key_get_oid(key) == ~(__u32)0)) { reiserfs_warning(log_to, "%d-th item of block %lu is item of file %K: %H\n", i, bh->b_blocknr, key, ih); } if (!reiserfs_ih_dir (ih)) continue; deh = reiserfs_deh (bh, ih); if ( (reiserfs_ih_get_entries (ih) > (reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size))) || (reiserfs_ih_get_entries (ih) == 0)) ih_entry_count = reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size); else ih_entry_count = reiserfs_ih_get_entries (ih); for (j = 0; j < ih_entry_count; j ++, deh ++) { if ((reiserfs_deh_get_did (deh) == reiserfs_key_get_did (key) || (int)reiserfs_key_get_did (key) == -1) && (reiserfs_deh_get_obid (deh) == reiserfs_key_get_oid (key) || (int)reiserfs_key_get_oid (key) == -1)) { reiserfs_warning (log_to, "dir item %d (%H) of block %lu has " "entry (%d-th) %.*s pointing to %K\n", i, ih, bh->b_blocknr, j, reiserfs_direntry_name_len (ih, deh, j), reiserfs_deh_name (deh, j), key); } } } return; } #endif void do_scan (reiserfs_filsys_t * fs) { unsigned long i; reiserfs_bh_t * bh; int type; char answer[256]; reiserfs_key_t key = {0, 0, }; unsigned long done, total; if (debug_mode (fs) == DO_LOOK_FOR_NAME) { /* look for a file in using tree algorithms */ look_for_name (fs); return; } /* scan area of disk and store all names matching the pattern */ /* initialize storage and two indexes */ obstack_init (&name_store); obstack_init (&item_store); key_index = 0; name_index = 0; total = reiserfs_bitmap_ones (input_bitmap (fs)); log_to = fopen ("scan.log", "w+"); printf ("Log file 'scan.log' is opened\n"); if (debug_mode (fs) == DO_SCAN_FOR_NAME) { if (regcomp (&pattern, name_pattern (fs), 0)) { printf ("regcomp failed"); return; } printf ("Looking for names matching %s\n", name_pattern (fs)); reiserfs_key_set_did (&key, 1); } else { printf ("What key do you want to find: dirid?"); fgets(answer, sizeof(answer), stdin); reiserfs_key_set_did (&key, atoi (answer)); printf ("objectid?"); fgets(answer, sizeof(answer), stdin); reiserfs_key_set_oid (&key, atoi (answer)); reiserfs_warning (stderr, "looking for (%K)\n", &key); } if (debug_mode (fs) == DO_SCAN_FOR_NAME) { done = 0; for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) { if (!reiserfs_bitmap_test_bit (input_bitmap (fs), i)) continue; bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize); if (!bh) { printf ("could not read block %lu\n", i); continue; } type = reiserfs_node_type (bh); if (type == NT_LEAF || type == NT_IH_ARRAY) scan_for_name (bh); else reiserfs_bitmap_clear_bit (input_bitmap (fs), i); reiserfs_buffer_close (bh); if (!misc_test_bit(PRINT_QUIET, &data(fs)->options)) util_misc_progress (stderr, &done, total, 1, 0); } } fprintf (stderr, "\n"); if (debug_mode (fs) == DO_SCAN_FOR_NAME) fprintf (stderr, "There were found %d names matching the pattern \"%s\", %d names skipped\n", saved_names, name_pattern (fs), skipped_names); fflush (stderr); /* step 2: */ done = 0; total = reiserfs_bitmap_ones (input_bitmap (fs)); printf ("%ld bits set in bitmap\n", total); for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) { int type; if (!reiserfs_bitmap_test_bit (input_bitmap (fs), i)) continue; bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize); if (!bh) { printf ("could not read block %lu\n", i); continue; } type = reiserfs_node_type (bh); switch (type) { case NT_JDESC: if (!reiserfs_key_get_did (&key)) printf ("block %lu is journal descriptor\n", i); break; case NT_SUPER: if (!reiserfs_key_get_did (&key)) printf ("block %lu is reiserfs super block\n", i); break; case NT_INTERNAL: if (!reiserfs_key_get_did (&key)) printf ("block %lu is reiserfs internal node\n", i); break; case NT_LEAF: case NT_IH_ARRAY: scan_items (bh, (debug_mode (fs) == DO_SCAN_FOR_NAME ? NULL : &key)); break; default: break; } reiserfs_buffer_close (bh); if (!misc_test_bit(PRINT_QUIET, &data(fs)->options)) util_misc_progress (stderr, &done, total, 1, 0); } fprintf (stderr, "\nThere were %d items saved\n", saved_items); /* ok, print what we found */ /*twalk (name_index, print_file);*/ /* create map for every file in */ twalk (name_index, make_map); /* print names of files we have map of in a file 'file.list' */ /*twalk (name_index, print_name);*/ } reiserfsprogs-3.6.20/utils/debugfs/stat.c0000644000175300001440000001575310412227267015333 00000000000000/* * Copyright 2002-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "debugreiserfs.h" #include "util/misc.h" #include #include #define obstack_chunk_alloc malloc #define obstack_chunk_free free /* try to find blocks which contain only items which are */ /* read blocks marked in debug_bitmap and collect statistic of it: number of stat data */ struct { unsigned long all; unsigned long items [5]; unsigned long unique_keys; /* keys of stat datas */ unsigned long unique_entry_keys; /* keys which appear in directory entries */ unsigned long names; /* dir entries but "." and ".." */ unsigned long dir_blocks; /* block containing only one directory item */ unsigned long unique_items; unsigned long leaves; unsigned long blocks_to_skip; } fs_stat; /* store unique item heads */ struct obstack items; /* tree sorting item heades by comp_items_1 */ void * items_tree; static int comp_items_1 (const void * p1, const void * p2) { int retval; reiserfs_ih_t * ih1, * ih2; /* if (*(int *)p1 != *(int *)p2) retval = 1; else retval = 0; */ retval = reiserfs_key_comp (p1, p2); /*retval = reiserfs_key_comp2 (p1, p2);*/ if (retval) return retval; ih1 = (reiserfs_ih_t *)p1; ih2 = (reiserfs_ih_t *)p2; if (reiserfs_ih_get_len (ih1) < reiserfs_ih_get_len (ih2)) return -1; if (reiserfs_ih_get_len (ih1) > reiserfs_ih_get_len (ih2)) return 1; if (reiserfs_ih_get_entries (ih1) < reiserfs_ih_get_entries (ih2)) return -1; if (reiserfs_ih_get_entries (ih1) > reiserfs_ih_get_entries (ih2)) return 1; return 0; } /* static void print_node (const void *nodep, VISIT value, int level) { int i; if (value == leaf) { for (i = 0; i < level; i ++) reiserfs_warning (stdout, "\t"); reiserfs_warning (stdout, "%H\n", *(reiserfs_ih_t **)nodep); return; } if (value == postorder) { for (i = 0; i < level; i ++) reiserfs_warning (stdout, "\t"); reiserfs_warning (stdout, "%H\n", *(reiserfs_ih_t **)nodep); } } */ static int is_unique_item (struct obstack * ostack, void ** tree, void * ih) { void * res; void * key1; key1 = obstack_copy (ostack, ih, REISERFS_IH_SIZE); res = tsearch (key1, tree, comp_items_1); if (!res) reiserfs_panic ("Too many keys found"); /* twalk (*tree, print_node);*/ /* reiserfs_warning (stderr, "\n\n");*/ if (*(void **)res != key1) { /* key is in tree already, remove it from obstack */ /*reiserfs_warning (stdout, "%H is skipped\n", ih);fflush (stdout);*/ obstack_free (ostack, key1); return 0; } /*reiserfs_warning (stdout, "%k is added\n", ih);fflush (stdout);*/ return 1; } static void stat1_the_leaf (reiserfs_filsys_t * fs, reiserfs_bh_t * bh) { int i, i_num; reiserfs_ih_t * ih; int is_there_unique_item; ih = reiserfs_ih_at (bh, 0); is_there_unique_item = 0; i_num = reiserfs_leaf_estimate_items(bh); for (i = 0; i < i_num; i ++, ih ++) { /* count all items */ fs_stat.all ++; if (is_unique_item (&items, &items_tree, ih)) { /* this is item we have not seen yet */ fs_stat.unique_items ++; is_there_unique_item ++; } } if (!is_there_unique_item) { /* the node contains only items we have seen already. so we will skip it */ fs_stat.blocks_to_skip ++; reiserfs_bitmap_clear_bit (input_bitmap (fs), bh->b_blocknr); } else { ih = reiserfs_ih_at (bh, 0); /* node contains at least one unique item. We will put it in, count items of each type */ for (i = 0; i < i_num; i ++, ih ++) { fs_stat.items [reiserfs_key_get_type (&ih->ih_key)] ++; } } } /* static void stat2_the_leaf (reiserfs_bh_t * bh) { int i; reiserfs_ih_t * ih; ih = reiserfs_ih_at (bh, 0); for (i = 0; i < node_item_number (bh); i ++, ih ++) { } } */ void do_stat (reiserfs_filsys_t * fs) { unsigned long i; unsigned long done, total; reiserfs_bh_t * bh; int type; FILE * fp; obstack_init (&items); items_tree = 0; /* bh = reiserfs_buffer_read (fs->s_dev, 8211, fs->s_blocksize); stat1_the_leaf (fs, bh); return; */ /* pass 0 of stating */ total = reiserfs_bitmap_ones (input_bitmap (fs)); done = 0; for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) { if (!reiserfs_bitmap_test_bit (input_bitmap (fs), i)) continue; if (!misc_test_bit(PRINT_QUIET, &data(fs)->options)) util_misc_progress (stderr, &done, total, 1, 0); bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize); if (!bh) { printf ("could not read block %lu\n", i); continue; } type = reiserfs_node_type (bh); if (type != NT_LEAF && type != NT_IH_ARRAY) { reiserfs_bitmap_clear_bit (input_bitmap (fs), i); reiserfs_buffer_close (bh); continue; } fs_stat.leaves ++; stat1_the_leaf (fs, bh); reiserfs_buffer_close (bh); } reiserfs_warning (stderr, "\nThere were found on the '%s' device:\n" "\tleaves %lu\n" "\ttotal number of items %lu\n" "\tblocks containing at least one unique item %lu\n" "\tblocks which can be skipped %lu\n" "\t\tstat data %lu\n" "\t\textent %lu\n" "\t\tdirect %lu\n" "\t\tdirectory items %lu\n" "\tunique items %lu\n", /* "\tnames there (but \".\" and \"..\") %lu\n" "\tpointing to unique keys %lu\n" "other items %lu\n" "blocks containing only 1 dir item %lu\n", */ fs->fs_file_name, fs_stat.leaves, fs_stat.all, fs_stat.leaves - fs_stat.blocks_to_skip, fs_stat.blocks_to_skip, fs_stat.items [TYPE_STAT_DATA], fs_stat.items [TYPE_EXTENT], fs_stat.items [TYPE_DIRECT], fs_stat.items [TYPE_DIRENTRY], fs_stat.unique_items); /* fs_stat.names, fs_stat.unique_keys, fs_stat.items [4], fs_stat.dir_blocks); */ if (!input_bitmap_file_name(fs)) return; fp = fopen (input_bitmap_file_name(fs), "w"); if (!fp) { reiserfs_exit (1, "could not open %s to save bitmap: %m\n", input_bitmap_file_name(fs)); } reiserfs_warning (stderr, "Updated bitmap contains %d blocks marked\n", reiserfs_bitmap_ones (input_bitmap (fs))); reiserfs_bitmap_save (fp, input_bitmap (fs)); fclose (fp); return; /* pass 2 of stating */ reiserfs_warning (stderr, "Looking for blocks containing only keys not pointed by any of entries\n"); total = reiserfs_bitmap_ones (input_bitmap (fs)); done = 0; for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) { if (!reiserfs_bitmap_test_bit (input_bitmap (fs), i)) continue; if (!misc_test_bit(PRINT_QUIET, &data(fs)->options)) util_misc_progress (stderr, &done, total, 1, 0); bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize); if (!bh) { printf ("could not read block %lu\n", i); continue; } /*stat2_the_leaf (bh);*/ } } reiserfsprogs-3.6.20/utils/debugfs/unpack.c0000644000175300001440000004003510412227267015630 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "debugreiserfs.h" #include "misc/unaligned.h" #include "util/device.h" #include "util/misc.h" #include #include #include #define print_usage_and_exit() misc_die ("Usage: %s [-v] [-b filename] device\n\ -v prints blocks number of every block unpacked\n\ -b filename saves bitmap of blocks unpacked to filename\n\ -j filename stores journal in the filename\n", argv[0]); /* when super block gets unpacked for the first time - create a bitmap and mark in it what have been unpacked. Save that bitmap at the end */ reiserfs_bitmap_t * what_unpacked = 0; int leaves, full; int verbose = 0; int Default_journal = 1; static void unpack_offset (struct packed_item * pi, reiserfs_ih_t * ih, int blocksize) { if (get_pi_mask(pi) & OFFSET_BITS_64) { __u64 v64; if (reiserfs_ih_get_format (ih) != KEY_FORMAT_2) misc_die ("unpack_offset: key format is not set or wrong"); fread_le64 (&v64); reiserfs_key_set_off (KEY_FORMAT_2, &ih->ih_key, v64); return; } if (get_pi_mask(pi) & OFFSET_BITS_32) { __u32 v32; fread_le32 (&v32); reiserfs_key_set_off (reiserfs_ih_get_format (ih), &ih->ih_key, v32); return; } if ((get_pi_mask(pi) & DIR_ID) == 0 && (get_pi_mask(pi) & OBJECT_ID) == 0) { /* offset was not sent, as it can be calculated looking at the previous item */ if (reiserfs_ih_stat (ih - 1)) reiserfs_key_set_off (reiserfs_ih_get_format (ih), &ih->ih_key, 1); if (reiserfs_ih_ext (ih - 1)) reiserfs_key_set_off(reiserfs_ih_get_format (ih), &ih->ih_key, reiserfs_key_get_off (&(ih - 1)->ih_key) + reiserfs_leaf_ibytes (ih - 1, blocksize)); } // offset is 0 return; } static void unpack_type (struct packed_item * pi, reiserfs_ih_t * ih) { reiserfs_key_set_type (reiserfs_ih_get_format (ih), &ih->ih_key, get_pi_type(pi)); if (reiserfs_key_unkn (&ih->ih_key)) reiserfs_panic ("unpack_type: unknown type %d unpacked for %H\n", get_pi_type(pi), ih); } /* direntry item comes in the following format: for each entry mask - 8 bits entry length - 16 bits entry itself deh_objectid - 32 bits maybe deh_dir_id (32 bits) maybe gencounter (16) maybe deh_state (16) */ static void unpack_direntry (struct packed_item * pi, reiserfs_bh_t * bh, reiserfs_ih_t * ih, hashf_t hash_func) { __u16 entry_count, namelen, gen_counter, entry_len; __u8 mask; int i; reiserfs_deh_t * deh; int location; char * item; /* if (!hash_func) misc_die ("unpack_direntry: hash function is not set");*/ if (!(get_pi_mask(pi) & IH_FREE_SPACE)) misc_die ("ih_entry_count must be packed for directory items"); entry_count = reiserfs_ih_get_entries (ih); /* if (!entry_count) reiserfs_panic ("unpack_direntry: entry count should be set already");*/ item = bh->b_data + reiserfs_ih_get_loc (ih); deh = (reiserfs_deh_t *)item; location = get_pi_item_len(pi); for (i = 0; i < entry_count; i ++, deh ++) { fread8 (&mask); fread_le16 (&entry_len); location -= entry_len; reiserfs_deh_set_loc (deh, location); fread (item + location, entry_len, 1, stdin); /* find name length */ namelen = strlen (item + location); if (namelen > entry_len) namelen = entry_len; fread32 (&deh->deh2_objectid); if (mask & HAS_DIR_ID) fread32 (&deh->deh2_dir_id); else reiserfs_deh_set_did (deh, reiserfs_key_get_oid (&ih->ih_key)); if (*(item + location) == '.' && namelen == 1) { /* old or new "." */ reiserfs_deh_set_off (deh, OFFSET_DOT); } else if (*(item + location) == '.' && *(item + location + 1) == '.' && namelen == 2) { /* old or new ".." */ reiserfs_deh_set_off (deh, OFFSET_DOT_DOT); } else if (hash_func) { reiserfs_deh_set_off (deh, reiserfs_hash_value(hash_func, item + location, namelen)); } if (mask & HAS_GEN_COUNTER) { fread_le16 (&gen_counter); reiserfs_deh_set_off (deh, reiserfs_deh_get_off (deh) | gen_counter); } if (mask & HAS_STATE) fread16 (&deh->deh2_state); else reiserfs_deh_set_state (deh, (1 << DEH_Visible2)); } return; } /* struct packed_item is already unpacked */ static void unpack_stat_data (struct packed_item * pi, reiserfs_bh_t * bh, reiserfs_ih_t * ih) { if (!(get_pi_mask(pi) & IH_FREE_SPACE)) { /* ih_free_space was not packed - set default */ reiserfs_ih_set_entries (ih, 0xffff); } if (reiserfs_ih_get_format (ih) == KEY_FORMAT_1) { /* stat data comes in the following format: if this is old stat data: mode - 16 bits nlink - 16 bits size - 32 bits blocks/rdev - 32 bits maybe first_direct byte 32 bits */ reiserfs_sd_v1_t * sd; sd = (reiserfs_sd_v1_t *)reiserfs_item_by_ih (bh, ih); memset (sd, 0, sizeof (sd)); fread16 (&sd->sd_mode); fread16 (&sd->sd_nlink); fread32 (&sd->sd_size); fread32 (&sd->u.sd_blocks); if (get_pi_mask(pi) & WITH_SD_FIRST_DIRECT_BYTE) { fread32 (&sd->sd_fdb); } else { sd->sd_fdb = 0xffffffff; } } else { /* for new stat data mode - 16 bits nlink in either 16 or 32 bits size in either 32 or 64 bits blocks - 32 bits */ reiserfs_sd_t * sd; sd = (reiserfs_sd_t *)reiserfs_item_by_ih (bh, ih); memset (sd, 0, sizeof (sd)); fread16 (&sd->sd_mode); if (get_pi_mask(pi) & NLINK_BITS_32) { fread32 (&sd->sd_nlink); } else { __u16 nlink16; fread16 (&nlink16); reiserfs_set_sd_v2_nlink (sd, le16_to_cpu(nlink16)); } if (get_pi_mask(pi) & SIZE_BITS_64) { fread64 (&sd->sd_size); } else { __u32 size32; /* We need the endian conversions since sd->sd_size is 64 bit */ fread_le32 (&size32); reiserfs_set_sd_v2_size (sd, size32 ); } fread32 (&sd->sd_blocks); } return; } /* extent item comes either in packed form or as is. ih_free_space can go first */ static void unpack_extent (struct packed_item * pi, reiserfs_bh_t * bh, reiserfs_ih_t * ih) { __u32 * ind_item, * end; int i; __u16 v16; if (!(get_pi_mask(pi) & IH_FREE_SPACE)) { /* ih_free_space was not packed - set default */ reiserfs_ih_set_entries (ih, 0); } ind_item = (__u32 *)reiserfs_item_by_ih (bh, ih); if (get_pi_mask(pi) & SAFE_LINK) { d32_put(ind_item, 0, reiserfs_key_get_did(&ih->ih_key)); reiserfs_key_set_did(&ih->ih_key, (__u32)-1); return; } if (get_pi_mask(pi) & WHOLE_EXTENT) { fread (ind_item, get_pi_item_len(pi), 1, stdin); return; } end = ind_item + reiserfs_ext_count (ih); while (ind_item < end) { __u32 base; fread32 (ind_item); fread_le16 (&v16); base = d32_get(ind_item, 0); for (i = 1; i < v16; i ++) { if (base != 0) d32_put(ind_item, i, base + i); else d32_put(ind_item, i, 0); } ind_item += i; } return; } // FIXME: we have no way to preserve symlinks static void unpack_direct (struct packed_item * pi, reiserfs_bh_t * bh, reiserfs_ih_t * ih) { __u32 * d_item = (__u32 *)reiserfs_item_by_ih (bh, ih); if (!(get_pi_mask(pi) & IH_FREE_SPACE)) /* ih_free_space was not packed - set default */ reiserfs_ih_set_entries (ih, 0xffff); if (get_pi_mask(pi) & SAFE_LINK) { d32_put(d_item, 0, reiserfs_key_get_did(&ih->ih_key)); reiserfs_key_set_did(&ih->ih_key, (__u32)-1); } else { memset (d_item, 'a', get_pi_item_len(pi)); } return; } static void unpack_leaf (int dev, hashf_t hash_func, __u16 blocksize) { static int unpacked_leaves = 0; reiserfs_bh_t * bh; struct packed_item pi; reiserfs_ih_t * ih; int i; __u16 v16; __u32 v32; /* block number */ fread_le32 (&v32); /* item number */ fread_le16 (&v16); if (verbose) reiserfs_warning (stderr, "leaf %d: %d items\n", v32, v16); bh = reiserfs_buffer_open (dev, v32, blocksize); if (!bh) misc_die ("unpack_leaf: reiserfs_buffer_open failed"); reiserfs_nh_set_items (NODE_HEAD (bh), v16); reiserfs_nh_set_level (NODE_HEAD (bh), LEAF_LEVEL); reiserfs_nh_set_free (NODE_HEAD (bh), REISERFS_NODE_SPACE (bh->b_size)); ih = reiserfs_ih_at (bh, 0); for (i = 0; i < reiserfs_nh_get_items (NODE_HEAD (bh)); i ++, ih ++) { #if 0 fread32 (&v32); if (v32 != ITEM_START_MAGIC) misc_die ("unpack_leaf: no start item magic found: block %lu, item %i", bh->b_blocknr, i); #endif fread (&pi, sizeof (struct packed_item), 1, stdin); /* dir_id - if it is there */ if (get_pi_mask(&pi) & DIR_ID) { fread32 (&v32); reiserfs_key_set_did (&ih->ih_key, le32_to_cpu(v32)); } else { if (!i) misc_die ("unpack_leaf: dir_id is not set"); reiserfs_key_set_did (&ih->ih_key, reiserfs_key_get_did (&(ih - 1)->ih_key)); } /* object_id - if it is there */ if (get_pi_mask(&pi) & OBJECT_ID) { fread32 (&v32); reiserfs_key_set_oid (&ih->ih_key, le32_to_cpu(v32)); } else { if (!i) misc_die ("unpack_leaf: object_id is not set"); reiserfs_key_set_oid (&ih->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key)); } // we need to set item format before offset unpacking reiserfs_ih_set_format (ih, (get_pi_mask(&pi) & NEW_FORMAT) ? KEY_FORMAT_2 : KEY_FORMAT_1); // offset unpack_offset (&pi, ih, bh->b_size); /* type */ unpack_type (&pi, ih); /* ih_free_space and ih_format */ if (get_pi_mask(&pi) & IH_FREE_SPACE) { fread16 (&v16); reiserfs_ih_set_entries (ih, le16_to_cpu(v16)); } if (get_pi_mask(&pi) & IH_FORMAT) fread16 (&ih->ih_format); /* item length and item location */ reiserfs_ih_set_len (ih, get_pi_item_len(&pi)); reiserfs_ih_set_loc (ih, (i ? reiserfs_ih_get_loc (ih - 1) : bh->b_size) - get_pi_item_len(&pi)); // item itself if (reiserfs_ih_direct (ih)) { unpack_direct (&pi, bh, ih); } else if (reiserfs_ih_ext (ih)) { unpack_extent (&pi, bh, ih); } else if (reiserfs_ih_dir (ih)) { unpack_direntry (&pi, bh, ih, hash_func); } else if (reiserfs_ih_stat (ih)) { unpack_stat_data (&pi, bh, ih); } reiserfs_nh_set_free (NODE_HEAD (bh), reiserfs_nh_get_free (NODE_HEAD (bh)) - (REISERFS_IH_SIZE + reiserfs_ih_get_len (ih))); #if 0 fread32 (&v32); if (v32 != ITEM_END_MAGIC) misc_die ("unpack_leaf: no end item magic found: block %lu, item %i", bh->b_blocknr, i); if (verbose) reiserfs_warning (stderr, "%d: %H\n", i, ih); #endif } fread_le16 (&v16); if (v16 != LEAF_END_MAGIC) misc_die ("unpack_leaf: wrong end signature found - %x, block %lu", v16, bh->b_blocknr); reiserfs_buffer_mkuptodate (bh, 1); reiserfs_buffer_mkdirty (bh); reiserfs_buffer_write (bh); /* if (reiserfs_fs_block(fs, bh->b_blocknr) == BT_UNKNOWN) data_blocks_unpacked ++; */ reiserfs_buffer_close (bh); if (what_unpacked) reiserfs_bitmap_set_bit (what_unpacked, bh->b_blocknr); /*unpacked ++;*/ if (!(++ unpacked_leaves % 10)) fprintf (stderr, "#"); } static void unpack_full_block (int dev, int blocksize) { static int full_blocks_unpacked = 0; __u32 block; reiserfs_bh_t * bh; fread_le32 (&block); if (verbose) fprintf (stderr, "full #%d\n", block); bh = reiserfs_buffer_open (dev, block, blocksize); if (!bh) misc_die ("unpack_full_block: reiserfs_buffer_open failed"); fread (bh->b_data, bh->b_size, 1, stdin); if (reiserfs_node_type (bh) == NT_SUPER && !what_unpacked) { unsigned long blocks; reiserfs_bh_t * tmp; blocks = reiserfs_sb_get_blocks ((reiserfs_sb_t *)(bh->b_data)); fprintf (stderr, "There were %lu blocks on the device\n", blocks); what_unpacked = reiserfs_bitmap_create (blocks); /* make file as long as filesystem is */ tmp = reiserfs_buffer_open (dev, blocks - 1, blocksize); reiserfs_buffer_mkdirty (tmp); reiserfs_buffer_mkuptodate (tmp, 0); reiserfs_buffer_write (tmp); reiserfs_buffer_close (tmp); } reiserfs_buffer_mkuptodate (bh, 1); reiserfs_buffer_mkdirty (bh); reiserfs_buffer_write (bh); /* if (reiserfs_fs_block(fs, bh->b_blocknr) == BT_UNKNOWN) data_blocks_unpacked ++; */ reiserfs_buffer_close (bh); if (what_unpacked) reiserfs_bitmap_set_bit (what_unpacked, block); /*unpacked ++;*/ if (!(++ full_blocks_unpacked % 50)) fprintf (stderr, "."); } /* just skip bitmaps of unformatted nodes */ static void unpack_unformatted_bitmap (int dev, int blocksize) { __u16 bmap_num; __u32 block_count; int i; char * buf; fread_le16 (&bmap_num); fread_le32 (&block_count); buf = malloc (blocksize); if (!buf) reiserfs_panic ("unpack_unformatted_bitmap: malloc failed: %m"); for (i = 0; i < bmap_num; i ++) { if (fread (buf, blocksize, 1, stdin) != 1) reiserfs_panic ("unpack_unformatted_bitmap: " "could not read bitmap #%d: %m", i); } free (buf); } // read packed reiserfs partition metadata from stdin void unpack_partition (int fd, int jfd) { __u32 magic32; long position; __u16 magic16; __u16 blocksize; int dev = fd; fread_le32 (&magic32); if (magic32 != REISERFS_SUPER_MAGIC) misc_die ("unpack_partition: reiserfs magic number (0x%x) not found - %x\n", REISERFS_SUPER_MAGIC, magic32); fread_le16 (&blocksize); if (verbose) fprintf (stderr, "Blocksize %d\n", blocksize); while (!feof (stdin)) { char c[2]; fread (c, 1, 1, stdin); switch (c[0]) { case '.': if (verbose) fprintf (stderr, "\".\" skipped\n"); continue; case '1': fread (c, 1, 1, stdin); /* that was 100%, read in first 0 */ case '2': case '4': case '6': case '8': fread (c, 1, 1, stdin); case '0': fread (c + 1, 1, 1, stdin); /* read % */ if (c[0] != '0' || c[1] != '%') misc_die ("0%% expected\n"); if (verbose) fprintf (stderr, "0%% skipped\n"); continue; } fread (c + 1, 1, 1, stdin); magic16 = le16_to_cpu(*(__u16 *)c); /*fread16 (&magic16);*/ switch (magic16 & 0xff) { case LEAF_START_MAGIC: leaves ++; unpack_leaf (dev, reiserfs_hash_func (magic16 >> 8), blocksize); break; case SEPARATED_JOURNAL_START_MAGIC: if (Default_journal) misc_die ("file name for separated journal has to be specified"); dev = jfd; break; case SEPARATED_JOURNAL_END_MAGIC: dev = fd; break; case FULL_BLOCK_START_MAGIC: full ++; unpack_full_block (dev, blocksize); break; case UNFORMATTED_BITMAP_START_MAGIC: fprintf (stderr, "\nBitmap of unformatted - ignored\n"); unpack_unformatted_bitmap (dev, blocksize); break; case END_MAGIC: goto out; default: position = ftell(stdin); if (position == ~(long)0) misc_die ("unpack_partition: bad magic found - %x", magic16 & 0xff); else misc_die ("unpack_partition: bad magic found - %x, position %lu", magic16 & 0xff, ftell(stdin)); } } out: fprintf (stderr, "Unpacked %d leaves, %d full blocks\n", leaves, full); /* fclose (block_list);*/ } int do_unpack(char *host, char *j_filename, char *filename, int verbose) { int fd, fdj = -2; struct rlimit lim = {RLIM_INFINITY, RLIM_INFINITY}; if (filename == NULL) filename = ".bitmap"; if (j_filename) Default_journal = 0; /* with this 2.4.0-test9's file_write does not send SIGXFSZ */ if (setrlimit (RLIMIT_FSIZE, &lim)) { fprintf (stderr, "sertlimit failed: %m\n"); } if (util_device_mounted(host) > 0) { fprintf(stderr, "%s seems mounted, umount it first\n", host); return 0; } fd = open (host, O_RDWR #ifdef O_LARGEFILE | O_LARGEFILE #endif ); if (fd == -1) { perror ("open failed"); return 0; } if (!Default_journal) { fdj = open (j_filename, O_RDWR #ifdef O_LARGEFILE | O_LARGEFILE #endif ); if (fdj == -1) { perror ("open failed"); return 0; } } unpack_partition (fd, fdj); if (what_unpacked && filename) { FILE * file = util_file_open(filename, "w+"); reiserfs_bitmap_save (file, what_unpacked); fclose (file); } close (fd); if (!Default_journal) close (fdj); return 0; } reiserfsprogs-3.6.20/utils/fsck/0000777000175300001440000000000010412227617013573 500000000000000reiserfsprogs-3.6.20/utils/fsck/Makefile.am0000644000175300001440000000201210412227267015537 00000000000000sbin_PROGRAMS = fsck.reiserfs man_MANS = fsck.reiserfs.8 EXTRA_DIST = fsck.reiserfs.8 fsck_reiserfs_SOURCES = main.c pass0.c pass1.c pass2.c semantic_check.c \ semantic_rebuild.c pass4.c lost+found.c ubitmap.c \ uobjectid.c ufile.c check_tree.c info.c super.c \ rollback.c stage.c leaf.c utree.c relocate.c fsck.h fsck_reiserfs_LDADD = $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libmisc/libmisc-static.a fsck_reiserfs_LDFLAGS = @PROGS_LDFLAGS@ fsck_reiserfs_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include uninstall-reiserfsck: if test -f $(DESTDIR)$(sbindir)/reiserfsck; then \ rm -f $(DESTDIR)$(sbindir)/reiserfsck; \ fi; install-reiserfsck: if test -f $(DESTDIR)$(sbindir)/fsck.reiserfs; then \ rm -f $(DESTDIR)$(sbindir)/reiserfsck; \ ln $(DESTDIR)$(sbindir)/fsck.reiserfs $(DESTDIR)$(sbindir)/reiserfsck; \ fi; install-data-local: install-reiserfsck uninstall-local: uninstall-reiserfsck reiserfsprogs-3.6.20/utils/fsck/Makefile.in0000644000175300001440000015305710412227372015565 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = $(fsck_reiserfs_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ sbin_PROGRAMS = fsck.reiserfs$(EXEEXT) subdir = utils/fsck DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(sbin_PROGRAMS) am_fsck_reiserfs_OBJECTS = fsck_reiserfs-main.$(OBJEXT) \ fsck_reiserfs-pass0.$(OBJEXT) fsck_reiserfs-pass1.$(OBJEXT) \ fsck_reiserfs-pass2.$(OBJEXT) \ fsck_reiserfs-semantic_check.$(OBJEXT) \ fsck_reiserfs-semantic_rebuild.$(OBJEXT) \ fsck_reiserfs-pass4.$(OBJEXT) \ fsck_reiserfs-lost+found.$(OBJEXT) \ fsck_reiserfs-ubitmap.$(OBJEXT) \ fsck_reiserfs-uobjectid.$(OBJEXT) \ fsck_reiserfs-ufile.$(OBJEXT) \ fsck_reiserfs-check_tree.$(OBJEXT) \ fsck_reiserfs-info.$(OBJEXT) fsck_reiserfs-super.$(OBJEXT) \ fsck_reiserfs-rollback.$(OBJEXT) fsck_reiserfs-stage.$(OBJEXT) \ fsck_reiserfs-leaf.$(OBJEXT) fsck_reiserfs-utree.$(OBJEXT) \ fsck_reiserfs-relocate.$(OBJEXT) fsck_reiserfs_OBJECTS = $(am_fsck_reiserfs_OBJECTS) fsck_reiserfs_DEPENDENCIES = $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libmisc/libmisc-static.a DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(fsck_reiserfs_SOURCES) DIST_SOURCES = $(fsck_reiserfs_SOURCES) man8dir = $(mandir)/man8 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ man_MANS = fsck.reiserfs.8 EXTRA_DIST = fsck.reiserfs.8 fsck_reiserfs_SOURCES = main.c pass0.c pass1.c pass2.c semantic_check.c \ semantic_rebuild.c pass4.c lost+found.c ubitmap.c \ uobjectid.c ufile.c check_tree.c info.c super.c \ rollback.c stage.c leaf.c utree.c relocate.c fsck.h fsck_reiserfs_LDADD = $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libmisc/libmisc-static.a fsck_reiserfs_LDFLAGS = @PROGS_LDFLAGS@ fsck_reiserfs_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/fsck/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu utils/fsck/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)" @list='$(sbin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(sbin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \ rm -f "$(DESTDIR)$(sbindir)/$$f"; \ done clean-sbinPROGRAMS: -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) fsck.reiserfs$(EXEEXT): $(fsck_reiserfs_OBJECTS) $(fsck_reiserfs_DEPENDENCIES) @rm -f fsck.reiserfs$(EXEEXT) $(LINK) $(fsck_reiserfs_LDFLAGS) $(fsck_reiserfs_OBJECTS) $(fsck_reiserfs_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-check_tree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-info.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-leaf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-lost+found.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-pass0.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-pass1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-pass2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-pass4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-relocate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-rollback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-semantic_check.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-stage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-super.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-ubitmap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-ufile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-uobjectid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-utree.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` fsck_reiserfs-main.o: main.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-main.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-main.Tpo" -c -o fsck_reiserfs-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-main.Tpo" "$(DEPDIR)/fsck_reiserfs-main.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-main.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='fsck_reiserfs-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c fsck_reiserfs-main.obj: main.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-main.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-main.Tpo" -c -o fsck_reiserfs-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-main.Tpo" "$(DEPDIR)/fsck_reiserfs-main.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-main.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='fsck_reiserfs-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` fsck_reiserfs-pass0.o: pass0.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass0.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass0.Tpo" -c -o fsck_reiserfs-pass0.o `test -f 'pass0.c' || echo '$(srcdir)/'`pass0.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-pass0.Tpo" "$(DEPDIR)/fsck_reiserfs-pass0.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass0.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pass0.c' object='fsck_reiserfs-pass0.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass0.o `test -f 'pass0.c' || echo '$(srcdir)/'`pass0.c fsck_reiserfs-pass0.obj: pass0.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass0.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass0.Tpo" -c -o fsck_reiserfs-pass0.obj `if test -f 'pass0.c'; then $(CYGPATH_W) 'pass0.c'; else $(CYGPATH_W) '$(srcdir)/pass0.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-pass0.Tpo" "$(DEPDIR)/fsck_reiserfs-pass0.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass0.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pass0.c' object='fsck_reiserfs-pass0.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass0.obj `if test -f 'pass0.c'; then $(CYGPATH_W) 'pass0.c'; else $(CYGPATH_W) '$(srcdir)/pass0.c'; fi` fsck_reiserfs-pass1.o: pass1.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass1.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass1.Tpo" -c -o fsck_reiserfs-pass1.o `test -f 'pass1.c' || echo '$(srcdir)/'`pass1.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-pass1.Tpo" "$(DEPDIR)/fsck_reiserfs-pass1.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass1.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pass1.c' object='fsck_reiserfs-pass1.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass1.o `test -f 'pass1.c' || echo '$(srcdir)/'`pass1.c fsck_reiserfs-pass1.obj: pass1.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass1.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass1.Tpo" -c -o fsck_reiserfs-pass1.obj `if test -f 'pass1.c'; then $(CYGPATH_W) 'pass1.c'; else $(CYGPATH_W) '$(srcdir)/pass1.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-pass1.Tpo" "$(DEPDIR)/fsck_reiserfs-pass1.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass1.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pass1.c' object='fsck_reiserfs-pass1.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass1.obj `if test -f 'pass1.c'; then $(CYGPATH_W) 'pass1.c'; else $(CYGPATH_W) '$(srcdir)/pass1.c'; fi` fsck_reiserfs-pass2.o: pass2.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass2.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass2.Tpo" -c -o fsck_reiserfs-pass2.o `test -f 'pass2.c' || echo '$(srcdir)/'`pass2.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-pass2.Tpo" "$(DEPDIR)/fsck_reiserfs-pass2.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass2.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pass2.c' object='fsck_reiserfs-pass2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass2.o `test -f 'pass2.c' || echo '$(srcdir)/'`pass2.c fsck_reiserfs-pass2.obj: pass2.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass2.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass2.Tpo" -c -o fsck_reiserfs-pass2.obj `if test -f 'pass2.c'; then $(CYGPATH_W) 'pass2.c'; else $(CYGPATH_W) '$(srcdir)/pass2.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-pass2.Tpo" "$(DEPDIR)/fsck_reiserfs-pass2.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass2.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pass2.c' object='fsck_reiserfs-pass2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass2.obj `if test -f 'pass2.c'; then $(CYGPATH_W) 'pass2.c'; else $(CYGPATH_W) '$(srcdir)/pass2.c'; fi` fsck_reiserfs-semantic_check.o: semantic_check.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-semantic_check.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-semantic_check.Tpo" -c -o fsck_reiserfs-semantic_check.o `test -f 'semantic_check.c' || echo '$(srcdir)/'`semantic_check.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-semantic_check.Tpo" "$(DEPDIR)/fsck_reiserfs-semantic_check.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-semantic_check.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='semantic_check.c' object='fsck_reiserfs-semantic_check.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-semantic_check.o `test -f 'semantic_check.c' || echo '$(srcdir)/'`semantic_check.c fsck_reiserfs-semantic_check.obj: semantic_check.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-semantic_check.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-semantic_check.Tpo" -c -o fsck_reiserfs-semantic_check.obj `if test -f 'semantic_check.c'; then $(CYGPATH_W) 'semantic_check.c'; else $(CYGPATH_W) '$(srcdir)/semantic_check.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-semantic_check.Tpo" "$(DEPDIR)/fsck_reiserfs-semantic_check.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-semantic_check.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='semantic_check.c' object='fsck_reiserfs-semantic_check.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-semantic_check.obj `if test -f 'semantic_check.c'; then $(CYGPATH_W) 'semantic_check.c'; else $(CYGPATH_W) '$(srcdir)/semantic_check.c'; fi` fsck_reiserfs-semantic_rebuild.o: semantic_rebuild.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-semantic_rebuild.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Tpo" -c -o fsck_reiserfs-semantic_rebuild.o `test -f 'semantic_rebuild.c' || echo '$(srcdir)/'`semantic_rebuild.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Tpo" "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='semantic_rebuild.c' object='fsck_reiserfs-semantic_rebuild.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-semantic_rebuild.o `test -f 'semantic_rebuild.c' || echo '$(srcdir)/'`semantic_rebuild.c fsck_reiserfs-semantic_rebuild.obj: semantic_rebuild.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-semantic_rebuild.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Tpo" -c -o fsck_reiserfs-semantic_rebuild.obj `if test -f 'semantic_rebuild.c'; then $(CYGPATH_W) 'semantic_rebuild.c'; else $(CYGPATH_W) '$(srcdir)/semantic_rebuild.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Tpo" "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='semantic_rebuild.c' object='fsck_reiserfs-semantic_rebuild.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-semantic_rebuild.obj `if test -f 'semantic_rebuild.c'; then $(CYGPATH_W) 'semantic_rebuild.c'; else $(CYGPATH_W) '$(srcdir)/semantic_rebuild.c'; fi` fsck_reiserfs-pass4.o: pass4.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass4.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass4.Tpo" -c -o fsck_reiserfs-pass4.o `test -f 'pass4.c' || echo '$(srcdir)/'`pass4.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-pass4.Tpo" "$(DEPDIR)/fsck_reiserfs-pass4.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass4.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pass4.c' object='fsck_reiserfs-pass4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass4.o `test -f 'pass4.c' || echo '$(srcdir)/'`pass4.c fsck_reiserfs-pass4.obj: pass4.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass4.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass4.Tpo" -c -o fsck_reiserfs-pass4.obj `if test -f 'pass4.c'; then $(CYGPATH_W) 'pass4.c'; else $(CYGPATH_W) '$(srcdir)/pass4.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-pass4.Tpo" "$(DEPDIR)/fsck_reiserfs-pass4.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass4.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pass4.c' object='fsck_reiserfs-pass4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass4.obj `if test -f 'pass4.c'; then $(CYGPATH_W) 'pass4.c'; else $(CYGPATH_W) '$(srcdir)/pass4.c'; fi` fsck_reiserfs-lost+found.o: lost+found.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-lost+found.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-lost+found.Tpo" -c -o fsck_reiserfs-lost+found.o `test -f 'lost+found.c' || echo '$(srcdir)/'`lost+found.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-lost+found.Tpo" "$(DEPDIR)/fsck_reiserfs-lost+found.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-lost+found.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lost+found.c' object='fsck_reiserfs-lost+found.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-lost+found.o `test -f 'lost+found.c' || echo '$(srcdir)/'`lost+found.c fsck_reiserfs-lost+found.obj: lost+found.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-lost+found.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-lost+found.Tpo" -c -o fsck_reiserfs-lost+found.obj `if test -f 'lost+found.c'; then $(CYGPATH_W) 'lost+found.c'; else $(CYGPATH_W) '$(srcdir)/lost+found.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-lost+found.Tpo" "$(DEPDIR)/fsck_reiserfs-lost+found.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-lost+found.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lost+found.c' object='fsck_reiserfs-lost+found.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-lost+found.obj `if test -f 'lost+found.c'; then $(CYGPATH_W) 'lost+found.c'; else $(CYGPATH_W) '$(srcdir)/lost+found.c'; fi` fsck_reiserfs-ubitmap.o: ubitmap.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-ubitmap.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-ubitmap.Tpo" -c -o fsck_reiserfs-ubitmap.o `test -f 'ubitmap.c' || echo '$(srcdir)/'`ubitmap.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-ubitmap.Tpo" "$(DEPDIR)/fsck_reiserfs-ubitmap.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-ubitmap.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ubitmap.c' object='fsck_reiserfs-ubitmap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-ubitmap.o `test -f 'ubitmap.c' || echo '$(srcdir)/'`ubitmap.c fsck_reiserfs-ubitmap.obj: ubitmap.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-ubitmap.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-ubitmap.Tpo" -c -o fsck_reiserfs-ubitmap.obj `if test -f 'ubitmap.c'; then $(CYGPATH_W) 'ubitmap.c'; else $(CYGPATH_W) '$(srcdir)/ubitmap.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-ubitmap.Tpo" "$(DEPDIR)/fsck_reiserfs-ubitmap.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-ubitmap.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ubitmap.c' object='fsck_reiserfs-ubitmap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-ubitmap.obj `if test -f 'ubitmap.c'; then $(CYGPATH_W) 'ubitmap.c'; else $(CYGPATH_W) '$(srcdir)/ubitmap.c'; fi` fsck_reiserfs-uobjectid.o: uobjectid.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-uobjectid.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-uobjectid.Tpo" -c -o fsck_reiserfs-uobjectid.o `test -f 'uobjectid.c' || echo '$(srcdir)/'`uobjectid.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-uobjectid.Tpo" "$(DEPDIR)/fsck_reiserfs-uobjectid.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-uobjectid.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='uobjectid.c' object='fsck_reiserfs-uobjectid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-uobjectid.o `test -f 'uobjectid.c' || echo '$(srcdir)/'`uobjectid.c fsck_reiserfs-uobjectid.obj: uobjectid.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-uobjectid.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-uobjectid.Tpo" -c -o fsck_reiserfs-uobjectid.obj `if test -f 'uobjectid.c'; then $(CYGPATH_W) 'uobjectid.c'; else $(CYGPATH_W) '$(srcdir)/uobjectid.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-uobjectid.Tpo" "$(DEPDIR)/fsck_reiserfs-uobjectid.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-uobjectid.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='uobjectid.c' object='fsck_reiserfs-uobjectid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-uobjectid.obj `if test -f 'uobjectid.c'; then $(CYGPATH_W) 'uobjectid.c'; else $(CYGPATH_W) '$(srcdir)/uobjectid.c'; fi` fsck_reiserfs-ufile.o: ufile.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-ufile.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-ufile.Tpo" -c -o fsck_reiserfs-ufile.o `test -f 'ufile.c' || echo '$(srcdir)/'`ufile.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-ufile.Tpo" "$(DEPDIR)/fsck_reiserfs-ufile.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-ufile.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ufile.c' object='fsck_reiserfs-ufile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-ufile.o `test -f 'ufile.c' || echo '$(srcdir)/'`ufile.c fsck_reiserfs-ufile.obj: ufile.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-ufile.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-ufile.Tpo" -c -o fsck_reiserfs-ufile.obj `if test -f 'ufile.c'; then $(CYGPATH_W) 'ufile.c'; else $(CYGPATH_W) '$(srcdir)/ufile.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-ufile.Tpo" "$(DEPDIR)/fsck_reiserfs-ufile.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-ufile.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ufile.c' object='fsck_reiserfs-ufile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-ufile.obj `if test -f 'ufile.c'; then $(CYGPATH_W) 'ufile.c'; else $(CYGPATH_W) '$(srcdir)/ufile.c'; fi` fsck_reiserfs-check_tree.o: check_tree.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-check_tree.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-check_tree.Tpo" -c -o fsck_reiserfs-check_tree.o `test -f 'check_tree.c' || echo '$(srcdir)/'`check_tree.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-check_tree.Tpo" "$(DEPDIR)/fsck_reiserfs-check_tree.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-check_tree.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='check_tree.c' object='fsck_reiserfs-check_tree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-check_tree.o `test -f 'check_tree.c' || echo '$(srcdir)/'`check_tree.c fsck_reiserfs-check_tree.obj: check_tree.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-check_tree.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-check_tree.Tpo" -c -o fsck_reiserfs-check_tree.obj `if test -f 'check_tree.c'; then $(CYGPATH_W) 'check_tree.c'; else $(CYGPATH_W) '$(srcdir)/check_tree.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-check_tree.Tpo" "$(DEPDIR)/fsck_reiserfs-check_tree.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-check_tree.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='check_tree.c' object='fsck_reiserfs-check_tree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-check_tree.obj `if test -f 'check_tree.c'; then $(CYGPATH_W) 'check_tree.c'; else $(CYGPATH_W) '$(srcdir)/check_tree.c'; fi` fsck_reiserfs-info.o: info.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-info.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-info.Tpo" -c -o fsck_reiserfs-info.o `test -f 'info.c' || echo '$(srcdir)/'`info.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-info.Tpo" "$(DEPDIR)/fsck_reiserfs-info.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-info.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='info.c' object='fsck_reiserfs-info.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-info.o `test -f 'info.c' || echo '$(srcdir)/'`info.c fsck_reiserfs-info.obj: info.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-info.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-info.Tpo" -c -o fsck_reiserfs-info.obj `if test -f 'info.c'; then $(CYGPATH_W) 'info.c'; else $(CYGPATH_W) '$(srcdir)/info.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-info.Tpo" "$(DEPDIR)/fsck_reiserfs-info.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-info.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='info.c' object='fsck_reiserfs-info.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-info.obj `if test -f 'info.c'; then $(CYGPATH_W) 'info.c'; else $(CYGPATH_W) '$(srcdir)/info.c'; fi` fsck_reiserfs-super.o: super.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-super.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-super.Tpo" -c -o fsck_reiserfs-super.o `test -f 'super.c' || echo '$(srcdir)/'`super.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-super.Tpo" "$(DEPDIR)/fsck_reiserfs-super.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-super.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='super.c' object='fsck_reiserfs-super.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-super.o `test -f 'super.c' || echo '$(srcdir)/'`super.c fsck_reiserfs-super.obj: super.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-super.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-super.Tpo" -c -o fsck_reiserfs-super.obj `if test -f 'super.c'; then $(CYGPATH_W) 'super.c'; else $(CYGPATH_W) '$(srcdir)/super.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-super.Tpo" "$(DEPDIR)/fsck_reiserfs-super.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-super.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='super.c' object='fsck_reiserfs-super.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-super.obj `if test -f 'super.c'; then $(CYGPATH_W) 'super.c'; else $(CYGPATH_W) '$(srcdir)/super.c'; fi` fsck_reiserfs-rollback.o: rollback.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-rollback.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-rollback.Tpo" -c -o fsck_reiserfs-rollback.o `test -f 'rollback.c' || echo '$(srcdir)/'`rollback.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-rollback.Tpo" "$(DEPDIR)/fsck_reiserfs-rollback.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-rollback.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rollback.c' object='fsck_reiserfs-rollback.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-rollback.o `test -f 'rollback.c' || echo '$(srcdir)/'`rollback.c fsck_reiserfs-rollback.obj: rollback.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-rollback.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-rollback.Tpo" -c -o fsck_reiserfs-rollback.obj `if test -f 'rollback.c'; then $(CYGPATH_W) 'rollback.c'; else $(CYGPATH_W) '$(srcdir)/rollback.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-rollback.Tpo" "$(DEPDIR)/fsck_reiserfs-rollback.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-rollback.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rollback.c' object='fsck_reiserfs-rollback.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-rollback.obj `if test -f 'rollback.c'; then $(CYGPATH_W) 'rollback.c'; else $(CYGPATH_W) '$(srcdir)/rollback.c'; fi` fsck_reiserfs-stage.o: stage.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-stage.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-stage.Tpo" -c -o fsck_reiserfs-stage.o `test -f 'stage.c' || echo '$(srcdir)/'`stage.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-stage.Tpo" "$(DEPDIR)/fsck_reiserfs-stage.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-stage.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stage.c' object='fsck_reiserfs-stage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-stage.o `test -f 'stage.c' || echo '$(srcdir)/'`stage.c fsck_reiserfs-stage.obj: stage.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-stage.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-stage.Tpo" -c -o fsck_reiserfs-stage.obj `if test -f 'stage.c'; then $(CYGPATH_W) 'stage.c'; else $(CYGPATH_W) '$(srcdir)/stage.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-stage.Tpo" "$(DEPDIR)/fsck_reiserfs-stage.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-stage.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stage.c' object='fsck_reiserfs-stage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-stage.obj `if test -f 'stage.c'; then $(CYGPATH_W) 'stage.c'; else $(CYGPATH_W) '$(srcdir)/stage.c'; fi` fsck_reiserfs-leaf.o: leaf.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-leaf.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-leaf.Tpo" -c -o fsck_reiserfs-leaf.o `test -f 'leaf.c' || echo '$(srcdir)/'`leaf.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-leaf.Tpo" "$(DEPDIR)/fsck_reiserfs-leaf.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-leaf.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='leaf.c' object='fsck_reiserfs-leaf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-leaf.o `test -f 'leaf.c' || echo '$(srcdir)/'`leaf.c fsck_reiserfs-leaf.obj: leaf.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-leaf.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-leaf.Tpo" -c -o fsck_reiserfs-leaf.obj `if test -f 'leaf.c'; then $(CYGPATH_W) 'leaf.c'; else $(CYGPATH_W) '$(srcdir)/leaf.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-leaf.Tpo" "$(DEPDIR)/fsck_reiserfs-leaf.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-leaf.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='leaf.c' object='fsck_reiserfs-leaf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-leaf.obj `if test -f 'leaf.c'; then $(CYGPATH_W) 'leaf.c'; else $(CYGPATH_W) '$(srcdir)/leaf.c'; fi` fsck_reiserfs-utree.o: utree.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-utree.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-utree.Tpo" -c -o fsck_reiserfs-utree.o `test -f 'utree.c' || echo '$(srcdir)/'`utree.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-utree.Tpo" "$(DEPDIR)/fsck_reiserfs-utree.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-utree.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='utree.c' object='fsck_reiserfs-utree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-utree.o `test -f 'utree.c' || echo '$(srcdir)/'`utree.c fsck_reiserfs-utree.obj: utree.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-utree.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-utree.Tpo" -c -o fsck_reiserfs-utree.obj `if test -f 'utree.c'; then $(CYGPATH_W) 'utree.c'; else $(CYGPATH_W) '$(srcdir)/utree.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-utree.Tpo" "$(DEPDIR)/fsck_reiserfs-utree.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-utree.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='utree.c' object='fsck_reiserfs-utree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-utree.obj `if test -f 'utree.c'; then $(CYGPATH_W) 'utree.c'; else $(CYGPATH_W) '$(srcdir)/utree.c'; fi` fsck_reiserfs-relocate.o: relocate.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-relocate.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-relocate.Tpo" -c -o fsck_reiserfs-relocate.o `test -f 'relocate.c' || echo '$(srcdir)/'`relocate.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-relocate.Tpo" "$(DEPDIR)/fsck_reiserfs-relocate.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-relocate.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='relocate.c' object='fsck_reiserfs-relocate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-relocate.o `test -f 'relocate.c' || echo '$(srcdir)/'`relocate.c fsck_reiserfs-relocate.obj: relocate.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-relocate.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-relocate.Tpo" -c -o fsck_reiserfs-relocate.obj `if test -f 'relocate.c'; then $(CYGPATH_W) 'relocate.c'; else $(CYGPATH_W) '$(srcdir)/relocate.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fsck_reiserfs-relocate.Tpo" "$(DEPDIR)/fsck_reiserfs-relocate.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-relocate.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='relocate.c' object='fsck_reiserfs-relocate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-relocate.obj `if test -f 'relocate.c'; then $(CYGPATH_W) 'relocate.c'; else $(CYGPATH_W) '$(srcdir)/relocate.c'; fi` uninstall-info-am: install-man8: $(man8_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)" @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.8*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 8*) ;; \ *) ext='8' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \ done uninstall-man8: @$(NORMAL_UNINSTALL) @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.8*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 8*) ;; \ *) ext='8' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man8dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-data-local install-man install-exec-am: install-sbinPROGRAMS install-info: install-info-am install-man: install-man8 installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am uninstall-local uninstall-man \ uninstall-sbinPROGRAMS uninstall-man: uninstall-man8 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-sbinPROGRAMS ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-exec \ install-exec-am install-info install-info-am install-man \ install-man8 install-sbinPROGRAMS install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am uninstall-local uninstall-man \ uninstall-man8 uninstall-sbinPROGRAMS uninstall-reiserfsck: if test -f $(DESTDIR)$(sbindir)/reiserfsck; then \ rm -f $(DESTDIR)$(sbindir)/reiserfsck; \ fi; install-reiserfsck: if test -f $(DESTDIR)$(sbindir)/fsck.reiserfs; then \ rm -f $(DESTDIR)$(sbindir)/reiserfsck; \ ln $(DESTDIR)$(sbindir)/fsck.reiserfs $(DESTDIR)$(sbindir)/reiserfsck; \ fi; install-data-local: install-reiserfsck uninstall-local: uninstall-reiserfsck # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/utils/fsck/check_tree.c0000644000175300001440000006351710412227267015764 00000000000000/* * Copyright 1999-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/unaligned.h" /* check_fs_tree stops and recommends to run fsck --rebuild-tree when: 1. read fails 2. node of wrong level found in the tree 3. something in the tree points to wrong block number out of filesystem boundary is pointed by tree to block marked as free in bitmap the same block is pointed from more than one place not data blocks (journal area, super block, bitmaps) 4. bad formatted node found 5. delimiting keys are incorrect */ /* mark every block we see in the tree in control_bitmap, so, when to make sure, that no blocks are pointed to from more than one place we use additional bitmap (control_bitmap). If we see pointer to a block we set corresponding bit to 1. If it is set already - run with --rebuild-tree */ static reiserfs_bitmap_t * control_bitmap; static reiserfs_bitmap_t * source_bitmap; static void fsck_tree_check_bitmap_prep (reiserfs_filsys_t * fs) { unsigned int i; unsigned long nr; unsigned long block; unsigned long reserved; unsigned long bmap_nr; nr = reiserfs_sb_get_blocks(fs->fs_ondisk_sb); control_bitmap = reiserfs_bitmap_create(nr); if (!control_bitmap) misc_die ("%s: Failed to allocate a control bitmap.", __FUNCTION__); /* skipped and super block */ for (i = 0; i <= fs->fs_super_bh->b_blocknr; i ++) reiserfs_bitmap_set_bit (control_bitmap, i); /* bitmaps */ bmap_nr = reiserfs_bmap_nr(nr, fs->fs_blocksize); block = fs->fs_super_bh->b_blocknr + 1; for (i = 0; i < bmap_nr; i ++) { reiserfs_bitmap_set_bit (control_bitmap, block); if (reiserfs_bitmap_spread (fs)) block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8); else block ++; } /* mark as used area of the main device either containing a journal or reserved to hold it */ reserved = reiserfs_journal_hostsize(fs->fs_ondisk_sb); /* where does journal area (or reserved journal area) start from */ if (!reiserfs_new_location (fs->fs_super_bh->b_blocknr, fs->fs_blocksize) && !reiserfs_old_location (fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) { misc_die ("%s: Wrong super block location. You must " "run --rebuild-sb.", __FUNCTION__); } block = reiserfs_journal_start_must (fs); for (i = block; i < reserved + block; i ++) reiserfs_bitmap_set_bit (control_bitmap, i); if (fs->fs_badblocks_bm) for (i = 0; i < nr; i ++) { if (reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i)) reiserfs_bitmap_set_bit (control_bitmap, i); } } /* if we managed to complete tree scanning and if control bitmap and/or proper amount of free blocks mismatch with bitmap on disk and super block's s_free_blocks - we can fix that */ static void fsck_tree_check_bitmap_fini (reiserfs_filsys_t * fs) { int problem = 0; /* check free block counter */ if (reiserfs_sb_get_free (fs->fs_ondisk_sb) != reiserfs_bitmap_zeros (control_bitmap)) { /* fsck_log ("vpf-10630: The count of free blocks in the on-disk bitmap " "(%lu) mismatches with the correct one (%lu).\n", reiserfs_sb_get_free (fs->fs_ondisk_sb), reiserfs_bitmap_zeros (control_bitmap)); */ problem++; } if (reiserfs_bitmap_compare (source_bitmap, control_bitmap)) problem++; if (problem) { if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { fsck_log ("vpf-10630: The on-disk and the correct " "bitmaps differs. Will be fixed later.\n"); // fsck_progress ("Trying to fix bitmap ..\n"); /* mark blocks as used in source bitmap if they are used in control bitmap */ reiserfs_bitmap_disjunction (source_bitmap, control_bitmap); /* change used blocks count accordinly source bitmap, copy bitmap changes to on_disk bitmap */ reiserfs_sb_set_free (fs->fs_ondisk_sb, reiserfs_bitmap_zeros(source_bitmap)); reiserfs_bitmap_copy (fs->fs_bitmap2, source_bitmap); reiserfs_buffer_mkdirty (fs->fs_super_bh); /* // check again if ((diff = reiserfs_bitmap_compare(source_bitmap, control_bitmap)) != 0) { // do not mark them as fatal or fixable because one can live // with leaked space. So this is not a fatal corruption, and // fix-fixable cannot fix it fsck_progress (" bitmaps were not recovered.\n\tYou can either " "run rebuild-tree or live with %d leaked blocks\n", diff); } else { fsck_progress ("finished\n"); } */ } else if (problem) { fsck_log ("vpf-10640: The on-disk and the " "correct bitmaps differs.\n"); while (problem) { /* fixable corruptions because we can try to recover them without rebuilding the tree */ one_more_corruption (fs, FIXABLE); problem --; } } } else //fsck_progress ("finished\n"); return; } static int fsck_tree_check_bitmap_auto (reiserfs_filsys_t *fs) { unsigned long i; if (source_bitmap->bm_byte_size != control_bitmap->bm_byte_size) return -1; for (i = 0; i < source_bitmap->bm_byte_size; i ++) { if (control_bitmap->bm_map[i] & ~source_bitmap->bm_map[i]) { return 1; } } return 0; } /* is this block legal to be pointed to by some place of the tree? */ static int fsck_tree_check_blknr (reiserfs_filsys_t * fs, unsigned long block) { if (reiserfs_fs_block(fs, block) != BT_UNKNOWN) { /* block has value which can not be used as a pointer in a tree */ return 1; } return 0; } static int fsck_tree_check_mark_block (unsigned long block) { if (reiserfs_bitmap_test_bit (control_bitmap, block)) { /* block is in tree at least twice */ return 1; } reiserfs_bitmap_set_bit (control_bitmap, block); return 0; } /* 1 if it does not look like reasonable stat data */ static int fsck_tree_check_stat (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, reiserfs_ih_t * ih) { unsigned long objectid; objectid = reiserfs_key_get_oid (&ih->ih_key); if (!reiserfs_objmap_test (fs, objectid)) { /* FIXME: this could be cured right here */ fsck_log ("%s: The objectid (%lu) is marked free, but used by an " "object %k\n", __FUNCTION__, objectid, &ih->ih_key); /* if it is FIX_FIXABLE we flush objectid map at the end no way to call one_less_corruption later */ if (fsck_mode (fs) != FSCK_FIX_FIXABLE) one_more_corruption (fs, FIXABLE); } if (id_map_mark(proper_id_map (fs), objectid)) { fsck_log ("%s: The objectid (%lu) is shared by at least " "two files. Can be fixed with --rebuild-tree " "only.\n", __FUNCTION__, objectid); } return 0; } static inline void handle_one_pointer (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, __u32 * item, int offset) { if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { fsck_log (" - zeroed"); d32_put (item, offset, 0); reiserfs_buffer_mkdirty (bh); } else { one_more_corruption (fs, FIXABLE); } } static int fsck_tree_check_badblock (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, reiserfs_ih_t * ih) { __u32 i; __u32 * ind = (__u32 *)reiserfs_item_by_ih (bh, ih); if (reiserfs_ih_get_len (ih) % 4) { fsck_log ("%s: block %lu: item (%H) has bad length\n", __FUNCTION__, bh->b_blocknr, ih); one_more_corruption (fs, FATAL); return 1; } /* All valid badblocks are given in badblock bitmap. Nothing to check anymore. */ if (fs->fs_badblocks_bm) return 0; for (i = 0; i < reiserfs_ext_count (ih); i ++) { if (!d32_get (ind, i)) { /* fsck_log ("%s: block %lu: badblocks item (%H) has " "zero pointer.", __FUNCTION__, bh->b_blocknr, ih); if (fsck_mode(fs) != FSCK_FIX_FIXABLE) { fsck_log("Not an error, but could be deleted " "with --fix-fixable\n"); } else { fsck_log("Will be deleted later.\n"); } */ continue; } /* check list of badblocks pointers */ if (d32_get (ind, i) >= reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) { fsck_log ("%s: badblock pointer (block %lu) points " "out of disk spase (%lu)", __FUNCTION__, bh->b_blocknr, d32_get (ind, i)); handle_one_pointer (fs, bh, ind, i); fsck_log ("\n"); } if (reiserfs_bitmap_test_bit (control_bitmap, d32_get (ind, i))) { /* it can be 1. not_data_block delete pointer 2. ind [i] or internal/leaf advice to run fix-fixable if there is no fatal errors with list of badblocks, say that it could fix it. */ if (reiserfs_fs_block(fs, d32_get (ind, i)) != BT_UNKNOWN ) { fsck_log ("%s: badblock pointer (block %lu) points on fs " "metadata (%lu)", __FUNCTION__, bh->b_blocknr, d32_get (ind, i)); handle_one_pointer (fs, bh, ind, i); fsck_log ("\n"); } else { one_more_corruption(fs, FIXABLE); fsck_log ("%s: badblock pointer (block %lu) points to " "a block (%lu) which is in the tree already. " "Use badblock option (-B) to fix the problem\n", __FUNCTION__, bh->b_blocknr, d32_get (ind, i)); } continue; } reiserfs_bitmap_set_bit (control_bitmap, d32_get(ind, i)); } return 0; } /* for each unformatted node pointer: make sure it points to data area and that it is not in the tree yet */ static int fsck_tree_check_ext (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, reiserfs_ih_t * ih) { __u32 * ind = (__u32 *)reiserfs_item_by_ih (bh, ih); unsigned int i; if (reiserfs_ih_get_len (ih) % REISERFS_EXT_SIZE) { fsck_log ("%s: block %lu: The item (%H) has the bad length (%u)\n", __FUNCTION__, bh->b_blocknr, ih, reiserfs_ih_get_len (ih)); one_more_corruption (fs, FATAL); return 1; } for (i = 0; i < reiserfs_ext_count (ih); i ++) { fsck_check_stat (fs)->unfm_pointers ++; if (!d32_get (ind, i)) { fsck_check_stat (fs)->zero_unfm_pointers ++; continue; } /* check unformatted node pointer and mark it used in the control bitmap */ if (fsck_tree_check_blknr(fs, d32_get (ind, i))) { fsck_log ("%s: block %lu: The item %k has the bad pointer (%d) to " "the block (%lu)", __FUNCTION__, bh->b_blocknr, &ih->ih_key, i, d32_get (ind, i)); handle_one_pointer (fs, bh, ind, i); fsck_log ("\n"); continue; } if (fsck_tree_check_mark_block (d32_get (ind, i))) { fsck_log ("%s: block %lu: The item (%H) has the bad pointer (%d) " "to the block (%lu), which is in tree already", __FUNCTION__, bh->b_blocknr, ih, i, d32_get (ind, i)); handle_one_pointer (fs, bh, ind, i); fsck_log ("\n"); continue; } } #if 0 /* delete this check for 3.6 */ if (reiserfs_ih_get_free (ih) > fs->fs_blocksize - 1) { if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { /*FIXME: fix it if needed*/ } else { fsck_log ("%s: %H has wrong ih_free_space\n", __FUNCTION__, ih); one_more_corruption (fs, fixable); } } #endif return 0; } static int fsck_tree_check_dir (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, reiserfs_ih_t * ih) { char *name, *prev_name; __u32 off, prev_off; unsigned int count, i; reiserfs_deh_t * deh = reiserfs_deh (bh, ih); int min_entry_size = 1;/* We have no way to understand whether the filesystem was created in 3.6 format or converted to it. So, we assume that minimal name length is 1 */ __u16 state; int namelen; count = reiserfs_ih_get_entries (ih); if (count == 0) { one_more_corruption (fs, FATAL); return 1; } /* make sure item looks like a directory */ if (reiserfs_ih_get_len (ih) / (REISERFS_DEH_SIZE + min_entry_size) < count) { /* entry count can not be that big */ fsck_log ("%s: block %lu: The directory item %k has the exsessively " "big entry count (%u)\n", __FUNCTION__, bh->b_blocknr, &ih->ih_key, count); one_more_corruption (fs, FATAL); return 1; } if (reiserfs_deh_get_loc (&deh[count - 1]) != REISERFS_DEH_SIZE * count) { /* last entry should start right after array of dir entry headers */ fsck_log ("%s: block %lu: The directory item %k has the corrupted " "entry structure\n", __FUNCTION__, bh->b_blocknr, &ih->ih_key); one_more_corruption (fs, FATAL); return 1; } /* check name hashing */ prev_name = reiserfs_item_by_ih(bh, ih) + reiserfs_ih_get_len(ih); prev_off = 0; for (i = 0; i < count; i ++, deh ++) { namelen = reiserfs_direntry_name_len (ih, deh, i); name = reiserfs_deh_name (deh, i); off = reiserfs_deh_get_off (deh); if (namelen > REISERFS_NAME_MAX || name >= prev_name || off <= prev_off) { fsck_log ("%s: block %lu: The directory item %k has a broken entry " "(%d)\n", __FUNCTION__, bh->b_blocknr, &ih->ih_key, i); one_more_corruption (fs, FATAL); return 1; } if (!reiserfs_hash_correct (&fs->hash, name, namelen, off)) { fsck_log ("%s: block %lu: The directory item %k has a not properly " "hashed entry (%d)\n", __FUNCTION__, bh->b_blocknr, &ih->ih_key, i); one_more_corruption (fs, FATAL); return 1; } prev_name = name; prev_off = off; } deh = reiserfs_deh (bh, ih); state = (1 << DEH_Visible2); /* ok, items looks like a directory */ for (i = 0; i < count; i ++, deh ++) { if (reiserfs_deh_get_state (deh) != state) { fsck_log ("%s: block %lu: The directory item %k has the entry (%d) " "\"%.*s\" with a not legal state (%o), (%o) expected", __FUNCTION__, bh->b_blocknr, &ih->ih_key, i, reiserfs_direntry_name_len (ih, deh, i), reiserfs_deh_name (deh, i), reiserfs_deh_get_state (deh), state); if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { reiserfs_deh_set_state (deh, 1 << DEH_Visible2); reiserfs_buffer_mkdirty (bh); fsck_log (" - corrected\n"); } else one_more_corruption (fs, FIXABLE); fsck_log ("\n"); } } return 0; } static int fsck_tree_check_item (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, int num) { reiserfs_ih_t * ih; int format; ih = reiserfs_ih_at (bh, num); if ((reiserfs_ih_get_flags(ih)) != 0) { if (fsck_mode(fs) != FSCK_FIX_FIXABLE) { one_more_corruption (fs, FIXABLE); fsck_log ("%s: vpf-10570: block %lu: The item header (%d) has not " "cleaned flags.\n", __FUNCTION__, bh->b_blocknr, num); } else { fsck_log ("%s: vpf-10580: block %lu: Flags in the item header " "(%d) were cleaned\n", __FUNCTION__, bh->b_blocknr, num); reiserfs_ih_clflags(ih); reiserfs_buffer_mkdirty(bh); } } if (reiserfs_ih_stat(ih) && reiserfs_ih_get_len(ih) == REISERFS_SD_SIZE) { format = KEY_FORMAT_2; } else if (reiserfs_ih_stat(ih) && reiserfs_ih_get_len(ih) == REISERFS_SD_SIZE_V1) { format = KEY_FORMAT_1; } else { format = reiserfs_key_format(&ih->ih_key); } if (format != reiserfs_ih_get_format(ih)) { if (fsck_mode(fs) != FSCK_FIX_FIXABLE) { one_more_corruption (fs, FIXABLE); fsck_log ("%s: vpf-10710: block %lu: The format (%d) specified " "in the item header (%d) differs from the key format " "(%d).\n", __FUNCTION__, bh->b_blocknr, reiserfs_ih_get_format(ih), num, format); } else { fsck_log ("%s: vpf-10720: block %lu: The format (%d) specified " "in the item header (%d) was fixed to the key format " "(%d).\n", __FUNCTION__, bh->b_blocknr, reiserfs_ih_get_format(ih), num, format); reiserfs_ih_set_format(ih, format); reiserfs_buffer_mkdirty(bh); } } if (reiserfs_key_get_oid (&ih->ih_key) == REISERFS_BAD_OID) { if (reiserfs_key_get_did (&ih->ih_key) == REISERFS_BAD_DID && reiserfs_ih_ext (ih)) { /* Bad Block support. */ return fsck_tree_check_badblock (fs, bh, ih); } goto error; } else { if (reiserfs_key_get_did (&ih->ih_key) == (__u32)-1) { /* Safe Link support. Allowable safe links are: -1 object_id 0x1 EXTENT (truncate) or -1 object_id blocksize+1 DIRECT (unlink) */ if (reiserfs_ih_direct(ih) && reiserfs_key_get_off(&ih->ih_key) == fs->fs_blocksize + 1) { if (reiserfs_ih_get_len (ih) == 4) { /* fsck_log("vpf-00010: safe link found %k\n", &ih->ih_key);*/ fsck_check_stat(fs)->safe ++; return 0; } } if (reiserfs_ih_ext(ih) && reiserfs_key_get_off(&ih->ih_key) == 0x1) { if (reiserfs_ih_get_len (ih) == 4) { /* fsck_log("vpf-00020: safe link found %k\n", &ih->ih_key);*/ fsck_check_stat(fs)->safe ++; return 0; } } /* it does not look like safe link */ goto error; } } if (reiserfs_ih_stat (ih)) return fsck_tree_check_stat (fs, bh, ih); if (reiserfs_ih_direct (ih)) return 0; if (reiserfs_ih_ext(ih)) return fsck_tree_check_ext (fs, bh, ih); return fsck_tree_check_dir (fs, bh, ih); error: one_more_corruption (fs, FATAL); fsck_log ("%s: vpf-10310: block %lu, item %d: The item has a wrong " "key %k\n", __FUNCTION__, num, bh->b_blocknr, &ih->ih_key); return 1; } /* 1 if block head or any of items is bad */ static int fsck_tree_leaf_check (reiserfs_filsys_t * fs, reiserfs_bh_t * bh) { int i; if (fsck_leaf_check_header(fs, bh)) return 1; for (i = 0; i < reiserfs_node_items (bh); i ++) { if (fsck_tree_check_item (fs, bh, i)) { fsck_log ("%s: block %lu, item %d: The corrupted item found (%H)\n", __FUNCTION__, bh->b_blocknr, i, reiserfs_ih_at (bh, i)); } if (i && fsck_leaf_check_neigh (fs, bh, i)) { fsck_log ("%s: block %lu, items %d and %d: The wrong order of " "items: %k, %k\n", __FUNCTION__, bh->b_blocknr, i - 1, i, &reiserfs_ih_at (bh, i - 1)->ih_key, &reiserfs_ih_at (bh, i)->ih_key); } } return 0; } /* 1 if bh does not look like internal node */ static int fsck_tree_check_internal (reiserfs_filsys_t * fs, reiserfs_bh_t * bh) { int i; for (i = 0; i <= reiserfs_node_items (bh); i ++) { if (i != reiserfs_node_items (bh) && i != reiserfs_node_items (bh) - 1) { /* make sure that keys are in increasing order */ if (reiserfs_key_comp (reiserfs_int_key_at (bh, i), reiserfs_int_key_at (bh, i + 1)) != -1) { fsck_log ("%s: vpf-10320: block %lu, items %d and %d: The " "wrong order of items: %k, %k\n", __FUNCTION__, bh->b_blocknr, i, i + 1, reiserfs_int_key_at (bh, i), reiserfs_int_key_at (bh, i + 1)); one_more_corruption (fs, FATAL); return 1; } } /* make sure that the child is correct */ if (fsck_tree_check_blknr(fs, reiserfs_dc_get_nr (reiserfs_int_at (bh,i)))) { fsck_log ("%s: vpf-10330: block %lu, item %d: The internal " "item points to the not legal block (%lu)\n", __FUNCTION__, bh->b_blocknr, i, reiserfs_dc_get_nr (reiserfs_int_at (bh,i))); one_more_corruption (fs, FATAL); return 1; } } return 0; } /* h == 0 for root level. block head's level == 1 for leaf level */ static inline int h_to_level (reiserfs_filsys_t * fs, int h) { return reiserfs_sb_get_height (fs->fs_ondisk_sb) - h + 1; } /* bh must be formatted node. blk_level must be tree_height - path.path_length */ static int fsck_tree_check_node (reiserfs_filsys_t * fs, reiserfs_path_t * path) { reiserfs_bh_t *pbh = REISERFS_PATH_LEAF(path); if (reiserfs_node_level(pbh) != h_to_level (fs, path->path_length)) { fsck_log ("block %lu: The level of the node (%d) is not " "correct, (%d) expected\n", pbh->b_blocknr, reiserfs_node_level(pbh), h_to_level(fs, path->path_length)); one_more_corruption (fs, FATAL); return 1; } if (fsck_tree_check_blknr(fs, pbh->b_blocknr)) { one_more_corruption (fs, FATAL); fsck_log ("%s: vpf-10340: The node in the wrong block number (%lu) " "found in the tree\n", __FUNCTION__, pbh->b_blocknr); return 1; } if (fsck_tree_check_mark_block (pbh->b_blocknr)) { fsck_log ("%s: vpf-10350: The block (%lu) is used more than once " "in the tree.\n", __FUNCTION__, pbh->b_blocknr); one_more_corruption (fs, FATAL); return 1; } if (reiserfs_leaf_head(pbh)) { fsck_check_stat (fs)->leaves ++; return fsck_tree_leaf_check (fs, pbh); } fsck_check_stat (fs)->internals ++; return fsck_tree_check_internal (fs, pbh); } /* are all delimiting keys correct */ static int fsck_tree_check_path (reiserfs_filsys_t * fs, reiserfs_path_t * path) { const reiserfs_key_t *dk; reiserfs_bh_t *parent; reiserfs_bh_t *bh; int items; int pos; int h1; h1 = REISERFS_PATH_OFFILL; while (path->path_elements[h1 + 1].pe_buffer) h1 ++; // path[h] is leaf if (h1 != path->path_length) misc_die ("%s: The leaf is expected as the last " "element in the path.", __FUNCTION__); bh = REISERFS_PATH_LEAF(path); if (h1 != REISERFS_PATH_OFFINIT) { parent = REISERFS_PATH_BUFFER(path, h1 - 1); pos = reiserfs_internal_get_pos (parent, bh->b_blocknr); } else { parent = NULL; pos = 0; } dk = reiserfs_tree_lkey (path, fs); if (dk != &MIN_KEY && reiserfs_key_comp (dk, reiserfs_ih_key_at (bh, 0))) { /* left delimiting key must be equal to the key of 0-th item in the node */ fsck_log ("%s: The left delimiting key %k of the node (%lu) must " "be equal to the first element's key %k within the node.\n", __FUNCTION__, dk, bh->b_blocknr, reiserfs_ih_key_at(bh, 0)); one_more_corruption (fs, FATAL); return 1; } items = reiserfs_nh_get_items( NODE_HEAD(bh) ) - 1; dk = reiserfs_tree_rkey (path, fs); if (dk != &MAX_KEY && reiserfs_key_comp (dk, reiserfs_ih_key_at (bh, items)) != 1) { /* right delimiting key must be greather then the key of the last item in the node */ fsck_log ("%s: The right delimiting key %k of the node (%lu) must " "be greater than the last (%d) element's key %k within " "the node.\n", __FUNCTION__, dk, bh->b_blocknr, reiserfs_nh_get_items (NODE_HEAD (bh)) - 1, reiserfs_ih_key_at (bh, items)); one_more_corruption (fs, FATAL); return 1; } if ((h1 != REISERFS_PATH_OFFINIT) && (reiserfs_dc_get_size(reiserfs_int_at(parent, pos)) + reiserfs_nh_get_free(NODE_HEAD(bh)) + REISERFS_NODEH_SIZE != bh->b_size)) { /* wrong dc_size */ fsck_log ("bad_path: block %lu, pointer %d: The used space (%d) " "of the child block (%lu)", parent->b_blocknr, pos, reiserfs_dc_get_size(reiserfs_int_at(parent, pos)), bh->b_blocknr); fsck_log (" is not equal to the (blocksize (4096) - free space (%d) - " "header size (%u))", reiserfs_nh_get_free(NODE_HEAD(bh)), REISERFS_NODEH_SIZE); if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { reiserfs_dc_set_size ( reiserfs_int_at(parent, pos), bh->b_size - reiserfs_nh_get_free(NODE_HEAD(bh)) - REISERFS_NODEH_SIZE); fsck_log (" - corrected to (%lu)\n", reiserfs_dc_get_size (reiserfs_int_at(parent, pos))); reiserfs_buffer_mkdirty (parent); } else { one_more_corruption (fs, FIXABLE); fsck_log ("\n"); return 1; } } return 0; } static void fsck_tree_check_prep (reiserfs_filsys_t * fs) { fsck_tree_check_bitmap_prep (fs); source_bitmap = reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb)); reiserfs_bitmap_copy (source_bitmap, fs->fs_bitmap2); proper_id_map (fs) = id_map_init(); } static void fsck_tree_check_fini (reiserfs_filsys_t * fs) { if (fsck_mode(fs) == FSCK_FIX_FIXABLE) { reiserfs_bitmap_flush(fs->fs_bitmap2, fs); reiserfs_fs_flush (fs); fs->fs_dirt = 1; reiserfs_bitmap_delta (source_bitmap, control_bitmap); fsck_deallocate_bitmap(fs) = source_bitmap; } else reiserfs_bitmap_delete (source_bitmap); reiserfs_bitmap_delete (control_bitmap); reiserfs_buffer_flush_all (fs->fs_dev); } /* pass internal tree of filesystem */ void check_fs_tree (reiserfs_filsys_t * fs) { fsck_tree_check_prep (fs); fsck_progress ("Checking Internal tree...\n"); fsck_tree_trav (fs, fsck_tree_check_node, fsck_tree_check_path, fsck_mode(fs) == FSCK_AUTO ? 2 : -1); if (!fsck_quiet(fs)) fsck_progress("\n"); /* compare created bitmap with the original */ if (fsck_mode(fs) == FSCK_AUTO) { if (fsck_tree_check_bitmap_auto(fs)) { fprintf(stderr, "The on-disk bitmap looks corrupted."); one_more_corruption(fs, FIXABLE); } id_map_free(proper_id_map(fs)); } else fsck_tree_check_bitmap_fini(fs); fsck_tree_check_fini (fs); } static int clean_attributes_handler (reiserfs_filsys_t * fs, reiserfs_path_t * path) { reiserfs_bh_t * bh = REISERFS_PATH_LEAF(path); int i; if (reiserfs_node_level (bh) != h_to_level (fs, path->path_length)) { reiserfs_panic ("The node (%lu) with wrong level (%d) " "found in the tree, (%d) expected\n", bh->b_blocknr, reiserfs_node_level (bh), h_to_level (fs, path->path_length)); } if (!reiserfs_leaf_head (bh)) return 0; for (i = 0; i < reiserfs_node_items (bh); i ++) { if (reiserfs_ih_stat (reiserfs_ih_at (bh, i)) && reiserfs_ih_get_len (reiserfs_ih_at (bh, i)) == REISERFS_SD_SIZE) { reiserfs_set_sd_v2_attrs ((reiserfs_sd_t *)reiserfs_item_at(bh, i), 0); reiserfs_buffer_mkdirty (bh); } } return 0; } void fsck_tree_clean_attr (reiserfs_filsys_t * fs) { fsck_tree_trav (fs, clean_attributes_handler, NULL, -1); reiserfs_sb_mkflag (fs->fs_ondisk_sb, reiserfs_attrs_cleared); reiserfs_buffer_mkdirty (fs->fs_super_bh); } reiserfsprogs-3.6.20/utils/fsck/fsck.h0000644000175300001440000004072410412227267014616 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #include "reiserfs/libreiserfs.h" #include #if 0 #include "io.h" #include "misc.h" #include "reiserfs_lib.h" #include #include #include #include #include "../version.h" #endif /* main.c */ extern reiserfs_filsys_t * fs; /* Exit codes. */ #define EXIT_OK 0 #define EXIT_FIXED 1 #define EXIT_REBOOT 2 #define EXIT_FATAL 4 #define EXIT_FIXABLE 6 #define EXIT_OPER 8 /* Some operation returns error. */ #define EXIT_USER 16 /* * modes */ #define DO_NOTHING 0 #define FSCK_CHECK 1 #define FSCK_FIX_FIXABLE 2 #define FSCK_SB 3 #define FSCK_REBUILD 4 #define FSCK_ROLLBACK_CHANGES 5 #define FSCK_CLEAN_ATTRIBUTES 7 #define FSCK_AUTO 8 /* -a || -p specified */ /* temporary */ #define DO_TEST 9 /* * options */ #define OPT_INTERACTIVE 1 << 0 #define OPT_ADJUST_FILE_SIZE 1 << 1 /* not default yet */ #define OPT_QUIET 1 << 2 /* no "speed" info */ #define OPT_SILENT 1 << 3 /* no complains about found corruptions */ #define OPT_BACKGROUND 1 << 4 #define OPT_SKIP_JOURNAL 1 << 5 #define OPT_HASH_DEFINED 1 << 6 #define OPT_SAVE_PASSES_DUMP 1 << 7 #define OPT_SAVE_ROLLBACK 1 << 8 #define OPT_YES 1 << 9 #define BADBLOCKS_FILE 1 << 10 /* set by fsck when pass-by-pass (-d), FS_FATAL flag included */ enum fsck_state_flags { PASS_0_DONE = 0xfa02, PASS_1_DONE = 0xfb02, TREE_IS_BUILT = 0xfc02, SEMANTIC_DONE = 0xfd02, LOST_FOUND_DONE = 0xfe02 }; /* Stage.c */ extern void fsck_stage_start_put (FILE * file, unsigned long stage); extern void fsck_stage_end_put (FILE * file); extern int fsck_stage_magic_check (FILE * fp); /* pass0.c */ extern int pass0_block_isbad_unfm(unsigned long block); extern int pass0_block_isgood_unfm(unsigned long block); extern int pass0_block_isleaf(unsigned long block); extern void pass0_block_clleaf(unsigned long block); extern void fsck_pass0 (reiserfs_filsys_t *); extern void fsck_pass0_load_result (FILE *, reiserfs_filsys_t *); extern void make_allocable (unsigned long block); extern int fsck_leaf_check(reiserfs_bh_t * bh); extern unsigned long alloc_block (void); extern void fsck_pass0_aux_fini (); extern int fsck_leaf_item_check (reiserfs_bh_t * bh, reiserfs_ih_t *, char *); extern int are_there_allocable_blocks (unsigned int amout_needed); extern int fsck_leaf_check_header(reiserfs_filsys_t * fs, reiserfs_bh_t * bh); /* pass1.c */ #define fsck_item_reach(ih) (reiserfs_ih_isreach (ih) ? 1 : 0) #define fsck_item_mkunreach(ih) \ ({ \ reiserfs_ih_clflags (ih); \ reiserfs_ih_mkunreach (ih); \ \ if (reiserfs_ih_ext (ih)) \ reiserfs_ih_set_free (ih, 0); \ }) #define fsck_item_mkreach(ih, bh) \ ({ \ reiserfs_ih_clunreach (ih); \ reiserfs_buffer_mkdirty (bh); \ }) extern void fsck_pass1 (reiserfs_filsys_t *); extern void fsck_pass1_load_result (FILE *, reiserfs_filsys_t *); extern void fsck_pass2 (reiserfs_filsys_t *); extern void fsck_info_checkmem(void); /* pass2.c */ typedef struct saveitem saveitem_t; struct saveitem { reiserfs_ih_t si_ih; char * si_dnm_data; saveitem_t * si_next; __u32 si_blocknr; // changed by XB; saveitem_t * last_known; }; extern void fsck_pass2_load_result (reiserfs_filsys_t *); extern void fsck_item_save(reiserfs_path_t * path, saveitem_t ** head); extern saveitem_t * fsck_item_free(saveitem_t * si); extern void fsck_tree_insert_item (reiserfs_ih_t * ih, char * item, int was_in_tree); extern void fsck_tree_merge(reiserfs_path_t *path); extern long long int must_there_be_a_hole (const reiserfs_ih_t *ih, const reiserfs_key_t *key); extern int fsck_tree_insert_zero_ptr (reiserfs_filsys_t *fs, reiserfs_key_t *key, long long int p_count, __u16 flags); extern void fsck_tree_rewrite(reiserfs_filsys_t *fs, const reiserfs_key_t *start_key, __u64 end, __u16 flags); typedef int (*tree_modify_t) (reiserfs_path_t *path, void *data); /* relocate.c */ extern void fsck_relocate_mklinked(reiserfs_key_t *new_key); extern __u32 fsck_relocate_get_oid (reiserfs_key_t * key); extern __u32 fsck_relocate_oid(reiserfs_key_t * key); extern void fsck_relocate_link_all (void); extern __u32 fsck_relocate_check (reiserfs_ih_t * ih, int isdir); /* semantic.c */ /* return values for check_regular_file and check_semantic_tree */ #define OK 0 #define STAT_DATA_NOT_FOUND -1 #define DIRECTORY_HAS_NO_ITEMS -2 #define RELOCATED -3 #define LOOP_FOUND -4 extern void fsck_semantic (reiserfs_filsys_t *); extern void fsck_semantic_load_result (FILE *, reiserfs_filsys_t *); extern void fsck_semantic_check (void); extern int is_dot_dot (char * name, int namelen); extern int is_dot (char * name, int namelen); extern int not_a_directory (void * sd); extern int not_a_regfile (void * sd); extern void zero_nlink (reiserfs_ih_t * ih, void * sd); extern int fix_obviously_wrong_sd_mode (reiserfs_path_t * path); extern int wrong_st_blocks(const reiserfs_key_t * key, __u32 * blocks, __u32 sd_blocks, __u16 mode, int new_format); extern int wrong_st_size (const reiserfs_key_t * key, unsigned long long max_file_size, int blocksize, __u64 * size, __u64 sd_size, int type); extern int rebuild_semantic_pass (reiserfs_key_t * key, const reiserfs_key_t * parent, int is_dot_dot, reiserfs_ih_t * new_ih); extern void relocate_dir (reiserfs_ih_t * ih); extern int rebuild_check_regular_file (reiserfs_path_t * path, void * sd, reiserfs_ih_t * new_ih); /* lost+found.c */ extern void fsck_lost (reiserfs_filsys_t *); extern void fsck_lost_load_result (reiserfs_filsys_t *); /* objectid.c */ typedef struct id_map { void **index; __u32 count, last_used; } id_map_t; extern void id_map_flush(struct id_map * map, reiserfs_filsys_t * fs); extern void id_map_free(id_map_t *); extern int id_map_mark(id_map_t *map, __u32 id); extern id_map_t *id_map_init(); extern __u32 id_map_alloc(id_map_t *map); extern int id_map_test(id_map_t *map, __u32 id); extern void fetch_objectid_map (struct id_map * map, reiserfs_filsys_t * fs); extern void reiserfs_objectid_map_save (FILE * fp, struct id_map * id_map); extern struct id_map * reiserfs_objectid_map_load (FILE * fp); /* rollback.c */ extern void fsck_rollback_fini (); extern void fsck_rollback_init (char * rollback_file, unsigned int *bloksize, FILE * log); extern int fsck_rollback_prep (char * rollback_file, FILE * log); extern void fsck_rollback (int fd_device, int fd_journal_device, FILE * log); /* pass4.c */ extern void fsck_cleanup (void); /* check_tree.c */ extern void check_fs_tree (reiserfs_filsys_t *); extern void fsck_tree_clean_attr (reiserfs_filsys_t * fs); extern int fsck_leaf_check_neigh (reiserfs_filsys_t *fs, reiserfs_bh_t * bh, int i); extern int fsck_tree_delete(reiserfs_key_t * start_key, saveitem_t ** save_here, int skip_dir_items, tree_modify_t func, void *data); /* ubitmap.c */ extern int is_block_used (unsigned long block); extern void mark_block_used (unsigned long block, int check_hardware); extern void fsck_bitmap_mkuninsert (unsigned long block); extern int fsck_bitmap_isuninsert (unsigned long block); extern void fsck_bitmap_cluninsert (unsigned long block); extern int reiserfsck_new_blocknrs (reiserfs_filsys_t * fs, unsigned long * pblocknrs, unsigned long start_from, int amount_needed); extern int reiserfsck_free_block (reiserfs_filsys_t * fs, unsigned long block); extern reiserfs_bh_t * reiserfsck_get_new_buffer (unsigned long start); /* ufile.c */ #define FSCK_MAX_GAP(bs) \ (100 * REISERFS_ITEM_MAX(bs) / REISERFS_EXT_SIZE * bs) extern void fsck_file_relocate (reiserfs_key_t *key, int update_key); extern int reiserfsck_file_write (reiserfs_ih_t * ih, char * item, int was_in_tree); extern int are_file_items_correct (reiserfs_ih_t * sd_ih, void * sd, __u64 * size, __u32 * blocks, int mark_passed_items, int * symlink); /* ustree.c*/ typedef int (*path_func_t) (reiserfs_filsys_t *, reiserfs_path_t *); extern void fsck_tree_trav (reiserfs_filsys_t *, path_func_t, path_func_t, int depth); enum fsck_stage { FS_CHECK = 0x0, FS_PASS0 = 0x1, FS_PASS1 = 0x2, FS_PASS2 = 0x3, FS_SEMANTIC = 0x4, FS_LOST = 0x5, FS_CLEANUP = 0x6, FS_LAST }; struct pass0_stat { unsigned long dealt_with; /* number of blocks read during pass 0 */ unsigned long leaves; /* blocks looking like reiserfs leaves found */ unsigned long leaves_corrected; unsigned long all_contents_removed; unsigned long too_old_leaves; /* these are leaves which contains direntries with different hash from the one specified with -h */ unsigned long wrong_pointers; /* pointers in extent items pointing to wrong area */ unsigned long pointed; /* pointers blocks of device pointed by all extent items */ /* number of removed items. */ unsigned long long removed; }; struct pass1_stat { unsigned long leaves; /* leaves found in pass0 to build tree off */ unsigned long inserted_leaves; /* number of leaves inserted by pointers */ unsigned long pointed_leaves; /* pointers in extent items which pointed to leaves (zeroed) */ unsigned long uninsertable_leaves; unsigned long non_unique_pointers; /* pointers to already pointed unformatted nodes */ unsigned long correct_pointers; unsigned long allocable_blocks; /* allocable blocks before pass 1 starts */ }; struct pass2_stat { unsigned long leaves; /* leaves inserted item by item */ unsigned long safe_non_unique_pointers; /* these are just the same pointers */ unsigned long relocated; unsigned long shared_objectids; unsigned long rewritten; }; struct semantic_stat { unsigned long regular_files; unsigned long directories; unsigned long symlinks; unsigned long broken_files; unsigned long others; unsigned long fixed_sizes; unsigned long oid_sharing; unsigned long oid_sharing_dirs_relocated; unsigned long oid_sharing_files_relocated; unsigned long deleted_entries; unsigned long added_sd; unsigned long empty_lost_dirs; unsigned long lost_found; unsigned long lost_found_files; unsigned long lost_found_dirs; }; struct pass_4_stat { unsigned long deleted_items; }; struct rebuild_info { struct { struct pass0_stat pass0; struct pass1_stat pass1; struct pass2_stat pass2; struct semantic_stat semantic; struct pass_4_stat pass4; } pass_u; /* bitmaps */ reiserfs_bitmap_t * source_bitmap; reiserfs_bitmap_t * new_bitmap; reiserfs_bitmap_t * allocable_bitmap; reiserfs_bitmap_t * uninsertables; char * bitmap_file_name; /*char * new_bitmap_file_name;*/ char * passes_dump_file_name; /* after pass 0, 1 or 2 reiserfsck can store data with which it will be able to start from the point it stopped last time at */ unsigned short mode; unsigned long options; /* rollback file */ char * rollback_file; /* hash hits stat */ int hash_amount; unsigned long * hash_hits; char * defined_hash; #define USED_BLOCKS 1 #define EXTERN_BITMAP 2 #define ALL_BLOCKS 3 int scan_area; int use_journal_area; int test; }; struct check_info { unsigned long bad_nodes; unsigned long fatal_corruptions; unsigned long fixable_corruptions; // unsigned long badblocks_corruptions; unsigned long leaves; unsigned long internals; unsigned long dirs; unsigned long files; unsigned long safe; unsigned long unfm_pointers; unsigned long zero_unfm_pointers; reiserfs_bitmap_t * deallocate_bitmap; }; struct fsck_data { unsigned short mode; /* check, rebuild, etc*/ unsigned long options; unsigned long mounted; struct rebuild_info rebuild; struct check_info check; char * journal_dev_name; /* log file name and handle */ char * log_file_name; FILE * log; /* this is a file where reiserfsck will explain what it is doing. This is usually stderr. But when -g is specified - reiserfsck runs in the background and append progress information into 'fsck.run' */ FILE * progress; /* objectid maps */ id_map_t * proper_id_map; id_map_t * semantic_id_map; /* this objectid map is used to cure objectid sharing problem */ }; #define fsck_data(fs) ((struct fsck_data *)((fs)->fs_vp)) #define pass_0_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.pass0)) #define pass_1_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.pass1)) #define pass_2_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.pass2)) #define sem_pass_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.semantic)) #define pass_4_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.pass4)) #define fsck_check_stat(fs) (&(fsck_data(fs)->check)) #define proper_id_map(s) fsck_data(s)->proper_id_map #define semantic_id_map(s) fsck_data(s)->semantic_id_map #define fsck_source_bitmap(fs) fsck_data(fs)->rebuild.source_bitmap #define fsck_new_bitmap(fs) fsck_data(fs)->rebuild.new_bitmap #define fsck_allocable_bitmap(fs) fsck_data(fs)->rebuild.allocable_bitmap #define fsck_uninsertables(fs) fsck_data(fs)->rebuild.uninsertables #define fsck_deallocate_bitmap(fs) fsck_data(fs)->check.deallocate_bitmap #define fsck_interactive(fs) (fsck_data(fs)->options & OPT_INTERACTIVE) //#define fsck_fix_fixable(fs) (fsck_data(fs)->options & OPT_FIX_FIXABLE) #define fsck_run_one_step(fs) (fsck_data(fs)->options & OPT_SAVE_PASSES_DUMP) #define fsck_save_rollback(fs) (fsck_data(fs)->options & OPT_SAVE_ROLLBACK) /* change unknown modes (corrupted) to mode of regular files, fix file sizes which are bigger than a real file size, relocate files with shared objectids (this slows fsck down (when there are too many files sharing the same objectid), it will also remove other names pointing to this file */ #define fsck_adjust_file_size(fs) (fsck_data(fs)->options & OPT_ADJUST_FILE_SIZE) #define fsck_quiet(fs) (fsck_data(fs)->options & OPT_QUIET) #define fsck_silent(fs) (fsck_data(fs)->options & OPT_SILENT) #define fsck_in_background(fs) (fsck_data(fs)->options & OPT_BACKGROUND) #define fsck_hash_defined(fs) (fsck_data(fs)->options & OPT_HASH_DEFINED) #define fsck_skip_journal(fs) (fsck_data(fs)->options & OPT_SKIP_JOURNAL) #define fsck_yes_all(fs) (fsck_data(fs)->options & OPT_YES) #define fsck_mode(fs) (fsck_data(fs)->mode) #define fsck_log_file(fs) (fsck_data(fs)->log) #define fsck_progress_file(fs) ((fs && fsck_data(fs)->progress) ? fsck_data(fs)->progress : stderr) /* name of file where we store information for continuing */ #define state_dump_file(fs) fsck_data(fs)->rebuild.passes_dump_file_name /* name of file where we store rollback data */ #define state_rollback_file(fs) fsck_data(fs)->rebuild.rollback_file int fsck_info_ask (reiserfs_filsys_t * fs, char * q, char * a, int default_answer); void fsck_stage_report (int, reiserfs_filsys_t *); /*pass1: rebuild super block*/ void rebuild_sb (reiserfs_filsys_t * fs, char * filename, struct fsck_data * data); /* special type for symlink not conflicting to any of item types. */ #define TYPE_SYMLINK 4 #define fsck_log(fmt, list...) \ {\ if (!fsck_silent (fs))\ reiserfs_warning (fsck_log_file (fs), fmt, ## list);\ } #define fsck_progress(fmt, list...) \ {\ reiserfs_warning (fsck_progress_file(fs), fmt, ## list);\ fflush (fsck_progress_file(fs));\ } #define FATAL 1 #define FIXABLE 2 enum entry_type { ET_NAME = 0x0, ET_DOT = 0x1, ET_DOT_DOT = 0x2, ET_LOST_FOUND = 0x3, ET_LAST }; #define fsck_exit(fmt, list...) \ {\ reiserfs_warning (fsck_progress_file(fs), fmt, ## list);\ exit (EXIT_USER);\ } #define one_more_corruption(fs,kind) \ ({ \ if (kind == FATAL) \ fsck_check_stat (fs)->fatal_corruptions++; \ else if (kind == FIXABLE) \ fsck_check_stat (fs)->fixable_corruptions++; \ }) #define one_less_corruption(fs,kind) \ ({ \ if (kind == FATAL) \ fsck_check_stat (fs)->fatal_corruptions--; \ else if (kind == FIXABLE) \ fsck_check_stat (fs)->fixable_corruptions--; \ }) reiserfsprogs-3.6.20/utils/fsck/fsck.reiserfs.80000644000175300001440000002140210412227267016347 00000000000000.\" -*- nroff -*- .\" Copyright 1996-2004 Hans Reiser. .\" .TH fsck.reiserfs 8 "February 2004" "Reiserfsprogs-3.6.19" .SH NAME fsck.reiserfs \- The checking tool for the ReiserFS filesystem. .SH SYNOPSIS .B fsck.reiserfs [ \fB-afprVy\fR ] [ \fB--rebuild-sb\fR | \fB--check\fR | \fB--fix-fixable\fR | \fB--rebuild-tree\fR | \fB--clean-attributes\fR ] .\" [ \fB-i\fR | \fB--interactive\fR ] [ \fB-j\fR | \fB--journal\fR \fIdevice\fR ] [ \fB-z\fR | \fB--adjust-size\fR ] [ \fB-n\fR | \fB--nolog\fR ] [ \fB-B\fR | \fB--badblocks \fIfile\fR ] [ \fB-l\fR | \fB--logfile \fIfile\fR ] [ \fB-q\fR | \fB--quiet\fR ] [ \fB-y\fR | \fB--yes\fR ] .\" [ \fB-b\fR | \fB--scan-marked-in-bitmap \fIbitmap-filename\fR ] .\" [ \fB-h\fR | \fB--hash \fIhash-name\fR ] .\" [ \fB-g\fR | \fB--background\fR ] [ \fB-S\fR | \fB--scan-whole-partition\fR ] [ \fB--no-journal-available\fR ] .I device .SH DESCRIPTION \fBfsck.reiserfs\fR searches for a Reiserfs filesystem on a device, replays any necessary transactions, and either checks or repairs the file system. .TP .I device is the special file corresponding to a device or to a partition (e.g /dev/hdXX for an IDE disk partition or /dev/sdXX for a SCSI disk partition). .SH OPTIONS .TP .B --rebuild-sb This option recovers the superblock on a Reiserfs partition. Normally you only need this option if mount reports "read_super_block: can't find a reiserfs file system" and you are sure that a Reiserfs file system is there. But remember that if you have used some partition editor program and now you cannot find a filesystem, probably something has gone wrong while repartitioning and the start of the partition has been changed. If so, instead of rebuilding the super block on a wrong place you should find the correct start of the partition first. .TP .B --check This default action checks filesystem consistency and reports, but does not repair any corruption that it finds. This option may be used on a read-only file system mount. .TP .B --fix-fixable This option recovers certain kinds of corruption that do not require rebuilding the entire file system tree (\fB--rebuild-tree\fR). Normally you only need this option if the \fB--check\fR option reports "corruption that can be fixed with \fB--fix-fixable\fR". This includes: zeroing invalid data-block pointers, correcting st_size and st_blocks for directories, and deleting invalid directory entries. .TP .B --rebuild-tree This option rebuilds the entire filesystem tree using leaf nodes found on the device. Normally you only need this option if the \fBfsck.reiserfs --check\fR reports "Running with \fB--rebuild-tree\fR is required". You are strongly encouraged to make a backup copy of the whole partition before attempting the \fB--rebuild-tree\fR option. Once \fBfsck.reiserfs --rebuild-tree\fR is started it must finish its work (and you should not interrupt it), otherwise the filesystem will be left in the unmountable state to avoid subsequent data corruptions. .TP .B --clean-attributes This option cleans reserved fields of Stat-Data items. There were days when there were no extended attributes in reiserfs. When they were implemented old partitions needed to be cleaned first -- reiserfs code in the kernel did not care about not used fields in its strutures. Thus if you have used one of the old (pre-attrbutes) kernels with a ReiserFS filesystem and you want to use extented attribues there, you should clean the filesystem first. .TP .B \fB--journal \fIdevice \fR, \fB-j \fIdevice \fR This option supplies the device name of the current file system journal. This option is required when the journal resides on a separate device from the main data device (although it can be avoided with the expert option \fB--no-journal-available\fR). .TP .\" .B --interactive, -i .\" This makes \fBfsck.reiserfs\fR to stop after each pass completed. .\" .TP .B --adjust-size, -z This option causes \fBfsck.reiserfs\fR to correct file sizes that are larger than the offset of the last discovered byte. This implies that holes at the end of a file will be removed. File sizes that are smaller than the offset of the last discovered byte are corrected by \fB--fix-fixable\fR. .TP \fB--badblocks \fIfile\fR, \fB-B \fI file\fR This option sets the badblock list to be the list of blocks specified in the given `file`. The filesystem badblock list is cleared before the new list is added. It can be used with \fB--fix-fixable\fR to fix the list of badblocks (see \fBdebugfs.reiserfs -B\fR). If the device has bad blocks, every time it must be given with the \fB--rebuild-tree\fR option. .TP \fB--logfile \fIfile\fR, \fB-l \fI file\fR This option causes \fBfsck.reiserfs\fR to report any corruption it finds to the specified log file rather than to stderr. .TP .B --nolog, -n This option prevents \fBfsck.reiserfs\fR from reporting any kinds of corruption. .TP .B --quiet, -q This option prevents \fBfsck.reiserfs\fR from reporting its rate of progress. .TP .B --yes, -y This option inhibits \fBfsck.reiserfs\fR from asking you for confirmation after telling you what it is going to do. It will assuem you confirm. For safety, it does not work with the \fB--rebuild-tree\fR option. .TP \fB-a\fR, \fB-p\fR These options are usually passed by fsck -A during the automatic checking of those partitions listed in /etc/fstab. These options cause \fBfsck.reiserfs\fR to print some information about the specified filesystem, to check if error flags in the superblock are set and to do some light-weight checks. If these checks reveal a corruption or the flag indicating a (possibly fixable) corruption is found set in the superblock, then \fBfsck.reiserfs\fR switches to the fix-fixable mode. If the flag indicating a fatal corruption is found set in the superblock, then \fBfsck.reiserfs\fR finishes with an error. .TP .B -V This option prints the reiserfsprogs version and then exit. .TP \fB-r\fR, \fB-f\fR These options are not yet operational and therefore are ignored. .SH EXPERT OPTIONS DO NOT USE THESE OPTIONS UNLESS YOU KNOW WHAT YOU ARE DOING. WE ARE NOT RESPONSIBLE IF YOU LOSE DATA AS A RESULT OF THESE OPTIONS. .TP .B \fB\--no-journal-available\fR This option allows \fBfsck.reiserfs\fR to proceed when the journal device is not available. This option has no effect when the journal is located on the main data device. NOTE: after this operation you must use \fBtunefs.reiserfs\fR to specify a new journal device. .TP .B --scan-whole-partition, -S This option causes \fB--rebuild-tree\fR to scan the whole partition but not only the used space on the partition. .SH AN EXAMPLE OF USING fsck.reiserfs 1. You think something may be wrong with a reiserfs partition on /dev/hda1 or you would just like to perform a periodic disk check. 2. Run \fBfsck.reiserfs --check --logfile check.log /dev/hda1\fR. If \fBfsck.reiserfs --check\fR exits with status 0 it means no errors were discovered. 3. If \fBfsck.reiserfs --check\fR exits with status 1 (and reports about fixable corruptions) it means that you should run \fBfsck.reiserfs --fix-fixable --logfile fixable.log /dev/hda1\fR. 4. If \fBfsck.reiserfs --check\fR exits with status 2 (and reports about fatal corruptions) it means that you need to run \fBfsck.reiserfs --rebuild-tree\fR. If \fBfsck.reiserfs --check\fR fails in some way you should also run \fBfsck.reiserfs --rebuild-tree\fR, but we also encourage you to submit this as a bug report. 5. Before running \fBfsck.reiserfs --rebuild-tree\fR, please make a backup of the whole partition before proceeding. Then run \fBfsck.reiserfs --rebuild-tree --logfile rebuild.log /dev/hda1\fR. 6. If the \fBfsck.reiserfs --rebuild-tree\fR step fails or does not recover what you expected, please submit this as a bug report. Try to provide as much information as possible including your platform and Linux kernel version. We will try to help solve the problem. .SH EXIT CODES \fBfsck.reiserfs\fR uses the following exit codes: .br \ \fI0\fR \-\ No errors. .br \ \fI1\fR \-\ File system errors corrected. .br \ \fI2\fR \-\ Reboot is needed. .br \ \fI4\fR \-\ File system fatal errors left uncorrected, .br \ \fBfsck.reiserfs --rebuild-tree\fR needs to be launched. .br \ \fI6\fR \-\ File system fixable errors left uncorrected, .br \ \fBfsck.reiserfs --fix-fixable\fR needs to be launched. .br \ \fI8\fR \-\ Operational error. .br \ \fI16\fR \-\ Usage or syntax error. .br .SH AUTHOR This version of \fBfsck.reiserfs\fR has been written by Vitaly Fertman . .SH BUGS Please report bugs to the ReiserFS developers , providing as much information as possible--your hardware, kernel, patches, settings, all printed messages, the logfile; check the syslog file for any related information. .SH TODO Faster recovering, signal handling. .SH SEE ALSO .BR mkfs.reiserfs (8), .BR tunefs.reiserfs (8) .BR resizefs.reiserfs (8), .BR debugfs.reiserfs (8), reiserfsprogs-3.6.20/utils/fsck/info.c0000644000175300001440000001260510412227267014613 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "util/print.h" #include "assert.h" void fsck_info_checkmem (void) { fprintf(stderr, "\nThe problem has occurred looks like a hardware problem (perhaps\n" "memory). Send us the bug report only if the second run dies at\n" "the same place with the same block number.\n"); } int fsck_info_ask(reiserfs_filsys_t * fs, char * q, char * a, int default_answer) { if (!fsck_interactive (fs)) return default_answer; return util_user_confirmed (fsck_progress_file (fs), q, a); } void fsck_stage_report (int pass, reiserfs_filsys_t * fs) { if (pass == FS_CHECK) { fsck_progress ("There are on the filesystem:\n" "\tLeaves %lu\n\tInternal nodes %lu\n" "\tDirectories %lu\n\tOther files %lu\n" "\tData block pointers %lu (%lu of them are zero)\n" "\tSafe links %lu\n", fsck_check_stat (fs)->leaves, fsck_check_stat (fs)->internals, fsck_check_stat (fs)->dirs, fsck_check_stat (fs)->files, fsck_check_stat (fs)->unfm_pointers, fsck_check_stat (fs)->zero_unfm_pointers, fsck_check_stat (fs)->safe); return; } { if (pass == FS_PASS0) fsck_progress("\tSelected hash: %s\n", reiserfs_hash_name(reiserfs_hash_code(fs->hash))); /* what has been done on pass 0 */ if (pass_0_stat(fs)->dealt_with) fsck_progress ("\tRead formatted blocks: %lu\n", pass_0_stat(fs)->dealt_with); if (pass_0_stat(fs)->leaves) fsck_progress ("\tRead leaves (corrected/empty/wrong hash): " "%lu (%lu/%lu/%lu)\n", pass_0_stat(fs)->leaves, pass_0_stat(fs)->leaves_corrected, pass_0_stat(fs)->all_contents_removed, pass_0_stat(fs)->too_old_leaves); if (pass_0_stat(fs)->wrong_pointers) fsck_progress ("\tWrong indirect pointers (zeroed): %lu\n", pass_0_stat(fs)->wrong_pointers); } { /* what has been done on pass 1 */ if (pass_1_stat(fs)->leaves) fsck_progress ("\tRead leaves (not inserted): %lu (%lu)\n", pass_1_stat(fs)->leaves, pass_1_stat(fs)->uninsertable_leaves); assert(pass_1_stat(fs)->leaves == pass_1_stat(fs)->inserted_leaves + pass_1_stat(fs)->uninsertable_leaves); if (pass_1_stat(fs)->pointed_leaves || pass_1_stat(fs)->non_unique_pointers) { fsck_progress ("\tDouble indirect pointers to leaves/to " "unformatted (zeroed): %lu/%lu\n", pass_1_stat(fs)->pointed_leaves, pass_1_stat(fs)->non_unique_pointers); } } { /* what has been done on pass 2 */ if (pass_2_stat(fs)->leaves) fsck_progress ("\tLeaves inserted item by item: %lu\n", pass_2_stat(fs)->leaves); /* FIXME: oid_sharing is the same */ if (pass_2_stat(fs)->relocated && pass == FS_PASS2) fsck_progress ("\tFiles relocated because of key " "conflicts with a directory: %lu\n", pass_2_stat(fs)->relocated); if (pass_2_stat(fs)->rewritten) fsck_progress ("\tFiles rewritten: %lu\n", pass_2_stat(fs)->rewritten); } { /* what has been done on the semantic pass */ if (sem_pass_stat(fs)->regular_files || sem_pass_stat(fs)->directories || sem_pass_stat(fs)->symlinks || sem_pass_stat(fs)->others) { fsck_progress ("\tFound files/dirs/symlinks/others: " "%lu/%lu/%lu/%lu\n", sem_pass_stat(fs)->regular_files, sem_pass_stat(fs)->directories, sem_pass_stat(fs)->symlinks, sem_pass_stat(fs)->others); } if (sem_pass_stat(fs)->lost_found) fsck_progress ("\tLinked to /lost+found (files/dirs): " "%lu (%lu/%lu)\n", sem_pass_stat(fs)->lost_found, sem_pass_stat(fs)->lost_found_files, sem_pass_stat(fs)->lost_found_dirs); if (sem_pass_stat(fs)->broken_files) fsck_progress ("\tBroken file bodies: %lu\n", sem_pass_stat(fs)->broken_files); if (sem_pass_stat(fs)->fixed_sizes) fsck_progress ("\tFiles with fixed size: %lu\n", sem_pass_stat(fs)->fixed_sizes); if (sem_pass_stat(fs)->added_sd) fsck_progress ("\tInserted missed StatDatas: %lu\n", sem_pass_stat(fs)->added_sd); if (sem_pass_stat(fs)->empty_lost_dirs) fsck_progress ("\tEmpty lost dirs (removed): %lu\n", sem_pass_stat(fs)->empty_lost_dirs); if (sem_pass_stat(fs)->deleted_entries) fsck_progress ("\tNames pointing to nowhere (removed): %lu\n", sem_pass_stat(fs)->deleted_entries); if (sem_pass_stat(fs)->oid_sharing) { fsck_progress ("\tObjects having used objectids (files, dirs): " "%lu (%lu/%lu)\n", sem_pass_stat(fs)->oid_sharing, sem_pass_stat(fs)->oid_sharing_files_relocated, sem_pass_stat(fs)->oid_sharing_dirs_relocated); assert(pass_2_stat(fs)->relocated == sem_pass_stat(fs)->oid_sharing); } } if (pass != FS_CLEANUP && pass != FS_PASS1) { if (proper_id_map(fs)->count) fsck_progress ("\tObjectids found: %lu\n", proper_id_map(fs)->count); } else { /* what has been done on the semantic pass */ if (pass_4_stat(fs)->deleted_items) fsck_progress ("\tDeleted unreachable items: %lu\n", pass_4_stat(fs)->deleted_items); } memset (&fsck_data (fs)->rebuild.pass_u, 0, sizeof (fsck_data (fs)->rebuild.pass_u)); } reiserfsprogs-3.6.20/utils/fsck/leaf.c0000644000175300001440000002162310412227267014567 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README * * The code to check the leaf structure. * Leaf is not supposed to be in the tree, it is rather a single one. * */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/unaligned.h" #include "misc/malloc.h" #include /* 1 if some of fields in the block head of bh look bad */ int fsck_leaf_check_header(reiserfs_filsys_t * fs, reiserfs_bh_t * bh) { reiserfs_node_head_t * blkh; int free_space, counted; blkh = NODE_HEAD (bh); if (!reiserfs_leaf_head(bh)) { /* We should not get here on rebuild. */ fsck_log ("block %lu: The block does not look like a leaf.\n", bh->b_blocknr); one_more_corruption (fs, FATAL); return 1; } if (reiserfs_nh_get_items (blkh) == 0) return 0; counted = reiserfs_leaf_count_items(bh); if (counted < reiserfs_nh_get_items (blkh)) { fsck_log ("block %lu: The number of items (%lu) is incorrect, " "should be (%lu)", bh->b_blocknr, reiserfs_nh_get_items(blkh), counted); if (fsck_mode(fs) == FSCK_REBUILD) { reiserfs_nh_set_items(blkh, counted); fsck_log (" - corrected\n"); reiserfs_buffer_mkdirty (bh); } else { fsck_log ("\n"); one_more_corruption (fs, FATAL); return 1; } } free_space = reiserfs_leaf_free_count(bh); if (reiserfs_nh_get_free (blkh) != free_space) { fsck_log ("block %lu: The free space (%lu) is incorrect, should " "be (%lu)", bh->b_blocknr, reiserfs_nh_get_free (blkh), free_space); if (fsck_mode(fs) != FSCK_CHECK && fsck_mode(fs) != FSCK_AUTO) { reiserfs_nh_set_free (blkh, free_space); fsck_log (" - corrected\n"); reiserfs_buffer_mkdirty (bh); } else { fsck_log ("\n"); one_more_corruption (fs, FIXABLE); return 1; } } return 0; } static int is_bad_sd (reiserfs_ih_t * ih, char * item) { if (reiserfs_key_get_off1 (&ih->ih_key) || reiserfs_key_get_uni (&ih->ih_key)) { fsck_log ("vpf-10610: StatData item %k has non " "zero offset found.\n", &ih->ih_key); return 1; } if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE_V1) { /* looks like old stat data */ if (reiserfs_ih_get_format (ih) != KEY_FORMAT_1) { fsck_log ("vpf-10620: StatData item %k has wrong " "format.\n", &ih->ih_key); } } return 0; } static int is_bad_directory (reiserfs_ih_t * ih, char * item, int dev, int blocksize) { int i; char * name; int namelen, entrylen; reiserfs_deh_t * deh = (reiserfs_deh_t *)item; __u32 prev_offset = 0; __u16 prev_location = reiserfs_ih_get_len (ih); int min_entry_size = 1;/* we have no way to understand whether the filesystem wes created in 3.6 format or converted to it. So, we assume that minimal name length is 1 */ if (reiserfs_ih_get_len (ih) / (REISERFS_DEH_SIZE + min_entry_size) < reiserfs_ih_get_entries (ih)) { /* entry count is too big */ return 1; } for (i = 0; i < reiserfs_ih_get_entries (ih); i ++, deh ++) { entrylen = reiserfs_direntry_entry_len(ih, deh, i); if (entrylen > REISERFS_NAME_MAX) return 1; if (reiserfs_deh_get_off (deh) <= prev_offset) return 1; prev_offset = reiserfs_deh_get_off (deh); if (reiserfs_deh_get_loc(deh) + entrylen != prev_location) return 1; prev_location = reiserfs_deh_get_loc (deh); namelen = reiserfs_direntry_name_len (ih, deh, i); name = reiserfs_deh_name (deh, i); if (!reiserfs_hash_correct (&fs->hash, name, namelen, reiserfs_deh_get_off (deh))) { return 1; } } return 0; } /* change incorrect block adresses by 0. Do not consider such item as incorrect */ static int is_bad_extent (reiserfs_ih_t * ih, char * item, int dev, int blocksize) { unsigned long blocks; unsigned int i; int bad = 0; if (reiserfs_ih_get_len(ih) % REISERFS_EXT_SIZE) { fsck_log ("is_bad_extent: extent item of %H of invalid length\n", ih); return 1; } blocks = reiserfs_sb_get_blocks (fs->fs_ondisk_sb); for (i = 0; i < reiserfs_ext_count (ih); i ++) { __u32 * ind = (__u32 *)item; if (d32_get (ind, i) >= blocks) { bad ++; fsck_log ("is_bad_extent: %d-th pointer of item %H " "looks bad (%lu)\n", i, ih, d32_get (ind, i)); continue; } } return bad; } /* this is used by check.c: fsck_leaf_check */ int fsck_leaf_item_check (reiserfs_bh_t * bh, reiserfs_ih_t * ih, char * item) { int blocksize, dev; blocksize = bh->b_size; dev = bh->b_dev; // FIXME: refuse transparently bad items if (reiserfs_key_get_did (&ih->ih_key) == reiserfs_key_get_oid (&ih->ih_key)) { return 1; } if (!reiserfs_key_get_did (&ih->ih_key) || !reiserfs_key_get_oid (&ih->ih_key)) { return 1; } if (reiserfs_ih_stat(ih)) return is_bad_sd (ih, item); if (reiserfs_ih_dir (ih)) return is_bad_directory (ih, item, dev, blocksize); if (reiserfs_ih_ext (ih)) return is_bad_extent (ih, item, dev, blocksize); if (reiserfs_ih_direct (ih)) return 0; return 1; } /* 1 if i-th and (i-1)-th items can not be neighbors in a leaf */ int fsck_leaf_check_neigh (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, int pos) { reiserfs_ih_t * ih; ih = reiserfs_ih_at (bh, pos); if (reiserfs_key_comp (&((ih - 1)->ih_key), &ih->ih_key) != -1) { if (fsck_mode (fs) != FSCK_REBUILD) one_more_corruption (fs, FATAL); return 1; } if (reiserfs_ih_stat (ih)) /* left item must be of another object */ if (reiserfs_key_comp2 (&((ih - 1)->ih_key), &ih->ih_key) != -1) { if (fsck_mode (fs) != FSCK_REBUILD) one_more_corruption (fs, FATAL); return 1; } if (reiserfs_key_get_oid (&ih->ih_key) == REISERFS_BAD_OID) { /* BAD BLOCK LIST SUPPORT. */ if (reiserfs_key_get_did(&ih->ih_key) == REISERFS_BAD_DID && reiserfs_ih_ext(ih) && reiserfs_key_comp2(&((ih - 1)->ih_key), &ih->ih_key)) { return 0; } } else { /* Safe link support. */ if (reiserfs_key_get_did (&ih->ih_key) == (__u32)-1) { if (reiserfs_key_comp2 (&((ih - 1)->ih_key), &ih->ih_key) == 0) { if (reiserfs_ih_ext (ih - 1) && reiserfs_ih_direct(ih)) return 0; /* safe link */ /* they do not look like safe links */ } else { if (reiserfs_ih_ext (ih) || reiserfs_ih_direct(ih)) return 0; /* safe link */ /* it does not look like safe link */ } } } if (reiserfs_ih_direct(ih)) { /* left item must be extent or stat data item of the same file */ if (reiserfs_key_comp2 (&((ih - 1)->ih_key), &ih->ih_key)) { if (fsck_mode (fs) != FSCK_REBUILD) one_more_corruption (fs, FATAL); return 1; } if (!((reiserfs_ih_stat (ih - 1) && reiserfs_key_get_off (&ih->ih_key) == 1) || (reiserfs_ih_ext (ih - 1) && reiserfs_key_get_off (&(ih - 1)->ih_key) + reiserfs_leaf_ibytes (ih-1, bh->b_size) == reiserfs_key_get_off (&ih->ih_key)))) { if (fsck_mode (fs) != FSCK_REBUILD) one_more_corruption (fs, FATAL); return 1; } } if (reiserfs_ih_ext (ih) || reiserfs_ih_dir (ih)) { /* left item must be stat data of the same object */ if (reiserfs_key_comp2 (&((ih - 1)->ih_key), &ih->ih_key) || !reiserfs_ih_stat (ih - 1)) { if (fsck_mode (fs) != FSCK_REBUILD) one_more_corruption (fs, FATAL); return 1; } } return 0; } int fsck_leaf_check (reiserfs_bh_t * bh) { int i; reiserfs_ih_t * ih; int bad = 0; assert (reiserfs_leaf_head (bh)); for (i = 0, ih = reiserfs_ih_at (bh, 0); i < reiserfs_node_items (bh); i ++, ih ++) { if (fsck_leaf_item_check (bh, ih, reiserfs_item_by_ih (bh, ih))) { fsck_log ("%s: block %lu, item %d: The corrupted item " "found (%H)\n", __FUNCTION__, bh->b_blocknr, i, ih); bad = 1; continue; } if (i && fsck_leaf_check_neigh (fs, bh, i)) { fsck_log ("%s: block %lu items %d and %d: Wrong order of " "items:\n\t%H\n\t%H\n", __FUNCTION__, bh->b_blocknr, i - 1, i, ih - 1, ih); bad = 1; } } return bad; } /* this item is in tree. All unformatted pointer are correct. Do not check them */ void fsck_item_save(reiserfs_path_t * path, saveitem_t ** head) { reiserfs_ih_t * ih = REISERFS_PATH_IH(path); saveitem_t *si, *cur; si = misc_getmem (sizeof (*si)); si->si_dnm_data = misc_getmem (reiserfs_ih_get_len(ih)); /*si->si_blocknr = blocknr;*/ memcpy (&(si->si_ih), ih, REISERFS_IH_SIZE); memcpy (si->si_dnm_data, REISERFS_PATH_ITEM(path), reiserfs_ih_get_len(ih)); if (*head == 0) { *head = si; } else { cur = *head; while (cur->si_next) cur = cur->si_next; cur->si_next = si; } return; } saveitem_t * fsck_item_free(saveitem_t * si) { saveitem_t * tmp = si->si_next; misc_freemem (si->si_dnm_data); misc_freemem (si); return tmp; } reiserfsprogs-3.6.20/utils/fsck/lost+found.c0000644000175300001440000002743610412227267015760 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "util/misc.h" #include "util/device.h" #include "util/misc.h" #include extern void cb_item_modify (reiserfs_ih_t *ih, void *item); static __u64 _look_for_lost (reiserfs_filsys_t * fs, int link_lost_dirs) { reiserfs_key_t key, prev_key; const reiserfs_key_t *rdkey; REISERFS_PATH_INIT (path); static int lost_files = 0; /* looking for lost dirs we calculate amount of lost files, so that when we will look for lost files we will be able to stop when there are no lost files anymore */ unsigned long leaves; reiserfs_bh_t * bh; reiserfs_ih_t * ih; int entry_len; int is_it_dir; int item_pos; int retval; __u64 size; key = root_dir_key; if (!link_lost_dirs && !lost_files) { /* we have to look for lost files but we know already that there are no any */ return 0; } fsck_progress ("Looking for lost %s:\n", link_lost_dirs ? "directories" : "files"); leaves = 0; /* total size of added entries */ size = 0; while (1) { retval = reiserfs_tree_search_item (fs, &key, &path); /* fixme: we assume path ends up with a leaf */ bh = REISERFS_PATH_LEAF (&path); item_pos = REISERFS_PATH_LEAF_POS (&path); if (retval != ITEM_FOUND) { if (item_pos == reiserfs_nh_get_items (NODE_HEAD (bh))) { rdkey = reiserfs_tree_rkey (&path, fs); if (!reiserfs_key_comp (rdkey, &MAX_KEY)) { reiserfs_tree_pathrelse (&path); break; } key = *rdkey; reiserfs_tree_pathrelse (&path); continue; } /* we are on the item in the buffer */ } /* print ~ how many leaves were scanned and how fast it was */ if (!fsck_quiet (fs)) util_misc_speed (fsck_progress_file(fs), leaves++, 0, 50, 0); for (ih = REISERFS_PATH_IH (&path); item_pos < reiserfs_nh_get_items (NODE_HEAD (bh)); item_pos ++, ih ++, REISERFS_PATH_LEAF_POS(&path)++) { if (fsck_item_reach(ih)) continue; /* found item which can not be reached */ if (!reiserfs_ih_dir (ih) && !reiserfs_ih_stat (ih)) { continue; } if (reiserfs_ih_dir (ih)) { /* if this directory has no stat data - try to recover it */ reiserfs_key_t sd; reiserfs_path_t tmp; sd = ih->ih_key; reiserfs_key_set_sec (KEY_FORMAT_1, &sd, OFFSET_SD, TYPE_STAT_DATA); if (reiserfs_tree_search_item (fs, &sd, &tmp) == ITEM_FOUND) { /* should not happen - because if there were a stat data - we would have done with the whole directory */ reiserfs_tree_pathrelse (&tmp); continue; } sem_pass_stat(fs)->added_sd ++; reiserfs_tree_create_stat (fs, &tmp, &sd, cb_item_modify); id_map_mark(proper_id_map (fs), reiserfs_key_get_oid (&sd)); key = sd; reiserfs_tree_pathrelse (&path); goto cont; } /* stat data marked "not having name" found */ if (reiserfs_ih_stat (REISERFS_PATH_IH(&path))) fix_obviously_wrong_sd_mode (&path); is_it_dir = (not_a_directory(reiserfs_item_by_ih(bh,ih))) ? 0 : 1; if (is_it_dir) { reiserfs_key_t tmp_key; REISERFS_PATH_INIT (tmp_path); reiserfs_ih_t * tmp_ih; reiserfs_bh_t *tmp_bh; /* there is no need to link empty lost dirs into /lost+found */ tmp_key = ih->ih_key; reiserfs_key_set_sec (KEY_FORMAT_1, &tmp_key, 0xffffffff, TYPE_DIRENTRY); reiserfs_tree_search_item (fs, &tmp_key, &tmp_path); tmp_ih = REISERFS_PATH_IH (&tmp_path); tmp_bh = REISERFS_PATH_LEAF (&tmp_path); tmp_ih --; if (reiserfs_key_comp2 (&tmp_key, tmp_ih)) reiserfs_panic ("not directory found"); if (!reiserfs_ih_dir (tmp_ih) || (reiserfs_deh_get_off (reiserfs_deh (tmp_bh, tmp_ih) + reiserfs_ih_get_entries (tmp_ih) - 1) == OFFSET_DOT_DOT)) { /* last directory item is either stat data or empty directory item - do not link this dir into lost+found */ sem_pass_stat(fs)->empty_lost_dirs ++; reiserfs_tree_pathrelse (&tmp_path); continue; } reiserfs_tree_pathrelse (&tmp_path); } if (link_lost_dirs && !is_it_dir) { /* we are looking for directories and it is not a dir */ lost_files ++; continue; } sem_pass_stat(fs)->lost_found ++; { reiserfs_key_t obj_key = {0, 0, {{0, 0},}}; char lost_name[REISERFS_NAME_MAX]; reiserfs_ih_t tmp_ih; /* key to continue */ key = ih->ih_key; reiserfs_key_set_oid (&key, reiserfs_key_get_oid (&key) + 1); tmp_ih = *ih; if (id_map_test(semantic_id_map (fs), reiserfs_key_get_oid (&ih->ih_key))) { /* objectid is used, relocate an object */ sem_pass_stat(fs)->oid_sharing ++; if (is_it_dir) { relocate_dir (&tmp_ih); sem_pass_stat(fs)->oid_sharing_dirs_relocated ++; } else { fsck_file_relocate (&tmp_ih.ih_key, 1); sem_pass_stat(fs)->oid_sharing_files_relocated ++; } fsck_relocate_mklinked(&tmp_ih.ih_key); } else { if (!is_it_dir) id_map_mark(semantic_id_map (fs), reiserfs_key_get_oid (&ih->ih_key)); } lost_name[0] = '\0'; sprintf (lost_name, "%u_%u", reiserfs_key_get_did (&tmp_ih.ih_key), reiserfs_key_get_oid (&tmp_ih.ih_key)); /* entry in lost+found directory will point to this key */ reiserfs_key_set_did (&obj_key, reiserfs_key_get_did (&tmp_ih.ih_key)); reiserfs_key_set_oid (&obj_key, reiserfs_key_get_oid (&tmp_ih.ih_key)); reiserfs_tree_pathrelse (&path); /* 0 does not mean anyting - item with "." and ".." already exists and reached, so only name will be added */ entry_len = reiserfs_direntry_entry_estimate (lost_name, fs->lost_format); size += reiserfs_tree_insert_entry (fs, &lost_found_dir_key, lost_name, entry_len, &obj_key, 0/*fsck_need*/); if (is_it_dir) { /* fixme: we hope that if we will try to pull all the directory right now - then there will be less lost_found things */ if (!fsck_quiet(fs)) { util_misc_print_name (fsck_progress_file(fs), lost_name, strlen (lost_name)); } /*fsck_progress ("\tChecking lost dir \"%s\":", lost_name);*/ rebuild_semantic_pass (&obj_key, &lost_found_dir_key, ET_NAME, /*reloc_ih*/0); if (!fsck_quiet(fs)) { util_misc_erase_name (fsck_progress_file(fs), strlen (lost_name)); util_misc_fini_name(fsck_progress_file(fs)); } /*fsck_progress ("finished\n");*/ sem_pass_stat(fs)->lost_found_dirs ++; } else { if (reiserfs_tree_search_item (fs, &obj_key, &path) != ITEM_FOUND) { reiserfs_panic ("look_for_lost: lost file stat data " "%K not found", &obj_key); } /* check_regular_file does not mark stat data reachable */ fsck_item_mkreach (REISERFS_PATH_IH (&path), REISERFS_PATH_LEAF (&path)); rebuild_check_regular_file (&path, REISERFS_PATH_ITEM(&path), 0/*reloc_ih*/); reiserfs_tree_pathrelse (&path); sem_pass_stat(fs)->lost_found_files ++; lost_files --; } goto cont; } } /* for */ prev_key = key; REISERFS_PATH_LEAF_POS(&path) = item_pos - 1; rdkey = reiserfs_tree_next_key (&path, fs); if (rdkey) key = *rdkey; else break; if (reiserfs_key_comp (&prev_key, &key) != -1) reiserfs_panic ("pass_3a: key must grow 2: prev=%k next=%k", &prev_key, &key); reiserfs_tree_pathrelse (&path); cont: if (!link_lost_dirs && !lost_files) { break; } } reiserfs_tree_pathrelse (&path); util_misc_speed(fsck_progress_file(fs), leaves, 0, 50, 1); #if 0 /* check names added we just have added to/lost+found. Those names are marked DEH_Lost_found flag */ fsck_progress ("Checking lost+found directory.."); fflush (stdout); check_semantic_tree (&lost_found_dir_key, &root_dir_key, 0, 1/* lost+found*/); fsck_progress ("finished\n"); #endif return size; } static void fsck_lost_save_result (reiserfs_filsys_t * fs) { FILE * file; int retval; /* save bitmaps with which we will be able start reiserfs from pass 1 */ file = util_file_open ("temp_fsck_file.deleteme", "w+"); if (!file) return; fsck_stage_start_put (file, LOST_FOUND_DONE); fsck_stage_end_put (file); fclose (file); retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs)); if (retval != 0) { fsck_progress ("pass 0: Could not rename the temporary file " "temp_fsck_file.deleteme to %s", state_dump_file (fs)); } } /* we have nothing to load from a state file, but we have to fetch on-disk bitmap, copy it to allocable bitmap, and fetch objectid map */ void fsck_lost_load_result (reiserfs_filsys_t * fs) { fsck_new_bitmap (fs) = reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb)); reiserfs_bitmap_copy (fsck_new_bitmap (fs), fs->fs_bitmap2); fsck_allocable_bitmap (fs) = reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb)); reiserfs_bitmap_copy (fsck_allocable_bitmap (fs), fs->fs_bitmap2); fs->block_allocator = reiserfsck_new_blocknrs; fs->block_deallocator = reiserfsck_free_block; } static void fsck_lost_fini(reiserfs_filsys_t * fs) { /* update super block: objectid map, fsck state */ reiserfs_sb_set_state (fs->fs_ondisk_sb, LOST_FOUND_DONE); reiserfs_buffer_mkdirty (fs->fs_super_bh); /* write all dirty blocks */ fsck_progress ("Flushing.."); id_map_flush(semantic_id_map (fs), fs); id_map_free(semantic_id_map(fs)); semantic_id_map(fs) = NULL; fs->fs_dirt = 1; reiserfs_bitmap_flush(fsck_new_bitmap(fs), fs); reiserfs_fs_flush (fs); fsck_progress ("finished\n"); fsck_stage_report (FS_LOST, fs); id_map_free(proper_id_map(fs)); proper_id_map(fs) = NULL; if (!fsck_run_one_step (fs)) { if (fsck_info_ask (fs, "Continue? (Yes):", "Yes\n", 1)) /* reiserfsck continues */ return; } fsck_lost_save_result (fs); fs->fs_dirt = 1; reiserfs_fs_close (fs); exit(EXIT_OK); } void fsck_lost (reiserfs_filsys_t * fs) { REISERFS_PATH_INIT (path); reiserfs_ih_t * ih; void * sd; __u64 size, sd_size; __u32 blocks; __u16 mode; __u32 objectid; unsigned int gen_counter; fsck_progress ("Pass 3a (looking for lost dir/files):\n"); /* when warnings go not to stderr - separate them in the log */ if (fsck_log_file (fs) != stderr) fsck_log ("####### Pass 3a (lost+found pass) #########\n"); /* look for lost dirs first */ size = _look_for_lost (fs, 1); /* link files which are still lost */ size += _look_for_lost (fs, 0); /* update /lost+found sd_size and sd_blocks (nlink is correct already) */ objectid = reiserfs_tree_search_name (fs, &root_dir_key, "lost+found", &gen_counter, &lost_found_dir_key); if (!objectid) { reiserfs_panic ("look_for_lost: The entry 'lost+found' could " "not be found in the root directory."); } if (reiserfs_tree_search_item (fs, &lost_found_dir_key, &path) != ITEM_FOUND) { reiserfs_panic ("look_for_lost: The StatData of the 'lost+found' " "directory %K could not be found", &lost_found_dir_key); } ih = REISERFS_PATH_IH (&path); sd = REISERFS_PATH_ITEM (&path); reiserfs_stat_get_size (ih, sd, &sd_size); size += sd_size; blocks = REISERFS_DIR_BLOCKS (size); reiserfs_stat_set_size (ih, sd, &size); reiserfs_stat_set_blocks (ih, sd, &blocks); /* make lost+found to be drwx------ */ mode = S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR; reiserfs_stat_set_mode (ih, sd, &mode); reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (&path)); reiserfs_tree_pathrelse (&path); fsck_lost_fini(fs); } reiserfsprogs-3.6.20/utils/fsck/main.c0000644000175300001440000012062710412227267014610 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/malloc.h" #include "util/print.h" #include "util/device.h" #include "util/badblock.h" #include #include #include #include #include #include #include #include reiserfs_filsys_t * fs; char * badblocks_file; #define print_usage_and_exit() { \ fsck_progress ("Usage: %s [mode] [options] " \ " device\n" \ "\n" \ "Modes:\n" \ " --check\t\t\tconsistency checking (default)\n" \ " --fix-fixable\t\t\tfix corruptions which can be fixed without \n" \ " \t\t\t\t--rebuild-tree\n" \ " --rebuild-sb\t\t\tsuper block checking and rebuilding if needed\n" \ " \t\t\t\t(may require --rebuild-tree afterwards)\n" \ " --rebuild-tree\t\tforce fsck to rebuild filesystem from scratch\n" \ " \t\t\t\t(takes a long time)\n" \ " --clean-attributes\t\tclean garbage in reserved fields in StatDatas \n" \ "Options:\n" \ " -j | --journal device\t\tspecify journal if relocated\n" \ " -B | --badblocks file\t\tfile with list of all bad blocks on the fs\n" \ " -l | --logfile file\t\tmake fsck to complain to specifed file\n" \ " -n | --nolog\t\t\tmake fsck to not complain\n" \ " -z | --adjust-size\t\tfix file sizes to real size\n" \ " -q | --quiet\t\t\tno speed info\n" \ " -y | --yes\t\t\tno confirmations\n" \ " -V\t\t\t\tprints version and exits\n" \ " -a and -p\t\t\tsome light-weight auto checks for bootup\n" \ " -f and -r\t\t\tignored\n" \ "Expert options:\n" \ " --no-journal-available\tdo not open nor replay journal\n" \ " -S | --scan-whole-partition\tbuild tree of all blocks of the device\n\n", \ argv[0]); \ \ exit(EXIT_OK); \ } /* -B works with --fix-fixable fixes extent pointers pointed to badblocks, adds badblocks to badblock list in fs. and with --rebuild builds the tree without pointers to badblocks (internal, extent), adds badblocks to badblock list in fs. */ /* Hidden usage: Modes: " --rollback-fsck-changes\n\t\t\trollback all changes made by fsck\n"\ Options: " -b | --scan-marked-in-bitmap file\n"\ " \t\t\tbuild tree of blocks marked in the bitmapfile\n"\ " -R | --rollback-data file\n"\ " \t\t\tback up all changes to this file or rollback from this file\n"\ " \t\t\tpreviously backed up changes with --rollback-fsck-changes\n"\ " -d dumpfile\n"\ " \t\t\tto test fsck pass by pass - dump into dumpfile all needed\n"\ " \t\t\tinfo for the next pass and load on the start of the next pass\n"\ " -i | --interactive\tmake fsck to stop after every stage\n"\ " -h | --hash hashname\n"\ " -g | --background\n"\ " -t \t\tdo test\n"\ */ /* fsck is called with one non-optional argument - file name of device containing reiserfs. This function parses other options, sets flags based on parsing and returns non-optional argument */ static char * parse_options (struct fsck_data * data, int argc, char * argv []) { int c; static int mode = FSCK_CHECK; static int flag; data->rebuild.scan_area = USED_BLOCKS; while (1) { static struct option options[] = { /* modes */ {"check", no_argument, &mode, FSCK_CHECK}, {"fix-fixable", no_argument, &mode, FSCK_FIX_FIXABLE}, {"rebuild-sb", no_argument, &mode, FSCK_SB}, {"rebuild-tree", no_argument, &mode, FSCK_REBUILD}, {"rollback-fsck-changes", no_argument, &mode, FSCK_ROLLBACK_CHANGES}, {"clean-attributes", no_argument, &mode, FSCK_CLEAN_ATTRIBUTES}, /* options */ {"logfile", required_argument, 0, 'l'}, {"badblocks", required_argument, 0, 'B'}, {"interactive", no_argument, 0, 'i'}, {"adjust-size", no_argument, 0, 'z'}, {"quiet", no_argument, 0, 'q'}, {"yes", no_argument, 0, 'y'}, {"nolog", no_argument, 0, 'n'}, /* if file exists ad reiserfs can be load of it - only blocks marked used in that bitmap will be read */ {"scan-marked-in-bitmap", required_argument, 0, 'b'}, {"create-passes-dump", required_argument, 0, 'd'}, /* all blocks will be read */ {"scan-whole-partition", no_argument, 0, 'S'}, /* useful for -S */ {"hash", required_argument, 0, 'h'}, /* preparing rollback data*/ {"rollback-data", required_argument, 0, 'R'}, {"journal", required_argument, 0, 'j'}, {"no-journal-available", no_argument, &flag, OPT_SKIP_JOURNAL}, {"bad-block-file", required_argument, 0, 'B'}, /* start reiserfsck in background and exit */ {"background", no_argument, 0, 'g'}, {0, 0, 0, 0} }; int option_index; c = getopt_long (argc, argv, "iql:nb:Szd:R:h:j:gafVrpyt:B:", options, &option_index); if (c == -1) break; switch (c) { case 0: /* long-only options */ if (flag == OPT_SKIP_JOURNAL) { /* no journal available */ data->options |= OPT_SKIP_JOURNAL; flag = 0; } break; case 'i': /* --interactive */ data->options |= OPT_INTERACTIVE; break; case 'q': /* --quiet */ data->options |= OPT_QUIET; break; case 'y': /* --quiet */ data->options |= OPT_YES; break; case 'l': /* --logfile */ data->log_file_name = optarg; data->log = fopen (optarg, "w"); if (!data->log) fprintf (stderr, "reiserfsck: Cannot not open \'%s\': %s", optarg, strerror(errno)); break; case 'n': /* --nolog */ data->options |= OPT_SILENT; break; case 'b': /* --scan-marked-in-bitmap */ /* will try to load a bitmap from a file and read only blocks marked in it. That bitmap could be created by previous run of reiserfsck with -c */ data->rebuild.bitmap_file_name = optarg; data->rebuild.scan_area = EXTERN_BITMAP; break; case 'S': /* --scan-whole-partition */ data->rebuild.scan_area = ALL_BLOCKS; break; #if 0 case 'J': /* take all blocks which are leaves in journal area and put them into tree item by item (DO NOT USE IT UNTIL YOU KNOW WHAT ARE YOU DOING) */ data->rebuild.use_journal_area = 1; break; #endif case 'd': /* --create-passes-dump */ data->rebuild.passes_dump_file_name = optarg; data->options |= OPT_SAVE_PASSES_DUMP; break; case 'z': /* --adjust-file-size */ data->options |= OPT_ADJUST_FILE_SIZE; break; case 'h': /* --hash: suppose that this hash was used on a filesystem */ data->rebuild.defined_hash = optarg; if (reiserfs_hash_get (data->rebuild.defined_hash) == 0) reiserfs_panic ("reiserfsck: Unknown hash is specified: %s", data->rebuild.defined_hash); data->options |= OPT_HASH_DEFINED; break; case 'j': /* specified relocated journal device */ data->journal_dev_name = optarg; break; case 'R': /* preparing rollback data */ data->rebuild.rollback_file = optarg; data->options |= OPT_SAVE_ROLLBACK; break; case 'B': /* list of phisically corrupted blocks */ badblocks_file = optarg; data->options |= BADBLOCKS_FILE; break; case 'g': /* --background */ data->options |= OPT_BACKGROUND; break; case 'a': case 'p': data->options |= OPT_QUIET; mode = FSCK_AUTO; break; case 'f': case 'r': /* ignored */ break; case 'V': /* cause fsck to do nothing */ mode = DO_NOTHING; break; case 't': mode = DO_TEST; data->rebuild.test = atoi (optarg); break; default: print_usage_and_exit(); } } if (optind != argc - 1 && mode != DO_NOTHING) /* only one non-option argument is permitted */ print_usage_and_exit(); if (mode != FSCK_REBUILD && (data->rebuild.scan_area == EXTERN_BITMAP || data->rebuild.scan_area == ALL_BLOCKS || data->options & OPT_SAVE_PASSES_DUMP)) /* wrong options for this mode */ print_usage_and_exit(); /* if (data->options & OPT_ADJUST_FILE_SIZE) { if ((mode != FSCK_REBUILD) && (mode != FSCK_FIX_FIXABLE)) print_usage_and_exit(); } */ if (data->options & OPT_SAVE_ROLLBACK) { if (mode == FSCK_SB) print_usage_and_exit(); } if (mode == FSCK_ROLLBACK_CHANGES) { if ((data->options & OPT_SAVE_ROLLBACK) == 0) print_usage_and_exit(); } if ((data->options & BADBLOCKS_FILE) && mode != FSCK_REBUILD && mode != FSCK_FIX_FIXABLE) { fprintf(stderr, "Badblocks can be specified with --fix-fixable or " "--rebuild-tree only.\n"); print_usage_and_exit(); } if ((mode == FSCK_REBUILD) && (data->options & OPT_YES)) data->options &= ~OPT_YES; data->mode = mode; if (!data->log) data->log = stdout; return argv[optind]; } #define REBUILD_WARNING \ "*************************************************************\n\ ** Do not run the program with --rebuild-tree unless **\n\ ** something is broken and MAKE A BACKUP before using it. **\n\ ** If you have bad sectors on a drive it is usually a bad **\n\ ** idea to continue using it. Then you probably should get **\n\ ** a working hard drive, copy the file system from the bad **\n\ ** drive to the good one -- dd_rescue is a good tool for **\n\ ** that -- and only then run this program. **\n\ ** If you are using the latest reiserfsprogs and it fails **\n\ ** please email bug reports to reiserfs-list@namesys.com, **\n\ ** providing as much information as possible -- your **\n\ ** hardware, kernel, patches, settings, all reiserfsck **\n\ ** messages (including version), the reiserfsck logfile, **\n\ ** check the syslog file for any related information. **\n\ ** If you would like advice on using this program, support **\n\ ** is available for $25 at www.namesys.com/support.html. **\n\ *************************************************************\n\ \nWill rebuild the filesystem on (%s)\n" #define START_WARNING \ "*************************************************************\n\ ** If you are using the latest reiserfsprogs and it fails **\n\ ** please email bug reports to reiserfs-list@namesys.com, **\n\ ** providing as much information as possible -- your **\n\ ** hardware, kernel, patches, settings, all reiserfsck **\n\ ** messages (including version), the reiserfsck logfile, **\n\ ** check the syslog file for any related information. **\n\ ** If you would like advice on using this program, support **\n\ ** is available for $25 at www.namesys.com/support.html. **\n\ *************************************************************\n\ \n" static void warn_what_will_be_done (char * file_name, struct fsck_data * data) { FILE * warn_to; warn_to = (data->progress ? data->progress : stderr); if (data->mode == FSCK_REBUILD) reiserfs_warning (warn_to, REBUILD_WARNING, file_name); else reiserfs_warning (warn_to, START_WARNING); /* warn about fsck mode */ switch (data->mode) { case FSCK_CHECK: reiserfs_warning (warn_to, "Will read-only check consistency of the " "filesystem on %s\n", file_name); break; case FSCK_FIX_FIXABLE: reiserfs_warning (warn_to, "Will check consistency of the filesystem " "on %s\n", file_name); reiserfs_warning (warn_to, "and will fix what can be fixed without " "--rebuild-tree\n"); break; case FSCK_SB: reiserfs_warning (warn_to, "Will check superblock and rebuild it if " "needed\n"); break; case FSCK_REBUILD: if (data->options & OPT_SAVE_PASSES_DUMP) { reiserfs_warning (warn_to, "Will run only 1 step of the rebuilding, " "write state file '%s' and exit\n", data->rebuild.passes_dump_file_name); } else if (data->options & OPT_INTERACTIVE) reiserfs_warning (warn_to, "Will stop after every stage and ask for " "confirmation before continuing\n"); if (data->rebuild.bitmap_file_name) reiserfs_warning (warn_to, "Will try to obtain the list of ReiserFS" " leaves from the file '%s'\n", data->rebuild.bitmap_file_name); if (data->options & OPT_ADJUST_FILE_SIZE) reiserfs_warning (warn_to, "\tWill set file sizes in their metadata " "to real file sizes actually found by fsck.\n"); if (data->options & OPT_HASH_DEFINED) reiserfs_warning (warn_to, "\tSuppose \"%s\" hash is in use\n", data->rebuild.defined_hash); break; case FSCK_ROLLBACK_CHANGES: reiserfs_warning (warn_to, "Will rollback all data saved in %s into %s\n", data->rebuild.rollback_file, file_name); break; case FSCK_CLEAN_ATTRIBUTES: reiserfs_warning (warn_to, "Will clean file attributes on %s\n", file_name); break; case FSCK_AUTO: return; } if (data->options & OPT_SAVE_ROLLBACK && data->mode != FSCK_ROLLBACK_CHANGES) reiserfs_warning (warn_to, "Will save all blocks to be changed into " "file '%s'\n", data->rebuild.rollback_file); if (data->options & BADBLOCKS_FILE) reiserfs_warning (warn_to, "Bad block list will contain only blocks specified in '%s' " "file\n", badblocks_file); reiserfs_warning (warn_to, "Will put log info to '%s'\n", (data->log == stdout) ? "stdout" : (data->log_file_name ? data->log_file_name : "fsck.run")); if (!(data->options & OPT_YES)) { if (!util_user_confirmed(warn_to, "\nDo you want to run this " "program?[N/Yes] (note need to type " "Yes if you do):", "Yes\n")) { exit (EXIT_USER); } } } #define DMA_IS_OFF \ "\n********************************************************************\n" \ "* Warning: It was just detected that dma mode was turned off while *\n" \ "* operating -- probably due to some problem with your hardware. *\n" \ "* Please check your hardware and have a look into the syslog file. *\n" \ "* Note: running with --rebuild-tree on faulty hardware may destroy *\n" \ "* your data. *\n" \ "********************************************************************\n" #define DMA_IS_CHANGED \ "\n********************************************************************\n" \ "* Warning: It was just detected that dma speed was descreased while*\n" \ "* operating -- probably due to some problem with your hardware. *\n" \ "* Please check your hardware and have a look into the syslog file. *\n" \ "* Note: running with --rebuild-tree on faulty hardware may destroy *\n" \ "* your data. *\n" \ "********************************************************************\n" static util_device_dma_t dma_info; static util_device_dma_t old_dma_info; static void check_dma() { old_dma_info = dma_info; if (util_device_get_dma(&dma_info) == -1) { fsck_log("util_device_get_dma failed %s\n", strerror (errno)); return; } if (dma_info.dma != old_dma_info.dma) { if (dma_info.dma == 0) { printf(DMA_IS_OFF); if (fsck_log_file (fs) != stdout) fsck_log("WARNING: dma mode has been turned off.\n"); } } if (dma_info.speed != old_dma_info.speed) { if (dma_info.speed < old_dma_info.speed) { printf(DMA_IS_CHANGED); if (fsck_log_file (fs) != stdout) fsck_log("WARNING: dma speed has been descreased.\n"); } } alarm(1); } void register_timer() { memset(&dma_info, 0, sizeof(dma_info)); memset(&old_dma_info, 0, sizeof(old_dma_info)); dma_info.fd = fs->fs_dev; if (util_device_dma_prep(&dma_info) != 0) return; if (util_device_get_dma(&dma_info) == -1) { fsck_log("util_device_get_dma failed %s\n", strerror (errno)); return; } if (dma_info.dma == 0) { printf("\n******************************************************\n"); printf("* Warning: The dma on your hard drive is turned off. *\n"); printf("* This may really slow down the fsck process. *\n"); printf("******************************************************\n"); if (fsck_log_file (fs) != stdout) fsck_log("WARNING: DMA is turned off\n"); } signal(SIGALRM, check_dma); alarm(1); } static void reset_super_block (reiserfs_filsys_t * fs) { reiserfs_sb_t * sb; struct reiserfs_journal_header * jh; sb = fs->fs_ondisk_sb; reiserfs_sb_set_free (sb, reiserfs_sb_get_blocks (sb)); reiserfs_sb_set_root (sb, 0); reiserfs_sb_set_height (sb, ~0); /* make file system invalid unless fsck finished () */ reiserfs_sb_set_state (sb, reiserfs_sb_get_state (sb) | FS_FATAL); /* if ( is_reiser2fs_jr_magic_string (sb) ) {??? reiserfs_sb_set_version (sb, REISERFS_VERSION_3); } if (is_reiser2fs_magic_string (sb)) { reiserfs_sb_set_version (sb, REISERFS_FORMAT_3_6); } if (is_reiserfs_magic_string (sb)) { reiserfs_sb_set_version (sb, REISERFS_FORMAT_3_5); } */ /* make sure that hash code in super block match to set hash function */ reiserfs_sb_set_hash (sb, reiserfs_hash_code (fs->hash)); if (fsck_hash_defined (fs)) { /* --hash was specifed */ fs->hash = reiserfs_hash_get (fsck_data (fs)->rebuild.defined_hash); reiserfs_sb_set_hash (sb, reiserfs_hash_code (fs->hash)); } if (reiserfs_journal_opened (fs)) { jh = (struct reiserfs_journal_header *)fs->fs_jh_bh->b_data; /* reset journal params if needed. */ if (memcmp(reiserfs_sb_jp(sb), &jh->jh_journal, sizeof (reiserfs_journal_param_t))) { if (reiserfs_super_jr_magic (sb)) memcpy (reiserfs_sb_jp(sb), &jh->jh_journal, sizeof (reiserfs_journal_param_t)); else { reiserfs_sb_set_reserved (sb, 0); reiserfs_jp_set_dev (reiserfs_sb_jp(sb), 0); reiserfs_jp_set_magic (reiserfs_sb_jp(sb), misc_random()); reiserfs_jp_set_start (reiserfs_sb_jp(sb), reiserfs_journal_start_must (fs)); reiserfs_jp_set_size (reiserfs_sb_jp(sb), reiserfs_journal_default (fs->fs_super_bh->b_blocknr, fs->fs_blocksize)); reiserfs_jp_set_tlen (reiserfs_sb_jp(sb), reiserfs_journal_tlen( reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)), reiserfs_jp_get_size (reiserfs_sb_jp(sb)), fs->fs_blocksize, 0)); reiserfs_jp_set_max_batch (reiserfs_sb_jp(sb), reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)))); reiserfs_jp_set_commit_age (reiserfs_sb_jp(sb), reiserfs_journal_commit_age()); reiserfs_jp_set_trans_age (reiserfs_sb_jp(sb), reiserfs_journal_trans_age()); reiserfs_jp_set_dev (&jh->jh_journal, 0); reiserfs_jp_set_magic (&jh->jh_journal, reiserfs_jp_get_magic(reiserfs_sb_jp(sb))); reiserfs_jp_set_start (&jh->jh_journal, reiserfs_jp_get_start(reiserfs_sb_jp(sb))); reiserfs_jp_set_size (&jh->jh_journal, reiserfs_jp_get_size(reiserfs_sb_jp(sb))); reiserfs_jp_set_tlen (&jh->jh_journal, reiserfs_jp_get_tlen(reiserfs_sb_jp(sb))); reiserfs_jp_set_max_batch (&jh->jh_journal, reiserfs_jp_get_max_batch(reiserfs_sb_jp(sb))); reiserfs_jp_set_commit_age (&jh->jh_journal, reiserfs_jp_get_commit_age(reiserfs_sb_jp(sb))); reiserfs_jp_set_trans_age (&jh->jh_journal, reiserfs_jp_get_trans_age(reiserfs_sb_jp(sb))); } } } /* objectid map is not touched */ reiserfs_buffer_mkdirty (fs->fs_super_bh); reiserfs_buffer_write (fs->fs_super_bh); if (!(fsck_data(fs)->options & OPT_SAVE_PASSES_DUMP)) reiserfs_buffer_mknoflush (fs->fs_super_bh); } #define START_FROM_THE_BEGINNING 1 #define START_FROM_PASS_1 2 #define START_FROM_PASS_2 3 #define START_FROM_SEMANTIC 4 #define START_FROM_LOST_FOUND 5 #define START_FROM_PASS_4 6 /* this decides where to start from */ static int where_to_start_from (reiserfs_filsys_t * fs) { int ret; FILE * fp = 0; int last_run_state; last_run_state = reiserfs_sb_get_state (fs->fs_ondisk_sb); if (last_run_state == 0 || !fsck_run_one_step (fs)) /**/ return START_FROM_THE_BEGINNING; /* We are able to perform the next step only if there is a file with the previous * step results. */ fp = util_file_open (state_dump_file (fs), "r"); if (fp == 0) { reiserfs_sb_set_state (fs->fs_ondisk_sb, 0); return START_FROM_THE_BEGINNING; } /* check start and end magics of dump file */ ret = fsck_stage_magic_check (fp); if (ret <= 0 || ret != last_run_state) return START_FROM_THE_BEGINNING; switch (last_run_state) { case PASS_0_DONE: /* skip pass 0 */ if (!fsck_info_ask (fs, "Pass 0 seems finished. Start " "from pass 1?(Yes)", "Yes\n", 1)) { fsck_exit ("Run without -d then\n"); } fsck_pass0_load_result (fp, fs); fclose (fp); return START_FROM_PASS_1; case PASS_1_DONE: /* skip pass 1 */ if (!fsck_info_ask (fs, "Passes 0 and 1 seems finished. " "Start from pass 2?(Yes)", "Yes\n", 1)) { fsck_exit ("Run without -d then\n"); } fsck_pass1_load_result (fp, fs); fclose (fp); return START_FROM_PASS_2; case TREE_IS_BUILT: if (!fsck_info_ask (fs, "Internal tree of filesystem looks built. " "Skip rebuilding?(Yes)", "Yes\n", 1)) { fsck_exit ("Run without -d then\n"); } fsck_pass2_load_result (fs); fclose (fp); return START_FROM_SEMANTIC; case SEMANTIC_DONE: if (!fsck_info_ask (fs, "Passes 0 and 1 seems finished. Start from " "pass 2?(Yes)", "Yes\n", 1)) { fsck_exit ("Run without -d then\n"); } fsck_semantic_load_result (fp, fs); fclose (fp); return START_FROM_LOST_FOUND; case LOST_FOUND_DONE: if (!fsck_info_ask (fs, "Passes 0 and 1 seems finished. Start from " "pass 2?(Yes)", "Yes\n", 1)) { fsck_exit ("Run without -d then\n"); } fsck_lost_load_result (fs); fclose (fp); return START_FROM_PASS_4; } return START_FROM_THE_BEGINNING; } static void mark_filesystem_consistent (reiserfs_filsys_t * fs) { if (!reiserfs_fs_rw (fs)) return; if (!reiserfs_journal_opened (fs)) { /* make sure journal is not standard */ if (!reiserfs_super_jr_magic (fs->fs_ondisk_sb)) reiserfs_exit(EXIT_OPER, "Filesystem with default journal " "must be opened."); fsck_progress ("WARNING: You must use reiserfstune to specify a new " "journal before mounting it.\n"); /* mark filesystem such that it is not mountable until * new journaldevice is defined */ reiserfs_jp_set_magic (reiserfs_sb_jp (fs->fs_ondisk_sb), NEED_TUNE); } reiserfs_sb_set_umount (fs->fs_ondisk_sb, FS_CLEANLY_UMOUNTED); reiserfs_sb_set_state (fs->fs_ondisk_sb, FS_CONSISTENT); reiserfs_buffer_mkdirty (fs->fs_super_bh); } static void reiserfsck_journal_replay (reiserfs_filsys_t * fs) { reiserfs_sb_t *on_place_sb; int sb_size = reiserfs_super_size(fs->fs_ondisk_sb); /* keep the super_block in the separate memory to avoid problems with replaying * broken parameters. */ on_place_sb = (reiserfs_sb_t *)fs->fs_super_bh->b_data; fs->fs_ondisk_sb = misc_getmem (sb_size); memcpy (fs->fs_ondisk_sb, on_place_sb, sb_size); reiserfs_journal_replay (fs); /* Copy checked reliable sb fields from backed up sb to a new one. */ reiserfs_sb_set_blocks(on_place_sb, reiserfs_sb_get_blocks(fs->fs_ondisk_sb)); memcpy(reiserfs_sb_jp(on_place_sb), reiserfs_sb_jp(fs->fs_ondisk_sb), sizeof(reiserfs_journal_param_t)); reiserfs_sb_set_blksize(on_place_sb, reiserfs_sb_get_blksize(fs->fs_ondisk_sb)); reiserfs_sb_set_mapmax(on_place_sb, reiserfs_sb_get_mapmax(fs->fs_ondisk_sb)); memcpy(on_place_sb->s_v1.s_magic, fs->fs_ondisk_sb->s_v1.s_magic, 10); reiserfs_sb_set_hash(on_place_sb, reiserfs_sb_get_hash(fs->fs_ondisk_sb)); reiserfs_sb_set_bmaps(on_place_sb, reiserfs_sb_get_bmaps(fs->fs_ondisk_sb)); reiserfs_sb_set_version(on_place_sb, reiserfs_sb_get_version(fs->fs_ondisk_sb)); reiserfs_sb_set_reserved(on_place_sb, reiserfs_sb_get_reserved(fs->fs_ondisk_sb)); if (sb_size == REISERFS_SB_SIZE) { reiserfs_sb_set_flags(on_place_sb, reiserfs_sb_get_flags(fs->fs_ondisk_sb)); memcpy(on_place_sb->s_uuid, fs->fs_ondisk_sb->s_uuid, 16); memcpy(on_place_sb->s_label, fs->fs_ondisk_sb->s_label, 16); } /* get rid of SB copy */ misc_freemem (fs->fs_ondisk_sb); fs->fs_ondisk_sb = on_place_sb; } static int the_end (reiserfs_filsys_t * fs) { reiserfs_sb_t * sb; int ret = EXIT_FIXED; sb = fs->fs_ondisk_sb; /* put bitmap and objectid map on place */ reiserfs_bitmap_delete (fs->fs_bitmap2); fs->fs_bitmap2 = fsck_new_bitmap (fs); if (!fs->fs_bitmap2->bm_dirty) misc_die ("Bitmap not dirty"); // id_map_flush(proper_id_map (fs), fs); // id_map_flush(semantic_id_map (fs), fs); // id_map_free(proper_id_map (fs)); // id_map_free(semantic_id_map (fs)); /* reiserfs_sb_set_free (sb, reiserfs_bitmap_zeros (fsck_new_bitmap (fs)));*/ mark_filesystem_consistent (fs); reiserfs_buffer_clnoflush (fs->fs_super_bh); if (fsck_data(fs)->mounted == MF_RO) { reiserfs_warning(stderr, "\nThe partition is mounted ro. It " "is better to umount and mount it again.\n\n"); ret = EXIT_REBOOT; } /* write all dirty blocks */ fsck_progress ("Syncing.."); fs->fs_dirt = 1; util_device_dma_fini(fs->fs_dev, &dma_info); reiserfs_fs_close (fs); fs = NULL; fsck_progress ("finished\n"); return ret; } /* check umounted or read-only mounted filesystems only */ static void prepare_fs_for_check(reiserfs_filsys_t * fs) { /* The method could be called from auto_check already. */ if (fs->fs_flags == O_RDWR) return; reiserfs_fs_reopen (fs, O_RDWR); fsck_data(fs)->mounted = util_device_mounted(fs->fs_file_name); if (fsck_data(fs)->mounted > 0) { if (fsck_data(fs)->mounted == MF_RW) { fsck_progress ("Partition %s is mounted with write permissions, " "cannot check it\n", fs->fs_file_name); reiserfs_fs_close(fs); exit(EXIT_USER); } /* If not CHECK mode, lock the process in the memory. */ if (fsck_mode (fs) != FSCK_CHECK) { if (mlockall(MCL_CURRENT)) { reiserfs_exit(EXIT_OPER, "Failed to lock the process to " "fsck the mounted ro partition. %s.\n", strerror(errno)); } } if (fsck_skip_journal (fs)) { reiserfs_exit(EXIT_USER, "Jounrnal of the mounted " "filesystem must be specified.\n"); } if (!reiserfs_journal_opened (fs)) { /* just to make sure */ reiserfs_panic ("Journal is not opened"); } else if (reiserfs_journal_params_check(fs)) { reiserfs_fs_close (fs); exit(EXIT_FATAL); } fsck_progress ("Filesystem seems mounted read-only. Skipping journal " "replay.\n"); } else if (!fsck_skip_journal (fs)) { if (reiserfs_journal_params_check(fs)) { reiserfs_fs_close (fs); exit(EXIT_FATAL); } /* filesystem is not mounted, replay journal before checking */ reiserfsck_journal_replay (fs); } } static void rebuild_tree (reiserfs_filsys_t * fs) { time_t t; int ret; fsck_rollback_init (state_rollback_file(fs), &fs->fs_blocksize, fsck_data(fs)->log); prepare_fs_for_check(fs); ret = reiserfs_bitmap_open(fs); if (ret < 0) { fsck_progress ("reiserfsck: Could not open bitmap\n"); reiserfs_fs_close (fs); exit(EXIT_OPER); } else if (ret > 0) { fsck_log("Zero bit found in on-disk bitmap after the last valid bit. " "Fixed.\n"); } time (&t); fsck_progress ("###########\n" "reiserfsck --rebuild-tree started at %s" "###########\n", ctime (&t)); switch (where_to_start_from (fs)) { case START_FROM_THE_BEGINNING: reset_super_block (fs); fsck_pass0 (fs); case START_FROM_PASS_1: reset_super_block (fs); fsck_pass1 (fs); case START_FROM_PASS_2: fsck_pass2 (fs); case START_FROM_SEMANTIC: fsck_semantic (fs); /* if --lost+found is set - link unaccessed directories to lost+found directory */ case START_FROM_LOST_FOUND: fsck_lost (fs); case START_FROM_PASS_4: /* 4. look for unaccessed items in the leaves */ fsck_cleanup (); ret = the_end (fs); } fsck_rollback_fini (); time (&t); fsck_progress ("###########\n" "reiserfsck finished at %s" "###########\n", ctime (&t)); exit (ret); } static void clean_attributes (reiserfs_filsys_t * fs) { time_t t; time (&t); if (reiserfs_sb_get_umount (fs->fs_ondisk_sb) != FS_CLEANLY_UMOUNTED) { fsck_progress ("Filesystem is not clean\n" "Check consistency of the partition first.\n"); exit(EXIT_USER); } if (reiserfs_sb_get_state (fs->fs_ondisk_sb) != FS_CONSISTENT) { fsck_progress ("Filesystem seems to be in unconsistent state.\n" "Check consistency of the partition first.\n"); exit(EXIT_USER); } if (reiserfs_super_format (fs->fs_ondisk_sb) != REISERFS_FORMAT_3_6) { fsck_progress ("Filesystems of 3_5 format do not support extended " "attributes.\n"); exit(EXIT_USER); } fsck_progress ("###########\n" "reiserfsck --clean-attributes started at %s" "###########\n", ctime (&t)); fsck_rollback_init (state_rollback_file(fs), &fs->fs_blocksize, fsck_data(fs)->log); prepare_fs_for_check(fs); fsck_tree_clean_attr(fs); util_device_dma_fini(fs->fs_dev, &dma_info); reiserfs_fs_close (fs); fs = NULL; fsck_rollback_fini(); fsck_progress ("###########\n" "reiserfsck finished at %s" "###########\n", ctime (&t)); exit (EXIT_FIXED); } /* Do not allow buffers to be flushed after finishing to avoid another bitmap * reading on mounting. */ static void fsck_sleep() { int res; res = fork(); if (res == -1) { reiserfs_panic ("reiserfsck: Fork failed: %s", strerror(errno)); } else if (res == 0) { /* Make the child process to sleep for 5 secs. */ sleep(5); } } static int auto_check (reiserfs_filsys_t *fs) { __u16 state; int retval = 0; reiserfs_super_print (stdout, fs, fs->fs_file_name, fs->fs_super_bh, 1); state = reiserfs_sb_get_state (fs->fs_ondisk_sb); if ((state & FS_FATAL) == FS_FATAL) { fprintf(stderr, "Filesystem seems to have fatal corruptions. Running " "with --rebuild-tree is required.\n"); goto error; } if ((state & FS_ERROR) == FS_ERROR) { fprintf(stderr, "Some corruptions on the filesystem were detected. Switching to " "the --fix-fixable mode.\n"); /* run fixable pass. */ return 0; } if (state != FS_CONSISTENT) fprintf(stderr, "Some strange state was specified in the super block. " "Do usual check.\n"); prepare_fs_for_check(fs); /* Check bitmaps. */ retval = reiserfs_bitmap_open (fs); if (retval > 0) { fsck_log("Zero bit found in on-disk bitmap after the last valid bit. " "Switching to --fix-fixable mode.\n"); /* run fixable pass. */ return 0; } else if (retval < 0) { fsck_progress ("reiserfsck: Could not open bitmap\n"); goto error; } if (reiserfs_sb_get_blocks (fs->fs_ondisk_sb) - reiserfs_sb_get_free(fs->fs_ondisk_sb) != fs->fs_bitmap2->bm_set_bits) { fsck_log("Wrong amount of used blocks. Switching to the --fix-fixable mode.\n"); /* run fixable pass. */ return 0; } check_fs_tree (fs); if (fsck_data (fs)->check.fatal_corruptions) { fprintf(stderr, "%lu fatal corruption(s) found in the root block. Running " "with the --rebuild-tree is required.\n", fsck_data (fs)->check.fatal_corruptions); goto fatal_error; } else if (fsck_data (fs)->check.fixable_corruptions) { /* seems that this cannot happen. */ fprintf(stderr, "%lu fixable corruption(s) found. Switching to " "the --fix-fixable mode.\n", fsck_data (fs)->check.fixable_corruptions); fsck_data (fs)->check.fixable_corruptions = 0; /* run fixable pass. */ return 0; } util_device_dma_fini(fs->fs_dev, &dma_info); fsck_sleep(); reiserfs_fs_close (fs); /* do not do anything else. */ exit (EXIT_OK); fatal_error: reiserfs_sb_set_state(fs->fs_ondisk_sb, FS_FATAL); reiserfs_buffer_mkdirty (fs->fs_super_bh); reiserfs_buffer_write(fs->fs_super_bh); error: util_device_dma_fini(fs->fs_dev, &dma_info); reiserfs_fs_close(fs); exit(EXIT_FATAL); } /* check umounted or read-only mounted filesystems only */ static void check_fs (reiserfs_filsys_t * fs) { int retval = EXIT_OK; time_t t; time (&t); if (fsck_mode (fs) != FSCK_FIX_FIXABLE) { fsck_progress ("###########\n" "reiserfsck --check started at %s" "###########\n", ctime (&t)); } else { fsck_progress ("###########\n" "reiserfsck --fix-fixable started at %s" "###########\n", ctime (&t)); } fsck_rollback_init (state_rollback_file(fs), &fs->fs_blocksize, fsck_data(fs)->log); prepare_fs_for_check (fs); if (!fs->fs_bitmap2) /* It could be done on auto_check already. */ retval = reiserfs_bitmap_open (fs); if (retval > 0) { if (fsck_mode(fs) != FSCK_FIX_FIXABLE) { fsck_log("Zero bit found in on-disk bitmap after the last valid " "bit.\n"); one_more_corruption(fs, FIXABLE); } else { fsck_log("Zero bit found in on-disk bitmap after the last valid " "bit. Fixed.\n"); } } else if (retval < 0) { fsck_progress ("reiserfsck: Could not open bitmap\n"); reiserfs_fs_close (fs); exit(EXIT_OPER); } check_fs_tree (fs); fsck_semantic_check (); if (fsck_data (fs)->check.fatal_corruptions) { fsck_progress ("%lu found corruptions can be fixed only when running with " "--rebuild-tree\n", fsck_data (fs)->check.fatal_corruptions); reiserfs_sb_set_state (fs->fs_ondisk_sb, FS_FATAL); reiserfs_buffer_mkdirty (fs->fs_super_bh); retval = EXIT_FATAL; } else if (fsck_data (fs)->check.fixable_corruptions) { /* fixable corruptions found */ if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { /* fixable corruptions found and fix-fixable has not fixed them, * do rebuild-tree */ fsck_progress ("Fatal error: %lu fixable corruptions found after " "--fix-fixable.\n", fsck_data (fs)->check.fixable_corruptions); retval = EXIT_OPER; } else { fsck_progress ("%lu found corruptions can be fixed when running with " "--fix-fixable\n", fsck_data (fs)->check.fixable_corruptions); retval = EXIT_FIXABLE; } reiserfs_sb_set_state (fs->fs_ondisk_sb, FS_ERROR); reiserfs_buffer_mkdirty (fs->fs_super_bh); } else { fsck_stage_report (FS_CHECK, fs); fsck_progress ("No corruptions found\n"); if (fsck_mode(fs) != FSCK_CHECK) { if (util_device_mounted(fs->fs_file_name) == MF_RO) { reiserfs_warning(stderr, "\nThe partition is mounted ro. It is better " "to umount and mount it again.\n\n"); retval = EXIT_REBOOT; } else retval = EXIT_FIXED; } else retval = EXIT_OK; mark_filesystem_consistent (fs); } if (fsck_mode (fs) == FSCK_FIX_FIXABLE && !fsck_data (fs)->check.fatal_corruptions) id_map_flush(proper_id_map (fs), fs); id_map_free(proper_id_map (fs)); util_device_dma_fini(fs->fs_dev, &dma_info); reiserfs_fs_close (fs); fs = NULL; fsck_rollback_fini(); //clear_relocated_list(); time (&t); fsck_progress ("###########\n" "reiserfsck finished at %s" "###########\n", ctime (&t)); exit(retval); } static int open_devices_for_rollback (char * file_name, struct fsck_data * data) { int fd; fd = open (file_name, O_RDWR #ifdef O_LARGEFILE | O_LARGEFILE #endif ); if (fd == -1) { reiserfs_warning (stderr, "reiserfsck: Cannot not open the fs " "partition %s\n", file_name); return -1; } fs = misc_getmem (sizeof (*fs)); fs->fs_dev = fd; fs->fs_vp = data; strncpy(fs->fs_file_name, file_name, sizeof(fs->fs_file_name)); if (data->journal_dev_name && strcmp (data->journal_dev_name, file_name)) { fs->fs_journal_dev = open (data->journal_dev_name, O_RDWR #ifdef O_LARGEFILE | O_LARGEFILE #endif ); if (fs->fs_journal_dev == -1) { reiserfs_warning (stderr, "Cannot open journal partition\n"); return -1; } } if (fsck_rollback_prep (state_rollback_file(fs), fsck_data(fs)->log)) return -1; return 0; } static void fsck_perform_rollback (reiserfs_filsys_t * fs) { time_t t; time (&t); fsck_progress ("###########\n" "reiserfsck --rollback-fsck-changes started at %s" "###########\n", ctime (&t)); fsck_rollback (fs->fs_dev, fs->fs_journal_dev, fsck_progress_file (fs)); fsck_rollback_fini (); close (fs->fs_journal_dev); close (fs->fs_dev); misc_freemem (fs); time (&t); fsck_progress ("###########\n" "reiserfsck finished at %s" "###########\n", ctime (&t)); exit(EXIT_FIXED); } int main (int argc, char * argv []) { char * file_name; struct fsck_data * data; struct rlimit rlim = {RLIM_INFINITY, RLIM_INFINITY}; int retval; int error; lost_found_dir_key.k2_dir_id = cpu_to_le32(lost_found_dir_key.k2_dir_id); lost_found_dir_key.k2_objectid = cpu_to_le32(lost_found_dir_key.k2_objectid); /* this is only needed (and works) when running under 2.4 on regular files */ if (setrlimit (RLIMIT_FSIZE, &rlim) == -1) { reiserfs_warning (stderr, "Cannot change the system limit for file size " "with setrlimit: %s\n", strerror(errno)); } data = misc_getmem (sizeof (struct fsck_data)); file_name = parse_options (data, argc, argv); if (data->mode != FSCK_AUTO) util_print_banner ("reiserfsck"); if (data->mode == DO_NOTHING) { misc_freemem (data); exit(EXIT_OK); } if (data->options & OPT_BACKGROUND) { /* running in background reiserfsck appends progress information into 'fsck.run'. Logs get there if log file was not specified*/ data->options |= OPT_QUIET; data->progress = fopen ("fsck.run", "a+"); if (!data->progress) { reiserfs_exit(EXIT_OPER, "reiserfsck: Cannot not open \"fsck.run\""); } if (data->log == stdout) /* no log file specifed - redirect log into 'fsck.run' */ data->log = data->progress; retval = fork (); if (retval == -1) { reiserfs_panic ("reiserfsck: Fork failed: %s", strerror(errno)); } else if (retval != 0) { exit(EXIT_OPER); } reiserfs_warning (stderr, "\nReiserfsck is running in background as " "[%d],\nmake sure that it gets all the confirmations from stdin " "that it requests.\n\n", getpid ()); } /* This asks for confirmation also. */ if (data->mode != FSCK_AUTO) warn_what_will_be_done(file_name, data); if (data->mode == FSCK_ROLLBACK_CHANGES) { if (open_devices_for_rollback (file_name, data) == -1) exit(EXIT_OPER); } else { fs = reiserfs_fs_open (file_name, O_RDONLY, &error, data, data->mode != FSCK_SB); if (error) { reiserfs_exit(EXIT_OPER, "Failed to open the device " "'%s': %s\n\n", file_name, strerror(error)); } if (data->mode != FSCK_SB) { if (fs == NULL) { reiserfs_exit(EXIT_OPER, "Failed to open the filesystem.\n\n" "If the partition table has not been changed, " "and the partition is\nvalid and it really " "contains a reiserfs partition, then the\n" "superblock is corrupted and you need to run " "this utility with\n--rebuild-sb.\n"); } if (fsck_skip_journal (fs) && !reiserfs_super_jr_magic (fs->fs_ondisk_sb)) { reiserfs_warning (stderr, "Filesystem with default journal found, " "--no-journal-available is ignored\n"); fsck_data(fs)->options &= ~OPT_SKIP_JOURNAL; } if (!fsck_skip_journal (fs)) { retval = reiserfs_journal_open(fs, data->journal_dev_name, O_RDONLY); if (retval) { fsck_progress ("Failed to open the journal device (%s).\n", data->journal_dev_name); if (retval == 1) { fsck_progress ("Run --rebuild-sb to rebuild journal parameters.\n"); } reiserfs_fs_close (fs); exit(EXIT_OPER); } } if (data->options & BADBLOCKS_FILE) { if (util_badblock_load (fs, badblocks_file) != 0) exit(EXIT_OPER); } register_timer(); } } switch (data->mode) { case FSCK_SB: rebuild_sb (fs, file_name, data); break; case FSCK_AUTO: /* perform some light-weight checks. If error, do fixable job. */ if (auto_check (fs)) break; data->mode = FSCK_FIX_FIXABLE; case FSCK_CHECK: case FSCK_FIX_FIXABLE: check_fs (fs); break; case FSCK_REBUILD: case DO_TEST: rebuild_tree (fs); break; case FSCK_ROLLBACK_CHANGES: fsck_perform_rollback (fs); break; case FSCK_CLEAN_ATTRIBUTES: clean_attributes (fs); } exit(EXIT_OPER); } reiserfsprogs-3.6.20/utils/fsck/pass0.c0000644000175300001440000017046310412227267014715 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/malloc.h" #include "misc/unaligned.h" #include "util/misc.h" #include "util/device.h" #include #include #include #include /* * Pass0 scans the used part of the partition. It creates two maps which will * be used on the pass 1. These are a map of nodes looking like leaves and * a map of "bad" unformatted nodes. After pass 0 we can detect unformatted * node pointers pointing to leaves. */ /* leaves */ reiserfs_bitmap_t * leaves_bitmap; #define pass0_block_mkleaf(block) \ reiserfs_bitmap_set_bit(leaves_bitmap, block) int pass0_block_isleaf(unsigned long block) { return reiserfs_bitmap_test_bit(leaves_bitmap, block); } void pass0_block_clleaf(unsigned long block) { reiserfs_bitmap_clear_bit(leaves_bitmap, block); } /* nodes which are referred to from only one extent item */ reiserfs_bitmap_t * good_unfm_bitmap; #define pass0_block_mkgood_unfm(block) \ reiserfs_bitmap_set_bit(good_unfm_bitmap, block) #define pass0_block_clgood_unfm(block) \ reiserfs_bitmap_clear_bit(good_unfm_bitmap, block) int pass0_block_isgood_unfm(unsigned long block) { return reiserfs_bitmap_test_bit(good_unfm_bitmap, block); } /* nodes which are referred to from more than one extent item */ reiserfs_bitmap_t * bad_unfm_bitmap; #define pass0_block_mkbad_unfm(block) \ reiserfs_bitmap_set_bit(bad_unfm_bitmap, block) #define pass0_block_clbad_unfm(block) \ reiserfs_bitmap_clear_bit(bad_unfm_bitmap, block) int pass0_block_isbad_unfm(unsigned long block) { return reiserfs_bitmap_test_bit(bad_unfm_bitmap, block); } static int correct_direct_item_offset (reiserfs_ih_t *ih, reiserfs_filsys_t *fs) { __u64 offset; __u64 len; int format; offset = reiserfs_key_get_off (&ih->ih_key); format = reiserfs_key_format (&ih->ih_key); if (offset == 0) return 0; if (format == KEY_FORMAT_2) { if ((offset - 1) % 8 != 0) return 0; } len = reiserfs_ih_get_len(ih) + offset - 1; offset = MISC_DOWN(offset - 1, fs->fs_blocksize); if (reiserfs_policy_ext (len, len - offset, fs->fs_blocksize)) return 0; return 1; } /* bitmaps which are built on pass 0 and are used on pass 1 */ static void fsck_pass0_aux_prep (reiserfs_filsys_t * fs) { reiserfs_sb_t * sb; sb = fs->fs_ondisk_sb; /* bitmap of leaves found on the device */ leaves_bitmap = reiserfs_bitmap_create (reiserfs_sb_get_blocks (sb)); good_unfm_bitmap = reiserfs_bitmap_create (reiserfs_sb_get_blocks (sb)); bad_unfm_bitmap = reiserfs_bitmap_create (reiserfs_sb_get_blocks (sb)); } void fsck_pass0_aux_fini (void) { reiserfs_bitmap_delete (leaves_bitmap); reiserfs_bitmap_delete (good_unfm_bitmap); reiserfs_bitmap_delete (bad_unfm_bitmap); } /* register block some extent item points to */ static void register_unfm (unsigned long block) { if (!pass0_block_isgood_unfm (block) && !pass0_block_isbad_unfm (block)) { /* this block was not pointed by other extent items yet */ pass0_block_mkgood_unfm (block); return; } if (pass0_block_isgood_unfm (block)) { /* block was pointed once already, unmark it in bitmap of good unformatted nodes and mark in bitmap of bad pointers */ pass0_block_clgood_unfm (block); pass0_block_mkbad_unfm (block); return; } assert (pass0_block_isbad_unfm (block)); } /* 'upper' item is correct if 'upper + 2' exists and its key is greater than key of 'upper' */ static int upper_correct (reiserfs_bh_t * bh, reiserfs_ih_t * upper, int upper_item_num) { if (upper_item_num + 2 < reiserfs_node_items (bh)) { if (reiserfs_key_comp (&upper->ih_key, &(upper + 2)->ih_key) != -1) /* item-num's item is out of order of order */ return 0; return 1; } /* there is no item above the "bad pair" */ return 2; } /* 'lower' item is correct if 'lower - 2' exists and its key is smaller than key of 'lower' */ static int lower_correct (reiserfs_bh_t * bh, reiserfs_ih_t * lower, int lower_item_num) { if (lower_item_num - 2 >= 0) { if (reiserfs_key_comp (&(lower - 2)->ih_key, &lower->ih_key) != -1) return 0; return 1; } return 2; } /* return 1 if something was changed */ static int correct_key_format (reiserfs_ih_t * ih, int symlink) { int dirty = 0; if (reiserfs_ih_stat (ih)) { /* for stat data we have no way to check whether key format in item head matches to the key format found from the key directly */ if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE_V1) { if (reiserfs_ih_get_format (ih) != KEY_FORMAT_1) { /*fsck_log ("correct_key_format: ih key format of (%H) is " "set to format 1\n", ih);*/ reiserfs_ih_set_format (ih, KEY_FORMAT_1); return 1; } return 0; } if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE) { if (reiserfs_ih_get_format (ih) != KEY_FORMAT_2) { /*fsck_log ("correct_key_format: ih key format of (%H) " "is set to format 2\n", ih);*/ reiserfs_ih_set_format (ih, KEY_FORMAT_2); return 1; } return 0; } misc_die ("stat_data item of the wrong length"); } if (symlink && (reiserfs_key_format(&ih->ih_key) != KEY_FORMAT_1)) { /* All symlinks are of 3.5 format */ /*fsck_log ("correct_key_format: Symlink keys should be of 3.5 " "format. %k - fixed.\n", &ih->ih_key); */ reiserfs_key_set_sec(KEY_FORMAT_1, &ih->ih_key, reiserfs_key_get_off(&ih->ih_key), reiserfs_key_get_type(&ih->ih_key)); } if (reiserfs_key_format (&ih->ih_key) != reiserfs_ih_get_format (ih)) { /*fsck_log ("correct_key_format: ih key format of (%H) is " "set to format found in the key\n", ih);*/ reiserfs_ih_set_format (ih, reiserfs_key_format (&ih->ih_key)); dirty = 1; } return dirty; } static void hash_hits_init (reiserfs_filsys_t * fs) { fsck_data (fs)->rebuild.hash_amount = REISERFS_HASH_LAST; fsck_data (fs)->rebuild.hash_hits = misc_getmem (sizeof (unsigned long) * fsck_data (fs)->rebuild.hash_amount); } static void add_hash_hit (reiserfs_filsys_t * fs, int hash_code) { fsck_data (fs)->rebuild.hash_hits [hash_code] ++; } /* deh_location look reasonable, try to find name length. return 0 if we failed */ static int try_to_get_name_length (reiserfs_ih_t * ih, reiserfs_deh_t * deh, int i) { int len; if (i == 0 || !reiserfs_deh_locbad (deh - 1)) { len = reiserfs_direntry_name_len (ih, deh, i); return (len > 0) ? len : 0; } /* previous entry had bad location so we had no way to find name length */ return 0; } /* define this if you are using -t to debug recovering of corrupted directory item */ #define DEBUG_VERIFY_DENTRY #undef DEBUG_VERIFY_DENTRY /* check directory item and try to recover something */ static int verify_directory_item (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, int item_num) { reiserfs_ih_t * ih; reiserfs_ih_t tmp; char * item; reiserfs_deh_t * deh; char * name; int name_len; int bad, lost_found; int i, j; int dirty; int hash_code; int bad_locations; int min_entry_size = 1; #ifdef DEBUG_VERIFY_DENTRY char * direntries; #endif ih = reiserfs_ih_at (bh, item_num); item = reiserfs_item_by_ih (bh,ih); deh = (reiserfs_deh_t *)item; dirty = 0; bad_locations = 0; if ( (reiserfs_ih_get_entries (ih) > (reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size))) || (reiserfs_ih_get_entries (ih) == 0)) { reiserfs_ih_set_entries (ih, (int)reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size)); reiserfs_buffer_mkdirty (bh); } if (reiserfs_ih_get_entries (ih) == 0) { reiserfs_leaf_delete_item (fs, bh, item_num); return -1; } /* check deh_location */ for (i = 0; i < reiserfs_ih_get_entries (ih); i ++) { /* silently fix deh_state */ if (reiserfs_deh_get_state (deh + i) != (1 << DEH_Visible2)) { reiserfs_deh_set_state (deh + i, (1 << DEH_Visible2)); reiserfs_buffer_mkdirty (bh); } if (reiserfs_direntry_loc_check (deh + i, ih, !i)) reiserfs_deh_set_locbad (deh + i); } #ifdef DEBUG_VERIFY_DENTRY direntries = misc_getmem (ih_entry_count (ih) * sizeof (int)); printf ("Entries with bad locations within the directory: "); for (i = 0; i < ih_entry_count (ih); i ++) { if (reiserfs_deh_locbad (deh + i)) printf ("%d ", i); } printf ("\n"); #endif /* DEBUG_VERIFY_DENTRY */ /* find entries names in which have mismatching deh_offset */ for (i = reiserfs_ih_get_entries (ih) - 1; i >= 0; i --) { if (reiserfs_deh_bad (deh + i)) /* bad location */ continue; if (i) { if (reiserfs_deh_get_loc (deh + i - 1) < reiserfs_deh_get_loc (deh + i)) { reiserfs_deh_set_locbad (deh + i - 1); } } name = reiserfs_deh_name (deh + i, i); /* Although we found a name, we not always can get its length as it depends on deh_location of previous entry. */ name_len = try_to_get_name_length (ih, deh + i, i); #ifdef DEBUG_VERIFY_DENTRY if (name_len == 0) printf ("Trying to find the name length for %d-th entry\n", i); #endif /* DEBUG_VERIFY_DENTRY */ if (is_dot (name, name_len)) { if (i != 0) fsck_log ("block %lu: item %d: \".\" must be the first entry, " "but it is the %d-th entry\n", bh->b_blocknr, item_num, i); /* check and fix "." */ if (reiserfs_deh_get_off (deh + i) != OFFSET_DOT) { reiserfs_deh_set_off (deh + i, OFFSET_DOT); reiserfs_buffer_mkdirty (bh); } /* "." must point to the directory it is in */ /* if (reiserfs_key_comp2 (&(deh[i].deh2_dir_id), &(ih->ih_key))) { fsck_log ("verify_direntry: block %lu, item %H has entry \".\" " "pointing to (%K) instead of (%K)\n", bh->b_blocknr, ih, &(deh[i].deh2_dir_id), &(ih->ih_key)); reiserfs_deh_set_did (deh + i, reiserfs_key_get_did (&ih->ih_key)); reiserfs_deh_set_obid (deh + i, reiserfs_key_get_oid (&ih->ih_key)); reiserfs_buffer_mkdirty (bh); } */ } else if (is_dot_dot (name, name_len)) { if (i != 1) fsck_log ("block %lu: item %d: \"..\" is %d-th entry\n", bh->b_blocknr, item_num, i); /* check and fix ".." */ if (reiserfs_deh_get_off (deh + i) != OFFSET_DOT_DOT) { reiserfs_deh_set_off (deh + i, OFFSET_DOT_DOT); reiserfs_buffer_mkdirty (bh); } } else { int min_length, max_length; /* check other name */ if (name_len == 0) { /* we do not know the length of name - we will try to find it */ min_length = 1; max_length = item + reiserfs_ih_get_len (ih) - name; } else /* we kow name length, so we will try only one name length */ min_length = max_length = name_len; hash_code = 0; for (j = min_length; j <= max_length; j ++) { hash_code = reiserfs_hash_find (name, j, reiserfs_deh_get_off(deh + i), reiserfs_sb_get_hash(fs->fs_ondisk_sb)); /* add_hash_hit (fs, hash_code);*/ if (reiserfs_hash_func (hash_code) != 0) { /* deh_offset matches to some hash of the name */ if (fsck_hash_defined (fs) && hash_code != reiserfs_hash_code (fs->hash)) { /* wrong hash selected - so we can skip this leaf */ return 1; } if (!name_len) { fsck_log ("%s: block %lu, item %H: Found a name " "\"%.*s\" for %d-th entry matching to the " "hash %u.\n", __FUNCTION__, bh->b_blocknr, ih, j, name, i, reiserfs_deh_get_off (deh + i)); /* FIXME: if next byte is 0 we think that the name is aligned to 8 byte boundary */ if (i) { reiserfs_deh_set_loc (&deh[i - 1], reiserfs_deh_get_loc (deh + i) + ((name[j] || fs->fs_format == REISERFS_FORMAT_3_5) ? j : MISC_ROUND_UP (j))); reiserfs_deh_set_locok (deh + i - 1); reiserfs_buffer_mkdirty (bh); } } break; } } add_hash_hit (fs, hash_code); if (j == max_length + 1) { /* deh_offset does not match to anything. it will be deleted for now, but maybe we could just fix a deh_offset if it is in ordeer */ reiserfs_deh_set_offbad (deh + i); } } } /* for */ #ifdef DEBUG_VERIFY_DENTRY printf ("Entries with mismatching hash: "); for (i = 0; i < ih_entry_count (ih); i ++) { if (reiserfs_deh_offbad (deh + i)) printf ("%d ", i); } printf ("\n"); #endif /* DEBUG_VERIFY_DENTRY */ /* correct deh_locations such that code cutting entries will not get screwed up */ { int prev_loc; int loc_fixed; prev_loc = reiserfs_ih_get_len (ih); for (i = 0; i < reiserfs_ih_get_entries (ih); i ++) { loc_fixed = 0; if (reiserfs_deh_locbad (deh + i)) { reiserfs_deh_set_loc (deh + i, prev_loc/* - 1*/); reiserfs_buffer_mkdirty (bh); loc_fixed = 1; } else { if (reiserfs_deh_get_loc (deh + i) >= prev_loc) { reiserfs_deh_set_loc (deh + i, prev_loc/* - 1*/); reiserfs_buffer_mkdirty (bh); loc_fixed = 1; } } prev_loc = reiserfs_deh_get_loc (deh + i); if (i == reiserfs_ih_get_entries (ih) - 1) { /* last entry starts right after an array of direntry headers */ if (!reiserfs_deh_bad (deh + i) && reiserfs_deh_get_loc (deh + i) != (REISERFS_DEH_SIZE * reiserfs_ih_get_entries (ih))) { /* free space in the directory item */ fsck_log ("%s: block %lu, item %H: Directory item has a " "free space - deleting\n", __FUNCTION__, bh->b_blocknr, ih); reiserfs_leaf_delete_entry (fs, bh, item_num, reiserfs_ih_get_entries (ih), 0); } if (reiserfs_deh_get_loc (deh + i) != (REISERFS_DEH_SIZE * reiserfs_ih_get_entries (ih))) { reiserfs_deh_set_loc (&deh[i], (REISERFS_DEH_SIZE * reiserfs_ih_get_entries (ih))); loc_fixed = 1; reiserfs_buffer_mkdirty (bh); } } #ifdef DEBUG_VERIFY_DENTRY if (loc_fixed) direntries [i] = 1; #endif } /* for */ #ifdef DEBUG_VERIFY_DENTRY printf ("Entries with fixed deh_locations: "); for (i = 0; i < ih_entry_count (ih); i ++) { if (direntries [i]) printf ("%d ", i); } printf ("\n"); #endif /* DEBUG_VERIFY_DENTRY */ } #ifdef DEBUG_VERIFY_DENTRY printf (" N location name\n"); for (i = 0; i < ih_entry_count (ih); i ++) { if (reiserfs_deh_bad (deh + i) || (i && reiserfs_deh_bad (deh + i - 1)) || /* previous entry marked bad */ (i < ih_entry_count (ih) - 1 && reiserfs_deh_bad (deh + i + 1))) { /* next entry is marked bad */ /* print only entries to be deleted and their nearest neighbors */ printf ("%3d: %8d ", i, deh_location (deh + i)); if (reiserfs_deh_bad (deh + i)) printf ("will be deleted\n"); else printf ("\"%.*s\"\n", reiserfs_direntry_name_len (ih, deh + i, i), reiserfs_deh_name (deh + i, i)); } } #endif bad = lost_found = 0; tmp = *ih; /* mark enries of /lost+found as bad */ deh = reiserfs_deh (bh, ih); for (i = 0; i < reiserfs_ih_get_entries (ih); i ++, deh ++) { unsigned int dirid, objectid; char buf[REISERFS_NAME_MAX]; if (reiserfs_deh_bad (deh)) continue; buf[0] = '\0'; sprintf (buf, "%.*s", reiserfs_direntry_name_len (ih, deh, i), reiserfs_deh_name (deh, i)); if (sscanf (buf, "%d_%d", &dirid, &objectid) != 2) continue; if (reiserfs_deh_get_did (deh) != dirid || reiserfs_deh_get_obid (deh) != objectid) continue; /* entry in lost+found */ // printf ("%s - will be deleted\n", buf); lost_found++; reiserfs_deh_set_offbad (deh); } /* delete entries which are marked bad */ for (i = 0; i < reiserfs_ih_get_entries (ih); i ++) { deh = reiserfs_deh (bh, ih) + i; if (reiserfs_deh_bad (deh)) { bad ++; if (reiserfs_ih_get_entries (ih) == 1) { reiserfs_leaf_delete_item (fs, bh, item_num); fsck_log ("%s: block %lu, item %H: All entries were deleted from " "the directory\n", __FUNCTION__, bh->b_blocknr, &tmp); return -1; } else { reiserfs_leaf_delete_entry (fs, bh, item_num, i, 1); } i --; } } deh = reiserfs_deh (bh, ih); if (reiserfs_key_get_off (&ih->ih_key) != reiserfs_deh_get_off (deh)) { fsck_log ("verify_direntry: block %lu, item %H: Key's offset %k must " "match the directory's hash (%u) - changed.\n", bh->b_blocknr, ih, &ih->ih_key, reiserfs_deh_get_off (deh)); reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), &ih->ih_key, reiserfs_deh_get_off (deh)); reiserfs_buffer_mkdirty (bh); } if (bad > lost_found) fsck_log ("pass0: block %lu, item %H: %d entries were deleted\n", bh->b_blocknr, &tmp, bad - lost_found); return 0; } static __inline__ int does_it_fit_into_dev (__u64 offset, __u64 fs_size) { /* Count of unformatted pointers : offset / blocksize Count of blocks to store them : REISERFS_EXT_SIZE * offset / blocksize / REISERFS_ITEM_MAX Size to store it : blocksize * REISERFS_EXT_SIZE * offset / blocksize / REISERFS_ITEM_MAX */ return ( REISERFS_EXT_SIZE * offset / REISERFS_ITEM_MAX(fs->fs_blocksize) < fs_size) ? 1 : 0; } static int is_wrong_short_key (reiserfs_key_t * key) { if (reiserfs_key_get_did (key) == 0 || reiserfs_key_get_oid (key) == 0 || reiserfs_key_get_oid (key) == 1 || reiserfs_key_get_did (key) == ~(__u32)0 || reiserfs_key_get_oid (key) == ~(__u32)0 || reiserfs_key_get_did (key) == reiserfs_key_get_oid (key) || /* the alloc=packing_groups used to allow dirid = 1 (reiserfs_key_get_did (key) == 1 && reiserfs_key_get_oid (key) != 2) || */ (reiserfs_key_get_did (key) != 1 && reiserfs_key_get_oid (key) == 2) ) { return 1; } return 0; } /* do this on pass 0 with every leaf marked used */ /* FIXME: we can improve fixing of broken keys: we can ssfe direct items which go after stat data and have broken keys */ static void pass0_correct_leaf (reiserfs_filsys_t * fs, reiserfs_bh_t * bh) { int file_format = KEY_FORMAT_UNDEFINED; reiserfs_ih_t * ih; __u32 * ind_item; __u64 fs_size; __u64 offset; int symlnk = 0; int bad_order; unsigned long unfm_ptr; // unsigned int nr_items; int i, j, nr_items; int dirty = 0; fsck_leaf_check_header(fs, bh); /* Delete all safe links. */ for (i = reiserfs_nh_get_items (NODE_HEAD (bh)) - 1; i >= 0; i--) { if (reiserfs_key_get_did (&reiserfs_ih_at (bh, i)->ih_key) == ~(__u32)0) { reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; } if (reiserfs_key_get_did (&reiserfs_ih_at (bh, i)->ih_key) == REISERFS_BAD_DID && reiserfs_key_get_oid (&reiserfs_ih_at (bh, i)->ih_key) == REISERFS_BAD_OID) { reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; } } fs_size = (__u64)fs->fs_blocksize * reiserfs_sb_get_blocks (fs->fs_ondisk_sb); start_again: ih = reiserfs_ih_at (bh, 0); bad_order = 0; nr_items = reiserfs_nh_get_items (NODE_HEAD (bh)); for (i = 0; i < nr_items; i ++, ih ++) { if (reiserfs_ih_ext(ih) && (reiserfs_ih_get_len (ih) % 4 != 0)) { reiserfs_key_set_type(reiserfs_ih_get_format(ih), &ih->ih_key, TYPE_UNKNOWN); dirty = 1; } if (reiserfs_key_unkn (&ih->ih_key)) { if ((reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE) || (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE_V1)) { reiserfs_key_set_sec (KEY_FORMAT_1, &ih->ih_key, OFFSET_SD, TYPE_STAT_DATA); dirty = 1; fsck_log("pass0: vpf-10100: block %lu, item (%d): Unknown item " "type of StatData size, type set to StatData %k\n", bh->b_blocknr, i, &ih->ih_key); } else { fsck_log("pass0: vpf-10110: block %lu, item (%d): Unknown item " "type found %k - deleted\n", bh->b_blocknr, i, &ih->ih_key); reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; goto start_again; } } if (is_wrong_short_key (&ih->ih_key)) { /* sometimes stat datas get k_objectid==0 or k_dir_id==0 */ /* if (i == (nr_items - 1)) { if (i == 0) { fsck_log ("block %lu: item %d: (%H) id equals 0\n", bh->b_blocknr, i, ih); return; } // delete last item fsck_log ("block %lu: item %d: (%H) id equals 0\n", bh->b_blocknr, i, ih); reiserfs_leaf_delete_item (fs, bh, i - 1); pass_0_stat(fs)->removed++; return; } */ /* FIXME: 18842 19034 0x1 EXT (2) 19035 19035 0x0 SD (0) 18842 1 0x1 EXT (1) 18842 1 0x1001 DRCT (2) */ /* there is next item: if it is not stat data - take its k_dir_id and k_objectid. if key order will be still wrong - the changed item will be deleted */ if (i && !reiserfs_ih_stat (ih)) { /* previous item has a wrong short_key */ fsck_log ("pass0: vpf-10120: block %lu: item %d: Wrong key %k, " "corrected to ", bh->b_blocknr, i, &ih->ih_key); reiserfs_key_set_did (&ih->ih_key, reiserfs_key_get_did (&(ih - 1)->ih_key)); reiserfs_key_set_oid (&ih->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key)); fsck_log ("%k\n", &ih->ih_key); dirty = 1; } else if ((i < nr_items - 1) && !reiserfs_ih_stat (ih + 1)) { if (!is_wrong_short_key(&(ih + 1)->ih_key)) { fsck_log ("pass0: vpf-10130: block %lu: item %d: Wrong " "key %k, corrected to ", bh->b_blocknr, i, &ih->ih_key); reiserfs_key_set_did (&ih->ih_key, reiserfs_key_get_did (&(ih + 1)->ih_key)); reiserfs_key_set_oid (&ih->ih_key, reiserfs_key_get_oid (&(ih + 1)->ih_key)); /* reiserfs_key_set_off (KEY_FORMAT_1, &ih->ih_key, 0); reiserfs_key_set_type (KEY_FORMAT_1, &ih->ih_key, TYPE_STAT_DATA);*/ fsck_log ("%k\n", &ih->ih_key); dirty = 1; goto start_again; } else { fsck_log ("pass0: vpf-10140: block %lu: items %d and %d " "have bad short keys %k, %k, both deleted\n", bh->b_blocknr, i, i+1, &ih->ih_key, &(ih + 1)->ih_key); reiserfs_leaf_delete_item (fs, bh, i); reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed += 2; goto start_again; } } else { fsck_log ("pass0: vpf-10150: block %lu: item %d: Wrong key " "%k, deleted\n", bh->b_blocknr, i, &ih->ih_key); reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; goto start_again; } } #if 0 if (i && i + 1 < nr_items) { if (reiserfs_ih_stat (ih - 1) && !reiserfs_ih_stat (ih) && !reiserfs_ih_direct (ih + 1) && !reiserfs_ih_stat (ih + 1)) { /* i or i+1 item should be SD or i+1 should be direct item */ if ((reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE) || (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE_V1)) { /* make i as SD */ fsck_log("pass0: vpf-10400: block %lu, item %d: Wrong " "order of items - change the type of the key %k " "to StatData\n", bh->b_blocknr, i, &ih->ih_key); reiserfs_key_set_sec (KEY_FORMAT_1, &ih->ih_key, OFFSET_SD, TYPE_STAT_DATA); dirty = 1; } else if ((reiserfs_ih_get_len (ih+1) == REISERFS_SD_SIZE) || (reiserfs_ih_get_len (ih+1) == REISERFS_SD_SIZE_V1)) { /* make i+1 as SD */ fsck_log("pass0: vpf-10410: block %lu, item %d: Wrong " "order of items - change the type of the key %k " "to StatData\n", bh->b_blocknr, i + 1, &(ih + 1)->ih_key); reiserfs_key_set_sec (KEY_FORMAT_1, &(ih + 1)->ih_key, OFFSET_SD, TYPE_STAT_DATA); dirty = 1; } else if (reiserfs_ih_ext(ih)) { fsck_log("pass0: vpf-10420: block %lu, item %d: Wrong " "order of items - change the type of the key %k " "to Direct\n", bh->b_blocknr, i+1, &(ih + 1)->ih_key); reiserfs_key_set_type (reiserfs_ih_get_format(ih+1), &(ih + 1)->ih_key, TYPE_DIRECT); dirty = 1; } } } #endif if (i && ((reiserfs_ih_stat (ih - 1) && !reiserfs_ih_stat (ih) && (reiserfs_key_get_did (&(ih - 1)->ih_key) != reiserfs_key_get_did (&ih->ih_key))) || (reiserfs_ih_stat (ih) && (reiserfs_key_get_did (&(ih - 1)->ih_key) > reiserfs_key_get_did (&ih->ih_key))))) { /* not the same dir_id of the same file or not increasing dir_id of different files */ if ((i > 1) && reiserfs_key_get_did (&(ih - 2)->ih_key) == reiserfs_key_get_did (&(ih - 1)->ih_key)) { /* fix i-th */ if (!reiserfs_ih_stat (ih)) { fsck_log("pass0: vpf-10430: block %lu, item %d: Wrong " "order of items - change the dir_id of the key " "%k to %lu\n", bh->b_blocknr, i, &ih->ih_key, reiserfs_key_get_did (&(ih - 1)->ih_key)); reiserfs_key_set_did (&ih->ih_key, reiserfs_key_get_did (&(ih - 1)->ih_key)); dirty = 1; } else if (i + 1 < nr_items) { fsck_log("pass0: vpf-10440: block %lu, item %d: Wrong " "order of items - change the dir_id of the key " "%k to %lu\n", bh->b_blocknr, i, &ih->ih_key, reiserfs_key_get_did (&(ih + 1)->ih_key)); reiserfs_key_set_did (&ih->ih_key, reiserfs_key_get_did (&(ih + 1)->ih_key)); dirty = 1; } } else if ((i + 1 < nr_items) && reiserfs_key_get_did (&ih->ih_key) == reiserfs_key_get_did (&(ih + 1)->ih_key)) { fsck_log("pass0: vpf-10450: block %lu, item %d: Wrong order of " "items - change the dir_id of the key %k to %lu\n", bh->b_blocknr, i - 1, &(ih - 1)->ih_key, reiserfs_key_get_did (&ih->ih_key)); /* fix (i - 1)-th */ reiserfs_key_set_did (&(ih - 1)->ih_key, reiserfs_key_get_did (&ih->ih_key)); dirty = 1; } } if (i && i + 1 < nr_items) { /* there is a previous and a next items */ if ((reiserfs_key_get_did (&(ih - 1)->ih_key) == reiserfs_key_get_did (&(ih + 1)->ih_key)) && (reiserfs_key_get_did (&(ih - 1)->ih_key) != reiserfs_key_get_did (&ih->ih_key))) { fsck_log("pass0: vpf-10460: block %lu, item %d: Wrong order of " "items - change the dir_id of the key %k to %lu\n", bh->b_blocknr, i, &ih->ih_key, reiserfs_key_get_did (&(ih - 1)->ih_key)); reiserfs_key_set_did (&ih->ih_key, reiserfs_key_get_did (&(ih - 1)->ih_key)); dirty = 1; } if ((reiserfs_key_get_oid (&(ih - 1)->ih_key) == reiserfs_key_get_oid (&(ih + 1)->ih_key)) && (reiserfs_key_get_oid (&(ih - 1)->ih_key) != reiserfs_key_get_oid (&ih->ih_key))) { fsck_log("pass0: vpf-10470: block %lu, item %d: Wrong " "order of items - change the object_id of the " "key %k to %lu\n", bh->b_blocknr, i, &ih->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key)); reiserfs_key_set_oid (&ih->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key)); dirty = 1; } if (reiserfs_ih_stat (ih - 1) && (reiserfs_ih_ext (ih) && reiserfs_ih_direct (ih + 1))) { if ((reiserfs_key_get_oid (&(ih - 1)->ih_key) == reiserfs_key_get_oid (&ih->ih_key)) && (reiserfs_key_get_oid (&(ih - 1)->ih_key) != reiserfs_key_get_oid (&(ih + 1)->ih_key))) { fsck_log("pass0: vpf-10480: block %lu, item %d: Wrong " "order of items - change the object_id of the " "key %k to %lu\n", bh->b_blocknr, i + 1, &(ih+1)->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key)); reiserfs_key_set_oid (&(ih + 1)->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key)); dirty = 1; } if ((reiserfs_key_get_oid (&ih->ih_key) == reiserfs_key_get_oid (&(ih + 1)->ih_key)) && (reiserfs_key_get_oid (&(ih - 1)->ih_key) != reiserfs_key_get_oid (&(ih + 1)->ih_key))) { fsck_log("pass0: vpf-10490: block %lu, item %d: Wrong " "order of items - change the object_id of the " "key %k to %lu\n", bh->b_blocknr, i - 1, &(ih-1)->ih_key, reiserfs_key_get_oid (&(ih + 1)->ih_key)); reiserfs_key_set_oid (&(ih - 1)->ih_key, reiserfs_key_get_oid (&(ih + 1)->ih_key)); dirty = 1; } if ((reiserfs_key_get_did (&(ih - 1)->ih_key) == reiserfs_key_get_did (&ih->ih_key)) && (reiserfs_key_get_did (&(ih - 1)->ih_key) != reiserfs_key_get_did (&(ih + 1)->ih_key))) { fsck_log("pass0: vpf-10500: block %lu, item %d: Wrong " "order of items - change the dir_id of the key " "%k to %lu\n", bh->b_blocknr, i + 1, &(ih+1)->ih_key, reiserfs_key_get_did (&(ih - 1)->ih_key)); reiserfs_key_set_did (&(ih + 1)->ih_key, reiserfs_key_get_did (&(ih - 1)->ih_key)); dirty = 1; } if ((reiserfs_key_get_did (&ih->ih_key) == reiserfs_key_get_did (&(ih + 1)->ih_key)) && (reiserfs_key_get_did (&(ih - 1)->ih_key) != reiserfs_key_get_did (&(ih + 1)->ih_key))) { fsck_log("pass0: vpf-10510: block %lu, item %d: Wrong " "order of items - change the dir_id of the key %k " "to %lu\n", bh->b_blocknr, i - 1, &(ih-1)->ih_key, reiserfs_key_get_did (&(ih + 1)->ih_key)); reiserfs_key_set_did (&(ih - 1)->ih_key, reiserfs_key_get_did (&(ih + 1)->ih_key)); dirty = 1; } } } if (i && reiserfs_ih_stat (ih) && reiserfs_key_get_did (&(ih - 1)->ih_key) == reiserfs_key_get_did (&ih->ih_key) && reiserfs_key_get_oid (&(ih - 1)->ih_key) >= reiserfs_key_get_oid (&ih->ih_key)) { if ((i + 1 < nr_items) && !reiserfs_ih_stat (ih + 1)) { if (reiserfs_key_get_oid (&(ih - 1)->ih_key) < reiserfs_key_get_oid (&(ih + 1)->ih_key)) { fsck_log("pass0: vpf-10520: block %lu, item %d: Wrong " "order of items - change the object_id of the key " "%k to %lu\n", bh->b_blocknr, i - 1, &(ih-1)->ih_key, reiserfs_key_get_oid (&(ih + 1)->ih_key)); reiserfs_key_set_oid (&ih->ih_key, reiserfs_key_get_oid (&(ih + 1)->ih_key)); dirty = 1; } } } if (i && reiserfs_ih_stat (ih - 1) && !reiserfs_ih_stat (ih) && (reiserfs_key_get_oid (&(ih - 1)->ih_key) != reiserfs_key_get_oid (&ih->ih_key))) { int err = 0; if (i > 1) { if (reiserfs_key_comp2 (&(ih - 2)->ih_key, &(ih - 1)->ih_key) != -1) { misc_set_bit (1, &err); } if (reiserfs_key_comp2 (&(ih - 2)->ih_key, &ih->ih_key) != -1) { misc_set_bit (2, &err); } } if (i + 1 < nr_items) { if (reiserfs_key_comp2 (&(ih - 1)->ih_key, &(ih + 1)->ih_key) != -1) { misc_set_bit (3, &err); } if (reiserfs_key_comp2 (&ih->ih_key, &(ih + 1)->ih_key) != -1) { misc_set_bit (4, &err); } } /* if ((test_bit (1, err) || test_bit (3, err)) && (test_bit (2, err) || test_bit (4, err))) { // thera are no problem-free keys, delete them both reiserfs_leaf_delete_item (fs, bh, i - 1); reiserfs_leaf_delete_item (fs, bh, i - 1); pass_0_stat(fs)->removed += 2; goto start_again; } */ if (!misc_test_bit (1, &err) && !misc_test_bit (3, &err) && !misc_test_bit (2, &err) && !misc_test_bit (4, &err)) { if (i <= 1) { /* take bigger */ if (reiserfs_key_comp2 (&(ih - 1)->ih_key, &ih->ih_key) == 1) { fsck_log("pass0: vpf-10530: block %lu, item %d: Wrong " "order of items - change the object_id of the " "key %k to %lu\n", bh->b_blocknr, i, &ih->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key)); reiserfs_key_set_oid (&ih->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key)); } else { fsck_log("pass0: vpf-10540: block %lu, item %d: Wrong " "order of items - change the object_id of the " "key %k to %lu\n", bh->b_blocknr, i - 1, &(ih - 1)->ih_key, reiserfs_key_get_oid (&ih->ih_key)); reiserfs_key_set_oid (&(ih - 1)->ih_key, reiserfs_key_get_oid (&ih->ih_key)); } } else { /* take smaller */ if (reiserfs_key_comp2 (&(ih - 1)->ih_key, &ih->ih_key) == 1) { fsck_log("pass0: vpf-10550: block %lu, item %d: Wrong " "order of items - change the object_id of the " "key %k to %lu\n", bh->b_blocknr, i - 1, &(ih - 1)->ih_key, reiserfs_key_get_oid (&ih->ih_key)); reiserfs_key_set_oid (&(ih - 1)->ih_key, reiserfs_key_get_oid (&ih->ih_key)); } else { fsck_log("pass0: vpf-10560: block %lu, item %d: Wrong " "order of items - change the object_id of the " "key %k to %lu\n", bh->b_blocknr, i, &ih->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key)); reiserfs_key_set_oid (&ih->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key)); } } dirty = 1; } else if (!misc_test_bit (1, &err) && !misc_test_bit (3, &err)) { /* take i - 1 */ fsck_log("pass0: vpf-10590: block %lu, item %d: Wrong order " "of items - change the object_id of the key %k to " "%lu\n", bh->b_blocknr, i, &ih->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key)); reiserfs_key_set_oid (&ih->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key)); dirty = 1; } else if (!misc_test_bit (2, &err) && !misc_test_bit (4, &err)) { /* take i */ fsck_log("pass0: vpf-10600: block %lu, item %d: Wrong order " "of items - change the object_id of the key %k to " "%lu\n", bh->b_blocknr, i - 1, &(ih - 1)->ih_key, reiserfs_key_get_oid (&ih->ih_key)); reiserfs_key_set_oid (&(ih - 1)->ih_key, reiserfs_key_get_oid (&ih->ih_key)); dirty = 1; } } /* this recovers corruptions like the below: 1774 1732 0 0 116262638 1732 1 3 1774 1736 0 0 */ if (i && reiserfs_ih_stat (ih - 1) && !reiserfs_ih_stat (ih)) { if (reiserfs_key_get_oid (&ih->ih_key) != reiserfs_key_get_oid (&(ih - 1)->ih_key) || reiserfs_key_get_did (&ih->ih_key) != reiserfs_key_get_did (&(ih - 1)->ih_key)) { fsck_log ("pass0: vpf-10170: block %lu: item %d: Wrong " "order of items - the item \n\t%H fixed to ", bh->b_blocknr, i, ih); reiserfs_key_set_did (&ih->ih_key, reiserfs_key_get_did (&(ih - 1)->ih_key)); reiserfs_key_set_oid (&ih->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key)); dirty = 1; fsck_log ("\n\t%H\n", ih); } #if 0 if (!reiserfs_ih_dir (ih) && reiserfs_key_get_off (&ih->ih_key) != 1) { fsck_log ("pass0: vpf-10170: block %lu: item %d: Wrong " "offset of the item\n\t%H which follows a StatDtat " "item, fixed to 1", bh->b_blocknr, i, ih); if (reiserfs_ih_get_len (ih - 1) == REISERFS_SD_SIZE) { /* stat data is new, therefore this item is new too */ reiserfs_key_set_off (KEY_FORMAT_2, &(ih->ih_key), 1); if ((reiserfs_ih_get_entries (ih) != 0xffff) && (reiserfs_ih_get_len (ih) % 4 == 0)) { reiserfs_key_set_type (KEY_FORMAT_2, &(ih->ih_key), TYPE_EXTENT); } else { reiserfs_key_set_type (KEY_FORMAT_2, &(ih->ih_key), TYPE_DIRECT); } reiserfs_ih_set_format (ih, KEY_FORMAT_2); } else { /* stat data is old, therefore this item is old too */ reiserfs_key_set_off(KEY_FORMAT_1, &(ih->ih_key), 1); if ((reiserfs_ih_get_entries (ih) != 0xffff) && (reiserfs_ih_get_len (ih) % 4 == 0)) { reiserfs_key_set_type (KEY_FORMAT_1, &(ih->ih_key), TYPE_EXTENT); } else { reiserfs_key_set_type (KEY_FORMAT_1, &(ih->ih_key), TYPE_DIRECT); reiserfs_ih_set_free (ih, 0xffff); } reiserfs_ih_set_format (ih, KEY_FORMAT_1); } } #endif } /* FIXME: corruptions like: 56702 66802 1 2 56702 65536 0 0 56702 66803 1 2 do not get recovered (both last items will be deleted) */ /* delete item if it is not in correct order of object items */ if (i && reiserfs_key_comp2 (&ih->ih_key, &(ih - 1)->ih_key) && !reiserfs_ih_stat (ih)) { fsck_log ("pass0: vpf-10180: block %lu: item %d: The item %k, " "which follows non StatData item %k, is deleted\n", bh->b_blocknr, i, &ih->ih_key, &(ih - 1)->ih_key); reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; goto start_again; } if (reiserfs_ih_stat (ih)) { if (reiserfs_key_get_off (&ih->ih_key) != 0) { reiserfs_key_set_off(KEY_FORMAT_1, &ih->ih_key, 0); dirty = 1; } } else if (!reiserfs_ih_dir (ih)) { int format; format = reiserfs_key_format(&ih->ih_key); /* not SD, not direntry */ if (i && reiserfs_key_comp2 (&(ih - 1)->ih_key, &ih->ih_key) == 0) { if (reiserfs_ih_stat (ih - 1)) { if (reiserfs_key_get_off (&ih->ih_key) != 1) { reiserfs_key_set_off(format, &ih->ih_key, 1); dirty = 1; } } else if (!reiserfs_ih_dir (ih - 1)) { /* Both @(ih-1) and @ih are not SD not DIR items. */ if (reiserfs_key_get_off (&ih->ih_key) < reiserfs_key_get_off(&(ih - 1)->ih_key) + reiserfs_leaf_ibytes(ih - 1, fs->fs_blocksize)) { fsck_log("pass0: vpf-10250: block %lu, item %d: The " "item %k with wrong offset, fixed to %llu\n", bh->b_blocknr, i, &ih->ih_key, reiserfs_key_get_off(&(ih - 1)->ih_key) + reiserfs_ext_count (ih - 1) * fs->fs_blocksize); reiserfs_key_set_off( format, &ih->ih_key, reiserfs_key_get_off(&(ih - 1)->ih_key) + reiserfs_ext_count (ih - 1) * fs->fs_blocksize); dirty = 1; } } else { /* if extent item or not the first direct item in leaf */ fsck_log("pass0: vpf-10250: block %lu, item %d: The item " "%k with wrong type is deleted\n", bh->b_blocknr, i, &ih->ih_key); reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; goto start_again; } } else { /*first item in the node or first item of the file */ if (i) { /* first item of the file, but not SD - delete */ fsck_log("pass0: vpf-10190: block %lu, item %d: The item " "%k, which follows non StatData item %k, is " "deleted\n", bh->b_blocknr, i, &ih->ih_key, &(ih - 1)->ih_key ); reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; goto start_again; } } /* extent or direct is the first in the leaf */ offset = (__u64)reiserfs_key_get_off (&ih->ih_key); if (reiserfs_ih_ext (ih)) { if (offset % fs->fs_blocksize != 1) { fsck_log("pass0: vpf-10200: block %lu, item %d: The " "item %k with wrong offset is deleted\n", bh->b_blocknr, i, &ih->ih_key); reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; goto start_again; } } /* Check the lenght of the direct item; offset should be ok already. */ if (reiserfs_ih_direct (ih) && !correct_direct_item_offset(ih, fs)) { fsck_log("pass0: vpf-10700: block %lu, item %d: " "The item with wrong offset or length " "found %k, len % lu - deleted\n", bh->b_blocknr, i, &ih->ih_key, reiserfs_ih_get_len (ih)); reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; goto start_again; } offset += reiserfs_leaf_ibytes (ih, fs->fs_blocksize); if (!does_it_fit_into_dev (offset, fs_size) || (format == KEY_FORMAT_1 && offset >= (1ull << 32)) || (format == KEY_FORMAT_2 && offset >= (1ull << 60))) { fsck_log("pass0: vpf-10230: block %lu, item %d: The item " "offset is is too big %k - deleted\n", bh->b_blocknr, i, &ih->ih_key); reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; goto start_again; } } if (i && reiserfs_key_comp (&(ih - 1)->ih_key, &ih->ih_key) != -1) { /* previous item has key not smaller than the key of currect item */ if (reiserfs_ih_stat (ih - 1) && !reiserfs_ih_stat (ih)) { /* fix stat data key such as if it was stat data of that item */ fsck_log ("pass0: block %lu, items %d, %d: Wrong order of " "items - make the StatData item %k of the file %k\n", bh->b_blocknr, i - 1, i, &(ih - 1)->ih_key, &ih->ih_key); reiserfs_key_set_did (&(ih - 1)->ih_key, reiserfs_key_get_did (&ih->ih_key)); reiserfs_key_set_oid (&(ih - 1)->ih_key, reiserfs_key_get_oid (&ih->ih_key)); reiserfs_key_set_off (KEY_FORMAT_1, &(ih - 1)->ih_key, 0); reiserfs_key_set_type (KEY_FORMAT_1, &(ih - 1)->ih_key, TYPE_STAT_DATA); dirty = 1; } else { /* ok, we have to delete one of these two - decide which one */ int retval; /* something will be deleted */ dirty = 1; retval = upper_correct (bh, ih - 1, i - 1); switch (retval) { case 0: /* delete upper item */ fsck_log ("pass0: block %lu, item %d (upper): Item %k is " "out of order - deleted\n", bh->b_blocknr, i - 1, &(ih - 1)->ih_key); reiserfs_leaf_delete_item (fs, bh, i - 1); pass_0_stat(fs)->removed++; goto start_again; case 1: /* delete lower item */ fsck_log ("pass0: block %lu, item %d (lower): Item %k is " "out of order - deleted\n", bh->b_blocknr, i, &ih->ih_key); reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; goto start_again; default: /* upper item was the first item of a node */ /* to make gcc 3.2 do not sware here */; } retval = lower_correct (bh, ih, i); switch (retval) { case 0: /* delete lower item */ fsck_log ("pass0: block %lu, item %d (lower): Item %k is " "out of order - deleted\n", bh->b_blocknr, i, &ih->ih_key); reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; goto start_again; case 1: /* delete upper item */ fsck_log ("pass0: block %lu, %d (upper): Item %k is " "out of order - deleted\n", bh->b_blocknr, i - 1, &(ih - 1)->ih_key); reiserfs_leaf_delete_item (fs, bh, i - 1); pass_0_stat(fs)->removed++; goto start_again; default: /* only 2 items in the node, how to decide what to delete, go and ask user */ /* to make gcc 3.2 do not sware here */; } fsck_log ("pass0: block %lu, items %d and %d: Which of these " "items looks better (the other will be deleted.)?\n" "%k\n%k\n", bh->b_blocknr, i-1, i, &(ih - 1)->ih_key, &ih->ih_key); if (fsck_info_ask (fs, "1 or 2?", "1\n", 1)) { reiserfs_leaf_delete_item (fs, bh, i - 1); } else { reiserfs_leaf_delete_item (fs, bh, i); } pass_0_stat(fs)->removed++; goto start_again; } } if (reiserfs_ih_stat (ih) && (reiserfs_ih_get_len (ih) != REISERFS_SD_SIZE && reiserfs_ih_get_len (ih) != REISERFS_SD_SIZE_V1)) { fsck_log ("pass0: block %lu, item %d: StatData item of wrong " "length found %H - deleted\n", bh->b_blocknr, i, ih); reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; goto start_again; } dirty += correct_key_format (ih, symlnk); if (reiserfs_ih_stat (ih)) { __u16 mode; file_format = reiserfs_ih_get_format (ih); reiserfs_stat_get_mode (ih, reiserfs_item_at(bh,i), &mode); symlnk = ( S_ISLNK(mode) ? 1 : 0); ;/*correct_stat_data (fs, bh, i);*/ } else if ( !reiserfs_ih_dir(ih) && !symlnk && (file_format != KEY_FORMAT_UNDEFINED) && (file_format != reiserfs_ih_get_format (ih))) { fsck_log("pass0: vpf-10240: block %lu, item (%d): Item %k, which " "format (%d) is not equal to StatData format (%d), is " "deleted\n", bh->b_blocknr, i, &ih->ih_key, reiserfs_ih_get_format(ih), file_format); reiserfs_leaf_delete_item (fs, bh, i); pass_0_stat(fs)->removed++; goto start_again; } else { file_format = KEY_FORMAT_UNDEFINED; symlnk = 0; } if (i && reiserfs_ih_stat (ih - 1) && !reiserfs_key_comp2 (&ih->ih_key, &(ih - 1)->ih_key)) { __u16 mode; reiserfs_stat_get_mode (ih - 1, reiserfs_item_by_ih (bh, ih - 1), &mode); if (not_a_directory (reiserfs_item_by_ih (bh, ih - 1)) && reiserfs_ih_dir (ih)) { /* make SD mode SD of dir */ fsck_log ("pass0: block %lu, item %d: Not the directory %K has " "the wrong mode (%M), corrected to ", bh->b_blocknr, i, &ih->ih_key, mode); mode &= ~S_IFMT; mode |= S_IFDIR; fsck_log ("(%M)\n", mode); reiserfs_stat_set_mode (ih - 1, reiserfs_item_by_ih (bh, ih - 1), &mode); dirty = 1; } else if (!not_a_directory (reiserfs_item_by_ih (bh, ih - 1)) && !reiserfs_ih_dir (ih)) { /* make SD mode SD of regular file */ fsck_log ("pass0: block %lu, item %d: the directory %K " "has the wrong mode (%M), corrected to ", bh->b_blocknr, i, &ih->ih_key, mode); mode &= ~S_IFMT; mode |= S_IFREG; fsck_log ("(%M)\n", mode); reiserfs_stat_set_mode (ih - 1, reiserfs_item_by_ih (bh, ih - 1), &mode); dirty = 1; } #if 0 if (not_a_regfile (reiserfs_item_by_ih (bh, ih - 1)) && reiserfs_ih_ext (ih)) { fsck_log ("pass0: block %lu, item %d: The file %K has the " "wrong mode (%M), corrected to ", bh->b_blocknr, i, &ih->ih_key, mode); mode &= ~S_IFMT; mode |= S_IFREG; fsck_log ("(%M)\n", mode); reiserfs_stat_set_mode (ih - 1, reiserfs_item_by_ih (bh, ih - 1), &mode); dirty = 1; } #endif } if (reiserfs_ih_dir (ih)) { j = verify_directory_item (fs, bh, i); if (j == 1) { /* wrong hash, skip the leaf */ pass_0_stat (fs)->too_old_leaves ++; reiserfs_buffer_mkclean (bh); return; } else if (j == -1) { /* item was deleted */ goto start_again; } continue; } /*DEBUG*/ if (!reiserfs_ih_stat (ih) && reiserfs_key_get_off (&ih->ih_key) == 0) { reiserfs_panic ("block %lu, item %d: Zero offset can have " "StatData items only, but found %k\n", bh->b_blocknr, i, &ih->ih_key); } if (!reiserfs_ih_ext (ih)) continue; ind_item = (__u32 *)reiserfs_item_by_ih (bh, ih); for (j = 0; j < (int)reiserfs_ext_count (ih); j ++) { unfm_ptr = d32_get (ind_item, j); if (!unfm_ptr) continue; if ((reiserfs_fs_block(fs, unfm_ptr) != BT_UNKNOWN) || (fs->fs_badblocks_bm && reiserfs_bitmap_test_bit(fs->fs_badblocks_bm, unfm_ptr))) { pass_0_stat (fs)->wrong_pointers ++; /* fsck_log ("pass0: %d-th pointer (%lu) in item %k (leaf " "block %lu) is wrong\n", j, unfm_ptr, &ih->ih_key, bh->b_blocknr); */ d32_put(ind_item, j, 0); dirty = 1; continue; } /* mark block in bitmaps of unformatted nodes */ register_unfm (unfm_ptr); } } /* mark all objectids in use */ ih = reiserfs_ih_at (bh, 0); for (i = 0; i < reiserfs_nh_get_items (NODE_HEAD (bh)); i ++, ih ++) { reiserfs_deh_t * deh; id_map_mark(proper_id_map (fs), reiserfs_key_get_did (&ih->ih_key)); id_map_mark(proper_id_map (fs), reiserfs_key_get_oid (&ih->ih_key)); if (reiserfs_ih_dir(ih)) { for (j = 0, deh = reiserfs_deh (bh, ih); j < reiserfs_ih_get_entries (ih); j ++, deh++) { id_map_mark(proper_id_map(fs), reiserfs_deh_get_obid(deh)); } } } if (reiserfs_nh_get_items (NODE_HEAD (bh)) < 1) { /* pass 1 will skip this */ pass_0_stat (fs)->all_contents_removed ++; fsck_log ("pass0: block %lu: no correct item is found. " "Leave block untouched.\n", bh->b_blocknr); dirty = 0; reiserfs_buffer_mkclean (bh); } else { /* pass1 will use this bitmap */ pass0_block_mkleaf (bh->b_blocknr); /*fsck_data (fs)->rebuild.leaves ++;*/ } if (dirty) { pass_0_stat (fs)->leaves_corrected ++; reiserfs_buffer_mkdirty (bh); } } static int is_to_be_read (reiserfs_filsys_t * fs, unsigned long block) { return reiserfs_bitmap_test_bit (fsck_source_bitmap (fs), block); } static void do_pass_0 (reiserfs_filsys_t * fs) { reiserfs_bh_t * bh; unsigned long i; int what_node; unsigned long done = 0, total; if (fsck_mode (fs) == DO_TEST) { /* just to test pass0_correct_leaf */ bh = reiserfs_buffer_read (fs->fs_dev, fsck_data (fs)->rebuild.test, fs->fs_blocksize); if (!bh) { fsck_progress ("%s: Reading of the block %lu failed\n", __FUNCTION__, fsck_data (fs)->rebuild.test); reiserfs_fs_free (fs); exit(0); } if (fsck_leaf_check(bh)) fsck_progress ("############### bad #################\n"); pass0_correct_leaf (fs, bh); reiserfs_node_print (stdout, fs, bh, 3, -1, -1); if (fsck_leaf_check(bh)) fsck_progress ("############### still bad #################\n"); reiserfs_buffer_close (bh); reiserfs_fs_free (fs); exit(0); } total = reiserfs_bitmap_ones (fsck_source_bitmap (fs)); for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) { if (!is_to_be_read (fs, i)) continue; if (!fsck_quiet(fs)) { util_misc_progress (fsck_progress_file (fs), &done, total, 1, 0); } if (!(bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize))) { fsck_progress ("%s: Reading of the block %lu failed\n", __FUNCTION__, i); continue; } if (fs->fs_badblocks_bm && reiserfs_bitmap_test_bit(fs->fs_badblocks_bm, i)) { reiserfs_panic ("The block (%lu), specified in badblock " "list, was read.", i); } if (reiserfs_fs_block(fs, i) != BT_UNKNOWN) { /* block which could not be pointed by extent item */ if (!(reiserfs_journal_block (fs, i) && fsck_data(fs)->rebuild.use_journal_area)) { reiserfs_panic ("The block (%lu) from non " "data area was read.", i); } } pass_0_stat (fs)->dealt_with ++; what_node = reiserfs_node_type (bh); if ( what_node != NT_LEAF && what_node != NT_IH_ARRAY ) { reiserfs_buffer_close (bh); continue; } pass_0_stat (fs)->leaves ++; pass0_correct_leaf (fs, bh); reiserfs_buffer_close (bh); } if (!fsck_quiet(fs)) fsck_progress ("\n"); /* just in case */ id_map_mark(proper_id_map (fs), REISERFS_ROOT_OBJECTID); } static void choose_hash_function (reiserfs_filsys_t * fs) { unsigned long max; unsigned int hash_code; int i; if (fsck_hash_defined (fs)) return; max = 0; hash_code = reiserfs_hash_code (0); for (i = 0; i < fsck_data (fs)->rebuild.hash_amount; i ++) { /* remember hash whihc got more hits */ if (fsck_data (fs)->rebuild.hash_hits [i] > max) { hash_code = i; max = fsck_data (fs)->rebuild.hash_hits [i]; } if (fsck_data (fs)->rebuild.hash_hits [i]) { fsck_log ("%lu directory entries were hashed with %s hash.\n", fsck_data (fs)->rebuild.hash_hits [i], reiserfs_hash_name(i)); } } if (max == 0 || hash_code == 0) { /* no names were found. take either super block value or default */ hash_code = reiserfs_sb_get_hash (fs->fs_ondisk_sb); if (!hash_code) hash_code = DEFAULT_HASH; fsck_log ("Could not find a hash in use. Using %s\n", reiserfs_hash_name (hash_code)); } /* compare the most appropriate hash with the hash set in super block */ if (hash_code != reiserfs_sb_get_hash (fs->fs_ondisk_sb)) { fsck_progress ("Selected hash (%s) does not match to " "the hash set in the super block (%s).\n", reiserfs_hash_name (hash_code), reiserfs_hash_name ( reiserfs_sb_get_hash (fs->fs_ondisk_sb))); reiserfs_sb_set_hash (fs->fs_ondisk_sb, hash_code); } fs->hash = reiserfs_hash_func (hash_code); } /* create bitmap of blocks the tree is to be built off */ /* debugreiserfs and pass0 should share this code -s should show the same as we could recover - test: zero first 32M */ static void init_source_bitmap (reiserfs_filsys_t * fs) { unsigned long count, block, bmap_nr, bits_amount; unsigned long i, j, tmp, reserved; FILE * fp; count = reiserfs_sb_get_blocks (fs->fs_ondisk_sb); switch (fsck_data (fs)->rebuild.scan_area) { case ALL_BLOCKS: fsck_source_bitmap (fs) = reiserfs_bitmap_create (count); reiserfs_bitmap_fill (fsck_source_bitmap (fs)); fsck_progress ("The whole partition (%d blocks) is to be scanned\n", reiserfs_bitmap_ones (fsck_source_bitmap (fs))); break; case USED_BLOCKS: fsck_progress ("Loading on-disk bitmap .. "); fsck_source_bitmap (fs) = reiserfs_bitmap_create (count); reiserfs_bitmap_copy (fsck_source_bitmap (fs), fs->fs_bitmap2); fsck_progress ("ok, %d blocks marked used\n", reiserfs_bitmap_ones (fsck_source_bitmap (fs))); break; case EXTERN_BITMAP: fp = fopen (fsck_data (fs)->rebuild.bitmap_file_name, "r"); if (!fp) { reiserfs_exit (EXIT_OPER, "Could not load bitmap: %s\n", strerror(errno)); } fsck_source_bitmap (fs) = reiserfs_bitmap_load (fp); if (!fsck_source_bitmap (fs)) { reiserfs_exit (EXIT_OPER, "Could not load fitmap from \"%s\"", fsck_data (fs)->rebuild.bitmap_file_name); } fsck_progress ("%d blocks marked used in extern bitmap\n", reiserfs_bitmap_ones (fsck_source_bitmap (fs))); fclose (fp); break; default: reiserfs_panic ("No area to scan specified"); } tmp = 0; /* unmark bitmaps */ block = fs->fs_super_bh->b_blocknr + 1; reserved = fsck_source_bitmap(fs)->bm_bit_size; bmap_nr = reiserfs_bmap_nr(count, fs->fs_blocksize); for (i = 0; i < bmap_nr; i ++) { if (!reiserfs_bitmap_test_bit (fsck_source_bitmap (fs), block)) { /* bitmap is definitely broken, mark all blocks of this bitmap block as used */ bits_amount = (reserved < fs->fs_blocksize * 8) ? reserved : fs->fs_blocksize * 8; fsck_log("%s: Bitmap %lu (of %lu bits) is wrong - " "mark all blocks [%lu - %lu] as used\n", __FUNCTION__, i, bits_amount, i * fs->fs_blocksize * 8, fs->fs_blocksize * 8 * i + bits_amount); for (j = i * fs->fs_blocksize * 8; j < i * fs->fs_blocksize * 8 + bits_amount; j++) { if (!reiserfs_bitmap_test_bit (fsck_source_bitmap(fs), j)) reiserfs_bitmap_set_bit (fsck_source_bitmap(fs), j); } } reiserfs_bitmap_clear_bit (fsck_source_bitmap (fs), block); reserved -= fs->fs_blocksize * 8; tmp ++; /* next block fo bitmap */ if (reiserfs_bitmap_spread (fs)) { block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8); } else { block ++; } } /* pass 0 will skip super block and journal areas and bitmap blocks, find how many blocks have to be read */ for (i = 0; i <= fs->fs_super_bh->b_blocknr; i ++) { if (!reiserfs_bitmap_test_bit (fsck_source_bitmap (fs), i)) continue; reiserfs_bitmap_clear_bit (fsck_source_bitmap (fs), i); tmp ++; } /* unmark journal area as used if journal is standard or it is non standard and initialy has been created on a main device */ reserved = reiserfs_journal_hostsize (fs->fs_ondisk_sb); /* where does journal area (or reserved journal area) start from */ if (!reiserfs_new_location (fs->fs_super_bh->b_blocknr, fs->fs_blocksize) && !reiserfs_old_location (fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) { misc_die ("init_source_bitmap: Wrong super block location, " "you must run --rebuild-sb."); } block = reiserfs_journal_start_must (fs); for (i = block; i < reserved + block; i ++) { if (!reiserfs_bitmap_test_bit (fsck_source_bitmap (fs), i)) continue; reiserfs_bitmap_clear_bit (fsck_source_bitmap (fs), i); tmp ++; } if (fs->fs_badblocks_bm) for (i = 0; i < count; i ++) { if (reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i)) reiserfs_bitmap_clear_bit (fsck_source_bitmap (fs), i); } fsck_source_bitmap (fs)->bm_set_bits = reiserfs_bitmap_ones (fsck_source_bitmap (fs)); fsck_progress ("Skipping %d blocks (super block, journal, " "bitmaps) %d blocks will be read\n", tmp, fsck_source_bitmap (fs)->bm_set_bits); } static void fsck_pass0_prep (reiserfs_filsys_t * fs) { /* bitmap of blocks to be read */ init_source_bitmap (fs); /* bitmap of leaves, good and bad unformatted */ fsck_pass0_aux_prep (fs); /* on pass0 all objectids will be marked here as used */ proper_id_map (fs) = id_map_init(); /* pass0 gathers statistics about hash hits */ hash_hits_init (fs); } static void fsck_pass0_save_result (reiserfs_filsys_t * fs) { FILE * file; int retval; /* save bitmaps with which we will be able start reiserfs from pass 1 */ file = util_file_open ("temp_fsck_file.deleteme", "w+"); if (!file) return; fsck_stage_start_put (file, PASS_0_DONE); reiserfs_bitmap_save (file, leaves_bitmap); reiserfs_bitmap_save (file, good_unfm_bitmap); reiserfs_bitmap_save (file, bad_unfm_bitmap); fsck_stage_end_put (file); fclose (file); retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs)); if (retval != 0) fsck_progress ("%s: Could not rename the temporary file " "temp_fsck_file.deleteme to %s", __FUNCTION__, state_dump_file (fs)); } /* file 'fp' must contain 3 bitmaps saved during last pass 0: bitmap of leaves, bitmaps of good and bad unfms*/ void fsck_pass0_load_result (FILE * fp, reiserfs_filsys_t * fs) { leaves_bitmap = reiserfs_bitmap_load (fp); good_unfm_bitmap = reiserfs_bitmap_load (fp); bad_unfm_bitmap = reiserfs_bitmap_load (fp); if (!leaves_bitmap || !good_unfm_bitmap || !bad_unfm_bitmap) fsck_exit ("State dump file seems corrupted. Run without -d"); fsck_source_bitmap (fs) = leaves_bitmap; /* on pass 1 we do not need proper objectid map */ fsck_progress ("Pass 0 result loaded. %d leaves, %d/%d good/bad data blocks\n", reiserfs_bitmap_ones (leaves_bitmap), reiserfs_bitmap_ones (good_unfm_bitmap), reiserfs_bitmap_ones (bad_unfm_bitmap)); } static void fsck_pass0_fini (reiserfs_filsys_t * fs) { time_t t; /* update super block: hash, objectid map, fsck state */ choose_hash_function (fs); id_map_flush(proper_id_map (fs), fs); reiserfs_sb_set_state (fs->fs_ondisk_sb, PASS_0_DONE); reiserfs_buffer_mkdirty (fs->fs_super_bh); /* write all dirty blocks */ fsck_progress ("Flushing.."); fs->fs_dirt = 1; reiserfs_fs_flush (fs); fsck_progress ("finished\n"); fsck_stage_report (FS_PASS0, fs); /* free what we do not need anymore */ if (!fsck_run_one_step (fs)) { if (fsck_info_ask (fs, "Continue? (Yes):", "Yes\n", 1)) { /* reiserfsck continues */ reiserfs_bitmap_delete (fsck_source_bitmap (fs)); fsck_source_bitmap (fs) = 0; fsck_source_bitmap (fs) = leaves_bitmap; return; } } else fsck_pass0_save_result (fs); reiserfs_bitmap_flush (fsck_source_bitmap (fs), fs); reiserfs_bitmap_delete (fsck_source_bitmap (fs)); fsck_source_bitmap (fs) = 0; id_map_free(proper_id_map (fs)); proper_id_map (fs) = 0; time (&t); fsck_progress ("###########\n" "reiserfsck finished pass 0 at %s" "###########\n", ctime (&t)); fs->fs_dirt = 1; reiserfs_fs_close (fs); exit(0); } void fsck_pass0 (reiserfs_filsys_t * fs) { if (reiserfs_super_format (fs->fs_ondisk_sb) != fs->fs_format || reiserfs_super_format (fs->fs_ondisk_sb) == REISERFS_FORMAT_UNKNOWN) { reiserfs_exit (EXIT_OPER, "pass 0: ReiserFS format version mismatch " "found, you should run --rebuild-sb"); } fsck_progress ("Pass 0:\n"); if (fsck_log_file (fs) != stderr) /* this is just to separate warnings in the log file */ fsck_log ("####### Pass 0 #######\n"); fsck_pass0_prep (fs); /* scan the partition, find leaves and correct them */ do_pass_0 (fs); fsck_pass0_fini (fs); } reiserfsprogs-3.6.20/utils/fsck/pass1.c0000644000175300001440000005767210412227267014724 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/unaligned.h" #include "misc/malloc.h" #include "util/device.h" #include "util/misc.h" #include reiserfs_bitmap_t * bad_unfm_in_tree_once_bitmap; #define is_bad_unfm_in_tree_once(block) \ reiserfs_bitmap_test_bit(bad_unfm_in_tree_once_bitmap, block) #define mark_bad_unfm_in_tree_once(block) \ reiserfs_bitmap_set_bit(bad_unfm_in_tree_once_bitmap, block) static void stat_data_in_tree (reiserfs_bh_t *bh, reiserfs_ih_t * ih) { #if 0 __u32 objectid; objectid = reiserfs_key_get_oid (&ih->ih_key); if (mark_objectid_really_used (proper_id_map (fs), objectid)) { stat_shared_objectid_found (fs); mark_objectid_really_used (shared_id_map (fs), objectid); } #endif zero_nlink (ih, reiserfs_item_by_ih (bh, ih)); } static char *still_bad_unfm_ptr_to_string (int val) { switch (val) { case 1: return "a leaf"; case 2: return "shared between a few files"; case 3: return "not a data block"; case 4: return "not used in on-disk bitmap"; case 5: return "out of partition boundary"; } return ""; } static int still_bad_unfm_ptr (unsigned long block) { if (!block) return 0; if (pass0_block_isleaf (block)) return 1; if (pass0_block_isbad_unfm (block) && !is_bad_unfm_in_tree_once (block)) { return 2; } if (reiserfs_fs_block(fs, block) != BT_UNKNOWN) return 3; /* if (!was_block_used (block)) return 4; */ if (block >= reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) return 5; return 0; } /* this just marks blocks pointed by an extent item as used in the new bitmap */ static void extent_in_tree (reiserfs_bh_t * bh, reiserfs_ih_t * ih) { unsigned int i; __u32 * unp; __u32 unfm_ptr; int ret; unp = (__u32 *)reiserfs_item_by_ih (bh, ih); for (i = 0; i < reiserfs_ext_count (ih); i ++) { unfm_ptr = d32_get (unp, i); if (unfm_ptr == 0) continue; if ((ret = still_bad_unfm_ptr (unfm_ptr))) reiserfs_panic ("%s: block %lu: The file %k points to the " "block (%u) which is %s", __FUNCTION__, bh->b_blocknr, &ih->ih_key, unfm_ptr, still_bad_unfm_ptr_to_string(ret)); mark_block_used (unfm_ptr, 1); } } static void cb_mkunreach(reiserfs_ih_t *ih) { fsck_item_mkunreach(ih); } static void leaf_is_in_tree_now (reiserfs_bh_t * bh) { item_func_t actions[] = {stat_data_in_tree, extent_in_tree, 0, 0}; mark_block_used ((bh)->b_blocknr, 1); reiserfs_leaf_traverse (bh, cb_mkunreach, actions); pass_1_stat (fs)->inserted_leaves ++; reiserfs_buffer_mkdirty (bh); } static void insert_pointer (reiserfs_bh_t * bh, reiserfs_path_t * path) { reiserfs_ih_t * ih; char * body; int retval; reiserfs_tb_t tb; reiserfs_tb_init (&tb, fs, path, 0x7fff); /* reiserfs_fix_nodes & reiserfs_tb_balance must work for internal nodes only */ ih = 0; retval = reiserfs_fix_nodes (M_INTERNAL, &tb, ih); if (retval != CARRY_ON) misc_die ("insert_pointer: reiserfs_fix_nodes failed with retval == %d", retval); /* child_pos: we insert after position child_pos: this feature of the insert_child; there is special case: we insert pointer after (-1)-st key (before 0-th key) in the parent */ if (REISERFS_PATH_LEAF_POS (path) == 0 && path->pos_in_item == 0) REISERFS_PATH_UPPARENT_POS (path, 0) = -1; else if (REISERFS_PATH_UPPARENT (path, 0) == 0) { REISERFS_PATH_UPPARENT_POS (path, 0) = 0; } ih = 0; body = (char *)bh; reiserfs_tb_balance (&tb, ih, body, M_INTERNAL, 0); leaf_is_in_tree_now (bh); } /* return 1 if new can be joined with last node on the path or with its right neighbor, 0 otherwise */ static int balance_condition_2_fails (reiserfs_bh_t * new, reiserfs_path_t * path) { const reiserfs_key_t *right_dkey; int pos, used_space; reiserfs_bh_t *bh; reiserfs_ih_t *ih; bh = REISERFS_PATH_LEAF (path); if (reiserfs_tree_node_mergeable (bh, new)) /* new node can be joined with last buffer on the path */ return 1; /* new node can not be joined with its left neighbor */ right_dkey = reiserfs_tree_rkey (path, fs); if (!reiserfs_key_comp (right_dkey, &MAX_KEY)) /* there is no right neighbor */ return 0; pos = REISERFS_PATH_UPPOS (path, 1); if (pos == reiserfs_node_items (bh = REISERFS_PATH_UPBUFFER (path, 1))) { /* we have to read parent of right neighbor. For simplicity we call search_item, which will read right neighbor as well */ REISERFS_PATH_INIT(path_to_right_neighbor); if (reiserfs_tree_search_item (fs, right_dkey, &path_to_right_neighbor) != ITEM_FOUND) { reiserfs_panic("%s: block %lu, pointer %d: The left delimiting " "key %k of the block (%lu) is wrong, the item " "cannot be found", __FUNCTION__, REISERFS_PATH_UPBUFFER(path, 1)->b_blocknr, pos, right_dkey, reiserfs_dc_get_nr(reiserfs_int_at (bh, pos + 1))); } used_space = reiserfs_node_used (REISERFS_PATH_LEAF(&path_to_right_neighbor)); reiserfs_tree_pathrelse (&path_to_right_neighbor); } else { used_space = reiserfs_dc_get_size (reiserfs_int_at (bh, pos + 1)); } ih = reiserfs_ih_at (new, reiserfs_node_items (new) - 1); if (reiserfs_node_free (new) >= used_space - (reiserfs_leaf_mergeable (ih, (reiserfs_ih_t *)right_dkey, new->b_size) ? REISERFS_IH_SIZE : 0)) { return 1; } return 0; } static void get_max_buffer_key (reiserfs_bh_t * bh, reiserfs_key_t * key) { reiserfs_ih_t * ih; ih = reiserfs_ih_at (bh, reiserfs_node_items (bh) - 1); reiserfs_key_copy (key, &(ih->ih_key)); if (reiserfs_key_dir (key)) { /* copy deh_offset 3-rd and 4-th key components of the last entry */ reiserfs_key_set_off (KEY_FORMAT_1, key, reiserfs_deh_get_off (reiserfs_deh (bh, ih) + reiserfs_ih_get_entries (ih) - 1)); } else if (!reiserfs_key_stat (key)) /* get key of the last byte, which is contained in the item */ reiserfs_key_set_off (reiserfs_key_format (key), key, reiserfs_key_get_off (key) + reiserfs_leaf_ibytes (ih, bh->b_size) - 1); } static int tree_is_empty (void) { return (reiserfs_sb_get_root (fs->fs_ondisk_sb) == ~(__u32)0 || reiserfs_sb_get_root (fs->fs_ondisk_sb) == 0) ? 1 : 0; } static void make_single_leaf_tree (reiserfs_bh_t * bh) { /* tree is empty, make tree root */ reiserfs_sb_set_root (fs->fs_ondisk_sb, bh->b_blocknr); reiserfs_sb_set_height (fs->fs_ondisk_sb, 2); reiserfs_buffer_mkdirty (fs->fs_super_bh); leaf_is_in_tree_now (bh); } /* inserts pointer to leaf into tree if possible. If not, marks node as uninsertable in special bitmap */ static int try_to_insert_pointer_to_leaf (reiserfs_bh_t * new_bh) { /* first and last keys of new buffer */ reiserfs_key_t * first_bh_key, last_bh_key; reiserfs_key_t last_path_buffer_last_key; const reiserfs_key_t *dkey; REISERFS_PATH_INIT (path); reiserfs_bh_t * bh; /* last path buffer */ int ret_value; if (tree_is_empty () == 1) { make_single_leaf_tree (new_bh); return 0; } first_bh_key = reiserfs_ih_key_at (new_bh, 0); /* try to find place in the tree for the first key of the coming node */ ret_value = reiserfs_tree_search_item (fs, first_bh_key, &path); if (ret_value == ITEM_FOUND) goto cannot_insert; /* get max key in the new node */ get_max_buffer_key (new_bh, &last_bh_key); bh = REISERFS_PATH_LEAF (&path); if (reiserfs_key_comp (reiserfs_ih_key_at (bh, 0), &last_bh_key) == 1/* first is greater*/) { /* new buffer falls before the leftmost leaf */ if (reiserfs_tree_node_mergeable (new_bh, bh)) goto cannot_insert; dkey = reiserfs_tree_lkey (&path, fs); if ((dkey && reiserfs_key_comp (dkey, &MIN_KEY) != 0) || REISERFS_PATH_LEAF_POS (&path) != 0) { misc_die ("try_to_insert_pointer_to_leaf: bad search result"); } path.pos_in_item = 0; goto insert; } /* get max key of buffer, that is in tree */ get_max_buffer_key (bh, &last_path_buffer_last_key); if (reiserfs_key_comp (&last_path_buffer_last_key, first_bh_key) != -1/* second is greater */) { /* first key of new buffer falls in the middle of node that is in tree */ goto cannot_insert; } dkey = reiserfs_tree_rkey (&path, fs); if (dkey && reiserfs_key_comp (dkey, &last_bh_key) != 1 /* first is greater */) { goto cannot_insert; } if (balance_condition_2_fails (new_bh, &path)) goto cannot_insert; insert: insert_pointer (new_bh, &path); reiserfs_tree_pathrelse (&path); return 0; cannot_insert: reiserfs_tree_pathrelse (&path); return 1; } /* everything should be correct already in the leaf but contents of extent items. So we only 1. zero slots pointing to a leaf 2. zero pointers to blocks which are pointed already 3. what we should do with directory entries hashed by another hash? they are deleted for now */ static void pass1_correct_leaf (reiserfs_filsys_t * fs, reiserfs_bh_t * bh) { unsigned int i, j; reiserfs_ih_t * ih; __u32 * ind_item; __u32 unfm_ptr; int dirty = 0; ih = reiserfs_ih_at (bh, 0); for (i = 0; i < reiserfs_node_items (bh); i ++, ih ++) { if (reiserfs_ih_dir (ih)) { reiserfs_deh_t * deh; __u32 offset; char * name; int name_len; unsigned int hash_code; deh = reiserfs_deh (bh, ih); offset = 0; for (j = 0; j < reiserfs_ih_get_entries (ih); j ++) { name = reiserfs_deh_name (deh + j, j); name_len = reiserfs_direntry_name_len (ih, deh + j, j); if ((j == 0 && is_dot (name, name_len)) || (j == 1 && is_dot_dot (name, name_len))) { continue; } hash_code = reiserfs_hash_find ( name, name_len, reiserfs_deh_get_off (deh + j), reiserfs_sb_get_hash (fs->fs_ondisk_sb)); if (hash_code != reiserfs_sb_get_hash (fs->fs_ondisk_sb)) { fsck_log ("pass1: block %lu, item %d, entry %d: The " "entry \"%.*s\" of the %k is hashed with %s " "whereas proper hash is %s", bh->b_blocknr, i, j, name_len, name, &ih->ih_key, reiserfs_hash_name (hash_code), reiserfs_hash_name ( reiserfs_sb_get_hash (fs->fs_ondisk_sb))); if (reiserfs_ih_get_entries (ih) == 1) { reiserfs_leaf_delete_item (fs, bh, i); fsck_log(" - the only entry - item was deleted\n"); i --; ih --; break; } else { reiserfs_leaf_delete_entry (fs, bh, i, j, 1); fsck_log(" - deleted\n"); j --; deh = reiserfs_deh (bh, ih); continue; } } if (j && offset >= reiserfs_deh_get_off (deh + j)) { fsck_log ("pass1: block %lu, item %d, entry %d: The entry " "\"%.*s\" of the %k has hash offset %lu not " "larger smaller than the previous one %lu. The " "entry is deleted.\n", bh->b_blocknr, i, j, name_len, name, &ih->ih_key, reiserfs_deh_get_off(deh + j), offset); reiserfs_leaf_delete_entry (fs, bh, i, j, 1); j --; deh = reiserfs_deh (bh, ih); continue; } offset = reiserfs_deh_get_off (deh + j); } continue; } if (!reiserfs_ih_ext (ih)) continue; /* correct extent items */ ind_item = (__u32 *)reiserfs_item_by_ih (bh, ih); for (j = 0; j < reiserfs_ext_count (ih); j ++) { unfm_ptr = d32_get (ind_item, j); if (!unfm_ptr) continue; /* this corruption of extent item had to be fixed in pass0 */ if (reiserfs_fs_block(fs, unfm_ptr) != BT_UNKNOWN) /*!was_block_used (unfm_ptr))*/ reiserfs_panic ("%s: block %lu, item %d, pointer %d: The " "wrong pointer (%u) in the file %K. Must " "be fixed on pass0.", __FUNCTION__, bh->b_blocknr, i, j, unfm_ptr, &ih->ih_key); /* 1. zero slots pointing to a leaf */ if (pass0_block_isleaf (unfm_ptr)) { dirty ++; d32_put (ind_item, j, 0); pass_1_stat (fs)->pointed_leaves ++; continue; } /* 2. zero pointers to blocks which are pointed already */ if (pass0_block_isbad_unfm (unfm_ptr)) { /* this unformatted pointed more than once. Did we see it already? */ if (!is_bad_unfm_in_tree_once (unfm_ptr)) { /* keep first reference to it and mark about that in special bitmap */ mark_bad_unfm_in_tree_once (unfm_ptr); } else { /* Yes, we have seen this pointer already, zero other pointers to it. */ dirty ++; d32_put (ind_item, j, 0); pass_1_stat (fs)->non_unique_pointers ++; continue; } } else { pass_1_stat (fs)->correct_pointers ++; } } } if (dirty) reiserfs_buffer_mkdirty (bh); } /* fsck starts creating of this bitmap on pass 1. It will then become on-disk bitmap */ static void init_new_bitmap (reiserfs_filsys_t * fs) { unsigned int i; unsigned long block; unsigned long reserved; unsigned long count, bmap_nr; count = reiserfs_sb_get_blocks (fs->fs_ondisk_sb); fsck_new_bitmap (fs) = reiserfs_bitmap_create(count); /* mark_block_used skips 0, set the bit explicitly */ reiserfs_bitmap_set_bit (fsck_new_bitmap (fs), 0); /* mark other skipped blocks and super block used */ for (i = 1; i <= fs->fs_super_bh->b_blocknr; i ++) mark_block_used (i, 1); /* mark bitmap blocks as used */ block = fs->fs_super_bh->b_blocknr + 1; bmap_nr = reiserfs_bmap_nr(count, fs->fs_blocksize); for (i = 0; i < bmap_nr; i ++) { mark_block_used (block, 1); if (reiserfs_bitmap_spread (fs)) { block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8); } else { block ++; } } reserved = reiserfs_journal_hostsize (fs->fs_ondisk_sb); /* where does journal area (or reserved journal area) start from */ if (!reiserfs_new_location(fs->fs_super_bh->b_blocknr, fs->fs_blocksize) && !reiserfs_old_location(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) { misc_die ("init_new_bitmap: Wrong super block location, " "you must run --rebuild-sb."); } block = reiserfs_journal_start_must (fs); for (i = block; i < reserved + block; i ++) mark_block_used (i, 1); if (fs->fs_badblocks_bm) for (i = 0; i < count; i ++) { if (reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i)) { if (reiserfs_bitmap_test_bit (fsck_new_bitmap (fs), i)) reiserfs_panic ("%s: The block pointer to not data area, " "must be fixed on the pass0.\n", __FUNCTION__); reiserfs_bitmap_set_bit (fsck_new_bitmap (fs), i); } } } /* this makes a map of blocks which can be allocated when fsck will continue */ static void find_allocable_blocks (reiserfs_filsys_t * fs) { unsigned long i; fsck_progress ("Looking for allocable blocks .. "); fsck_allocable_bitmap (fs) = reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb)); reiserfs_bitmap_fill (fsck_allocable_bitmap (fs)); /* find how many leaves are not pointed by any extent items */ for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) { if (reiserfs_fs_block(fs, i) != BT_UNKNOWN) { /* journal (or reserved for it area), bitmaps, super block and blocks before it */ continue; } if (pass0_block_isgood_unfm (i) && pass0_block_isbad_unfm (i)) { misc_die ("%s: The block (%lu) is marked as good and " "as bad at once.", __FUNCTION__, i); } if (pass0_block_isgood_unfm (i) || pass0_block_isbad_unfm (i)) { /* blocks which were pointed once or more then once from extent items - they will not be allocated */ continue; } /* make allocable not leaves, not bad blocks */ if (!pass0_block_isleaf (i)) if (!fs->fs_badblocks_bm || !reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i)) { /* this is not leaf and it is not pointed by found extent items, so it does not contains anything valuable */ make_allocable (i); pass_1_stat (fs)->allocable_blocks ++; } } fsck_progress ("finished\n"); fs->block_allocator = reiserfsck_new_blocknrs; fs->block_deallocator = reiserfsck_free_block; } static void fsck_pass1_prep (reiserfs_filsys_t * fs) { /* this will become an on-disk bitmap */ init_new_bitmap (fs); /* bitmap of leaves which could not be inserted on pass 1. FIXME: no need to have 1 bit per block */ fsck_uninsertables (fs) = reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb)); reiserfs_bitmap_fill (fsck_uninsertables (fs)); /* find blocks which can be allocated */ find_allocable_blocks (fs); /* bitmap of bad unformatted nodes which are in the tree already */ bad_unfm_in_tree_once_bitmap = reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb)); /* pass 1 does not deal with objectid */ } static void fsck_pass1_save_result (reiserfs_filsys_t * fs) { FILE * file; int retval; if (!(file = util_file_open("temp_fsck_file.deleteme", "w+"))) return; /* to be able to restart with pass 2 we need bitmap of uninsertable blocks and bitmap of alocable blocks */ fsck_stage_start_put (file, PASS_1_DONE); reiserfs_bitmap_save (file, fsck_uninsertables (fs)); reiserfs_bitmap_save (file, fsck_allocable_bitmap(fs)); reiserfs_bitmap_save (file, fsck_new_bitmap(fs)); fsck_stage_end_put (file); fclose (file); retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs)); if (retval != 0) fsck_progress ("pass 1: Could not rename the temporary file " "temp_fsck_file.deleteme to %s", state_dump_file (fs)); /* to be able to pack/unpack metadata after pass2 in stage-by-stage mode, save into on-disk bitmap all blocks that are involved. it should not be flushed on disk not in stage-by-stage mode, as if fsck fails on pass1 we get wrong bitmap on the next fsck start */ reiserfs_bitmap_flush (fsck_allocable_bitmap(fs), fs); } void fsck_pass1_load_result (FILE * fp, reiserfs_filsys_t * fs) { fsck_uninsertables (fs) = reiserfs_bitmap_load (fp); fsck_allocable_bitmap (fs) = reiserfs_bitmap_load (fp); fsck_new_bitmap (fs) = reiserfs_bitmap_load(fp); fs->block_allocator = reiserfsck_new_blocknrs; fs->block_deallocator = reiserfsck_free_block; if (!fsck_new_bitmap (fs) || !fsck_allocable_bitmap (fs) || !fsck_allocable_bitmap (fs)) { fsck_exit ("State dump file seems corrupted. Run without -d"); } /* we need objectid map on pass 2 to be able to relocate files */ proper_id_map (fs) = id_map_init(); fetch_objectid_map (proper_id_map (fs), fs); fsck_progress ("Pass 1 result loaded. %d blocks used, %d allocable, " "still to be inserted %d\n", reiserfs_bitmap_ones (fsck_new_bitmap (fs)), reiserfs_bitmap_zeros (fsck_allocable_bitmap (fs)), reiserfs_bitmap_zeros (fsck_uninsertables (fs))); } extern reiserfs_bitmap_t * leaves_bitmap; /* reads blocks marked in leaves_bitmap and tries to insert them into tree */ static void do_pass_1 (reiserfs_filsys_t * fs) { unsigned long done = 0, total; reiserfs_bh_t * bh; unsigned long i, n; int what_node; /* on pass0 we have found that amount of leaves */ total = reiserfs_bitmap_ones (leaves_bitmap); /* read all leaves found on the pass 0 */ for (n = 0; n < 2; n++) { for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) { if (!pass0_block_isleaf (i)) continue; if (n && !fsck_bitmap_isuninsert(i)) continue; if (!fsck_quiet(fs)) { util_misc_progress (fsck_progress_file (fs), &done, total, 1, 0); } /* at least one of nr_to_read blocks is to be checked */ bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize); if (!bh) { /* we were reading one block at time, and failed, so mark block bad */ fsck_progress ("pass1: Reading of the block %lu failed\n", i); continue; } what_node = reiserfs_node_type (bh); if ( what_node != NT_LEAF ) { fsck_info_checkmem(); misc_die ("build_the_tree: Nothing but leaves " "are expected. Block %lu - %s\n", i, reiserfs_node_type_name(what_node)); } if (is_block_used (i)) if (!(reiserfs_journal_block (fs, i) && fsck_data(fs)->rebuild.use_journal_area)) { /* block is in new tree already */ misc_die ("build_the_tree: The leaf (%lu) " "is in the tree already\n", i); } /* fprintf (block_list, "leaf %d\n", i + j);*/ if (n == 0) { pass_1_stat (fs)->leaves ++; /* the leaf may still contain extent items with wrong slots. Fix that */ pass1_correct_leaf (fs, bh); if (reiserfs_nh_get_items (NODE_HEAD (bh)) == 0) { /* all items were deleted on pass 0 or pass 1 */ reiserfs_buffer_mkclean (bh); reiserfs_buffer_close (bh); make_allocable (i); pass_1_stat (fs)->allocable_blocks ++; continue; } if (fsck_leaf_check(bh)) { /* FIXME: will die */ fsck_log ("%s: WARNING: The leaf (%lu) is formatted " "badly. Will be handled on the the pass2.\n", __FUNCTION__, bh->b_blocknr); fsck_bitmap_mkuninsert (bh->b_blocknr); reiserfs_buffer_close (bh); continue; } } if (reiserfs_journal_block (fs, i) && fsck_data(fs)->rebuild.use_journal_area) { /* FIXME: temporary thing */ if (tree_is_empty ()) { /* we insert inot tree only first leaf of journal */ unsigned long block; reiserfs_bh_t * new_bh; block = alloc_block (); if (!block) misc_die ("could not allocate block"); new_bh = reiserfs_buffer_open (bh->b_dev, block, bh->b_size); memcpy (new_bh->b_data, bh->b_data, bh->b_size); reiserfs_buffer_mkuptodate (new_bh, 1); reiserfs_buffer_mkdirty (new_bh); make_single_leaf_tree (new_bh); reiserfs_buffer_close (new_bh); reiserfs_buffer_close (bh); continue; } /* other blocks of journal will be inserted in pass 2 */ fsck_bitmap_mkuninsert (bh->b_blocknr); reiserfs_buffer_close (bh); continue; } if (!try_to_insert_pointer_to_leaf(bh)) { /* Inserted successfully. */ if (n) { fsck_bitmap_cluninsert (i); } } else { if (!n) { /* Not inserted on the 1st pass. */ fsck_bitmap_mkuninsert (i); done--; } } reiserfs_buffer_close (bh); } } if (!fsck_quiet(fs)) fsck_progress ("\n"); } static void fsck_pass1_fini (reiserfs_filsys_t * fs) { time_t t; /* update fsck_state */ /* we should not flush bitmaps on disk after pass1, because new_bitmap contains only those blocks which are good leaves or just allocated internal blocks. */ reiserfs_sb_set_state (fs->fs_ondisk_sb, PASS_1_DONE); reiserfs_buffer_mkdirty (fs->fs_super_bh); /* write all dirty blocks */ fsck_progress ("Flushing.."); fs->fs_dirt = 1; reiserfs_fs_flush (fs); fsck_progress ("finished\n"); fsck_stage_report (FS_PASS1, fs); /* we do not need this anymore */ fsck_pass0_aux_fini(); reiserfs_bitmap_delete (bad_unfm_in_tree_once_bitmap); if (!fsck_run_one_step (fs)) { if (fsck_info_ask (fs, "Continue? (Yes):", "Yes\n", 1)) /* reiserfsck continues */ return; } else fsck_pass1_save_result (fs); if (proper_id_map (fs)) { /* when we run pass 1 only - we do not have proper_id_map */ id_map_free(proper_id_map (fs)); proper_id_map (fs) = 0; } time (&t); fsck_progress ("###########\n" "reiserfsck finished pass 1 at %s" "###########\n", ctime (&t)); fs->fs_dirt = 1; reiserfs_fs_close (fs); exit(0); } void fsck_pass1 (reiserfs_filsys_t * fs) { fsck_progress ("Pass 1 (will try to insert %lu leaves):\n", reiserfs_bitmap_ones (fsck_source_bitmap (fs))); if (fsck_log_file (fs) != stderr) fsck_log ("####### Pass 1 #######\n"); fsck_pass1_prep (fs); /* try to insert leaves found during pass 0 */ do_pass_1 (fs); fsck_pass1_fini (fs); } reiserfsprogs-3.6.20/utils/fsck/pass2.c0000644000175300001440000001767410412227267014723 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/malloc.h" #include "util/device.h" #include "util/misc.h" #include /* on pass2 we take leaves which could not be inserted into tree during pass1 and insert each item separately. It is possible that items of different objects with the same key can be found. We treat that in the following way: we put it into tree with new key and link it into /lost+found directory with name made of dir,oid. When coming item is a directory - we delete object from the tree, put it back with different key, link it to /lost+found directory and insert directory as it is */ static void fsck_pass2_save_result (reiserfs_filsys_t * fs) { FILE * file; int retval; file = util_file_open("temp_fsck_file.deleteme", "w+"); if (!file) return; /* to be able to restart from semantic we do not need to save anything here, but two magic values */ fsck_stage_start_put (file, TREE_IS_BUILT); fsck_stage_end_put (file); fclose (file); retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs)); if (retval != 0) fsck_progress ("%s: Could not rename the temporary file " "temp_fsck_file.deleteme to %s", __FUNCTION__, state_dump_file (fs)); } /* we have nothing to load from a state file, but we have to fetch on-disk bitmap, copy it to allocable bitmap, and fetch objectid map */ void fsck_pass2_load_result (reiserfs_filsys_t * fs) { fsck_new_bitmap (fs) = reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb)); reiserfs_bitmap_copy (fsck_new_bitmap (fs), fs->fs_bitmap2); fsck_allocable_bitmap (fs) = reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb)); reiserfs_bitmap_copy (fsck_allocable_bitmap (fs), fs->fs_bitmap2); fs->block_allocator = reiserfsck_new_blocknrs; fs->block_deallocator = reiserfsck_free_block; /* we need objectid map on semantic pass to be able to relocate files */ proper_id_map (fs) = id_map_init(); fetch_objectid_map (proper_id_map (fs), fs); } #include /* uninsertable blocks are marked by 0s in uninsertable_leaf_bitmap during the pass 1. They must be not in the tree */ static void do_pass_2 (reiserfs_filsys_t * fs) { reiserfs_bh_t * bh; reiserfs_ih_t * ih; unsigned long total; unsigned long done; unsigned long b; int i, n, ntype; done = 0; if (!(total = reiserfs_bitmap_zeros(fsck_uninsertables(fs)) * 2)) return; fsck_progress ("Pass 2:\n"); /* 2 loops for SD items and others. */ for (n = 0; n < 2; n++) { b = 0; while ((b < fsck_uninsertables(fs)->bm_bit_size) && reiserfs_bitmap_find_zero_bit(fsck_uninsertables(fs), &b) == 0) { bh = reiserfs_buffer_read (fs->fs_dev, b, fs->fs_blocksize); if (bh == 0) { fsck_log ("pass_2: Reading of the block (%lu) failed on " "the device 0x%x\n", b, fs->fs_dev); goto cont; } if (is_block_used (bh->b_blocknr) && !(reiserfs_journal_block (fs, bh->b_blocknr) && fsck_data(fs)->rebuild.use_journal_area)) { fsck_log("%s: The block (%lu) is in the tree already. " "Should not happen.\n", __FUNCTION__, bh->b_blocknr); goto cont; } /* this must be leaf */ ntype = reiserfs_node_type (bh); if (ntype != NT_LEAF) { // || B_IS_KEYS_LEVEL(bh)) { fsck_log ("%s: The block (%b), marked as a leaf on " "the first two passes, is not a leaf! Will " "be skipped.\n", __FUNCTION__, bh); goto cont; } /* Item-by-item loop. */ for (i = 0, ih = reiserfs_ih_at (bh, 0); i < reiserfs_node_items (bh); i ++, ih ++) { /* Only SD items are inserted initially. */ if (n == 0 && !reiserfs_ih_stat (ih)) continue; /* All other items are inserted later. */ if (n && reiserfs_ih_stat (ih)) continue; if (fsck_leaf_item_check (bh, ih, reiserfs_item_by_ih (bh, ih))) continue; fsck_tree_insert_item (ih, reiserfs_item_by_ih (bh, ih), 1); } if (n) { pass_2_stat (fs)->leaves ++; make_allocable (b); } if (!fsck_quiet(fs)) { util_misc_progress (fsck_progress_file (fs), &done, total, 1, 0); } cont: reiserfs_buffer_close (bh); b++; } } if (!fsck_quiet(fs)) fsck_progress ("\n"); } static void fsck_pass2_fini (reiserfs_filsys_t * fs) { time_t t; /* we can now flush new_bitmap on disk as tree is built and contains all data, which were found on dik at start in used bitmaps */ reiserfs_bitmap_copy (fs->fs_bitmap2, fsck_new_bitmap (fs)); /* we should copy new_bitmap to allocable bitmap, becuase evth what is used for now (marked as used in new_bitmap) should not be allocable; and what is not in tree for now should be allocable. these bitmaps differ because on pass2 we skip those blocks, whose SD's are not in the tree, and therefore extent items of such bad leaves points to not used and not allocable blocks. */ /* DEBUG only if (reiserfs_bitmap_compare (fsck_allocable_bitmap (fs), fsck_new_bitmap(fs))) { fsck_log ("Allocable bitmap differs from the new bitmap after pass2\n"); reiserfs_bitmap_copy (fsck_allocable_bitmap(fs), fsck_new_bitmap (fs)); } */ /* update super block: objectid map, fsck state */ reiserfs_sb_set_state (fs->fs_ondisk_sb, TREE_IS_BUILT); reiserfs_buffer_mkdirty (fs->fs_super_bh); /* write all dirty blocks */ fsck_progress ("Flushing.."); id_map_flush(proper_id_map (fs), fs); fs->fs_dirt = 1; reiserfs_bitmap_flush (fs->fs_bitmap2, fs); reiserfs_fs_flush (fs); fsck_progress ("finished\n"); /* fixme: should be optional */ /* fsck_progress ("Tree is built. Checking it - "); reiserfsck_check_pass1 (); fsck_progress ("finished\n");*/ fsck_stage_report (FS_PASS2, fs); /* free what we do not need anymore */ reiserfs_bitmap_delete (fsck_uninsertables (fs)); if (!fsck_run_one_step (fs)) { if (fsck_info_ask (fs, "Continue? (Yes):", "Yes\n", 1)) /* reiserfsck continues */ return; } else fsck_pass2_save_result (fs); id_map_free(proper_id_map (fs)); proper_id_map (fs) = 0; reiserfs_bitmap_delete (fsck_new_bitmap (fs)); reiserfs_bitmap_delete (fsck_allocable_bitmap (fs)); time (&t); fsck_progress ("###########\n" "reiserfsck finished pass 2 at %s" "###########\n", ctime (&t)); fs->fs_dirt = 1; reiserfs_fs_close (fs); exit(0); } void fsck_pass2 (reiserfs_filsys_t * fs) { if (fsck_log_file (fs) != stderr) fsck_log ("####### Pass 2 #######\n"); /* take blocks which were not inserted into tree yet and put each item separately */ do_pass_2 (fs); fsck_pass2_fini (fs); if (reiserfs_sb_get_root (fs->fs_ondisk_sb) == ~(__u32)0 || reiserfs_sb_get_root (fs->fs_ondisk_sb) == 0) misc_die ( "\nNo reiserfs metadata found. If you are sure that you had the reiserfs\n" "on this partition, then the start of the partition might be changed\n" "or all data were wiped out. The start of the partition may get changed\n" "by a partitioner if you have used one. Then you probably rebuilt the\n" "superblock as there was no one. Zero the block at 64K offset from the\n" "start of the partition (a new super block you have just built) and try\n" "to move the start of the partition a few cylinders aside and check if\n" "debugreiserfs /dev/xxx detects a reiserfs super block. If it does this\n" "is likely to be the right super block version. \n" "If this makes you nervous, try www.namesys.com/support.html, and for\n" "$25 the author of fsck, or a colleague if he is out, will step you\n" "through it all.\n"); } reiserfsprogs-3.6.20/utils/fsck/pass4.c0000644000175300001440000001115510412227267014711 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "util/misc.h" static int fsck_squeeze(reiserfs_filsys_t *fs, reiserfs_path_t *path) { reiserfs_bh_t *bh_left, *bh; REISERFS_PATH_INIT(lpath); reiserfs_key_t key; __u64 off; __u32 oid; int res; bh = REISERFS_PATH_LEAF(path); key = *(reiserfs_ih_key_at(bh, 0)); if ((off = reiserfs_key_get_off(&key)) == 0) { if ((oid = reiserfs_key_get_oid(&key)) == 0) reiserfs_panic("Object id 0 found in the tree."); reiserfs_key_set_oid(&key, reiserfs_key_get_oid(&key) - 1); reiserfs_key_set_off(reiserfs_key_format(&key), &key, -1ull); } else { reiserfs_key_set_off(reiserfs_key_format(&key), &key, reiserfs_key_get_off(&key) - 1); } reiserfs_tree_search_item (fs, &key, &lpath); bh_left = REISERFS_PATH_LEAF (&lpath); if (bh->b_blocknr == bh_left->b_blocknr || !reiserfs_tree_node_mergeable(bh_left, bh)) { reiserfs_tree_pathrelse(&lpath); return 0; } /* Mergeable leaves must be merged. */ res = reiserfs_tree_merge(fs, &lpath, path); reiserfs_tree_pathrelse(&lpath); reiserfs_bitmap_clear_bit(fsck_new_bitmap (fs), bh->b_blocknr); return res; } void fsck_cleanup (void) { const reiserfs_key_t * rdkey; reiserfs_path_t path; reiserfs_key_t key; reiserfs_bh_t * bh; reiserfs_ih_t * ih; unsigned long items; int i, res; path.path_length = REISERFS_PATH_OFFILL; key = root_dir_key; fsck_progress ("Pass 4 - "); items = 0; while (1) { res = reiserfs_tree_search_item (fs, &key, &path); bh = REISERFS_PATH_LEAF (&path); ih = REISERFS_PATH_IH (&path); if (res != ITEM_FOUND) { if (REISERFS_PATH_LEAF_POS (&path) == 0) break; REISERFS_PATH_LEAF_POS (&path) --; ih = REISERFS_PATH_IH (&path); if (reiserfs_key_comp2(&key, &ih->ih_key)) break; /* Position found. */ //fsck_log("Warning: Node %lu, item %u, %k: item start is expected, " // "not a unit.\n", bh->b_blocknr, // REISERFS_PATH_LEAF_POS (&path), &ih->ih_key); } /* print ~ how many leaves were scanned and how fast it was */ if (!fsck_quiet (fs)) util_misc_speed (fsck_progress_file(fs), items++, 0, 50, 0); for (i = REISERFS_PATH_LEAF_POS (&path); i < reiserfs_node_items (bh); i ++, ih ++) { if (!fsck_item_reach(ih)) { REISERFS_PATH_LEAF_POS (&path) = i; rdkey = reiserfs_tree_next_key(&path, fs); if (rdkey) key = *rdkey; else memset (&key, 0xff, REISERFS_KEY_SIZE); pass_4_stat (fs)->deleted_items ++; /* fsck_log("Node %lu, item %u, %k: delete.\n", bh->b_blocknr, i, &ih->ih_key); */ reiserfs_tree_delete (fs, &path, 0); goto cont; } if (reiserfs_ih_get_flags(ih) != 0) { reiserfs_ih_clflags(ih); reiserfs_buffer_mkdirty(bh); } /* Merge mergeable items. */ if (i == 0) continue; if (reiserfs_ih_stat(ih)) continue; /* If not stat data and types match, try to merge items. */ if (reiserfs_key_get_type(&ih->ih_key) != reiserfs_key_get_type(&(ih - 1)->ih_key)) { continue; } if (reiserfs_ih_dir(ih) || must_there_be_a_hole(ih - 1, &ih->ih_key) == 0) { REISERFS_PATH_LEAF_POS (&path) = i; rdkey = reiserfs_tree_next_key(&path, fs); if (rdkey) key = *rdkey; else memset (&key, 0xff, REISERFS_KEY_SIZE); /* fsck_log ("%s: 2 items of the same type %k, %k are found " "in the same node (%d), pos (%u). Merged.\n", __FUNCTION__, &ih->ih_key, &(ih + 1)->ih_key, bh->b_blocknr, REISERFS_PATH_LEAF_POS(&path)); */ fsck_tree_merge(&path); goto cont; } } REISERFS_PATH_LEAF_POS(&path) = i - 1; rdkey = reiserfs_tree_next_key (&path, fs); if (rdkey) key = *rdkey; else memset (&key, 0xff, REISERFS_KEY_SIZE); fsck_squeeze(fs, &path); reiserfs_tree_pathrelse (&path); cont: /* to make gcc 3.2 do not sware here */; } reiserfs_tree_pathrelse (&path); fsck_progress ("finished\n"); fsck_stage_report (FS_CLEANUP, fs); /* after pass 4 */ /* put bitmap on place */ reiserfs_bitmap_copy (fs->fs_bitmap2, fsck_new_bitmap (fs)); /* update super block */ reiserfs_sb_set_free (fs->fs_ondisk_sb, reiserfs_bitmap_zeros (fsck_new_bitmap (fs))); reiserfs_buffer_mkdirty (fs->fs_super_bh); /* write all dirty blocks */ fsck_progress ("Flushing.."); fs->fs_dirt = 1; reiserfs_bitmap_flush (fs->fs_bitmap2, fs); reiserfs_fs_flush (fs); fsck_progress ("finished\n"); return; } reiserfsprogs-3.6.20/utils/fsck/relocate.c0000644000175300001440000001335610412227267015462 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/malloc.h" /* relocation rules: we have an item (it is taken from "non-insertable" leaf). It has original key yet. We check to see if object with this key is remapped. Object can be only remapped if it is not a piece of directory */ /* in list of this structures we store what has been relocated. */ struct relocated { unsigned long old_dir_id; unsigned long old_objectid; unsigned long new_objectid; struct relocated * next; }; /* all relocated files will be linked into lost+found directory at the beginning of semantic pass */ static struct relocated * relocated_list = NULL; __u32 fsck_relocate_get_oid (reiserfs_key_t * key) { struct relocated *cur = relocated_list; while (cur) { if (cur->old_dir_id == reiserfs_key_get_did (key) && cur->old_objectid == reiserfs_key_get_oid (key)) /* object is relocated already */ return cur->new_objectid; cur = cur->next; } return 0; } /* return objectid the object has to be remapped with */ __u32 fsck_relocate_oid(reiserfs_key_t * key) { struct relocated * cur; __u32 cur_id; if ((cur_id = fsck_relocate_get_oid (key)) != 0) return cur_id; cur = misc_getmem (sizeof (struct relocated)); cur->old_dir_id = reiserfs_key_get_did (key); cur->old_objectid = reiserfs_key_get_oid (key); cur->new_objectid = id_map_alloc(proper_id_map(fs)); cur->next = relocated_list; relocated_list = cur; pass_2_stat (fs)->relocated ++; /* fsck_log ("relocation: %K is relocated to [%lu, %lu]\n", key, reiserfs_key_get_did (key), cur->new_objectid); */ return cur->new_objectid; } /* relocated files get added into lost+found with slightly different names */ static __u64 link_one (struct relocated * file) { char name[REISERFS_NAME_MAX]; reiserfs_key_t obj_key; __u64 len = 0; int entry_len; name[0] = '\0'; sprintf(name, "%lu,%lu", file->old_dir_id, file->new_objectid); reiserfs_key_set_did (&obj_key, file->old_dir_id); reiserfs_key_set_oid (&obj_key, file->new_objectid); /* 0 for fsck_need does not mean too much - it would make effect if there * were no this directory yet. But /lost_found is there already */ entry_len = reiserfs_direntry_entry_estimate(name, fs->lost_format); len = reiserfs_tree_insert_entry (fs, &lost_found_dir_key, name, entry_len, &obj_key, 0/*fsck_need*/); return len; } void fsck_relocate_mklinked(reiserfs_key_t *new_key) { struct relocated *cur = relocated_list; struct relocated *prev = NULL; while (cur) { if (cur->old_dir_id == reiserfs_key_get_did(new_key) && cur->new_objectid == reiserfs_key_get_oid(new_key)) break; prev = cur; cur = cur->next; } if (cur) { /* len = link_func(cur); */ if (prev) prev->next = cur->next; else relocated_list = cur->next; misc_freemem (cur); } } void fsck_relocate_link_all (void) { struct relocated * tmp; while (relocated_list) { link_one (relocated_list); tmp = relocated_list; relocated_list = relocated_list->next; misc_freemem (tmp); } } /* check whether there are any directory items with this key Returns: 0 is relocation is not needed; 1 is the whole file relocation is needed; 2 if a new item only relocation is needed. */ __u32 fsck_relocate_check (reiserfs_ih_t * ih, int isdir) { const reiserfs_key_t * rkey; reiserfs_ih_t * path_ih; reiserfs_path_t path; reiserfs_key_t key; int found_dir; /* starting with the leftmost item with this key */ key = ih->ih_key; reiserfs_key_set_sec (KEY_FORMAT_1, &key, OFFSET_SD, TYPE_STAT_DATA); while (1) { reiserfs_tree_search_item (fs, &key, &path); if (REISERFS_PATH_LEAF_POS (&path) == reiserfs_node_items (REISERFS_PATH_LEAF (&path))) { rkey = reiserfs_tree_rkey (&path, fs); if (rkey && !reiserfs_key_comp2 (&key, rkey)) { /* file continues in the right neighbor */ key = *rkey; reiserfs_tree_pathrelse (&path); continue; } /* there is no more items with this key */ reiserfs_tree_pathrelse (&path); break; } path_ih = REISERFS_PATH_IH (&path); if (reiserfs_key_comp2 (&key, &(path_ih->ih_key))) { /* there are no more item with this key */ reiserfs_tree_pathrelse (&path); break; } found_dir = reiserfs_dir(path_ih, REISERFS_PATH_ITEM (&path)); if (reiserfs_ih_stat (path_ih)) { if (reiserfs_ih_ischeck (path_ih)) { /* we have checked it already */ reiserfs_tree_pathrelse (&path); if ((found_dir && isdir) || (!found_dir && !isdir)) { /* If the item being inserted and the found one are both either directory ones of not directory ones, no relocation is needed. */ return 0; } /* If new one is a dirrectory one, relocate file in the tree. */ if (isdir) return 1; /* If new one is file and there is a directory in the tree, return id for the relocation, allocate it if needed. */ return fsck_relocate_oid (&path_ih->ih_key); } else { reiserfs_ih_mkcheck (path_ih); reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF(&path)); } } reiserfs_tree_pathrelse (&path); if (isdir) { /* If directory, force relocate as it costs nothing for the directory, and do not spend time on this check. */ return 1; } /* ok, item found, but make sure that it is not a directory one */ if (found_dir) { /* item of directory found. so, we have to relocate the file */ return 1; } key = path_ih->ih_key; reiserfs_key_set_off (KEY_FORMAT_1, &key, reiserfs_key_get_off (&key) + 1); } return 0; } reiserfsprogs-3.6.20/utils/fsck/rollback.c0000644000175300001440000002050010412227267015442 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/malloc.h" #include "util/misc.h" #include #include #include #define ROLLBACK_FILE_START_MAGIC "_RollBackFileForReiserfsFSCK" static struct block_handler * rollback_blocks_array; static __u32 rollback_blocks_number = 0; static FILE * s_rollback_file = 0; static FILE * log_file; static int do_rollback = 0; static char * rollback_data; static unsigned int rollback_blocksize; void fsck_rollback_init (char * rollback_file, unsigned int *blocksize, FILE * log) { char * string; struct stat buf; if (rollback_file == NULL) return; stat(rollback_file, &buf); s_rollback_file = fopen (rollback_file, "w+"); if (s_rollback_file == NULL) { fprintf (stderr, "Cannot create file %s, work without " "a rollback file\n", rollback_file); return; } rollback_blocksize = *blocksize; string = ROLLBACK_FILE_START_MAGIC; fwrite (string, 28, 1, s_rollback_file); fwrite (&rollback_blocksize, sizeof(rollback_blocksize), 1, s_rollback_file); fwrite (&rollback_blocks_number, sizeof(rollback_blocks_number), 1, s_rollback_file); fflush(s_rollback_file); rollback_data = misc_getmem(rollback_blocksize); // printf("\ncheckmem1"); // fflush (stdout); // checkmem (rollback_data, misc_memsize((char *)rollback_data)); // printf(" OK"); log_file = log; if (log_file) fprintf (log_file, "rollback: file (%s) initialize\n", rollback_file); do_rollback = 0; } #if 0 static void erase_rollback_file (char * rollback_file) { close_rollback_file (); unlink (rollback_file); } #endif int fsck_rollback_prep (char * rollback_file, FILE * log) { char string [28]; struct stat buf; if (rollback_file == NULL) return -1; if (stat(rollback_file, &buf)) { fprintf (stderr, "Cannot stat rollback file (%s)\n", rollback_file); return -1; } s_rollback_file = fopen (rollback_file, "r+"); if (s_rollback_file == NULL) { fprintf (stderr, "Cannot open file (%s)\n", rollback_file); return -1; } fread (string, 28, 1, s_rollback_file); if (!strcmp (string, ROLLBACK_FILE_START_MAGIC)) { fprintf (stderr, "Specified file (%s) does not look like " "a rollback file\n", rollback_file); fclose (s_rollback_file); s_rollback_file = 0; return -1; } fread (&rollback_blocksize, sizeof (rollback_blocksize), 1, s_rollback_file); if (rollback_blocksize <= 0) { fprintf(stderr, "rollback: wrong rollback blocksize, exit\n"); return -1; } log_file = log; if (log_file) fprintf (log_file, "rollback: file (%s) opened\n", rollback_file); do_rollback = 1; return 0; } void fsck_rollback_fini () { if (s_rollback_file == 0) return; if (!do_rollback) { if (fseek (s_rollback_file, 28 + sizeof(int), SEEK_SET) == (off_t)-1) return; fwrite (&rollback_blocks_number, sizeof (rollback_blocksize), 1, s_rollback_file); if (log_file != 0) { fprintf (log_file, "rollback: %d blocks backed up\n", rollback_blocks_number); } } fclose (s_rollback_file); misc_freemem (rollback_data); misc_freemem (rollback_blocks_array); /* fprintf (stdout, "rollback: (%u) blocks saved, \n", rollback_blocks_number); for (i = 0; i < rollback_blocks_number; i++) fprintf(stdout, "device (%Lu), block number (%u)\n", rollback_blocks_array [i].device, rollback_blocks_array [i].blocknr); fprintf(stdout, "\n"); */ } void fsck_rollback (int fd_device, int fd_journal_device, FILE * progress) { long long int offset; struct stat buf; int descriptor; ssize_t retval; int count_failed = 0; int count_rollbacked = 0; int b_dev; int n_dev = 0; int n_journal_dev = 0; unsigned long total, done = 0; if (fd_device == 0) { fprintf(stderr, "rollback: unspecified device, exit\n"); return; } if (fd_journal_device) { if (!fstat (fd_journal_device, &buf)) { n_journal_dev = buf.st_rdev; } else { fprintf(stderr, "rollback: specified journal device " "cannot be stated\n"); } } if (!fstat (fd_device, &buf)) { n_dev = buf.st_rdev; } else { fprintf(stderr, "rollback: specified device cannot " "be stated, exit\n"); return; } rollback_data = misc_getmem (rollback_blocksize); // printf("\ncheckmem2"); // fflush (stdout); // checkmem (rollback_data, misc_memsize((char *)rollback_data)); // printf(" OK"); fread (&rollback_blocks_number, sizeof (rollback_blocks_number), 1, s_rollback_file); total = rollback_blocks_number; while (1) { if (!fsck_quiet(fs)) { util_misc_progress (progress, &done, rollback_blocks_number, 1, 0); } descriptor = 0; if ((retval = fread (&b_dev, sizeof (b_dev), 1, s_rollback_file)) <= 0) { if (retval) fprintf (stderr, "rollback: fread: %s\n", strerror (errno)); break; } if ((retval = fread (&offset, sizeof (offset), 1, s_rollback_file)) <= 0) { if (retval) fprintf (stderr, "rollback: fread: %s\n", strerror (errno)); break; } if ((retval = fread (rollback_data, rollback_blocksize, 1, s_rollback_file)) <= 0) { if (retval) fprintf (stderr, "rollback: fread: %s\n", strerror (errno)); break; } if (n_dev == b_dev) descriptor = fd_device; if ((n_journal_dev) && (n_journal_dev == b_dev)) descriptor = fd_journal_device; if (descriptor == 0) { fprintf(stderr, "rollback: block from unknown " "device, skip block\n"); count_failed ++; continue; } if (lseek (descriptor, offset, SEEK_SET) == (off_t)-1) { fprintf(stderr, "device cannot be lseeked, skip block\n"); count_failed ++; continue; } if (write (descriptor, rollback_data, rollback_blocksize) == -1) { fprintf (stderr, "rollback: write %d bytes returned error " "(block=%lld, dev=%d): %s\n", rollback_blocksize, offset/rollback_blocksize, b_dev, strerror (errno)); count_failed ++; } else { count_rollbacked ++; /*if you want to know what gets rollbacked, uncomment it*/ /* if (log_file != 0 && log_file != stdout) fprintf (log_file, "rollback: block %Lu of " "device %Lu was restored\n", (unsigned long long)offset/rollback_blocksize, b_dev); fprintf (stdout, "rollback: block (%Ld) written\n", (long long int)offset/rollback_blocksize); */ } } printf ("\n"); if (log_file != 0) { fprintf (log_file, "rollback: (%u) blocks restored\n", count_rollbacked); } } /* static void rollback__mark_block_saved (struct block_handler * rb_e) { if (rollback_blocks_array == NULL) rollback_blocks_array = misc_getmem (ROLLBACK__INCREASE_BLOCK_NUMBER * sizeof (*rb_e)); if (rollback_blocks_number == misc_memsize ((void *)rollback_blocks_array) / sizeof (*rb_e)) { rollback_blocks_array = misc_expandmem (rollback_blocks_array, misc_memsize((void *)rollback_blocks_array), ROLLBACK__INCREASE_BLOCK_NUMBER * sizeof (*rb_e)); } // checkmem ((char *)rollback_blocks_array, misc_memsize((char *)rollback_blocks_array)); rollback_blocks_array[rollback_blocks_number] = *rb_e; rollback_blocks_number ++; qsort (rollback_blocks_array, rollback_blocks_number, sizeof (*rb_e), rollback_compare); // printf("\ncheckmem3"); // fflush (stdout); // checkmem ((char *)rollback_blocks_array, misc_memsize((char *)rollback_blocks_array)); // printf(" OK"); } */ reiserfsprogs-3.6.20/utils/fsck/semantic_check.c0000644000175300001440000006233510412227267016625 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/malloc.h" #include "misc/unaligned.h" #include "misc/misc.h" #include "util/misc.h" #include static reiserfs_key_t *trunc_links = NULL; static __u32 links_num = 0; int wrong_mode (reiserfs_key_t * key, __u16 * mode, __u64 real_size, int symlink); int wrong_fdb (reiserfs_key_t * key, int blocksize, __u32 * first_direct_byte, __u32 sd_fdb, __u32 size); void get_object_key (reiserfs_deh_t * deh, reiserfs_key_t * key, reiserfs_key_t * entry_key, reiserfs_ih_t * ih); struct path_key { struct short_key { __u32 k_dir_id; __u32 k_objectid; } key; struct path_key * next, * prev; }; struct path_key * head_key = NULL; struct path_key * tail_key = NULL; static int check_path_key(reiserfs_key_t * key) { struct path_key * cur = head_key; while(cur != NULL) { if (!reiserfs_key_comp2(&cur->key, key)) { fsck_log("\nsemantic check: The directory %k has 2 names.", key); return LOOP_FOUND; } cur = cur->next; } return 0; } static int add_path_key(reiserfs_key_t * key) { if (check_path_key(key)) return LOOP_FOUND; if (tail_key == NULL) { tail_key = misc_getmem(sizeof(struct path_key)); head_key = tail_key; tail_key->prev = NULL; } else { tail_key->next = misc_getmem(sizeof(struct path_key)); tail_key->next->prev = tail_key; tail_key = tail_key->next; } reiserfs_key_copy2 ((reiserfs_key_t *)&tail_key->key, key); tail_key->next = NULL; return 0; } static void del_path_key() { if (tail_key == NULL) misc_die("Wrong path_key structure"); if (tail_key->prev == NULL) { misc_freemem(tail_key); tail_key = head_key = NULL; } else { tail_key = tail_key->prev; misc_freemem(tail_key->next); tail_key->next = NULL; } } /* path is path to stat data. If file will be relocated - new_ih will contain a key file was relocated with */ static int check_check_regular_file (reiserfs_path_t * path, void * sd, reiserfs_ih_t * new_ih) { int is_new_file; // reiserfs_key_t key, sd_key; __u16 mode; __u32 nlink; __u64 real_size, sd_size; __u32 blocks, sd_blocks; /* proper values and value in stat data */ __u32 first_direct_byte, sd_fdb; reiserfs_ih_t * ih, sd_ih; int fix_sd; int symlnk = 0; int retval = OK; int tmp_position; ih = REISERFS_PATH_IH (path); if (new_ih) { /* this objectid is used already */ *new_ih = *ih; reiserfs_tree_pathrelse (path); fsck_file_relocate (&new_ih->ih_key, 1); fsck_relocate_mklinked(&new_ih->ih_key); one_less_corruption (fs, FIXABLE); sem_pass_stat (fs)->oid_sharing_files_relocated ++; retval = RELOCATED; if (reiserfs_tree_search_item (fs, &(new_ih->ih_key), path) == ITEM_NOT_FOUND) { reiserfs_panic ("%s: Could not find a StatData of the relocated " "file %K", __FUNCTION__, &new_ih->ih_key); } /* stat data is marked unreachable again due to relocation, fix that */ ih = REISERFS_PATH_IH (path); sd = REISERFS_PATH_ITEM (path); } if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE) is_new_file = 1; else is_new_file = 0; reiserfs_stat_get_nlink (ih, sd, &nlink); reiserfs_stat_get_mode (ih, sd, &mode); reiserfs_stat_get_size (ih, sd, &sd_size); reiserfs_stat_get_blocks (ih, sd, &sd_blocks); /* if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { // check and set nlink first nlink ++; reiserfs_stat_set_nlink (ih, sd, &nlink); reiserfs_buffer_mkdirty (bh); if (nlink > 1) return OK; } */ if (!is_new_file) reiserfs_stat_get_fdb (ih, sd, &sd_fdb); if (S_ISLNK (mode)) symlnk = 1; sd_ih = *ih; // sd_key = sd_ih.ih_key; reiserfs_tree_pathrelse (path); if (are_file_items_correct (&sd_ih, sd, &real_size, &blocks, 0/* do not mark reachable */, &symlnk) != 1) { one_more_corruption (fs, FATAL); fsck_log ("check_regular_file: The file %K with the corrupted " "structure found\n", &sd_ih.ih_key); } else { fix_sd = 0; fix_sd += wrong_mode (&sd_ih.ih_key, &mode, real_size, symlnk); if (!is_new_file) fix_sd += wrong_fdb (&sd_ih.ih_key, fs->fs_blocksize, &first_direct_byte, sd_fdb, real_size); if (misc_bin_search(&sd_ih.ih_key, trunc_links, links_num, sizeof(sd_ih.ih_key), &tmp_position, reiserfs_key_comp2) != 1) { fix_sd += wrong_st_size (&sd_ih.ih_key, is_new_file ? REISERFS_SD_SIZE_MAX_V2 : REISERFS_SD_SIZE_MAX_V1, fs->fs_blocksize, &real_size, sd_size, symlnk ? TYPE_SYMLINK : 0); } else { real_size = sd_size; } fix_sd += wrong_st_blocks (&sd_ih.ih_key, &blocks, sd_blocks, mode, is_new_file); if (fix_sd) { if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { reiserfs_bh_t * bh; /* find stat data and correct it */ reiserfs_key_set_sec (KEY_FORMAT_1, &sd_ih.ih_key, OFFSET_SD, TYPE_STAT_DATA); if (reiserfs_tree_search_item (fs, &sd_ih.ih_key, path) != ITEM_FOUND) { fsck_log ("check_regular_file: A StatData of the file %K " "cannot be found\n", &sd_ih.ih_key); one_more_corruption (fs, FATAL); return STAT_DATA_NOT_FOUND; } bh = REISERFS_PATH_LEAF (path); ih = REISERFS_PATH_IH (path); sd = REISERFS_PATH_ITEM (path); reiserfs_stat_set_size (ih, sd, &real_size); reiserfs_stat_set_blocks (ih, sd, &blocks); reiserfs_stat_set_mode (ih, sd, &mode); if (!is_new_file) reiserfs_stat_set_fdb (ih, sd, &first_direct_byte); reiserfs_buffer_mkdirty (bh); } else { fsck_check_stat (fs)->fixable_corruptions += fix_sd; } } } return retval; } /* returns buffer, containing found directory item.*/ static char * get_next_directory_item ( /* on return this will contain key of next item in the tree */ reiserfs_key_t * key, const reiserfs_key_t * parent, reiserfs_ih_t * ih, __u32 * pos_in_item, int dir_format) { const reiserfs_key_t * rdkey; REISERFS_PATH_INIT (path); reiserfs_deh_t * deh; reiserfs_bh_t * bh; char * dir_item; int entry_len; int retval; int i; start_again: retval = reiserfs_tree_search_entry (fs, key, &path); if (retval != POSITION_FOUND && reiserfs_key_get_off (key) != OFFSET_DOT) { reiserfs_panic ("get_next_directory_item: The current " "directory %k cannot be found", key); } /* leaf containing directory item */ bh = REISERFS_PATH_LEAF (&path); *pos_in_item = path.pos_in_item; *ih = *REISERFS_PATH_IH (&path); deh = reiserfs_deh (bh, ih); /* position was not found for '.' or there is no '..' */ if (retval != POSITION_FOUND || ((reiserfs_key_get_off (key) == OFFSET_DOT) && (reiserfs_ih_get_entries (ih) < 2 || reiserfs_direntry_name_len (ih, deh + 1, 1) != 2 || strncmp (reiserfs_deh_name (deh + 1, 1), "..", 2)))) { fsck_log ("get_next_directory_item: The %s %k cannot be found in %k", (retval == POSITION_NOT_FOUND) ? "entry" : "directory", key, &ih->ih_key); if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { /* add "." and ".." exist */ reiserfs_tree_pathrelse (&path); entry_len = reiserfs_direntry_entry_estimate (".", dir_format); reiserfs_tree_insert_entry (fs, key, ".", entry_len, key, 0); entry_len = reiserfs_direntry_entry_estimate ("..", dir_format); reiserfs_tree_insert_entry (fs, key, "..", entry_len, parent, 0); fsck_log (" - entry was added\n"); goto start_again; } else { one_more_corruption (fs, FIXABLE); fsck_log ("\n"); if (retval == DIRECTORY_NOT_FOUND) return 0; } } /* mark hidden entries as visible, set "." and ".." correctly */ deh += *pos_in_item; for (i = *pos_in_item; i < reiserfs_ih_get_entries (ih); i ++, deh ++) { if (reiserfs_deh_get_off (deh) == OFFSET_DOT) { if (reiserfs_key_comp2 (&(deh->deh2_dir_id), key)) { /* "." must point to the directory it is in */ //deh->deh_objectid != REISERFS_ROOT_PARENT_OBJECTID)/*????*/ { fsck_log ("get_next_directory_item: The entry \".\" of the " "directory %K points to %K, instead of %K", key, (reiserfs_key_t *)(&(deh->deh2_dir_id)), key); if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { reiserfs_deh_set_did (deh, reiserfs_key_get_did (key)); reiserfs_deh_set_obid (deh, reiserfs_key_get_oid (key)); reiserfs_buffer_mkdirty (bh); fsck_log (" - corrected\n"); } else { one_more_corruption (fs, FIXABLE); fsck_log ("\n"); } } } if (reiserfs_deh_get_off (deh) == OFFSET_DOT_DOT) { /* set ".." so that it points to the correct parent directory */ if (reiserfs_key_comp2 (&(deh->deh2_dir_id), parent)) { fsck_log ("get_next_directory_item: The entry \"..\" of the " "directory %K points to %K, instead of %K", key, (reiserfs_key_t *)(&(deh->deh2_dir_id)), parent); if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { reiserfs_deh_set_did (deh, reiserfs_key_get_did (parent)); reiserfs_deh_set_obid (deh, reiserfs_key_get_oid (parent)); reiserfs_buffer_mkdirty (bh); fsck_log (" - corrected\n"); } else { one_more_corruption (fs, FIXABLE); fsck_log ("\n"); } } } } /* copy directory item to the temporary buffer */ dir_item = misc_getmem (reiserfs_ih_get_len (ih)); memcpy (dir_item, reiserfs_item_by_ih (bh, ih), reiserfs_ih_get_len (ih)); /* next item key */ if (REISERFS_PATH_LEAF_POS (&path) == (reiserfs_node_items (bh) - 1) && (rdkey = reiserfs_tree_rkey (&path, fs))) reiserfs_key_copy (key, rdkey); else { reiserfs_key_set_did (key, 0); reiserfs_key_set_oid (key, 0); } if (fsck_mode (fs) == FSCK_REBUILD) fsck_item_mkreach (REISERFS_PATH_IH (&path), bh); reiserfs_tree_pathrelse (&path); return dir_item; } /* semantic pass of --check */ static int check_semantic_pass (const reiserfs_key_t * key, const reiserfs_key_t * parent, int dot_dot, reiserfs_ih_t * new_ih) { reiserfs_path_t path; void * sd; __u32 nlink; int is_new_dir; reiserfs_bh_t * bh; reiserfs_ih_t * ih; int retval; char * dir_item; __u32 pos_in_item; reiserfs_ih_t tmp_ih; reiserfs_key_t next_item_key, entry_key, object_key; __u64 dir_size = 0; __u32 blocks; __u64 sd_size; __u32 sd_blocks; int fix_sd; /*int relocate;*/ int dir_format = 0; __u16 mode; retval = OK; /* start_again: when directory was relocated */ if (!reiserfs_key_stat (key)) { fsck_log ("%s: The key %k must be key of a StatData\n", __FUNCTION__, key); one_more_corruption (fs, FATAL); return STAT_DATA_NOT_FOUND; } /* look for stat data of an object */ if (reiserfs_tree_search_item (fs, key, &path) == ITEM_NOT_FOUND) { reiserfs_tree_pathrelse (&path); return STAT_DATA_NOT_FOUND; } /* stat data has been found */ ih = REISERFS_PATH_IH (&path); sd = REISERFS_PATH_ITEM(&path); reiserfs_stat_get_nlink (ih, sd, &nlink); /* It seems quite difficult to relocate objects on fix-fixable - * rewrite_file calls reiserfs_file_write which can convert tails * to unfm, plus unreachable, was_tail flags, etc. */ #if 0 if ((/* relocate = */ should_be_relocated(&ih->ih_key))) { /* if (fsck_mode(fs) == FSCK_CHECK) relocate = 0; */ one_more_corruption(fs, FATAL); } #endif if (fix_obviously_wrong_sd_mode (&path)) { one_more_corruption (fs, FIXABLE); reiserfs_tree_pathrelse (&path); return OK; } if (nlink == 0) { fsck_log ("%s: block %lu: The StatData %k has " "bad nlink number (%u)\n", __FUNCTION__, REISERFS_PATH_LEAF(&path)->b_blocknr, &ih->ih_key, nlink); one_more_corruption (fs, FATAL); } if (not_a_directory (sd)) { fsck_check_stat (fs)->files ++; retval = check_check_regular_file (&path, sd, 0); reiserfs_tree_pathrelse (&path); return retval; } /* if (relocate) { if (!new_ih) reiserfs_panic ("%s: Memory is not prepared for relocation of %K", __FUNCTION__, &ih->ih_key); *new_ih = *ih; reiserfs_tree_pathrelse (&path); sem_pass_stat (fs)->oid_sharing_dirs_relocated ++; relocate_dir (new_ih, 1); fsck_relocate_mklinked(&new_ih->ih_key); one_less_corruption (fs, FIXABLE); *key = new_ih->ih_key; retval = RELOCATED; goto start_again; } */ /* if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { // it looks like stat data of a directory found if (nlink) { // we saw this directory already if (!dot_dot) { // this name is not ".." - and hard links are not // allowed on directories reiserfs_tree_pathrelse (&path); return STAT_DATA_NOT_FOUND; } else { // ".." found nlink ++; reiserfs_stat_set_nlink (ih, sd, &nlink); reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (&path)); reiserfs_tree_pathrelse (&path); return OK; } } // do not run it for dot_dot on check at all nlink = 2; if (reiserfs_key_get_oid (key) == REISERFS_ROOT_OBJECTID) nlink ++; reiserfs_stat_set_nlink (ih, sd, &nlink); reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (&path)); } */ /* directory stat data found */ if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE) is_new_dir = 1; else is_new_dir = 0; /* save stat data's size and st_blocks */ reiserfs_stat_get_size (ih, sd, &sd_size); reiserfs_stat_get_blocks (ih, sd, &sd_blocks); reiserfs_stat_get_mode (ih, sd, &mode); dir_format = (reiserfs_ih_get_len (REISERFS_PATH_IH (&path)) == REISERFS_SD_SIZE) ? KEY_FORMAT_2 : KEY_FORMAT_1; /* release path pointing to stat data */ reiserfs_tree_pathrelse (&path); fsck_check_stat (fs)->dirs ++; reiserfs_key_set_did (&next_item_key, reiserfs_key_get_did (key)); reiserfs_key_set_oid (&next_item_key, reiserfs_key_get_oid (key)); reiserfs_key_set_off1 (&next_item_key, OFFSET_DOT); reiserfs_key_set_uni (&next_item_key, UNI_DE); dir_size = 0; while ((dir_item = get_next_directory_item (&next_item_key, parent, &tmp_ih, &pos_in_item, dir_format)) != 0) { /* dir_item is copy of the item in separately allocated memory, item_key is a key of next item in the tree */ int i; char name[REISERFS_NAME_MAX]; int namelen, entry_len; reiserfs_deh_t * deh = (reiserfs_deh_t *)dir_item + pos_in_item; for (i = pos_in_item; i < reiserfs_ih_get_entries (&tmp_ih); i ++, deh ++) { reiserfs_ih_t relocated_ih; int ret = OK; name[0] = '\0'; namelen = reiserfs_direntry_name_len (&tmp_ih, deh, i); sprintf(name, "%.*s", namelen, reiserfs_deh_name (deh, i)); entry_len = reiserfs_direntry_entry_len (&tmp_ih, deh, i); get_object_key (deh, &object_key, &entry_key, &tmp_ih); if ((dir_format == KEY_FORMAT_2) && (entry_len % 8 != 0)) { /* not alighed directory of new format - delete it */ if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { fsck_log ("Entry %K (\"%.*s\") in the directory %K is not " "formated properly - deleted\n", (reiserfs_key_t *)&(deh->deh2_dir_id), namelen, name, &tmp_ih.ih_key); reiserfs_tree_delete_entry (fs, &entry_key); entry_len = reiserfs_direntry_entry_estimate (name, dir_format); reiserfs_tree_insert_entry (fs, key, name, entry_len, (reiserfs_key_t *)&(deh->deh2_dir_id), 0); } else { fsck_log ("Entry %K (\"%.*s\") in the directory %K is " "not formated properly.\n", (reiserfs_key_t *)&(deh->deh2_dir_id), namelen, name, &tmp_ih.ih_key); one_more_corruption (fs, FIXABLE); } } if (!reiserfs_hash_correct (&fs->hash, name, namelen, reiserfs_deh_get_off (deh))) { one_more_corruption (fs, FATAL); fsck_log ("%s: Hash mismatch detected for (%.*s) in directory " "%K\n", __FUNCTION__, namelen, name, &tmp_ih.ih_key); } if (is_dot (name, namelen) || (is_dot_dot (name, namelen))) { /* do not go through "." and ".." */ ret = OK; } else { if (!fsck_quiet(fs)) { util_misc_print_name (fsck_progress_file(fs), name, namelen); } if ((ret = add_path_key (&object_key)) == 0) { ret = check_semantic_pass (&object_key, key, is_dot_dot(name, namelen), &relocated_ih); del_path_key (); } if (!fsck_quiet(fs)) { util_misc_erase_name (fsck_progress_file(fs), namelen); } } /* check what check_semantic_tree returned */ switch (ret) { case OK: dir_size += REISERFS_DEH_SIZE + entry_len; break; case STAT_DATA_NOT_FOUND: fsck_log ("%s: Name \"%.*s\" in directory %K points to " "nowhere\n", __FUNCTION__, namelen, name, &tmp_ih.ih_key); case LOOP_FOUND: if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { reiserfs_tree_delete_entry (fs, &entry_key); fsck_log (" - removed"); } else { one_more_corruption (fs, FIXABLE); } fsck_log ("\n"); break; case DIRECTORY_HAS_NO_ITEMS: fsck_log ("%s: Name \"%.*s\" in directory %K points a " "directory without body\n", __FUNCTION__, namelen, name, &tmp_ih.ih_key); /* fixme: stat data should be deleted as well */ /* if (fsck_fix_fixable (fs)) { reiserfs_tree_delete_entry (fs, &entry_key); fsck_data(fs)->deleted_entries ++; fsck_log (" - removed"); } fsck_log ("\n");*/ break; case RELOCATED: /* file was relocated, update key in corresponding direntry */ if (reiserfs_tree_search_entry (fs, &entry_key, &path) != POSITION_FOUND) { fsck_log("Cannot find a name of the relocated file %K in " "the directory %K\n", &entry_key, &tmp_ih.ih_key); } else { /* update key dir entry points to */ reiserfs_deh_t * tmp_deh; tmp_deh = reiserfs_deh (REISERFS_PATH_LEAF (&path), REISERFS_PATH_IH (&path)) + path.pos_in_item; fsck_log ("The directory %K pointing to %K (\"%.*s\") " "updated to point to ", &tmp_ih.ih_key, &tmp_deh->deh2_dir_id, namelen, name); reiserfs_deh_set_did (tmp_deh, reiserfs_key_get_did (&relocated_ih.ih_key)); reiserfs_deh_set_obid (tmp_deh, reiserfs_key_get_oid (&relocated_ih.ih_key)); fsck_log ("%K (\"%.*s\")\n", &tmp_deh->deh2_dir_id, namelen, name); reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (&path)); } dir_size += REISERFS_DEH_SIZE + entry_len; reiserfs_tree_pathrelse (&path); break; } } /* for */ misc_freemem (dir_item); if (reiserfs_key_comp2 (&next_item_key, key)) /* next key is not of this directory */ break; } /* while (dir_item) */ if (dir_size == 0) /* FIXME: is it possible? */ return DIRECTORY_HAS_NO_ITEMS; /* calc correct value of sd_blocks field of stat data */ blocks = REISERFS_DIR_BLOCKS (dir_size); fix_sd = 0; fix_sd += wrong_st_blocks (key, &blocks, sd_blocks, mode, is_new_dir); fix_sd += wrong_st_size (key, is_new_dir ? REISERFS_SD_SIZE_MAX_V2 : REISERFS_SD_SIZE_MAX_V1, fs->fs_blocksize, &dir_size, sd_size, TYPE_DIRENTRY); if (fix_sd) { if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { /* we have to fix either sd_size or sd_blocks, look for SD again */ if (reiserfs_tree_search_item (fs, key, &path) != ITEM_FOUND) { fsck_log ("%s: The StatData of the file %K was not found\n", __FUNCTION__, key); one_more_corruption(fs, FATAL); return STAT_DATA_NOT_FOUND; } bh = REISERFS_PATH_LEAF (&path); ih = REISERFS_PATH_IH (&path); sd = REISERFS_PATH_ITEM (&path); reiserfs_stat_set_size (ih, sd, &dir_size); reiserfs_stat_set_blocks (ih, sd, &blocks); reiserfs_buffer_mkdirty (bh); reiserfs_tree_pathrelse (&path); } else { fsck_check_stat (fs)->fixable_corruptions += fix_sd; } } return retval; } int check_safe_links () { reiserfs_path_t safe_link_path, path; reiserfs_key_t safe_link_key = {-1, 0, {{0, 0}}}; reiserfs_key_t key = {0, 0, {{0, 0}}}; const reiserfs_key_t * rkey; reiserfs_ih_t * tmp_ih; while (1) { if (reiserfs_key_get_did (&safe_link_key) == 0) break; reiserfs_tree_search_item (fs, &safe_link_key, &safe_link_path); if (reiserfs_nh_get_items( NODE_HEAD(REISERFS_PATH_LEAF(&safe_link_path))) <= REISERFS_PATH_LEAF_POS (&safe_link_path)) { reiserfs_tree_pathrelse (&safe_link_path); break; } tmp_ih = REISERFS_PATH_IH(&safe_link_path); if (reiserfs_key_get_did(&tmp_ih->ih_key) != (__u32)-1 || reiserfs_key_get_oid(&tmp_ih->ih_key) == (__u32)-1) { reiserfs_tree_pathrelse (&safe_link_path); break; } if (reiserfs_ih_get_len (tmp_ih) != 4) reiserfs_panic ("Safe Link %k cannot be of the size %d", &tmp_ih->ih_key, reiserfs_ih_get_len (tmp_ih)); reiserfs_key_set_did(&key, d32_get((__u32 *)REISERFS_PATH_ITEM(&safe_link_path), 0)); reiserfs_key_set_oid(&key, reiserfs_key_get_oid(&tmp_ih->ih_key)); if ((rkey = reiserfs_tree_next_key(&safe_link_path, fs)) == NULL) reiserfs_key_set_did (&safe_link_key, 0); else safe_link_key = *rkey; if (reiserfs_tree_search_item (fs, &key, &path) == ITEM_NOT_FOUND) { /*sware on check, delete on fix-fixable*/ if (fsck_mode(fs) == FSCK_CHECK) { fsck_log ("Invalid safe link %k: cannot find the pointed " "object (%K)\n", &tmp_ih->ih_key, &key); one_more_corruption (fs, FIXABLE); } else if (fsck_mode(fs) == FSCK_FIX_FIXABLE) { fsck_log ("Invalid safe link %k: cannot find the pointed " "object (%K) - safe link was deleted\n", &tmp_ih->ih_key, &key); d32_put((__u32 *)REISERFS_PATH_ITEM(&safe_link_path), 0, 0); reiserfs_tree_pathrelse (&path); reiserfs_tree_delete (fs, &safe_link_path, 0); continue; } } else if (reiserfs_key_get_off(&tmp_ih->ih_key) == 0x1) { /* Truncate */ if (!not_a_directory (REISERFS_PATH_ITEM(&path))) { /*truncate on directory should not happen*/ /*sware on check, delete on fix-fixable*/ if (fsck_mode(fs) == FSCK_CHECK) { fsck_log ("Invalid 'truncate' safe link %k, cannot happen " "for directory (%K)\n", &tmp_ih->ih_key, &key); one_more_corruption (fs, FIXABLE); } else if (fsck_mode(fs) == FSCK_FIX_FIXABLE) { fsck_log ("Invalid 'truncate' safe link %k, cannot happen " "for a directory (%K) - safe link was deleted\n", &tmp_ih->ih_key, &key); d32_put((__u32 *)REISERFS_PATH_ITEM(&safe_link_path), 0, 0); reiserfs_tree_pathrelse (&path); reiserfs_tree_delete (fs, &safe_link_path, 0); continue; } } else { /* save 'safe truncate links' to avoid wrong sizes swaring. */ int position; if (misc_bin_search (&key, trunc_links, links_num, sizeof(key), &position, reiserfs_key_comp2) != 1) { blocklist__insert_in_position(&key, (void *)&trunc_links, &links_num, sizeof(key), &position); } } } reiserfs_tree_pathrelse (&path); reiserfs_tree_pathrelse (&safe_link_path); } return OK; } void release_safe_links () { misc_freemem(trunc_links); } /* called when --check is given */ void fsck_semantic_check (void) { if (fsck_data (fs)->check.bad_nodes) { fsck_progress ("Bad nodes were found, Semantic pass skipped\n"); goto clean; } if (fsck_data (fs)->check.fatal_corruptions) { fsck_progress ("Fatal corruptions were found, Semantic pass skipped\n"); goto clean; } fsck_progress ("Checking Semantic tree...\n"); if (fsck_mode(fs) == FSCK_FIX_FIXABLE) { /*create new_bitmap, and initialize new_bitmap & allocable bitmap*/ fsck_new_bitmap (fs) = reiserfs_bitmap_create(reiserfs_sb_get_blocks(fs->fs_ondisk_sb)); reiserfs_bitmap_copy (fsck_new_bitmap (fs), fs->fs_bitmap2); fsck_allocable_bitmap (fs) = reiserfs_bitmap_create(reiserfs_sb_get_blocks(fs->fs_ondisk_sb)); reiserfs_bitmap_copy (fsck_allocable_bitmap (fs), fs->fs_bitmap2); fs->block_allocator = reiserfsck_new_blocknrs; fs->block_deallocator = reiserfsck_free_block; } check_safe_links (); if (check_semantic_pass (&root_dir_key, &parent_root_dir_key, 0, 0) != OK) { fsck_log ("check_semantic_tree: No root directory found"); one_more_corruption (fs, FATAL); } release_safe_links (); if (fsck_mode(fs) == FSCK_FIX_FIXABLE) { reiserfs_bitmap_delete (fs->fs_bitmap2); reiserfs_bitmap_delta (fsck_new_bitmap (fs), fsck_deallocate_bitmap (fs)); fs->fs_bitmap2 = fsck_new_bitmap (fs); reiserfs_bitmap_delete (fsck_allocable_bitmap (fs)); fsck_allocable_bitmap (fs) = NULL; reiserfs_sb_set_free (fs->fs_ondisk_sb, reiserfs_bitmap_zeros (fs->fs_bitmap2)); reiserfs_buffer_mkdirty (fs->fs_super_bh); reiserfs_badblock_flush(fs, 1); } if (!fsck_quiet(fs)) util_misc_fini_name(fsck_progress_file(fs)); clean: if (fsck_deallocate_bitmap (fs)) reiserfs_bitmap_delete (fsck_deallocate_bitmap (fs)); } reiserfsprogs-3.6.20/utils/fsck/semantic_rebuild.c0000644000175300001440000011560710412227267017177 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/malloc.h" #include "misc/device.h" #include "util/device.h" #include "util/misc.h" #include #define MIN(a, b) (((a)>(b))?(b):(a)) /* *size is "real" file size, sd_size - size from stat data */ int wrong_st_size (const reiserfs_key_t * key, unsigned long long max_file_size, int blocksize, __u64 * size, __u64 sd_size, int type) { if (sd_size <= max_file_size) { if (sd_size == *size) return 0; if (type == TYPE_DIRENTRY) { /* directory size must match to the sum of length of its entries */ fsck_log ("vpf-10650: The directory %K has the wrong size in the StatData " "(%Lu)%s(%Lu)\n", key, sd_size, fsck_mode(fs) == FSCK_CHECK ? ", should be " : " - corrected to ", *size); return 1; } if (sd_size > *size) { /* size in stat data can be bigger than size calculated by items */ if (fsck_adjust_file_size (fs) || type == TYPE_SYMLINK) { /* but it -o is given - fix that */ fsck_log ("vpf-10660: The file %K has too big size in the StatData " "(%Lu)%s(%Lu)\n", key, sd_size, fsck_mode(fs) == FSCK_CHECK ? ", should be " : " - corrected to ", *size); sem_pass_stat (fs)->fixed_sizes ++; return 1; } *size = sd_size; return 0; } if (!(*size % blocksize)) { /* last item is extent */ if (((sd_size & ~(blocksize - 1)) == (*size - blocksize)) && sd_size % blocksize) { /* size in stat data is correct */ *size = sd_size; return 0; } } else { /* last item is a direct one */ if (!(*size % 8)) { if (((sd_size & ~7) == (*size - 8)) && sd_size % 8) { /* size in stat data is correct */ *size = sd_size; return 0; } } } } fsck_log ("vpf-10670: The file %K has the wrong size in the StatData (%Lu)%s(%Lu)\n", key, sd_size, fsck_mode(fs) == FSCK_CHECK ? ", should be " : " - corrected to ", *size); sem_pass_stat (fs)->fixed_sizes ++; return 1; } /* sd_blocks is 32 bit only */ /* old stat data shares sd_block and sd_dev - do not wipe sd_rdev out */ /* we should fix it as following: |------------------------------------------------------------------| | | 3.6 | 3.5 | |---------------------------------------------------| | | | blocks | r_dev|generation | blocks/r_dev | |------------------------------------------------------------------| | fifo, sockets | 0 | generation | 0 | | chr/blk_dev | 0 | maj:min | maj:min | | file, dir, link | blocks | generation | blocks | |------------------------------------------------------------------| */ int wrong_st_blocks (const reiserfs_key_t * key, __u32 * blocks, __u32 sd_blocks, __u16 mode, int new_format) { int ret = 0; if (S_ISREG (mode) || S_ISLNK (mode) || S_ISDIR (mode)) { if ((!S_ISLNK(mode) && *blocks != sd_blocks) || (S_ISLNK(mode) && *blocks != sd_blocks && (MISC_ROUND_UP(*blocks) != sd_blocks))) { fsck_log ("vpf-10680: The %s %K has the wrong block count in the StatData " "(%u)%s(%u)\n", S_ISDIR (mode) ? "directory" : S_ISREG (mode) ? "file" : "link", key, sd_blocks, fsck_mode(fs) == FSCK_CHECK ? ", should be " : " - corrected to ", *blocks); ret = 1; } } else if (new_format || (S_ISFIFO (mode) || S_ISSOCK (mode))) { if (sd_blocks != 0) { fsck_log ("vpf-10690: The object %K has the wrong block count in the StatData " "(%u)%s(%u)\n", key, sd_blocks, fsck_mode(fs) == FSCK_CHECK ? ", should be " : " - corrected to ", 0); *blocks = 0; ret = 1; } } return ret; } /* int wrong_st_rdev (reiserfs_key_t * key, __u32 * sd_rdev, __u16 mode, int new_format) { int ret = 0; if (!new_format) return 0; if (!S_ISCHR (mode) && !S_ISBLK (mode)) { if (*sd_rdev != 0) { fsck_log ("%s %K has wrong sd_rdev %u, has to be 0\n", S_ISDIR (mode) ? "dir" : "file", key, *sd_rdev); *sd_rdev = 0; ret = 1; } } return ret; } */ /* only regular files and symlinks may have items but stat data. Symlink should have body */ int wrong_mode (reiserfs_key_t * key, __u16 * mode, __u64 real_size, int symlink) { int retval = 0; if (S_ISLNK (*mode) && !symlink) { fsck_log ("The file %K (%M) is too big to be the symlink%s regfile\n", key, *mode, fsck_mode(fs) == FSCK_CHECK ? ", should be the" : " - corrected " "to the"); *mode &= ~S_IFMT; *mode |= S_IFREG; retval = 1; } if (misc_device_typec (*mode) != '?') { /* mode looks reasonable */ if (S_ISREG (*mode) || S_ISLNK (*mode)) return retval; /* device, pipe, socket have no items */ if (!real_size) return retval; } /* there are items, so change file mode to regular file. Otherwise - file bodies do not get deleted */ if (fsck_mode(fs) == FSCK_CHECK) { fsck_log ("The object %K has wrong mode (%M)\n", key, *mode); } else { fsck_log("The object %K has wrong mode (%M) - corrected to %M\n", key, *mode, (S_IFREG | 0600)); } *mode = (S_IFREG | 0600); return 1; } /* key is a key of last file item */ int wrong_fdb (reiserfs_key_t * key, int blocksize, __u32 * first_direct_byte, __u32 sd_fdb, __u32 size) { if (!size || reiserfs_key_ext (key)) { /* there is no direct item */ *first_direct_byte = REISERFS_SD_NODIRECT; if (sd_fdb != REISERFS_SD_NODIRECT) { if (fsck_mode(fs) == FSCK_CHECK) { fsck_log ("The file %K: The wrong info about the tail in the StatData, " "first_direct_byte (%d) - should be (%d)\n", key, sd_fdb, *first_direct_byte); } else { fsck_log ("The file %K: The wrong info about the tail in the StatData, " "first_direct_byte (%d) - corrected to (%d)\n", key, sd_fdb, *first_direct_byte); } return 1; } return 0; } /* there is direct item */ *first_direct_byte = (reiserfs_key_get_off (key) & ~(blocksize - 1)) + 1; if (*first_direct_byte != sd_fdb) { if (fsck_mode(fs) == FSCK_CHECK) { fsck_log ("The file %K: The wrong info about the tail in the StatData, " "first_direct_byte (%d) - should be (%d)\n", key, sd_fdb, *first_direct_byte); } else { fsck_log ("The file %K: The wrong info about the tail in the StatData, " "first_direct_byte (%d) - corrected to (%d)\n", key, sd_fdb, *first_direct_byte); } return 1; } return 0; } /* delete all items (but directory ones) with the same key 'ih' has (including stat data of not a directory) and put them back at the other place */ void relocate_dir (reiserfs_ih_t * ih) { const reiserfs_key_t * rkey; reiserfs_ih_t * path_ih; reiserfs_path_t path; __u32 new_objectid; reiserfs_key_t key; saveitem_t * si; int moved; /* starting with the leftmost one - look for all items of file, store them and delete */ key = ih->ih_key; reiserfs_key_set_sec (KEY_FORMAT_1, &key, OFFSET_SD, TYPE_STAT_DATA); si = 0; while (1) { reiserfs_tree_search_item (fs, &key, &path); if (REISERFS_PATH_LEAF_POS (&path) == reiserfs_node_items (REISERFS_PATH_LEAF (&path))) { rkey = reiserfs_tree_rkey (&path, fs); if (rkey && !reiserfs_key_comp2 (&key, rkey)) { /* file continues in the right neighbor */ key = *rkey; reiserfs_tree_pathrelse (&path); continue; } /* there is no more items of a directory */ reiserfs_tree_pathrelse (&path); break; } path_ih = REISERFS_PATH_IH (&path); if (reiserfs_key_comp2 (&key, &(path_ih->ih_key))) { /* there are no more item with this key */ reiserfs_tree_pathrelse (&path); break; } /* ok, item found, but make sure that it is not a directory one */ if ((reiserfs_ih_stat (path_ih) && not_a_directory (REISERFS_PATH_ITEM (&path))) || reiserfs_ih_direct (path_ih) || reiserfs_ih_ext (path_ih)) { /* item of not a directory found. Leave it in the tree. FIXME: should not happen */ key = path_ih->ih_key; reiserfs_key_set_off (KEY_FORMAT_1, &key, reiserfs_key_get_off (&key) + 1); reiserfs_tree_pathrelse (&path); continue; } /* directory stat data ro directory item */ fsck_item_save(&path, &si); reiserfs_tree_delete(fs, &path, 1); } if (!si) { fsck_log ("%s: WARNING: No one item of the directory " "%K found\n", __FUNCTION__, &key); return; } /* get new objectid for relocation or get objectid with which file was relocated already */ new_objectid = fsck_relocate_oid (&ih->ih_key); moved = 0; /* put all items removed back into tree */ while (si) { reiserfs_key_set_oid (&si->si_ih.ih_key, new_objectid); if (reiserfs_key_get_off (&(si->si_ih.ih_key)) == OFFSET_DOT) { /* fix "." entry to point to a directtory properly */ reiserfs_deh_t * deh; deh = (reiserfs_deh_t *)si->si_dnm_data; reiserfs_deh_set_obid (deh, new_objectid); } fsck_tree_insert_item (&(si->si_ih), si->si_dnm_data, 0); si = fsck_item_free(si); moved++; } if (moved) { fsck_log("%s: %d items of dir %K are moved to %u oid\n", __FUNCTION__, moved, &ih->ih_key, new_objectid); } reiserfs_key_set_oid (&ih->ih_key, new_objectid); } /* path is path to stat data. If file will be relocated - new_ih will contain a key file was relocated with */ int rebuild_check_regular_file (reiserfs_path_t * path, void * sd, reiserfs_ih_t * new_ih) { int is_new_file; // reiserfs_key_t sd_key; __u16 mode; __u32 nlink; __u64 real_size, saved_size; __u32 blocks, saved_blocks; /* proper values and value in stat data */ __u32 first_direct_byte, saved_fdb; reiserfs_bh_t * bh; reiserfs_ih_t * ih, sd_ih; int fix_sd; int symlnk = 0; int retval; retval = OK; /* stat data of a file */ ih = REISERFS_PATH_IH (path); bh = REISERFS_PATH_LEAF (path); if (new_ih) { /* this objectid is used already */ *new_ih = *ih; reiserfs_tree_pathrelse (path); fsck_file_relocate (&new_ih->ih_key, 1); fsck_relocate_mklinked(&new_ih->ih_key); sem_pass_stat (fs)->oid_sharing_files_relocated ++; retval = RELOCATED; if (reiserfs_tree_search_item (fs, &(new_ih->ih_key), path) == ITEM_NOT_FOUND) reiserfs_panic ("%s: Could not find the StatData of the relocated file %k", __FUNCTION__, &(new_ih->ih_key)); /* stat data is marked unreachable again due to relocation, fix that */ ih = REISERFS_PATH_IH (path); bh = REISERFS_PATH_LEAF (path); fsck_item_mkreach (ih, bh); sd = REISERFS_PATH_ITEM (path); } id_map_mark(semantic_id_map(fs), reiserfs_key_get_oid (&ih->ih_key)); /* check and set nlink first */ reiserfs_stat_get_nlink (ih, sd, &nlink); nlink ++; reiserfs_stat_set_nlink (ih, sd, &nlink); reiserfs_buffer_mkdirty (bh); if (nlink > 1) return retval; /* firts name of a file found */ if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE) is_new_file = 1; else is_new_file = 0; reiserfs_stat_get_mode (ih, sd, &mode); reiserfs_stat_get_size (ih, sd, &saved_size); reiserfs_stat_get_blocks (ih, sd, &saved_blocks); if (!is_new_file) reiserfs_stat_get_fdb (ih, sd, &saved_fdb); /* we met this file first time */ if (S_ISREG (mode)) { sem_pass_stat(fs)->regular_files ++; } else if (S_ISLNK (mode)) { symlnk = 1; sem_pass_stat (fs)->symlinks ++; } else { sem_pass_stat (fs)->others ++; } sd_ih = *ih; // sd_key = sd_ih.ih_key; reiserfs_tree_pathrelse (path); if (are_file_items_correct (&sd_ih, sd, &real_size, &blocks, 1/*mark reachable*/, &symlnk) != 1) { /* unpassed items will be deleted in pass 4 as they left unaccessed */ fsck_log("%s: some items of %K are left unaccessed.\n", __FUNCTION__, &sd_ih.ih_key); sem_pass_stat (fs)->broken_files ++; } fix_sd = 0; fix_sd += wrong_mode (/*&sd_key, */ &sd_ih.ih_key, &mode, real_size, symlnk); if (!is_new_file) fix_sd += wrong_fdb (&sd_ih.ih_key, fs->fs_blocksize, &first_direct_byte, saved_fdb, real_size); fix_sd += wrong_st_size (/*&sd_key,*/ &sd_ih.ih_key, is_new_file ? REISERFS_SD_SIZE_MAX_V2 : REISERFS_SD_SIZE_MAX_V1, fs->fs_blocksize, &real_size, saved_size, symlnk ? TYPE_SYMLINK : 0); fix_sd += wrong_st_blocks (&sd_ih.ih_key, &blocks, saved_blocks, mode, is_new_file); if (fix_sd) { /* find stat data and correct it */ reiserfs_key_set_sec (KEY_FORMAT_1, &sd_ih.ih_key, OFFSET_SD, TYPE_STAT_DATA); if (reiserfs_tree_search_item (fs, &sd_ih.ih_key, path) != ITEM_FOUND) reiserfs_panic ("%s: The StatData of the file %k could not be found", __FUNCTION__, &sd_ih.ih_key); bh = REISERFS_PATH_LEAF (path); ih = REISERFS_PATH_IH (path); sd = REISERFS_PATH_ITEM (path); reiserfs_stat_set_size (ih, sd, &real_size); reiserfs_stat_set_blocks (ih, sd, &blocks); reiserfs_stat_set_mode (ih, sd, &mode); if (!is_new_file) reiserfs_stat_set_fdb (ih, sd, &first_direct_byte); reiserfs_buffer_mkdirty (bh); } return retval; } static int is_rootdir_key (const reiserfs_key_t * key) { if (reiserfs_key_comp (key, &root_dir_key)) return 0; return 1; } /* returns buffer, containing found directory item.*/ static char * get_next_directory_item (reiserfs_key_t * key, /* on return this will contain key of next item in the tree */ const reiserfs_key_t * parent, reiserfs_ih_t * ih,/*not in tree*/ __u32 * pos_in_item) { const reiserfs_key_t * rdkey; REISERFS_PATH_INIT (path); reiserfs_deh_t * deh; reiserfs_bh_t * bh; char * dir_item; int retval; int i; if ((retval = reiserfs_tree_search_entry (fs, key, &path)) != POSITION_FOUND) reiserfs_panic ("get_next_directory_item: The current directory %k cannot be " "found", key); /* leaf containing directory item */ bh = REISERFS_PATH_LEAF (&path); *pos_in_item = path.pos_in_item; *ih = *REISERFS_PATH_IH (&path); deh = reiserfs_deh (bh, ih); /* make sure, that ".." exists as well */ if (reiserfs_key_get_off (key) == OFFSET_DOT) { if (reiserfs_ih_get_entries (ih) < 2 || reiserfs_direntry_name_len (ih, deh + 1, 1) != 2 || strncmp (reiserfs_deh_name (deh + 1, 1), "..", 2)) { fsck_log ("get_next_directory_item: The entry \"..\" cannot be " "found in %k\n", &ih->ih_key); reiserfs_tree_pathrelse (&path); return 0; } } /* mark hidden entries as visible, set "." and ".." correctly */ deh += *pos_in_item; for (i = *pos_in_item; i < reiserfs_ih_get_entries (ih); i ++, deh ++) { int namelen; char * name; name = reiserfs_deh_name (deh, i); namelen = reiserfs_direntry_name_len (ih, deh, i); if (reiserfs_deh_get_off (deh) == OFFSET_DOT) { if (reiserfs_key_comp2 (&(deh->deh2_dir_id), key)) { /* "." must point to the directory it is in */ //deh->deh_objectid != REISERFS_ROOT_PARENT_OBJECTID)/*????*/ { fsck_log ("get_next_directory_item: The entry \".\" of the " "directory %K points to %K, instead of %K", key, (reiserfs_key_t *)(&(deh->deh2_dir_id)), key); reiserfs_deh_set_did (deh, reiserfs_key_get_did (key)); reiserfs_deh_set_obid (deh, reiserfs_key_get_oid (key)); reiserfs_buffer_mkdirty (bh); fsck_log (" - corrected\n"); } } if (reiserfs_deh_get_off (deh) == OFFSET_DOT_DOT) { /* set ".." so that it points to the correct parent directory */ if (reiserfs_key_comp2 (&(deh->deh2_dir_id), parent)) { fsck_log ("get_next_directory_item: The entry \"..\" of the " "directory %K points to %K, instead of %K", key, (reiserfs_key_t *)(&(deh->deh2_dir_id)), parent); reiserfs_deh_set_did (deh, reiserfs_key_get_did (parent)); reiserfs_deh_set_obid (deh, reiserfs_key_get_oid (parent)); reiserfs_buffer_mkdirty (bh); fsck_log (" - corrected\n"); } } } /* copy directory item to the temporary buffer */ dir_item = misc_getmem (reiserfs_ih_get_len (ih)); memcpy (dir_item, reiserfs_item_by_ih (bh, ih), reiserfs_ih_get_len (ih)); /* next item key */ if ((rdkey = reiserfs_tree_next_key (&path, fs))) reiserfs_key_copy (key, rdkey); else { reiserfs_key_set_did (key, 0); reiserfs_key_set_oid (key, 0); } if (fsck_mode (fs) == FSCK_REBUILD) fsck_item_mkreach (REISERFS_PATH_IH (&path), bh); reiserfs_tree_pathrelse (&path); return dir_item; } // get key of an object pointed by direntry and the key of the entry itself void get_object_key (reiserfs_deh_t * deh, reiserfs_key_t * key, reiserfs_key_t * entry_key, reiserfs_ih_t * ih) { /* entry points to this key */ reiserfs_key_set_did (key, reiserfs_deh_get_did (deh)); reiserfs_key_set_oid (key, reiserfs_deh_get_obid (deh)); reiserfs_key_set_off1 (key, OFFSET_SD); reiserfs_key_set_uni (key, 0); /* key of entry */ reiserfs_key_set_did (entry_key, reiserfs_key_get_did (&ih->ih_key)); reiserfs_key_set_oid (entry_key, reiserfs_key_get_oid (&ih->ih_key)); reiserfs_key_set_off1 (entry_key, reiserfs_deh_get_off (deh)); reiserfs_key_set_uni (entry_key, UNI_DE); } int fix_obviously_wrong_sd_mode (reiserfs_path_t * path) { const reiserfs_key_t * next_key; __u16 mode; int retval = 0; next_key = reiserfs_tree_next_key (path, fs); if (!next_key) return 0; if (reiserfs_key_comp2 (next_key, &REISERFS_PATH_IH(path)->ih_key)) return 0; /* next item exists and of the same file. Fix the SD mode */ if (not_a_directory (REISERFS_PATH_ITEM (path)) && reiserfs_key_dir (next_key)) { /* make SD mode SD of dir */ reiserfs_stat_get_mode (REISERFS_PATH_IH (path), REISERFS_PATH_ITEM (path), &mode); fsck_log ("The directory %K had wrong mode %M", &REISERFS_PATH_IH(path)->ih_key, mode); if (fsck_mode(fs) != FSCK_CHECK) { mode &= ~S_IFMT; mode |= S_IFDIR; fsck_log (" - corrected to %M\n", mode); reiserfs_stat_set_mode (REISERFS_PATH_IH (path), REISERFS_PATH_ITEM (path), &mode); reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF(path)); } else { fsck_log ("\n"); retval = 1; } } else if (!not_a_directory (REISERFS_PATH_ITEM (path)) && !reiserfs_key_dir (next_key)) { /* make SD mode SD of regular file */ reiserfs_stat_get_mode (REISERFS_PATH_IH (path), REISERFS_PATH_ITEM (path), &mode); fsck_log ("The file %K had wrong mode %M", &REISERFS_PATH_IH(path)->ih_key, mode); if (fsck_mode(fs) != FSCK_CHECK) { mode &= ~S_IFMT; mode |= S_IFREG; fsck_log (" - corrected to %M\n", mode); reiserfs_stat_set_mode (REISERFS_PATH_IH (path), REISERFS_PATH_ITEM (path), &mode); reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF(path)); } else { fsck_log ("\n"); retval = 1; } } return retval; } static int is_lost_found (char * name, int namelen) { return (namelen == 10 && !memcmp(name, "lost+found", 10)) ? 1 : 0; } void cb_item_modify (reiserfs_ih_t *ih, void *item) { zero_nlink (ih, item); reiserfs_ih_mkunreach (ih); } /* check recursively the semantic tree. Returns OK if entry points to good object, STAT_DATA_NOT_FOUND if stat data was not found or RELOCATED when file was relocated because its objectid was already marked as used by another file */ int rebuild_semantic_pass (reiserfs_key_t * key, const reiserfs_key_t * parent, int etype, reiserfs_ih_t * new_ih) { reiserfs_path_t path; void * sd; int is_new_dir; __u32 nlink; reiserfs_bh_t * bh; reiserfs_ih_t * ih; int retval, retval1; char * dir_item; __u32 pos_in_item; reiserfs_ih_t tmp_ih; reiserfs_key_t item_key, entry_key, object_key, *found; __u64 dir_size; __u32 blocks; __u64 saved_size; __u32 saved_blocks; int fix_sd; int relocate; int dir_format = 0; __u16 mode; int entry_len; retval = OK; start_again: /* when directory was relocated */ if (!reiserfs_key_stat (key)) reiserfs_panic ("rebuild_semantic_pass: The key %k must " "be key of a StatData", key); /* look for stat data of an object */ if (reiserfs_tree_search_item (fs, key, &path) == ITEM_NOT_FOUND) { if (is_rootdir_key (key)) /* root directory has to exist at this point */ reiserfs_panic ("rebuild_semantic_pass: The root directory " "StatData was not found"); /* If an item of the same object is found, create a stat item. */ found = &REISERFS_PATH_IH(&path)->ih_key; if (!reiserfs_key_comp2(key, found)) { if (reiserfs_key_dir (found) || reiserfs_key_get_off (key) == 1) { sem_pass_stat(fs)->added_sd ++; reiserfs_tree_create_stat (fs, &path, key, cb_item_modify); reiserfs_tree_pathrelse (&path); goto start_again; } } reiserfs_tree_pathrelse (&path); return STAT_DATA_NOT_FOUND; } if ((etype == ET_NAME) && !reiserfs_key_comp2(key, &lost_found_dir_key)) { /* This is not "lost+found" entry that points to "lost+found" object. */ reiserfs_tree_pathrelse (&path); return DIRECTORY_HAS_NO_ITEMS; } /* stat data has been found */ bh = REISERFS_PATH_LEAF (&path); ih = REISERFS_PATH_IH (&path); sd = REISERFS_PATH_ITEM(&path); /* */ reiserfs_stat_get_nlink (ih, sd, &nlink); relocate = 0; if (!nlink) { /* we reached the stat data for the first time */ if (id_map_mark(semantic_id_map(fs), reiserfs_key_get_oid (&ih->ih_key))) { /* calculate number of found files/dirs who are using objectid which is used by another file */ sem_pass_stat (fs)->oid_sharing ++; relocate = 1; } fsck_item_mkreach (ih, bh); } fix_obviously_wrong_sd_mode (&path); if (not_a_directory (sd)) { retval = rebuild_check_regular_file (&path, sd, relocate ? new_ih : 0); reiserfs_tree_pathrelse (&path); return retval; } if (relocate) { if (!new_ih) reiserfs_panic ("rebuild_semantic_pass: Memory is not " "prepared for relocation of %K", &ih->ih_key); *new_ih = *ih; reiserfs_tree_pathrelse (&path); sem_pass_stat (fs)->oid_sharing_dirs_relocated ++; relocate_dir (new_ih); fsck_relocate_mklinked(&new_ih->ih_key); *key = new_ih->ih_key; retval = RELOCATED; goto start_again; } /* it looks like stat data of a directory found */ if (nlink) { /* we saw this directory already */ if (etype != ET_DOT_DOT) { /* this name is not ".." - and hard links are not allowed on directories */ reiserfs_tree_pathrelse (&path); return STAT_DATA_NOT_FOUND; } else { /* ".." found */ nlink ++; reiserfs_stat_set_nlink (ih, sd, &nlink); reiserfs_buffer_mkdirty (bh); reiserfs_tree_pathrelse (&path); return OK; } } /* we see the directory first time */ sem_pass_stat (fs)->directories ++; nlink = 2; if (reiserfs_key_get_oid (key) == REISERFS_ROOT_OBJECTID) nlink ++; reiserfs_stat_set_nlink (ih, sd, &nlink); reiserfs_buffer_mkdirty (bh); if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE) is_new_dir = 1; else is_new_dir = 0; /* { reiserfs_key_t * tmp; // check next item: if it is not a directory item of the same file // therefore sd_mode is corrupted so we just reset it to regular file // mode tmp = reiserfs_tree_next_key (&path); if (tmp && !reiserfs_key_comp2 (tmp, key) && !reiserfs_key_dir (tmp)) { __u16 mode; reiserfs_stat_get_mode (ih, sd, &mode); fsck_log ("file %K had broken mode %M, ", key, mode); mode &= ~S_IFMT; mode |= S_IFREG; fsck_log ("fixed to %M\n", mode); reiserfs_stat_set_mode (ih, sd, &mode); nlink = 0; reiserfs_stat_set_nlink (ih, sd, &nlink); retval = rebuild_check_regular_file (&path, sd, 0); //no relocate reiserfs_tree_pathrelse (&path); return retval; } } */ dir_format = (reiserfs_ih_get_len (REISERFS_PATH_IH (&path)) == REISERFS_SD_SIZE) ? KEY_FORMAT_2 : KEY_FORMAT_1; /* save stat data's size and st_blocks */ reiserfs_stat_get_size (ih, sd, &saved_size); reiserfs_stat_get_blocks (ih, sd, &saved_blocks); reiserfs_stat_get_mode (ih, sd, &mode); /* release path pointing to stat data */ reiserfs_tree_pathrelse (&path); /* make sure that "." and ".." exist */ entry_len = reiserfs_direntry_entry_estimate (".", dir_format); reiserfs_tree_insert_entry (fs, key, ".", entry_len, key, 1 << IH_Unreachable); entry_len = reiserfs_direntry_entry_estimate ("..", dir_format); reiserfs_tree_insert_entry (fs, key, "..", entry_len, parent, 1 << IH_Unreachable); reiserfs_key_set_did (&item_key, reiserfs_key_get_did (key)); reiserfs_key_set_oid (&item_key, reiserfs_key_get_oid (key)); reiserfs_key_set_off1 (&item_key, OFFSET_DOT); reiserfs_key_set_uni (&item_key, UNI_DE); dir_size = 0; while ((dir_item = get_next_directory_item (&item_key, parent, &tmp_ih, &pos_in_item)) != 0) { /* dir_item is copy of the item in separately allocated memory, item_key is a key of next item in the tree */ int i; char name[REISERFS_NAME_MAX]; int namelen, entry_len; reiserfs_deh_t * deh = (reiserfs_deh_t *)dir_item + pos_in_item; for (i = pos_in_item; i < reiserfs_ih_get_entries (&tmp_ih); i ++, deh ++) { reiserfs_ih_t relocated_ih; name[0] = '\0'; namelen = reiserfs_direntry_name_len (&tmp_ih, deh, i); sprintf(name, "%.*s", namelen, reiserfs_deh_name (deh, i)); entry_len = reiserfs_direntry_entry_len (&tmp_ih, deh, i); get_object_key (deh, &object_key, &entry_key, &tmp_ih); if ((dir_format == KEY_FORMAT_2) && (entry_len % 8 != 0)) { /* not alighed directory of new format - delete it */ fsck_log ("Entry %K (\"%.*s\") in the directory %K is not " "formated properly - fixed.\n", (reiserfs_key_t *)&(deh->deh2_dir_id), namelen, name, &tmp_ih.ih_key); reiserfs_tree_delete_entry (fs, &entry_key); entry_len = reiserfs_direntry_entry_estimate (name, dir_format); reiserfs_tree_insert_entry (fs, key, name, entry_len, (reiserfs_key_t *)&(deh->deh2_dir_id), 0); } /* if ((dir_format == KEY_FORMAT_1) && (namelen != entry_len)) { // aligned entry in directory of old format - remove and // insert it back fsck_log ("Entry %K (\"%.*s\") in the directory %K is not " "formated properly - deleted\n", (reiserfs_key_t *)&(deh->deh2_dir_id), namelen, name, &tmp_ih.ih_key); reiserfs_tree_delete_entry (fs, &entry_key); entry_len = reiserfs_direntry_entry_estimate (name, dir_format); reiserfs_tree_insert_entry (fs, key, name, entry_len, (reiserfs_key_t *)&(deh->deh2_dir_id), 0); } */ if (is_dot (name, namelen)) { dir_size += REISERFS_DEH_SIZE + entry_len; continue; } if (!fsck_quiet(fs)) { util_misc_print_name (fsck_progress_file(fs), name, namelen); } if (!reiserfs_hash_correct (&fs->hash, name, namelen, reiserfs_deh_get_off (deh))) { reiserfs_panic ("rebuild_semantic_pass: Hash mismatch " "detected for (\"%.*s\") in directory %K\n", namelen, name, &tmp_ih.ih_key); } retval1 = rebuild_semantic_pass (&object_key, key, is_dot_dot (name, namelen) ? ET_DOT_DOT : reiserfs_key_get_oid (key) == REISERFS_ROOT_OBJECTID && is_lost_found (name, namelen) ? ET_LOST_FOUND : 0, &relocated_ih); if (!fsck_quiet(fs)) { util_misc_erase_name (fsck_progress_file(fs), namelen); } switch (retval1) { case OK: dir_size += REISERFS_DEH_SIZE + entry_len; break; case STAT_DATA_NOT_FOUND: case DIRECTORY_HAS_NO_ITEMS: if (reiserfs_key_get_off (&entry_key) == OFFSET_DOT_DOT && reiserfs_key_get_oid (&object_key) == REISERFS_ROOT_PARENT_OBJECTID) { /* ".." of root directory can not be found */ dir_size += REISERFS_DEH_SIZE + entry_len; continue; } fsck_log ("%s: The entry %K (\"%.*s\") in directory %K " "points to nowhere - is removed\n", __FUNCTION__, &object_key, namelen, name, &tmp_ih.ih_key); reiserfs_tree_delete_entry (fs, &entry_key); sem_pass_stat (fs)->deleted_entries ++; break; case RELOCATED: /* file was relocated, update key in directory entry */ if (reiserfs_tree_search_entry (fs, &entry_key, &path) != POSITION_FOUND) { fsck_log ("WARNING: Cannot find the name of the relocated " "file %K in the directory %K\n", &object_key, &tmp_ih.ih_key); } else { /* update key dir entry points to */ reiserfs_deh_t * tmp_deh; tmp_deh = reiserfs_deh (REISERFS_PATH_LEAF (&path), REISERFS_PATH_IH (&path)) + path.pos_in_item; fsck_log ("The entry %K (\"%.*s\") in directory %K " "updated to point to ", &object_key, namelen, name, &tmp_ih.ih_key); reiserfs_deh_set_did (tmp_deh, reiserfs_key_get_did (&relocated_ih.ih_key)); reiserfs_deh_set_obid (tmp_deh, reiserfs_key_get_oid (&relocated_ih.ih_key)); fsck_log ("%K\n", &tmp_deh->deh2_dir_id); reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (&path)); } dir_size += REISERFS_DEH_SIZE + entry_len; reiserfs_tree_pathrelse (&path); break; } } /* for */ misc_freemem (dir_item); if (reiserfs_key_comp2 (&item_key, key) || !reiserfs_key_dir(&item_key)) /* next key is not of this directory */ break; } /* while (dir_item) */ if (dir_size == 0) /* FIXME: is it possible? */ return DIRECTORY_HAS_NO_ITEMS; /* calc correct value of sd_blocks field of stat data */ blocks = REISERFS_DIR_BLOCKS (dir_size); fix_sd = 0; fix_sd += wrong_st_blocks (key, &blocks, saved_blocks, mode, is_new_dir); fix_sd += wrong_st_size (key, is_new_dir ? REISERFS_SD_SIZE_MAX_V2 : REISERFS_SD_SIZE_MAX_V1, fs->fs_blocksize, &dir_size, saved_size, TYPE_DIRENTRY); if (fix_sd) { /* we have to fix either sd_size or sd_blocks, so look for SD again */ if (reiserfs_tree_search_item (fs, key, &path) != ITEM_FOUND) reiserfs_panic ("rebuild_semantic_pass: The StatData of the " "file %K was not found", key); bh = REISERFS_PATH_LEAF (&path); ih = REISERFS_PATH_IH (&path); sd = REISERFS_PATH_ITEM (&path); reiserfs_stat_set_size (ih, sd, &dir_size); reiserfs_stat_set_blocks (ih, sd, &blocks); reiserfs_buffer_mkdirty (bh); reiserfs_tree_pathrelse (&path); } return retval; } int is_dot (char * name, int namelen) { return (namelen == 1 && name[0] == '.') ? 1 : 0; } int is_dot_dot (char * name, int namelen) { return (namelen == 2 && name[0] == '.' && name[1] == '.') ? 1 : 0; } int not_a_directory (void * sd) { /* mode is at the same place and of the same size in both stat datas (v1 and v2) */ reiserfs_sd_v1_t * sd_v1 = sd; return !(S_ISDIR (le16_to_cpu (sd_v1->sd_mode))); } int not_a_regfile (void * sd) { /* mode is at the same place and of the same size in both stat datas (v1 and v2) */ reiserfs_sd_v1_t * sd_v1 = sd; return !(S_ISREG (le16_to_cpu (sd_v1->sd_mode))); } void zero_nlink (reiserfs_ih_t * ih, void * sd) { int zero = 0; if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE_V1 && reiserfs_ih_get_format (ih) != KEY_FORMAT_1) { fsck_log ("zero_nlink: The StatData %k of the wrong format version " "(%d) - corrected to (%d)\n", ih, reiserfs_ih_get_format (ih), KEY_FORMAT_1); reiserfs_ih_set_format (ih, KEY_FORMAT_1); } if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE && reiserfs_ih_get_format (ih) != KEY_FORMAT_2) { fsck_log ("zero_nlink: The StatData %k of the wrong format version " "(%d) - corrected to (%d)\n", ih, reiserfs_ih_get_format (ih), KEY_FORMAT_2); reiserfs_ih_set_format (ih, KEY_FORMAT_2); } reiserfs_stat_set_nlink (ih, sd, &zero); } /* mkreiserfs should have created this */ static void make_sure_lost_found_exists (reiserfs_filsys_t * fs, __u16 root_format) { int retval; REISERFS_PATH_INIT (path); unsigned int gen_counter; __u32 objectid; __u64 sd_size; __u32 sd_blocks; reiserfs_bh_t * bh; reiserfs_ih_t * ih; void * sd; int item_len; int entry_len; /* look for "lost+found" in the root directory */ retval = reiserfs_tree_search_name (fs, &root_dir_key, "lost+found", &gen_counter, &lost_found_dir_key); if (!retval) { objectid = id_map_alloc(proper_id_map(fs)); if (!objectid) { fsck_progress ("Could not allocate an objectid for '/lost+found'", "lost files will not be linked\n"); return; } reiserfs_key_set_did (&lost_found_dir_key, REISERFS_ROOT_OBJECTID); reiserfs_key_set_oid (&lost_found_dir_key, objectid); } /* look for stat data of "lost+found" */ retval = reiserfs_tree_search_item (fs, &lost_found_dir_key, &path); if (retval == ITEM_NOT_FOUND) { fs->lost_format = reiserfs_tree_create_stat (fs, &path, &lost_found_dir_key, cb_item_modify); } else { reiserfs_ih_t * ih = REISERFS_PATH_IH (&path); if (!reiserfs_ih_stat (ih)) reiserfs_panic ("It must be lost+found's stat data %k\n", &ih->ih_key); fix_obviously_wrong_sd_mode (&path); if (not_a_directory (REISERFS_PATH_ITEM (&path))) { fsck_progress ("\"/lost+found\" exists, but it is not a " "directory, lost files will not be linked\n"); reiserfs_key_set_oid (&lost_found_dir_key, 0); reiserfs_tree_pathrelse (&path); return; } fs->lost_format = (reiserfs_ih_get_len (REISERFS_PATH_IH (&path)) == REISERFS_SD_SIZE) ? KEY_FORMAT_2 : KEY_FORMAT_1; reiserfs_tree_pathrelse (&path); } /* add "." and ".." if any of them do not exist */ entry_len = reiserfs_direntry_entry_estimate (".", fs->lost_format); reiserfs_tree_insert_entry (fs, &lost_found_dir_key, ".", entry_len, &lost_found_dir_key, 1 << IH_Unreachable); entry_len = reiserfs_direntry_entry_estimate ("..", fs->lost_format); reiserfs_tree_insert_entry (fs, &lost_found_dir_key, "..", entry_len, &root_dir_key, 1 << IH_Unreachable); entry_len = reiserfs_direntry_entry_estimate ("lost+found", root_format); item_len = reiserfs_tree_insert_entry (fs, &root_dir_key, "lost+found", entry_len, &lost_found_dir_key, 1 << IH_Unreachable); if (item_len) { if (reiserfs_tree_search_item (fs, &root_dir_key, &path) == ITEM_NOT_FOUND) { reiserfs_panic ("%s: StatData of the root directory must exists", __FUNCTION__); } bh = REISERFS_PATH_LEAF (&path); ih = REISERFS_PATH_IH (&path); sd = REISERFS_PATH_ITEM(&path); reiserfs_stat_get_size (ih, sd, &sd_size); sd_size += item_len; reiserfs_stat_set_size (ih, sd, &sd_size); sd_blocks = REISERFS_DIR_BLOCKS (sd_size); reiserfs_stat_set_blocks (ih, sd, &sd_blocks); reiserfs_buffer_mkdirty (bh); reiserfs_tree_pathrelse (&path); } return; } /* Result of the rebuild pass will be saved in the state file which is needed to start fsck again from the next pass. */ static void fsck_semantic_save_result (reiserfs_filsys_t * fs) { FILE * file; int retval; file = util_file_open ("temp_fsck_file.deleteme", "w+"); if (!file) return; fsck_stage_start_put (file, SEMANTIC_DONE); reiserfs_objectid_map_save (file, semantic_id_map (fs)); fsck_stage_end_put (file); fclose (file); retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs)); if (retval != 0) { fsck_progress ("%s: Could not rename the temporary file " "temp_fsck_file.deleteme to %s", __FUNCTION__, state_dump_file (fs)); } } /* we have nothing to load from a state file, but we have to fetch on-disk bitmap, copy it to allocable bitmap, and fetch objectid map */ void fsck_semantic_load_result (FILE * file, reiserfs_filsys_t * fs) { unsigned int gen_counter; REISERFS_PATH_INIT(path); fsck_new_bitmap (fs) = reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb)); reiserfs_bitmap_copy (fsck_new_bitmap (fs), fs->fs_bitmap2); fsck_allocable_bitmap (fs) = reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb)); reiserfs_bitmap_copy (fsck_allocable_bitmap (fs), fs->fs_bitmap2); fs->block_allocator = reiserfsck_new_blocknrs; fs->block_deallocator = reiserfsck_free_block; /* we need objectid map on semantic pass to be able to relocate files */ proper_id_map (fs) = id_map_init(); fetch_objectid_map (proper_id_map (fs), fs); semantic_id_map (fs) = reiserfs_objectid_map_load (file); /* get the lost_found key. */ if (!(reiserfs_tree_search_name (fs, &root_dir_key, "lost+found", &gen_counter, &lost_found_dir_key))) { reiserfs_panic("Lost&found entry cannot be found in the root dir."); } if (reiserfs_tree_search_item (fs, &lost_found_dir_key, &path) == ITEM_NOT_FOUND) { reiserfs_panic("Lost&found StatData item cannot be found."); } fs->lost_format = (reiserfs_ih_get_len (REISERFS_PATH_IH (&path)) == REISERFS_SD_SIZE) ? KEY_FORMAT_2 : KEY_FORMAT_1; reiserfs_tree_pathrelse (&path); } static void before_pass_3 (reiserfs_filsys_t * fs) { semantic_id_map (fs) = id_map_init(); } static void after_pass_3 (reiserfs_filsys_t * fs) { /* update super block: objectid map, fsck state */ reiserfs_sb_set_state (fs->fs_ondisk_sb, SEMANTIC_DONE); reiserfs_buffer_mkdirty (fs->fs_super_bh); /* write all dirty blocks */ fsck_progress ("Flushing.."); id_map_flush(proper_id_map (fs), fs); fs->fs_dirt = 1; reiserfs_bitmap_flush (fsck_new_bitmap(fs), fs); reiserfs_fs_flush (fs); fsck_progress ("finished\n"); fsck_stage_report (FS_SEMANTIC, fs); if (!fsck_run_one_step (fs)) { if (fsck_info_ask (fs, "Continue? (Yes):", "Yes\n", 1)) /* reiserfsck continues */ return; } fsck_semantic_save_result (fs); id_map_free(proper_id_map (fs)); proper_id_map (fs) = 0; fs->fs_dirt = 1; reiserfs_fs_close (fs); exit(0); } /* this is part of rebuild tree */ void fsck_semantic (reiserfs_filsys_t * fs) { __u16 root_format; before_pass_3 (fs); fsck_progress ("Pass 3 (semantic):\n"); /* when warnings go not to stderr - separate them in the log */ if (fsck_log_file (fs) != stderr) fsck_log ("####### Pass 3 #########\n"); if (!fs->hash) reiserfs_panic ("Hash function should be selected already"); root_format = reiserfs_tree_root (fs, cb_item_modify, 1 << IH_Unreachable); make_sure_lost_found_exists (fs, root_format); id_map_mark(proper_id_map(fs), reiserfs_key_get_oid(&root_dir_key)); id_map_mark(proper_id_map(fs), reiserfs_key_get_oid(&lost_found_dir_key)); /* link all relocated files into /lost+found directory */ fsck_relocate_link_all(); rebuild_semantic_pass ((reiserfs_key_t *)&root_dir_key, &parent_root_dir_key, ET_NAME, 0/*reloc_ih*/); if (!fsck_quiet(fs)) util_misc_fini_name(fsck_progress_file(fs)); reiserfs_badblock_flush(fs, 1); after_pass_3 (fs); } reiserfsprogs-3.6.20/utils/fsck/stage.c0000644000175300001440000000267110412227267014765 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include #define FSCK_DUMP_START_MAGIC 374033 #define FSCK_DUMP_END_MAGIC 7786470 void fsck_stage_start_put (FILE * file, unsigned long stage) { __u32 v = FSCK_DUMP_START_MAGIC; fwrite (&v, 4, 1, file); fwrite (&stage, 4, 1, file); } void fsck_stage_end_put (FILE * file) { __u32 v = FSCK_DUMP_END_MAGIC; fwrite (&v, 4, 1, file); } /*return last passed stage*/ int fsck_stage_magic_check (FILE * fp) { __u32 v; if (fseek (fp, -4, SEEK_END)) { reiserfs_warning (stderr, "%s: fseek failed: %s\n", __FUNCTION__, strerror(errno)); return -1; } fread (&v, 4, 1, fp); if (v != FSCK_DUMP_END_MAGIC) { reiserfs_warning (stderr, "%s: no magic found\n", __FUNCTION__); return -1; } if (fseek (fp, 0, SEEK_SET)) { reiserfs_warning (stderr, "%s: fseek failed: %s\n", __FUNCTION__, strerror(errno)); return -1; } fread (&v, 4, 1, fp); if (v != FSCK_DUMP_START_MAGIC) { reiserfs_warning (stderr, "%s: no magic found\n", __FUNCTION__); return -1; } fread (&v, 4, 1, fp); if (v != PASS_0_DONE && v != PASS_1_DONE && v != TREE_IS_BUILT && v != SEMANTIC_DONE && v != LOST_FOUND_DONE) { reiserfs_warning (stderr, "%s: wrong pass found", __FUNCTION__); return -1; } return (__u16)v; } reiserfsprogs-3.6.20/utils/fsck/super.c0000644000175300001440000010001510412227267015007 00000000000000/* * Copyright 2001-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/malloc.h" #include "misc/device.h" #include "util/print.h" #include #include #include #include #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) # include #endif #define fsck_conditional_log(sb_found, fmt, list...) { \ if (sb_found) \ fsck_log(fmt, ## list); \ } int what_fs_version () { char answer[256]; int version; printf("\nwhat the version of ReiserFS do you use[1-4]\n" "\t(1) 3.6.x\n" "\t(2) >=3.5.9 (introduced in the middle of 1999) (if you use linux 2.2, choose this one)\n" "\t(3) < 3.5.9 converted to new format (don't choose if unsure)\n" "\t(4) < 3.5.9 (this is very old format, don't choose if unsure)\n" "\t(X) exit\n"); fgets(answer, sizeof(answer), stdin); version = atoi (answer); if (version < 1 || version > 4) misc_die ("rebuild_sb: wrong version"); return version; } /* #define super_error(exit_code, text) { \ fsck_log(text); \ return exit_code; \ } int check_sb (reiserfs_filsys_t * fs) { int magic = 0, version = 0; if (!reiserfs_fs_blksize_check (fs->fs_blocksize)) super_error(-1, "Wrong blocksize found in the super block\n"); if (reiserfs_super_36_magic (sb)) magic = 2; else if (reiserfs_super_35_magic (sb)) magic = 1; else if (reiserfs_super_jr_magic (sb)) magic = 3; else super_error(-1, "Invalid magic found in the super block.\n"); if (magic == 1 || magic == 2) { if (fsck_data (fs)->journal_dev_name) fsck_log("Reiserfs with standard journal found, but there was specified a " "journal dev\n"); standard_journal = 1; } else { if (!fsck_data (fs)->journal_dev_name) super_error(-1, "Reiserfs with non standard journal found, but there was not " "specified any journal dev\n"); standard_journal = 0; } if (reiserfs_sb_get_version (sb) != REISERFS_FORMAT_3_6 && reiserfs_sb_get_version (sb) != REISERFS_FORMAT_3_5) super_error(-1, "Invalid format found in the super block.\n"); if (reiserfs_new_location(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) { if (magic == 3) version = reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_6 ? 1 : 2; else version = magic == 2 ? 1 : 2; } else if (reiserfs_old_location(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) { if (magic == 3) version = reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_6 ? 3 : 4; else version = magic == 2 ? 3 : 4; } else misc_die("Super block in the wong block(%d).\n", fs->fs_super_bh->b_blocknr); if (version == 0) misc_die ("FS format must be figured out here.\n"); if (reiserfs_sb_get_blocks (sb) > misc_device_count_blocks (filename, fs->fs_blocksize)) super_error(-1, "Invalid block count found in the super block.\n"); if (reiserfs_sb_get_blksize (sb) != fs->fs_blocksize) super_error(-1, "Invalid block size found in the super block (%lu).\n", reiserfs_sb_get_blksize (sb)); //Non needed from here p_oid_maxsize = (fs->fs_blocksize - reiserfs_super_size (sb)) / sizeof(__u32) / 2 * 2; if (reiserfs_sb_get_mapmax (sb) != p_oid_maxsize) super_error(-1, "Invalid objectid map max size found in the super block (%lu).\n", reiserfs_sb_get_mapmax (sb)); if (reiserfs_sb_get_mapcur (sb) == 1 || reiserfs_sb_get_mapcur (sb) > reiserfs_sb_get_mapmax (sb)) super_error(-1, "Invalid objectid map found in the super block (%lu).\n", reiserfs_sb_get_mapcur (sb)); if (reiserfs_sb_get_root (sb) > block_count && reiserfs_sb_get_root (sb) != ~0) fsck_log("Invalid root block found in the super block (%lu).\n", reiserfs_sb_get_root (sb)); if (reiserfs_sb_get_free (sb) > block_count) fsck_log ("Invalid free block count found in the super block (%lu).\n", reiserfs_sb_get_free (sb)); if (reiserfs_sb_get_height (sb) && ((reiserfs_sb_get_height (sb) < LEAF_LEVEL + 1) || (reiserfs_sb_get_height (sb) > REISERFS_TREE_HEIGHT_MAX) && (reiserfs_sb_get_height (sb) != ~0))) super_error(-1, "Invalid tree height found in the super block (%lu).\n", reiserfs_sb_get_height (sb)); if (reiserfs_sb_get_hash (sb) && reiserfs_hash_name (reiserfs_sb_get_hash (sb)) == 0) super_error(-1, "Invalid hash found in the super block (%lu).\n", reiserfs_sb_get_hash (sb)); if (version == 1 || version == 3) { if (!uuid_is_correct(sb->s_uuid)) fsck_log ("Invalid uuid found, you should generate a new one.\n"); if (sb->s_flags & 0xfffffffe) fsck_log ("rebuild-sb: super block flags found (%u), zeroed\n", sb->s_flags); } //Not needed till here. p_bmap_nr = (block_count + (fs->fs_blocksize * 8 - 1)) / (fs->fs_blocksize * 8); if (reiserfs_sb_get_bmaps (sb) != p_bmap_nr) super_error(-1, "Invalid bitmap number found in the super block (%lu).\n", reiserfs_sb_get_bmaps (sb)); if (!fsck_skip_journal (fs) && standard_journal == 1) { if (reiserfs_jp_get_dev (reiserfs_sb_jp(sb)) != 0) super_error(-1, "Invalid journal device found (%lu).\n", reiserfs_jp_get_dev (reiserfs_sb_jp(sb))); if (reiserfs_jp_get_start (reiserfs_sb_jp(sb)) != reiserfs_journal_start_must (fs)) super_error(-1, "Invalid journal first block found (%lu).\n", reiserfs_jp_get_start (reiserfs_sb_jp(sb))); if (reiserfs_jp_get_size (reiserfs_sb_jp(sb)) != reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) super_error(-1, "Invalid journal size found (%lu).\n", reiserfs_jp_get_size (reiserfs_sb_jp(sb)) + 1); if (reiserfs_jp_get_max_batch (reiserfs_sb_jp(sb)) != reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)))) { fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal max batch size occured (%lu), fixed (%d)\n", reiserfs_jp_get_max_batch (reiserfs_sb_jp(sb)), reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)))); reiserfs_jp_set_max_batch (reiserfs_sb_jp(sb), reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)))); } if (reiserfs_jp_get_commit_age (reiserfs_sb_jp(sb)) != reiserfs_journal_commit_age()) { fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal max commit age occured (%lu), fixed (%d)\n", reiserfs_jp_get_commit_age (reiserfs_sb_jp(sb)), reiserfs_journal_commit_age()); reiserfs_jp_set_commit_age (reiserfs_sb_jp(sb), reiserfs_journal_commit_age()); } if (reiserfs_jp_get_trans_age (reiserfs_sb_jp(sb)) != reiserfs_journal_trans_age()) { fsck_log ("rebuild-sb: wrong journal max commit age occured (%lu), fixed (0)\n", reiserfs_jp_get_trans_age (reiserfs_sb_jp(sb)), reiserfs_journal_trans_age()); reiserfs_jp_set_trans_age (reiserfs_sb_jp(sb), reiserfs_journal_trans_age()); } } */ void rebuild_sb (reiserfs_filsys_t * fs, char * filename, struct fsck_data * data) { struct reiserfs_journal_header *j_head; __u32 p_jp_journal_1st_block = 0; int retval, exit_code = EXIT_OK; reiserfs_sb_t * ondisk_sb = 0; unsigned long block_count = 0; char * journal_dev_name = 0; int standard_journal = -1; int magic_was_found = 0; __u32 p_jp_dev_size = 0; reiserfs_sb_t * sb = 0; struct stat stat_buf; __u16 p_oid_maxsize; char answer[256]; __u32 p_bmap_nr; int version = 0; int sb_size; char * tmp; #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) char uuid[37]; uuid[36] = '\0'; #endif if (fs != NULL) { sb = misc_getmem (sizeof (*sb)); if (!reiserfs_fs_rw (fs)) { close (fs->fs_dev); fs->fs_dev = open (fs->fs_file_name, O_RDWR #ifdef O_LARGEFILE | O_LARGEFILE #endif ); } if (!reiserfs_fs_blksize_check (fs->fs_blocksize)) { printf("\nCannot find a proper blocksize, enter block size [4096]: \n"); fgets(answer, sizeof(answer), stdin); if (strcmp(answer, "\n")) { retval = (int) strtol (answer, &tmp, 0); if ((*tmp && strcmp(tmp, "\n")) || retval < 0) reiserfs_exit (EXIT_USER, "rebuild_sb: wrong block size specified\n"); if (!reiserfs_fs_blksize_check (retval)) reiserfs_exit (EXIT_USER, "rebuild_sb: wrong block size specified, " "only power of 2 from 512-8192 interval are supported.\n"); } else retval = 4096; fs->fs_blocksize = retval; } if (!(block_count = misc_device_count_blocks (filename, fs->fs_blocksize))) exit(EXIT_OPER); /* save ondisk_sb somewhere and work in temp area */ ondisk_sb = fs->fs_ondisk_sb; memcpy (sb, fs->fs_ondisk_sb, sizeof (*sb)); fs->fs_ondisk_sb = sb; if (reiserfs_super_36_magic (sb)) { /* 3_6 magic */ if (fsck_data (fs)->journal_dev_name) /* journal dev must not be specified with standard journal */ reiserfs_exit (EXIT_USER, "ReiserFS with default journal " "is found, but there was specified a journal device."); if (fs->fs_super_bh->b_blocknr == REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) version = 1; else if (fs->fs_super_bh->b_blocknr == REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) version = 3; magic_was_found = 2; } else if (reiserfs_super_35_magic (sb)) { if (fsck_data (fs)->journal_dev_name) /* journal dev must not be specified with standard journal */ reiserfs_exit (EXIT_USER, "ReiserFS with default journal " "is found, but there was specified a journal device."); /* 3_5 magic */ if (fs->fs_super_bh->b_blocknr == REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) version = 2; else if (fs->fs_super_bh->b_blocknr == REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) version = 4; magic_was_found = 1; } else if (reiserfs_super_jr_magic (sb)) { if (reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_6) { /*non-standard magic + sb_format == 3_6*/ if (fs->fs_super_bh->b_blocknr == REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) version = 1; else if (fs->fs_super_bh->b_blocknr == REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) version = 3; magic_was_found = 3; } else if (reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_5) { /* non-standard magic + sb_format == 3_5 */ if (fs->fs_super_bh->b_blocknr == REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) version = 2; else if (fs->fs_super_bh->b_blocknr == REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) version = 4; magic_was_found = 3; } else { /* non-standard magic + bad sb_format */ version = 0; magic_was_found = 3; } } else reiserfs_exit (EXIT_USER, "We opened device but there is no magic " "and there is no correct superblock format found."); if (magic_was_found == 1 || magic_was_found == 2) standard_journal = 1; else standard_journal = 0; if (version == 0) version = what_fs_version (); if (reiserfs_sb_get_blocks (sb) != block_count) { do { printf("\nDid you use resizer(y/n)[n]: "); fgets(answer, sizeof(answer), stdin); } while(strcmp ("y\n", answer) && strcmp ("n\n", answer) && strcmp ("\n", answer)); if (!strcmp ("y\n", answer)) { printf("\nEnter partition size [%lu]: ", block_count); fgets(answer, sizeof(answer), stdin); if (strcmp ("\n", answer)) block_count = atoi (answer); } else { fsck_conditional_log (magic_was_found, "rebuild-sb: wrong block count " "occured (%lu), fixed (%lu)\n", reiserfs_sb_get_blocks(sb), block_count); } reiserfs_sb_set_blocks (sb, block_count); } if (reiserfs_sb_get_blksize (sb) != fs->fs_blocksize) { fsck_log("rebuild-sb: wrong block size occured (%lu), fixed (%lu)\n", reiserfs_sb_get_blksize (sb), fs->fs_blocksize); reiserfs_sb_set_blksize (sb, fs->fs_blocksize); } } /* if no reiserfs_found or bad data found in that SB, what was checked in previous * clause */ if (fs == NULL) { int fd; fd = open (filename, O_RDWR #ifdef O_LARGEFILE | O_LARGEFILE #endif ); if (fd == -1) { reiserfs_exit (EXIT_OPER, "rebuils_sb: cannot open device %s", filename); } version = what_fs_version (); if (version == 3 || version == 4) { retval = 4096; } else { printf("\nEnter block size [4096]: \n"); fgets(answer, sizeof(answer), stdin); if (strcmp(answer, "\n")) { retval = (int) strtol (answer, &tmp, 0); if ((*tmp && strcmp(tmp, "\n")) || retval < 0) reiserfs_exit (EXIT_USER, "rebuild_sb: wrong block size specified\n"); if (!reiserfs_fs_blksize_check (retval)) reiserfs_exit (EXIT_USER, "rebuild_sb: wrong block size specified, " "only divisible by 1024 are supported currently\n"); } else retval = 4096; } if (!(block_count = misc_device_count_blocks (filename, retval))) exit(EXIT_OPER); switch(version){ case 1: fs = reiserfs_fs_create (filename, REISERFS_FORMAT_3_6, block_count, retval, 1, 1); break; case 2: fs = reiserfs_fs_create (filename, REISERFS_FORMAT_3_5, block_count, retval, 1, 1); break; case 3: fs = reiserfs_fs_create (filename, REISERFS_FORMAT_3_6, block_count, retval, 1, 0); break; case 4: fs = reiserfs_fs_create (filename, REISERFS_FORMAT_3_5, block_count, retval, 1, 0); break; } if (fs == NULL) return; sb = fs->fs_ondisk_sb; fs->fs_vp = data; if (!fsck_skip_journal (fs)) { if (!fsck_data (fs)->journal_dev_name) { do { printf("\nNo journal device was specified. (If journal is not " "available, re-run with --no-journal-available option specified).\n" "Is journal default? (y/n)[y]: "); fgets(answer, sizeof(answer), stdin); } while(strcmp ("y\n", answer) && strcmp ("n\n", answer) && strcmp ("\n", answer)); if (!strcmp ("n\n", answer)) { printf("\nSpecify journal device with -j option.\n"); exit(EXIT_USER); } standard_journal = 1; } else { standard_journal = 0; memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_JR_SUPER_MAGIC_STRING, strlen (REISERFS_JR_SUPER_MAGIC_STRING)); } } do { printf("\nDid you use resizer(y/n)[n]: "); fgets(answer, sizeof(answer), stdin); } while (strcmp ("y\n", answer) && strcmp ("n\n", answer) && strcmp ("\n", answer)); if (!strcmp ("y\n", answer)) { printf("\nEnter partition size [%lu]: ", block_count); fgets(answer, sizeof(answer), stdin); if (strcmp ("\n", answer)) block_count = atoi (answer); reiserfs_sb_set_blocks (sb, block_count); } reiserfs_sb_set_state (sb, FS_ERROR); } if (version == 1 || version == 3) { if (reiserfs_super_format (sb) != REISERFS_FORMAT_3_6) { fsck_log("rebuild-sb: wrong reiserfs version occured (%lu), fixed (%lu)\n", reiserfs_super_format (sb), REISERFS_FORMAT_3_6); reiserfs_sb_set_version (sb, REISERFS_FORMAT_3_6); } } else if (version == 2 || version == 4) { if (reiserfs_super_format (sb) != REISERFS_FORMAT_3_5) { fsck_log("rebuild-sb: wrong reiserfs version occured (%lu), fixed (%lu)\n", reiserfs_super_format (sb), REISERFS_FORMAT_3_5); reiserfs_sb_set_version (sb, REISERFS_FORMAT_3_5); } } p_oid_maxsize = (fs->fs_blocksize - reiserfs_super_size (sb)) / sizeof(__u32) / 2 * 2; if (reiserfs_sb_get_mapmax (sb) != p_oid_maxsize) { fsck_log("rebuild-sb: wrong objectid map max size occured (%lu), fixed (%lu)\n", reiserfs_sb_get_mapmax (sb), p_oid_maxsize); reiserfs_sb_set_mapmax (sb, p_oid_maxsize); } p_bmap_nr = reiserfs_bmap_nr(block_count, fs->fs_blocksize); p_bmap_nr = reiserfs_bmap_over(p_bmap_nr) ? 0 : p_bmap_nr; if (reiserfs_sb_get_bmaps (sb) != p_bmap_nr) { fsck_log("rebuild-sb: wrong bitmap number occured (%lu), fixed (%lu)\n", reiserfs_sb_get_bmaps (sb), p_bmap_nr); reiserfs_sb_set_bmaps (sb, (__u16)p_bmap_nr); } if (reiserfs_sb_get_root (sb) > block_count) { fsck_log("rebuild-sb: wrong root block occured (%lu), zeroed\n", reiserfs_sb_get_root (sb)); reiserfs_sb_set_root (sb, 0); } if (reiserfs_sb_get_free (sb) > block_count) { fsck_log ("rebuild-sb: wrong free block count occured (%lu), zeroed\n", reiserfs_sb_get_free (sb)); reiserfs_sb_set_free (sb, 0); } if (reiserfs_sb_get_umount (sb) != FS_CLEANLY_UMOUNTED && reiserfs_sb_get_umount (sb) != FS_NOT_CLEANLY_UMOUNTED) { fsck_conditional_log (magic_was_found, "rebuild-sb: wrong umount state (%u), " "fixed to (FS_NOT_CLEANLY_UMOUNTED)\n", reiserfs_sb_get_umount (sb)); reiserfs_sb_set_umount (sb, FS_NOT_CLEANLY_UMOUNTED); } if (reiserfs_sb_get_mapcur (sb) == 1 || reiserfs_sb_get_mapcur (sb) > reiserfs_sb_get_mapmax (sb)) { fsck_log("rebuild-sb: wrong objectid map occured (%lu), zeroed\n", reiserfs_sb_get_mapcur (sb)); reiserfs_sb_set_mapcur (sb, 0); } if ( reiserfs_sb_get_height (sb) && ((reiserfs_sb_get_height (sb) < LEAF_LEVEL + 1) || (reiserfs_sb_get_height (sb) > REISERFS_TREE_HEIGHT_MAX)) ) { fsck_log("rebuild-sb: wrong tree height occured (%u), zeroed\n", reiserfs_sb_get_height (sb)); reiserfs_sb_set_height (sb, 0); } if (reiserfs_sb_get_hash (sb) && reiserfs_hash_name (reiserfs_sb_get_hash (sb)) == 0) { fsck_log("rebuild-sb: wrong hash occured (%lu), zeroed\n", reiserfs_sb_get_hash (sb)); reiserfs_sb_set_hash (sb, 0); } if (version == 1 || version == 3) { #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) if (uuid_is_null(sb->s_uuid)) { uuid_generate(sb->s_uuid); fsck_log ("rebuild-sb: no uuid found, a new uuid was " "generated (%U)\n", sb->s_uuid); } #endif if (sb->s_flags != 0 && sb->s_flags != 1) { fsck_log ("rebuild-sb: super block flags found (%u), zeroed\n", sb->s_flags); sb->s_flags = 0; } } /* if we have a standard journal reserved = 0 dev - same size = reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs) offset = reiserfs_journal_default(fs) if we have a non standard journal if we found magic string try to find a jhead and comare dev, size, offset there if params are not equal move to "if we did not find a magic string" clause if we did not find a magic string ask user about his journal try to find a jhead and comare dev, size, offset there if params are not equal exit with error */ p_jp_journal_1st_block = reiserfs_journal_start_must (fs); if (standard_journal == 1) { if (reiserfs_jp_get_dev (reiserfs_sb_jp(sb)) != 0) { fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal device " "occured (%lu), fixed (0)\n", reiserfs_jp_get_dev (reiserfs_sb_jp(sb))); reiserfs_jp_set_dev (reiserfs_sb_jp(sb), 0); } if (reiserfs_sb_get_reserved (sb) != 0) { fsck_log ("rebuild-sb: wrong size reserved for default journal occured " "(%lu), fixed (0)\n", reiserfs_sb_get_reserved (sb)); reiserfs_sb_set_reserved (sb, 0); } if (reiserfs_jp_get_start (reiserfs_sb_jp(sb)) != p_jp_journal_1st_block) { fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal first " "block occured (%lu), fixed (%lu)\n", reiserfs_jp_get_start (reiserfs_sb_jp(sb)), p_jp_journal_1st_block); reiserfs_jp_set_start (reiserfs_sb_jp(sb) , p_jp_journal_1st_block); } if (reiserfs_jp_get_size (reiserfs_sb_jp(sb)) != reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) { fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal size " "occured (%lu), fixed (%lu)\n", reiserfs_jp_get_size (reiserfs_sb_jp(sb)) + 1, reiserfs_journal_default (fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1); reiserfs_jp_set_size (reiserfs_sb_jp(sb), reiserfs_journal_default (fs->fs_super_bh->b_blocknr, fs->fs_blocksize)); } if ((retval = reiserfs_journal_open(fs, filename, O_RDWR #ifdef O_LARGEFILE | O_LARGEFILE #endif ))) { fsck_log("\nrebuild-sb: Failed to open the journal device (%s).\n", filename); exit(retval < 0 ? EXIT_OPER : EXIT_USER); } } else if (!fsck_skip_journal(fs)) { /* Check that specified non-standard journal device exists. */ journal_dev_name = fsck_data (fs)->journal_dev_name; retval = 0; if (magic_was_found) { /* Super block was found. Try to open the journal on the base of its * journal parameters. */ retval = reiserfs_journal_open(fs, journal_dev_name, O_RDWR #ifdef O_LARGEFILE | O_LARGEFILE #endif ); if (retval == 0) { journal_dev_name = fs->fs_j_file_name; j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data); retval = memcmp(&j_head->jh_journal, reiserfs_sb_jp(sb), sizeof(reiserfs_journal_param_t)); if (retval) { /* journal parameters from the SB and from the J_Header does not * match. Close the jouranl, ask the user about correct journal * parameters. */ reiserfs_journal_close(fs); } } if (!reiserfs_journal_opened(fs)) { fsck_log ("Journal cannot be opened, assuming the " "journal device %s is correct\n", journal_dev_name); } } if (!reiserfs_journal_opened(fs)) { __u64 default_value; /* journal was not found or SB and J_Header parameters does not match. */ if (magic_was_found == 0) default_value = (!strcmp(fs->fs_file_name, journal_dev_name)) ? p_jp_journal_1st_block : 0; else default_value = reiserfs_jp_get_start (reiserfs_sb_jp(sb)); printf("\nEnter journal offset on %s in blocks [%Lu]: \n", journal_dev_name, (unsigned long long)default_value); fgets(answer, sizeof(answer), stdin); if (strcmp(answer, "\n")) { retval = (int) strtol (answer, &tmp, 0); if ((*tmp && strcmp(tmp, "\n")) || retval < 0) reiserfs_exit(EXIT_USER, "rebuild_sb: wrong offset specified\n"); reiserfs_jp_set_start (reiserfs_sb_jp(sb), retval); } else reiserfs_jp_set_start (reiserfs_sb_jp(sb), default_value); if (!(p_jp_dev_size = misc_device_count_blocks (journal_dev_name, fs->fs_blocksize))) exit(EXIT_OPER); /* some checks for journal offset */ if (strcmp(fs->fs_file_name, journal_dev_name) != 0) { if (p_jp_dev_size < reiserfs_jp_get_start (reiserfs_sb_jp(sb)) + 1) reiserfs_exit(EXIT_USER, "rebuild_sb: offset is much than device size\n"); } /* default size if magic was not found is device size - journal_1st_block; default size if magic was found is found value + 1 block for journal header */ if (magic_was_found == 0) default_value = (!strcmp(fs->fs_file_name, journal_dev_name)) ? reiserfs_journal_default (fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1 : p_jp_dev_size - reiserfs_jp_get_start (reiserfs_sb_jp(sb)); else default_value = reiserfs_jp_get_size (reiserfs_sb_jp(sb)) + 1; printf("\nEnter journal size (including 1 block for journal header) on " "%s in blocks [%Lu]: \n", journal_dev_name, (unsigned long long)default_value); fgets(answer, sizeof(answer), stdin); if (strcmp(answer, "\n")) { retval = (int) strtol (answer, &tmp, 0); if ((*tmp && strcmp(tmp, "\n")) || retval < 0) reiserfs_exit(EXIT_USER, "rebuild_sb: wrong offset specified\n"); reiserfs_jp_set_size (reiserfs_sb_jp(sb), retval - 1); } else { reiserfs_jp_set_size (reiserfs_sb_jp(sb), default_value - 1); } /* some checks for journal size */ if (reiserfs_jp_get_size (reiserfs_sb_jp(sb)) + reiserfs_jp_get_start (reiserfs_sb_jp(sb)) + 1 > p_jp_dev_size) reiserfs_exit(EXIT_USER, "rebuild_sb: journal offset + journal size is " "greater than device size\n"); /* some checks for journal size */ if (reiserfs_jp_get_size (reiserfs_sb_jp(sb)) < JOURNAL_MIN_SIZE) reiserfs_exit(EXIT_USER, "rebuild_sb: journal size cannot be less than " "%lu blocks.\n", JOURNAL_MIN_SIZE + 1); if ((retval = reiserfs_journal_open(fs, journal_dev_name, O_RDWR #ifdef O_LARGEFILE | O_LARGEFILE #endif ))) { fsck_log("\nrebuild-sb: Failed to open a journal device (%s).", journal_dev_name); exit(retval < 0 ? EXIT_OPER : EXIT_USER); } /* SB was found, but journal params were broken and have been recovered. * Futher work goes as SB would not be found. */ magic_was_found = 0; } retval = stat(journal_dev_name, &stat_buf); if (retval == -1) reiserfs_exit (EXIT_USER, "rebuild_sb: error while detecting the " "specified journal device (%s): %s\n", journal_dev_name, strerror(errno)); if (strcmp (fs->fs_file_name, journal_dev_name)) reiserfs_jp_set_dev (reiserfs_sb_jp(sb), stat_buf.st_rdev); else reiserfs_jp_set_dev (reiserfs_sb_jp(sb), 0); } else { fsck_log ("\nJournal was specified as not available. reiserfstune is " "needed.\n\n"); reiserfs_jp_set_magic (reiserfs_sb_jp(sb), NEED_TUNE); } if (reiserfs_journal_opened(fs)) { /* Journal was openned. Check/fix journal parameters and copy it the journal * header. */ if (reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)) != reiserfs_journal_tlen(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)), reiserfs_jp_get_size (reiserfs_sb_jp(sb)), fs->fs_blocksize, 0)) { fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal max " "transaction length occured (%lu), fixed (%d)\n", reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)), reiserfs_journal_tlen(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)), reiserfs_jp_get_size (reiserfs_sb_jp(sb)), fs->fs_blocksize, 0)); reiserfs_jp_set_tlen (reiserfs_sb_jp(sb), reiserfs_journal_tlen(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)), reiserfs_jp_get_size (reiserfs_sb_jp(sb)), fs->fs_blocksize, 0)); } if (reiserfs_jp_get_max_batch (reiserfs_sb_jp(sb)) != reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)))) { fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal max " "batch size occured (%lu), fixed (%d)\n", reiserfs_jp_get_max_batch (reiserfs_sb_jp(sb)), reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)))); reiserfs_jp_set_max_batch (reiserfs_sb_jp(sb), reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)))); } if (reiserfs_jp_get_commit_age (reiserfs_sb_jp(sb)) != reiserfs_journal_commit_age()) { fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal " "max commit age occured (%lu), fixed (%d)\n", reiserfs_jp_get_commit_age (reiserfs_sb_jp(sb)), reiserfs_journal_commit_age()); reiserfs_jp_set_commit_age (reiserfs_sb_jp(sb), reiserfs_journal_commit_age()); } if (reiserfs_jp_get_trans_age (reiserfs_sb_jp(sb)) != reiserfs_journal_trans_age()) { fsck_log ("rebuild-sb: wrong journal transaction age occured (%u), " "fixed (%u)\n", reiserfs_jp_get_trans_age (reiserfs_sb_jp(sb)), reiserfs_journal_trans_age()); reiserfs_jp_set_trans_age (reiserfs_sb_jp(sb), reiserfs_journal_trans_age()); } j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data); if (standard_journal == 0) { if (reiserfs_jp_get_magic (reiserfs_sb_jp(sb)) == 0 || reiserfs_jp_get_magic (reiserfs_sb_jp(sb)) == NEED_TUNE) { int magic; magic = random(); fsck_log ("rebuild-sb: genarate the new journal magic (%d)\n", magic); reiserfs_jp_set_magic (reiserfs_sb_jp(sb), magic); reiserfs_jp_set_magic (&j_head->jh_journal, magic); } } retval = memcmp(&j_head->jh_journal, reiserfs_sb_jp(sb), sizeof(reiserfs_journal_param_t)); if (retval) { if (standard_journal == 1) { fsck_log("\nrebuild-sb: You either have a corrupted journal or have just " "changed\nthe start of the partition with some partition table editor. " "If you are\nsure that the start of the partition is ok, rebuild the " "journal header.\n"); } else if (!magic_was_found) { fsck_log("\nrebuild-sb: journal header is not found. You either have " "a corrupted,\nbad configured(device/offset/size), not available " "journal or have just changed\nthe start of the journal partition " "with some partition table editor. In the \ncase of corrupted " "journal you need to use --no-journal-available. If you are\n" "sure that the start of the partition is ok and journal is " "available, rebuild\nthe journal header.\n"); } if (standard_journal || !magic_was_found) { if (!util_user_confirmed (stdout, "Do you want to rebuild the journal header? " "(y/n)[n]: ", "y\n")) { exit(EXIT_USER); } else exit_code = EXIT_FIXED; } memcpy(&j_head->jh_journal, reiserfs_sb_jp(sb), sizeof(reiserfs_journal_param_t)); reiserfs_buffer_mkdirty(fs->fs_jh_bh); reiserfs_buffer_write (fs->fs_jh_bh); } } /* whether journal header contains params with the same dev, offset, size will be checked in open_journal */ if (version == 1 || version == 3) sb_size = REISERFS_SB_SIZE; else sb_size = REISERFS_SB_SIZE_V1; if (ondisk_sb == NULL || memcmp(ondisk_sb, sb, sb_size - ((sb_size == REISERFS_SB_SIZE) ? sizeof(fs->fs_ondisk_sb->s_unused) : 0))) { /* smth was changed in SB or a new one has been built */ reiserfs_sb_set_state (sb, reiserfs_sb_get_state (sb) | FS_ERROR); if (ondisk_sb) { /* if super_block was found, we keep sb in ondisk_sb */ fs->fs_ondisk_sb = ondisk_sb; memcpy (ondisk_sb, sb, sb_size); misc_freemem(sb); } fflush(stdout); reiserfs_node_print (stderr, fs, fs->fs_super_bh); if (util_user_confirmed (stderr, "Is this ok ? (y/n)[n]: ", "y\n")) { reiserfs_buffer_mkuptodate (fs->fs_super_bh, 1); reiserfs_buffer_mkdirty (fs->fs_super_bh); reiserfs_buffer_write (fs->fs_super_bh); fsck_progress ("The fs may still be unconsistent. Run reiserfsck --check.\n\n"); exit_code = EXIT_FIXED; } else { reiserfs_buffer_mkclean (fs->fs_super_bh); fsck_progress ("Super block was not written\n"); } } else { reiserfs_node_print (stderr, fs, fs->fs_super_bh); reiserfs_buffer_mkclean (fs->fs_super_bh); fsck_progress ("\nSuper block seems to be correct\n\n"); } exit(exit_code); } /* if (version == 0) { reiserfs_buffer_close (fs->fs_super_bh); misc_freemem (fs); close (fs->fs_dev); fs = NULL; } */ reiserfsprogs-3.6.20/utils/fsck/ubitmap.c0000644000175300001440000001252110412227267015316 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/malloc.h" #include /* g_disk_bitmap initially contains copy of disk bitmaps (cautious version of it); g_new_bitmap initially has marked only super block, bitmap blocks and bits after the end of bitmap in pass 1 we go through g_disk_bitmap. If block does not look like formatted node, we skip it. If block contains internal node, put 0 in g_disk_bitmap if block is not used in new tree yet. If block contains leaf and is used already (by an extent item handled already to this time) save all items. They will be inserted into tree after pass 1. If block looking like leaf is not used in the new tree, try to insert in into tree. If it is not possible, mark block in g_uninsertable_leaf_bitmap. Blocks marked in this bitmap will be inserted into tree in pass 2. They can not be This means, that in pass 1 when we have found block containing the internal nodes we mark it in g_disk_bitmap as free (reiserfs_free_internal_block). When block gets into new tree it is marked in g_new_bitmap (mark_block_used) When collecting resources for reiserfs_tb_balance, we mark new blocks with mark_block_used. After reiserfs_tb_balance we unmark unused new blocks in g_new_bitmap (bitmap.c:/reiserfs_free_block) Allocating of new blocks: look for 0 bit in g_disk_bitmap (find_zero_bit_in_bitmap), make sure, that g_new_bitmap contains 0 at the corresponding bit (is_block_used). */ /* is blocks used (marked by 1 in new bitmap) in the tree which is being built (as leaf, internal, bitmap, or unformatted node) */ int is_block_used (unsigned long block) { return reiserfs_bitmap_test_bit (fsck_new_bitmap (fs), block); } void mark_block_used (unsigned long block, int check_hardware) { if (!block) return; if (is_block_used (block)) { if (check_hardware) fsck_info_checkmem(); misc_die ("mark_block_used: (%lu) used already", block); } reiserfs_bitmap_set_bit (fsck_new_bitmap (fs), block); } void mark_block_free (unsigned long block) { if (!is_block_used (block)) misc_die ("mark_block_free: (%lu) is free already", block); reiserfs_bitmap_clear_bit (fsck_new_bitmap (fs), block); } int fsck_bitmap_isuninsert (unsigned long block) { return !reiserfs_bitmap_test_bit (fsck_uninsertables (fs), block); } void fsck_bitmap_cluninsert (unsigned long block) { reiserfs_bitmap_set_bit (fsck_uninsertables (fs), block); pass_1_stat (fs)->uninsertable_leaves --; } /* uninsertable block is marked by bit clearing */ void fsck_bitmap_mkuninsert (unsigned long block) { if (fsck_bitmap_isuninsert (block)) misc_die ("%s: (%lu) is uninsertable already", __FUNCTION__, block); reiserfs_bitmap_clear_bit (fsck_uninsertables (fs), block); /* we do not need thsi actually */ pass_1_stat (fs)->uninsertable_leaves ++; } /* FIXME: should be able to work around no disk space */ int reiserfsck_new_blocknrs (reiserfs_filsys_t * fs, unsigned long * free_blocknrs, unsigned long start, int amount_needed) { int i; if (!are_there_allocable_blocks (amount_needed)) misc_die ("out of disk space"); for (i = 0; i < amount_needed; i ++) { free_blocknrs[i] = alloc_block (); if (!free_blocknrs[i]) misc_die ("reiserfsck_new_blocknrs: 0 is allocated"); mark_block_used (free_blocknrs[i], 0); } return CARRY_ON; } // FIXME: do you check readability of a block? If f_read fails - you // free block in bitmap or if you mark bad blocks used to avoid their // allocation in future you should have bad block counter in a super // block. Another minor issue: users of _get_new_buffer expect buffer // to be filled with 0s reiserfs_bh_t * reiserfsck_get_new_buffer (unsigned long start) { unsigned long blocknr = 0; reiserfs_bh_t * bh = NULL; assert(fs->block_allocator != NULL); fs->block_allocator(fs, &blocknr, start, 1); bh = reiserfs_buffer_open (fs->fs_dev, blocknr, fs->fs_blocksize); return bh; } /* free block in new bitmap */ int reiserfsck_free_block (reiserfs_filsys_t * fs, unsigned long block) { mark_block_free (block); /* put it back to pool of blocks for allocation */ make_allocable (block); return 0; } /* these are used to allocate blocks for tree building */ int are_there_allocable_blocks (unsigned int amout_needed) { if (reiserfs_bitmap_zeros (fsck_allocable_bitmap (fs)) < amout_needed) { unsigned int zeros = 0, i; fsck_progress ("Not enough allocable blocks, checking bitmap..."); for (i = 0; i < fsck_allocable_bitmap (fs)->bm_bit_size; i ++) { if (!reiserfs_bitmap_test_bit (fsck_allocable_bitmap (fs), i)) zeros ++; } fsck_progress ("there are %u allocable blocks, btw\n", zeros); return 0; } return 1; } void make_allocable (unsigned long block) { reiserfs_bitmap_clear_bit (fsck_allocable_bitmap (fs), block); } unsigned long alloc_block (void) { unsigned long block = 0; /* FIXME: start point could be used */ if (reiserfs_bitmap_find_zero_bit (fsck_allocable_bitmap (fs), &block)) { misc_die ("alloc_block: Allocable blocks counter is wrong"); return 0; } reiserfs_bitmap_set_bit (fsck_allocable_bitmap (fs), block); return block; } reiserfsprogs-3.6.20/utils/fsck/ufile.c0000644000175300001440000003304010412227267014760 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/unaligned.h" #include "misc/malloc.h" #include static void cut_last_unfm_pointer (reiserfs_path_t * path, reiserfs_ih_t * ih) { reiserfs_ih_set_free(ih, 0); if (reiserfs_ext_count (ih) == 1) reiserfs_tree_delete (fs, path, 0); else reiserfs_tree_delete_unit (fs, path, -((int)REISERFS_EXT_SIZE)); } /* if this is not a symlink - make it of_this_size; otherwise find a size and return it in symlink_size; */ static unsigned long extent2direct (reiserfs_path_t * path, __u64 len, int symlink) { reiserfs_bh_t * bh = REISERFS_PATH_LEAF (path); reiserfs_ih_t * ih = REISERFS_PATH_IH (path); __u32 unfm_ptr; reiserfs_bh_t * unfm_bh = 0; reiserfs_ih_t ins_ih; char * buf; char bad_drct[fs->fs_blocksize]; /* direct item to insert */ memset (&ins_ih, 0, sizeof (ins_ih)); if (symlink) { reiserfs_ih_set_format (&ins_ih, KEY_FORMAT_1); } else { reiserfs_ih_set_format (&ins_ih, reiserfs_ih_get_format (ih)); } reiserfs_key_set_did (&ins_ih.ih_key, reiserfs_key_get_did (&ih->ih_key)); reiserfs_key_set_oid (&ins_ih.ih_key, reiserfs_key_get_oid (&ih->ih_key)); reiserfs_key_set_sec (reiserfs_ih_get_format (&ins_ih), &ins_ih.ih_key, reiserfs_key_get_off (&ih->ih_key) + (reiserfs_ext_count (ih) - 1) * bh->b_size, TYPE_DIRECT); // we do not know what length this item should be unfm_ptr = d32_get ((__u32 *)REISERFS_PATH_ITEM (path), reiserfs_ext_count (ih) - 1); if (unfm_ptr && (unfm_bh = reiserfs_buffer_read(bh->b_dev, unfm_ptr, bh->b_size))) { /* we can read the block */ buf = unfm_bh->b_data; } else { /* we cannot read the block */ if (unfm_ptr) { fsck_log ("%s: Reading of the block (%lu), pointed to by the " "file %K, failed\n", __FUNCTION__, unfm_ptr, &ih->ih_key); } memset (bad_drct, 0, fs->fs_blocksize); buf = bad_drct; } reiserfs_ih_set_len (&ins_ih, (reiserfs_ih_get_format (ih) == KEY_FORMAT_2) ? MISC_ROUND_UP(len) : len); reiserfs_ih_set_free (&ins_ih, MAX_US_INT); reiserfs_ih_cltail(ih); reiserfs_buffer_mkdirty(bh); // last last unformatted node pointer path->pos_in_item = reiserfs_ext_count (ih) - 1; cut_last_unfm_pointer (path, ih); /* insert direct item */ if (reiserfs_tree_search_item (fs, &(ins_ih.ih_key), path) == ITEM_FOUND) { reiserfs_panic ("%s: The direct item %k should not exist yet.", __FUNCTION__, &(ins_ih.ih_key)); } reiserfs_tree_insert (fs, path, &ins_ih, (const char *)(buf)); reiserfs_buffer_close (unfm_bh); /* put to stat data offset of first byte in direct item */ return reiserfs_key_get_off (&ins_ih.ih_key); //offset; } /* returns 1 when file looks correct, -1 if directory items appeared there, 0 - only holes in the file found */ /* when it returns, key->k_offset is offset of the last item of file */ /* sd_size is zero if we do not need to convert any extent to direct */ int are_file_items_correct (reiserfs_ih_t * sd_ih, void * sd, __u64 * size, __u32 * blocks, int mark_passed_items, int * symlink) { const reiserfs_key_t *next_key; reiserfs_key_t *key; reiserfs_path_t path; reiserfs_bh_t * bh; reiserfs_ih_t * ih; int next_is_another_object = 0; __u64 last_unfm_offset = 0; int retval, was_tail = 0; int will_convert = 0; int should_convert; int had_direct = 0; long long int gap; __u32 sd_fdb = 0; int key_version; unsigned int i; __u64 sd_size; key_version = reiserfs_ih_get_format (sd_ih); should_convert = (fsck_mode (fs) != FSCK_REBUILD) || mark_passed_items; key = &sd_ih->ih_key; reiserfs_stat_get_size (sd_ih, sd, &sd_size); if (key_version == KEY_FORMAT_1) reiserfs_stat_get_fdb (sd_ih, sd, &sd_fdb); reiserfs_key_set_off (key_version, key, 1); reiserfs_key_set_type (key_version, key, TYPE_DIRECT); /* correct size and st_blocks */ *size = 0; *blocks = 0; path.path_length = REISERFS_PATH_OFFILL; do { retval = reiserfs_tree_search_position (fs, key, &path); if (retval == POSITION_FOUND && path.pos_in_item != 0) reiserfs_panic ("%s: We look for %k, found %k. Must be found " "first item byte (position 0).", __FUNCTION__, key, &(REISERFS_PATH_IH (&path)->ih_key)); switch (retval) { case POSITION_FOUND:/**/ ih = REISERFS_PATH_IH (&path); bh = REISERFS_PATH_LEAF (&path); if (reiserfs_ih_wastail (ih)) { was_tail = 1; } reiserfs_key_set_type (key_version, key, reiserfs_key_get_type (&ih->ih_key)); if (mark_passed_items == 1) { fsck_item_mkreach (ih, bh); } // does not change path next_key = reiserfs_tree_next_key(&path, fs); if (next_key == 0 || reiserfs_key_comp2 (key, next_key) || (!reiserfs_key_ext (next_key) && !reiserfs_key_direct(next_key))) { next_is_another_object = 1; will_convert = (reiserfs_ih_ext (ih) && sd_size && (reiserfs_ext_count (ih) > 0)); if (will_convert) { last_unfm_offset = reiserfs_key_get_off (key) + fs->fs_blocksize * (reiserfs_ext_count (ih) - 1); /* if symlink or [ 1. sd_size points somewhere into last unfm block 2. one item of the file was direct before for 3_6 || FDB points to the tail correctly for 3_5 3. we can have a tail in the file of a such size ] */ will_convert = will_convert && (sd_size >= last_unfm_offset) && (sd_size < last_unfm_offset + fs->fs_blocksize) && !reiserfs_policy_ext (sd_size, sd_size - last_unfm_offset + 1, fs->fs_blocksize); will_convert = will_convert && (*symlink || ((key_version == KEY_FORMAT_1) && (sd_fdb == last_unfm_offset)) || ((key_version == KEY_FORMAT_2) && was_tail)); } } if (should_convert) { *symlink = *symlink && (will_convert || reiserfs_key_direct(&ih->ih_key)); if (!(*symlink) && key_version != reiserfs_ih_get_format (ih)) { if (fsck_mode(fs) == FSCK_CHECK) { fsck_log("%s: vpf-10250: block %lu, item (%d): The " "item format (%H) is not equal to SD format " "(%d)\n", __FUNCTION__, bh->b_blocknr, REISERFS_PATH_LEAF_POS(&path),ih, key_version); one_more_corruption (fs, FIXABLE); } else { fsck_log("%s: vpf-10280: block %lu, item (%d): The " "item format (%H) is not equal to SD format " "(%d) - fixed.\n", __FUNCTION__, bh->b_blocknr, REISERFS_PATH_LEAF_POS(&path),ih, key_version); reiserfs_key_set_sec (key_version, &ih->ih_key, reiserfs_key_get_off (&ih->ih_key), reiserfs_key_get_type (&ih->ih_key)); reiserfs_ih_set_format(ih, key_version); reiserfs_buffer_mkdirty(bh); } } if (*symlink && reiserfs_key_direct(&ih->ih_key)) { /* symlink. Check that it is of KEY_FORMAT_1 */ if (fsck_mode(fs) == FSCK_CHECK) { if ((reiserfs_ih_get_format(ih) != KEY_FORMAT_1) || (reiserfs_key_format(&ih->ih_key) != KEY_FORMAT_1)) { fsck_log("%s: vpf-10732: block %lu, item (%d): " "The symlink format (%H) is not equal " "to 3.5 format (%d)\n", __FUNCTION__, bh->b_blocknr, REISERFS_PATH_LEAF_POS(&path), ih, KEY_FORMAT_1); one_more_corruption (fs, FIXABLE); } } else { if ((reiserfs_ih_get_format(ih) != KEY_FORMAT_1) || (reiserfs_key_format(&ih->ih_key) != KEY_FORMAT_1)) { fsck_log("%s: vpf-10732: block %lu, item (%d): " "The symlink format (%H) is not equal " "to 3.5 format (%d)\n", __FUNCTION__, bh->b_blocknr, REISERFS_PATH_LEAF_POS(&path), ih, KEY_FORMAT_1); reiserfs_key_set_sec(KEY_FORMAT_1, &ih->ih_key, reiserfs_key_get_off(&ih->ih_key), reiserfs_key_get_type(&ih->ih_key)); reiserfs_ih_set_format(ih, KEY_FORMAT_1); reiserfs_buffer_mkdirty(bh); } } } if (will_convert) *size = sd_size; else *size = reiserfs_key_get_off (&ih->ih_key) + reiserfs_leaf_ibytes (ih, fs->fs_blocksize) - 1; if (reiserfs_key_get_type (&ih->ih_key) == TYPE_EXTENT) { if (*symlink) /* symlinks must be calculated as dirs */ *blocks = REISERFS_DIR_BLOCKS (*size); else for (i = 0; i < reiserfs_ext_count (ih); i ++) { __u32 * ind = (__u32 *)REISERFS_PATH_ITEM(&path); if (d32_get(ind, i) != 0) *blocks += (fs->fs_blocksize >> 9); } } else if (reiserfs_key_get_type (&ih->ih_key) == TYPE_DIRECT) { if (*symlink) /* symlinks must be calculated as dirs */ *blocks = REISERFS_DIR_BLOCKS (*size); else if (!had_direct) *blocks += (fs->fs_blocksize >> 9); /* calculate only the first direct byte */ had_direct++; } } if (next_is_another_object) { /* next item does not exists or is of another object, therefore all items of file are correct */ if (will_convert) { if (fsck_mode (fs) == FSCK_CHECK) { /* here it can be symlink only */ fsck_log ("%s: The extent item should be converted " "back to direct %K\n", __FUNCTION__, &ih->ih_key); one_more_corruption (fs, FIXABLE); reiserfs_tree_pathrelse (&path); } else { __u32 * ind = (__u32 *)REISERFS_PATH_ITEM(&path); if (d32_get(ind, reiserfs_ext_count (ih) - 1) == 0) *blocks += (fs->fs_blocksize >> 9); /* path is released here. */ sd_fdb = extent2direct (&path, sd_size - last_unfm_offset + 1, *symlink); /* last item of the file is direct item */ reiserfs_key_set_off (key_version, key, sd_fdb); reiserfs_key_set_type (key_version, key, TYPE_DIRECT); } } else { reiserfs_tree_pathrelse (&path); } return 1; } /* next item is item of this file */ if ((gap = must_there_be_a_hole(ih, next_key))) { /* next item has incorrect offset (hole or overlapping) */ reiserfs_tree_pathrelse (&path); if (reiserfs_ih_ext(ih) && fsck_mode (fs) == FSCK_REBUILD && gap < FSCK_MAX_GAP(fs->fs_blocksize)) { if (gap < 0) { reiserfs_panic("%s: found items %k, %k are " "overlapped.\n", __FUNCTION__, &ih->ih_key, next_key); } reiserfs_key_set_off(key_version, key, reiserfs_key_get_off(&ih->ih_key) + reiserfs_leaf_ibytes(ih, fs->fs_blocksize)); fsck_tree_rewrite(fs, key, reiserfs_key_get_off(next_key), 1 << IH_Unreachable); break; } return 0; } /* next item exists */ reiserfs_key_set_sec(key_version, key, reiserfs_key_get_off (next_key), reiserfs_key_get_type(next_key)); if (reiserfs_key_comp (key, next_key)) reiserfs_panic ("%s: Internal tree is in inconsistent state, " "the current item key %K and the next key %K " "must match\n", __FUNCTION__, key, next_key); reiserfs_tree_pathrelse (&path); break; case POSITION_NOT_FOUND: /* We always must have next key found. Exception is first byte. It does not have to exist */ if (reiserfs_key_get_off (key) != 1) reiserfs_panic ("%s: Position (offset == %llu) in the middle " "of the file %K was not found.", __FUNCTION__, reiserfs_key_get_off(key), key); bh = REISERFS_PATH_LEAF (&path); if (reiserfs_node_items(bh) <= REISERFS_PATH_LEAF_POS(&path)) next_key = reiserfs_tree_next_key(&path, fs); else next_key = &REISERFS_PATH_IH(&path)->ih_key; reiserfs_tree_pathrelse (&path); gap = reiserfs_key_get_off(next_key); if (fsck_mode(fs) == FSCK_REBUILD && gap < FSCK_MAX_GAP(fs->fs_blocksize) + 1) { fsck_tree_rewrite(fs, key, gap, 1 << IH_Unreachable); break; } return 0; case FILE_NOT_FOUND: if (reiserfs_key_get_off (key) != 1) reiserfs_panic ("%s: File %K must be found as we found its " "StatData.", __FUNCTION__, key); reiserfs_tree_pathrelse (&path); return 1; case DIRECTORY_FOUND: reiserfs_tree_pathrelse (&path); return -1; } } while (1); misc_die ("%s: Cannot reach here", __FUNCTION__); return 0; } static int cb_relocate(reiserfs_path_t *path, void *data) { return 1; } /* delete all items and put them back (after that file should have correct sequence of items. if @relocate is specified then it relocates items to a new id. if @adjust_ih is specified then the key in ih is changed also. */ void fsck_file_relocate(reiserfs_key_t *key, int update_key) { reiserfs_key_t start; saveitem_t *si; __u32 oid; int count; int moved; /* Find all items of the file, remove, relocate, insert them. */ oid = 0; moved = 0; si = NULL; start = *key; reiserfs_key_set_sec(KEY_FORMAT_1, &start, OFFSET_SD, TYPE_STAT_DATA); while ((count = fsck_tree_delete(&start, &si, 1, cb_relocate, NULL))) { if (oid == 0) oid = fsck_relocate_oid(key); reiserfs_key_set_oid(&(si->si_ih.ih_key), oid); fsck_tree_insert_item(&(si->si_ih), si->si_dnm_data, 0); si = fsck_item_free(si); moved += count; } if (moved) { fsck_log ("%s: %d items of file %K moved to %u oid\n", __FUNCTION__, moved, key, oid); } if (update_key) { /* If nothing has been relocated but ih needs to be adjusted, allocate a new oid for relocation. */ if (oid == 0) oid = fsck_relocate_oid(key); reiserfs_key_set_oid (key, oid); } } reiserfsprogs-3.6.20/utils/fsck/uobjectid.c0000644000175300001440000002116310412227267015627 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include "misc/malloc.h" /* when --check fsck builds a map of objectids of files it finds in the tree when --rebuild-tree - fsck builds map of objectids it inserts into tree */ #define ALLOC_SIZE 1024 #define MAX_ID (~(__u32)0) /* 2 bytes for the counter */ #define BM_SIZE (ALLOC_SIZE - sizeof(__u16)) #define BM_INTERVAL (BM_SIZE * 8) #define INDEX_COUNT (MAX_ID / BM_INTERVAL) #define id_map_interval(map, id) (map->index + (id / BM_INTERVAL)) #define id_map_local_count(interval) (interval + BM_SIZE) /* typedef struct sb_id_map { __u32 * m_begin; __u32 m_size, m_used_slot_count; } sb_id_map_t; */ id_map_t *id_map_init() { id_map_t *map; __u32 i; map = misc_getmem(sizeof(id_map_t)); map->index = misc_malloc(INDEX_COUNT * sizeof(void *)); for (i = 0; i < INDEX_COUNT; i++) { if (map->index[i] != (void *)0) map->index[i] = (void *)0; } id_map_mark(map, 0); id_map_mark(map, 1); /* id == 0 should not be there, just for convinient usage */ map->count--; return map; } void id_map_free(id_map_t *map) { __u32 i; for (i = 0; i < INDEX_COUNT; i++) { if (map->index[i] != (void *)0 && map->index[i] != (void *)1) misc_freemem(map->index[i]); } misc_freemem(map->index); misc_freemem(map); } int id_map_test(id_map_t *map, __u32 id) { void **interval = id_map_interval(map, id); if (*interval == (void *)0) return 0; if (*interval == (void *)1) return 1; return misc_test_bit(id % BM_INTERVAL, *interval); } int id_map_mark(id_map_t *map, __u32 id) { void **interval = id_map_interval(map, id); if (*interval == (void *)0) *interval = misc_getmem(ALLOC_SIZE); if (*interval == (void *)1) return 1; if (misc_test_bit(id % BM_INTERVAL, *interval)) return 1; misc_set_bit(id % BM_INTERVAL, *interval); (*(__u16 *)id_map_local_count(*interval))++; map->count++; if ((*(__u16 *)id_map_local_count(*interval)) == BM_INTERVAL) { /* Dealloc fully used bitmap */ misc_freemem(*interval); *interval = (void *)1; } if (map->last_used < (id / BM_INTERVAL)) map->last_used = id / BM_INTERVAL; return 0; } /* call this for proper_id_map only!! */ __u32 id_map_alloc(id_map_t *map) { __u32 i, zero_count; __u32 id = 0, first = ~(__u32)0; for (i = 0, zero_count = 0; zero_count < 10 && i < INDEX_COUNT - 1; i++) { if (map->index[i] == (void *)0) { if (zero_count == 0) first = i; zero_count++; } else if (map->index[i] != (void *)1) break; } if (map->index[i] != (void *)1 && map->index[i] != (void *)0) { id = misc_find_first_zero_bit(map->index[i], BM_INTERVAL); if (id >= BM_INTERVAL) misc_die ("Id is out of interval size, interval looks corrupted."); id += i * BM_INTERVAL; } else if (first != ~(__u32)0) { id = first * BM_INTERVAL; if (id == 0) id = 2; } else misc_die ("%s: No more free objectid is available.", __FUNCTION__); id_map_mark(map, id); return id; } /* this could be used if some more sofisticated flushing will be needed. */ /* static void sb_id_map_pack(sb_id_map_t *map) { map->m_begin[1] = map->m_begin[map->m_used_slot_count - 1]; memset(map->m_begin + 2, 0, map->m_used_slot_count - 2); map->m_used_slot_count = 2; }*/ static __u32 id_map_next_bound(id_map_t *map, __u32 start) { __u32 index = start / BM_INTERVAL; __u32 offset = 0; int look_for; if (map->index[index] == (void *)0) look_for = 1; else if (map->index[index] == (void *)1) look_for = 0; else { offset = start % BM_INTERVAL; look_for = !misc_test_bit(offset, map->index[index]); offset++; } start_again: if (look_for) { while (index < INDEX_COUNT && map->index[index] == (void *)0) { index++; } if (index == INDEX_COUNT) return 0; if (map->index[index] == (void *)1) return index * BM_INTERVAL; offset = misc_find_next_set_bit(map->index[index], BM_INTERVAL, offset); if (offset >= BM_INTERVAL) { offset = 0; index++; goto start_again; } } else { while (index < INDEX_COUNT && map->index[index] == (void *)1) index++; if (index == INDEX_COUNT) return 0; if (map->index[index] == (void *)0) return index * BM_INTERVAL; offset = misc_find_next_zero_bit(map->index[index], BM_INTERVAL, offset); if (offset >= BM_INTERVAL) { offset = 0; index++; goto start_again; } } return index * BM_INTERVAL + offset; } void id_map_flush(struct id_map * map, reiserfs_filsys_t * fs) { int size, max, i; __u32 id, prev_id; __u32 * sb_objectid_map; size = reiserfs_super_size (fs->fs_ondisk_sb); sb_objectid_map = (__u32 *)((char *)(fs->fs_ondisk_sb) + size); max = ((fs->fs_blocksize - size) >> 3 << 1); reiserfs_sb_set_mapmax (fs->fs_ondisk_sb, max); id = 1; sb_objectid_map[0] = cpu_to_le32(0); for (i = 1; i < max - 1; i++) { id = id_map_next_bound(map, id); sb_objectid_map[i] = cpu_to_le32(id); if (id == 0) { if (i % 2) { misc_die ("%s: Used interval is not closed " "on flushing.", __FUNCTION__); } break; } } if (map->index[map->last_used] == (void *)0) { misc_die ("Object id map looks corrupted - last " "used interval cannot be zeroed."); } i++; if (i == max) { if (id == 0) { misc_die ("Objectid interval does not contain " "any set bit what is expected."); } if (map->index[map->last_used] == (void *)1) { prev_id = BM_INTERVAL - 1; } else { prev_id = ~(__u32)0; if (id < map->last_used * BM_INTERVAL) id = 0; else id %= BM_INTERVAL; if (misc_test_bit(id, map->index[map->last_used])) prev_id = id; while ((id = misc_find_next_set_bit(map->index[map->last_used], BM_INTERVAL, (id + 1))) != BM_INTERVAL) { prev_id = id; } if (prev_id == ~(__u32)0) { misc_die ("Objectid interval does not contain " "any set bit what is expected."); } prev_id++; } sb_objectid_map[max - 1] = cpu_to_le32(prev_id + map->last_used * BM_INTERVAL); } else { i--; memset(sb_objectid_map + i, 0, (max - i) * sizeof (__u32)); } reiserfs_sb_set_mapcur (fs->fs_ondisk_sb, i); } void fetch_objectid_map (struct id_map * map, reiserfs_filsys_t * fs) { __u32 i, j, sb_size; __u32 * sb_objectid_map; sb_size = reiserfs_super_size (fs->fs_ondisk_sb); sb_objectid_map = (__u32 *)((char *)(fs->fs_ondisk_sb) + sb_size); if (map == NULL) misc_die ("Not map given"); for (i = 0; i < reiserfs_sb_get_mapcur(fs->fs_ondisk_sb); i+=2) { for (j = sb_objectid_map[i]; j < sb_objectid_map[i + 1]; j++) { id_map_mark(map, j); if (j == 0) map->count--; } } } #define OBJMAP_START_MAGIC 375331 #define OBJMAP_END_MAGIC 7700472 void reiserfs_objectid_map_save (FILE * fp, struct id_map * id_map) { __u32 v, count; v = OBJMAP_START_MAGIC; fwrite (&v, 4, 1, fp); v = 0; count = 0; /* Write 0. */ fwrite (&v, 4, 1, fp); count++; while ((v = id_map_next_bound(id_map, v))) { fwrite (&v, 4, 1, fp); count++; } fwrite (&count, 4, 1, fp); v = OBJMAP_END_MAGIC; fwrite (&v, 4, 1, fp); } struct id_map * reiserfs_objectid_map_load (FILE * fp) { __u32 v, count, i, prev, next; struct id_map * id_map; int skip, odd; id_map = id_map_init(); fread (&v, 4, 1, fp); if (v != OBJMAP_START_MAGIC) { reiserfs_warning (stderr, "reiserfs_objectid_map_load: no " "objectid map begin magic found"); goto error; } count = 0; skip = 0; odd = 0; prev = 0; while (1) { if (skip) { skip = 0; v = next; } else if (fread(&v, 4, 1, fp) != 1) { reiserfs_warning (stderr, "%s: failed to read the given", __FUNCTION__); goto error; } if (v == count) { /* Check if the magic goes after. */ if (fread(&next, 4, 1, fp) != 1) { reiserfs_warning (stderr, "%s: failed to read the given", __FUNCTION__); goto error; } if (next != OBJMAP_END_MAGIC) skip = 1; else break; } if (odd) { for (i = prev; i < v; i++) { id_map_mark(id_map, i); if (i == 0) id_map->count--; } } prev = v; odd = odd ? 0 : 1; count++; } return id_map; error: fflush (stderr); id_map_free(id_map); return NULL; } reiserfsprogs-3.6.20/utils/fsck/utree.c0000644000175300001440000010333010412227267015000 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "fsck.h" #include #include "misc/unaligned.h" #include "misc/malloc.h" #include "util/misc.h" /* this works for both new and old stat data */ #define st_mode(sd) le16_to_cpu(((reiserfs_sd_t *)(sd))->sd_mode) #define st_mtime_v1(sd) le32_to_cpu(((reiserfs_sd_v1_t *)(sd))->sd_mtime) #define st_mtime_v2(sd) le32_to_cpu(((reiserfs_sd_t *)(sd))->sd_mtime) static int fsck_tree_insert_file (reiserfs_ih_t * ih, char * item, int check); /* either both sd-s are new of both are old */ static void fsck_tree_overwrite_stat (reiserfs_ih_t * new_ih, void * new_item, reiserfs_path_t * path) { __u16 new_mode, old_mode; reiserfs_stat_get_mode (new_ih, new_item, &new_mode); reiserfs_stat_get_mode (REISERFS_PATH_IH (path), REISERFS_PATH_ITEM (path), &old_mode); if ((S_ISREG (new_mode) && S_ISDIR (old_mode)) || (S_ISDIR (new_mode) && S_ISREG (old_mode))) { reiserfs_panic("Cannot overwrite SD [%H] with SD [%H].\n", REISERFS_PATH_IH (path), new_ih); } if (S_ISREG (new_mode) && !S_ISREG (old_mode)) { /* in tree we have not regular file - overwrite its stat data with stat data of regular file */ memcpy (REISERFS_PATH_ITEM (path), new_item, reiserfs_ih_get_len (REISERFS_PATH_IH (path))); reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (path)); return; } if (S_ISREG (old_mode) && !S_ISREG (new_mode)) { /* new stat data is not a stat data of regular file, keep regular file stat data in tree */ return; } /* if coming stat data has newer mtime - use that */ if (reiserfs_ih_format_v1 (new_ih)) { if (st_mtime_v1 (new_item) > st_mtime_v1 (REISERFS_PATH_ITEM (path))) { memcpy (REISERFS_PATH_ITEM (path), new_item, REISERFS_SD_SIZE_V1); reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (path)); } } else { if (st_mtime_v2 (new_item) > st_mtime_v2 (REISERFS_PATH_ITEM (path))) { memcpy (REISERFS_PATH_ITEM (path), new_item, REISERFS_SD_SIZE); reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (path)); } } return; } /* insert sd item if it does not exist, overwrite it otherwise */ static void fsck_tree_insert_stat (reiserfs_ih_t * new_ih, char * new_item, int check) { reiserfs_path_t path; __u32 oid; if (check) { oid = fsck_relocate_check (new_ih, !not_a_directory(new_item)); if (oid == 1) { fsck_file_relocate (&new_ih->ih_key, not_a_directory(new_item) ? 1 : 0); } else if (oid) { reiserfs_key_set_oid (&new_ih->ih_key, oid); } } /* if we will have to insert item into tree - it is ready */ zero_nlink (new_ih, new_item); fsck_item_mkunreach (new_ih); /* we are sure now that if we are inserting stat data of a directory - there are no items with the same key which are not items of a directory, and that if we are inserting stat data is of not a directory - it either has new key already or there are no items with this key which are items of a directory */ if (reiserfs_tree_search_item (fs, &(new_ih->ih_key), &path) == ITEM_FOUND) { /* this stat data is found */ if (reiserfs_ih_get_format (REISERFS_PATH_IH(&path)) != reiserfs_ih_get_format (new_ih)) { /* in tree stat data and a new one are of different formats */ fsck_log ("%s: Inserting the StatData %K, mode (%M)...", __FUNCTION__, &(new_ih->ih_key), st_mode (new_item)); if (reiserfs_ih_format_v1 (new_ih)) { /* sd to be inserted is of V1, where as sd in the tree is of V2 */ fsck_log ("found newer in the tree, mode (%M), insersion was " "skipped.\n", st_mode (REISERFS_PATH_ITEM (&path))); reiserfs_tree_pathrelse (&path); } else { /* the stat data in the tree is sd_v1 */ fsck_log ("older sd, mode (%M), is replaced with it.\n", st_mode (REISERFS_PATH_ITEM (&path))); reiserfs_tree_delete (fs, &path, 0/*not temporary*/); reiserfs_tree_search_item (fs, &new_ih->ih_key, &path); reiserfs_tree_insert (fs, &path, new_ih, new_item); } } else { /* both stat data are of the same version */ fsck_tree_overwrite_stat (new_ih, new_item, &path); reiserfs_tree_pathrelse (&path); } return; } /* item not found, insert a new one */ reiserfs_tree_insert (fs, &path, new_ih, new_item); } static int fsck_tree_insert_prep (reiserfs_filsys_t *fs, reiserfs_ih_t *ih, int directory) { reiserfs_path_t path; reiserfs_key_t key; __u32 oid = 0; int step = 0; /* Check if the ois has been already relocated. */ if (!directory && (oid = fsck_relocate_get_oid(&ih->ih_key))) reiserfs_key_set_oid(&ih->ih_key, oid); memset(&key, 0, sizeof(key)); while (1) { reiserfs_key_copy2(&key, &ih->ih_key); /* Check if the StatData item presents. */ if ((reiserfs_tree_search_item (fs, &key, &path) != ITEM_FOUND) || (directory && not_a_directory(REISERFS_PATH_ITEM(&path))) || (!directory && !not_a_directory(REISERFS_PATH_ITEM(&path)))) { fsck_log ("vpf-10260: The file we are inserting the new item " "(%H) into has no StatData, insertion is skipped\n", ih); reiserfs_tree_pathrelse (&path); return 1; } reiserfs_tree_pathrelse(&path); if (!step && !oid) { oid = fsck_relocate_check(ih, directory); if (oid == 1) { fsck_file_relocate (&ih->ih_key, directory ? 0 : 1); } else if (oid) { reiserfs_key_set_oid(&ih->ih_key, oid); } else { return 0; } step = 1; continue; } /* Check/Fix the format. */ #if 0 format = reiserfs_ih_get_format (REISERFS_PATH_IH(&path)); reiserfs_stat_get_mode (REISERFS_PATH_IH(&path), REISERFS_PATH_ITEM(&path), &mode); if (format != reiserfs_ih_get_format (ih)) { /* Not for symlinks and not for items which should be relocted. */ if (((S_ISDIR(mode) && reiserfs_ih_dir(ih)) || (!S_ISDIR(mode) && !reiserfs_ih_dir(ih))) && !S_ISLNK(mode)) { reiserfs_key_set_sec (format, &ih->ih_key, reiserfs_key_get_off (&ih->ih_key), reiserfs_key_get_type (&ih->ih_key)); reiserfs_ih_set_format(ih, file_format); } } #endif return 0; } } /* this tries to put each item entry to the tree, if there is no items of the directory, insert item containing 1 entry */ static void fsck_tree_insert_entry (reiserfs_ih_t * comingih, char * item, int check) { char buf[REISERFS_NAME_MAX]; reiserfs_deh_t *deh; char *name; int namelen; int i, step; step = 0; /* Check if the SD item exists */ if (check) { if (fsck_relocate_check (comingih, 1)) fsck_file_relocate (&comingih->ih_key, 0); } deh = (reiserfs_deh_t *)item; for (i = 0; i < reiserfs_ih_get_entries (comingih); i ++, deh ++) { name = reiserfs_deh_name (deh, i); namelen = reiserfs_direntry_name_len (comingih, deh, i); if (!reiserfs_hash_correct (&fs->hash, name, namelen, reiserfs_deh_get_off (deh))) { reiserfs_panic ("%s: The entry (%d) \"%.*s\" of the directory " "%k has badly hashed entry", __FUNCTION__, i, namelen, name, &comingih->ih_key); } buf[0] = '\0'; sprintf (buf, "%.*s", namelen, name); /* 1 for fsck is important: if there is no any items of this directory in the tree yet - new item will be inserted marked not reached */ reiserfs_tree_insert_entry (fs, &(comingih->ih_key), buf, reiserfs_direntry_entry_len (comingih, deh, i), (reiserfs_key_t *)&(deh->deh2_dir_id), 1 << IH_Unreachable); } } /* start_key is the key after which N items need to be deleted save_here is a pointer where deleted items need to be saved if save is set. start_key is the first undeleted item. return whether we are sure there is nothing else of this file */ int fsck_tree_delete(reiserfs_key_t * start_key, saveitem_t ** save_here, int skip_dir_items, tree_modify_t func, void *data) { const reiserfs_key_t *rkey; reiserfs_path_t path; int count = 0; int ret; while (1) { reiserfs_tree_search_body (fs, start_key, &path); if (REISERFS_PATH_LEAF_POS (&path) == reiserfs_node_items (REISERFS_PATH_LEAF (&path))) { rkey = reiserfs_tree_rkey (&path, fs); if (rkey && !reiserfs_key_comp2 (start_key, rkey)) { /* file continues in the right neighbor */ reiserfs_key_copy (start_key, rkey); reiserfs_tree_pathrelse (&path); continue; } /* there is no more items with this key */ reiserfs_tree_pathrelse (&path); return count; } rkey = &(REISERFS_PATH_IH (&path))->ih_key; if (reiserfs_key_comp2 (start_key, rkey)) { /* there are no more item with this key */ reiserfs_tree_pathrelse (&path); return count; } reiserfs_key_copy (start_key, rkey); /* Let it to be here to return either the last deleted key in @start_key or the first not deleted. */ /* if (n_to_delete && count == n_to_delete) { reiserfs_tree_pathrelse (&path); break; } */ /* ok, item found, but make sure that it is not a directory one */ if ((reiserfs_key_stat (rkey) && !not_a_directory (REISERFS_PATH_ITEM (&path))) || (reiserfs_key_dir (rkey))) { if (skip_dir_items) { /* item of directory found. Leave it in the tree */ reiserfs_key_set_off(KEY_FORMAT_1, start_key, reiserfs_key_get_off(start_key) + 1); reiserfs_tree_pathrelse (&path); continue; } else { reiserfs_panic ("%s: No directory item of %K are expected", __FUNCTION__, rkey); } } /* If removing not by the counter, break when it is save to do -- an indirect item is encountered. */ if ((ret = func(&path, data)) < 0) { // if (n_to_delete == 0 && count && reiserfs_key_ext(rkey)) { reiserfs_tree_pathrelse (&path); break; } if (save_here != NULL) fsck_item_save(&path, save_here); reiserfs_tree_delete (fs, &path, save_here ? 1 : 0); count++; if (ret > 0) break; } return count; } /* this is for check only. With this we make sure that all pointers we put into tree on pass 1 do not point to leaves (FIXME), do not point to journal, bitmap, etc, do not point out of fs boundary (and are marked used in on-disk bitmap - this condition skipped for now). */ /* pointers to data block which get into tree are checked with this */ static int still_bad_unfm_ptr (unsigned long block) { if (!block) return 0; if (is_block_used (block)) return 1; if (block >= reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) return 1; return 0; } static int fsck_tree_create_item (reiserfs_filsys_t *fs, reiserfs_path_t * path, reiserfs_ih_t * ih, char * item, int pos, int alloc) { reiserfs_ih_t newih; __u32 body_off; __u64 key_off; int count, i; int format; body_off = pos * (reiserfs_ih_direct(ih) ? 1 : REISERFS_EXT_SIZE); key_off = pos * (reiserfs_ih_direct(ih) ? 1 : fs->fs_blocksize); format = reiserfs_key_format(&ih->ih_key); memcpy(&newih, ih, sizeof(newih)); fsck_item_mkunreach (&newih); reiserfs_ih_set_len (&newih, reiserfs_ih_get_len (ih) - body_off); reiserfs_ih_set_format (&newih, reiserfs_ih_get_format (ih)); reiserfs_ih_set_loc(&newih, 0); reiserfs_key_set_off (format, &newih.ih_key, reiserfs_key_get_off(&newih.ih_key) + key_off); if (alloc && reiserfs_ih_ext(ih)) { count = reiserfs_ext_count (ih); for (i = pos; i < count; i++) { if (still_bad_unfm_ptr (d32_get(item, i))) reiserfs_panic ("%s: The file %K has a pointer to " "the bad block (%u)", __FUNCTION__, &ih->ih_key, d32_get(item, i)); mark_block_used (d32_get(item, i), 0); } } reiserfs_tree_insert (fs, path, &newih, item + body_off); return reiserfs_leaf_ibytes (ih, fs->fs_blocksize) - key_off; } int fsck_tree_insert_zero_ptr (reiserfs_filsys_t *fs, reiserfs_key_t *key, long long int p_count, __u16 flags) { reiserfs_path_t path; long long int count; reiserfs_ih_t *ih; int format; __u32 * ni; int ret; ret = reiserfs_tree_search_position (fs, key, &path); if (ret == DIRECTORY_FOUND || ret == POSITION_FOUND) { reiserfs_panic("%s: The object [%k] must be a file and the " "position must be absent.\n", __FUNCTION__, key); } count = REISERFS_ITEM_MAX(fs->fs_blocksize) / REISERFS_EXT_SIZE; p_count = (p_count + fs->fs_blocksize - 1) / fs->fs_blocksize * fs->fs_blocksize; if (p_count / fs->fs_blocksize <= count) count = p_count / fs->fs_blocksize; ni = misc_getmem (count * REISERFS_EXT_SIZE); if (path.pos_in_item) { /* Position is not found, append to the existent item. */ ih = REISERFS_PATH_IH (&path); if (reiserfs_item_count(ih) != path.pos_in_item) { reiserfs_panic("%s: not expected position (%u) in the " "middle of the item %k.\n", __FUNCTION__, path.pos_in_item, &ih->ih_key); } if ((flags & (1 << IH_Unreachable)) || reiserfs_ih_direct(ih) || must_there_be_a_hole(ih, key)) { REISERFS_PATH_LEAF_POS (&path) ++; path.pos_in_item = 0; } else { reiserfs_tree_insert_unit(fs, &path, ni, count * REISERFS_EXT_SIZE); if (path.pos_in_item == 0) misc_die("Not expected position"); } } if (path.pos_in_item == 0) { /* Either file not found or position not found, create a new item. */ reiserfs_ih_t indih; memset(&indih, 0, sizeof(indih)); reiserfs_ih_set_flags(&indih, flags); reiserfs_key_copy (&(indih.ih_key), key); reiserfs_ih_set_len (&indih, count * REISERFS_EXT_SIZE); reiserfs_ih_set_free (&indih, 0); format = reiserfs_key_format(key); reiserfs_ih_set_format (&indih, format); reiserfs_key_set_type (format, &indih.ih_key, TYPE_EXTENT); reiserfs_tree_insert (fs, &path, &indih, ni); } misc_freemem(ni); return count * fs->fs_blocksize; } long long int must_there_be_a_hole (const reiserfs_ih_t *ih, const reiserfs_key_t *key) { return (reiserfs_key_get_off (key) - reiserfs_key_get_off(&ih->ih_key) - reiserfs_leaf_ibytes(ih, fs->fs_blocksize)); } void fsck_tree_merge(reiserfs_path_t *path) { int start, len, next_start, next_len; reiserfs_ih_t *next; reiserfs_ih_t *ih; reiserfs_bh_t *bh; char *buf; int pos; bh = REISERFS_PATH_LEAF(path); pos = REISERFS_PATH_LEAF_POS(path); if (pos >= reiserfs_node_items(bh) || pos < 1) misc_die("%s: block (%lu), item (%d), nothing to merge with.", __FUNCTION__, bh->b_blocknr, pos); ih = reiserfs_ih_at(bh, pos) - 1; next = ih + 1; start = reiserfs_ih_get_loc(ih); len = reiserfs_ih_get_len(ih); next_start = reiserfs_ih_get_loc(next); next_len = reiserfs_ih_get_len(next); if (!(buf = misc_malloc(next_len))) misc_die("%s: Failed to allocate %d bytes.", __FUNCTION__, next_len); if (!reiserfs_ih_dir(ih)) { memmove(buf, bh->b_data + next_start, next_len); memmove(bh->b_data + next_start, bh->b_data + start, len); memmove(bh->b_data + next_start + len, buf, next_len); reiserfs_ih_set_free(ih, reiserfs_ih_get_free(next)); } else { reiserfs_deh_t *deh; int move; int i; move = reiserfs_ih_get_entries(ih) * REISERFS_DEH_SIZE; memmove(buf, bh->b_data + next_start, next_len); memmove(bh->b_data + next_start, bh->b_data + start, move); memmove(bh->b_data + next_start + move, buf, next_len); move /= REISERFS_DEH_SIZE; reiserfs_ih_set_entries(ih, reiserfs_ih_get_entries(next) + move); deh = (reiserfs_deh_t *)(bh->b_data + next_start); for (i = 0; i < move; i++, deh++) reiserfs_deh_set_loc(deh, reiserfs_deh_get_loc(deh) + next_len); move *= REISERFS_DEH_SIZE; for (i = 0; i < reiserfs_ih_get_entries(next); i++, deh++) reiserfs_deh_set_loc(deh, reiserfs_deh_get_loc(deh) + move); } misc_freemem(buf); reiserfs_ih_set_loc(ih, next_start); reiserfs_ih_set_len(ih, len + next_len); reiserfs_ih_set_len(next, 0); reiserfs_tree_delete (fs, path, 0); } static int cb_tree_rewrite(reiserfs_path_t *path, void *data) { reiserfs_ih_t *ih; __u64 *off; ih = REISERFS_PATH_IH(path); off = (__u64 *)data; if (reiserfs_key_get_off(&ih->ih_key) >= *off) return -1; return 0; } void fsck_tree_rewrite(reiserfs_filsys_t *fs, const reiserfs_key_t *start_key, __u64 end_offset, __u16 flags) { reiserfs_key_t key; saveitem_t *si; __u64 start; int format; si = NULL; start = reiserfs_key_get_off(start_key); start = MISC_DOWN(start, fs->fs_blocksize) + 1; end_offset = MISC_UP(end_offset - 1, fs->fs_blocksize) + 1; format = reiserfs_key_format(start_key); reiserfs_key_copy(&key, start_key); reiserfs_key_set_off (format, &key, start); fsck_tree_delete(&key, &si, 0, cb_tree_rewrite, &end_offset); /* Insert needed zero pointers. */ while (start < end_offset) { reiserfs_key_set_off (format, &key, start); start += fsck_tree_insert_zero_ptr(fs, &key, end_offset - start, flags); } /* Insert removed items back, over have inserted zero pointers. */ while (si) { fsck_tree_insert_file(&si->si_ih, si->si_dnm_data, 0); si = fsck_item_free (si); } } /* Check if an overlapping exists and if it does delete all items overlapped with the one pointed by @ih, insert zeroes since @ih offset and insert have removed items back. */ static int fsck_tree_overwrite_prep(reiserfs_filsys_t *fs, const reiserfs_key_t *found_key, const reiserfs_key_t *start_key, __u64 count) { __u64 end; if (reiserfs_key_comp2(found_key, start_key)) return 0; end = reiserfs_key_get_off (start_key) + count; end = MISC_UP(end - 1, fs->fs_blocksize) + 1; if (end <= reiserfs_key_get_off(found_key)) return 0; fsck_tree_rewrite(fs, start_key, end, 1 << IH_Unreachable); return 1; } /* put unformatted node pointers from incoming item over the in-tree ones */ static int fsck_tree_overwrite_by_extent (reiserfs_ih_t * comingih, __u32 * coming_item, reiserfs_path_t * path, int pos, int check) { reiserfs_bh_t * bh = REISERFS_PATH_LEAF (path); reiserfs_ih_t * ih = REISERFS_PATH_IH (path); int written; __u32 * item_in_tree; int src_unfm_ptrs, dest_unfm_ptrs, to_copy, i, dirty = 0; item_in_tree = (__u32 *)reiserfs_item_by_ih (bh, ih) + path->pos_in_item; coming_item += pos; dest_unfm_ptrs = reiserfs_ext_count (ih) - path->pos_in_item; src_unfm_ptrs = reiserfs_ext_count (comingih) - pos; if (dest_unfm_ptrs >= src_unfm_ptrs) { /* whole coming item (comingih) fits into item in tree (ih) starting with path->pos_in_item */ //free_sp = ih_get_free_space(0, comingih, (char *)coming_item); written = reiserfs_leaf_ibytes (comingih, fs->fs_blocksize) - /* free_sp - */ pos * fs->fs_blocksize; to_copy = src_unfm_ptrs; if (dest_unfm_ptrs == src_unfm_ptrs) reiserfs_ih_set_free(ih, 0 /* free_sp */ ); } else { /* only part of coming item overlaps item in the tree */ written = dest_unfm_ptrs * fs->fs_blocksize; to_copy = dest_unfm_ptrs; reiserfs_ih_set_free(ih, 0); } for (i = 0; i < to_copy; i ++) { if (d32_get (coming_item, i) != 0 && d32_get (item_in_tree, i) == 0) { /* overwrite holes only by correct a pointer in the coming item which must be correct */ d32_put (item_in_tree, i, d32_get (coming_item, i)); if (check) { if (still_bad_unfm_ptr (d32_get (coming_item, i))) misc_die ("%s: The unformatted block pointer " "(%u) points to the bad area.", __FUNCTION__, d32_get (coming_item, i)); mark_block_used (d32_get (coming_item, i), 0); } dirty ++; } } if (dirty) reiserfs_buffer_mkdirty (bh); return written; } /* write direct item to unformatted node */ /* coming item is direct */ static int fsck_tree_overwrite_by_direct(reiserfs_ih_t * comingih, char * item, reiserfs_path_t * path) { reiserfs_bh_t * unbh, * bh; reiserfs_ih_t * ih; __u64 coming_len; __u32 unfm_ptr; int offset; bh = REISERFS_PATH_LEAF (path); ih = REISERFS_PATH_IH (path); unfm_ptr = d32_get ((__u32 *)reiserfs_item_by_ih(bh, ih), path->pos_in_item); unbh = 0; if (unfm_ptr != 0 && unfm_ptr < reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) { unbh = reiserfs_buffer_read (fs->fs_dev, unfm_ptr, bh->b_size); if (!is_block_used (unfm_ptr)) { misc_die ("%s: block %lu, item %d, pointer %d: The pointed " "block (%u) being overwritten is marked as unused.", __FUNCTION__, bh->b_blocknr, REISERFS_PATH_LEAF_POS(path), path->pos_in_item, unfm_ptr); } if (unbh == 0) unfm_ptr = 0; } if (unfm_ptr == 0 || unfm_ptr >= reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) { if ((unbh = reiserfsck_get_new_buffer (bh->b_blocknr)) != NULL) { memset (unbh->b_data, 0, unbh->b_size); d32_put ((__u32 *)reiserfs_item_by_ih(bh, ih), path->pos_in_item, unbh->b_blocknr); reiserfs_buffer_mkdirty (bh); } else { misc_die ("%s: Could not allocate a new block " "for new data", __FUNCTION__); } /* If zero extent is overwritten with the direct, mark WAS_TAIL. */ reiserfs_ih_mktail(ih); } coming_len = reiserfs_leaf_ibytes (comingih, fs->fs_blocksize); offset = (reiserfs_key_get_off (&comingih->ih_key) % bh->b_size) - 1; if (offset + coming_len > bh->b_size) { misc_die ("%s: The length of the file after insertion " "(offset=%lu, length=%u) will exceed the maximal " "possible length.", __FUNCTION__, (long unsigned)reiserfs_key_get_off(&comingih->ih_key), (unsigned)coming_len); } memcpy (unbh->b_data + offset, item, coming_len); if ((path->pos_in_item == (reiserfs_ext_count (ih) - 1)) && (bh->b_size - 0/*ih_free_space (ih)*/) < (offset + coming_len)) { reiserfs_ih_set_free (ih, bh->b_size - (offset + coming_len)) ; reiserfs_buffer_mkdirty (bh); } reiserfs_buffer_mkdirty (unbh); reiserfs_buffer_mkuptodate (unbh, 1); reiserfs_buffer_close (unbh); return coming_len; } static int fsck_tree_overwrite_file (reiserfs_ih_t * comingih, char * item, reiserfs_path_t * path, int pos, int check) { reiserfs_ih_t * ih = REISERFS_PATH_IH (path); reiserfs_key_t key; int written = 0; __u64 off; int ret; if (reiserfs_key_comp2 (ih, &(comingih->ih_key))) reiserfs_panic ("%s: The file to be overwritten %K must be of " "the same as the new data %K", __FUNCTION__, &ih->ih_key, &comingih->ih_key); if (reiserfs_ih_direct (ih)) { reiserfs_key_copy(&key, &comingih->ih_key); off = reiserfs_key_get_off(&comingih->ih_key); off += pos * (reiserfs_ih_direct(comingih) ? 1 : fs->fs_blocksize); reiserfs_key_set_off(reiserfs_key_format(&key), &key, off); reiserfs_tree_pathrelse(path); fsck_tree_rewrite(fs, &ih->ih_key, reiserfs_key_get_off(&ih->ih_key) + 1, 1 << IH_Unreachable); ret = reiserfs_tree_search_position(fs, &key, path); if (ret == DIRECTORY_FOUND || ret == FILE_NOT_FOUND || !reiserfs_ih_ext(REISERFS_PATH_IH(path))) { reiserfs_panic ("%s: The data %k, which are supposed to be " "converted, are not found", __FUNCTION__, &key); } } if (reiserfs_ih_direct (comingih)) { written = fsck_tree_overwrite_by_direct(comingih, item, path); } else { written = fsck_tree_overwrite_by_extent(comingih, (__u32 *)item, path, pos, check); } return written; } /* this appends file with one unformatted node pointer (since balancing algorithm limitation). This pointer can be 0, or new allocated block or pointer from extent item that is being inserted into tree */ static int fsck_tree_append_file (reiserfs_ih_t * comingih, char * item, int pos, reiserfs_path_t * path, int check) { __u32 * ni; reiserfs_bh_t * unbh; int retval; reiserfs_ih_t * ih = REISERFS_PATH_IH (path); __u32 bytes_number; int i, count = 0; if (!reiserfs_ih_ext (ih)) reiserfs_panic ("%s: Operation is not allowed for non-extent " "item %k", __FUNCTION__, &ih->ih_key); if (reiserfs_ih_direct (comingih)) { unsigned int coming_len = reiserfs_leaf_ibytes (comingih, fs->fs_blocksize); reiserfs_ih_mktail (ih); reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF(path)); if (reiserfs_key_get_off (&comingih->ih_key) < reiserfs_key_get_off (&ih->ih_key) + fs->fs_blocksize * reiserfs_ext_count (ih)) { /* direct item fits to free space of extent item */ reiserfs_panic("%s: inserting [%H], pos (%d) into [%H], " "should not get here.\n", __FUNCTION__, comingih, pos, ih); } unbh = reiserfsck_get_new_buffer (REISERFS_PATH_LEAF (path)->b_blocknr); memset (unbh->b_data, 0, unbh->b_size); memcpy (unbh->b_data + reiserfs_key_get_off (&comingih->ih_key) % unbh->b_size - 1, item, coming_len); reiserfs_buffer_mkdirty (unbh); reiserfs_buffer_mkuptodate (unbh, 1); ni = misc_getmem (REISERFS_EXT_SIZE); d32_put (ni, 0, unbh->b_blocknr); count = 1; reiserfs_buffer_close (unbh); retval = coming_len; } else { /* coming item is extent item */ bytes_number = reiserfs_leaf_ibytes (ih, fs->fs_blocksize); if (reiserfs_key_get_off (&comingih->ih_key) + pos * fs->fs_blocksize != reiserfs_key_get_off (&ih->ih_key) + bytes_number) { reiserfs_panic ("%s: file %K: Cannot append extent pointers " "of the offset (%llu) at the position %llu\n", __FUNCTION__, &comingih->ih_key, reiserfs_key_get_off (&comingih->ih_key) + pos * fs->fs_blocksize, reiserfs_key_get_off (&ih->ih_key) + bytes_number); } /* take unformatted pointer from an extent item */ count = reiserfs_ext_count(comingih) - pos; ni = misc_getmem (count * REISERFS_EXT_SIZE); memcpy (ni, (item + pos * REISERFS_EXT_SIZE), count * REISERFS_EXT_SIZE); if (check) { for (i = 0; i < count; i++ ) { if (still_bad_unfm_ptr (d32_get (ni, i))) misc_die ("%s: Trying to insert a pointer to illegal " "block (%u)", __FUNCTION__, d32_get (ni, i)); mark_block_used (d32_get (ni, i), 0); } } retval = fs->fs_blocksize * count; } reiserfs_tree_insert_unit (fs, path, (const char *)ni, count * REISERFS_EXT_SIZE); misc_freemem (ni); return retval; } static int fsck_tree_insert_file (reiserfs_ih_t * ih, char * item, int check) { long long int retval, written; const reiserfs_key_t *p_key; const reiserfs_ih_t *p_ih; reiserfs_path_t path; reiserfs_key_t key; int count, pos; /* Check if the SD item exists */ if (check && fsck_tree_insert_prep(fs, ih, 0)) return 0; pos = 0; count = reiserfs_leaf_ibytes (ih, fs->fs_blocksize); reiserfs_key_copy (&key, &(ih->ih_key)); while (count) { if (count < 0) { reiserfs_panic ("%s: We wrote into the file %K more " "bytes than needed - count (%d) < 0.", __FUNCTION__, &key, count); } retval = reiserfs_tree_search_position (fs, &key, &path); if (retval == DIRECTORY_FOUND) { reiserfs_panic ("The directory was found at the place of the file " "we are going to insert the item %k into", &key); } written = 0; if (retval == POSITION_FOUND) { written = fsck_tree_overwrite_file (ih, item, &path, pos, check); } if (retval == POSITION_NOT_FOUND) { if (REISERFS_PATH_LEAF_POS (&path) >= reiserfs_node_items (REISERFS_PATH_LEAF(&path))) { p_key = reiserfs_tree_next_key(&path, fs); } else { p_key = &REISERFS_PATH_IH(&path)->ih_key; } if (path.pos_in_item == 0) { /* There is nothing of this file before the found item. Check the overlapping with the found/next item. */ if (fsck_tree_overwrite_prep(fs, p_key, &key, count)) { reiserfs_tree_pathrelse (&path); continue; } /* No overlapping, insert a new item. */ written = fsck_tree_create_item(fs, &path, ih, item, pos, check); } else { const reiserfs_key_t *next = reiserfs_tree_next_key(&path, fs); /* Check the overlapping with the next item. */ if (fsck_tree_overwrite_prep(fs, next, &key, count)) { reiserfs_tree_pathrelse (&path); continue; } /* No overlapping, convert the current into the extent and insert a new / append to the existent. */ p_ih = REISERFS_PATH_IH(&path); written = must_there_be_a_hole (p_ih, &key); if (written <= 0 && reiserfs_key_direct(p_key)) { reiserfs_tree_pathrelse(&path); fsck_tree_rewrite(fs, &p_ih->ih_key, reiserfs_key_get_off(&key) + 1, 1 << IH_Unreachable); continue; } if (written > 0) { REISERFS_PATH_LEAF_POS (&path) ++; path.pos_in_item = 0; written = fsck_tree_create_item(fs, &path, ih, item, pos, check); } else { written = fsck_tree_append_file (ih, item, pos, &path, check); } } } if (retval == FILE_NOT_FOUND) { written = fsck_tree_create_item(fs, &path, ih, item, pos, check); } reiserfs_tree_pathrelse (&path); count -= written; pos += written / (reiserfs_ih_direct(ih) ? 1 : fs->fs_blocksize); reiserfs_key_set_off (reiserfs_key_format (&key), &key, reiserfs_key_get_off (&key) + written); } /* This is a test for writing into the file. If not sure that file data are consistent after fsck_tree_insert_file - uncomment this clause: */ /* if (!check && are_file_items_correct (&ih->ih_key, (format == KEY_FORMAT_UNDEFINED) ? reiserfs_ih_get_format (ih) : format, &size, &blocks, 0, symlink, 0) == 0) reiserfs_panic ("%s: item was not inserted properly\n", __FUNCTION__);*/ return reiserfs_leaf_ibytes (ih, fs->fs_blocksize); } void fsck_tree_insert_item (reiserfs_ih_t * ih, char * item, int check) { if (reiserfs_key_get_did (&ih->ih_key) == reiserfs_key_get_oid (&ih->ih_key)) { reiserfs_panic ("%s: The item being inserted has " "the bad key %H", __FUNCTION__, ih); } if (reiserfs_ih_stat (ih)) { fsck_tree_insert_stat (ih, item, check); } else if (reiserfs_ih_dir (ih)) { fsck_tree_insert_entry (ih, item, check); } else { fsck_tree_insert_file (ih, item, check); } } void fsck_tree_trav (reiserfs_filsys_t * fs, path_func_t action1, path_func_t action2, int depth) { reiserfs_path_t path; reiserfs_bh_t *bh; int total[REISERFS_PATH_MAX] = {0,}; unsigned long limit, done; unsigned long block; int problem; int pos; memset(&path, 0, sizeof(path)); path.path_length = REISERFS_PATH_OFFINIT; done = 0; limit = 1; block = reiserfs_sb_get_root (fs->fs_ondisk_sb); if (reiserfs_fs_block(fs, block) != BT_UNKNOWN) { misc_die ("\nBad root block %lu. (--rebuild-tree " "did not complete)\n", block); } while ( 1 ) { problem = 0; if (REISERFS_PATH_LEAF(&path)) misc_die ("%s: empty slot expected.\n", __FUNCTION__); if (fs->fs_badblocks_bm && reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, block)) { fsck_log ("%s: block %lu specified in badblock list found in " "tree, whole subtree skipped\n", __FUNCTION__, block); fsck_data (fs)->check.bad_nodes++; one_more_corruption (fs, FATAL); if (path.path_length == REISERFS_PATH_OFFINIT) { reiserfs_buffer_close (REISERFS_PATH_LEAF(&path)); REISERFS_PATH_LEAF(&path) = 0; break; } problem = 1; } else { REISERFS_PATH_LEAF(&path) = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize); if (REISERFS_PATH_LEAF(&path) == 0) /* FIXME: handle case when read failed */ misc_die ("%s: unable to read %lu block on device 0x%x\n", __FUNCTION__, block, fs->fs_dev); if (action1) if ((problem = action1 (fs, &path))) { fsck_log (" the problem in the internal node occured " "(%lu), whole subtree is skipped\n", block); fsck_check_stat(fs)->bad_nodes++; if (path.path_length == REISERFS_PATH_OFFINIT) { reiserfs_buffer_close (REISERFS_PATH_LEAF(&path)); REISERFS_PATH_LEAF(&path) = 0; break; } } } /* Time to stop. */ if (path.path_length - REISERFS_PATH_OFFINIT == depth) problem ++; if (problem || reiserfs_leaf_head(REISERFS_PATH_LEAF(&path))) { if ((path.path_length > REISERFS_PATH_OFFINIT) && !fsck_quiet(fs)) { util_misc_progress (fsck_progress_file (fs), &done, limit, 1, 2); } if (!problem && action2) action2 (fs, &path); reiserfs_buffer_close (REISERFS_PATH_LEAF(&path)); while ((path.path_length > REISERFS_PATH_OFFINIT) && (REISERFS_PATH_POS(&path, path.path_length - 1) == total[path.path_length - 1] - 1 || problem)) { problem = 0; REISERFS_PATH_LEAF(&path) = 0; path.path_length --; reiserfs_buffer_close (REISERFS_PATH_LEAF(&path)); limit /= total[path.path_length]; done /= total[path.path_length]; } REISERFS_PATH_LEAF(&path) = 0; if (path.path_length == REISERFS_PATH_OFFINIT) break; bh = REISERFS_PATH_BUFFER(&path, path.path_length - 1); REISERFS_PATH_POS(&path, path.path_length - 1) ++; pos = REISERFS_PATH_POS(&path, path.path_length - 1); block = reiserfs_dc_get_nr(reiserfs_int_at(bh, pos)); continue; } total[path.path_length] = reiserfs_node_items (REISERFS_PATH_LEAF(&path)) + 1; limit *= total[path.path_length]; done = done * total[path.path_length]; REISERFS_PATH_LEAF_POS(&path) = 0; block = reiserfs_dc_get_nr (reiserfs_int_at (REISERFS_PATH_LEAF(&path), 0)); path.path_length ++; } } reiserfsprogs-3.6.20/utils/mkfs/0000777000175300001440000000000010412227616013604 500000000000000reiserfsprogs-3.6.20/utils/mkfs/Makefile.am0000644000175300001440000000145410412227267015562 00000000000000sbin_PROGRAMS = mkfs.reiserfs man_MANS = mkfs.reiserfs.8 EXTRA_DIST = mkfs.reiserfs.8 mkfs_reiserfs_SOURCES = mkreiserfs.c mkfs_reiserfs_LDADD = $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libmisc/libmisc-static.a mkfs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@ mkfs_reiserfs_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include uninstall-mkreiserfs: if test -f $(DESTDIR)$(sbindir)/mkreiserfs; then \ rm -f $(DESTDIR)$(sbindir)/mkreiserfs; \ fi; install-mkreiserfs: if test -f $(DESTDIR)$(sbindir)/mkfs.reiserfs; then \ rm -f $(DESTDIR)$(sbindir)/mkreiserfs; \ ln $(DESTDIR)$(sbindir)/mkfs.reiserfs $(DESTDIR)$(sbindir)/mkreiserfs; \ fi; install-data-local: install-mkreiserfs uninstall-local: uninstall-mkreiserfs reiserfsprogs-3.6.20/utils/mkfs/Makefile.in0000644000175300001440000004231410412227373015571 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = $(mkfs_reiserfs_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ sbin_PROGRAMS = mkfs.reiserfs$(EXEEXT) subdir = utils/mkfs DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(sbin_PROGRAMS) am_mkfs_reiserfs_OBJECTS = mkfs_reiserfs-mkreiserfs.$(OBJEXT) mkfs_reiserfs_OBJECTS = $(am_mkfs_reiserfs_OBJECTS) mkfs_reiserfs_DEPENDENCIES = \ $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libmisc/libmisc-static.a DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(mkfs_reiserfs_SOURCES) DIST_SOURCES = $(mkfs_reiserfs_SOURCES) man8dir = $(mandir)/man8 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ man_MANS = mkfs.reiserfs.8 EXTRA_DIST = mkfs.reiserfs.8 mkfs_reiserfs_SOURCES = mkreiserfs.c mkfs_reiserfs_LDADD = $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libmisc/libmisc-static.a mkfs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@ mkfs_reiserfs_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/mkfs/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu utils/mkfs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)" @list='$(sbin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(sbin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \ rm -f "$(DESTDIR)$(sbindir)/$$f"; \ done clean-sbinPROGRAMS: -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) mkfs.reiserfs$(EXEEXT): $(mkfs_reiserfs_OBJECTS) $(mkfs_reiserfs_DEPENDENCIES) @rm -f mkfs.reiserfs$(EXEEXT) $(LINK) $(mkfs_reiserfs_LDFLAGS) $(mkfs_reiserfs_OBJECTS) $(mkfs_reiserfs_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` mkfs_reiserfs-mkreiserfs.o: mkreiserfs.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mkfs_reiserfs_CFLAGS) $(CFLAGS) -MT mkfs_reiserfs-mkreiserfs.o -MD -MP -MF "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Tpo" -c -o mkfs_reiserfs-mkreiserfs.o `test -f 'mkreiserfs.c' || echo '$(srcdir)/'`mkreiserfs.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Tpo" "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Po"; else rm -f "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mkreiserfs.c' object='mkfs_reiserfs-mkreiserfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mkfs_reiserfs_CFLAGS) $(CFLAGS) -c -o mkfs_reiserfs-mkreiserfs.o `test -f 'mkreiserfs.c' || echo '$(srcdir)/'`mkreiserfs.c mkfs_reiserfs-mkreiserfs.obj: mkreiserfs.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mkfs_reiserfs_CFLAGS) $(CFLAGS) -MT mkfs_reiserfs-mkreiserfs.obj -MD -MP -MF "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Tpo" -c -o mkfs_reiserfs-mkreiserfs.obj `if test -f 'mkreiserfs.c'; then $(CYGPATH_W) 'mkreiserfs.c'; else $(CYGPATH_W) '$(srcdir)/mkreiserfs.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Tpo" "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Po"; else rm -f "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mkreiserfs.c' object='mkfs_reiserfs-mkreiserfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mkfs_reiserfs_CFLAGS) $(CFLAGS) -c -o mkfs_reiserfs-mkreiserfs.obj `if test -f 'mkreiserfs.c'; then $(CYGPATH_W) 'mkreiserfs.c'; else $(CYGPATH_W) '$(srcdir)/mkreiserfs.c'; fi` uninstall-info-am: install-man8: $(man8_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)" @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.8*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 8*) ;; \ *) ext='8' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \ done uninstall-man8: @$(NORMAL_UNINSTALL) @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.8*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 8*) ;; \ *) ext='8' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man8dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-data-local install-man install-exec-am: install-sbinPROGRAMS install-info: install-info-am install-man: install-man8 installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am uninstall-local uninstall-man \ uninstall-sbinPROGRAMS uninstall-man: uninstall-man8 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-sbinPROGRAMS ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-exec \ install-exec-am install-info install-info-am install-man \ install-man8 install-sbinPROGRAMS install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am uninstall-local uninstall-man \ uninstall-man8 uninstall-sbinPROGRAMS uninstall-mkreiserfs: if test -f $(DESTDIR)$(sbindir)/mkreiserfs; then \ rm -f $(DESTDIR)$(sbindir)/mkreiserfs; \ fi; install-mkreiserfs: if test -f $(DESTDIR)$(sbindir)/mkfs.reiserfs; then \ rm -f $(DESTDIR)$(sbindir)/mkreiserfs; \ ln $(DESTDIR)$(sbindir)/mkfs.reiserfs $(DESTDIR)$(sbindir)/mkreiserfs; \ fi; install-data-local: install-mkreiserfs uninstall-local: uninstall-mkreiserfs # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/utils/mkfs/mkfs.reiserfs.80000644000175300001440000001077210412227267016403 00000000000000.\" -*- nroff -*- .\" Copyright 1996-2004 Hans Reiser. .\" .TH mkfs.reiserfs 8 "February 2004" "Reiserfsprogs-3.6.19" .SH NAME mkfs.reiserfs \- The create tool for the Linux ReiserFS filesystem. .SH SYNOPSIS .B mkfs.reiserfs [ \fB-dfV\fR ] [ \fB-b\fR | \fB--block-size \fIN\fR ] [ \fB-h\fR | \fB--hash \fIHASH\fR ] [ \fB-u\fR | \fB--uuid \fIUUID\fR ] [ \fB-l\fR | \fB--label \fILABEL\fR ] [ \fB--format \fIFORMAT\fR ] [ \fB-q\fR | \fB--quiet\fR ] [ \fB-j\fR | \fB--journal-device \fIFILE\fR ] [ \fB-s\fR | \fB--journal-size \fIN\fR ] [ \fB-o\fR | \fB--journal-offset \fIN\fR ] [ \fB-t\fR | \fB--transaction-max-size\fR \fIN\fR ] [ \fB-B\fR | \fB--badblocks\fR \fIfile\fR ] \fI device\fR [ \fIfilesystem-size\fR ] .SH DESCRIPTION \fBmkfs.reiserfs\fR creates a Linux ReiserFS filesystem on a device (usually a disk partition). .TP .I device is the special file corresponding to a device or to a partition (e.g /dev/hdXX for an IDE disk partition or /dev/sdXX for a SCSI disk partition). .TP .I filesystem-size is the size in blocks of the filesystem. If omitted, \fBmkfs.reiserfs\fR will automatically set it. .SH OPTIONS .TP \fB-b\fR | \fB--block-size \fIN\fR \fIN\fR is block size in bytes. It may only be set to a power of 2 within the 512-8192 interval. .TP \fB-h\fR | \fB--hash \fIHASH\fR \fIHASH\fR specifies which hash function will sort the names in the directories. Choose from r5, rupasov, or tea. r5 is the default one. .TP \fB--format \fIFORMAT\fR \fIFORMAT\fR specifies the format for the new filsystem. Choose format 3.5 or 3.6. If none is specified \fBmkfs.reiserfs\fR will create format 3.6 if running kernel is 2.4 or higher, and format 3.5 if kernel 2.2 is running, and will refuse creation under all other kernels. .TP \fB-u\fR | \fB--uuid \fIUUID\fR Sets the Universally Unique IDentifier of the filesystem to \fIUUID\fR (see also \fBuuidgen(8)\fR). The format of the \fIUUID\fR is a series of hex digits separated by hypthens, e.g.: "c1b9d5a2-f162-11cf-9ece-0020afc76f16". If the option is skipped, \fBmkfs.reiserfs\fR will by default generate a new \fIUUID\fR. .TP \fB-l\fR | \fB--label \fILABEL\fR Sets the volume label of the filesystem. \fILABEL\fR can at most be 16 characters long; if it is longer than 16 characters, \fBmkfs.reiserfs\fR will truncate it. .TP \fB-q\fR | \fB--quiet \fR Sets \fBmkfs.reiserfs\fR to work quietly without producing messages, progress or questions. It is useful, but only for use by end users, if you run \fBmkfs.reiserfs\fR in a script. .TP \fB-j\fR | \fB--journal-device \fIFILE\fR \fIFILE\fR is the name of the block device on which is to be places the filesystem journal. .TP \fB-o\fR | \fB--journal-offset \fIN\fR \fIN\fR is the offset where the journal starts when it is to be on a separate device. Default is 0. \fIN\fR has no effect when the journal is to be on the host device. .TP \fB-s\fR | \fB--journal-size \fIN \fIN\fR is the size of the journal in blocks. When the journal is to be on a separate device, its size defaults to the number of blocks that the device has. When journal is to be on the host device, its size defaults to 8193 and the maximal possible size is 32749 (for blocksize 4k). The minimum size is 513 blocks (whether the journal is on the host or on a separate device). .TP \fB-t\fR | \fB--transaction-max-size \fIN \fIN\fR is the maximum transaction size parameter for the journal. The default, and max possible, value is 1024 blocks. It should be less than half the size of the journal. If specified incorrectly, it will automatically be adjusted. .TP \fB-B\fR | \fB--badblocks \fIfile \fIFile\fR is the file name of the file that contains the list of blocks to be marked as bad on the filesystem. This list can be created by \fB/sbin/badblocks -b block-size device\fR. .TP \fB-f\fR Forces \fBmkfs.reiserfs\fR to continue even when the device is the whole disk, looks mounted, or is not a block device. If \fB-f\fR is specified more than once, it allows the user to avoid asking for confirmation. .TP \fB-d\fR Sets \fBmkfs.reiserfs\fR to print debugging information during \fBmkfs.reiserfs\fR. .TP \fB-V\fR Prints the version and then exits. .SH AUTHOR This version of .B mkfs.reiserfs has been written by Edward Shishkin . .SH BUGS Please report bugs to the ReiserFS developers , providing as much information as possible--your hardware, kernel, patches, settings, all printed messages; check the syslog file for any related information. .SH SEE ALSO .BR fsck.reiserfs (8), .BR debugfs.reiserfs (8), .BR tunefs.reiserfs (8) reiserfsprogs-3.6.20/utils/mkfs/mkreiserfs.c0000644000175300001440000005272710412227267016055 00000000000000/* * Copyright 1996-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ /* mkreiserfs is very simple. It skips first 64k of device, and then writes the super block, the needed amount of bitmap blocks (this amount is calculated based on file system size), and root block. Bitmap policy is primitive: it assumes, that device does not have unreadable blocks, and it occupies first blocks for super, bitmap and root blocks. bitmap blocks are interleaved across the disk, mainly to make resizing faster. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "reiserfs/libreiserfs.h" #include "misc/device.h" #include "util/device.h" #include "util/misc.h" #include "util/credits.h" #include "util/print.h" #include "util/badblock.h" #include #include #include #include #include #include #ifdef HAVE_UNAME # include #endif #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) # include #endif char *program_name; static void message( const char * fmt, ... ) __attribute__ ((format (printf, 1, 2))); static void message( const char * fmt, ... ) { char buf[4096]; va_list args; buf[0] = '\0'; va_start( args, fmt ); vsprintf( buf, fmt, args ); va_end( args ); if( buf[0] != '\0') { fprintf( stderr, "%s: %s\n", program_name, buf ); } } static void print_usage_and_exit(void) { fprintf(stderr, "Usage: %s [options] " " device [block-count]\n" "\n" "Options:\n\n" " -b | --block-size N size of file-system block, in bytes\n" " -j | --journal-device FILE path to separate device to hold journal\n" " -s | --journal-size N size of the journal in blocks\n" " -o | --journal-offset N offset of the journal from the start of\n" " the separate device, in blocks\n" " -t | --transaction-max-size N maximal size of transaction, in blocks\n" " -B | --badblocks file store all bad blocks given in file on the fs\n" " -h | --hash rupasov|tea|r5 hash function to use by default\n" " -u | --uuid UUID store UUID in the superblock\n" " -l | --label LABEL store LABEL in the superblock\n" " --format 3.5|3.6 old 3.5 format or newer 3.6\n" " -f | --force specified once, make mkreiserfs the whole\n" " disk, not block device or mounted partition;\n" " specified twice, do not ask for confirmation\n" " -q | --quiet quiet work without messages, progress and\n" " questions. Useful if run in a script. For use\n" " by end users only.\n" " -d | --debug print debugging information during mkreiser\n" " -V print version and exit\n", program_name); exit (1); } int Create_default_journal = 1; int Block_size = 4096; /* size of journal + 1 block for journal header */ unsigned long Journal_size = 0; int Max_trans_size = 0; //JOURNAL_TRANS_MAX; int Hash = DEFAULT_HASH; int Offset = 0; char * Format; char UUID[16]; char * LABEL = NULL; char * badblocks_file; enum mkfs_mode { DEBUG_MODE = 1 << 0, QUIET_MODE = 1 << 1, DO_NOTHING = 1 << 2 }; int mode; /* form super block (old one) */ static void make_super_block (reiserfs_filsys_t * fs) { reiserfs_sb_set_umount (fs->fs_ondisk_sb, FS_CLEANLY_UMOUNTED); reiserfs_sb_set_height (fs->fs_ondisk_sb, 2); reiserfs_sb_set_hash (fs->fs_ondisk_sb, Hash); if (fs->fs_format == REISERFS_FORMAT_3_6) { #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) if (uuid_is_null(UUID)) uuid_generate(UUID); memcpy (fs->fs_ondisk_sb->s_uuid, UUID, 16); #endif if (LABEL != NULL) { if (strlen (LABEL) > 16) reiserfs_warning (stderr, "\nSpecified LABEL is longer then 16 " "characters, will be truncated\n\n"); strncpy ((char *)fs->fs_ondisk_sb->s_label, LABEL, 16); } reiserfs_sb_mkflag (fs->fs_ondisk_sb, reiserfs_attrs_cleared); } if (!reiserfs_super_jr_magic (fs->fs_ondisk_sb) || strcmp (fs->fs_file_name, fs->fs_j_file_name)) /* either standard journal (and we leave all new fields to be 0) or journal is created on separate device so there is no space on data device which can be used as a journal */ reiserfs_sb_set_reserved (fs->fs_ondisk_sb, 0); else reiserfs_sb_set_reserved (fs->fs_ondisk_sb, reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb)) + 1); if (fs->fs_badblocks_bm) reiserfs_sb_set_free(fs->fs_ondisk_sb, reiserfs_sb_get_free(fs->fs_ondisk_sb) - fs->fs_badblocks_bm->bm_set_bits); } /* wipe out first 64 k of a device and both possible reiserfs super block */ static void invalidate_other_formats (int dev) { reiserfs_bh_t * bh; bh = reiserfs_buffer_read (dev, 0, 64 * 1024); if (!bh) { reiserfs_exit(1, "Unable to read first blocks of the device"); } #if defined(__sparc__) || defined(__sparc_v9__) memset (bh->b_data + 1024, 0, bh->b_size - 1024); #else memset (bh->b_data, 0, bh->b_size); #endif reiserfs_buffer_mkuptodate (bh, 1); reiserfs_buffer_mkdirty (bh); reiserfs_buffer_write (bh); reiserfs_buffer_close (bh); } void zero_journal (reiserfs_filsys_t * fs) { unsigned long start, len, done; reiserfs_bh_t * bh; unsigned int i; fprintf (stdout, "Initializing journal - "); start = reiserfs_jp_get_start (reiserfs_sb_jp (fs->fs_ondisk_sb)); len = reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb)); done = 0; for (i = 0; i < len; i ++) { util_misc_progress (stdout, &done, len, 1, 2); bh = reiserfs_buffer_open (fs->fs_journal_dev, start + i, fs->fs_blocksize); if (!bh) { reiserfs_exit(1, "zero_journal: reiserfs_buffer_open failed"); } memset (bh->b_data, 0, bh->b_size); reiserfs_buffer_mkdirty (bh); reiserfs_buffer_mkuptodate (bh, 1); reiserfs_buffer_write (bh); reiserfs_buffer_close (bh); } fprintf (stdout, "\n"); fflush (stdout); } /* this only sets few first bits in bitmap block. Fills not initialized fields of super block (root block and bitmap block numbers) */ static void make_bitmap (reiserfs_filsys_t * fs) { reiserfs_sb_t * sb; unsigned int i; unsigned long block; unsigned long count, bmap_nr; int marked; sb = fs->fs_ondisk_sb; count = reiserfs_sb_get_blocks (sb); marked = 0; /* mark skipped area and super block */ for (i = 0; i <= fs->fs_super_bh->b_blocknr; i ++) { reiserfs_bitmap_set_bit (fs->fs_bitmap2, i); marked ++; } if (fs->fs_badblocks_bm) { for (i = 0; i < count; i ++) { if (reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i)) { reiserfs_bitmap_set_bit (fs->fs_bitmap2, i); marked ++; } } } /* mark bitmaps as used */ block = fs->fs_super_bh->b_blocknr + 1; bmap_nr = reiserfs_bmap_nr(count, fs->fs_blocksize); for (i = 0; i < bmap_nr; i ++) { reiserfs_bitmap_set_bit (fs->fs_bitmap2, block); marked ++; if (reiserfs_bitmap_spread (fs)) block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8); else block ++; } if (!reiserfs_journal_hostsize (fs->fs_ondisk_sb)) /* root block follows directly super block and first bitmap */ block = fs->fs_super_bh->b_blocknr + 1 + 1; else { /* makr journal blocks as used */ for (i = 0; i <= reiserfs_jp_get_size (reiserfs_sb_jp (sb)); i ++) { reiserfs_bitmap_set_bit (fs->fs_bitmap2, i + reiserfs_jp_get_start (reiserfs_sb_jp (sb))); marked ++; } block = reiserfs_jp_get_start (reiserfs_sb_jp (sb)) + i; } /*get correct block - not journal nor bitmap*/ while (reiserfs_journal_block (fs, block) || reiserfs_bitmap_block (fs, block)) { block++; } while ((block < count) && reiserfs_bitmap_test_bit (fs->fs_bitmap2, block)) { block++; } if (block >= count) reiserfs_exit(1, "mkreiserfs: too many bad blocks"); reiserfs_bitmap_set_bit (fs->fs_bitmap2, block); marked ++; reiserfs_sb_set_root (sb, block); reiserfs_sb_set_free (sb, count - marked); } static void set_root_dir_nlink (reiserfs_ih_t *ih, void *sd) { __u32 nlink; nlink = 3; reiserfs_stat_set_nlink (ih, sd, &nlink); } /* form the root block of the tree (the block head, the item head, the root directory) */ static void make_root_block (reiserfs_filsys_t * fs) { reiserfs_sb_t * sb; reiserfs_bh_t * bh; sb = fs->fs_ondisk_sb; /* get memory for root block */ bh = reiserfs_buffer_open (fs->fs_dev, reiserfs_sb_get_root (sb), reiserfs_sb_get_blksize (sb)); if (!bh) { reiserfs_exit(1, "reiserfs_buffer_open failed"); } reiserfs_buffer_mkuptodate (bh, 1); reiserfs_leaf_mkempty (bh); reiserfs_tree_root (fs, set_root_dir_nlink, 0); reiserfs_buffer_close (bh); reiserfs_objmap_set (fs, REISERFS_ROOT_PARENT_OBJECTID); reiserfs_objmap_set (fs, REISERFS_ROOT_OBJECTID); } static void report (reiserfs_filsys_t * fs, char * j_filename) { reiserfs_sb_t * sb = (reiserfs_sb_t *)(fs->fs_super_bh->b_data); struct stat st; dev_t rdev; if (!reiserfs_super_magic (sb)) return; if (fstat (fs->fs_super_bh->b_dev, &st) == -1) { /*reiserfs_warning (stderr, "fstat failed: %s\n", strerror(errno));*/ rdev = 0; } else rdev = st.st_rdev; if (mode & DEBUG_MODE) { reiserfs_warning (stdout, "Block %lu (0x%x) contains super block. ", fs->fs_super_bh->b_blocknr, rdev); } switch (reiserfs_super_format (sb)) { case REISERFS_FORMAT_3_5: reiserfs_warning (stdout, " Format 3.5 with "); break; case REISERFS_FORMAT_3_6: reiserfs_warning (stdout, "Format 3.6 with "); break; } if (reiserfs_super_jr_magic (sb)) reiserfs_warning (stdout, "non-"); reiserfs_warning (stdout, "standard journal\n"); reiserfs_warning (stdout, "Count of blocks on the device: %u\n", reiserfs_sb_get_blocks (sb)); reiserfs_warning (stdout, "Number of blocks consumed by mkreiserfs " "formatting process: %u\n", reiserfs_sb_get_blocks (sb) - reiserfs_sb_get_free (sb)); if (mode & DEBUG_MODE) reiserfs_warning (stdout, "Free blocks: %u\n", reiserfs_sb_get_free (sb)); reiserfs_warning (stdout, "Blocksize: %d\n", reiserfs_sb_get_blksize (sb)); reiserfs_warning (stdout, "Hash function used to sort names: %s\n", reiserfs_hash_name (reiserfs_sb_get_hash (sb))); if (mode & DEBUG_MODE) { reiserfs_warning (stdout, "Number of bitmaps: %u\n", reiserfs_sb_get_bmaps (sb)); reiserfs_warning (stdout, "Root block: %u\n", reiserfs_sb_get_root (sb)); reiserfs_warning (stdout, "Tree height: %d\n", reiserfs_sb_get_height (sb)); reiserfs_warning (stdout, "Objectid map size %d, max %d\n", reiserfs_sb_get_mapcur (sb), reiserfs_sb_get_mapmax (sb)); reiserfs_warning (stdout, "Journal parameters:\n"); reiserfs_journal_print_params (stdout, reiserfs_sb_jp (sb)); } else { if (j_filename && strcmp (j_filename, fs->fs_file_name)) reiserfs_warning (stdout, "Journal Device [0x%x]\n", reiserfs_jp_get_dev (reiserfs_sb_jp (sb))); reiserfs_warning (stdout, "Journal Size %u blocks (first block %u)\n", reiserfs_jp_get_size (reiserfs_sb_jp (sb)) + 1, reiserfs_jp_get_start (reiserfs_sb_jp (sb))); reiserfs_warning (stdout, "Journal Max transaction length %u\n", reiserfs_jp_get_tlen (reiserfs_sb_jp (sb))); } if (j_filename && strcmp (j_filename, fs->fs_file_name)) { reiserfs_warning (stdout, "Space on this device reserved by journal: " "%u\n", reiserfs_sb_get_reserved (sb)); } if (mode & DEBUG_MODE) { reiserfs_warning (stdout, "Filesystem state 0x%x\n", reiserfs_sb_get_state (sb)); reiserfs_warning (stdout, "sb_version %u\n", reiserfs_sb_get_version (sb)); } if (reiserfs_super_format (sb) == REISERFS_FORMAT_3_6) { reiserfs_warning (stdout, "inode generation number: %u\n", reiserfs_sb_get_gen (sb)); reiserfs_warning (stdout, "UUID: %U\n", sb->s_uuid); if (strcmp ((char *)sb->s_label, "")) reiserfs_warning (stdout, "LABEL: %s\n", sb->s_label); } return; } static void set_hash_function (char * str) { if (!strcmp (str, "tea")) Hash = REISERFS_HASH_TEA; else if (!strcmp (str, "rupasov")) Hash = REISERFS_HASH_YURA; else if (!strcmp (str, "r5")) Hash = REISERFS_HASH_R5; else message("wrong hash type specified. Using default"); } static void set_reiserfs_version (char * str) { if (!strcmp (str, "3.5")) Format = "3.5"; else { Format = "3.6"; if (strcmp (str, "3.6")) message("wrong reiserfs version specified. " "Using default 3.6 format"); } } static int str2int (char * str) { int val; char * tmp; val = (int) strtol (str, &tmp, 0); if (*tmp) { reiserfs_exit (1, "%s: strtol is unable to make an integer of %s\n", program_name, str); } return val; } static void set_block_size (char * str, int *b_size) { *b_size = str2int (str); if (!reiserfs_fs_blksize_check (*b_size)) reiserfs_exit (1, "%s: wrong blocksize %s specified, " "only power of 2 from 512-8192 interval " "are supported", program_name, str); } static void set_transaction_max_size (char * str) { Max_trans_size = str2int( str ); } /* reiserfs_journal_create will check this */ static void set_journal_device_size (char * str) { Journal_size = str2int (str); /* if (Journal_size < JOURNAL_MIN_SIZE) misc_die ("%s: wrong journal size specified: %lu. Should be at least %u", program_name, Journal_size + 1, JOURNAL_MIN_SIZE + 1); */ } /* reiserfs_journal_create will check this */ static void set_offset_in_journal_device (char * str) { Offset = str2int( str ); } static int is_journal_default (char * name, char * jname, int blocksize) { if (jname && strcmp (name, jname)) return 0; if (Journal_size && Journal_size != reiserfs_journal_default(REISERFS_DISK_OFFSET_IN_BYTES / blocksize, blocksize) + 1) /* journal size is set and it is not default size */ return 0; if (Max_trans_size && Max_trans_size != JOURNAL_TRANS_MAX) return 0; return 1; } /* if running kernel is 2.2 - mkreiserfs creates 3.5 format, if 2.4 - 3.6, otherwise - mkreiserfs fails */ static int select_format (void) { #ifdef HAVE_UNAME struct utsname sysinfo; #endif char *release = NULL; if (Format) { if (!strcmp (Format, "3.5")) return REISERFS_FORMAT_3_5; if (strcmp (Format, "3.6")) { message ("Unknown fromat %s specified\n", Format); exit (1); } return REISERFS_FORMAT_3_6; } #ifdef HAVE_UNAME reiserfs_warning (stdout, "Guessing about desired format.. "); if (uname (&sysinfo) == -1) { message ("could not get system info: %s", strerror(errno)); exit (1); } reiserfs_warning(stdout, "Kernel %s is running.\n", sysinfo.release); release = sysinfo.release; #endif if (!release) { message("Failed to detect the running kernel. To create " "reiserfs filesystem\nspecify desired format with " "--format. Choose 3.5 if you use 2.2 kernel;\n3.6 " "if 2.4 or higher."); exit(1); } if (strncmp (release, "2.4", 3) >= 0) return REISERFS_FORMAT_3_6; if (strncmp (release, "2.2", 3)) { message( "You should run either 2.2 or 2.4 or higher to be able " "to create reiserfs filesystem or specify desired format with --format"); exit (1); } reiserfs_warning(stdout, "Creating filesystem of format 3.5\n"); return REISERFS_FORMAT_3_5; } /* Reads the "CREDITS" file and prints one paragraph from it. */ static void mkfs_print_credit(FILE *out) { char *line; __u32 num1, num2; fprintf(out, "A pair of credits:\n"); srandom (time (0)); num1 = random() % CREDITS_COUNT; line = credits[num1]; fprintf(out, "%s\n", line); while ((num1 == (num2 = random() % CREDITS_COUNT))) {} line = credits[num2]; fprintf(out, "%s\n", line); } int main (int argc, char **argv) { reiserfs_filsys_t * fs; int force = 0; char * device_name = NULL; char * jdevice_name = NULL; unsigned long fs_size = 0; int c; static int flag; program_name = strrchr( argv[ 0 ], '/' ); if (program_name) program_name++; else program_name = argv[ 0 ]; if (argc < 2) print_usage_and_exit (); memset(UUID, 0, 16); while (1) { static struct option options[] = { {"block-size", required_argument, 0, 'b'}, {"journal-device", required_argument, 0, 'j'}, {"journal-size", required_argument, 0, 's'}, {"transaction-max-size", required_argument, 0, 't'}, {"journal-offset", required_argument, 0, 'o'}, {"badblocks", required_argument, 0, 'B'}, {"hash", required_argument, 0, 'h'}, {"uuid", required_argument, 0, 'u'}, {"label", required_argument, 0, 'l'}, {"format", required_argument, &flag, 1}, {0, 0, 0, 0} }; int option_index; c = getopt_long (argc, argv, "b:j:s:t:o:h:u:l:VfdB:q", options, &option_index); if (c == -1) break; switch (c) { case 0: if (flag) { Format = optarg; flag = 0; } break; case 'b': /* --block-size */ set_block_size (optarg, &Block_size); break; case 'j': /* --journal-device */ Create_default_journal = 0; jdevice_name = optarg; break; case 's': /* --journal-size */ Create_default_journal = 0; set_journal_device_size (optarg); break; case 't': /* --transaction-max-size */ Create_default_journal = 0; set_transaction_max_size (optarg); break; case 'o': /* --offset */ Create_default_journal = 0; set_offset_in_journal_device (optarg); break; case 'B': /* --badblock-list */ badblocks_file = optarg; break; case 'h': /* --hash */ set_hash_function (optarg); break; case 'v': /* --format */ set_reiserfs_version (optarg); break; case 'V': mode = DO_NOTHING; break; case 'f': force ++; break; case 'd': mode |= DEBUG_MODE; break; case 'u': #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) if (uuid_parse(optarg, UUID) < 0) { reiserfs_warning(stderr, "Invalid UUID '%s' is " "specified\n", optarg); return 1; } #else message ("Cannot set up the UUID, uuidlib was not " "found by configure.\n"); return 1; #endif break; case 'l': LABEL = optarg; break; case 'q': mode |= QUIET_MODE; break; default: print_usage_and_exit(); } } util_print_banner(program_name); mkfs_print_credit(stdout); printf("\n"); if (mode & QUIET_MODE) fclose(stdout); if (mode == DO_NOTHING) exit(0); /* device to be formatted */ device_name = argv [optind]; if (optind == argc - 2) { /* number of blocks for filesystem is specified */ fs_size = str2int (argv[optind + 1]); } else if (optind == argc - 1) { /* number of blocks is not specified */ if (!(fs_size = misc_device_count_blocks (device_name, Block_size))) exit(1); } else { print_usage_and_exit (); } if (is_journal_default (device_name, jdevice_name, Block_size)) Create_default_journal = 1; if (!(mode & QUIET_MODE) && !util_device_formatable (device_name, force)) return 1; if (jdevice_name) if (!(mode & QUIET_MODE) && !util_device_formatable (jdevice_name, force)) return 1; fs = reiserfs_fs_create (device_name, select_format(), fs_size, Block_size, Create_default_journal, 1); if (!fs) { return 1; } if (!reiserfs_journal_create (fs, jdevice_name, Offset, Journal_size, Max_trans_size)) { return 1; } if (!(fs->fs_bitmap2 = reiserfs_bitmap_create(fs_size))) return 1; /* these fill buffers (super block, first bitmap, root block) with reiserfs structures */ #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) if (!uuid_is_null(UUID) && fs->fs_format != REISERFS_FORMAT_3_6) { reiserfs_warning(stderr, "UUID can be specified only with 3.6 format\n"); return 1; } #endif if (badblocks_file) { if (util_badblock_load (fs, badblocks_file)) exit(1); } make_super_block (fs); make_bitmap (fs); make_root_block (fs); reiserfs_badblock_flush (fs, 1); report (fs, jdevice_name); if (!force && !(mode & QUIET_MODE)) { fprintf (stderr, "ATTENTION: YOU SHOULD REBOOT AFTER FDISK!\n" "\tALL DATA WILL BE LOST ON '%s'", device_name); if (jdevice_name && strcmp (jdevice_name, device_name)) fprintf (stderr, " AND ON JOURNAL DEVICE '%s'", jdevice_name); if (!util_user_confirmed (stderr, "!\nContinue (y/n):", "y\n")) return 1; } invalidate_other_formats (fs->fs_dev); zero_journal (fs); reiserfs_fs_close (fs); printf ("Syncing.."); fflush (stdout); sync (); printf ("ok\n"); if (mode & DEBUG_MODE) return 0; printf("\nTell your friends to use a kernel based on 2.4.18 or " "later, and especially not a\nkernel based on 2.4.9, " "when you use reiserFS. Have fun.\n\n"); printf("ReiserFS is successfully created on %s.\n", device_name); return 0; } /* * Use BSD fomatting. * Local variables: * c-indentation-style: "bsd" * mode-name: "BSDC" * c-basic-offset: 4 * tab-width: 4 * End: */ reiserfsprogs-3.6.20/utils/resizer/0000777000175300001440000000000010412227620014322 500000000000000reiserfsprogs-3.6.20/utils/resizer/Makefile.am0000644000175300001440000000167710412227267016314 00000000000000sbin_PROGRAMS = resizefs.reiserfs man_MANS = resizefs.reiserfs.8 EXTRA_DIST = resizefs.reiserfs.8 resizefs_reiserfs_SOURCES = fe.c resize_reiserfs.c do_shrink.c resize.h resizefs_reiserfs_LDADD = $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libmisc/libmisc-static.a resizefs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@ resizefs_reiserfs_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include uninstall-resize_reiserfs: if test -f $(DESTDIR)$(sbindir)/resize_reiserfs; then \ rm -f $(DESTDIR)$(sbindir)/resize_reiserfs; \ fi; install-resize_reiserfs: if test -f $(DESTDIR)$(sbindir)/resizefs.reiserfs; then \ rm -f $(DESTDIR)$(sbindir)/resize_reiserfs; \ ln $(DESTDIR)$(sbindir)/resizefs.reiserfs $(DESTDIR)$(sbindir)/resize_reiserfs; \ fi; install-data-local: install-resize_reiserfs uninstall-local: uninstall-resize_reiserfs reiserfsprogs-3.6.20/utils/resizer/Makefile.in0000644000175300001440000005336010412227373016317 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = $(resizefs_reiserfs_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ sbin_PROGRAMS = resizefs.reiserfs$(EXEEXT) subdir = utils/resizer DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(sbin_PROGRAMS) am_resizefs_reiserfs_OBJECTS = resizefs_reiserfs-fe.$(OBJEXT) \ resizefs_reiserfs-resize_reiserfs.$(OBJEXT) \ resizefs_reiserfs-do_shrink.$(OBJEXT) resizefs_reiserfs_OBJECTS = $(am_resizefs_reiserfs_OBJECTS) resizefs_reiserfs_DEPENDENCIES = \ $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libmisc/libmisc-static.a DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(resizefs_reiserfs_SOURCES) DIST_SOURCES = $(resizefs_reiserfs_SOURCES) man8dir = $(mandir)/man8 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ man_MANS = resizefs.reiserfs.8 EXTRA_DIST = resizefs.reiserfs.8 resizefs_reiserfs_SOURCES = fe.c resize_reiserfs.c do_shrink.c resize.h resizefs_reiserfs_LDADD = $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libmisc/libmisc-static.a resizefs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@ resizefs_reiserfs_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/resizer/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu utils/resizer/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)" @list='$(sbin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(sbin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \ rm -f "$(DESTDIR)$(sbindir)/$$f"; \ done clean-sbinPROGRAMS: -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) resizefs.reiserfs$(EXEEXT): $(resizefs_reiserfs_OBJECTS) $(resizefs_reiserfs_DEPENDENCIES) @rm -f resizefs.reiserfs$(EXEEXT) $(LINK) $(resizefs_reiserfs_LDFLAGS) $(resizefs_reiserfs_OBJECTS) $(resizefs_reiserfs_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resizefs_reiserfs-do_shrink.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resizefs_reiserfs-fe.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` resizefs_reiserfs-fe.o: fe.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -MT resizefs_reiserfs-fe.o -MD -MP -MF "$(DEPDIR)/resizefs_reiserfs-fe.Tpo" -c -o resizefs_reiserfs-fe.o `test -f 'fe.c' || echo '$(srcdir)/'`fe.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/resizefs_reiserfs-fe.Tpo" "$(DEPDIR)/resizefs_reiserfs-fe.Po"; else rm -f "$(DEPDIR)/resizefs_reiserfs-fe.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fe.c' object='resizefs_reiserfs-fe.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -c -o resizefs_reiserfs-fe.o `test -f 'fe.c' || echo '$(srcdir)/'`fe.c resizefs_reiserfs-fe.obj: fe.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -MT resizefs_reiserfs-fe.obj -MD -MP -MF "$(DEPDIR)/resizefs_reiserfs-fe.Tpo" -c -o resizefs_reiserfs-fe.obj `if test -f 'fe.c'; then $(CYGPATH_W) 'fe.c'; else $(CYGPATH_W) '$(srcdir)/fe.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/resizefs_reiserfs-fe.Tpo" "$(DEPDIR)/resizefs_reiserfs-fe.Po"; else rm -f "$(DEPDIR)/resizefs_reiserfs-fe.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fe.c' object='resizefs_reiserfs-fe.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -c -o resizefs_reiserfs-fe.obj `if test -f 'fe.c'; then $(CYGPATH_W) 'fe.c'; else $(CYGPATH_W) '$(srcdir)/fe.c'; fi` resizefs_reiserfs-resize_reiserfs.o: resize_reiserfs.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -MT resizefs_reiserfs-resize_reiserfs.o -MD -MP -MF "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Tpo" -c -o resizefs_reiserfs-resize_reiserfs.o `test -f 'resize_reiserfs.c' || echo '$(srcdir)/'`resize_reiserfs.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Tpo" "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Po"; else rm -f "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='resize_reiserfs.c' object='resizefs_reiserfs-resize_reiserfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -c -o resizefs_reiserfs-resize_reiserfs.o `test -f 'resize_reiserfs.c' || echo '$(srcdir)/'`resize_reiserfs.c resizefs_reiserfs-resize_reiserfs.obj: resize_reiserfs.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -MT resizefs_reiserfs-resize_reiserfs.obj -MD -MP -MF "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Tpo" -c -o resizefs_reiserfs-resize_reiserfs.obj `if test -f 'resize_reiserfs.c'; then $(CYGPATH_W) 'resize_reiserfs.c'; else $(CYGPATH_W) '$(srcdir)/resize_reiserfs.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Tpo" "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Po"; else rm -f "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='resize_reiserfs.c' object='resizefs_reiserfs-resize_reiserfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -c -o resizefs_reiserfs-resize_reiserfs.obj `if test -f 'resize_reiserfs.c'; then $(CYGPATH_W) 'resize_reiserfs.c'; else $(CYGPATH_W) '$(srcdir)/resize_reiserfs.c'; fi` resizefs_reiserfs-do_shrink.o: do_shrink.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -MT resizefs_reiserfs-do_shrink.o -MD -MP -MF "$(DEPDIR)/resizefs_reiserfs-do_shrink.Tpo" -c -o resizefs_reiserfs-do_shrink.o `test -f 'do_shrink.c' || echo '$(srcdir)/'`do_shrink.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/resizefs_reiserfs-do_shrink.Tpo" "$(DEPDIR)/resizefs_reiserfs-do_shrink.Po"; else rm -f "$(DEPDIR)/resizefs_reiserfs-do_shrink.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='do_shrink.c' object='resizefs_reiserfs-do_shrink.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -c -o resizefs_reiserfs-do_shrink.o `test -f 'do_shrink.c' || echo '$(srcdir)/'`do_shrink.c resizefs_reiserfs-do_shrink.obj: do_shrink.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -MT resizefs_reiserfs-do_shrink.obj -MD -MP -MF "$(DEPDIR)/resizefs_reiserfs-do_shrink.Tpo" -c -o resizefs_reiserfs-do_shrink.obj `if test -f 'do_shrink.c'; then $(CYGPATH_W) 'do_shrink.c'; else $(CYGPATH_W) '$(srcdir)/do_shrink.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/resizefs_reiserfs-do_shrink.Tpo" "$(DEPDIR)/resizefs_reiserfs-do_shrink.Po"; else rm -f "$(DEPDIR)/resizefs_reiserfs-do_shrink.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='do_shrink.c' object='resizefs_reiserfs-do_shrink.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -c -o resizefs_reiserfs-do_shrink.obj `if test -f 'do_shrink.c'; then $(CYGPATH_W) 'do_shrink.c'; else $(CYGPATH_W) '$(srcdir)/do_shrink.c'; fi` uninstall-info-am: install-man8: $(man8_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)" @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.8*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 8*) ;; \ *) ext='8' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \ done uninstall-man8: @$(NORMAL_UNINSTALL) @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.8*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 8*) ;; \ *) ext='8' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man8dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-data-local install-man install-exec-am: install-sbinPROGRAMS install-info: install-info-am install-man: install-man8 installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am uninstall-local uninstall-man \ uninstall-sbinPROGRAMS uninstall-man: uninstall-man8 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-sbinPROGRAMS ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-exec \ install-exec-am install-info install-info-am install-man \ install-man8 install-sbinPROGRAMS install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am uninstall-local uninstall-man \ uninstall-man8 uninstall-sbinPROGRAMS uninstall-resize_reiserfs: if test -f $(DESTDIR)$(sbindir)/resize_reiserfs; then \ rm -f $(DESTDIR)$(sbindir)/resize_reiserfs; \ fi; install-resize_reiserfs: if test -f $(DESTDIR)$(sbindir)/resizefs.reiserfs; then \ rm -f $(DESTDIR)$(sbindir)/resize_reiserfs; \ ln $(DESTDIR)$(sbindir)/resizefs.reiserfs $(DESTDIR)$(sbindir)/resize_reiserfs; \ fi; install-data-local: install-resize_reiserfs uninstall-local: uninstall-resize_reiserfs # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/utils/resizer/do_shrink.c0000644000175300001440000002041710412227267016375 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "resize.h" #include "misc/unaligned.h" #include "util/misc.h" #include #include static unsigned long int_node_cnt = 0, int_moved_cnt = 0; static unsigned long leaf_node_cnt = 0, leaf_moved_cnt = 0; static unsigned long unfm_node_cnt = 0, unfm_moved_cnt = 0; static unsigned long total_node_cnt = 0; static unsigned long total_moved_cnt = 0; static unsigned long unused_block; static unsigned long blocks_used; static int block_count_mismatch = 0; static reiserfs_bitmap_t * bmp; static reiserfs_sb_t * ondisk_sb; /* abnornal exit from block reallocation process */ static void quit_resizer(reiserfs_filsys_t * fs) { /* save changes to bitmap blocks */ reiserfs_fs_close (fs); /* leave fs in ERROR state */ reiserfs_exit(1, "fs shrinking was not completed successfully, " "run reiserfsck."); } /* block moving */ static unsigned long move_generic_block(reiserfs_filsys_t * fs, unsigned long block, unsigned long bnd, int h) { reiserfs_bh_t * bh, * bh2; /* primitive fsck */ if (block > reiserfs_sb_get_blocks(ondisk_sb)) { fprintf(stderr, "resize_reiserfs: invalid block number " "(%lu) found.\n", block); quit_resizer(fs); } /* progress bar, 3D style :) */ if (opt_verbose) util_misc_progress(stderr, &total_node_cnt, blocks_used, 1, 0); else total_node_cnt ++; /* infinite loop check */ if( total_node_cnt > blocks_used && !block_count_mismatch) { fputs("resize_reiserfs: warning: block count exeeded\n",stderr); block_count_mismatch = 1; } if (block < bnd) /* block will not be moved */ return 0; /* move wrong block */ bh = reiserfs_buffer_read(fs->fs_dev, block, fs->fs_blocksize); if (!bh) reiserfs_exit (1, "move_generic_block: reiserfs_buffer_read failed.\n"); reiserfs_bitmap_find_zero_bit(bmp, &unused_block); if (unused_block == 0 || unused_block >= bnd) { fputs ("resize_reiserfs: can\'t find free block\n", stderr); quit_resizer(fs); } /* blocknr changing */ bh2 = reiserfs_buffer_open(fs->fs_dev, unused_block, fs->fs_blocksize); memcpy(bh2->b_data, bh->b_data, bh2->b_size); reiserfs_bitmap_clear_bit(bmp, block); reiserfs_bitmap_set_bit(bmp, unused_block); reiserfs_buffer_close(bh); reiserfs_buffer_mkuptodate(bh2,1); reiserfs_buffer_mkdirty(bh2); reiserfs_buffer_write(bh2); reiserfs_buffer_close(bh2); total_moved_cnt++; return unused_block; } static unsigned long move_unformatted_block(reiserfs_filsys_t * fs, unsigned long block, unsigned long bnd, int h) { unsigned long b; unfm_node_cnt++; b = move_generic_block(fs, block, bnd, h); if (b) unfm_moved_cnt++; return b; } /* recursive function processing all tree nodes */ static unsigned long move_formatted_block(reiserfs_filsys_t * fs, unsigned long block, unsigned long bnd, int h) { reiserfs_bh_t * bh; reiserfs_ih_t *ih; unsigned long new_blocknr = 0; int node_is_internal = 0; unsigned int i, j; bh = reiserfs_buffer_read(fs->fs_dev, block, fs->fs_blocksize); if (!bh) reiserfs_exit (1, "move_formatted_block: reiserfs_buffer_read failed"); if (reiserfs_leaf_head (bh)) { leaf_node_cnt++; for (i = 0; i < reiserfs_node_items(bh); i++) { ih = reiserfs_ih_at(bh, i); /* skip the bad blocks. */ if (reiserfs_key_get_oid (&ih->ih_key) == REISERFS_BAD_OID && reiserfs_key_get_did (&ih->ih_key) == REISERFS_BAD_DID) { continue; } if (reiserfs_ih_ext(ih)) { __u32 * extent; extent = (__u32 *)reiserfs_item_by_ih (bh, ih); for (j = 0; j < reiserfs_ext_count(ih); j++) { unsigned long unfm_block; /* hole */ if (d32_get (extent, j) == 0) continue; unfm_block = move_unformatted_block(fs, d32_get (extent, j), bnd, h + 1); if (unfm_block) { d32_put (extent, j, unfm_block); reiserfs_buffer_mkdirty(bh); } } } } } else if (reiserfs_int_head (bh)) { /* internal node */ int_node_cnt++; node_is_internal = 1; for (i=0; i <= reiserfs_node_items(bh); i++) { unsigned long moved_block; moved_block = move_formatted_block(fs, reiserfs_dc_get_nr( reiserfs_int_at (bh, i)), bnd, h+1); if (moved_block) { reiserfs_dc_set_nr (reiserfs_int_at (bh, i), moved_block); reiserfs_buffer_mkdirty(bh); } } } else { misc_die("Block (%lu) has invalid format\n", block); } if (reiserfs_buffer_isdirty(bh)) { reiserfs_buffer_mkuptodate(bh,1); reiserfs_buffer_write(bh); } reiserfs_buffer_close(bh); new_blocknr = move_generic_block(fs, block, bnd, h); if (new_blocknr) { if (node_is_internal) int_moved_cnt++; else leaf_moved_cnt++; } return new_blocknr; } int shrink_fs(reiserfs_filsys_t * fs, long long int new_blocks) { unsigned long n_root_block; unsigned int bmap_nr_new; unsigned int bmap_nr_old; unsigned long bad_count; unsigned long old_blocks; ondisk_sb = fs->fs_ondisk_sb; old_blocks = reiserfs_sb_get_blocks(ondisk_sb); bmap_nr_old = reiserfs_bmap_nr(old_blocks, fs->fs_blocksize); bmap_nr_new = reiserfs_bmap_nr(new_blocks, fs->fs_blocksize); /* is shrinking possible ? */ if (old_blocks - new_blocks > reiserfs_sb_get_free(ondisk_sb) + bmap_nr_old - bmap_nr_new) { fprintf(stderr, "resize_reiserfs: can\'t shrink fs; too many " "blocks already allocated\n"); return -1; } /* warn about alpha version */ { int c; printf( "You are running BETA version of reiserfs shrinker.\n" "This version is only for testing or VERY CAREFUL use.\n" "Backup of you data is recommended.\n\n" "Do you want to continue? [y/N]:" ); fflush(stdout); c = getchar(); if (c != 'y' && c != 'Y') exit(1); } reiserfs_fs_reopen(fs, O_RDWR); if (reiserfs_bitmap_open(fs)) reiserfs_exit(1, "cannot open ondisk bitmap"); bmp = fs->fs_bitmap2; ondisk_sb = fs->fs_ondisk_sb; reiserfs_sb_set_state (fs->fs_ondisk_sb, FS_ERROR); reiserfs_buffer_mkuptodate(fs->fs_super_bh, 1); reiserfs_buffer_mkdirty(fs->fs_super_bh); reiserfs_buffer_write(fs->fs_super_bh); /* calculate number of data blocks */ blocks_used = old_blocks - reiserfs_sb_get_free(fs->fs_ondisk_sb) - bmap_nr_old - reiserfs_jp_get_size(reiserfs_sb_jp (fs->fs_ondisk_sb)) - REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize - 2; /* superblock itself and 1 descriptor after the journal */ unused_block = 1; if (opt_verbose) { printf("Processing the tree: "); fflush(stdout); } n_root_block = move_formatted_block(fs, reiserfs_sb_get_root(ondisk_sb), new_blocks, 0); if (n_root_block) reiserfs_sb_set_root (ondisk_sb, n_root_block); if (opt_verbose) printf ("\n\nnodes processed (moved):\n" "int %lu (%lu),\n" "leaves %lu (%lu),\n" "unfm %lu (%lu),\n" "total %lu (%lu).\n\n", int_node_cnt, int_moved_cnt, leaf_node_cnt, leaf_moved_cnt, unfm_node_cnt, unfm_moved_cnt, (unsigned long)total_node_cnt, total_moved_cnt); if (block_count_mismatch) { fprintf(stderr, "resize_reiserfs: data block count %lu" " doesn\'t match data block count %lu from super block\n", (unsigned long)total_node_cnt, blocks_used); } { unsigned long l; /* make sure that none of truncated block are in use */ printf("check for used blocks in truncated region\n"); for (l = new_blocks; l < fs->fs_bitmap2->bm_bit_size; l ++) { if ((l % (fs->fs_blocksize * 8)) == 0) continue; if (reiserfs_bitmap_test_bit (fs->fs_bitmap2, l)) printf ("<%lu>", l); } printf("\n"); } reiserfs_badblock_traverse(fs, reiserfs_badblock_extract, NULL); if (fs->fs_badblocks_bm) { bad_count = reiserfs_bitmap_ones(fs->fs_badblocks_bm); reiserfs_bitmap_shrink (fs->fs_badblocks_bm, new_blocks); reiserfs_badblock_flush(fs, 1); bad_count -= reiserfs_bitmap_ones(fs->fs_badblocks_bm); } else bad_count = 0; reiserfs_bitmap_shrink (fs->fs_bitmap2, new_blocks); reiserfs_sb_set_free (ondisk_sb, reiserfs_sb_get_free(ondisk_sb) - (old_blocks - new_blocks) + (bmap_nr_old - bmap_nr_new) + bad_count); reiserfs_sb_set_blocks (ondisk_sb, new_blocks); reiserfs_sb_set_bmaps (ondisk_sb, bmap_nr_new); return 0; } reiserfsprogs-3.6.20/utils/resizer/fe.c0000644000175300001440000000142110412227267015001 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "resize.h" #include "util/mntent.h" #include #include #include /* the front-end for kernel on-line resizer */ int resize_fs_online(char * devname, long long int blocks) { struct mntent *mnt; char buf[64]; /* Find the mount entry. */ if ((mnt = util_mntent(devname)) == NULL) misc_die ("resize_reiserfs: can't find mount entry\n"); sprintf(buf,"resize=%lld", blocks); if (mount(mnt->mnt_fsname, mnt->mnt_dir, mnt->mnt_type, (unsigned long)(MS_MGC_VAL << 16 | MS_REMOUNT), buf)) { misc_die ("resize_reiserfs: remount failed: %s\n", strerror(errno)); } return 0; } reiserfsprogs-3.6.20/utils/resizer/resize.h0000644000175300001440000000112410412227267015715 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #include "reiserfs/libreiserfs.h" #define print_usage_and_exit() {\ fprintf (stderr, "Usage: %s [-s[+|-]#[G|M|K]] [-fqvV] device\n\n", argv[0]);\ exit(16);\ } /* reiserfs_resize.c */ extern reiserfs_bh_t * g_sb_bh; extern char * g_progname; extern int opt_force; extern int opt_verbose; extern int opt_nowrite; extern int opt_safe; /* fe.c */ extern int resize_fs_online(char * devname, long long int blocks); /* do_shrink.c */ extern int shrink_fs(reiserfs_filsys_t *, long long int blocks); reiserfsprogs-3.6.20/utils/resizer/resize_reiserfs.c0000644000175300001440000002200010412227267017606 00000000000000/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "resize.h" #include "misc/device.h" #include "misc/malloc.h" #include "util/device.h" #include "util/print.h" #include #include #include int opt_banner = 0; int opt_force = 0; int opt_verbose = 1; /* now "verbose" option is default */ int opt_nowrite = 0; int opt_safe = 0; int opt_skipj = 0; /* calculate the new fs size (in blocks) from old fs size and the string representation of new size */ static long long int calc_new_fs_size(unsigned long count, unsigned int bs, char *bytes_str) { long long int bytes; long long int blocks; char *end; int rel; end = bytes_str + strlen(bytes_str) - 1; rel = bytes_str[0] == '+' || bytes_str[0] == '-'; bytes = strtoll(bytes_str, &bytes_str, 10); /* Some error occured while convertion or the specified string is not valid. */ if (bytes == LONG_LONG_MIN || bytes == LONG_LONG_MAX || (bytes_str != end && bytes_str != end + 1)) return -EINVAL; switch (*end) { case 'G': case 'g': bytes *= 1024; case 'M': case 'm': bytes *= 1024; case 'K': case 'k': bytes *= 1024; } blocks = bytes / bs; return rel ? count + blocks : blocks; } /* print some fs parameters */ static void sb_report(reiserfs_sb_t * sb1, reiserfs_sb_t * sb2) { printf( "ReiserFS report:\n" "blocksize %d\n" "block count %d (%d)\n" "free blocks %d (%d)\n" "bitmap block count %d (%d)\n", reiserfs_sb_get_blksize(sb1), reiserfs_sb_get_blocks(sb1), reiserfs_sb_get_blocks(sb2), reiserfs_sb_get_free(sb1), reiserfs_sb_get_free(sb2), reiserfs_sb_get_bmaps(sb1), reiserfs_sb_get_bmaps(sb2)); }; /* conditional bwrite */ static int bwrite_cond (reiserfs_bh_t * bh) { if(!opt_nowrite) { reiserfs_buffer_mkuptodate(bh,1); reiserfs_buffer_mkdirty(bh); reiserfs_buffer_write(bh); } return 0; } /* the first one of the most important functions */ static int expand_fs (reiserfs_filsys_t * fs, long long int block_count_new) { unsigned int bmap_nr_new, bmap_nr_old; unsigned int block_count_old; reiserfs_sb_t * sb; unsigned int i; reiserfs_fs_reopen(fs, O_RDWR); if (reiserfs_bitmap_open(fs)) reiserfs_exit(1, "cannot open ondisk bitmap"); sb = fs->fs_ondisk_sb; reiserfs_sb_set_state (fs->fs_ondisk_sb, FS_ERROR); bwrite_cond(fs->fs_super_bh); if (reiserfs_bitmap_expand (fs->fs_bitmap2, block_count_new)) reiserfs_exit(1, "cannot expand bitmap\n"); /* count bitmap blocks in new fs */ block_count_old = reiserfs_sb_get_blocks(sb); bmap_nr_old = reiserfs_bmap_nr(block_count_old, fs->fs_blocksize); bmap_nr_new = reiserfs_bmap_nr(block_count_new, fs->fs_blocksize); /* update super block buffer*/ reiserfs_sb_set_free (sb, reiserfs_sb_get_free(sb) + (block_count_new - reiserfs_sb_get_blocks(sb)) - (bmap_nr_new - bmap_nr_old)); reiserfs_sb_set_blocks (sb, block_count_new); reiserfs_sb_set_bmaps (sb, reiserfs_bmap_over(bmap_nr_new) ? 0 : bmap_nr_new); /* mark new bitmap blocks as used */ for (i = bmap_nr_old; i < bmap_nr_new; i++) reiserfs_bitmap_set_bit (fs->fs_bitmap2, i * fs->fs_blocksize * 8); /* normally, this is done by reiserfs_bitmap_set_bit, but if we ** haven't actually added any bitmap blocks, the bitmap won't be dirtied. ** ** In memory, reiserfsprogs puts zeros for the bits past the end of ** the old filesystem. But, on disk that bitmap is full of ones. ** we explicitly dirty the bitmap here to make sure the zeros get written ** to disk */ fs->fs_bitmap2->bm_dirty = 1 ; return 0; } static int resizer_check_fs_size(reiserfs_filsys_t *fs, long long int new_size) { if (new_size < 0) { reiserfs_warning(stderr, "\nresizer_reiserfs: the new size " "value is wrong.\n\n"); return new_size; } if (new_size == reiserfs_sb_get_blocks(fs->fs_ondisk_sb)) { reiserfs_warning (stderr, "%s already is of the needed size. " "Nothing to be done\n\n", fs->fs_file_name); return 1; } if (new_size < reiserfs_sb_get_blocks(fs->fs_ondisk_sb)) { if (util_device_mounted(fs->fs_file_name) > 0) { reiserfs_warning (stderr, "Can't shrink filesystem on-line.\n\n"); return 1; } } if (new_size >= reiserfs_sb_get_blocks(fs->fs_ondisk_sb)) { unsigned long long offset = (unsigned long long)new_size * fs->fs_blocksize - 1; if(!misc_device_valid_offset(fs->fs_dev, offset)) { reiserfs_warning (stderr, "%s is of %lu blocks size only with " "reiserfs of %d blocks\nsize on it. You are " "trying to expand reiserfs up to %lu blocks " "size.\nYou probably forgot to expand your " "partition size.\n\n", fs->fs_file_name, misc_device_count_blocks(fs->fs_file_name, fs->fs_blocksize), reiserfs_sb_get_blocks(fs->fs_ondisk_sb), new_size); return 1; } } return 0; } int main(int argc, char *argv[]) { char * bytes_count_str = NULL; char * devname; char * jdevice_name = NULL; reiserfs_filsys_t * fs; reiserfs_sb_t * sb; int c; int error; reiserfs_sb_t *sb_old; long long int block_count_new; if (argc < 2) print_usage_and_exit(); while ((c = getopt(argc, argv, "fvcqks:j:V")) != EOF) { switch (c) { case 's' : if (!optarg) reiserfs_exit(1, "Missing argument to -s option"); bytes_count_str = optarg; break; case 'j' : if (!optarg) reiserfs_exit(1, "Missing argument to -j option"); jdevice_name = optarg; case 'f': opt_force = 1; break; case 'v': opt_verbose++; break; case 'n': /* no nowrite option at this moment */ /* opt_nowrite = 1; */ break; case 'c': opt_safe = 1; break; case 'q': opt_verbose = 0; break; case 'k': opt_skipj = 1; break; case 'V': opt_banner++; break; default: print_usage_and_exit (); } } util_print_banner (argv[0]); if (opt_banner) exit(0); devname = argv[optind]; fs = reiserfs_fs_open(devname, O_RDONLY, &error, 0, 1); if (!fs) { if (error) { reiserfs_exit(1, "cannot open '%s': %s", devname, strerror(error)); } else { exit(1); } } if (reiserfs_journal_open (fs, jdevice_name, O_RDWR #ifdef O_LARGEFILE | O_LARGEFILE #endif )) { reiserfs_exit(1, "Failed to open the journal device (%s).", jdevice_name); } if (reiserfs_journal_params_check(fs)) { if (!opt_skipj) { reiserfs_exit(1, "Wrong journal parameters detected on (%s)", jdevice_name); } else { reiserfs_journal_close(fs); } } /* forced to continue without journal available/specified */ if (fs == NULL) { reiserfs_exit(1, "no reiserfs found on the device."); } if (!reiserfs_bitmap_spread (fs)) { reiserfs_exit(1, "cannot resize reiserfs in old (not spread " "bitmap) format."); } sb = fs->fs_ondisk_sb; /* If size change was specified by user, calculate it, otherwise take the whole device. */ block_count_new = bytes_count_str ? calc_new_fs_size(reiserfs_sb_get_blocks(sb), fs->fs_blocksize, bytes_count_str) : misc_device_count_blocks(devname, fs->fs_blocksize); if (resizer_check_fs_size(fs, block_count_new)) return 1; if (util_device_mounted(devname) > 0) { reiserfs_fs_close(fs); fs = NULL; error = resize_fs_online(devname, block_count_new); reiserfs_warning(stderr, "\n\nresize_reiserfs: On-line resizing %s.\n\n", error ? "failed" : "finished successfully"); return error; } if (!reiserfs_sb_state_ok (fs)) { reiserfs_warning (stderr, "\n\nresize_reiserfs: run reiserfsck --check " "first\n\n"); reiserfs_fs_close (fs); fs = NULL; return 1; } if (reiserfs_sb_get_umount(sb) != FS_CLEANLY_UMOUNTED) /* fixme: shouldn't we check for something like: fsck guarantees: fs is ok */ reiserfs_exit(1, "the file system isn't in valid state."); /* Needed to keep idiot compiler from issuing false warning */ sb_old = 0; /* save SB for reporting */ if(opt_verbose) { sb_old = misc_getmem(REISERFS_SB_SIZE); memcpy(sb_old, fs->fs_ondisk_sb, REISERFS_SB_SIZE); } error = (block_count_new > reiserfs_sb_get_blocks(fs->fs_ondisk_sb)) ? expand_fs(fs, block_count_new) : shrink_fs(fs, block_count_new); if (error) { reiserfs_warning(stderr, "\n\nresize_reiserfs: Resizing failed.\n\n "); return error; } if(opt_verbose) { sb_report(fs->fs_ondisk_sb, sb_old); misc_freemem(sb_old); } reiserfs_sb_set_state (fs->fs_ondisk_sb, FS_CONSISTENT); bwrite_cond(fs->fs_super_bh); if (opt_verbose) { printf("\nSyncing.."); fflush(stdout); } reiserfs_fs_close (fs); if (opt_verbose) printf("done\n"); reiserfs_warning(stderr, "\n\nresize_reiserfs: Resizing finished " "successfully.\n\n "); return 0; } reiserfsprogs-3.6.20/utils/resizer/resizefs.reiserfs.80000644000175300001440000000570010412227267020013 00000000000000.\" -*- nroff -*- .\" Copyright 1996-2004 Hans Reiser. .\" .TH resizefs.reiserfs 8 "January 2004" "Reiserfsprogs-3.6.19" .SH NAME resizefs.reiserfs \- resizer tool for the ReiserFS filesystem .SH SYNOPSIS .BR resizefs.reiserfs [ .B \-s .IR \fR[\fB+\fR|\fB\- ]\fIsize\fB[\fBK\fR|\fBM\fR|\fBG\fR] ] [ .B \-j .IR \fR\fIdev ] [ .B \-fqv ] .I device .SH DESCRIPTION The .B resizefs.reiserfs tool resizes an unmounted reiserfs file system. It enlarges or shrinks an reiserfs file system located on a .I device so that it will have .I size bytes or size=old_size +(\-) .I size bytes if the + or \- prefix is used. If the .B \-s option is not specified, the filesystem will be resized to fill the given device. The .I size parameter may have one of the optional modifiers .BR K ", " M ", " G , which means the .I size parameter is given in kilo\-, mega\-, gigabytes respectively. .PP The .B resizefs.reiserfs program does not manipulate the size of the device. If you wish to enlarge a filesystem, you must make sure you expand the underlying device first. This can be done using .BR cfdisk (8) for partitions, by deleting the partition and recreating it with a larger size (assuming there is free space .I after the partition in question). Make sure you re\-create it with the same starting disk cylinder as before! Otherwise, the resize operation will certainly not work, and you may lose your entire filesystem. .PP The .B resizefs.reiserfs program allows to grow a reiserfs on-line if there is a free space on block .I device. .PP If you wish to shrink a reiserfs partition, first use .B resizefs.reiserfs to shrink the file system. You may then use .BR cfdisk (8) to shrink the device. When shrinking the size of the device, make sure you do not make it smaller than the reduced size of the reiserfs filesystem. .SH OPTIONS .TP .BR \-s\ [+|\-]\fIsize Set the new size in bytes. .TP .BR \-j\ \fIdev Set the journal device name. .TP .BR \-f Force, do not perform checks. .TP .BR \-q Do not print anything but error messages. .TP .BR \-v Turn on extra progress status messages (default). .SH RETURN VALUES 0 Resizing successful. .TP \-1 Resizing not successful. .SH EXAMPLES The following example shows how to test .B resizefs.reiserfs\fR. Suppose 2Gb reiserfs filesystem is created on the device /dev/hda8 and is mounted on /mnt. For shrinking the device we need to unmount it first, then run .B resizefs.reiserfs with a .I size \fR parameter (in this case -1Gb): .PP \ df .br \ umount /mnt .br \ resizefs.reiserfs -s -1G /dev/hda8 .br \ mount /dev/hda8 /mnt .br \ df /mnt .SH AUTHOR This version of .B resizefs.reiserfs has been written by Alexander Zarochentcev . .SH BUGS Please report bugs to the ReiserFS developers , providing as much information as possible--your hardware, kernel, patches, settings, all printed messages; check the syslog file for any related information. .SH SEE ALSO .BR cfdisk (8), .BR fsck.reiserfs (8), .BR debugfs.reiserfs (8) reiserfsprogs-3.6.20/utils/tune/0000777000175300001440000000000010412227617013620 500000000000000reiserfsprogs-3.6.20/utils/tune/Makefile.am0000644000175300001440000000150710412227267015574 00000000000000sbin_PROGRAMS = tunefs.reiserfs man_MANS = tunefs.reiserfs.8 EXTRA_DIST = tunefs.reiserfs.8 tunefs_reiserfs_SOURCES = tune.c tune.h tunefs_reiserfs_LDADD = $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libmisc/libmisc-static.a tunefs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@ tunefs_reiserfs_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include uninstall-reiserfstune: if test -f $(DESTDIR)$(sbindir)/reiserfstune; then \ rm -f $(DESTDIR)$(sbindir)/reiserfstune; \ fi; install-reiserfstune: if test -f $(DESTDIR)$(sbindir)/tunefs.reiserfs; then \ rm -f $(DESTDIR)$(sbindir)/reiserfstune; \ ln $(DESTDIR)$(sbindir)/tunefs.reiserfs $(DESTDIR)$(sbindir)/reiserfstune; \ fi; install-data-local: install-reiserfstune uninstall-local: uninstall-reiserfstune reiserfsprogs-3.6.20/utils/tune/Makefile.in0000644000175300001440000004214710412227374015611 00000000000000# Makefile.in generated by automake 1.9.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = $(tunefs_reiserfs_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ sbin_PROGRAMS = tunefs.reiserfs$(EXEEXT) subdir = utils/tune DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(sbin_PROGRAMS) am_tunefs_reiserfs_OBJECTS = tunefs_reiserfs-tune.$(OBJEXT) tunefs_reiserfs_OBJECTS = $(am_tunefs_reiserfs_OBJECTS) tunefs_reiserfs_DEPENDENCIES = \ $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libmisc/libmisc-static.a DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(tunefs_reiserfs_SOURCES) DIST_SOURCES = $(tunefs_reiserfs_SOURCES) man8dir = $(mandir)/man8 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PROGS_LDFLAGS = @PROGS_LDFLAGS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ man_MANS = tunefs.reiserfs.8 EXTRA_DIST = tunefs.reiserfs.8 tunefs_reiserfs_SOURCES = tune.c tune.h tunefs_reiserfs_LDADD = $(top_builddir)/libreiserfs/libreiserfs-static.a \ $(top_builddir)/libutil/libutil-static.a \ $(top_builddir)/libmisc/libmisc-static.a tunefs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@ tunefs_reiserfs_CFLAGS = @CFLAGS@ INCLUDES = -I$(top_srcdir)/include all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/tune/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu utils/tune/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)" @list='$(sbin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(sbin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \ rm -f "$(DESTDIR)$(sbindir)/$$f"; \ done clean-sbinPROGRAMS: -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) tunefs.reiserfs$(EXEEXT): $(tunefs_reiserfs_OBJECTS) $(tunefs_reiserfs_DEPENDENCIES) @rm -f tunefs.reiserfs$(EXEEXT) $(LINK) $(tunefs_reiserfs_LDFLAGS) $(tunefs_reiserfs_OBJECTS) $(tunefs_reiserfs_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tunefs_reiserfs-tune.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` tunefs_reiserfs-tune.o: tune.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tunefs_reiserfs_CFLAGS) $(CFLAGS) -MT tunefs_reiserfs-tune.o -MD -MP -MF "$(DEPDIR)/tunefs_reiserfs-tune.Tpo" -c -o tunefs_reiserfs-tune.o `test -f 'tune.c' || echo '$(srcdir)/'`tune.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/tunefs_reiserfs-tune.Tpo" "$(DEPDIR)/tunefs_reiserfs-tune.Po"; else rm -f "$(DEPDIR)/tunefs_reiserfs-tune.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tune.c' object='tunefs_reiserfs-tune.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tunefs_reiserfs_CFLAGS) $(CFLAGS) -c -o tunefs_reiserfs-tune.o `test -f 'tune.c' || echo '$(srcdir)/'`tune.c tunefs_reiserfs-tune.obj: tune.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tunefs_reiserfs_CFLAGS) $(CFLAGS) -MT tunefs_reiserfs-tune.obj -MD -MP -MF "$(DEPDIR)/tunefs_reiserfs-tune.Tpo" -c -o tunefs_reiserfs-tune.obj `if test -f 'tune.c'; then $(CYGPATH_W) 'tune.c'; else $(CYGPATH_W) '$(srcdir)/tune.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/tunefs_reiserfs-tune.Tpo" "$(DEPDIR)/tunefs_reiserfs-tune.Po"; else rm -f "$(DEPDIR)/tunefs_reiserfs-tune.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tune.c' object='tunefs_reiserfs-tune.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tunefs_reiserfs_CFLAGS) $(CFLAGS) -c -o tunefs_reiserfs-tune.obj `if test -f 'tune.c'; then $(CYGPATH_W) 'tune.c'; else $(CYGPATH_W) '$(srcdir)/tune.c'; fi` uninstall-info-am: install-man8: $(man8_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)" @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.8*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 8*) ;; \ *) ext='8' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \ done uninstall-man8: @$(NORMAL_UNINSTALL) @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.8*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 8*) ;; \ *) ext='8' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man8dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-data-local install-man install-exec-am: install-sbinPROGRAMS install-info: install-info-am install-man: install-man8 installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am uninstall-local uninstall-man \ uninstall-sbinPROGRAMS uninstall-man: uninstall-man8 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-sbinPROGRAMS ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-exec \ install-exec-am install-info install-info-am install-man \ install-man8 install-sbinPROGRAMS install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am uninstall-local uninstall-man \ uninstall-man8 uninstall-sbinPROGRAMS uninstall-reiserfstune: if test -f $(DESTDIR)$(sbindir)/reiserfstune; then \ rm -f $(DESTDIR)$(sbindir)/reiserfstune; \ fi; install-reiserfstune: if test -f $(DESTDIR)$(sbindir)/tunefs.reiserfs; then \ rm -f $(DESTDIR)$(sbindir)/reiserfstune; \ ln $(DESTDIR)$(sbindir)/tunefs.reiserfs $(DESTDIR)$(sbindir)/reiserfstune; \ fi; install-data-local: install-reiserfstune uninstall-local: uninstall-reiserfstune # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: reiserfsprogs-3.6.20/utils/tune/tune.c0000644000175300001440000005316410412227267014665 00000000000000/* * Copyright 2002-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "tune.h" #include "misc/unaligned.h" #include "util/misc.h" #include "util/badblock.h" #include "util/device.h" #include "util/print.h" #include #include #include #include #if 0 #include #include #include #include #endif char *program_name; static void message( const char * fmt, ... ) __attribute__ ((format (printf, 1, 2))); static void message( const char * fmt, ... ) { char buf[4096]; va_list args; buf[0] = '\0'; va_start( args, fmt ); vsprintf( buf, fmt, args ); va_end( args ); if( buf[0] != '\0' ) { fprintf( stderr, "%s: %s\n", program_name, buf ); } } reiserfs_filsys_t * fs; static void print_usage_and_exit(void) { message ("Usage: %s [options] device [block-count]\n" "\n" "Options:\n\n" " -j | --journal-device file\tcurrent journal device\n" " --journal-new-device file\tnew journal device\n" " -o | --journal-new-offset N\tnew journal offset in blocks\n" " -s | --journal-new-size N\tnew journal size in blocks\n" " -t | --trans-max-size N\tnew journal max transaction size in blocks\n" " --no-journal-available\tcurrent journal is not available\n" " --make-journal-standard\tnew journal to be standard\n" /*"\t-p | --keep-old-journal-param (keep parametrs from old journal to new one)\n"*/ " -b | --add-badblocks file\tadd to bad block list\n" " -B | --badblocks file\t\tset the bad block list\n" " -u | --uuid UUID|random\tset new UUID\n" " -l | --label LABEL\t\tset new label\n" " -f | --force\t\t\tforce tuning, less confirmations\n" " -V\t\t\t\tprint version and exit\n", program_name); exit (1); } unsigned long Journal_size = 0; int Max_trans_size = JOURNAL_TRANS_MAX; int Offset = 0; __u16 Options = 0; int Force = 0; int Bads = 0; char * LABEL; unsigned char UUID[16]; char * badblocks_file; /* If specified paramenters defines the standard journal, make it standard. */ static int should_make_journal_standard (reiserfs_filsys_t * fs, char * j_new_dev_name) { if (!reiserfs_super_jr_magic (fs->fs_ondisk_sb)) return 0; /* if (!util_user_confirmed (stderr, "ATTENTION! Filesystem with non-standard journal " "found. Continue? (y/n):", "y\n")) { exit(1); } */ /* make sure journal is on main device, it has default size and the file system has non-standard magic */ if (j_new_dev_name) { /* new journal was specified - check if it is available */ if (strcmp (j_new_dev_name, fs->fs_file_name)) return 0; if (Journal_size && Journal_size != reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1) return 0; if (Max_trans_size && (Max_trans_size != JOURNAL_TRANS_MAX)) return 0; } else { /* new journal was not specified - check ondisk journal params */ if (reiserfs_sb_get_reserved(fs->fs_ondisk_sb) < reiserfs_journal_default (fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1) { message ("Can not create standard journal of the size %llu", reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1); return 0; } } return 1; } static int set_standard_journal_params (reiserfs_filsys_t * fs) { reiserfs_bh_t * bh; /* ondisk superblock update */ if (reiserfs_sb_get_version(fs->fs_ondisk_sb) == 0) memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_3_5_SUPER_MAGIC_STRING, strlen (REISERFS_3_5_SUPER_MAGIC_STRING)); else if (reiserfs_sb_get_version(fs->fs_ondisk_sb) == 2) memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_3_6_SUPER_MAGIC_STRING, strlen (REISERFS_3_6_SUPER_MAGIC_STRING)); else { message ("Can not set standard reiserfs magic: unknown format found %u," " try reiserfsck first", reiserfs_sb_get_version(fs->fs_ondisk_sb)); return 0; } reiserfs_jp_set_start (reiserfs_sb_jp(fs->fs_ondisk_sb), reiserfs_journal_start_must (fs)); reiserfs_jp_set_dev (reiserfs_sb_jp(fs->fs_ondisk_sb), 0); reiserfs_jp_set_size (reiserfs_sb_jp(fs->fs_ondisk_sb), reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)); if (reiserfs_jp_get_tlen(reiserfs_sb_jp(fs->fs_ondisk_sb)) != JOURNAL_TRANS_MAX) reiserfs_jp_set_tlen(reiserfs_sb_jp(fs->fs_ondisk_sb), JOURNAL_TRANS_MAX); if (reiserfs_jp_get_max_batch(reiserfs_sb_jp(fs->fs_ondisk_sb)) != JOURNAL_MAX_BATCH) reiserfs_jp_set_max_batch(reiserfs_sb_jp(fs->fs_ondisk_sb), JOURNAL_MAX_BATCH); if (reiserfs_jp_get_commit_age(reiserfs_sb_jp(fs->fs_ondisk_sb)) != JOURNAL_MAX_COMMIT_AGE) reiserfs_jp_set_commit_age(reiserfs_sb_jp(fs->fs_ondisk_sb), JOURNAL_MAX_COMMIT_AGE); if (reiserfs_jp_get_trans_age(reiserfs_sb_jp(fs->fs_ondisk_sb)) != JOURNAL_MAX_TRANS_AGE) reiserfs_jp_set_trans_age(reiserfs_sb_jp(fs->fs_ondisk_sb), JOURNAL_MAX_TRANS_AGE); reiserfs_sb_set_reserved (fs->fs_ondisk_sb, 0); /* journal_header update */ bh = reiserfs_buffer_open(fs->fs_journal_dev, reiserfs_jp_get_start(reiserfs_sb_jp(fs->fs_ondisk_sb)) + reiserfs_jp_get_size(reiserfs_sb_jp(fs->fs_ondisk_sb)), fs->fs_blocksize); if (!bh) { message ("Cannot get the journal header block. reiserfs_buffer_open failed.\n"); return 0; } ((struct reiserfs_journal_header *)(bh->b_data))->jh_journal = *(reiserfs_sb_jp(fs->fs_ondisk_sb)); reiserfs_buffer_mkuptodate (bh, 1); reiserfs_buffer_mkdirty (bh); reiserfs_buffer_write(bh); reiserfs_buffer_close(bh); return 1; } void zero_journal (reiserfs_filsys_t * fs) { unsigned int i; reiserfs_bh_t * bh; unsigned long done; unsigned long start, len; fprintf (stderr, "Initializing journal - "); start = reiserfs_jp_get_start (reiserfs_sb_jp (fs->fs_ondisk_sb)); len = reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb)); done = 0; for (i = 0; i < len; i ++) { util_misc_progress (stderr, &done, len, 1, 2); bh = reiserfs_buffer_open (fs->fs_journal_dev, start + i, fs->fs_blocksize); if (!bh) misc_die ("zero_journal: reiserfs_buffer_open failed"); memset (bh->b_data, 0, bh->b_size); reiserfs_buffer_mkdirty (bh); reiserfs_buffer_mkuptodate (bh, 1); reiserfs_buffer_write (bh); reiserfs_buffer_close (bh); } fprintf (stderr, "\n"); fflush (stderr); } static int str2int (char * str) { int val; char * tmp; val = (int) strtol (str, &tmp, 0); if (*tmp) misc_die ("%s: strtol is unable to make an integer of %s\n", program_name, str); return val; } static void set_transaction_max_size (char * str) { Max_trans_size = str2int( str ); } /* journal must fit into number of blocks pointed by first bitmap */ static void set_journal_device_size (char * str) { Journal_size = str2int (str) ; } static void set_offset_in_journal_device (char * str) { Offset = str2int( str ); } static void callback_new_badblocks(reiserfs_filsys_t *fs, reiserfs_path_t *badblock_path, void *data) { reiserfs_ih_t *tmp_ih; __u32 *ind_item, i; tmp_ih = REISERFS_PATH_IH(badblock_path); ind_item = (__u32 *)REISERFS_PATH_ITEM(badblock_path); for (i = 0; i < reiserfs_ext_count(tmp_ih); i++) { if (reiserfs_bitmap_test_bit(fs->fs_badblocks_bm, d32_get (ind_item, i))) { message("Block %u is marked as bad already.", d32_get (ind_item, i)); reiserfs_bitmap_clear_bit(fs->fs_badblocks_bm, d32_get (ind_item, i)); } } reiserfs_tree_pathrelse (badblock_path); } static void callback_clear_badblocks(reiserfs_filsys_t *fs, reiserfs_path_t *badblock_path, void *data) { reiserfs_ih_t *tmp_ih; __u32 *ind_item, i; tmp_ih = REISERFS_PATH_IH(badblock_path); ind_item = (__u32 *)REISERFS_PATH_ITEM(badblock_path); for (i = 0; i < reiserfs_ext_count(tmp_ih); i++) { reiserfs_bitmap_clear_bit(fs->fs_bitmap2, d32_get(ind_item, i)); } reiserfs_tree_pathrelse (badblock_path); } static void add_badblocks(reiserfs_filsys_t *fs) { unsigned long i, marked = 0; if (reiserfs_bitmap_open (fs) < 0) { message("Failed to open reiserfs ondisk bitmap.\n"); reiserfs_fs_close(fs); exit(1); } if (util_badblock_load (fs, badblocks_file)) { message("Failed to initialize the bad block bitmap.\n"); reiserfs_fs_close(fs); exit(1); } if (Bads == 1) reiserfs_badblock_traverse(fs, callback_new_badblocks, NULL); else reiserfs_badblock_traverse(fs, callback_clear_badblocks, NULL); for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) { if (reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i)) { if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i)) { reiserfs_bitmap_set_bit (fs->fs_bitmap2, i); marked++; } else { /* Check that this is a block */ message("Bad block %lu is used already in reiserfs tree. " "To mark it as a bad block use reiserfsck\n" "--fix-fixable with -B option.", i); reiserfs_bitmap_clear_bit (fs->fs_badblocks_bm, i); } } } if (marked) { reiserfs_sb_set_free(fs->fs_ondisk_sb, reiserfs_sb_get_free(fs->fs_ondisk_sb) - fs->fs_badblocks_bm->bm_set_bits); reiserfs_buffer_mkdirty(fs->fs_super_bh); } if (Bads == 1) { /* fs->fs_badblocks_bm contains blocks which are not in the bad block list yet. Merge it with what is in the tree already. */ reiserfs_badblock_traverse(fs, reiserfs_badblock_extract, NULL); } if (marked) { reiserfs_badblock_flush(fs, 1); } message("%lu blocks were marked as bad.", marked); } int main (int argc, char **argv) { reiserfs_filsys_t * fs; char * device_name; char * jdevice_name; char * j_new_device_name; int c; static int flag; struct reiserfs_journal_header * j_head; reiserfs_trans_t old, new; int Is_journal_or_maxtrans_size_specified = 0; program_name = strrchr( argv[ 0 ], '/' ); if (program_name) program_name++; else program_name = argv[ 0 ]; if (argc < 2) print_usage_and_exit (); device_name = 0; jdevice_name = 0; j_new_device_name = 0; memset(UUID, 0, 16); while (1) { static struct option options[] = { {"journal-device", required_argument, 0, 'j'}, {"journal-new-device", required_argument, &flag, OPT_NEW_J}, {"journal-new-size", required_argument, 0, 's'}, {"trans-max-size", required_argument, 0, 't'}, {"journal-new-offset", required_argument, 0, 'o'}, {"no-journal-available", no_argument, &flag, OPT_SKIP_J}, /*{"keep-old-journal-param", no_argument, 0, 'p'},*/ {"uuid", required_argument, 0, 'u'}, {"label", required_argument, 0, 'l'}, {"add-badblocks", required_argument, 0, 'b'}, {"badblocks", required_argument, 0, 'B'}, {"force", no_argument, 0, 'f'}, {"make-journal-standard", no_argument, &flag, OPT_STANDARD}, {0, 0, 0, 0} }; int option_index; c = getopt_long (argc, argv, "j:s:t:o:fu:l:b:B:V", options, &option_index); if (c == -1) break; switch (c) { case 0: /* long-only optins */ if (flag == OPT_NEW_J) { Options |= OPT_NEW_J; j_new_device_name = optarg; } if (flag == OPT_SKIP_J) { Options |= OPT_SKIP_J; } if (flag == OPT_STANDARD) { Options |=OPT_STANDARD; } break; case 'j': /* --journal-device */ jdevice_name = optarg; break; case 's': /* --journal-new-size */ set_journal_device_size (optarg); Is_journal_or_maxtrans_size_specified = 1; break; case 't': /* --trans-max-size */ set_transaction_max_size (optarg); Is_journal_or_maxtrans_size_specified = 1; break; case 'o': /* --offset */ set_offset_in_journal_device (optarg); break; case 'f': /* forces replacing standard journal with non-standard one. Specified more than once - allows to avoid asking for confirmation */ Force ++; break; case 'b': /* --add-badblocks */ badblocks_file = optarg; Bads = 1; break; case 'B': /* --badblocks */ badblocks_file = optarg; Bads = 2; break; case 'u': /* UUID */ #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) if (!strcmp(optarg, "random")) { uuid_generate(UUID); } else { if (uuid_parse(optarg, UUID) < 0) { message ("Invalid UUID '%s' was specified\n", optarg); return 1; } } #else message ("Cannot set the UUID, uuidlib was not found " "by configure.\n"); return 1; #endif break; case 'l': /* LABEL */ LABEL = optarg; break; case 'V': util_print_banner("reiserfstune"); exit(0); #if 0 case 'J': /* --journal-new-device */ Options |= OPT_NEW_J; j_new_device_name = optarg; break; case 'u': /* --no-journal-available */ Options |= OPT_SKIPJ; break; case 'p': /* --keep-old-journal-param */ Options |= OPT_KEEPO; break; #endif default: print_usage_and_exit(); } } if (optind != argc - 1) print_usage_and_exit (); /* device to be formatted */ device_name = argv [optind]; fs = reiserfs_fs_open (device_name, O_RDONLY, 0, NULL, 1); if (fs == NULL) { message ("Cannot open reiserfs on %s", device_name); return 1; } /* journal was opened or it wasn't opened but the option --no-journal-available has been specified by user */ /* make sure filesystem is not mounted */ if (util_device_mounted(fs->fs_file_name) > 0) { /* fixme: it can not be mounted, btw */ message ("Reiserfstune is not allowed to be run on mounted filesystem."); reiserfs_fs_close (fs); return 1; } if (!reiserfs_sb_state_ok (fs)) { message ("Filesystem looks not cleanly umounted, check the consistency first.\n"); reiserfs_fs_close (fs); return 1; } reiserfs_fs_reopen (fs, O_RDWR); if (badblocks_file) { add_badblocks(fs); reiserfs_fs_close(fs); exit(0); } if (!jdevice_name && !(Options & OPT_SKIP_J)) { message ("Journal device has not been specified. Assuming journal is on the main " "device (%s).\n", device_name); jdevice_name = device_name; } if (jdevice_name && (Options & OPT_SKIP_J)) { message ("Either specify journal device, " "or choose the option --no-journal-available"); return 1; } if (j_new_device_name && (Options & OPT_STANDARD)) { /* New device was specified and --make-journal-standard was also. */ message ("Either specify new journal device, " "or choose the option --make-journal-standard"); return 1; } /* now we try to open journal, it makes sence if there is no the flag NEED_TUNE in ondisk superblock and --no-journal available is not specified. */ if (reiserfs_jp_get_magic(reiserfs_sb_jp(fs->fs_ondisk_sb)) != NEED_TUNE && !(Options & OPT_SKIP_J)) { if (reiserfs_journal_open (fs, jdevice_name, O_RDWR #if defined(O_LARGEFILE) | O_LARGEFILE #endif )) { message ("Failed to open the journal device (%s).", jdevice_name); return 1; } if (reiserfs_journal_params_check(fs)) { message ("Unable to open old journal. Wrong journal parameters."); reiserfs_fs_close (fs); return 1; } } /* in spite of journal was opened, the file system can be non-consistent or there are non-replayed transaction in journal, make sure it isn't (if there is no the flag NEED_TUNE in ondisk superblock */ if (reiserfs_jp_get_magic(reiserfs_sb_jp(fs->fs_ondisk_sb)) != NEED_TUNE && reiserfs_journal_opened (fs)) { j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data); if (reiserfs_journal_get_transactions(fs, &old, &new)) { if (new.trans_id != reiserfs_jh_get_flushed(j_head)) { message ("There are non-replayed transaction in old journal," " check filesystem consistency first"); reiserfs_fs_close (fs); return 1; } } if (!reiserfs_sb_state_ok (fs)) { message ("Check filesystem consistency first"); reiserfs_fs_close (fs); return 1; } } /* set UUID and LABEL if specified */ if (fs->fs_format == REISERFS_FORMAT_3_6) { #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) if (!uuid_is_null(UUID)) { memcpy (fs->fs_ondisk_sb->s_uuid, UUID, 16); reiserfs_buffer_mkdirty (fs->fs_super_bh); fs->fs_dirt = 1; } #endif if (LABEL != NULL) { if (strlen (LABEL) > 16) message ("Specified LABEL is longer then 16 characters, will be truncated\n"); strncpy ((char *)fs->fs_ondisk_sb->s_label, LABEL, 16); reiserfs_buffer_mkdirty (fs->fs_super_bh); fs->fs_dirt = 1; } } else { #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) if (!uuid_is_null(UUID)) reiserfs_exit (1, "UUID cannot be specified for 3.5 format\n"); #endif if (LABEL) reiserfs_exit (1, "LABEL cannot be specified for 3.5 format\n"); } if (!j_new_device_name) { /* new journal device hasn't been specified */ printf ("Current parameters:\n"); reiserfs_super_print_state (stdout, fs); reiserfs_node_print (stdout, fs, fs->fs_super_bh); if ((Options & OPT_STANDARD) && should_make_journal_standard(fs, j_new_device_name)) { if (!util_user_confirmed (stderr, "ATTENTION! Filesystem with " "non-standard journal found. Continue? (y/n):", "y\n")) { exit(1); } fs->fs_journal_dev = fs->fs_dev; if (set_standard_journal_params (fs)) { printf ("\nNew parameters:\n"); reiserfs_super_print_state (stdout, fs); reiserfs_node_print (stdout, fs, fs->fs_super_bh); printf ("New journal parameters:\n"); reiserfs_journal_print_params (stdout, reiserfs_sb_jp (fs->fs_ondisk_sb)); reiserfs_buffer_mkdirty (fs->fs_super_bh); reiserfs_buffer_mkuptodate (fs->fs_super_bh, 1); reiserfs_fs_close (fs); printf ("Syncing.."); fflush (stdout); sync (); printf ("ok\n"); return 0; } } if (Is_journal_or_maxtrans_size_specified) { /* new journal device hasn't been specified, but journal size or max transaction size have been, so we suppose that journal device remains the same */ if (!reiserfs_journal_opened (fs)) { message("Cannot set up new paramenters for not specified journal."); return 1; } j_new_device_name = jdevice_name; } else { /* the only parameter has been specified is device_name, so there is nothing to do */ reiserfs_fs_close (fs); return 0; } } /* new journal device has been specified */ /* make sure new journal device is block device file */ if (!util_device_formatable (j_new_device_name, Force)) { reiserfs_fs_close (fs); return 1; } if (!strcmp (device_name, j_new_device_name)) { unsigned long reserved, journal_size; /* we have to put journal on main device. It is only possible if there is enough space reserved by mkreiserfs */ if (!reiserfs_super_jr_magic (fs->fs_ondisk_sb)) /* standard journal */ reserved = reiserfs_jp_get_size(reiserfs_sb_jp(fs->fs_ondisk_sb)) + 1; else /* non-standard journal */ reserved = reiserfs_sb_get_reserved (fs->fs_ondisk_sb); journal_size = Journal_size; if (!journal_size) { journal_size = reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1; message("Journal size has not been specified. Assuming it is the default size (%lu)", journal_size); } if (journal_size + Offset > reiserfs_journal_start_must (fs) + reserved) { message ("There is no enough space reserved for journal on main " "device (journal_size=%lu, reserved=%lu)\n", journal_size, reserved); reiserfs_fs_close (fs); return 1; } } message ("Current journal parameters:"); reiserfs_journal_print_params (stdout, reiserfs_sb_jp (fs->fs_ondisk_sb)); if (!reiserfs_super_jr_magic (fs->fs_ondisk_sb)) { /* we have standard journal, so check if we can convert it to non-standard one */ /* if (!should_make_journal_non_standard (Force)) { reiserfs_fs_close (fs); return 1; } */ if (reiserfs_super_36_magic (fs->fs_ondisk_sb)) reiserfs_sb_set_version (fs->fs_ondisk_sb, REISERFS_FORMAT_3_6); else if (reiserfs_super_35_magic (fs->fs_ondisk_sb)) reiserfs_sb_set_version (fs->fs_ondisk_sb, REISERFS_FORMAT_3_5); else { message ("Could not convert from unknown version, try reiserfsck first"); reiserfs_fs_close (fs); return 1; } memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_JR_SUPER_MAGIC_STRING, strlen (REISERFS_JR_SUPER_MAGIC_STRING)); reiserfs_sb_set_reserved (fs->fs_ondisk_sb, reiserfs_jp_get_size (reiserfs_sb_jp(fs->fs_ondisk_sb)) + 1); } /* now we are going to close old journal and to create a new one */ reiserfs_journal_close (fs); if (!reiserfs_journal_create (fs, j_new_device_name, Offset, Journal_size, Max_trans_size)) { message ("Could not create new journal"); reiserfs_fs_close (fs); return 1; } if (should_make_journal_standard (fs, j_new_device_name)) set_standard_journal_params (fs); message ("New journal parameters:"); reiserfs_journal_print_params (stdout, reiserfs_sb_jp (fs->fs_ondisk_sb)); reiserfs_node_print (stdout, fs, fs->fs_super_bh); if (Force < 2) { message ("ATTENTION: YOU ARE ABOUT TO SETUP THE NEW JOURNAL FOR THE \"%s\"!\n" "AREA OF \"%s\" DEDICATED FOR JOURNAL WILL BE ZEROED!", device_name, j_new_device_name); if (!util_user_confirmed (stderr, "Continue (y/n):", "y\n")) { return 1; } } zero_journal (fs); reiserfs_fs_close (fs); printf ("Syncing.."); fflush (stdout); sync (); printf ("ok\n"); return 0; } reiserfsprogs-3.6.20/utils/tune/tune.h0000644000175300001440000000113510412227267014661 00000000000000/* * Copyright 2002-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #include "reiserfs/libreiserfs.h" #if 0 #include "io.h" #include "misc.h" #include "reiserfs_lib.h" #include "../version.h" #endif #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) # include #endif /* * options */ #define OPT_SUPER_FORCE 0x0010 #define OPT_OLD_J 0x0100 #define OPT_NEW_J 0x0200 #define OPT_SIZEJ 0x0400 #define OPT_TMAXS 0x0800 #define OPT_OFSET 0x1000 #define OPT_SKIP_J 0x2000 #define OPT_KEEPO 0x4000 #define OPT_FORCE 0x8000 #define OPT_STANDARD 0x0020 reiserfsprogs-3.6.20/utils/tune/tunefs.reiserfs.80000644000175300001440000001672410412227267016765 00000000000000.\" -*- nroff -*- .\" Copyright 1996-2004 Hans Reiser. .\" .TH tunefs.reiserfs 8 "February 2004" "Reiserfsprogs-3.6.19" .SH NAME tune.reiserfs \- The tuning tool for the ReiserFS filesystem. .SH SYNOPSIS .B tune.reiserfs [ \fB-f\fR ] [ \fB-j\fR | \fB--journal-device\fR \fIFILE\fR ] [ \fB--no-journal-available\fR ] [ \fB--journal-new-device\fR \fIFILE\fR ] [ \fB--make-journal-standard\fR ] [ \fB-s\fR | \fB--journal-new-size\fR \fIN\fR ] [ \fB-o\fR | \fB--journal-new-offset\fR \fIN\fR ] [ \fB-t\fR | \fB--max-transaction-size\fR \fIN\fR ] [ \fB-b\fR | \fB--add-badblocks\fR \fIfile\fR ] [ \fB-B\fR | \fB--badblocks\fR \fIfile\fR ] [ \fB-u\fR | \fB--uuid \fIUUID\fR ] [ \fB-l\fR | \fB--label \fILABEL\fR ] .I device .SH DESCRIPTION \fBtune.reiserfs\fR is used for tuning the ReiserFS. It can change two journal parameters (the journal size and the maximum transaction size), and it can move the journal's location to a new specified block device. (The old ReiserFS's journal may be kept unused, or discarded at the user's option.) Besides that \fBtune.reiserfs\fR can store the bad block list to the ReiserFS and set UUID and LABEL. Note: At the time of writing the relocated journal was implemented for a special release of ReiserFS, and was not expected to be put into the mainstream kernel until approximately Linux 2.5. This means that if you have the stock kernel you must apply a special patch. Without this patch the kernel will refuse to mount the newly modified file system. We will charge $25 to explain this to you if you ask us why it doesn't work. .PP Perhaps the most interesting application of this code is to put the journal on a solid state disk. .TP \fIdevice is the special file corresponding to the newly specified block device (e.g /dev/hdXX for IDE disk partition or /dev/sdXX for the SCSI disk partition). .SH OPTIONS .TP \fB-j\fR | \fB--journal-device\fR \fIFILE \fIFILE\fR is the file name of the block device the file system has the current journal (the one prior to running tune.reiserfs) on. This option is required when the journal is already on a separate device from the main data device (although it can be avoided with \fB--no-journal-available\fR). If you don't specify journal device by this option, tune.reiserfs suppose that journal is on main device. .TP \fB--no-journal-available allows \fBtune.reiserfs\fR to continue when the current journal's block device is no longer available. This might happen if a disk goes bad and you remove it (and run fsck). .TP \fB--journal-new-device \fIFILE \fIFILE\fR is the file name of the block device which will contain the new journal for the file system. If you don't specify this, tune.reiserfs supposes that journal device remains the same. .TP \fB \-s\fR | \fB\--journal-new-size \fIN \fIN\fR is the size parameter for the new journal. When journal is to be on a separate device - its size defaults to number of blocks that device has. When journal is to be on the same device as the filesytem - its size defaults to amount of blocks allocated for journal by \fImkfs.reiserfs\fR when it created the filesystem. Minimum is 513 for both cases. .TP \fB \-o\fR | \fB\--journal-new-offset \fIN \fIN\fR is an offset in blocks where journal will starts from when journal is to be on a separate device. Default is 0. Has no effect when journal is to be on the same device as the filesystem. Most users have no need to use this feature. It can be used when you want the journals from multiple filesystems to reside on the same device, and you don't want to or cannot partition that device. .TP \fB \-t\fR | \fB\--maximal-transaction-size \fIN \fIN\fR is the maximum transaction size parameter for the new journal. The default, and max possible, value is 1024 blocks. It should be less than half the size of the journal. If specifed incorrectly, it will be adjusted. .TP \fB \-b\fR | \fB\--add-badblocks\fR \fIfile\fR \fIFile\fR is the file name of the file that contains the list of blocks to be marked as bad on the fs. The list is added to the fs list of bad blocks. .TP \fB \-B\fR | \fB\--badblocks\fR \fIfile\fR \fIFile\fR is the file name of the file that contains the list of blocks to be marked as bad on the fs. The bad block list on the fs is cleared before the list specified in the \fIFile\fR is added to the fs. .TP \fB\-f\fR | \fB--force\fR Normally \fBtune.reiserfs\fR will refuse to change a journal of a file system that was created before this journal relocation code. This is because if you change the journal, you cannot go back (without special option \fB--make-journal-standard\fR) to an old kernel that lacks this feature and be able to use your filesytem. This option forces it to do that. Specified more than once it allows to avoid asking for confirmation. .TP \fB--make-journal-standard\fR As it was mentioned above, if your file system has non-standard journal, it can not be mounted on the kernel without journal relocation code. The thing can be changed, the only condition is that there is reserved area on main device of the standard journal size 8193 blocks (it will be so for instance if you convert standard journal to non-standard). Just specify this option when you relocate journal back, or without relocation if you already have it on main device. .TP \fB-u\fR | \fB--uuid \fIUUID\fR Set the universally unique identifier (\fB UUID \fR) of the filesystem to \fIUUID\fR (see also \fBuuidgen(8)\fR). The format of the UUID is a series of hex digits separated by hypthens, like this: "c1b9d5a2-f162-11cf-9ece-0020afc76f16". .TP \fB-l\fR | \fB--label \fILABEL\fR Set the volume label of the filesystem. \fILABEL\fR can be at most 16 characters long; if it is longer than 16 characters, tune.reiserfs will truncate it. .SH POSSIBLE SCENARIOS OF USING REISERFSTUNE: 1. You have ReiserFS on /dev/hda1, and you wish to have it working with its journal on the device /dev/journal .nf .IP boot kernel patched with special "relocatable journal support" patch tune.reiserfs /dev/hda1 --journal-new-device /dev/journal -f mount /dev/hda1 and use. You would like to change max transaction size to 512 blocks tune.reiserfs -t 512 /dev/hda1 You would like to use your file system on another kernel that doesn't contain relocatable journal support. umount /dev/hda1 tune.reiserfs /dev/hda1 -j /dev/journal --journal-new-device /dev/hda1 --make-journal-standard mount /dev/hda1 and use. .LP 2. You would like to have ReiserFS on /dev/hda1 and to be able to switch between different journals including journal located on the device containing the filesystem. .nf .IP boot kernel patched with special "relocatable journal support" patch mkfs.reiserfs /dev/hda1 you got solid state disk (perhaps /dev/sda, they typically look like scsi disks) tune.reiserfs --journal-new-device /dev/sda1 -f /dev/hda1 Your scsi device dies, it is three in the morning, you have an extra IDE device lying around fsck.reiserfs --no-journal-available /dev/hda1 or fsck.reiserfs --rebuild-tree --no-journal-available /dev/hda1 tune.reiserfs --no-journal-available --journal-new-device /dev/hda1 /dev/hda1 using /dev/hda1 under patched kernel .SH AUTHOR This version of \fBtune.reiserfs\fR has been written by Vladimir Demidov and Edward Shishkin . .SH BUGS Please report bugs to the ReiserFS developers , providing as much information as possible--your hardware, kernel, patches, settings, all printed messages; check the syslog file for any related information. .SH SEE ALSO .BR fsck.reiserfs (8), .BR debugfs.reiserfs (8), .BR mkfs.reiserfs (8)