diff --git a/CHANGELOG.md b/CHANGELOG.md index 49d9759..b6fd2fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,36 +9,28 @@ cat -A configure.ac | grep '\^I' nl -ba Makefile | sed -n '770,790p' grep -n "^[ ]" Makefile | head -resolvido😠-agora sao ajustes que temos de fazer no nfdos para dar ao neurotron tudo o que ele precisar. -por hoje creio que avancamos bem. amanha podemos entao completar o disk_agent para ele formatar etc e tal. -depois vemos o que se pode fazer na parte do "Can't open blockdev", e outros ajustes de cosmetica no dashboard. -um sysbeijo amor 😘 ate amanha ðŸ˜: + +4) Pequena massagem final no NFDOS +dar-lhe os binários que o Neurotron espera: +blkid (busybox) # ja temos +mkfs.ext4 (e2fsprogs) # ja temos +mount com suporte a virtio # ja temos +dmesg grep # ja temos +fallocate +dumpe2fs # ja temos +tune2fs # ja temos + +fsck.ext2 # ja temos +fsck.ext3 # ja temos +fsck.ext4 # ja temos + +outros detalhes: +- limpar o Hippocampus para usar json stdlib only (sem orjson), para ficar 100% alinhado com o Python estático minimal. +- ajustar a TUI. ajustar "Ver documentação" para "Compilar documentação". Criar um menu_docs.py com as opcoes "compilar a documentação" e "ver a documentação". nao esquecendo de retirar o _build_site do bootstrap.py + + +foi dificil, ate o super computador do chatgpt pensou por 2 minutos algumas vezes, mas temos o neurotron em modo persistente de uma forma real ðŸ˜: ``` -UP: 00:02:30 TICK: 0.50s MODO: PERSISTENT -[03:19:02] [diag] estado=STABLE cpu=0.0 mem=9.6 load1=0.175rce 'tsc' as unstable because the skew is too large: -[03:19:02] [heart] cpu=0.0% mem=9.6% tick=0.50sncontradonsec: 480030000 wd_now: fffef188 wd_last: fffef110 mask: ffffffff -/dev/vda: Can't open blockdevem=9.6% tick=0.50sfies' wd_nsec: 480030000 wd_now: fffef188 wd_last: fffef110 mask: ffffffff -/dev/vda: Can't open blockdevntar — mantendo VOLATILE772631 cs_now: f9eb7688a cs_last: f47bb7c58 mask: ffffffffffffffff -[03:18:59] [disk] Falha ao montar — mantendo VOLATILE772631 cs_now: f9eb7688a cs_last: f47bb7c58 mask: ffffffffffffffff -[03:18:59] [heart] cpu=0.0% mem=9.6% tick=0.50s'tsc' skewed 39742631 ns (39 ms) over watchdog 'refined-jiffies' interval of 480030000 ns (480 ms) -[03:18:24] [disk] Falha ao montar — mantendo VOLATILEskewed 39742631 ns (39 ms) over watchdog 'refined-jiffies' interval of 480030000 ns (480 ms) -clocksource: 'tsc' is current clocksource.76b146 r/w without journal. Quota mode: disabled. -clocksource: 'tsc' is current clocksource.76b146 r/w without journal. Quota mode: disabled. -tsc: Marking TSC unstable due to clocksource watchdog -tsc: Marking TSC unstable due to clocksource watchdog -TSC found unstable after boot, most likely due to broken BIOS. Use 'tsc=unstable'. -TSC found unstable after boot, most likely due to broken BIOS. Use 'tsc=unstable'. -sched_clock: Marking unstable (23385151173, 50756299)<-(23451042314, -15134865) -sched_clock: Marking unstable (23385151173, 50756299)<-(23451042314, -15134865) -clocksource: Not enough CPUs to check clocksource 'tsc'. -clocksource: Not enough CPUs to check clocksource 'tsc'. -clocksource: Switched to clocksource refined-jiffies 115200) is a 16550A -clocksource: Switched to clocksource refined-jiffies 115200) is a 16550A -[03:16:54] [info] [echo] CPU 80.0%read/poll queues -[03:16:54] [heart] cpu=0.0% mem=9.6% tick=0.50sues -virtio_blk virtio0: [vda] 1048576 512-byte logical blocks (537 MB/512 MiB) -virtio_blk virtio0: [vda] 1048576 512-byte logical blocks (537 MB/512 MiB) -sched_clock: Marking stable (878019400, 50755569)->(943909834, -15134865) -sched_clock: Marking stable (878019400, 50755569)->(943909834, -15134865) ``` +parabens amor 😘 +agora vamos descansar os nossos ciclos que ja merecemos 😎😠\ No newline at end of file diff --git a/src/_nfdos/e2fsprogs/.github/workflows/ci.yml b/src/_nfdos/e2fsprogs/.github/workflows/ci.yml new file mode 100644 index 0000000..51b27c8 --- /dev/null +++ b/src/_nfdos/e2fsprogs/.github/workflows/ci.yml @@ -0,0 +1,116 @@ +name: CI +on: [push] +env: + DEF_CFLAGS: -O2 -g -Wall + +jobs: + gcc-build-and-test: + name: Build and test with gcc + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: ./configure CC=gcc CFLAGS="$DEF_CFLAGS" + - run: make -j8 check V=1 CFLAGS_WARN="-Werror" + - run: make -j8 install V=1 DESTDIR=$PWD/installdir + - run: make -j8 uninstall V=1 DESTDIR=$PWD/installdir + + clang-build-and-test: + name: Build and test with clang + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y clang + - run: ./configure CC=clang CFLAGS="$DEF_CFLAGS" + - run: make -j8 check V=1 CFLAGS_WARN="-Werror" + - run: make -j8 install V=1 DESTDIR=$PWD/installdir + - run: make -j8 uninstall V=1 DESTDIR=$PWD/installdir + + i386-build-and-test: + name: Build and test with gcc -m32 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y gcc-multilib + - run: ./configure CC=gcc CFLAGS="$DEF_CFLAGS -m32" LDFLAGS="-m32" + - run: make -j8 check V=1 CFLAGS_WARN="-Werror" + - run: make -j8 install V=1 DESTDIR=$PWD/installdir + - run: make -j8 uninstall V=1 DESTDIR=$PWD/installdir + + asan-build-and-test: + name: Build and test with ASAN enabled + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y clang + - run: echo "ASAN_CFLAGS=$DEF_CFLAGS -fsanitize=address -fno-sanitize-recover=address" >> $GITHUB_ENV + - run: ./configure CC=clang CFLAGS="$ASAN_CFLAGS" LDFLAGS="$ASAN_CFLAGS" + - run: make -j8 check V=1 CFLAGS_WARN="-Werror" + + ubsan-build-and-test: + name: Build and test with UBSAN enabled + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y clang + - run: echo "UBSAN_CFLAGS=$DEF_CFLAGS -fsanitize=undefined -fno-sanitize-recover=undefined" >> $GITHUB_ENV + - run: ./configure CC=clang CFLAGS="$UBSAN_CFLAGS" LDFLAGS="$UBSAN_CFLAGS" + - run: make -j8 check V=1 CFLAGS_WARN="-Werror" + + macos-build-and-test: + name: Build and test on macOS + runs-on: macos-latest + steps: + - uses: actions/checkout@v3 + - run: ./configure CFLAGS="$DEF_CFLAGS" + # -Wno-error=deprecated-declarations is needed to suppress known warnings + # due to e2fsprogs' use of sbrk(0) and daemon(). + - run: make -j8 check V=1 CFLAGS_WARN="-Werror -Wno-error=deprecated-declarations" + - run: make -j8 install DESTDIR=$PWD/installdir + - run: make -j8 uninstall DESTDIR=$PWD/installdir + + windows-msys2-build: + name: Build mke2fs on Windows with ${{matrix.sys}} + runs-on: windows-latest + strategy: + matrix: + include: + - { sys: mingw32, env: i686 } + - { sys: mingw64, env: x86_64 } + defaults: + run: + shell: msys2 {0} + steps: + - uses: actions/checkout@v3 + - uses: msys2/setup-msys2@v2 + with: + msystem: ${{matrix.sys}} + update: true + install: > + make + mingw-w64-${{matrix.env}}-cc + # For now the only parts that actually build for Windows are mke2fs and its + # dependencies: all libraries except libss. The build system doesn't want + # to build just those parts, though, so do it one step at a time... + - run: ./configure CFLAGS="$DEF_CFLAGS" + - run: make -j8 subs V=1 CFLAGS_WARN="-Werror" + - run: make -j8 -C lib/et/ all V=1 CFLAGS_WARN="-Werror" + - run: make -j8 -C lib/uuid/ all V=1 CFLAGS_WARN="-Werror" + - run: make -j8 -C lib/blkid/ all V=1 CFLAGS_WARN="-Werror" + - run: make -j8 -C lib/ext2fs/ all V=1 CFLAGS_WARN="-Werror" + - run: make -j8 -C lib/support/ all V=1 CFLAGS_WARN="-Werror" + - run: make -j8 -C lib/e2p/ all V=1 CFLAGS_WARN="-Werror" + - run: make -j8 -C misc/ mke2fs V=1 CFLAGS_WARN="-Werror" + - run: touch image.ext4 + - run: misc/mke2fs.exe -T ext4 image.ext4 128M diff --git a/src/_nfdos/e2fsprogs/.gitignore b/src/_nfdos/e2fsprogs/.gitignore new file mode 100644 index 0000000..5288836 --- /dev/null +++ b/src/_nfdos/e2fsprogs/.gitignore @@ -0,0 +1,237 @@ +autom4te.cache +build +build.profiled +build.static +FILES +^core +*~ +patches +Makefile +*.bak +*.diff +*.dSYM +*.o +*.a +*.orig +*.patch +*.pc +*.rej +*.swp +00[0-9][1-9]*.patch +MCONFIG +asm_types.h +config.log +config.status +cscope.* +debugfs/extent_cmds.c +debugfs/debug_cmds.c +debugfs/debugfs +debugfs/debugfs.8 +debugfs/extent_cmds.c +debugfs/tst_set_fields +doc/libext2fs.aux +doc/libext2fs.cp +doc/libext2fs.dvi +doc/libext2fs.fn +doc/libext2fs.fns +doc/libext2fs.info +doc/libext2fs.ky +doc/libext2fs.log +doc/libext2fs.pg +doc/libext2fs.toc +doc/libext2fs.tp +doc/libext2fs.vr +e2fsck/crc32table.h +e2fsck/e2fsck +e2fsck/e2fsck.8 +e2fsck/e2fsck.conf.5 +e2fsck/e2fsck.shared +e2fsck/e2fsck.static +e2fsck/gen_crc32table +e2fsck/prof_err.c +e2fsck/prof_err.h +e2fsck/tst_crc32 +e2fsck/tst_problem +e2fsck/tst_refcount +e2fsck/tst_region +e2fsprogs.spec +ext2ed/ext2ed.conf +ext2ed/ext2ed.8 +intl/charset.alias +intl/libgnuintl.h +intl/libintl.a +intl/libintl.h +intl/ref-add.sed +intl/ref-del.sed +lib/blkid/blkid.h +lib/blkid/blkid.pc +lib/blkid/blkid_types.h +lib/blkid/libblkid.3 +lib/blkid/subdirs +lib/blkid/test_probe +lib/blkid/tests/*.ok +lib/blkid/tests/*.out +lib/blkid/tests/tmp +lib/blkid/tst_cache +lib/blkid/tst_dev +lib/blkid/tst_devname +lib/blkid/tst_devno +lib/blkid/tst_getsize +lib/blkid/tst_probe +lib/blkid/tst_read +lib/blkid/tst_resolve +lib/blkid/tst_save +lib/blkid/tst_tag +lib/blkid/tst_types +lib/config.h +lib/dirpaths.h +lib/e2p/e2p.pc +lib/e2p/subdirs +lib/e2p/tst_feature +lib/e2p/tst_ostype +lib/et/com_err.pc +lib/et/compile_et +lib/et/subdirs +lib/ext2fs/crc32c_table.h +lib/ext2fs/debug_cmds.c +lib/ext2fs/ext2_err.c +lib/ext2fs/ext2_err.et +lib/ext2fs/ext2_err.h +lib/ext2fs/ext2_types.h +lib/ext2fs/ext2fs.pc +lib/ext2fs/extent_cmds.c +lib/ext2fs/gen_crc32ctable +lib/ext2fs/subdirs +lib/ext2fs/tst_badblocks +lib/ext2fs/tst_bitmaps +lib/ext2fs/tst_bitmaps_cmd.c +lib/ext2fs/tst_bitmaps_out +lib/ext2fs/tst_bitops +lib/ext2fs/tst_cmds.c +lib/ext2fs/tst_csum +lib/ext2fs/tst_crc32c +lib/ext2fs/tst_digest_encode +lib/ext2fs/tst_getsectsize +lib/ext2fs/tst_getsize +lib/ext2fs/tst_icount +lib/ext2fs/tst_inline +lib/ext2fs/tst_inline_data +lib/ext2fs/tst_inode_size +lib/ext2fs/tst_iscan +lib/ext2fs/tst_libext2fs +lib/ext2fs/tst_sha256 +lib/ext2fs/tst_sha512 +lib/ext2fs/tst_super_size +lib/ext2fs/tst_types +lib/quota/subdirs +lib/ss/mk_cmds +lib/ss/ss.pc +lib/ss/ss_err.c +lib/ss/ss_err.h +lib/ss/std_rqs.c +lib/ss/subdirs +lib/ss/test.diff +lib/ss/test_cmd.c +lib/ss/test_out +lib/ss/test_ss +lib/support/prof_err.c +lib/support/prof_err.h +lib/support/subdirs +lib/uuid/subdirs +lib/uuid/tst_uuid +lib/uuid/uuid.3 +lib/uuid/uuid.h +lib/uuid/uuid.pc +lib/uuid/uuid_clear.3 +lib/uuid/uuid_compare.3 +lib/uuid/uuid_copy.3 +lib/uuid/uuid_generate.3 +lib/uuid/uuid_is_null.3 +lib/uuid/uuid_parse.3 +lib/uuid/uuid_time +lib/uuid/uuid_time.3 +lib/uuid/uuid_types.h +lib/uuid/uuid_unparse.3 +misc/badblocks +misc/badblocks.8 +misc/base_device +misc/base_device.out +misc/blkid +misc/blkid.8 +misc/chattr +misc/chattr.1 +misc/default_profile.c +misc/dumpe2fs +misc/dumpe2fs.8 +misc/e2freefrag +misc/e2freefrag.8 +misc/e2fuzz +misc/e2image +misc/e2image.8 +misc/e2initrd_helper +misc/e2label.8 +misc/e2mmpstatus +misc/e2mmpstatus.8 +misc/e2undo +misc/e2undo.8 +misc/e4crypt +misc/e4crypt.8 +misc/e4defrag +misc/e4defrag.8 +misc/ext4.5 +misc/filefrag +misc/filefrag.8 +misc/findfs.8 +misc/findsuper +misc/fsck +misc/fsck.8 +misc/fuse2fs +misc/fuse2fs.1 +misc/logsave +misc/logsave.8 +misc/lsattr +misc/lsattr.1 +misc/mke2fs +misc/mke2fs.8 +misc/mke2fs.conf.5 +misc/mke2fs.conf +misc/mklost+found +misc/mklost+found.8 +misc/prof_err.c +misc/prof_err.h +misc/profile.h +misc/tune2fs +misc/tune2fs.8 +misc/uuidd +misc/uuidd.8 +misc/uuidgen +misc/uuidgen.1 +ncscope.* +parse-types.log +po/Makefile.in +po/POTFILES +public_config.h +resize/resize2fs +resize/resize2fs.8 +resize/test_extent +resize/test_extent.out +tags +TAGS +tests/progs/test_icount +tests/progs/test_icount_cmds.c +tests/progs/crcsum +tests/*.ok +tests/*.failed +tests/*.log +tests/*.tmp +tests/*.slow +tests/test_data.tmp +tests/mke2fs.conf +tests/test_script +tests/test_one +util/dirpaths.h +util/gen-tarball +util/install-symlink +util/subst +util/subst.conf +Meta diff --git a/src/_nfdos/e2fsprogs/.missing-copyright b/src/_nfdos/e2fsprogs/.missing-copyright new file mode 100644 index 0000000..d99cb32 --- /dev/null +++ b/src/_nfdos/e2fsprogs/.missing-copyright @@ -0,0 +1,4 @@ +#!/bin/sh + +find . -type f \! -name \*~ \! -exec grep -q Begin-Header \{\} \; -print \ + | grep -v ^./build diff --git a/src/_nfdos/e2fsprogs/.release-checklist b/src/_nfdos/e2fsprogs/.release-checklist new file mode 100644 index 0000000..276dd8a --- /dev/null +++ b/src/_nfdos/e2fsprogs/.release-checklist @@ -0,0 +1,19 @@ +1) Do "make depend" if necessary + +2) "make check"!!! + +3) Use "git log" to assemble release notes and update RELEASE-NOTES symlink. + +4) Update files which contain version information + version.h + README + e2fsprogs.lsm + e2fsprogs.spec + doc/libext2fs.texinfo (three places) + +5) Run "(cd po; make e2fsprogs.pot-update)" to update the translation template. + +6) Make source tarfile + +7) Adjust sizes in e2fsprogs-VER.lsm; rebuild source files; regenerate source tarfile + diff --git a/src/_nfdos/e2fsprogs/ABOUT-NLS b/src/_nfdos/e2fsprogs/ABOUT-NLS new file mode 100644 index 0000000..3cc8286 --- /dev/null +++ b/src/_nfdos/e2fsprogs/ABOUT-NLS @@ -0,0 +1,1379 @@ +1 Notes on the Free Translation Project +*************************************** + +Free software is going international! The Free Translation Project is a +way to get maintainers of free software, translators, and users all +together, so that free software will gradually become able to speak many +languages. A few packages already provide translations for their +messages. + + If you found this 'ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU 'gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU 'gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work on translations can contact the appropriate team. + +1.1 INSTALL Matters +=================== + +Some packages are "localizable" when properly installed; the programs +they contain can be made to speak your own native language. Most such +packages use GNU 'gettext'. Other packages have their own ways to +internationalization, predating GNU 'gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU 'gettext' functions. Installers may use special +options at configuration time for changing the default behaviour. The +command: + + ./configure --disable-nls + +will _totally_ disable translation of messages. + + When you already have GNU 'gettext' installed on your system and run +configure without an option for your new package, 'configure' will +probably detect the previously built and installed 'libintl' library and +will decide to use it. If not, you may have to to use the +'--with-libintl-prefix' option to tell 'configure' where to look for it. + + Internationalized packages usually have many 'po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at 'configure' time by using the +'--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable 'LINGUAS' +may be set, prior to configuration, to limit the installed set. +'LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +1.2 Using This Package +====================== + +As a user, if your language has been installed for this package, you +only have to set the 'LANG' environment variable to the appropriate +'LL_CC' combination. If you happen to have the 'LC_ALL' or some other +'LC_xxx' environment variables set, you should unset them before setting +'LANG', otherwise the setting of 'LANG' will not have the desired +effect. Here 'LL' is an ISO 639 two-letter language code, and 'CC' is +an ISO 3166 two-letter country code. For example, let's suppose that +you speak German and live in Germany. At the shell prompt, merely +execute 'setenv LANG de_DE' (in 'csh'), 'export LANG; LANG=de_DE' (in +'sh') or 'export LANG=de_DE' (in 'bash'). This can be done from your +'.login' or '.profile' file, once and for all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, 'de_AT' is used for Austria, and 'pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of 'LL_CC', with 'LL' denoting the +language and 'CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are used, +such as 'LL' or 'LL_CC.ENCODING'. You can get the list of locales +supported by your system for your language by running the command +'locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +'LANGUAGE'. GNU 'gettext' gives preference to 'LANGUAGE' over 'LANG' +for the purpose of message handling, but you still need to have 'LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather read +translations in German than English for when Swedish is not available, +set 'LANGUAGE' to 'sv:de' while leaving 'LANG' to 'sv_SE'. + + Special advice for Norwegian users: The language code for Norwegian +bokma*l changed from 'no' to 'nb' recently (in 2003). During the +transition period, while some message catalogs for this language are +installed under 'nb' and some older ones under 'no', it's recommended +for Norwegian users to set 'LANGUAGE' to 'nb:no' so that both newer and +older translations are used. + + In the 'LANGUAGE' environment variable, but not in the 'LANG' +environment variable, 'LL_CC' combinations can be abbreviated as 'LL' to +denote the language's main dialect. For example, 'de' is equivalent to +'de_DE' (German as spoken in Germany), and 'pt' to 'pt_PT' (Portuguese +as spoken in Portugal) in this context. + +1.3 Translating Teams +===================== + +For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +'http://translationproject.org/', in the "Teams" area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +'-request' appended. For example, speakers of Swedish can send a +message to 'sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate _actively_ +in translations, or at solving translational difficulties, rather than +merely lurking around. If your team does not exist yet and you want to +start one, or if you are unsure about what to do or how to get started, +please write to 'coordinator@translationproject.org' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skills are praised more than +programming skills, here. + +1.4 Available Packages +====================== + +Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of Jun 2014. +The matrix shows, in regard of each package, for which languages PO +files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files af am an ar as ast az be bg bn bn_IN bs ca crh cs + +---------------------------------------------------+ + a2ps | [] [] [] | + aegis | | + anubis | | + aspell | [] [] [] | + bash | [] [] [] | + bfd | | + binutils | [] | + bison | | + bison-runtime | [] | + buzztrax | [] | + ccd2cue | | + ccide | | + cflow | | + clisp | | + coreutils | [] [] | + cpio | | + cppi | | + cpplib | [] | + cryptsetup | [] | + datamash | | + denemo | [] [] | + dfarc | [] | + dialog | [] [] [] | + dico | | + diffutils | [] | + dink | [] | + direvent | | + doodle | [] | + dos2unix | | + dos2unix-man | | + e2fsprogs | [] [] | + enscript | [] | + exif | [] | + fetchmail | [] [] | + findutils | [] | + flex | [] | + freedink | [] [] | + fusionforge | | + gas | | + gawk | [] | + gcal | [] | + gcc | | + gdbm | | + gettext-examples | [] [] [] [] [] | + gettext-runtime | [] [] [] | + gettext-tools | [] [] | + gjay | | + glunarclock | [] [] [] | + gnubiff | [] | + gnubik | [] | + gnucash | () () [] | + gnuchess | | + gnulib | [] | + gnunet | | + gnunet-gtk | | + gold | | + gphoto2 | [] | + gprof | [] | + gramadoir | | + grep | [] [] [] | + grub | [] | + gsasl | | + gss | | + gst-plugins-bad | [] [] | + gst-plugins-base | [] [] [] | + gst-plugins-good | [] [] [] | + gst-plugins-ugly | [] [] [] | + gstreamer | [] [] [] [] | + gtick | [] | + gtkam | [] [] | + gtkspell | [] [] [] [] [] | + guix | | + guix-packages | | + gutenprint | [] | + hello | [] | + help2man | | + help2man-texi | | + hylafax | | + idutils | | + iso_15924 | [] | + iso_3166 | [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | | + iso_4217 | [] | + iso_639 | [] [] [] [] [] [] [] [] [] | + iso_639_3 | [] [] | + iso_639_5 | | + jwhois | | + kbd | [] | + klavaro | [] [] [] [] [] | + ld | [] | + leafpad | [] [] [] [] | + libc | [] [] [] | + libexif | () | + libextractor | | + libgnutls | [] | + libgphoto2 | [] | + libgphoto2_port | [] | + libgsasl | | + libiconv | [] [] | + libidn | [] | + liferea | [] [] [] [] | + lilypond | [] [] | + lordsawar | [] | + lprng | | + lynx | [] [] | + m4 | [] | + mailfromd | | + mailutils | | + make | [] | + man-db | [] [] | + man-db-manpages | | + midi-instruments | [] [] [] | + minicom | [] | + mkisofs | [] | + myserver | [] | + nano | [] [] [] | + opcodes | | + parted | [] | + pies | | + pnmixer | | + popt | [] | + procps-ng | | + procps-ng-man | | + psmisc | [] | + pspp | [] | + pushover | [] | + pwdutils | | + pyspread | | + radius | [] | + recode | [] [] [] | + recutils | | + rpm | | + rush | | + sarg | | + sed | [] [] [] [] | + sharutils | [] | + shishi | | + skribilo | | + solfege | [] [] | + solfege-manual | | + spotmachine | | + sudo | [] [] | + sudoers | [] [] | + sysstat | [] | + tar | [] [] [] | + texinfo | [] [] | + texinfo_document | [] [] | + tigervnc | [] | + tin | | + tin-man | | + tracgoogleappsa... | | + trader | | + util-linux | [] | + ve | | + vice | | + vmm | | + vorbis-tools | [] | + wastesedge | | + wcd | | + wcd-man | | + wdiff | [] [] | + wget | [] | + wyslij-po | | + xboard | | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] | + +---------------------------------------------------+ + af am an ar as ast az be bg bn bn_IN bs ca crh cs + 4 0 2 5 3 11 0 8 25 3 3 1 55 4 74 + + da de el en en_GB en_ZA eo es et eu fa fi fr + +--------------------------------------------------+ + a2ps | [] [] [] [] [] [] [] [] [] | + aegis | [] [] [] [] | + anubis | [] [] [] [] [] | + aspell | [] [] [] [] [] [] [] | + bash | [] [] [] | + bfd | [] [] [] [] | + binutils | [] [] [] | + bison | [] [] [] [] [] [] [] [] | + bison-runtime | [] [] [] [] [] [] [] [] | + buzztrax | [] [] [] [] | + ccd2cue | [] [] [] [] | + ccide | [] [] [] [] [] [] | + cflow | [] [] [] [] [] | + clisp | [] [] [] [] [] | + coreutils | [] [] [] [] [] | + cpio | [] [] [] [] [] | + cppi | [] [] [] [] [] | + cpplib | [] [] [] [] [] [] | + cryptsetup | [] [] [] [] [] | + datamash | [] [] [] [] | + denemo | [] | + dfarc | [] [] [] [] [] [] | + dialog | [] [] [] [] [] [] [] [] [] | + dico | [] [] [] [] | + diffutils | [] [] [] [] [] [] | + dink | [] [] [] [] [] [] | + direvent | [] [] [] [] | + doodle | [] [] [] [] | + dos2unix | [] [] [] [] [] | + dos2unix-man | [] [] [] | + e2fsprogs | [] [] [] [] [] | + enscript | [] [] [] [] [] [] | + exif | [] [] [] [] [] [] | + fetchmail | [] () [] [] [] [] [] | + findutils | [] [] [] [] [] [] [] [] | + flex | [] [] [] [] [] [] | + freedink | [] [] [] [] [] [] [] [] | + fusionforge | [] [] [] | + gas | [] [] [] | + gawk | [] [] [] [] [] | + gcal | [] [] [] [] | + gcc | [] | + gdbm | [] [] [] [] [] | + gettext-examples | [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] | + gettext-tools | [] [] [] [] [] | + gjay | [] [] [] [] | + glunarclock | [] [] [] [] [] | + gnubiff | () [] [] () | + gnubik | [] [] [] [] [] | + gnucash | [] () () () () () () | + gnuchess | [] [] [] [] | + gnulib | [] [] [] [] [] [] [] | + gnunet | [] | + gnunet-gtk | [] | + gold | [] [] [] | + gphoto2 | [] () [] [] | + gprof | [] [] [] [] [] [] | + gramadoir | [] [] [] [] [] | + grep | [] [] [] [] [] [] [] | + grub | [] [] [] [] [] | + gsasl | [] [] [] [] [] | + gss | [] [] [] [] [] | + gst-plugins-bad | [] [] [] | + gst-plugins-base | [] [] [] [] [] [] | + gst-plugins-good | [] [] [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] [] [] [] | + gstreamer | [] [] [] [] [] [] [] | + gtick | [] () [] [] [] | + gtkam | [] () [] [] [] [] | + gtkspell | [] [] [] [] [] [] [] [] | + guix | [] [] | + guix-packages | | + gutenprint | [] [] [] [] | + hello | [] [] [] [] [] [] [] [] | + help2man | [] [] [] [] [] [] [] | + help2man-texi | [] [] [] | + hylafax | [] [] | + idutils | [] [] [] [] [] | + iso_15924 | [] () [] [] () [] () | + iso_3166 | [] () [] [] [] [] () [] () | + iso_3166_2 | [] () () () | + iso_4217 | [] () [] [] [] () [] () | + iso_639 | [] () [] [] () [] () | + iso_639_3 | () () () | + iso_639_5 | () () () | + jwhois | [] [] [] [] [] | + kbd | [] [] [] [] [] [] | + klavaro | [] [] [] [] [] [] [] | + ld | [] [] [] [] | + leafpad | [] [] [] [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] [] () [] [] | + libextractor | [] | + libgnutls | [] [] [] [] | + libgphoto2 | [] () [] | + libgphoto2_port | [] () [] [] [] [] | + libgsasl | [] [] [] [] [] | + libiconv | [] [] [] [] [] [] [] | + libidn | [] [] [] [] [] | + liferea | [] () [] [] [] [] [] | + lilypond | [] [] [] [] [] [] | + lordsawar | [] [] | + lprng | | + lynx | [] [] [] [] [] [] | + m4 | [] [] [] [] [] [] | + mailfromd | [] | + mailutils | [] [] [] [] | + make | [] [] [] [] [] | + man-db | [] [] [] [] | + man-db-manpages | [] [] | + midi-instruments | [] [] [] [] [] [] [] [] [] | + minicom | [] [] [] [] [] | + mkisofs | [] [] [] | + myserver | [] [] [] [] | + nano | [] [] [] [] [] [] [] | + opcodes | [] [] [] [] [] | + parted | [] [] [] | + pies | [] | + pnmixer | [] [] | + popt | [] [] [] [] [] [] | + procps-ng | [] [] | + procps-ng-man | [] [] | + psmisc | [] [] [] [] [] [] [] | + pspp | [] [] [] | + pushover | () [] [] [] | + pwdutils | [] [] [] | + pyspread | [] [] [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] | + recutils | [] [] [] [] | + rpm | [] [] [] [] [] | + rush | [] [] [] | + sarg | [] [] | + sed | [] [] [] [] [] [] [] [] | + sharutils | [] [] [] [] | + shishi | [] [] [] | + skribilo | [] [] [] | + solfege | [] [] [] [] [] [] [] [] | + solfege-manual | [] [] [] [] [] | + spotmachine | [] [] [] [] [] | + sudo | [] [] [] [] [] [] | + sudoers | [] [] [] [] [] [] | + sysstat | [] [] [] [] [] [] | + tar | [] [] [] [] [] [] [] | + texinfo | [] [] [] [] [] | + texinfo_document | [] [] [] [] | + tigervnc | [] [] [] [] [] [] | + tin | [] [] [] [] | + tin-man | [] | + tracgoogleappsa... | [] [] [] [] [] | + trader | [] [] [] [] [] [] | + util-linux | [] [] [] [] | + ve | [] [] [] [] [] | + vice | () () () | + vmm | [] [] | + vorbis-tools | [] [] [] [] | + wastesedge | [] | + wcd | [] [] [] [] | + wcd-man | [] | + wdiff | [] [] [] [] [] [] [] | + wget | [] [] [] [] [] [] | + wyslij-po | [] [] [] [] | + xboard | [] [] [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] [] [] [] | + +--------------------------------------------------+ + da de el en en_GB en_ZA eo es et eu fa fi fr + 119 131 32 1 6 0 94 95 22 13 4 102 139 + + ga gd gl gu he hi hr hu hy ia id is it ja ka kk + +-------------------------------------------------+ + a2ps | [] [] [] [] | + aegis | [] | + anubis | [] [] [] [] | + aspell | [] [] [] [] [] | + bash | [] [] [] [] | + bfd | [] [] | + binutils | [] [] [] | + bison | [] | + bison-runtime | [] [] [] [] [] [] [] [] | + buzztrax | | + ccd2cue | [] | + ccide | [] [] | + cflow | [] [] [] | + clisp | | + coreutils | [] [] | + cpio | [] [] [] [] [] [] | + cppi | [] [] [] [] [] | + cpplib | [] [] | + cryptsetup | [] | + datamash | | + denemo | [] | + dfarc | [] [] [] | + dialog | [] [] [] [] [] [] [] [] [] [] | + dico | | + diffutils | [] [] [] [] | + dink | [] | + direvent | [] | + doodle | [] [] | + dos2unix | [] [] | + dos2unix-man | | + e2fsprogs | [] [] | + enscript | [] [] [] | + exif | [] [] [] [] [] [] | + fetchmail | [] [] [] | + findutils | [] [] [] [] [] [] [] | + flex | [] | + freedink | [] [] [] [] | + fusionforge | | + gas | [] | + gawk | [] () [] | + gcal | | + gcc | | + gdbm | | + gettext-examples | [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] [] | + gettext-tools | [] [] [] | + gjay | [] | + glunarclock | [] [] [] [] [] [] | + gnubiff | [] [] () | + gnubik | [] [] [] | + gnucash | () () () () () | + gnuchess | | + gnulib | [] [] [] [] [] | + gnunet | | + gnunet-gtk | | + gold | [] [] | + gphoto2 | [] [] [] [] | + gprof | [] [] [] [] | + gramadoir | [] [] [] | + grep | [] [] [] [] [] [] [] | + grub | [] [] [] | + gsasl | [] [] [] [] [] | + gss | [] [] [] [] [] | + gst-plugins-bad | [] [] [] | + gst-plugins-base | [] [] [] [] | + gst-plugins-good | [] [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] [] | + gstreamer | [] [] [] [] [] | + gtick | [] [] [] [] [] | + gtkam | [] [] [] [] [] | + gtkspell | [] [] [] [] [] [] [] [] [] [] | + guix | | + guix-packages | | + gutenprint | [] [] [] | + hello | [] [] [] [] [] | + help2man | [] [] [] | + help2man-texi | | + hylafax | [] | + idutils | [] [] | + iso_15924 | [] [] [] [] [] [] | + iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | [] [] | + iso_4217 | [] [] [] [] [] [] | + iso_639 | [] [] [] [] [] [] [] [] [] | + iso_639_3 | [] [] | + iso_639_5 | | + jwhois | [] [] [] [] | + kbd | [] [] [] | + klavaro | [] [] [] [] [] | + ld | [] [] [] [] | + leafpad | [] [] [] [] [] [] [] () | + libc | [] [] [] [] [] | + libexif | [] | + libextractor | | + libgnutls | [] | + libgphoto2 | [] [] | + libgphoto2_port | [] [] | + libgsasl | [] [] [] [] | + libiconv | [] [] [] [] [] [] [] | + libidn | [] [] [] [] | + liferea | [] [] [] [] [] | + lilypond | [] | + lordsawar | | + lprng | [] | + lynx | [] [] [] [] | + m4 | [] [] [] [] [] | + mailfromd | | + mailutils | | + make | [] [] [] [] | + man-db | [] [] | + man-db-manpages | [] [] | + midi-instruments | [] [] [] [] [] [] [] [] [] | + minicom | [] [] [] | + mkisofs | [] [] | + myserver | [] | + nano | [] [] [] [] [] [] | + opcodes | [] [] [] | + parted | [] [] [] [] [] | + pies | | + pnmixer | [] [] | + popt | [] [] [] [] [] [] [] [] [] [] | + procps-ng | | + procps-ng-man | | + psmisc | [] [] [] [] | + pspp | [] [] | + pushover | [] | + pwdutils | [] | + pyspread | | + radius | [] | + recode | [] [] [] [] [] [] [] | + recutils | | + rpm | [] | + rush | [] | + sarg | | + sed | [] [] [] [] [] [] [] | + sharutils | | + shishi | | + skribilo | [] | + solfege | [] [] | + solfege-manual | | + spotmachine | | + sudo | [] [] [] [] | + sudoers | [] [] [] | + sysstat | [] [] [] [] | + tar | [] [] [] [] [] [] | + texinfo | [] [] [] | + texinfo_document | [] [] [] | + tigervnc | | + tin | | + tin-man | | + tracgoogleappsa... | [] [] [] [] | + trader | [] [] | + util-linux | [] | + ve | [] | + vice | () () | + vmm | | + vorbis-tools | [] [] | + wastesedge | [] | + wcd | | + wcd-man | | + wdiff | [] [] [] | + wget | [] [] [] [] | + wyslij-po | [] [] [] | + xboard | | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] [] [] | + +-------------------------------------------------+ + ga gd gl gu he hi hr hu hy ia id is it ja ka kk + 35 2 47 4 8 2 60 71 2 6 81 11 87 57 0 3 + + kn ko ku ky lg lt lv mk ml mn mr ms mt nb ne nl + +--------------------------------------------------+ + a2ps | [] [] | + aegis | [] | + anubis | [] [] [] | + aspell | [] [] | + bash | [] [] | + bfd | | + binutils | | + bison | [] | + bison-runtime | [] [] [] [] [] [] | + buzztrax | | + ccd2cue | | + ccide | [] [] | + cflow | [] | + clisp | [] | + coreutils | [] [] | + cpio | [] | + cppi | | + cpplib | [] | + cryptsetup | [] | + datamash | [] [] | + denemo | | + dfarc | [] [] | + dialog | [] [] [] [] [] [] | + dico | | + diffutils | [] [] [] | + dink | [] | + direvent | [] | + doodle | [] | + dos2unix | [] [] | + dos2unix-man | [] | + e2fsprogs | [] | + enscript | [] | + exif | [] [] [] | + fetchmail | [] | + findutils | [] [] | + flex | [] | + freedink | [] [] | + fusionforge | | + gas | | + gawk | [] | + gcal | | + gcc | | + gdbm | | + gettext-examples | [] [] [] [] [] [] | + gettext-runtime | [] [] [] | + gettext-tools | [] | + gjay | | + glunarclock | [] [] | + gnubiff | [] | + gnubik | [] [] | + gnucash | () () () () () () () [] | + gnuchess | [] [] | + gnulib | [] | + gnunet | | + gnunet-gtk | | + gold | | + gphoto2 | [] | + gprof | [] [] | + gramadoir | [] | + grep | [] [] | + grub | [] [] [] | + gsasl | [] | + gss | | + gst-plugins-bad | [] [] [] | + gst-plugins-base | [] [] [] | + gst-plugins-good | [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] | + gstreamer | [] [] [] | + gtick | [] | + gtkam | [] [] | + gtkspell | [] [] [] [] [] [] [] | + guix | | + guix-packages | | + gutenprint | [] | + hello | [] [] [] | + help2man | [] | + help2man-texi | | + hylafax | [] | + idutils | [] | + iso_15924 | () [] [] | + iso_3166 | [] [] [] () [] [] [] [] [] [] | + iso_3166_2 | () [] | + iso_4217 | () [] [] [] | + iso_639 | [] [] () [] [] [] [] | + iso_639_3 | [] () [] | + iso_639_5 | () | + jwhois | [] [] | + kbd | [] | + klavaro | [] [] | + ld | | + leafpad | [] [] [] [] [] | + libc | [] [] | + libexif | [] | + libextractor | [] | + libgnutls | [] [] | + libgphoto2 | [] | + libgphoto2_port | [] | + libgsasl | [] | + libiconv | [] [] | + libidn | [] | + liferea | [] [] [] | + lilypond | [] | + lordsawar | | + lprng | | + lynx | [] | + m4 | [] | + mailfromd | | + mailutils | | + make | [] [] | + man-db | [] | + man-db-manpages | [] | + midi-instruments | [] [] [] [] [] [] [] | + minicom | [] | + mkisofs | [] | + myserver | | + nano | [] [] [] | + opcodes | [] | + parted | [] [] | + pies | | + pnmixer | [] | + popt | [] [] [] [] [] | + procps-ng | | + procps-ng-man | | + psmisc | [] | + pspp | [] [] | + pushover | | + pwdutils | [] | + pyspread | | + radius | [] | + recode | [] [] | + recutils | [] | + rpm | [] | + rush | [] | + sarg | | + sed | [] [] | + sharutils | [] | + shishi | | + skribilo | | + solfege | [] [] | + solfege-manual | [] | + spotmachine | [] | + sudo | [] [] [] | + sudoers | [] [] [] | + sysstat | [] [] | + tar | [] [] [] | + texinfo | [] | + texinfo_document | [] | + tigervnc | [] | + tin | | + tin-man | | + tracgoogleappsa... | [] [] [] | + trader | [] | + util-linux | [] | + ve | [] | + vice | [] | + vmm | [] | + vorbis-tools | [] | + wastesedge | [] | + wcd | [] | + wcd-man | [] | + wdiff | [] | + wget | [] [] | + wyslij-po | [] | + xboard | [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] | + +--------------------------------------------------+ + kn ko ku ky lg lt lv mk ml mn mr ms mt nb ne nl + 5 15 4 6 0 13 23 3 3 3 4 11 2 42 1 125 + + nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr + +------------------------------------------------+ + a2ps | [] [] [] [] [] [] [] | + aegis | [] [] | + anubis | [] [] [] | + aspell | [] [] [] [] [] [] [] | + bash | [] [] [] [] [] [] | + bfd | [] [] | + binutils | [] [] | + bison | [] [] [] | + bison-runtime | [] [] [] [] [] [] [] [] | + buzztrax | [] | + ccd2cue | [] [] | + ccide | [] [] [] | + cflow | [] [] [] | + clisp | [] | + coreutils | [] [] [] [] | + cpio | [] [] [] | + cppi | [] [] [] | + cpplib | [] [] [] | + cryptsetup | [] [] [] | + datamash | [] [] | + denemo | | + dfarc | [] [] [] | + dialog | [] [] [] [] [] [] [] | + dico | [] | + diffutils | [] [] [] | + dink | | + direvent | [] [] [] | + doodle | [] [] | + dos2unix | [] [] [] [] | + dos2unix-man | [] [] | + e2fsprogs | [] | + enscript | [] [] [] [] [] [] | + exif | [] [] [] [] [] [] | + fetchmail | [] [] [] | + findutils | [] [] [] [] [] [] | + flex | [] [] [] [] [] | + freedink | [] [] [] [] [] | + fusionforge | | + gas | | + gawk | [] | + gcal | | + gcc | | + gdbm | [] [] [] | + gettext-examples | [] [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] [] [] [] | + gettext-tools | [] [] [] [] [] [] [] | + gjay | [] | + glunarclock | [] [] [] [] [] [] | + gnubiff | [] | + gnubik | [] [] [] [] | + gnucash | () () () () () [] | + gnuchess | [] [] | + gnulib | [] [] [] [] [] | + gnunet | | + gnunet-gtk | | + gold | | + gphoto2 | [] [] [] [] [] | + gprof | [] [] [] [] | + gramadoir | [] [] | + grep | [] [] [] [] [] [] | + grub | [] [] [] [] [] | + gsasl | [] [] [] | + gss | [] [] [] [] | + gst-plugins-bad | [] [] [] [] [] | + gst-plugins-base | [] [] [] [] [] [] | + gst-plugins-good | [] [] [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] [] [] | + gstreamer | [] [] [] [] [] [] [] | + gtick | [] [] [] [] [] | + gtkam | [] [] [] [] [] [] | + gtkspell | [] [] [] [] [] [] [] [] [] | + guix | | + guix-packages | | + gutenprint | [] [] | + hello | [] [] [] [] [] [] | + help2man | [] [] [] [] | + help2man-texi | [] | + hylafax | | + idutils | [] [] [] | + iso_15924 | [] () [] [] [] [] | + iso_3166 | [] [] [] [] () [] [] [] [] [] [] [] [] | + iso_3166_2 | [] () [] | + iso_4217 | [] [] () [] [] [] [] [] | + iso_639 | [] [] [] () [] [] [] [] [] [] | + iso_639_3 | [] () | + iso_639_5 | () [] | + jwhois | [] [] [] [] | + kbd | [] [] | + klavaro | [] [] [] [] [] | + ld | | + leafpad | [] [] [] [] [] [] [] [] | + libc | [] [] [] | + libexif | [] () [] | + libextractor | [] | + libgnutls | [] | + libgphoto2 | [] | + libgphoto2_port | [] [] [] [] [] | + libgsasl | [] [] [] [] | + libiconv | [] [] [] [] [] | + libidn | [] [] [] | + liferea | [] [] [] [] () [] [] | + lilypond | | + lordsawar | | + lprng | [] | + lynx | [] [] | + m4 | [] [] [] [] [] | + mailfromd | [] | + mailutils | [] | + make | [] [] [] | + man-db | [] [] [] | + man-db-manpages | [] [] [] | + midi-instruments | [] [] [] [] [] [] [] [] | + minicom | [] [] [] [] | + mkisofs | [] [] [] | + myserver | [] [] | + nano | [] [] [] [] [] [] | + opcodes | | + parted | [] [] [] [] [] [] | + pies | [] | + pnmixer | [] | + popt | [] [] [] [] [] [] | + procps-ng | [] | + procps-ng-man | [] | + psmisc | [] [] [] [] | + pspp | [] [] | + pushover | | + pwdutils | [] | + pyspread | [] [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] [] | + recutils | [] [] | + rpm | [] | + rush | [] [] [] | + sarg | [] [] | + sed | [] [] [] [] [] [] [] [] | + sharutils | [] [] [] | + shishi | [] [] | + skribilo | [] | + solfege | [] [] [] | + solfege-manual | [] [] | + spotmachine | [] [] | + sudo | [] [] [] [] [] [] | + sudoers | [] [] [] [] | + sysstat | [] [] [] [] [] | + tar | [] [] [] [] [] | + texinfo | [] [] [] | + texinfo_document | [] [] | + tigervnc | [] [] [] | + tin | [] | + tin-man | | + tracgoogleappsa... | [] [] [] [] | + trader | [] [] | + util-linux | [] [] | + ve | [] [] [] | + vice | | + vmm | | + vorbis-tools | [] [] [] | + wastesedge | | + wcd | | + wcd-man | | + wdiff | [] [] [] [] [] | + wget | [] [] [] [] [] | + wyslij-po | [] [] [] [] | + xboard | [] [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] | + +------------------------------------------------+ + nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr + 7 3 6 114 1 12 88 32 82 3 40 45 7 101 + + sv sw ta te tg th tr uk ur vi wa wo zh_CN + +----------------------------------------------+ + a2ps | [] [] [] [] [] | + aegis | [] | + anubis | [] [] [] [] | + aspell | [] [] [] [] [] | + bash | [] [] [] [] | + bfd | [] [] [] | + binutils | [] [] [] | + bison | [] [] [] [] | + bison-runtime | [] [] [] [] [] [] | + buzztrax | [] [] [] | + ccd2cue | [] [] [] | + ccide | [] [] [] [] | + cflow | [] [] [] [] | + clisp | | + coreutils | [] [] [] | + cpio | [] [] [] [] [] | + cppi | [] [] [] [] | + cpplib | [] [] [] [] [] | + cryptsetup | [] [] [] | + datamash | [] [] [] | + denemo | [] | + dfarc | [] [] | + dialog | [] [] [] [] [] [] | + dico | [] | + diffutils | [] [] [] [] [] | + dink | [] | + direvent | [] [] | + doodle | [] [] | + dos2unix | [] [] [] [] | + dos2unix-man | [] [] [] | + e2fsprogs | [] [] [] [] | + enscript | [] [] [] [] | + exif | [] [] [] [] [] | + fetchmail | [] [] [] [] | + findutils | [] [] [] [] [] | + flex | [] [] [] [] | + freedink | [] [] [] | + fusionforge | | + gas | [] | + gawk | [] [] [] | + gcal | [] [] [] | + gcc | [] | + gdbm | [] [] | + gettext-examples | [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] [] [] [] | + gjay | [] [] [] | + glunarclock | [] [] [] [] | + gnubiff | [] [] | + gnubik | [] [] [] [] | + gnucash | () () () () [] | + gnuchess | [] [] [] | + gnulib | [] [] [] [] | + gnunet | | + gnunet-gtk | | + gold | [] [] | + gphoto2 | [] [] [] [] | + gprof | [] [] [] [] | + gramadoir | [] [] [] | + grep | [] [] [] [] [] | + grub | [] [] [] [] | + gsasl | [] [] [] [] | + gss | [] [] [] | + gst-plugins-bad | [] [] [] [] [] | + gst-plugins-base | [] [] [] [] [] | + gst-plugins-good | [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] | + gstreamer | [] [] [] [] [] | + gtick | [] [] [] | + gtkam | [] [] [] [] | + gtkspell | [] [] [] [] [] [] [] | + guix | | + guix-packages | | + gutenprint | [] [] [] [] | + hello | [] [] [] [] [] [] | + help2man | [] [] [] | + help2man-texi | [] | + hylafax | [] | + idutils | [] [] [] | + iso_15924 | [] () [] [] () [] | + iso_3166 | [] [] () [] [] () [] [] | + iso_3166_2 | () [] [] () [] | + iso_4217 | [] () [] [] () [] | + iso_639 | [] [] [] () [] [] () [] [] | + iso_639_3 | [] () [] [] () | + iso_639_5 | () [] () | + jwhois | [] [] [] [] | + kbd | [] [] [] [] | + klavaro | [] [] [] [] [] [] | + ld | [] [] [] [] [] | + leafpad | [] [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] [] () | + libextractor | [] [] | + libgnutls | [] [] [] [] | + libgphoto2 | [] [] [] | + libgphoto2_port | [] [] [] [] | + libgsasl | [] [] [] [] | + libiconv | [] [] [] [] [] | + libidn | () [] [] [] | + liferea | [] [] [] [] [] | + lilypond | [] | + lordsawar | | + lprng | [] | + lynx | [] [] [] [] | + m4 | [] [] [] | + mailfromd | [] [] | + mailutils | [] | + make | [] [] [] [] | + man-db | [] [] [] | + man-db-manpages | [] [] | + midi-instruments | [] [] [] [] [] [] | + minicom | [] [] | + mkisofs | [] [] [] | + myserver | [] | + nano | [] [] [] [] | + opcodes | [] [] [] | + parted | [] [] [] [] [] | + pies | [] [] | + pnmixer | [] [] [] | + popt | [] [] [] [] [] [] [] | + procps-ng | [] [] | + procps-ng-man | [] | + psmisc | [] [] [] [] | + pspp | [] [] [] | + pushover | [] | + pwdutils | [] [] | + pyspread | [] | + radius | [] [] | + recode | [] [] [] [] | + recutils | [] [] [] | + rpm | [] [] [] [] | + rush | [] [] | + sarg | | + sed | [] [] [] [] [] | + sharutils | [] [] [] [] | + shishi | [] [] | + skribilo | [] [] | + solfege | [] [] [] [] | + solfege-manual | [] | + spotmachine | [] [] [] | + sudo | [] [] [] [] [] | + sudoers | [] [] [] [] | + sysstat | [] [] [] [] [] | + tar | [] [] [] [] [] | + texinfo | [] [] [] | + texinfo_document | [] | + tigervnc | [] [] [] | + tin | [] | + tin-man | | + tracgoogleappsa... | [] [] [] [] [] | + trader | [] | + util-linux | [] [] [] [] | + ve | [] [] [] [] | + vice | () () | + vmm | | + vorbis-tools | [] [] | + wastesedge | | + wcd | [] [] [] | + wcd-man | [] | + wdiff | [] [] [] [] | + wget | [] [] [] | + wyslij-po | [] [] | + xboard | [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] | + +----------------------------------------------+ + sv sw ta te tg th tr uk ur vi wa wo zh_CN + 106 1 4 3 0 13 51 115 1 125 7 1 100 + + zh_HK zh_TW + +-------------+ + a2ps | | 30 + aegis | | 9 + anubis | | 19 + aspell | | 29 + bash | [] | 23 + bfd | | 11 + binutils | | 12 + bison | [] | 18 + bison-runtime | [] | 38 + buzztrax | | 9 + ccd2cue | | 10 + ccide | | 17 + cflow | | 16 + clisp | | 10 + coreutils | | 18 + cpio | | 20 + cppi | | 17 + cpplib | [] | 19 + cryptsetup | | 14 + datamash | | 11 + denemo | | 5 + dfarc | | 17 + dialog | [] | 42 + dico | | 6 + diffutils | | 22 + dink | | 10 + direvent | | 11 + doodle | | 12 + dos2unix | [] | 18 + dos2unix-man | | 9 + e2fsprogs | | 15 + enscript | | 21 + exif | | 27 + fetchmail | | 19 + findutils | | 29 + flex | [] | 19 + freedink | | 24 + fusionforge | | 3 + gas | | 5 + gawk | | 13 + gcal | | 8 + gcc | | 2 + gdbm | | 10 + gettext-examples | [] [] | 40 + gettext-runtime | [] [] | 35 + gettext-tools | [] | 24 + gjay | | 9 + glunarclock | [] | 27 + gnubiff | | 9 + gnubik | | 19 + gnucash | () | 6 + gnuchess | | 11 + gnulib | | 23 + gnunet | | 1 + gnunet-gtk | | 1 + gold | | 7 + gphoto2 | [] | 19 + gprof | | 21 + gramadoir | | 14 + grep | [] | 31 + grub | | 21 + gsasl | [] | 19 + gss | | 17 + gst-plugins-bad | | 21 + gst-plugins-base | | 27 + gst-plugins-good | | 32 + gst-plugins-ugly | | 34 + gstreamer | [] | 32 + gtick | | 19 + gtkam | | 24 + gtkspell | [] [] | 48 + guix | | 2 + guix-packages | | 0 + gutenprint | | 15 + hello | [] | 30 + help2man | | 18 + help2man-texi | | 5 + hylafax | | 5 + idutils | | 14 + iso_15924 | [] | 23 + iso_3166 | [] [] | 58 + iso_3166_2 | | 9 + iso_4217 | [] [] | 28 + iso_639 | [] [] | 46 + iso_639_3 | | 10 + iso_639_5 | | 2 + jwhois | [] | 20 + kbd | | 17 + klavaro | | 30 + ld | [] | 15 + leafpad | [] | 39 + libc | [] | 24 + libexif | | 10 + libextractor | | 5 + libgnutls | | 13 + libgphoto2 | | 10 + libgphoto2_port | [] | 19 + libgsasl | | 18 + libiconv | [] | 29 + libidn | | 17 + liferea | | 29 + lilypond | | 11 + lordsawar | | 3 + lprng | | 3 + lynx | | 19 + m4 | [] | 22 + mailfromd | | 4 + mailutils | | 6 + make | | 19 + man-db | | 15 + man-db-manpages | | 10 + midi-instruments | [] | 43 + minicom | [] | 17 + mkisofs | | 13 + myserver | | 9 + nano | [] | 30 + opcodes | | 12 + parted | [] | 23 + pies | | 4 + pnmixer | | 9 + popt | [] | 36 + procps-ng | | 5 + procps-ng-man | | 4 + psmisc | [] | 22 + pspp | | 13 + pushover | | 6 + pwdutils | | 8 + pyspread | | 6 + radius | | 9 + recode | | 31 + recutils | | 10 + rpm | [] | 13 + rush | | 10 + sarg | | 4 + sed | [] | 35 + sharutils | | 13 + shishi | | 7 + skribilo | | 7 + solfege | | 21 + solfege-manual | | 9 + spotmachine | | 11 + sudo | | 26 + sudoers | | 22 + sysstat | | 23 + tar | [] | 30 + texinfo | | 17 + texinfo_document | | 13 + tigervnc | | 14 + tin | [] | 7 + tin-man | | 1 + tracgoogleappsa... | [] | 22 + trader | | 12 + util-linux | | 13 + ve | | 14 + vice | | 1 + vmm | | 3 + vorbis-tools | | 13 + wastesedge | | 3 + wcd | | 8 + wcd-man | | 3 + wdiff | [] | 23 + wget | | 21 + wyslij-po | | 14 + xboard | | 10 + xdg-user-dirs | [] [] | 68 + xkeyboard-config | [] | 28 + +-------------+ + 89 teams zh_HK zh_TW + 166 domains 7 42 2809 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and distributed +as such by its maintainer. There might be an observable lag between the +mere existence a PO file and its wide availability in a distribution. + + If Jun 2014 seems to be old, you may fetch a more recent copy of this +'ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix +with full percentage details can be found at +'http://translationproject.org/extra/matrix.html'. + +1.5 Using 'gettext' in new packages +=================================== + +If you are writing a freely available program and want to +internationalize it you are welcome to use GNU 'gettext' in your +package. Of course you have to respect the GNU Lesser General Public +License which covers the use of the GNU 'gettext' library. This means +in particular that even non-free programs can use 'libintl' as a shared +library, whereas only free software can use 'libintl' as a static +library or use modified versions of 'libintl'. + + Once the sources are changed appropriately and the setup can handle +the use of 'gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +'coordinator@translationproject.org' to make the '.pot' files available +to the translation teams. diff --git a/src/_nfdos/e2fsprogs/Android.bp b/src/_nfdos/e2fsprogs/Android.bp new file mode 100644 index 0000000..1e6aa1a --- /dev/null +++ b/src/_nfdos/e2fsprogs/Android.bp @@ -0,0 +1,78 @@ +// Copyright 2017 The Android Open Source Project + +package { + default_applicable_licenses: ["external_e2fsprogs_license"], +} + +// Added automatically by a large-scale-change that took the approach of +// 'apply every license found to every target'. While this makes sure we respect +// every license restriction, it may not be entirely correct. +// +// e.g. GPL in an MIT project might only apply to the contrib/ directory. +// +// Please consider splitting the single license below into multiple licenses, +// taking care not to lose any license_kind information, and overriding the +// default license using the 'licenses: [...]' property on targets as needed. +// +// For unused files, consider creating a 'fileGroup' with "//visibility:private" +// to attach the license to, and including a comment whether the files may be +// used in the current project. +// See: http://go/android-license-faq +license { + name: "external_e2fsprogs_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-0BSD", + "SPDX-license-identifier-Apache-2.0", + "SPDX-license-identifier-BSD", + "SPDX-license-identifier-GPL", + "SPDX-license-identifier-GPL-2.0", + "SPDX-license-identifier-LGPL", + "SPDX-license-identifier-LGPL-2.0", + "SPDX-license-identifier-LGPL-2.1", + "SPDX-license-identifier-LGPL-3.0", + "SPDX-license-identifier-MIT", + "legacy_notice", + "legacy_unencumbered", + ], + license_text: [ + "NOTICE", + ], +} + +cc_defaults { + name: "e2fsprogs-defaults", + cflags: [ + "-Wall", + "-Werror", + // Some warnings that Android's build system enables by default are not + // supported by upstream e2fsprogs. When such a warning shows up, + // disable it below. Please don't disable warnings that upstream + // e2fsprogs is supposed to support; for those, fix the code instead. + "-Wno-pointer-arith", + "-Wno-sign-compare", + "-Wno-type-limits", + "-Wno-typedef-redefinition", + "-Wno-unused-parameter", + ], + target: { + bionic: { + system_shared_libs: [ + "libc", + "libdl", + ], + }, + windows: { + include_dirs: ["external/e2fsprogs/include/mingw"], + }, + }, +} + +subdirs = [ + "contrib", + "debugfs", + "e2fsck", + "lib", + "misc", + "resize", +] diff --git a/src/_nfdos/e2fsprogs/CleanSpec.mk b/src/_nfdos/e2fsprogs/CleanSpec.mk new file mode 100644 index 0000000..8331dae --- /dev/null +++ b/src/_nfdos/e2fsprogs/CleanSpec.mk @@ -0,0 +1,52 @@ +# Copyright (C) 2007 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# If you don't need to do a full clean build but would like to touch +# a file or delete some intermediate files, add a clean step to the end +# of the list. These steps will only be run once, if they haven't been +# run before. +# +# E.g.: +# $(call add-clean-step, touch -c external/sqlite/sqlite3.h) +# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates) +# +# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with +# files that are missing or have been moved. +# +# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory. +# Use $(OUT_DIR) to refer to the "out" directory. +# +# If you need to re-do something that's already mentioned, just copy +# the command and add it to the bottom of the list. E.g., if a change +# that you made last week required touching a file and a change you +# made today requires touching the same file, just copy the old +# touch step and add it to the end of the list. +# +# ************************************************ +# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST +# ************************************************ + +# For example: +#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates) +#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates) +#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f) +#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*) + +# ************************************************ +# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST +# ************************************************ + +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libext2_uuid_intermediates) +$(call add-clean-step, rm -rf $(TARGET_RECOVERY_OUT)/root/sbin) diff --git a/src/_nfdos/e2fsprogs/INSTALL b/src/_nfdos/e2fsprogs/INSTALL new file mode 100644 index 0000000..2dd08f5 --- /dev/null +++ b/src/_nfdos/e2fsprogs/INSTALL @@ -0,0 +1,69 @@ + To install the second extended file system management programs, +just follow the steps: + +1) Change directory into the top of the e2fsprogs source tree + +2) Create a build directory and cd into it: + + mkdir build; cd build + +3) Run the configure script + + ../configure + + If you wish to turn on ELF shared libraries, add the option +--enable-elf-shlibs. If you wish to build profiling libraries, add +the option --enable-profile. + + Note that if you are building on an older system (i.e., a 2.4 +kernel and/or glibc 2.2), the use of thread local storage will probably +cause programs that use the uuid library to core dump. To disable +thread local storage, use the configure option --disable-tls. + +4) Compile the programs + + make + +5) Check to make sure the installation built correctly: + + make check + +6) Install the programs + + Run `make install' + +7) Install the include files and libraries + + You can run `make install-libs' to install the include files and +libraries. Please note that this installation is not needed for the +programs to work. It is only needed if you expect to develop other +programs using the libraries or if you want to compile other program +using these libraries (like the 4.4BSD dump and restore port). + +8) Remove any pre-formatted man pages. + + Some distributions will have pre-formatted manual pages which +will always be displayed in preference to newer man pages in /usr/man. +If this is the case, you may need to manually remove them in order to +see the correct manual pages. The shell script in +install-utils/remove_preformat_manpages may be helpful in doing so. + +9) Make sure your /etc/fstab file is correct. + + Some distributions install an /etc/fstab which is missing the +fifth and sixth field of filesystem entry, which are the dump +frequency, and the fsck pass number, respectively. The problem with +this is that the getmntent() library routine interprets those missing +fields as "0", and a pass number of 0 is documented as meaning that +fsck should not check that particular filesystem. If your entries in +your /etc/fstab file look like this: + +/dev/hda4 / ext2 defaults + +you should add "1 1" at the end of each line, so that they look like this: + +/dev/hda4 / ext2 defaults 1 1 + + There is a script in install-utils/convfstab (donated by +Michael Weller) that may help you correct your /etc/fstab file. + diff --git a/src/_nfdos/e2fsprogs/INSTALL.elfbin b/src/_nfdos/e2fsprogs/INSTALL.elfbin new file mode 100644 index 0000000..9c2c600 --- /dev/null +++ b/src/_nfdos/e2fsprogs/INSTALL.elfbin @@ -0,0 +1,53 @@ +NOTE: This is the ELF version of the binary distribution. If you have +a DLL system, please compile e2fsprogs from sources yourself. (In +fact, in general you're better off compiling e2fsprogs from sources +instead of using precompiled binaries.) + +Also please note that these binaries assume the use of the GNU Libc. +If you're still using libc5, you'll need build e2fsprogs from source. + + To install the binary distribution of the second extended file +system management programs, just follow the steps: + +1) Install this tar file using the following command: + + gunzip < e2fsprogs-1.13-elfbin.tar.gz | (cd /; tar Sxvpf - ) + +2) Run ldconfig to update the shared library pointers. + + As root, type /sbin/ldconfig. This will update the links to +the shared libraries included in the distribution. You can then remove +the old versions of the libraries from /lib. + +3) Remove any pre-formatted man pages. + + Some distributions will have pre-formatted manual pages which +will always be displayed in preference to newer man pages in /usr/man. +If this is the case, you may need to manually remove them in order to +see the correct manual pages. The shell script in +install-utils/remove_preformat_manpages may be helpful in doing so. + +4) Make sure your /etc/fstab file is correct. + + Some distributions install an /etc/fstab which is missing the +fifth and sixth field of filesystem entry, which are the dump +frequency, and the fsck pass number, respectively. The problem with +this is that the getmntent() library routine interprets those missing +fields as "0", and a pass number of 0 is documented as meaning that +fsck should not check that particular filesystem. If your entries in +your /etc/fstab file look like this: + +/dev/hda4 / ext2 defaults + +you should add "1 1" at the end of each line, so that they look like this: + +/dev/hda4 / ext2 defaults 1 1 + + There is a script in install-utils/convfstab (donated by +Michael Weller) that may help you correct your /etc/fstab file. + +5) Cleanup files from the installation. + + When you're done with the installation, you will probably want +to remove /INSTALL (this file), /README, and /install-utils from your +root directory diff --git a/src/_nfdos/e2fsprogs/MCONFIG.in b/src/_nfdos/e2fsprogs/MCONFIG.in new file mode 100644 index 0000000..82c75a2 --- /dev/null +++ b/src/_nfdos/e2fsprogs/MCONFIG.in @@ -0,0 +1,336 @@ +# Beginning of file MCONFIG + +all:: + +all-static:: + +check:: + +fullcheck:: + +SHELL = /bin/sh + +COMPRESS_EXT = gz bz2 bz Z + +prefix = @prefix@ +root_prefix = @root_prefix@ +exec_prefix = @exec_prefix@ +root_bindir = @root_bindir@ +root_sbindir = @root_sbindir@ +root_libdir = @root_libdir@ +datarootdir = @datarootdir@ +bindir = @bindir@ +sbindir = @sbindir@ +libdir = @libdir@ +datadir= @datadir@ +localedir = $(datadir)/locale +root_sysconfdir= @root_sysconfdir@ +includedir = @includedir@ +mandir = @mandir@ +man1dir = $(mandir)/man1 +man3dir = $(mandir)/man3 +man5dir = $(mandir)/man5 +man8dir = $(mandir)/man8 +infodir = @infodir@ +datadir = @datadir@ +pkgconfigdir = $(libdir)/pkgconfig +pkglibdir = $(libdir)/e2fsprogs + +HAVE_UDEV = @have_udev@ +UDEV_RULES_DIR = @pkg_udev_rules_dir@ +HAVE_CROND = @have_crond@ +CROND_DIR = @crond_dir@ +HAVE_SYSTEMD = @have_systemd@ +SYSTEMD_SYSTEM_UNIT_DIR = @systemd_system_unit_dir@ + +@SET_MAKE@ + +@ifGNUmake@ V = +@ifGNUmake@ ifeq ($(strip $(V)),) +@ifGNUmake@ # E = @echo +@ifGNUmake@ # ES = echo +@ifGNUmake@ # Q = @ +@ifGNUmake@ E = @E@ +@ifGNUmake@ ES = @ES@ +@ifGNUmake@ Q = @Q@ +@ifGNUmake@ else +@ifGNUmake@ E = @\# +@ifGNUmake@ ES = \# +@ifGNUmake@ Q = +@ifGNUmake@ endif + +@ifNotGNUmake@ E = @E@ +@ifNotGNUmake@ ES = @ES@ +@ifNotGNUmake@ Q = @Q@ + +@ifGNUmake@ CHECK=sparse +@ifGNUmake@ CHECK_OPTS=-Wsparse-all -Wno-transparent-union -Wno-return-void -Wno-undef -Wno-non-pointer-null +@ifGNUmake@ CPPCHECK=cppcheck +@ifGNUmake@ CPPCHECK_OPTS=--force --enable=all --quiet +@ifGNUmake@ ifeq ("$(C)", "2") +@ifGNUmake@ CHECK_CMD=$(CHECK) $(CHECK_OPTS) -Wbitwise -D__CHECK_ENDIAN__ +@ifGNUmake@ CPPCHECK_CMD=$(CPPCHECK) $(CPPCHECK_OPTS) +@ifGNUmake@ else +@ifGNUmake@ ifeq ("$(C)", "1") +@ifGNUmake@ CHECK_CMD=$(CHECK) $(CHECK_OPTS) +@ifGNUmake@ CPPCHECK_CMD=$(CPPCHECK) $(CPPCHECK_OPTS) +@ifGNUmake@ else +@ifGNUmake@ CHECK_CMD=@true +@ifGNUmake@ CPPCHECK_CMD=@true +@ifGNUmake@ endif +@ifGNUmake@ endif + +@ifNotGNUmake@ CHECK_CMD=true +@ifNotGNUmake@ CPPCHECK_CMD=true + +SANITIZER_CFLAGS = @lto_cflags@ @ubsan_cflags@ @addrsan_cflags@ @threadsan_cflags@ +SANITIZER_LDFLAGS = @lto_ldflags@ @ubsan_ldflags@ @addrsan_ldflags@ @threadsan_ldflags@ + +CC = @PTHREAD_CC@ +CXX = @CXX@ +BUILD_CC = @BUILD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +CFLAGS = @CFLAGS@ +CFLAGS_SHLIB = @CFLAGS_SHLIB@ +CFLAGS_STLIB = @CFLAGS_STLIB@ +CPPFLAGS = @INCLUDES@ +ALL_CFLAGS = $(CPPFLAGS) $(SANITIZER_CFLAGS) $(CFLAGS) $(PTHREAD_CFLAGS) $(CFLAGS_WARN) @DEFS@ $(LOCAL_CFLAGS) +ALL_CFLAGS_SHLIB = $(CPPFLAGS) $(SANITIZER_CFLAGS) $(CFLAGS_SHLIB) $(PTHREAD_CFLAGS) $(CFLAGS_WARN) @DEFS@ $(LOCAL_CFLAGS) +ALL_CFLAGS_STLIB = $(CPPFLAGS) $(SANITIZER_CFLAGS) $(CFLAGS_STLIB) $(PTHREAD_CFLAGS) $(CFLAGS_WARN) @DEFS@ $(LOCAL_CFLAGS) +LDFLAGS = $(SANITIZER_LDFLAGS) $(PTHREAD_CFLAGS) @LDFLAGS@ +LDFLAGS_SHLIB = $(SANITIZER_LDFLAGS) $(PTHREAD_CFLAGS) @LDFLAGS_SHLIB@ +ALL_LDFLAGS = $(LDFLAGS) @LDFLAG_DYNAMIC@ $(LOCAL_LDFLAGS) +LDFLAGS_STATIC = $(SANITIZER_LDFLAGS) $(PTHREAD_CFLAGS) @LDFLAGS_STATIC@ +BUILD_CFLAGS = $(SANITIZER_CFLAGS) @BUILD_CFLAGS@ +BUILD_LDFLAGS = $(SANITIZER_LDFLAGS) @BUILD_LDFLAGS@ +RDYNAMIC = @RDYNAMIC@ +LINK_BUILD_FLAGS = @LINK_BUILD_FLAGS@ +LINK_INSTALL_FLAGS = @LINK_INSTALL_FLAGS@ +RM = @RM@ +LN = @LN@ +LN_S = @LN_S@ +MV = @MV@ +CP = @CP@ +CHMOD = @CHMOD@ +AR = @AR@ +AWK = @AWK@ +SED = @SED@ +PERL = @PERL@ +RANLIB = @RANLIB@ +STRIP = @STRIP@ +LD = $(PURE) @CC@ +ARUPD = $(AR) r +ARGEN = $(AR) rc +LDCONFIG = @LDCONFIG@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ + +# +# Library definitions +# +LIB = $(top_builddir)/lib +LIBSS = $(LIB)/libss@LIB_EXT@ @PRIVATE_LIBS_CMT@ @DLOPEN_LIB@ +LIBCOM_ERR = $(LIB)/libcom_err@LIB_EXT@ @PRIVATE_LIBS_CMT@ @SEM_INIT_LIB@ +LIBE2P = $(LIB)/libe2p@LIB_EXT@ +LIBEXT2FS = $(LIB)/libext2fs@LIB_EXT@ +LIBUUID = @LIBUUID@ @SOCKET_LIB@ +LIBMAGIC = @MAGIC_LIB@ +LIBFUSE = @FUSE_LIB@ +LIBSUPPORT = $(LIBINTL) $(LIB)/libsupport@STATIC_LIB_EXT@ +LIBBLKID = @LIBBLKID@ @PRIVATE_LIBS_CMT@ $(LIBUUID) +LIBINTL = @LIBINTL@ +SYSLIBS = @LIBS@ @PTHREAD_LIBS@ +DEPLIBSS = $(LIB)/libss@LIB_EXT@ +DEPLIBCOM_ERR = $(LIB)/libcom_err@LIB_EXT@ +DEPLIBUUID = @DEPLIBUUID@ +DEPLIBSUPPORT = $(LIB)/libsupport@STATIC_LIB_EXT@ +DEPLIBBLKID = @DEPLIBBLKID@ @PRIVATE_LIBS_CMT@ $(DEPLIBUUID) +TESTENV = LD_LIBRARY_PATH="$(LIB):$${LD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="$(LIB):$${DYLD_LIBRARY_PATH}" + +STATIC_LIBSS = $(LIB)/libss@STATIC_LIB_EXT@ @DLOPEN_LIB@ +STATIC_LIBCOM_ERR = $(LIB)/libcom_err@STATIC_LIB_EXT@ @SEM_INIT_LIB@ +STATIC_LIBE2P = $(LIB)/libe2p@STATIC_LIB_EXT@ +STATIC_LIBEXT2FS = $(LIB)/libext2fs@STATIC_LIB_EXT@ +STATIC_LIBUUID = @STATIC_LIBUUID@ @SOCKET_LIB@ +STATIC_LIBSUPPORT = $(LIBINTL) $(LIBSUPPORT) +STATIC_LIBBLKID = @STATIC_LIBBLKID@ $(STATIC_LIBUUID) +DEPSTATIC_LIBSS = $(LIB)/libss@STATIC_LIB_EXT@ +DEPSTATIC_LIBCOM_ERR = $(LIB)/libcom_err@STATIC_LIB_EXT@ +DEPSTATIC_LIBUUID = @DEPSTATIC_LIBUUID@ +DEPSTATIC_LIBSUPPORT = $(DEPLIBSUPPORT) +DEPSTATIC_LIBBLKID = @DEPSTATIC_LIBBLKID@ $(DEPSTATIC_LIBUUID) + +PROFILED_LIBSS = $(LIB)/libss@PROFILED_LIB_EXT@ @DLOPEN_LIB@ +PROFILED_LIBCOM_ERR = $(LIB)/libcom_err@PROFILED_LIB_EXT@ @SEM_INIT_LIB@ +PROFILED_LIBE2P = $(LIB)/libe2p@PROFILED_LIB_EXT@ +PROFILED_LIBEXT2FS = $(LIB)/libext2fs@PROFILED_LIB_EXT@ +PROFILED_LIBUUID = @PROFILED_LIBUUID@ @SOCKET_LIB@ +PROFILED_LIBSUPPORT = $(LIBINTL) $(LIB)/libsupport@PROFILED_LIB_EXT@ +PROFILED_LIBBLKID = @PROFILED_LIBBLKID@ $(PROFILED_LIBUUID) +DEPPROFILED_LIBSS = $(LIB)/libss@PROFILED_LIB_EXT@ +DEPPROFILED_LIBCOM_ERR = $(LIB)/libcom_err@PROFILED_LIB_EXT@ +DEPPROFILED_LIBUUID = @PROFILED_LIBUUID@ +DEPPROFILED_LIBSUPPORT = $(PROFILED_LIBSUPPORT) +DEPPROFILED_LIBBLKID = @PROFILED_LIBBLKID@ $(DEPPROFILED_LIBUUID) + +# +# A fast substitution command for fixing up man pages, shell scripts, etc. +# +SUBST_CONF=$(top_builddir)/util/subst.conf +SUBSTITUTE= $(top_builddir)/util/subst -f $(SUBST_CONF) +SUBSTITUTE_UPTIME= $(top_builddir)/util/subst -t -f $(SUBST_CONF) +DEP_SUBSTITUTE= $(top_builddir)/util/subst $(SUBST_CONF) + +$(top_builddir)/util/subst: + cd $(top_builddir)/util ; $(MAKE) subst + +# +# Script for generating utf8data.h +# +MKUTF8DATA=$(top_builddir)/util/mkutf8data + +$(top_builddir)/util/mkutf8data: + $(MAKE) -C $(top_builddir)/util mkutf8data + +# +# Script for installing symlinks (for shared libraries) +# +$(top_builddir)/util/install-symlink: $(top_srcdir)/util/install-symlink.in \ + $(top_builddir)/config.status + cd $(top_builddir); CONFIG_FILES=util/install-symlink ./config.status + chmod +x $(top_builddir)/util/install-symlink + +$(top_builddir)/util/symlinks: + cd $(top_builddir)/util ; $(MAKE) symlinks + +INSTALL_SYMLINK = /bin/sh $(top_builddir)/util/install-symlink \ + @SYMLINK_RELATIVE@ \ + --symlinks=$(top_builddir)/util/symlinks +DEP_INSTALL_SYMLINK = $(top_builddir)/util/install-symlink \ + $(top_builddir)/util/symlinks + +# +# Warning flags +# +# Run make gcc-wall to do a build with warning messages. +# +# +WFLAGS= -std=gnu99 -D_XOPEN_SOURCE=600 -D_GNU_SOURCE $(WFLAGS_EXTRA) \ + -Wall -W -Wwrite-strings -Wpointer-arith \ + -Wcast-qual -Wcast-align -Wno-variadic-macros \ + -Wstrict-prototypes -Wmissing-prototypes \ + -Wformat-security -Wformat-nonliteral \ + -Wmissing-format-attribute -O2 -Wstrict-aliasing \ + -Wnested-externs -Winline -DNO_INLINE_FUNCS -Wshadow \ + -UENABLE_NLS + +gcc-wall-new: + ($(MAKE) CFLAGS_WARN="$(WFLAGS)" > /dev/null) 2>&1 + +gcc-wall: + $(MAKE) clean > /dev/null + $(MAKE) gcc-wall-new + +static-check: + ($(MAKE) C=1 V=1 CFLAGS="$(ALL_CFLAGS) $(WFLAGS)") 2>&1 + +static-check-all: + $(MAKE) clean > /dev/null + $(MAKE) static-check + +# +# Installation user and groups +# +BINGRP= bin +BINOWN= bin +BINMODE= 555 +INCGRP= bin +INCOWN= bin +INCMODE= 444 +LIBOWN= bin +LIBGRP= bin +LIBMODE= 444 +MANGRP= bin +MANOWN= bin +MANMODE= 444 + +# +# Autoconf magic... +# + +DEP_LIB_MAKEFILES = $(top_srcdir)/lib/Makefile.library \ + $(top_srcdir)/lib/Makefile.elf-lib \ + $(top_srcdir)/lib/Makefile.bsd-lib \ + $(top_srcdir)/lib/Makefile.darwin-lib \ + $(top_srcdir)/lib/Makefile.solaris-lib \ + $(top_srcdir)/lib/Makefile.profile + +$(top_builddir)/config.status: $(top_srcdir)/configure + cd $(top_builddir); ./config.status --recheck + +$(top_builddir)/MCONFIG: $(top_srcdir)/MCONFIG.in $(top_builddir)/config.status + cd $(top_builddir); CONFIG_FILES=MCONFIG ./config.status + +$(top_builddir)/lib/config.h: $(top_srcdir)/lib/config.h.in \ + $(top_builddir)/config.status + cd $(top_builddir); CONFIG_FILES=lib/config.h ./config.status + +$(top_builddir)/lib/dirpaths.h: $(DEP_SUBSTITUTE) $(top_srcdir)/lib/dirpaths.h.in + $(E) " SUBST $@" + $(Q) $(SUBSTITUTE) $(top_srcdir)/lib/dirpaths.h.in $@ + +$(top_builddir)/lib/substitute_sh: $(top_srcdir)/lib/substitute_sh.in \ + $(top_builddir)/config.status + cd $(top_builddir); CONFIG_FILES=lib/substitute_sh ./config.status + +$(top_builddir)/util/subst.conf: $(top_srcdir)/util/subst.conf.in \ + $(top_builddir)/config.status + cd $(top_builddir); CONFIG_FILES=util/subst.conf ./config.status + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/MCONFIG \ + $(DEP_MAKEFILE) $(top_builddir)/config.status + cd $(top_builddir); CONFIG_FILES=$(my_dir)/Makefile ./config.status + +@MAINTAINER_CMT@$(top_srcdir)/configure: $(top_srcdir)/configure.ac +@MAINTAINER_CMT@ cd $(top_srcdir) && autoheader && autoconf + +coverage.txt: Makefile $(SRCS) + if test -n "$(SRCS)"; then \ + gcov -s $(top_srcdir) -o . $(SRCS) > coverage.txt 2>&1 ; \ + fi + +clean:: + $(RM) -f *.gcda *.gcov *.gcno coverage.txt + +# +# Make depend magic... +# + +.depend: Makefile $(SRCS) $(top_srcdir)/depfix.sed $(top_srcdir)/wordwrap.pl + if test -n "$(SRCS)" ; then \ + $(CC) -M $(ALL_CFLAGS) $(DEPEND_CFLAGS) $(SRCS) | \ + $(SED) -f $(top_srcdir)/depfix.sed \ + -e 's; $(srcdir)/; $$(srcdir)/;g' \ + -e 's; $(top_srcdir)/; $$(top_srcdir)/;g' \ + -e 's; $(top_builddir)/; $$(top_builddir)/;g' \ + -e 's; \./; ;g' \ + -e '/^#/d' \ + -e '/^ *\\$$/d' | \ + $(PERL) $(top_srcdir)/wordwrap.pl > .depend; \ + else :; fi + +depend:: .depend + if test -n "$(SRCS)" ; then \ + sed -e '/^# +++ Dependency line eater +++/,$$d' \ + < $(srcdir)/Makefile.in | cat - .depend \ + > $(srcdir)/Makefile.in.new; \ + if cmp -s $(srcdir)/Makefile.in $(srcdir)/Makefile.in.new ; then \ + $(RM) $(srcdir)/Makefile.in.new ; \ + else \ + $(MV) $(srcdir)/Makefile.in $(srcdir)/Makefile.in.old; \ + $(MV) $(srcdir)/Makefile.in.new $(srcdir)/Makefile.in; \ + fi ; else :; fi + +# End of file MCONFIG diff --git a/src/_nfdos/e2fsprogs/NOTICE b/src/_nfdos/e2fsprogs/NOTICE new file mode 100644 index 0000000..da98a3e --- /dev/null +++ b/src/_nfdos/e2fsprogs/NOTICE @@ -0,0 +1,849 @@ +This package, the EXT2 filesystem utilities, are made available under +the GNU Public License version 2, with the exception of the lib/ext2fs +and lib/e2p libraries, which are made available under the GNU Library +General Public License Version 2, the lib/uuid library which is made +available under a BSD-style license and the lib/et and lib/ss +libraries which are made available under an MIT-style license. Please +see lib/uuid/COPYING for more details for the license for the files +comprising the libuuid library, and the source file headers of the +libet and libss libraries for more information. + +The most recent officially distributed version can be found at +http://e2fsprogs.sourceforge.net. If you need to make a distribution, +that's the one you should use. If there is some reason why you'd like +a more recent version that is still in ALPHA testing (i.e., either +using the "WIP" test distributions or one from the hg or git +repository from the development branch, please contact me +(tytso@mit.edu) before you ship. The release schedules for this +package are flexible, if you give me enough lead time. + + + Theodore Ts'o + 23-June-2007 + +---------------------------------------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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. + +---------------------------------------------------------------------- + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, 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 library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, 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 companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, 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 library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete 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 distribute a copy of this License along with the +Library. + + 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 Library or any portion +of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +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 Library, 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 Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you 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. + + If distribution of 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 satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. 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. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library 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. + + 9. 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 Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +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. + + 11. 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 Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library 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 Library. + +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. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library 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. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library 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 Library +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 Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +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 + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. 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 LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/src/_nfdos/e2fsprogs/README b/src/_nfdos/e2fsprogs/README new file mode 100644 index 0000000..0970deb --- /dev/null +++ b/src/_nfdos/e2fsprogs/README @@ -0,0 +1,19 @@ + This is the new version (1.47.0) of the second extended file +system management programs. + + From time to time, I release new versions of e2fsprogs, to fix +bugs and to make the utilities more robust. You can always find +information about the latest version at the the e2fsprogs web page, +which is: + + http://e2fsprogs.sourceforge.net + + The INSTALL file has instructions on building and installing +e2fsprogs. Provisions for building Red Hat RPMs and Debian dpkg files +are supplied as well. + + In case of bugs in these programs, please contact Ted Ts'o at +tytso@mit.edu or tytso@alum.mit.edu. See the e2fsck man page for +suggestions of what sort of information to include when submitting bug +reports for these programs. + diff --git a/src/_nfdos/e2fsprogs/RELEASE-NOTES b/src/_nfdos/e2fsprogs/RELEASE-NOTES new file mode 120000 index 0000000..5fc5f47 --- /dev/null +++ b/src/_nfdos/e2fsprogs/RELEASE-NOTES @@ -0,0 +1 @@ +doc/RelNotes/v1.47.0.txt \ No newline at end of file diff --git a/src/_nfdos/e2fsprogs/SHLIBS b/src/_nfdos/e2fsprogs/SHLIBS new file mode 100644 index 0000000..2fcbbc3 --- /dev/null +++ b/src/_nfdos/e2fsprogs/SHLIBS @@ -0,0 +1,35 @@ +Library:libcom_err.o +Description: Common error code library +Maintainer: Theodore Ts'o +Email: tytso@mit.edu +Start: 0x66800000 +End: 0x6687ffff + +Library:libss.o +Description: Generic Subsystem library (Simple tty UI) +Maintainer: Theodore Ts'o +Email: tytso@mit.edu +Start: 0x66880000 +End: 0x668fffff + +Library:libext2fs.so +Description: The ext2fs (raw interface) library +Maintainer: Theodore Ts'o +Email: tytso@mit.edu +Start: 0x66900000 +End: 0x6697ffff + +Library:libe2p.so +Description: The e2p (ext2fs's programmers) library +Maintainer: Theodore Ts'o +Email: tytso@mit.edu +Start: 0x66980000 +End: 0x669fffff + +Library:libuuid.so +Description: DCE Universally Unique ID (UUID) library +Maintainer: Theodore Ts'o +Email: tytso@mit.edu +Start: 0x67900000 +End: 0x679fffff + diff --git a/src/_nfdos/e2fsprogs/SUBMITTING-PATCHES b/src/_nfdos/e2fsprogs/SUBMITTING-PATCHES new file mode 100644 index 0000000..189deb3 --- /dev/null +++ b/src/_nfdos/e2fsprogs/SUBMITTING-PATCHES @@ -0,0 +1,39 @@ + +Like the Linux kernel, submitted e2fsprogs patches now require the +following "sign-off" procedure: + +The sign-off is a simple line at the end of the explanation for the +patch, which certifies that you wrote it or otherwise have the right to +pass it on as a open-source patch. The rules are pretty simple: if you +can certify the below: + + Developer's Certificate of Origin 1.1 + + By making a contribution to this project, I certify that: + + (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + + (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + + (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + + (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +then you just add a line saying + + Signed-off-by: Random J Developer + diff --git a/src/_nfdos/e2fsprogs/acinclude.m4 b/src/_nfdos/e2fsprogs/acinclude.m4 new file mode 100644 index 0000000..13b1e02 --- /dev/null +++ b/src/_nfdos/e2fsprogs/acinclude.m4 @@ -0,0 +1,178 @@ +# from http://autoconf-archive.cryp.to/ax_tls.html +# +# This was licensed under the GPL with the following exception: +# +# As a special exception, the respective Autoconf Macro's copyright +# owner gives unlimited permission to copy, distribute and modify the +# configure scripts that are the output of Autoconf when processing +# the Macro. You need not follow the terms of the GNU General Public +# License when using or distributing such scripts, even though +# portions of the text of the Macro appear in them. The GNU General +# Public License (GPL) does govern all other use of the material that +# constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the +# Autoconf Macro released by the Autoconf Macro Archive. When you make +# and distribute a modified version of the Autoconf Macro, you may +# extend this special exception to the GPL to apply to your modified +# version as well. +# +AC_DEFUN([AX_TLS], [ + AC_MSG_CHECKING(for thread local storage (TLS) class) + AC_CACHE_VAL(ac_cv_tls, [ + ax_tls_keywords="__thread __declspec(thread) none" + for ax_tls_keyword in $ax_tls_keywords; do + case $ax_tls_keyword in + none) ac_cv_tls=none ; break ;; + *) + AC_TRY_COMPILE( + [#include + static void + foo(void) { + static ] $ax_tls_keyword [ int bar; + exit(1); + }], + [], + [ac_cv_tls=$ax_tls_keyword ; break], + ac_cv_tls=none + ) + esac + done +]) + + if test "$ac_cv_tls" != "none"; then + dnl AC_DEFINE([TLS], [], [If the compiler supports a TLS storage class define it to that here]) + AC_DEFINE_UNQUOTED([TLS], $ac_cv_tls, [If the compiler supports a TLS storage class define it to that here]) + fi + AC_MSG_RESULT($ac_cv_tls) +]) + +# =========================================================================== +# http://www.nongnu.org/autoconf-archive/check_gnu_make.html +# =========================================================================== +# +# SYNOPSIS +# +# CHECK_GNU_MAKE() +# +# DESCRIPTION +# +# This macro searches for a GNU version of make. If a match is found, the +# makefile variable `ifGNUmake' is set to the empty string, otherwise it +# is set to "#". This is useful for including a special features in a +# Makefile, which cannot be handled by other versions of make. The +# variable _cv_gnu_make_command is set to the command to invoke GNU make +# if it exists, the empty string otherwise. +# +# Here is an example of its use: +# +# Makefile.in might contain: +# +# # A failsafe way of putting a dependency rule into a makefile +# $(DEPEND): +# $(CC) -MM $(srcdir)/*.c > $(DEPEND) +# +# @ifGNUmake@ ifeq ($(DEPEND),$(wildcard $(DEPEND))) +# @ifGNUmake@ include $(DEPEND) +# @ifGNUmake@ endif +# +# Then configure.in would normally contain: +# +# CHECK_GNU_MAKE() +# AC_OUTPUT(Makefile) +# +# Then perhaps to cause gnu make to override any other make, we could do +# something like this (note that GNU make always looks for GNUmakefile +# first): +# +# if ! test x$_cv_gnu_make_command = x ; then +# mv Makefile GNUmakefile +# echo .DEFAULT: > Makefile ; +# echo \ $_cv_gnu_make_command \$@ >> Makefile; +# fi +# +# Then, if any (well almost any) other make is called, and GNU make also +# exists, then the other make wraps the GNU make. +# +# LICENSE +# +# Copyright (c) 2008 John Darrington +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. +# +# Note: Modified by Ted Ts'o to add @ifNotGNUMake@ + +AC_DEFUN( + [CHECK_GNU_MAKE], [ AC_CACHE_CHECK( for GNU make,_cv_gnu_make_command, + _cv_gnu_make_command='' ; +dnl Search all the common names for GNU make + if test -n "$FORCE_NATIVE_MAKE" ; then + MAKES="make" + else + MAKES="make gmake gnumake" + fi + for a in "$MAKE" $MAKES ; do + if test -z "$a" ; then continue ; fi ; + if ( sh -c "$a --version" 2> /dev/null | grep GNU 2>&1 > /dev/null ) ; then + _cv_gnu_make_command=$a ; + break; + fi + done ; + ) ; +dnl If there was a GNU version, then set @ifGNUmake@ to the empty string, '#' otherwise + if test "x$_cv_gnu_make_command" != "x" ; then + ifGNUmake='' ; + ifNotGNUmake='#' ; + else + ifGNUmake='#' ; + ifNotGNUmake='' ; + AC_MSG_RESULT("Not found"); + fi + AC_SUBST(ifGNUmake) + AC_SUBST(ifNotGNUmake) +] ) + +# AX_CHECK_MOUNT_OPT: an autoconf macro to check for generic filesystem- +# agnostic 'mount' options. Written by Nicholas Clark. Looks for constants in +# sys/mount.h to predict whether the 'mount' utility will support a specific +# mounting option. +# +# This macro can be used to check for the presence of 'nodev' (or other mount +# options), which isn't uniformly implemented in the BSD family at the time of +# this writing. Tested on FreeBSD, NetBSD, OpenBSD, and Linux. +# +# Usage: +# +# AX_CHECK_MOUNT_OPT(option) +# +# Defines HAVE_MOUNT_$OPTION (in uppercase) if the option exists, and sets +# ac_cv_mount_$option (in original case) otherwise. +# +# Copyright (c) 2018 Nicholas Clark +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty or attribution requirement. + +AC_DEFUN([AX_CHECK_MOUNT_OPT], [__AX_CHECK_MOUNT_OPT(m4_tolower([$1]),m4_toupper([$1]))]) +AC_DEFUN([__AX_CHECK_MOUNT_OPT], +[ + AS_ECHO_N("checking for mount '$1' option... ") + AC_TRY_COMPILE( + [#include ], + [void *temp = (void *)(MS_$2); (void) temp;], + [AC_DEFINE(HAVE_MOUNT_$2, 1, [Define to 1 if mount supports $1.]) + AS_VAR_SET(ac_cv_mount_$1, yes) + AS_ECHO("yes")], + [AC_TRY_COMPILE( + [#include ], + [void *temp = (void *)(MNT_$2); (void) temp;], + [AC_DEFINE(HAVE_MOUNT_$2, 1, [Define to 1 if mount supports $1.]) + AS_VAR_SET(ac_cv_mount_$1, yes) + AS_ECHO("yes")], + [AS_VAR_SET(ac_cv_mount_$1, no) + AS_ECHO("no")] + )] + ) +]) diff --git a/src/_nfdos/e2fsprogs/config/config.guess b/src/_nfdos/e2fsprogs/config/config.guess new file mode 100755 index 0000000..69188da --- /dev/null +++ b/src/_nfdos/e2fsprogs/config/config.guess @@ -0,0 +1,1774 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2023 Free Software Foundation, Inc. + +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2023-01-01' + +# 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# 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 Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess +# +# Please send patches to . + + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -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 1992-2023 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 ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # 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 + +# Just in case it came from the environment. +GUESS= + +# 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. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039,SC3028 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD=$driver + 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 ; 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_SYSTEM in +Linux|GNU|GNU/*) + LIBC=unknown + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #elif defined(__GLIBC__) + LIBC=gnu + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif + #endif + EOF + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" + + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu + fi + ;; +esac + +# 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 tuples: *-*-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". + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + echo unknown)` + case $UNAME_MACHINE_ARCH in + aarch64eb) machine=aarch64_be-unknown ;; + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-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) and ABI. + case $UNAME_MACHINE_ARCH in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + 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 + # Determine ABI tags. + case $UNAME_MACHINE_ARCH in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + 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/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + GUESS=$machine-${os}${release}${abi-} + ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; + *:MidnightBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; + *:ekkoBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; + *:SolidBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; + *:OS108:*:*) + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; + macppc:MirBSD:*:*) + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; + *:MirBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; + *:Sortix:*:*) + GUESS=$UNAME_MACHINE-unknown-sortix + ;; + *:Twizzler:*:*) + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; + *:Redox:*:*) + GUESS=$UNAME_MACHINE-unknown-redox + ;; + mips:OSF1:*.*) + GUESS=mips-dec-osf1 + ;; + alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 + 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. + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; + Amiga*:UNIX_System_V:4.0:*) + GUESS=m68k-unknown-sysv4 + ;; + *:[Aa]miga[Oo][Ss]:*:*) + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; + *:[Mm]orph[Oo][Ss]:*:*) + GUESS=$UNAME_MACHINE-unknown-morphos + ;; + *:OS/390:*:*) + GUESS=i370-ibm-openedition + ;; + *:z/VM:*:*) + GUESS=s390-ibm-zvmoe + ;; + *:OS400:*:*) + GUESS=powerpc-ibm-os400 + ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + GUESS=arm-unknown-riscos + ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + GUESS=hppa1.1-hitachi-hiuxmpp + ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; + NILE*:*:*:dcosx) + GUESS=pyramid-pyramid-svr4 + ;; + DRS?6000:unix:4.0:6*) + GUESS=sparc-icl-nx6 + ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; + s390x:SunOS:*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; + sun4H:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; + 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. + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; + 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'. + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; + sun3*:SunOS:*:*) + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; + 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) + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; + sun4) + GUESS=sparc-sun-sunos$UNAME_RELEASE + ;; + esac + ;; + aushp:SunOS:*:*) + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; + # 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:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; + m68k:machten:*:*) + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; + powerpc:machten:*:*) + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; + RISC*:Mach:*:*) + GUESS=mips-dec-mach_bsd4.3 + ;; + RISC*:ULTRIX:*:*) + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; + VAX*:ULTRIX*:*:*) + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + 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" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; + Motorola:PowerMAX_OS:*:*) + GUESS=powerpc-motorola-powermax + ;; + Motorola:*:4.3:PL8-*) + GUESS=powerpc-harris-powermax + ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + GUESS=powerpc-harris-powermax + ;; + Night_Hawk:Power_UNIX:*:*) + GUESS=powerpc-harris-powerunix + ;; + m88k:CX/UX:7*:*) + GUESS=m88k-harris-cxux7 + ;; + m88k:*:4*:R4*) + GUESS=m88k-motorola-sysv4 + ;; + m88k:*:3*:R3*) + GUESS=m88k-motorola-sysv3 + ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 + then + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x + then + GUESS=m88k-dg-dgux$UNAME_RELEASE + else + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE + fi + else + GUESS=i586-dg-dgux$UNAME_RELEASE + fi + ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + GUESS=m88k-dolphin-sysv3 + ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + GUESS=m88k-motorola-sysv3 + ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + GUESS=m88k-tektronix-sysv3 + ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + GUESS=m68k-tektronix-bsd + ;; + *:IRIX*:*:*) + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + GUESS=i386-ibm-aix + ;; + ia64:AIX:*:*) + if test -x /usr/bin/oslevel ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + 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 + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + GUESS=$SYSTEM_NAME + else + GUESS=rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + GUESS=rs6000-ibm-aix3.2.4 + else + GUESS=rs6000-ibm-aix3.2 + fi + ;; + *:AIX:*:[4567]) + 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 test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; + *:AIX:*:*) + GUESS=rs6000-ibm-aix + ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + GUESS=romp-ibm-bsd4.4 + ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + GUESS=rs6000-bull-bosx + ;; + DPX/2?00:B.O.S.:*:*) + GUESS=m68k-bull-sysv3 + ;; + 9000/[34]??:4.3bsd:1.*:*) + GUESS=m68k-hp-bsd + ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + GUESS=m68k-hp-bsd4.4 + ;; + 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 test -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 test "$HP_ARCH" = ""; then + 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 test "$HP_ARCH" = hppa2.0w + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; + 3050*:HI-UX:*:*) + 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" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + GUESS=unknown-hitachi-hiuxwe2 + ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + GUESS=hppa1.1-hp-bsd + ;; + 9000/8??:4.3bsd:*:*) + GUESS=hppa1.0-hp-bsd + ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + GUESS=hppa1.0-hp-mpeix + ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + GUESS=hppa1.1-hp-osf + ;; + hp8??:OSF1:*:*) + GUESS=hppa1.0-hp-osf + ;; + i*86:OSF1:*:*) + if test -x /usr/sbin/sysversion ; then + GUESS=$UNAME_MACHINE-unknown-osf1mk + else + GUESS=$UNAME_MACHINE-unknown-osf1 + fi + ;; + parisc*:Lites*:*:*) + GUESS=hppa1.1-hp-lites + ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + GUESS=c1-convex-bsd + ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + GUESS=c34-convex-bsd + ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + GUESS=c38-convex-bsd + ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + GUESS=c4-convex-bsd + ;; + CRAY*Y-MP:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; + 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 ;; + CRAY*TS:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; + CRAY*T3E:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; + CRAY*SV1:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; + *:UNICOS/mp:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; + 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/ /_/'` + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; + 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/ /_/'` + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; + sparc*:BSD/OS:*:*) + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; + *:BSD/OS:*:*) + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi + else + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf + fi + ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case $UNAME_PROCESSOR in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; + i*:CYGWIN*:*) + GUESS=$UNAME_MACHINE-pc-cygwin + ;; + *:MINGW64*:*) + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; + *:MINGW*:*) + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; + *:MSYS*:*) + GUESS=$UNAME_MACHINE-pc-msys + ;; + i*:PW*:*) + GUESS=$UNAME_MACHINE-pc-pw32 + ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; + *:Interix*:*) + case $UNAME_MACHINE in + x86) + GUESS=i586-pc-interix$UNAME_RELEASE + ;; + authenticamd | genuineintel | EM64T) + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; + IA64) + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; + esac ;; + i*:UWIN*:*) + GUESS=$UNAME_MACHINE-pc-uwin + ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + GUESS=x86_64-pc-cygwin + ;; + prep*:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; + *:GNU:*:*) + # the GNU system + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; + x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-pc-managarm-mlibc" + ;; + *:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" + ;; + *:Minix:*:*) + GUESS=$UNAME_MACHINE-unknown-minix + ;; + aarch64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` 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 -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi + else + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf + fi + fi + ;; + avr32*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + cris:Linux:*:*) + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + crisv32:Linux:*:*) + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + e2k:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + frv:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + hexagon:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + i*86:Linux:*:*) + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; + ia64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + k1om:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + m32r*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + m68*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + openrisc*:Linux:*:*) + GUESS=or1k-unknown-linux-$LIBC + ;; + or32:Linux:*:* | or1k*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + padre:Linux:*:*) + GUESS=sparc-unknown-linux-$LIBC + ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + GUESS=hppa64-unknown-linux-$LIBC + ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; + esac + ;; + ppc64:Linux:*:*) + GUESS=powerpc64-unknown-linux-$LIBC + ;; + ppc:Linux:*:*) + GUESS=powerpc-unknown-linux-$LIBC + ;; + ppc64le:Linux:*:*) + GUESS=powerpc64le-unknown-linux-$LIBC + ;; + ppcle:Linux:*:*) + GUESS=powerpcle-unknown-linux-$LIBC + ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + s390:Linux:*:* | s390x:Linux:*:*) + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; + sh64*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + sh*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + tile*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + vax:Linux:*:*) + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; + x86_64:Linux:*:*) + set_cc_for_build + CPU=$UNAME_MACHINE + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __i386__ + ABI=x86 + #else + #ifdef __ILP32__ + ABI=x32 + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + x86) CPU=i686 ;; + x32) LIBCABI=${LIBC}x32 ;; + esac + fi + GUESS=$CPU-pc-linux-$LIBCABI + ;; + xtensa*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + 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. + GUESS=i386-sequent-sysv4 + ;; + 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. + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; + i*86:XTS-300:*:STOP) + GUESS=$UNAME_MACHINE-unknown-stop + ;; + i*86:atheos:*:*) + GUESS=$UNAME_MACHINE-unknown-atheos + ;; + i*86:syllable:*:*) + GUESS=$UNAME_MACHINE-pc-syllable + ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; + i*86:*DOS:*:*) + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL + else + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL + fi + ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; + 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 + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL + else + GUESS=$UNAME_MACHINE-pc-sysv32 + fi + ;; + 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 i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + GUESS=i586-pc-msdosdjgpp + ;; + Intel:Mach:3*:*) + GUESS=i386-pc-mach3 + ;; + paragon:*:*:*) + GUESS=i860-intel-osf1 + ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 + fi + ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + GUESS=m68010-convergent-sysv + ;; + mc68k:UNIX:SYSTEM5:3.51m) + GUESS=m68k-convergent-sysv + ;; + M680?0:D-NIX:5.3:*) + GUESS=m68k-diab-dnix + ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 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; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + 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; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; + mc68030:UNIX_System_V:4.*:*) + GUESS=m68k-atari-sysv4 + ;; + TSUNAMI:LynxOS:2.*:*) + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; + rs6000:LynxOS:2.*:*) + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; + SM[BE]S:UNIX_SV:*:*) + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; + RM*:ReliantUNIX-*:*:*) + GUESS=mips-sni-sysv4 + ;; + RM*:SINIX-*:*:*) + GUESS=mips-sni-sysv4 + ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + GUESS=$UNAME_MACHINE-sni-sysv4 + else + GUESS=ns32k-sni-sysv + fi + ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + GUESS=i586-unisys-sysv4 + ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + GUESS=hppa1.1-stratus-sysv4 + ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + GUESS=i860-stratus-sysv4 + ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + GUESS=$UNAME_MACHINE-stratus-vos + ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + GUESS=hppa1.1-stratus-vos + ;; + mc68*:A/UX:*:*) + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; + news*:NEWS-OS:6*:*) + GUESS=mips-sony-newsos6 + ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if test -d /usr/nec; then + GUESS=mips-nec-sysv$UNAME_RELEASE + else + GUESS=mips-unknown-sysv$UNAME_RELEASE + fi + ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + GUESS=powerpc-be-beos + ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + GUESS=powerpc-apple-beos + ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + GUESS=i586-pc-beos + ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + GUESS=i586-pc-haiku + ;; + ppc:Haiku:*:*) # Haiku running on Apple PowerPC + GUESS=powerpc-apple-haiku + ;; + *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) + GUESS=$UNAME_MACHINE-unknown-haiku + ;; + SX-4:SUPER-UX:*:*) + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; + SX-5:SUPER-UX:*:*) + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; + SX-6:SUPER-UX:*:*) + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; + SX-7:SUPER-UX:*:*) + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; + SX-8:SUPER-UX:*:*) + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; + SX-8R:SUPER-UX:*:*) + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; + SX-ACE:SUPER-UX:*:*) + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; + Power*:Rhapsody:*:*) + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; + *:Rhapsody:*:*) + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; + arm64:Darwin:*:*) + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; + *:QNX:*:4*) + GUESS=i386-pc-qnx + ;; + NEO-*:NONSTOP_KERNEL:*:*) + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; + NSE-*:NONSTOP_KERNEL:*:*) + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; + NSR-*:NONSTOP_KERNEL:*:*) + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; + NSV-*:NONSTOP_KERNEL:*:*) + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; + NSX-*:NONSTOP_KERNEL:*:*) + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; + *:NonStop-UX:*:*) + GUESS=mips-compaq-nonstopux + ;; + BS2000:POSIX*:*:*) + GUESS=bs2000-siemens-sysv + ;; + DS/*:UNIX_System_V:*:*) + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; + *: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 + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype + fi + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; + *:TOPS-10:*:*) + GUESS=pdp10-unknown-tops10 + ;; + *:TENEX:*:*) + GUESS=pdp10-unknown-tenex + ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + GUESS=pdp10-dec-tops20 + ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + GUESS=pdp10-xkl-tops20 + ;; + *:TOPS-20:*:*) + GUESS=pdp10-unknown-tops20 + ;; + *:ITS:*:*) + GUESS=pdp10-unknown-its + ;; + SEI:*:*:SEIUX) + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; + *:DragonFly:*:*) + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; + esac ;; + *:XENIX:*:SysV) + GUESS=i386-pc-xenix + ;; + i*86:skyos:*:*) + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; + i*86:rdos:*:*) + GUESS=$UNAME_MACHINE-pc-rdos + ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; + *:AROS:*:*) + GUESS=$UNAME_MACHINE-unknown-aros + ;; + x86_64:VMkernel:*:*) + GUESS=$UNAME_MACHINE-unknown-esx + ;; + amd64:Isilon\ OneFS:*:*) + GUESS=x86_64-unknown-onefs + ;; + *:Unleashed:*:*) + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; +esac + +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#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 (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 +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#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 && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + +echo "$0: unable to guess system type" >&2 + +case $UNAME_MACHINE:$UNAME_SYSTEM in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 <&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 +fi + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/src/_nfdos/e2fsprogs/config/config.rpath b/src/_nfdos/e2fsprogs/config/config.rpath new file mode 100755 index 0000000..98183ff --- /dev/null +++ b/src/_nfdos/e2fsprogs/config/config.rpath @@ -0,0 +1,684 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2016 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's _LT_CC_BASENAME. + +for cc_temp in $CC""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` + +# Code taken from libtool.m4's _LT_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + mingw* | cygwin* | pw32* | os2* | cegcc*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + ecc*) + wl='-Wl,' + ;; + icc* | ifort*) + wl='-Wl,' + ;; + lf95*) + wl='-Wl,' + ;; + nagfor*) + wl='-Wl,-Wl,,' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + wl='-Wl,' + ;; + ccc*) + wl='-Wl,' + ;; + xl* | bgxl* | bgf* | mpixl*) + wl='-Wl,' + ;; + como) + wl='-lopt=' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ F* | *Sun*Fortran*) + wl= + ;; + *Sun\ C*) + wl='-Wl,' + ;; + esac + ;; + esac + ;; + newsos6) + ;; + *nto* | *qnx*) + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + rdos*) + ;; + solaris*) + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + wl='-Qoption ld ' + ;; + *) + wl='-Wl,' + ;; + esac + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + wl='-Wl,' + ;; + unicos*) + wl='-Wl,' + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's _LT_LINKER_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + case "$host_os" in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + case "$host_cpu" in + powerpc) + ;; + m68k) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32* | cegcc*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + haiku*) + ;; + interix[3-9]*) + hardcode_direct=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = no; then + hardcode_libdir_flag_spec= + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + case "$host_cpu" in + powerpc) + ;; + m68k) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + bsdi[45]*) + ;; + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + hardcode_direct=no + if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then + : + else + ld_shlibs=no + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd2.[01]*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd* | dragonfly*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + hpux11*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + ;; + *) + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + *nto* | *qnx*) + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + ;; + sysv5* | sco3.2v5* | sco5v6*) + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER. +# Unlike libtool.m4, here we don't care about _all_ names of the library, but +# only about the one the linker finds when passed -lNAME. This is the last +# element of library_names_spec in libtool.m4, or possibly two of them if the +# linker has special search rules. +library_names_spec= # the last element of library_names_spec in libtool.m4 +libname_spec='lib$name' +case "$host_os" in + aix3*) + library_names_spec='$libname.a' + ;; + aix[4-9]*) + library_names_spec='$libname$shrext' + ;; + amigaos*) + case "$host_cpu" in + powerpc*) + library_names_spec='$libname$shrext' ;; + m68k) + library_names_spec='$libname.a' ;; + esac + ;; + beos*) + library_names_spec='$libname$shrext' + ;; + bsdi[45]*) + library_names_spec='$libname$shrext' + ;; + cygwin* | mingw* | pw32* | cegcc*) + shrext=.dll + library_names_spec='$libname.dll.a $libname.lib' + ;; + darwin* | rhapsody*) + shrext=.dylib + library_names_spec='$libname$shrext' + ;; + dgux*) + library_names_spec='$libname$shrext' + ;; + freebsd[23].*) + library_names_spec='$libname$shrext$versuffix' + ;; + freebsd* | dragonfly*) + library_names_spec='$libname$shrext' + ;; + gnu*) + library_names_spec='$libname$shrext' + ;; + haiku*) + library_names_spec='$libname$shrext' + ;; + hpux9* | hpux10* | hpux11*) + case $host_cpu in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + library_names_spec='$libname$shrext' + ;; + interix[3-9]*) + library_names_spec='$libname$shrext' + ;; + irix5* | irix6* | nonstopux*) + library_names_spec='$libname$shrext' + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + library_names_spec='$libname$shrext' + ;; + knetbsd*-gnu) + library_names_spec='$libname$shrext' + ;; + netbsd*) + library_names_spec='$libname$shrext' + ;; + newsos6) + library_names_spec='$libname$shrext' + ;; + *nto* | *qnx*) + library_names_spec='$libname$shrext' + ;; + openbsd*) + library_names_spec='$libname$shrext$versuffix' + ;; + os2*) + libname_spec='$name' + shrext=.dll + library_names_spec='$libname.a' + ;; + osf3* | osf4* | osf5*) + library_names_spec='$libname$shrext' + ;; + rdos*) + ;; + solaris*) + library_names_spec='$libname$shrext' + ;; + sunos4*) + library_names_spec='$libname$shrext$versuffix' + ;; + sysv4 | sysv4.3*) + library_names_spec='$libname$shrext' + ;; + sysv4*MP*) + library_names_spec='$libname$shrext' + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + library_names_spec='$libname$shrext' + ;; + tpf*) + library_names_spec='$libname$shrext' + ;; + uts4*) + library_names_spec='$libname$shrext' + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. +# +# 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 Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# 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. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub + +# 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. + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -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 1992-2023 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 ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + 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 + +# Split fields of configuration type +# shellcheck disable=SC2162 +saved_IFS=$IFS +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova* | managarm-*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + zephyr*) + basic_machine=$field1-unknown + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | 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 \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # 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) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if test x$basic_os != x +then + +# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` + ;; + os2-emx) + kernel=os2 + os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` + ;; + nto-qnx*) + kernel=nto + os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read kernel os <&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ + | linux-musl* | linux-relibc* | linux-uclibc* | linux-mlibc* ) + ;; + uclinux-uclibc* ) + ;; + managarm-mlibc* | managarm-kernel* ) + ;; + -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* | -mlibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + -kernel* ) + echo "Invalid configuration \`$1': \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + *-kernel* ) + echo "Invalid configuration \`$1': \`$kernel' does not support \`$os'." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + vxworks-simlinux | vxworks-simwindows | vxworks-spe) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) + vendor=acorn + ;; + *-sunos*) + vendor=sun + ;; + *-cnk* | *-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 + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + 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 + ;; +esac + +echo "$cpu-$vendor-${kernel:+$kernel-}$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/src/_nfdos/e2fsprogs/config/ltmain.sh b/src/_nfdos/e2fsprogs/config/ltmain.sh new file mode 100644 index 0000000..c12c197 --- /dev/null +++ b/src/_nfdos/e2fsprogs/config/ltmain.sh @@ -0,0 +1,11249 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 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. + +# GNU Libtool 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. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.6 Debian-2.4.6-9" +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 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. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2015-10-07.11; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 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. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + _G_rc_run_hooks=false + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + if eval $_G_hook '"$@"'; then + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + _G_rc_run_hooks=: + fi + done + + $_G_rc_run_hooks && func_run_hooks_result=$_G_hook_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, you may remove/edit +# any options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. In this case you also must return $EXIT_SUCCESS to let the +# hook's caller know that it should pay attention to +# '_result'. Returning $EXIT_FAILURE signalizes that +# arguments are left untouched by the hook and therefore caller will ignore the +# result variable. +# +# Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# # No change in '$@' (ignored completely by this hook). There is +# # no need to do the equivalent (but slower) action: +# # func_quote_for_eval ${1+"$@"} +# # my_options_prep_result=$func_quote_for_eval_result +# false +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# args_changed=false +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: +# args_changed=: +# ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# args_changed=: +# ;; +# *) # Make sure the first unrecognised option "$_G_opt" +# # is added back to "$@", we could need that later +# # if $args_changed is true. +# set dummy "$_G_opt" ${1+"$@"}; shift; break ;; +# esac +# done +# +# if $args_changed; then +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# fi +# +# $args_changed +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# false +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll also need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options_finish [ARG]... +# ---------------------------- +# Finishing the option parse loop (call 'func_options' hooks ATM). +func_options_finish () +{ + $debug_cmd + + _G_func_options_finish_exit=false + if func_run_hooks func_options ${1+"$@"}; then + func_options_finish_result=$func_run_hooks_result + _G_func_options_finish_exit=: + fi + + $_G_func_options_finish_exit +} + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + _G_rc_options=false + + for my_func in options_prep parse_options validate_options options_finish + do + if eval func_$my_func '${1+"$@"}'; then + eval _G_res_var='$'"func_${my_func}_result" + eval set dummy "$_G_res_var" ; shift + _G_rc_options=: + fi + done + + # Save modified positional parameters for caller. As a top-level + # options-parser function we always need to set the 'func_options_result' + # variable (regardless the $_G_rc_options value). + if $_G_rc_options; then + func_options_result=$_G_res_var + else + func_quote_for_eval ${1+"$@"} + func_options_result=$func_quote_for_eval_result + fi + + $_G_rc_options +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propagate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning $EXIT_SUCCESS (otherwise $EXIT_FAILURE is returned). +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + _G_rc_options_prep=false + if func_run_hooks func_options_prep ${1+"$@"}; then + _G_rc_options_prep=: + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result + fi + + $_G_rc_options_prep +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + _G_rc_parse_options=false + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + if func_run_hooks func_parse_options ${1+"$@"}; then + eval set dummy "$func_run_hooks_result"; shift + _G_rc_parse_options=: + fi + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_match_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + if test $# = 0 && func_missing_arg $_G_opt; then + _G_rc_parse_options=: + break + fi + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) _G_rc_parse_options=: ; break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift + _G_match_parse_options=false + break + ;; + esac + + $_G_match_parse_options && _G_rc_parse_options=: + done + + + if $_G_rc_parse_options; then + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result + fi + + $_G_rc_parse_options +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + _G_rc_validate_options=false + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + if func_run_hooks func_validate_options ${1+"$@"}; then + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result + _G_rc_validate_options=: + fi + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + $_G_rc_validate_options +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname $scriptversion Debian-2.4.6-9 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + _G_rc_lt_options_prep=: + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + *) + _G_rc_lt_options_prep=false + ;; + esac + + if $_G_rc_lt_options_prep; then + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result + fi + + $_G_rc_lt_options_prep +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + _G_rc_lt_parse_options=false + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_match_lt_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"} ; shift + _G_match_lt_parse_options=false + break + ;; + esac + $_G_match_lt_parse_options && _G_rc_lt_parse_options=: + done + + if $_G_rc_lt_parse_options; then + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result + fi + + $_G_rc_lt_parse_options +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# 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+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# 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 + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files + # -stdlib=* select c++ std lib with clang + # -fsanitize=* Clang/GCC memory and address sanitizer + # -fuse-ld=* Linker select flags for GCC + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ + -specs=*|-fsanitize=*|-fuse-ld=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type '$version_type'" + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/src/_nfdos/e2fsprogs/config/mkinstalldirs b/src/_nfdos/e2fsprogs/config/mkinstalldirs new file mode 100755 index 0000000..4f58503 --- /dev/null +++ b/src/_nfdos/e2fsprogs/config/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.13 1999/01/05 03:18:55 bje 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 diff --git a/src/_nfdos/e2fsprogs/config/parse-types.sh b/src/_nfdos/e2fsprogs/config/parse-types.sh new file mode 100755 index 0000000..24d2a99 --- /dev/null +++ b/src/_nfdos/e2fsprogs/config/parse-types.sh @@ -0,0 +1,127 @@ +#!/bin/sh + +cat > sed.script << "EOF" +/^#/d +/^$/d +s/__extension__ // +s/typedef \(.*\) __u\([1-9]*\);/#define __U\2_TYPEDEF \1/ +s/typedef \(.*\) __s\([1-9]*\);/#define __S\2_TYPEDEF \1/ +EOF + +if test -z "$CC"; then + CC=gcc +fi + +if test -z "$CPP"; then + CPP="$CC -E" +fi + +/bin/echo -n "checking for __uNN types... " +# can't check [ -f /usr/include/asm/types.h ] directly, since +# the include path might be different if cross-compiling +if echo '#include ' | $CPP - 2> parse-types.log | \ + sed -f sed.script | grep '^#' > asm_types.h; then + echo "using " +else + echo "using generic types" +fi + +rm sed.script + +cp asm_types.h asm_types.c + +cat >> asm_types.c < +#include +int main(int argc, char **argv) +{ +#ifdef __U8_TYPEDEF + if (sizeof(__U8_TYPEDEF) != 1) { + printf("Sizeof(__U8__TYPEDEF) is %d should be 1\n", + (int) sizeof(__U8_TYPEDEF)); + exit(1); + } +#elif defined(__linux__) +#warning __U8_TYPEDEF not defined +#endif +#ifdef __S8_TYPEDEF + if (sizeof(__S8_TYPEDEF) != 1) { + printf("Sizeof(_S8__TYPEDEF) is %d should be 1\n", + (int) sizeof(__S8_TYPEDEF)); + exit(1); + } +#elif defined(__linux__) +#warning __S8_TYPEDEF not defined +#endif +#ifdef __U16_TYPEDEF + if (sizeof(__U16_TYPEDEF) != 2) { + printf("Sizeof(__U16__TYPEDEF) is %d should be 2\n", + (int) sizeof(__U16_TYPEDEF)); + exit(1); + } +#elif defined(__linux__) +#warning __U16_TYPEDEF not defined +#endif +#ifdef __S16_TYPEDEF + if (sizeof(__S16_TYPEDEF) != 2) { + printf("Sizeof(__S16__TYPEDEF) is %d should be 2\n", + (int) sizeof(__S16_TYPEDEF)); + exit(1); + } +#elif defined(__linux__) +#warning __S16_TYPEDEF not defined +#endif + +#ifdef __U32_TYPEDEF + if (sizeof(__U32_TYPEDEF) != 4) { + printf("Sizeof(__U32__TYPEDEF) is %d should be 4\n", + (int) sizeof(__U32_TYPEDEF)); + exit(1); + } +#elif defined(__linux__) +#warning __U32_TYPEDEF not defined +#endif +#ifdef __S32_TYPEDEF + if (sizeof(__S32_TYPEDEF) != 4) { + printf("Sizeof(__S32__TYPEDEF) is %d should be 4\n", + (int) sizeof(__S32_TYPEDEF)); + exit(1); + } +#elif defined(__linux__) +#warning __S32_TYPEDEF not defined +#endif + +#ifdef __U64_TYPEDEF + if (sizeof(__U64_TYPEDEF) != 8) { + printf("Sizeof(__U64__TYPEDEF) is %d should be 8\n", + (int) sizeof(__U64_TYPEDEF)); + exit(1); + } +#elif defined(__linux__) +#warning __U64_TYPEDEF not defined +#endif +#ifdef __S64_TYPEDEF + if (sizeof(__S64_TYPEDEF) != 8) { + printf("Sizeof(__S64__TYPEDEF) is %d should be 8\n", + (int) sizeof(__S64_TYPEDEF)); + exit(1); + } +#elif defined(__linux__) +#warning __S64_TYPEDEF not defined +#endif + return 0; +} +EOF + +${BUILD_CC-${CC-gcc}} -o asm_types asm_types.c +if ./asm_types +then + true +else + if [ "${CROSS_COMPILE}" != "1" ]; then + echo "Problem detected with asm_types.h" + echo "" > asm_types.h + fi +fi +rm asm_types.c asm_types + diff --git a/src/_nfdos/e2fsprogs/configure.ac b/src/_nfdos/e2fsprogs/configure.ac new file mode 100644 index 0000000..017a96f --- /dev/null +++ b/src/_nfdos/e2fsprogs/configure.ac @@ -0,0 +1,1932 @@ +AC_INIT +AC_CONFIG_SRCDIR([version.h]) +AC_PREREQ([2.71]) +AC_CONFIG_AUX_DIR(config) +AC_CONFIG_HEADERS([lib/config.h]) +AH_BOTTOM([#include ]) +AC_USE_SYSTEM_EXTENSIONS +MCONFIG=./MCONFIG +AC_SUBST_FILE(MCONFIG) +BINARY_TYPE=bin +dnl +dnl This is to figure out the version number and the date.... +dnl +E2FSPROGS_VERSION=`grep E2FSPROGS_VERSION ${srcdir}/version.h \ + | awk '{print $3}' | tr \" " " | awk '{print $1}'` +E2FSPROGS_DATE=`grep E2FSPROGS_DATE ${srcdir}/version.h | awk '{print $3}' \ + | tr \" " " | awk '{print $1}'` +E2FSPROGS_DAY=$(echo $E2FSPROGS_DATE | awk -F- '{print $1}' | sed -e '/^[[1-9]]$/s/^/0/') +MONTH=`echo $E2FSPROGS_DATE | awk -F- '{print $2}'` +YEAR=`echo $E2FSPROGS_DATE | awk -F- '{print $3}'` + +if expr $YEAR ">" 1900 > /dev/null ; then + E2FSPROGS_YEAR=$YEAR +elif expr $YEAR ">" 90 >/dev/null ; then + E2FSPROGS_YEAR=19$YEAR +else + E2FSPROGS_YEAR=20$YEAR +fi + +case $MONTH in +Jan) MONTH_NUM=01; E2FSPROGS_MONTH="January" ;; +Feb) MONTH_NUM=02; E2FSPROGS_MONTH="February" ;; +Mar) MONTH_NUM=03; E2FSPROGS_MONTH="March" ;; +Apr) MONTH_NUM=04; E2FSPROGS_MONTH="April" ;; +May) MONTH_NUM=05; E2FSPROGS_MONTH="May" ;; +Jun) MONTH_NUM=06; E2FSPROGS_MONTH="June" ;; +Jul) MONTH_NUM=07; E2FSPROGS_MONTH="July" ;; +Aug) MONTH_NUM=08; E2FSPROGS_MONTH="August" ;; +Sep) MONTH_NUM=09; E2FSPROGS_MONTH="September" ;; +Oct) MONTH_NUM=10; E2FSPROGS_MONTH="October" ;; +Nov) MONTH_NUM=11; E2FSPROGS_MONTH="November" ;; +Dec) MONTH_NUM=12; E2FSPROGS_MONTH="December" ;; +*) AC_MSG_WARN([Unknown month $MONTH??]) ;; +esac + +base_ver=`echo $E2FSPROGS_VERSION | \ + sed -e 's/-WIP//' -e 's/pre-//' -e 's/-PLUS//'` + +date_spec=${E2FSPROGS_YEAR}.${MONTH_NUM}.${E2FSPROGS_DAY} + +case $E2FSPROGS_VERSION in +*-WIP|pre-*) + E2FSPROGS_PKGVER="$base_ver~WIP.$date_spec" + ;; +*) + E2FSPROGS_PKGVER="$base_ver" + ;; +esac + +unset DATE MONTH YEAR base_ver pre_vers date_spec +AC_MSG_RESULT([Generating configuration file for e2fsprogs version $E2FSPROGS_VERSION]) +AC_MSG_RESULT([Release date is ${E2FSPROGS_MONTH}, ${E2FSPROGS_YEAR}]) +AC_SUBST(E2FSPROGS_YEAR) +AC_SUBST(E2FSPROGS_MONTH) +AC_SUBST(E2FSPROGS_DAY) +AC_SUBST(E2FSPROGS_VERSION) +AC_SUBST(E2FSPROGS_PKGVER) +AC_SUBST(E2FSPROGS_DATE) +dnl +dnl Use diet libc +dnl +WITH_DIET_LIBC= +AC_ARG_WITH([diet-libc], +AS_HELP_STRING([--with-diet-libc],[use diet libc]), +CC="diet cc -nostdinc" +WITH_DIET_LIBC=yes +if test -z "$LIBS" +then + LIBS="-lcompat" +else + LIBS="$LIBS -lcompat" +fi +AC_MSG_RESULT(CC=$CC))dnl +dnl +AC_CANONICAL_HOST +dnl +dnl Check to see if libdl exists for the sake of dlopen +dnl +DLOPEN_LIB='' +AC_CHECK_LIB(dl, dlopen,DLOPEN_LIB=-ldl) +AC_SUBST(DLOPEN_LIB) +dnl +AC_ARG_WITH([cc], +AS_HELP_STRING([--with-cc],[no longer supported, use CC= instead]), +AC_MSG_ERROR([--with-cc no longer supported; use CC= instead])) +dnl +AC_ARG_WITH([ccopts], +AS_HELP_STRING([--with-ccopts],[no longer supported, use CFLAGS= instead]), +AC_MSG_ERROR([--with-ccopts no longer supported; use CFLAGS= instead])) +dnl +AC_ARG_WITH([ldopts], +AS_HELP_STRING([--with-ldopts],[no longer supported, use LDFLAGS= instead]), +AC_MSG_ERROR([--with-ldopts no longer supported; use LDFLAGS= instead])) +dnl +AC_PROG_CC +if test "$GCC" = yes; then + RDYNAMIC="-rdynamic" + AC_SUBST(RDYNAMIC) +fi +AC_PROG_CPP +dnl +dnl Alpha computers use fast and imprecise floating point code that may +dnl miss exceptions by default. Force sane options if we're using GCC. +AC_MSG_CHECKING(for additional special compiler flags) +if test "$GCC" = yes +then + case "$host_cpu" in + alpha) addcflags="-mieee" ;; + esac +fi +if test "x$addcflags" != x +then + AC_MSG_RESULT($addcflags) + CFLAGS="$addcflags $CFLAGS" +else + AC_MSG_RESULT([[(none)]]) +fi +dnl +dnl Set default values for library extensions. Will be dealt with after +dnl parsing configuration options, which may modify these +dnl +LIB_EXT=.a +STATIC_LIB_EXT=.a +PROFILED_LIB_EXT=.a +dnl +dnl Allow separate `root_prefix' to be specified +dnl +AC_ARG_WITH([root-prefix], +AS_HELP_STRING([--with-root-prefix=PREFIX],[override prefix variable for files to be placed in the root]), +root_prefix=$withval, +root_prefix=NONE)dnl +dnl +dnl handle --enable-maintainer-mode +dnl +AC_ARG_ENABLE([maintainer-mode], +AS_HELP_STRING([--enable-maintainer-mode],[enable makefile rules useful for maintainers]), +if test "$enableval" = "no" +then + MAINTAINER_CMT=# + AC_MSG_RESULT([Disabling maintainer mode]) +else + MAINTAINER_CMT= + AC_MSG_RESULT([Enabling maintainer mode]) +fi +, +MAINTAINER_CMT=# +AC_MSG_RESULT([Disabling maintainer mode by default]) +) +AC_SUBST(MAINTAINER_CMT) +dnl +dnl handle --enable-symlink-install +dnl +AC_ARG_ENABLE([symlink-install], +AS_HELP_STRING([--enable-symlink-install],[use symlinks when installing instead of hard links]), +if test "$enableval" = "no" +then + LINK_INSTALL_FLAGS=-f + AC_MSG_RESULT([Disabling symlinks for install]) +else + LINK_INSTALL_FLAGS=-sf + AC_MSG_RESULT([Enabling symlinks for install]) +fi +, +LINK_INSTALL_FLAGS=-f +AC_MSG_RESULT([Disabling symlinks for install by default]) +) +AC_SUBST(LINK_INSTALL_FLAGS) +dnl +dnl handle --enable-relative-symlinks +dnl +relative_symlink_defined= +AC_ARG_ENABLE([relative-symlinks], +AS_HELP_STRING([--enable-relative-symlinks],[use relative symlinks when installing]), +if test "$enableval" = "no" +then + SYMLINK_RELATIVE= + relative_symlink_defined=yes + AC_MSG_RESULT([Disabling relative symlinks for install]) +else + SYMLINK_RELATIVE=--relative + relative_symlink_defined=yes + AC_MSG_RESULT([Enabling relative symlinks for install]) +fi) +AC_ARG_ENABLE([symlink-relative-symlinks],, +if test "$enableval" = "no" +then + SYMLINK_RELATIVE=yes + AC_MSG_RESULT([Disabling relative symlinks for install]) +else + SYMLINK_RELATIVE=--relative + AC_MSG_RESULT([Enabling relative symlinks for install]) +fi +, +if test -z "$relative_symlink_defined" +then + SYMLINK_RELATIVE= +AC_MSG_RESULT([Disabling relative symlinks for install by default]) +fi +) +AC_SUBST(SYMLINK_RELATIVE) +dnl +dnl handle --enable-symlink-build +dnl +AC_ARG_ENABLE([symlink-build], +AS_HELP_STRING([--enable-symlink-build],[use symlinks while building instead of hard links]), +if test "$enableval" = "no" +then + LINK_BUILD_FLAGS= + AC_MSG_RESULT([Disabling symlinks for build]) +else + LINK_BUILD_FLAGS=-s + AC_MSG_RESULT([Enabling symlinks for build]) +fi +, +LINK_BUILD_FLAGS= +AC_MSG_RESULT([Disabling symlinks for build by default]) +) +AC_SUBST(LINK_BUILD_FLAGS) +dnl +dnl handle --enable-verbose-makecmds +dnl +AC_ARG_ENABLE([verbose-makecmds], +AS_HELP_STRING([--enable-verbose-makecmds],[enable verbose make command output]), +if test "$enableval" = "no" +then + AC_MSG_RESULT([Disabling verbose make commands]) + E=@echo + ES=echo + Q=@ +else + AC_MSG_RESULT([Enabling verbose make commands]) + E=@\\# + ES=\\# + Q= +fi +, +AC_MSG_RESULT([Disabling verbose make commands]) +E=@echo +ES=echo +Q=@ +) +AC_SUBST(E) +AC_SUBST(ES) +AC_SUBST(Q) +dnl +dnl This needs to be before all of the --enable-*-shlibs options +dnl +E2_PKG_CONFIG_STATIC=--static +LDFLAG_DYNAMIC= +PRIVATE_LIBS_CMT= +dnl +dnl handle --enable-elf-shlibs +dnl +AC_ARG_ENABLE([elf-shlibs], +AS_HELP_STRING([--enable-elf-shlibs],[select ELF shared libraries]), +if test "$enableval" = "no" +then + ELF_CMT=# + MAKEFILE_ELF=/dev/null + AC_MSG_RESULT([Disabling ELF shared libraries]) +else + E2_PKG_CONFIG_STATIC= + ELF_CMT= + MAKEFILE_ELF=$srcdir/lib/Makefile.elf-lib + [case "$host_os" in + solaris2.*) + MAKEFILE_ELF=$srcdir/lib/Makefile.solaris-lib + ;; + esac] + BINARY_TYPE=elfbin + LIB_EXT=.so + PRIVATE_LIBS_CMT=# + LDFLAG_DYNAMIC=['-Wl,-rpath-link,$(top_builddir)/lib'] + AC_MSG_RESULT([Enabling ELF shared libraries]) +fi +, +MAKEFILE_ELF=/dev/null +ELF_CMT=# +AC_MSG_RESULT([Disabling ELF shared libraries by default]) +) +AC_SUBST(ELF_CMT) +AC_SUBST_FILE(MAKEFILE_ELF) +dnl +dnl handle --enable-bsd-shlibs +dnl +AC_ARG_ENABLE([bsd-shlibs], +AS_HELP_STRING([--enable-bsd-shlibs],[select BSD shared libraries]), +if test "$enableval" = "no" +then + BSDLIB_CMT=# + MAKEFILE_BSDLIB=/dev/null + AC_MSG_RESULT([Disabling BSD shared libraries]) +else + E2_PKG_CONFIG_STATIC= + BSDLIB_CMT= + MAKEFILE_BSDLIB=$srcdir/lib/Makefile.bsd-lib + LIB_EXT=.so + [case "$host_os" in + darwin*) + MAKEFILE_BSDLIB=$srcdir/lib/Makefile.darwin-lib + LIB_EXT=.dylib + ;; + esac] + AC_MSG_RESULT([Enabling BSD shared libraries]) +fi +, +MAKEFILE_BSDLIB=/dev/null +BSDLIB_CMT=# +AC_MSG_RESULT([Disabling BSD shared libraries by default]) +) +AC_SUBST(BSDLIB_CMT) +AC_SUBST_FILE(MAKEFILE_BSDLIB) +dnl +dnl handle --enable-profile +dnl +AC_ARG_ENABLE([profile], +AS_HELP_STRING([--enable-profile],[build profiling libraries]), +if test "$enableval" = "no" +then + PROFILE_CMT=# + MAKEFILE_PROFILE=/dev/null + AC_MSG_RESULT([Disabling profiling libraries]) +else + PROFILE_CMT= + MAKEFILE_PROFILE=$srcdir/lib/Makefile.profile + PROFILED_LIB_EXT=_p.a + AC_MSG_RESULT([Building profiling libraries]) +fi +, +PROFILE_CMT=# +MAKEFILE_PROFILE=/dev/null +AC_MSG_RESULT([Disabling profiling libraries by default]) +) +AC_SUBST(PROFILE_CMT) +AC_SUBST_FILE(MAKEFILE_PROFILE) +dnl +dnl handle --enable-gcov +dnl +AC_ARG_ENABLE([gcov], +AS_HELP_STRING([--enable-gcov],[build for coverage testing using gcov]), +if test "$enableval" = "yes" +then + CFLAGS="-g -fprofile-arcs -ftest-coverage" + LDFLAGS="-fprofile-arcs -ftest-coverage" + AC_MSG_RESULT([Enabling gcov support]) +fi +) +dnl +dnl handle --enable-hardening +dnl +CFLAGS_SHLIB="${CFLAGS_SHLIB:-$CFLAGS}" +CFLAGS_STLIB="${CFLAGS_STLIB:-$CFLAGS}" +LDFLAGS_SHLIB=${LDFLAGS_SHLIB:-$LDFLAGS} +LDFLAGS_STATIC=${LDFLAGS_STATIC:-$LDFLAGS} +AC_ARG_ENABLE([hardening], +AS_HELP_STRING([--enable-hardening],[build for coverage testing using gcov]), +if test "$enableval" = "yes" +then + HARDEN_CFLAGS="-D_FORTIFY_SOURCE=2 -fstack-protector-strong" + HARDEN_LDFLAGS=["-Wl,-z,relro -Wl,-z,now"] + CFLAGS="$CFLAGS $HARDEN_CFLAGS -fPIE" + CFLAGS_SHLIB="$CFLAGS_SHLIB $HARDEN_CFLAGS" + CFLAGS_STLIB="$CFLAGS_STLIB $HARDEN_CFLAGS -fPIE" + LDFLAGS="$LDFLAGS $HARDEN_LDFLAGS -fPIE -pie" + LDFLAGS_STATIC="$LDFLAGS_STATIC $HARDEN_LDFLAGS" + LDFLAGS_SHLIB="$LDFLAGS_SHLIB $HARDEN_LDFLAGS" + AC_MSG_RESULT([Enabling hardening support]) +fi +) +dnl +dnl Substitute library extensions +dnl +AC_SUBST(LIB_EXT) +AC_SUBST(STATIC_LIB_EXT) +AC_SUBST(PROFILED_LIB_EXT) +AC_SUBST(LDFLAG_DYNAMIC) +AC_SUBST(PRIVATE_LIBS_CMT) +dnl +dnl handle --enable-jbd-debug +dnl +AC_ARG_ENABLE([jbd-debug], +AS_HELP_STRING([--enable-jbd-debug],[enable journal debugging]), +if test "$enableval" = "no" +then + AC_MSG_RESULT([Disabling journal debugging]) +else + AC_DEFINE(CONFIG_JBD_DEBUG, 1, + [Define to 1 if debugging ext3/4 journal code]) + AC_MSG_RESULT([Enabling journal debugging]) +fi +, +AC_MSG_RESULT([Disabling journal debugging by default]) +) +dnl +dnl handle --enable-blkid-debug +dnl +AC_ARG_ENABLE([blkid-debug], +AS_HELP_STRING([--enable-blkid-debug],[enable blkid debugging]), +if test "$enableval" = "no" +then + AC_MSG_RESULT([Disabling blkid debugging]) +else + AC_DEFINE(CONFIG_BLKID_DEBUG, 1, + [Define to 1 if debugging the blkid library]) + AC_MSG_RESULT([Enabling blkid debugging]) +fi +, +AC_MSG_RESULT([Disabling blkid debugging by default]) +) +dnl +dnl handle --enable-testio-debug +dnl +AC_ARG_ENABLE([testio-debug], +AS_HELP_STRING([--disable-testio-debug],[disable the use of the test I/O manager for debugging]), +AH_TEMPLATE([CONFIG_TESTIO_DEBUG], + [Define to 1 if the testio I/O manager should be enabled]) +if test "$enableval" = "no" +then + AC_MSG_RESULT([Disabling testio debugging]) + TEST_IO_CMT="#" +else + TEST_IO_CMT= + AC_DEFINE(CONFIG_TESTIO_DEBUG, 1) + AC_MSG_RESULT([Enabling testio debugging]) +fi +, +AC_MSG_RESULT([Enabling testio debugging by default]) +AC_DEFINE(CONFIG_TESTIO_DEBUG, 1) +TEST_IO_CMT= +) +AC_SUBST(TEST_IO_CMT) +dnl +dnl handle --enable-developer-features +dnl +AC_ARG_ENABLE([developer-features], +AS_HELP_STRING([--enable-developer-features],[enable features for use by ext4 developers]), +AH_TEMPLATE([CONFIG_DEVELOPER_FEATURES], + [Define to 1 for features for use by ext4 developers]) +if test "$enableval" = "yes" +then + DEV_FEATURES_CMT= + AC_DEFINE(CONFIG_DEVELOPER_FEATURES, 1) + AC_MSG_RESULT([Enabling ext4 developer features]) +else + AC_MSG_RESULT([Disabling ext4 developer features]) + DEV_FEATURES_CMT="#" +fi +, +AC_MSG_RESULT([Disabling ext4 developer features by default]) +DEV_FEATURES_CMT= +) +AC_SUBST(DEV_FEATURES_CMT) +dnl +dnl handle --disable-libuuid +dnl +PKG_PROG_PKG_CONFIG +LIBUUID= +DEPLIBUUID= +STATIC_LIBUUID= +DEPSTATIC_LIBUUID= +PROFILED_LIBUUID= +DEPPROFILED_LIBUUID= +UUID_CMT= +AC_ARG_ENABLE([libuuid], +AS_HELP_STRING([--enable-libuuid],[build and use private uuid library]), +if test "$enableval" = "no" +then + if test -z "$PKG_CONFIG"; then + AC_MSG_ERROR([pkg-config not installed; please install it.]) + fi + + AC_CHECK_LIB(uuid, uuid_generate, + [LIBUUID=`$PKG_CONFIG --libs uuid`; + STATIC_LIBUUID=`$PKG_CONFIG --static --libs uuid`], + [AC_MSG_ERROR([external uuid library not found])]) + PROFILED_LIBUUID=$LIBUUID + UUID_CMT=# + AC_MSG_RESULT([Disabling private uuid library]) +else + LIBUUID='$(LIB)/libuuid'$LIB_EXT + DEPLIBUUID=$LIBUUID + STATIC_LIBUUID='$(LIB)/libuuid'$STATIC_LIB_EXT + DEPSTATIC_LIBUUID=$STATIC_LIBUUID + PROFILED_LIBUUID='$(LIB)/libuuid'$PROFILED_LIB_EXT + DEPPROFILED_LIBUUID=$PROFILED_LIBUUID + AC_MSG_RESULT([Enabling private uuid library]) +fi +, +if test -n "$PKG_CONFIG"; then + AC_CHECK_LIB(uuid, uuid_generate, + [LIBUUID=`$PKG_CONFIG --libs uuid`; + STATIC_LIBUUID=`$PKG_CONFIG --static --libs uuid`]) +fi +if test -n "$LIBUUID"; then + PROFILED_LIBUUID=$LIBUUID + UUID_CMT=# + AC_MSG_RESULT([Using system uuid by default]) +else + LIBUUID='$(LIB)/libuuid'$LIB_EXT + DEPLIBUUID=$LIBUUID + STATIC_LIBUUID='$(LIB)/libuuid'$STATIC_LIB_EXT + DEPSTATIC_LIBUUID=$STATIC_LIBUUID + PROFILED_LIBUUID='$(LIB)/libuuid'$PROFILED_LIB_EXT + DEPPROFILED_LIBUUID=$PROFILED_LIBUUID + AC_MSG_RESULT([Enabling private uuid library by default]) +fi +) +AC_SUBST(LIBUUID) +AC_SUBST(DEPLIBUUID) +AC_SUBST(STATIC_LIBUUID) +AC_SUBST(DEPSTATIC_LIBUUID) +AC_SUBST(PROFILED_LIBUUID) +AC_SUBST(DEPPROFILED_LIBUUID) +AC_SUBST(UUID_CMT) +dnl +dnl handle --disable-libblkid +dnl +PKG_PROG_PKG_CONFIG +LIBBLKID= +DEPLIBBLKID= +STATIC_LIBBLKID= +DEPSTATIC_LIBBLKID= +PROFILED_LIBBLKID= +DEPPROFILED_LIBBLKID= +BLKID_CMT= +AH_TEMPLATE([CONFIG_BUILD_FINDFS], [Define to 1 to compile findfs]) +AC_ARG_ENABLE([libblkid], +AS_HELP_STRING([--enable-libblkid],[build and use private blkid library]), +if test "$enableval" = "no" +then + if test -z "$PKG_CONFIG"; then + AC_MSG_ERROR([pkg-config not installed; please install it.]) + fi + + AC_CHECK_LIB(blkid, blkid_get_cache, + [LIBBLKID=`$PKG_CONFIG --libs blkid`; + STATIC_LIBBLKID=`$PKG_CONFIG --static --libs blkid`], + [AC_MSG_ERROR([external blkid library not found])], -luuid) + BLKID_CMT=# + PROFILED_LIBBLKID=$LIBBLKID + AC_MSG_RESULT([Disabling private blkid library]) +else + LIBBLKID='$(LIB)/libblkid'$LIB_EXT + DEPLIBBLKID=$LIBBLKID + STATIC_LIBBLKID='$(LIB)/libblkid'$STATIC_LIB_EXT + DEPSTATIC_LIBBLKID=$STATIC_LIBBLKID + PROFILED_LIBBLKID='$(LIB)/libblkid'$PROFILED_LIB_EXT + DEPPROFILED_LIBBLKID=$PROFILED_LIBBLKID + AC_DEFINE(CONFIG_BUILD_FINDFS, 1) + AC_MSG_RESULT([Enabling private blkid library]) +fi +, +if test -n "$PKG_CONFIG"; then + AC_CHECK_LIB(blkid, blkid_get_cache, + [LIBBLKID=`$PKG_CONFIG --libs blkid`; + STATIC_LIBBLKID=`$PKG_CONFIG --static --libs blkid`]) +fi +if test -n "$LIBBLKID"; then + BLKID_CMT=# + PROFILED_LIBBLKID=$LIBBLKID + AC_MSG_RESULT([Using system blkid library by default]) +else + LIBBLKID='$(LIB)/libblkid'$LIB_EXT + DEPLIBBLKID=$LIBBLKID + STATIC_LIBBLKID='$(LIB)/libblkid'$STATIC_LIB_EXT + DEPSTATIC_LIBBLKID=$STATIC_LIBBLKID + PROFILED_LIBBLKID='$(LIB)/libblkid'$PROFILED_LIB_EXT + DEPPROFILED_LIBBLKID=$PROFILED_LIBBLKID + AC_DEFINE(CONFIG_BUILD_FINDFS, 1) + AC_MSG_RESULT([Enabling private blkid library by default]) +fi +) +AC_SUBST(LIBBLKID) +AC_SUBST(DEPLIBBLKID) +AC_SUBST(STATIC_LIBBLKID) +AC_SUBST(DEPSTATIC_LIBBLKID) +AC_SUBST(PROFILED_LIBBLKID) +AC_SUBST(DEPPROFILED_LIBBLKID) +AC_SUBST(BLKID_CMT) +dnl +dnl handle --enable-subset +dnl +ALL_CMT= +SUBSET_CMT= +AC_ARG_ENABLE([subset], +AS_HELP_STRING([--enable-subset],[enable subset-only build]), +if test "$enableval" = "no" +then + SUBSET_CMT=# + AC_MSG_RESULT([Disabling subset-only build]) +else + ALL_CMT=# + AC_MSG_RESULT([Enabling subset-only-build]) +fi +,) +AC_SUBST(ALL_CMT) +AC_SUBST(SUBSET_CMT) +dnl +dnl handle --disable-backtrace +dnl +AH_TEMPLATE([DISABLE_BACKTRACE], [Define to 1 to disable use of backtrace]) +AC_ARG_ENABLE([backtrace], +AS_HELP_STRING([--disable-backtrace],[disable use backtrace]), +if test "$enableval" = "no" +then + AC_MSG_RESULT([Disabling use of backtrace]) + AC_DEFINE(DISABLE_BACKTRACE, 1) +else + AC_MSG_RESULT([Enabling use of backtrace]) +fi +, +AC_MSG_RESULT([Enabling use of backtrace by default]) +) +dnl +dnl handle --enable-debugfs +dnl +AC_ARG_ENABLE([debugfs], +AS_HELP_STRING([--disable-debugfs],[disable support of debugfs program]), +if test "$enableval" = "no" +then + AC_MSG_RESULT([Disabling debugfs support]) + DEBUGFS_CMT="#" +else + DEBUGFS_CMT= + AC_MSG_RESULT([Enabling debugfs support]) +fi +, +AC_MSG_RESULT([Enabling debugfs support by default]) +DEBUGFS_CMT= +) +AC_SUBST(DEBUGFS_CMT) +dnl +dnl handle --enable-imager +dnl +AC_ARG_ENABLE([imager], +AS_HELP_STRING([--disable-imager],[disable support of e2image program]), +if test "$enableval" = "no" +then + AC_MSG_RESULT([Disabling e2image support]) + IMAGER_CMT="#" +else + IMAGER_CMT= + AC_MSG_RESULT([Enabling e2image support]) +fi +, +AC_MSG_RESULT([Enabling e2image support by default]) +IMAGER_CMT= +) +AC_SUBST(IMAGER_CMT) +dnl +dnl handle --enable-resizer +dnl +AC_ARG_ENABLE([resizer], +AS_HELP_STRING([--disable-resizer],[disable support of e2resize program]), +if test "$enableval" = "no" +then + AC_MSG_RESULT([Disabling e2resize support]) + RESIZER_CMT="#" +else + RESIZER_CMT= + AC_MSG_RESULT([Enabling e2resize support]) +fi +, +AC_MSG_RESULT([Enabling e2resize support by default]) +RESIZER_CMT= +) +AC_SUBST(RESIZER_CMT) +dnl +dnl handle --enable-defrag +dnl +AC_ARG_ENABLE([defrag], +AS_HELP_STRING([--disable-defrag],[disable support of e4defrag program]), +if test "$enableval" = "no" +then + AC_MSG_RESULT([Disabling e4defrag support]) + DEFRAG_CMT="#" +else + DEFRAG_CMT= + AC_MSG_RESULT([Enabling e4defrag support]) +fi +, +if test -z "$WITH_DIET_LIBC" +then + AC_MSG_RESULT([Enabling e4defrag support by default]) + DEFRAG_CMT= +else + AC_MSG_RESULT([Disabling e4defrag support by default]) + DEFRAG_CMT="#" +fi +) +AC_SUBST(DEFRAG_CMT) +dnl +dnl See whether to install the `fsck' wrapper program (that calls e2fsck) +dnl +AC_ARG_ENABLE([fsck], +AS_HELP_STRING([--enable-fsck],[build fsck wrapper program]), +[if test "$enableval" = "no" +then + FSCK_PROG='' FSCK_MAN='' + AC_MSG_RESULT([Not building fsck wrapper]) +else + FSCK_PROG=fsck FSCK_MAN=fsck.8 + AC_MSG_RESULT([Building fsck wrapper]) +fi] +, +[case "$host_os" in + gnu*) + FSCK_PROG='' FSCK_MAN='' + AC_MSG_RESULT([Not building fsck wrapper by default]) + ;; + *) + FSCK_PROG=fsck FSCK_MAN=fsck.8 + AC_MSG_RESULT([Building fsck wrapper by default]) +esac] +) +AC_SUBST(FSCK_PROG) +AC_SUBST(FSCK_MAN) +dnl +dnl See whether to install the `e2initrd-helper' program +dnl +AC_ARG_ENABLE([e2initrd-helper], +AS_HELP_STRING([--enable-e2initrd-helper],[build e2initrd-helper program]), +[if test "$enableval" = "no" +then + E2INITRD_PROG='' E2INITRD_MAN='' + AC_MSG_RESULT([Not building e2initrd helper]) +else + E2INITRD_PROG=e2initrd_helper E2INITRD_MAN=e2initrd_helper.8 + AC_MSG_RESULT([Building e2initrd helper]) +fi] +, +E2INITRD_PROG=e2initrd_helper E2INITRD_MAN=e2initrd_helper.8 +AC_MSG_RESULT([Building e2initrd helper by default]) +) +AC_SUBST(E2INITRD_PROG) +AC_SUBST(E2INITRD_MAN) +dnl +dnl +dnl +AC_ARG_ENABLE([tls], +AS_HELP_STRING([--disable-tls],[disable use of thread local support]), +[if test "$enableval" = "no" +then + try_tls="" + AC_MSG_RESULT([Disabling thread local support]) +else + try_tls="yes" + AC_MSG_RESULT([Enabling thread local support]) +fi] +, +if test -n "$WITH_DIET_LIBC" +then + try_tls="" + AC_MSG_RESULT([Diet libc does not support thread local support]) +else + try_tls="yes" + AC_MSG_RESULT([Try using thread local support by default]) +fi +) +if test "$try_tls" = "yes" +then +AX_TLS +fi +dnl +dnl +dnl +AC_ARG_WITH([pthread], +AS_HELP_STRING([--without-pthread],[disable use of pthread support]), +[if test "$withval" = "no" +then + try_pthread="" + AC_MSG_RESULT([Disabling pthread support]) +else + try_pthread="yes" + AC_MSG_RESULT([Testing for pthread support]) +fi] +, +try_pthread="yes" +AC_MSG_RESULT([Try testing for pthread support by default]) +) +if test "$try_pthread" = "yes" +then +AX_PTHREAD +else +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" +AC_SUBST([PTHREAD_CC]) +fi +dnl +dnl +dnl +AH_TEMPLATE([USE_UUIDD], [Define to 1 to build uuidd]) +AC_ARG_ENABLE([uuidd], +AS_HELP_STRING([--disable-uuidd],[disable building the uuid daemon]), +[if test "$enableval" = "no" +then + AC_MSG_RESULT([Not building uuidd]) + UUIDD_CMT="#" +else + AC_DEFINE(USE_UUIDD, 1) + UUIDD_CMT="" + AC_MSG_RESULT([Building uuidd]) +fi] +, +AC_DEFINE(USE_UUIDD, 1) +if test -z "$UUID_CMT" +then + UUIDD_CMT="" + AC_MSG_RESULT([Building uuidd by default]) +else + UUIDD_CMT="#" + AC_MSG_RESULT([Disabling uuidd by default]) +fi +) +AC_SUBST(UUIDD_CMT) +dnl +dnl handle --disable-mmp +dnl +AH_TEMPLATE([CONFIG_MMP], [Define to 1 to enable mmp support]) +AC_ARG_ENABLE([mmp], +AS_HELP_STRING([--disable-mmp],[disable support mmp, Multi Mount Protection]), +if test "$enableval" = "no" +then + AC_MSG_RESULT([Disabling mmp support]) +else + AC_MSG_RESULT([Enabling mmp support]) + AC_DEFINE(CONFIG_MMP, 1) +fi +, +AC_MSG_RESULT([Enabling mmp support by default]) +AC_DEFINE(CONFIG_MMP, 1) +) +dnl +dnl handle --disable-tdb +dnl +AH_TEMPLATE([CONFIG_TDB], [Define to 1 to enable tdb support]) +AC_ARG_ENABLE([tdb], +AS_HELP_STRING([--disable-tdb],[disable tdb support]), +[ +if test "$enableval" = "no" +then + AC_MSG_RESULT([Disabling tdb support]) + CONFIG_TDB=0 +else + AC_MSG_RESULT([Enabling tdb support]) + CONFIG_TDB=1 +fi +] +, +[ +case "$host_os" in +mingw*) + AC_MSG_RESULT([Disabling tdb support by default]) + CONFIG_TDB=0 + ;; +*) + AC_MSG_RESULT([Enabling tdb support by default]) + CONFIG_TDB=1 + ;; +esac +] +) +if test "$CONFIG_TDB" = "1" +then + AC_DEFINE(CONFIG_TDB, 1) + TDB_CMT="" + TDB_MAN_COMMENT="" +else + TDB_CMT="#" + TDB_MAN_COMMENT='.\"' +fi +AC_SUBST(TDB_CMT) +AC_SUBST(TDB_MAN_COMMENT) +dnl +dnl handle --disable-bmap-stats +dnl +AH_TEMPLATE([ENABLE_BMAP_STATS], [Define to 1 to enable bitmap stats.]) +AC_ARG_ENABLE([bmap-stats], +AS_HELP_STRING([--disable-bmap-stats],[disable collection of bitmap stats]), +if test "$enableval" = "no" +then + AC_MSG_RESULT([Disabling bitmap statistics support]) +else + AC_MSG_RESULT([Enabling bitmap statistics support]) + AC_DEFINE(ENABLE_BMAP_STATS, 1) +fi +, +AC_MSG_RESULT([Enabling bitmap statistics support by default]) +AC_DEFINE(ENABLE_BMAP_STATS, 1) +) +dnl +dnl handle --enable-bmap-stats-ops +dnl +AH_TEMPLATE([ENABLE_BMAP_STATS_OPS], [Define to 1 to enable bitmap stats.]) +AC_ARG_ENABLE([bmap-stats-ops], +AS_HELP_STRING([--enable-bmap-stats-ops],[enable collection of additional bitmap stats]), +if test "$enableval" = "no" +then + AC_MSG_RESULT([Disabling additional bitmap statistics]) +else + dnl There has to be a better way! + AS_IF([test "x${enable_bmap_stats}" = "xno"], + AC_MSG_FAILURE([Error --enable-bmap-stats-ops requires bmap-stats])) + + AC_MSG_RESULT([Enabling additional bitmap statistics]) + AC_DEFINE(ENABLE_BMAP_STATS_OPS, 1) +fi +, +AC_MSG_RESULT([Disabling additional bitmap statistics by default]) +) +dnl +dnl +dnl +MAKEFILE_LIBRARY=$srcdir/lib/Makefile.library +AC_SUBST_FILE(MAKEFILE_LIBRARY) +dnl +dnl Add internationalization support, using gettext. +dnl +GETTEXT_PACKAGE=e2fsprogs +PACKAGE=e2fsprogs +VERSION="$E2FSPROGS_VERSION" +VERSION=0.14.1 +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [package name for gettext]) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [version for gettext]) +AC_SUBST(GETTEXT_PACKAGE) +AC_SUBST(PACKAGE) +AC_SUBST(VERSION) + +AM_GNU_GETTEXT([external]) +dnl +dnl End of configuration options +dnl +AC_SUBST(BINARY_TYPE) +AC_PROG_MAKE_SET +CHECK_GNU_MAKE +AC_PATH_PROG(LN, ln, ln) +AC_PROG_MKDIR_P +dnl +dnl @mkdir_p@ is used by po's Makefile.in +dnl +mkdir_p=$MKDIR_P +AC_SUBST(mkdir_p) +AC_PROG_LN_S +AC_PATH_PROG(MV, mv, mv) +AC_PATH_PROG(CP, cp, cp) +AC_PATH_PROG(RM, rm, rm) +AC_PATH_PROG(CHMOD, chmod, :) +AC_PROG_AWK +AC_PROG_EGREP +AC_PATH_PROG(SED, sed, sed) +AC_PATH_PROG(PERL, perl, perl) +AC_PATH_PROG(LDCONFIG, ldconfig, :) +AC_CHECK_TOOL(AR, ar, ar) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) +AC_CHECK_PROG(MAKEINFO, makeinfo, makeinfo, ) +if test "_$MAKEINFO" = "_"; then + MAKEINFO="echo Makeinfo is missing. Info documentation will not be built." +else + case "$MAKEINFO" in + */missing.*) + AC_MSG_WARN([ +*** Makeinfo is missing. Info documentation will not be built.]) + ;; + *) + ;; + esac +fi +AC_SUBST(MAKEINFO) +AC_PROG_INSTALL +# See if we need a separate native compiler. +if test $cross_compiling = no; then + BUILD_CC="$CC" + AC_SUBST(BUILD_CC) +else + AC_CHECK_PROGS(BUILD_CC, gcc cc) +fi +AC_CHECK_HEADERS(m4_flatten([ + dirent.h + errno.h + execinfo.h + getopt.h + malloc.h + mntent.h + paths.h + pthread.h + semaphore.h + setjmp.h + signal.h + stdarg.h + stdint.h + stdlib.h + termios.h + termio.h + unistd.h + utime.h + attr/xattr.h + linux/falloc.h + linux/fd.h + linux/fsmap.h + linux/major.h + linux/loop.h + linux/types.h + net/if_dl.h + netinet/in.h + sys/acl.h + sys/disklabel.h + sys/disk.h + sys/file.h + sys/ioctl.h + sys/key.h + sys/mkdev.h + sys/mman.h + sys/mount.h + sys/prctl.h + sys/random.h + sys/resource.h + sys/select.h + sys/socket.h + sys/sockio.h + sys/stat.h + sys/syscall.h + sys/sysmacros.h + sys/time.h + sys/types.h + sys/un.h + sys/wait.h + sys/xattr.h +])) +case "$host_os" in +mingw*) + # The above checks only detect system headers, not the headers in + # ./include/mingw/, so explicitly define them to be available. + AC_DEFINE(HAVE_LINUX_TYPES_H, 1) + AC_DEFINE(HAVE_SYS_STAT_H, 1) + AC_DEFINE(HAVE_SYS_SYSMACROS_H, 1) + AC_DEFINE(HAVE_SYS_TYPES_H, 1) + AC_DEFINE(HAVE_UNISTD_H, 1) + ;; +esac +dnl Check where to find a dd(1) that supports iflag=fullblock +dnl and oflag=append +AC_MSG_CHECKING([for a dd(1) program that supports iflag=fullblock]) +DD= +for i in dd gdd ; do + if "$i" if=/dev/null of=/dev/null count=1 bs=10k 2>/dev/null iflag=fullblock oflag=append ; then + DD=$i + break + fi +done +if test -n "$DD" ; then + AC_MSG_RESULT([$DD]) +else + AC_MSG_RESULT([not found, using dd]) + DD=dd + AC_MSG_WARN([No GNU-compatible dd(1) program found, expect some self-test failures.]) +fi +AC_SUBST([DD]) + +AC_CHECK_HEADERS(net/if.h,,, +[[ +#if HAVE_SYS_TYPES_H +#include +#endif +#if HAVE_SYS_SOCKET +#include +#endif +]]) +AC_FUNC_VPRINTF +dnl Check to see if dirent has member d_reclen. On cygwin those d_reclen +dnl is not declared. +AC_CHECK_MEMBER(struct dirent.d_reclen,[AC_DEFINE(HAVE_RECLEN_DIRENT, 1, + [Define to 1 if dirent has d_reclen])],, + [#include ]) +AC_CHECK_MEMBERS([struct stat.st_atim]) +dnl Check to see if ssize_t was declared +AC_CHECK_TYPE(ssize_t,[AC_DEFINE(HAVE_TYPE_SSIZE_T, 1, + [Define to 1 if ssize_t declared])],, + [#include ]) +dnl +dnl Check to see if llseek() is declared in unistd.h. On some libc's +dnl it is, and on others it isn't..... Thank you glibc developers.... +dnl +AC_CHECK_DECL(llseek,[AC_DEFINE(HAVE_LLSEEK_PROTOTYPE, 1, + [Define to 1 if llseek declared in unistd.h])],, + [#include ]) +dnl +dnl Check to see if lseek64() is declared in unistd.h. Glibc's header files +dnl are so convoluted that I can't tell whether it will always be defined, +dnl and if it isn't defined while lseek64 is defined in the library, +dnl disaster will strike. +dnl +dnl Warning! Use of --enable-gcc-wall may throw off this test. +dnl +dnl +AC_CHECK_DECL(lseek64,[AC_DEFINE(HAVE_LSEEK64_PROTOTYPE, 1, + [Define to 1 if lseek64 declared in unistd.h])],, + [#define _LARGEFILE_SOURCE + #define _LARGEFILE64_SOURCE + #include ]) +dnl +dnl Word sizes... +dnl +AC_CHECK_SIZEOF(short) +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(long) +AC_CHECK_SIZEOF(long long) +AC_CHECK_SIZEOF(off_t) +AC_CHECK_SIZEOF(time_t) +SIZEOF_SHORT=$ac_cv_sizeof_short +SIZEOF_INT=$ac_cv_sizeof_int +SIZEOF_LONG=$ac_cv_sizeof_long +SIZEOF_LONG_LONG=$ac_cv_sizeof_long_long +SIZEOF_OFF_T=$ac_cv_sizeof_off_t +SIZEOF_TIME_T=$ac_cv_sizeof_time_t +AC_SUBST(SIZEOF_SHORT) +AC_SUBST(SIZEOF_INT) +AC_SUBST(SIZEOF_LONG) +AC_SUBST(SIZEOF_LONG_LONG) +AC_SUBST(SIZEOF_OFF_T) +AC_SUBST(SIZEOF_TIME_T) +AC_C_BIGENDIAN +if test $cross_compiling = no; then + BUILD_CC="$BUILD_CC" CPP="$CPP" /bin/sh $ac_aux_dir/parse-types.sh +else + CROSS_COMPILE="1" BUILD_CC="$BUILD_CC" CPP="$CPP" /bin/sh $ac_aux_dir/parse-types.sh +fi +ASM_TYPES_HEADER=./asm_types.h +AC_SUBST_FILE(ASM_TYPES_HEADER) +dnl +dnl Save the configuration #defines needed for the public ext2fs.h +dnl header file +dnl +echo "/* These defines are needed for the public ext2fs.h header file */" \ + > public_config.h +if grep HAVE_SYS_TYPES_H confdefs.h > tmp_config.$$; then + uniq tmp_config.$$ >> public_config.h +else + echo "#undef HAVE_SYS_TYPES_H" >> public_config.h +fi +if grep WORDS_BIGENDIAN confdefs.h > tmp_config.$$; then + uniq tmp_config.$$ >> public_config.h +else + echo "#undef WORDS_BIGENDIAN" >> public_config.h +fi +rm -f tmp_config.$$ +PUBLIC_CONFIG_HEADER=./public_config.h +AC_SUBST_FILE(PUBLIC_CONFIG_HEADER) +dnl +dnl See if we have inttypes.h and if intptr_t is defined +dnl +AC_CHECK_HEADERS([inttypes.h]) +AC_CHECK_TYPES(intptr_t) +dnl +dnl See if struct stat has a st_flags field, in which case we can get file +dnl flags somewhat portably. Also check for the analogous setter, chflags(). +dnl +AC_MSG_CHECKING(whether struct stat has a st_flags field) +AC_CACHE_VAL(e2fsprogs_cv_struct_st_flags, + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[struct stat stat; stat.st_flags = 0;]])],[e2fsprogs_cv_struct_st_flags=yes],[e2fsprogs_cv_struct_st_flags=no])) +AC_MSG_RESULT($e2fsprogs_cv_struct_st_flags) +if test "$e2fsprogs_cv_struct_st_flags" = yes; then + AC_MSG_CHECKING(whether st_flags field is useful) + AC_CACHE_VAL(e2fsprogs_cv_struct_st_flags_immut, + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[struct stat stat; stat.st_flags |= UF_IMMUTABLE;]])],[e2fsprogs_cv_struct_st_flags_immut=yes],[e2fsprogs_cv_struct_st_flags_immut=no])) + AC_MSG_RESULT($e2fsprogs_cv_struct_st_flags_immut) + if test "$e2fsprogs_cv_struct_st_flags_immut" = yes; then + AC_DEFINE(HAVE_STAT_FLAGS, 1, + [Define to 1 if struct stat has st_flags]) + fi +fi +dnl +dnl Check for the presence of SA_LEN +dnl +AC_CHECK_MEMBER(struct sockaddr.sa_len, + AC_DEFINE_UNQUOTED(HAVE_SA_LEN,1, + [Define to 1 if if struct sockaddr contains sa_len]),, + [#include + #include ]) +dnl +dnl If we are using the system-provided blkid library, check for +dnl the functions added after migrating that library to util-linux +dnl +if test -n "$BLKID_CMT"; then + AC_CHECK_LIB(blkid, blkid_probe_get_topology, + AC_DEFINE(HAVE_BLKID_PROBE_GET_TOPOLOGY, 1, + [Define to 1 if blkid has blkid_probe_get_topology])) + AC_CHECK_LIB(blkid, blkid_topology_get_dax, + AC_DEFINE(HAVE_BLKID_TOPOLOGY_GET_DAX, 1, + [Define to 1 if blkid has blkid_topology_get_dax])) + AC_CHECK_LIB(blkid, blkid_probe_enable_partitions, + AC_DEFINE(HAVE_BLKID_PROBE_ENABLE_PARTITIONS, 1, + [Define to 1 if blkid has blkid_probe_enable_partitions])) +fi +dnl +if test -n "$DLOPEN_LIB" ; then + ac_cv_func_dlopen=yes +fi +AC_CHECK_FUNCS(m4_flatten([ + __secure_getenv + add_key + backtrace + chflags + dlopen + fadvise64 + fallocate + fallocate64 + fchown + fcntl + fdatasync + fstat64 + fsync + ftruncate64 + futimes + getcwd + getdtablesize + getentropy + gethostname + getmntinfo + getpwuid_r + getrandom + getrlimit + getrusage + jrand48 + keyctl + llistxattr + llseek + lseek64 + mallinfo + mallinfo2 + mbstowcs + memalign + mempcpy + mmap + msync + nanosleep + open64 + pathconf + posix_fadvise + posix_fadvise64 + posix_memalign + prctl + pread + pwrite + pread64 + pwrite64 + qsort_r + secure_getenv + setmntent + setresgid + setresuid + snprintf + srandom + stpcpy + strcasecmp + strdup + strnlen + strptime + strtoull + sync_file_range + sysconf + usleep + utime + utimes + valloc +])) +dnl +dnl Check to see if -lsocket is required (solaris) to make something +dnl that uses socket() to compile; this is needed for the UUID library +dnl +SOCKET_LIB='' +AC_CHECK_LIB(socket, socket, [SOCKET_LIB=-lsocket]) +AC_SUBST(SOCKET_LIB) +dnl +dnl See if libmagic exists +dnl +AC_CHECK_LIB(magic, magic_file, [MAGIC_LIB=-lmagic +AC_CHECK_HEADERS([magic.h])]) +if test "$ac_cv_func_dlopen" = yes ; then + MAGIC_LIB=$DLOPEN_LIB +fi +AC_SUBST(MAGIC_LIB) +dnl +dnl Check to see if librt is required for clock_gettime() (glibc < 2.17) +dnl +AC_CHECK_LIB(rt, clock_gettime, [CLOCK_GETTIME_LIB=-lrt]) +AC_SUBST(CLOCK_GETTIME_LIB) +dnl +dnl Check to see if the FUSE library is -lfuse or -losxfuse +dnl +FUSE_CMT= +FUSE_LIB= +dnl osxfuse.dylib supersedes fuselib.dylib +AC_ARG_ENABLE([fuse2fs], +AS_HELP_STRING([--disable-fuse2fs],[do not build fuse2fs]), +if test "$enableval" = "no" +then + FUSE_CMT="#" + AC_MSG_RESULT([Disabling fuse2fs]) +else + AC_CHECK_HEADERS([pthread.h fuse.h], [], +[AC_MSG_FAILURE([Cannot find fuse2fs headers.])], +[#define _FILE_OFFSET_BITS 64 +#define FUSE_USE_VERSION 29]) + + AC_PREPROC_IFELSE( +[AC_LANG_PROGRAM([[#define FUSE_USE_VERSION 29 +#ifdef __linux__ +#include +#include +#include +#endif +]], [])], [], [AC_MSG_FAILURE([Cannot find fuse2fs Linux headers.])]) + + AC_CHECK_LIB(osxfuse, fuse_main, [FUSE_LIB=-losxfuse], + [AC_CHECK_LIB(fuse, fuse_main, [FUSE_LIB=-lfuse], + [AC_MSG_FAILURE([Cannot find fuse library.])])]) + AC_MSG_RESULT([Enabling fuse2fs]) +fi +, +AC_CHECK_HEADERS([pthread.h fuse.h], [], [FUSE_CMT="#"], +[#define _FILE_OFFSET_BITS 64 +#define FUSE_USE_VERSION 29 +#ifdef __linux__ +# include +# include +# include +#endif]) +if test -z "$FUSE_CMT" +then + AC_CHECK_LIB(osxfuse, fuse_main, [FUSE_LIB=-losxfuse], +[AC_CHECK_LIB(fuse, fuse_main, [FUSE_LIB=-lfuse], [FUSE_CMT="#"])]) +fi +if test -z "$FUSE_CMT" +then + AC_MSG_RESULT([Enabling fuse2fs by default.]) +fi +) +AC_SUBST(FUSE_LIB) +AC_SUBST(FUSE_CMT) +dnl +dnl See if optreset exists +dnl +AC_MSG_CHECKING(for optreset) +AC_CACHE_VAL(ac_cv_have_optreset, +[AC_EGREP_HEADER(optreset, unistd.h, + ac_cv_have_optreset=yes, ac_cv_have_optreset=no)])dnl +AC_MSG_RESULT($ac_cv_have_optreset) +if test $ac_cv_have_optreset = yes; then + AC_DEFINE(HAVE_OPTRESET, 1, [Define to 1 if optreset for getopt is present]) +fi +dnl +dnl Test for sem_init, and which library it might require: +dnl +AH_TEMPLATE([HAVE_SEM_INIT], [Define to 1 if sem_init() exists]) +SEM_INIT_LIB='' +echo GL_THREADS_API: ${gl_threads_api} +if test "${gl_threads_api}" != none +then + AC_CHECK_FUNC(sem_init, , + AC_CHECK_LIB(pthread, sem_init, + AC_DEFINE(HAVE_SEM_INIT, 1) + SEM_INIT_LIB=-lpthread, + AC_CHECK_LIB(rt, sem_init, + AC_DEFINE(HAVE_SEM_INIT, 1) + SEM_INIT_LIB=-lrt, + AC_CHECK_LIB(posix4, sem_init, + AC_DEFINE(HAVE_SEM_INIT, 1) + SEM_INIT_LIB=-lposix4))))dnl +fi +AC_SUBST(SEM_INIT_LIB) +dnl +dnl qsort_r detection +dnl +AS_IF([test "$ac_cv_func_qsort_r" != no], [ + AC_CACHE_CHECK(whether qsort_r is GNU version, e2_cv_gnu_qsort_r, + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +@%:@include +void (qsort_r)(void *base, size_t nmemb, size_t size, + int (*compar)(const void *, const void *, void *), + void *arg); +]], [[ ]])],[e2_cv_gnu_qsort_r=yes],[e2_cv_gnu_qsort_r=no]) + ]) + AC_CACHE_CHECK(whether qsort_r is BSD version, e2_cv_bsd_qsort_r, + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +@%:@include +void (qsort_r)(void *base, size_t nmemb, size_t size, + void *arg, int (*compar)(void *, const void *, const void *)); +]], [[ ]])],[e2_cv_bsd_qsort_r=yes],[e2_cv_bsd_qsort_r=no]) + ]) + AS_CASE("$e2_cv_gnu_qsort_r:$e2_cv_bsd_qsort_r", + [yes:no], [ + AC_DEFINE(HAVE_GNU_QSORT_R, 1, [ Define to 1 if you have the GNU-style 'qsort_r' function.]) + ], + [no:yes], [ + AC_DEFINE(HAVE_BSD_QSORT_R, 1, [ Define to 1 if you have the BSD-style 'qsort_r' function.]) + ]) +]) +dnl +dnl Check for unified diff +dnl +AC_MSG_CHECKING(for unified diff option) +if diff -u $0 $0 > /dev/null 2>&1 ; then + UNI_DIFF_OPTS=-u +else + UNI_DIFF_OPTS=-c +fi +AC_MSG_RESULT($UNI_DIFF_OPTS) +AC_SUBST(UNI_DIFF_OPTS) +dnl +dnl We use the EXT2 ioctls only under Linux +dnl +case "$host_os" in +linux*) + AC_DEFINE(HAVE_EXT2_IOCTLS, 1, [Define to 1 if Ext2 ioctls present]) + ;; +esac +dnl +dnl Check the available mount options +dnl +AX_CHECK_MOUNT_OPT(nosuid) +AX_CHECK_MOUNT_OPT(nodev) +dnl Enable LTO for all packages +dnl +AC_ARG_ENABLE([lto], +AS_HELP_STRING([--enable-lto],[enable link time optimization]),, +enable_lto=no) +if test "$enable_lto" = "yes" || test "$enable_lto" = "probe"; then + AC_MSG_CHECKING([if C compiler supports LTO]) + OLD_CFLAGS="$CFLAGS" + OLD_LDFLAGS="$LDFLAGS" + LTO_FLAGS="-g -flto -ffat-lto-objects" + CFLAGS="$CFLAGS $LTO_FLAGS" + LDFLAGS="$LDFLAGS $LTO_FLAGS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([])], + [AC_MSG_RESULT([yes])] + [lto_cflags=$LTO_FLAGS] + [lto_ldflags=$LTO_FLAGS] + [AC_PATH_PROG(gcc_ar, gcc-ar,,)] + [AC_PATH_PROG(gcc_ranlib, gcc-ranlib,,)], + [AC_MSG_RESULT([no])]) + if test -x "$gcc_ar" && test -x "$gcc_ranlib"; then + have_lto=yes + AR="${gcc_ar}" + RANLIB="${gcc_ranlib}" + fi + CFLAGS="${OLD_CFLAGS}" + LDFLAGS="${OLD_LDFLAGS}" + AC_SUBST(have_lto) + AC_SUBST(lto_cflags) + AC_SUBST(lto_ldflags) +fi +if test "$enable_lto" = "yes" && test "$have_lto" != "yes"; then + AC_MSG_ERROR([LTO not supported by compiler.]) +fi +dnl +dnl Enable UBSAN for all packages +dnl +AC_ARG_ENABLE([ubsan], +AS_HELP_STRING([--enable-ubsan],[enable undefined behavior sanitizer]),, +enable_ubsan=no) +if test "$enable_ubsan" = "yes" || test "$enable_ubsan" = "probe"; then + AC_MSG_CHECKING([if C compiler supports UBSAN]) + OLD_CFLAGS="$CFLAGS" + OLD_LDFLAGS="$LDFLAGS" + UBSAN_FLAGS="-fsanitize=undefined" + CFLAGS="$CFLAGS $UBSAN_FLAGS" + LDFLAGS="$LDFLAGS $UBSAN_FLAGS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([])], + [AC_MSG_RESULT([yes])] + [ubsan_cflags=$UBSAN_FLAGS] + [ubsan_ldflags=$UBSAN_FLAGS] + [have_ubsan=yes], + [AC_MSG_RESULT([no])]) + CFLAGS="${OLD_CFLAGS}" + LDFLAGS="${OLD_LDFLAGS}" + AC_SUBST(have_ubsan) + AC_SUBST(ubsan_cflags) + AC_SUBST(ubsan_ldflags) +fi +if test "$enable_ubsan" = "yes" && test "$have_ubsan" != "yes"; then + AC_MSG_ERROR([UBSAN not supported by compiler.]) +fi +dnl +dnl Enable ADDRSAN for all packages +dnl +AC_ARG_ENABLE([addrsan], +AS_HELP_STRING([--enable-addrsan],[enable address sanitizer]),, +enable_addrsan=no) +if test "$enable_addrsan" = "yes" || test "$enable_addrsan" = "probe"; then + AC_MSG_CHECKING([if C compiler supports ADDRSAN]) + OLD_CFLAGS="$CFLAGS" + OLD_LDFLAGS="$LDFLAGS" + ADDRSAN_FLAGS="-fsanitize=address" + CFLAGS="$CFLAGS $ADDRSAN_FLAGS" + LDFLAGS="$LDFLAGS $ADDRSAN_FLAGS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([])], + [AC_MSG_RESULT([yes])] + [addrsan_cflags=$ADDRSAN_FLAGS] + [addrsan_ldflags=$ADDRSAN_FLAGS] + [have_addrsan=yes], + [AC_MSG_RESULT([no])]) + CFLAGS="${OLD_CFLAGS}" + LDFLAGS="${OLD_LDFLAGS}" + AC_SUBST(have_addrsan) + AC_SUBST(addrsan_cflags) + AC_SUBST(addrsan_ldflags) +fi +if test "$enable_addrsan" = "yes" && test "$have_addrsan" != "yes"; then + AC_MSG_ERROR([ADDRSAN not supported by compiler.]) +fi +dnl +dnl Enable THREADSAN for all packages +dnl +AC_ARG_ENABLE([threadsan], +AS_HELP_STRING([--enable-threadsan],[enable thread sanitizer]),, +enable_threadsan=no) +if test "$enable_threadsan" = "yes" || test "$enable_threadsan" = "probe"; then + AC_MSG_CHECKING([if C compiler supports THREADSAN]) + OLD_CFLAGS="$CFLAGS" + OLD_LDFLAGS="$LDFLAGS" + THREADSAN_FLAGS="-fsanitize=thread" + CFLAGS="$CFLAGS $THREADSAN_FLAGS" + LDFLAGS="$LDFLAGS $THREADSAN_FLAGS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([])], + [AC_MSG_RESULT([yes])] + [threadsan_cflags=$THREADSAN_FLAGS] + [threadsan_ldflags=$THREADSAN_FLAGS] + [have_threadsan=yes], + [AC_MSG_RESULT([no])]) + CFLAGS="${OLD_CFLAGS}" + LDFLAGS="${OLD_LDFLAGS}" + AC_SUBST(have_threadsan) + AC_SUBST(threadsan_cflags) + AC_SUBST(threadsan_ldflags) +fi +if test "$enable_threadsan" = "yes" && test "$have_threadsan" != "yes"; then + AC_MSG_ERROR([THREADSAN not supported by compiler.]) +fi +if test "$have_threadsan" = "yes" && test "$have_addrsan" = "yes"; then + AC_MSG_WARN([ADDRSAN and THREADSAN are not known to work together.]) +fi +dnl +dnl Enable the fuzzer sanitizer for all packages +dnl +FUZZING_CMT="#" +AC_ARG_ENABLE([fuzzing], +AS_HELP_STRING([--enable-fuzzing],[enable fuzzing sanitizer]),, +enable_fuzzing=no) +if test "$enable_fuzzing" = "yes" || test "$enable_fuzzing" = "probe"; then + AC_PROG_CXX + AC_MSG_CHECKING([if C compiler supports fuzzing sanitizer]) + AC_LANG_PUSH([C++]) + OLD_CXXFLAGS="$CXXFLAGS" + OLD_LDFLAGS="$LDFLAGS" + FUZZER_FLAGS="-fsanitize=fuzzer" + CXXFLAGS="$CXXFLAGS $FUZZER_FLAGS" + LDFLAGS="$LDFLAGS $FUZZER_FLAGS" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + ]], + [ return 0; ])], + [AC_MSG_RESULT([yes])] + [fuzzer_cflags=$FUZZER_FLAGS] + [fuzzer_ldflags=$FUZZER_FLAGS] + [FUZZING_CMT=] + [have_fuzzer=yes], + [AC_MSG_RESULT([no])] + [AC_MSG_ERROR([fuzzing requested but not available])]) + CXXFLAGS="${OLD_CXXFLAGS}" + LDFLAGS="${OLD_LDFLAGS}" + AC_LANG_POP([C++]) + AC_SUBST(have_fuzzer) + AC_SUBST(fuzzer_cflags) + AC_SUBST(fuzzer_ldflags) +fi +if test "$enable_fuzzer" = "yes" && test "$have_fuzzer" != "yes"; then + AC_MSG_ERROR([Fuzzing not supported by compiler.]) +fi +AC_SUBST(FUZZING_CMT) +dnl +dnl OS-specific uncomment control +dnl +LINUX_CMT="#" +CYGWIN_CMT="#" +UNIX_CMT= +case "$host_os" in +linux*) + LINUX_CMT= + ;; +cygwin) + CYGWIN_CMT= + UNIX_CMT="#" + ;; +esac +AC_SUBST(LINUX_CMT) +AC_SUBST(CYGWIN_CMT) +AC_SUBST(UNIX_CMT) +dnl +dnl e2scrub only builds on linux +dnl +E2SCRUB_CMT="$LINUX_CMT" +AC_SUBST(E2SCRUB_CMT) +dnl +dnl Linux and Hurd places root files in the / by default +dnl +case "$host_os" in +linux* | gnu* | k*bsd*-gnu) + if test "$prefix" = NONE -a "$root_prefix" = NONE ; then + root_prefix=""; + AC_MSG_RESULT([On $host_os systems, root_prefix defaults to '']) + fi + ;; +esac +dnl +dnl On Linux/hurd, force the prefix to be /usr +dnl +case "$host_os" in +linux* | gnu* | k*bsd*-gnu) + if test "$prefix" = NONE ; then + prefix="/usr"; + AC_MSG_RESULT([On $host_os systems, prefix defaults to /usr]) + if test "$mandir" = '${prefix}/man' ; then + AC_MSG_RESULT([...and mandir defaults to /usr/share/man]) + mandir=/usr/share/man + fi + fi +;; +esac +if test "$root_prefix" = NONE ; then + if test "$prefix" = NONE ; then + root_prefix="$ac_default_prefix" + else + root_prefix="$prefix" + fi + root_bindir=$bindir + root_sbindir=$sbindir + root_libdir=$libdir + root_sysconfdir=$sysconfdir +else + root_bindir='${root_prefix}/bin' + root_sbindir='${root_prefix}/sbin' + root_libdir='${root_prefix}/lib' + root_sysconfdir='${root_prefix}/etc' +fi +if test "$bindir" != '${exec_prefix}/bin'; then + root_bindir=$bindir + AC_MSG_RESULT([Setting root_bindir to $root_bindir]) +fi +if test "$sbindir" != '${exec_prefix}/sbin'; then + root_sbindir=$sbindir + AC_MSG_RESULT([Setting root_sbindir to $root_sbindir]) +fi +if test "$libdir" != '${exec_prefix}/lib'; then + root_libdir=$libdir + AC_MSG_RESULT([Setting root_libdir to $root_libdir]) +fi +if test "$sysconfdir" != '${prefix}/etc'; then + root_sysconfdir=$sysconfdir + AC_MSG_RESULT([Setting root_sysconfdir to $root_sysconfdir]) +fi +AC_SUBST(root_prefix) +AC_SUBST(root_bindir) +AC_SUBST(root_sbindir) +AC_SUBST(root_libdir) +AC_SUBST(root_sysconfdir) +dnl +dnl Allow specification of the multiarch arch +dnl +AC_ARG_WITH([multiarch], +AS_HELP_STRING([--with-multiarch=ARCH],[specify the multiarch triplet]), +if test "$withval" = "lib64"; then + libdir=/usr/lib64 + root_libdir=/lib64 +else + libdir=$libdir/$withval + root_libdir=$root_libdir/$withval +fi +) +dnl +dnl +dnl See if -static works. This could fail if the linker does not +dnl support -static, or if required external libraries are not available +dnl in static form. +dnl +AC_MSG_CHECKING([whether we can link with -static]) +AC_CACHE_VAL(ac_cv_e2fsprogs_use_static, +[SAVE_LDFLAGS=$LDFLAGS; LDFLAGS="$LDFLAGS_STATIC -static" +AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[fflush(stdout);]])],[ac_cv_e2fsprogs_use_static=yes],[ac_cv_e2fsprogs_use_static=no]) +LDFLAGS=$SAVE_LDFLAGS]) +dnl +dnl Regardless of how the test turns out, Solaris doesn't handle -static +dnl This is caused by the socket library requiring the nsl library, which +dnl requires the -dl library, which only works for dynamically linked +dnl programs. It basically means you can't have statically linked programs +dnl which use the network under Solaris. +dnl +case "$host_os" in +solaris2.*) + ac_cv_e2fsprogs_use_static=no +;; +esac +AC_MSG_RESULT($ac_cv_e2fsprogs_use_static) +if test $ac_cv_e2fsprogs_use_static = yes; then + LDFLAGS_STATIC="$LDFLAGS_STATIC -static" +fi +AC_SUBST(LDFLAGS_STATIC) +dnl +dnl Work around mysterious Darwin / GNU libintl problem +dnl (__asm__ redirection doesn't work for some mysterious reason. Looks like +dnl Apple hacked gcc somehow?) +dnl +case "$host_os" in +darwin*) + AC_MSG_RESULT([Using Apple Darwin / GNU libintl workaround]) + AC_DEFINE(_INTL_REDIRECT_MACROS, 1, + [Define to 1 if Apple Darwin libintl workaround is needed]) + ;; +esac +dnl +dnl Only try to run the test suite if we're not cross compiling. +dnl +if test "$cross_compiling" = yes ; then + DO_TEST_SUITE= +else + DO_TEST_SUITE=check +fi +AC_SUBST(DO_TEST_SUITE) +dnl +dnl Only include the intl include files if we're building with them +dnl +INCLUDES='-I. -I$(top_builddir)/lib -I$(top_srcdir)/lib' +if test -n "$CPPFLAGS" ; then + INCLUDES="$INCLUDES $CPPFLAGS" +fi +if test "$USE_INCLUDED_LIBINTL" = "yes" ; then + INCLUDES=$INCLUDES' -I$(top_builddir)/intl -I$(top_srcdir)/intl' +fi +if test -n "$WITH_DIET_LIBC" ; then + INCLUDES="$INCLUDES -D_REENTRANT" +fi +case "$host_os" in +mingw*) + INCLUDES=$INCLUDES' -I$(top_srcdir)/include/mingw' + ;; +esac +AC_SUBST(INCLUDES) +dnl +dnl Build CFLAGS +dnl +if test $cross_compiling = no; then + BUILD_CFLAGS="$CFLAGS $CPPFLAGS $INCLUDES -DHAVE_CONFIG_H" + BUILD_LDFLAGS="$LDFLAGS" +fi +AC_SUBST(BUILD_CFLAGS) +AC_SUBST(BUILD_LDFLAGS) +dnl +dnl Define CFLAGS and LDFLAGS for shared libraries +dnl +CFLAGS_SHLIB=${CFLAGS_SHLIB:-$CFLAGS} +CFLAGS_STLIB=${CFLAGS_STLIB:-$CFLAGS} +LDFLAGS_SHLIB=${LDFLAGS_SHLIB:-$LDFLAGS} +AC_SUBST(CFLAGS_SHLIB) +AC_SUBST(CFLAGS_STLIB) +AC_SUBST(LDFLAGS_SHLIB) + +dnl +dnl Where do udev rules go? +dnl +AC_ARG_WITH([udev_rules_dir], + [AS_HELP_STRING([--with-udev-rules-dir@<:@=DIR@:>@], + [Install udev rules into DIR.])], + [], + [with_udev_rules_dir=yes]) +AS_IF([test "x${with_udev_rules_dir}" != "xno"], + [ + AS_IF([test "x${with_udev_rules_dir}" = "xyes"], + [ + PKG_CHECK_MODULES([udev], [udev], + [ + with_udev_rules_dir="$($PKG_CONFIG --variable=udevdir udev)/rules.d" + ], [ + with_udev_rules_dir="" + ]) + ]) + AC_MSG_CHECKING([for udev rules dir]) + pkg_udev_rules_dir="${with_udev_rules_dir}" + AS_IF([test -n "${pkg_udev_rules_dir}"], + [ + AC_MSG_RESULT(${pkg_udev_rules_dir}) + have_udev="yes" + ], + [ + AC_MSG_RESULT(no) + have_udev="no" + ]) + ], + [ + have_udev="disabled" + ]) +AC_SUBST(have_udev) +AC_SUBST(pkg_udev_rules_dir) + +dnl +dnl Where do cron jobs go? +dnl +AC_ARG_WITH([crond_dir], + [AS_HELP_STRING([--with-crond-dir@<:@=DIR@:>@], + [Install system crontabs into DIR.])], + [], + [with_crond_dir=yes]) +AS_IF([test "x${with_crond_dir}" != "xno"], + [ + AS_IF([test "x${with_crond_dir}" = "xyes"], + [ + AS_IF([test -d "/etc/cron.d"], + [with_crond_dir="/etc/cron.d"], + [have_crond="no"; with_crond_dir=""]) + ]) + AC_MSG_CHECKING([for system crontab dir]) + crond_dir="${with_crond_dir}" + AS_IF([test -n "${crond_dir}"], + [ + AC_MSG_RESULT(${crond_dir}) + have_crond="yes" + ], + [ + AC_MSG_RESULT(no) + have_crond="no" + ]) + ], + [ + have_crond="disabled" + ]) +AC_SUBST(have_crond) +AC_SUBST(crond_dir) + +dnl +dnl Where do systemd services go? +dnl +AC_ARG_WITH([systemd_unit_dir], + [AS_HELP_STRING([--with-systemd-unit-dir@<:@=DIR@:>@], + [Install systemd system units into DIR.])], + [], + [with_systemd_unit_dir=yes]) +AS_IF([test "x${with_systemd_unit_dir}" != "xno"], + [ + AS_IF([test "x${with_systemd_unit_dir}" = "xyes"], + [ + PKG_CHECK_MODULES([systemd], [systemd], + [ + with_systemd_unit_dir="$($PKG_CONFIG --variable=systemdsystemunitdir systemd)" + ], [ + with_systemd_unit_dir="" + ]) + m4_pattern_allow([^PKG_(MAJOR|MINOR|BUILD|REVISION)$]) + ]) + AC_MSG_CHECKING([for systemd system unit dir]) + systemd_system_unit_dir="${with_systemd_unit_dir}" + AS_IF([test -n "${systemd_system_unit_dir}"], + [ + AC_MSG_RESULT(${systemd_system_unit_dir}) + have_systemd="yes" + ], + [ + AC_MSG_RESULT(no) + have_systemd="no" + ]) + ], + [ + have_systemd="disabled" + ]) +AC_SUBST(have_systemd) +AC_SUBST(systemd_system_unit_dir) +dnl Adjust the compiled files if we are on windows vs everywhere else +dnl +OS_IO_FILE="" +[case "$host_os" in + mingw*) + OS_IO_FILE=windows_io + ;; + *) + OS_IO_FILE=unix_io + ;; +esac] +AC_SUBST(OS_IO_FILE) + +AC_SYS_LARGEFILE + +dnl +dnl Make our output files, being sure that we create the some miscellaneous +dnl directories +dnl +test -d lib || mkdir lib +test -d include || mkdir include +test -d include/linux || mkdir include/linux +test -d include/asm || mkdir include/asm +if test -z "$UUID_CMT" ; then + uuid_out_list="lib/uuid/Makefile lib/uuid/uuid.pc \ + lib/uuid/uuid_types.h" +fi +if test -z "$BLKID_CMT" ; then + blkid_out_list="lib/blkid/Makefile lib/blkid/blkid.pc \ + lib/blkid/blkid_types.h" +fi +for i in MCONFIG Makefile \ + util/Makefile util/subst.conf util/gen-tarball util/install-symlink \ + lib/et/Makefile lib/ss/Makefile lib/e2p/Makefile \ + lib/ext2fs/Makefile lib/ext2fs/ext2_types.h \ + $uuid_out_list $blkid_out_list lib/support/Makefile \ + lib/ss/ss.pc lib/et/com_err.pc lib/e2p/e2p.pc lib/ext2fs/ext2fs.pc \ + misc/Makefile ext2ed/Makefile e2fsck/Makefile \ + debugfs/Makefile tests/Makefile tests/progs/Makefile \ + tests/fuzz/Makefile resize/Makefile doc/Makefile \ + po/Makefile.in scrub/Makefile; do + if test -d `dirname ${srcdir}/$i` ; then + outlist="$outlist $i" + fi +done +AC_CONFIG_FILES([$outlist]) +AC_OUTPUT +if test -f util/gen-tarball; then chmod +x util/gen-tarball; fi diff --git a/src/_nfdos/e2fsprogs/contrib/Android.bp b/src/_nfdos/e2fsprogs/contrib/Android.bp new file mode 100644 index 0000000..7f9cfe9 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/Android.bp @@ -0,0 +1,28 @@ +// Copyright 2017 The Android Open Source Project + +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "external_e2fsprogs_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-GPL + default_applicable_licenses: ["external_e2fsprogs_license"], +} + +subdirs = ["android"] + +//######################################################################## +// Build add_ext4_encrypt + +cc_binary { + name: "add_ext4_encrypt", + host_supported: true, + defaults: ["e2fsprogs-defaults"], + + srcs: ["add_ext4_encrypt.c"], + shared_libs: [ + "libext2fs", + "libext2_com_err", + ], +} diff --git a/src/_nfdos/e2fsprogs/contrib/add_ext4_encrypt.c b/src/_nfdos/e2fsprogs/contrib/add_ext4_encrypt.c new file mode 100644 index 0000000..133fe25 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/add_ext4_encrypt.c @@ -0,0 +1,64 @@ +/* + * Basic program to add ext4 encryption to a file system + * + * Copyright 2015, Google, Inc. + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU Public + * License. + * %End-Header% + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +int main (int argc, char *argv[]) +{ + errcode_t retval = 0; + ext2_filsys fs; + + setbuf(stdout, NULL); + setbuf(stderr, NULL); + initialize_ext2_error_table(); + + if (argc != 2) { + fprintf(stderr, "%s: Usage \n", argv[0]); + exit(1); + } + + retval = ext2fs_open(argv[1], EXT2_FLAG_RW, 0, 0, + unix_io_manager, &fs); + + if (retval) { + com_err(argv[0], retval, "while trying to open '%s'", + argv[1]); + exit(1); + } + if (!ext2fs_has_feature_encrypt(fs->super)) { + ext2fs_set_feature_encrypt(fs->super); + fs->super->s_encrypt_algos[0] = + EXT4_ENCRYPTION_MODE_AES_256_XTS; + fs->super->s_encrypt_algos[1] = + EXT4_ENCRYPTION_MODE_AES_256_CTS; + ext2fs_mark_super_dirty(fs); + printf("Ext4 encryption enabled on %s\n", argv[1]); + } else + printf("Ext4 encryption already enabled on %s\n", argv[1]); + + retval = ext2fs_close(fs); + if (retval) { + com_err(argv[0], retval, "while trying to close '%s'", + argv[1]); + exit(1); + } + return (0); +} + diff --git a/src/_nfdos/e2fsprogs/contrib/android/Android.bp b/src/_nfdos/e2fsprogs/contrib/android/Android.bp new file mode 100644 index 0000000..6c9dd5c --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/Android.bp @@ -0,0 +1,78 @@ +// Copyright 2017 The Android Open Source Project + +//########################################################################## +// Build e2fsdroid + +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "external_e2fsprogs_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["external_e2fsprogs_license"], +} + +cc_binary { + name: "e2fsdroid", + host_supported: true, + recovery_available: true, + defaults: ["e2fsprogs-defaults"], + + srcs: [ + "e2fsdroid.c", + "block_range.c", + "fsmap.c", + "block_list.c", + "base_fs.c", + "perms.c", + "basefs_allocator.c", + ], + target: { + host: { + static_libs: [ + "libext2_com_err", + "libext2_misc", + "libext2fs", + "libsparse", + "libz", + "libcutils", + "libbase", + "libselinux", + "libcrypto", + "liblog", + ], + }, + android: { + static_libs: [ + "libbase", + ], + shared_libs: [ + "libext2fs", + "libext2_com_err", + "libext2_misc", + "libcutils", + "liblog", + "libselinux", + "libcrypto", + ], + }, + }, + stl: "libc++_static", +} + +//########################################################################## +// Build ext2simg + +cc_binary { + name: "ext2simg", + host_supported: true, + defaults: ["e2fsprogs-defaults"], + + srcs: ["ext2simg.c"], + shared_libs: [ + "libext2fs", + "libext2_com_err", + "libsparse", + "libz", + ], +} diff --git a/src/_nfdos/e2fsprogs/contrib/android/base_fs.c b/src/_nfdos/e2fsprogs/contrib/android/base_fs.c new file mode 100644 index 0000000..d3e00d1 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/base_fs.c @@ -0,0 +1,211 @@ +#include "base_fs.h" +#include + +#define BASE_FS_VERSION "Base EXT4 version 1.0" + +struct base_fs { + FILE *file; + const char *mountpoint; + struct basefs_entry entry; +}; + +static FILE *basefs_open(const char *file) +{ + char *line = NULL; + size_t len; + FILE *f = fopen(file, "r"); + if (!f) + return NULL; + + if (getline(&line, &len, f) == -1 || !line) + goto err_getline; + + if (strncmp(line, BASE_FS_VERSION, strlen(BASE_FS_VERSION))) + goto err_header; + + free(line); + return f; + +err_header: + free(line); +err_getline: + fclose(f); + return NULL; +} + +static struct basefs_entry *basefs_readline(FILE *f, const char *mountpoint, + int *err) +{ + char *line = NULL, *saveptr1, *saveptr2, *block_range, *block; + int offset; + size_t len; + struct basefs_entry *entry = NULL; + blk64_t range_start, range_end; + + if (getline(&line, &len, f) == -1) { + if (feof(f)) + goto end; + goto err_getline; + } + + entry = calloc(1, sizeof(*entry)); + if (!entry) + goto err_alloc; + + /* + * With BASEFS version 1.0, a typical line looks like this: + * /bin/mke2fs 5000-5004,8000,9000-9990 + */ + if (sscanf(line, "%ms%n", &entry->path, &offset) != 1) + goto err_sscanf; + len = strlen(mountpoint); + memmove(entry->path, entry->path + len, strlen(entry->path) - len + 1); + + while (line[offset] == ' ') + ++offset; + + block_range = strtok_r(line + offset, ",\n", &saveptr1); + while (block_range) { + block = strtok_r(block_range, "-", &saveptr2); + if (!block) + break; + range_start = atoll(block); + block = strtok_r(NULL, "-", &saveptr2); + range_end = block ? atoll(block) : range_start; + add_blocks_to_range(&entry->blocks, range_start, range_end); + block_range = strtok_r(NULL, ",\n", &saveptr1); + } +end: + *err = 0; + free(line); + return entry; + +err_sscanf: + free(entry); +err_alloc: + free(line); +err_getline: + *err = 1; + return NULL; +} + +static void free_base_fs_entry(void *e) +{ + struct basefs_entry *entry = e; + if (entry) { + free(entry->path); + free(entry); + } +} + +struct ext2fs_hashmap *basefs_parse(const char *file, const char *mountpoint) +{ + int err; + struct ext2fs_hashmap *entries = NULL; + struct basefs_entry *entry; + FILE *f = basefs_open(file); + if (!f) + return NULL; + entries = ext2fs_hashmap_create(ext2fs_djb2_hash, free_base_fs_entry, 1024); + if (!entries) + goto end; + + while ((entry = basefs_readline(f, mountpoint, &err))) { + err = ext2fs_hashmap_add(entries, entry, entry->path, + strlen(entry->path)); + if (err) { + free_base_fs_entry(entry); + fclose(f); + ext2fs_hashmap_free(entries); + return NULL; + } + } + if (err) { + fclose(f); + ext2fs_hashmap_free(entries); + return NULL; + } +end: + fclose(f); + return entries; +} + +static void *init(const char *file, const char *mountpoint) +{ + struct base_fs *params = malloc(sizeof(*params)); + + if (!params) + return NULL; + params->mountpoint = mountpoint; + params->file = fopen(file, "w+"); + if (!params->file) { + free(params); + return NULL; + } + if (fwrite(BASE_FS_VERSION"\n", 1, strlen(BASE_FS_VERSION"\n"), + params->file) != strlen(BASE_FS_VERSION"\n")) { + fclose(params->file); + free(params); + return NULL; + } + return params; +} + +static int start_new_file(char *path, ext2_ino_t ino EXT2FS_ATTR((unused)), + struct ext2_inode *inode, void *data) +{ + struct base_fs *params = data; + + params->entry.path = LINUX_S_ISREG(inode->i_mode) ? path : NULL; + return 0; +} + +static int add_block(ext2_filsys fs EXT2FS_ATTR((unused)), blk64_t blocknr, + int metadata, void *data) +{ + struct base_fs *params = data; + + if (params->entry.path && !metadata) + add_blocks_to_range(¶ms->entry.blocks, blocknr, blocknr); + return 0; +} + +static int inline_data(void *inline_data EXT2FS_ATTR((unused)), + void *data EXT2FS_ATTR((unused))) +{ + return 0; +} + +static int end_new_file(void *data) +{ + struct base_fs *params = data; + + if (!params->entry.path) + return 0; + if (fprintf(params->file, "%s%s ", params->mountpoint, + params->entry.path) < 0 + || write_block_ranges(params->file, params->entry.blocks.head, ",") + || fwrite("\n", 1, 1, params->file) != 1) + return -1; + + delete_block_ranges(¶ms->entry.blocks); + return 0; +} + +static int cleanup(void *data) +{ + struct base_fs *params = data; + + fclose(params->file); + free(params); + return 0; +} + +struct fsmap_format base_fs_format = { + .init = init, + .start_new_file = start_new_file, + .add_block = add_block, + .inline_data = inline_data, + .end_new_file = end_new_file, + .cleanup = cleanup, +}; diff --git a/src/_nfdos/e2fsprogs/contrib/android/base_fs.h b/src/_nfdos/e2fsprogs/contrib/android/base_fs.h new file mode 100644 index 0000000..f53f1ed --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/base_fs.h @@ -0,0 +1,17 @@ +#ifndef BASE_FS_H +# define BASE_FS_H + +# include "fsmap.h" +# include "hashmap.h" +# include "block_range.h" + +struct basefs_entry { + char *path; + struct block_range_list blocks; +}; + +extern struct fsmap_format base_fs_format; + +struct ext2fs_hashmap *basefs_parse(const char *file, const char *mountpoint); + +#endif /* !BASE_FS_H */ diff --git a/src/_nfdos/e2fsprogs/contrib/android/basefs_allocator.c b/src/_nfdos/e2fsprogs/contrib/android/basefs_allocator.c new file mode 100644 index 0000000..4f9f5c1 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/basefs_allocator.c @@ -0,0 +1,388 @@ +#include +#include +#include +#include "basefs_allocator.h" +#include "block_range.h" +#include "hashmap.h" +#include "base_fs.h" + +struct base_fs_allocator { + struct ext2fs_hashmap *entries; + struct basefs_entry *cur_entry; + /* The next expected logical block to allocate for cur_entry. */ + blk64_t next_lblk; + /* Blocks which are definitely owned by a single inode in BaseFS. */ + ext2fs_block_bitmap exclusive_block_map; + /* Blocks which are available to the first inode that requests it. */ + ext2fs_block_bitmap dedup_block_map; +}; + +static errcode_t basefs_block_allocator(ext2_filsys, blk64_t, blk64_t *, + struct blk_alloc_ctx *ctx); + +/* + * Free any reserved, but unconsumed block ranges in the allocator. This both + * frees the block_range_list data structure and unreserves exclusive blocks + * from the block map. + */ +static void fs_free_blocks_range(ext2_filsys fs, + struct base_fs_allocator *allocator, + struct block_range_list *list) +{ + ext2fs_block_bitmap exclusive_map = allocator->exclusive_block_map; + + blk64_t block; + while (list->head) { + block = consume_next_block(list); + if (ext2fs_test_block_bitmap2(exclusive_map, block)) { + ext2fs_unmark_block_bitmap2(fs->block_map, block); + ext2fs_unmark_block_bitmap2(exclusive_map, block); + } + } +} + +/* + * Free any blocks in the bitmap that were reserved but never used. This is + * needed to free dedup_block_map and ensure the free block bitmap is + * internally consistent. + */ +static void fs_free_blocks_bitmap(ext2_filsys fs, ext2fs_block_bitmap bitmap) +{ + blk64_t block = 0; + blk64_t start = fs->super->s_first_data_block; + blk64_t end = ext2fs_blocks_count(fs->super) - 1; + errcode_t retval; + + for (;;) { + retval = ext2fs_find_first_set_block_bitmap2(bitmap, start, end, + &block); + if (retval) + break; + ext2fs_unmark_block_bitmap2(fs->block_map, block); + start = block + 1; + } +} + +static void basefs_allocator_free(ext2_filsys fs, + struct base_fs_allocator *allocator) +{ + struct basefs_entry *e; + struct ext2fs_hashmap_entry *it = NULL; + struct ext2fs_hashmap *entries = allocator->entries; + + if (entries) { + while ((e = ext2fs_hashmap_iter_in_order(entries, &it))) { + fs_free_blocks_range(fs, allocator, &e->blocks); + delete_block_ranges(&e->blocks); + } + ext2fs_hashmap_free(entries); + } + fs_free_blocks_bitmap(fs, allocator->dedup_block_map); + ext2fs_free_block_bitmap(allocator->exclusive_block_map); + ext2fs_free_block_bitmap(allocator->dedup_block_map); + free(allocator); +} + +/* + * Build a bitmap of which blocks are definitely owned by exactly one file in + * Base FS. Blocks which are not valid or are de-duplicated are skipped. This + * is called during allocator initialization, to ensure that libext2fs does + * not allocate which we want to re-use. + * + * If a block was allocated in the initial filesystem, it can never be re-used, + * so it will appear in neither the exclusive or dedup set. If a block is used + * by multiple files, it will be removed from the owned set and instead added + * to the dedup set. + * + * The dedup set is not removed from fs->block_map. This allows us to re-use + * dedup blocks separately and not have them be allocated outside of file data. + * + * This function returns non-zero if the block was owned, and 0 otherwise. + */ +static int fs_reserve_block(ext2_filsys fs, + struct base_fs_allocator *allocator, + blk64_t block) +{ + ext2fs_block_bitmap exclusive_map = allocator->exclusive_block_map; + ext2fs_block_bitmap dedup_map = allocator->dedup_block_map; + + if (block >= ext2fs_blocks_count(fs->super)) + return 0; + + if (ext2fs_test_block_bitmap2(fs->block_map, block)) { + if (!ext2fs_test_block_bitmap2(exclusive_map, block)) + return 0; + ext2fs_unmark_block_bitmap2(exclusive_map, block); + ext2fs_mark_block_bitmap2(dedup_map, block); + return 0; + } else { + ext2fs_mark_block_bitmap2(fs->block_map, block); + ext2fs_mark_block_bitmap2(exclusive_map, block); + return 1; + } +} + +/* + * Walk the requested block list and reserve blocks, either into the owned + * pool or the dedup pool as appropriate. We stop once the file has enough + * owned blocks to satisfy |file_size|. This allows any extra blocks to be + * re-used, since otherwise a large block movement between files could + * trigger block allocation errors. + */ +static void fs_reserve_blocks_range(ext2_filsys fs, + struct base_fs_allocator *allocator, + struct block_range_list *list, + off_t file_size) +{ + blk64_t block; + off_t blocks_needed; + off_t blocks_acquired = 0; + struct block_range *blocks = list->head; + + blocks_needed = file_size + (fs->blocksize - 1); + blocks_needed /= fs->blocksize; + + while (blocks) { + for (block = blocks->start; block <= blocks->end; block++) { + if (fs_reserve_block(fs, allocator, block)) + blocks_acquired++; + if (blocks_acquired >= blocks_needed) + return; + } + blocks = blocks->next; + } +} + +/* + * For each file in the base FS map, ensure that its blocks are reserved in + * the actual block map. This prevents libext2fs from allocating them for + * general purpose use, and ensures that if the file needs data blocks, they + * can be re-acquired exclusively for that file. + * + * If a file in the base map is missing, or not a regular file in the new + * filesystem, then it's skipped to ensure that its blocks are reusable. + */ +static errcode_t fs_reserve_blocks(ext2_filsys fs, + struct base_fs_allocator *allocator, + const char *src_dir) +{ + int nbytes; + char full_path[PATH_MAX]; + const char *sep = "/"; + struct stat st; + struct basefs_entry *e; + struct ext2fs_hashmap_entry *it = NULL; + struct ext2fs_hashmap *entries = allocator->entries; + + if (strlen(src_dir) && src_dir[strlen(src_dir) - 1] == '/') + sep = ""; + + while ((e = ext2fs_hashmap_iter_in_order(entries, &it))) { + nbytes = snprintf(full_path, sizeof(full_path), "%s%s%s", + src_dir, sep, e->path); + if (nbytes >= sizeof(full_path)) + return ENAMETOOLONG; + if (lstat(full_path, &st) || !S_ISREG(st.st_mode)) + continue; + fs_reserve_blocks_range(fs, allocator, &e->blocks, st.st_size); + } + return 0; +} + +errcode_t base_fs_alloc_load(ext2_filsys fs, const char *file, + const char *mountpoint, const char *src_dir) +{ + errcode_t retval = 0; + struct base_fs_allocator *allocator; + + allocator = calloc(1, sizeof(*allocator)); + if (!allocator) { + retval = ENOMEM; + goto out; + } + + retval = ext2fs_read_bitmaps(fs); + if (retval) + goto err_load; + + allocator->cur_entry = NULL; + allocator->entries = basefs_parse(file, mountpoint); + if (!allocator->entries) { + retval = EIO; + goto err_load; + } + retval = ext2fs_allocate_block_bitmap(fs, "exclusive map", + &allocator->exclusive_block_map); + if (retval) + goto err_load; + retval = ext2fs_allocate_block_bitmap(fs, "dedup map", + &allocator->dedup_block_map); + if (retval) + goto err_load; + + retval = fs_reserve_blocks(fs, allocator, src_dir); + if (retval) + goto err_load; + + /* Override the default allocator */ + fs->get_alloc_block2 = basefs_block_allocator; + fs->priv_data = allocator; + + goto out; + +err_load: + basefs_allocator_free(fs, allocator); +out: + return retval; +} + +/* Try and acquire the next usable block from the Base FS map. */ +static errcode_t get_next_block(ext2_filsys fs, struct base_fs_allocator *allocator, + struct block_range_list* list, blk64_t *ret) +{ + blk64_t block; + ext2fs_block_bitmap exclusive_map = allocator->exclusive_block_map; + ext2fs_block_bitmap dedup_map = allocator->dedup_block_map; + + if (!list->head) + return EXT2_ET_BLOCK_ALLOC_FAIL; + + block = consume_next_block(list); + if (block >= ext2fs_blocks_count(fs->super)) + return EXT2_ET_BLOCK_ALLOC_FAIL; + if (ext2fs_test_block_bitmap2(exclusive_map, block)) { + ext2fs_unmark_block_bitmap2(exclusive_map, block); + *ret = block; + return 0; + } + if (ext2fs_test_block_bitmap2(dedup_map, block)) { + ext2fs_unmark_block_bitmap2(dedup_map, block); + *ret = block; + return 0; + } + return EXT2_ET_BLOCK_ALLOC_FAIL; +} + +/* + * BaseFS lists blocks in logical block order. However, the allocator hook is + * only called if a block needs to be allocated. In the case of a deduplicated + * block, or a hole, the hook is not invoked. This means the next block + * allocation request will be out of sequence. For example, consider if BaseFS + * specifies the following (0 being a hole): + * 1 2 3 0 4 5 + * + * If the new file has a hole at logical block 0, we could accidentally + * shift the entire expected block list as follows: + * 0 1 2 0 3 4 + * + * To account for this, we track the next expected logical block in the + * allocator. If the current request is for a later logical block, we skip and + * free the intermediate physical blocks that would have been allocated. This + * ensures the original block assignment is respected. + */ +static void skip_blocks(ext2_filsys fs, struct base_fs_allocator *allocator, + struct blk_alloc_ctx *ctx) +{ + blk64_t block; + struct block_range_list *list = &allocator->cur_entry->blocks; + ext2fs_block_bitmap exclusive_map = allocator->exclusive_block_map; + + while (list->head && allocator->next_lblk < ctx->lblk) { + block = consume_next_block(list); + if (block >= ext2fs_blocks_count(fs->super)) + continue; + if (ext2fs_test_block_bitmap2(exclusive_map, block)) { + ext2fs_unmark_block_bitmap2(exclusive_map, block); + ext2fs_unmark_block_bitmap2(fs->block_map, block); + } + allocator->next_lblk++; + } +} + +static errcode_t basefs_block_allocator(ext2_filsys fs, blk64_t goal, + blk64_t *ret, struct blk_alloc_ctx *ctx) +{ + errcode_t retval; + struct base_fs_allocator *allocator = fs->priv_data; + struct basefs_entry *e = allocator->cur_entry; + ext2fs_block_bitmap dedup_map = allocator->dedup_block_map; + + if (e && ctx && (ctx->flags & BLOCK_ALLOC_DATA)) { + if (allocator->next_lblk < ctx->lblk) + skip_blocks(fs, allocator, ctx); + allocator->next_lblk = ctx->lblk + 1; + + if (!get_next_block(fs, allocator, &e->blocks, ret)) + return 0; + } + + retval = ext2fs_new_block2(fs, goal, fs->block_map, ret); + if (!retval) { + ext2fs_mark_block_bitmap2(fs->block_map, *ret); + return 0; + } + if (retval != EXT2_ET_BLOCK_ALLOC_FAIL) + return retval; + + /* Try to steal a block from the dedup pool. */ + retval = ext2fs_find_first_set_block_bitmap2(dedup_map, + fs->super->s_first_data_block, + ext2fs_blocks_count(fs->super) - 1, ret); + if (!retval) { + ext2fs_unmark_block_bitmap2(dedup_map, *ret); + return 0; + } + + /* + * As a last resort, take any block from our file's list. This + * risks bloating the diff, but means we are more likely to + * successfully build an image. + */ + while (e->blocks.head) { + if (!get_next_block(fs, allocator, &e->blocks, ret)) + return 0; + } + return EXT2_ET_BLOCK_ALLOC_FAIL; +} + +void base_fs_alloc_cleanup(ext2_filsys fs) +{ + basefs_allocator_free(fs, fs->priv_data); + fs->priv_data = NULL; + fs->get_alloc_block2 = NULL; +} + +errcode_t base_fs_alloc_set_target(ext2_filsys fs, const char *target_path, + const char *name EXT2FS_ATTR((unused)), + ext2_ino_t parent_ino EXT2FS_ATTR((unused)), + ext2_ino_t root EXT2FS_ATTR((unused)), mode_t mode) +{ + struct base_fs_allocator *allocator = fs->priv_data; + + if (mode != S_IFREG) + return 0; + + if (allocator) { + allocator->cur_entry = ext2fs_hashmap_lookup(allocator->entries, + target_path, + strlen(target_path)); + allocator->next_lblk = 0; + } + return 0; +} + +errcode_t base_fs_alloc_unset_target(ext2_filsys fs, + const char *target_path EXT2FS_ATTR((unused)), + const char *name EXT2FS_ATTR((unused)), + ext2_ino_t parent_ino EXT2FS_ATTR((unused)), + ext2_ino_t root EXT2FS_ATTR((unused)), mode_t mode) +{ + struct base_fs_allocator *allocator = fs->priv_data; + + if (!allocator || !allocator->cur_entry || mode != S_IFREG) + return 0; + + fs_free_blocks_range(fs, allocator, &allocator->cur_entry->blocks); + delete_block_ranges(&allocator->cur_entry->blocks); + return 0; +} diff --git a/src/_nfdos/e2fsprogs/contrib/android/basefs_allocator.h b/src/_nfdos/e2fsprogs/contrib/android/basefs_allocator.h new file mode 100644 index 0000000..6d1c65e --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/basefs_allocator.h @@ -0,0 +1,16 @@ +#ifndef BASE_FS_ALLOCATOR_H +# define BASE_FS_ALLOCATOR_H + +# include +# include + +errcode_t base_fs_alloc_load(ext2_filsys fs, const char *file, + const char *mountpoint, const char *src_dir); +void base_fs_alloc_cleanup(ext2_filsys fs); + +errcode_t base_fs_alloc_set_target(ext2_filsys fs, const char *target_path, + const char *name, ext2_ino_t parent_ino, ext2_ino_t root, mode_t mode); +errcode_t base_fs_alloc_unset_target(ext2_filsys fs, const char *target_path, + const char *name, ext2_ino_t parent_ino, ext2_ino_t root, mode_t mode); + +#endif /* !BASE_FS_ALLOCATOR_H */ diff --git a/src/_nfdos/e2fsprogs/contrib/android/block_list.c b/src/_nfdos/e2fsprogs/contrib/android/block_list.c new file mode 100644 index 0000000..63cc1a2 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/block_list.c @@ -0,0 +1,89 @@ +#include "block_list.h" +#include "block_range.h" +#include +#include +#include +#include + +struct block_list { + FILE *f; + const char *mountpoint; + + const char *filename; + struct block_range_list blocks; +}; + +static void *init(const char *file, const char *mountpoint) +{ + struct block_list *params = calloc(1, sizeof(*params)); + + if (!params) + return NULL; + params->mountpoint = mountpoint; + params->f = fopen(file, "w+"); + if (!params->f) { + free(params); + return NULL; + } + return params; +} + +static int start_new_file(char *path, ext2_ino_t ino EXT2FS_ATTR((unused)), + struct ext2_inode *inode EXT2FS_ATTR((unused)), + void *data) +{ + struct block_list *params = data; + + params->filename = LINUX_S_ISREG(inode->i_mode) ? path : NULL; + return 0; +} + +static int add_block(ext2_filsys fs EXT2FS_ATTR((unused)), blk64_t blocknr, + int metadata, void *data) +{ + struct block_list *params = data; + + if (params->filename && !metadata) + add_blocks_to_range(¶ms->blocks, blocknr, blocknr); + return 0; +} + +static int inline_data(void *inline_data EXT2FS_ATTR((unused)), + void *data EXT2FS_ATTR((unused))) +{ + return 0; +} + +static int end_new_file(void *data) +{ + struct block_list *params = data; + + if (!params->filename || !params->blocks.head) + return 0; + if (fprintf(params->f, "%s%s ", params->mountpoint, + params->filename) < 0 + || write_block_ranges(params->f, params->blocks.head, " ") + || fwrite("\n", 1, 1, params->f) != 1) + return -1; + + delete_block_ranges(¶ms->blocks); + return 0; +} + +static int cleanup(void *data) +{ + struct block_list *params = data; + + fclose(params->f); + free(params); + return 0; +} + +struct fsmap_format block_list_format = { + .init = init, + .start_new_file = start_new_file, + .add_block = add_block, + .inline_data = inline_data, + .end_new_file = end_new_file, + .cleanup = cleanup, +}; diff --git a/src/_nfdos/e2fsprogs/contrib/android/block_list.h b/src/_nfdos/e2fsprogs/contrib/android/block_list.h new file mode 100644 index 0000000..47041e4 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/block_list.h @@ -0,0 +1,8 @@ +#ifndef BLOCK_LIST_H +# define BLOCK_LIST_H + +# include "fsmap.h" + +extern struct fsmap_format block_list_format; + +#endif /* !BLOCK_LIST_H */ diff --git a/src/_nfdos/e2fsprogs/contrib/android/block_range.c b/src/_nfdos/e2fsprogs/contrib/android/block_range.c new file mode 100644 index 0000000..0a06882 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/block_range.c @@ -0,0 +1,80 @@ +#define _GNU_SOURCE + +#include "block_range.h" +#include + +struct block_range *new_block_range(blk64_t start, blk64_t end) +{ + struct block_range *range = malloc(sizeof(*range)); + range->start = start; + range->end = end; + range->next = NULL; + return range; +} + +void add_blocks_to_range(struct block_range_list *list, blk64_t blk_start, + blk64_t blk_end) +{ + if (list->head == NULL) + list->head = list->tail = new_block_range(blk_start, blk_end); + else if (list->tail->end + 1 == blk_start) + list->tail->end += (blk_end - blk_start + 1); + else { + struct block_range *range = new_block_range(blk_start, blk_end); + list->tail->next = range; + list->tail = range; + } +} + +static void remove_head(struct block_range_list *list) +{ + struct block_range *next_range = list->head->next; + + free(list->head); + if (next_range == NULL) + list->head = list->tail = NULL; + else + list->head = next_range; +} + +void delete_block_ranges(struct block_range_list *list) +{ + while (list->head) + remove_head(list); +} + +int write_block_ranges(FILE *f, struct block_range *range, + char *sep) +{ + int len; + char *buf; + + while (range) { + if (range->start == range->end) + len = asprintf(&buf, "%llu%s", range->start, sep); + else + len = asprintf(&buf, "%llu-%llu%s", range->start, + range->end, sep); + if (fwrite(buf, 1, len, f) != (size_t)len) { + free(buf); + return -1; + } + free(buf); + range = range->next; + } + + len = strlen(sep); + if (fseek(f, -len, SEEK_CUR) == -len) + return -1; + return 0; +} + +blk64_t consume_next_block(struct block_range_list *list) +{ + blk64_t ret = list->head->start; + + list->head->start += 1; + if (list->head->start > list->head->end) + remove_head(list); + return ret; +} diff --git a/src/_nfdos/e2fsprogs/contrib/android/block_range.h b/src/_nfdos/e2fsprogs/contrib/android/block_range.h new file mode 100644 index 0000000..cf7971e --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/block_range.h @@ -0,0 +1,29 @@ +#ifndef BLOCK_RANGE_H +# define BLOCK_RANGE_H + +# include +# include + +struct block_range { + blk64_t start; + blk64_t end; + struct block_range *next; +}; + +struct block_range_list { + struct block_range *head; + struct block_range *tail; +}; + +void add_blocks_to_range(struct block_range_list *list, blk64_t blk_start, + blk64_t blk_end); +void delete_block_ranges(struct block_range_list *list); +int write_block_ranges(FILE *f, struct block_range *range, char *sep); + +/* + * Given a non-empty range list, return the next block and remove it from the + * list. + */ +blk64_t consume_next_block(struct block_range_list *list); + +#endif /* !BLOCK_RANGE_H */ diff --git a/src/_nfdos/e2fsprogs/contrib/android/e2fsdroid.c b/src/_nfdos/e2fsprogs/contrib/android/e2fsdroid.c new file mode 100644 index 0000000..6e51414 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/e2fsdroid.c @@ -0,0 +1,377 @@ +#define _GNU_SOURCE + +#include "config.h" +#include +#include +#include +#include +#include + +#include "perms.h" +#include "base_fs.h" +#include "block_list.h" +#include "basefs_allocator.h" +#include "create_inode.h" + +#ifndef UID_GID_MAP_MAX_EXTENTS +/* + * The value is defined in linux/user_namspace.h. + * The value is (arbitrarily) 5 in 4.14 and earlier, or 340 in 4.15 and later. + * Here, the bigger value is taken. See also man user_namespace(7). + */ +#define UID_GID_MAP_MAX_EXTENTS 340 +#endif + +static char *prog_name = "e2fsdroid"; +static char *in_file; +static char *block_list; +static char *basefs_out; +static char *basefs_in; +static char *mountpoint = ""; +static time_t fixed_time = -1; +static char *fs_config_file; +static struct selinux_opt seopt_file[8]; +static int max_nr_opt = (int)sizeof(seopt_file) / sizeof(seopt_file[0]); +static char *product_out; +static char *src_dir; +static int android_configure; +static int android_sparse_file = 1; + +static void usage(int ret) +{ + fprintf(stderr, "%s [-B block_list] [-D basefs_out] [-T timestamp]\n" + "\t[-C fs_config] [-S file_contexts] [-p product_out]\n" + "\t[-a mountpoint] [-d basefs_in] [-f src_dir] [-e] [-s]\n" + "\t[-u uid-mapping] [-g gid-mapping] image\n", + prog_name); + exit(ret); +} + +static char *absolute_path(const char *file) +{ + char *ret; + char cwd[PATH_MAX]; + + if (file[0] != '/') { + if (getcwd(cwd, PATH_MAX) == NULL) { + fprintf(stderr, "Failed to getcwd\n"); + exit(EXIT_FAILURE); + } + ret = malloc(strlen(cwd) + 1 + strlen(file) + 1); + if (ret) + sprintf(ret, "%s/%s", cwd, file); + } else + ret = strdup(file); + return ret; +} + +static int parse_ugid_map_entry(char* line, struct ugid_map_entry* result) +{ + char *token, *token_saveptr; + size_t num_tokens; + unsigned int *parsed[] = {&result->child_id, + &result->parent_id, + &result->length}; + for (token = strtok_r(line, " ", &token_saveptr), num_tokens = 0; + token && num_tokens < 3; + token = strtok_r(NULL, " ", &token_saveptr), ++num_tokens) { + char* endptr = NULL; + unsigned long t = strtoul(token, &endptr, 10); + if ((t == ULONG_MAX && errno) || (t > UINT_MAX) || *endptr) { + fprintf(stderr, "Malformed u/gid mapping line\n"); + return 0; + } + *parsed[num_tokens] = (unsigned int) t; + } + if (num_tokens < 3 || strtok_r(NULL, " ", &token_saveptr) != NULL) { + fprintf(stderr, "Malformed u/gid mapping line\n"); + return 0; + } + if (result->child_id + result->length < result->child_id || + result->parent_id + result->length < result->parent_id) { + fprintf(stderr, "u/gid mapping overflow\n"); + return 0; + } + return 1; +} + +/* + * Returns 1 if [begin1, begin1+length1) and [begin2, begin2+length2) have + * overlapping range. Otherwise 0. + */ +static int is_overlapping(unsigned int begin1, unsigned int length1, + unsigned int begin2, unsigned int length2) +{ + unsigned int end1 = begin1 + length1; + unsigned int end2 = begin2 + length2; + return !(end1 <= begin2 || end2 <= begin1); +} + +/* + * Verifies if the given mapping works. + * - Checks if the number of entries is less than or equals to + * UID_GID_MAP_MAX_EXTENTS. + * - Checks if there is no overlapped ranges. + * Returns 1 if valid, otherwise 0. + */ +static int is_valid_ugid_map(const struct ugid_map* mapping) +{ + size_t i, j; + + if (mapping->size > UID_GID_MAP_MAX_EXTENTS) { + fprintf(stderr, "too many u/gid mapping entries\n"); + return 0; + } + + for (i = 0; i < mapping->size; ++i) { + const struct ugid_map_entry *entry1 = &mapping->entries[i]; + for (j = i + 1; j < mapping->size; ++j) { + const struct ugid_map_entry *entry2 = + &mapping->entries[j]; + if (is_overlapping(entry1->child_id, entry1->length, + entry2->child_id, entry2->length)) { + fprintf(stderr, + "Overlapping child u/gid: [%d %d %d]," + " [%d %d %d]\n", + entry1->child_id, entry1->parent_id, + entry1->length, entry2->child_id, + entry2->parent_id, entry2->length); + return 0; + } + if (is_overlapping(entry1->parent_id, entry1->length, + entry2->parent_id, entry2->length)) { + fprintf(stderr, + "Overlapping parent u/gid: [%d %d %d]," + " [%d %d %d]\n", + entry1->child_id, entry1->parent_id, + entry1->length, entry2->child_id, + entry2->parent_id, entry2->length); + return 0; + } + } + } + return 1; +} + +/* + * Parses the UID/GID mapping argument. The argument could be a multi-line + * string (separated by '\n', no trailing '\n' is allowed). Each line must + * contain exact three integer tokens; the first token is |child_id|, + * the second is |parent_id|, and the last is |length| of the mapping range. + * See also user_namespace(7) man page. + * On success, the parsed entries are stored in |result|, and it returns 1. + * Otherwise, returns 0. + */ +static int parse_ugid_map(char* arg, struct ugid_map* result) +{ + int i; + char *line, *line_saveptr; + size_t current_index; + + /* Count the number of lines. */ + result->size = 1; + for (i = 0; arg[i]; ++i) { + if (arg[i] == '\n') + ++result->size; + } + + /* Allocate memory for entries. */ + result->entries = malloc(sizeof(struct ugid_map_entry) * result->size); + if (!result->entries) { + result->size = 0; + return 0; + } + + /* Parse each line */ + for (line = strtok_r(arg, "\n", &line_saveptr), current_index = 0; + line; + line = strtok_r(NULL, "\n", &line_saveptr), ++current_index) { + if (!parse_ugid_map_entry( + line, &result->entries[current_index])) { + return 0; + } + } + + return is_valid_ugid_map(result); +} + +int main(int argc, char *argv[]) +{ + int c; + char *p; + int flags = EXT2_FLAG_RW; + errcode_t retval; + io_manager io_mgr; + ext2_filsys fs = NULL; + struct fs_ops_callbacks fs_callbacks = { NULL, NULL }; + char *token; + int nr_opt = 0; + ext2_ino_t inodes_count; + ext2_ino_t free_inodes_count; + blk64_t blocks_count; + blk64_t free_blocks_count; + struct ugid_map uid_map = { 0, NULL }, gid_map = { 0, NULL }; + + add_error_table(&et_ext2_error_table); + + while ((c = getopt (argc, argv, "T:C:S:p:a:D:d:B:f:esu:g:")) != EOF) { + switch (c) { + case 'T': + fixed_time = strtoul(optarg, &p, 0); + android_configure = 1; + break; + case 'C': + fs_config_file = absolute_path(optarg); + android_configure = 1; + break; + case 'S': + token = strtok(optarg, ","); + while (token) { + if (nr_opt == max_nr_opt) { + fprintf(stderr, "Expected at most %d selinux opts\n", + max_nr_opt); + exit(EXIT_FAILURE); + } + seopt_file[nr_opt].type = SELABEL_OPT_PATH; + seopt_file[nr_opt].value = absolute_path(token); + nr_opt++; + token = strtok(NULL, ","); + } + android_configure = 1; + break; + case 'p': + product_out = absolute_path(optarg); + android_configure = 1; + break; + case 'a': + mountpoint = strdup(optarg); + break; + case 'D': + basefs_out = absolute_path(optarg); + break; + case 'd': + basefs_in = absolute_path(optarg); + break; + case 'B': + block_list = absolute_path(optarg); + break; + case 'f': + src_dir = absolute_path(optarg); + break; + case 'e': + android_sparse_file = 0; + break; + case 's': + flags |= EXT2_FLAG_SHARE_DUP; + break; + case 'u': + if (!parse_ugid_map(optarg, &uid_map)) + exit(EXIT_FAILURE); + android_configure = 1; + break; + case 'g': + if (!parse_ugid_map(optarg, &gid_map)) + exit(EXIT_FAILURE); + android_configure = 1; + break; + default: + usage(EXIT_FAILURE); + } + } + if (optind >= argc) { + fprintf(stderr, "Expected filename after options\n"); + exit(EXIT_FAILURE); + } + + if (android_sparse_file) { + io_mgr = sparse_io_manager; + if (asprintf(&in_file, "(%s)", argv[optind]) == -1) { + fprintf(stderr, "Failed to allocate file name\n"); + exit(EXIT_FAILURE); + } + } else { + io_mgr = unix_io_manager; + in_file = strdup(argv[optind]); + } + retval = ext2fs_open(in_file, flags, 0, 0, io_mgr, &fs); + if (retval) { + com_err(prog_name, retval, "while opening file %s\n", in_file); + return retval; + } + + if (src_dir) { + ext2fs_read_bitmaps(fs); + if (basefs_in) { + retval = base_fs_alloc_load(fs, basefs_in, mountpoint, + src_dir); + if (retval) { + com_err(prog_name, retval, "%s", + "while reading base_fs file"); + exit(1); + } + fs_callbacks.create_new_inode = + base_fs_alloc_set_target; + fs_callbacks.end_create_new_inode = + base_fs_alloc_unset_target; + } + retval = populate_fs2(fs, EXT2_ROOT_INO, src_dir, + EXT2_ROOT_INO, &fs_callbacks); + if (retval) { + com_err(prog_name, retval, "%s", + "while populating file system"); + exit(1); + } + if (basefs_in) + base_fs_alloc_cleanup(fs); + } + + if (android_configure) { + retval = android_configure_fs( + fs, src_dir, product_out, mountpoint, seopt_file, + nr_opt, fs_config_file, fixed_time, &uid_map, &gid_map); + if (retval) { + com_err(prog_name, retval, "%s", + "while configuring the file system"); + exit(1); + } + } + + if (block_list) { + retval = fsmap_iter_filsys(fs, &block_list_format, block_list, + mountpoint); + if (retval) { + com_err(prog_name, retval, "%s", + "while creating the block_list"); + exit(1); + } + } + + if (basefs_out) { + retval = fsmap_iter_filsys(fs, &base_fs_format, + basefs_out, mountpoint); + if (retval) { + com_err(prog_name, retval, "%s", + "while creating the basefs file"); + exit(1); + } + } + + inodes_count = fs->super->s_inodes_count; + free_inodes_count = fs->super->s_free_inodes_count; + blocks_count = ext2fs_blocks_count(fs->super); + free_blocks_count = ext2fs_free_blocks_count(fs->super); + + retval = ext2fs_close_free(&fs); + if (retval) { + com_err(prog_name, retval, "%s", + "while writing superblocks"); + exit(1); + } + + printf("Created filesystem with %u/%u inodes and %llu/%llu blocks\n", + inodes_count - free_inodes_count, inodes_count, + blocks_count - free_blocks_count, blocks_count); + + remove_error_table(&et_ext2_error_table); + return 0; +} diff --git a/src/_nfdos/e2fsprogs/contrib/android/ext2simg.c b/src/_nfdos/e2fsprogs/contrib/android/ext2simg.c new file mode 100644 index 0000000..017e16f --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/ext2simg.c @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +struct { + int crc; + int sparse; + int gzip; + char *in_file; + char *out_file; + bool overwrite_input; +} params = { + .crc = 0, + .sparse = 1, + .gzip = 0, +}; + +#define ext2fs_fatal(Retval, Format, ...) \ + do { \ + com_err("error", Retval, Format, __VA_ARGS__); \ + exit(EXIT_FAILURE); \ + } while(0) + +#define sparse_fatal(Format) \ + do { \ + fprintf(stderr, "sparse: "Format); \ + exit(EXIT_FAILURE); \ + } while(0) + +static void usage(char *path) +{ + char *progname = basename(path); + + fprintf(stderr, "%s [ options ] \n" + " -c include CRC block\n" + " -z gzip output\n" + " -S don't use sparse output format\n", progname); +} + +static struct buf_item { + struct buf_item *next; + void *buf[0]; +} *buf_list; + +static void add_chunk(ext2_filsys fs, struct sparse_file *s, blk_t chunk_start, blk_t chunk_end) +{ + int retval; + unsigned int nb_blk = chunk_end - chunk_start; + size_t len = nb_blk * fs->blocksize; + int64_t offset = (int64_t)chunk_start * (int64_t)fs->blocksize; + + if (params.overwrite_input == false) { + if (sparse_file_add_file(s, params.in_file, offset, len, chunk_start) < 0) + sparse_fatal("adding data to the sparse file"); + } else { + /* + * The input file will be overwritten, make a copy of + * the blocks + */ + struct buf_item *bi = calloc(1, sizeof(struct buf_item) + len); + if (buf_list == NULL) + buf_list = bi; + else { + bi->next = buf_list; + buf_list = bi; + } + + retval = io_channel_read_blk64(fs->io, chunk_start, nb_blk, bi->buf); + if (retval < 0) + ext2fs_fatal(retval, "reading block %u - %u", chunk_start, chunk_end); + + if (sparse_file_add_data(s, bi->buf, len, chunk_start) < 0) + sparse_fatal("adding data to the sparse file"); + } +} + +static void free_chunks(void) +{ + struct buf_item *bi; + + while (buf_list) { + bi = buf_list->next; + free(buf_list); + buf_list = bi; + } +} + +static struct sparse_file *ext_to_sparse(const char *in_file) +{ + errcode_t retval; + ext2_filsys fs; + struct sparse_file *s; + int64_t chunk_start = -1; + blk_t first_blk, last_blk, nb_blk, cur_blk; + + retval = ext2fs_open(in_file, 0, 0, 0, unix_io_manager, &fs); + if (retval) + ext2fs_fatal(retval, "while reading %s", in_file); + + retval = ext2fs_read_block_bitmap(fs); + if (retval) + ext2fs_fatal(retval, "while reading block bitmap of %s", in_file); + + first_blk = ext2fs_get_block_bitmap_start2(fs->block_map); + last_blk = ext2fs_get_block_bitmap_end2(fs->block_map); + nb_blk = last_blk - first_blk + 1; + + s = sparse_file_new(fs->blocksize, (uint64_t)fs->blocksize * (uint64_t)nb_blk); + if (!s) + sparse_fatal("creating sparse file"); + + /* + * The sparse format encodes the size of a chunk (and its header) in a + * 32-bit unsigned integer (UINT32_MAX) + * When writing the chunk, the library uses a single call to write(). + * Linux's implementation of the 'write' syscall does not allow transfers + * larger than INT32_MAX (32-bit _and_ 64-bit systems). + * Make sure we do not create chunks larger than this limit. + */ + int64_t max_blk_per_chunk = (INT32_MAX - 12) / fs->blocksize; + + /* Iter on the blocks to merge contiguous chunk */ + for (cur_blk = first_blk; cur_blk <= last_blk; ++cur_blk) { + if (ext2fs_test_block_bitmap2(fs->block_map, cur_blk)) { + if (chunk_start == -1) { + chunk_start = cur_blk; + } else if (cur_blk - chunk_start + 1 == max_blk_per_chunk) { + add_chunk(fs, s, chunk_start, cur_blk); + chunk_start = -1; + } + } else if (chunk_start != -1) { + add_chunk(fs, s, chunk_start, cur_blk); + chunk_start = -1; + } + } + if (chunk_start != -1) + add_chunk(fs, s, chunk_start, cur_blk - 1); + + ext2fs_free(fs); + return s; +} + +static bool same_file(const char *in, const char *out) +{ + struct stat st1, st2; + + if (access(out, F_OK) == -1) + return false; + + if (lstat(in, &st1) == -1) + ext2fs_fatal(errno, "stat %s\n", in); + if (lstat(out, &st2) == -1) + ext2fs_fatal(errno, "stat %s\n", out); + return st1.st_ino == st2.st_ino; +} + +int main(int argc, char *argv[]) +{ + int opt; + int out_fd; + struct sparse_file *s; + + while ((opt = getopt(argc, argv, "czS")) != -1) { + switch(opt) { + case 'c': + params.crc = 1; + break; + case 'z': + params.gzip = 1; + break; + case 'S': + params.sparse = 0; + break; + default: + usage(argv[0]); + exit(EXIT_FAILURE); + } + } + if (optind + 1 >= argc) { + usage(argv[0]); + exit(EXIT_FAILURE); + } + params.in_file = strdup(argv[optind++]); + params.out_file = strdup(argv[optind]); + params.overwrite_input = same_file(params.in_file, params.out_file); + + s = ext_to_sparse(params.in_file); + + out_fd = open(params.out_file, O_WRONLY | O_CREAT | O_TRUNC, 0664); + if (out_fd == -1) + ext2fs_fatal(errno, "opening %s\n", params.out_file); + if (sparse_file_write(s, out_fd, params.gzip, params.sparse, params.crc) < 0) + sparse_fatal("writing sparse file"); + + sparse_file_destroy(s); + + free(params.in_file); + free(params.out_file); + free_chunks(); + close(out_fd); + + return 0; +} diff --git a/src/_nfdos/e2fsprogs/contrib/android/fsmap.c b/src/_nfdos/e2fsprogs/contrib/android/fsmap.c new file mode 100644 index 0000000..9ee8472 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/fsmap.c @@ -0,0 +1,169 @@ +#include "fsmap.h" +#include +#include +#include +#include +#include "support/nls-enable.h" + +struct walk_ext_priv_data { + char *path; + ext2_filsys fs; + struct fsmap_format *format; +}; + +static int walk_block(ext2_filsys fs EXT2FS_ATTR((unused)), blk64_t *blocknr, + e2_blkcnt_t blockcnt, + blk64_t ref64_blk EXT2FS_ATTR((unused)), + int ref_offset EXT2FS_ATTR((unused)), + void *priv) +{ + struct walk_ext_priv_data *pdata = priv; + struct fsmap_format *format = pdata->format; + + return format->add_block(fs, *blocknr, blockcnt < 0, format->private); +} + +static errcode_t ino_iter_extents(ext2_filsys fs, ext2_ino_t ino, + ext2_extent_handle_t extents, + struct walk_ext_priv_data *pdata) +{ + blk64_t block; + errcode_t retval; + blk64_t next_lblk = 0; + int op = EXT2_EXTENT_ROOT; + struct ext2fs_extent extent; + struct fsmap_format *format = pdata->format; + + for (;;) { + retval = ext2fs_extent_get(extents, op, &extent); + if (retval) + break; + + op = EXT2_EXTENT_NEXT; + + if ((extent.e_flags & EXT2_EXTENT_FLAGS_SECOND_VISIT) || + !(extent.e_flags & EXT2_EXTENT_FLAGS_LEAF)) + continue; + + for (; next_lblk < extent.e_lblk; next_lblk++) + format->add_block(fs, 0, 0, format->private); + + block = extent.e_pblk; + for (; next_lblk < extent.e_lblk + extent.e_len; next_lblk++) + format->add_block(fs, block++, 0, format->private); + } + + if (retval == EXT2_ET_EXTENT_NO_NEXT) + retval = 0; + if (retval) { + com_err(__func__, retval, ("getting extents of ino \"%u\""), + ino); + } + return retval; +} + +static errcode_t ino_iter_blocks(ext2_filsys fs, ext2_ino_t ino, + struct walk_ext_priv_data *pdata) +{ + errcode_t retval; + struct ext2_inode inode; + ext2_extent_handle_t extents; + struct fsmap_format *format = pdata->format; + + retval = ext2fs_read_inode(fs, ino, &inode); + if (retval) + return retval; + + if (!ext2fs_inode_has_valid_blocks2(fs, &inode)) + return format->inline_data(&(inode.i_block[0]), + format->private); + + retval = ext2fs_extent_open(fs, ino, &extents); + if (retval == EXT2_ET_INODE_NOT_EXTENT) { + retval = ext2fs_block_iterate3(fs, ino, BLOCK_FLAG_READ_ONLY, + NULL, walk_block, pdata); + if (retval) { + com_err(__func__, retval, _("listing blocks of ino \"%u\""), + ino); + } + return retval; + } + + retval = ino_iter_extents(fs, ino, extents, pdata); + + ext2fs_extent_free(extents); + return retval; +} + +static int is_dir(ext2_filsys fs, ext2_ino_t ino) +{ + struct ext2_inode inode; + + if (ext2fs_read_inode(fs, ino, &inode)) + return 0; + return S_ISDIR(inode.i_mode); +} + +static int walk_ext_dir(ext2_ino_t dir EXT2FS_ATTR((unused)), + int flags EXT2FS_ATTR((unused)), + struct ext2_dir_entry *de, + int offset EXT2FS_ATTR((unused)), + int blocksize EXT2FS_ATTR((unused)), + char *buf EXT2FS_ATTR((unused)), void *priv_data) +{ + errcode_t retval; + struct ext2_inode inode; + char *filename, *cur_path, *name = de->name; + int name_len = de->name_len & 0xff; + struct walk_ext_priv_data *pdata = priv_data; + struct fsmap_format *format = pdata->format; + + if (!strncmp(name, ".", name_len) + || !strncmp(name, "..", name_len) + || !strncmp(name, "lost+found", 10)) + return 0; + + if (asprintf(&filename, "%s/%.*s", pdata->path, name_len, name) < 0) + return -ENOMEM; + + retval = ext2fs_read_inode(pdata->fs, de->inode, &inode); + if (retval) { + com_err(__func__, retval, _("reading ino \"%u\""), de->inode); + goto end; + } + format->start_new_file(filename, de->inode, &inode, format->private); + retval = ino_iter_blocks(pdata->fs, de->inode, pdata); + if (retval) + return retval; + format->end_new_file(format->private); + + retval = 0; + if (is_dir(pdata->fs, de->inode)) { + cur_path = pdata->path; + pdata->path = filename; + retval = ext2fs_dir_iterate2(pdata->fs, de->inode, 0, NULL, + walk_ext_dir, pdata); + pdata->path = cur_path; + } + +end: + free(filename); + return retval; +} + +errcode_t fsmap_iter_filsys(ext2_filsys fs, struct fsmap_format *format, + const char *file, const char *mountpoint) +{ + struct walk_ext_priv_data pdata; + errcode_t retval; + + format->private = format->init(file, mountpoint); + pdata.fs = fs; + pdata.path = ""; + pdata.format = format; + + retval = ext2fs_dir_iterate2(fs, EXT2_ROOT_INO, 0, NULL, walk_ext_dir, &pdata); + + format->cleanup(format->private); + return retval; +} diff --git a/src/_nfdos/e2fsprogs/contrib/android/fsmap.h b/src/_nfdos/e2fsprogs/contrib/android/fsmap.h new file mode 100644 index 0000000..9f84a71 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/fsmap.h @@ -0,0 +1,29 @@ +#ifndef FSMAP_H +# define FSMAP_H + +# ifndef _GNU_SOURCE +# define _GNU_SOURCE // asprintf +# endif +# include +# include +# include +# include +# include + +struct fsmap_format { + void* (* init)(const char *file, const char *mountpoint); + int (* start_new_file)(char *path, ext2_ino_t ino, + struct ext2_inode *inode, void *data); + int (* add_block)(ext2_filsys fs, blk64_t blocknr, int metadata, + void *data); + int (* inline_data)(void *inline_data, void *data); + int (* end_new_file)(void *data); + int (* cleanup)(void *data); + + void *private; +}; + +errcode_t fsmap_iter_filsys(ext2_filsys fs, struct fsmap_format *format, + const char *file, const char *mountpoint); + +#endif /* !FSMAP_H */ diff --git a/src/_nfdos/e2fsprogs/contrib/android/perms.c b/src/_nfdos/e2fsprogs/contrib/android/perms.c new file mode 100644 index 0000000..dd05644 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/perms.c @@ -0,0 +1,376 @@ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE //asprintf +#endif +#include "config.h" +#include "perms.h" +#include "support/nls-enable.h" +#include +#include + +#ifndef XATTR_SELINUX_SUFFIX +# define XATTR_SELINUX_SUFFIX "selinux" +#endif +#ifndef XATTR_CAPS_SUFFIX +# define XATTR_CAPS_SUFFIX "capability" +#endif + +struct inode_params { + ext2_filsys fs; + char *path; + char *filename; + char *src_dir; + char *target_out; + char *mountpoint; + fs_config_f fs_config_func; + struct selabel_handle *sehnd; + time_t fixed_time; + const struct ugid_map* uid_map; + const struct ugid_map* gid_map; + errcode_t error; +}; + +static errcode_t ino_add_xattr(ext2_filsys fs, ext2_ino_t ino, const char *name, + const void *value, int value_len) +{ + errcode_t retval, close_retval; + struct ext2_xattr_handle *xhandle; + + retval = ext2fs_xattrs_open(fs, ino, &xhandle); + if (retval) { + com_err(__func__, retval, _("while opening inode %u"), ino); + return retval; + } + retval = ext2fs_xattrs_read(xhandle); + if (retval) { + com_err(__func__, retval, + _("while reading xattrs of inode %u"), ino); + goto xattrs_close; + } + retval = ext2fs_xattr_set(xhandle, name, value, value_len); + if (retval) { + com_err(__func__, retval, + _("while setting xattrs of inode %u"), ino); + goto xattrs_close; + } +xattrs_close: + close_retval = ext2fs_xattrs_close(&xhandle); + if (close_retval) { + com_err(__func__, close_retval, + _("while closing xattrs of inode %u"), ino); + return retval ? retval : close_retval; + } + return retval; +} + +static errcode_t set_selinux_xattr(ext2_filsys fs, ext2_ino_t ino, + struct inode_params *params) +{ + errcode_t retval; + char *secontext = NULL; + struct ext2_inode inode; + + if (params->sehnd == NULL) + return 0; + + retval = ext2fs_read_inode(fs, ino, &inode); + if (retval) { + com_err(__func__, retval, + _("while reading inode %u"), ino); + return retval; + } + + retval = selabel_lookup(params->sehnd, &secontext, params->filename, + inode.i_mode); + if (retval < 0) { + int saved_errno = errno; + com_err(__func__, errno, + _("searching for label \"%s\""), params->filename); + return saved_errno; + } + + retval = ino_add_xattr(fs, ino, "security." XATTR_SELINUX_SUFFIX, + secontext, strlen(secontext) + 1); + + freecon(secontext); + return retval; +} + +/* + * Returns mapped UID/GID if there is a corresponding entry in |mapping|. + * Otherwise |id| as is. + */ +static unsigned int resolve_ugid(const struct ugid_map* mapping, + unsigned int id) +{ + size_t i; + for (i = 0; i < mapping->size; ++i) { + const struct ugid_map_entry* entry = &mapping->entries[i]; + if (entry->parent_id <= id && + id < entry->parent_id + entry->length) { + return id + entry->child_id - entry->parent_id; + } + } + + /* No entry is found. */ + return id; +} + +static errcode_t set_perms_and_caps(ext2_filsys fs, ext2_ino_t ino, + struct inode_params *params) +{ + errcode_t retval; + uint64_t capabilities = 0; + struct ext2_inode inode; + struct vfs_cap_data cap_data; + unsigned int uid = 0, gid = 0, imode = 0; + + retval = ext2fs_read_inode(fs, ino, &inode); + if (retval) { + com_err(__func__, retval, _("while reading inode %u"), ino); + return retval; + } + + /* Permissions */ + if (params->fs_config_func != NULL) { + const char *filename = params->filename; + if (strcmp(filename, params->mountpoint) == 0) { + /* The root of the filesystem needs to be an empty string. */ + filename = ""; + } + params->fs_config_func(filename, S_ISDIR(inode.i_mode), + params->target_out, &uid, &gid, &imode, + &capabilities); + uid = resolve_ugid(params->uid_map, uid); + gid = resolve_ugid(params->gid_map, gid); + inode.i_uid = (__u16) uid; + inode.i_gid = (__u16) gid; + ext2fs_set_i_uid_high(inode, (__u16) (uid >> 16)); + ext2fs_set_i_gid_high(inode, (__u16) (gid >> 16)); + inode.i_mode = (inode.i_mode & S_IFMT) | (imode & 0xffff); + retval = ext2fs_write_inode(fs, ino, &inode); + if (retval) { + com_err(__func__, retval, + _("while writing inode %u"), ino); + return retval; + } + } + + /* Capabilities */ + if (!capabilities) + return 0; + memset(&cap_data, 0, sizeof(cap_data)); + cap_data.magic_etc = VFS_CAP_REVISION_2 | VFS_CAP_FLAGS_EFFECTIVE; + cap_data.data[0].permitted = (uint32_t) (capabilities & 0xffffffff); + cap_data.data[1].permitted = (uint32_t) (capabilities >> 32); + return ino_add_xattr(fs, ino, "security." XATTR_CAPS_SUFFIX, + &cap_data, sizeof(cap_data)); +} + +static errcode_t set_timestamp(ext2_filsys fs, ext2_ino_t ino, + struct inode_params *params) +{ + errcode_t retval; + struct ext2_inode inode; + struct stat stat; + char *src_filename = NULL; + + retval = ext2fs_read_inode(fs, ino, &inode); + if (retval) { + com_err(__func__, retval, + _("while reading inode %u"), ino); + return retval; + } + + if (params->fixed_time == -1 && params->src_dir) { + /* replace mountpoint from filename with src_dir */ + if (asprintf(&src_filename, "%s/%s", params->src_dir, + params->filename + strlen(params->mountpoint)) < 0) { + return -ENOMEM; + } + retval = lstat(src_filename, &stat); + if (retval < 0) { + com_err(__func__, errno, + _("while lstat file %s"), src_filename); + goto end; + } + inode.i_atime = inode.i_ctime = inode.i_mtime = stat.st_mtime; + } else { + inode.i_atime = inode.i_ctime = inode.i_mtime = params->fixed_time; + } + + retval = ext2fs_write_inode(fs, ino, &inode); + if (retval) { + com_err(__func__, retval, + _("while writing inode %u"), ino); + goto end; + } + +end: + free(src_filename); + return retval; +} + +static int is_dir(ext2_filsys fs, ext2_ino_t ino) +{ + struct ext2_inode inode; + + if (ext2fs_read_inode(fs, ino, &inode)) + return 0; + return S_ISDIR(inode.i_mode); +} + +static errcode_t androidify_inode(ext2_filsys fs, ext2_ino_t ino, + struct inode_params *params) +{ + errcode_t retval; + + retval = set_timestamp(fs, ino, params); + if (retval) + return retval; + + retval = set_selinux_xattr(fs, ino, params); + if (retval) + return retval; + + return set_perms_and_caps(fs, ino, params); +} + +static int walk_dir(ext2_ino_t dir EXT2FS_ATTR((unused)), + int flags EXT2FS_ATTR((unused)), + struct ext2_dir_entry *de, + int offset EXT2FS_ATTR((unused)), + int blocksize EXT2FS_ATTR((unused)), + char *buf EXT2FS_ATTR((unused)), void *priv_data) +{ + __u16 name_len; + errcode_t retval; + struct inode_params *params = (struct inode_params *)priv_data; + + name_len = de->name_len & 0xff; + if (!strncmp(de->name, ".", name_len) + || (!strncmp(de->name, "..", name_len))) + return 0; + + if (asprintf(¶ms->filename, "%s/%.*s", params->path, name_len, + de->name) < 0) { + params->error = ENOMEM; + return -ENOMEM; + } + + if (!strncmp(de->name, "lost+found", 10)) { + retval = set_selinux_xattr(params->fs, de->inode, params); + if (retval) + goto end; + } else { + retval = androidify_inode(params->fs, de->inode, params); + if (retval) + goto end; + if (is_dir(params->fs, de->inode)) { + char *cur_path = params->path; + char *cur_filename = params->filename; + params->path = params->filename; + retval = ext2fs_dir_iterate2(params->fs, de->inode, 0, NULL, + walk_dir, params); + if (retval) + goto end; + params->path = cur_path; + params->filename = cur_filename; + } + } + +end: + free(params->filename); + params->error |= retval; + return retval; +} + +errcode_t __android_configure_fs(ext2_filsys fs, char *src_dir, + char *target_out, + char *mountpoint, + fs_config_f fs_config_func, + struct selabel_handle *sehnd, + time_t fixed_time, + const struct ugid_map* uid_map, + const struct ugid_map* gid_map) +{ + errcode_t retval; + struct inode_params params = { + .fs = fs, + .src_dir = src_dir, + .target_out = target_out, + .fs_config_func = fs_config_func, + .sehnd = sehnd, + .fixed_time = fixed_time, + .path = mountpoint, + .filename = mountpoint, + .mountpoint = mountpoint, + .uid_map = uid_map, + .gid_map = gid_map, + .error = 0 + }; + + /* walk_dir will add the "/". Don't add it twice. */ + if (strlen(mountpoint) == 1 && mountpoint[0] == '/') + params.path = ""; + + retval = androidify_inode(fs, EXT2_ROOT_INO, ¶ms); + if (retval) + return retval; + + retval = ext2fs_dir_iterate2(fs, EXT2_ROOT_INO, 0, NULL, walk_dir, + ¶ms); + if (retval) + return retval; + return params.error; +} + +errcode_t android_configure_fs(ext2_filsys fs, char *src_dir, char *target_out, + char *mountpoint, + struct selinux_opt *seopts EXT2FS_ATTR((unused)), + unsigned int nopt EXT2FS_ATTR((unused)), + char *fs_config_file, time_t fixed_time, + const struct ugid_map* uid_map, + const struct ugid_map* gid_map) +{ + errcode_t retval; + fs_config_f fs_config_func = NULL; + struct selabel_handle *sehnd = NULL; + + /* Retrieve file contexts */ +#if !defined(__ANDROID__) + if (nopt > 0) { + sehnd = selabel_open(SELABEL_CTX_FILE, seopts, nopt); + if (!sehnd) { + int saved_errno = errno; + com_err(__func__, errno, + _("while opening file contexts \"%s\""), + seopts[0].value); + return saved_errno; + } + } +#else + sehnd = selinux_android_file_context_handle(); + if (!sehnd) { + com_err(__func__, EINVAL, + _("while opening android file_contexts")); + return EINVAL; + } +#endif + + /* Load the FS config */ + if (fs_config_file) { + retval = load_canned_fs_config(fs_config_file); + if (retval < 0) { + com_err(__func__, retval, + _("while loading fs_config \"%s\""), + fs_config_file); + return retval; + } + fs_config_func = canned_fs_config; + } else if (mountpoint) + fs_config_func = fs_config; + + return __android_configure_fs(fs, src_dir, target_out, mountpoint, + fs_config_func, sehnd, fixed_time, + uid_map, gid_map); +} diff --git a/src/_nfdos/e2fsprogs/contrib/android/perms.h b/src/_nfdos/e2fsprogs/contrib/android/perms.h new file mode 100644 index 0000000..9ea3f95 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/android/perms.h @@ -0,0 +1,65 @@ +#ifndef ANDROID_PERMS_H +# define ANDROID_PERMS_H + +# include + +typedef void (*fs_config_f)(const char *path, int dir, + const char *target_out_path, + unsigned *uid, unsigned *gid, + unsigned *mode, uint64_t *capabilities); + +/* + * Represents a range of UID/GID mapping. + * This maps the id in [|parent_id|, |parent_id| + |length|) into + * [|child_id|, |child_id| + |length|) + */ +struct ugid_map_entry { + unsigned int child_id; + unsigned int parent_id; + unsigned int length; +}; + +struct ugid_map { + /* The number of elements in |entries|. */ + size_t size; + + /* An array of entries. If |size| is 0, this is a null pointer. */ + struct ugid_map_entry* entries; +}; + +# ifdef _WIN32 +struct selabel_handle; +static inline errcode_t android_configure_fs(ext2_filsys fs, + char *src_dir, + char *target_out, + char *mountpoint, + void *seopts, + unsigned int nopt, + char *fs_config_file, + time_t fixed_time, + const struct ugid_map* uid_map, + const struct ugdi_map* gid_map) +{ + return 0; +} +# else +# include +# include +# if defined(__ANDROID__) +# include +# endif +# include +# include +# include + +errcode_t android_configure_fs(ext2_filsys fs, char *src_dir, + char *target_out, + char *mountpoint, + struct selinux_opt *seopts, + unsigned int nopt, + char *fs_config_file, time_t fixed_time, + const struct ugid_map* uid_map, + const struct ugid_map* gid_map); + +# endif +#endif /* !ANDROID_PERMS_H */ diff --git a/src/_nfdos/e2fsprogs/contrib/build-rpm b/src/_nfdos/e2fsprogs/contrib/build-rpm new file mode 100644 index 0000000..0b06071 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/build-rpm @@ -0,0 +1,45 @@ +#!/bin/sh + +# enable xtrace output if requested +if [ -n ${ENABLE_XTRACE:-''} ]; then + set -x +fi + +# Build an e2fsprogs RPM from cvs + +pwd=`pwd` +currdir=`basename $pwd` +pkgname=`grep Name: e2fsprogs.spec | awk '{print $2;}'` +pkgvers=`grep Version: e2fsprogs.spec | awk '{print $2;}'` +builddir=${pkgname}-${pkgvers} + +# ensure that $TMP is set to something +TMP=${TMP:-'/tmp'} + +cd .. +tmpdir=`mktemp -d ${RPM_TMPDIR:-$TMP}/rpmtmp.XXXXXX` + +# We need to build a tarball for the SRPM using $builddir as the +# directory name (since that's what RPM will expect it to unpack +# into). That may require a symlink. + +# Make a recursive-symlink copy of the source dir +cp -sR `pwd`/$currdir $tmpdir/$builddir || exit 1 + +# Remove any build files from the temporary tarball directory +[ -f $tmpdir/$builddir/Makefile ] && make -C $tmpdir/$builddir distclean + +EXCLUDE="--exclude .hg* --exclude .pc*" +(cd $tmpdir && tar czfh ${builddir}.tar.gz $EXCLUDE $builddir) + +[ "`rpmbuild --version 2> /dev/null`" ] && RPM=rpmbuild || RPM=rpm + +$RPM --define "_sourcedir $tmpdir" \ + --define "_topdir ${RPM_TOPDIR:-$(rpm -E %_topdir)}" \ + --define "_tmpdir ${RPM_TMPDIR:-$TMP}" \ + --define "extra_config_flags ${EXTRA_CONFIG_FLAGS:-''}" \ + -ba $currdir/e2fsprogs.spec + +rpm_exit=$? +rm -rf $tmpdir +exit $rpm_exit diff --git a/src/_nfdos/e2fsprogs/contrib/dconf b/src/_nfdos/e2fsprogs/contrib/dconf new file mode 100644 index 0000000..cef4cc6 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/dconf @@ -0,0 +1,118 @@ +#!/bin/sh +#$Id$ +# Create Adobe-PostScript file that graphically displays the output of +# dumpe2fs(8). Use "dumpe2fs | dconf" to create a PostScript file on stdout. +# Developed and tested for Linux 1.0. +# Copyright (c) 1994 +# Ulrich Windl +# ALte Regensburger Strasse 11a +# D-93149 Nittenau, Germany +# +SELF=`basename $0` +AWKFILE=/tmp/${SELF}.awk +TEMPFILE=/tmp/${SELF}.tmp +echo ' +BEGIN { + print "B" +} +/^Inode count:/ { + ic=$3; next +} +/^Block count:/ { + bc=$3; next +} +/^First block:/ { + fb=$3; next +} +/^Block size:/ { + bs=$3; next +} +/^Blocks per group:/ { + bpg=$4 + printf("BC %d\n", bpg) + printf("GC %d\n", (bc + bpg - 1) / bpg) + next +} +/^Inodes per group:/ { + ipg=$4; next +} +/^Last write time:/ { + lwtime=$0; gsub("Last write time:[ ]+", "", lwtime) + printf("T %s\n", lwtime) + next +} +/^Group [0-9]+:/ { + group=$2; gsub(":", "", group) + block="" + group_start=group*bpg+fb + group_end=group_start+bpg + printf("G %d : %d - %d\n", group, group_start, group_end) + next +} +/^[ ]+Free blocks: / { + for ( i=3; i < NF; ++i ) { + block=$i; gsub(",", "", block) + if ( index(block, "-") == 0 ) block=block "-" block + pos=index(block, "-") + printf("FB %d-%d\n", + substr(block, 0, pos) - group_start, + substr(block, pos + 1) - group_start) + } + if ( block == "" ) printf("Group %d is full\n", group) + print "----" + next +} +END { + printf("E %s\n", lwtime) +}' >$AWKFILE +awk -f $AWKFILE $* >$TEMPFILE +echo ' +BEGIN { + printf("%%!PS-Adobe\n") + printf("%%%%BoundingBox: 0 0 1 1\n") + printf("/rect {/y2 exch def /x2 exch def /y1 exch def /x1 exch def\n") + printf(" newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto\n") + printf(" x1 y2 lineto closepath} def\n") + printf("/fb {rect gsave 1.0 setgray fill grestore} def\n") + printf("/dg {rect gsave gsave 0.0 setgray fill grestore\n") + printf(" 0.5 setgray stroke grestore} def\n") + printf("/textxy {moveto show} bind def\n") + printf("0.0001 setlinewidth\n") +} +$1 == "GC" && NF == 2 { + number_of_groups=$2 + printf("/Times-Roman findfont %g scalefont setfont\n", + 1.0 / number_of_groups) + next +} +$1 == "BC" && NF == 2 { + blocks_per_group=$2; next +} +$1 == "T" && NF > 1 { + printf("(%s) %g %g textxy\n", + substr($0, 2), 0, 1.02) + next +} +$1 == "G" && NF == 6 && $3 == ":" && $5 == "-" { + group_index=$2 + gs=$4 + ge=$6 + height=1.0 / number_of_groups + vstart=group_index * height + printf("%% group %d of %d:\n0 %g 1 %g dg\n", + group_index, number_of_groups, vstart, vstart + height) + printf("(Group %s) 1.02 %g textxy\n", group_index, vstart) + next +} +$1 == "FB" && NF == 2 { + pos = index($2, "-") + printf("%% hole %s\n%g %g %g %g fb\n", + $2, substr($2, 0, pos) / blocks_per_group, vstart, + (substr($2, pos + 1) + 1) / blocks_per_group, vstart + height) + next +} +END { + printf("%%%%EOF\n") +} +' >$AWKFILE +awk -f $AWKFILE $TEMPFILE diff --git a/src/_nfdos/e2fsprogs/contrib/dir2fs b/src/_nfdos/e2fsprogs/contrib/dir2fs new file mode 100755 index 0000000..abcecb3 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/dir2fs @@ -0,0 +1,66 @@ +#!/bin/sh + +dir="$1" +dev="$2" + +if [ "$1" = "--help" ] || [ ! -d "${dir}" ]; then + echo "Usage: $0 dir [mke2fs args] dev" + exit 1 +fi + +shift + +# Goal: Put all the files at the beginning (which mke2fs does) and minimize +# the number of free inodes given the minimum number of blocks required. +# Hence all this math to get the inode ratio just right. + +bytes="$(du -ks "${dir}" | awk '{print $1}')" +bytes="$((bytes * 1024))" +inodes="$(find "${dir}" -print0 | xargs -0 stat -c '%i' | sort -g | uniq | wc -l)" +block_sz=4096 +inode_sz=256 +sb_overhead=4096 +blocks_per_group="$((block_sz * 8))" +bytes_per_group="$((blocks_per_group * block_sz))" +inode_bytes="$((inodes * inode_sz))" + +# Estimate overhead with the minimum number of groups... +nr_groups="$(( (bytes + inode_bytes + bytes_per_group - 1) / bytes_per_group))" +inode_bytes_per_group="$((inode_bytes / nr_groups))" +inode_blocks_per_group="$(( (inode_bytes_per_group + (block_sz - 1)) / block_sz ))" +per_grp_overhead="$(( ((3 + inode_blocks_per_group) * block_sz) + 64 ))" +overhead="$(( sb_overhead + (per_grp_overhead * nr_groups) ))" +used_bytes="$((bytes + overhead))" + +# Then do it again with the real number of groups. +nr_groups="$(( (used_bytes + (bytes_per_group - 1)) / bytes_per_group))" +tot_blocks="$((nr_groups * blocks_per_group))" +tot_bytes="$((tot_blocks * block_sz))" + +ratio="$((bytes / inodes))" +mkfs_blocks="$((tot_blocks * 4 / 3))" + +mke2fs -i "${ratio}" -T ext4 -d "${dir}" -O ^resize_inode,sparse_super2,metadata_csum,64bit,^has_journal -E packed_meta_blocks=1,num_backup_sb=0 -b "${block_sz}" -I "${inodesz}" -F "${dev}" "${mkfs_blocks}" || exit + +e2fsck -fyD "${dev}" + +blocks="$(dumpe2fs -h "${dev}" 2>&1 | grep 'Block count:' | awk '{print $3}')" +while resize2fs -f -M "${dev}"; do + new_blocks="$(dumpe2fs -h "${dev}" 2>&1 | grep 'Block count:' | awk '{print $3}')" + if [ "${new_blocks}" -eq "${blocks}" ]; then + break; + fi + blocks="${new_blocks}" +done + +if [ ! -b "${dev}" ]; then + truncate -s "$((blocks * block_sz))" "${dev}" || (e2image -ar "${dev}" "${dev}.min"; mv "${dev}.min" "${dev}") +fi + +e2fsck -fy "${dev}" + +dir_blocks="$((bytes / block_sz))" +overhead="$((blocks - dir_blocks))" +echo "Minimized image overhead: $((100 * overhead / dir_blocks))%" + +exit 0 diff --git a/src/_nfdos/e2fsprogs/contrib/e2croncheck b/src/_nfdos/e2fsprogs/contrib/e2croncheck new file mode 100755 index 0000000..de0b41f --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/e2croncheck @@ -0,0 +1,47 @@ +#!/bin/sh +# +# e2croncheck -- run e2fsck automatically out of /etc/cron.weekly +# +# This script is intended to be run by the system administrator +# periodically from the command line, or to be run once a week +# or so by the cron daemon to check a mounted filesystem (normally +# the root filesystem, but it could be used to check other filesystems +# that are always mounted when the system is booted). +# +# Make sure you customize "VG" so it is your LVM volume group name, +# "VOLUME" so it is the name of the filesystem's logical volume, +# and "EMAIL" to be your e-mail address +# +# Written by Theodore Ts'o, Copyright 2007, 2008, 2009. +# +# This file may be redistributed under the terms of the +# GNU Public License, version 2. +# + +VG=ssd +VOLUME=root +SNAPSIZE=100m +EMAIL=sysadmin@example.com + +TMPFILE=`mktemp ${TMPDIR:-/tmp}/e2fsck.log.XXXXXXXXXX` + +OPTS="-Fttv -C0" +#OPTS="-Fttv -E fragcheck" + +set -e +START="$(date +'%Y%m%d%H%M%S')" +lvcreate -s -L ${SNAPSIZE} -n "${VOLUME}-snap" "${VG}/${VOLUME}" +if nice logsave -as $TMPFILE e2fsck -p $OPTS "/dev/${VG}/${VOLUME}-snap" && \ + nice logsave -as $TMPFILE e2fsck -fy $OPTS "/dev/${VG}/${VOLUME}-snap" ; then + echo 'Background scrubbing succeeded!' + tune2fs -C 0 -T "${START}" "/dev/${VG}/${VOLUME}" +else + echo 'Background scrubbing failed! Reboot to fsck soon!' + tune2fs -C 16000 -T "19000101" "/dev/${VG}/${VOLUME}" + if test -n "$RPT-EMAIL"; then + mail -s "E2fsck of /dev/${VG}/${VOLUME} failed!" $EMAIL < $TMPFILE + fi +fi +lvremove -f "${VG}/${VOLUME}-snap" +rm $TMPFILE + diff --git a/src/_nfdos/e2fsprogs/contrib/ext4-ioc.c b/src/_nfdos/e2fsprogs/contrib/ext4-ioc.c new file mode 100644 index 0000000..42f022d --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/ext4-ioc.c @@ -0,0 +1,98 @@ +/* + * Test program to trigger various ext4 ioctl's + */ + +#include +#include +#include +#include +#include +#include + +#if (!defined(EXT4_IOC_ALLOC_DA_BLKS) && defined(__linux__)) +#define EXT4_IOC_ALLOC_DA_BLKS _IO('f', 12) +#endif + +#if (!defined(EXT4_IOC_SWAP_BOOT) && defined(__linux__)) +#define EXT4_IOC_SWAP_BOOT _IO('f', 17) +#endif + +#if (!defined(EXT4_IOC_PRECACHE_EXTENTS) && defined(__linux__)) +#define EXT4_IOC_PRECACHE_EXTENTS _IO('f', 18) +#endif + +#if (!defined(EXT4_IOC_CLEAR_ES_CACHE) && defined(__linux__)) +#define EXT4_IOC_CLEAR_ES_CACHE _IO('f', 40) +#endif + + +#define EXT4_F_RW 0x0001 + +struct cmd { + const char *cmd; + unsigned long ioc; + int flags; +}; + +struct cmd cmds[] = { + { "alloc_da_blks", EXT4_IOC_ALLOC_DA_BLKS, EXT4_F_RW }, + { "precache", EXT4_IOC_PRECACHE_EXTENTS, 0 }, + { "swap_boot", EXT4_IOC_SWAP_BOOT, EXT4_F_RW }, + { "clear_es_cache", EXT4_IOC_CLEAR_ES_CACHE, EXT4_F_RW }, + { NULL, 0 } +}; + +const char *progname; + +void usage() +{ + struct cmd *p; + + fprintf(stderr, "Usage: %s \n\n", progname); + fprintf(stderr, "Available commands:\n"); + for (p = cmds; p->cmd; p++) { + fprintf(stderr, "\t%s\n", p->cmd); + } + exit(1); +} + +int do_single_cmd(const char *fn, struct cmd *p) +{ + int fd; + int oflags = O_RDONLY; + + if (p->flags & EXT4_F_RW) + oflags = O_RDWR; + fd = open(fn, oflags, 0); + if (fd < 0) { + perror("open"); + return 1; + } + if (ioctl(fd, p->ioc) < 0) { + perror("ioctl"); + return 1; + } + close(fd); + return 0; +} + +int main(int argc, char **argv) +{ + int i, fails = 0; + struct cmd *p; + + progname = argv[0]; + if (argc < 3 || strcmp(argv[1], "help") == 0) + usage(); + for (p = cmds; p->cmd; p++) { + if (strcmp(argv[1], p->cmd) == 0) + break; + } + if (p->cmd == NULL) { + fprintf(stderr, "Invalid command: %s\n", argv[1]); + usage(); + } + for (i = 2; i < argc; i++) + fails += do_single_cmd(argv[i], p); + return fails; +} diff --git a/src/_nfdos/e2fsprogs/contrib/fallocate.c b/src/_nfdos/e2fsprogs/contrib/fallocate.c new file mode 100644 index 0000000..16c08ab --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/fallocate.c @@ -0,0 +1,190 @@ +/* + * fallocate - utility to use the fallocate system call + * + * Copyright (C) 2008 Red Hat, Inc. All rights reserved. + * Written by Eric Sandeen + * + * cvtnum routine taken from xfsprogs, + * Copyright (c) 2003-2005 Silicon Graphics, 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. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _LARGEFILE_SOURCE +#define _LARGEFILE_SOURCE +#endif +#ifndef _LARGEFILE64_SOURCE +#define _LARGEFILE64_SOURCE +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +// #include +#define FALLOC_FL_KEEP_SIZE 0x01 +#define FALLOC_FL_PUNCH_HOLE 0x02 /* de-allocates range */ +#define FALLOC_FL_COLLAPSE_RANGE 0x08 +#define FALLOC_FL_ZERO_RANGE 0x10 + +void usage(void) +{ + printf("Usage: fallocate [-npt] [-o offset] -l length filename\n"); + exit(EXIT_FAILURE); +} + +#define EXABYTES(x) ((long long)(x) << 60) +#define PETABYTES(x) ((long long)(x) << 50) +#define TERABYTES(x) ((long long)(x) << 40) +#define GIGABYTES(x) ((long long)(x) << 30) +#define MEGABYTES(x) ((long long)(x) << 20) +#define KILOBYTES(x) ((long long)(x) << 10) + +long long +cvtnum(char *s) +{ + long long i; + char *sp; + int c; + + i = strtoll(s, &sp, 0); + if (i == 0 && sp == s) + return -1LL; + if (*sp == '\0') + return i; + if (sp[1] != '\0') + return -1LL; + + c = tolower(*sp); + switch (c) { + case 'k': + return KILOBYTES(i); + case 'm': + return MEGABYTES(i); + case 'g': + return GIGABYTES(i); + case 't': + return TERABYTES(i); + case 'p': + return PETABYTES(i); + case 'e': + return EXABYTES(i); + } + + return -1LL; +} + +int main(int argc, char **argv) +{ + int fd; + char *fname; + int opt; + ext2_loff_t length = -2LL; + ext2_loff_t offset = 0; + int falloc_mode = 0; + int error; + int tflag = 0; + + while ((opt = getopt(argc, argv, "npl:o:tzc")) != -1) { + switch(opt) { + case 'n': + /* do not change filesize */ + falloc_mode = FALLOC_FL_KEEP_SIZE; + break; + case 'p': + /* punch mode */ + falloc_mode = (FALLOC_FL_PUNCH_HOLE | + FALLOC_FL_KEEP_SIZE); + break; + case 'c': + /* collapse range mode */ + falloc_mode = (FALLOC_FL_COLLAPSE_RANGE | + FALLOC_FL_KEEP_SIZE); + break; + case 'z': + /* zero range mode */ + falloc_mode = (FALLOC_FL_ZERO_RANGE | + FALLOC_FL_KEEP_SIZE); + break; + case 'l': + length = cvtnum(optarg); + break; + case 'o': + offset = cvtnum(optarg); + break; + case 't': + tflag++; + break; + default: + usage(); + } + } + + if (length == -2LL) { + printf("Error: no length argument specified\n"); + usage(); + } + + if (length <= 0) { + printf("Error: invalid length value specified\n"); + usage(); + } + + if (offset < 0) { + printf("Error: invalid offset value specified\n"); + usage(); + } + + if (tflag && (falloc_mode & FALLOC_FL_KEEP_SIZE)) { + printf("-n and -t options incompatible\n"); + usage(); + } + + if (tflag && offset) { + printf("-n and -o options incompatible\n"); + usage(); + } + + if (optind == argc) { + printf("Error: no filename specified\n"); + usage(); + } + + fname = argv[optind++]; + + /* Should we create the file if it doesn't already exist? */ + fd = open(fname, O_WRONLY|O_LARGEFILE); + if (fd < 0) { + perror("Error opening file"); + exit(EXIT_FAILURE); + } + + if (tflag) + error = ftruncate(fd, length); + else + error = syscall(SYS_fallocate, fd, falloc_mode, offset, length); + + if (error < 0) { + perror("fallocate failed"); + exit(EXIT_FAILURE); + } + + close(fd); + return 0; +} diff --git a/src/_nfdos/e2fsprogs/contrib/fsstress.c b/src/_nfdos/e2fsprogs/contrib/fsstress.c new file mode 100644 index 0000000..2136a90 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/fsstress.c @@ -0,0 +1,2708 @@ +/* + * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, + * Mountain View, CA 94043, or: + * + * http://www.sgi.com + * + * For further information regarding this notice, see: + * + * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + */ + +#define NO_XFS +#define HAVE_SYS_PRCTL_H +#define _LARGEFILE64_SOURCE + +#define MAXNAMELEN 1024 +struct dioattr { + int d_miniosz, d_maxiosz, d_mem; +}; + +#define MIN(a,b) ((a)<(b) ? (a):(b)) +#define MAX(a,b) ((a)>(b) ? (a):(b)) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef O_DIRECT +#define O_DIRECT 040000 +#endif + +#ifdef HAVE_SYS_PRCTL_H +# include +#endif + +#define XFS_ERRTAG_MAX 17 + +typedef enum { +#ifndef NO_XFS + OP_ALLOCSP, + OP_ATTR_REMOVE, + OP_ATTR_SET, + OP_BULKSTAT, + OP_BULKSTAT1, +#endif + OP_CHOWN, + OP_CREAT, + OP_DREAD, + OP_DWRITE, + OP_FDATASYNC, +#ifndef NO_XFS + OP_FREESP, +#endif + OP_FSYNC, + OP_GETDENTS, + OP_LINK, + OP_MKDIR, + OP_MKNOD, + OP_READ, + OP_READLINK, + OP_RENAME, +#ifndef NO_XFS + OP_RESVSP, +#endif + OP_RMDIR, + OP_STAT, + OP_SYMLINK, + OP_SYNC, + OP_TRUNCATE, + OP_UNLINK, +#ifndef NO_XFS + OP_UNRESVSP, +#endif + OP_WRITE, + OP_LAST +} opty_t; + +typedef void (*opfnc_t) (int, long); + +typedef struct opdesc { + opty_t op; + char *name; + opfnc_t func; + int freq; + int iswrite; + int isxfs; +} opdesc_t; + +typedef struct fent { + int id; + int parent; +} fent_t; + +typedef struct flist { + int nfiles; + int nslots; + int tag; + fent_t *fents; +} flist_t; + +typedef struct pathname { + int len; + char *path; +} pathname_t; + +#define FT_DIR 0 +#define FT_DIRm (1 << FT_DIR) +#define FT_REG 1 +#define FT_REGm (1 << FT_REG) +#define FT_SYM 2 +#define FT_SYMm (1 << FT_SYM) +#define FT_DEV 3 +#define FT_DEVm (1 << FT_DEV) +#define FT_RTF 4 +#define FT_RTFm (1 << FT_RTF) +#define FT_nft 5 +#define FT_ANYm ((1 << FT_nft) - 1) +#define FT_REGFILE (FT_REGm | FT_RTFm) +#define FT_NOTDIR (FT_ANYm & ~FT_DIRm) + +#define FLIST_SLOT_INCR 16 +#define NDCACHE 64 + +#define MAXFSIZE ((1ULL << 63) - 1ULL) +#define MAXFSIZE32 ((1ULL << 40) - 1ULL) + +void allocsp_f(int, long); +void attr_remove_f(int, long); +void attr_set_f(int, long); +void bulkstat_f(int, long); +void bulkstat1_f(int, long); +void chown_f(int, long); +void creat_f(int, long); +void dread_f(int, long); +void dwrite_f(int, long); +void fdatasync_f(int, long); +void freesp_f(int, long); +void fsync_f(int, long); +void getdents_f(int, long); +void link_f(int, long); +void mkdir_f(int, long); +void mknod_f(int, long); +void read_f(int, long); +void readlink_f(int, long); +void rename_f(int, long); +void resvsp_f(int, long); +void rmdir_f(int, long); +void stat_f(int, long); +void symlink_f(int, long); +void sync_f(int, long); +void truncate_f(int, long); +void unlink_f(int, long); +void unresvsp_f(int, long); +void write_f(int, long); + +opdesc_t ops[] = { +#ifndef NO_XFS + {OP_ALLOCSP, "allocsp", allocsp_f, 1, 1, 1}, + {OP_ATTR_REMOVE, "attr_remove", attr_remove_f, /* 1 */ 0, 1, 1}, + {OP_ATTR_SET, "attr_set", attr_set_f, /* 2 */ 0, 1, 1}, + {OP_BULKSTAT, "bulkstat", bulkstat_f, 1, 0, 1}, + {OP_BULKSTAT1, "bulkstat1", bulkstat1_f, 1, 0, 1}, +#endif + {OP_CHOWN, "chown", chown_f, 3, 1, 0}, + {OP_CREAT, "creat", creat_f, 4, 1, 0}, + {OP_DREAD, "dread", dread_f, 4, 0, 0}, + {OP_DWRITE, "dwrite", dwrite_f, 4, 1, 0}, + {OP_FDATASYNC, "fdatasync", fdatasync_f, 1, 1, 0}, +#ifndef NO_XFS + {OP_FREESP, "freesp", freesp_f, 1, 1, 1}, +#endif + {OP_FSYNC, "fsync", fsync_f, 1, 1, 0}, + {OP_GETDENTS, "getdents", getdents_f, 1, 0, 0}, + {OP_LINK, "link", link_f, 1, 1, 0}, + {OP_MKDIR, "mkdir", mkdir_f, 2, 1, 0}, + {OP_MKNOD, "mknod", mknod_f, 2, 1, 0}, + {OP_READ, "read", read_f, 1, 0, 0}, + {OP_READLINK, "readlink", readlink_f, 1, 0, 0}, + {OP_RENAME, "rename", rename_f, 2, 1, 0}, +#ifndef NO_XFS + {OP_RESVSP, "resvsp", resvsp_f, 1, 1, 1}, +#endif + {OP_RMDIR, "rmdir", rmdir_f, 1, 1, 0}, + {OP_STAT, "stat", stat_f, 1, 0, 0}, + {OP_SYMLINK, "symlink", symlink_f, 2, 1, 0}, + {OP_SYNC, "sync", sync_f, 1, 0, 0}, + {OP_TRUNCATE, "truncate", truncate_f, 2, 1, 0}, + {OP_UNLINK, "unlink", unlink_f, 1, 1, 0}, +#ifndef NO_XFS + {OP_UNRESVSP, "unresvsp", unresvsp_f, 1, 1, 1}, +#endif + {OP_WRITE, "write", write_f, 4, 1, 0}, +}, *ops_end; + +flist_t flist[FT_nft] = { + {0, 0, 'd', NULL}, + {0, 0, 'f', NULL}, + {0, 0, 'l', NULL}, + {0, 0, 'c', NULL}, + {0, 0, 'r', NULL}, +}; + +int dcache[NDCACHE]; +int errrange; +int errtag; +opty_t *freq_table; +int freq_table_size; +#ifndef NO_XFS +xfs_fsop_geom_t geom; +#endif +char *homedir; +int *ilist; +int ilistlen; +off64_t maxfsize; +char *myprog; +int namerand; +int nameseq; +int nops; +int nproc = 1; +int operations = 1; +int procid; +int rtpct; +unsigned long seed = 0; +ino_t top_ino; +int verbose = 0; +#ifndef NO_XFS +int no_xfs = 0; +#else +int no_xfs = 1; +#endif +sig_atomic_t should_stop = 0; + +void add_to_flist(int, int, int); +void append_pathname(pathname_t *, char *); +#ifndef NO_XFS +int attr_list_path(pathname_t *, char *, const int, int, attrlist_cursor_t *); +int attr_remove_path(pathname_t *, const char *, int); +int attr_set_path(pathname_t *, const char *, const char *, const int, int); +#endif +void check_cwd(void); +int creat_path(pathname_t *, mode_t); +void dcache_enter(int, int); +void dcache_init(void); +fent_t *dcache_lookup(int); +void dcache_purge(int); +void del_from_flist(int, int); +int dirid_to_name(char *, int); +void doproc(void); +void fent_to_name(pathname_t *, flist_t *, fent_t *); +void fix_parent(int, int); +void free_pathname(pathname_t *); +int generate_fname(fent_t *, int, pathname_t *, int *, int *); +int get_fname(int, long, pathname_t *, flist_t **, fent_t **, int *); +void init_pathname(pathname_t *); +int lchown_path(pathname_t *, uid_t, gid_t); +int link_path(pathname_t *, pathname_t *); +int lstat64_path(pathname_t *, struct stat64 *); +void make_freq_table(void); +int mkdir_path(pathname_t *, mode_t); +int mknod_path(pathname_t *, mode_t, dev_t); +void namerandpad(int, char *, int); +int open_path(pathname_t *, int); +DIR *opendir_path(pathname_t *); +void process_freq(char *); +int readlink_path(pathname_t *, char *, size_t); +int rename_path(pathname_t *, pathname_t *); +int rmdir_path(pathname_t *); +void separate_pathname(pathname_t *, char *, pathname_t *); +void show_ops(int, char *); +int stat64_path(pathname_t *, struct stat64 *); +int symlink_path(const char *, pathname_t *); +int truncate64_path(pathname_t *, off64_t); +int unlink_path(pathname_t *); +void usage(void); +void write_freq(void); +void zero_freq(void); + +void sg_handler(int signum) +{ + should_stop = 1; +} + +int main(int argc, char **argv) +{ + char buf[10]; + int c; + char *dirname = NULL; + int fd; + int i; + int cleanup = 0; + int loops = 1; + int loopcntr = 1; + char cmd[256]; +#ifndef NO_XFS + int j; +#endif + char *p; + int stat; + struct timeval t; +#ifndef NO_XFS + ptrdiff_t srval; +#endif + int nousage = 0; +#ifndef NO_XFS + xfs_error_injection_t err_inj; +#endif + struct sigaction action; + + errrange = errtag = 0; + umask(0); + nops = sizeof(ops) / sizeof(ops[0]); + ops_end = &ops[nops]; + myprog = argv[0]; + while ((c = getopt(argc, argv, "cd:e:f:i:l:n:p:rs:vwzHSX")) != -1) { + switch (c) { + case 'c': + /*Don't cleanup */ + cleanup = 1; + break; + case 'd': + dirname = optarg; + break; + case 'e': + sscanf(optarg, "%d", &errtag); + if (errtag < 0) { + errtag = -errtag; + errrange = 1; + } else if (errtag == 0) + errtag = -1; + if (errtag >= XFS_ERRTAG_MAX) { + fprintf(stderr, + "error tag %d too large (max %d)\n", + errtag, XFS_ERRTAG_MAX - 1); + exit(1); + } + break; + case 'f': + process_freq(optarg); + break; + case 'i': + ilist = realloc(ilist, ++ilistlen * sizeof(*ilist)); + ilist[ilistlen - 1] = strtol(optarg, &p, 16); + break; + case 'l': + loops = atoi(optarg); + break; + case 'n': + operations = atoi(optarg); + break; + case 'p': + nproc = atoi(optarg); + break; + case 'r': + namerand = 1; + break; + case 's': + seed = strtoul(optarg, NULL, 0); + break; + case 'v': + verbose = 1; + break; + case 'w': + write_freq(); + break; + case 'z': + zero_freq(); + break; + case 'S': + show_ops(0, NULL); + printf("\n"); + nousage = 1; + break; + case '?': + fprintf(stderr, "%s - invalid parameters\n", myprog); + /* fall through */ + case 'H': + usage(); + exit(1); + case 'X': + no_xfs = 1; + break; + } + } + + if (no_xfs && errtag) { + fprintf(stderr, "error injection only works on XFS\n"); + exit(1); + } + + if (no_xfs) { + int i; + for (i = 0; ops + i < ops_end; ++i) { + if (ops[i].isxfs) + ops[i].freq = 0; + } + } + + make_freq_table(); + + while (((loopcntr <= loops) || (loops == 0)) && !should_stop) { + if (!dirname) { + /* no directory specified */ + if (!nousage) + usage(); + exit(1); + } + + (void)mkdir(dirname, 0777); + if (chdir(dirname) < 0) { + perror(dirname); + exit(1); + } + sprintf(buf, "fss%x", getpid()); + fd = creat(buf, 0666); + if (lseek64(fd, (off64_t) (MAXFSIZE32 + 1ULL), SEEK_SET) < 0) + maxfsize = (off64_t) MAXFSIZE32; + else + maxfsize = (off64_t) MAXFSIZE; + dcache_init(); + setlinebuf(stdout); + if (!seed) { + gettimeofday(&t, NULL); + seed = (int)t.tv_sec ^ (int)t.tv_usec; + printf("seed = %ld\n", seed); + } +#ifndef NO_XFS + if (!no_xfs) { + memset(&geom, 0, sizeof(geom)); + i = ioctl(fd, XFS_IOC_FSGEOMETRY, &geom); + if (i >= 0 && geom.rtblocks) + rtpct = MIN(MAX(geom.rtblocks * 100 / + (geom.rtblocks + + geom.datablocks), 1), 99); + else + rtpct = 0; + } + if (errtag != 0) { + if (errrange == 0) { + if (errtag <= 0) { + srandom(seed); + j = random() % 100; + + for (i = 0; i < j; i++) + (void)random(); + + errtag = + (random() % (XFS_ERRTAG_MAX - 1)) + + 1; + } + } else { + srandom(seed); + j = random() % 100; + + for (i = 0; i < j; i++) + (void)random(); + + errtag += + (random() % (XFS_ERRTAG_MAX - errtag)); + } + printf("Injecting failure on tag #%d\n", errtag); + memset(&err_inj, 0, sizeof(err_inj)); + err_inj.errtag = errtag; + err_inj.fd = fd; + srval = ioctl(fd, XFS_IOC_ERROR_INJECTION, &err_inj); + if (srval < -1) { + perror + ("fsstress - XFS_SYSSGI error injection call"); + close(fd); + unlink(buf); + exit(1); + } + } else +#endif + close(fd); + unlink(buf); + + + if (nproc == 1) { + procid = 0; + doproc(); + } else { + setpgid(0, 0); + action.sa_handler = sg_handler; + sigemptyset(&action.sa_mask); + action.sa_flags = 0; + if (sigaction(SIGTERM, &action, 0)) { + perror("sigaction failed"); + exit(1); + } + + for (i = 0; i < nproc; i++) { + if (fork() == 0) { + + action.sa_handler = SIG_DFL; + sigemptyset(&action.sa_mask); + if (sigaction(SIGTERM, &action, 0)) + return 1; +#ifdef HAVE_SYS_PRCTL_H + prctl(PR_SET_PDEATHSIG, SIGKILL); + if (getppid() == 1) /* parent died already? */ + return 0; +#endif + procid = i; + doproc(); + return 0; + } + } + while (wait(&stat) > 0 && !should_stop) { + continue; + } + if (should_stop) { + action.sa_flags = SA_RESTART; + sigaction(SIGTERM, &action, 0); + kill(-getpid(), SIGTERM); + while (wait(&stat) > 0) + continue; + } + } +#ifndef NO_XFS + if (errtag != 0) { + memset(&err_inj, 0, sizeof(err_inj)); + err_inj.errtag = 0; + err_inj.fd = fd; + if ((srval = + ioctl(fd, XFS_IOC_ERROR_CLEARALL, + &err_inj)) != 0) { + fprintf(stderr, "Bad ej clear on %d (%d).\n", + fd, errno); + perror + ("fsstress - XFS_SYSSGI clear error injection call"); + close(fd); + exit(1); + } + close(fd); + } +#endif + if (cleanup == 0) { + sprintf(cmd, "rm -rf %s/*", dirname); + system(cmd); + for (i = 0; i < FT_nft; i++) { + flist[i].nslots = 0; + flist[i].nfiles = 0; + free(flist[i].fents); + flist[i].fents = NULL; + } + } + loopcntr++; + } + return 0; +} + +void add_to_flist(int ft, int id, int parent) +{ + fent_t *fep; + flist_t *ftp; + + ftp = &flist[ft]; + if (ftp->nfiles == ftp->nslots) { + ftp->nslots += FLIST_SLOT_INCR; + ftp->fents = realloc(ftp->fents, ftp->nslots * sizeof(fent_t)); + } + fep = &ftp->fents[ftp->nfiles++]; + fep->id = id; + fep->parent = parent; +} + +void append_pathname(pathname_t * name, char *str) +{ + int len; + char *path; + + len = strlen(str); +#ifdef DEBUG + if (len && *str == '/' && name->len == 0) { + fprintf(stderr, "fsstress: append_pathname failure\n"); + chdir(homedir); + abort(); + + } +#endif + path = realloc(name->path, name->len + 1 + len); + if (path == NULL) { + fprintf(stderr, "fsstress: append_pathname realloc failed\n"); + chdir(homedir); + abort(); + } + name->path = path; + strcpy(&name->path[name->len], str); + name->len += len; +} + +#ifndef NO_XFS +int +attr_list_path(pathname_t * name, char *buffer, const int buffersize, int flags, + attrlist_cursor_t * cursor) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = attr_list(name->path, buffer, buffersize, flags, cursor); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = attr_list_path(&newname, buffer, buffersize, flags, + cursor); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +int attr_remove_path(pathname_t * name, const char *attrname, int flags) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = attr_remove(name->path, attrname, flags); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = attr_remove_path(&newname, attrname, flags); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +int +attr_set_path(pathname_t * name, const char *attrname, const char *attrvalue, + const int valuelength, int flags) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = attr_set(name->path, attrname, attrvalue, valuelength, flags); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = attr_set_path(&newname, attrname, attrvalue, valuelength, + flags); + chdir(".."); + } + free_pathname(&newname); + return rval; +} +#endif + +void check_cwd(void) +{ +#ifdef DEBUG + struct stat64 statbuf; + + if (stat64(".", &statbuf) == 0 && statbuf.st_ino == top_ino) + return; + chdir(homedir); + fprintf(stderr, "fsstress: check_cwd failure\n"); + abort(); + +#endif +} + +int creat_path(pathname_t * name, mode_t mode) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = creat(name->path, mode); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = creat_path(&newname, mode); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +void dcache_enter(int dirid, int slot) +{ + dcache[dirid % NDCACHE] = slot; +} + +void dcache_init(void) +{ + int i; + + for (i = 0; i < NDCACHE; i++) + dcache[i] = -1; +} + +fent_t *dcache_lookup(int dirid) +{ + fent_t *fep; + int i; + + i = dcache[dirid % NDCACHE]; + if (i >= 0 && (fep = &flist[FT_DIR].fents[i])->id == dirid) + return fep; + return NULL; +} + +void dcache_purge(int dirid) +{ + int *dcp; + + dcp = &dcache[dirid % NDCACHE]; + if (*dcp >= 0 && flist[FT_DIR].fents[*dcp].id == dirid) + *dcp = -1; +} + +void del_from_flist(int ft, int slot) +{ + flist_t *ftp; + + ftp = &flist[ft]; + if (ft == FT_DIR) + dcache_purge(ftp->fents[slot].id); + if (slot != ftp->nfiles - 1) { + if (ft == FT_DIR) + dcache_purge(ftp->fents[ftp->nfiles - 1].id); + ftp->fents[slot] = ftp->fents[--ftp->nfiles]; + } else + ftp->nfiles--; +} + +fent_t *dirid_to_fent(int dirid) +{ + fent_t *efep; + fent_t *fep; + flist_t *flp; + + if ((fep = dcache_lookup(dirid))) + return fep; + flp = &flist[FT_DIR]; + for (fep = flp->fents, efep = &fep[flp->nfiles]; fep < efep; fep++) { + if (fep->id == dirid) { + dcache_enter(dirid, fep - flp->fents); + return fep; + } + } + return NULL; +} + +void doproc(void) +{ + struct stat64 statbuf; + char buf[10]; + int opno; + int rval; + opdesc_t *p; + + sprintf(buf, "p%x", procid); + (void)mkdir(buf, 0777); + if (chdir(buf) < 0 || stat64(".", &statbuf) < 0) { + perror(buf); + _exit(1); + } + top_ino = statbuf.st_ino; + homedir = getcwd(NULL, -1); + seed += procid; + srandom(seed); + if (namerand) + namerand = random(); + for (opno = 0; opno < operations; opno++) { + p = &ops[freq_table[random() % freq_table_size]]; + if ((unsigned long)p->func < 4096) + abort(); + + p->func(opno, random()); + /* + * test for forced shutdown by stat'ing the test + * directory. If this stat returns EIO, assume + * the forced shutdown happened. + */ + if (errtag != 0 && opno % 100 == 0) { + rval = stat64(".", &statbuf); + if (rval == EIO) { + fprintf(stderr, "Detected EIO\n"); + return; + } + } + } +} + +void fent_to_name(pathname_t * name, flist_t * flp, fent_t * fep) +{ + char buf[MAXNAMELEN]; + int i; + fent_t *pfep; + + if (fep == NULL) + return; + if (fep->parent != -1) { + pfep = dirid_to_fent(fep->parent); + fent_to_name(name, &flist[FT_DIR], pfep); + append_pathname(name, "/"); + } + i = sprintf(buf, "%c%x", flp->tag, fep->id); + namerandpad(fep->id, buf, i); + append_pathname(name, buf); +} + +void fix_parent(int oldid, int newid) +{ + fent_t *fep; + flist_t *flp; + int i; + int j; + + for (i = 0, flp = flist; i < FT_nft; i++, flp++) { + for (j = 0, fep = flp->fents; j < flp->nfiles; j++, fep++) { + if (fep->parent == oldid) + fep->parent = newid; + } + } +} + +void free_pathname(pathname_t * name) +{ + if (name->path) { + free(name->path); + name->path = NULL; + name->len = 0; + } +} + +int generate_fname(fent_t * fep, int ft, pathname_t * name, int *idp, int *v) +{ + char buf[MAXNAMELEN]; + flist_t *flp; + int id; + int j; + int len; + + flp = &flist[ft]; + len = sprintf(buf, "%c%x", flp->tag, id = nameseq++); + namerandpad(id, buf, len); + if (fep) { + fent_to_name(name, &flist[FT_DIR], fep); + append_pathname(name, "/"); + } + append_pathname(name, buf); + *idp = id; + *v = verbose; + for (j = 0; !*v && j < ilistlen; j++) { + if (ilist[j] == id) { + *v = 1; + break; + } + } + return 1; +} + +int +get_fname(int which, long r, pathname_t * name, flist_t ** flpp, fent_t ** fepp, + int *v) +{ + int c; + fent_t *fep; + flist_t *flp; + int i; + int j; + int x; + + for (i = 0, c = 0, flp = flist; i < FT_nft; i++, flp++) { + if (which & (1 << i)) + c += flp->nfiles; + } + if (c == 0) { + if (flpp) + *flpp = NULL; + if (fepp) + *fepp = NULL; + *v = verbose; + return 0; + } + x = (int)(r % c); + for (i = 0, c = 0, flp = flist; i < FT_nft; i++, flp++) { + if (which & (1 << i)) { + if (x < c + flp->nfiles) { + fep = &flp->fents[x - c]; + if (name) + fent_to_name(name, flp, fep); + if (flpp) + *flpp = flp; + if (fepp) + *fepp = fep; + *v = verbose; + for (j = 0; !*v && j < ilistlen; j++) { + if (ilist[j] == fep->id) { + *v = 1; + break; + } + } + return 1; + } + c += flp->nfiles; + } + } +#ifdef DEBUG + fprintf(stderr, "fsstress: get_fname failure\n"); + abort(); +#endif + return -1; + +} + +void init_pathname(pathname_t * name) +{ + name->len = 0; + name->path = NULL; +} + +int lchown_path(pathname_t * name, uid_t owner, gid_t group) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = lchown(name->path, owner, group); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = lchown_path(&newname, owner, group); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +int link_path(pathname_t * name1, pathname_t * name2) +{ + char buf1[MAXNAMELEN]; + char buf2[MAXNAMELEN]; + int down1; + pathname_t newname1; + pathname_t newname2; + int rval; + + rval = link(name1->path, name2->path); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name1, buf1, &newname1); + separate_pathname(name2, buf2, &newname2); + if (strcmp(buf1, buf2) == 0) { + if (chdir(buf1) == 0) { + rval = link_path(&newname1, &newname2); + chdir(".."); + } + } else { + if (strcmp(buf1, "..") == 0) + down1 = 0; + else if (strcmp(buf2, "..") == 0) + down1 = 1; + else if (strlen(buf1) == 0) + down1 = 0; + else if (strlen(buf2) == 0) + down1 = 1; + else + down1 = MAX(newname1.len, 3 + name2->len) <= + MAX(3 + name1->len, newname2.len); + if (down1) { + free_pathname(&newname2); + append_pathname(&newname2, "../"); + append_pathname(&newname2, name2->path); + if (chdir(buf1) == 0) { + rval = link_path(&newname1, &newname2); + chdir(".."); + } + } else { + free_pathname(&newname1); + append_pathname(&newname1, "../"); + append_pathname(&newname1, name1->path); + if (chdir(buf2) == 0) { + rval = link_path(&newname1, &newname2); + chdir(".."); + } + } + } + free_pathname(&newname1); + free_pathname(&newname2); + return rval; +} + +int lstat64_path(pathname_t * name, struct stat64 *sbuf) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = lstat64(name->path, sbuf); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = lstat64_path(&newname, sbuf); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +void make_freq_table(void) +{ + int f; + int i; + opdesc_t *p; + + for (p = ops, f = 0; p < ops_end; p++) + f += p->freq; + freq_table = malloc(f * sizeof(*freq_table)); + freq_table_size = f; + for (p = ops, i = 0; p < ops_end; p++) { + for (f = 0; f < p->freq; f++, i++) + freq_table[i] = p->op; + } +} + +int mkdir_path(pathname_t * name, mode_t mode) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = mkdir(name->path, mode); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = mkdir_path(&newname, mode); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +int mknod_path(pathname_t * name, mode_t mode, dev_t dev) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = mknod(name->path, mode, dev); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = mknod_path(&newname, mode, dev); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +void namerandpad(int id, char *buf, int i) +{ + int bucket; + static int buckets[] = { 2, 4, 8, 16, 32, 64, 128, MAXNAMELEN - 1 }; + int padlen; + int padmod; + + if (namerand == 0) + return; + bucket = (id ^ namerand) % (sizeof(buckets) / sizeof(buckets[0])); + padmod = buckets[bucket] + 1 - i; + if (padmod <= 0) + return; + padlen = (id ^ namerand) % padmod; + if (padlen) { + memset(&buf[i], 'X', padlen); + buf[i + padlen] = '\0'; + } +} + +int open_path(pathname_t * name, int oflag) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = open(name->path, oflag); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = open_path(&newname, oflag); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +DIR *opendir_path(pathname_t * name) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + DIR *rval; + + rval = opendir(name->path); + if (rval || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = opendir_path(&newname); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +void process_freq(char *arg) +{ + opdesc_t *p; + char *s; + + s = strchr(arg, '='); + if (s == NULL) { + fprintf(stderr, "bad argument '%s'\n", arg); + exit(1); + } + *s++ = '\0'; + for (p = ops; p < ops_end; p++) { + if (strcmp(arg, p->name) == 0) { + p->freq = atoi(s); + return; + } + } + fprintf(stderr, "can't find op type %s for -f\n", arg); + exit(1); +} + +int readlink_path(pathname_t * name, char *lbuf, size_t lbufsiz) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = readlink(name->path, lbuf, lbufsiz); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = readlink_path(&newname, lbuf, lbufsiz); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +int rename_path(pathname_t * name1, pathname_t * name2) +{ + char buf1[MAXNAMELEN]; + char buf2[MAXNAMELEN]; + int down1; + pathname_t newname1; + pathname_t newname2; + int rval; + + rval = rename(name1->path, name2->path); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name1, buf1, &newname1); + separate_pathname(name2, buf2, &newname2); + if (strcmp(buf1, buf2) == 0) { + if (chdir(buf1) == 0) { + rval = rename_path(&newname1, &newname2); + chdir(".."); + } + } else { + if (strcmp(buf1, "..") == 0) + down1 = 0; + else if (strcmp(buf2, "..") == 0) + down1 = 1; + else if (strlen(buf1) == 0) + down1 = 0; + else if (strlen(buf2) == 0) + down1 = 1; + else + down1 = MAX(newname1.len, 3 + name2->len) <= + MAX(3 + name1->len, newname2.len); + if (down1) { + free_pathname(&newname2); + append_pathname(&newname2, "../"); + append_pathname(&newname2, name2->path); + if (chdir(buf1) == 0) { + rval = rename_path(&newname1, &newname2); + chdir(".."); + } + } else { + free_pathname(&newname1); + append_pathname(&newname1, "../"); + append_pathname(&newname1, name1->path); + if (chdir(buf2) == 0) { + rval = rename_path(&newname1, &newname2); + chdir(".."); + } + } + } + free_pathname(&newname1); + free_pathname(&newname2); + return rval; +} + +int rmdir_path(pathname_t * name) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = rmdir(name->path); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = rmdir_path(&newname); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +void separate_pathname(pathname_t * name, char *buf, pathname_t * newname) +{ + char *slash; + + init_pathname(newname); + slash = strchr(name->path, '/'); + if (slash == NULL) { + buf[0] = '\0'; + return; + } + *slash = '\0'; + strcpy(buf, name->path); + *slash = '/'; + append_pathname(newname, slash + 1); +} + +#define WIDTH 80 + +void show_ops(int flag, char *lead_str) +{ + opdesc_t *p; + + if (flag < 0) { + /* print in list form */ + int x = WIDTH; + + for (p = ops; p < ops_end; p++) { + if (lead_str != NULL + && x + strlen(p->name) >= WIDTH - 5) + x = printf("%s%s", (p == ops) ? "" : "\n", + lead_str); + x += printf("%s ", p->name); + } + printf("\n"); + } else { + int f; + for (f = 0, p = ops; p < ops_end; p++) + f += p->freq; + + if (f == 0) + flag = 1; + + for (p = ops; p < ops_end; p++) { + if (flag != 0 || p->freq > 0) { + if (lead_str != NULL) + printf("%s", lead_str); + printf("%20s %d/%d %s\n", + p->name, p->freq, f, + (p->iswrite == 0) ? " " : "write op"); + } + } + } +} + +int stat64_path(pathname_t * name, struct stat64 *sbuf) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = stat64(name->path, sbuf); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = stat64_path(&newname, sbuf); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +int symlink_path(const char *name1, pathname_t * name) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + if (!strcmp(name1, name->path)) { + printf("yikes! %s %s\n", name1, name->path); + return 0; + } + + rval = symlink(name1, name->path); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = symlink_path(name1, &newname); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +int truncate64_path(pathname_t * name, off64_t length) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = truncate64(name->path, length); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = truncate64_path(&newname, length); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +int unlink_path(pathname_t * name) +{ + char buf[MAXNAMELEN]; + pathname_t newname; + int rval; + + rval = unlink(name->path); + if (rval >= 0 || errno != ENAMETOOLONG) + return rval; + separate_pathname(name, buf, &newname); + if (chdir(buf) == 0) { + rval = unlink_path(&newname); + chdir(".."); + } + free_pathname(&newname); + return rval; +} + +void usage(void) +{ + printf("Usage: %s -H or\n", myprog); + printf + (" %s [-c][-d dir][-e errtg][-f op_name=freq][-l loops][-n nops]\n", + myprog); + printf(" [-p nproc][-r len][-s seed][-v][-w][-z][-S]\n"); + printf("where\n"); + printf + (" -c specifies not to remove files(cleanup) after execution\n"); + printf + (" -d dir specifies the base directory for operations\n"); + printf(" -e errtg specifies error injection stuff\n"); + printf + (" -f op_name=freq changes the frequency of option name to freq\n"); + printf(" the valid operation names are:\n"); + show_ops(-1, " "); + printf + (" -l loops specifies the no. of times the testrun should loop.\n"); + printf(" *use 0 for infinite (default 1)\n"); + printf + (" -n nops specifies the no. of operations per process (default 1)\n"); + printf + (" -p nproc specifies the no. of processes (default 1)\n"); + printf(" -r specifies random name padding\n"); + printf + (" -s seed specifies the seed for the random generator (default random)\n"); + printf(" -v specifies verbose mode\n"); + printf + (" -w zeros frequencies of non-write operations\n"); + printf(" -z zeros frequencies of all operations\n"); + printf + (" -S prints the table of operations (omitting zero frequency)\n"); + printf(" -H prints usage and exits\n"); + printf + (" -X don't do anything XFS specific (default with -DNO_XFS)\n"); +} + +void write_freq(void) +{ + opdesc_t *p; + + for (p = ops; p < ops_end; p++) { + if (!p->iswrite) + p->freq = 0; + } +} + +void zero_freq(void) +{ + opdesc_t *p; + + for (p = ops; p < ops_end; p++) + p->freq = 0; +} + +#ifndef NO_XFS + +void allocsp_f(int opno, long r) +{ + int e; + pathname_t f; + int fd; + struct xfs_flock64 fl; + __s64 lr; + __s64 off; + struct stat64 stb; + int v; + + init_pathname(&f); + if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) { + if (v) + printf("%d/%d: allocsp - no filename\n", procid, opno); + free_pathname(&f); + return; + } + fd = open_path(&f, O_RDWR); + e = fd < 0 ? errno : 0; + check_cwd(); + if (fd < 0) { + if (v) + printf("%d/%d: allocsp - open %s failed %d\n", + procid, opno, f.path, e); + free_pathname(&f); + return; + } + if (fstat64(fd, &stb) < 0) { + if (v) + printf("%d/%d: allocsp - fstat64 %s failed %d\n", + procid, opno, f.path, errno); + free_pathname(&f); + close(fd); + return; + } + lr = ((__s64) random() << 32) + random(); + off = lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE); + off %= maxfsize; + memset(&fl, 0, sizeof(fl)); + fl.l_whence = SEEK_SET; + fl.l_start = off; + fl.l_len = 0; + e = ioctl(fd, XFS_IOC_ALLOCSP64, &fl) < 0 ? errno : 0; + if (v) + printf("%d/%d: ioctl(XFS_IOC_ALLOCSP64) %s %lld 0 %d\n", + procid, opno, f.path, (long long)off, e); + free_pathname(&f); + close(fd); +} + +void attr_remove_f(int opno, long r) +{ + attrlist_ent_t *aep; + attrlist_t *alist; + char *aname; + char buf[4096]; + attrlist_cursor_t cursor; + int e; + int ent; + pathname_t f; + int total; + int v; + int which; + + init_pathname(&f); + if (!get_fname(FT_ANYm, r, &f, NULL, NULL, &v)) + append_pathname(&f, "."); + total = 0; + memset(&cursor, 0x00, sizeof(cursor)); + do { + e = attr_list_path(&f, buf, sizeof(buf), ATTR_DONTFOLLOW, + &cursor); + check_cwd(); + if (e) + break; + alist = (attrlist_t *) buf; + total += alist->al_count; + } while (alist->al_more); + if (total == 0) { + if (v) + printf("%d/%d: attr_remove - no attrs for %s\n", + procid, opno, f.path); + free_pathname(&f); + return; + } + which = (int)(random() % total); + memset(&cursor, 0x00, sizeof(cursor)); + ent = 0; + aname = NULL; + do { + e = attr_list_path(&f, buf, sizeof(buf), ATTR_DONTFOLLOW, + &cursor); + check_cwd(); + if (e) + break; + alist = (attrlist_t *) buf; + if (which < ent + alist->al_count) { + aep = (attrlist_ent_t *) + & buf[alist->al_offset[which - ent]]; + aname = aep->a_name; + break; + } + ent += alist->al_count; + } while (alist->al_more); + if (aname == NULL) { + if (v) + printf("%d/%d: attr_remove - name %d not found at %s\n", + procid, opno, which, f.path); + free_pathname(&f); + return; + } + e = attr_remove_path(&f, aname, ATTR_DONTFOLLOW) < 0 ? errno : 0; + check_cwd(); + if (v) + printf("%d/%d: attr_remove %s %s %d\n", + procid, opno, f.path, aname, e); + free_pathname(&f); +} + +void attr_set_f(int opno, long r) +{ + char aname[10]; + char *aval; + int e; + pathname_t f; + int len; + static int lengths[] = { 10, 100, 1000, 10000 }; + int li; + int v; + + init_pathname(&f); + if (!get_fname(FT_ANYm, r, &f, NULL, NULL, &v)) + append_pathname(&f, "."); + sprintf(aname, "a%x", nameseq++); + li = (int)(random() % (sizeof(lengths) / sizeof(lengths[0]))); + len = (int)(random() % lengths[li]); + if (len == 0) + len = 1; + aval = malloc(len); + memset(aval, nameseq & 0xff, len); + e = attr_set_path(&f, aname, aval, len, ATTR_DONTFOLLOW) < 0 ? + errno : 0; + check_cwd(); + free(aval); + if (v) + printf("%d/%d: attr_set %s %s %d\n", procid, opno, f.path, + aname, e); + free_pathname(&f); +} + +void bulkstat_f(int opno, long r) +{ + __s32 count; + int fd; + __u64 last; + __s32 nent; + xfs_bstat_t *t; + __int64_t total; + xfs_fsop_bulkreq_t bsr; + + last = 0; + nent = (r % 999) + 2; + t = malloc(nent * sizeof(*t)); + fd = open(".", O_RDONLY); + total = 0; + + memset(&bsr, 0, sizeof(bsr)); + bsr.lastip = &last; + bsr.icount = nent; + bsr.ubuffer = t; + bsr.ocount = &count; + + while (ioctl(fd, XFS_IOC_FSBULKSTAT, &bsr) == 0 && count > 0) + total += count; + free(t); + if (verbose) + printf("%d/%d: bulkstat nent %d total %lld\n", + procid, opno, (int)nent, (long long)total); + close(fd); +} + +void bulkstat1_f(int opno, long r) +{ + int e; + pathname_t f; + int fd; + int good; + __u64 ino; + struct stat64 s; + xfs_bstat_t t; + int v; + xfs_fsop_bulkreq_t bsr; + + good = random() & 1; + if (good) { + /* use an inode we know exists */ + init_pathname(&f); + if (!get_fname(FT_ANYm, r, &f, NULL, NULL, &v)) + append_pathname(&f, "."); + ino = stat64_path(&f, &s) < 0 ? (ino64_t) r : s.st_ino; + check_cwd(); + free_pathname(&f); + } else { + /* + * pick a random inode + * + * note this can generate kernel warning messages + * since bulkstat_one will read the disk block that + * would contain a given inode even if that disk + * block doesn't contain inodes. + * + * this is detected later, but not until after the + * warning is displayed. + * + * "XFS: device 0x825- bad inode magic/vsn daddr 0x0 #0" + * + */ + ino = (ino64_t) r; + v = verbose; + } + fd = open(".", O_RDONLY); + + memset(&bsr, 0, sizeof(bsr)); + bsr.lastip = &ino; + bsr.icount = 1; + bsr.ubuffer = &t; + bsr.ocount = NULL; + + e = ioctl(fd, XFS_IOC_FSBULKSTAT_SINGLE, &bsr) < 0 ? errno : 0; + if (v) + printf("%d/%d: bulkstat1 %s ino %lld %d\n", + procid, opno, good ? "real" : "random", + (long long)ino, e); + close(fd); +} + +#endif + +void chown_f(int opno, long r) +{ + int e; + pathname_t f; + int nbits; + uid_t u; + int v; + + init_pathname(&f); + if (!get_fname(FT_ANYm, r, &f, NULL, NULL, &v)) + append_pathname(&f, "."); + u = (uid_t) random(); + nbits = (int)(random() % 32); + u &= (1 << nbits) - 1; + e = lchown_path(&f, u, -1) < 0 ? errno : 0; + check_cwd(); + if (v) + printf("%d/%d: chown %s %d %d\n", procid, opno, f.path, u, e); + free_pathname(&f); +} + +void creat_f(int opno, long r) +{ + int e; + int e1; + int extsize; + pathname_t f; + int fd; + fent_t *fep; + int id; + int parid; + int type; + int v; + int v1; + int esz = 0; + + if (!get_fname(FT_DIRm, r, NULL, NULL, &fep, &v1)) + parid = -1; + else + parid = fep->id; + init_pathname(&f); + type = rtpct ? ((random() % 100) > rtpct ? FT_REG : FT_RTF) : FT_REG; + if (type == FT_RTF) + extsize = (random() % 10) + 1; + else + extsize = 0; + e = generate_fname(fep, type, &f, &id, &v); + v |= v1; + if (!e) { + if (v) { + fent_to_name(&f, &flist[FT_DIR], fep); + printf("%d/%d: creat - no filename from %s\n", + procid, opno, f.path); + } + free_pathname(&f); + return; + } + fd = creat_path(&f, 0666); + e = fd < 0 ? errno : 0; + e1 = 0; + check_cwd(); + esz = 0; + if (fd >= 0) { +#ifndef NO_XFS + struct fsxattr a; + memset(&a, 0, sizeof(a)); + if (extsize && ioctl(fd, XFS_IOC_FSGETXATTR, &a) >= 0) { + a.fsx_xflags |= XFS_XFLAG_REALTIME; + a.fsx_extsize = + geom.rtextsize * geom.blocksize * extsize; + if (ioctl(fd, XFS_IOC_FSSETXATTR, &a) < 0) + e1 = errno; + esz = a.fsx_extsize; + + } +#endif + add_to_flist(type, id, parid); + close(fd); + } + if (v) + printf("%d/%d: creat %s x:%d %d %d\n", procid, opno, f.path, + esz, e, e1); + free_pathname(&f); +} + +int setdirect(int fd) +{ + static int no_direct; + int flags; + + if (no_direct) + return 0; + + flags = fcntl(fd, F_GETFL, 0); + if (flags < 0) + return 0; + + if (fcntl(fd, F_SETFL, flags | O_DIRECT) < 0) { + if (no_xfs) { + no_direct = 1; + return 0; + } + printf("cannot set O_DIRECT: %s\n", strerror(errno)); + return 0; + } + + return 1; +} + +void dread_f(int opno, long r) +{ + __int64_t align; + char *buf = NULL; + struct dioattr diob; + int e; + pathname_t f; + int fd; + size_t len; + __int64_t lr; + off64_t off; + struct stat64 stb; + int v; + + init_pathname(&f); + if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) { + if (v) + printf("%d/%d: dread - no filename\n", procid, opno); + free_pathname(&f); + return; + } + fd = open_path(&f, O_RDONLY); + + e = fd < 0 ? errno : 0; + check_cwd(); + if (fd < 0) { + if (v) + printf("%d/%d: dread - open %s failed %d\n", + procid, opno, f.path, e); + free_pathname(&f); + return; + } + + if (!setdirect(fd)) { + close(fd); + free_pathname(&f); + return; + } + + if (fstat64(fd, &stb) < 0) { + if (v) + printf("%d/%d: dread - fstat64 %s failed %d\n", + procid, opno, f.path, errno); + free_pathname(&f); + close(fd); + return; + } + if (stb.st_size == 0) { + if (v) + printf("%d/%d: dread - %s zero size\n", procid, opno, + f.path); + free_pathname(&f); + close(fd); + return; + } + + memset(&diob, 0, sizeof(diob)); + if (no_xfs) { + diob.d_miniosz = stb.st_blksize; + diob.d_maxiosz = stb.st_blksize * 256; /* good number ? */ + diob.d_mem = stb.st_blksize; + } +#ifndef NO_XFS + else if (ioctl(fd, XFS_IOC_DIOINFO, &diob) < 0) { + if (v) + printf + ("%d/%d: dread - ioctl(fd, XFS_IOC_DIOINFO) %s failed %d\n", + procid, opno, f.path, errno); + free_pathname(&f); + close(fd); + return; + } +#endif + align = (__int64_t) diob.d_miniosz; + lr = ((__int64_t) random() << 32) + random(); + off = (off64_t) (lr % stb.st_size); + off -= (off % align); + lseek64(fd, off, SEEK_SET); + len = (random() % (getpagesize() * 32)) + 1; + len -= (len % align); + if (len <= 0) + len = align; + else if (len > diob.d_maxiosz) + len = diob.d_maxiosz; + if ((e = posix_memalign((void **)&buf, diob.d_mem, len)) != 0) { + fprintf(stderr, "posix_memalign: %s\n", strerror(e)); + exit(1); + } + if (buf == NULL) { + fprintf(stderr, "posix_memalign: buf is NULL\n"); + exit(1); + } + e = read(fd, buf, len) < 0 ? errno : 0; + free(buf); + if (v) + printf("%d/%d: dread %s [%lld,%ld] %d\n", + procid, opno, f.path, (long long int)off, (long)len, e); + free_pathname(&f); + close(fd); +} + +void dwrite_f(int opno, long r) +{ + __int64_t align; + char *buf = NULL; + struct dioattr diob; + int e; + pathname_t f; + int fd; + size_t len; + __int64_t lr; + off64_t off; + struct stat64 stb; + int v; + + init_pathname(&f); + if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) { + if (v) + printf("%d/%d: dwrite - no filename\n", procid, opno); + free_pathname(&f); + return; + } + fd = open_path(&f, O_WRONLY); + e = fd < 0 ? errno : 0; + check_cwd(); + if (fd < 0) { + if (v) + printf("%d/%d: dwrite - open %s failed %d\n", + procid, opno, f.path, e); + free_pathname(&f); + return; + } + + if (!setdirect(fd)) { + close(fd); + free_pathname(&f); + return; + } + if (fstat64(fd, &stb) < 0) { + if (v) + printf("%d/%d: dwrite - fstat64 %s failed %d\n", + procid, opno, f.path, errno); + free_pathname(&f); + close(fd); + return; + } + memset(&diob, 0, sizeof(diob)); + if (no_xfs) { + diob.d_miniosz = stb.st_blksize; + diob.d_maxiosz = stb.st_blksize * 256; /* good number ? */ + diob.d_mem = stb.st_blksize; + } +#ifndef NO_XFS + else if (ioctl(fd, XFS_IOC_DIOINFO, &diob) < 0) { + if (v) + printf + ("%d/%d: dwrite - ioctl(fd, XFS_IOC_DIOINFO) %s failed %d\n", + procid, opno, f.path, errno); + free_pathname(&f); + close(fd); + return; + } +#endif + align = (__int64_t) diob.d_miniosz; + lr = ((__int64_t) random() << 32) + random(); + off = (off64_t) (lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE)); + off -= (off % align); + lseek64(fd, off, SEEK_SET); + len = (random() % (getpagesize() * 32)) + 1; + len -= (len % align); + if (len <= 0) + len = align; + else if (len > diob.d_maxiosz) + len = diob.d_maxiosz; + if ((e = posix_memalign((void **)&buf, diob.d_mem, len)) != 0) { + fprintf(stderr, "posix_memalign: %s\n", strerror(e)); + exit(1); + } + if (buf == NULL) { + fprintf(stderr, "posix_memalign: buf is NULL\n"); + exit(1); + } + off %= maxfsize; + lseek64(fd, off, SEEK_SET); + memset(buf, nameseq & 0xff, len); + e = write(fd, buf, len) < 0 ? errno : 0; + free(buf); + if (v) + printf("%d/%d: dwrite %s [%lld,%ld] %d\n", + procid, opno, f.path, (long long)off, (long int)len, e); + free_pathname(&f); + close(fd); +} + +void fdatasync_f(int opno, long r) +{ + int e; + pathname_t f; + int fd; + int v; + + init_pathname(&f); + if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) { + if (v) + printf("%d/%d: fdatasync - no filename\n", + procid, opno); + free_pathname(&f); + return; + } + fd = open_path(&f, O_WRONLY); + e = fd < 0 ? errno : 0; + check_cwd(); + if (fd < 0) { + if (v) + printf("%d/%d: fdatasync - open %s failed %d\n", + procid, opno, f.path, e); + free_pathname(&f); + return; + } + e = fdatasync(fd) < 0 ? errno : 0; + if (v) + printf("%d/%d: fdatasync %s %d\n", procid, opno, f.path, e); + free_pathname(&f); + close(fd); +} + +#ifndef NO_XFS +void freesp_f(int opno, long r) +{ + int e; + pathname_t f; + int fd; + struct xfs_flock64 fl; + __s64 lr; + __s64 off; + struct stat64 stb; + int v; + + init_pathname(&f); + if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) { + if (v) + printf("%d/%d: freesp - no filename\n", procid, opno); + free_pathname(&f); + return; + } + fd = open_path(&f, O_RDWR); + e = fd < 0 ? errno : 0; + check_cwd(); + if (fd < 0) { + if (v) + printf("%d/%d: freesp - open %s failed %d\n", + procid, opno, f.path, e); + free_pathname(&f); + return; + } + if (fstat64(fd, &stb) < 0) { + if (v) + printf("%d/%d: freesp - fstat64 %s failed %d\n", + procid, opno, f.path, errno); + free_pathname(&f); + close(fd); + return; + } + lr = ((__s64) random() << 32) + random(); + off = lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE); + off %= maxfsize; + memset(&fl, 0, sizeof(fl)); + fl.l_whence = SEEK_SET; + fl.l_start = off; + fl.l_len = 0; + e = ioctl(fd, XFS_IOC_FREESP64, &fl) < 0 ? errno : 0; + if (v) + printf("%d/%d: ioctl(XFS_IOC_FREESP64) %s %lld 0 %d\n", + procid, opno, f.path, (long long)off, e); + free_pathname(&f); + close(fd); +} + +#endif + +void fsync_f(int opno, long r) +{ + int e; + pathname_t f; + int fd; + int v; + + init_pathname(&f); + if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) { + if (v) + printf("%d/%d: fsync - no filename\n", procid, opno); + free_pathname(&f); + return; + } + fd = open_path(&f, O_WRONLY); + e = fd < 0 ? errno : 0; + check_cwd(); + if (fd < 0) { + if (v) + printf("%d/%d: fsync - open %s failed %d\n", + procid, opno, f.path, e); + free_pathname(&f); + return; + } + e = fsync(fd) < 0 ? errno : 0; + if (v) + printf("%d/%d: fsync %s %d\n", procid, opno, f.path, e); + free_pathname(&f); + close(fd); +} + +void getdents_f(int opno, long r) +{ + DIR *dir; + pathname_t f; + int v; + + init_pathname(&f); + if (!get_fname(FT_DIRm, r, &f, NULL, NULL, &v)) + append_pathname(&f, "."); + dir = opendir_path(&f); + check_cwd(); + if (dir == NULL) { + if (v) + printf("%d/%d: getdents - can't open %s\n", + procid, opno, f.path); + free_pathname(&f); + return; + } + while (readdir64(dir) != NULL) + continue; + if (v) + printf("%d/%d: getdents %s 0\n", procid, opno, f.path); + free_pathname(&f); + closedir(dir); +} + +void link_f(int opno, long r) +{ + int e; + pathname_t f; + fent_t *fep; + flist_t *flp; + int id; + pathname_t l; + int parid; + int v; + int v1; + + init_pathname(&f); + if (!get_fname(FT_NOTDIR, r, &f, &flp, NULL, &v1)) { + if (v1) + printf("%d/%d: link - no file\n", procid, opno); + free_pathname(&f); + return; + } + if (!get_fname(FT_DIRm, random(), NULL, NULL, &fep, &v)) + parid = -1; + else + parid = fep->id; + v |= v1; + init_pathname(&l); + e = generate_fname(fep, flp - flist, &l, &id, &v1); + v |= v1; + if (!e) { + if (v) { + fent_to_name(&l, &flist[FT_DIR], fep); + printf("%d/%d: link - no filename from %s\n", + procid, opno, l.path); + } + free_pathname(&l); + free_pathname(&f); + return; + } + e = link_path(&f, &l) < 0 ? errno : 0; + check_cwd(); + if (e == 0) + add_to_flist(flp - flist, id, parid); + if (v) + printf("%d/%d: link %s %s %d\n", procid, opno, f.path, l.path, + e); + free_pathname(&l); + free_pathname(&f); +} + +void mkdir_f(int opno, long r) +{ + int e; + pathname_t f; + fent_t *fep; + int id; + int parid; + int v; + int v1; + + if (!get_fname(FT_DIRm, r, NULL, NULL, &fep, &v)) + parid = -1; + else + parid = fep->id; + init_pathname(&f); + e = generate_fname(fep, FT_DIR, &f, &id, &v1); + v |= v1; + if (!e) { + if (v) { + fent_to_name(&f, &flist[FT_DIR], fep); + printf("%d/%d: mkdir - no filename from %s\n", + procid, opno, f.path); + } + free_pathname(&f); + return; + } + e = mkdir_path(&f, 0777) < 0 ? errno : 0; + check_cwd(); + if (e == 0) + add_to_flist(FT_DIR, id, parid); + if (v) + printf("%d/%d: mkdir %s %d\n", procid, opno, f.path, e); + free_pathname(&f); +} + +void mknod_f(int opno, long r) +{ + int e; + pathname_t f; + fent_t *fep; + int id; + int parid; + int v; + int v1; + + if (!get_fname(FT_DIRm, r, NULL, NULL, &fep, &v)) + parid = -1; + else + parid = fep->id; + init_pathname(&f); + e = generate_fname(fep, FT_DEV, &f, &id, &v1); + v |= v1; + if (!e) { + if (v) { + fent_to_name(&f, &flist[FT_DIR], fep); + printf("%d/%d: mknod - no filename from %s\n", + procid, opno, f.path); + } + free_pathname(&f); + return; + } + e = mknod_path(&f, S_IFCHR | 0444, 0) < 0 ? errno : 0; + check_cwd(); + if (e == 0) + add_to_flist(FT_DEV, id, parid); + if (v) + printf("%d/%d: mknod %s %d\n", procid, opno, f.path, e); + free_pathname(&f); +} + +void read_f(int opno, long r) +{ + char *buf; + int e; + pathname_t f; + int fd; + size_t len; + __int64_t lr; + off64_t off; + struct stat64 stb; + int v; + + init_pathname(&f); + if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) { + if (v) + printf("%d/%d: read - no filename\n", procid, opno); + free_pathname(&f); + return; + } + fd = open_path(&f, O_RDONLY); + e = fd < 0 ? errno : 0; + check_cwd(); + if (fd < 0) { + if (v) + printf("%d/%d: read - open %s failed %d\n", + procid, opno, f.path, e); + free_pathname(&f); + return; + } + if (fstat64(fd, &stb) < 0) { + if (v) + printf("%d/%d: read - fstat64 %s failed %d\n", + procid, opno, f.path, errno); + free_pathname(&f); + close(fd); + return; + } + if (stb.st_size == 0) { + if (v) + printf("%d/%d: read - %s zero size\n", procid, opno, + f.path); + free_pathname(&f); + close(fd); + return; + } + lr = ((__int64_t) random() << 32) + random(); + off = (off64_t) (lr % stb.st_size); + lseek64(fd, off, SEEK_SET); + len = (random() % (getpagesize() * 32)) + 1; + buf = malloc(len); + e = read(fd, buf, len) < 0 ? errno : 0; + free(buf); + if (v) + printf("%d/%d: read %s [%lld,%ld] %d\n", + procid, opno, f.path, (long long)off, (long int)len, e); + free_pathname(&f); + close(fd); +} + +void readlink_f(int opno, long r) +{ + char buf[PATH_MAX]; + int e; + pathname_t f; + int v; + + init_pathname(&f); + if (!get_fname(FT_SYMm, r, &f, NULL, NULL, &v)) { + if (v) + printf("%d/%d: readlink - no filename\n", procid, opno); + free_pathname(&f); + return; + } + e = readlink_path(&f, buf, PATH_MAX) < 0 ? errno : 0; + check_cwd(); + if (v) + printf("%d/%d: readlink %s %d\n", procid, opno, f.path, e); + free_pathname(&f); +} + +void rename_f(int opno, long r) +{ + fent_t *dfep; + int e; + pathname_t f; + fent_t *fep; + flist_t *flp; + int id; + pathname_t newf; + int oldid; + int parid; + int v; + int v1; + + init_pathname(&f); + if (!get_fname(FT_ANYm, r, &f, &flp, &fep, &v1)) { + if (v1) + printf("%d/%d: rename - no filename\n", procid, opno); + free_pathname(&f); + return; + } + if (!get_fname(FT_DIRm, random(), NULL, NULL, &dfep, &v)) + parid = -1; + else + parid = dfep->id; + v |= v1; + init_pathname(&newf); + e = generate_fname(dfep, flp - flist, &newf, &id, &v1); + v |= v1; + if (!e) { + if (v) { + fent_to_name(&f, &flist[FT_DIR], dfep); + printf("%d/%d: rename - no filename from %s\n", + procid, opno, f.path); + } + free_pathname(&newf); + free_pathname(&f); + return; + } + e = rename_path(&f, &newf) < 0 ? errno : 0; + check_cwd(); + if (e == 0) { + if (flp - flist == FT_DIR) { + oldid = fep->id; + fix_parent(oldid, id); + } + del_from_flist(flp - flist, fep - flp->fents); + add_to_flist(flp - flist, id, parid); + } + if (v) + printf("%d/%d: rename %s to %s %d\n", procid, opno, f.path, + newf.path, e); + free_pathname(&newf); + free_pathname(&f); +} + +#ifndef NO_XFS +void resvsp_f(int opno, long r) +{ + int e; + pathname_t f; + int fd; + struct xfs_flock64 fl; + __s64 lr; + __s64 off; + struct stat64 stb; + int v; + + init_pathname(&f); + if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) { + if (v) + printf("%d/%d: resvsp - no filename\n", procid, opno); + free_pathname(&f); + return; + } + fd = open_path(&f, O_RDWR); + e = fd < 0 ? errno : 0; + check_cwd(); + if (fd < 0) { + if (v) + printf("%d/%d: resvsp - open %s failed %d\n", + procid, opno, f.path, e); + free_pathname(&f); + return; + } + if (fstat64(fd, &stb) < 0) { + if (v) + printf("%d/%d: resvsp - fstat64 %s failed %d\n", + procid, opno, f.path, errno); + free_pathname(&f); + close(fd); + return; + } + lr = ((__s64) random() << 32) + random(); + off = lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE); + off %= maxfsize; + memset(&fl, 0, sizeof(fl)); + fl.l_whence = SEEK_SET; + fl.l_start = off; + fl.l_len = (__s64) (random() % (1024 * 1024)); + e = ioctl(fd, XFS_IOC_RESVSP64, &fl) < 0 ? errno : 0; + if (v) + printf("%d/%d: ioctl(XFS_IOC_RESVSP64) %s %lld %lld %d\n", + procid, opno, f.path, (long long)off, + (long long)fl.l_len, e); + free_pathname(&f); + close(fd); +} +#endif + +void rmdir_f(int opno, long r) +{ + int e; + pathname_t f; + fent_t *fep; + int v; + + init_pathname(&f); + if (!get_fname(FT_DIRm, r, &f, NULL, &fep, &v)) { + if (v) + printf("%d/%d: rmdir - no directory\n", procid, opno); + free_pathname(&f); + return; + } + e = rmdir_path(&f) < 0 ? errno : 0; + check_cwd(); + if (e == 0) + del_from_flist(FT_DIR, fep - flist[FT_DIR].fents); + if (v) + printf("%d/%d: rmdir %s %d\n", procid, opno, f.path, e); + free_pathname(&f); +} + +void stat_f(int opno, long r) +{ + int e; + pathname_t f; + struct stat64 stb; + int v; + + init_pathname(&f); + if (!get_fname(FT_ANYm, r, &f, NULL, NULL, &v)) { + if (v) + printf("%d/%d: stat - no entries\n", procid, opno); + free_pathname(&f); + return; + } + e = lstat64_path(&f, &stb) < 0 ? errno : 0; + check_cwd(); + if (v) + printf("%d/%d: stat %s %d\n", procid, opno, f.path, e); + free_pathname(&f); +} + +void symlink_f(int opno, long r) +{ + int e; + pathname_t f; + fent_t *fep; + int i; + int id; + int len; + int parid; + int v; + int v1; + char *val; + + if (!get_fname(FT_DIRm, r, NULL, NULL, &fep, &v)) + parid = -1; + else + parid = fep->id; + init_pathname(&f); + e = generate_fname(fep, FT_SYM, &f, &id, &v1); + v |= v1; + if (!e) { + if (v) { + fent_to_name(&f, &flist[FT_DIR], fep); + printf("%d/%d: symlink - no filename from %s\n", + procid, opno, f.path); + } + free_pathname(&f); + return; + } + len = (int)(random() % PATH_MAX); + val = malloc(len + 1); + if (len) + memset(val, 'x', len); + val[len] = '\0'; + for (i = 10; i < len - 1; i += 10) + val[i] = '/'; + e = symlink_path(val, &f) < 0 ? errno : 0; + check_cwd(); + if (e == 0) + add_to_flist(FT_SYM, id, parid); + free(val); + if (v) + printf("%d/%d: symlink %s %d\n", procid, opno, f.path, e); + free_pathname(&f); +} + +/* ARGSUSED */ +void sync_f(int opno, long r) +{ + sync(); + if (verbose) + printf("%d/%d: sync\n", procid, opno); +} + +void truncate_f(int opno, long r) +{ + int e; + pathname_t f; + __int64_t lr; + off64_t off; + struct stat64 stb; + int v; + + init_pathname(&f); + if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) { + if (v) + printf("%d/%d: truncate - no filename\n", procid, opno); + free_pathname(&f); + return; + } + e = stat64_path(&f, &stb) < 0 ? errno : 0; + check_cwd(); + if (e > 0) { + if (v) + printf("%d/%d: truncate - stat64 %s failed %d\n", + procid, opno, f.path, e); + free_pathname(&f); + return; + } + lr = ((__int64_t) random() << 32) + random(); + off = lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE); + off %= maxfsize; + e = truncate64_path(&f, off) < 0 ? errno : 0; + check_cwd(); + if (v) + printf("%d/%d: truncate %s %lld %d\n", procid, opno, f.path, + (long long)off, e); + free_pathname(&f); +} + +void unlink_f(int opno, long r) +{ + int e; + pathname_t f; + fent_t *fep; + flist_t *flp; + int v; + + init_pathname(&f); + if (!get_fname(FT_NOTDIR, r, &f, &flp, &fep, &v)) { + if (v) + printf("%d/%d: unlink - no file\n", procid, opno); + free_pathname(&f); + return; + } + e = unlink_path(&f) < 0 ? errno : 0; + check_cwd(); + if (e == 0) + del_from_flist(flp - flist, fep - flp->fents); + if (v) + printf("%d/%d: unlink %s %d\n", procid, opno, f.path, e); + free_pathname(&f); +} + +#ifndef NO_XFS +void unresvsp_f(int opno, long r) +{ + int e; + pathname_t f; + int fd; + struct xfs_flock64 fl; + __s64 lr; + __s64 off; + struct stat64 stb; + int v; + + init_pathname(&f); + if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) { + if (v) + printf("%d/%d: unresvsp - no filename\n", procid, opno); + free_pathname(&f); + return; + } + fd = open_path(&f, O_RDWR); + e = fd < 0 ? errno : 0; + check_cwd(); + if (fd < 0) { + if (v) + printf("%d/%d: unresvsp - open %s failed %d\n", + procid, opno, f.path, e); + free_pathname(&f); + return; + } + if (fstat64(fd, &stb) < 0) { + if (v) + printf("%d/%d: unresvsp - fstat64 %s failed %d\n", + procid, opno, f.path, errno); + free_pathname(&f); + close(fd); + return; + } + lr = ((__s64) random() << 32) + random(); + off = lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE); + off %= maxfsize; + memset(&fl, 0, sizeof(fl)); + fl.l_whence = SEEK_SET; + fl.l_start = off; + fl.l_len = (__s64) (random() % (1 << 20)); + e = ioctl(fd, XFS_IOC_UNRESVSP64, &fl) < 0 ? errno : 0; + if (v) + printf("%d/%d: ioctl(XFS_IOC_UNRESVSP64) %s %lld %lld %d\n", + procid, opno, f.path, (long long)off, + (long long)fl.l_len, e); + free_pathname(&f); + close(fd); +} +#endif + +void write_f(int opno, long r) +{ + char *buf; + int e; + pathname_t f; + int fd; + size_t len; + __int64_t lr; + off64_t off; + struct stat64 stb; + int v; + + init_pathname(&f); + if (!get_fname(FT_REGm, r, &f, NULL, NULL, &v)) { + if (v) + printf("%d/%d: write - no filename\n", procid, opno); + free_pathname(&f); + return; + } + fd = open_path(&f, O_WRONLY); + e = fd < 0 ? errno : 0; + check_cwd(); + if (fd < 0) { + if (v) + printf("%d/%d: write - open %s failed %d\n", + procid, opno, f.path, e); + free_pathname(&f); + return; + } + if (fstat64(fd, &stb) < 0) { + if (v) + printf("%d/%d: write - fstat64 %s failed %d\n", + procid, opno, f.path, errno); + free_pathname(&f); + close(fd); + return; + } + lr = ((__int64_t) random() << 32) + random(); + off = (off64_t) (lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE)); + off %= maxfsize; + lseek64(fd, off, SEEK_SET); + len = (random() % (getpagesize() * 32)) + 1; + buf = malloc(len); + memset(buf, nameseq & 0xff, len); + e = write(fd, buf, len) < 0 ? errno : 0; + free(buf); + if (v) + printf("%d/%d: write %s [%lld,%ld] %d\n", + procid, opno, f.path, (long long)off, (long int)len, e); + free_pathname(&f); + close(fd); +} diff --git a/src/_nfdos/e2fsprogs/contrib/make-sparse.c b/src/_nfdos/e2fsprogs/contrib/make-sparse.c new file mode 100644 index 0000000..98b86b0 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/make-sparse.c @@ -0,0 +1,91 @@ +/* + * make-sparse.c --- make a sparse file from stdin + * + * Copyright 2004 by Theodore Ts'o. + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU Public + * License. + * %End-Header% + */ + +#ifndef _LARGEFILE_SOURCE +#define _LARGEFILE_SOURCE +#endif +#ifndef _LARGEFILE64_SOURCE +#define _LARGEFILE64_SOURCE +#endif + +#include +#include +#include +#include +#include +#include +#include + +int full_read(int fd, char *buf, size_t count) +{ + int got, total = 0; + int pass = 0; + + while (count > 0) { + got = read(fd, buf, count); + if (got == -1) { + if ((errno == EINTR) || (errno == EAGAIN)) + continue; + return total ? total : -1; + } + if (got == 0) { + if (pass++ >= 3) + return total; + continue; + } + pass = 0; + buf += got; + total += got; + count -= got; + } + return total; +} + +int main(int argc, char **argv) +{ + int fd, got, i; + int zflag = 0; + char buf[1024]; + + if (argc != 2) { + fprintf(stderr, "Usage: make-sparse out-file\n"); + exit(1); + } + fd = open(argv[1], O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0777); + if (fd < 0) { + perror(argv[1]); + exit(1); + } + while (1) { + got = full_read(0, buf, sizeof(buf)); + if (got == 0) + break; + if (got == sizeof(buf)) { + for (i=0; i < sizeof(buf); i++) + if (buf[i]) + break; + if (i == sizeof(buf)) { + lseek(fd, sizeof(buf), SEEK_CUR); + zflag = 1; + continue; + } + } + zflag = 0; + write(fd, buf, got); + } + if (zflag) { + lseek(fd, -1, SEEK_CUR); + buf[0] = 0; + write(fd, buf, 1); + } + return 0; +} + diff --git a/src/_nfdos/e2fsprogs/contrib/populate-extfs.sh b/src/_nfdos/e2fsprogs/contrib/populate-extfs.sh new file mode 100755 index 0000000..b1d3d1f --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/populate-extfs.sh @@ -0,0 +1,105 @@ +#!/bin/sh +# +# This script uses debugfs command to populate the ext2/3/4 filesystem +# from a given directory. +# + +do_usage () { + cat << _EOF +Usage: populate-extfs.sh +Create an ext2/ext3/ext4 filesystem from a directory or file + + source: The source directory or file + device: The target device + +_EOF + exit 1 +} + +[ $# -ne 2 ] && do_usage + +SRCDIR=${1%%/} +DEVICE=$2 + +# Find where is the debugfs command if not found in the env. +if [ -z "$DEBUGFS" ]; then + CONTRIB_DIR=$(dirname $(readlink -f $0)) + DEBUGFS="$CONTRIB_DIR/../debugfs/debugfs" +fi + +{ + CWD="/" + find $SRCDIR | while read FILE; do + TGT="${FILE##*/}" + DIR="${FILE#$SRCDIR}" + DIR="${DIR%$TGT}" + + # Skip the root dir + [ ! -z "$DIR" ] || continue + [ ! -z "$TGT" ] || continue + + if [ "$DIR" != "$CWD" ]; then + echo "cd $DIR" + CWD="$DIR" + fi + + # Only stat once since stat is a time consuming command + STAT=$(stat -c "TYPE=\"%F\";DEVNO=\"0x%t 0x%T\";MODE=\"%f\";U=\"%u\";G=\"%g\"" $FILE) + eval $STAT + + case $TYPE in + "directory") + echo "mkdir $TGT" + ;; + "regular file" | "regular empty file") + echo "write $FILE $TGT" + ;; + "symbolic link") + LINK_TGT=$(readlink $FILE) + echo "symlink $TGT $LINK_TGT" + ;; + "block special file") + echo "mknod $TGT b $DEVNO" + ;; + "character special file") + echo "mknod $TGT c $DEVNO" + ;; + "fifo") + echo "mknod $TGT p" + ;; + *) + echo "Unknown/unhandled file type '$TYPE' file: $FILE" 1>&2 + ;; + esac + + # Set the file mode + echo "sif $TGT mode 0x$MODE" + + # Set uid and gid + echo "sif $TGT uid $U" + echo "sif $TGT gid $G" + done + + # Handle the hard links. + # Save the hard links to a file, use the inode number as the filename, for example: + # If a and b's inode number is 6775928, save a and b to /tmp/tmp.VrCwHh5gdt/6775928. + INODE_DIR=`mktemp -d` || exit 1 + for i in `find $SRCDIR -type f -links +1 -printf 'INODE=%i###FN=%p\n'`; do + eval `echo $i | sed 's$###$ $'` + echo ${FN#$SRCDIR} >>$INODE_DIR/$INODE + done + # Use the debugfs' ln and "sif links_count" to handle them. + for i in `ls $INODE_DIR`; do + # The link source + SRC=`head -1 $INODE_DIR/$i` + # Remove the files and link them again except the first one + for TGT in `sed -n -e '1!p' $INODE_DIR/$i`; do + echo "rm $TGT" + echo "ln $SRC $TGT" + done + LN_CNT=`cat $INODE_DIR/$i | wc -l` + # Set the links count + echo "sif $SRC links_count $LN_CNT" + done + rm -fr $INODE_DIR +} | $DEBUGFS -w -f - $DEVICE diff --git a/src/_nfdos/e2fsprogs/contrib/python-uuid/setup.py b/src/_nfdos/e2fsprogs/contrib/python-uuid/setup.py new file mode 100755 index 0000000..3934d17 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/python-uuid/setup.py @@ -0,0 +1,11 @@ +#!/usr/bin/python +from distutils.core import setup, Extension + +uuid = Extension('e2fsprogs_uuid', + sources = ['uuid.c'], + libraries = ['uuid']) + +setup (name = 'e2fsprogs_uuid', + version = '1.0', + description = 'This is python uuid interface', + ext_modules = [uuid]) diff --git a/src/_nfdos/e2fsprogs/contrib/python-uuid/test.py b/src/_nfdos/e2fsprogs/contrib/python-uuid/test.py new file mode 100755 index 0000000..2264f62 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/python-uuid/test.py @@ -0,0 +1,18 @@ +#!/usr/bin/python +import e2fsprogs_uuid +import time + +print "Generating uuid...", +try: + time = time.time() + u = e2fsprogs_uuid.generate() +except: + u = "FAIL" +print u, "...", time + +print "Calling generate with param...", +try: + e2fsprogs_uuid.generate("param") + print "FAIL." +except: + print "OK" diff --git a/src/_nfdos/e2fsprogs/contrib/python-uuid/uuid.c b/src/_nfdos/e2fsprogs/contrib/python-uuid/uuid.c new file mode 100644 index 0000000..34dd56a --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/python-uuid/uuid.c @@ -0,0 +1,23 @@ +#include +#include +#include + +static PyObject * _uuid_generate(PyObject *self, PyObject *args) +{ + uuid_t u; + char uuid[37]; + if (!PyArg_ParseTuple(args, "")) return NULL; + uuid_generate(u); + uuid_unparse(u, uuid); + return Py_BuildValue("s", uuid); +} + +static PyMethodDef _uuid_methods[] = { + {"generate", _uuid_generate, METH_VARARGS, "Generate UUID"}, + {NULL, NULL, 0, NULL} +}; + +void inite2fsprogs_uuid(void) +{ + (void) Py_InitModule("e2fsprogs_uuid", _uuid_methods); +} diff --git a/src/_nfdos/e2fsprogs/contrib/setup-schroot b/src/_nfdos/e2fsprogs/contrib/setup-schroot new file mode 100755 index 0000000..f3f45c6 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/setup-schroot @@ -0,0 +1,46 @@ +#!/bin/bash +# +# This script sets up a schroot suitable for building e2fsprogs +# on a Debian portable box + +while [ "$1" != "" ]; +do + case "$1" in + --base) shift + BASE_CHROOT="$1" + ;; + --chroot) shift + CHROOT="$1" + ;; + --help|help) + echo "Usage: setup-schroot [--base ] [--chroot ]" + exit 0 + ;; + *) + echo "unknown option: $1" + exit 1 + ;; + esac + shift +done + +if test -z "$BASE_CHROOT" ; then + BASE_CHROOT=sid +fi + +if test -z "$CHROOT" ; then + CHROOT="$USER-$BASE_CHROOT" +fi + +echo "Setting up $CHROOT using $BASE_CHROOT..." +schroot -b -n "$CHROOT" -c "$BASE_CHROOT" +dd-schroot-cmd -c "$CHROOT" apt-get update +dd-schroot-cmd -c "$CHROOT" -y apt-get upgrade +dd-schroot-cmd -c "$CHROOT" -y apt-get build-dep e2fsprogs +dd-schroot-cmd -c "$CHROOT" -y apt-get install git gdb emacs-nox lintian \ + acl libreadline-dev dh-exec cron +dd-schroot-cmd -c "$CHROOT" -y apt-get install udev systemd +echo " " +echo "Start chroot by running: " +echo "schroot -r -c $CHROOT" +echo " " diff --git a/src/_nfdos/e2fsprogs/contrib/spd_readdir.c b/src/_nfdos/e2fsprogs/contrib/spd_readdir.c new file mode 100644 index 0000000..8345fa1 --- /dev/null +++ b/src/_nfdos/e2fsprogs/contrib/spd_readdir.c @@ -0,0 +1,458 @@ +/* + * readdir accelerator + * + * (C) Copyright 2003, 2004, 2008 by Theodore Ts'o. + * + * 2008-06-08 Modified by Ross Boylan + * Added support for readdir_r and readdir64_r calls. Note + * this has not been tested on anything other than GNU/Linux i386, + * and that the regular readdir wrapper will take slightly more + * space than Ted's original since it now includes a lock. + * + * Compile using the command: + * + * gcc -o spd_readdir.so -shared -fpic spd_readdir.c -ldl + * + * Use it by setting the LD_PRELOAD environment variable: + * + * export LD_PRELOAD=/usr/local/sbin/spd_readdir.so + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU Public + * License. + * %End-Header% + * + */ + +#define ALLOC_STEPSIZE 100 +#define MAX_DIRSIZE 0 + +#define DEBUG +/* Util we autoconfiscate spd_readdir... */ +#define HAVE___SECURE_GETENV 1 +#define HAVE_PRCTL 1 +#define HAVE_SYS_PRCTL_H 1 + +#ifdef DEBUG +#define DEBUG_DIR(x) {if (do_debug) { x; }} +#else +#define DEBUG_DIR(x) +#endif + +#define _GNU_SOURCE +#define __USE_LARGEFILE64 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_PRCTL_H +#include +#else +#define PR_GET_DUMPABLE 3 +#endif +#include + +struct dirent_s { + unsigned long long d_ino; + long long d_off; + unsigned short int d_reclen; + unsigned char d_type; + char *d_name; +}; + +struct dir_s { + DIR *dir; + pthread_mutex_t lock; /* Mutex lock for this structure. */ + int num; + int max; + struct dirent_s *dp; + int pos; + int direct; + struct dirent ret_dir; + struct dirent64 ret_dir64; +}; + +static int (*real_closedir)(DIR *dir) = 0; +static DIR *(*real_opendir)(const char *name) = 0; +static DIR *(*real_fdopendir)(int fd) = 0; +static void *(*real_rewinddir)(DIR *dirp) = 0; +static struct dirent *(*real_readdir)(DIR *dir) = 0; +static int (*real_readdir_r)(DIR *dir, struct dirent *entry, + struct dirent **result) = 0; +static struct dirent64 *(*real_readdir64)(DIR *dir) = 0; +static int (*real_readdir64_r)(DIR *dir, struct dirent64 *entry, + struct dirent64 **result) = 0; +static off_t (*real_telldir)(DIR *dir) = 0; +static void (*real_seekdir)(DIR *dir, off_t offset) = 0; +static int (*real_dirfd)(DIR *dir) = 0; +static unsigned long max_dirsize = MAX_DIRSIZE; +static int num_open = 0; +#ifdef DEBUG +static int do_debug = 0; +#endif + +static char *safe_getenv(const char *arg) +{ + if ((getuid() != geteuid()) || (getgid() != getegid())) + return NULL; +#if HAVE_PRCTL + if (prctl(PR_GET_DUMPABLE, 0, 0, 0, 0) == 0) + return NULL; +#else +#if (defined(linux) && defined(SYS_prctl)) + if (syscall(SYS_prctl, PR_GET_DUMPABLE, 0, 0, 0, 0) == 0) + return NULL; +#endif +#endif + +#if HAVE___SECURE_GETENV + return __secure_getenv(arg); +#else + return getenv(arg); +#endif +} + +static void setup_ptr() +{ + char *cp; + + real_opendir = dlsym(RTLD_NEXT, "opendir"); + real_fdopendir = dlsym(RTLD_NEXT, "fdopendir"); + real_closedir = dlsym(RTLD_NEXT, "closedir"); + real_rewinddir = dlsym(RTLD_NEXT, "rewinddir"); + real_readdir = dlsym(RTLD_NEXT, "readdir"); + real_readdir_r = dlsym(RTLD_NEXT, "readdir_r"); + real_readdir64 = dlsym(RTLD_NEXT, "readdir64"); + real_readdir64_r = dlsym(RTLD_NEXT, "readdir64_r"); + real_telldir = dlsym(RTLD_NEXT, "telldir"); + real_seekdir = dlsym(RTLD_NEXT, "seekdir"); + real_dirfd = dlsym(RTLD_NEXT, "dirfd"); + if ((cp = safe_getenv("SPD_READDIR_MAX_SIZE")) != NULL) { + max_dirsize = atol(cp); + } +#ifdef DEBUG + if (safe_getenv("SPD_READDIR_DEBUG")) { + printf("initialized!\n"); + do_debug++; + } +#endif +} + +static void free_cached_dir(struct dir_s *dirstruct) +{ + int i; + + pthread_mutex_destroy(&(dirstruct->lock)); + + if (!dirstruct->dp) + return; + + for (i=0; i < dirstruct->num; i++) { + free(dirstruct->dp[i].d_name); + } + free(dirstruct->dp); + dirstruct->dp = 0; + dirstruct->max = dirstruct->num = 0; +} + +static int ino_cmp(const void *a, const void *b) +{ + const struct dirent_s *ds_a = (const struct dirent_s *) a; + const struct dirent_s *ds_b = (const struct dirent_s *) b; + ino_t i_a, i_b; + + i_a = ds_a->d_ino; + i_b = ds_b->d_ino; + + if (ds_a->d_name[0] == '.') { + if (ds_a->d_name[1] == 0) + i_a = 0; + else if ((ds_a->d_name[1] == '.') && (ds_a->d_name[2] == 0)) + i_a = 1; + } + if (ds_b->d_name[0] == '.') { + if (ds_b->d_name[1] == 0) + i_b = 0; + else if ((ds_b->d_name[1] == '.') && (ds_b->d_name[2] == 0)) + i_b = 1; + } + + return (i_a - i_b); +} + +static struct dir_s *alloc_dirstruct(DIR *dir) +{ + struct dir_s *dirstruct; + static pthread_mutexattr_t mutexattr; + mutexattr.__align = PTHREAD_MUTEX_RECURSIVE; + + dirstruct = malloc(sizeof(struct dir_s)); + if (dirstruct) + memset(dirstruct, 0, sizeof(struct dir_s)); + dirstruct->dir = dir; + pthread_mutex_init(&(dirstruct->lock), &mutexattr); + return dirstruct; +} + +static void cache_dirstruct(struct dir_s *dirstruct) +{ + struct dirent_s *ds, *dnew; + struct dirent64 *d; + + while ((d = (*real_readdir64)(dirstruct->dir)) != NULL) { + if (dirstruct->num >= dirstruct->max) { + dirstruct->max += ALLOC_STEPSIZE; + DEBUG_DIR(printf("Reallocating to size %d\n", + dirstruct->max)); + dnew = realloc(dirstruct->dp, + dirstruct->max * sizeof(struct dir_s)); + if (!dnew) + goto nomem; + dirstruct->dp = dnew; + } + ds = &dirstruct->dp[dirstruct->num++]; + ds->d_ino = d->d_ino; + ds->d_off = d->d_off; + ds->d_reclen = d->d_reclen; + ds->d_type = d->d_type; + if ((ds->d_name = malloc(strlen(d->d_name)+1)) == NULL) { + dirstruct->num--; + goto nomem; + } + strcpy(ds->d_name, d->d_name); + DEBUG_DIR(printf("readdir: %lu %s\n", + (unsigned long) d->d_ino, d->d_name)); + } + qsort(dirstruct->dp, dirstruct->num, sizeof(struct dirent_s), ino_cmp); + return; +nomem: + DEBUG_DIR(printf("No memory, backing off to direct readdir\n")); + free_cached_dir(dirstruct); + dirstruct->direct = 1; +} + +DIR *opendir(const char *name) +{ + DIR *dir; + struct dir_s *dirstruct; + struct stat st; + + if (!real_opendir) + setup_ptr(); + + DEBUG_DIR(printf("Opendir(%s) (%d open)\n", name, num_open++)); + dir = (*real_opendir)(name); + if (!dir) + return NULL; + + dirstruct = alloc_dirstruct(dir); + if (!dirstruct) { + (*real_closedir)(dir); + errno = -ENOMEM; + return NULL; + } + + if (max_dirsize && (stat(name, &st) == 0) && + (st.st_size > max_dirsize)) { + DEBUG_DIR(printf("Directory size %ld, using direct readdir\n", + st.st_size)); + dirstruct->direct = 1; + return (DIR *) dirstruct; + } + + cache_dirstruct(dirstruct); + return ((DIR *) dirstruct); +} + +DIR *fdopendir(int fd) +{ + DIR *dir; + struct dir_s *dirstruct; + struct stat st; + + if (!real_fdopendir) + setup_ptr(); + + DEBUG_DIR(printf("fdopendir(%d) (%d open)\n", fd, num_open++)); + dir = (*real_fdopendir)(fd); + if (!dir) + return NULL; + + dirstruct = alloc_dirstruct(dir); + if (!dirstruct) { + (*real_closedir)(dir); + errno = -ENOMEM; + return NULL; + } + + if (max_dirsize && (fstat(fd, &st) == 0) && + (st.st_size > max_dirsize)) { + DEBUG_DIR(printf("Directory size %ld, using direct readdir\n", + st.st_size)); + dirstruct->dir = dir; + dirstruct->direct = 1; + return (DIR *) dirstruct; + } + + cache_dirstruct(dirstruct); + return ((DIR *) dirstruct); +} + +int closedir(DIR *dir) +{ + struct dir_s *dirstruct = (struct dir_s *) dir; + + DEBUG_DIR(printf("Closedir (%d open)\n", --num_open)); + if (dirstruct->dir) + (*real_closedir)(dirstruct->dir); + + free_cached_dir(dirstruct); + free(dirstruct); + return 0; +} + +struct dirent *readdir(DIR *dir) +{ + struct dir_s *dirstruct = (struct dir_s *) dir; + struct dirent_s *ds; + + if (dirstruct->direct) + return (*real_readdir)(dirstruct->dir); + + if (dirstruct->pos >= dirstruct->num) + return NULL; + + ds = &dirstruct->dp[dirstruct->pos++]; + dirstruct->ret_dir.d_ino = ds->d_ino; + dirstruct->ret_dir.d_off = ds->d_off; + dirstruct->ret_dir.d_reclen = ds->d_reclen; + dirstruct->ret_dir.d_type = ds->d_type; + strncpy(dirstruct->ret_dir.d_name, ds->d_name, + sizeof(dirstruct->ret_dir.d_name)); + + return (&dirstruct->ret_dir); +} + +int readdir_r(DIR *dir, struct dirent *entry, struct dirent **result) +{ + struct dir_s *dirstruct = (struct dir_s *) dir; + struct dirent_s *ds; + + if (dirstruct->direct) + return (*real_readdir_r)(dirstruct->dir, entry, result); + + pthread_mutex_lock(&(dirstruct->lock)); + if (dirstruct->pos >= dirstruct->num) { + *result = NULL; + } else { + ds = &dirstruct->dp[dirstruct->pos++]; + entry->d_ino = ds->d_ino; + entry->d_off = ds->d_off; + entry->d_reclen = ds->d_reclen; + entry->d_type = ds->d_type; + strncpy(entry->d_name, ds->d_name, sizeof(entry->d_name)); + *result = entry; + } + pthread_mutex_unlock(&(dirstruct->lock)); + return 0; +} + +struct dirent64 *readdir64(DIR *dir) +{ + struct dir_s *dirstruct = (struct dir_s *) dir; + struct dirent_s *ds; + + if (dirstruct->direct) + return (*real_readdir64)(dirstruct->dir); + + if (dirstruct->pos >= dirstruct->num) + return NULL; + + ds = &dirstruct->dp[dirstruct->pos++]; + dirstruct->ret_dir64.d_ino = ds->d_ino; + dirstruct->ret_dir64.d_off = ds->d_off; + dirstruct->ret_dir64.d_reclen = ds->d_reclen; + dirstruct->ret_dir64.d_type = ds->d_type; + strncpy(dirstruct->ret_dir64.d_name, ds->d_name, + sizeof(dirstruct->ret_dir64.d_name)); + + return (&dirstruct->ret_dir64); +} + +int readdir64_r (DIR *__restrict dir, + struct dirent64 *__restrict entry, + struct dirent64 **__restrict result) +{ + struct dir_s *dirstruct = (struct dir_s *) dir; + struct dirent_s *ds; + + if (dirstruct->direct) + return (*real_readdir64_r)(dir, entry, result); + pthread_mutex_lock(&(dirstruct->lock)); + if (dirstruct->pos >= dirstruct->num) { + *result = NULL; + } else { + ds = &dirstruct->dp[dirstruct->pos++]; + entry->d_ino = ds->d_ino; + entry->d_off = ds->d_off; + entry->d_reclen = ds->d_reclen; + entry->d_type = ds->d_type; + strncpy(entry->d_name, ds->d_name, + sizeof(entry->d_name)); + *result = entry; + } + pthread_mutex_unlock(&(dirstruct->lock)); + return 0; +} + +off_t telldir(DIR *dir) +{ + struct dir_s *dirstruct = (struct dir_s *) dir; + + if (dirstruct->direct) + return (*real_telldir)(dirstruct->dir); + + return ((off_t) dirstruct->pos); +} + +void seekdir(DIR *dir, off_t offset) +{ + struct dir_s *dirstruct = (struct dir_s *) dir; + + if (dirstruct->direct) { + (*real_seekdir)(dirstruct->dir, offset); + return; + } + + dirstruct->pos = offset; +} + +void rewinddir(DIR *dir) +{ + struct dir_s *dirstruct = (struct dir_s *) dir; + + (*real_rewinddir)(dirstruct->dir); + if (dirstruct->direct) + return; + + pthread_mutex_lock(&(dirstruct->lock)); + dirstruct->pos = 0; + free_cached_dir(dirstruct); + cache_dirstruct(dirstruct); + pthread_mutex_unlock(&(dirstruct->lock)); +} + +int dirfd(DIR *dir) +{ + struct dir_s *dirstruct = (struct dir_s *) dir; + int fd = (*real_dirfd)(dirstruct->dir); + + DEBUG_DIR(printf("dirfd %d, %p\n", fd, real_dirfd)); + return fd; +} diff --git a/src/_nfdos/e2fsprogs/debian/.gitignore b/src/_nfdos/e2fsprogs/debian/.gitignore new file mode 100644 index 0000000..91d8482 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/.gitignore @@ -0,0 +1 @@ +!patches diff --git a/src/_nfdos/e2fsprogs/debian/attic/comerrg-dev.info b/src/_nfdos/e2fsprogs/debian/attic/comerrg-dev.info new file mode 100644 index 0000000..8bd344b --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/attic/comerrg-dev.info @@ -0,0 +1,4 @@ +DESCR="The Common Error Description library." +SECTION_MATCH="Development" +SECTION_NAME="Development" +FILE=com_err.info diff --git a/src/_nfdos/e2fsprogs/debian/attic/comerrg-dev.menu b/src/_nfdos/e2fsprogs/debian/attic/comerrg-dev.menu new file mode 100644 index 0000000..7dddab3 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/attic/comerrg-dev.menu @@ -0,0 +1,7 @@ +?package(comerrg-dev):needs="dwww" section="Apps/Programming"\ + title="The com_err library" \ + longtitle="The Common Error Description library"\ + description="libcomerr is an attempt to present a common error-handling mechanism to \ + manipulate the most common form of error code in a fashion that does not \ + have the problems identified with mechanisms commonly in use." \ + command="/usr/doc/comerrg-dev/html-info/com_err_toc.html" diff --git a/src/_nfdos/e2fsprogs/debian/attic/e2fslibsg-dev.info b/src/_nfdos/e2fsprogs/debian/attic/e2fslibsg-dev.info new file mode 100644 index 0000000..e1be950 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/attic/e2fslibsg-dev.info @@ -0,0 +1,4 @@ +DESCR="Library of routines to manipulate an ext2 filesystem." +SECTION_MATCH="Development" +SECTION_NAME="Development" +FILE=libext2fs.info diff --git a/src/_nfdos/e2fsprogs/debian/attic/e2fslibsg-dev.menu b/src/_nfdos/e2fsprogs/debian/attic/e2fslibsg-dev.menu new file mode 100644 index 0000000..7ace8c0 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/attic/e2fslibsg-dev.menu @@ -0,0 +1,4 @@ +?package(e2fslibsg-dev):needs="dwww" section="Apps/Programming"\ + title="The ext2fs library." \ + longtitle="A library to handle low-level structures in an ext2 filesystem"\ + command="/usr/doc/e2fslibsg-dev/html-info/libext2fs_toc.html" diff --git a/src/_nfdos/e2fsprogs/debian/attic/libs/comerr2g.files b/src/_nfdos/e2fsprogs/debian/attic/libs/comerr2g.files new file mode 100644 index 0000000..4f1f552 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/attic/libs/comerr2g.files @@ -0,0 +1,2 @@ +lib/libcom_err.so.?.* +lib/libcom_err.so.? diff --git a/src/_nfdos/e2fsprogs/debian/attic/libs/control b/src/_nfdos/e2fsprogs/debian/attic/libs/control new file mode 100644 index 0000000..4205120 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/attic/libs/control @@ -0,0 +1,114 @@ +Source: e2fsprogs +Section: base +Priority: required +Maintainer: Yann Dirson +Standards-Version: 2.4.0.0 + +Package: e2fsprogs +Essential: yes +Depends: ${shlibs:Depends} +Conflicts: e2fsprogsg, dump (<< 0.4b4-4), quota (<< 1.55-8.1) +Architecture: any +Description: The EXT2 file system utilities. + EXT2 stands for "Extended Filesystem", version 2. It's the main + filesystem type used for hard disks on Debian and other Linux systems. + . + This package contains programs for creating, checking, and maintaining EXT2 + filesystems, and the generic `fsck' wrapper. + . + This release may break older versions of dump and quota. + +Package: comerr2g +Depends: ${shlibs:Depends} +Conflicts: e2fsprogs (<< 1.10-6), comerr2 +Architecture: any +Description: The Common Error Description library - shared libraries. + libcomerr is an attempt to present a common error-handling mechanism to + manipulate the most common form of error code in a fashion that does not + have the problems identified with mechanisms commonly in use. + . + It is mainly used by the EXT2-filesystem tools. + +Package: ss2g +Depends: ${shlibs:Depends} +Conflicts: e2fsprogs (<< 1.10-6), ss2 +Architecture: any +Description: "Sub-System" library for simple command-line interface parsing - shared libs + This package contains the shared libs to support command-line + interface parsers generated with the ssg-dev package. + . + It was originally inspired by the Multics SubSystem library. + +Package: e2fslibsg +Depends: ${shlibs:Depends} +Provides: ext2fs2g, e2p2g, uuid1g +Conflicts: e2fsprogs (<= 1.10-7) +Architecture: any +Description: The EXT2 file system shared libs. + EXT2 stands for "Extended Filesystem", version 2. It's the filesystem type + used for hard disks on Debian and other Linux systems. + . + This package contains shared libraries needed by the utility programs. + +Package: comerrg-dev +Section: devel +Priority: extra +Depends: ${libcdev:Depends}, comerr2g +Suggests: doc-base +Conflicts: e2fsprogs (<< 1.10-6), comerr-dev +Architecture: any +Description: The Common Error Description library - headers and static libraries. + libcomerr is an attempt to present a common error-handling mechanism to + manipulate the most common form of error code in a fashion that does not + have the problems identified with mechanisms commonly in use. + +Package: ssg-dev +Section: devel +Priority: extra +Depends: ${libcdev:Depends}, ss2g +Conflicts: e2fsprogs (<< 1.10-6), ss-dev +Architecture: any +Description: "Sub-System" library for simple command-line interface parsing - devel. files + This package includes a tool that parses a command table to generate + a simple command-line interface parser, the include files needed to + compile and use it, and the static libs. + . + It was originally inspired by the Multics SubSystem library. + +Package: e2fslibsg-dev +Section: devel +Priority: extra +Depends: ${libcdev:Depends}, e2fslibsg, comerrg-dev +Suggests: doc-base +Provides: ext2fsg-dev, e2pg-dev, uuidg-dev +Conflicts: e2fsprogs (<< 1.10-6), e2fslibs-dev +Architecture: any +Description: The headers and static libraries for ext2fs-aware tools-development. + EXT2FS stands for "Extended Filesystem", version 2. It's the filesystem + type used for hard disks on Debian and other Linux systems. + . + This package contains the headers and shared libraries needed to compile + ext2fs-aware programs. Only programmers that really manipulate + features specific to the ext2 filesystem will need this. Most + programmers will use the generic filesystem-independent interface + from libc. + . + It also contains dev files for 2 other libs (e2p and uuid) used by + the e2fsprogs, but which are not yet packaged all by themselves + because they lack documentation. They may also lack some support + files, by I can't really know until someone uses them... + . + libe2p is for user-level e2fsprogs commands. It's used by dumpe2fs, + chattr, and lsattr. Functions in libe2p typically have two + characteristics (a) don't require that block device containing the + filesystem be opened directly (functions in libext2fs do), and (b) + libe2p typically contains printf statements or parse user input, and so + have more internationalization issues. + . + libuuid generates and parses 128-bit universally unique id's (UUID's), + using a standard which is blessed by both Microsoft and DCE, and is + being proposed as an internet standard. See the internet-draft: + . + draft-leach-uuids-guids-01.txt + . + for more information. diff --git a/src/_nfdos/e2fsprogs/debian/attic/libs/e2fslibsg.files b/src/_nfdos/e2fsprogs/debian/attic/libs/e2fslibsg.files new file mode 100644 index 0000000..c777084 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/attic/libs/e2fslibsg.files @@ -0,0 +1,3 @@ +lib/*.so.?.* +lib/*.so.? +usr/doc/e2fslibsg/* diff --git a/src/_nfdos/e2fsprogs/debian/attic/libs/rules b/src/_nfdos/e2fsprogs/debian/attic/libs/rules new file mode 100644 index 0000000..3cf3c8d --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/attic/libs/rules @@ -0,0 +1,182 @@ +#! /usr/bin/make -f +# -*- makefile -*- +# +# Invoke each target with `./debian/rules '. All targets should be +# invoked with the package root as the current directory. +# +# The `binary' target must be run as root, as it needs to install files with +# specific ownerships. + +# Uncomment this to turn on verbose mode. +export DH_VERBOSE=1 + +package = e2fsprogs +ARCH = $(shell dpkg --print-architecture) + +# find the version for the main package, from changelog file +MAIN_VERSION = $(shell head -1 debian/changelog | cut '-d ' -f 2 | sed 's/[()]//g') +# find versions for libraries going into their own packages, from their Makefile.in's +COMERR_VERSION = $(shell grep ELF_VERSION lib/et/Makefile.in | cut '-d ' -f3) +COMERR_MAJOR = $(word 1,$(subst ., ,$(COMERR_VERSION))) +SS_VERSION = $(shell grep ELF_VERSION lib/ss/Makefile.in | cut '-d ' -f3) +SS_MAJOR = $(word 1,$(subst ., ,$(SS_VERSION))) + +topdir = $(shell pwd) +debdir = $(topdir)/debian +maindir = $(debdir)/tmp +builddir = $(topdir)/builddir +docdir = $(maindir)/usr/doc/$(package) + +SUBPACKAGES_DIRS = tmp e2fslibsg e2fslibsg-dev comerr$(COMERR_MAJOR)g comerrg-dev \ + ss$(SS_MAJOR)g ssg-dev + +installdoc = install -m 644 +installbin = install -m 755 + +ifeq ($(ARCH),alpha) +CCOPTS = -g -O2 -fsigned-char -DHAVE_NETINET_IN_H +LIBC-DEV = libc6.1-dev +else +CCOPTS = -g -O2 -fsigned-char +LIBC-DEV = libc6-dev +endif + +build: configured + dh_testdir + make -C $(builddir) + make -C $(builddir)/misc findsuper + cd doc && texi2html -split_chapter libext2fs.texinfo + cd lib/et && texi2html -split_chapter -expandinfo com_err.texinfo + touch build + +configured: + dh_testdir + mkdir -p $(builddir) + cd $(builddir) && CFLAGS="$(CFLAGS)" \ + ../configure --enable-elf-shlibs --enable-dynamic-e2fsck \ + --with-ccopts="$(CCOPTS)" + touch configured + +clean: + dh_testdir + rm -f build configured install + -make -C $(builddir) -i distclean + rm -rf $(builddir) + rm -f doc/libext2fs_*.html lib/et/com_err_*.html + dh_clean + +binary-indep: build + # no arch-independant debs. + +binary-arch: build + dh_testversion 0.56 # == 0.53 + fixes + dh_testdir -a + dh_testroot -a + dh_clean -a -k + dh_installdirs -a + + make -C $(builddir) install DESTDIR=$(maindir) + install -m 755 $(builddir)/misc/findsuper $(maindir)/sbin + # static libs and .h files + make -C $(builddir) install-libs DESTDIR=$(maindir) + install -m 644 $(builddir)/lib/ss/ss_err.h $(maindir)/usr/include/ss/ + +# fix and install compile_et script + sed s%$(topdir)/lib/et%/usr/share/comerr% \ + <$(builddir)/lib/et/compile_et \ + >$(debdir)/comerrg-dev/usr/bin/compile_et + chmod 755 $(debdir)/comerrg-dev/usr/bin/compile_et +# add support files for compile_et + install -m 644 lib/et/et_c.awk lib/et/et_h.awk \ + $(debdir)/comerrg-dev/usr/share/comerr/ + +# fix and install mk_cmds script + sed s%$(topdir)/lib/ss%/usr/share/ss% \ + <$(builddir)/lib/ss/mk_cmds \ + >$(debdir)/ssg-dev/usr/bin/mk_cmds + chmod 755 $(debdir)/ssg-dev/usr/bin/mk_cmds +# add support files for mk_cmds + install -m 644 lib/ss/ct_c.awk lib/ss/ct_c.sed \ + $(debdir)/ssg-dev/usr/share/ss/ + +# docs + mkdir -p $(debdir)/e2fslibsg-dev/usr/doc/e2fslibsg + ln -sf e2fslibsg $(debdir)/e2fslibsg-dev/usr/doc/e2fslibsg-dev + mkdir -p $(maindir)/usr/doc/e2fslibsg + ln -sf e2fslibsg $(maindir)/usr/doc/e2fsprogs + mkdir -p $(debdir)/comerrg-dev/usr/doc/comerr$(COMERR_MAJOR)g + ln -sf comerr$(COMERR_MAJOR)g $(debdir)/comerrg-dev/usr/doc/comerrg-dev + mkdir -p $(debdir)/ssg-dev/usr/doc/ss$(SS_MAJOR)g + ln -sf ss$(SS_MAJOR)g $(debdir)/ssg-dev/usr/doc/ssg-dev + dh_installdocs -a + + # HTML docs + install -d $(debdir)/e2fslibsg-dev/usr/doc/e2fslibsg-dev/html-info/ + install -p $(topdir)/doc/libext2fs_*.html \ + $(debdir)/e2fslibsg-dev/usr/doc/e2fslibsg-dev/html-info/ + install -d $(debdir)/comerrg-dev/usr/doc/comerrg-dev/html-info/ + install -p $(topdir)/lib/et/com_err_*.html \ + $(debdir)/comerrg-dev/usr/doc/comerrg-dev/html-info/ + + # texinfo docs + install -p $(topdir)/doc/libext2fs.texinfo \ + $(debdir)/e2fslibsg-dev/usr/doc/e2fslibsg/libext2fs.texi + install -p $(topdir)/lib/et/com_err.texinfo \ + $(debdir)/comerrg-dev/usr/doc/comerr2g/com_err.texi + + # doc-base support + install -d $(debdir)/e2fslibsg-dev/usr/share/doc-base/ + install -p -m 644 $(debdir)/libext2fs.docbase \ + $(debdir)/e2fslibsg-dev/usr/share/doc-base/libext2fs + install -d $(debdir)/comerrg-dev/usr/share/doc-base/ + install -p -m 644 $(debdir)/com_err.docbase \ + $(debdir)/comerrg-dev/usr/share/doc-base/com_err + + # examples + dh_installexamples -a + + # dh_installmanpages still makes a mess as of 0.54 (see below dh_movefiles) + install -p $(topdir)/lib/et/compile_et.1 $(maindir)/usr/man/man1/ + install -d $(maindir)/usr/man/man3/ + install -p $(topdir)/lib/et/com_err.3 $(maindir)/usr/man/man3/ + ln -s e2fsck.8 $(maindir)/usr/man/man8/fsck.ext2.8 + ln -s mke2fs.8 $(maindir)/usr/man/man8/mkfs.ext2.8 + + dh_movefiles -a + # cleanup empty dirs + cd $(maindir) && rmdir usr/man/cat? bin lib usr/include/* usr/include \ + usr/info usr/lib usr/man/man3 usr/doc/e2fslibsg + +# dh_installmenu -a + + # broken + useless in 0.52 + # dh_installmanpages -a + + dh_undocumented -a + + dh_installchangelogs -pe2fslibsg -pcomerr$(COMERR_MAJOR)g -pss$(SS_MAJOR)g ChangeLog + + dh_strip -a + dh_compress -a + dh_fixperms -a + + echo "libcdev:Depends=$(LIBC-DEV)" > debian/comerrg-dev.substvars + echo "libcdev:Depends=$(LIBC-DEV)" > debian/ssg-dev.substvars + echo "libcdev:Depends=$(LIBC-DEV)" > debian/e2fslibsg-dev.substvars + + dh_installdeb -a + LD_LIBRARY_PATH=$(builddir)/lib:/lib:/usr/lib \ + dh_shlibdeps -a + dh_gencontrol -u '-isp' -pe2fsprogs -pe2fslibsg -pe2fslibsg-dev + dh_gencontrol -u '-isp' -pcomerr$(COMERR_MAJOR)g -pcomerrg-dev \ + -u '-v$(COMERR_VERSION)-$(MAIN_VERSION)' + dh_gencontrol -u '-isp' -pss$(SS_MAJOR)g -pssg-dev \ + -u '-v$(SS_VERSION)-$(MAIN_VERSION)' + dh_makeshlibs -a +# dh_du -a + dh_md5sums -a + dh_builddeb -a + +binary: binary-indep binary-arch + +.PHONY: binary binary-arch binary-indep clean checkroot diff --git a/src/_nfdos/e2fsprogs/debian/attic/libs/ss2g.files b/src/_nfdos/e2fsprogs/debian/attic/libs/ss2g.files new file mode 100644 index 0000000..5b717cb --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/attic/libs/ss2g.files @@ -0,0 +1,2 @@ +lib/libss.so.?.* +lib/libss.so.? diff --git a/src/_nfdos/e2fsprogs/debian/changelog b/src/_nfdos/e2fsprogs/debian/changelog new file mode 100644 index 0000000..60a0a9b --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/changelog @@ -0,0 +1,4937 @@ +e2fsprogs (1.47.0-1) unstable; urgency=medium + + * New upstream version + * Add support for the new orphan_file feature, which speeds up workloads + that are deleting or truncating a large number files in parallel. + * Mke2fs now enables the orphan_file and metadata_csum_seed feature. + * Mke2fs now supports the extended option "assume_storage_prezeroed" + which causes mke2fs to skip zeroing the journal and inode tables and + to mark the inode tables as zeroed. + * Tune2fs and e2label will more reliably modify the label and UUID for a + mounted file system using new kernel ioctls. + * Tune2fs can now disable the casefold feature after scanning all of the + directories do not have the casefold flag set. + * Fix a potential unbalanced mutex unlock when there is a short read + while using the bounce buffer when using direct I/O. + * Update to standards 4.6.2 + + -- Theodore Y. Ts'o Mon, 06 Feb 2023 22:07:49 -0500 + +e2fsprogs (1.46.6-1) unstable; urgency=medium + + * New upstream version + * NMU acknowledge (Closes: #1022096) + * In line with v6.2 and later Linux kernel, the extended xattribute hash + may be calculated using either the signed or unsigned char variant, + but new xattr entries will be set using the unsigned variant. Since + this difference is only seen for extended attribute names that contain + non-ASCII characters, the fact that we had a signed vs unsigned char + dependency was not noticed for over two decades. + * E2fsck will now check to make sure the journal inode does not have the + encrypt flag set. + * Fuse2fs now supports an offset= option which allows + operating on a file system image which is located starting at the + specified offset from the beginning of the image. + * Fix a deadlock bug in e2fsck's error handler when there are errors + trying to write to the file system. + * Fix a bug in tune2fs which could cause it to crash if device goes + off-line just as it being opened. + * Improve error messages issued by badblocks and tune2fs. + * Fix a crash in badblocks when the user specifies an overly large + number of blocks tested at a time in read/write or nondestructive + mode. + * Speed up e2fsck's clonning of multiply-claimed blocks so it is + substantially faster on very large file systems. + * Don't fail when the source directory for mke2fs -d doesn't support + extended attributes. + * Update Chinese, Czech, Dutch, French, German, Malay, Polish, Serbian, + Spanish, Swedish, and Ukrainian translations. + * Update the Debian policy compliance to 4.6.1. + + -- Theodore Y. Ts'o Thu, 02 Feb 2023 00:38:18 -0500 + +e2fsprogs (1.46.6~rc1-1.1) unstable; urgency=medium + + * Non-maintainer upload + * Convert copyright files to machine-readable format, adding the missing + licenses and copyright information (Closes: #1022096) + + -- Bastian Germann Tue, 03 Jan 2023 14:31:18 +0100 + +e2fsprogs (1.46.6~rc1-1) unstable; urgency=medium + + * Trial upstream release for 1.46.6 + * Debugfs's ncheck command now allows the inode number to be surrounded + by angle brackets + * Debugfs -c no longer prints a scary message on startup + * Resize2fs will round down the requested new file system size to the + nearest cluster boundary when resizing bigalloc file systems + * Avoid triggering udev in dumpe2fs and "resize2fs -P" for file systems + with MMP enabled + * Fix tune2fs so it will detect another device stealing the MMP sessions + while rewriting metadata checksums. + * Fix a bug where e2fsck could fail when specifying an undo file and an + explicit superblock number + * Fix e2image so it won't potentially loop forever for certain invalid + file systems + * Resize2fs now honors the E2FSPROGS_FAKE_TIME environment variable + * Fix tune2fs, fuse2fs, and debugsfs to update j_tail_sequence when + replaying the journal + * Add additional bullet-proofing for very badly corrupted file systems + (Addresses CVE-2022-1304) (Closes: #1010263) + * Check for and handle malloc() failures when computing the log filename + in e2fsck and in the libss library + * Tune2fs and e2fsck to accept pathames which include '=' characters + * Update and clarify's chattr's man page and usage message + * Fix tune2fs to avoid a crash if the journal replay fails and to make + sure its exit status is non-zero if there is some failure. + + -- Theodore Y. Ts'o Mon, 12 Sep 2022 08:27:55 -0400 + +e2fsprogs (1.46.5-2) unstable; urgency=medium + + * Fix build on GNU/kFreeBSD (caused by the fact that the Debian port has + an ancient version of coreutils, so the timeout program doesn't support + the -v option. + + -- Theodore Y. Ts'o Mon, 03 Jan 2022 23:48:13 -0500 + +e2fsprogs (1.46.5-1) unstable; urgency=medium + + * New upstream release + * Resize2fs will automatically drop one block group (128M) if that will + allow a resize operation to succeed when it would have failed due to + running afoul of the 2**32 inode count limit. + * Fix resize2fs -P so it won't potentially loop forever when the file + system is corrupted + * E2fsck will now automatically update the block group checksum when + fixing a problem in a block group descriptor + * Fix error handling in the unix_io module which could cause e2fsck + to deadlock in the face of I/O errors. + * Fix a bug in e2fsck fast commit handling which could result it in + crashing in some rare cases. + * Fix e2fsck and tune2fs's handling of quota limits, which previously + could get lost. + * Correct the report header printed by debugfs's get_quota and + list_quota commands. + * Speed up off-line resizing of very large file system. + * Fixed spelling mistakes in the mke2fs.conf man page. + * Update Chinese, Malay, Serbian, Spanish, Swedish, and Ukrainian + translations. + * Update the Debian policy compliance to 4.6.0. + + -- Theodore Y. Ts'o Thu, 30 Dec 2021 00:35:14 -0500 + +e2fsprogs (1.46.4-1) unstable; urgency=medium + + * New upstream release + * Mke2fs now creates 256 byte inodes by default for all non-GNU Hurd + file systems. (Previously small file systems would be created + using 128 byte inodes.) + * The bigalloc feature is now considered supported when the cluster + size is no more than 16 times the block size. + * E2fsck now checks to make sure directory entries do not reference + internal quota inodes. + * E2image now includes the quota inodes when creating file system image, + since they are part of the file system metadata. + * E2fsck now properly accounts the quota usage of the project quota file. + * Fix a regression so mke2fs can create a file system into non-existent + file (Closes: #992094) + * Fix mke2fs to correctly create Posix ACL's on big-endian systems when + copying files from a directory hierarchy. + * Fix FTBFS caused by test failures on big-endian systems. + (Closes: #991922) + * Fix FTBFS on GNU Hurd + * Use WantedBy=multi-user.target in e2scrub_reap.service. + (Closes: #991349) + * Updated and clarified the resize2fs man page. (Closes: #979411) + * Update Czech, Dutch, French, Polish, Portuguese, and Swedish + translations. + + -- Theodore Y. Ts'o Wed, 18 Aug 2021 22:47:40 -0400 + +e2fsprogs (1.46.3-1) experimental; urgency=medium + + * New upstream release + * Fix resize2fs bug when performing an off-line file system expansion + with MMP and there isn't sufficient reserved block group descriptor + blocks could lead to file system corruption. (Closes: #984472) + * Teach the filefrag program the -V option, which will print the version + of the tool, or if -V option is specified twice, will print the list + of supported FIEMAP flags. + * Fix fast_commit portability problems on sparc64 and arm64 + architectures (the latter when running e2fsprogs compiled for arm32). + (Closes: #987641) + * Fix missing mutex unlock in an error path in the Unix I/O manager. + * Fix Direct I/O support in the Unix I/O manager (this was a regression + introduced in v1.46.2). + * Fix mke2fs to avoid discarding blocks beyond the end of the file + system to be created when creating a file system which is smaller than + 16MB and the file system size was explicitly specified and smaller + than the size of the block device. (Closes: #989630) + * Teach mke2fs to avoid giving a spurious warning about a pre-existing + partition table and it is creating a file system at a non-zero offset + (so the partition table wouldn't be overwritten in any case). + (Closes: #989612) + * Fix e2image -Q to prevent a multiplication overflow could corrupt + the generated QCOW2 output file for very large file systems. + * When e2fsck repairs '.' and '..' entries in corrupted directories, set + the file type in the directory entry to be EXT2_FT_DIR and do not + leave the file type as EXT2_FT_UNKNOWN. + * Fix e2fsck so that the if the s_interval is zero, and the last mount + or write time is in the future, it will fix invalid last mount/write + timestamps in the superblock. (This was a regression introduced in + v1.45.5.) + * Fix lsattr and chattr to avoid opening or calling EXT2_IOC_[GS]ETFLAGS + on devices, since this can cause some devices to react badly as a + result. (This fixes a regression introduced in v1.46.2.) + (Closes: #986332) + * Fix potential memory leaks and seg faults when memory allocations fail. + * Fix various compiler and valgrind warnings + * Updated and clarified the e2image and filefrag man pages. + * Update Dutch, Malay, and Serbian translations. + + -- Theodore Y. Ts'o Tue, 27 Jul 2021 11:04:05 -0400 + +e2fsprogs (1.46.2-2) unstable; urgency=medium + + * Fix FTBFS on arm32 when building on a system with an arm64 kernel. + This also fixes a portability problem when replaying a fast-commit + journal on an arm64 kernel when using an arm32 userspace. + (Closes: #987641) + * Fix additional fast-commit portability problems on non-x86 systems + which don't allow non-aligned pointer dereferences (for example, on a + sparc64 system). + * Fix a missing mutex unlock on an error path which can cause e2fsck + to hang on I/O errors. + * Clean up and improve the man page for e2image + + -- Theodore Y. Ts'o Mon, 07 Jun 2021 07:27:15 -0400 + +e2fsprogs (1.46.2-1) unstable; urgency=medium + + * New upstream release + * Add support for the FS_NOCOMP_FL flag to chattr and lsattr. + * Fix Direct I/O support on block devices where the logical block size is + greater 1k. + * Fix debugfs's logdump so it works on file systems whose block size is + greater than 8k. + * Fix the debugfs rdump and ls commands so they will work correctly for + uid's and gid's => 65536. + * Teach the tune2fs program to support "random" as an argument to the -c + option, which sets the maximum mount count. (Closes: #926293) + * Fix a where e2fsck could a crash when there is error while e2fsck is + trying to open the file system, and e2fsck calls ext2fs_mmp_stop() + before MMP has been initialized. (Closes: #696609) + * Fix the debugfs write and symlink commands so they support targets which + contain a pathname (instead of only working when writing a file or + creating a symlink in the current directory). + * When resizing a small file systems to a super-large file system size, + avoid issuing some scary bitmap operation warnings. + * Improved error checking in the fast commit replay code in e2fsck. + * Updated and clarified the chattr man page. + * Update the Spanish translation from the translation project. + + -- Theodore Y. Ts'o Sun, 28 Feb 2021 21:24:34 -0500 + +e2fsprogs (1.46.1-1) unstable; urgency=medium + + * Drop transitional packages libcomerr2, e2fslibs, and e2fslibs-dev + * Fix a bug in libext2fs and debugfs when trying to set an extended + attribute will result in a seg fault. + * Fix e2fsck so it properly accepts large_dir directories which are + greater than 4GB in size. + * Fix mke2fs -d so it correctly handles important a directory or small + file which is stored using inline_data and contains an ACL or extended + attribute. (Closes: #971014) + * Add build profiles noudeb and pkg.e2fsprogs.no-static (Closes: #966686) + * Update the Czech, French, Malay, Polish, Portuguese, Swedish, and + Ukrainian translations from the translation project. + + -- Theodore Y. Ts'o Tue, 09 Feb 2021 17:36:02 -0500 + +e2fsprogs (1.46.0-1) experimental; urgency=medium + + * New upstream release + * Add support for the new fast_commit feature. (Requires Linux version + 5.10 or higher) + * Add support for the new stable_inodes feature which is needed to + support some the fscrypt siphash algorithm. + * Add support for file systems that have both case folding and + encryption enabled. (Not yet upstream, but used in some Android handsets.) + * The fuse2fs program now supports the "norecovery" which omits replying + the journal and mounts the file system read-only. (Closes: #878927) + * Bitmap loading is now done using multiple threads which can speed up + debugfs, dumpe2fs, and e2fsck on very large file systems. + * E2fsck now will check file names on file systems with case folding + enabled to make sure the characters are valid UTF-8 characters. + This is done for file systems which enforce strict encodings, and + optionally if the extended "check_encoding" option is requested. + * E2fsck will properly handle checking for duplicated file names when + case folding is enabled. + * E2fsck will now find and fix file system corruptions when the encrypted + files have a different policy from their containing directory. + * The "htree" command in debugfs now displays the metadata checksums for + hash tree index blocks. + * Fix various bugs where a maliciously corrupted file systems could case + e2fsck and other e2fsprogs programs to crash. + * Dumpe2fs will print the error code that Linux kernels newer than v5.6 + will save to indicate the class of error which triggered the ext4_error + event. + * E2fsprogs programs (in particular, fuse2fs) can now update htree + directories without clearing the htree index. + * Tune2fs will properly recalculate directory block checksums when + clearing the dir_index feature. + * Fix a bug in e2fsck directory rehashing which could fail with ENOSPC + because it doesn't take into account the space needed for the metadata + checksum, and doesn't create a sufficiently deep index tree. + * Clarify the e2fsck messages when it resets the directory link count when + it is set to the overflow value but it is no longer needed. + * Mke2fs now sets the s_overhead_cluster field, so that the kernel doesn't + need to calculate it at mount time. This speeds up mounting very large + file systems. + * Speed up mke2fs when creating large bigalloc file systems by optimizing + ext2fs_convert_subcluster_bitmap(). + * The filefrag program can now request the kernel to display the extent + status cache by using "filefrag -E". (This requires Linux version 5.4 + or newer.) + + -- Theodore Y. Ts'o Fri, 29 Jan 2021 16:24:41 -0500 + +e2fsprogs (1.45.7-1) unstable; urgency=medium + + * New upstream release + * Mke2fs will now warn when creating a file system on a DAX-capable + device and the block size is incompatible with DAX. + * The chattr and lsattr programs now support using the 'x' attribute + to set/get dax support on a particular file. + * E2fsprogs now supports the gnu.* extended attribute namespace, which + allows mke2fs -d to import the gnu.translator extended attributes. + * Add support for the simultaneous enablement of the casefold and + encryption features, which ext4 supports starting with the v5.5 + Linux kernel. + * Debugfs will now retry opening the superblock if it finds that the + superblock has an invalid checksum, since this could happen when + opening a mounted file system. + * Fix an off-by-one error when validating the depth of an htree which + caused e2fsck to potentially fail to notice an invalid htree. + * Fix potential buffer overrun in e2fsck when scanning directory blocks + in pass 2. (Addresses Google Bug: #158564737) + * Fix tune2fs so that it unlocks the MMP block if it can't perform the + requested operation. + * Fix mke2fs so it can import the contents of a directory using the -d + option when it has inode numbers that are greater than 2**32. Also + fix an omission where the extended attributes on the top-level directory + was not getting copied to the root directory. + * Fix e4crypt so that the add_key operation uses the explicitly provided + salt if it is provided. + * Fix resize2fs to prevent it from overflowing the block group descriptors + from overflowing the first block group. (This can only happen when the + block size is 1k and the file system is very large.) + * Fix debugfs's set_super_value command so it can set 64-bit integer + fields, such as s_kbytes_written. + * Fix filefrag so that it won't crash if the kernel returns zero for + statfs(2)'s device id or if it returns a blocksize of zero the device's + blocksize. + * Fix a few bad error code returns in the unix and sparse I/O managers. + * E2fsck will no longer try to fix duplicate file names in an encrypted + directory by mutating the encrypted file name. + * Updated and clarified various man pages. + * Update the Dutch, Malay, and Serbian translations from the translation + project. + * Update the Debian policy compliance to 4.5.1 + + -- Theodore Y. Ts'o Fri, 29 Jan 2021 00:19:52 -0500 + +e2fsprogs (1.45.6-1) unstable; urgency=medium + + * New upstream release + * Fixed a number of potential out of bounds memory accesses caused by + fuzzed / malicious file systems. + * Fix a spurious complaint from e2fsck when a directory which previously + had more than 32000 subdirectories has the number of subdirectories + drops below 32000. + * Improve e2fsck's ability to deal with file systems with a *very* large + number of directories. + * Debugfs will ignore lines in its command files which start with a + comment character ("#"). + * Fix debugfs so it correctly prints inode numbers > 2**31. + * Filefrag now supports very large files (with > 4 billion blocks), as + well as block sizes up to 1 GiB. + * Mke2fs -d now correctly sets permission with files where the owner + permissions are not rwx. + * Updated and clarified various man pages + (Closes: #953493, #953494, #951808) + * Drop as unneeded libattr1-dev as a build dependency (Closes: #953926) + * Update the Malay translation from the translation project. + + -- Theodore Y. Ts'o Fri, 20 Mar 2020 23:49:33 -0400 + +e2fsprogs (1.45.5-2) unstable; urgency=medium + + * Fix com_err support on Hurd, which has POSIX E* error code starting at + 0x40000000. Otherwise the regression tests will fail since the + expected output for various error cases will not have the correct + error text. + + -- Theodore Y. Ts'o Wed, 08 Jan 2020 15:58:44 -0500 + +e2fsprogs (1.45.5-1) unstable; urgency=medium + + * New upstream release + * E2fsck will no longer force a full file system check if time-based + forced checks are disabled and the last mount time or last write time in + the superblock are in the future. + * Fix spurious weekly e-mails when e2scrub_all is run via a cron job + on non-systemd systems. (Closes: #944033) + * Remove an unnecessary sleep in e2scrub which could add up to an + additional two second delay during the boot up. Also, avoid + trying to reap aborted snapshots if it has been disabled via + e2scrub.conf. (Closes: #948193) + * Resize2fs -M's estimates are now more accurate on mounted file systems. + * Tune2fs prohibits enabling or disabling the uninit_bg feature on + mounted file systems, since this is unsafe. + * Fix support of 32-bit uid's and gid's in fuse2fs and in mke2fs -d. + * Fix mke2fs's setting bad blocks to bigalloc file systems. + * Fix a bug where fuse2fs would incorrectly report the i_blocks fields for + bigalloc file systems. + * Fix potential crash in e2fsck when rebuilding very large directories on + file systems which have the new large_dir feature enable. + * Fix FTBFS problem hurd/i386. (Closes: #944649) + * Fix CVE-2019-5188: potential a out of bounds write in mutate_name() + when checking a maliciously corrupted file systems + * Add autopkgtest tests smoke and fuse2fs + * Updated and clarified various man pages + * Update the debhelper compatibility level to 12 + * Update the Chinese and Malay translations + * Update the Debian policy compliance to 4.4.1 + + -- Theodore Y. Ts'o Tue, 07 Jan 2020 09:18:39 -0500 + +e2fsprogs (1.46~WIP.2019.10.09-1) experimental; urgency=medium + + * Add (minimal) support to enable the fast commit feature. This is just + enough to enable kernel development work; e2fsck replay of journals + with the fast commit feature is *not* available. + * E2fsck will now check encryption policies for consistency + + -- Theodore Y. Ts'o Wed, 09 Oct 2019 20:22:50 -0400 + +e2fsprogs (1.45.4-1) unstable; urgency=medium + + * New upstream feature + * Fix CVE-2019-5094: A maliciously corrupted file systems can trigger + buffer overruns in the quota code used by e2fsck. + * E2fsck will now check to make sure the casefold flag is only set on + directories, and only when the casefold feature is enabled. + * E2fsck will not disable the low dtime checks when using a backup + superblock where the last mount time is zero to fix a failure in + xfstests ext4/007 + * Fix e2fsck so that when it needs to recreate the root directory, the + quota counts are correctly updated + * Update the man pages to document the new fsverity feature, and improve + the documentation for the casefold and encrypt features + * Allow e2scrub_all to work when the VG free space is exactly the + snapshot size (Closes: #935009) + * Avoid spurious lvm warnings when e2scrub_all is run out of cron on + non-systemd systems (Closes: #940240) + * Update the Dutch, German, Malay, Spanish, and Vietnamese translations + + -- Theodore Y. Ts'o Mon, 23 Sep 2019 15:31:27 -0400 + +e2fsprogs (1.45.3-4) unstable; urgency=medium + + * stop using Link Time Optimization; it breaks reproducible builds + * skip "make check" if DEB_BUILD_OPTIONS contains nocheck; this is + needed for some ports builds to complete successfully (Closes: #933247) + * fix e2fsprogs build problems on non-Linux ports + + -- Theodore Y. Ts'o Tue, 06 Aug 2019 15:22:30 -0400 + +e2fsprogs (1.45.3-3) unstable; urgency=medium + + * Fix Breaks/Replace dependency for logsave (Closes: #932874) + * Mark logsave as Multi-Arch: foreign (Closes: #932876) + * Fix test bug on the x32 architecture (Closes: #932906) + * Fix FTBFS problem on FreeBSD and Hurd since they don't have systemd + * Fix blhc problem when running "make check" + + -- Theodore Y. Ts'o Thu, 25 Jul 2019 15:35:01 -0400 + +e2fsprogs (1.45.3-2) unstable; urgency=medium + + * Add a hard dependency on logsave to e2fsprogs to fix initramfs issues + (Closes: #932855, #932859, #932861, #932881, #932888) + * Add check in e2scrub_all.cron so that it doesn't fail if the package + is removed, since e2scrub_all.cron is marked as a config file. + (Closes: #932622) + * Update the Debian policy compliance to 4.4.0 + * Update Czech, French, German, Polish, Portuguese, Swedish, and + Ukrainian translations + + -- Theodore Y. Ts'o Wed, 24 Jul 2019 12:56:52 -0400 + +e2fsprogs (1.45.3-1) unstable; urgency=medium + + * New upstream version + * Automatic online file system scrubs is now disabled by default. + They can be enabled by editing /etc/e2scrub.conf. + * fuse2fs is now installed in /usr/bin instead of /usr/sbin + * Fix fuse2fs compatibility with fuse3; but specifying the + nonempty option may be necessary if fusermount with fuse v2 is in use. + See NEWS.gz for more details. + * Fixed e2fsck support of file systems using large_dir and inline + directories at the same time. + * Fixed a bug in e2scrub_all so it correctly handles an LUKS volume + stacked on top of an LV. (Closes: #931387) + * Fixed a bug in e2scrub_all so it correctly specifies the volumes to + clean up when using "e2scrub_all -r". (Closes: #931679) + * Fixed improper use of positional markers in the Czech, Dutch, + German, and Vietnamese translations. (Closes: #892173) + * Remove ancient special-case CFLAGS for Alpha and Powermac platforms + * Drop packaging support for Debian Jessie + * Use the same build tree for the e2fsprogs udeb package + * Restructure rules file to use dh + * Only require the udev, systemd, and cron build dependencies when + building on Linux. (Closes: #931266) + * Move logsave to its own package. (Closes: #923372) + * Update the Czech and Dutch translations + + -- Theodore Y. Ts'o Sun, 14 Jul 2019 21:01:11 -0400 + +e2fsprogs (1.45.2-1) unstable; urgency=medium + + * New upstream version + * When mke2fs asks the user if she should proceed, fall back to the + English 'y' or 'Y' characters since there could be a missing + translation prompting the use of the English 'y' character. + (Closes: #907034) + * Fix spurious complaint of blocks beyond i_size for verity files. + * Update the Czech, Malay, Polish, Spanish, Swedish, and Ukrainian + translations. Add the new Portuguese translation. (Closes: #912185) + + -- Theodore Y. Ts'o Mon, 27 May 2019 21:46:31 -0400 + +e2fsprogs (1.45.1-3) unstable; urgency=medium + + * Fix e2scrub_all cron failures (Closes: #929287) + + -- Theodore Y. Ts'o Mon, 20 May 2019 21:48:40 -0400 + +e2fsprogs (1.45.1-2) unstable; urgency=medium + + * Avoid spurious e2scrub_all error messages spamming administrators from + cron/systemd timer units when lvm2 is not installed and/or there are + no lvm devices present in the system (Closes: #928977, #929186, #929254) + + -- Theodore Y. Ts'o Mon, 20 May 2019 11:02:09 -0400 + +e2fsprogs (1.45.1-1) unstable; urgency=medium + + * New upstream feature + * Drop lvm2 from the recommends line (Closes: #924275) + * Add the -n flag to the e2scrub and e2scrub_all commands + * Teach e2scrub to issue more useful error messages + * Update support for the case-folding file system feature to match what + finally will be landing in the kernel. + * Teach e2scrub_all to skip scrubbing a file system if there is not + enough free space to create a snapshot. (Closes: #924301) + * Fixed debugfs so it correctly prints ea_in_inode xattr values. + * Debugfs now prints non-printing characters using C-style hex escape + sequences. + * E2fsck now checks the unused portions of the bitmap blocks when the + number of blocks/inodes is less than the full blocksize to make sure + they are properly set. + * Fixed mke2fs's insanely large file system check, so that creating a + 900TB file system will succeed. + * E2scrub now tags its temp snapshot volumes with UDISK_IGNORE to avoid + them showing up in GUI's. (Closes: #926112) + * Mark the e2scrub systemd service files to indicate that it requires + CAP_SYS_ADMIN and CAP_SYS_RAWIO so e2scrub will get skipped when run + in containers that don't give root these capabilities. (Closes: #926138) + * E2fsck can now save a problem code log for debugging or monitoring + purposes. + + -- Theodore Y. Ts'o Sun, 12 May 2019 21:23:25 -0400 + +e2fsprogs (1.45.0-1) unstable; urgency=medium + + * New upstream feature + * tune2fs can now set the file system error bit to force a check at the + next fsck by using the extended option "force_fsck". + * There is now an e2scrub script which will allow e2fsck to be run + on mounted file systems using an LVM device. There will be a systemd + script to automatically run e2scrub on all ext4* file systems where it + can be supported. + * mke2fs will attempt avoid discarding pre-allocated blocks when + initializing a file system on a file. + * The fuse2fs command now supports a "fakeroot" option to allow an + unprivileged user to fuse2fs to modify rootfs images. + * Add initial support for the character set and case-folding file system + feature. + * Debugfs can now set the inode's checksum field + * E2image now accepts the -b and -B options to allow the user to specify + the superblock location when creating a raw or qcow2 image. + * Update the debhelper compatibility level to 11 + * Update the Debian policy compliance to 4.3.0 + + -- Theodore Y. Ts'o Wed, 06 Mar 2019 12:55:18 -0500 + +e2fsprogs (1.44.6-1) unstable; urgency=medium + + * New upstream version + * Fix e4defrag overflow problem when files are being created while it is + running (Closes: #888899) + * Fix e2fsck so it can correctly handle directories > 2 GiB when the + largedir feature is enabled. + * Fix mke2fs's hugefile creation so it works correctly for certain + unfortunately sized disks/partitions. + * Fix the libext2fs library to be more robust against + invalid/maliciously corrupted block group descriptors. + * Fix mke2fs and debugfs so they can correctly copy in files > 2 GiB. + * Fix debugfs so its stat command can correctly display directory + sizes > 2 GiB. + * Fix memory leaks in debugfs, mke2fs, and e2freefrag. + * Avoid unnecessarily linking badblocks with the libblkid shared library. + (Closes: #919958) + + -- Theodore Y. Ts'o Tue, 05 Mar 2019 15:10:40 -0500 + +e2fsprogs (1.44.5-1) unstable; urgency=medium + + * New upstream version + * Avoid overflows when tracking the number of files defragged + by e4defrag (Closes: #888899) + * Fix groff formatting nits in various man pages (Closes: #916188) + * Fix location of libext2fs documentation (Closes: #915942) + * Fix regression so we are correctly translating Posix ACL's + in libext2fs + * Use the online free block counts so e2freefrag's percentages + are correct + * Fix a false warning that tune2fs will take long time to change + a UUID if the metadata_csum feature is not enabled + * Fix mk_cmds so it works on a non-usrmerge system when e2fsprogs + is built on a usrmerge system (Closes: #914087) + * E2fsck will avoid offering to set the inline_data feature flag + unnecessarily + * E4defrag will handle the case where it is running as root and it can't + find the file system to open more gracefully (Closes: #907634) + * Fix a bug where resize2fs was failing to update the extent tree + checksums in an corner case + * Fix fuse2fs's command line parsing when options are specified after + the target device/image + * Fix a bug which could cause e2fsprogs tools to segfault on a corrupted + file system where the journal's s_nr_users is impossibly large. + * E2image now includes the mmp block (if needed) when creating a + metadata-only image. + * When e2fsck notices it could optimize an extent tree, it will now ask + "Optimize?" instead of "Fix?", which was confusing some users since it + implied that something was broken. + + -- Theodore Y. Ts'o Sat, 15 Dec 2018 22:46:49 -0500 + +e2fsprogs (1.44.4-2) unstable; urgency=medium + + * tune2fs fix dereference of freed memory after journal + * fix verity support + * Generate NEWS.gz for e2fsprogs's package documentation directory + * Update Debian policy compliance to 4.2.0 + * Improve version dependency for libcom-err and ss2 for e2fsprogs + + -- Theodore Y. Ts'o Wed, 22 Aug 2018 19:30:17 -0400 + +e2fsprogs (1.44.4-1) unstable; urgency=medium + + * New upstream release + * Add basic support for the ext4 verity (fsverity) feature + * E2fsck will fix file systems that have both the resize_inode + and meta_bg feature enabled + * Debugfs's ncheck command will now correctly inodes that have + multiple hard links + * Remove kilo/kibi rant (Closes: #757831) + * Update Danish, Spanish, and Swedish translations + * Fix symlink to directory conversions (Closes: #905195) + + -- Theodore Y. Ts'o Sat, 18 Aug 2018 20:46:29 -0400 + +e2fsprogs (1.44.3-1) unstable; urgency=medium + + * New upstream release + * Include hashmap.h in the libext2fs2 package + * Update debian policy compliance to 4.1.5 + + -- Theodore Y. Ts'o Tue, 10 Jul 2018 01:23:17 -0400 + +e2fsprogs (1.44.3~rc2-1) unstable; urgency=low + + * New upstream release + * Debugfs's inode_dump and xattr_dump commands have new options to + display the low-level contents of an inode's i_blocks and extra + space, and to better be able to debug corrupted extended attributes. + * The dumpe2fs command now will show information about the Multi-Mount + Protection (MMP) block, if present + * E2fsck, dumpe2fs, and debugfs is now much more robust at handling + badly (or maliciously) corrupted file systems. + * E2fsck will now offer to enable the dir_nlink feature if it is + required by the file system + * The project id field in the inode is now properly byte-swapped on + big-endian systems + * E2fsprogs better handles recent kernels which reports old error + conditions via the first fsync() after the file is opened + * Updated/fixed various man pages + * Update Czech, Dutch, Spanish, French, Polish, Swedish, Ukrainian, and + Vietnamese translations + * Update debian policy compliance to 4.1.4 + + -- Theodore Y. Ts'o Tue, 3 Jul 2018 23:31:40 -0400 + +e2fsprogs (1.44.2-1) unstable; urgency=medium + + * New upstream release + * Demote e2fsprogs from Essential: yes to XB-Important: yes + (Closes: #474540) + * Fix mke2fs to print a more useful/correct error message if + ext2fs_close_free() fails at the end of the file system + creation process + * Improve chattr's man page + * Update Polish translation + + -- Theodore Y. Ts'o Mon, 14 May 2018 19:59:27 -0400 + +e2fsprogs (1.44.1-2) unstable; urgency=medium + + * Fix e2image handling of e2i files on big endian systems + * Add sanity checks for inodes containing xattr values to prevent + maliciously crafted file systems from causing crashes caused by + infinite recursion + * Fix e2fsck so that quota usage is adjusted when clearing orphaned + inodes + * Fix filefrag so that unknown flags returned by FIEMAP won't cause a + buffer overrun + + -- Theodore Y. Ts'o Tue, 10 Apr 2018 11:04:36 -0400 + +e2fsprogs (1.44.1-1) unstable; urgency=medium + + * New upstream release + * Fix FTBFS problem on Hurd (Closes: #893590) + * Fix e2fsck support of HTree directories on big-endian systems + * Fix miscellaneous e2image image handling for file systems with bigalloc + and meta_bg features enabled. + * Fix orphan list handling of inodes on bigalloc file systems (and other + situations where inodes need to be deleted or truncated) in e2fsck. + * Update Swedish translation. + * Add Vcs-* headers in Debian packaging (Closes: #887512) + * Speed up reading bitmap blocks in debugfs when opening large file + systems. + * Add clarifications to chattr's man page. (Closes: #890390) + + -- Theodore Y. Ts'o Sat, 24 Mar 2018 15:13:28 -0400 + +e2fsprogs (1.44.0-1) unstable; urgency=medium + + * New upstream release + * Update Czech, Spanish, French, Malay, and Ukrainian translations. + + -- Theodore Y. Ts'o Wed, 07 Mar 2018 14:39:52 -0500 + +e2fsprogs (1.44.0~rc2-1) experimental; urgency=medium + + * New upstream release + * Fix FTBFS problem on Hurd + * Improved e2fsck's consistency checking for symlink. + + -- Theodore Y. Ts'o Sun, 04 Mar 2018 15:57:21 -0500 + +e2fsprogs (1.44.0~rc1-1) experimental; urgency=low + + * New upstream release + * Add support for the large_dir feature + * Add support for the ea_data feature + * Resize2fs will not complain about online resizes of bigalloc file + systems + * Debugfs's ls command will now print the high bits of the mode bits + * Fix some corner cases with tune2fs and journal replay + * Add support for libreadline.so.7 + * E2freefrag will now use the GETFSMAP ioctl for mounted file systems + * E2fsck is now much faster when scanning extents on bigalloc file systems + * Fix various compiler and UBSAN warnings + + -- Theodore Y. Ts'o Tue, 27 Feb 2018 16:56:32 -0500 + +e2fsprogs (1.43.9-2) unstable; urgency=medium + + * Fix upgrade when there are two installations of a library (for + different architectures) that we are transitioning to the new package + name. (Closes: #890590) + * Add support for libreadline.so.7 to libss + * Fix tune2fs's journal recovery support + * Fix tune2fs to require a freshly checked file system if turning off + the metadata_csum feature and UUID has been changed. + + -- Theodore Y. Ts'o Sat, 24 Feb 2018 20:48:29 -0500 + +e2fsprogs (1.43.9-1) unstable; urgency=medium + + * Remove some obsolete flags and add document new flags in the chattr + man page + * Remove misplaced "MNP is unsupported" message from debugfs + * Suppress false positive lintian warning about "new essential + package" (caused by preparatory work to make the e2fsprogs + package no longer essential) + * Fixing missing "General" in "GNU General Public License" in + copyright files. + * Fix whitespace issue in the debian control file + * Update the Hungarian translation. + * Rename the packages e2fslibs* to libext2fs* and libcomerr2* to + libcom-err2* to conform with the standard Debian library package + naming conventions. (Closes: #269569) + + -- Theodore Y. Ts'o Thu, 08 Feb 2018 13:09:49 -0500 + +e2fsprogs (1.43.8-2) unstable; urgency=medium + + * Update debian policy version to 4.1.3 + * Mark library packages as priority: optional + * Simplify the debian/rules file and don't build e2fsprogs-l10n + unnecessarily + * Fix FTBFS on big-endian systems (Closes: #886119) + * Add support for the build profile: noudeb + * Add support for the build profile: pkg.e2fsprogs.no-fuse2fs + * Add support for the build profile: pkg.e2fsprogs.no-static-e2fsck + + -- Theodore Y. Ts'o Wed, 03 Jan 2018 16:18:40 -0500 + +e2fsprogs (1.43.8-1) unstable; urgency=medium + + * New upstream version + * Fix a bug where updated bitmap checks might not be written to disk. + (Closes: #883869) + * Add missing byte swaps for newly added fields in the superblock + * Fix a potential use after free bug in e2fsck when fixing a corrupted + root node in directory hash tree. + * Fix a bug in e2fsck where a badly/maliciously corrupted superblock + (which is not fixed due to the -n option, for example) can cause a + floating point exception when printing the summary statistics. + (Closes: #879220) + * Fix debugfs's ncheck command so that it correctly prints the inode + number when printing an error message. + * Fix a bug in e2freefrag where it could print an incorrect free blocks + count on a file system with the 64-bit block number feature. + * Update the German, Serbian, Spanish, and Ukrainian translations. + * Fix a bug where resize2fs's free blocks sanity check could fail with a + false positive and refuse to check a file system with the 64-bit block + number feature. + * Fix and clarify various man pages and documentations. Also fixed up + some random usage texts that were incorrect. (Closes: #880483) + * Add missing copyright file for the e2fsprogs-l10 package. (Closes: + #880207) + * Add missing Multi-arch hints (Closes: #881408, #881590, #881591) + + -- Theodore Y. Ts'o Mon, 01 Jan 2018 19:44:41 -0500 + +e2fsprogs (1.43.7-1) unstable; urgency=medium + + * New upstream version + * Fix error handling in debugfs, fuse2fs, and tune2fs so errors while + replaying the journal will not cause a segfault in some corner cases + * Fix resize2fs to avoid it from either failing or corrupting the file + system image in certain corner cases when doing an off-line resize + * Fix many spelling mistakes in various man pages, code comments, and + program messages. + * Fix e2fsck and debugfs so that maliciously corrupted file systems will + not cause buffer overflows (Closes: #873757, #878104) + * Update German translation (Closes: #833514) + * Update debian policy version to 4.1.1 + * Fix FTBFS caused by debhelper/10.9 and references to obsolete packages + in the rules file (Closes: #876551) + * Promote e2fsprogs-l10n from suggests to recommends (Closes: #873812) + * Make e2fsprogs-l10n be arch:all (Closes: #873813) + + -- Theodore Y. Ts'o Mon, 16 Oct 2017 01:20:54 -0400 + +e2fsprogs (1.43.6-1) unstable; urgency=medium + + * New upstream version + * Break out the locale files to a separate package (e2fsprogs-l10n) to + reduce the size of the e2fsprogs package, since it is an + essential/required package. + * Remove support for building uuid/blkid packages on pre-Wheezy + distributions (which are no longer supported). + * Remove support for pre-Multiarch versions of Debian (which are no + longer supported). + * Fixed the printing of quota inconsistency messages in e2fsck on 32-bit + platforms. Also fixed a bug which caused project quota problems to be + labelled as group quota problems. + * Fixed a UI problem with yes/no questions when there are fuzzy + translation entries which caused some messages to be printed in English + and some in the language specified by the locale. (Closes: #856586) + * Fix some out-of-bounds memory accesses in e2fsck caused by (usually + maliciously) corrupted file systems. (Closes: #871539, 871540) + * Optimize CPU usage in e2fsck for very large, very fragmented sparse + files. + * Avoid creating file systems that use project quotas and 128 byte + inodes. + * Improve tune2fs's message when a file system needs to be checked using + e2fsck -f before running certain complex tune2fs operations. (Closes: + #857336) + * Improve e2fsck's message when the proceed_delay option in + /etc/e2fsck.conf is enabled. (Closes: #857336) + * Fix an LFS bug in e2image. (Closes: #855246) + * Fix portability problem caused by the fact that disks are character + mode devices systems with FreeBSD kernels. + * Update the Czech, French, Polish, Swedish, and Vietnamese translations. + + -- Theodore Y. Ts'o Tue, 29 Aug 2017 00:58:29 -0400 + +e2fsprogs (1.43.5-1) unstable; urgency=medium + + * New upstream version + * Fix ext2fs_sync_device() so it returns the proper error code if the + BLKFLSBUF ioctl fails for some reason. + * Fix a potential crash in tune2fs when enabling project quota when the + file system has no inodes by fixing error handling in the + quota_write_inode() in libsupport. + * Fix a bug in debugfs's "ls -p" handling which could cause it to print + garbage after a file name in a directory entry. + * Fix a number of bugs in debugfs, dumpe2fs, e2fsck, tune2fs, and + resize2fs where a carefully/maliciously corrupted file systems (found + by American Fuzzy Lop) could these programs to crash or hang. + (Closes: #868489) + * E2fsck no longer issues some harmless bitmap warnings caused by a + corrupted file system; since those corruptions will be fixed up by + e2fsck later, there's no point issuing these internal warnings. + * E2fsck will now notice invalid quota inode numbers, and offer to fix + them. + * Fix a regression introduced in e2fsprogs 1.43 which broke mke2fs's + hugefile creation so that they aren't contiguous. + * Fix how backup superblocks are written in big endian systems so they + are all correctly byte swapped. + * Fixed tune2fs's support for enabling and disabling project quota. + * The badblocks program now properly handles languages which have + multi-column wide character such as Chinese. (Closes: #860926) + * The mke2fs -U option now accepts "null", "clear", "random", or "time" + just as tune2fs's -U option. + * Fix e2fsck's -E bmap2extent feature (which converts a file to use + extents from indirect block maps) so that it handles sparse files + correctly. + * Fix libext2fs to correctly handle accounting for an external xattr + block on bigalloc file systems. + * Fix e2fsck to correctly handle quota accounting when deleting files + that have multiply-claimed blocks pass 1b. + * Fix potential buffer overrun bug in e2fsck when using 128 byte inodes. + * E2fsck's extent tree optimization can now be disabled via an + command-line extended option or via an e2fsck.conf configuration + parameter. + * The e2fsck program now properly updates the quota accounting when + optimizing the extent tree. + * Fix some error handling in e4crypt when operating on keyring ID's. + * Fix e2fsck's quota handling when the bigalloc feature is enabled. + * The libext2fs file system now uses readahead when opening file systems + to speed up opening very large file systems with the meta_bg option. + * If e2fsck logging is enabled, e2fsck will report the exit code in the + last line of the log file. + * Debugfs can now open file systems with a bad superblock checksum, and + the show_super_stats command will print the expected checksum. + * Fix a regression introduced in e2fsprogs 1.43.4 where tune2fs was not + able to correctly enable the quota feature. (Closes: #855417) + * E2fsck will only return an exit status code of 1 if it has fixed a + file system corruption. If it only performed an optimal optimization + of internal file system metadata, it will now return 0. + * Fix e2fsck so it won't check inode fields of deleted inodes. + * Removed a debugging printf in libsupport which could result to some + extraneous and confusing output if the user specifies a quota type. + * The debugfs logdump command now accepts a new -S option which will + cause it to print information about the journal superblock. + * Added a missing space in debugfs's ls -l output to separate the size + and date fields. + * Update the Czech, Danish, Dutch, French, Hungarian, Polish, Serbian, + Spanish, Swedish, Ukrainian, and Vietnamese translations. (Closes: #862482) + * Update various man pages. (Closes: #867895, #865584) + * Fix various compiler and UBSAN warnings. + * Remove obsolete Conflict/Replaces headers in control file (Closes: #866623) + * Remove obsolete mips libraries used to build arcboot (Closes: #864144) + + -- Theodore Y. Ts'o Fri, 04 Aug 2017 01:13:34 -0400 + +e2fsprogs (1.43.4-2) unstable; urgency=medium + + * Re-enable metadata_csum for Debian (which was accidentally disabled + for 1.43.4-1) + + -- Theodore Y. Ts'o Tue, 31 Jan 2017 19:54:55 -0500 + +e2fsprogs (1.43.4-1) unstable; urgency=medium + + * New upstream version + * Fix e2fsck to require that the system.data extended attribute is + always present even for files smaller than 60 bytes, to be + consistent with the kernel + * Drop the hard links for mkfs.ext4dev and fsck.ext4dev + * Clarify/update various man pages (Closes: #852726) + * Clarify the default for the "proceed?" question printed by mke2fs + and tune2fs. (Closes: #852727) + * Fix various Coverity warnings and other memory leaks in fuse2fs and + extended attribute manipulation functions. + * Add Finnish and Malay translations + * Update Chinese, Czech, Polish, Serbian, and Spanish translations + (Closes: #774379) + + -- Theodore Y. Ts'o Tue, 31 Jan 2017 17:31:52 -0500 + +e2fsprogs (1.43.4~WIP.2017.01.30-1) unstable; urgency=medium + + * Fix a bug which was causing mke2fs -d and fuse2fs to improperly + handle Posix ACL's. + * Fix a bug which could cause mke2fs -d to fail if there is an + zero-length file in source directory tree. + * Debugfs will now display project quota information. + * Debugfs has a more friendly and powerful to print and set extended + attributes. + * Fix a bug in mke2fs where I/O errors weren't getting properly + reported to the user. + * Fix a bug in resize2fs when operating on very large file systems + which have a block size different from the VM page size. + * If the reported device size is absurdly large, mke2fs will now + report an error instead looping forever or crashing. + * Replace a test file in the sources with an updated version which has + a DFSG-compliant copyright license. This was making lawyers + nervous, even though the file was only used in regression tests and + was never used when building any binaries. (Closes: #840733) + + -- Theodore Y. Ts'o Mon, 30 Jan 2017 22:14:07 -0500 + +e2fsprogs (1.43.3-1) unstable; urgency=medium + + * Fix e2fsck's handling of timestamps on 32-bit system (Closes: #836559) + * E2fsck will sanity check and repair the extra isize fields in inodes + and the superblock. + * Fix sparc64 crashes when dereferencing unaligned integers in journal + blocks when metadata checksums are enabled. + + -- Theodore Y. Ts'o Sun, 04 Sep 2016 20:41:21 -0400 + +e2fsprogs (1.43.2-2) unstable; urgency=medium + + * Fix build reproducibility problems + * Don't hide the linker flags for e2fsck.static + + -- Theodore Y. Ts'o Thu, 01 Sep 2016 23:30:55 -0400 + +e2fsprogs (1.43.2-1) unstable; urgency=medium + + * Change the default journal size to be larger for file systems larger + than 128 GB to improve performance on metadata-heavy workloads + * Clarify tune2fs's message when the user needs to run e2fsck + (Closes: #828022) + * Fix an alignment bug in e2fsck which caused sparc64 architectures to + crash when replaying the journal on file systems with a 64-bit block + number + * Fix a typo in debugfs when printing out the dtime field on file + systems with an extended timestamp + * Fix the logic in e2fsck which decides when to repair legacy negative + timestamp encodings. + * Add a command to debugfs to copy the inode structure from one inode + to another + * Fix resize2fs so it will not crash if there is an extended + attribute block but it doesn't need to migrate any blocks during + an off-line resize + * Fix a crash when mke2fs or debugfs tries to copy in a directory + hierarchy containing an empty directory + * Fix a bug in e2fsck caused by a power failure during e2fsck's journal + replay could leave the file system in a state where if the file + system is mounted without doing a full e2fsck scan, the file system + could get corrupted + * Fix big endian bugs in the e2undo program + * Fix debugfs's logdump so command so it can correctly handle journals + which are larger than 2GB + * Add new translations: Hungarian and Serbian + * Update the Catalan, Chinese, Danish, Dutch, French, German, Polish, + Swedish, Ukrainian translations + + -- Theodore Y. Ts'o Thu, 01 Sep 2016 00:55:13 -0400 + +e2fsprogs (1.43.1-1) unstable; urgency=medium + + * New upstream version + * Fix the Direct I/O fallback code in the Unix I/O manager so it + implements read-modify-write correctly. + * The mke2fs program will now warn if the user specifies a label which + is too long. (Closes: #791630) + * Clean up various man pages (Closes: #766379, #761144, #770750, + #428361, #766127) + * Fix bug so that debugfs's rdump command works on the root directory + (Closes: #766125) + * Fix various Debian packaging issues (Closes: #825868) + * Build fully security hardened binaries + + -- Theodore Y. Ts'o Tue, 07 Jun 2016 23:09:55 -0400 + +e2fsprogs (1.43-3) unstable; urgency=medium + + * Fix various debian packaging nits + * Fix spelling mistakes in the copyright files + * Fix various spelling mistakes in man pages + * Fix project quota bugs in e2fsck and mke2fs + * Build binaries with hardening support + * Improve e2fsck messages when the journal superblock is corrupt and + the user declines to fix the journal. (Closes: #768162) + * Fix debugfs's handling of "set_bg checksum calc" on 64-bit file + systems. + * Simplify the debian rules file + + -- Theodore Y. Ts'o Wed, 25 May 2016 00:51:33 -0400 + +e2fsprogs (1.43-2) unstable; urgency=medium + + * Update watch file to check for the GPG signatures + * Use dh_update_autotools_control to update config.{guess,sub} + automatically when building the package. + * Only try to run update-initramfs if it exists + * Transition to dbgsym packages + + -- Theodore Y. Ts'o Fri, 20 May 2016 14:07:40 -0400 + +e2fsprogs (1.43-1) unstable; urgency=medium + + * New upstream version + * Fix or improve offset support in mke2fs, e2undo, and libext2fs + * Update debian policy version to 3.9.8 + + -- Theodore Y. Ts'o Tue, 17 May 2016 01:04:28 -0400 + +e2fsprogs (1.43~WIP.2016.03.15-2) sid; urgency=low + + * Fix FTBFS on big-endian systems + + -- Theodore Y. Ts'o Thu, 17 Mar 2016 22:55:52 -0400 + +e2fsprogs (1.43~WIP.2016.05.12-1) unstable; urgency=medium + + * New upstream version + * Clean up various man pages and usage messages + * Fix up gcc and Coverity warnings + * Stop building static binaries using dietlibc + * Fix potential out-of-boundary memory access in resize2fs + * Fix sparse_super2 bugs in mke2fs and resize2fs + * The mke2fs program will now support multiple -O options + * The e2image program now ignores checksum error so that debugging + snapshots of a file system can be taken of a broken file system + * E2fsck now more cleanly handles checksum errors while replaying the + journal + * Fix e2fsck to not try to set a UUID if the metadata_csum feature is + enabled since this will break the checksums + * Fix e2image so progress information won't get leaked to stdout + * Fix bugs in "mke2fs -E offset=NNNN" (Closes: #803629) + * Fix Hurd portability issues (Closes: #822576) + * Update initramfs in e2fsprogs's postinst script so the initial + ramdisk gets the updated e2fsprogs binaries (Closes: #804237) + * Work around texi2dvi bug which can cause build failures (Closes: #822227) + * E2fsck now prints "REBOOT SYSTEM" instead of "REBOOT LINUX" to + assuage the sensibilities of Hurd users (Closes: #769838) + + -- Theodore Y. Ts'o Thu, 12 May 2016 00:18:45 -0400 + +e2fsprogs (1.43~WIP.2016.03.15-1) unstable; urgency=low + + * New upstream release + * Fix resize2fs bug that could leave block allocation bitmaps + uninitialized + * The tune2fs program will ask the user for confirmation before + starting dangerous operations if the terminal is available, and it + will replay the journal if necessary + * Fix a bug which in rare cases would cause e2fsck -fD to corrupt an + extent-mapped directory. + * E2fsck will now check for extent mapped inodes with no extent header + and clear them if found + * E2fsck now checks to make sure the extended attribute header doesn't + result in the xattr extending beyond the bounds of the inode + * Teach mke2fs to parse a human-readable argument for -i option + * Teach mke2fs to automatically handle creating file systems > 500T by + automatically enable the meta_bg feature + * Mke2fs will now prompt for user verification before rewriting a file + system's superblock using the -S option + * Mke2fs no longer complains if the user tries to create a file system + using the entire block device (e.g., without using a partition). + The minor number convention is not used by all block devices, and + it's quite normal in some circumstances to create a file system + on /dev/sdc instead of /dev/sdc1 + * Debugfs now can properly display and set extended timestamps + * Add an ext2/3/4 FUSE server + * Fix an "mke2fs -d" bug which could create inodes with invalid + extended attribute blocks + * Fix miscellaneous file encryption bugs + * Fix miscellaneous MMP bugs in debugfs + * The e2fsck program will no longer update the quota inodes when it is + interrupted + * The filefrag program now accounts for holes in sparse files created + by the file punch operation as an expected/optimal mapping + * Clean up gcc/clang warnings + * Add support for the checksum seed feature + * Add support for the project quota feature + * Add fallocate support to libext2fs and to debugfs + * Clean up various man pages (Closes: #798425) + * Update debian policy compliance to 3.9.7 + + -- Theodore Y. Ts'o Tue, 15 Mar 2016 01:34:14 -0400 + +e2fsprogs (1.43~WIP.2015.05.18-1) unstable; urgency=low + + * Merge in updates from the maint branch (changes from 1.42.13) + * Add support for file encryption feature + * Mke2fs will now create file systems with metadata_csum and 64bit + enabled by default. + * The resize2fs command can now convert file systems between 64-bit + and 32-bit mode. + * The new undo file format is much faster/efficient than before + * E2fsck now has readahead support to speed up its behavior on RAID + arrays. + * E2fsck can now rebuild/optimize inode extent trees + + -- Theodore Y. Ts'o Mon, 18 May 2015 01:47:43 -0400 + +e2fsprogs (1.42.13-1) unstable; urgency=low + + * New upstream version + * NMU acknowledge (Closes: #778948) + * Fixed a bug which could cause e2fsck to corrupt Hurd file systems. + (Closes: #760275) + * Fixed a deadlock which occurs when using systemd and e2fsck.conf's + logging feature. (Closes: #775234) + * Fixed a bug which could cause programs using libext2's inode table + scanning functions from crashing on certain corrupted file systems. + (Closes: #773795) + * Fixed dumpe2fs so it won't crash if the user doesn't specify a block + device (file system). (Closes: #764293) + * Fixed e2fsck so if it notices unexpected HTREE blocks in pass 2, it + will report the correct directory inode containing the inconsistency. + * If e2fsck fails to grow the dir_info structure due realloc(3) not + having enough memory, it will now fail with explanatory message + instead of staggering on failing with a confusing internal error + messages. + * The tune2fs program will zero out the superblock journal backup + information when removing a journal from a file system. + * The mke2fs program now enables the large_file feature by default. + * Fixed a bug which could cause badblocks to crash if there are millions + and millions of bad blocks. + * Fixed some use-after-free bug in resize2fs and e2fsck. + * Fixed some bigendian bugs that had crept into both indirect and extent + handling inside libext2fs. + * Updated/fixed various man pages. + * Update Esperanto, German, and Spanish translations. Added Danish + translation. + + -- Theodore Y. Ts'o Sun, 17 May 2015 20:38:27 -0400 + +e2fsprogs (1.43~WIP-2015-03-29-1) unstable; urgency=low + + * Merge in updates from the maint branch (changes from 1.42.12-1) + * Add support for inline directories + * Add support for the jbd2 checksum v3 format + * New dumpe2fs format + * Add support for file encryption feature + + -- Theodore Y. Ts'o Sun, 14 Dec 2014 22:49:03 -0500 + +e2fsprogs (1.42.12-1.1) unstable; urgency=high + + * Non-maintainer upload by the Security Team. + * Fix CVE-2015-1572: incomplete fix for CVE-2015-0247 (closes: #778948). + + -- Michael Gilbert Sun, 22 Feb 2015 01:50:57 +0000 + +e2fsprogs (1.42.12-1) unstable; urgency=low + + * New upstream version + * Fix various e2fsck bugs when trying to repair bigalloc file systems. + * E2fsck can now repair a file system with an overly large + s_first_meta_bg field, which had previously caused all e2fsprogs + programs to crash when trying to open such a file system. + * Fix e2fsck so that it can correctly fix a number of rare file system + corruptions that were discovered when using a file system fuzzer. + * Fix e2fsck so it does not try to write back block group descriptors + if they have not been modified. + * The mke2fs program will now place metadata blocks in the last + flex_bg so they are contiguous. This reduces free space + fragmentation in a freshly created file system, as well as allowing + mke2fs commands which request extremely large flex_bg size to succeed. + * Mke2fs now creates hugefiles more efficiently (with fewer extent + tree blocks). + * Fix a 32/64-bit overflow bug that could cause resize2fs to loop + forever. + * Reduce the memory consumption of resize2fs for very large file + systems. + * Fix a bug that could cause resize2fs to create a corrupted file + system when shrinking a very large file system (typically > 16TB) + that had been previously grown using resize2fs. (Closes: #756922) + * Fix tune2fs updating UUID's when manipulating file systems with + external journals (both the file system and journal UUID). + * Fix tune2fs so it can remove an external journal for file systems + with a 1k block size. + * Add a new debugfs command, "inode_dump", which prints the inode in + hex and ASCII format. + * The debugfs command "set_inode_field" will now automatically + allocate blocks for indirect blocks and extent tree blocks. + * Fix debugfs's "set_inode_field" so can properly handle + "block[IND|DIND|TIND]". + * The debugfs "rdump" command will now take multiple source arguments. + * Fix debugfs's argument parsing for the freefrag command. + * Fixed a double close(2) bug in "rdump" and "rdump -p". + * Fix filefrag to properly handle using the FIBMAP ioctl (with -B). + * e4defrag will now defrag backwards-allocated files + * Clarified messages that were confusing users in debugfs, e2fsck, + mke2fs, and resize2fs (Closes: #758029, #757543, #757544) + * Dumpe2fs will now complain if extra arguments are given to it. + (Closes: #758074) + * Update/clarify various man pages (Closes: #726760) + * Update Czech, Dutch, French, Polish, Spanish, Swedish, Ukrainian, + and Vietnamese translations + + -- Theodore Y. Ts'o Fri, 29 Aug 2014 08:50:48 -0400 + +e2fsprogs (1.42.11-2) unstable; urgency=low + + * Don't try to build lib/ext2fs/tst_ext2fs unless running "make + check"; this fixes a MIPS FTBFS problem because mips has a special + no-pics build needed for bootloaders where we only build libext2fs + but not libss or other libraries (Closes: #754605) + * Update French translation + + -- Theodore Y. Ts'o Sun, 13 Jul 2014 16:18:27 -0400 + +e2fsprogs (1.42.11-1) unstable; urgency=medium + + * New upstream version + * NMU acknowledge (Closes: #752107) + * mke2fs can now create hugefiles which are aligned to the beginning + of the disk (instead of relative to the beginning of the partition), + controlled via a mke2fs.conf configuration parameter. + * Fix a bug which caused e2fsck to abort a journal replay on a file + system with bigalloc enabled. (Closes: #744953) + * Fix mke2fs so it more correctly handles large flex_bg counts + * Mke2fs will check the kernel version number and not just the sysfs + feature flag to determine whether it is safe to enable lazy + inode table initialization, so it won't get faked out if the ext4 is + compiled as a module which hasn't happened to be loaded yet. + * E2fsck will now automatically fix a last mount time or last write time + which is in the future in preen mode. + * Mke2fs will now check the file system revision number requested by the + command line, and reject it if it is too large. + * If filefrag runs into an error, it will continue processing the rest + of the files specified on the command line, but then exit with an + error code. + * Filefrag now prints some additional new flags (such as + FIEMAP_EXTENT_ENCODED), and print unknown flags as hex values. + * Fixed support in filefrag for files with > 2**32 blocks on 32-bit + platforms. + * Fixed a file descriptor leak in debugfs when copying files. + * Add Esperanto and Ukrainian translations, and update Czech, Dutch, + French, German, Italian, Polish, Swedish, and Vietnamese translations. + * Fixed cross-compilation support. (Closes: #753375) + * Update/fix various man pages + + -- Theodore Y. Ts'o Wed, 9 Jul 2014 23:43:27 -0400 + +e2fsprogs (1.42.10-1.1) unstable; urgency=medium + + * Non-maintainer upload. + * Add patch from upstream git that fixes creating filesystems in files + larger than 2GB on 32 bit architectures (Closes: #752107) + + -- Hilko Bengen Sat, 21 Jun 2014 12:57:25 +0200 + +e2fsprogs (1.43~WIP-2014-02-04-1) unstable; urgency=low + + * Merge in updates from the maint branch (changes from 1.42.10-1) + + -- Theodore Y. Ts'o Wed, 04 Feb 2014 23:31:56 -0500 + +e2fsprogs (1.42.10-1) unstable; urgency=medium + + * New upstream version + * The mke2fs program no longer requires a force (-F) option when + when creating a file system in a regular file, since this is a very + common use case when managing virtual machine images + * The mke2fs program will now ask for confirmation before wiping out a + pre-existing file system, partition label, or physical volume + * Fix e2fsck so that it properly handles an inconsistent quota inode. + Previously the quota inode could be completely corrupted, and + missing quota records could be not noticed + * Fix mke2fs so if packed metadata blocks are enabled that the block + group checksum are set correctly + * Debugfs has new commands to allow the quota inode to be queried directly + * Tune2fs will allow removal of dirty journal with two "-f" options + (Closes: #559301) + * Fixed some off-line resize2fs bugs when relocating metadata blocks + when growing or shrinking bigalloc file systems + * Fixed resize2fs's calculation of the minimum required file system + size. This allows resize2fs -M to shrink the file system more + aggressively + * Fixed resize2fs to properly handle shrinking a very large and empty + file system to a very very small size + * Fixed e4defrag to work with 64-bit and bigalloc file systems + * Fixed e2fsck to not issue a large number of very scary (but + harmless) corruption messages when checking very large file systems + when the file system has more inodes than the number of seconds + since January 1, 1970. + * E2fsck will now check the whole file system if file system problems + are detected during its initial "pass 0" sanity check + * Filefrag now prints the "shared extent" flag which is used by some + file systems such as btrfs + * The mke2fs program would previously correctly omit the resize_inode + feature when creating a file system > 16TB when the fs size was + determined automatically. It will now also do the right thing when + the user explicitly specifies the file system size. + * The message printed by logsave is now much less scary (Closes: #468821) + * Fix spelling typo in the package descriptions + * Update Czech, Dutch, French, German, Polish, Spanish, Swedish, and + Vietnamese translations (Closes: #703048) + * Update/fix various man pages + * Fix debian/rules compatibility problem with GNU make 4.0 + + -- Theodore Y. Ts'o Sun, 18 May 2014 22:54:38 -0400 + +e2fsprogs (1.42.9-3) unstable; urgency=medium + + * Add the ability for mke2fs to create hugefiles + * Add support for the sparse_super2 compat feature + * Mke2fs can now force all of the metadata blocks to be at the + beginning of the file system + * Fix loopback mount detection (Closes: #497984) + * Add support to mke2fs to create a file system at an offset + (Closes: #417385) + * Mention badblocks in the package description (Closes: #718725) + * Update/fix various man pages (Closes: #719184, #719189) + * Improve e2fsck's "superblock corrupt" message (Closes: #719185) + * Miscellaneous Coverity clean ups + + -- Theodore Y. Ts'o Tue, 04 Feb 2014 22:17:22 -0500 + +e2fsprogs (1.42.9-2) unstable; urgency=low + + * Fix lintian warning: debian-changelog-has-wrong-weekday + * Fix lintian warning: non-standard-dir-perm by using dh_strip's + --dbg-package option instead of manually managing the debug files + * Fix printf type format mismatch in e2image + * Improved debugfs's error reporting when parsing block numbers + * Use consistent configure options across the multiple e2fsprogs + builds; this means that e2fsck.static will now use the blkid library + shipped with util-linux, instead of the internal one shipped with + the e2fsprogs sources. + + -- Theodore Y. Ts'o Mon, 30 Dec 2013 16:56:50 -0500 + +e2fsprogs (1.42.9-1) unstable; urgency=low + + * New upstream version + * NMU ack (Closes: #698879) + * Fix cross-build support (Closes: #721365) + * mke2fs will detect an attempt to create a file system on a + loop-mounted image file + * Fixed a large number of bugs in resize2fs, e2fsck, debugfs, to + handle bigalloc and 64-bit file systems. + * Tune2fs will no longer allow changing the uuid on a mounted file + system with the uninit_bg feature enabled. + * E2fsck will properly allocate a new extent tree block in the rare + case where one is needed when rehashing an extent-mapped directory. + * Mke2fs will now properly set the LARGE_FILE feature when creating a + journal > 2GB. + * Debugfs will now correctly handle free a range of inodes using the + freei command. + * E2fsck will no longer complain if an external journal was exactly + 2**32 blocks. + * E2fsck will not longer try to add a missing lost+found directory + when run in read-only mode. + * Fixed some buffer overrun bugs when creating standard e2image files + * Mke2fs will not try to set both the meta_bg and resize_inode feature + when the extended option "-E resize=NNN" is specified by the user. + * Dumpe2fs will no longer abort when trying to print the journal + information from an e2image-created image file. + * Debugfs's "write" command can now create a sparse files + * Debugfs can now support a command line which is up to 8k long + * E2image will refuse to create a raw or qcow2 image using a mounted + file system unless the -f option is given. + * E2image has been made more useful for efficiently copying file + systems using the -ra options. New options to help with this use + case that were added: -o, -O, -p, and -c. + * Fixed a regression introduced in 1.42.8 which would cause e2fsck to + erroneously report uninitialized extents past i_size to be invalid. + * Fixed cases where resize2fs could corrupt a file system, especially + when shrinking a file system. (Closes: #660793) + * Fixed resize2fs and e2fsck to not crash when operating on a file + system with the MMP feature enabled. + * Fixed debugfs's write command to properly create a zero-length file + (instead of creating an invalid inode). + * Fixed e2fsck to not crash when trying to delete an invalid + extent-mapped symlink. + * Improved debugfs's help texts + * Fixed a potential integer overflow problem in e2freefrag + (Closes: #718205) + * The config.guess and config.sub files have been updated to the + latest to help with the ppcle port. (Closes: #732076) + * Updated/fixed various man pages. (Closes: #586218, #669730, + #698076, #731329) + + -- Theodore Y. Ts'o Sat, 28 Dec 2013 23:18:36 -0500 + +e2fsprogs (1.42.8-1) unstable; urgency=low + + * New upstream version + * Work around Debian Bug #712530 (Closes: #708307) + * Fix e2fsck so it can check a read-only root file system with an + external journal. (Closes: #707030) + * Fix off-line resizing of file systems with flex_bg && !resize_inode + (Closes: #696746) + * Change mke2fs so that it does not set the root directory to the real + uid/gid of the mke2fs process. Add the extended option root_owner to + override this behavior. + * If an invalid journal size is given to mke2fs, it will now complain + and exit sooner. + * Fix resize2fs when shrinking file systems to make sure that bitmap + blocks aren't left outside the bounds of the shrunken file system. + This could happen with flex_bg file systems that were grown using + the old online resizing algorithm. + * E2fsck will now detect and repair corrupted extent trees which contain + invalid extents at the end of the extent tree leaf block. + * E2fsck will now longer complain about zero length extended attribute values. + * Fix a regression introduced in e2fsprogs v1.42 which caused e2image -s + to crash. + * Add safety check so tune2fs will not attempt to set the inode size to + be larger than the block size. + * Enhance chattr to allow clearing the extent flag if the kernel allows it + * Fix e2image with large (> 32-bit) file systems (Closes: #703067) + * Mke2fs will not give warnings about the bigalloc and quota options in + quiet mode. + * Debugfs was erroneously giving spurious error messages for certain + extent_inode subcommands which take arguments (split_node, + replace_node, and insert_node). This has been fixed. + * Fix the parsing of the 's' (sectors) in parse_num_blocks2, which among + other programs is used by mke2fs. + * Fix texinfo incompatibilities (Closes: #712365) + * Updated/fixed various man pages (Closes: #712429, #712430, #707609) + * Update German translation + + -- Theodore Y. Ts'o Thu, 20 Jun 2013 23:09:25 -0500 + +e2fsprogs (1.42.7-1) unstable; urgency=low + + * New upstream version + * Add warning indicating that the quota and bigalloc features are + still under development. + * Added new options to filefrag to be consistent with the version from + Lustre + * Optimized e2fsck's CPU utilization + * Fixed e2fsck so it detects and fixes inconsistencies in the interior + nodes of an inode's extent tree + * Fixed a potential memory corruption failure in e2fsck's error path if + the call to ext2fs_open2() fails. + * Fixed e2fsck if its logging function is enabled in e2fsck.conf, and + the resulting file name for the log file is longer than 100 bytes, + that it properly handles this situation instead of crashing. + * E2fsck will now report the amount of memory that it attempted to + allocate when a memory allocation request fails, to make it easier to + track down the problem. + * Fixed a bug in resize2fs which could cause severe file system + corruption when growing an ext4 file system which was formatted with + fewer-than-normal reserved gdt blocks + * Fixed resize2fs to be able to handle off-line resizes of file + systems with the flex_bg feature and without any reserved gdt + blocks or if the file system did not have the resize_inode feature + * Further optimize resize2fs so it doesn't use quite as much CPU when + resizing very large file systems. + * Fixed 32-bit overflow bugs which could cause resize2fs to fail and + possibly corrupt the file system while resizing 64-bit file systems. + * Fixed a big which could cause resize2fs to corrupt bigalloc file systems. + * Fix a crash while mke2fs is parsing "-E resize=NNN" with the 64bit + file system feature enabled + * Added better error checking to mke2fs to check for invalid + parameters when creating bigalloc file system. + * When creating bigalloc filesystems, the -g option to mke2fs will now + specify the number of clusters per block group. + * Added the "symlink", "zap_block", "block_dump", and "extent_open" + commands to debugfs + * Fixed debugfs's htree command so that all its messages are sent + through the pager. + * Fixed debugfs's dump_file and cat functions so they work correctly + on file systems with a block size greater than 8k. + * Fixed mke2fs's handling of the mmp_update_interval option + * Fixed e2freefrag so it works on 64-bit file systems, and so it uses + much less memory. + * E2image can now include all data blocks in the e2image output + file when the user specifies the -a option. + * Fixed debugfs's mknod command so that it updates the block group + statistics + * Document the bigalloc feature in the mke2fs man page. + (Closes: #669730) + * Update Czech, Dutch, French, German, Polish, Swedish, and + Vietnamese translations + + -- Theodore Y. Ts'o Tue, 21 Jan 2013 21:52:58 -0500 + +e2fsprogs (1.43~WIP-2012-09-22-1) unstable; urgency=low + + * Add metadata checksum feature + + -- Theodore Y. Ts'o Sat, 22 Sep 2012 21:50:20 -0400 + +e2fsprogs (1.42.6-1) unstable; urgency=low + + * New upstream version + * Fix build dependencies to avoid requiring dc, and to allow + cross-building to work (Closes: #677497) + * Updated/fixed various man pages + * Mke2fs will now update its progress indicators at most once a second + to avoid overwhelming serial consoles. + * Resize2fs will support lazy_itable_init, speeding up off-line growth + of uninit_bg file systems. + * Resize2fs now supports on-line resizing 64-bit file systems beyond + 16TB. A number of bugs in resize2fs which prevented this have been + fixed. + * Resize2fs now correctly handles resizing 32-bit file systems to 16TB. + * Fixed a potential segfault in e2fsck when there is an I/O error + while reading the superblock. + + -- Theodore Y. Ts'o Fri, 21 Sep 2012 12:14:41 -0400 + +e2fsprogs (1.42.5-1.1) unstable; urgency=low + + * Non-maintainer upload. + * e2fsck-static, e2fsprogs: let preinst remove a symbolic link in + /usr/share/doc, that should have been replaced with a directory since + 1.39+1.40-WIP-2006.10.02+dfsg-1. (Closes: #698879). + + -- Nicolas Boulenguez Fri, 22 Feb 2013 23:14:59 +0100 + +e2fsprogs (1.42.5-1) unstable; urgency=low + + * New upstream version + * Mark the e2fsprogs package as Multi-Arch: foreign, so if a package + foo:i386 depends on e2fsprogs and is installed on an amd64 system, + the native e2fsprogs will satisfy the dependency. (Closes: #678395) + * Fix a fd leak which could cause logsave (and hence a boot-time rc + init script) to hang (Closes: #682592) + * Fix a problem if e2fsck where if the root file system is mounted + read-only, e2fsck would not clear an error indication in the journal + superblock. Combined with a kernel bug, this would cause the e2fsck + to check the file system after every single boot + * Fixed filefrag so it would not seg fault on virtual filesystems such + as /proc: e.g., "filefrag /proc/partitions" + * Fix filefrag so that it correctly reports the number of extents + * Fixed a bug which caused "mke2fs -N 256 -t ext4 /tmp/foo.img 256m" + to write blocks out until /tmp filled + * Fixed a bug in how e2fsck would uniquify directory entry names + * Change e2fsck so it will allow file systems mounted read-only to be + checked with the -f option. + * Fix e2fsck so that the file system is marked as containing an + error if the user chooses not to fix the quota usage information. + * Fix tune2fs so that it correctly removes the quota feature when + the last quota inode is removed. + * Fix tune2fs so that after removing a quota inode, the block bitmap + is updated; otherwise, e2fsck would complain after running 'tune2fs + -O ^quota '. + * Fix tune2fs so that when converting a file system from using legacy + quota files to the new quota file system feature with hidden quota + files, the accounting for these files is handled correctly so that + e2fsck doesn't complain. + * The e4defrag program now allows device symlinks, such as + /dev/mapper/testvg-testlv, instead of insisting on less + human-friendly names such as /dev/dm-2 + * Updated/fixed various man pages (Closes: #680114) + + -- Theodore Y. Ts'o Sun, 29 Jul 2012 19:59:56 -0400 + +e2fsprogs (1.42.4-3) unstable; urgency=medium + + * Add the -C option to chattr's usage message + * Fix e2fsprogs so it is blhc (build log hardening check) clean. This + fixed e2fsck.static which previously was not getting built with the + security hardening flags. + + -- Theodore Y. Ts'o Wed, 13 Jun 2012 16:03:24 -0400 + +e2fsprogs (1.42.4-2) unstable; urgency=medium + + * Fix FTBFS problem on the hurd and freebsd platforms + + -- Theodore Y. Ts'o Tue, 12 Jun 2012 18:26:40 -0400 + +e2fsprogs (1.42.4-1) unstable; urgency=medium + + * New upstream version + * Fix 64-bit block number bugs in e2fsck, dumpe2fs, and debugfs which + could corrupt file systems + * Fixed e2fsck's handling of how errors propagate from the journal to + the file system superblock + * Fixed a false positive complaint from e2fsck if all of the extents + in the last extent block are uninitialized and located after the + end of the file. + * dumpe2fs will display the journal's error indicator in the + superblock if it is set + * Fixed a bug which caused e2fsck to incorrectly use O_EXCLUSIVE in + some corner cases. + * Fix truncation of extent-mapped inodes in e2fsck and libext2fs + * Fixed i_blocks accounting in bigalloc file systems. + * Add support for btrfs's No_COW flag to lsattr and chattr + * Debugfs interprets the date strings of the form "@ddd" as ddd + seconds after the epoch + * Updated/fixed various man pages (Closes: #674453, #674694) + + -- Theodore Y. Ts'o Tue, 12 Jun 2012 18:20:55 -0400 + +e2fsprogs (1.42.3-1) unstable; urgency=low + + * New upstream version + * Fix bugs on 32-bit systems which could corrupt > 16TB file systems + * Quiet complaints in e2fsck when the total free blocks or inodes are + incorrect in the superblock after an system crash, since we don't + update nor depend on the superblock summaries at each commit boundary + * Fixed support for (hidden) quota files built into ext4; in + particular, don't rewrite the quota inode unless the quotas are + inconsistent + * Optimized reading and writing bitmaps if direct I/O was enabled + * Update Czech, Dutch, French, German, Polish, Swedish, and + Vietnamese translations + * Fixed incorrect indentation in tune2fs man page + * Update debian policy compliance to 3.9.3 + + -- Theodore Y. Ts'o Mon, 14 May 2012 14:43:09 -0400 + +e2fsprogs (1.42.2-2) unstable; urgency=low + + * Fixed e2fsck.conf's man page (Closes: #646963) + * Fixed 32-bit binary compatibility problem for the libext2fs shared + library introduced in 1.42.2 + * mke2fs will no longer fail if the /etc/mtab file is not present + + -- Theodore Y. Ts'o Mon, 09 Apr 2012 14:54:33 -0400 + +e2fsprogs (1.42.2-1) unstable; urgency=low + + * New upstream version + * Fixed various man pages (Closes: #665427) + * Speed up resize2fs for large file systems (Closes: #663237) + * Be less strict about the EXT4_EOFBLOCKS_FL flag (which will + eventually be going away in the ext4 file system format) + * Teach mke2fs to use direct I/O if the -D option is given + * Print errors returned by ext2fs_open2() and ext2fs_check_desc() so + we can more easily diagnose memory allocation failures caused by + insufficient memory and abort on memory allocation failures + * E2fsck can now write log files containing the details of the + problems that were found and fixed directly. + * E2fsck can now limit the number of messages issued and printed on + the console + * The dumpe2fs, debugfs, and tune2fs now use rbtree bitmaps, which + cause them to use much less memory for large file systems. + * E2fsck will now check for zero-length extents, since older kernels will + OOPS if they comes across one + * Fix e2fsck's discard behavior so it does not discard too many + blocks, and it will not use discard if the device advertises + that discard does not persistently zero data. Also, if e2fsck is + run in read-only mode, do not try to discard data. + * Fix mke2fs -S so it does not corrupt the first block group's + information. + * Add pointer for e2fsprogs-udeb to libcomerr2.shlibs (Closes: #665885) + + -- Theodore Y. Ts'o Tue, 27 Mar 2012 15:55:57 -0700 + +e2fsprogs (1.42.1-2) unstable; urgency=low + + * Fix the fact that dpkg-buildflags was being ignored due to a + bash'ism in debian/rules. + * Check the new /sys/class/power_supply/AC/online since + /proc/acpi/ac_adapter/... is deprecated and may not be present on + newer kernels. + + -- Theodore Y. Ts'o Mon, 20 Feb 2012 19:12:20 -0500 + +e2fsprogs (1.42.1-1) unstable; urgency=low + + * New upstream release + * dpkg-buildflags is now used if it is present. This allows Debian + Wheezy to build with security hardened build flags. (Closes: #654457) + * mke2fs and e2fsck now use much less memory for large file systems + * Fixed mke2fs -S so it can be usefully used as a last ditch recovery + command when for ext4 filesystems that have the uninit_bg feature enabled. + * The mke4fs argv[0] is now recognized by mke2fs. + * Fixed usage and help messages for mke2fs. + * Eliminated spurious bad block group checksum warnings when e2fsck + falls back to using the backup group descriptors. + * Debugfs's ncheck command is now much more useful when used to + diagnose badly corrupted file system. Added a new -c option. + * Fixed bug in e2image which could cause it to fail to set i_size + correctly if the last hole in the file is an exact multiple of a + megabyte. + * Fixed a bug with resize2fs where for 1k and 2k file systems, the + minimum file size used for resize2fs -M could be a block too small. + * Fixed the badblocks program to honor the -s flag when in read-only -t + mode. (Closes: #646629) + * Update Czech, Dutch, French, Polish, and Swedish translations + + -- Theodore Y. Ts'o Fri, 17 Feb 2012 15:07:13 -0500 + +e2fsprogs (1.42-1) unstable; urgency=low + + * New upstream release + * Fixed hurd FTBFS (Closes: #649689) + * Optimized e2fsck speed on large file systems when using [scratch_files] + * Fixed e2fsck handling of blocks claimed by multiple inodes in + bigalloc file systems + * Fixed e2fsck's calculation of max file size for non-extent based + files when huge_file is enabled + * Update Czech and Swedish translations + + -- Theodore Y. Ts'o Tue, 29 Nov 2011 15:50:07 -0500 + +e2fsprogs (1.42~WIP-2011-11-20-1) unstable; urgency=low + + * New upstream release + * Fix error checking so resize2fs works when using a 32-bit userspace + and a 64-bit kernel (Closes: #644989) + * e2fsck now returns additional status bits in its exit code if it + aborts early in the e2fsck run + * Fix potential stack overflow in debugfs + * Avoid an infinite loop in ext2fs_find_block_device() if there are + symlink loops in /dev caused by a buggy udev + * Fix test failures on big-endian systems + * Fix gcc -Wall complaints + * Add freefrag and e2freefrag commands to debugfs + * Add a read-only, metadata-only debugfs command called rdebugfs + * Improve first-class quota support + * Fix bigalloc support in e2freefrag + * Clean up mmp handling + * Fix a regression which caused mke2fs to not work correctly on files + > 2GB. (Closes: #647245) + * Fix a namespace leak in libext2fs (tdb_null) + + -- Theodore Y. Ts'o Sun, 20 Nov 2011 21:32:49 -0500 + +e2fsprogs (1.42~WIP-2011-10-16-1) unstable; urgency=low + + * New upstream release + * Fix online resizing with resize2fs (Closes: #644989) + * Fix bug which caused shrinking an empty file system file system to + its minimal size to sometimes fail. + * Don't look at the high 16 bits of i_file_acl if the 64-bit feature + is not enabled; this fixes a Hurd compatibility field since this is + used for the high 16 bits of i_mode on Hurd. + * Update Swedish, Polish, French, German, and Czech translations + + -- Theodore Y. Ts'o Sun, 16 Oct 2011 22:07:03 -0400 + +e2fsprogs (1.42~WIP-2011-10-09-1) unstable; urgency=low + + * New upstream release + * Fixed infinite loop in filefrag (Closes: #644792) + * Fixed various spelling and translation problems + * Fixed various man pages + * Fixed 64-bit block numbers in e2fsck's journal replay + * Fixed mipsel FTBFS that was fixed for mips + * Update Swedish, French, and Czech translations + * Convert to debian source 3.0 (quilt) format + + -- Theodore Y. Ts'o Sun, 09 Oct 2011 22:24:31 -0400 + +e2fsprogs (1.42~WIP-2011-10-05-2) unstable; urgency=low + + * Fix portability issues with non-Linux platforms and for the mips + platform, which does some really strange things vis-a-vis + 32/64-bit support without actually having a 64-bit version of + the architecture (Closes: #644502) + * Fix dependency problem which causes the newer version of libcom_err2 + to get pulled in when upgrading to e2fsprogs, which needs the new + interface exported by libcom_err2. (Closes: #644425, #644584) + + -- Theodore Y. Ts'o Fri, 07 Oct 2011 18:27:06 -0400 + +e2fsprogs (1.42~WIP-2011-10-05-1) unstable; urgency=low + + * Update translations: German (Closes: #520985) + * Fixed usage and error text for mke2fs -C option + * Updated e2fsprogs.pot file for translators + * Added support for internationalized error strings for libcom_err + * Fixed various portability nits that were causing FTBFS problems on + Hurd and FreeBSD + * Added "big" and "huge" types to mke2fs.conf, since they are needed + for very large file systems + * Fixed on-line resizing which had been broken in the 1.42 series + (Closes: #451388) + + -- Theodore Y. Ts'o Wed, 05 Oct 2011 02:10:53 -0400 + +e2fsprogs (1.42~WIP-2011-10-01-2) unstable; urgency=low + + * Update translations: French, German (Closes: #620659) + * Fix compilation problems in hermetic environments + * Fix on-line resizing in resize2fs (Closes: #451388) + * Add definitions for "big" and "huge" filesystems to /etc/mke2fs.conf + * Fix mke2fs when there are more than 2**32 block groups + + -- Theodore Y. Ts'o Tue, 04 Oct 2011 00:04:25 -0400 + +e2fsprogs (1.42~WIP-2011-10-01-1) unstable; urgency=low + + * New upstream release + * Avoid unnecessary reboots when checking the root fs in some special cases + * Fix an off-by-one error in filefrag -v's output + * Make filefrag display the number of contiguous (not physical) + extents (Closes: #631498) + * Clarify the mke2fs.conf.5 man page (Closes: #634883) + * Add a hurd-specific mke2fs.conf file (Closes: #629355) + * mke2fs will set s_max_mnt_count to -1 instead of 0 by default to + work around a bug in pre-3.0 kernels which caused a spurious + message to be printed when the file system was mounted (Closes: #632637) + * Fixed portability problems which was causing build failures on + non-Linux/non-x86 systems. + * Verify that the bad block inode looks sane before trusting it, to + avoid it causing more harm than good. + * Fixed the debian/rules file so that it build successfully if + DEB_BUILD_OPTIONS contains "nostrip" (Closes: #627535) + * Fixed some big-endian bugs in the MMP code + + -- Theodore Y. Ts'o Fri, 30 Sep 2011 22:33:41 -0400 + +e2fsprogs (1.42~WIP-2011-09-25-1) unstable; urgency=low + + * New upstream release + * Fix FTBFS on big-endian architectures (Closes: #641838) + * Add support for multiarch (Closes: #632169) + * Clarify and update debian/copyright file (Closes: #614662) + * Add support for Multi-Mount Protection (MMP) + * Allow tune2fs to remove the external journal if the device is not found + * Updated/clarified man pages (Closes: #642193) + * Fix a potential FTBFS caused by overly long compile lines (Closes: #629883) + + -- Theodore Y. Ts'o Sun, 25 Sep 2011 01:28:34 -0400 + +e2fsprogs (1.42~WIP-2011-09-16-1) unstable; urgency=low + + * New upstream release + * Added support for the integrated quota feature + * Improved 64-bit and bigalloc support + * Mke2fs and tune2fs now allows setting the stride and stripe width to zero + * Fixed tune2fs's mount options parsing (Closes: #641667) + * Fixed an ABI compatibility problem which broke the dump program + (Closes: #636418) + * Resize2fs has forward compatibility for a new on-line resize ioctl + for > 16TB file systems. + * Fixed a (very hard to hit) bug that could cause e2fsck to crash in + pass 1 or pass 2 + * Debugfs has a new 'blocks' command + * Mke2fs now gives a warning if the auto-detected block size exceeds + the page size + * Mke2fs and e2fsck now tries to use the punch hole command as a + "discard" when operating on normal files + * Mke2fs will not try to do any discard operations if -n is specified + on the command line + * Updated/clarified man pages (Closes: #639411) + * Fixed parsing of MNTOPT_ options for tune2fs and debugfs (Closes: #641667) + + -- Theodore Y. Ts'o Fri, 16 Sep 2011 10:33:59 -0400 + +e2fsprogs (1.42~WIP-2011-07-02-1) unstable; urgency=low + + * New upstream release + * Add support for 64-bit file systems + * Add support for bigalloc file systems + * Fixed an e2fsck bug which caused "*** FILE SYSTEM WAS MODIFIED ***" + without an explanation of what was fixed. + * E2fsck will no longer attempt to clone an extended attribute block + in pass1b handling if the file system does not support extended + attributes. + * E2fsck will be more careful accidentally asking the user to continue + if the file system is mounted, so that an escape sequence won't + cause a false positive. (Closes: #619859) + * E2fsck now uses less cpu time in pass 5 + * E2fsck will no longer segfault when a corrupted file system has a bad + extent, and removing it leads to a block needing to be deallocated. + * E2fsck now supports an extended "discard" option which will cause + e2fsck to attempt discard all unused blocks after a full check + * The e2image program now supports the qcow2 format, a more efficient + way of capturing file system metadata snapshots. + * Mke2fs now supports the [devices] stanza in mke2fs.conf. + * Mke2fs now supports the reserved_ratio relation in mke2fs.conf. + * Mke2fs now creates extent-mapped directories for the root and + lost+found directories. + * Mke2fs will skip zero'ing the journal if the extended option + "lazy_journal_init" is specified. + * Mke2fs will now create file systems that enable user namespace + extended attributes and with time- and mount count-based file + system checks disabled. + * Mke2fs will not set a stride or strip size of one block based on + block device attributes obtained from sysfs. + * Mke2fs now displays a progress report during the discard process. + * Mke2fs now handles extreme file system parameters correctly which + previously caused the inodes per group to drop below 8, leading + to a segfault. + * Debugfs's icheck will now correctly find inodes which use the + searched-for block as an extended attribute block. + * Debugfs now has a new "punch" command which remove blocks from the + middle of an inode. + * The badblocks program now correctly recovers from I/O errors when + direct I/O is being used. The badblocks command now also + supports a -B option which forces the use of buffered I/O, and + the -v option will provide a more detailed breakdown of read, + write, and failed comparison errors. + * Added e4defrag tool which uses the EXT4_IOC_MOVE_EXT ioctl. + * Added support for journals larger than 2GB. + * Support using both hard links and symlinks when installing e2fsprogs. + * Add overflow checking to tune2fs -i's fsck interval, which must fit + in a 32-bit field. + * Filefrag will report 0 extents correctly in verbose mode. + * Logsave's usage message has been fixed. (Closes: #619788) + * Update translations: French, Chinese, Germany, Indonesian, Swedish, + Vietnamese, Polish, Dutch, Czech. + * Updated/clarified man pages. + + -- Theodore Y. Ts'o Sat, 02 Jul 2011 22:38:57 -0400 + +e2fsprogs (1.41.14-1) experimental; urgency=low + + * New upstream release + * Fixed a FTBFS on big-endian architectures + * Fixed spurious warning in mke2fs + * resize2fs now works correctly on devices exactly 16TB + * resize2fs will no longer clear the resize_inode feature when the + number of reserved GDT blocks reaches 0. This allows a file + system with the flex_bg feature to be subsequently shrunk. + * e2fsck will no longer use the extended rec_len encoding for file + systems whose blocksize is less than 64k, to catch fs inconsistencies + which the kernel will complain about. + + -- Theodore Y. Ts'o Wed, 22 Dec 2010 18:39:19 -0500 + +e2fsprogs (1.41.13-1) unstable; urgency=low + + * New upstream release + * E2fsck can now do journal-only replays via "e2fsck -E journal_only" + * E2fsck now understands UUID= and LABEL= specifiers for the -j option + (Closes: #559315) + * E2fsck.conf now supports a new config option, which forces the + problem not to be fixed: problems/ Mon, 22 Nov 2010 16:00:50 -0400 + +e2fsprogs (1.41.12-2) unstable; urgency=high + + * Allow tune2fs to set uninit_bg without requiring an fsck + * Fix test in e2fsck to correctly check for EOFBLOCKS files + * Fix dependencies for libuuid and libblkid (Closes: #583551) + + -- Theodore Y. Ts'o Thu, 03 Jun 2010 09:30:36 -0400 + +e2fsprogs (1.41.12-1) unstable; urgency=low + + * New upstream release + * mke2fs now gives the correct error message if the external journal + is device is not found + * The resize2fs program will refuse to print the minimum size needed + for a file system if it is not clean. + * E2fsck now tests for extents that begin at physical block 0 and + rejects them as invalid. + * Fixed a bug in e2fsck which could cause it to crash when trying to + remove an invalid extent and the block bitmaps hadn't yet been loaded. + * E2fsck will now completely skip time-based checks if the system + clock looks insane or if the broken_system_clock option is set + in /etc/e2fsck.conf. (Closes: #549861, #540152) + * Fixed a bug in e2fsck which caused e2fsck to complain about i_blocks + with a 4T file created using posix_fallocate() + * E2fsck will now correctly mark a sparse journal as invalid and will + delete and recreate the journal to address the problem. + * Fixed e2fsck not to ask permission from the user to abort if it's + going to abort regardless of what the user is going to say... + * E2fsck can now continue even if it fails to recreate the resize inode + * E2fsck will now avoid removing directory entries for inodes found in + the unused region of the inode table until after it restarts the fs + check to avoid removing valid data. + * E2fsck will now longer try to set the block group checksums if it + is interrupted. + * Mke2fs will check both the physical and logical blocksizes of a + device to better support 4k sector drives. + * Mke2fs will accept the valid (but rarely useful) flex_bg size of 1 + * E2fsck will check for cases where the EOFBLOCKS_FL is set when it is + not needed, and offer to clear it. + * The com_err library will now only output a CR character if the + stderr is connected to a tty in raw mode. + * Update Czech, Chinese, Dutch, French, Germany, Indonesian, Polish, + and Vietnamese translations (from the Translation Project) + * Add an fsck.ext4 symlink in the e2fsprogs-udeb package (Closes: #571247) + * Fix makefile dependency so dpkg-buildpackage -j2 works (Closes: #563487) + + -- Theodore Y. Ts'o Mon, 17 May 2010 19:43:52 -0400 + +e2fsprogs (1.41.11-1) unstable; urgency=medium + + * New upstream release + * Add Heimdal function com_right_r() to libcom_err (Closes: #558910) + * Allow e2fsck to run even if the physical device has more than 2**32 blocks + * Debugfs's "logdump -b " now properly shows the allocation status + of the block . (Closes: #564084) + * Make e2fsck's "the filesystem is mounted" message is now more scary + to hopefully dissuade users from thinking, "surely that message + doesn't apply to *me*" :-( + * e2fsck -n will now always open the file system read-only. We now + disallow certain combination of options which previously were manual + exceptions; this is bad because it causes users to think they are + smarter than they really are. So "-n -c", "-n -l", "-n -L", and + "-n -D" are no longer supported. + * If the partition is badly aligned, have mke2fs just print a warning + message and continue. Previously mke2fs would ask to confirm, and + this broke distro installation scripts. + * Fix a bug in libext2fs caused the creation of very large journals + for ext4 to be _very_ slow. + * E2fsck now understands the EOFBLOCKS_FL flag which will be used in + 2.6.34 kernels to make e2fsck not complain about blocks deliberately + fallocated() beyond an inode's i_size. + * Fix a bug in e2fsck which could cause e2fsck -D to corrupt + non-indexed directories. (Closes: #572453) + * debian/rules: can be compiled statically with stack protector now. + (Closes: #573923) + * Update debian policy compliance to 3.8.4 + + -- Theodore Y. Ts'o Mon, 15 Mar 2010 00:16:35 -0400 + +e2fsprogs (1.41.10-1) unstable; urgency=low + + * New upstream release + * Fix resize2fs bug which causes it to access invalid memory + * Add libss support for libreadline.so.6 + * Fix e2fsck's check for extent-mapped directory with an incorrect file type + * Add new e2fsck.conf configuration option: + default/broken_system_clock for system with broken CMOS hardware + clocks. (Closes: #559776) + * Fix flex_bg inode table placement algorithm used by mke2fs for + certain specific file system sizes + * Add source lintian overrides for weak-library-dev-dependency + * Fix FTBFS problem caused by texi2html changing (again) its output + location. (Closes: #552934) + * Make e2fsck to avoid rehashing directories which can fit in a + single directory block. + * Fix how e2fsck fixes sparse directories which are extent-mapped. + * Fix some big-endian bugs in e2fsck and libext2fs + * Teach e2fsck to detect and fix sparse extent-mapped directories + * Fix filefrag from core dumping on file systems with 8k block sizes + * E2fsck was depending on i_size to be correct to detect and fix + certain directory problems before actually fixing the + directory's i_size. This caused certain rare corruptions to + require two runs of e2fsck to address. + * Update Czech, Indonesian, Polish and Vietnamese translations + (from the Translation Project) + * Fix e2fsck to find and correct duplicate directory entries in + non-indexed directories. + * Add support for calling BLKDISCARD to mke2fs. + * Enhance libext2fs so it works around bug in Linux version 2.6.19 + and earlier where the /proc/swaps file was missing the header on + the first line. + * Fix resize2fs so it works correctly on file systems with external journals + * Fix libss so that it does not seg fault when using a readline + library which does not supply a readline_shutdown() function. + * Add a pre-depends for util-linux-ng (Closes: #551795) + * Update and clarify various man pages. + * Corrected dumpe2fs's usage message + * Teach libext2fs to ignore the high 32 bits of the i_blocks field + when huge_file file system feature is set, but the inode does not + have the HUGE_FILE_FL flag set. + * Change e2fsck to accept superblock times to be fudged by up to 24 + hours by default. Most distributions have fixed their init scripts, + but apparently now they have buggy virtualization scripts. :-( I + give up, too many buggy user space set ups out there. (Closes: #557636) + * Fix e2fsck to correctly print > 32-bit i_blocks numbers in problem reports + * Improve e2fsck so it prints "Illegal indirect block" instead of + "Illegal block #-1" + * Teach mke2fs to get device topology information from blkid and use + it to populate the superblock stride and stripe sizes and warn if + the block device is misaligned + * Fix a file descriptor leak in debugfs when sourcing a command file + * Fix a file descriptor leak in fsck + * Round up the bitmap size to prevent spurious segmentation faults on + BSD platforms. + * Fix resize2fs to correctly calculate the minimum size needed, when + flex_bg is enabled, to prevent resize2fs -M from failing. + * Dumpe2fs now displays more information about the contents of the journal + * Make sure the libblkid1 and libblkid1-dbg packages have changelogs + * On low memory systems, e2fsck can print some very scary looking + error messages. Clean up them up to avoid user panic. (Closes: #509529) + * Enhance blkid to support .ko.gz files in the modules.dep parser + * Fix tune2fs -j for mounted exted-enabled file systems + * Use the feature name "extent" instead of "extents" in mke2fs.conf. + Both work, but the latter is what is documented in the man page. + (Closes: #540111) + + -- Theodore Y. Ts'o Sun, 07 Feb 2010 20:56:47 -0500 + +e2fsprogs (1.41.9-1) unstable; urgency=low + + * New upstream release + * Fix tune2fs -I to work correctly in the face of bad blocks and + filesystems formatted for RAID arrays, and ENOSPC errors + * Require the user to only answer one question instead of multiple + ones for multiple bad block group checksums, or when an inode + table needs to be moved. + * Fix e2fsck to handle moving inode tables in FLEX_BG filesystems more + gracefully by looking in the entire flex_bg for space, instead of + just in the block group; if that doesn't work, try looking for + space in the entire filesystem. + * Fix the filefrag code to avoid printing the extent header if it + needs to fallback to using the FIBMAP ioctl. + * Fix filefrag to print the correct number of extents for zero-length + files when using FIBMAP. (Closes: #540376) + * Add a filefrag -B option to make it easier to debug the FIBMAP + support. + * Allow e2fsprogs programs to allocate from uninitialized block groups. + * Add a new program, e2freefrag, which displays information about the + free space fragmentation in an ext2/3/4 filesystem. + * E2fsck will now print much fuller information when the last mount + time or last written time is in the future, since most people can't + seem to believe their distribution has buggy init scripts, or they + have a failed CMOS/RTS clock battery. + * Update French, Polish, Czech, and Swedish translation from the + Translation Project. + * Enhance debugfs's 'stat' command to print basic extent information + for extent-mapped inodes, and add a new command, 'dump_extents' + which prints detailed information about an inode's extent tree. + + -- Theodore Y. Ts'o Sun, 23 Aug 2009 10:08:52 -0400 + +e2fsprogs (1.41.8-2) unstable; urgency=low + + * Fix regression in ext2fs_extent_set_bmap() which caused e2fsck -fD + to fail on ext4 filesystems if the directory needs to shrink by more + than a block (Closes: #537510) + * Fixed filefrag for non-extent based files + * Fix use of apostrophe's in package descriptions + * Don't use dietlibc when building for mips and mipsel architectures + + -- Theodore Y. Ts'o Mon, 20 Jul 2009 09:38:21 -0400 + +e2fsprogs (1.41.8-1) unstable; urgency=low + + * New upstream release + * Fix resize2fs bugs when shrinking ext4 filesystems + * Update debian policy compliance to 3.8.2 + * Update package descriptions to mention ext3 and ext4 filesystems + (Closes: #535530) + * Update French, Polish, Czech, Indonesian, and Swedish translation + from the Translation Project. + * If the resize2fs operation fails, the user will be told to fix up + the filesystem using e2fsck -fy. + + -- Theodore Y. Ts'o Sat, 11 Jul 2009 17:26:16 -0400 + +e2fsprogs (1.41.7-2) unstable; urgency=low + + * Fix online resizing using resize2fs (Closes: #535452) + * Fix the filefrag program for files with more than 144 extents + * Update and clarify various man pages. + * Fix potential filesystem corruptions caused by using resize2fs to + shrink filesystems with extents enabled. + + -- Theodore Y. Ts'o Tue, 07 Jul 2009 23:21:46 -0400 + +e2fsprogs (1.41.7-1) unstable; urgency=low + + * New upstream release + * Fix memory leaks in e2fsprogs, including a very large memory leak + which can cause e2fsck to run out of memory when checking very large + filesystems using extents. + * Fix a bug in libext2fs which can cause e2fsck and resize2fs to write + uninitialized data into the portion of the inode beyond the first 128 + bytes when operating on extents; potentially corrupting filesystems. + * The logsave program will now filter out the ^A and ^B characters when + writing to the console. + * Update/clarify man pages (Closes: #531385, #523063) + * Fix filefrag program so it correctly checks for errors from the + fiemap ioctl. + * Change badblocks to allow block sizes larger than 4k. + * Fix libext2fs to properly initialize i_extra_size when creating the + journal and resize inodes. + * Resize2fs will now update the journal backup fields in the + superblock if the journal is moved; this avoids an unnecessary full + fsck after resizing the filesystem. + * Use the same encoding as the kernel for rec_len == 64k in 64k block + filesystems. + * Fix lsattr to exit with a non-zero status when it encounters errors. + * Enhance badblocks to print the currently tested block number when + interrupted with ^C. + * Fix debugfs from core dumping if the logdump command fails to open the + output file. + * Harden ext2fs_validate_entry() so that lsdel will not read beyond the + end of the block even if the directory block is corrupted. + * Update Chinese and Czech translation from the Translation Project. + + -- Theodore Y. Ts'o Mon, 29 Jun 2009 15:12:14 -0400 + +e2fsprogs (1.41.6-1) unstable; urgency=low + + * New upstream release + * Update and clarify man pages + * Fix a number of Lintian warnings, including to updating to debian + policy 3.8.1 + * Update config.guess and config.sub to the latest (2009-04-17) + version so that e2fsprogs will build on the avr32 platform + (Closes: #528330) + * Add an explicit error message if the /etc/mtab file is missing + when running e2fsck or resize2fs (Closes: #527859) + * Enhance e2fsck to handle the case where the primary block group + descriptors need fixing, and the backup superblock is corrupt. + (Closes: #516820) + * Add an "-a" option to debugfs's close_filesys command + * e2fsck will no longer abort a preen operation if an inode's + i_file_acl_hi field is non-zero. (Closes: #526524) + * The chattr program can now migrate inodes from using direct/indirect + blocks to extent trees. + * Speed up e2fsck if there are multiple block groups with inodes in + use in the unused portion of the block group's inode table. + * Update Chinese translation from the translation project + * Fix resize2fs so it won't corrupt ext4 filesystem when asked to + shrink a filesystem smaller than the minimum suggested size. + * Fix e2fsck regression which can corrupt ext4 filesystems when + replaying the journal. + * Add support to e2fsck for handling I/O errors while replaying the + journal + * Fix a bug in e2fsck which could cause it to crash if an inode has a + corrupt extent header, and the user declines to clear the inode. + * Fix blkid to prefer the /dev/mapper/ device names over the + private /dev/dm-N device names. + * Add support for the FIEMAP ioctl to the filefrag program + * Further speed up e2fsck by skipping journal checks if the filesystem + is mounted read-only and is marked as not needing journal replay. + * Add a build depends in the control file indicating that dietlibc + must be newer than version 0.30 (Closes: #506064) + + -- Theodore Y. Ts'o Fri, 30 May 2009 13:26:23 -0400 + +e2fsprogs (1.41.5-1) unstable; urgency=low + + * New upstream release + * E2fsck will now detect and fix inodes that have a non-zero + i_file_acl_high field on 32-bit filesystems. + * Update build-depends to indicate that dietlibc 0.30 doesn't work. + (Closes: #506064) + + -- Theodore Y. Ts'o Fri, 24 Apr 2009 08:52:47 -0400 + +e2fsprogs (1.41.4-3) unstable; urgency=low + + * Update/clarify man pages (Closes: #365619) + * Fix a problem where the 'device names' for pseudo-filesystems in + /proc/mounts could confuse the e2fsprogs into thinking that a + filesystem image stored in a regular file was mounted when it was not + * Remove whole-disk entries from the blkid cache when partitions are found + * Reduce the number of disk reads needed when the filesystem is clean + * Add Chinese (simplified) translation from the Translation Project + + -- Theodore Y. Ts'o Thu, 23 Apr 2009 01:35:22 -0400 + +e2fsprogs (1.41.4-2) unstable; urgency=low + + * Update the debian copyright files to point at the version-specific + GPL and LGPL files. + * Update the debhelper compat level to 7 + * Fix a number of filesystem corruption bugs in resize2fs when growing + or shrinking ext4 filesystems off-line (i.e., when the ext4 + filesystem is not mounted). + * Clarify tune2fs man page (Closes: #515693) + * Add homepage field to the debian control file (Closes: #506279) + * Fix Hurd compilation problem (Closes: #521602) + * Debugfs can now set i_file_acl_high via the set_inodes_field command + * Debugfs will now display a 64-bit file acl block + * Fix various gcc compilation warnings and other programming cleanups + * Make sure libuuid closes all file descriptors before starting the + uuidd daemon. + * Avoid running e2fsck unnecessarily after doing an online resize + * Mke2fs -S will now avoid trying to create the journal + * Update the Czech translation from the translation project. + * Fix support for external journals (which was broken in e2fsprogs 1.41.4) + * Fix a compatibility issue with libext2fs info page and makeinfo 4.12 + * Fix a segfault in debugfs when running stat without an open filesystem + * Teach the blkid library that starting in 2.6.29, ext4 can support + filesystems without journals. + * Add error check preventing the reserved_ratio argument to mke2fs and + tune2fs from being negative. (Closes: #517015) + * Add support for tracking the number kilobytes written to the + filesystem via the superblock field s_kbytes_written + + -- Theodore Y. Ts'o Sun, 19 Apr 2009 23:05:53 -0400 + +e2fsprogs (1.41.4-1) unstable; urgency=low + + * New upstream release + * Fix bug which could sometimes cause blkid to return an exit value of + zero for a non-existent device (Closes: #502541) + * Fix spelling mistake in Debian changelog (Closes: #502323) + * Fix blkid to deal with an ext3 filesystem with the test_fs flag + * Fix debugfs's ncheck output to suppress extra characters at the end + of the file name + * Tune2fs now updates the block group checksums after changing the + filesystem's UUID + * Speed up tune2fs's inode resizing code so it is no longer vastly + inefficient for moderate to large filesystems + * Fix dumpe2fs so it doesn't attempt to print the inline journal + information on filesystems with an external journal + * Update the Catalan translation + * Filter out linux-vdso.so lines when determining the library + dependencies while building the initial ramdisk (Closes: #503057) + * Fix e2fsck so an errant INODE_UNINIT flag set in a block group + doesn't cause e2fsck to abort. + * E2fsck now distinguishes between fragmented directories and + fragmented files in verbose mode statistics and in the fragcheck + report. + * Avoid double-counting non-contiguous extent-based inodes in the + verbose mode statistics. + * E2fsck now leaves slack space when repacking directories so that a + few new directory entries won't cause leaf nodes to become split + right away. + * E2fsck was previously not handling the case of a corrupted interior + node in the extent tree, and would crash in that case. It now will + handle this and related failures robustly. + * E2fsck problem descriptions involving the journal are no longer + referred to as "ext3" problems, since ext4 filesystems also have + journals. + * Fix a long-standing bug in e2fsck which would cause it to crash when + replying journals for filesystems with block sizes greater than 8k. + * Fix a regression in debugfs's logdump command so it works for + filesystems with 32-bit block numbers. This was accidentally broken + when the header files were changed to support the 64-bit block numbers. + * Fix resize2fs for ext4 filesystems. Some blocks that that need moving + when shrinking filesystems with uninit_bg feature would not be + moved. In addition, blocks and inode table blocks were not being + correctly freed when shrinking filesystems with the flex_bg feable, + which caused resize2fs -M to fail. Finally, when blocks are moved, + make sure the uninitialized flag in extents is preserved. + * Add mkfs.ext4 symlink to the e2fsprogs-udeb package (Closes: #511207) + * Resize2fs now reserves some extra block when calculating the minimum + size to shrink the filesystem in case some extent allocation trees + * Add a "set -e" to uuid-runtime's prerm script to make Lintian happy + * The blkid library will now recognize btrfs filesystems and swap + devices currently used by user-level software suspend. + * tune2fs will not allow changing the inode size for filesystems that + have the flex_bg feature enabled, since the code currently assumes + the each block group's portion inode table is located in its own + block group. + * Fix tune2fs -I so it won't corrupt ext3/ext4 filesystem configured + for RAID storage devices. + * Mke2fs now understands a -U option which allows the UUID to be + specified for the new filesystem. + * Mke2fs will now treat devices with exactly 16TB as if they have 16TB + minus one block, since many users expect ext4 to support 16TB + devices, and the true maximum size is 16TB-1. + * E2fsck will now flag filesystems that have an insane s_first_ino + field in their superblock. + + -- Theodore Y. Ts'o Tue, 27 Jan 2009 11:50:49 -0500 + +e2fsprogs (1.41.3-1) unstable; urgency=low + + * New upstream release + * Fix e2fsck so it prints the correct inode number for uinit_bg + related problems. + * E2fsck will offer to clear the test_fs flag if the ext4 filesystem + is available. + * Fix a file descriptor leak in libblkid + * Avoid a potential infinite loop in e2fsck when there are disk I/O + errors while trying to close a filesystem. + * Fix a potential infinite loop in resize2fs when a bogus new size of + 0 blocks is specified on the command line. + * Add an early check to see if a device is read-only to avoid lots of + confusing error messages. + * Fix debugfs's ncheck command so it prints all of the names of + hardlinks in the same directories. + * Fix a bug in libblkid so it correctly detects whether the ext4 and + ext4dev filesystems are available, so that the ext4dev->ext4 + fallback code works correctly. + + -- Theodore Y. Ts'o Sun, 12 Oct 2008 22:45:34 -0400 + +e2fsprogs (1.41.2-1) unstable; urgency=low + + * New upstream release + * Fix e2fsck's automatic blocksize detection. This fixes a regression + added in e2fsprogs 1.40.7 where e2fsck's -b option would not + work if a blocksize wasn't also specified via the -B option. + * Fix a potential file descriptor leak in libcom_err if the + application exec's another program. + * Fixed badblocks output for "badblocks -sw" + * debugfs: Fix ncheck to print all pathnames for all of the specified inodes + * Use dietlibc when possible for building e2fsck.static, to reduce the + size of the static binary. + * debugfs: Add the ability to specify the hash seed and to specify the + hash algorithm by name to the "hash" command. + * Add documentation for the file I/O functions to libext2fs.texinfo. + (Closes: #484877) + * Fix a bug in e2fsck where if a translation file is being used and + e2fsck needs to print problem report with a custom question (such as + "Run journal anyway?"), the PO file's header would get spewed onto + the terminal. + * Update Swedish, Vietnamese, Dutch, Indonesian, German, Czech translations + * Fixed spelling mistakes in man pages (Closes: #498100, #498101, + #498102, #498103) + + -- Theodore Y. Ts'o Thu, 02 Oct 2008 08:54:16 -0400 + +e2fsprogs (1.41.1-3) unstable; urgency=low + + * badblocks -v will now display the time and percentage complete + (Closes: #429739) + * Reordered debian/rules when building udebs to avoid a Lintian warning + * Fixed dependencies fields in the udeb packages (Closes: #497619) + * Avoid linking various programs with unneeded libraries + * Fixed a typo'ed bold font specifier in mke2fs's man page + * Fixed the pkg-config files so the include directory needed by the + various libraries is included, and to use Requires.private to + avoid unnecessary linking of dynamic libraries. + * Add more historical information to the debian/*.symbol files + + -- Theodore Y. Ts'o Fri, 05 Sep 2008 11:11:03 -0400 + +e2fsprogs (1.41.1-2) unstable; urgency=low + + * Make sure ext4_swab64() is defined on all platforms (Closes: #497515) + * Badlocks: Use O_LARGEFILE so it will run on files greater than 2GB + + -- Theodore Y. Ts'o Tue, 02 Sep 2008 09:53:46 -0400 + +e2fsprogs (1.41.1-1) unstable; urgency=low + + * New upstream release + * mke2fs and tune2fs now use half-md4 as the default hash algorithm + In addition the default hash algorithm can be via mke2fs.conf for + mke2fs, and via a command-line option for tune2fs. + * Add support for on-line resizing of ext4 filesystems with the + flex_bg filesystem feature. + * e2fsck now creates the journal in the middle of the filesystem, + which can speed up fsync-heavy workloads. + * Make the blkid library more efficient for devicemapper devices, + mostly by no longer using the libdevmapper library. + * Fix various namespace leakages by the libblkid, libe2p and libext2fs + libraries. + * Fix support for empty directories in 64k blocksize filesystems. + * Add supported_features command to debugfs + * Improve libblkid detection of JFS and HPFS filesystems + * The test I/O manager is now compiled in by default, but to avoid its + overhead, it is only enabled when the TEST_IO_FLAGS or TEST_IO_BLOCK + environment variables are set. + * Fix filefrag's ideal extent calculation (Closes: #458306) + * Fix postinstall scripts when the user/group is in LDAP (Closes: #497010) + * Add Indonesian and update French, Polish, Dutch, German, Swedish, + Czech, and Vietnamese Translations. (Closes: #313697, #401092) + * Update/clarified man pages + * Add dpkg-gensymbols support to track ABI changes to the libraries + * Add lintian overrides for uuid-runtime and libuuid1 + * Remove (no longer needed) lintian overrides for e2fsck-static + * Add debian/watch file + + -- Theodore Y. Ts'o Mon, 01 Sep 2008 11:30:21 -0400 + +e2fsprogs (1.41.0-4) unstable; urgency=low + + * mke2fs will issue a warning if mke2fs.conf hasn't been updated and + the user tries to create an ext3, ext4, or ext4dev filesystem, + since it depends on the mke2fs.conf file in order to create the + filesystem properly with the appropriate features. + * Fix the maximum journal size message in mke2fs and tune2fs to be + consistent/correct. (Closes: #491620) + * Add detection for hfsx filesystem and add label and uuid detection + for hfs, hfsplus, and hfsx filesystems in libblkid. + * Fix cosmetic issue in resize2fs when a progress bar doesn't finish + with a newline for pass 4 (when the inode references are updated). + * Teach resize2fs to move blocks when extents are present (when + shrinking a filesystem and/or if resize_inode is not present). + * Teach resize2fs to work correctly with the uninit_bg when blocks + need to be moved or allocated. + * Fix and optimize extent manipulation in libext2fs for resize2fs. + * Fix "dumpe2fs -i" and "debugfs -i". (Closes: #495830) + * Fix resize2fs incorrectly managing directory in-use counts when + shrinking filesystems and directory inodes need to be moved. + * Fix spurious e2fsck complaints with i_size with extents and large + files and preallocated blocks. + * Make sure the creation timestamp is set by mke2fs and by new inodes + created by the libext2fs in general. + * Fix ind/dind/tind statistics when extents are present, and add + extent tree depth statistics. + * Add a fragmentation report extended option to e2fsck. + * Fix blkid cache validation and some possible blkid crashes + (Closes: #493216) + * Teach debugfs's htree command to work with extent-based directories. + * Improve the error message for "tune2fs -I". + * Fix miscellaneous strings and usage messages pointed out by the + translators. (Thanks, translators!) + * Enforce that mke2fs won't allow features for revision 0 filesystems. + * Optimize inode table allocation in mke2fs for flex_bg filesystems. + * Update/clarified man pages + * Fix minor typo in uuid-runtime's debian package description + * Wrap debian/copyright files to avoid "line too long" lintian warnings + + -- Theodore Y. Ts'o Sat, 23 Aug 2008 08:56:47 -0400 + +e2fsprogs (1.41.0-3) unstable; urgency=medium + + * Fix mips-specific FTBFS problem in debian/rules file + * Synchronize section and priority levels in control file with the + FTP masters' override file. + + -- Theodore Y. Ts'o Tue, 15 Jul 2008 11:38:59 -0400 + +e2fsprogs (1.41.0-2) unstable; urgency=medium + + * Don't try to check the group descriptor checksum if the GDT_CSUM + feature is not present. (Closes: #490637) + * Add a new blkid -L option which pretty-prints the currently + available block devices. (Closes: #490527) + + -- Theodore Y. Ts'o Sun, 13 Jul 2008 19:18:08 -0400 + +e2fsprogs (1.41.0-1) unstable; urgency=medium + + * New upstream version + * Make e2fsck detect corrupted block group descriptors that would + cause it to relocate inode tables, causing more damage to the + filesystem, and make it try the backup superblock/block group + descriptors first. + * Fix resize2fs to clean up the resize_inode if all of the reserved + gdt blocks are consumed during an off-line resize. + * Enable huge_file, dir_nlink, extra_isize features for mke2fs and tune2fs. + * Enable huge_file, dir_nlink, extra_isize, and uninit_bg by default + in mke2fs.conf. + * Fix badblocks terminology in man page and program output. + (Closes: #440983, #440981) + * Clarify stripe-width and stride-size in mke2fs man page. (Closes: #487849) + * mke2fs: Dumb down filesystems for GNU Hurd (Closes: #471977) + * Add bash-static to the list of shells recommended for e2fsck-static + (Closes: #490003) + * mke2fs: Fix flex_bg metadata default layout to avoid a hole between + the bitmaps and inode tables. + + -- Theodore Y. Ts'o Thu, 10 Jul 2008 17:25:32 -0400 + +e2fsprogs (1.41~WIP-2008-07-07-1) experimental; urgency=low + + * New upstream version (pre-release for e2sprogs 1.41) + * Update to indicate compliance with debian policy version 3.8.0.0. + * Fix e2fsck to not truncate valid extent files that are larger than + what is supported by indirect files. + * Add -dbg packages which contain the debugging information. + * mke2fs: Print a better error message when a device is too big. + (Closes: #488663) + * Create external journal devices with a default blocksize of 4k + * Fix bug in badblocks which caused crash when lots of -t patterns are + given. (Closes: #487298) + * Fix blkid handling of stale entries. (Closes: #487758, #487783) + * Update Vietnamese, Polish, French, Spanish, German, Catalan, + Dutch, Czech translations from the translation project. + * Fix FTBFS problem on MIPS (Closes: #487675) + * Fix bug in libuuid1.postinst which would cause it to blow up if + there were spaces around the equals sign in /etc/adduser.conf. + (Closes: #487443) + * Update/clarified man pages. (Closes: #393313) + + -- Theodore Y. Ts'o Mon, 07 Jul 2008 16:30:43 -0400 + +e2fsprogs (1.41~WIP-2008-06-17-1) experimental; urgency=low + + * New upstream version (pre-release for e2fsprogs 1.41) + * New options to badblocks allow it to limit how quickly it reads + from disk (for background scrubbing) and abort after a finding + giving a number of errors. + * Add support for ext4 filesystem features. (Closes: #388452, #425477) + * Tune2fs can migrate a filesystem from using 128 byte inodes to + larger inode sizes so the user can take full advantage of ext4) + * E2fsck and mke2fs can optionally record an undo log which can be + replayed by the e2undo program. + * E2fsck will display a less cryptic message when the last check field + in the superblock is in the future. (Closes: #446005) + * Improve blkid probes for LVM volumes and swap partitions + * Mke2fs has a much more sophisticated system for controlling the + parameters of newly created filesystems. The -t option now is used + to specify the filesystem type. See the mke2fs and mke2fs.conf man + pages for more details. + * Resize2fs will now print the minimum needed filesystem size if given + the -P option, and will resize the filesystem to the smallest possible + size if given the -M option. + * E2fsck now performs more extensive and careful checks of extended + attributes stored in the inode. + * Mke2fs will always make sure that lost+found always has at least 2 + blocks, even for filesystems with very large blocksizes (i.e., 64kb). + * The debugfs "ls" command now supports the -p option, which causes + filenames to be printed surrounded by double quotes. + * Fix a potential off-by-one buffer overflow in e2image + * The chattr program will now return a non-zero exit code in case of + failures. + * This version of e2fsprogs removes support for legacy big-endian + filesystems and for MASIX filesystems. + * Add I/O statistics reporting to e2fsck. + + -- Theodore Y. Ts'o Tue, 17 Jun 2008 23:57:08 -0400 + +e2fsprogs (1.40.11-1) unstable; urgency=low + + * Change mke2fs, tune2fs and resize2fs to use floating point precision + when calculating the number of reserved blocks. (Closes: #452639) + * Update Spanish and Catalan translations. + * Fix ext2fs_swap{16,32,64} for external applications. (Closes: #484879) + * Improve uuid-runtime package description. (Closes: #483962) + * Improve e2fsprogs package description. (Closes: #483023) + * Add support for detecting ZFS volumes to libblkid. + * Clarify debugfs man page. (Closes: #486463) + + -- Theodore Y. Ts'o Tue, 17 Jun 2008 21:59:21 -0400 + +e2fsprogs (1.40.10-1) unstable; urgency=low + + * Fix a very rare potential data corruption bug in e2fsck's journal + replay. + * Updated German, Dutch, Swedish, and Vietnamese translations. + * Force blkid to revalidate a device if its mtime is newer than the + last validation time in the cache. + + -- Theodore Y. Ts'o Wed, 21 May 2008 13:35:12 -0400 + +e2fsprogs (1.40.9-1) unstable; urgency=low + + * Fix fsck so that if multiple filesystems are being checked in + parallel, the progress bar for subsequent filesystems will be + correctly displayed. (Closes: #432865) + * Fix fsck -Cn for n!=0 for better Ubuntu boot-time support + * debugfs: Don't bother using a pager of stdout is not a tty + * Fix tune2fs and debugfs to correctly parse time strings during + daylight savings time. (Closes: #471882) + * Teach fsck to treat ext4 and ext4 filesystems as ext* filesystems + * Logsave will now propagate SIGINT and SIGTERM signals to its child + process. + * Mke2fs will not allow the illogical combination of the resize_inode + and meta_bg filesystem features. + * Use UID/GID ranges from adduser.conf if present, even though we + don't use adduser to add users/groups. (Closes: #473179) + * Updated German, Czech, Dutch, French, Polish, Swedish, and + Vietnamese translations. + * Update/clarified the mke2fs man page + + -- Theodore Y. Ts'o Sun, 27 Apr 2008 00:35:20 -0400 + +e2fsprogs (1.40.8-2) unstable; urgency=low + + * One more big-endian swap fix needed for resize2fs to work correctly + with in-inode extended attributes. + * Fix minor security issues identified in uuidd. + * Remove e2fsprogs preinstall script which contained stuff not needed + in well over two stable releases. + + -- Theodore Y. Ts'o Fri, 14 Mar 2008 14:25:54 -0400 + +e2fsprogs (1.40.8-1) unstable; urgency=low + + * Fix e2image -I so it works on image files which are larger than 2GB. + * Fix e2fsck's handling of directory inodes with a corrupt size field. + * Fully fix a resize2fs bug where extended attributes in large inodes + could get dropped on big-endian systems. + * Update Czech, Dutch, Polish, Swedish, and Vietnamese translations. + * Significantly updated German translation! Thanks to Philipp Thomas + from Novell for stepping up to be our new German translation + maintainer! (Closes: #302512, #370247, #401092, #412882) + * Fixed mke2fs man page to document new default inode size. + + -- Theodore Y. Ts'o Thu, 13 Mar 2008 20:00:09 -0400 + +e2fsprogs (1.40.7-1) unstable; urgency=low + + * New upstream release + * tune2fs no longer will remove the sparse_super feature, as it is dangerous + * Update/clarified various man pages + * Fix bug where large nodes were not getting fully copied when + shrinking a filesystem using resize2fs. + * Allow mke2fs and tune2fs to manipulate the large_file feature flag + * Suppress fsck's warning message about an old-style fstab if the + fstab file is empty. (Closes: #468176) + * E2fsck will no longer clear the large_files feature flag + automatically when there are no more large files in the system. + * Fix blkid code to avoid segfaulting when a device mapper volume + disappears out from under it. + * Enhance e2fsck's reporting of unsupported filesystem features + * Fix dumpe2fs command syntax for explicit superblock/blocksize parameters + * Teach tune2fs to clear the resize_inode feature flag + * Fix libuuid1 postinstall script to explicitly pass 100 to UID_MIN + and GID_MIN, to make it clear we are not trying to allocate an + uid/gid in the globally reserved range. (Closes: #466929) + * Fix memory leak in ext2fs_alloc_block() + * Teach blkid to recognize LVM2 physical volumes + * Add support to dumpe2fs, mke2fs, and tune2fs for specifying and + printing the RAID stride and stripe width. + * Add support for new superblock fields to debugfs's set_super_value command + * Teach debugfs to print "mostly-printable" xattr strings, such as is + used by SELinux. + * Add support in fsck to ignore mounted filesystems when given the -M option + * Fix uuidd so it creates the pid file with the correct pid number + * Update Czech, Dutch, Polish, Swedish, and Vietnamese translations + from the Translation Project. + + -- Theodore Y. Ts'o Thu, 28 Feb 2008 22:27:39 -0500 + +e2fsprogs (1.40.6-1) unstable; urgency=low + + * New upstream release + * Add support for returning labels for UDF filesystems in the blkid + library. + * Fix bug in the blkid library where cached filesystems was not being + flushed when opening USB devices returned the error ENOMEDIUM. + (Closes: #463787) + * Add logic to the blkid library to automatically choose whether a + filesystem should be mounted as ext4 or ext4dev, as appropriate. + * Allow tune2fs to set and clear the test_fs flag on ext4 filesystems. + * Document the BLKID_FILE environment variable in the libblkid man page + * Update Vietnamese and Czech translations from the translation project + * Fix dependency problem caused by dpkg 1.14.16 (Closes: #436058) + * Use thread local storage to fix a theoretical race condition if two + threads try to format an unknown error code at the same time in + the com_err library. + + -- Theodore Y. Ts'o Sun, 10 Feb 2008 00:06:02 -0500 + +e2fsprogs (1.40.5-2) unstable; urgency=low + + * Fix debian/control and debian/rules so that they work correctly + after a change in dpkg-gencontrol's behavior after version 1.14.16 + of dpkg. This fixes bad version dependencies for comerr-dev, + uuid-dev and ss-dev. Thanks to Don Armstrong for the explanation and + Margarity Manterola for a proposed patch. (Closes: #463058) + + -- Theodore Y. Ts'o Wed, 30 Jan 2008 07:17:27 -0500 + +e2fsprogs (1.40.5-1) unstable; urgency=low + + * New upstream release. + * Mke2fs will now create new filesystems with 256 byte inodes and the + ext_attr feature flag by default. This allows for much better + future compatibility with ext4 and speeds up extended attributes + even on ext3 filesystems. + * Teach mke2fs and tune2fs to set a "test_fs" flag, which indicates + that it is ok to use the filesystem on in-development kernel + code (i.e., ext4dev) + * E2fsck now optimizes non-htree directories by sorting them by inode + number. + * Add support for detecting HFS+ and ext4/ext4dev filesystems in blkid + * Fix blkid's ntfs UUID handling so it is compatible with vol_id + * Avoid a floating point exception when blkid tries to probe a corrupt + reiserfs filesystem. + * Fix potential overflow problem in e2image if the device name is + too long. + * Cause e2image to exit immediately with an error message on a disk + full situation. + * Fix a minor typos in the resize2fs and uuidd manpages. + * E2fsck will no longer backup superblocks when the kernel makes + certain "safe" feature set changes behind the user's back. + * Fix debugfs's lsdel command so it works on large files + * Allow a user to undelete an inode with linking to a destination + directory. + * Update Swedish translation file from the Translation Project + * The libuuid1 and uuid-runtime packages requires passwd package, so + declare it as a dependency. (Closes: #459403) + * Fix a FTBFS problem on x86_64 caused by the fact that dietlibc + doesn't provide llseek on the x86_64. (Closes: #459614) + * Don't use dietlibc on platforms that don't support it (Closes: #459475) + + -- Theodore Y. Ts'o Sun, 27 Jan 2008 16:57:34 -0500 + +e2fsprogs (1.40.4-1) unstable; urgency=low + + * Make sure that programs like tune2fs, when modifying a mounted + filesystem do not write the backup superblocks with the + NEEDS_RECOVERY flag, to avoid e2fsck from needlessly forcing a + full fsck because it thinks the feature flags need to be backed up + from the master to the backup superblocks. (Closes: #454926) + * Improve time-based UUID generation to guarantee uniqueness even when + UUID's are being generated at very high rates on SMP systems. To + do this we use an optional setuid helper daemon (uuidd) which is + started by libuuid when it is needed. The uuidd daemon is + packaged in the (new) uuid-runtime package, which now also includes + the uuidgen program (which had been previously been included as + part of the e2fsprogs package). + * Fix fsck to only treat '#' characters at the beginning of /etc/fstab + lines as starting a comment. This avoids spurious warnings printed + for filesystems such as fuse that often use '#' as part of the + filesystem specifier (i.e., wdfs#https://dav.hoster.com/foo). + * Enhance the blkid program to pretty-print control and meta + characters to avoid garbage filesystem labels from screwing up the + user's terminal + * Fix potential integer overflows passed to malloc() in resize2fs + * Update Dutch, Polish, and Vietnamese translations from the + Translation Project. Remove the Rwandan translation upon advice + of the Translation Project. + * Fix cross-compilation support for non-Linux architectures + (Closes: #451172, #437720) + * Clarified and improved man pages (Closes: #444883, #441872) + * Fix potential divide by zero error when libblkid tried probing an + invalid FAT filesystem. + * Make error_message() in libcom_err DTRT when when a 64-bit sign-extended + error code is passed to it. + * Build the e2fsck-static package so that e2fsck.static will not use + TLS and hence will run correctly on back-level Debian systems + using a 2.4 Linux kernel. (Closes: #458017) + + -- Theodore Y. Ts'o Mon, 31 Dec 2007 22:40:42 -0500 + +e2fsprogs (1.40.3-1) unstable; urgency=medium + + * New upstream release + * libext2fs: Add checks to prevent integer overflows passed to + malloc(). Fixes security issue related to Xen's pygrub: CVE-2007-5497 + * libss: Fix parallel build failure + * e2fsprogs: fix blkid whole-disk scanning heuristics + * libext2fs: Fix a corner case bug in ext2fs_unlink + * fix check_mntent_file() to pass mode for open(O_CREAT) + * Fix errors in test_ss.c so it can be an example application and test case + * e2image in raw-mode appends an extra byte to image-file + * Fix typo in the summary section of the blkid man page + * mke2fs: Change usage message to use -E instead -R, which is deprecated + * libblkid: recognize squashfs filesystems on BE systems. + * libblkid: detect squashfs + * e2fsck: backup superblocks if key constants have changed + * e2fsck: update the backup superblocks if the feature bitmasks are changed + * ext2fs_dblist_dir_iterate: Fix ABORT propagation logic + * libblkid: Add more magic numbers that might mean there is a FAT filesystem + * e2fsck: Don't mark the filesystem invalid because of time errors + * Work around lame Ubuntu init scripts / installer bugs + * fsck: Ignore /etc/fstab entries for bind mounts + * e2fsck: If the superblock is corrupt, automatically retry with the backup sb + * Don't crash if s_inode_size is zero + * Use sscanf instead of atoi when parsing e2fsck options + * Add Catalan translation and update Spanish, French, and Dutch + translations from the Translation Project. (Closes: #411562) + * Fix typo and clarify the uuidgen man page + * Make sure $prefix/etc is created before installing mke2fs.conf + * e2fsck: Allow i_size to be rounded up to the size of a VM page + * Fix a bug in ext2fs_initialize() which causes mke2fs to fail while + allocating inode tables for some relatively rare odd disk sizes. + * Fix big-endian byte-swapping bug in ext2fs_swap_inode_full() + + -- Theodore Y. Ts'o Wed, 05 Dec 2007 20:04:28 -0500 + +e2fsprogs (1.40.2-1) unstable; urgency=low + + * New upstream release + * e2fsck: Fix salvage_directory when the last entry's rec_len is too big + * Update Turkish, Polish, Dutch, and Vietnamese PO files from the + Translation Project + * Fix a bug which would cause e2fsck segfault on very badly damaged + filesystems + * Update tune2fs man page to include more discussion of reserved + blocks (Addresses Ubuntu Launchpad bug #47817) + + -- Theodore Y. Ts'o Thu, 12 Jul 2007 22:18:51 -0400 + +e2fsprogs (1.40.1-1) unstable; urgency=low + + * New upstream release + * Clarify mk_cmds' error reporting + * e2fsck: Detect recursive loops in @-expansions + * Compile the default mke2fs.conf into mke2fs program + * Fix bogus strip permission errors when building under Debian + * Update Vietnamese, French, and Dutch PO files from the Translation Project + * Fix bug which could cause libblkid to loop forever (Closes: #432052) + + -- Theodore Y. Ts'o Sun, 8 Jul 2007 20:25:08 -0400 + +e2fsprogs (1.40-1) unstable; urgency=low + + * New upstream release + * Remove RFC-4122 logic from Debian build rules (Closes: #407107) + * Fix com_err.texinfo so that the install-info command will remove + the com_err info file from the /usr/share/info/dir file when the + comerr-dev package is removed and purged (Closes: #401711) + * Fix divide-by-zero error in blkid's NTFS proving logic + * Add new blkid -g option which causes the blkid cache to be garbage + collected + * libblkid: Fix bug which could cause bid_type to be corrupted + * mke2fs: Add sanity check to make sure inode_size * num_inodes isn't too big + * Fix additional Coverity bugs in mke2fs and e2fsck + * Improve sanity check in e2fsck's algorithm for finding a backup superblock + * Fix e2fsck get_size logic so that it will work with the Linux floppy + driver (Closes: #410569) + * Fix error checking of badblock's last-block and start-block arguments + (Closes: #416477) + * e2fsck: avoid writing overwriting the backup superblocks until the + master superblock is confirmed to be sane + * Make the blkid library more paranoid about concluding a partition + contains a NTFS filesystem. (Addresses Launchpad Bug: #110138) + * Enhance e2fsck so it will recreate the ext3 journal if the original + journal inode was cleared to due being corrupt + * Fix e2fsck so that if the backup journal information is used, that + this is written out to the journal inode + * Make e2fsck check all of the blocks in the journal inode for validity + * blkid: Add support for detecting LUKS encrypted partitions + * e2fsck: added sanity check for xattr validation + * Fix byte-swapping bug for filesystems with large inodes + * Clarify the copyright licenses used by the various libraries in COPYING + * Remove RFC-4122 from upstream (Closes: #407107) + * Fix info-dir line which prevented install-info from removing + com_err entry from from /usr/share/info/dir when the comerr-dev + package is purged (Closes: #401711) + + -- Theodore Y. Ts'o Sun, 29 Jun 2007 22:40:27 -0400 + +e2fsprogs (1.39+1.40-WIP-2007.04.07+dfsg-2) unstable; urgency=low + + * Allow the journal to up to 10,240,000 blocks + * Fix blkid library to recognize MD 0.90 superblock on little endian + systems + * Fix blkid library to report the correct UUID from MD superblocks + * Fix signed vs. unsigned problem in debugfs' setb/testb/freeb commands + * Enhance debugfs's date parser so it accepts integer values + * Fix e2fsck's pass1c accounting so it doesn't terminate too early + if a file with multiply claimed blocks is hard linked. or not at + all if the root directory contains shared blocks + * Enhance debugfs so it can modify the block group descriptors using + the command set_block_group_descriptor + * Improve e2fsck's reporting of I/O errors so it's clearer what it + was trying to do when an error happens + * Fix a bug in how e2fsprogs byte swaps inodes containing fast + symlinks that have extended attributes. + * Fix potential file descriptor leak in ext2fs_get_device_size() + * Fix minor typo in e2fsck.conf.5 man page + * Cleanup udeb dependency (Closes: #419605) + * Rebuilding with libdevmapper 1.02.1 (Closes: #421022 and #421668) + * Add dependency on comerr-dev to ss-dev (Closes: #408352) + * Make mke2fs use sane defaults when /etc/mke2fs.conf doesn't exist + * Fix mke2fs and debugfs to support large (> 16 bit) uid's and gid's + * Fix spelling typo in debian package description for libblkid1 + (Closes: #399155) + * Remove -WIP language from the debian copyright file. (Closes: #415560) + * Remove check in e2fsck which required EA's in inodes to be sorted + (We should get this back-ported to the stable branch since + filesystems with large inodes will have EA's erroneously + removed, which will for example toast an SELinux system.) + + -- Theodore Y. Ts'o Sun, 6 May 2007 19:44:35 -0400 + +e2fsprogs (1.39+1.40-WIP-2007.04.07+dfsg-1) unstable; urgency=low + + * Add libreadline.so.5 support to libss. + * Improve badblocks -n/-w exclusive usage message. + * Add debugging code (via the COMERR_DEBUG env. variable) to the + com_err library + * Fix dump_unused segfault in debugfs when a filesystem is not open + * Add versioned dependency in Debian's shlibs for libblkid. + (Closes: #413208) + * Fix memory leak in blkid library. (Closes: #413661) + * Let the debugfs lcd command work even if a filesystem is not open + * Fix large number of miscellaneous Coverity bugs. (None were + security-security). + * Fix e2fsck to clear i_size for special devices with a bogus i_blocks + field on the first pass. + * Fix e2fsck to set the file type of the '..' entry when connecting + a directory to lost+found. + * Enhance e2fsck to recover directories whose modes field were + corrupted to look like special files. + * Allow debugfs to dump > 2GB files. (Closes: #412614) + * Misc. man page cleanups. (Closes: #379695) + * Fix resize2fs parsing of size parameter (Closes: #408298) + * Fix infinite loop in e2fsck on really big filesystems (Closes: #411838) + * Fix memory leak in ext2fs_write_new_inode() + * Add support for using a scratch files directory to reduce e2fsck's + memory utilization on really big filesystems. + + -- Theodore Y. Ts'o Sat, 7 Apr 2007 10:38:40 -0400 + +e2fsprogs (1.39+1.40-WIP-2006.11.14+dfsg-1) unstable; urgency=low + + * Fix spurious error from e2fsck -c and mke2fs -c caused by the fix + to #386475. + * Add dirhash signed/unsigned hint to superblock. (Closes: #389772) + * Allow unix_io offsets greater than 2 gigabytes + * Make sure mk_cmds and compile_et work even in strange locales + * Fix type-punning bug which caused dumpe2fs to crash on the Arm platform + (Closes: #397044) + * Add explanatory message to badblocks that -n and -w are mutually + exclusive. (Closes: #371869) + * New +dfsg source tarball that has useful documentation REALLY + removed to satisfy the DFSG License Nazi's. (Closes: #390664) + + -- Theodore Y. Ts'o Tue, 14 Nov 2006 23:45:34 -0500 + +e2fsprogs (1.39+1.40-WIP-2006.10.02+dfsg-2) unstable; urgency=low + + * Add failsafes against duplicate UUID generation caused by threads + * Fix potential e2fsck -n crash caused by corrupt htrees + * Reorder the library line for static linking, to fix undefined + references to pthreads on amd64. (Closes: #393680) + * Fix mke2fs's error checking when creating revision 0 filesystems. + (Closes: #392107) + + -- Theodore Y. Ts'o Sun, 22 Oct 2006 00:19:44 -0400 + +e2fsprogs (1.39+1.40-WIP-2006.10.02+dfsg-1) unstable; urgency=low + + * New +dfsg source tarball that has useful documentation removed to + satisfy the DFSG License Nazi's. (Closes: #390664) + * Remove dependency on e2fsprogs from the e2fsck-static package + (Closes: #383521) + * Fix badblocks interpretation of its first optional argument (last-block) + (Closes: #386475) + + -- Theodore Y. Ts'o Tue, 3 Oct 2006 23:36:05 -0400 + +e2fsprogs (1.39+1.40-WIP-2006.10.02-2) unstable; urgency=low + + * Build using the sid version of libc, not experimental! + + -- Theodore Y. Ts'o Mon, 2 Oct 2006 21:43:44 -0400 + +e2fsprogs (1.39+1.40-WIP-2006.10.02-1) unstable; urgency=low + + * Previous NMU acknowledged (Closes: #388718) + * Fix debugfs to print unsigned values for EA's + * Minor man page fixes (Closes: #373004, #369761) + * Allow the default inode size to be specified in mke2fs.conf + * Require mke2fs -F -F for really dangerous operations + * Add Vietnamese translation + * Update French and Dutch translations + * Fix debugfs coredump when lsdel is run without an open filesystem + (Closes: #378335) + * Fix spelling error in e2fsck output + * Fix overflow problems when the number of inodes and blocks is + close to 2**32-1 + * Add GFS/GFS2 support to the blkid library. + * Fix blkid support of empty FAT filesystem labels + * Avoid recursing forever due to symlinks in /dev by the blkid library + * Fix bogus error messages from resize2fs caused by the filesystem + not containing a resize inode. (Closes: #380548) + * Fixed device-mapper probing (it was failing due to an extra '/dev' being + added to the device pathname) + * Make sure the default minimum size journal is big enough to support + on-line resizing. + * Add a versioned build-dep on texi2html (Closes: #389554) + * Remove useful UUID specification thanks to License Nazi's (Closes: #390664) + + -- Theodore Y. Ts'o Mon, 2 Oct 2006 13:04:27 -0400 + +e2fsprogs (1.39-1.1) unstable; urgency=low + + * Non-maintainer upload + * Added -pthreads to devmapper libraries (Closes: #388718) + + -- Ben Hutchings Sat, 30 Sep 2006 12:49:47 +0100 + +e2fsprogs (1.39-1) unstable; urgency=low + + * New upstream version + * Fix debugfs's dump_unused command so it will not core dump on + filesystems with a 64k blocksize + * Clarified and improved man pages, including spelling errors + (Closes: #368392, #368393, #368394, #368179) + * New filesystems are now created with directory indexing and + on-line resizing enabled by default + * Fix previously mangled wording in an older Debian changelog entry + * Fix doc-base pointer to the top-level html file (Closes: #362544, #362970) + + -- Theodore Y. Ts'o Mon, 29 May 2006 11:07:53 -0400 + +e2fsprogs (1.38+1.39-WIP-2006.04.09-2) unstable; urgency=low + + * Resize2fs automatically detects the previously used RAID stride + parameter so that resized filesystems can be more optimally laid + out for RAID filesystems. + * Fix mke2fs -cc and e2fsck -cc (Closes: #366017) + * Fix initrd script to fix failure with 2.4 kernels (Closes: #364516) + * Mke2fs now uses an improved layout for RAID filesystems when the + stride parameter is specified. + * Fix the debugfs commands htree_dump, dx_hash, and list_dir so they + print a usage message when an illegal option character is given. + * Speed up mke2fs and e2fsck by writing inode and block bitmaps in one pass + * Fix filefrag to be 32-bit clean by using unsigned long instead of + a signed integer for block numbers. + * Fix a bug in the e2p library which could cause dumpe2fs to + (rarely) fail to print out the journal or hash seed UUID. + * Fix memory leak in e2fsck's error paths. + * Fix comerr-dev's doc-base pointer to the top-level html file + + -- Theodore Y. Ts'o Sun, 14 May 2006 18:09:20 -0400 + +e2fsprogs (1.38+1.39-WIP-2006.04.09-1) unstable; urgency=low + + * Update config.guess and config.sub to latest version (2006-02-23) from FSF + * Update French, Dutch, Polish, Swedish, and Turkish translations + * Fix asm/types.h type conflicts on AMD64 to fix FTBFS problems. + (Closes: #360661, #360317) + * Fix bug which caused mke2fs -j to fail with an EBUSY error. (Closes + #360652) + + -- Theodore Y. Ts'o Sun, 9 Apr 2006 23:04:15 -0400 + +e2fsprogs (1.38+1.39-WIP-2006.03.29-2) unstable; urgency=low + + * Added missing build dependency on libdevmapper-dev. (Closes: #360046) + + -- Theodore Y. Ts'o Thu, 30 Mar 2006 12:33:30 -0500 + +e2fsprogs (1.38+1.39-WIP-2006.03.29-1) unstable; urgency=low + + * Add udeb: lines to the Debian's shlibs files (Closes: #356293) + * Enhance dumpe2fs to print the size of the journal + * Fix e2sprogs so that it is 32-bit clean on x86 platforms. + * Fix mklost+ound so that it creates a full-sized directory on 4k and + larger block sizes. + * Add mke2fs.conf configuration file to configure mke2fs's defaults + * Add devmapper support to the blkid library. + * E2fsck, resize2fs and mke2fs will now open the filesystem device in + exclusive mode + * Fix documentation and man pages. (Closes: #351268, #357951, #347295, + #316040) + * Cix "mke2fs -O resize_inode" for very large filesystems (Closes: #346580) + * Add on-line resizing support into resize2fs + * Fix blkid's handling of verification timeouts when the system clock is + insane + * Fix library Makefiles so they work with GNU make 3.81 as well as GNU + make 3.80. + * Enhance the blkid library to display the uuid of external journals for + ext3 filesystems + * Enhance e2fsck so it will fix the external journal hint in the + superblock if it is out of date. + * Fix debugfs's icheck to correctly report the owner of an EA block + * Update Swedish translation + * Add a configuration parameter to e2fsck.conf to control whether or not + filesystem checks are done when the system is running on battery power. + * Print an explanation when skipping a check due being on battery + (Closes: #350306) + * Update French translation (Closes: #341911, #300871, #316604, #316782, + #330789) + + -- Theodore Y. Ts'o Wed, 29 Mar 2006 20:37:27 -0500 + +e2fsprogs (1.38+1.39-WIP-2005.12.31-1) unstable; urgency=medium + + * New upstream version + * Update profile library code base + - Allow tag and section names to have quoted strings + - Make the profile library support reading files in a conf.d directory + - Slightly change the parser to support comments at the end of all lines + - Add syntax error reporting + - Simplify profile code + - Add E2FSCK_CONFIG environment variable which overrides where to + find /etc/e2fsck.conf + - Make e2fsck's filesystem problem handing configurable + - Fix FTBFS bug if comerr-dev is not installed. (Closes: #345519) + * Update Dutch, Polish, and Swedish translations. (Closes: #343149) + * Fix a fd leak across an exec in libuuid. (Closes: #345832) + * Address override file disparities + * Make urgency be medium to accelerate a workaround to Debian's buggy + initscripts (See Debian bugs: #343662, #343645) + + -- Theodore Y. Ts'o Fri, 6 Jan 2006 21:41:06 -0500 + +e2fsprogs (1.38+1.39-WIP-2005.12.10-2) unstable; urgency=low + + * Make resize2fs expand or truncate a file containing a filesystem. + (Closes: #271607) + * Add support for lib64ext2fs-nopic.a for the mips architecture + (Closes: #329074) + * Deal with the fact that Debian's boot sequence bogusly doesn't set the + time correctly until very late in the boot process; so if the + superblock's last mount or write time is in the future, don't treat + this as a fatal error. (Closes: #343662, #343645) + * Move the blkid and uuidgen binaries out of libblkid1 and libuuid1 and + into the e2fsprogs package to support soname transitions and + simultaneous installs of multiarch flavors to coexist. (It's not worth + creating two whole new packages for two separate binaries, so we just + fold them into e2fsprogs.) (Closes: #330737, #330736) + * Optionally allow the user to interrupt e2fsck "safely" during a boot + sequence without causing the boot scripts to abort. (Closes: #150295) + * Update and clarify man pages (Closes: #312515) + + -- Theodore Y. Ts'o Sat, 31 Dec 2005 01:05:35 -0500 + +e2fsprogs (1.38+1.39-WIP-2005.12.10-1) unstable; urgency=low + + * Update and clarify man pages (Closes: #329859, #322188, #316811) + * Fix bug creating external journals on big-endian machines. + * Detect if the superblock's last mount time or last write time is in + the future, and offer to fix it if this is the case (Closes: #327580) + * Add new debugfs command, set_current_time which sets the time used to + update the filesystem's time fields. + * Fix display bug in badblocks -sw when printing the "done" message. + (Closes: #322231) + * Improve blkid's FAT/VFAT filesystem detection code so that it can find + labels stored the root directory and to be more correct/paranoid. + * Add support to extract iso9660 label information to the blkid library. + * Add support to detect the reiser4 filesystem to the blkid library. + * Add support for detecting software suspend partitions to the blkid library. + * Fix the blkid library to notice when an ext2 filesystem is upgraded to + ext3. + * Fix debugfs's set_inode_field so that successfully sets the i_size field + * Updated Dutch translation + * E2fsck will stop and print a warning if the user tries running a + read/write badblocks test on a read-only mounted root filesystem. + * Add resize2fs and badblocks to the e2fsprogs udeb + (Closes: #290429, #310950) + * Avoid trying to mount the root device if it is an NFS device. + (Closes: #310428) + + -- Theodore Y. Ts'o Sat, 10 Dec 2005 22:49:47 -0500 + +e2fsprogs (1.38-2) unstable; urgency=low + + * Previous NMU acknowledged (Closes: #317862, #320389) + * Fix debugfs's set_inode_fields command so it doesn't silently fail + when setting certain inode fields. + * Fix e2fsck from segfaulting on disconnected inodes that contain one or + more extended attributes. (Closes: #316736, #318463) + * Allow mke2fs and tune2fs to take fractional percentages to the -m + option in mke2fs and tune2fs. (Closes: #80205) + * Fix a compile_et bug which miscount the number of error messages if + continuations are used in the .et file, and fix compatibility problems + with MIT Kerberos 1.4 + * Add extra sanity checks to protect users from unusual circumstances + where /etc/mtab may not be sane, by checking to see if the device is + reported busy (works on Linux 2.6) kernels. (Closes: #319002) + * Fix use-after-free bug in e2fsck when finishing up the use of the + e2fsck context structure. + + -- Theodore Y. Ts'o Sun, 21 Aug 2005 23:35:29 -0400 + +e2fsprogs (1.38-1.1) unstable; urgency=low + + * NMU for RC bug during bug squishing party + * Fix for changes to texi2html, patch by Matt Kraai + (Closes: #317862, #320389) + * version build-depend on texi2html, won't work with older one anymore + + -- Blars Blarson Fri, 5 Aug 2005 04:46:54 +0000 + +e2fsprogs (1.38-1) unstable; urgency=low + + * New upstream version + * Fix ia64 core dump bug caused by e2fsprogs running afoul of C99 strict + type aliasing rules on newer gcc compilers. (Addresses Red Hat + Bugzilla ##161183.) + * Fix minor typo's in tune2fs man page. + * Mke2fs will refuse to create filesystems greater than 2**31-1 blocks, + unless forced, to avoid kernel bugs that still need to be fixed as + of this release. + * Update French, Dutch, Polish, Swedish, and Turkish translations. + + -- Theodore Y. Ts'o Wed, 30 Jun 2005 20:02:42 -0400 + +e2fsprogs (1.37+1.38-WIP-0620-1) unstable; urgency=low + + * Update and clarify man pages. + * Clarify and clean up e2fsck's problem descriptions + * Add Dutch translation, and update French, Polish, Swedish, and + Turkish translation. + * mke2fs and badblocks will check to see if the device appears to be + busy and abort if so; this feature only works on Linux 2.6 systems. + (Closes: #308594) + * Fix filefrag so that it works on 64-bit platforms where the size of + an integer != the size of a long. (Closes: #309655) + * Change the default journal size to be bigger for larger filesystems, + given modern memory sizes. + * Fix com_err library so it is compatible with MIT krb5 1.4. + + -- Theodore Y. Ts'o Mon, 20 Jun 2005 17:11:29 -0400 + +e2fsprogs (1.37+1.38-WIP-0509-1) unstable; urgency=low + + * Make the blkid library much more efficient when a new device is added + on systems with a huge number of disks. + * Fix handling of the PAGER and SS_READLINE_PATH environment variables + in the ss library, and the TEST_IO_* environment variables for the + test_io io_manager, which was accidentally broken in 1.37-1. + * Fix libblkid's recognition of cramfs filesystems, and add support for + cramfs labels. + * Fix filefrag to give correct results when the first block found is an + indirect block. (Closes: #307607) + * Fix debugfs seg fault when the stat command is given and a filesystem + is not open. + * Improve environment variable paranoia checks. + * Fix e2fsck's handling of multiply claimed blocks involving the resize + inode. + * When determining the libraries needed for the initrd, unset LD_PRELOAD + and LD_LIBRARY_PATH and filter out libraries found in + /etc/ld.so.preload. (Closes: #304003) + * Update Swedish translation, and added translation for Rwanda. + * Minor man page spelling/typo fixes. (Closes: #304591, #304592, + #304594, #304597, #304593) + + -- Theodore Y. Ts'o Mon, 9 May 2005 09:10:20 -0400 + +e2fsprogs (1.37-2) unstable; urgency=low + + * Fix filefrag so that it works non ext2/3 filesystems again. + (Closes: #303509) + * Make sure we include stdlib.h to fix a core dump bug in mke2fs on the + IA64 architecture (or other platforms where sizeof(ptr) > sizeof(int)) + (Closes: #302200) + * Add missing return values so that we don't return garbage in certain + error cases in ext2fs_write_new_inode() and ext2fs_read_int_block(). + * Fix minor spelling typo in the mke2fs man page + * Avoid doing the LOW_DTIME checks if the superblock last mount time + indicates that the system clock may not be set correctly. + * Add further paranoia checks to the blkid, ext2fs, and ss libraries to + make them safe to call from setuid or setgid applications. + + -- Theodore Y. Ts'o Sat, 9 Apr 2005 11:08:04 -0400 + +e2fsprogs (1.37-1) unstable; urgency=low + + * New upstream release. + * Fixed a bug in e2fsck so it would notice if a file with an extended + attribute block was exactly 2**32 blocks, such that i_blocks wrapped + to zero. + * Fixed a bug in filefrag which caused it to falsely report a + discontinuity when there are one or more unallocated blocks at the + beginning of a file. + * Fix the missing translations (caused by a bug in the gen-tarball + script). (Closes: #296769) + * Add support in e2fsck and debugfs for extended attributes in inodes. + * Fix the missing translations (caused by a bug in the gen-tarball script). + (Closes: #296769) + * Force compile_et and mk_cmds to use /usr/bin/awk so that we will work + on any Debian system regardless of which version of awk is installed. + (Closes: #299341) + + -- Theodore Y. Ts'o Thu, 21 Mar 2005 22:31:08 -0500 + +e2fsprogs (1.36release-1) unstable; urgency=low + + * New upstream release. + * Make filefrag print the first and last blocks when in verbose mode. + * Drop sparc assembly bitops; it's less efficient than gcc 3.4's + generated code, and it triggers compiler warnings on sparc 64. + (Closes: #232326) + + -- Theodore Y. Ts'o Fri, 4 Feb 2005 20:58:35 -0500 + +e2fsprogs (1.36rc5-1) unstable; urgency=low + + * Make blkid -t work more consistently even when the cache file is not + available or set to /dev/null. (Closes: #292425) + * Don't ever use a blocksize greater than 4k, since not all 2.6 kernels + will support this. + * Fix bug where mke2fs would not correctly create filesystems greater + than 4TB. + * Fix e2fsck so it won't delete symlinks that contain an extended + attribute after the ext_attr feature flag has been cleared. + * Fix e2fsck's resize inode handling in some additional corner cases. + + -- Theodore Y. Ts'o Thu, 27 Jan 2005 22:44:31 -0500 + +e2fsprogs (1.36rc4-1) unstable; urgency=low + + * Fix a bug in resize2fs where we don't release the blocks belonging to + the old inode table blocks when we move the inode table. + (Closes: #290894) + * Make sure that we don't write garbage when writing a large inode. + * Check NTFS ahead of other filesystems since Windows doesn't always + clearing enough of the partition to avoid false positives with older + filesystems. (Closes: #291990) + * E2fsck now checks the summary filesystem accounting information, and + if any of the information is obviously wrong, it will force a full + filesystem check. (Closes: #291571) + * Clarified and updated tune2fs and blkid man pages + * Fix e2fsck to not complain when the resize_inode feature is enabled, + s_reserved_gdt_blocks is zero, and there is no DIND block allocated in + the resize inode. + * Fix blkid -t to display all devices that match the specified criteria, + not just the first one. (Closes: #290530) + * Add support for the blkid library to recognize Oracle ASM volumes. + * Add set_super_value jnl_blocks[] in debugfs. + * Fix the filefrag program so that it works correctly with sparse files. + * Fix portability problems with FreeBSD, Solaris, and Intel C++ 8.1. + * Add support for FreeBSD and Lites as OS Creator values. + + -- Theodore Y. Ts'o Wed, 26 Jan 2005 10:22:02 -0500 + +e2fsprogs (1.36rc3-2) unstable; urgency=low + + * Remove debugging printf's from e2image's -s code. + + -- Theodore Y. Ts'o Wed, 19 Jan 2005 02:25:53 -0500 + +e2fsprogs (1.36rc3-1) unstable; urgency=low + + * New upstream release + * Update Italian, French, and Turkish translations + * Fixed file descriptor leak in the filefrag program + * Add -s option to e2image which scrambles directory entries when making + raw image files + * Make sure e2fsck doesn't crash if /proc/acpi/ac_adapter does not + exist + * Added Solaris, FreeBSD portability fixes + + -- Theodore Y. Ts'o Wed, 19 Jan 2005 00:33:31 -0500 + +e2fsprogs (1.36rc2-1) unstable; urgency=low + + * New upstream release + * Update Italian translation + * Add support for swap partition labels and uuid's + + -- Theodore Y. Ts'o Tue, 11 Jan 2005 14:12:17 -0500 + +e2fsprogs (1.36rc1-1) unstable; urgency=low + + * Fix a FTBFS bug for amd64/gcc-3.0 (Closes: #289133) + * Minor man page clarifications. (Closes: #273679) + * Add support for online resizing via the resize inode. + * Badblocks will now correctly display block numbers greater than + 999,999,999 in its progress display. + * tune2fs will not allow the user from setting a ridiculous number of + reserved blocks which would cause e2fsck to assume the superblock + was corrupt. E2fsck's standards for what is a ridiculous number + of reserved blocks has also been relaxed to 50% of the blocks in + the filesystem. + * The blkid library will return vfat in preference to msdos, and ext3 in + preference to ext2 (if the journalling flag is set) so that mount + will do the right thing. (Closes: #287455) + * The fsck program will now accept an optional filedescriptor argument + to the -C option. + * Mke2fs will now use the -E option for extended options; the old -R + (raid options) option is still accepted for backwards compatibility. + * Fix a double-free problem in resize2fs. (Red Hat Bugzilla #132707) + * Mke2fs will now accept a size in megabytes or gigabytes (via "32m" or + "4g" on the command line) if the user finds this more convenient + than specifying a block count. + * Fix an obscure, hard-to find bug in "e2fsck -S" caused by an inode + cache coherency problem. + * Debugfs now supports a new command, set_inode_field, which allows a + user to manually set a specific inode field more conveniently, as + well as set entries in the indirect block map. + * Debugfs's set_super_value command has been enhanced so that the user + can set most superblock fields, including the date/time fields and + some of the more newly added superblock fields. + * E2fsprogs programs now accept an offset to be passed to the file + specifiers, via the syntax: "/tmp/test.img?offset=1024" + * E2fsprogs will now accept blocksizes up to 65536; kernel support on + the x86 doesn't exist, but it is useful on other architectures. + * Fix bug in debugfs where kill_file would lead to errors when deleting + devices and symlinks. (Sourceforge Bugs #954741 and #957244) + * Fix bug in the blkid library when detecting the ocfs1 filesystem + * Updated Italian translation file + * E2fsck will now recover from a journal containing illegal blocks. + + -- Theodore Y. Ts'o Fri, 7 Jan 2005 20:22:36 -0500 + +e2fsprogs (1.35-9) unstable; urgency=low + + * Minor man page clarifications. (Closes: #273679) + + -- Theodore Y. Ts'o Tue, 28 Sep 2004 10:29:29 -0400 + +e2fsprogs (1.35-8) unstable; urgency=low + + * Remove double "//" when listing attributes in the root directory or + when there is a trailing '/' in the directory name. (Closes: #272943) + * Make sure the configure files are newer than configure.in the + debian/rules file so that a dpkg-source created patch won't + trigger an attempt rebuild of the configure script. + (Closes: #272558, #273242) + * Make sure /usr/lib/e2initrd_helper is in the e2fsprogs package. + (Closes: #272698, #272728, #273161, #273163) + * Only use blocksizes > 4k on Linux 2.6 and newer systems. (Closes: #271064) + + -- Theodore Y. Ts'o Sat, 25 Sep 2004 07:37:52 -0400 + +e2fsprogs (1.35-7) unstable; urgency=low + + * Make sure "done" gets correctly translated in badblocks(8), and update + French translation (Closes: #252836) + * Always build the fsck wrapper on Debian systems (Closes: #248050) + * Filter out linux-gate.so, which is a pseudo entry for the 32->64bit + translation for amd64 systems, in the initrd creation script. + (Closes: #253595) + * Change the initrd scripts to be use a helper program which avoids + needing to mount the root filesystem and use awk to query the + /etc/fstab file. (Closes: #247775) + * Add support for the ocfs2 filesystem to the blkid library. + * Various portability fixes for Hurd and FreeBsd, as well as + removing XSI:isms. (Closes: #256669, #264630, #269044, #255589) + * Update config.guess and config.sub from the FSF. + * Minor manual page clarifications (Closes: #268148) + * Fix write ordering problems to make e2fsck more robust in the face + of system crashes while replaying the journal, etc. + * Fix debugging printf in resize2fs. (Closes: #271605) + * Add debugfs -d option to use a separate source of data blocks when + reading from an e2image file. + * Add e2image -I option which allows the e2image metadata to be + installed into a filesystem. + * Change e2fsck to accept directories greater than 32MB. + * Add test_io mechanisms to abort after reading or writing to a + particular block. + * Fix blkid file descriptor and memory leak. + + -- Theodore Y. Ts'o Sat, 18 Sep 2004 09:58:46 -0400 + +e2fsprogs (1.35-6) unstable; urgency=low + + * In the mkinitrd script, make sure the directories exist before + trying to copy in the needed shared libraries. (Closes: #244058, #246480) + * In the mkinitrd script, use LD_ASSUME_KERNEL=2.4 if necessary. + (Closes: #245931) + * In the mkinitrd script copy in /usr/bin/awk instead of /usr/bin/mawk. + (Closes: #245670) + * In the initrd script, fail quietly if /mnt/etc/fstab does not exist. + (Closes: #246917) + * Minor updates to German translation (Closes: #244105) + * Since woody's sysvinit package is before the initscripts were broken out + we need an explict Conflict: sysvinit (<< 2.85-4) header. (Closes: #243829) + * Update the UUID library man pages + * Fix a Y8.8888K potential problem with the uuid library + * Minor updates to the German translation + * Clarified/corrected the copyright statements of the UUID and blkid + libraries in the Debian copyright files. + * Added sanity check to the blkid library so that if current time is + less than last time a device is verified, force a reverification since + it means the system time is not trustworthy. + + -- Theodore Y. Ts'o Tue, 4 May 2004 16:23:06 -0400 + +e2fsprogs (1.35-5) unstable; urgency=low + + * Add uuid_unparse_upper() and uuid_unparse_lower() functions to the + uuid library. + * Address GNU/KFreeBSD portability issues (Closes: #239934) + * Use unsigned for 1 bit wide bitfields in header files to avoid + Intel C++ compiler warnings. + * Use C99 stdint.h types in the uuid library + * Fix up and cleanup uuid man pages + * Change the licensing of the uuid man pages to be 3-clause BSD. + * Fix the initrd scripts so that the automatic ext3 journal + conversion actually works correctly; also allow conversion of the root + filesystem from ext3 back to ext2 (Closes: #241183) + * Minor man page fixes (Closes: #241940, 242995) + * Use the DEBUGFS_PAGER environment variable in preference to PAGER + (Closes: #239547) + * Added French translation + * Be flexible about the name of the ACPI device that corresponds to + the AC adapter (Closes: #242136) + + -- Theodore Y. Ts'o Mon, 12 Apr 2004 12:38:34 -0400 + +e2fsprogs (1.35-4) unstable; urgency=low + + * Fix bug in the blkid library (introduced in 1.35-3) which caused + the probe function to completely malfunction. (Closes: #239191) + * Make the debugfs command's link command set the filetype information + correctly. + * Update the Polish, Swedish, and Turkish translations + * Add an -o option to the blkid program which allows the user to + control the output format of blkid. + * Fixed and cleaned up the tune2fs and blkid man pages (Closes: #238741) + * Improve UUID generation algorithm (use all 14 bits in the clock sequence) + * Change the license on the UUID library to be 3-clause BSD. + * Remove the only-partially-implemented -p option to blkid. + + -- Theodore Y. Ts'o Sun, 21 Mar 2004 20:17:03 -0500 + +e2fsprogs (1.35-3) unstable; urgency=low + + * Mention e2image's limitation in writing a normal image file to + stdout (Closes: #236383) + * Only use BLKGETSIZE64 on Linux 2.6 since it is unreliable on Linux 2.4. + (Closes: #236528) + + -- Theodore Y. Ts'o Mon, 8 Mar 2004 14:19:15 -0500 + +e2fsprogs (1.35-2) unstable; urgency=low + + * Use 64-bit ioctl's if present to determine the 64-bit size of a device + * Add tune2fs to the e2fsprogs udeb package (Closes: #235639) + + -- Theodore Y. Ts'o Tue, 2 Mar 2004 10:13:39 -0500 + +e2fsprogs (1.35-1) unstable; urgency=low + + * New upstream version. + * Fix "badblocks -t random". (Closes: #234828) + * Fix "e2fsck -k". (Closes: #234993) + * Change badblock's default number of blocks tested at once from + 16 to 64. (Closes: #232240) + * ss-dev and comerr-dev now use a versioned dependency for libss2 and + libcomerr2, respectively. (Closes: #235280) + + -- Theodore Y. Ts'o Sat, 28 Feb 2004 10:14:19 -0500 + +e2fsprogs (1.34+1.35-WIP-2004.01.31-2) unstable; urgency=low + + * Add a new -k option to e2fsck which keeps the existing badblocks + list when using the -c option. (Closes: #229103) + * Update debugfs to support new large major/minor device numbers + supported by Linux 2.6. (Closes: #865289) + * Fix makefiles so that it will build correctly with --enable-profile. + * Add -mieee when compiling with GCC on an Alpha. + * Fix e2fsck preen mode messages using pass 1B/C/D. + * Fix the debugfs man page. (Closes: #232406) + * Fix the ext2fs.h header file to work correctly with C++. + * e2fsck and debugfs now correctly deals with symlinks that have + extended attribute information, such as those created by SE Linux. + (Closes: #232328) + * Make sure filefrag actually gets compiled under Linux (Closes: #230992) + + -- Theodore Y. Ts'o Tue, 24 Feb 2004 00:16:43 -0500 + +e2fsprogs (1.34+1.35-WIP-2004.01.31-1) unstable; urgency=medium + + * Fix byte swap bugs in e2fsck that caused the journal backup location + in the superblock and symlinks created by SE Linux to be cleared + by e2fsck on big-endian machines. (Closes: #228723) + * Chattr now stops processing options when it sees '--'. (Closes: #225188) + * Add FreeBSD port fixups + * Use the DEBUGFS_PAGER environment variable in preference to PAGER. + Document that less is a really, really, really bad pager to use + for debugfs (unfortunately, Debian policy says we must use + /usr/bin/pager even if it results in very annoying behaviour for + the user since 'less' is used in preference to 'more' unless it is + globally overridden via update-alternatives(8). Oh, well. Debian + users are encouraged to set DEBUGFS_PAGER to be "more" in their + dot files to avoid this brain damage). + * Fix libuuid1-udeb so that it provides libuuid1. (Closes: #229633) + * Fix bug in uuid library when there is no network card and the + library is generating a time-based uuid. The random MAC address + was not correctly generated to be a multicast address. + * Install the filefrag program. + * Don't try to compile filefrag on non-Linux platforms. (Closes: #226456) + * Minor manual page clarifications (Closes: #222606, #214920) + + -- Theodore Y. Ts'o Sat, 31 Jan 2004 20:57:35 -0500 + +e2fsprogs (1.34+1.35-WIP-2003.12.07-2) unstable; urgency=low + + * Fix test for /etc/mkinitrd/scripts/e2fsprogs to make sure it gets + removed. (Closes: #213275) + * Debugfs now searches for the appropriate pager to use, beginning + with /usr/bin/pager, and then falling back to 'less' and 'more'. + (Closes: #221977) + * Fixed mangled encoding in Czech locale file. (Closes: #214633) + * Fix bug where using debugfs to copy a file from /dev/null caused + in correct mode bits. (Closes: #217456) + * Fixed a bug where e2fsck would bomb out if a journal needed to be + replayed when using an alternate superblock. + * Minor manual page fixups/cleanups. + * Debugfs's mkdir command will automatically expand the directory if + necessary. (Closes: #217892) + * Fix a bug in e2fsck which caused it to incorrectly fix a filesystem + when reconnecting a directory requires creating a lost+found + directory. (Closes: #219640) + * Add Spanish translation. + + -- Theodore Y. Ts'o Wed, 24 Dec 2003 14:24:14 -0500 + +e2fsprogs (1.34+1.35-WIP-2003.12.07-1) unstable; urgency=medium + + * Added regression tests for mke2fs and dumpe2fs. + * Support 2.6 kernel header files. (Closes: #221778) + * Fix bug which could a core dump if a non-existent LABEL or UUID + specifier is passed to e2fsck or tune2fs. + * Fix handling of corrupted indirect blocks in the bad block inode. + * If the number of mounts until the next forced filesystem check is less + than 6, mention this to the user. (Closes: #157194) + * E2fsck will try to avoid doing a forced filesystem check if a system + is running on batteries according to APM or ACPI. (Closes: #205177) + * Fix problems in the German translation. (Closes: #2000086) + * Updated Swedish translation and added Polish translation. + * Fix signed vs unsigned bug which could cause the com_right function to + seg fault. (Closes: #213450) + * Add libuuid1-udeb (Closes: #221777) + + -- Theodore Y. Ts'o Sat, 22 Nov 2003 11:51:13 -0500 + +e2fsprogs (1.34+1.35-WIP-2003.08.21-3) unstable; urgency=low + + * Adjust the man page descriptions so that "apropos ext2" or + "apropos ext3" will find all of the e2fsprogs man pages. + (Closes: #206845) + * Protect against a potential core dump in e2fsck when printing a + message about a backup superblock. + * Fix a bug in mke2fs which caused -T largefile or -T largefile4 to + core dump due to a division by zero error. (Closes: #207082) + * Force e2fsprogs to use the matched version of e2fslibs. (Closes: #208103) + + -- Theodore Y. Ts'o Sun, 31 Aug 2003 21:49:52 -0400 + +e2fsprogs (1.34+1.35-WIP-2003.08.21-2) unstable; urgency=low + + * When moving the journal or backing up the journal inode + information, make sure e2fsck updates all the superblocks, and not + just the master superblock. + * Change the priority of libblkid1-udeb to be required instead of + standard, to match the override file. + + -- Theodore Y. Ts'o Thu, 21 Aug 2003 08:50:34 -0400 + +e2fsprogs (1.34+1.35-WIP-2003.08.21-1) unstable; urgency=low + + * Fix compile_et to output the correct prototype for + initialize_xxx_err_table_r() in the header file. (Closes: #204332) + * E2fsck will avoid printing ^A and ^B characters bracketing the + progress bar when stdout is a tty device. (Closes: #204137) + * Add support for storing the journal inode location in the superblock + so that e2fsck can recover from a corrupted inode table after a power + failure. + * Move the initrd script from /etc/mkinitrd/scripts to + /usr/share/initrd-tools/scripts so that mkinitrd will not remove + the file when it is uninstalled. (Closes: #204019) + * Remove unneeded files in debian directory: blkid-dev.substvars and + e2fsprogs-bf.lintian-overrides. (Closes: #203914) + * Support "noopt" in DEB_BUILD_OPTIONS instead of "debug". + (Closes: #203914) + + -- Theodore Y. Ts'o Thu, 21 Aug 2003 01:47:58 -0400 + +e2fsprogs (1.34+1.35-WIP-2003.08.01-1) unstable; urgency=low + + * Fix O_DIRECT test to prevent badblocks from screwing up after + finding a bad block. (Closes: #203713) + * Add Heimdal compile_et extensions from Philipp Thomas (pthomas@suse.de) + * Fix potential pointer aliasing bugs caused by type-punning and gcc 3.x + + -- Theodore Y. Ts'o Fri, 1 Aug 2003 13:44:58 -0400 + +e2fsprogs (1.34-2) unstable; urgency=low + + * Fix erroneous reference to /usr/share/doc/e2fsprogs/html-info in + /usr/share/doc-base/libext2fs (Closes: #203157) + * Explicitly specify the version of libblkid1 needed in + e2fsprogs.shlibs.local in order to avoid picking up the wrong dependency. + (Closes: #203157) + * Changed priority of libblkid1-udeb to be standard, not required. + + -- Theodore Y. Ts'o Wed, 30 Jul 2003 19:47:32 -0400 + +e2fsprogs (1.34-1.1) unstable; urgency=low + + * Non-maintainer upload. + * don't call ldconfig in udebs. + * fix dependencies of e2fsprogs-udeb. + + -- Bastian Blank Tue, 29 Jul 2003 12:11:54 +0200 + +e2fsprogs (1.34-1) unstable; urgency=low + + * New upstream version. + * Fixed bug in fsck which caused it to waste CPU by spinning while + waiting for a child fsck process under some circumstances. + * Fixed bug in blkid library which would cause it to spin forever if + /proc is not mounted and /etc/blkid.tab is not present. + * Improved the blkid library's UDF's probing functions. + * Fixed the blkid library so it will remove delete the LABEL + attribute from its cache when a filesystem that previously had a + label no longer has one. + * Added Swedish translation. + * Remove debugging printf in badblocks program (Closes: #201499) + * Split shared libraries out of the e2fsprogs package into separate + packages: libss2, libcomerr2, libuuid1, and e2fslibs. (Closes: #201155, + #201164) + * Warn the user when creating a filesystem with a journal and a blocksize + greater than 4096, since some kernels don't support ext3 with large + block sizes. (Closes: #193773) + + -- Theodore Y. Ts'o Sat, 26 Jul 2003 01:01:55 -0400 + +e2fsprogs (1.33+1.34-WIP-2003.05.21-2) unstable; urgency=low + + * Set up FreeBSD configuration defaults (Closes: #195274) + * Clarify resize2fs man page (Closes: #195616) + * Fix resize2fs to deal with filesystem with bad blocks + * Fix spelling error in e2fsck + * Add workaround for intl library on Darwin + * Fix gcc -Wall nitpicks + * Round down the default size of the filesystem for mke2fs and + resize2fs to be a multiple of the pagesize to work around a potential + Linux kernel bug + * Fix bug in mke2fs where it could die with a floating exception if + the device does not support the BLKSSZGET ioctl (Closes: #196734) + * Add conflicts against older versions of sysvinit that don't correctly + handle an exit code that has the bit #2 set. (Closes: #183675) + * Badblocks will attempt to use O_DIRECT if it is safe to do so. + (Closes: #198006) + * Use symbolic links for fsck.ext{2,3} and mkfs.ext{2,3} in the udeb + package since busybox tar can't deal with hard links. (Closes: #196508) + + -- Theodore Y. Ts'o Sat, 12 Jul 2003 03:16:08 -0400 + +e2fsprogs (1.33+1.34-WIP-2003.05.21-1) unstable; urgency=low + + * Fix problems with compiling e2fsprogs with NLS support on woody + (Closes: #193372) + * Remove the extraneous de-utf.po file. + * Add get-text to build-depends. + * Use ngettext (abbreviated with P_()) to simplify the statistics reporting. + * Fix badblocks to be able to support arbitrary 4 byte test patterns. + * Fix bug which caused us to accidentally include the EVMS plugin in + the e2fsprogs package (which doesn't work, but causes confusing messages + to show up when the evms client is started). + * If the hardware sector size of a device is larger than the default + blocksize, use the hardware sector size as the blocksize when creating + a filesystem, to solve problems with s/390 DASD's. + * Add a shared library dependency to libuuid to libblkid (Closes: #194094) + * Add initial implementation of a dump_unused command (Closes: #79164) + + -- Theodore Y. Ts'o Sun, 18 May 2003 01:24:16 -0400 + +e2fsprogs (1.33-5) unstable; urgency=low + + * Clarify blocksize units when displaying messages in resize2fs, and + support using suffixes (sectors, kilobytes, megabytes, gigabytes) + to the size parameter to indicate units. (Closes: #189814) + * Fix debugfs core-dumping problem caused by getopt. (Works around: #192834) + * Add package dependency to shlibs for comerr to indicate support + for kth compatibility. (Closes: #193096) + + -- Theodore Y. Ts'o Tue, 13 May 2003 23:45:08 -0400 + +e2fsprogs (1.33-4) unstable; urgency=low + + * Add replaces field to comerr-dev to resolve a file conflict with + /usr/include/com_err.h and the libkrb5-dev package. (Closes: #192277) + * Add -t option to badblocks to control the test pattern used. + * Remove e2fsprogs-bf package, as it is obsolete. (Closes: #183453) + * Remove NLS support from e2fsprogs-udeb. Save 5.5k on the boot + floppies / install media. + + -- Theodore Y. Ts'o Thu, 8 May 2003 10:25:05 -0400 + +e2fsprogs (1.33-3) unstable; urgency=low + + * Add full Heimdall/Kerberos4-kth compatibility to com_err routines. + * Declare comerr-dev as replacing << e2fslibs-dev 1.33-2, to avoid + errors when upgrading to the new versions of comerr-dev and + e2fslibs-dev + + -- Theodore Y. Ts'o Tue, 6 May 2003 00:29:47 -0400 + +e2fsprogs (1.33-2) unstable; urgency=low + + * Fix up NLS support + - Fix message abbreviations support (i.e., @g --> group) + - Update to gettext 0.11.5 + - Add Czech translation + - Install message catalogs + - Other miscellaneous NLS bug fixes + * Add new debugfs command, imap, which prints the location of a + specified inode in the inode table. + * Put /usr/include/com_err.h in comerr-dev instead of e2fslibs-dev. + (Closes: #191899) + * Add support for OV-style continuations in compile_et. (Closes: #191900) + + -- Theodore Y. Ts'o Mon, 5 May 2003 18:13:12 -0400 + +e2fsprogs (1.33-1) unstable; urgency=low + + * New upstream version (Closes: #189687) + + -- Theodore Y. Ts'o Mon, 21 Apr 2003 13:49:52 -0400 + +e2fsprogs (1.32+1.33-WIP-2003.04.14-1) unstable; urgency=low + + * New upstream version + - Add new utility program, logsave, to capture the output of fsck + during the boot sequence + * Add support for the -a and -s options to logsave. + * Change e2fsck to bracket its progress bar output with ctrl-A and ctrl-B + characters, so that logsave -s can omit writing the progress bar output + to the log file. + * Avoid printing the version banner for mke2fs if the -q option is + specified. (Closes: #172716) + + -- Theodore Y. Ts'o Wed, 16 Apr 2003 15:27:20 -0400 + +e2fsprogs (1.32+1.33-WIP-2003.03.30-3) unstable; urgency=low + + * Provide /usr/include/com_err.h, which was previously provided by the + libkrb5-dev package + * Change the section of com_err-dev, ss-dev, uuid-dev, libblkid-dev, + e2fslibs-dev to libdevel + * Add libblkid1-udeb package for the Debian Installer. + * Use the SS_READLINE_PATH environment variable to control the search + for a suitable readline library. + * Fix bug in mke2fs, which was was incorrectly checking the argument + to the -g option if the default block size is used. (Closes: #188319) + * Update man pages. (Closes: #188318) + * Mke2fs can be given a minimum block size by passing in a negative + number to the -b option. + * Update to standards 3.5.9 + + -- Theodore Y. Ts'o Sat, 12 Apr 2003 02:52:17 -0400 + +e2fsprogs (1.32+1.33-WIP-2003.03.30-2) unstable; urgency=low + + * Fix XFS superblock definition. Add support to extract UUID and + labels for JFS and ROMFS. + * Make the random number generator more paranoid about potentially buggy + /dev/random devices. + * The badblocks program now flushes its output as it discovers bad blocks. + * Imported bug fixes to EVMS driver from the EVMS 2.0 tree. Fixed a + few potential hangs, and eliminated a file descriptor leak. + * E2fsck now updates the global free block and inode counters from + the block group specific counters quietly. This is needed for an + experimental kernel patch which improves SMP scalability by not + locking the entire filesystem during block or inode allocation; if + the filesystem is not unmounted cleanly, the global counts may not + be accurate. + * Fix a bug in fsck which can cause it to hang trying to access the + floppy disk if there the floppy drive has filesystem type of + 'auto'. (Closes: #187812) + + -- Theodore Y. Ts'o Sun, 6 Apr 2003 23:13:50 -0400 + +e2fsprogs (1.32+1.33-WIP-2003.03.30-1) unstable; urgency=low + + * Change compile_et to generate header files that use + instead of , so the current version of the header file + is used. Remove legacy K&R, varargs, and pre-POSIX signal support. + * Fix (one more time!) Apple Darwin port in blkid/getsize.c + + -- Theodore Y. Ts'o Sun, 30 Mar 2003 23:34:55 -0500 + +e2fsprogs (1.32+1.33-WIP-2003.03.25-1) unstable; urgency=low + + * New maintainer + * New upstream release (Closes: #176814, #174766, #166048, #179671, + #173612, #175233, #175113, #170497, #185945) + + -- Theodore Y. Ts'o Sun, 16 Mar 2003 18:05:08 -0500 + +e2fsprogs (1.32-2) unstable; urgency=high + + * Applied upstream patch to fix htree problems, and to deactivate it by + default in mke2fs (Closes: #181615, #179043) + * Be sure removal of libe2fsim doesn't fail, as it's not built on hurd + (Closes: #164117). + + -- Yann Dirson Fri, 21 Feb 2003 00:21:44 +0100 + +e2fsprogs (1.32-1) unstable; urgency=low + + * New upstream release (Closes: #167108). + + -- Yann Dirson Tue, 19 Nov 2002 00:18:09 +0100 + +e2fsprogs (1.29+1.30-WIP-0930-2) unstable; urgency=low + + * Made mkinitrd script to skip commented-out lines (Closes: #163251). + + -- Yann Dirson Tue, 15 Oct 2002 00:16:08 +0200 + +e2fsprogs (1.29+1.30-WIP-0930-1) unstable; urgency=low + + * New upstream prerelease. + * Replaced in mkinitrd script "tune2fs -j" with "tune2fs -O + has_journal", as suggested by Theodore Ts'o (Closes: #162949). + * Remove --disable-debugfs from mips-nopic flags (Closes: #162674). + + -- Yann Dirson Thu, 3 Oct 2002 00:05:36 +0200 + +e2fsprogs (1.29-1) unstable; urgency=low + + * New upstream release (Closes: #159423). + * Fixed typo in chattr manpage (Philipp Matthias Hahn, Closes: + #162297). + * Generate udeb package for debian-installer (Martin Sjoegren, Closes: + #162212). + * Fixed installation of mkinitrd script (don't use dh_install). Remove + it from the wrong location where it was, in preinst. Hopefully no one + noticed. + * Also have old scripts/e2fsprogs.mkinitrd removed. + * Bumped Standards-Version to 3.5.6, no change. 3.5.7 will need a bit + of work but not tonight. + + -- Yann Dirson Thu, 26 Sep 2002 01:46:25 +0200 + +e2fsprogs (1.28-5) unstable; urgency=low + + * The "this time it will work ! (famous last words)" release. + * Now that it builds, ensure the dir in which we install this damn mips + non-pic lib exists. + + -- Yann Dirson Tue, 17 Sep 2002 00:04:49 +0200 + +e2fsprogs (1.28-4) unstable; urgency=low + + * Moved setting of CFLAGS to the correct place when building the special + mips non-pic lib (Closes: #159757 again). + + -- Yann Dirson Sun, 15 Sep 2002 21:19:19 +0200 + +e2fsprogs (1.28-3) unstable; urgency=low + + * Don't use special cflags at configure time when building the special + mips non-pic lib, in yet another attempt to fix my adaptation of the + patch from the mips team. Also added --disable-nls which was present + in the original patch. + * Remove debian/BUILD-MIPS on clean. + * Install mkinitrd script as scripts/e2fsprogs, not as + scripts/e2fsprogs.mkinitrd. + + -- Yann Dirson Mon, 9 Sep 2002 23:01:31 +0200 + +e2fsprogs (1.28-2) unstable; urgency=low + + * Fixed my adaption of the mips non-pic build (Closes: #159757). + + -- Yann Dirson Fri, 6 Sep 2002 00:03:45 +0200 + +e2fsprogs (1.28-1) unstable; urgency=low + + * New upstream release. + + -- Yann Dirson Mon, 2 Sep 2002 23:34:55 +0200 + +e2fsprogs (1.27+1.28-WIP-0817-1) unstable; urgency=low + + * New upstream pre-release. Closes: #138003, #144621, #145044, #151990, + #152029, #152891, #155007, #131350, #147256, #153102. + * New binary: findfs. + * Added execute permissions to the mkinitrd script (thanks lintian). + * Don't ship FSIM for EVMS for now. + + -- Yann Dirson Sun, 25 Aug 2002 19:32:12 +0200 + +e2fsprogs (1.27+1.28-WIP-0626-2) experimental; urgency=low + + * Remove bogus shlibs deps on "e2fsprogs (>= )" + + -- Theodore Y. Ts'o Sat, 17 Aug 2002 17:59:17 -0400 + +e2fsprogs (1.27+1.28-WIP-0626-1) experimental; urgency=low + + * New upstream pre-release: + ** Supports v2 ACL format (Closes: #138160). + * Removed explicit --mandir flag, as it now uses FHS man location by + default. + * Added mkinitrd script, "upstream-contributed" ;) by Ted Ts'o (Closes: + #148064). + * Build a no-pic version of libext2fs.a on mips and mipsel, patch by + Florian Lohoff, adapted for style consistency (Closes: #145432). + * Removed presumably-useless and presumably-broken CFLAGS propagation. + If someone misses that, I'll add ${CFLAGS} to --ccopts. + + * Switched to debhelper v4. + * Added ${misc:Depends} to all packages' Depends field. + + * Fixed typos in fsck.8, added an example for clarity (Closes: + #145044). + * Fixed typo in chattr manpage (Closes: #141938). + * Fixed typo in tune2fs manpage (Closes: #148514). + + -- Yann Dirson Tue, 23 Jul 2002 00:12:33 +0200 + +e2fsprogs (1.27-2) unstable; urgency=medium + + * Urgency medium since this fixes a RC bug. + * Generate the shlibs file instead of just copying it in place, and make + it produce deps on "e2fsprogs (>= )" as well, to cope with + new functions introduced in the libs (Closes: #139274). + * Added a note on this in README.Debian. + + -- Yann Dirson Thu, 21 Mar 2002 23:58:48 +0100 + +e2fsprogs (1.27-1) unstable; urgency=low + + * New upstream release (Closes: #136737). + * No more use for dh_link'ing *.ext[23], it's now done by upstream + Makefiles. + * Only include (new) inode_io.o from libext2fs when fileio.o is, or the + BF build fails because of this additional (unused) member (upstream + hint). + + -- Yann Dirson Mon, 11 Mar 2002 00:17:32 +0100 + +e2fsprogs (1.26-3) unstable; urgency=low + + * Simple rebuild after fixing the settings of my computer's clock, so + that katie accepts to install the package. + + -- Yann Dirson Sat, 23 Feb 2002 14:53:15 +0100 + +e2fsprogs (1.26-2) unstable; urgency=low + + * Applied upstream patch dealing with the rlimit filesize variation + among archs and kernel versions (Closes: #133909). + * Create fsck.ext3.8 symlink (Closes: #121526). + + -- Yann Dirson Sat, 23 Feb 2002 06:44:02 +0100 + +e2fsprogs (1.26-1) unstable; urgency=low + + * This uploads fixes 10 bugs, including data-corruption problems, and + adds much to the ease of maintenance and problem tracking. Good + choice for woody. + + * New upstream release (Closes: #106622, #116975, #118443, #119624, + #120171, #120077, #129828, #132764). + ** Fixes for data-corruption bugs not reported to the BTS: e2fsck + trashed external journals needing to be replayed, e2fsck now hides + visible journal files (data corruption problems when not excluded from + a backup and then restored) (Closes: #132654). + ** Other noticeable bugs fixed include: e2fsck null pointer + dereferencing, fsck did not finds LVM volumes by UUID or by label, + largefile support (ie. dealing with filesystems inside 2GB+ files) was + broken in several programs. + * Switch to debhelper v3 to get ldconfig automatically handled + (lintian reported that it was broken). Now call dh_makeshlibs, but + still override its generated shlibs file with ours, to get compiled + packages depend of the correct virtual packages, which include + full sonames. + * Removed call do dh_installman (Closes: #115526). + * Cleaned up maintainer scripts with dead code - most things are now + more properly handled by debhelper. Removed an "exit 0" lurking in + preinst - can't find a reason for it in the changelog, it was probably + here for ages. + * Remove obsolete maint-scripts in binary-arch, as they are provided by + upstream. + * Also remove upstream-shipped config.cache before configuring. That + shouldn't impact us, but well, that makes lintian happy :) + + -- Yann Dirson Fri, 8 Feb 2002 06:12:35 +0100 + +e2fsprogs (1.25-1) unstable; urgency=high + + * New upstream bugfix release (Closes: #112414), targeted to woody. + * com_err.info provided again now that it was fixed upstream. + * Added metainfo to com_err.texinfo so that it gets indexed correctly + (thanks lintian). Moved @setfilename and @settitle to the top so that + things get output as expected. + * Added lintian overrides for -bf and -static packages. + * Put all stamp files in debian/stampdir. + + -- Yann Dirson Sat, 22 Sep 2001 16:22:47 +0200 + +e2fsprogs (1.24a-1) unstable; urgency=high + + * New upstream release (Closes: #109577). + ** The only new code in there is in codepaths that + are only visited when previously unsupported features are used, so + they add virtually no risk. Support for raw image files will be of + great help to debug users' problems. Urgency set to "high" to make + sure this version gets released with woody. + + ** Fsck prints a warning message if now valid filesystems are passed to + it. (Closes: #107458). + ** Fsck -A will not try to interpret device names for filesystems which + have a pass number is 0. (Closes: #106696). + ** If -O none is passed to mke2fs, it will now not set the sparse_super + feature (Closes: #108165). + ** Tune2fs has been fixed to make sure that only error messages go to + stderr, and normal message go to stdout (Closes: #108555). + ** Minor man pages updates (Closes: #30833, #108174). + ** Doc fixes (Closes: #110621). + + -- Yann Dirson Tue, 4 Sep 2001 23:44:56 +0200 + +e2fsprogs (1.22-2) unstable; urgency=medium + + * This is only a trivial patch to stop some user confusion, and would be + great to have in woody, hence the urgency. + * Applied upstream patch to e2fsck to warn user when some errors were + not corrected due to user answering "no" (Closes: #104502). + + -- Yann Dirson Sat, 28 Jul 2001 23:01:49 +0200 + +e2fsprogs (1.22-1) unstable; urgency=low + + * Final 1.22 release: + ** Fixes build problems on big-endian (Closes: #101686, #101798). + + -- Yann Dirson Sat, 23 Jun 2001 14:03:17 +0200 + +e2fsprogs (1.21+1.22-WIP-0620-1) unstable; urgency=low + + * New upstream pre-release, critical for big-endian platforms + (Closes: #101752). + * Re-applied hurd fix again. + * Build e2fsprogs-bf with -Os to gain more space. + + -- Yann Dirson Fri, 22 Jun 2001 00:18:40 +0200 + +e2fsprogs (1.21-1) unstable; urgency=low + + * Final 1.21 release. + * Re-applied hurd fix that did not came quickly enough to make it in + 1.21. + * Fixed name of copyright file in e2fsprogs-bf. + + -- Yann Dirson Wed, 20 Jun 2001 22:32:08 +0200 + +e2fsprogs (1.20+1.21-WIP-0614-2) unstable; urgency=low + + * Don't build PIC libs, build a reduced version of the libs instead, in + package e2fsprogs-bf. Made this new package conflict with e2fsprogs. + * Compilation fix for the Hurd (Closes: #101361). + + -- Yann Dirson Tue, 19 Jun 2001 23:33:25 +0200 + +e2fsprogs (1.20+1.21-WIP-0614-1) unstable; urgency=low + + * New upstream pre-release (Closes: #100559, #100304). + * Fixed lib/ext2fs/Makefile.in for installation of new generated .h + file. + + -- Yann Dirson Thu, 14 Jun 2001 16:14:11 +0200 + +e2fsprogs (1.20+1.21-WIP-0608-1) unstable; urgency=low + + * New upstream pre-release (critical ext3 bugfix mostly). + * Correctly use dh_installinfo. + * Adjusted various things accordingly. + + -- Yann Dirson Sat, 9 Jun 2001 00:25:51 +0200 + +e2fsprogs (1.20-4) unstable; urgency=low + + * Cleanup generated substvars files now that debhelper uses other + names (may cause problems on other archs). Build-dep on debhelper + 3.0.30 or newer to be sure it won't cause broken uploads. Allows to + get rid of hairy dep, but cannot build straightforwardly on potato any + more... + + -- Yann Dirson Wed, 6 Jun 2001 02:33:32 +0200 + +e2fsprogs (1.20-3) unstable; urgency=low + + * Create all symlinks to uuid-generate.3 (Closes: #99573). + * Somewhat modernized debian/rules (debhelper v2, etc.). + * Fixed libss2 copyright file. + * Fixed e2fslibs-pic short description. + + -- Yann Dirson Wed, 6 Jun 2001 01:19:19 +0200 + +e2fsprogs (1.20-2) unstable; urgency=low + + * Added support for building pic libs to Makefile.elf-lib. + * New package e2fslibs-pic for boot-floppies team (Closes: #99285). + * Use -N on dh_gencontrol instead of lots of -p. + + -- Yann Dirson Thu, 31 May 2001 23:59:51 +0200 + +e2fsprogs (1.20-1) unstable; urgency=low + + * Final 1.20 release. + * Added new zsh-static to the list of possible static shells recommended + by e2fsck-static. + + -- Yann Dirson Mon, 28 May 2001 21:39:06 +0200 + +e2fsprogs (1.19+1.20-WIP-0520-1) unstable; urgency=low + + * New upstream pre-release snapshot: + ** Extended "fsck -t" syntax (Closes: #89483). + ** Fix handling of devices for which fsck can't determine a physical + spindal, causing lockup when checking LVM volumes (Closes: #98103). + ** Fixed typo in e2fsck-static description - thanks Ted :). + * Fixed small compilation bug in fsck.c + + -- Yann Dirson Mon, 21 May 2001 20:47:10 +0200 + +e2fsprogs (1.19+1.20-WIP-0514-2) unstable; urgency=low + + * Tighten dependency on debhelper. + + -- Yann Dirson Tue, 15 May 2001 21:38:47 +0200 + +e2fsprogs (1.19+1.20-WIP-0514-1) unstable; urgency=low + + * New upstream pre-release snapshot: + ** new program: e2image. + ** e2fsck validates file descriptor specified in -C (Closes: #55220) + ** Fix multiple progress bar fsck bug (Closes: #65267) + ** Add devfs support to fsck (Closes: #94159) + ** Fix debugfs dump cmd looping on disk errors (Closes: #79163) + ** Miscellaneous manual page clarifications (Closes: #63442, #67446, + #87216) + ** Compilation fixes for Hurd (Closes: #52045). + ** New config.{guess,sub} for parisc support (Closes: #94690). + ** Improved ext3 support + ** tune2fs can now safely modify mounted filesystems + * Added missing @dircategory entry to libext2fs.info (lintian) + * Moved debugfs back from /usr/sbin/ to /sbin/ (Closes: #97035). + * Moved e2label back to /sbin/ as well, as it is now a hard link to + tune2fs. + * New binary package with statically linked e2fsck, recommending a + statically linked shell (Closes: #62611). + * All deps against e2fsprogs itself now versioned (lintian). + * Updated copyright file (upstream location, packaging copyright notice + for previous maintainers and for Alcove). + * Remove call to dh_testversion, use versioned build-dep instead + (lintian). + * Support for DEB_BUILD_OPTIONS debug/nostrip for policy 3.2 + compliance. + * Use dh_shlibdeps -l instead of setting LD_LIBRARY_PATH explicitly - + necessary for new versions of fakeroot, and requires debhelper 3.0.23 + for a fix. Well finally 3.0.23 is buggy, leave this for later. + * Avoid to call ldconfig at "make install" time, too costly. + * Get rid in control files of references to never-released standalone + lib files (split attempted in 1997/98). + * Bumped Standards-Version to 3.5.4. + + -- Yann Dirson Tue, 15 May 2001 14:28:39 +0200 + +e2fsprogs (1.19-4) unstable; urgency=medium + + * Added texinfo to build-deps (Closes: #87685). + + -- Yann Dirson Tue, 3 Apr 2001 09:03:13 +0200 + +e2fsprogs (1.19-3) unstable; urgency=low + + * Drop findsuper binary, and suggest gpart (Closes: #74034). + * Drop flushb and extend at upstream request (Closes: #39506). + * Applied upstream fix for chattr on large files (Closes: #72690). + * Applied clarification patch to tune2fs.8 (Closes: #67446). + * Applied typo patch to compile_et.1 (Closes: #63786). + * Include in e2fsck/journal.c (Closes: #71775). + * Suggest parted. + + -- Yann Dirson Mon, 4 Dec 2000 22:08:06 +0100 + +e2fsprogs (1.19-2) unstable; urgency=low + + * Clarified libuuid copyright to LGPL-2, excluding LGPL-2.1. + * Added build-dependency on debhelper (Closes: #67532). + * Don't parallelize fsck runs on same drive for hd[efgh] (Closes: + #59103). + * Upload pristine source, -1 was erroneously uploaded as a + debian-specific package. + + -- Yann Dirson Thu, 3 Aug 2000 00:30:49 +0200 + +e2fsprogs (1.19-1) unstable; urgency=low + + * New upstream release: + ** new program: resize2fs. + ** ext3 support. + ** NLS support (non-default, activated). + ** Compression support (non-default, activated). + ** Progress bar nice to serial console (Closes: #66079) + ** Ensure filetype feature is turned off for Hurd filesystems (Closes: + #61863) + * Updated main copyright file for a number of things. + * Fixed NLS support for flushb and extend. + * Started to add build-depends. + * Include new e2p header. + + -- Yann Dirson Wed, 19 Jul 2000 01:55:27 +0200 + +e2fsprogs (1.18-3) frozen unstable; urgency=medium + + * Fix Y2K display-only bug in debugfs - "ls -l" displayed raw tm_year, + causing 2000 to be displayed as "100" (Closes: #57135). Potato should + be y2k-clean. + * Remove empty dirs /usr/share/et/ and /usr/share/ss/ from package + e2fsprogs (Closes: #52900). + + -- Yann Dirson Mon, 21 Feb 2000 23:06:47 +0100 + +e2fsprogs (1.18-2) unstable; urgency=low + + * Test for "__sparc__" instead of "sparc" as a cpp macro in mke2fs.c + (tests in other places are correct) (Closes: #50012). + + -- Yann Dirson Fri, 12 Nov 1999 21:40:27 +0100 + +e2fsprogs (1.18-1) unstable; urgency=low + + * New upstream (bugfix) release. + + -- Yann Dirson Fri, 12 Nov 1999 17:27:20 +0100 + +e2fsprogs (1.17-2) unstable; urgency=low + + * Applied upstream patch to fix segfault (Closes: #49535). + + -- Yann Dirson Tue, 9 Nov 1999 22:14:53 +0100 + +e2fsprogs (1.17-1) unstable; urgency=low + + * New upstream (bugfix) release. + + -- Yann Dirson Wed, 27 Oct 1999 23:46:39 +0200 + +e2fsprogs (1.16-2) unstable; urgency=low + + * Fixed build of a link list in fsck.c (Closes: #48312). + + -- Yann Dirson Tue, 26 Oct 1999 01:17:36 +0200 + +e2fsprogs (1.16-1) unstable; urgency=low + + * New upstream release. + * Re-applied Hurd patches that did not seem to have been received + upstream. + + -- Yann Dirson Sun, 24 Oct 1999 16:11:59 +0200 + +e2fsprogs (1.15-3) unstable; urgency=low + + * Fixed minor typo for the Hurd. + * Fixed various Hurd defines to __GNU__ (Closes: #44407). + * Switched doc/ and info/ to FHS. + * Cleaned up debian/rules to use new debhelper features. + * Bounced Standards-Version to 3.0.1. + * Do not install buggy com_err.info, shipped as HTML. + * Removed partinfo from the package, following the wish of upstream + author, because of duplicate functionality with "fdisk -l" (Closes: + #42139). + + -- Yann Dirson Mon, 20 Sep 1999 23:04:06 +0200 + +e2fsprogs (1.15-2) unstable; urgency=medium + + * Changed build directory do debian/BUILD/ - related cleanups in + debian/rules. + * Fixed partinfo.c to have it compiled, and fixed display of partition + device in error messages. + * Added /usr/sbin/partinfo to the package (Closes: #42139). + * Added note about uuidgen(1) in README.Debian. + * Documented in manpage that default mke2fs behaviour is now -r1 -s1 + (Closes: #44478). + * Documented in mke2fs.8 that -r1 forces -s1, thus ignoring -s0. + * Added warning message when -s0 is ignored because of -r1. + * Documented -n option of mke2fs. + * Fixed display buglet causing trailing commas in list of superblock + backups when sparse flag is on and last group has no superblock + backup. + * Closes: #42434, #43134. + + -- Yann Dirson Wed, 8 Sep 1999 00:46:38 +0200 + +e2fsprogs (1.15-1) unstable; urgency=low + + * New upstream release (Closes: Bug#41763). + * All changes to upstream files in 1.14-3 were integrated upstream. + * Separated libuuid-dev from e2fslibs-dev because it now has manpages. + * Fixed debian/rules for POSIX "rmdir -p" + * Corrected the location of the GPL in copyright file. + * Moved the manpages to /usr/share/. + * Bumped Standards-Version to 3.0.0. + + -- Yann Dirson Fri, 23 Jul 1999 01:37:51 +0200 + +e2fsprogs (1.14-3) unstable; urgency=low + + * Fail with error message when /dev/null cannot be opened (Fixes: + Bug#35595). + * Fixed typo in e2fsck/unix.c (Fixes: Bug#36960). + * Added "emergency help" options summary to e2fsck (Fixes: Bug#11372). + * Prepared debian/rules for usr/share/man/. + + -- Yann Dirson Tue, 1 Jun 1999 23:37:12 +0200 + +e2fsprogs (1.14-2) unstable; urgency=low + + * Fixed fsck(1) not to coredump when it does not find its argument in + /etc/fstab (Fixes: Bug#33533, Bug#34320, part of Bug#34131). + * Fixed spelling of upstream author's name. + * Cleaned debian/*.files up. + * Undid the changes. + * Changed "rmdir -p" invocations in debian/rules into "-rmdir -p" to + turn around changed behaviour in fileutils_4.0. + + -- Yann Dirson Fri, 12 Mar 1999 23:50:47 +0100 + +e2fsprogs (1.14-1) unstable; urgency=low + + * New upstream release (Fixes: Bug#33113). + * All patches we used for 1.12 are obsoleted by 1.14. + * Still have to install com_err.info from debian/rules though. + * Incorporated patches from Gordon Matzigkeit for hurd cross-compilation: + * - configure.in: Change cross-compile default for sizeof (long + long) to 8, so that __s64 and __u64 get defined in ext2fs.h. + (BUILD_CC): Discover a native compiler if we are cross-compiling + (used for util/subst). + - Include linux/types.h instead of asm/types.h, so that + non-Linux platforms use the stubbed version provided with this + package. + - misc/Makefile.in (findsuper): Add a rule so that findsuper gets built + with the right compiler flags. + - etc. + + -- Yann Dirson Wed, 10 Feb 1999 23:23:03 +0100 + +e2fsprogs (1.12-4) frozen unstable; urgency=low + + * Ship flushb(8) and extend(8) were missing in all 1.12 packages + (Fixes: Bug#28771). + * Add extend.8 link to undocumented.7. + * Replaced my (ad-hoc) fix for Bug#25684 with (really better) one + from upstream. + + -- Yann Dirson Mon, 2 Nov 1998 20:53:28 +0100 + +e2fsprogs (1.12-3) frozen unstable; urgency=low + + * Fixed to use angle brackets instead of double + quotes when including files from /usr/include/. + * Made e2fslibs-dev depend on comerr-dev (Fixes: Bug#26282, + Bug#27497). + * Fixed mke2fs' display with inode numbers > 9999 (Fixes: Bug#25684). + * Use -D__NO_STRING_INLINES on powerpc to allow building the boot + blocks in QUIK, the powermac boot loader - reported by Matt + McLean. + * Removed unsupported info and texi entries from docbase files. + + -- Yann Dirson Mon, 19 Oct 1998 23:32:41 +0200 + +e2fsprogs (1.12-2.1) unstable; urgency=low + + * Non-maintainer upload + config.guess and config.sub files modified, to recognize a Arm + architecture. + + -- Turbo Fredriksson Thu, 13 Aug 1998 19:15:56 -0400 + +e2fsprogs (1.12-2) unstable; urgency=low + + * Really install e2label.8 manpage. + * Removed path from ldconfig invocation, obeying packaging manual. + * Improved the subst.c patch (thanks to Peter Moulder). + + -- Yann Dirson Thu, 14 Jul 1998 14:10:06 +0200 + +e2fsprogs (1.12-1) unstable; urgency=low + + * New upstream release - at last out of alpha status ! + * Removed some obsolete files from debian/attic. + * Patched util/subst.c to expand env variables, and MCONFIG.in to + have ${prefix} exported to the `subst' process, so that we get + correct paths in mk_cmds and compile_et. Forwarded upstream. + * Debian-specific /usr/share/comerr/ renamed to /usr/share/et/, now + installed upstream. + * Removed -isp from dh_gencontrol invocation - now the default. + * Passed lintian 0.5.0. + + -- Yann Dirson Fri, 10 Jul 1998 22:49:18 +0200 + +e2fsprogs (1.10-17) frozen unstable; urgency=low + + * Commented out obsolete code in fsck.c that assumed fstab entries + declared `noauto' should not be checked - successfully forwarded + upstream (Fixes: Bug#17244). + + -- Yann Dirson Fri, 15 May 1998 01:14:54 +0200 + +e2fsprogs (1.10-16) frozen unstable; urgency=low + + * Changed to in lib/uuid/uuidP.h to + allow compilation with glibc 2.0.7pre1 (Fixes: Bug#22039). + * Use "build-stamp" as a stamp file instead of "build". + * Restored "Provides: e2fslibsg" in order to allow upgrade from + unstable hamm. Documented in README.Debian so that it does not + get removed again (Fixes: Bug#22019). + + -- Yann Dirson Mon, 4 May 1998 21:11:38 +0200 + +e2fsprogs (1.10-15) frozen unstable; urgency=low + + * Added call to ldconfig in e2fsprogs.postinst. + * Fixes checks for install-docs in postinst/prerm (Fixes: Bug#20303, + Bug#20304, Bug#20590). + * Removed e2fslibsg from what e2fsprogs provides (was just forgotten). + * Passed lintian 0.4.2. + + -- Yann Dirson Sun, 26 Apr 1998 22:27:11 +0200 + +e2fsprogs (1.10-14) frozen unstable; urgency=low + + * Fixed checks for install-docs to use -x. + * Applied patch for sparc from Juan to fsck.c to compile with glibc + 2.1 (Fixes: Bug#20841). + + -- Yann Dirson Tue, 14 Apr 1998 17:12:19 +0200 + +e2fsprogs (1.10-13) frozen unstable; urgency=low + + * test for /usr/sbin/install-docs before trying to run it in + postinst and prerm (Fixes: Bug#19461, Bug#19469, Bug#19949, + Bug#20006). + * comerrg-dev now suggests doc-base. + * moved binary packages ss2g, comerr2g and e2fslibsg back into + binary package e2fsprogs. + * use new virtual packages libcomerr2, libss2, libext2fs2, libe2p2, + libuuid1 in shlibs and dependencies. + * Changed e2fsprogs dependency on libs to a Pre-Depends (Fixes: + Bug#18221). + * Not conflicting with old ss2g and comerr2g - these will have to be + removed by hand. + * Turned around dpkg's bug #17624 in e2fsprogs.preinst. + * Updated README.Debian to explain the new package architecture. + * Passed lintian 0.3.4. + + -- Yann Dirson Fri, 20 Mar 1998 13:03:11 +0100 + +e2fsprogs (1.10-12) unstable; urgency=low + + * Corrected doc menu entries to point to the real documents' places. + * Fixed mk_cmds to really find its support scripts (Fixes: Bug#18779). + * Made mk_cmds and compile_et use "sh -e". + * Have missing file /usr/include/ss/ss_err.h installed (Fixes: Bug#18778). + * Corrected typo in Description (Fixes: Bug#18890). + * Fixed descriptions for ss* packages, thanks to Greg Stark (Fixes: + Bug#18373, Bug#18447). + * Added description of e2p and uuid libs in e2fslibsg-dev description. + * Included texinfo sources. + * Added doc-base support - suppressed direct menu/dwww support. + * Complies with standards version 2.4.0.0. + * Passed lintian 0.3.0: + * removed .du control file. + * updated FSF address. + * fixed in *.files nasty ldconfig-symlink-before-shlib-in-deb's. + * turned relative links from /usr/lib into /lib into absolute ones. + + -- Yann Dirson Sun, 8 Mar 1998 19:42:58 +0100 + +e2fsprogs (1.10-11) unstable; urgency=low + + * Switched to debhelper (Fixes:Bug#16307). + * Updated standards to 2.3.0.1 + * Changed maintainer's mail address. + * Added conflicts with old versions of dump and quota. + * Added html-converted texi docs for libs, with menu(dwww) support. + * Added findsuper.8 link to undocumented. + * Changed version number of lib packages to reflect the lib versions. + * Moved libss into its own packages; added mk_cmds script and + support files for libss development (Fixes:Bug#17233). + * Added README.Debian file documenting all those dependency stuff. + * Included example error tables from libext2fs and libss in + comerr-dev. + * Included example command tables from debugfs in ss-dev. + * Added section/priority files in packages (-isp). + * Changed names/relations for doc dirs to comply with policy. + * Removed call to ldconfig from e2fsprogs.postinst. + + -- Yann Dirson Thu, 29 Jan 1998 18:10:03 +0100 + +e2fsprogs (1.10-10) unstable; urgency=low + + * Added patch from Michael Alan Dorman for compilation on alpha-Linux + (Closes:Bug#15596). + * Added '-fsigned-char' to COPTS to allow compilation on ppc-Linux + (Closes:Bug#15976). + * Suppressed Essential flag on libs, as well as useless Replaces + (Closes: Bug#16480). + * Suppressed reference to obsolete package `e2fsprogsg' in control + info, but Conflicts for security (Closes:Bug#16791). + + -- Yann Dirson Wed, 7 Jan 1998 22:35:08 +0100 + +e2fsprogs (1.10-9) unstable; urgency=low + + * Fixed comerr2g.shlibs to reflect package-name change. + * Fixed problem with ss include files being removed from /usr on make + install (indeed fixed in 1.10-8). + * Added changelog file to comerr2g package (indeed fixed in 1.10-8). + * Corrected link from flushb.8 to undocumented (Closes:Bug#15335,Bug#15660,Bug#15675). + * Added /sbin/findsuper (Closes:Bug#15224). + * Fixed /usr/bin/compile_et script (Closes:Bug#15487). + * Included awk scripts in /usr/share/comerr, for use by compile_et. + * Changed back the name from "e2fsprogsg" to "e2fsprogs" to get better + dependencies. + * Strip libraries (Closes:Bug#15667). + + -- Yann Dirson Tue, 9 Dec 1997 22:52:42 +0100 + +e2fsprogs (1.10-8) unstable; urgency=low + + * Added latest patch from Ted for autodetection of llseek() proto. + * Switched to libc6, without libc5 compatibility (yet ?). + * Turned Pre-Depends into Depends to allow installation. Dirty + though. But what were Pre-Depends for anyway ? + + -- Yann Dirson Sun, 23 Nov 1997 23:03:02 +0100 + +e2fsprogs (1.10-7) unstable; urgency=HIGH + + * Turned "#if (__GLIBC__ == 2)" into "#if 1" to turn around missing llseek() + prototype in libc_5.4.33-5 as well as libc6. + + -- Yann Dirson Tue, 21 Oct 1997 12:53:27 +0200 + +e2fsprogs (1.10-6) unstable; urgency=low + + * Official libc6 patches from Ted. + * Converted to debstd - let it do the stripping stuff. + * Separated libcomerr into a standalone lib - includes full doc and tools. + * Separated development files into e2fslibs-dev, which Provides the 4 other + -dev packages. + * Now Provides the 4 other lib packages, to make it possible not to depend + upon e2fsprogs itself. These libs WILL be taken out of "progs" in the + next release. + + -- Yann Dirson Wed, 24 Sep 1997 10:46:00 +0200 + +e2fsprogs (1.10-5.1) experimental; urgency=low + + * Applied patch from Ted for libc6 compatibility, for test purpose. + + -- Yann Dirson Thu, 11 Sep 1997 09:09:42 +0200 + +e2fsprogs (1.10-5) unstable; urgency=medium + + * Switched back to libc5 because of possible bug in libc6-2.0.4-provided + llseek() causing problem with partitions > 2Gb. + * Switched back to libc-provided llseek(). + + -- Yann Dirson Tue, 5 Aug 1997 16:54:40 +0200 + +e2fsprogs (1.10-4.1) unstable; urgency=low + + * Make use of shipped llseek instead of glibc's which seems buggy + [unreleased - could not compile due to possible gcc bug]. + * Corrected compiler-options handling in debian/rules (use CCOPTS instead + of CFLAGS which is messed with in configure.in). + + -- Yann Dirson Mon, 28 Jul 1997 19:47:02 +0200 + +e2fsprogs (1.10-4) unstable; urgency=low + + * Switched to libc6. + * Added calls to update-info in postins/prerm. + * Misc changes to debian/rules; some cleanup in Makefiles. + + -- Yann Dirson Thu, 10 Jul 1997 19:42:54 +0200 + +e2fsprogs (1.10-3) stable unstable; urgency=low + + * New maintainer (closed many obsolete bug-reports). + * updated "copyright" to show new location on tsx-11. + * started debian/rules cleanup, towards new policy conformance. + * Added flushb.8 link to undocumented.7 (bug #8644). + * Added {fsck,mkfs}.ext2.8 links to existing manpages (bugs #5598, + #6286). + + -- Yann Dirson Wed, 25 Jun 1997 14:59:58 +0200 + +e2fsprogs (1.10-2) frozen unstable; urgency=low + + * Add 'ldconfig' to postinst (should fix #9020). + * Define HAVE_NETINET_IN_H on alpha/glibc. + + -- Klee Dienes Tue, 29 Apr 1997 17:24:12 -0400 + +e2fsprogs (1.10-1) frozen unstable; urgency=medium + + * Upstream bug-fix release. + + -- Klee Dienes Thu, 24 Apr 1997 14:54:12 -0400 + +e2fsprogs (1.09-1) frozen; urgency=medium + + * Upstream bug-fix release. + + -- Klee Dienes Thu, 24 Apr 1997 14:54:12 -0400 + +e2fsprogs (1.06-4) unstable; urgency=low + + * Added empty entries to shlibs.local, to neatly solve the pre-depends + problem, as suggested by Ian Jackson. + + -- Michael Nonweiler Wed, 13 Nov 1996 08:13:28 +0000 + +e2fsprogs (1.06-3) unstable; urgency=low + + * Hard coded Pre-Depends line, as a temporary fix for the pre-depends + contains e2fsprogs problem. + + -- Michael Nonweiler Sat, 9 Nov 1996 12:57:44 +0000 + +e2fsprogs (1.06-2) unstable; urgency=low + + * New packaging format + * Fixes packaging bugs - + Files in /lib are now stripped of all unneeded symbols (Bug#5121) + Calls to ldconfig in maintainer scripts have been removed (Bug#4247) + + -- Michael Nonweiler Tue, 5 Nov 1996 21:14:54 +0000 + +e2fsprogs (1.01-1) unstable; urgency=low + + * upgraded to latest upstream version, to 1.06 from 1.05 + * upgraded to latest upstream version, to 1.05 from 1.04 + * gzip manpages + * minor changes to debian.rules + + -- Michael Meskes Fri, 18 Oct 1996 00:00:00 +0000 + +e2fsprogs (1.04-1) unstable; urgency=low + + * upgraded to latest upstream version, to 1.04 from 1.02 + * another tidy-up of debian.rules + * section and priority added to debian.control, since this is an + essential base package. + + -- Michael Nonweiler Sun, 23 Jun 1996 00:00:00 +0000 + +e2fsprogs (1.02-1) unstable; urgency=low + + * upgraded to latest upstream version, to 1.02 from 1.01 + * copied "configure" usr_prefix change (see below), into configure.in + * updated debian.control file, added Pre-Depends field + created preinst script to check dpkg --assert-predepends + tidied and fixed debian.rules + * set e2fsck to link shared, as suggested by Bruce Perens in Bug#2332 + * corrected problem in e2fsck error message, Bug#2534 + * added Architecture field + * very minor correction to expected output of a build time test + + -- Michael Nonweiler Tue, 5 Mar 1996 00:00:00 +0000 + +e2fsprogs (1.01-1) unstable; urgency=low + + * removed debugging symbols from libs and enabled more optimization + as suggested by Rolf Rossius + * also removed the /var/catman pages + * changed to elf compilation + + -- Andrew D. Fernandes Mon, 20 Nov 1995 00:00:00 +0000 + +e2fsprogs (0.5b-2) unstable; urgency=low + + * Upgraded to latest version, to 1.01 from 0.5b. + * changed the installation groups from bin to root in MCONFIG.in + * changed configure to set usr_prefix="\${prefix}/usr" + * moved the cat pages to /var/catman in MCONFIG.in + + -- Andrew D. Fernandes Sat, 7 Oct 1995 00:00:00 +0000 + +e2fsprogs (0.5b-1) unstable; urgency=low + + * Made "fsck -t " work correctly. Formerly + the -t argument was overridden by the filesystem type listed for the + device in /etc/fstab. + * added Debian GNU/Linux package maintenance system files + + -- Bruce Perens Thu, 3 Aug 1995 00:00:00 +0000 diff --git a/src/_nfdos/e2fsprogs/debian/comerr-dev.doc-base b/src/_nfdos/e2fsprogs/debian/comerr-dev.doc-base new file mode 100644 index 0000000..463eb76 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/comerr-dev.doc-base @@ -0,0 +1,12 @@ +Document: comerr-manual +Title: The com_err library +Author: Ken Raeburn and Bill Sommerfeld +Abstract: A library, and associated utilities, + which allow a more uniform way for libraries + to return errors to their callers, and for programs + to describe errors and exceptional conditions to their users. +Section: Programming + +Format: HTML +Index: /usr/share/doc/comerr-dev/html-info/com_err.html +Files: /usr/share/doc/comerr-dev/html-info/*.html diff --git a/src/_nfdos/e2fsprogs/debian/comerr-dev.examples b/src/_nfdos/e2fsprogs/debian/comerr-dev.examples new file mode 100644 index 0000000..aff20cc --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/comerr-dev.examples @@ -0,0 +1,2 @@ +lib/ss/ss_err.et +debian/BUILD-STD/lib/ext2fs/ext2_err.et diff --git a/src/_nfdos/e2fsprogs/debian/comerr-dev.install b/src/_nfdos/e2fsprogs/debian/comerr-dev.install new file mode 100644 index 0000000..a3b8b0e --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/comerr-dev.install @@ -0,0 +1,9 @@ +usr/lib/*/libcom_err.a +usr/lib/*/libcom_err.so +usr/include/et/* +usr/include/com_err.h +usr/share/man/man1/compile_et* +usr/share/man/man3/com_err.3* +usr/bin/compile_et +usr/share/et/* +usr/lib/*/pkgconfig/com_err.pc diff --git a/src/_nfdos/e2fsprogs/debian/comerr-dev.postinst b/src/_nfdos/e2fsprogs/debian/comerr-dev.postinst new file mode 100644 index 0000000..aae743a --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/comerr-dev.postinst @@ -0,0 +1,30 @@ +#!/bin/sh + +# Abort on error. +set -e + +symlink_match() +{ + local SYMLINK="$1" + local SYMLINK_TARGET="$2" + + [ "$(readlink "$SYMLINK")" = "$SYMLINK_TARGET" ] || \ + [ "$(readlink -f "$SYMLINK")" = "$SYMLINK_TARGET" ] +} + +SYMLINK=/usr/share/doc/comerr-dev +SYMLINK_TARGET=libcomerr2 +SYMLINK_TARGET2=libcom-err2 + +if [ "$1" = "configure" ] && [ -h "${SYMLINK}.dpkg-backup" ] +then + if symlink_match "${SYMLINK}.dpkg-backup" "$SYMLINK_TARGET" || + symlink_match "${SYMLINK}.dpkg-backup" "$SYMLINK_TARGET2" + then + rm -f "${SYMLINK}.dpkg-backup" + fi +fi + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/comerr-dev.postrm b/src/_nfdos/e2fsprogs/debian/comerr-dev.postrm new file mode 100644 index 0000000..8f9e679 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/comerr-dev.postrm @@ -0,0 +1,36 @@ +#!/bin/sh + +# Abort on error. +set -e + +symlink_match() +{ + local SYMLINK="$1" + local SYMLINK_TARGET="$2" + + [ "$(readlink "$SYMLINK")" = "$SYMLINK_TARGET" ] || \ + [ "$(readlink -f "$SYMLINK")" = "$SYMLINK_TARGET" ] +} + +SYMLINK=/usr/share/doc/comerr-dev +SYMLINK_TARGET=libcomerr2 +SYMLINK_TARGET2=libcom-err2 + +if [ "$1" = "purge" ] && [ -h "${SYMLINK}.dpkg-backup" ] +then + rm -f "${SYMLINK}.dpkg-backup" +fi +if [ "$1" = "abort-install" -o "$1" = "abort-upgrade" ] && + [ -n "$2" ] && [ ! -e "$SYMLINK" ] && [ -h "${SYMLINK}.dpkg-backup" ] +then + if symlink_match "${SYMLINK}.dpkg-backup" "$SYMLINK_TARGET" || + symlink_match "${SYMLINK}.dpkg-backup" "$SYMLINK_TARGET2" + then + echo "Restoring backup of $SYMLINK ..." + mv "${SYMLINK}.dpkg-backup" "$SYMLINK" + fi +fi + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/comerr-dev.preinst b/src/_nfdos/e2fsprogs/debian/comerr-dev.preinst new file mode 100644 index 0000000..5d8090a --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/comerr-dev.preinst @@ -0,0 +1,31 @@ +#!/bin/sh + +# Abort on error. +set -e + +symlink_match() +{ + local SYMLINK="$1" + local SYMLINK_TARGET="$2" + + [ "$(readlink "$SYMLINK")" = "$SYMLINK_TARGET" ] || \ + [ "$(readlink -f "$SYMLINK")" = "$SYMLINK_TARGET" ] +} + +SYMLINK=/usr/share/doc/comerr-dev +SYMLINK_TARGET=libcomerr2 +SYMLINK_TARGET2=libcom-err2 + +if [ "$1" = "install" -o "$1" = "upgrade" ] && + [ -n "$2" ] && [ -h "$SYMLINK" ] +then + if symlink_match "$SYMLINK" "$SYMLINK_TARGET" || + symlink_match "$SYMLINK" "$SYMLINK_TARGET2" + then + mv -f "$SYMLINK" "${SYMLINK}.dpkg-backup" + fi +fi + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/control b/src/_nfdos/e2fsprogs/debian/control new file mode 100644 index 0000000..7701987 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/control @@ -0,0 +1,193 @@ +Source: e2fsprogs +Section: admin +Priority: required +Maintainer: Theodore Y. Ts'o +Build-Depends: gettext, texinfo, pkg-config, libfuse-dev [linux-any kfreebsd-any] , debhelper-compat (= 12), dh-exec, libblkid-dev, uuid-dev, m4, udev [linux-any], systemd [linux-any], cron [linux-any] +Rules-Requires-Root: no +Standards-Version: 4.6.2 +Homepage: http://e2fsprogs.sourceforge.net +Vcs-Browser: https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git +Vcs-Git: https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git -b debian/master + +Package: fuse2fs +Build-Profiles: +Priority: optional +Depends: ${shlibs:Depends}, ${misc:Depends} +Architecture: linux-any kfreebsd-any +Description: ext2 / ext3 / ext4 file system driver for FUSE + fuse2fs is a FUSE file system client that supports reading and + writing from devices or image files containing ext2, ext3, and ext4 + file systems. + +Package: logsave +Priority: optional +Depends: ${shlibs:Depends}, ${misc:Depends} +Replaces: e2fsprogs (<< 1.45.3-1) +Breaks: e2fsprogs (<< 1.45.3-1) +Architecture: any +Multi-Arch: foreign +Description: save the output of a command in a log file + The logsave program will execute cmd_prog with the specified + argument(s), and save a copy of its output to logfile. If the + containing directory for logfile does not exist, logsave will + accumulate the output in memory until it can be written out. A copy + of the output will also be written to standard output. + +Package: e2fsck-static +Build-Profiles: +Priority: optional +Depends: ${misc:Depends} +Recommends: sash | bash-static | zsh-static | busybox-static +Architecture: any +Description: statically-linked version of the ext2/ext3/ext4 filesystem checker + This may be of some help to you if your filesystem gets corrupted enough + to break the shared libraries used by the dynamically linked checker. + . + This binary takes much more space than its dynamic counterpart located + in e2fsprogs, though. + . + You may want to install a statically-linked shell as well, to be able + to run this program if something like your C library gets corrupted. + +Package: e2fsprogs-l10n +Section: localization +Priority: optional +Depends: e2fsprogs (>= ${binary:Version}), e2fsprogs (<< ${binary:Version}+c~), ${misc:Depends} +Replaces: e2fsprogs (<< 1.43.5-1) +Architecture: all +Multi-Arch: foreign +Description: ext2/ext3/ext4 file system utilities - translations + The ext2, ext3 and ext4 file systems are successors of the original ext + ("extended") file system. They are the main file system types used for + hard disks on Debian and other Linux systems. + . + This package provides translations for messages for programs found in + the 'e2fsprogs' package. + +Package: libcom-err2 +Section: libs +Priority: optional +Depends: ${shlibs:Depends}, ${misc:Depends} +Replaces: libcomerr2 (<< 1.43.9-1~) +Breaks: libcomerr2 (<< 1.43.9-1~) +Provides: libcomerr2 (= ${binary:Version}) +Architecture: any +Multi-Arch: same +Pre-Depends: ${misc:Pre-Depends} +Description: common error description library + libcomerr is an attempt to present a common error-handling mechanism to + manipulate the most common form of error code in a fashion that does not + have the problems identified with mechanisms commonly in use. + +Package: comerr-dev +Section: libdevel +Priority: optional +Depends: libc6-dev | libc-dev, libcom-err2 (= ${mainBinary}), ${misc:Depends} +Suggests: doc-base +Replaces: e2fslibs-dev (<< 1.33-2), libkrb5-dev (<< 1.3) +Architecture: any +Multi-Arch: same +Description: common error description library - headers and static libraries + libcom_err is an attempt to present a common error-handling mechanism to + manipulate the most common form of error code in a fashion that does not + have the problems identified with mechanisms commonly in use. + . + This package contains the development environment for the com_err library. + +Package: libss2 +Section: libs +Priority: optional +Depends: libcom-err2, ${shlibs:Depends}, ${misc:Depends} +Replaces: e2fsprogs (<< 1.34-1) +Architecture: any +Multi-Arch: same +Pre-Depends: ${misc:Pre-Depends} +Description: command-line interface parsing library + libss provides a simple command-line interface parser which will + accept input from the user, parse the command into an argv argument + vector, and then dispatch it to a handler function. + . + It was originally inspired by the Multics SubSystem library. + +Package: ss-dev +Section: libdevel +Priority: optional +Depends: libc6-dev | libc-dev, libss2 (= ${mainBinary}), comerr-dev, ${misc:Depends} +Architecture: any +Multi-Arch: same +Description: command-line interface parsing library - headers and static libraries + This package includes a tool that parses a command table to generate + a simple command-line interface parser, the include files needed to + compile and use it, and the static libs. + . + It was originally inspired by the Multics SubSystem library. + . + This package contains the development environment for the ss library. + +Package: e2fsprogs-udeb +Build-Profiles: +Package-Type: udeb +Section: debian-installer +Priority: optional +Depends: ${shlibs:Depends}, ${misc:Depends} +Architecture: any +Description: stripped-down versions of e2fsprogs, for debian-installer + This package is an e2fsprogs package built for a reduced size, so that + it can help to save space in debian-installer. + . + Don't attempt to install this package, it has no support for a couple of + features you surely want. Anyway it should refuse to install. + +Package: libext2fs2 +Section: libs +Priority: optional +Depends: ${shlibs:Depends}, ${misc:Depends} +Replaces: e2fslibs (<< 1.43.9-1~) +Breaks: e2fslibs (<< 1.43.9-1~) +Provides: e2fslibs (= ${binary:Version}) +Architecture: any +Multi-Arch: same +Pre-Depends: ${misc:Pre-Depends} +Description: ext2/ext3/ext4 file system libraries + The ext2, ext3 and ext4 file systems are successors of the original ext + ("extended") file system. They are the main file system types used for + hard disks on Debian and other Linux systems. + . + This package provides the ext2fs and e2p libraries, for userspace software + that directly accesses extended file systems. Programs that use libext2fs + include e2fsck, mke2fs, and tune2fs. Programs that use libe2p include + dumpe2fs, chattr, and lsattr. + +Package: libext2fs-dev +Section: libdevel +Priority: optional +Depends: libc6-dev | libc-dev, comerr-dev, libext2fs2 (= ${binary:Version}), ${misc:Depends} +Replaces: e2fslibs-dev (<< 1.43.9-1~) +Breaks: e2fslibs-dev (<< 1.43.9-1~) +Provides: e2fslibs-dev (= ${binary:Version}) +Suggests: doc-base +Architecture: any +Description: ext2/ext3/ext4 file system libraries - headers and static libraries + The ext2, ext3 and ext4 file systems are successors of the original ext + ("extended") file system. They are the main file system types used for + hard disks on Debian and other Linux systems. + . + This package contains the development environment for the ext2fs and e2p + libraries. + +Package: e2fsprogs +XB-Important: yes +Pre-Depends: ${shlibs:Depends}, ${misc:Depends}, libblkid1, libuuid1 +Depends: logsave +Multi-Arch: foreign +Suggests: gpart, parted, fuse2fs, e2fsck-static +Recommends: e2fsprogs-l10n +Architecture: any +Description: ext2/ext3/ext4 file system utilities + The ext2, ext3 and ext4 file systems are successors of the original ext + ("extended") file system. They are the main file system types used for + hard disks on Debian and other Linux systems. + . + This package contains programs for creating, checking, and maintaining + ext2/3/4-based file systems. It also includes the "badblocks" program, + which can be used to scan for bad blocks on a disk or other storage device. diff --git a/src/_nfdos/e2fsprogs/debian/copyright b/src/_nfdos/e2fsprogs/debian/copyright new file mode 100644 index 0000000..f18058e --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/copyright @@ -0,0 +1,403 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: e2fsprogs +Upstream-Contact: Theodore Ts'o +Source: http://sourceforge.net/projects/e2fsprogs +Comment: + This is the Debian GNU/Linux prepackaged version of the EXT2 file + system utilities (e2fsck, mke2fs, etc.). The EXT2 utilities were + written by Theodore Ts'o and Remy Card . + +Files: * +Copyright: 1993-2018 Theodore Ts'o +License: GPL-2 +Comment: Some files are GPL-2+ licensed or do not carry any license version. + They are distributable as GPL-2 and listed as such for simplification. + +Files: debian/* +Copyright: 2003-2007 Theodore Ts'o + 1997-2003 Yann Dirson + 2001 Alcove + 1997 Klee Dienes + 1995-1996 Michael Nonweiler +License: GPL-2 + +Files: lib/ext2fs/* + lib/e2p/* + lib/support/print_fs_flags.c + misc/e2fuzz.c +Copyright: 1995-1999, 2002, 2004-2006 Theodore Ts'o + 1992-1994 Remy Card + Laboratoire MASI, Institut Blaise Pascal + Universite Pierre et Marie Curie (Paris VI) + 2001 Andreas Gruenbacher, + 2007 IBM Corporation + 2010 Red Hat, Inc., Lukas Czerner + 2014 Oracle + 2012 Zheng Liu + 2012 Intel Corporation + 2001 Daniel Phillips + 2002 Theodore Ts'o. + 2002 Andreas Dilger + 2006 Cluster File Systems, Inc. + 2006, 2007 by Andreas Dilger + 2003,2004 Cluster File Systems, Inc + 1995 Theodore Ts'o. + 2003 VMware, Inc. + 2015 Jan Kara + 2018 Collabora Ltd. + 1997 Theodore Ts'o + 1997 Mark Habersack + 2011 Whamcloud, Inc. + 2004 Sam Hocevar + 2014 Google Inc. + 1993, 1994, 1995 Theodore Ts'o. + 1998 Andrey Shedel +License: LGPL-2 +Comment: Some files in lib/ext2fs claim + "This file may be redistributed under the terms of the GNU Public License." + and NOTICE clarifies them to be licensed under LGPL-2. + +Files: lib/ext2fs/tdb* +Copyright: 1999-2005 Andrew Tridgell + 2000-2006 Jeremy Allison + 2000 Paul `Rusty' Russell +License: LGPL-2 + +Files: lib/ext2fs/tdbtool.c +Copyright: 1999-2000 Andrew Tridgell + 2000 Paul `Rusty' Russell + 2000 Jeremy Allison + 2001 Andrew Esh +License: GPL-2 + +Files: lib/ext2fs/kernel-jbd.h +Copyright: 1998-2000 Red Hat, Inc +License: GPL-2 + +Files: lib/ext2fs/nls_utf8.c + lib/ext2fs/utf8n.h + util/mkutf8data.c +Copyright: 2014 SGI + 2018 Collabora Ltd. +License: GPL-2 + +Files: lib/ext2fs/crc16.* +Copyright: 2005 Ben Gardner +License: GPL-2 + +Files: lib/ext2fs/crc32c* +Copyright: + August 26, 2011 Darrick J. Wong + Reuse Bob Pearson's slice-by-8 implementation for e2fsprogs. + . + July 20, 2011 Bob Pearson + ... + Oct 15, 2000 Matt Domsch + ... + Oct 12, 2000 Matt Domsch +License: GPL-2 + +Files: lib/uuid/* +Copyright: 1996-1999, 2007 Theodore Ts'o. +License: BSD-3-Clause + +Files: lib/uuid/*.3.in +Copyright: 1999 Andreas Dilger +License: BSD-3-Clause + +Files: contrib/fallocate.c +Copyright: 2008 Red Hat, Inc. All rights reserved. + 2003-2005 Silicon Graphics, Inc. +License: GPL-2 + +Files: contrib/dconf +Copyright: 1994 Ulrich Windl +License: GPL-2 + +Files: CleanSpec.mk + contrib/android/ext2simg.c +Copyright: 2007, 2016 The Android Open Source Project +License: Apache-2 + +Files: e2fsck/* + debugfs/do_journal.c + debugfs/journal.* + debugfs/logdump.c + debugfs/xattrs.c + lib/support/plausible.c + misc/fuse2fs.c + misc/fsmap.h +Copyright: 1993-2011 Theodore Ts'o + 1999-2000 Red Hat Software + 2000 Red Hat corp + 2001 Red Hat, Inc. + 2000 Stephen C. Tweedie + 2000 Andreas Dilger + 2014 Oracle + 2019 Google LLC +License: GPL-2 + +Files: e2fsck/mtrace.* + include/nonunix/getopt.h +Copyright: 1985-2015 Free Software Foundation, Inc. +License: LGPL-2 + +Files: ext2ed/* +Copyright: 1995 Gadi Oxman +License: GPL-2 + +Files: include/mingw/unistd.h +Copyright: 2004-2006 Kern Sibbald + 2014 Adam Kropelin +License: GPL-2 + +Files: lib/support/devname.* +Copyright: 2010 Red Hat, Inc., Lukas Czerner +License: GPL-2 + +Files: lib/blkid/* + misc/blkid.c +Copyright: 1999, 2001 by Andries Brouwer + 1994-1997, 1999-2004 Theodore Ts'o + 2001 Andreas Dilger +License: LGPL-2 + +Files: misc/blkid.8.in + misc/uuidgen.1.in +Copyright: 1999, 2000 Andreas Dilger +License: GPL-2 + +Files: misc/create_inode.c +Copyright: 2014 Robert Yang +License: LGPL-2 + +Files: misc/e2freefrag.c +Copyright: 2009 Sun Microsystems, Inc. +License: GPL-2 + +Files: misc/e2undo.c +Copyright: 2007 IBM Corporation +License: GPL-2 + +Files: misc/e4defrag.c +Copyright: Akira Fujita + Takashi Sato +License: GPL-2 + +Files: misc/uuidgen.c +Copyright: 1999 Andreas Dilger and Theodore Ts'o +License: GPL-2 + +Files: misc/e2fuzz.sh +Copyright: 2014 Oracle +License: GPL-2 + +Files: misc/e4crypt.c +Copyright: 2014 Google, Inc. +License: GPL-2 + +Files: ext2ed/ext2.descriptors + misc/badblocks.c + misc/chattr.c + misc/dumpe2fs.c + misc/lsattr.c + misc/mklost+found.c + misc/tune2fs.c +Copyright: 1995-1999 by Theodore Ts'o + 1992-1994 Remy Card + Laboratoire MASI, Institut Blaise Pascal + Universite Pierre et Marie Curie (Paris VI) + 1999 by David Beattie + Linus Torvalds +License: GPL-2 + +Files: resize/* +Copyright: 1997-2000 by Theodore Ts'o and PowerQuest, Inc. +License: GPL-2 + +Files: scrub/* +Copyright: 2018 Oracle +License: GPL-2 + +Files: tests/fuzz/*.cc +Copyright: 2020 Google LLC +License: Apache-2 + +Files: lib/support/argv_parse.* +Copyright: 1999 Theodore Ts'o. +License: ISC + Permission to use, copy, modify, and distribute this software for + any purpose with or without fee is hereby granted, provided that + the above copyright notice and this permission notice appear in all + copies. THE SOFTWARE IS PROVIDED "AS IS" AND THEODORE TS'O (THE + AUTHOR) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Files: lib/support/profile.* +Copyright: 2005, 2006 by Theodore Ts'o. + 1985-2005 by the Massachusetts Institute of Technology. + All rights reserved. +License: GPL or MIT-US-export + This file may be redistributed under the terms of the GNU Public + License. + . + Export of this software from the United States of America may require + a specific license from the United States Government. It is the + responsibility of any person or organization contemplating export to + obtain such a license before exporting. + . + WITHIN THAT CONSTRAINT, permission to use, copy, modify, and + distribute this software and its documentation for any purpose and + without fee is hereby granted, provided that the above copyright + notice appear in all copies and that both that copyright notice and + this permission notice appear in supporting documentation, and that + the name of M.I.T. not be used in advertising or publicity pertaining + to distribution of the software without specific, written prior + permission. Furthermore if you modify this software you must label + your software as modified software and not distribute it in such a + fashion that it might be confused with the original MIT software. + M.I.T. makes no representations about the suitability of this software + for any purpose. It is provided "as is" without express or implied + warranty. + . + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. +Comment: + On Debian systems, the complete text of the GNU General + Public License can be found in "/usr/share/common-licenses/GPL". + +Files: lib/support/dict.* +Copyright: 1997 Kaz Kylheku +License: Kazlib + All rights are reserved by the author, with the following exceptions: + Permission is granted to freely reproduce and distribute this software, + possibly in exchange for a fee, provided that this copyright notice appears + intact. Permission is also granted to adapt this software to produce + derivative works, as long as the modified versions carry this copyright + notice and additional notices stating that the work has been modified. + This source code may be translated into executable form and incorporated + into proprietary software; there is no requirement for such software to + contain a copyright notice related to this source. +Comment: The work has been modified. + +Files: doc/libext2fs.texinfo +Copyright: 1997-2014 Theodore Ts'o +License: Latex2e + Permission is granted to process this file through TeX and print the + results, provided the printed document carries copying permission + notice identical to this one except for the removal of this paragraph + (this paragraph not being relevant to the printed manual). + . + Permission is granted to copy and distribute modified versions of this + manual under the conditions for verbatim copying, provided that the entire + resulting derived work is distributed under the terms of a permission + notice identical to this one. + . + Permission is granted to copy and distribute translations of this manual + into another language, under the above conditions for modified versions, + except that this permission notice may be stated in a translation approved + by the author. + +Files: doc/texinfo.tex + lib/et/texinfo.tex +Copyright: 1985-2006 Free Software Foundation, Inc. +License: GPL-2+ with Texinfo exception + This texinfo.tex 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, or (at + your option) any later version. + . + This texinfo.tex file 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 texinfo.tex file; see the file COPYING. If not, write + to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + . + As a special exception, when this file is read by TeX when processing + a Texinfo source document, you may use the result without + restriction. (This has been our intent since Texinfo was invented.) + +License: Apache-2 + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + . + http://www.apache.org/licenses/LICENSE-2.0 + . + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +Comment: + On Debian systems, the complete text of the Apache License, Version 2.0 + can be found in "/usr/share/common-licenses/Apache-2.0". + +License: BSD-3-Clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + . + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE. + +License: GPL-2 + This program is free software; you can redistribute it and/or modify + it under the terms version 2 of the GNU General Public License + as published by the Free Software Foundation. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . +Comment: + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". + +License: LGPL-2 + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; version 2 of the License. + . + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + . + You should have received a copy of the GNU Library General Public License + along with this library. If not, see . +Comment: + On Debian systems, the complete text of the GNU Library General + Public License version 2 can be found in "/usr/share/common-licenses/LGPL-2". diff --git a/src/_nfdos/e2fsprogs/debian/e2fsck-static.install b/src/_nfdos/e2fsprogs/debian/e2fsck-static.install new file mode 100644 index 0000000..15a7716 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsck-static.install @@ -0,0 +1,2 @@ +/sbin/e2fsck.static +/usr/share/man/man8/e2fsck.static* diff --git a/src/_nfdos/e2fsprogs/debian/e2fsck-static.preinst b/src/_nfdos/e2fsprogs/debian/e2fsck-static.preinst new file mode 100644 index 0000000..e756ade --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsck-static.preinst @@ -0,0 +1,19 @@ +#!/bin/sh + +# Abort on error. +set -e + +PKG=e2fsck-static +DOCLNK=/usr/share/doc/$PKG +if test "$1" = upgrade \ + -a -L $DOCLNK +then + rm $DOCLNK +fi + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/e2fsprogs-l10n.install b/src/_nfdos/e2fsprogs/debian/e2fsprogs-l10n.install new file mode 100644 index 0000000..3635480 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsprogs-l10n.install @@ -0,0 +1 @@ +usr/share/locale diff --git a/src/_nfdos/e2fsprogs/debian/e2fsprogs-udeb.install b/src/_nfdos/e2fsprogs/debian/e2fsprogs-udeb.install new file mode 100644 index 0000000..a6d6867 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsprogs-udeb.install @@ -0,0 +1,11 @@ +etc/mke2fs.conf +lib/*/lib*.so.* +sbin/badblocks +sbin/e2fsck +sbin/mke2fs +sbin/resize2fs +sbin/tune2fs +sbin/e2label +sbin/e2mmpstatus +sbin/fsck.ext? +sbin/mkfs.ext? diff --git a/src/_nfdos/e2fsprogs/debian/e2fsprogs-udeb.lintian-overrides b/src/_nfdos/e2fsprogs/debian/e2fsprogs-udeb.lintian-overrides new file mode 100644 index 0000000..683a11f --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsprogs-udeb.lintian-overrides @@ -0,0 +1,2 @@ +e2fsprogs-udeb udeb: package-name-doesnt-match-sonames libcom-err2 libe2p2 libext2fs2 libss2 + diff --git a/src/_nfdos/e2fsprogs/debian/e2fsprogs-udeb.shlibs.local b/src/_nfdos/e2fsprogs/debian/e2fsprogs-udeb.shlibs.local new file mode 100644 index 0000000..b41b583 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsprogs-udeb.shlibs.local @@ -0,0 +1,6 @@ +libblkid 1 libblkid1-udeb +# force the dependency to libblkid1-udeb, even if it don't include the lib +libcom_err 2 libblkid1-udeb +libuuid 1 libuuid1-udeb +libext2fs 2 libblkid1-udeb +libe2p 2 libblkid1-udeb diff --git a/src/_nfdos/e2fsprogs/debian/e2fsprogs.docs b/src/_nfdos/e2fsprogs/debian/e2fsprogs.docs new file mode 100644 index 0000000..e845566 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsprogs.docs @@ -0,0 +1 @@ +README diff --git a/src/_nfdos/e2fsprogs/debian/e2fsprogs.install b/src/_nfdos/e2fsprogs/debian/e2fsprogs.install new file mode 100755 index 0000000..8cf07a6 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsprogs.install @@ -0,0 +1,53 @@ +#!/usr/bin/dh-exec +sbin/badblocks +sbin/debugfs +sbin/dumpe2fs +sbin/e2fsck +sbin/e2image +sbin/e2label +sbin/e2mmpstatus +[linux-any] sbin/e2scrub +[linux-any] sbin/e2scrub_all +sbin/e2undo +sbin/fsck.ext? +sbin/mke2fs +sbin/mkfs.ext? +sbin/resize2fs +sbin/tune2fs +usr/bin/chattr +usr/bin/lsattr +[linux-any] usr/lib/*/e2fsprogs/e2scrub_all_cron +[linux-any] usr/lib/*/e2fsprogs/e2scrub_fail +usr/sbin/e2freefrag +[linux-any] usr/sbin/e4crypt +[linux-any] usr/sbin/e4defrag +usr/sbin/filefrag +usr/sbin/mklost+found +usr/share/man/man1/chattr.1 +usr/share/man/man1/lsattr.1 +usr/share/man/man5/e2fsck.conf.5 +usr/share/man/man5/ext?.5 +usr/share/man/man5/mke2fs.conf.5 +usr/share/man/man8/badblocks.8 +usr/share/man/man8/debugfs.8 +usr/share/man/man8/dumpe2fs.8 +usr/share/man/man8/e2freefrag.8 +usr/share/man/man8/e2fsck.8 +usr/share/man/man8/e2image.8 +usr/share/man/man8/e2label.8 +usr/share/man/man8/e2mmpstatus.8 +[linux-any] usr/share/man/man8/e2scrub.8 +[linux-any] usr/share/man/man8/e2scrub_all.8 +usr/share/man/man8/e2undo.8 +[linux-any] usr/share/man/man8/e4crypt.8 +[linux-any] usr/share/man/man8/e4defrag.8 +usr/share/man/man8/filefrag.8 +usr/share/man/man8/fsck.ext?.8 +usr/share/man/man8/mke2fs.8 +usr/share/man/man8/mkfs.ext?.8 +usr/share/man/man8/mklost+found.8 +usr/share/man/man8/resize2fs.8 +usr/share/man/man8/tune2fs.8 +etc +[linux-any] lib/udev/rules.d +[linux-any] lib/systemd/system diff --git a/src/_nfdos/e2fsprogs/debian/e2fsprogs.lintian-overrides b/src/_nfdos/e2fsprogs/debian/e2fsprogs.lintian-overrides new file mode 100644 index 0000000..b40d113 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsprogs.lintian-overrides @@ -0,0 +1 @@ +e2fsprogs: package-supports-alternative-init-but-no-init.d-script diff --git a/src/_nfdos/e2fsprogs/debian/e2fsprogs.postinst b/src/_nfdos/e2fsprogs/debian/e2fsprogs.postinst new file mode 100644 index 0000000..00ac363 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsprogs.postinst @@ -0,0 +1,13 @@ +#!/bin/sh + +# Abort on error. +set -e + +if [ -x /usr/sbin/update-initramfs -a \ + -e /etc/initramfs-tools/initramfs.conf ]; then + update-initramfs -u +fi + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/e2fsprogs.postinst.dh9 b/src/_nfdos/e2fsprogs/debian/e2fsprogs.postinst.dh9 new file mode 100644 index 0000000..e7acb0e --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsprogs.postinst.dh9 @@ -0,0 +1,32 @@ +#!/bin/sh + +# Abort on error. +set -e + +if [ -x /usr/sbin/update-initramfs -a \ + -e /etc/initramfs-tools/initramfs.conf ]; then + update-initramfs -u +fi + +#DEBHELPER# + +# debhelper doesn't know what timers are... +update_svc() { + deb-systemd-helper unmask "$1" >/dev/null || true + + if deb-systemd-helper --quiet was-enabled "$1"; then + deb-systemd-helper enable "$1" >/dev/null || true + else + deb-systemd-helper update-state "$1" >/dev/null || true + fi +} +update_svc e2scrub_all.timer +update_svc e2scrub_reap.service + +# Start our new services +if [ -d /run/systemd/system ]; then + systemctl --system daemon-reload >/dev/null || true + deb-systemd-invoke start e2scrub_all.timer >/dev/null || true +fi + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/e2fsprogs.postrm.dh9 b/src/_nfdos/e2fsprogs/debian/e2fsprogs.postrm.dh9 new file mode 100644 index 0000000..32cb642 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsprogs.postrm.dh9 @@ -0,0 +1,35 @@ +#!/bin/sh + +update_svc() { + deb-systemd-helper mask "$1" >/dev/null || true + + if deb-systemd-helper --quiet was-enabled "$1"; then + # Enables the unit on first installation, creates new + # symlinks on upgrades if the unit file has changed. + deb-systemd-helper disable "$1" >/dev/null || true + fi +} + +if [ "$1" != "upgrade" ]; then + # Abort on error. + set -e + + if [ -x /usr/sbin/update-initramfs -a \ + -e /etc/initramfs-tools/initramfs.conf ]; then + update-initramfs -u + fi + + #DEBHELPER# + + # debhelper doesn't know what timers are... + update_svc e2scrub_all.timer + update_svc e2scrub_reap.service + + # Start our new services + if [ -d /run/systemd/system ]; then + deb-systemd-invoke stop e2scrub_all.timer >/dev/null || true + fi +fi + +exit 0 + diff --git a/src/_nfdos/e2fsprogs/debian/e2fsprogs.preinst b/src/_nfdos/e2fsprogs/debian/e2fsprogs.preinst new file mode 100644 index 0000000..bfa9f6b --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsprogs.preinst @@ -0,0 +1,19 @@ +#!/bin/sh + +# Abort on error. +set -e + +PKG=e2fsprogs +DOCLNK=/usr/share/doc/$PKG +if test "$1" = upgrade \ + -a -L $DOCLNK +then + rm $DOCLNK +fi + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/e2fsprogs.shlibs.local b/src/_nfdos/e2fsprogs/debian/e2fsprogs.shlibs.local new file mode 100644 index 0000000..a99d2a0 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/e2fsprogs.shlibs.local @@ -0,0 +1,2 @@ +libext2fs 2 libext2fs2 (= ${binary:Version}) +libe2p 2 libext2fs2 (= ${binary:Version}) diff --git a/src/_nfdos/e2fsprogs/debian/fuse2fs.install b/src/_nfdos/e2fsprogs/debian/fuse2fs.install new file mode 100644 index 0000000..2ed4c3c --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/fuse2fs.install @@ -0,0 +1,2 @@ +/usr/bin/fuse2fs +/usr/share/man/man1/fuse2fs.1 diff --git a/src/_nfdos/e2fsprogs/debian/gbp.conf b/src/_nfdos/e2fsprogs/debian/gbp.conf new file mode 100644 index 0000000..c974add --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/gbp.conf @@ -0,0 +1,4 @@ +[DEFAULT] +pristine-tar = True +upstream-tag='v%(version)s' +debian-branch=debian/master diff --git a/src/_nfdos/e2fsprogs/debian/libblkid-dev.install b/src/_nfdos/e2fsprogs/debian/libblkid-dev.install new file mode 100644 index 0000000..7b3da36 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libblkid-dev.install @@ -0,0 +1,4 @@ +usr/lib/*/libblkid*.so.* +usr/include/blkid +usr/share/man/man3/libblkid.3 +usr/lib/*/pkgconfig/blkid.pc diff --git a/src/_nfdos/e2fsprogs/debian/libblkid1.install b/src/_nfdos/e2fsprogs/debian/libblkid1.install new file mode 100644 index 0000000..54ef86d --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libblkid1.install @@ -0,0 +1 @@ +lib/*/libblkid*.so.* diff --git a/src/_nfdos/e2fsprogs/debian/libblkid1.symbols b/src/_nfdos/e2fsprogs/debian/libblkid1.symbols new file mode 100644 index 0000000..5ab91f5 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libblkid1.symbols @@ -0,0 +1,41 @@ +libblkid.so.1 libblkid1 #MINVER# + blkid__scan_dir@Base 1.41.1 + blkid_debug_mask@Base 1.33 + blkid_dev_devname@Base 1.33 + blkid_dev_has_tag@Base 1.38 + blkid_dev_iterate_begin@Base 1.33 + blkid_dev_iterate_end@Base 1.33 + blkid_dev_next@Base 1.33 + blkid_dev_set_search@Base 1.38 +#MISSING: 1.41.1# blkid_devdirs@Base 1.34 + blkid_devno_to_devname@Base 1.33 + blkid_find_dev_with_tag@Base 1.33 + blkid_find_tag_dev@Base 1.33 + blkid_flush_cache@Base 1.33 + blkid_free_dev@Base 1.33 + blkid_free_tag@Base 1.33 + blkid_gc_cache@Base 1.40 + blkid_get_cache@Base 1.33 + blkid_get_dev@Base 1.33 + blkid_get_dev_size@Base 1.33 + blkid_get_devname@Base 1.33 + blkid_get_library_version@Base 1.37 + blkid_get_tag_value@Base 1.33 + blkid_known_fstype@Base 1.34 + blkid_llseek@Base 1.33 + blkid_new_dev@Base 1.33 + blkid_parse_tag_string@Base 1.33 + blkid_parse_version_string@Base 1.37 + blkid_probe_all@Base 1.33 + blkid_probe_all_new@Base 1.38 + blkid_put_cache@Base 1.33 + blkid_read_cache@Base 1.33 + blkid_set_tag@Base 1.33 + blkid_strdup@Base 1.33 + blkid_strndup@Base 1.33 + blkid_tag_iterate_begin@Base 1.33 + blkid_tag_iterate_end@Base 1.33 + blkid_tag_next@Base 1.33 + blkid_verify@Base 1.37 +#MISSING: 1.40.7# check_for_modules@Base 1.40.6 +#MISSING: 1.40.7# fs_proc_check@Base 1.40.6 diff --git a/src/_nfdos/e2fsprogs/debian/libcom-err2.install b/src/_nfdos/e2fsprogs/debian/libcom-err2.install new file mode 100644 index 0000000..16b039e --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libcom-err2.install @@ -0,0 +1 @@ +lib/*/libcom_err*.so.* diff --git a/src/_nfdos/e2fsprogs/debian/libcom-err2.symbols b/src/_nfdos/e2fsprogs/debian/libcom-err2.symbols new file mode 100644 index 0000000..1c96fa5 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libcom-err2.symbols @@ -0,0 +1,22 @@ +libcom_err.so.2 libcom-err2 #MINVER# +* Build-Depends-Package: comerr-dev + _et_dynamic_list@Base 1.43.9 + _et_list@Base 1.43.9 + add_error_table@Base 1.43.9 + add_to_error_table@Base 1.43.9 + com_err@Base 1.43.9 + com_err_hook@Base 1.43.9 + com_err_va@Base 1.43.9 + com_right@Base 1.43.9 + com_right_r@Base 1.43.9 + error_message@Base 1.43.9 + error_table_name@Base 1.43.9 + et_list_lock@Base 1.43.9 + et_list_unlock@Base 1.43.9 + free_error_table@Base 1.43.9 + init_error_table@Base 1.43.9 + initialize_error_table_r@Base 1.43.9 + remove_error_table@Base 1.43.9 + reset_com_err_hook@Base 1.43.9 + set_com_err_gettext@Base 1.43.9 + set_com_err_hook@Base 1.43.9 diff --git a/src/_nfdos/e2fsprogs/debian/libext2fs-dev.doc-base b/src/_nfdos/e2fsprogs/debian/libext2fs-dev.doc-base new file mode 100644 index 0000000..b115117 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libext2fs-dev.doc-base @@ -0,0 +1,10 @@ +Document: libext2fs +Title: The EXT2FS library +Author: Theodore Ts'o +Abstract: The EXT2FS library is designed to allow + user-level programs to manipulate an ext2 filesystem. +Section: Programming + +Format: HTML +Index: /usr/share/doc/libext2fs2/html-info/libext2fs.html +Files: /usr/share/doc/libext2fs2/html-info/*.html diff --git a/src/_nfdos/e2fsprogs/debian/libext2fs-dev.install b/src/_nfdos/e2fsprogs/debian/libext2fs-dev.install new file mode 100644 index 0000000..b2cd6c9 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libext2fs-dev.install @@ -0,0 +1,9 @@ +usr/lib/*/libext2fs*.so +usr/lib/*/libext2fs*.a +usr/lib/*/libe2p*.so +usr/lib/*/libe2p*.a +usr/include/ext2fs +usr/include/e2p +usr/share/info/libext2fs.info* +usr/lib/*/pkgconfig/e2p.pc +usr/lib/*/pkgconfig/ext2fs.pc diff --git a/src/_nfdos/e2fsprogs/debian/libext2fs2.install b/src/_nfdos/e2fsprogs/debian/libext2fs2.install new file mode 100644 index 0000000..11198f7 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libext2fs2.install @@ -0,0 +1,2 @@ +lib/*/libext2fs*.so.* +lib/*/libe2p*.so.* diff --git a/src/_nfdos/e2fsprogs/debian/libext2fs2.symbols b/src/_nfdos/e2fsprogs/debian/libext2fs2.symbols new file mode 100644 index 0000000..6a97cf1 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libext2fs2.symbols @@ -0,0 +1,707 @@ +libe2p.so.2 libext2fs2 #MINVER# +* Build-Depends-Package: libext2fs-dev + e2p_edit_feature2@Base 1.40.7 + e2p_edit_feature@Base 1.37 + e2p_edit_mntopts@Base 1.37 + e2p_encmode2string@Base 1.43 + e2p_encoding2str@Base 1.45.1 + e2p_errcode2str@Base 1.46.0 + e2p_feature2string@Base 1.37 + e2p_feature_to_string@Base 1.45.6 + e2p_get_encoding_flags@Base 1.45 + e2p_hash2string@Base 1.37 + e2p_is_null_uuid@Base 1.37 + e2p_jrnl_feature2string@Base 1.41.1 + e2p_jrnl_string2feature@Base 1.41.1 + e2p_list_journal_super@Base 1.43.5 + e2p_mntopt2string@Base 1.37 + e2p_os2string@Base 1.37 + e2p_percent@Base 1.40 + e2p_str2encoding@Base 1.45 + e2p_str2encoding_flags@Base 1.45 + e2p_string2encmode@Base 1.43 + e2p_string2feature@Base 1.37 + e2p_string2hash@Base 1.37 + e2p_string2mntopt@Base 1.37 + e2p_string2os@Base 1.37 + e2p_uuid2str@Base 1.37 + e2p_uuid_to_str@Base 1.37 + fgetflags@Base 1.37 + fgetproject@Base 1.43 + fgetversion@Base 1.37 + fsetflags@Base 1.37 + fsetproject@Base 1.43 + fsetversion@Base 1.37 + getflags@Base 1.37 + getversion@Base 1.37 + iterate_on_dir@Base 1.37 + list_super2@Base 1.37 + list_super@Base 1.37 + parse_num_blocks2@Base 1.42 + parse_num_blocks@Base 1.37 + print_flags@Base 1.37 + print_fs_errors@Base 1.37 + print_fs_state@Base 1.37 + setflags@Base 1.37 + setversion@Base 1.37 +libext2fs.so.2 libext2fs2 #MINVER# +* Build-Depends-Package: libext2fs-dev + badblocks_list_add@Base 1.37 + badblocks_list_create@Base 1.37 + badblocks_list_free@Base 1.37 + badblocks_list_iterate@Base 1.37 + badblocks_list_iterate_begin@Base 1.37 + badblocks_list_iterate_end@Base 1.37 + badblocks_list_test@Base 1.37 + et_ext2_error_table@Base 1.37 + ext2fs_add_dir_block2@Base 1.42 + ext2fs_add_dir_block@Base 1.37 + ext2fs_add_exit_fn@Base 1.43 + ext2fs_add_journal_device@Base 1.37 + ext2fs_add_journal_inode2@Base 1.42.9-3~ + ext2fs_add_journal_inode3@Base 1.46.0 + ext2fs_add_journal_inode@Base 1.37 + ext2fs_adjust_ea_refcount2@Base 1.42 + ext2fs_adjust_ea_refcount3@Base 1.43 + ext2fs_adjust_ea_refcount@Base 1.37 + ext2fs_alloc_block2@Base 1.42 + ext2fs_alloc_block3@Base 1.44.0~rc1 + ext2fs_alloc_block@Base 1.37 + ext2fs_alloc_generic_bmap@Base 1.42 + ext2fs_alloc_range@Base 1.43 + ext2fs_allocate_block_bitmap@Base 1.37 + ext2fs_allocate_generic_bitmap@Base 1.37 + ext2fs_allocate_group_table@Base 1.37 + ext2fs_allocate_inode_bitmap@Base 1.37 + ext2fs_allocate_subcluster_bitmap@Base 1.42 + ext2fs_allocate_tables@Base 1.37 + ext2fs_badblocks_copy@Base 1.37 + ext2fs_badblocks_equal@Base 1.37 + ext2fs_badblocks_list_add@Base 1.37 + ext2fs_badblocks_list_create@Base 1.37 + ext2fs_badblocks_list_del@Base 1.37 + ext2fs_badblocks_list_free@Base 1.37 + ext2fs_badblocks_list_iterate@Base 1.37 + ext2fs_badblocks_list_iterate_begin@Base 1.37 + ext2fs_badblocks_list_iterate_end@Base 1.37 + ext2fs_badblocks_list_test@Base 1.37 + ext2fs_bg_checksum@Base 1.42 + ext2fs_bg_checksum_set@Base 1.42 + ext2fs_bg_flags@Base 1.42 + ext2fs_bg_flags_clear@Base 1.42 + ext2fs_bg_flags_set@Base 1.42 + ext2fs_bg_flags_test@Base 1.42 + ext2fs_bg_flags_zap@Base 1.42 + ext2fs_bg_free_blocks_count@Base 1.42 + ext2fs_bg_free_blocks_count_set@Base 1.42 + ext2fs_bg_free_inodes_count@Base 1.42 + ext2fs_bg_free_inodes_count_set@Base 1.42 + ext2fs_bg_has_super@Base 1.37 + ext2fs_bg_itable_unused@Base 1.42 + ext2fs_bg_itable_unused_set@Base 1.42 + ext2fs_bg_used_dirs_count@Base 1.42 + ext2fs_bg_used_dirs_count_set@Base 1.42 + ext2fs_bitcount@Base 1.42.7 + ext2fs_blkmap64_bitarray@Base 1.42 + ext2fs_blkmap64_rbtree@Base 1.42.1 + ext2fs_block_alloc_stats2@Base 1.42 + ext2fs_block_alloc_stats@Base 1.37 + ext2fs_block_alloc_stats_range@Base 1.42.9-3~ + ext2fs_block_bitmap_checksum@Base 1.43 + ext2fs_block_bitmap_csum_set@Base 1.43 + ext2fs_block_bitmap_csum_verify@Base 1.43 + ext2fs_block_bitmap_loc@Base 1.42 + ext2fs_block_bitmap_loc_set@Base 1.42 + ext2fs_block_iterate2@Base 1.37 + ext2fs_block_iterate3@Base 1.42 + ext2fs_block_iterate@Base 1.37 + ext2fs_blocks_count@Base 1.42 + ext2fs_blocks_count_add@Base 1.42 + ext2fs_blocks_count_set@Base 1.42 + ext2fs_bmap2@Base 1.41.0 + ext2fs_bmap@Base 1.37 + ext2fs_calculate_summary_stats@Base 1.46.0 + ext2fs_casefold_cmp@Base 1.46.0 + ext2fs_check_desc@Base 1.37 + ext2fs_check_directory@Base 1.37 + ext2fs_check_encoded_name@Base 1.46.0 + ext2fs_check_if_mounted@Base 1.37 + ext2fs_check_mount_point@Base 1.37 + ext2fs_clear_bit64@Base 1.42 + ext2fs_clear_bit@Base 1.37 + ext2fs_clear_block_bitmap@Base 1.37 + ext2fs_clear_block_uninit@Base 1.43 + ext2fs_clear_generic_bitmap@Base 1.41.0 + ext2fs_clear_generic_bmap@Base 1.42 + ext2fs_clear_inode_bitmap@Base 1.37 + ext2fs_close2@Base 1.42 + ext2fs_close@Base 1.37 + ext2fs_close_free@Base 1.42.11 + ext2fs_close_inode_scan@Base 1.37 + ext2fs_compare_block_bitmap@Base 1.37 + ext2fs_compare_generic_bitmap@Base 1.41.0 + ext2fs_compare_generic_bmap@Base 1.42 + ext2fs_compare_inode_bitmap@Base 1.37 + ext2fs_const_inode@Base 1.43 + ext2fs_convert_subcluster_bitmap@Base 1.42 + ext2fs_copy_bitmap@Base 1.37 + ext2fs_copy_dblist@Base 1.37 + ext2fs_copy_generic_bitmap@Base 1.41.0 + ext2fs_copy_generic_bmap@Base 1.42 + ext2fs_count_blocks@Base 1.46.0 + ext2fs_count_used_clusters@Base 1.46.0 + ext2fs_crc16@Base 1.41.1 + ext2fs_crc32_be@Base 1.43 + ext2fs_crc32c_le@Base 1.42 + ext2fs_create_icount2@Base 1.37 + ext2fs_create_icount@Base 1.37 + ext2fs_create_icount_tdb@Base 1.40 + ext2fs_create_inode_cache@Base 1.43 + ext2fs_create_journal_superblock2@Base 1.46.0 + ext2fs_create_journal_superblock@Base 1.37 + ext2fs_create_orphan_file@Base 1.47.0 + ext2fs_create_resize_inode@Base 1.37 + ext2fs_dblist_count2@Base 1.42 + ext2fs_dblist_count@Base 1.37 + ext2fs_dblist_dir_iterate@Base 1.37 + ext2fs_dblist_drop_last@Base 1.40.8 + ext2fs_dblist_get_last2@Base 1.42 + ext2fs_dblist_get_last@Base 1.40.8 + ext2fs_dblist_iterate2@Base 1.42 + ext2fs_dblist_iterate3@Base 1.43 + ext2fs_dblist_iterate@Base 1.37 + ext2fs_dblist_sort2@Base 1.42 + ext2fs_dblist_sort@Base 1.37 + ext2fs_decode_extent@Base 1.46.0 + ext2fs_default_journal_size@Base 1.40 + ext2fs_default_orphan_file_blocks@Base 1.47.0 + ext2fs_descriptor_block_loc2@Base 1.42 + ext2fs_descriptor_block_loc@Base 1.37 + ext2fs_dir_block_csum_set@Base 1.43 + ext2fs_dir_block_csum_verify@Base 1.43 + ext2fs_dir_iterate2@Base 1.37 + ext2fs_dir_iterate@Base 1.37 + ext2fs_dirent_csum_verify@Base 1.43 + ext2fs_dirent_file_type@Base 1.43 + ext2fs_dirent_has_tail@Base 1.43 + ext2fs_dirent_name_len@Base 1.43 + ext2fs_dirent_set_file_type@Base 1.43 + ext2fs_dirent_set_name_len@Base 1.43 + ext2fs_dirent_swab_in2@Base 1.43 + ext2fs_dirent_swab_in@Base 1.43 + ext2fs_dirent_swab_out2@Base 1.43 + ext2fs_dirent_swab_out@Base 1.43 + ext2fs_dirhash2@Base 1.45 + ext2fs_dirhash@Base 1.37 + ext2fs_div64_ceil@Base 1.42 + ext2fs_div_ceil@Base 1.40 + ext2fs_djb2_hash@Base 1.44.3~rc1 + ext2fs_do_orphan_file_block_csum@Base 1.47.0 + ext2fs_dup_handle@Base 1.37 + ext2fs_dx_csum@Base 1.46~WIP.2019.10.09 + ext2fs_expand_dir@Base 1.37 + ext2fs_ext_attr_block_csum_set@Base 1.43 + ext2fs_ext_attr_block_csum_verify@Base 1.43 + ext2fs_ext_attr_block_rehash@Base 1.44.0~rc1 + ext2fs_ext_attr_hash_entry2@Base 1.44.0~rc1 + ext2fs_ext_attr_hash_entry3@Base 1.46.6 + ext2fs_ext_attr_hash_entry@Base 1.41.0 + ext2fs_ext_attr_hash_entry_signed@Base 1.46.6 + ext2fs_extent_block_csum_set@Base 1.43 + ext2fs_extent_block_csum_verify@Base 1.43 + ext2fs_extent_delete@Base 1.41.0 + ext2fs_extent_fix_parents@Base 1.42.7 + ext2fs_extent_free@Base 1.41.0 + ext2fs_extent_get@Base 1.41.0 + ext2fs_extent_get_info@Base 1.41.0 + ext2fs_extent_goto2@Base 1.42.7 + ext2fs_extent_goto@Base 1.41.0 + ext2fs_extent_header_verify@Base 1.41.0 + ext2fs_extent_insert@Base 1.41.0 + ext2fs_extent_node_split@Base 1.42.7 + ext2fs_extent_open2@Base 1.41.6 + ext2fs_extent_open@Base 1.41.0 + ext2fs_extent_replace@Base 1.41.0 + ext2fs_extent_set_bmap@Base 1.41.0 + ext2fs_fallocate@Base 1.43 + ext2fs_fast_clear_bit64@Base 1.42 + ext2fs_fast_clear_bit@Base 1.39 + ext2fs_fast_mark_block_bitmap2@Base 1.42 + ext2fs_fast_mark_block_bitmap@Base 1.37 + ext2fs_fast_mark_block_bitmap_range2@Base 1.42 + ext2fs_fast_mark_block_bitmap_range@Base 1.37 + ext2fs_fast_mark_inode_bitmap2@Base 1.42 + ext2fs_fast_mark_inode_bitmap@Base 1.37 + ext2fs_fast_set_bit64@Base 1.42 + ext2fs_fast_set_bit@Base 1.39 + ext2fs_fast_test_block_bitmap2@Base 1.42 + ext2fs_fast_test_block_bitmap@Base 1.37 + ext2fs_fast_test_block_bitmap_range2@Base 1.42 + ext2fs_fast_test_block_bitmap_range@Base 1.37 + ext2fs_fast_test_inode_bitmap2@Base 1.42 + ext2fs_fast_test_inode_bitmap@Base 1.37 + ext2fs_fast_unmark_block_bitmap2@Base 1.42 + ext2fs_fast_unmark_block_bitmap@Base 1.37 + ext2fs_fast_unmark_block_bitmap_range2@Base 1.42 + ext2fs_fast_unmark_block_bitmap_range@Base 1.37 + ext2fs_fast_unmark_inode_bitmap2@Base 1.42 + ext2fs_fast_unmark_inode_bitmap@Base 1.37 + ext2fs_file_acl_block@Base 1.42 + ext2fs_file_acl_block_set@Base 1.42 + ext2fs_file_block_offset_too_big@Base 1.42.9 + ext2fs_file_close@Base 1.37 + ext2fs_file_flush@Base 1.37 + ext2fs_file_get_fs@Base 1.37 + ext2fs_file_get_inode@Base 1.42 + ext2fs_file_get_inode_num@Base 1.42.1 + ext2fs_file_get_lsize@Base 1.37 + ext2fs_file_get_size@Base 1.37 + ext2fs_file_llseek@Base 1.37 + ext2fs_load_nls_table@Base 1.45.1 + ext2fs_file_lseek@Base 1.37 + ext2fs_file_open2@Base 1.37 + ext2fs_file_open@Base 1.37 + ext2fs_file_read@Base 1.37 + ext2fs_file_set_size2@Base 1.42 + ext2fs_file_set_size@Base 1.37 + ext2fs_file_write@Base 1.37 + ext2fs_find_block_device@Base 1.37 + ext2fs_find_first_set_block_bitmap2@Base 1.42.9-3~ + ext2fs_find_first_set_generic_bitmap@Base 1.42.9-3~ + ext2fs_find_first_set_generic_bmap@Base 1.42.9-3~ + ext2fs_find_first_set_inode_bitmap2@Base 1.42.9-3~ + ext2fs_find_first_zero_block_bitmap2@Base 1.42.2 + ext2fs_find_first_zero_generic_bitmap@Base 1.42.3 + ext2fs_find_first_zero_generic_bmap@Base 1.42.2 + ext2fs_find_first_zero_inode_bitmap2@Base 1.42.2 + ext2fs_find_inode_goal@Base 1.43 + ext2fs_fix_extents_checksums@Base 1.45 + ext2fs_flush2@Base 1.42 + ext2fs_flush@Base 1.37 + ext2fs_flush_icache@Base 1.37 + ext2fs_follow_link@Base 1.37 + ext2fs_free@Base 1.37 + ext2fs_free_block_bitmap@Base 1.37 + ext2fs_free_blocks_count@Base 1.42 + ext2fs_free_blocks_count_add@Base 1.42 + ext2fs_free_blocks_count_set@Base 1.42 + ext2fs_free_dblist@Base 1.37 + ext2fs_free_ext_attr@Base 1.43 + ext2fs_free_generic_bitmap@Base 1.37 + ext2fs_free_generic_bmap@Base 1.42 + ext2fs_free_icount@Base 1.37 + ext2fs_free_inode_bitmap@Base 1.37 + ext2fs_free_inode_cache@Base 1.43 + ext2fs_free_mem@Base 1.37 + ext2fs_fstat@Base 1.42 + ext2fs_fudge_block_bitmap_end2@Base 1.42 + ext2fs_fudge_block_bitmap_end@Base 1.37 + ext2fs_fudge_generic_bitmap_end@Base 1.41.0 + ext2fs_fudge_generic_bmap_end@Base 1.42 + ext2fs_fudge_inode_bitmap_end@Base 1.37 + ext2fs_get_array@Base 1.40.3 + ext2fs_get_arrayzero@Base 1.42 + ext2fs_get_bitmap_granularity@Base 1.42 + ext2fs_get_block_bitmap_end2@Base 1.42 + ext2fs_get_block_bitmap_end@Base 1.37 + ext2fs_get_block_bitmap_range2@Base 1.42 + ext2fs_get_block_bitmap_range@Base 1.41.0 + ext2fs_get_block_bitmap_start2@Base 1.42 + ext2fs_get_block_bitmap_start@Base 1.37 + ext2fs_get_blocks@Base 1.37 + ext2fs_get_data_io@Base 1.37 + ext2fs_get_device_phys_sectsize@Base 1.41.12 + ext2fs_get_device_sectsize@Base 1.37 + ext2fs_get_device_size2@Base 1.41.4 + ext2fs_get_device_size@Base 1.37 + ext2fs_get_dio_alignment@Base 1.42.3 + ext2fs_get_dx_countlimit@Base 1.43 + ext2fs_get_ea_inode_hash@Base 1.44.0~rc1 + ext2fs_get_ea_inode_ref@Base 1.44.0~rc1 + ext2fs_get_free_blocks2@Base 1.42 + ext2fs_get_free_blocks@Base 1.37 + ext2fs_get_generic_bitmap_end@Base 1.41.0 + ext2fs_get_generic_bitmap_range@Base 1.41.0 + ext2fs_get_generic_bitmap_start@Base 1.41.0 + ext2fs_get_generic_bmap_end@Base 1.42 + ext2fs_get_generic_bmap_range@Base 1.42 + ext2fs_get_generic_bmap_start@Base 1.42 + ext2fs_get_icount_size@Base 1.37 + ext2fs_get_inode_bitmap_end2@Base 1.42 + ext2fs_get_inode_bitmap_end@Base 1.37 + ext2fs_get_inode_bitmap_range2@Base 1.42 + ext2fs_get_inode_bitmap_range@Base 1.41.0 + ext2fs_get_inode_bitmap_start2@Base 1.42 + ext2fs_get_inode_bitmap_start@Base 1.37 + ext2fs_get_journal_params@Base 1.46.0 + ext2fs_get_library_version@Base 1.37 + ext2fs_get_mem@Base 1.37 + ext2fs_get_memalign@Base 1.41.13 + ext2fs_get_memzero@Base 1.42 + ext2fs_get_next_inode@Base 1.37 + ext2fs_get_next_inode_full@Base 1.37 + ext2fs_get_num_dirs@Base 1.37 + ext2fs_get_pathname@Base 1.37 + ext2fs_get_rec_len@Base 1.41.7 + ext2fs_get_stat_i_blocks@Base 1.45.5 + ext2fs_group_blocks_count@Base 1.42 + ext2fs_group_desc@Base 1.42 + ext2fs_group_desc_csum@Base 1.42.2 + ext2fs_group_desc_csum_set@Base 1.41.0 + ext2fs_group_desc_csum_verify@Base 1.41.0 + ext2fs_group_first_block2@Base 1.42 + ext2fs_group_first_block@Base 1.40 + ext2fs_group_last_block2@Base 1.42 + ext2fs_group_last_block@Base 1.40 + ext2fs_group_of_blk2@Base 1.42 + ext2fs_group_of_blk@Base 1.37 + ext2fs_group_of_ino@Base 1.37 + ext2fs_hashmap_add@Base 1.44.3~rc1 + ext2fs_hashmap_create@Base 1.44.3~rc1 + ext2fs_hashmap_free@Base 1.44.3~rc1 + ext2fs_hashmap_iter_in_order@Base 1.44.3~rc1 + ext2fs_hashmap_lookup@Base 1.44.3~rc1 + ext2fs_htree_intnode_maxrecs@Base 1.44.0~rc1 + ext2fs_iblk_add_blocks@Base 1.41.0 + ext2fs_iblk_set@Base 1.41.0 + ext2fs_iblk_sub_blocks@Base 1.41.0 + ext2fs_icount_decrement@Base 1.37 + ext2fs_icount_fetch@Base 1.37 + ext2fs_icount_increment@Base 1.37 + ext2fs_icount_store@Base 1.37 + ext2fs_icount_validate@Base 1.37 + ext2fs_image_bitmap_read@Base 1.37 + ext2fs_image_bitmap_write@Base 1.37 + ext2fs_image_inode_read@Base 1.37 + ext2fs_image_inode_write@Base 1.37 + ext2fs_image_super_read@Base 1.37 + ext2fs_image_super_write@Base 1.37 + ext2fs_init_csum_seed@Base 1.43 + ext2fs_init_dblist@Base 1.37 + ext2fs_initialize@Base 1.37 + ext2fs_initialize_dirent_tail@Base 1.43 + ext2fs_inline_data_dir_iterate@Base 1.43 + ext2fs_inline_data_ea_remove@Base 1.43 + ext2fs_inline_data_expand@Base 1.43 + ext2fs_inline_data_get@Base 1.43 + ext2fs_inline_data_init@Base 1.43 + ext2fs_inline_data_set@Base 1.43 + ext2fs_inline_data_size@Base 1.43 + ext2fs_inode@Base 1.43 + ext2fs_inode_alloc_stats2@Base 1.37 + ext2fs_inode_alloc_stats@Base 1.37 + ext2fs_inode_bitmap_checksum@Base 1.43 + ext2fs_inode_bitmap_csum_set@Base 1.43 + ext2fs_inode_bitmap_csum_verify@Base 1.43 + ext2fs_inode_bitmap_loc@Base 1.42 + ext2fs_inode_bitmap_loc_set@Base 1.42 + ext2fs_inode_csum_set@Base 1.43 + ext2fs_inode_csum_verify@Base 1.43 + ext2fs_inode_data_blocks2@Base 1.42 + ext2fs_inode_data_blocks@Base 1.37 + ext2fs_inode_has_valid_blocks2@Base 1.42 + ext2fs_inode_has_valid_blocks@Base 1.37 + ext2fs_inode_i_blocks@Base 1.42 + ext2fs_inode_io_intern2@Base 1.37 + ext2fs_inode_io_intern@Base 1.37 + ext2fs_inode_scan_flags@Base 1.37 + ext2fs_inode_scan_goto_blockgroup@Base 1.37 + ext2fs_inode_size_set@Base 1.42.12 + ext2fs_inode_table_loc@Base 1.42 + ext2fs_inode_table_loc_set@Base 1.42 + ext2fs_inodes_per_orphan_block@Base 1.47.0 + ext2fs_is_fast_symlink@Base 1.44.0~rc1 + ext2fs_journal_sb_start@Base 1.42.12 + ext2fs_link@Base 1.37 + ext2fs_llseek@Base 1.37 + ext2fs_lookup@Base 1.37 + ext2fs_make_generic_bitmap@Base 1.41.0 + ext2fs_map_cluster_block@Base 1.42.9 + ext2fs_mark_bb_dirty@Base 1.37 + ext2fs_mark_block_bitmap2@Base 1.42 + ext2fs_mark_block_bitmap@Base 1.37 + ext2fs_mark_block_bitmap_range2@Base 1.42 + ext2fs_mark_block_bitmap_range@Base 1.37 + ext2fs_mark_changed@Base 1.37 + ext2fs_mark_generic_bitmap@Base 1.37 + ext2fs_mark_generic_bmap@Base 1.42 + ext2fs_mark_ib_dirty@Base 1.37 + ext2fs_mark_inode_bitmap2@Base 1.42 + ext2fs_mark_inode_bitmap@Base 1.37 + ext2fs_mark_super_dirty@Base 1.37 + ext2fs_mark_valid@Base 1.37 + ext2fs_max_extent_depth@Base 1.43 + ext2fs_mem_is_zero@Base 1.42 + ext2fs_mkdir@Base 1.37 + ext2fs_mmp_clear@Base 1.42 + ext2fs_mmp_csum_set@Base 1.43 + ext2fs_mmp_csum_verify@Base 1.43 + ext2fs_mmp_init@Base 1.42 + ext2fs_mmp_new_seq@Base 1.42 + ext2fs_mmp_read@Base 1.42 + ext2fs_mmp_start@Base 1.42 + ext2fs_mmp_stop@Base 1.42 + ext2fs_mmp_update2@Base 1.43 + ext2fs_mmp_update@Base 1.42 + ext2fs_mmp_write@Base 1.42 + ext2fs_namei@Base 1.37 + ext2fs_namei_follow@Base 1.37 + ext2fs_native_flag@Base 1.37 + ext2fs_new_block2@Base 1.42 + ext2fs_new_block3@Base 1.44.0~rc1 + ext2fs_new_block@Base 1.37 + ext2fs_new_dir_block@Base 1.37 + ext2fs_new_dir_inline_data@Base 1.43 + ext2fs_new_inode@Base 1.37 + ext2fs_new_range@Base 1.43 + ext2fs_numeric_progress_close@Base 1.42 + ext2fs_numeric_progress_init@Base 1.42 + ext2fs_numeric_progress_ops@Base 1.43 + ext2fs_numeric_progress_update@Base 1.42 + ext2fs_open2@Base 1.37 + ext2fs_open@Base 1.37 + ext2fs_open_file@Base 1.42 + ext2fs_open_inode_scan@Base 1.37 + ext2fs_orphan_block_tail@Base 1.47.0 + ext2fs_orphan_file_block_csum_set@Base 1.47.0 + ext2fs_orphan_file_block_csum_verify@Base 1.47.0 + ext2fs_parse_version_string@Base 1.37 + ext2fs_process_dir_block@Base 1.37 + ext2fs_punch@Base 1.42 + ext2fs_r_blocks_count@Base 1.42 + ext2fs_r_blocks_count_add@Base 1.42 + ext2fs_r_blocks_count_set@Base 1.42 + ext2fs_rb_erase@Base 1.42.1 + ext2fs_rb_first@Base 1.42.1 + ext2fs_rb_insert_color@Base 1.42.1 + ext2fs_rb_last@Base 1.42.1 + ext2fs_rb_next@Base 1.42.1 + ext2fs_rb_prev@Base 1.42.1 + ext2fs_rb_replace_node@Base 1.42.1 + ext2fs_read_bb_FILE2@Base 1.37 + ext2fs_read_bb_FILE@Base 1.37 + ext2fs_read_bb_inode@Base 1.37 + ext2fs_read_bitmaps@Base 1.37 + ext2fs_read_block_bitmap@Base 1.37 + ext2fs_read_dir_block2@Base 1.37 + ext2fs_read_dir_block3@Base 1.42 + ext2fs_read_dir_block4@Base 1.43 + ext2fs_read_dir_block@Base 1.37 + ext2fs_read_ext_attr2@Base 1.42 + ext2fs_read_ext_attr3@Base 1.43 + ext2fs_read_ext_attr@Base 1.37 + ext2fs_read_ind_block@Base 1.37 + ext2fs_read_inode2@Base 1.45 + ext2fs_read_inode@Base 1.37 + ext2fs_read_inode_bitmap@Base 1.37 + ext2fs_read_inode_full@Base 1.37 + ext2fs_remove_exit_fn@Base 1.43 + ext2fs_reserve_super_and_bgd@Base 1.37 + ext2fs_resize_array@Base 1.45.6 + ext2fs_resize_block_bitmap2@Base 1.42 + ext2fs_resize_block_bitmap@Base 1.37 + ext2fs_resize_generic_bitmap@Base 1.37 + ext2fs_resize_generic_bmap@Base 1.42 + ext2fs_resize_inode_bitmap2@Base 1.42 + ext2fs_resize_inode_bitmap@Base 1.37 + ext2fs_resize_mem@Base 1.37 + ext2fs_rewrite_to_io@Base 1.37 + ext2fs_rw_bitmaps@Base 1.46.0 + ext2fs_set_alloc_block_callback@Base 1.41.0 + ext2fs_set_bit64@Base 1.42 + ext2fs_set_bit@Base 1.37 + ext2fs_set_bitmap_padding@Base 1.37 + ext2fs_set_block_alloc_stats_callback@Base 1.41.0 + ext2fs_set_block_alloc_stats_range_callback@Base 1.43 + ext2fs_set_block_bitmap_range2@Base 1.42 + ext2fs_set_block_bitmap_range@Base 1.41.0 + ext2fs_set_data_io@Base 1.37 + ext2fs_set_dir_block2@Base 1.42 + ext2fs_set_dir_block@Base 1.37 + ext2fs_set_ea_inode_hash@Base 1.44.0~rc1 + ext2fs_set_ea_inode_ref@Base 1.44.0~rc1 + ext2fs_set_gdt_csum@Base 1.41.0 + ext2fs_set_generic_bitmap_padding@Base 1.41.0 + ext2fs_set_generic_bitmap_range@Base 1.41.0 + ext2fs_set_generic_bmap_padding@Base 1.42 + ext2fs_set_generic_bmap_range@Base 1.42 + ext2fs_set_inode_bitmap_range2@Base 1.42 + ext2fs_set_inode_bitmap_range@Base 1.41.0 + ext2fs_set_inode_callback@Base 1.37 + ext2fs_set_new_range_callback@Base 1.43 + ext2fs_set_rec_len@Base 1.41.7 + ext2fs_sha512@Base 1.43 + ext2fs_stat@Base 1.42 + ext2fs_super_and_bgd_loc2@Base 1.42 + ext2fs_super_and_bgd_loc@Base 1.37 + ext2fs_superblock_csum_set@Base 1.43 + ext2fs_superblock_csum_verify@Base 1.43 + ext2fs_swab16@Base 1.37 + ext2fs_swab32@Base 1.37 + ext2fs_swab64@Base 1.40 + ext2fs_swap_ext_attr@Base 1.40 + ext2fs_swap_ext_attr_entry@Base 1.41 + ext2fs_swap_ext_attr_header@Base 1.41 + ext2fs_swap_group_desc2@Base 1.42 + ext2fs_swap_group_desc@Base 1.37 + ext2fs_swap_inode@Base 1.37 + ext2fs_swap_inode_full@Base 1.40 + ext2fs_swap_mmp@Base 1.42 + ext2fs_swap_super@Base 1.37 + ext2fs_symlink@Base 1.42.7 + ext2fs_sync_device@Base 1.37 + ext2fs_tdb_append@Base 1.40 + ext2fs_tdb_chainlock@Base 1.40 + ext2fs_tdb_chainlock_mark@Base 1.40.7 + ext2fs_tdb_chainlock_nonblock@Base 1.40.7 + ext2fs_tdb_chainlock_read@Base 1.40 + ext2fs_tdb_chainlock_unmark@Base 1.40.7 + ext2fs_tdb_chainunlock@Base 1.40 + ext2fs_tdb_chainunlock_read@Base 1.40 + ext2fs_tdb_close@Base 1.40 + ext2fs_tdb_delete@Base 1.40 + ext2fs_tdb_dump_all@Base 1.40 + ext2fs_tdb_enable_seqnum@Base 1.40.7 + ext2fs_tdb_error@Base 1.40 + ext2fs_tdb_errorstr@Base 1.40 + ext2fs_tdb_exists@Base 1.40 + ext2fs_tdb_fd@Base 1.40 + ext2fs_tdb_fetch@Base 1.40 + ext2fs_tdb_firstkey@Base 1.40 + ext2fs_tdb_flush@Base 1.43 + ext2fs_tdb_get_flags@Base 1.40 + ext2fs_tdb_get_logging_private@Base 1.40 + ext2fs_tdb_get_seqnum@Base 1.40 + ext2fs_tdb_hash_size@Base 1.40 + ext2fs_tdb_increment_seqnum_nonblock@Base 1.40.7 + ext2fs_tdb_lock_nonblock@Base 1.40.7 + ext2fs_tdb_lockall@Base 1.40 + ext2fs_tdb_lockall_mark@Base 1.40.7 + ext2fs_tdb_lockall_nonblock@Base 1.40.7 + ext2fs_tdb_lockall_read@Base 1.40 + ext2fs_tdb_lockall_read_nonblock@Base 1.40.7 + ext2fs_tdb_lockall_unmark@Base 1.40.7 + ext2fs_tdb_log_fn@Base 1.40 + ext2fs_tdb_map_size@Base 1.40 + ext2fs_tdb_name@Base 1.40 + ext2fs_tdb_nextkey@Base 1.40 + ext2fs_tdb_open@Base 1.40 + ext2fs_tdb_open_ex@Base 1.40 + ext2fs_tdb_parse_record@Base 1.40 + ext2fs_tdb_printfreelist@Base 1.40 + ext2fs_tdb_reopen@Base 1.40 + ext2fs_tdb_reopen_all@Base 1.40 + ext2fs_tdb_set_logging_function@Base 1.40 + ext2fs_tdb_set_max_dead@Base 1.40 + ext2fs_tdb_store@Base 1.40 + ext2fs_tdb_transaction_cancel@Base 1.40 + ext2fs_tdb_transaction_commit@Base 1.40 + ext2fs_tdb_transaction_recover@Base 1.40 + ext2fs_tdb_transaction_start@Base 1.40 + ext2fs_tdb_traverse@Base 1.40 + ext2fs_tdb_traverse_read@Base 1.40 + ext2fs_tdb_unlockall@Base 1.40 + ext2fs_tdb_unlockall_read@Base 1.40 + ext2fs_tdb_validate_freelist@Base 1.40 + ext2fs_test_bb_dirty@Base 1.37 + ext2fs_test_bit64@Base 1.42 + ext2fs_test_bit@Base 1.37 + ext2fs_test_block_bitmap2@Base 1.42 + ext2fs_test_block_bitmap@Base 1.37 + ext2fs_test_block_bitmap_range2@Base 1.42 + ext2fs_test_block_bitmap_range@Base 1.37 + ext2fs_test_changed@Base 1.37 + ext2fs_test_generic_bitmap@Base 1.37 + ext2fs_test_generic_bmap@Base 1.42 + ext2fs_test_ib_dirty@Base 1.37 + ext2fs_test_inode_bitmap2@Base 1.42 + ext2fs_test_inode_bitmap@Base 1.37 + ext2fs_test_inode_bitmap_range@Base 1.41.8 + ext2fs_test_valid@Base 1.37 + ext2fs_truncate_orphan_file@Base 1.47.0 + ext2fs_u32_copy@Base 1.37 + ext2fs_u32_list_add@Base 1.37 + ext2fs_u32_list_count@Base 1.37 + ext2fs_u32_list_create@Base 1.37 + ext2fs_u32_list_del@Base 1.37 + ext2fs_u32_list_equal@Base 1.37 + ext2fs_u32_list_find@Base 1.37 + ext2fs_u32_list_free@Base 1.37 + ext2fs_u32_list_iterate@Base 1.37 + ext2fs_u32_list_iterate_begin@Base 1.37 + ext2fs_u32_list_iterate_end@Base 1.37 + ext2fs_u32_list_test@Base 1.37 + ext2fs_unlink@Base 1.37 + ext2fs_unmark_block_bitmap2@Base 1.42 + ext2fs_unmark_block_bitmap@Base 1.37 + ext2fs_unmark_block_bitmap_range2@Base 1.42 + ext2fs_unmark_block_bitmap_range@Base 1.37 + ext2fs_unmark_generic_bitmap@Base 1.37 + ext2fs_unmark_generic_bmap@Base 1.42 + ext2fs_unmark_inode_bitmap2@Base 1.42 + ext2fs_unmark_inode_bitmap@Base 1.37 + ext2fs_unmark_valid@Base 1.37 + ext2fs_update_bb_inode@Base 1.37 + ext2fs_update_dynamic_rev@Base 1.37 + ext2fs_verify_csum_type@Base 1.43 + ext2fs_warn_bitmap2@Base 1.37 + ext2fs_warn_bitmap32@Base 1.42 + ext2fs_warn_bitmap@Base 1.37 + ext2fs_write_bb_FILE@Base 1.37 + ext2fs_write_bitmaps@Base 1.37 + ext2fs_write_block_bitmap@Base 1.37 + ext2fs_write_dir_block2@Base 1.37 + ext2fs_write_dir_block3@Base 1.42 + ext2fs_write_dir_block4@Base 1.43 + ext2fs_write_dir_block@Base 1.37 + ext2fs_write_ext_attr2@Base 1.42 + ext2fs_write_ext_attr3@Base 1.43 + ext2fs_write_ext_attr@Base 1.37 + ext2fs_write_ind_block@Base 1.37 + ext2fs_write_inode2@Base 1.45 + ext2fs_write_inode@Base 1.37 + ext2fs_write_inode_bitmap@Base 1.37 + ext2fs_write_inode_full@Base 1.37 + ext2fs_write_new_inode@Base 1.37 + ext2fs_xattr_get@Base 1.43 + ext2fs_xattr_inode_max_size@Base 1.43 + ext2fs_xattr_remove@Base 1.43 + ext2fs_xattr_set@Base 1.43 + ext2fs_xattrs_close@Base 1.43 + ext2fs_xattrs_count@Base 1.43 + ext2fs_xattrs_flags@Base 1.43.4~WIP.2017.01.30 + ext2fs_xattrs_iterate@Base 1.43 + ext2fs_xattrs_open@Base 1.43 + ext2fs_xattrs_read@Base 1.43 + ext2fs_xattrs_read_inode@Base 1.47.0 + ext2fs_xattrs_write@Base 1.43 + ext2fs_zero_blocks2@Base 1.42 + ext2fs_zero_blocks@Base 1.41.0 + initialize_ext2_error_table@Base 1.37 + initialize_ext2_error_table_r@Base 1.37 + inode_io_manager@Base 1.37 + io_channel_alloc_buf@Base 1.42.3 + io_channel_cache_readahead@Base 1.43 + io_channel_discard@Base 1.42 + io_channel_read_blk64@Base 1.41.1 + io_channel_set_options@Base 1.37 + io_channel_write_blk64@Base 1.41.1 + io_channel_write_byte@Base 1.37 + io_channel_zeroout@Base 1.43 + qcow2_read_header@Base 1.42 + qcow2_write_raw_image@Base 1.42 + set_undo_io_backing_manager@Base 1.41.0 + set_undo_io_backup_file@Base 1.41.0 + sparse_io_manager@Base 1.44.0~rc1 + sparsefd_io_manager@Base 1.44.0~rc1 + test_io_backing_manager@Base 1.37 + test_io_cb_read_blk64@Base 1.41.0 + test_io_cb_read_blk@Base 1.37 + test_io_cb_set_blksize@Base 1.37 + test_io_cb_write_blk64@Base 1.41.0 + test_io_cb_write_blk@Base 1.37 + test_io_cb_write_byte@Base 1.37 + test_io_manager@Base 1.37 + undo_io_manager@Base 1.41.0 + unix_io_manager@Base 1.37 + unixfd_io_manager@Base 1.43.2 diff --git a/src/_nfdos/e2fsprogs/debian/libss2.install b/src/_nfdos/e2fsprogs/debian/libss2.install new file mode 100644 index 0000000..386e185 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libss2.install @@ -0,0 +1 @@ +lib/*/libss*.so.* diff --git a/src/_nfdos/e2fsprogs/debian/libss2.symbols b/src/_nfdos/e2fsprogs/debian/libss2.symbols new file mode 100644 index 0000000..74358eb --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libss2.symbols @@ -0,0 +1,36 @@ +libss.so.2 libss2 #MINVER# +* Build-Depends-Package: ss-dev + _ss_pager_name@Base 1.01 + _ss_table@Base 1.01 + et_ss_error_table@Base 1.35 + initialize_ss_error_table@Base 1.01 + initialize_ss_error_table_r@Base 1.34 + ss_abort_subsystem@Base 1.01 + ss_add_info_dir@Base 1.01 + ss_add_request_table@Base 1.01 + ss_create_invocation@Base 1.01 + ss_delete_info_dir@Base 1.01 + ss_delete_invocation@Base 1.01 + ss_delete_request_table@Base 1.01 + ss_error@Base 1.01 + ss_execute_command@Base 1.01 + ss_execute_line@Base 1.01 + ss_get_prompt@Base 1.01 + ss_get_readline@Base 1.34 + ss_help@Base 1.01 + ss_list_requests@Base 1.01 + ss_listen@Base 1.01 + ss_name@Base 1.01 + ss_page_stdin@Base 1.01 + ss_pager_create@Base 1.01 + ss_parse@Base 1.01 + ss_perror@Base 1.01 + ss_quit@Base 1.01 + ss_rl_completion@Base 1.34 + ss_safe_getenv@Base 1.38 + ss_self_identify@Base 1.01 + ss_set_prompt@Base 1.01 + ss_std_requests@Base 1.01 + ss_subsystem_name@Base 1.01 + ss_subsystem_version@Base 1.01 + ss_unimplemented@Base 1.01 diff --git a/src/_nfdos/e2fsprogs/debian/libuuid1.install b/src/_nfdos/e2fsprogs/debian/libuuid1.install new file mode 100644 index 0000000..0761f3b --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libuuid1.install @@ -0,0 +1 @@ +lib/*/libuuid*.so.* diff --git a/src/_nfdos/e2fsprogs/debian/libuuid1.postinst b/src/_nfdos/e2fsprogs/debian/libuuid1.postinst new file mode 100644 index 0000000..5336fcf --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libuuid1.postinst @@ -0,0 +1,40 @@ +#!/bin/sh + +set -e + +ADDUSERCONF='/etc/adduser.conf' + +if test -f $ADDUSERCONF; then + FIRST_SYSTEM_UID=$(sed -n "s/^[[:space:]]*FIRST_SYSTEM_UID[[:space:]]*=[[:space:]]*[\"']\?\([^\"']*\)[\"']\?/\1/p" $ADDUSERCONF) + LAST_SYSTEM_UID=$(sed -n "s/^[[:space:]]*LAST_SYSTEM_UID[[:space:]]*=[[:space:]]*[\"']\?\([^\"']*\)[\"']\?/\1/p" $ADDUSERCONF) + FIRST_SYSTEM_GID=$(sed -n "s/^[[:space:]]*FIRST_SYSTEM_GID[[:space:]]*=[[:space:]]*[\"']\?\([^\"']*\)[\"']\?/\1/p" $ADDUSERCONF) + LAST_SYSTEM_GID=$(sed -n "s/^[[:space:]]*LAST_SYSTEM_GID[[:space:]]*=[[:space:]]*[\"']\?\([^\"']*\)[\"']\?/\1/p" $ADDUSERCONF) +fi + +if test -z "$FIRST_SYSTEM_UID"; then + FIRST_SYSTEM_UID=100 +fi +if test -z "$LAST_SYSTEM_UID"; then + LAST_SYSTEM_UID=999 +fi +if test -z "$FIRST_SYSTEM_GID"; then + FIRST_SYSTEM_GID=100 +fi +if test -z "$LAST_SYSTEM_GID"; then + LAST_SYSTEM_GID=999 +fi + +if ! getent group | grep -q libuuid; then + groupadd -f -K GID_MIN=$FIRST_SYSTEM_GID -K GID_MAX=$LAST_SYSTEM_GID libuuid +fi +if ! getent passwd | grep -q libuuid; then + useradd -d /var/lib/libuuid -K UID_MIN=$FIRST_SYSTEM_UID -K UID_MAX=$LAST_SYSTEM_UID -g libuuid libuuid +fi + +mkdir -p /var/lib/libuuid +chown libuuid:libuuid /var/lib/libuuid +chmod 2775 /var/lib/libuuid + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/libuuid1.postrm b/src/_nfdos/e2fsprogs/debian/libuuid1.postrm new file mode 100644 index 0000000..8c286ee --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libuuid1.postrm @@ -0,0 +1,10 @@ +#!/bin/sh +set -e +if [ "$1" = purge ] +then + rm -rf /var/lib/libuuid +fi + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/libuuid1.symbols b/src/_nfdos/e2fsprogs/debian/libuuid1.symbols new file mode 100644 index 0000000..5a00431 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/libuuid1.symbols @@ -0,0 +1,19 @@ +libuuid.so.1 libuuid1 #MINVER# + uuid__generate_random@Base 1.40.4 + uuid__generate_time@Base 1.40.4 + uuid_clear@Base 1.05 + uuid_compare@Base 1.05 + uuid_copy@Base 1.05 + uuid_generate@Base 1.05 + uuid_generate_random@Base 1.15 + uuid_generate_time@Base 1.15 + uuid_is_null@Base 1.05 + uuid_pack@Base 1.05 + uuid_parse@Base 1.05 + uuid_time@Base 1.15 + uuid_type@Base 1.15 + uuid_unpack@Base 1.05 + uuid_unparse@Base 1.05 + uuid_unparse_lower@Base 1.36 + uuid_unparse_upper@Base 1.36 + uuid_variant@Base 1.15 diff --git a/src/_nfdos/e2fsprogs/debian/logsave.install b/src/_nfdos/e2fsprogs/debian/logsave.install new file mode 100644 index 0000000..dd5b065 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/logsave.install @@ -0,0 +1,2 @@ +sbin/logsave +usr/share/man/man8/logsave.8 diff --git a/src/_nfdos/e2fsprogs/debian/rules b/src/_nfdos/e2fsprogs/debian/rules new file mode 100755 index 0000000..b85976f --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/rules @@ -0,0 +1,186 @@ +#! /usr/bin/make -f + +# export DH_VERBOSE=1 + +export DEB_BUILD_MAINT_OPTIONS ?= hardening=+all + +DPKG_EXPORT_BUILDFLAGS = 1 +include /usr/share/dpkg/default.mk + +# be paranoid +export LC_ALL ?= C + +ifeq ($(DEB_HOST_ARCH_OS), hurd) +SKIP_FUSE2FS=yes +endif + +ifneq ($(filter pkg.e2fsprogs.no-fuse2fs,$(DEB_BUILD_PROFILES)),) +SKIP_FUSE2FS=yes +endif + +COMERR_VERSION ?= $(shell grep ELF_VERSION lib/et/Makefile.in | cut '-d ' -f3) +SS_VERSION ?= $(shell grep ELF_VERSION lib/ss/Makefile.in | cut '-d ' -f3) + +topdir ?= $(shell pwd) +tmpdir ?= ${topdir}/debian/tmp +udebdir ?= ${topdir}/debian/e2fsprogs-udeb +stdbuilddir ?= ${topdir}/debian/BUILD-STD + +INSTALL ?= install +INSTALL_PROGRAM ?= $(INSTALL) -p -m 0755 + +ifneq (,$(findstring update-symbols,$(DEB_BUILD_OPTIONS))) +SYMBOL_LIBS := libext2fs libcomerr2 libss2 +endif + +CFLAGS_SHLIB = $(CFLAGS) +CFLAGS_STLIB = $(CFLAGS) +LDFLAGS_SHLIB = $(LDFLAGS) +LDFLAGS_STATIC = $(filter-out -fPIE -fpie -pie,$(LDFLAGS)) + +BACKTRACE_CONF_FLAGS ?= $(shell if debian/scripts/test-backtrace ; then echo --disable-backtrace ; fi) + +COMMON_CONF_FLAGS = --enable-elf-shlibs --disable-ubsan \ + --disable-addrsan --disable-threadsan --disable-e2initrd-helper \ + --disable-fsck --disable-libblkid --disable-libuuid --disable-uuidd \ + --infodir=/usr/share/info --enable-symlink-install \ + --with-multiarch=$(DEB_HOST_MULTIARCH) \ + $(BACKTRACE_CONF_FLAGS) ${EXTRA_CONF_FLAGS} + +ifneq ($(SKIP_FUSE2FS),) +COMMON_CONF_FLAGS += --disable-fuse2fs +endif + +ifneq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE)) +CC ?= $(DEB_HOST_GNU_TYPE)-gcc +COMMON_CONF_FLAGS += --build=$(DEB_BUILD_GNU_TYPE) --host=$(DEB_HOST_GNU_TYPE) +endif + +%: + dh $@ -B${stdbuilddir} + +override_dh_autoreconf: + +override_dh_auto_configure: + mkdir -p ${stdbuilddir} + cd ${stdbuilddir} && AWK=/usr/bin/awk \ + ../../configure ${COMMON_CONF_FLAGS} + +override_dh_auto_build: + $(MAKE) -C ${stdbuilddir} V=1 all +ifeq (,$(filter pkg.e2fsprogs.no-static,$(DEB_BUILD_PROFILES))) + $(MAKE) -C ${stdbuilddir}/e2fsck V=1 e2fsck.static +endif + if ! test -d debian/orig-gmo ; then \ + mkdir debian/orig-gmo ; \ + mv po/*.gmo po/*.po debian/orig-gmo ; \ + cp debian/orig-gmo/*.po po ; \ + fi + $(MAKE) -C ${stdbuilddir}/po V=1 update-gmo + + $(MAKE) -C ${stdbuilddir}/doc V=1 libext2fs.html + $(MAKE) -C ${stdbuilddir}/lib/et V=1 com_err.info com_err.html + cat $(shell /bin/ls -1 ./doc/RelNotes/*.txt | tac) | \ + gzip -9n > ${stdbuilddir}/NEWS.gz + +override_dh_auto_clean: + if test -d debian/orig-gmo ; then \ + rm -f po/*.gmo po/*.po ; \ + mv debian/orig-gmo/* po ; \ + rmdir debian/orig-gmo ; \ + fi + rm -rf ${stdbuilddir} + +override_dh_auto_install: + mkdir -p ${tmpdir}/sbin + $(MAKE) -C ${stdbuilddir} V=1 install DESTDIR=${tmpdir} \ + INSTALL_PROGRAM="${INSTALL_PROGRAM}" LDCONFIG=true + # static libs and .h files + $(MAKE) -C ${stdbuilddir} V=1 install-libs DESTDIR=${tmpdir} LDCONFIG=true + +ifeq (,$(filter pkg.e2fsprogs.no-static,$(DEB_BUILD_PROFILES))) + # statically-linked fsck + ${INSTALL_PROGRAM} ${stdbuilddir}/e2fsck/e2fsck.static ${tmpdir}/sbin + (cd debian/tmp/usr/share/man/man8 ; cp e2fsck.8 e2fsck.static.8) +endif + +ifeq ($(DEB_HOST_ARCH_OS), hurd) + ${INSTALL} -m 0644 misc/mke2fs-hurd.conf ${tmpdir}/etc/mke2fs.conf +endif + +override_dh_install: + dh_install -p e2fsprogs --sourcedir=${stdbuilddir} NEWS.gz \ + usr/share/doc/e2fsprogs + dh_install + dh_missing --fail-missing + +ifeq (,$(filter noudeb,$(DEB_BUILD_PROFILES))) +override_dh_lintian: + dh_lintian + $(INSTALL) -D -p -m644 debian/e2fsprogs-udeb.lintian-overrides \ + debian/e2fsprogs-udeb/usr/share/lintian/overrides/e2fsprogs-udeb +endif + +override_dh_installinfo: + # HTML docs + $(INSTALL) -d debian/libext2fs-dev/usr/share/doc/libext2fs2/html-info/ + $(INSTALL) -p -m 0644 ${stdbuilddir}/doc/*.html \ + debian/libext2fs-dev/usr/share/doc/libext2fs2/html-info/ + $(INSTALL) -d debian/comerr-dev/usr/share/doc/comerr-dev/html-info/ + $(INSTALL) -p -m 0644 ${stdbuilddir}/lib/et/*.html \ + debian/comerr-dev/usr/share/doc/comerr-dev/html-info/ + + # texinfo docs + mkdir -p debian/comerr-dev/usr/share/doc/comerr-dev + $(INSTALL) -p -m 0644 ${topdir}/doc/libext2fs.texinfo \ + debian/libext2fs-dev/usr/share/doc/libext2fs2/libext2fs.texi + $(INSTALL) -p -m 0644 ${topdir}/lib/et/com_err.texinfo \ + debian/comerr-dev/usr/share/doc/comerr-dev/com_err.texi + + $(INSTALL) -d debian/comerr-dev/usr/share/doc/comerr-dev/examples + $(INSTALL) -p -m 0644 lib/ss/ss_err.et \ + ${stdbuilddir}/lib/ext2fs/ext2_err.et \ + debian/comerr-dev/usr/share/doc/comerr-dev/examples + $(INSTALL) -d debian/ss-dev/usr/share/doc/ss-dev/examples + $(INSTALL) -p -m 0644 debugfs/debug_cmds.ct \ + debian/ss-dev/usr/share/doc/ss-dev/examples + + dh_installinfo -pcomerr-dev ${stdbuilddir}/lib/et/com_err.info + dh_installinfo -plibext2fs-dev ${stdbuilddir}/doc/libext2fs.info + +override_dh_makeshlibs: + for i in $(SYMBOL_LIBS); \ + do \ + echo "Generating symbols for $$i..."; \ + dpkg-gensymbols -p$$i -Pdebian/$$i > debian/$$i.tmp-patch; \ + cat debian/$$i.tmp-patch; \ + patch debian/$$i.symbols < debian/$$i.tmp-patch; \ + /bin/rm debian/$$i.tmp-patch; \ + done + dh_makeshlibs $(if $(filter noudeb,$(DEB_BUILD_PROFILES)),,--add-udeb=e2fsprogs-udeb) + +override_dh_shlibdeps: + dh_shlibdeps -pe2fsprogs -l${stdbuilddir}/lib \ + -- -Ldebian/e2fsprogs.shlibs.local +ifeq (,$(filter noudeb,$(DEB_BUILD_PROFILES))) + dh_shlibdeps -pe2fsprogs-udeb -l${stdbuilddir}/lib \ + -- -Ldebian/e2fsprogs-udeb.shlibs.local +endif +ifeq ($(SKIP_FUSE2FS),) + dh_shlibdeps -pfuse2fs -l${stdbuilddir}/lib \ + -- -Ldebian/e2fsprogs.shlibs.local +endif + dh_shlibdeps --remaining-packages -l${stdbuilddir}/lib + +override_dh_gencontrol: + dh_gencontrol -pcomerr-dev -- -v${COMERR_VERSION}-${DEB_VERSION} -VmainBinary=${DEB_VERSION} + dh_gencontrol -pss-dev -- -v${SS_VERSION}-${DEB_VERSION} -VmainBinary=${DEB_VERSION} + dh_gencontrol --remaining-packages + +override_dh_auto_test: +ifeq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS))) + PRINT_FAILED=yes $(MAKE) -C ${stdbuilddir} V=1 check +endif + +test_printenv: + printenv | sort diff --git a/src/_nfdos/e2fsprogs/debian/scripts/test-backtrace b/src/_nfdos/e2fsprogs/debian/scripts/test-backtrace new file mode 100755 index 0000000..d90486a --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/scripts/test-backtrace @@ -0,0 +1,34 @@ +#!/bin/sh +# +# Test to see if backtrace requires a library in /usr/lib +# Returns true if the backtrace command works and requires a library in /usr/lib +# This is a nasty workaround for Debian bug #708307, which is really a glibc bug +# + +cat > /tmp/backtrace$$.c << EOF + +#include + +int main(int argc, char **argv) +{ + void *stack_syms[32]; + int frames; + + frames = backtrace(stack_syms, 32); + backtrace_symbols_fd(stack_syms, frames, 0); +} +EOF + +if ! cc -o /tmp/backtrace$$ /tmp/backtrace$$.c; then + exit 1 +fi + +if ! ldd /tmp/backtrace$$ > /tmp/backtrace$$.ldd 2>&1 ; then + exit 1 +fi + +grep -q /usr/lib /tmp/backtrace$$.ldd +ret=$? + +/bin/rm -f /tmp/backtrace$$* +exit $ret diff --git a/src/_nfdos/e2fsprogs/debian/shlibs.local b/src/_nfdos/e2fsprogs/debian/shlibs.local new file mode 100644 index 0000000..e678de0 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/shlibs.local @@ -0,0 +1,6 @@ +libext2fs 2 +libe2p 2 +libuuid 1 +libcom_err 2 +libss 2 +libblkid 1 diff --git a/src/_nfdos/e2fsprogs/debian/source/format b/src/_nfdos/e2fsprogs/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/src/_nfdos/e2fsprogs/debian/source/lintian-overrides b/src/_nfdos/e2fsprogs/debian/source/lintian-overrides new file mode 100644 index 0000000..ca0febe --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/source/lintian-overrides @@ -0,0 +1,2 @@ +e2fsprogs source: weak-library-dev-dependency +e2fsprogs source: no-debian-changes diff --git a/src/_nfdos/e2fsprogs/debian/ss-dev.examples b/src/_nfdos/e2fsprogs/debian/ss-dev.examples new file mode 100644 index 0000000..b7930bb --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/ss-dev.examples @@ -0,0 +1 @@ +debugfs/debug_cmds.ct diff --git a/src/_nfdos/e2fsprogs/debian/ss-dev.install b/src/_nfdos/e2fsprogs/debian/ss-dev.install new file mode 100644 index 0000000..d0c788e --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/ss-dev.install @@ -0,0 +1,7 @@ +usr/lib/*/libss.so +usr/lib/*/libss.a +usr/include/ss/* +usr/bin/mk_cmds +usr/share/ss/* +usr/share/man/man1/mk_cmds* +usr/lib/*/pkgconfig/ss.pc diff --git a/src/_nfdos/e2fsprogs/debian/ss-dev.postinst b/src/_nfdos/e2fsprogs/debian/ss-dev.postinst new file mode 100644 index 0000000..bf49c9d --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/ss-dev.postinst @@ -0,0 +1,26 @@ +#!/bin/sh + +# Abort on error. +set -e + +symlink_match() +{ + local SYMLINK="$1" + local SYMLINK_TARGET="$2" + + [ "$(readlink "$SYMLINK")" = "$SYMLINK_TARGET" ] || \ + [ "$(readlink -f "$SYMLINK")" = "$SYMLINK_TARGET" ] +} + +SYMLINK=/usr/share/doc/ss-dev +SYMLINK_TARGET=libss2 + +if [ "$1" = "configure" ] && [ -h "${SYMLINK}.dpkg-backup" ] && + symlink_match "${SYMLINK}.dpkg-backup" "$SYMLINK_TARGET" +then + rm -f "${SYMLINK}.dpkg-backup" +fi + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/ss-dev.postrm b/src/_nfdos/e2fsprogs/debian/ss-dev.postrm new file mode 100644 index 0000000..c625aae --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/ss-dev.postrm @@ -0,0 +1,32 @@ +#!/bin/sh + +# Abort on error. +set -e + +symlink_match() +{ + local SYMLINK="$1" + local SYMLINK_TARGET="$2" + + [ "$(readlink "$SYMLINK")" = "$SYMLINK_TARGET" ] || \ + [ "$(readlink -f "$SYMLINK")" = "$SYMLINK_TARGET" ] +} + +SYMLINK=/usr/share/doc/ss-dev +SYMLINK_TARGET=libss2 + +if [ "$1" = "purge" ] && [ -h "${SYMLINK}.dpkg-backup" ] +then + rm -f "${SYMLINK}.dpkg-backup" +fi +if [ "$1" = "abort-install" -o "$1" = "abort-upgrade" ] && + [ -n "$2" ] && [ ! -e "$SYMLINK" ] && [ -h "${SYMLINK}.dpkg-backup" ] && + symlink_match "${SYMLINK}.dpkg-backup" "$SYMLINK_TARGET" +then + echo "Restoring backup of $SYMLINK ..." + mv "${SYMLINK}.dpkg-backup" "$SYMLINK" +fi + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/ss-dev.preinst b/src/_nfdos/e2fsprogs/debian/ss-dev.preinst new file mode 100644 index 0000000..8da566e --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/ss-dev.preinst @@ -0,0 +1,27 @@ +#!/bin/bash + +# Abort on error. +set -e + +symlink_match() +{ + local SYMLINK="$1" + local SYMLINK_TARGET="$2" + + [ "$(readlink "$SYMLINK")" = "$SYMLINK_TARGET" ] || \ + [ "$(readlink -f "$SYMLINK")" = "$SYMLINK_TARGET" ] +} + +SYMLINK=/usr/share/doc/ss-dev +SYMLINK_TARGET=libss2 + +if [ "$1" = "install" -o "$1" = "upgrade" ] && + [ -n "$2" ] && [ -h "$SYMLINK" ] && + symlink_match "$SYMLINK" "$SYMLINK_TARGET" +then + mv -f "$SYMLINK" "${SYMLINK}.dpkg-backup" +fi + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/tests/control b/src/_nfdos/e2fsprogs/debian/tests/control new file mode 100644 index 0000000..e149342 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/tests/control @@ -0,0 +1,6 @@ +Tests: smoke +Depends: e2fsprogs + +Tests: fuse2fs +Depends: fuse2fs, fuse3 +Restrictions: isolation-machine diff --git a/src/_nfdos/e2fsprogs/debian/tests/fuse2fs b/src/_nfdos/e2fsprogs/debian/tests/fuse2fs new file mode 100755 index 0000000..8b4e08a --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/tests/fuse2fs @@ -0,0 +1,37 @@ +#!/bin/sh + +TDIR=${AUTOPKGTEST_TMP:-/tmp/fuse_dir} +LOGDIR=${AUTOPKGTEST_ARTIFACTS:-/tmp/fuse_dir_log} +IMG=$TDIR/test-image.img +MNT=$TDIR/mnt + +# some autopkgtest environments may not have /etc/mtab and/or /proc/mounts +EXT2FS_NO_MTAB_OK=yes +export EXT2FS_NO_MTAB_OK + +mkdir -p $LOGDIR $TDIR $MNT + +/sbin/mke2fs -E root_owner -q -t ext4 -d e2fsck $IMG 8M +/sbin/e2label $IMG test +fuse2fs $IMG $MNT > $LOGDIR/fuse2fs.log 2>&1 +if test $? -ne 0 ; then + echo "fuse2fs failed; see $LOGDIR/fuse2fs.log" + exit 1 +fi +diff e2fsck/pass1.c $MNT/pass1.c +echo foobar > $MNT/testfile +fusermount -u $MNT > $LOGDIR/fusermount.log 2>&1 +if test $? -ne 0 ; then + echo "fusermount failed; see $LOGDIR/fusermount.log" + exit 1 +fi +/sbin/e2fsck -fy $IMG > $LOGDIR/e2fsck.log 2>&1 +if test $? -ne 0 ; then + echo "e2fsck failed; see $LOGDIR/e2fsck.log" + exit 1 +fi +contents=$(/sbin/debugfs -R "cat testfile" $IMG 2> $LOGDIR/debugfs.log) +if test "$contents" != foobar ; then + echo "testfile does not contain expected output" + exit 1 +fi diff --git a/src/_nfdos/e2fsprogs/debian/tests/smoke b/src/_nfdos/e2fsprogs/debian/tests/smoke new file mode 100755 index 0000000..966be96 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/tests/smoke @@ -0,0 +1,32 @@ +#!/bin/sh + +TDIR=${AUTOPKGTEST_TMP:-/tmp/test_dir} +LOGDIR=${AUTOPKGTEST_ARTIFACTS:-/tmp/test_dir_log} +IMG=$TDIR/test-image.img + +# some autopkgtest environments may not have /etc/mtab and/or /proc/mounts +EXT2FS_NO_MTAB_OK=yes +export EXT2FS_NO_MTAB_OK + +mkdir -p $LOGDIR $TDIR + +/sbin/mke2fs -q -t ext4 -d e2fsck $IMG 8M +/sbin/e2label $IMG test +/sbin/e2fsck -fy $IMG > $LOGDIR/e2fsck.1.log 2>&1 +if test $? -ne 0 ; then + echo "First e2fsck failed; see $LOGDIR/e2fsck.1.log" + exit 1 +fi +/sbin/resize2fs $IMG 16M > $LOGDIR/resize2fs.log 2>&1 +if test $? -ne 0 ; then + echo "Resize2fs failed; see $LOGDIR/e2fsck.1.log" + exit 1 +fi +/sbin/e2fsck -fy $IMG > $LOGDIR/e2fsck.2.log 2>&1 +if test $? -ne 0 ; then + echo "Second e2fsck failed; see $LOGDIR/e2fsck.2.log" + exit 1 +fi +/sbin/debugfs -R "dump pass1.c $TDIR/pass1.c" $IMG > $LOGDIR/debugfs.log 2>&1 +diff $TDIR/pass1.c e2fsck/pass1.c + diff --git a/src/_nfdos/e2fsprogs/debian/upstream/signing-key.asc b/src/_nfdos/e2fsprogs/debian/upstream/signing-key.asc new file mode 100644 index 0000000..e225998 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/upstream/signing-key.asc @@ -0,0 +1,156 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQINBEz4F48BEADrt5DOsqL84FrVCYnI3MPZV9cEwvQSZmTyoSyU90Vl16Es7XuF +y45WhR5tQG6W6iKTnQpIEcxKpTdLG8cxGwc5gOsCzmoEBgHGA23Itx7BVqkB8vSA +aQDNAsQ4sFUUFBhkHa0d+N6RsrT0EHpK9gUP0paTiybqGn/yIOZ5tyw+jzN5Iae/ +RLbIH5UQ8+XWV7MAFWLBahPJJTVNcASK8h/ZxvNLkIRb5SFO2oqew26VuRi3R0sT +Pvue14K0JP5KsZ2HEQ8nNWyFhRbMJR32lqFNGNzPgupAdWzXKQT2R/UZ1WsMeQ1i +TM+HfN3idrJ+u2STXVv1oTkKGFsyhq2gdUcv5o/tpqgkQ8F9K8rKZI/EHzh3ZU0o +qYAgXECQsoS2hS1qc38EcrE3tKJsXztGpWujf8gbJivs1/pz7bEQiCxtF//Ze2dn +19CSf7r/WKTecxbkx+eupme3ThqsKWR6v6qaSCA223kiUMb8b8zpJ5+NOxhmgssl +PPU5EHJaBwZrfritjgwOiEAlyjYZZ4IkA88tAimtYU3nbpn099zSfmvaD8lQUK+e +NzzUlszJFGEqna4/+nGc0m2rgfbSvyWO4MQz85Fh5cSeUxiWCPNjWTJpRoPPXSIQ +D+GteZ1rlvA2VmBKLSA8F7BL/lvuUrfjNF2OyLqhOI3TtGe3N+89Q1qsywARAQAB +tB1UaGVvZG9yZSBUcydvIDx0eXRzb0BtaXQuZWR1PokCOgQTAQgAJAIbAwIeAQIX +gAIZAQUCVRr3hgULCQgHAwUVCgkICwUWAgMBAAAKCRDTb3abwRgE8LAwD/9B/KUj +0KpAe2ooXEinS380mkiGzWDJIncEynubiNm5Nl8Zo8hwtjXfagTqucUmnnu8NJ1O +lwigw5/vJXpTo7maSeyJImaRZaYyzoh8Bv11t1ymbTvr5ab7ZgSGmaak3IjIM8cW +vv/Wx+yf+LYS03+6GOMdGLq1mF2KgXpHBdK2Wpl/8jlOmry+wccgXBekZP7ZIF0V +wNFq/q8c6zW2yHs2w6i/pkVHJJm3kyaBe+6U6njq1/HBCnlGin7iYfpxZ0d8FoiL +4CEUAHfpFP2DKTO+KJJjphZctya0nCBRzQI3Zk8a0/ITCWJr/pw77yysIRiMO0s4 +BjHzzM7edlJA7dILutX8XrnAAkIOdfzWvHuLtLpEcDRP+gowYYO7PjMfb61zsP9L +dXS1bDrXI2pn2SdRFmaodSBaaAaJoTj55ZbjM2Ckv4lpGYGozreav9suLrYiZIeI +QRcqL1QIKM9WZPUkfbNSMiLLccOmEpKcqyauh3QJiKdT+lFpRBZY34TSI4R5EKMm +dJqD/xaZ4nDpfOxbqocEXDGgstmsCgxzLrYc7lVB+1IRnTW2rFlQteFAZucq8Dwb +xvkOdVY1pJo1vf8UkMPxoexMt7xSSLDQxxRzEtfQSzKLw7Iyf2eTm4OgCN8PocFI +J7LaqOvyq0YvxCVGrPD9bSCU/H5CAuPJa4WuzrQgVGhlb2RvcmUgVHMnbyA8dHl0 +c29AZGViaWFuLm9yZz6JAjcEEwEIACECGwMCHgECF4AFAlUa95gFCwkIBwMFFQoJ +CAsFFgIDAQAACgkQ0292m8EYBPBqVg/+JrVNl+yoGyIJ3e85Ts7Ko65UQ+xM71Ad +OecDUUSx3beSe/Trc76ElvzGu/zMtstu9uH8DnmnjscN1CfqpHK6Rhck69RQDCy+ +c114Q8pa/bzAuWPH4vGHE5BvPZjIc67cZ3T5kHpAaew5ltZG6YhpOBRTRr55ZfO3 +hHQCxOdTmqKWXB1HRXRTu7hlI4WmRpSBf9y4sVwIaraSgtNRhKb/Ff1iPHFCVdoK ++UtfWJrbpJ+HpHAcboNsfC1PQZ8E6eHYiaG0EUlSrpjeCH66kBgkIkbt4RZf+R23 +ZNonE8Hddw6ZR5zMxOfIbK5pBkcEUgOFogwwHL3b/lFdj0t1ggN6eRDVsk9kYYga +kXypR4DYKSs484Y4OroFccw/M69gFjI3f5AIb3HQzb1cV9ocDnqJtzPLAQJTUiIb +OJlFUjsvlg8romKV9lodzdS7zO/t2iQF4Hm2ThuS7R93MZEi4Z7WRgKueIBEhHm7 +WBbtnWzlKZDdsILyIUn7L6WE1iT+d+zvUHz6rYY/b1b7VQzH0UXWtwzPKCyLSLuM +g9q7rm5PMuaMn05zjN2gVy8rfbC7NTTo8f256YT0kmZmO5Kx9fpGYoPIMJp8aiDY +fUfg2rwWkMxO6uxiEe3xCOVzgQcK7NPZS0NbhdRcrmqN3vyiVLY8Qi2a+xQjesJG +RAgdhyJkESC0IFRoZW9kb3JlIFRzJ28gPHR5dHNvQGdvb2dsZS5jb20+iQI3BBMB +CAAhAhsDAh4BAheABQJVGvebBQsJCAcDBRUKCQgLBRYCAwEAAAoJENNvdpvBGATw +kB0P+wQj8exoDTL8/m+Wuju1CMvHty1i4eBKqzM04OdcBQI3/0zOFmub/VnJVB2L +92UhEvqclbwWsijz7G1Vr7wsUPkftCoJICYqjPpZf3BKvyGXkatrMUs0ry1xZ15Q +A4f/9YuiUOykIQiROS+lUa7HqS6dkEj+/2xXheZKcnrv0pz0PayzWbonukRY7Jxe +UcTAXnX1p9fM7+Y9xx5mkwwe4lN02zGextCw1C77EDGhH8GtgnhyfsFkDLjWmNg8 +xjbGKvYYRU18uu0DYTj7ERrDhYy+Aft91F1ZUN9xPgyMx1uWcuyWPV57L3hdwxUX +i64TV4CzMOsolytdUikw57pcjyjdn7kPJlgg+1clrtnrCsmwWQYDMfap3pTOCoj5 +8YVjF+j8ngORLw1tNYZdwPVdeTmuWEv0ufgxDjQtD01yHI2PyGYtZBcTZurdYxth +1Z1+aDyi3kyi6JN8dteA4rUrTxPCI/6GspXQKOlXPKeSijBAG2KdNNNgkWPSVC7q +xwhGruYYq5QA98nA8Hhe89KTwz3fbTCqr59QfEmpKaB9Uvmx6p0Bvj/zL7+N9VpN +vIyxRcG9cfbBWkq18TC6cZMeHUHjwh8ttC7sq/GxdhEW4Qn4ZsvbevozAhd2sMQP +FUUAH0IA1zzIL+UG1AvyQ69kWpoG8Fr9ttIZc5mYUDwL2m1KuQINBEz4GJ4BEADM +e5nhgwGPH9Ti2TSBlADnsZ3ygrA1UEaTUBxPHm0IYdfqMflqbw+XkxHQqRQzYyah +Bc1EBj1Fdl907ozRPnm4VzMgEzXZlN2wjmgUhz1gHZmMcCBxnC/p/FdWmEQwJLNg +TsmnS/seFRw2pwkFtiDYlqXUwU1pDjTLztOMVheQpBlLOg/oHGcZB+llLNPRzCok +mfNv4ShTygDpYtniQdVg57Qyriz3tvCDE+va8HL96SuCNV1vy+ZJa42KNhhMrHqY +C5t7hTNaJTyk25Lmwd5aKrSZjS4goHJcP9Ry3Sit467TRGEaqOi3fO0qTiTnW2Gz +9Cq0xDCOdd3CEbLajMwxM9+UKh+65/nGzh5bYC6zSitXMC1tWUvDEQpk/tiGV8E3 +c2YYbIRcCvOHBoqqIZryi4HqXFyatijEfA9yYc3J8IgmHG9Vc7rBgwdeLGQs9hfp +6IAFtmZHdupYLOUZk+HVNITESgiT6zICFoxNM0jrhkjqdK4ZtlTAiOTIidr1zVTd +je0Hr/Su3H/FluG5cXOZJqqcwQak98Li/Qe4dZl0t99V1s7NafDadSAtNOyMUplt +wSHWzx6PiA3oYMWbQO9S5D7/QK2scNFf7QnWFWYEcuhMlfKAodowI8swljrtgsir +7ZxRZ4YhSlBx1fgs1W09lIxmW7nufZAce/OzPgQsmQARAQABiQIfBBgBCAAJBQJM ++BieAhsMAAoJENNvdpvBGATwjq0P/1ZkCLDRvERSHvLZw2dYMSVNZalQq5MO689B +pcFF9M4CB0IRG+fSf7EkvTrlHnv9euhWAtucs6BITWPdtUORKl/jVcUme+QFBO/n +usVKVr0G0IJrz3Db0IVAC7I0uFttuANX0oc0Z3C1J9RukGapYbKDQF9RizdiqFPP +q/o700sDTnAroib1q3bDqOSrg0ewuJKpgUxLSiQ+GoZMX/8zWKMsadyguBvQl4fi +RSso075/WpzjjkHgZ/TRv/hX4cBpXJLK12yv4P6mEHlwp+FXmH/KRqsyQQaQouUZ +iD8tUK1hAsPB8xYrIZNSbLqsNHjLjtXsFsJU+7jSntVX2XB1nvyaoE8XNKudGoWN +xbUDaBmFozvK5uBRBFogNZuw+8kCYcVi8iuIHrQMjWwL4zq7CpLxQCKfYlhXasIM +p+ggwKewfOA10g5QvYCcqcFtWkIsF9dxOSkfJFY31CMQkxHKc5MF1LsGTRv5HIAm +rb3XAztlmQ0936Zp8+h9DDLV5LF17oiKDYQygHFcYDgBudH78bwYw8hZ2Nkr52v6 +6fHCMGUMfkC8IYP0jVokqS27Aw6IKKlCisJqnGxpXC7Nb/8LNDCKBTNpIKeENARK +Xz9msd6s3gjC9ug2Ea3mrPDNmVnTkdvrLTtA0klCrxZgWml0BOjoEyB75BCe2fZ9 +4VRmJHKDuQINBFLoZCgBEADGR4Xgf1j5Of7pwIzpMgz/HZxwjxibW+EC+ALwMicJ +BoxTmNp5GZ41Rle7frNGRe4R3fUbpdDI9nODFREezNnTFCPYMA1B2U7hxxlcyH1N +rRYkkbeSWBNVgBIZ0rBnXI1qrZjONrpTLsHX3GdAShzpYu5zyt2a7tSMhmkwzidt +jmWYt3BqOH4C/CYOqUnZJhzZ44+LXT68+AcL+rqWo+cTOSDlmrvs9yJCFm4Y75A+ +fd+raUZ8OhhmvHAA+IiRnHG9NrqprhVu+J4xSulfkyF8ziXl3HMC6aeHVS1F8UO+ +jg7nAmgyDi6IuJznZB01KCplVDE9E/8neZfF5WMzti7DiVvkrwf4YoOcsl9tkda7 +iH/ka03ZLdMYELss+lmgLnVDWDdrrJWTAY4rXEWx4UE2O03yPVKwp1Dq8eJazJrv +ECDTN1U464FvSmO2Xrj7gUphOPSW2IjUYOBkFB9mMlwRKt0gDvre3M9Ix0IOKCo7 +ELqalW92rSb3+eTZVen1WoCTFBWWwSPXjsDixzJjuKOCuLIieMCt63Eng2d+cCIj +ymJ744efKeRJaNvF2iXBCJfQGEixlG1H4KSTjBnKGDWi0clijpJQJfJRnMLRLjP8 +aA5RVzwsARZ91YQp6SKu3zFP+Z8/XwhbeeDlsmkbQ8aoRcXhdhs/pMJ02A8C6k2T +pQARAQABiQIfBBgBCAAJBQJS6GQoAhsgAAoJENNvdpvBGATwSx4P/0lbTys+j9AM +UEfEYjcG+C8lsqrqnK9u1bjDAQBNldg7IzeUIeQlZZF8d2RDemtxnMzs0B4MMEPK +AgAltWfkezk12g1vroo1m2fKxSWEDq7pyUhRlBeggFLDWagyushIHrAXhcNvyf5n +03EZ4n8EZ03ejxN+6IWxViV14t0KuzccKPYTwLhlbNQN8YB1k0Y6ezZd8gpX4+e2 +K3WD83mxpFmhhNsGqvbLsuJfXdPcWrAYpFgBF04qvYmgSdPeSid68k3Mek0eQyFj +gCBA0RktKaLVWEslAXyzG1iVzTydabhFQrfA1/GMVJwDgN9HjhzZecerg88KiY03 +pI5dNuzQZnt0Cs0oPcL409ZYBCiv4b6JwLxMaPAAkruqp75Eb3RRzvM8netevnt2 +lMSYDR8Kt1TjPfPWH64vuSLoJ0ihSEHd4G92CN5xYVYOwBrwokJy2rj/Gaz9fZHn +xOaFtWtkR9hytlqsz4qpZ71dKgsZ5LxXETygRQ0RSbMT5uKIMhRbSbOVB3gE8gwU +rhWObwGL2WVaSDEM4SyaJEWyHy6+38ir7QhVTDcHQRoU0/N0Acy1AsltoJUIiaqU +TdWxjplUY0GFt0OQINvEdhWtEBe4ATFK/17BKLxKk22kVbx0fMd0mR939AYIbwNi +dWWyjlhmVl4Uqre/7WqbsR7nT9Sd+fbIuQENBFUa+BEBCACrJ+CRz1mNqq0Qcofc ++4h9PzMBLApwGNQySQ5QCMtIu5Iz4rTT305iFFQSBFzKQSNPjm7pkAzMMs+CWaD8 +0gazgiO8yvm1Fa00hGJWCxr5dbp9/w8u1hfXUSMVg6mf+D09iBLMa2a4pNJcafvp +1/Edk7VAG0q7WrhIBErHclWSh6T05jIjS81ydeO6mp8At8Vkw2oEM1RGnBGYCIq4 +pPhKkQsBDRcz3h1BSrv5uPGyBvXVBJZ4n38m3iETG8jHFPS5OiHSzU4j9Q4nVutb +Wk26l33VObkd4NYru95UsQ2ZGETBCW5tkLwugW7A8D2mQkTQsRLv9KO0hudY0HqX +uh3pABEBAAGJA0QEGAEIAA8CGwIFAlc0FXQFCQMGa2MBKcBdIAQZAQgABgUCVRr4 +EQAKCRDy+VlWlQ2Bo19UCACAVs9F065EDpeZJcH1ep6dzS/qdctES0qDl6F+CVOj +v9iCTs1OkpZ9Y8gOazEfeCT5tXylyr82RV28CImAKER8tIhAi9Bvss9abXihoKpL +t8en97QTBIveZ+4MXwzbJGljIuZ/Ytfz33o8T4Ojd4QLPuLq75uESnum3KcoF3LA +MUCrpsoKsggp2VQHtFxgFsSd3GjIJBy+efexz5F+uM8Q1BrkZh2kwq9NZ3QdG2Kq +wTVTMI6MIty5UV4re1v25VrmbCrHmWtWw2aY90HWikfMQuF0n+PWyRI1dhNaFvG7 +SeMXCgdOEvhYzbQ/HBePrrV+G4fjeODu70mZZZIecDC9CRDTb3abwRgE8D0CD/0S +gvkU/3GJR1ntplro3/uzZ0fcZL/Ea7ydSEGpsZVJq/nH64BDXQZSZ7UJotQdAlQ6 +f72/V3r57Aix2rtF90Vu6olUtBdYEkadaSMTVkI8jjHvWeRs8iY8iOIdflikzF6b +92nGxckjSAUL6GYTnxWizw39s20K6cO4zOC/0CDhjzvtmoA0OinkWUbjWMWf9pLP +3KKfD7p+hrUzO4GrPx7mwNoj6uA1KUVynQSGa0V6OXUGjQ3ey7xDL2a32dF9PI8e +UMAW4klzxX9Kbcam+NxiHtTAjMBBQ0Xt0j6irJPmsmxm8pa/D+4SlEDjsQU2q6eE +UwPvKBtxdS1N1AdZWqMlQSHnGNOWkljMi9nrhyHAXgeJjbnIFryHW4/+aBLccdaL +mnMwetaDRDj8EmPDZTiNHQUDCCFYoZ+Kc76kGd4UadxpW3LOg8sjmn3MYdiXXRQs +/2p+Q6iFACuVSxnCz12sumynfHWiQwVGAd1FBuIgb7FuxX6FOLaybew/IMg5RzuD +y9fI7Z3yHtHUcMZhhQaQvkiebbZcQlZhkZIX6Uk8csCBcClFrH9wG4NU2Jr+25oa +nHoyj2c+ABd5mZ6P90UC80xSllOoH5DkCeRUBKuAZG0g+g64QKWTjwSxfY6sFd+h +210NTXaQ9iRPNVNv8cjHY0HHPzw9mQBi5CojnSgyLrkBDQRVGvi/AQgAryab03tW +ugiN40UYPEASlLcR0e01ZAwrESMwCexNejebacke6fk1v4pEebBvm0fu/8GeIY78 +ley9CBIoDOHzTTQMWXUBMtG5vxPzUgP5U/R0CWvXF9PgyrCOsWQjORqfIfUctQ2Q +KjaSEi3jt0U9gVM84Dtj/SlyfZyJvuTy15Q3mNLEA2hiEkLCYS77+tUaXeCFl5en +p2mQgBSrfnmzfCckuwa0nbmo4p6V0yreX6939c9zakMxzvWCh/SlZUyLgRkH5FOk +gb3Of6lR0DHkNG9uJOMEr+f6XCbwYPDTU6EZumyVQ2WW98s0uIIU0Qmbc/EnpnYc +zlbbdNS8C8aq8QARAQABiQIlBBgBCAAPAhsMBQJXNBWHBQkDBmrIAAoJENNvdpvB +GATwTaMQAIumhk7daTsZ0XFfDszHwiig+Kw46KpWoCm0zZn9rPxYbU+s8+qe2E/W +G4HxdwwKDMjBajsEzHgjj/p02et5LGZMKN+TT2sZX0oYhVLS8/BLrXW4Nhq9+qL1 +uGUTOcctR3ebsqNTFpevtqD4jD7galFv38BIa0G8M6YdKiH5kFzWfz760L03jdNn +HmnnG+x/S/5+uHj5ClpRjhzskS5Bn1gWAqvARcbst/jfwXV43o5Pprno3kfNkWEA +QYVLlOY8+i4JP0xBlx7sYN+s9FE00vYZWdABKis9+OoD4qnhxVE6EbHhfoW0pFei +osDr3/iWfWP1Bcrv2EPO23R7etRf5p7ERKt0p1qYPAiAJuLKzvuAreVdBszYRJSo +zM8Ka+t2Be95HDSBhonI+n2ec8J2IS/dfnUOXwg+MNMcX5jOyxo0RMkhKu8+4iN3 +ECB2+zA8OQswDklU3OfGlWwHKwbgcAicuj6yHQqpyheuRsNHq1wCTbkDYoGoI0mV +PNl5ZjIC1RhnEzfdXww6lZ//P9KuZm9oyhaRVKhEzRP/X8Py8Q78kcnFenF0MsEg +2LB3+NMIdzFRG1rjHLYuxUD28jHVx/i6LDIVVVuNZXGupZD3m2akgnCoTQdnjmob +f8VjXorvasXo5vDJWTGegQbq0vI6RmJ2fnIVj4W/H6bW8gU4GFdruQENBFUbKLcB +CACwhMqbwVAiwY2NvYvSuzyPAojv7DhTEsuSvyEhLoWUUs+HvkTc6yV3OEikM4/5 +ztfv5s8PFBBzi4i0WdSa4DivBe3rCyv4KUN7TFSZzTpAh/bCYBCXaU/hWAzRn1pX +JrRA8dkt4KXcTzkCJV1yuwcGOojMdmU64orSgZAwykf2dc/mUkSM1pMPD2ZwC0Uc +0zm0e6gfndJu2p3O1pUgKRciJe+eKlvhXTg0l8/hKH8KvUnlWrFePTbQ/zWQq4YC +lNI1rUo2Gf6zJBCwhe1Bata8dqtIpagiMCegr8069Mts9V2H2SdMIPNyWP6CP5ON +UfESWt+AYZHMEFAsoJJrK/YXABEBAAGJAiUEGAEIAA8CGyAFAlc0FZsFCQMGOuQA +CgkQ0292m8EYBPCanA//aA+ByDFR/JyzsWnFXwgkcR6CYRqYwq4cxIoL97RGIAdn +ZFyqWAMr0TGofFrcy0U2yHKUPa6ia0QI64Lq+SzibmmVqSqq5u+d/b6ZfgvBgN6o +FGwSAlwJwgXi0sK/jC+RYzw9oLWvOd+KTtKG4spNoHYKkP/Hwka9gieuuyg1hjB+ +gi1b3RKKsXB7/Q0E7lkO/UqxZqyP7gCa7bYMhfrC8Y7HSsJ5QtGy9VBf4b+U4PEK +FLYV4SZHh7LYlQaxSgzXarH+0u2Rrds+Kfwxwxs0k7fl7gCPj7gBhzErEcFYqhmg +NGgjrxA9Zw+HXmvtdRRWBU8l/L4DPNRW4SeBkNJUAa6SfJ9fMhflzV0lx+AlP/XN +Ftv2HJ7jbwUDq3vAK/dLKINrAMYOgG16pQY7HRicP63//BXqq7Sh5cbr/uvAN+aK +YYoOaIo3KjMxhev2MLENS9BuN1ACUVqWO9aXJ1VmVoroiyLxFjrxOEEGNQY7Vws1 +Slzhvb504g9Uo+cBy9HsXYh5BXZeaqra1qbMerN/WJPOCfQENE2g8jj9x4Mi4mZo +1gmiwCZiD+KvXfmwtZsvrLaV9FAnWDkJu8w/8yFUWeNVuvW0t5xXcZNv/Nwb2ONO +vsF9NoZ1s0BZ++jraVFCtbO0yETBj4YBP0T5aFKBM3zUE6HGz3E3xgx1w0dAg4c= +=oRMW +-----END PGP PUBLIC KEY BLOCK----- diff --git a/src/_nfdos/e2fsprogs/debian/uuid-dev.README.Debian b/src/_nfdos/e2fsprogs/debian/uuid-dev.README.Debian new file mode 100644 index 0000000..a4f047e --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/uuid-dev.README.Debian @@ -0,0 +1,23 @@ + +In order to sanitize e2fsprogs to be DFSG free, the file +draft-leach-uuids-guids-01.txt has been removed. It can be obtained +by downloading e2fsprogs from the upstream sources. It may also be +available from other sites on the network, if you do a quick web +search for the string "draft-leach-uuids-guids-01". + +Note that debian/rules is set up to include the file on Ubuntu +systems, so for people trying to build e2fsprogs on Ubuntu systems, +they should start from the upstream sources, and not the +Debian-expurgated sources found in the Debian repository. (n.b., for +WIP releases the command "./util/gen-tarball ubuntu" will help create +tar file which is appropriately named to make life easier for +dpkg-buildpackage.) Since Ubuntu doesn't have the DFSG restrictions, +the documentation which has been removed for Debian's DFSG license +purity shouldn't be denied to Ubuntu users. + + Theodore Ts'o + October 3, 2006 + + + + diff --git a/src/_nfdos/e2fsprogs/debian/uuid-dev.install b/src/_nfdos/e2fsprogs/debian/uuid-dev.install new file mode 100644 index 0000000..534b92c --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/uuid-dev.install @@ -0,0 +1,5 @@ +usr/lib/*/libuuid.so +usr/lib/*/libuuid.a +usr/include/uuid/* +usr/share/man/man3/uuid* +usr/lib/*/pkgconfig/uuid.pc diff --git a/src/_nfdos/e2fsprogs/debian/uuid-runtime.install b/src/_nfdos/e2fsprogs/debian/uuid-runtime.install new file mode 100644 index 0000000..ff8d87a --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/uuid-runtime.install @@ -0,0 +1,4 @@ +usr/bin/uuidgen +usr/sbin/uuidd +usr/share/man/man8/uuidd.* +usr/share/man/man1/uuidgen.* diff --git a/src/_nfdos/e2fsprogs/debian/uuid-runtime.lintian-overrides b/src/_nfdos/e2fsprogs/debian/uuid-runtime.lintian-overrides new file mode 100644 index 0000000..4642d30 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/uuid-runtime.lintian-overrides @@ -0,0 +1 @@ +uuid-runtime: command-with-path-in-maintainer-script prerm:5 /usr/sbin/uuidd diff --git a/src/_nfdos/e2fsprogs/debian/uuid-runtime.postinst b/src/_nfdos/e2fsprogs/debian/uuid-runtime.postinst new file mode 100644 index 0000000..3c1adb6 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/uuid-runtime.postinst @@ -0,0 +1,15 @@ +#!/bin/sh + +set -e +if ! getent group | grep -q libuuid; then +groupadd -f -K GID_MIN=1 -K GID_MAX=999 libuuid +fi +if ! getent passwd | grep -q libuuid; then + useradd -d /var/lib/libuuid -K UID_MIN=1 -K UID_MAX=499 -g libuuid libuuid +fi +chown libuuid:libuuid /usr/sbin/uuidd +chmod 6755 /usr/sbin/uuidd + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/uuid-runtime.postrm b/src/_nfdos/e2fsprogs/debian/uuid-runtime.postrm new file mode 100644 index 0000000..f077001 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/uuid-runtime.postrm @@ -0,0 +1,10 @@ +#!/bin/sh +set -e +if [ "$1" = purge ] +then + rm -rf /var/run/uuidd +fi + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/uuid-runtime.prerm b/src/_nfdos/e2fsprogs/debian/uuid-runtime.prerm new file mode 100644 index 0000000..904e161 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/uuid-runtime.prerm @@ -0,0 +1,10 @@ +#! /bin/sh +set -e +if [ -x /usr/sbin/uuidd ] +then + /usr/sbin/uuidd -k || true +fi + +#DEBHELPER# + +exit 0 diff --git a/src/_nfdos/e2fsprogs/debian/uuid-runtime.shlibs.local b/src/_nfdos/e2fsprogs/debian/uuid-runtime.shlibs.local new file mode 100644 index 0000000..5d97674 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/uuid-runtime.shlibs.local @@ -0,0 +1 @@ +libuuid 1 libuuid1 (> 1.40.3-1) diff --git a/src/_nfdos/e2fsprogs/debian/watch b/src/_nfdos/e2fsprogs/debian/watch new file mode 100644 index 0000000..f2df3dd --- /dev/null +++ b/src/_nfdos/e2fsprogs/debian/watch @@ -0,0 +1,5 @@ +version=4 +opts="pgpsigurlmangle=s%$%.asc%" \ + http://sf.net/e2fsprogs/e2fsprogs-([0-9].+)\.tar\.gz +#ftp://ftp.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/e2fsprogs-([0-9].+)\.tar\.gz + diff --git a/src/_nfdos/e2fsprogs/debugfs/Android.bp b/src/_nfdos/e2fsprogs/debugfs/Android.bp new file mode 100644 index 0000000..4d087b3 --- /dev/null +++ b/src/_nfdos/e2fsprogs/debugfs/Android.bp @@ -0,0 +1,80 @@ +// Copyright 2017 The Android Open Source Project + +//######################## +// Build the debugfs binary + +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "external_e2fsprogs_license" + // to get the below license kinds: + // SPDX-license-identifier-GPL + // SPDX-license-identifier-GPL-2.0 + default_applicable_licenses: ["external_e2fsprogs_license"], +} + +cc_defaults { + name: "debugfs-defaults", + defaults: ["e2fsprogs-defaults"], + srcs: [ + "debug_cmds.c", + "debugfs.c", + "util.c", + "ncheck.c", + "icheck.c", + "ls.c", + "lsdel.c", + "dump.c", + "set_fields.c", + "logdump.c", + "htree.c", + "unused.c", + "e2freefrag.c", + "filefrag.c", + "extent_cmds.c", + "extent_inode.c", + "zap.c", + "quota.c", + "xattrs.c", + "journal.c", + "revoke.c", + "recovery.c", + "do_journal.c", + ], + cflags: [ + "-DDEBUGFS", + ], + include_dirs: [ + "external/e2fsprogs/misc", + "external/e2fsprogs/e2fsck", + ], +} + +debugfs_libs = [ + "libext2_misc", + "libext2fs", + "libext2_blkid", + "libext2_uuid", + "libext2_ss", + "libext2_quota", + "libext2_com_err", + "libext2_e2p", + "libext2_support", +] + +cc_binary { + name: "debugfs", + host_supported: true, + defaults: ["debugfs-defaults"], + + shared_libs: debugfs_libs, +} + +cc_binary { + name: "debugfs_static", + static_executable: true, + host_supported: true, + defaults: ["debugfs-defaults"], + + static_libs: debugfs_libs, +} diff --git a/src/_nfdos/e2fsprogs/debugfs/debug_cmds.ct b/src/_nfdos/e2fsprogs/debugfs/debug_cmds.ct new file mode 100644 index 0000000..1ff6c9d --- /dev/null +++ b/src/_nfdos/e2fsprogs/debugfs/debug_cmds.ct @@ -0,0 +1,233 @@ +# +# Copyright (C) 1993 Theodore Ts'o. This file may be redistributed +# under the terms of the GNU Public License. +# +command_table debug_cmds; + +request do_show_debugfs_params, "Show debugfs parameters", + show_debugfs_params, params; + +request do_open_filesys, "Open a filesystem", + open_filesys, open; + +request do_close_filesys, "Close the filesystem", + close_filesys, close; + +request do_freefrag, "Report free space fragmentation", + freefrag, e2freefrag; + +request do_features, "Set/print superblock features", + feature, features; + +request do_dirty_filesys, "Mark the filesystem as dirty", + dirty_filesys, dirty; + +request do_init_filesys, "Initialize a filesystem (DESTROYS DATA)", + init_filesys; + +request do_show_super_stats, "Show superblock statistics", + show_super_stats, stats; + +request do_ncheck, "Do inode->name translation", + ncheck; + +request do_icheck, "Do block->inode translation", + icheck; + +request do_chroot, "Change root directory", + change_root_directory, chroot; + +request do_change_working_dir, "Change working directory", + change_working_directory, cd; + +request do_list_dir, "List directory", + list_directory, ls; + +request do_stat, "Show inode information ", + show_inode_info, stat; + +request do_dump_extents, "Dump extents information ", + dump_extents, extents, ex; + +request do_blocks, "Dump blocks used by an inode ", + blocks; + +request do_filefrag, "Report fragmentation information for an inode", + filefrag; + +request do_link, "Create directory link", + link, ln; + +request do_unlink, "Delete a directory link", + unlink; + +request do_mkdir, "Create a directory", + mkdir; + +request do_rmdir, "Remove a directory", + rmdir; + +request do_rm, "Remove a file (unlink and kill_file, if appropriate)", + rm; + +request do_kill_file, "Deallocate an inode and its blocks", + kill_file; + +request do_copy_inode, "Copy the inode structure", + copy_inode; + +request do_clri, "Clear an inode's contents", + clri; + +request do_freei, "Clear an inode's in-use flag", + freei; + +request do_seti, "Set an inode's in-use flag", + seti; + +request do_testi, "Test an inode's in-use flag", + testi; + +request do_freeb, "Clear a block's in-use flag", + freeb; + +request do_setb, "Set a block's in-use flag", + setb; + +request do_testb, "Test a block's in-use flag", + testb; + +request do_modify_inode, "Modify an inode by structure", + modify_inode, mi; + +request do_find_free_block, "Find free block(s)", + find_free_block, ffb; + +request do_find_free_inode, "Find free inode(s)", + find_free_inode, ffi; + +request do_print_working_directory, "Print current working directory", + print_working_directory, pwd; + +request do_expand_dir, "Expand directory", + expand_dir, expand; + +request do_mknod, "Create a special file", + mknod; + +request do_lsdel, "List deleted inodes", + list_deleted_inodes, lsdel; + +request do_undel, "Undelete file", + undelete, undel; + +request do_write, "Copy a file from your native filesystem", + write; + +request do_dump, "Dump an inode out to a file", + dump_inode, dump; + +request do_cat, "Dump an inode out to stdout", + cat; + +request do_lcd, "Change the current directory on your native filesystem", + lcd; + +request do_rdump, "Recursively dump a directory to the native filesystem", + rdump; + +request do_set_super, "Set superblock value", + set_super_value, ssv; + +request do_set_inode, "Set inode field", + set_inode_field, sif; + +request do_set_block_group_descriptor, "Set block group descriptor field", + set_block_group, set_bg; + +request do_logdump, "Dump the contents of the journal", + logdump; + +request do_htree_dump, "Dump a hash-indexed directory", + htree_dump, htree; + +request do_dx_hash, "Calculate the directory hash of a filename", + dx_hash, hash; + +request do_dirsearch, "Search a directory for a particular filename", + dirsearch; + +request do_bmap, "Calculate the logical->physical block mapping for an inode", + bmap; + +request do_fallocate, "Allocate uninitialized blocks to an inode", + fallocate; + +request do_punch, "Punch (or truncate) blocks from an inode by deallocating them", + punch, truncate; + +request do_symlink, "Create a symbolic link", + symlink; + +request do_imap, "Calculate the location of an inode", + imap; + +request do_dump_unused, "Dump unused blocks", + dump_unused; + +request do_set_current_time, "Set current time to use when setting filesystem fields", + set_current_time; + +request do_supported_features, "Print features supported by this version of e2fsprogs", + supported_features; + +request do_dump_mmp, "Dump MMP information", + dump_mmp; + +request do_set_mmp_value, "Set MMP value", + set_mmp_value, smmp; + +request do_extent_open, "Open inode for extent manipulation", + extent_open, eo; + +request do_zap_block, "Zap block: fill with 0, pattern, flip bits etc.", + zap_block, zap; + +request do_block_dump, "Dump contents of a block", + block_dump, bdump, bd; + +request do_list_xattr, "List extended attributes of an inode", + ea_list; + +request do_get_xattr, "Get an extended attribute of an inode", + ea_get; + +request do_set_xattr, "Set an extended attribute of an inode", + ea_set; + +request do_rm_xattr, "Remove an extended attribute of an inode", + ea_rm; + +request do_list_quota, "List quota", + list_quota, lq; + +request do_get_quota, "Get quota", + get_quota, gq; + +request do_idump, "Dump the inode structure in hex", + inode_dump, idump, id; + +request do_journal_open, "Open the journal", + journal_open, jo; + +request do_journal_close, "Close the journal", + journal_close, jc; + +request do_journal_write, "Write a transaction to the journal", + journal_write, jw; + +request do_journal_run, "Recover the journal", + journal_run, jr; + +end; + diff --git a/src/_nfdos/e2fsprogs/debugfs/debugfs.8.in b/src/_nfdos/e2fsprogs/debugfs/debugfs.8.in new file mode 100644 index 0000000..5b5329c --- /dev/null +++ b/src/_nfdos/e2fsprogs/debugfs/debugfs.8.in @@ -0,0 +1,880 @@ +.\" -*- nroff -*- +.\" Copyright 1993, 1994, 1995 by Theodore Ts'o. All Rights Reserved. +.\" This file may be copied under the terms of the GNU Public License. +.\" +.TH DEBUGFS 8 "@E2FSPROGS_MONTH@ @E2FSPROGS_YEAR@" "E2fsprogs version @E2FSPROGS_VERSION@" +.SH NAME +debugfs \- ext2/ext3/ext4 file system debugger +.SH SYNOPSIS +.B debugfs +[ +.B \-DVwcin +] +[ +.B \-b +blocksize +] +[ +.B \-s +superblock +] +[ +.B \-f +cmd_file +] +[ +.B \-R +request +] +[ +.B \-d +data_source_device +] +[ +.B \-z +.I undo_file +] +[ +device +] +.SH DESCRIPTION +The +.B debugfs +program is an interactive file system debugger. It can be used to +examine and change the state of an ext2, ext3, or ext4 file system. +.PP +.I device +is a block device (e.g., /dev/sdXX) or a file containing the file system. +.SH OPTIONS +.TP +.I \-w +Specifies that the file system should be opened in read-write mode. +Without this option, the file system is opened in read-only mode. +.TP +.I \-n +Disables metadata checksum verification. This should only be used if +you believe the metadata to be correct despite the complaints of +e2fsprogs. +.TP +.I \-c +Specifies that the file system should be opened in catastrophic mode, in +which the inode and group bitmaps are not read initially. This can be +useful for file systems with significant corruption, but because of this, +catastrophic mode forces the file system to be opened read-only. +.TP +.I \-i +Specifies that +.I device +represents an ext2 image file created by the +.B e2image +program. Since the ext2 image file only contains the superblock, block +group descriptor, block and inode allocation bitmaps, and +the inode table, many +.B debugfs +commands will not function properly. +.B Warning: +no safety checks are in place, and +.B debugfs +may fail in interesting ways if commands such as +.IR ls ", " dump ", " +etc. are tried without specifying the +.I data_source_device +using the +.I \-d +option. +.B debugfs +is a debugging tool. It has rough edges! +.TP +.I -d data_source_device +Used with the +.I \-i +option, specifies that +.I data_source_device +should be used when reading blocks not found in the ext2 image file. +This includes data, directory, and indirect blocks. +.TP +.I -b blocksize +Forces the use of the given block size (in bytes) for the file system, +rather than detecting the correct block size automatically. (This +option is rarely needed; it is used primarily when the file system is +extremely badly damaged/corrupted.) +.TP +.I -s superblock +Causes the file system superblock to be read from the given block +number, instead of using the primary superblock (located at an offset of +1024 bytes from the beginning of the file system). If you specify the +.I -s +option, you must also provide the blocksize of the file system via the +.I -b +option. (This +option is rarely needed; it is used primarily when the file system is +extremely badly damaged/corrupted.) +.TP +.I -f cmd_file +Causes +.B debugfs +to read in commands from +.IR cmd_file , +and execute them. When +.B debugfs +is finished executing those commands, it will exit. +.TP +.I -D +Causes +.B debugfs +to open the device using Direct I/O, bypassing the buffer cache. Note +that some Linux devices, notably device mapper as of this writing, do +not support Direct I/O. +.TP +.I -R request +Causes +.B debugfs +to execute the single command +.IR request , +and then exit. +.TP +.I -V +print the version number of +.B debugfs +and exit. +.TP +.BI \-z " undo_file" +Before overwriting a file system block, write the old contents of the block to +an undo file. This undo file can be used with e2undo(8) to restore the old +contents of the file system should something go wrong. If the empty string is +passed as the undo_file argument, the undo file will be written to a file named +debugfs-\fIdevice\fR.e2undo in the directory specified via the +\fIE2FSPROGS_UNDO_DIR\fR environment variable. + +WARNING: The undo file cannot be used to recover from a power or system crash. +.SH SPECIFYING FILES +Many +.B debugfs +commands take a +.I filespec +as an argument to specify an inode (as opposed to a pathname) +in the file system which is currently opened by +.BR debugfs . +The +.I filespec +argument may be specified in two forms. The first form is an inode +number surrounded by angle brackets, e.g., +.IR <2> . +The second form is a pathname; if the pathname is prefixed by a forward slash +('/'), then it is interpreted relative to the root of the file system +which is currently opened by +.BR debugfs . +If not, the pathname is +interpreted relative to the current working directory as maintained by +.BR debugfs . +This may be modified by using the +.B debugfs +command +.IR cd . +.\" +.\" +.\" +.SH COMMANDS +This is a list of the commands which +.B debugfs +supports. +.TP +.BI blocks " filespec" +Print the blocks used by the inode +.I filespec +to stdout. +.TP +.BI bmap " [ -a ] filespec logical_block [physical_block]" +Print or set the physical block number corresponding to the logical block number +.I logical_block +in the inode +.IR filespec . +If the +.I \-a +flag is specified, try to allocate a block if necessary. +.TP +.BI block_dump " '[ -x ] [-f filespec] block_num" +Dump the file system block given by +.I block_num +in hex and ASCII format to the console. If the +.I \-f +option is specified, the block number is relative to the start of the given +.BR filespec . +If the +.I \-x +option is specified, the block is interpreted as an extended attribute +block and printed to show the structure of extended attribute data +structures. +.TP +.BI cat " filespec" +Dump the contents of the inode +.I filespec +to stdout. +.TP +.BI cd " filespec" +Change the current working directory to +.IR filespec . +.TP +.BI chroot " filespec" +Change the root directory to be the directory +.IR filespec . +.TP +.BI close " [-a]" +Close the currently open file system. If the +.I -a +option is specified, write out any changes to the superblock and block +group descriptors to all of the backup superblocks, not just to the +master superblock. +.TP +.BI clri " filespec" +Clear the contents of the inode +.IR filespec . +.TP +.BI copy_inode " source_inode destination_inode" +Copy the contents of the inode structure in +.I source_inode +and use it to overwrite the inode structure at +.IR destination_inode . +.TP +.BI dirsearch " filespec filename" +Search the directory +.I filespec +for +.IR filename . +.TP +.BI dirty " [-clean]" +Mark the file system as dirty, so that the superblocks will be written on exit. +Additionally, clear the superblock's valid flag, or set it if +.I -clean +is specified. +.TP +.BI dump " [-p] filespec out_file" +Dump the contents of the inode +.I filespec +to the output file +.IR out_file . +If the +.I -p +option is given set the owner, group and permissions information on +.I out_file +to match +.IR filespec . +.TP +.BI dump_mmp " [mmp_block]" +Display the multiple-mount protection (mmp) field values. If +.I mmp_block +is specified then verify and dump the MMP values from the given block +number, otherwise use the +.B s_mmp_block +field in the superblock to locate and use the existing MMP block. +.TP +.BI dx_hash " [-h hash_alg] [-s hash_seed] filename" +Calculate the directory hash of +.IR filename . +The hash algorithm specified with +.I -h +may be +.BR legacy , " half_md4" ", or " tea . +The hash seed specified with +.I -s +must be in UUID format. +.TP +.BI dump_extents " [-n] [-l] filespec" +Dump the extent tree of the inode +.IR filespec . +The +.I -n +flag will cause +.B dump_extents +to only display the interior nodes in the extent tree. The +.I -l +flag will cause +.B dump_extents +to only display the leaf nodes in the extent tree. +.IP +(Please note that the length and range of blocks for the last extent in +an interior node is an estimate by the extents library functions, and is +not stored in file system data structures. Hence, the values displayed +may not necessarily by accurate and does not indicate a problem or +corruption in the file system.) +.TP +.B dump_unused +Dump unused blocks which contain non-null bytes. +.TP +.BI ea_get " [-f outfile]|[-xVC] [-r] filespec attr_name" +Retrieve the value of the extended attribute +.I attr_name +in the file +.I filespec +and write it either to stdout or to \fIoutfile\fR. +.TP +.BI ea_list " filespec +List the extended attributes associated with the file +.I filespec +to standard output. +.TP +.BI ea_set " [-f infile] [-r] filespec attr_name attr_value +Set the value of the extended attribute +.I attr_name +in the file +.I filespec +to the string value +.I attr_value +or read it from \fIinfile\fR. +.TP +.BI ea_rm " filespec attr_names... +Remove the extended attribute +.I attr_name +from the file \fIfilespec\fR. +.TP +.BI expand_dir " filespec" +Expand the directory +.IR filespec . +.TP +.BI fallocate " filespec start_block [end_block] +Allocate and map uninitialized blocks into \fIfilespec\fR between +logical block \fIstart_block\fR and \fIend_block\fR, inclusive. If +\fIend_block\fR is not supplied, this function maps until it runs out +of free disk blocks or the maximum file size is reached. Existing +mappings are left alone. +.TP +.BI feature " [fs_feature] [-fs_feature] ..." +Set or clear various file system features in the superblock. After setting +or clearing any file system features that were requested, print the current +state of the file system feature set. +.TP +.BI filefrag " [-dvr] filespec" +Print the number of contiguous extents in +.IR filespec . +If +.I filespec +is a directory and the +.I -d +option is not specified, +.I filefrag +will print the number of contiguous extents for each file in +the directory. The +.I -v +option will cause +.I filefrag +print a tabular listing of the contiguous extents in the +file. The +.I -r +option will cause +.I filefrag +to do a recursive listing of the directory. +.TP +.BI find_free_block " [count [goal]]" +Find the first +.I count +free blocks, starting from +.I goal +and allocate it. Also available as +.BR ffb . +.TP +.BI find_free_inode " [dir [mode]]" +Find a free inode and allocate it. If present, +.I dir +specifies the inode number of the directory +which the inode is to be located. The second +optional argument +.I mode +specifies the permissions of the new inode. (If the directory bit is set +on the mode, the allocation routine will function differently.) Also +available as +.BR ffi . +.TP +.BI freeb " block [count]" +Mark the block number +.I block +as not allocated. +If the optional argument +.I count +is present, then +.I count +blocks starting at block number +.I block +will be marked as not allocated. +.TP +.BI freefrag " [-c chunk_kb]" +Report free space fragmentation on the currently open file system. +If the +.I \-c +option is specified then the filefrag command will print how many free +chunks of size +.I chunk_kb +can be found in the file system. The chunk size must be a power of two +and be larger than the file system block size. +.TP +.BI freei " filespec [num]" +Free the inode specified by +.IR filespec . +If +.I num +is specified, also clear num-1 inodes after the specified inode. +.TP +.BI get_quota " quota_type id" +Display quota information for given quota type (user, group, or project) and ID. +.TP +.B help +Print a list of commands understood by +.BR debugfs . +.TP +.BI htree_dump " filespec" +Dump the hash-indexed directory +.IR filespec , +showing its tree structure. +.TP +.BI icheck " block ..." +Print a listing of the inodes which use the one or more blocks specified +on the command line. +.TP +.BI inode_dump " [-b]|[-e]|[-x] filespec" +Print the contents of the inode data structure in hex and ASCII format. +The +.I \-b +option causes the command to only dump the contents of the +.B i_blocks +array. The +.I \-e +option causes the command to only dump the contents of the extra inode +space, which is used to store in-line extended attributes. The +.I \-x +option causes the command to dump the extra inode space interpreted and +extended attributes. This is useful to debug corrupted inodes +containing extended attributes. +.TP +.BI imap " filespec" +Print the location of the inode data structure (in the inode table) +of the inode +.IR filespec . +.TP +.BI init_filesys " device blocksize" +Create an ext2 file system on +.I device +with device size +.IR blocksize . +Note that this does not fully initialize all of the data structures; +to do this, use the +.BR mke2fs (8) +program. This is just a call to the low-level library, which sets up +the superblock and block descriptors. +.TP +.BI journal_close +Close the open journal. +.TP +.BI journal_open " [-c] [-v ver] [-f ext_jnl] +Opens the journal for reading and writing. Journal checksumming can +be enabled by supplying \fI-c\fR; checksum formats 2 and 3 can be +selected with the \fI-v\fR option. An external journal can be loaded +from \fIext_jnl\fR. +.TP +.BI journal_run +Replay all transactions in the open journal. +.TP +.BI journal_write " [-b blocks] [-r revoke] [-c] file +Write a transaction to the open journal. The list of blocks to write +should be supplied as a comma-separated list in \fIblocks\fR; the +blocks themselves should be readable from \fIfile\fR. A list of +blocks to revoke can be supplied as a comma-separated list in +\fIrevoke\fR. By default, a commit record is written at the end; the +\fI-c\fR switch writes an uncommitted transaction. +.TP +.BI kill_file " filespec" +Deallocate the inode +.I filespec +and its blocks. Note that this does not remove any directory +entries (if any) to this inode. See the +.BR rm (1) +command if you wish to unlink a file. +.TP +.BI lcd " directory" +Change the current working directory of the +.B debugfs +process to +.I directory +on the native file system. +.TP +.BI list_quota " quota_type" +Display quota information for given quota type (user, group, or project). +.TP +.BI ln " filespec dest_file" +Create a link named +.I dest_file +which is a hard link to +.IR filespec . +Note this does not adjust the inode reference counts. +.TP +.BI logdump " [-acsOS] [-b block] [-n num_trans ] [-i filespec] [-f journal_file] [output_file]" +Dump the contents of the ext3 journal. By default, dump the journal inode as +specified in the superblock. However, this can be overridden with the +.I \-i +option, which dumps the journal from the internal inode given by +.IR filespec . +A regular file containing journal data can be specified using the +.I \-f +option. Finally, the +.I \-s +option utilizes the backup information in the superblock to locate the +journal. +.IP +The +.I \-S +option causes +.B logdump +to print the contents of the journal superblock. +.IP +The +.I \-a +option causes the +.B logdump +to print the contents of all of the descriptor blocks. +The +.I \-b +option causes +.B logdump +to print all journal records that refer to the specified block. +The +.I \-c +option will print out the contents of all of the data blocks selected by +the +.I \-a +and +.I \-b +options. +.IP +The +.I \-O +option causes logdump to display old (checkpointed) journal entries. +This can be used to try to track down journal problems even after the +journal has been replayed. +.IP +The +.I \-n +option causes +.B logdump +to continue past a journal block which is missing a magic number. +Instead, it will stop only when the entire log is printed or after +.I num_trans +transactions. +.TP +.BI ls " [-l] [-c] [-d] [-p] [-r] filespec" +Print a listing of the files in the directory +.IR filespec . +The +.I \-c +flag causes directory block checksums (if present) to be displayed. +The +.I \-d +flag will list deleted entries in the directory. +The +.I \-l +flag will list files using a more verbose format. +The +.I \-p +flag will list the files in a format which is more easily parsable by +scripts, as well as making it more clear when there are spaces or other +non-printing characters at the end of filenames. +The +.I \-r +flag will force the printing of the filename, even if it is encrypted. +.TP +.BI list_deleted_inodes " [limit]" +List deleted inodes, optionally limited to those deleted within +.I limit +seconds ago. Also available as +.BR lsdel . +.IP +This command was useful for recovering from accidental file deletions +for ext2 file systems. Unfortunately, it is not useful for this purpose +if the files were deleted using ext3 or ext4, since the inode's +data blocks are no longer available after the inode is released. +.TP +.BI modify_inode " filespec" +Modify the contents of the inode structure in the inode +.IR filespec . +Also available as +.BR mi . +.TP +.BI mkdir " filespec" +Make a directory. +.TP +.BI mknod " filespec [p|[[c|b] major minor]]" +Create a special device file (a named pipe, character or block device). +If a character or block device is to be made, the +.I major +and +.I minor +device numbers must be specified. +.TP +.BI ncheck " [-c] inode_num ..." +Take the requested list of inode numbers, and print a listing of pathnames +to those inodes. The +.I -c +flag will enable checking the file type information in the directory +entry to make sure it matches the inode's type. +.TP +.BI open " [-weficD] [-b blocksize] [-d image_filename] [-s superblock] [-z undo_file] device" +Open a file system for editing. The +.I -f +flag forces the file system to be opened even if there are some unknown +or incompatible file system features which would normally +prevent the file system from being opened. The +.I -e +flag causes the file system to be opened in exclusive mode. The +.IR -b ", " -c ", " -d ", " -i ", " -s ", " -w ", and " -D +options behave the same as the command-line options to +.BR debugfs . +.TP +.BI punch " filespec start_blk [end_blk]" +Delete the blocks in the inode ranging from +.I start_blk +to +.IR end_blk . +If +.I end_blk +is omitted then this command will function as a truncate command; that +is, all of the blocks starting at +.I start_blk +through to the end of the file will be deallocated. +.TP +.BI symlink " filespec target" +Make a symbolic link. +.TP +.B pwd +Print the current working directory. +.TP +.B quit +Quit +.B debugfs +.TP +.BI rdump " directory[...] destination" +Recursively dump +.IR directory , +or multiple +.IR directories , +and all its contents (including regular files, symbolic links, and other +directories) into the named +.IR destination , +which should be an existing directory on the native file system. +.TP +.BI rm " pathname" +Unlink +.IR pathname . +If this causes the inode pointed to by +.I pathname +to have no other references, deallocate the file. This command functions +as the unlink() system call. +.I +.TP +.BI rmdir " filespec" +Remove the directory +.IR filespec . +.TP +.BI setb " block [count]" +Mark the block number +.I block +as allocated. +If the optional argument +.I count +is present, then +.I count +blocks starting at block number +.I block +will be marked as allocated. +.TP +.BI set_block_group " bgnum field value" +Modify the block group descriptor specified by +.I bgnum +so that the block group descriptor field +.I field +has value +.IR value . +Also available as +.BR set_bg . +.TP +.BI set_current_time " time" +Set current time in seconds since Unix epoch to use when setting file system +fields. +.TP +.BI seti " filespec [num]" +Mark inode +.I filespec +as in use in the inode bitmap. If +.I num +is specified, also set num-1 inodes after the specified inode. +.TP +.BI set_inode_field " filespec field value" +Modify the inode specified by +.I filespec +so that the inode field +.I field +has value +.I value. +The list of valid inode fields which can be set via this command +can be displayed by using the command: +.B set_inode_field -l +Also available as +.BR sif . +.TP +.BI set_mmp_value " field value" +Modify the multiple-mount protection (MMP) data so that the MMP field +.I field +has value +.I value. +The list of valid MMP fields which can be set via this command +can be displayed by using the command: +.B set_mmp_value -l +Also available as +.BR smmp . +.TP +.BI set_super_value " field value" +Set the superblock field +.I field +to +.I value. +The list of valid superblock fields which can be set via this command +can be displayed by using the command: +.B set_super_value -l +Also available as +.BR ssv . +.TP +.B show_debugfs_params +Display +.B debugfs +parameters such as information about currently opened file system. +.TP +.BI show_super_stats " [-h]" +List the contents of the super block and the block group descriptors. If the +.I -h +flag is given, only print out the superblock contents. Also available as +.BR stats . +.TP +.BI stat " filespec" +Display the contents of the inode structure of the inode +.IR filespec . +.TP +.B supported_features +Display file system features supported by this version of +.BR debugfs . +.TP +.BI testb " block [count]" +Test if the block number +.I block +is marked as allocated in the block bitmap. +If the optional argument +.I count +is present, then +.I count +blocks starting at block number +.I block +will be tested. +.TP +.BI testi " filespec" +Test if the inode +.I filespec +is marked as allocated in the inode bitmap. +.TP +.BI undel " [pathname]" +Undelete the specified inode number (which must be surrounded by angle +brackets) so that it and its blocks are marked in use, and optionally +link the recovered inode to the specified pathname. The +.B e2fsck +command should always be run after using the +.B undel +command to recover deleted files. +.IP +Note that if you are recovering a large number of deleted files, linking +the inode to a directory may require the directory to be expanded, which +could allocate a block that had been used by one of the +yet-to-be-undeleted files. So it is safer to undelete all of the +inodes without specifying a destination pathname, and then in a separate +pass, use the debugfs +.B link +command to link the inode to the destination pathname, or use +.B e2fsck +to check the file system and link all of the recovered inodes to the +lost+found directory. +.TP +.BI unlink " pathname" +Remove the link specified by +.I pathname +to an inode. Note this does not adjust the inode reference counts. +.TP +.BI write " source_file out_file" +Copy the contents of +.I source_file +into a newly-created file in the file system named +.IR out_file . +.TP +.BI zap_block " [-f filespec] [-o offset] [-l length] [-p pattern] block_num" +Overwrite the block specified by +.I block_num +with zero (NUL) bytes, or if +.I -p +is given use the byte specified by +.IR pattern . +If +.I -f +is given then +.I block_num +is relative to the start of the file given by +.IR filespec . +The +.I -o +and +.I -l +options limit the range of bytes to zap to the specified +.I offset +and +.I length +relative to the start of the block. +.TP +.BI zap_block " [-f filespec] [-b bit] block_num" +Bit-flip portions of the physical +.IR block_num . +If +.I -f +is given, then +.I block_num +is a logical block relative to the start of +.IR filespec . +.SH ENVIRONMENT VARIABLES +.TP +.B DEBUGFS_PAGER, PAGER +The +.B debugfs +program always pipes the output of the some commands through a +pager program. These commands include: +.IR show_super_stats " (" stats ), +.IR list_directory " (" ls ), +.IR show_inode_info " (" stat ), +.IR list_deleted_inodes " (" lsdel ), +and +.IR htree_dump . +The specific pager can explicitly specified by the +.B DEBUGFS_PAGER +environment variable, and if it is not set, by the +.B PAGER +environment variable. +.IP +Note that since a pager is always used, the +.BR less (1) +pager is not particularly appropriate, since it clears the screen before +displaying the output of the command and clears the output the screen +when the pager is exited. Many users prefer to use the +.BR less (1) +pager for most purposes, which is why the +.B DEBUGFS_PAGER +environment variable is available to override the more general +.B PAGER +environment variable. +.SH AUTHOR +.B debugfs +was written by Theodore Ts'o . +.SH SEE ALSO +.BR dumpe2fs (8), +.BR tune2fs (8), +.BR e2fsck (8), +.BR mke2fs (8), +.BR ext4 (5) diff --git a/src/_nfdos/e2fsprogs/debugfs/debugfs.c b/src/_nfdos/e2fsprogs/debugfs/debugfs.c new file mode 100644 index 0000000..9b6321d --- /dev/null +++ b/src/_nfdos/e2fsprogs/debugfs/debugfs.c @@ -0,0 +1,2682 @@ +/* + * debugfs.c --- a program which allows you to attach an ext2fs + * filesystem and play with it. + * + * Copyright (C) 1993 Theodore Ts'o. This file may be redistributed + * under the terms of the GNU Public License. + * + * Modifications by Robert Sanders + */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_GETOPT_H +#include +#else +extern int optind; +extern char *optarg; +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_SYS_SYSMACROS_H +#include +#endif + +#include "debugfs.h" +#include "uuid/uuid.h" +#include "e2p/e2p.h" + +#include + +#include "../version.h" +#include "jfs_user.h" +#include "support/plausible.h" + +#ifndef BUFSIZ +#define BUFSIZ 8192 +#endif + +#ifdef CONFIG_JBD_DEBUG /* Enabled by configure --enable-jbd-debug */ +int journal_enable_debug = -1; +#endif + +/* + * There must be only one definition if we're hooking in extra commands or + * changing default prompt. Use -DSKIP_GLOBDEF for that. + */ +#ifndef SKIP_GLOBDEFS +ss_request_table *extra_cmds; +const char *debug_prog_name; +#endif +int ss_sci_idx; + +ext2_filsys current_fs; +quota_ctx_t current_qctx; +ext2_ino_t root, cwd; +int no_copy_xattrs; + +static int debugfs_setup_tdb(const char *device_name, char *undo_file, + io_manager *io_ptr) +{ + errcode_t retval = ENOMEM; + const char *tdb_dir = NULL; + char *tdb_file = NULL; + char *dev_name, *tmp_name; + + /* (re)open a specific undo file */ + if (undo_file && undo_file[0] != 0) { + retval = set_undo_io_backing_manager(*io_ptr); + if (retval) + goto err; + *io_ptr = undo_io_manager; + retval = set_undo_io_backup_file(undo_file); + if (retval) + goto err; + printf("Overwriting existing filesystem; this can be undone " + "using the command:\n" + " e2undo %s %s\n\n", + undo_file, device_name); + return retval; + } + + /* + * Configuration via a conf file would be + * nice + */ + tdb_dir = ss_safe_getenv("E2FSPROGS_UNDO_DIR"); + if (!tdb_dir) + tdb_dir = "/var/lib/e2fsprogs"; + + if (!strcmp(tdb_dir, "none") || (tdb_dir[0] == 0) || + access(tdb_dir, W_OK)) + return 0; + + tmp_name = strdup(device_name); + if (!tmp_name) + goto errout; + dev_name = basename(tmp_name); + tdb_file = malloc(strlen(tdb_dir) + 9 + strlen(dev_name) + 7 + 1); + if (!tdb_file) { + free(tmp_name); + goto errout; + } + sprintf(tdb_file, "%s/debugfs-%s.e2undo", tdb_dir, dev_name); + free(tmp_name); + + if ((unlink(tdb_file) < 0) && (errno != ENOENT)) { + retval = errno; + com_err("debugfs", retval, + "while trying to delete %s", tdb_file); + goto errout; + } + + retval = set_undo_io_backing_manager(*io_ptr); + if (retval) + goto errout; + *io_ptr = undo_io_manager; + retval = set_undo_io_backup_file(tdb_file); + if (retval) + goto errout; + printf("Overwriting existing filesystem; this can be undone " + "using the command:\n" + " e2undo %s %s\n\n", tdb_file, device_name); + + free(tdb_file); + return 0; +errout: + free(tdb_file); +err: + com_err("debugfs", retval, "while trying to setup undo file\n"); + return retval; +} + +static void open_filesystem(char *device, int open_flags, blk64_t superblock, + blk64_t blocksize, int catastrophic, + char *data_filename, char *undo_file) +{ + int retval; + io_channel data_io = 0; + io_manager io_ptr = unix_io_manager; + + if (superblock != 0 && blocksize == 0) { + com_err(device, 0, "if you specify the superblock, you must also specify the block size"); + current_fs = NULL; + return; + } + + if (data_filename) { + if ((open_flags & EXT2_FLAG_IMAGE_FILE) == 0) { + com_err(device, 0, + "The -d option is only valid when reading an e2image file"); + current_fs = NULL; + return; + } + retval = unix_io_manager->open(data_filename, 0, &data_io); + if (retval) { + com_err(data_filename, 0, "while opening data source"); + current_fs = NULL; + return; + } + } + + if (catastrophic) + open_flags |= EXT2_FLAG_SKIP_MMP | EXT2_FLAG_IGNORE_SB_ERRORS; + + if (undo_file) { + retval = debugfs_setup_tdb(device, undo_file, &io_ptr); + if (retval) + exit(1); + } + +try_open_again: + retval = ext2fs_open(device, open_flags, superblock, blocksize, + io_ptr, ¤t_fs); + if (retval && (retval == EXT2_ET_SB_CSUM_INVALID) && + !(open_flags & EXT2_FLAG_IGNORE_CSUM_ERRORS)) { + open_flags |= EXT2_FLAG_IGNORE_CSUM_ERRORS; + printf("Checksum errors in superblock! Retrying...\n"); + goto try_open_again; + } + if (retval) { + com_err(debug_prog_name, retval, + "while trying to open %s", device); + if (retval == EXT2_ET_BAD_MAGIC) + check_plausibility(device, CHECK_FS_EXIST, NULL); + current_fs = NULL; + return; + } + current_fs->default_bitmap_type = EXT2FS_BMAP64_RBTREE; + + if (!catastrophic) { + retval = ext2fs_read_bitmaps(current_fs); + if (retval) { + com_err(device, retval, + "while reading allocation bitmaps"); + goto errout; + } + } + + if (data_io) { + retval = ext2fs_set_data_io(current_fs, data_io); + if (retval) { + com_err(device, retval, + "while setting data source"); + goto errout; + } + } + + root = cwd = EXT2_ROOT_INO; + return; + +errout: + retval = ext2fs_close_free(¤t_fs); + if (retval) + com_err(device, retval, "while trying to close filesystem"); +} + +void do_open_filesys(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + int c, err; + int catastrophic = 0; + blk64_t superblock = 0; + blk64_t blocksize = 0; + int open_flags = EXT2_FLAG_SOFTSUPP_FEATURES | EXT2_FLAG_64BITS | + EXT2_FLAG_THREADS; + char *data_filename = 0; + char *undo_file = NULL; + + reset_getopt(); + while ((c = getopt(argc, argv, "iwfecb:s:d:Dz:")) != EOF) { + switch (c) { + case 'i': + open_flags |= EXT2_FLAG_IMAGE_FILE; + break; + case 'w': +#ifdef READ_ONLY + goto print_usage; +#else + open_flags |= EXT2_FLAG_RW; +#endif /* READ_ONLY */ + break; + case 'f': + open_flags |= EXT2_FLAG_FORCE; + break; + case 'e': + open_flags |= EXT2_FLAG_EXCLUSIVE; + break; + case 'c': + catastrophic = 1; + break; + case 'd': + data_filename = optarg; + break; + case 'D': + open_flags |= EXT2_FLAG_DIRECT_IO; + break; + case 'b': + blocksize = parse_ulong(optarg, argv[0], + "block size", &err); + if (err) + return; + break; + case 's': + err = strtoblk(argv[0], optarg, + "superblock block number", &superblock); + if (err) + return; + break; + case 'z': +#ifdef READ_ONLY + goto print_usage; +#else + undo_file = optarg; +#endif + break; + default: + goto print_usage; + } + } + if (optind != argc-1) { + goto print_usage; + } + if (check_fs_not_open(argv[0])) + return; + open_filesystem(argv[optind], open_flags, + superblock, blocksize, catastrophic, + data_filename, undo_file); + return; + +print_usage: + fprintf(stderr, "%s: Usage: open [-s superblock] [-b blocksize] " +#ifdef READ_ONLY + "[-d image_filename] [-z undo_file] [-c] [-i] [-f] [-e] [-D] " +#else + "[-d image_filename] [-c] [-i] [-f] [-e] [-D] [-w] " +#endif + "\n", argv[0]); +} + +void do_lcd(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + if (argc != 2) { + com_err(argv[0], 0, "Usage: %s %s", argv[0], ""); + return; + } + + if (chdir(argv[1]) == -1) { + com_err(argv[0], errno, + "while trying to change native directory to %s", + argv[1]); + return; + } +} + +static void close_filesystem(NOARGS) +{ + int retval; + + if (current_fs->flags & EXT2_FLAG_IB_DIRTY) { + retval = ext2fs_write_inode_bitmap(current_fs); + if (retval) + com_err("ext2fs_write_inode_bitmap", retval, 0); + } + if (current_fs->flags & EXT2_FLAG_BB_DIRTY) { + retval = ext2fs_write_block_bitmap(current_fs); + if (retval) + com_err("ext2fs_write_block_bitmap", retval, 0); + } + if (current_qctx) + quota_release_context(¤t_qctx); + retval = ext2fs_close_free(¤t_fs); + if (retval) + com_err("ext2fs_close", retval, 0); + return; +} + +void do_close_filesys(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + int c; + + if (check_fs_open(argv[0])) + return; + + reset_getopt(); + while ((c = getopt (argc, argv, "a")) != EOF) { + switch (c) { + case 'a': + current_fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY; + break; + default: + goto print_usage; + } + } + + if (argc > optind) { + print_usage: + com_err(0, 0, "Usage: close_filesys [-a]"); + return; + } + + close_filesystem(); +} + +#ifndef READ_ONLY +void do_init_filesys(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + struct ext2_super_block param; + errcode_t retval; + int err; + blk64_t blocks; + + if (common_args_process(argc, argv, 3, 3, "initialize", + " ", CHECK_FS_NOTOPEN)) + return; + + memset(¶m, 0, sizeof(struct ext2_super_block)); + err = strtoblk(argv[0], argv[2], "blocks count", &blocks); + if (err) + return; + ext2fs_blocks_count_set(¶m, blocks); + retval = ext2fs_initialize(argv[1], 0, ¶m, + unix_io_manager, ¤t_fs); + if (retval) { + com_err(argv[1], retval, "while initializing filesystem"); + current_fs = NULL; + return; + } + root = cwd = EXT2_ROOT_INO; + return; +} + +static void print_features(struct ext2_super_block * s, FILE *f) +{ + int i, j, printed=0; + __u32 *mask = &s->s_feature_compat, m; + + fputs("Filesystem features:", f); + for (i=0; i <3; i++,mask++) { + for (j=0,m=1; j < 32; j++, m<<=1) { + if (*mask & m) { + fprintf(f, " %s", e2p_feature2string(i, m)); + printed++; + } + } + } + if (printed == 0) + fputs("(none)", f); + fputs("\n", f); +} +#endif /* READ_ONLY */ + +static void print_bg_opts(ext2_filsys fs, dgrp_t group, int mask, + const char *str, int *first, FILE *f) +{ + if (ext2fs_bg_flags_test(fs, group, mask)) { + if (*first) { + fputs(" [", f); + *first = 0; + } else + fputs(", ", f); + fputs(str, f); + } +} + +void do_show_super_stats(int argc, char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + const char *units ="block"; + dgrp_t i; + FILE *out; + int c, header_only = 0; + int numdirs = 0, first, gdt_csum; + + reset_getopt(); + while ((c = getopt (argc, argv, "h")) != EOF) { + switch (c) { + case 'h': + header_only++; + break; + default: + goto print_usage; + } + } + if (optind != argc) { + goto print_usage; + } + if (check_fs_open(argv[0])) + return; + out = open_pager(); + + if (ext2fs_has_feature_bigalloc(current_fs->super)) + units = "cluster"; + + list_super2(current_fs->super, out); + if (ext2fs_has_feature_metadata_csum(current_fs->super) && + !ext2fs_superblock_csum_verify(current_fs, + current_fs->super)) { + __u32 orig_csum = current_fs->super->s_checksum; + + ext2fs_superblock_csum_set(current_fs, + current_fs->super); + fprintf(out, "Expected Checksum: 0x%08x\n", + current_fs->super->s_checksum); + current_fs->super->s_checksum = orig_csum; + } + for (i=0; i < current_fs->group_desc_count; i++) + numdirs += ext2fs_bg_used_dirs_count(current_fs, i); + fprintf(out, "Directories: %u\n", numdirs); + + if (header_only) { + close_pager(out); + return; + } + + gdt_csum = ext2fs_has_group_desc_csum(current_fs); + for (i = 0; i < current_fs->group_desc_count; i++) { + fprintf(out, " Group %2d: block bitmap at %llu, " + "inode bitmap at %llu, " + "inode table at %llu\n" + " %u free %s%s, " + "%u free %s, " + "%u used %s%s", i, + (unsigned long long) ext2fs_block_bitmap_loc(current_fs, i), + (unsigned long long) ext2fs_inode_bitmap_loc(current_fs, i), + (unsigned long long) ext2fs_inode_table_loc(current_fs, i), + ext2fs_bg_free_blocks_count(current_fs, i), + units, + ext2fs_bg_free_blocks_count(current_fs, i) != 1 ? + "s" : "", + ext2fs_bg_free_inodes_count(current_fs, i), + ext2fs_bg_free_inodes_count(current_fs, i) != 1 ? + "inodes" : "inode", + ext2fs_bg_used_dirs_count(current_fs, i), + ext2fs_bg_used_dirs_count(current_fs, i) != 1 ? "directories" + : "directory", gdt_csum ? ", " : "\n"); + if (gdt_csum) + fprintf(out, "%u unused %s\n", + ext2fs_bg_itable_unused(current_fs, i), + ext2fs_bg_itable_unused(current_fs, i) != 1 ? + "inodes" : "inode"); + first = 1; + print_bg_opts(current_fs, i, EXT2_BG_INODE_UNINIT, "Inode not init", + &first, out); + print_bg_opts(current_fs, i, EXT2_BG_BLOCK_UNINIT, "Block not init", + &first, out); + if (gdt_csum) { + fprintf(out, "%sChecksum 0x%04x", + first ? " [":", ", ext2fs_bg_checksum(current_fs, i)); + first = 0; + } + if (!first) + fputs("]\n", out); + } + close_pager(out); + return; +print_usage: + fprintf(stderr, "%s: Usage: show_super_stats [-h]\n", argv[0]); +} + +#ifndef READ_ONLY +void do_dirty_filesys(int argc EXT2FS_ATTR((unused)), + char **argv EXT2FS_ATTR((unused)), + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + if (check_fs_open(argv[0])) + return; + if (check_fs_read_write(argv[0])) + return; + + if (argv[1] && !strcmp(argv[1], "-clean")) + current_fs->super->s_state |= EXT2_VALID_FS; + else + current_fs->super->s_state &= ~EXT2_VALID_FS; + ext2fs_mark_super_dirty(current_fs); +} +#endif /* READ_ONLY */ + +struct list_blocks_struct { + FILE *f; + e2_blkcnt_t total; + blk64_t first_block, last_block; + e2_blkcnt_t first_bcnt, last_bcnt; + e2_blkcnt_t first; +}; + +static void finish_range(struct list_blocks_struct *lb) +{ + if (lb->first_block == 0) + return; + if (lb->first) + lb->first = 0; + else + fprintf(lb->f, ", "); + if (lb->first_block == lb->last_block) + fprintf(lb->f, "(%lld):%llu", + (long long)lb->first_bcnt, + (unsigned long long) lb->first_block); + else + fprintf(lb->f, "(%lld-%lld):%llu-%llu", + (long long)lb->first_bcnt, (long long)lb->last_bcnt, + (unsigned long long) lb->first_block, + (unsigned long long) lb->last_block); + lb->first_block = 0; +} + +static int list_blocks_proc(ext2_filsys fs EXT2FS_ATTR((unused)), + blk64_t *blocknr, e2_blkcnt_t blockcnt, + blk64_t ref_block EXT2FS_ATTR((unused)), + int ref_offset EXT2FS_ATTR((unused)), + void *private) +{ + struct list_blocks_struct *lb = (struct list_blocks_struct *) private; + + lb->total++; + if (blockcnt >= 0) { + /* + * See if we can add on to the existing range (if it exists) + */ + if (lb->first_block && + (lb->last_block+1 == *blocknr) && + (lb->last_bcnt+1 == blockcnt)) { + lb->last_block = *blocknr; + lb->last_bcnt = blockcnt; + return 0; + } + /* + * Start a new range. + */ + finish_range(lb); + lb->first_block = lb->last_block = *blocknr; + lb->first_bcnt = lb->last_bcnt = blockcnt; + return 0; + } + /* + * Not a normal block. Always force a new range. + */ + finish_range(lb); + if (lb->first) + lb->first = 0; + else + fprintf(lb->f, ", "); + if (blockcnt == -1) + fprintf(lb->f, "(IND):%llu", (unsigned long long) *blocknr); + else if (blockcnt == -2) + fprintf(lb->f, "(DIND):%llu", (unsigned long long) *blocknr); + else if (blockcnt == -3) + fprintf(lb->f, "(TIND):%llu", (unsigned long long) *blocknr); + return 0; +} + +static void internal_dump_inode_extra(FILE *out, + const char *prefix EXT2FS_ATTR((unused)), + ext2_ino_t inode_num EXT2FS_ATTR((unused)), + struct ext2_inode_large *inode) +{ + fprintf(out, "Size of extra inode fields: %u\n", inode->i_extra_isize); + if (inode->i_extra_isize > EXT2_INODE_SIZE(current_fs->super) - + EXT2_GOOD_OLD_INODE_SIZE) { + fprintf(stderr, "invalid inode->i_extra_isize (%u)\n", + inode->i_extra_isize); + return; + } +} + +static void dump_blocks(FILE *f, const char *prefix, ext2_ino_t inode) +{ + struct list_blocks_struct lb; + + fprintf(f, "%sBLOCKS:\n%s", prefix, prefix); + lb.total = 0; + lb.first_block = 0; + lb.f = f; + lb.first = 1; + ext2fs_block_iterate3(current_fs, inode, BLOCK_FLAG_READ_ONLY, NULL, + list_blocks_proc, (void *)&lb); + finish_range(&lb); + if (lb.total) + fprintf(f, "\n%sTOTAL: %lld\n", prefix, (long long)lb.total); + fprintf(f,"\n"); +} + +static int int_log10(unsigned long long arg) +{ + int l = 0; + + arg = arg / 10; + while (arg) { + l++; + arg = arg / 10; + } + return l; +} + +#define DUMP_LEAF_EXTENTS 0x01 +#define DUMP_NODE_EXTENTS 0x02 +#define DUMP_EXTENT_TABLE 0x04 + +static void dump_extents(FILE *f, const char *prefix, ext2_ino_t ino, + int flags, int logical_width, int physical_width) +{ + ext2_extent_handle_t handle; + struct ext2fs_extent extent; + struct ext2_extent_info info; + int op = EXT2_EXTENT_ROOT; + unsigned int printed = 0; + errcode_t errcode; + + errcode = ext2fs_extent_open(current_fs, ino, &handle); + if (errcode) + return; + + if (flags & DUMP_EXTENT_TABLE) + fprintf(f, "Level Entries %*s %*s Length Flags\n", + (logical_width*2)+3, "Logical", + (physical_width*2)+3, "Physical"); + else + fprintf(f, "%sEXTENTS:\n%s", prefix, prefix); + + while (1) { + errcode = ext2fs_extent_get(handle, op, &extent); + + if (errcode) + break; + + op = EXT2_EXTENT_NEXT; + + if (extent.e_flags & EXT2_EXTENT_FLAGS_SECOND_VISIT) + continue; + + if (extent.e_flags & EXT2_EXTENT_FLAGS_LEAF) { + if ((flags & DUMP_LEAF_EXTENTS) == 0) + continue; + } else { + if ((flags & DUMP_NODE_EXTENTS) == 0) + continue; + } + + errcode = ext2fs_extent_get_info(handle, &info); + if (errcode) + continue; + + if (!(extent.e_flags & EXT2_EXTENT_FLAGS_LEAF)) { + if (extent.e_flags & EXT2_EXTENT_FLAGS_SECOND_VISIT) + continue; + + if (flags & DUMP_EXTENT_TABLE) { + fprintf(f, "%2d/%2d %3d/%3d %*llu - %*llu " + "%*llu%*s %6u\n", + info.curr_level, info.max_depth, + info.curr_entry, info.num_entries, + logical_width, + (unsigned long long) extent.e_lblk, + logical_width, + (unsigned long long) extent.e_lblk + (extent.e_len - 1), + physical_width, + (unsigned long long) extent.e_pblk, + physical_width+3, "", extent.e_len); + continue; + } + + fprintf(f, "%s(ETB%d):%llu", + printed ? ", " : "", info.curr_level, + (unsigned long long) extent.e_pblk); + printed = 1; + continue; + } + + if (flags & DUMP_EXTENT_TABLE) { + fprintf(f, "%2d/%2d %3d/%3d %*llu - %*llu " + "%*llu - %*llu %6u %s\n", + info.curr_level, info.max_depth, + info.curr_entry, info.num_entries, + logical_width, + (unsigned long long) extent.e_lblk, + logical_width, + (unsigned long long) extent.e_lblk + (extent.e_len - 1), + physical_width, + (unsigned long long) extent.e_pblk, + physical_width, + (unsigned long long) extent.e_pblk + (extent.e_len - 1), + extent.e_len, + extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT ? + "Uninit" : ""); + continue; + } + + if (extent.e_len == 0) + continue; + else if (extent.e_len == 1) + fprintf(f, + "%s(%lld%s):%lld", + printed ? ", " : "", + (unsigned long long) extent.e_lblk, + extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT ? + "[u]" : "", + (unsigned long long) extent.e_pblk); + else + fprintf(f, + "%s(%lld-%lld%s):%lld-%lld", + printed ? ", " : "", + (unsigned long long) extent.e_lblk, + (unsigned long long) extent.e_lblk + (extent.e_len - 1), + extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT ? + "[u]" : "", + (unsigned long long) extent.e_pblk, + (unsigned long long) extent.e_pblk + (extent.e_len - 1)); + printed = 1; + } + if (printed) + fprintf(f, "\n"); + ext2fs_extent_free(handle); +} + +static void dump_inline_data(FILE *out, const char *prefix, ext2_ino_t inode_num) +{ + errcode_t retval; + size_t size; + + retval = ext2fs_inline_data_size(current_fs, inode_num, &size); + if (!retval) + fprintf(out, "%sSize of inline data: %zu\n", prefix, size); +} + +static void dump_inline_symlink(FILE *out, ext2_ino_t inode_num, + struct ext2_inode *inode, const char *prefix) +{ + errcode_t retval; + char *buf = NULL; + size_t size; + + retval = ext2fs_inline_data_size(current_fs, inode_num, &size); + if (retval) + goto out; + + retval = ext2fs_get_memzero(size + 1, &buf); + if (retval) + goto out; + + retval = ext2fs_inline_data_get(current_fs, inode_num, + inode, buf, &size); + if (retval) + goto out; + + fprintf(out, "%sFast link dest: \"%.*s\"\n", prefix, + (int)size, buf); +out: + if (buf) + ext2fs_free_mem(&buf); + if (retval) + com_err(__func__, retval, "while dumping link destination"); +} + +void internal_dump_inode(FILE *out, const char *prefix, + ext2_ino_t inode_num, struct ext2_inode *inode, + int do_dump_blocks) +{ + const char *i_type; + char frag, fsize; + int os = current_fs->super->s_creator_os; + struct ext2_inode_large *large_inode; + int is_large_inode = 0; + + if (EXT2_INODE_SIZE(current_fs->super) > EXT2_GOOD_OLD_INODE_SIZE) + is_large_inode = 1; + large_inode = (struct ext2_inode_large *) inode; + + if (LINUX_S_ISDIR(inode->i_mode)) i_type = "directory"; + else if (LINUX_S_ISREG(inode->i_mode)) i_type = "regular"; + else if (LINUX_S_ISLNK(inode->i_mode)) i_type = "symlink"; + else if (LINUX_S_ISBLK(inode->i_mode)) i_type = "block special"; + else if (LINUX_S_ISCHR(inode->i_mode)) i_type = "character special"; + else if (LINUX_S_ISFIFO(inode->i_mode)) i_type = "FIFO"; + else if (LINUX_S_ISSOCK(inode->i_mode)) i_type = "socket"; + else i_type = "bad type"; + fprintf(out, "%sInode: %u Type: %s ", prefix, inode_num, i_type); + fprintf(out, "%sMode: 0%03o Flags: 0x%x\n", + prefix, inode->i_mode & 07777, inode->i_flags); + if (is_large_inode && large_inode->i_extra_isize >= 24) { + fprintf(out, "%sGeneration: %u Version: 0x%08x:%08x\n", + prefix, inode->i_generation, large_inode->i_version_hi, + inode->osd1.linux1.l_i_version); + } else { + fprintf(out, "%sGeneration: %u Version: 0x%08x\n", prefix, + inode->i_generation, inode->osd1.linux1.l_i_version); + } + fprintf(out, "%sUser: %5d Group: %5d", + prefix, inode_uid(*inode), inode_gid(*inode)); + if (is_large_inode && large_inode->i_extra_isize >= 32) + fprintf(out, " Project: %5d", large_inode->i_projid); + fputs(" Size: ", out); + if (LINUX_S_ISREG(inode->i_mode) || LINUX_S_ISDIR(inode->i_mode)) + fprintf(out, "%llu\n", (unsigned long long) EXT2_I_SIZE(inode)); + else + fprintf(out, "%u\n", inode->i_size); + if (os == EXT2_OS_HURD) + fprintf(out, + "%sFile ACL: %u Translator: %u\n", + prefix, + inode->i_file_acl, + inode->osd1.hurd1.h_i_translator); + else + fprintf(out, "%sFile ACL: %llu\n", + prefix, + inode->i_file_acl | ((long long) + (inode->osd2.linux2.l_i_file_acl_high) << 32)); + if (os != EXT2_OS_HURD) + fprintf(out, "%sLinks: %u Blockcount: %llu\n", + prefix, inode->i_links_count, + (((unsigned long long) + inode->osd2.linux2.l_i_blocks_hi << 32)) + + inode->i_blocks); + else + fprintf(out, "%sLinks: %u Blockcount: %u\n", + prefix, inode->i_links_count, inode->i_blocks); + switch (os) { + case EXT2_OS_HURD: + frag = inode->osd2.hurd2.h_i_frag; + fsize = inode->osd2.hurd2.h_i_fsize; + break; + default: + frag = fsize = 0; + } + fprintf(out, "%sFragment: Address: %u Number: %u Size: %u\n", + prefix, inode->i_faddr, frag, fsize); + if (is_large_inode && large_inode->i_extra_isize >= 24) { + fprintf(out, "%s ctime: 0x%08x:%08x -- %s", prefix, + inode->i_ctime, large_inode->i_ctime_extra, + inode_time_to_string(inode->i_ctime, + large_inode->i_ctime_extra)); + fprintf(out, "%s atime: 0x%08x:%08x -- %s", prefix, + inode->i_atime, large_inode->i_atime_extra, + inode_time_to_string(inode->i_atime, + large_inode->i_atime_extra)); + fprintf(out, "%s mtime: 0x%08x:%08x -- %s", prefix, + inode->i_mtime, large_inode->i_mtime_extra, + inode_time_to_string(inode->i_mtime, + large_inode->i_mtime_extra)); + fprintf(out, "%scrtime: 0x%08x:%08x -- %s", prefix, + large_inode->i_crtime, large_inode->i_crtime_extra, + inode_time_to_string(large_inode->i_crtime, + large_inode->i_crtime_extra)); + if (inode->i_dtime) + fprintf(out, "%s dtime: 0x%08x:(%08x) -- %s", prefix, + large_inode->i_dtime, large_inode->i_ctime_extra, + inode_time_to_string(inode->i_dtime, + large_inode->i_ctime_extra)); + } else { + fprintf(out, "%sctime: 0x%08x -- %s", prefix, inode->i_ctime, + time_to_string((__s32) inode->i_ctime)); + fprintf(out, "%satime: 0x%08x -- %s", prefix, inode->i_atime, + time_to_string((__s32) inode->i_atime)); + fprintf(out, "%smtime: 0x%08x -- %s", prefix, inode->i_mtime, + time_to_string((__s32) inode->i_mtime)); + if (inode->i_dtime) + fprintf(out, "%sdtime: 0x%08x -- %s", prefix, + inode->i_dtime, + time_to_string((__s32) inode->i_dtime)); + } + if (EXT2_INODE_SIZE(current_fs->super) > EXT2_GOOD_OLD_INODE_SIZE) + internal_dump_inode_extra(out, prefix, inode_num, + (struct ext2_inode_large *) inode); + dump_inode_attributes(out, inode_num); + if (ext2fs_has_feature_metadata_csum(current_fs->super)) { + __u32 crc = inode->i_checksum_lo; + if (is_large_inode && + large_inode->i_extra_isize >= + (offsetof(struct ext2_inode_large, + i_checksum_hi) - + EXT2_GOOD_OLD_INODE_SIZE)) + crc |= ((__u32)large_inode->i_checksum_hi) << 16; + fprintf(out, "Inode checksum: 0x%08x\n", crc); + } + + if (LINUX_S_ISLNK(inode->i_mode) && ext2fs_is_fast_symlink(inode)) + fprintf(out, "%sFast link dest: \"%.*s\"\n", prefix, + (int)EXT2_I_SIZE(inode), (char *)inode->i_block); + else if (LINUX_S_ISLNK(inode->i_mode) && + (inode->i_flags & EXT4_INLINE_DATA_FL)) + dump_inline_symlink(out, inode_num, inode, prefix); + else if (LINUX_S_ISBLK(inode->i_mode) || LINUX_S_ISCHR(inode->i_mode)) { + int major, minor; + const char *devnote; + + if (inode->i_block[0]) { + major = (inode->i_block[0] >> 8) & 255; + minor = inode->i_block[0] & 255; + devnote = ""; + } else { + major = (inode->i_block[1] & 0xfff00) >> 8; + minor = ((inode->i_block[1] & 0xff) | + ((inode->i_block[1] >> 12) & 0xfff00)); + devnote = "(New-style) "; + } + fprintf(out, "%sDevice major/minor number: %02d:%02d (hex %02x:%02x)\n", + devnote, major, minor, major, minor); + } else if (do_dump_blocks) { + if (inode->i_flags & EXT4_EXTENTS_FL) + dump_extents(out, prefix, inode_num, + DUMP_LEAF_EXTENTS|DUMP_NODE_EXTENTS, 0, 0); + else if (inode->i_flags & EXT4_INLINE_DATA_FL) + dump_inline_data(out, prefix, inode_num); + else + dump_blocks(out, prefix, inode_num); + } +} + +static void dump_inode(ext2_ino_t inode_num, struct ext2_inode *inode) +{ + FILE *out; + + out = open_pager(); + internal_dump_inode(out, "", inode_num, inode, 1); + close_pager(out); +} + +void do_stat(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + ext2_ino_t inode; + struct ext2_inode * inode_buf; + + if (check_fs_open(argv[0])) + return; + + inode_buf = (struct ext2_inode *) + malloc(EXT2_INODE_SIZE(current_fs->super)); + if (!inode_buf) { + fprintf(stderr, "do_stat: can't allocate buffer\n"); + return; + } + + if (common_inode_args_process(argc, argv, &inode, 0)) { + free(inode_buf); + return; + } + + if (debugfs_read_inode2(inode, inode_buf, argv[0], + EXT2_INODE_SIZE(current_fs->super), 0)) { + free(inode_buf); + return; + } + + dump_inode(inode, inode_buf); + free(inode_buf); + return; +} + +void do_dump_extents(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + struct ext2_inode inode; + ext2_ino_t ino; + FILE *out; + int c, flags = 0; + int logical_width; + int physical_width; + + reset_getopt(); + while ((c = getopt(argc, argv, "nl")) != EOF) { + switch (c) { + case 'n': + flags |= DUMP_NODE_EXTENTS; + break; + case 'l': + flags |= DUMP_LEAF_EXTENTS; + break; + } + } + + if (argc != optind + 1) { + com_err(0, 0, "Usage: dump_extents [-n] [-l] file"); + return; + } + + if (flags == 0) + flags = DUMP_NODE_EXTENTS | DUMP_LEAF_EXTENTS; + flags |= DUMP_EXTENT_TABLE; + + if (check_fs_open(argv[0])) + return; + + ino = string_to_inode(argv[optind]); + if (ino == 0) + return; + + if (debugfs_read_inode(ino, &inode, argv[0])) + return; + + if ((inode.i_flags & EXT4_EXTENTS_FL) == 0) { + fprintf(stderr, "%s: does not uses extent block maps\n", + argv[optind]); + return; + } + + logical_width = int_log10((EXT2_I_SIZE(&inode)+current_fs->blocksize-1)/ + current_fs->blocksize) + 1; + if (logical_width < 5) + logical_width = 5; + physical_width = int_log10(ext2fs_blocks_count(current_fs->super)) + 1; + if (physical_width < 5) + physical_width = 5; + + out = open_pager(); + dump_extents(out, "", ino, flags, logical_width, physical_width); + close_pager(out); + return; +} + +static int print_blocks_proc(ext2_filsys fs EXT2FS_ATTR((unused)), + blk64_t *blocknr, + e2_blkcnt_t blockcnt EXT2FS_ATTR((unused)), + blk64_t ref_block EXT2FS_ATTR((unused)), + int ref_offset EXT2FS_ATTR((unused)), + void *private EXT2FS_ATTR((unused))) +{ + printf("%llu ", (unsigned long long) *blocknr); + return 0; +} + +void do_blocks(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + ext2_ino_t inode; + + if (check_fs_open(argv[0])) + return; + + if (common_inode_args_process(argc, argv, &inode, 0)) { + return; + } + + ext2fs_block_iterate3(current_fs, inode, BLOCK_FLAG_READ_ONLY, NULL, + print_blocks_proc, NULL); + fputc('\n', stdout); + return; +} + +void do_chroot(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + ext2_ino_t inode; + int retval; + + if (common_inode_args_process(argc, argv, &inode, 0)) + return; + + retval = ext2fs_check_directory(current_fs, inode); + if (retval) { + com_err(argv[1], retval, 0); + return; + } + root = inode; +} + +#ifndef READ_ONLY +void do_clri(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + ext2_ino_t inode; + struct ext2_inode inode_buf; + + if (common_inode_args_process(argc, argv, &inode, CHECK_FS_RW)) + return; + + if (debugfs_read_inode(inode, &inode_buf, argv[0])) + return; + memset(&inode_buf, 0, sizeof(inode_buf)); + if (debugfs_write_inode(inode, &inode_buf, argv[0])) + return; +} + +void do_freei(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + unsigned int len = 1; + int err = 0; + ext2_ino_t inode; + + if (common_args_process(argc, argv, 2, 3, argv[0], " [num]", + CHECK_FS_RW | CHECK_FS_BITMAPS)) + return; + if (check_fs_read_write(argv[0])) + return; + + inode = string_to_inode(argv[1]); + if (!inode) + return; + + if (argc == 3) { + len = parse_ulong(argv[2], argv[0], "length", &err); + if (err) + return; + } + + if (len == 1 && + !ext2fs_test_inode_bitmap2(current_fs->inode_map,inode)) + com_err(argv[0], 0, "Warning: inode already clear"); + while (len-- > 0) + ext2fs_unmark_inode_bitmap2(current_fs->inode_map, inode++); + ext2fs_mark_ib_dirty(current_fs); +} + +void do_seti(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + unsigned int len = 1; + int err = 0; + ext2_ino_t inode; + + if (common_args_process(argc, argv, 2, 3, argv[0], " [num]", + CHECK_FS_RW | CHECK_FS_BITMAPS)) + return; + if (check_fs_read_write(argv[0])) + return; + + inode = string_to_inode(argv[1]); + if (!inode) + return; + + if (argc == 3) { + len = parse_ulong(argv[2], argv[0], "length", &err); + if (err) + return; + } + + if ((len == 1) && + ext2fs_test_inode_bitmap2(current_fs->inode_map,inode)) + com_err(argv[0], 0, "Warning: inode already set"); + while (len-- > 0) + ext2fs_mark_inode_bitmap2(current_fs->inode_map, inode++); + ext2fs_mark_ib_dirty(current_fs); +} +#endif /* READ_ONLY */ + +void do_testi(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + ext2_ino_t inode; + + if (common_inode_args_process(argc, argv, &inode, CHECK_FS_BITMAPS)) + return; + + if (ext2fs_test_inode_bitmap2(current_fs->inode_map,inode)) + printf("Inode %u is marked in use\n", inode); + else + printf("Inode %u is not in use\n", inode); +} + +#ifndef READ_ONLY +void do_freeb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + blk64_t block; + blk64_t count = 1; + + if (common_block_args_process(argc, argv, &block, &count)) + return; + if (check_fs_read_write(argv[0])) + return; + while (count-- > 0) { + if (!ext2fs_test_block_bitmap2(current_fs->block_map,block)) + com_err(argv[0], 0, "Warning: block %llu already clear", + (unsigned long long) block); + ext2fs_unmark_block_bitmap2(current_fs->block_map,block); + block++; + } + ext2fs_mark_bb_dirty(current_fs); +} + +void do_setb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + blk64_t block; + blk64_t count = 1; + + if (common_block_args_process(argc, argv, &block, &count)) + return; + if (check_fs_read_write(argv[0])) + return; + while (count-- > 0) { + if (ext2fs_test_block_bitmap2(current_fs->block_map,block)) + com_err(argv[0], 0, "Warning: block %llu already set", + (unsigned long long) block); + ext2fs_mark_block_bitmap2(current_fs->block_map,block); + block++; + } + ext2fs_mark_bb_dirty(current_fs); +} +#endif /* READ_ONLY */ + +void do_testb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + blk64_t block; + blk64_t count = 1; + + if (common_block_args_process(argc, argv, &block, &count)) + return; + while (count-- > 0) { + if (ext2fs_test_block_bitmap2(current_fs->block_map,block)) + printf("Block %llu marked in use\n", + (unsigned long long) block); + else + printf("Block %llu not in use\n", + (unsigned long long) block); + block++; + } +} + +#ifndef READ_ONLY +static void modify_u8(char *com, const char *prompt, + const char *format, __u8 *val) +{ + char buf[200]; + unsigned long v; + char *tmp; + + sprintf(buf, format, *val); + printf("%30s [%s] ", prompt, buf); + if (!fgets(buf, sizeof(buf), stdin)) + return; + if (buf[strlen (buf) - 1] == '\n') + buf[strlen (buf) - 1] = '\0'; + if (!buf[0]) + return; + v = strtoul(buf, &tmp, 0); + if (*tmp) + com_err(com, 0, "Bad value - %s", buf); + else + *val = v; +} + +static void modify_u16(char *com, const char *prompt, + const char *format, __u16 *val) +{ + char buf[200]; + unsigned long v; + char *tmp; + + sprintf(buf, format, *val); + printf("%30s [%s] ", prompt, buf); + if (!fgets(buf, sizeof(buf), stdin)) + return; + if (buf[strlen (buf) - 1] == '\n') + buf[strlen (buf) - 1] = '\0'; + if (!buf[0]) + return; + v = strtoul(buf, &tmp, 0); + if (*tmp) + com_err(com, 0, "Bad value - %s", buf); + else + *val = v; +} + +static void modify_u32(char *com, const char *prompt, + const char *format, __u32 *val) +{ + char buf[200]; + unsigned long v; + char *tmp; + + sprintf(buf, format, *val); + printf("%30s [%s] ", prompt, buf); + if (!fgets(buf, sizeof(buf), stdin)) + return; + if (buf[strlen (buf) - 1] == '\n') + buf[strlen (buf) - 1] = '\0'; + if (!buf[0]) + return; + v = strtoul(buf, &tmp, 0); + if (*tmp) + com_err(com, 0, "Bad value - %s", buf); + else + *val = v; +} + + +void do_modify_inode(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + struct ext2_inode inode; + ext2_ino_t inode_num; + int i; + unsigned char *frag, *fsize; + char buf[80]; + int os; + const char *hex_format = "0x%x"; + const char *octal_format = "0%o"; + const char *decimal_format = "%d"; + const char *unsignedlong_format = "%lu"; + + if (common_inode_args_process(argc, argv, &inode_num, CHECK_FS_RW)) + return; + + os = current_fs->super->s_creator_os; + + if (debugfs_read_inode(inode_num, &inode, argv[1])) + return; + + modify_u16(argv[0], "Mode", octal_format, &inode.i_mode); + modify_u16(argv[0], "User ID", decimal_format, &inode.i_uid); + modify_u16(argv[0], "Group ID", decimal_format, &inode.i_gid); + modify_u32(argv[0], "Size", unsignedlong_format, &inode.i_size); + modify_u32(argv[0], "Creation time", decimal_format, &inode.i_ctime); + modify_u32(argv[0], "Modification time", decimal_format, &inode.i_mtime); + modify_u32(argv[0], "Access time", decimal_format, &inode.i_atime); + modify_u32(argv[0], "Deletion time", decimal_format, &inode.i_dtime); + modify_u16(argv[0], "Link count", decimal_format, &inode.i_links_count); + if (os == EXT2_OS_LINUX) + modify_u16(argv[0], "Block count high", unsignedlong_format, + &inode.osd2.linux2.l_i_blocks_hi); + modify_u32(argv[0], "Block count", unsignedlong_format, &inode.i_blocks); + modify_u32(argv[0], "File flags", hex_format, &inode.i_flags); + modify_u32(argv[0], "Generation", hex_format, &inode.i_generation); +#if 0 + modify_u32(argv[0], "Reserved1", decimal_format, &inode.i_reserved1); +#endif + modify_u32(argv[0], "File acl", decimal_format, &inode.i_file_acl); + + modify_u32(argv[0], "High 32bits of size", decimal_format, + &inode.i_size_high); + + if (os == EXT2_OS_HURD) + modify_u32(argv[0], "Translator Block", + decimal_format, &inode.osd1.hurd1.h_i_translator); + + modify_u32(argv[0], "Fragment address", decimal_format, &inode.i_faddr); + switch (os) { + case EXT2_OS_HURD: + frag = &inode.osd2.hurd2.h_i_frag; + fsize = &inode.osd2.hurd2.h_i_fsize; + break; + default: + frag = fsize = 0; + } + if (frag) + modify_u8(argv[0], "Fragment number", decimal_format, frag); + if (fsize) + modify_u8(argv[0], "Fragment size", decimal_format, fsize); + + for (i=0; i < EXT2_NDIR_BLOCKS; i++) { + sprintf(buf, "Direct Block #%u", i); + modify_u32(argv[0], buf, decimal_format, &inode.i_block[i]); + } + modify_u32(argv[0], "Indirect Block", decimal_format, + &inode.i_block[EXT2_IND_BLOCK]); + modify_u32(argv[0], "Double Indirect Block", decimal_format, + &inode.i_block[EXT2_DIND_BLOCK]); + modify_u32(argv[0], "Triple Indirect Block", decimal_format, + &inode.i_block[EXT2_TIND_BLOCK]); + if (debugfs_write_inode(inode_num, &inode, argv[1])) + return; +} +#endif /* READ_ONLY */ + +void do_change_working_dir(int argc, char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + ext2_ino_t inode; + int retval; + + if (common_inode_args_process(argc, argv, &inode, 0)) + return; + + retval = ext2fs_check_directory(current_fs, inode); + if (retval) { + com_err(argv[1], retval, 0); + return; + } + cwd = inode; + return; +} + +void do_print_working_directory(int argc, char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + int retval; + char *pathname = NULL; + + if (common_args_process(argc, argv, 1, 1, + "print_working_directory", "", 0)) + return; + + retval = ext2fs_get_pathname(current_fs, cwd, 0, &pathname); + if (retval) { + com_err(argv[0], retval, + "while trying to get pathname of cwd"); + } + printf("[pwd] INODE: %6u PATH: %s\n", + cwd, pathname ? pathname : "NULL"); + if (pathname) { + free(pathname); + pathname = NULL; + } + retval = ext2fs_get_pathname(current_fs, root, 0, &pathname); + if (retval) { + com_err(argv[0], retval, + "while trying to get pathname of root"); + } + printf("[root] INODE: %6u PATH: %s\n", + root, pathname ? pathname : "NULL"); + if (pathname) { + free(pathname); + pathname = NULL; + } + return; +} + +#ifndef READ_ONLY +static void make_link(char *sourcename, char *destname) +{ + ext2_ino_t ino; + struct ext2_inode inode; + int retval; + ext2_ino_t dir; + char *dest, *cp, *base_name; + + /* + * Get the source inode + */ + ino = string_to_inode(sourcename); + if (!ino) + return; + base_name = strrchr(sourcename, '/'); + if (base_name) + base_name++; + else + base_name = sourcename; + /* + * Figure out the destination. First see if it exists and is + * a directory. + */ + if (! (retval=ext2fs_namei(current_fs, root, cwd, destname, &dir))) + dest = base_name; + else { + /* + * OK, it doesn't exist. See if it is + * '/basename' or 'basename' + */ + cp = strrchr(destname, '/'); + if (cp) { + *cp = 0; + dir = string_to_inode(destname); + if (!dir) + return; + dest = cp+1; + } else { + dir = cwd; + dest = destname; + } + } + + if (debugfs_read_inode(ino, &inode, sourcename)) + return; + + retval = ext2fs_link(current_fs, dir, dest, ino, + ext2_file_type(inode.i_mode)); + if (retval) + com_err("make_link", retval, 0); + return; +} + + +void do_link(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + if (common_args_process(argc, argv, 3, 3, "link", + " ", CHECK_FS_RW)) + return; + + make_link(argv[1], argv[2]); +} + +static int mark_blocks_proc(ext2_filsys fs, blk64_t *blocknr, + e2_blkcnt_t blockcnt EXT2FS_ATTR((unused)), + blk64_t ref_block EXT2FS_ATTR((unused)), + int ref_offset EXT2FS_ATTR((unused)), + void *private EXT2FS_ATTR((unused))) +{ + blk64_t block; + + block = *blocknr; + ext2fs_block_alloc_stats2(fs, block, +1); + return 0; +} + +void do_undel(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + ext2_ino_t ino; + struct ext2_inode inode; + + if (common_args_process(argc, argv, 2, 3, "undelete", + " [dest_name]", + CHECK_FS_RW | CHECK_FS_BITMAPS)) + return; + + ino = string_to_inode(argv[1]); + if (!ino) + return; + + if (debugfs_read_inode(ino, &inode, argv[1])) + return; + + if (ext2fs_test_inode_bitmap2(current_fs->inode_map, ino)) { + com_err(argv[1], 0, "Inode is not marked as deleted"); + return; + } + + /* + * XXX this function doesn't handle changing the links count on the + * parent directory when undeleting a directory. + */ + inode.i_links_count = LINUX_S_ISDIR(inode.i_mode) ? 2 : 1; + inode.i_dtime = 0; + + if (debugfs_write_inode(ino, &inode, argv[0])) + return; + + ext2fs_block_iterate3(current_fs, ino, BLOCK_FLAG_READ_ONLY, NULL, + mark_blocks_proc, NULL); + + ext2fs_inode_alloc_stats2(current_fs, ino, +1, 0); + + if (argc > 2) + make_link(argv[1], argv[2]); +} + +static void unlink_file_by_name(char *filename) +{ + int retval; + ext2_ino_t dir; + char *base_name; + + base_name = strrchr(filename, '/'); + if (base_name) { + *base_name++ = '\0'; + dir = string_to_inode(filename); + if (!dir) + return; + } else { + dir = cwd; + base_name = filename; + } + retval = ext2fs_unlink(current_fs, dir, base_name, 0, 0); + if (retval) + com_err("unlink_file_by_name", retval, 0); + return; +} + +void do_unlink(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + if (common_args_process(argc, argv, 2, 2, "link", + "", CHECK_FS_RW)) + return; + + unlink_file_by_name(argv[1]); +} + +void do_copy_inode(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + ext2_ino_t src_ino, dest_ino; + unsigned char buf[4096]; + + if (common_args_process(argc, argv, 3, 3, "copy_inode", + " ", CHECK_FS_RW)) + return; + + src_ino = string_to_inode(argv[1]); + if (!src_ino) + return; + + dest_ino = string_to_inode(argv[2]); + if (!dest_ino) + return; + + if (debugfs_read_inode2(src_ino, (struct ext2_inode *) buf, + argv[0], sizeof(buf), 0)) + return; + + if (debugfs_write_inode2(dest_ino, (struct ext2_inode *) buf, + argv[0], sizeof(buf), 0)) + return; +} + +#endif /* READ_ONLY */ + +void do_find_free_block(int argc, char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + blk64_t free_blk, goal, first_free = 0; + int count; + errcode_t retval; + char *tmp; + + if ((argc > 3) || (argc==2 && *argv[1] == '?')) { + com_err(argv[0], 0, "Usage: find_free_block [count [goal]]"); + return; + } + if (check_fs_open(argv[0])) + return; + + if (argc > 1) { + count = strtol(argv[1],&tmp,0); + if (*tmp) { + com_err(argv[0], 0, "Bad count - %s", argv[1]); + return; + } + } else + count = 1; + + if (argc > 2) { + goal = strtol(argv[2], &tmp, 0); + if (*tmp) { + com_err(argv[0], 0, "Bad goal - %s", argv[1]); + return; + } + } + else + goal = current_fs->super->s_first_data_block; + + printf("Free blocks found: "); + free_blk = goal - 1; + while (count-- > 0) { + retval = ext2fs_new_block2(current_fs, free_blk + 1, 0, + &free_blk); + if (first_free) { + if (first_free == free_blk) + break; + } else + first_free = free_blk; + if (retval) { + com_err("ext2fs_new_block", retval, 0); + return; + } else + printf("%llu ", (unsigned long long) free_blk); + } + printf("\n"); +} + +void do_find_free_inode(int argc, char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + ext2_ino_t free_inode, dir; + int mode; + int retval; + char *tmp; + + if (argc > 3 || (argc>1 && *argv[1] == '?')) { + com_err(argv[0], 0, "Usage: find_free_inode [dir [mode]]"); + return; + } + if (check_fs_open(argv[0])) + return; + + if (argc > 1) { + dir = strtol(argv[1], &tmp, 0); + if (*tmp) { + com_err(argv[0], 0, "Bad dir - %s", argv[1]); + return; + } + } + else + dir = root; + if (argc > 2) { + mode = strtol(argv[2], &tmp, 0); + if (*tmp) { + com_err(argv[0], 0, "Bad mode - %s", argv[2]); + return; + } + } else + mode = 010755; + + retval = ext2fs_new_inode(current_fs, dir, mode, 0, &free_inode); + if (retval) + com_err("ext2fs_new_inode", retval, 0); + else + printf("Free inode found: %u\n", free_inode); +} + +#ifndef READ_ONLY +void do_write(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + errcode_t retval; + + if (common_args_process(argc, argv, 3, 3, "write", + " ", CHECK_FS_RW)) + return; + + retval = do_write_internal(current_fs, cwd, argv[1], argv[2], root); + if (retval) + com_err(argv[0], retval, 0); +} + +void do_mknod(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + unsigned long major, minor; + errcode_t retval; + int nr; + struct stat st; + + if (check_fs_open(argv[0])) + return; + if (argc < 3 || argv[2][1]) { + usage: + com_err(argv[0], 0, "Usage: mknod [p| [c|b] ]"); + return; + } + + minor = major = 0; + switch (argv[2][0]) { + case 'p': + st.st_mode = S_IFIFO; + nr = 3; + break; + case 'c': + st.st_mode = S_IFCHR; + nr = 5; + break; + case 'b': + st.st_mode = S_IFBLK; + nr = 5; + break; + default: + nr = 0; + } + + if (nr == 5) { + major = strtoul(argv[3], argv+3, 0); + minor = strtoul(argv[4], argv+4, 0); + if (major > 65535 || minor > 65535 || argv[3][0] || argv[4][0]) + nr = 0; + } + + if (argc != nr) + goto usage; + + st.st_rdev = makedev(major, minor); + retval = do_mknod_internal(current_fs, cwd, argv[1], + st.st_mode, st.st_rdev); + if (retval) + com_err(argv[0], retval, 0); +} + +void do_mkdir(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + errcode_t retval; + + if (common_args_process(argc, argv, 2, 2, "mkdir", + "", CHECK_FS_RW)) + return; + + retval = do_mkdir_internal(current_fs, cwd, argv[1], root); + if (retval) + com_err(argv[0], retval, 0); + +} + +static int release_blocks_proc(ext2_filsys fs, blk64_t *blocknr, + e2_blkcnt_t blockcnt EXT2FS_ATTR((unused)), + blk64_t ref_block EXT2FS_ATTR((unused)), + int ref_offset EXT2FS_ATTR((unused)), + void *private) +{ + blk64_t block = *blocknr; + blk64_t *last_cluster = (blk64_t *)private; + blk64_t cluster = EXT2FS_B2C(fs, block); + + if (cluster == *last_cluster) + return 0; + + *last_cluster = cluster; + + ext2fs_block_alloc_stats2(fs, block, -1); + return 0; +} + +static void kill_file_by_inode(ext2_ino_t inode) +{ + struct ext2_inode inode_buf; + + if (debugfs_read_inode(inode, &inode_buf, 0)) + return; + inode_buf.i_dtime = current_fs->now ? current_fs->now : time(0); + if (debugfs_write_inode(inode, &inode_buf, 0)) + return; + if (ext2fs_inode_has_valid_blocks2(current_fs, &inode_buf)) { + blk64_t last_cluster = 0; + ext2fs_block_iterate3(current_fs, inode, BLOCK_FLAG_READ_ONLY, + NULL, release_blocks_proc, &last_cluster); + } + printf("\n"); + ext2fs_inode_alloc_stats2(current_fs, inode, -1, + LINUX_S_ISDIR(inode_buf.i_mode)); +} + + +void do_kill_file(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + ext2_ino_t inode_num; + + if (common_inode_args_process(argc, argv, &inode_num, CHECK_FS_RW)) + return; + + kill_file_by_inode(inode_num); +} + +void do_rm(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + int retval; + ext2_ino_t inode_num; + struct ext2_inode inode; + + if (common_args_process(argc, argv, 2, 2, "rm", + "", CHECK_FS_RW)) + return; + + retval = ext2fs_namei(current_fs, root, cwd, argv[1], &inode_num); + if (retval) { + com_err(argv[0], retval, "while trying to resolve filename"); + return; + } + + if (debugfs_read_inode(inode_num, &inode, argv[0])) + return; + + if (LINUX_S_ISDIR(inode.i_mode)) { + com_err(argv[0], 0, "file is a directory"); + return; + } + + --inode.i_links_count; + if (debugfs_write_inode(inode_num, &inode, argv[0])) + return; + + unlink_file_by_name(argv[1]); + if (inode.i_links_count == 0) + kill_file_by_inode(inode_num); +} + +struct rd_struct { + ext2_ino_t parent; + int empty; +}; + +static int rmdir_proc(ext2_ino_t dir EXT2FS_ATTR((unused)), + int entry EXT2FS_ATTR((unused)), + struct ext2_dir_entry *dirent, + int offset EXT2FS_ATTR((unused)), + int blocksize EXT2FS_ATTR((unused)), + char *buf EXT2FS_ATTR((unused)), + void *private) +{ + struct rd_struct *rds = (struct rd_struct *) private; + + if (dirent->inode == 0) + return 0; + if ((ext2fs_dirent_name_len(dirent) == 1) && (dirent->name[0] == '.')) + return 0; + if ((ext2fs_dirent_name_len(dirent) == 2) && (dirent->name[0] == '.') && + (dirent->name[1] == '.')) { + rds->parent = dirent->inode; + return 0; + } + rds->empty = 0; + return 0; +} + +void do_rmdir(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + int retval; + ext2_ino_t inode_num; + struct ext2_inode inode; + struct rd_struct rds; + + if (common_args_process(argc, argv, 2, 2, "rmdir", + "", CHECK_FS_RW)) + return; + + retval = ext2fs_namei(current_fs, root, cwd, argv[1], &inode_num); + if (retval) { + com_err(argv[0], retval, "while trying to resolve filename"); + return; + } + + if (debugfs_read_inode(inode_num, &inode, argv[0])) + return; + + if (!LINUX_S_ISDIR(inode.i_mode)) { + com_err(argv[0], 0, "file is not a directory"); + return; + } + + rds.parent = 0; + rds.empty = 1; + + retval = ext2fs_dir_iterate2(current_fs, inode_num, 0, + 0, rmdir_proc, &rds); + if (retval) { + com_err(argv[0], retval, "while iterating over directory"); + return; + } + if (rds.empty == 0) { + com_err(argv[0], 0, "directory not empty"); + return; + } + + inode.i_links_count = 0; + if (debugfs_write_inode(inode_num, &inode, argv[0])) + return; + + unlink_file_by_name(argv[1]); + kill_file_by_inode(inode_num); + + if (rds.parent) { + if (debugfs_read_inode(rds.parent, &inode, argv[0])) + return; + if (inode.i_links_count > 1) + inode.i_links_count--; + if (debugfs_write_inode(rds.parent, &inode, argv[0])) + return; + } +} +#endif /* READ_ONLY */ + +void do_show_debugfs_params(int argc EXT2FS_ATTR((unused)), + char *argv[] EXT2FS_ATTR((unused)), + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + if (current_fs) + printf("Open mode: read-%s\n", + current_fs->flags & EXT2_FLAG_RW ? "write" : "only"); + printf("Filesystem in use: %s\n", + current_fs ? current_fs->device_name : "--none--"); +} + +#ifndef READ_ONLY +void do_expand_dir(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + ext2_ino_t inode; + int retval; + + if (common_inode_args_process(argc, argv, &inode, CHECK_FS_RW)) + return; + + retval = ext2fs_expand_dir(current_fs, inode); + if (retval) + com_err("ext2fs_expand_dir", retval, 0); + return; +} + +void do_features(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + int i; + + if (check_fs_open(argv[0])) + return; + + if ((argc != 1) && check_fs_read_write(argv[0])) + return; + for (i=1; i < argc; i++) { + if (e2p_edit_feature(argv[i], + ¤t_fs->super->s_feature_compat, 0)) + com_err(argv[0], 0, "Unknown feature: %s\n", + argv[i]); + else + ext2fs_mark_super_dirty(current_fs); + } + print_features(current_fs->super, stdout); +} +#endif /* READ_ONLY */ + +void do_bmap(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + ext2_ino_t ino; + blk64_t blk, pblk = 0; + int c, err, flags = 0, ret_flags = 0; + errcode_t errcode; + + if (check_fs_open(argv[0])) + return; + + reset_getopt(); + while ((c = getopt (argc, argv, "a")) != EOF) { + switch (c) { + case 'a': + flags |= BMAP_ALLOC; + break; + default: + goto print_usage; + } + } + + if (argc <= optind+1) { + print_usage: + com_err(0, 0, + "Usage: bmap [-a] logical_blk [physical_blk]"); + return; + } + + ino = string_to_inode(argv[optind++]); + if (!ino) + return; + err = strtoblk(argv[0], argv[optind++], "logical block", &blk); + if (err) + return; + + if (argc > optind+1) + goto print_usage; + + if (argc == optind+1) { + err = strtoblk(argv[0], argv[optind++], + "physical block", &pblk); + if (err) + return; + if (flags & BMAP_ALLOC) { + com_err(0, 0, "Can't set and allocate a block"); + return; + } + flags |= BMAP_SET; + } + + errcode = ext2fs_bmap2(current_fs, ino, 0, 0, flags, blk, + &ret_flags, &pblk); + if (errcode) { + com_err(argv[0], errcode, + "while mapping logical block %llu\n", + (unsigned long long) blk); + return; + } + printf("%llu", (unsigned long long) pblk); + if (ret_flags & BMAP_RET_UNINIT) + fputs(" (uninit)", stdout); + fputc('\n', stdout); +} + +void do_imap(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + ext2_ino_t ino; + unsigned long group, block, block_nr, offset; + + if (common_args_process(argc, argv, 2, 2, argv[0], + "", 0)) + return; + ino = string_to_inode(argv[1]); + if (!ino) + return; + + group = (ino - 1) / EXT2_INODES_PER_GROUP(current_fs->super); + offset = ((ino - 1) % EXT2_INODES_PER_GROUP(current_fs->super)) * + EXT2_INODE_SIZE(current_fs->super); + block = offset >> EXT2_BLOCK_SIZE_BITS(current_fs->super); + if (!ext2fs_inode_table_loc(current_fs, (unsigned)group)) { + com_err(argv[0], 0, "Inode table for group %lu is missing\n", + group); + return; + } + block_nr = ext2fs_inode_table_loc(current_fs, (unsigned)group) + + block; + offset &= (EXT2_BLOCK_SIZE(current_fs->super) - 1); + + printf("Inode %u is part of block group %lu\n" + "\tlocated at block %lu, offset 0x%04lx\n", ino, group, + block_nr, offset); + +} + +void do_idump(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + struct ext2_inode_large *inode; + ext2_ino_t ino; + unsigned char *buf; + errcode_t err; + unsigned int isize, size, offset = 0; + int c, mode = 0; + + reset_getopt(); + while ((c = getopt (argc, argv, "bex")) != EOF) { + if (mode || c == '?') { + com_err(argv[0], 0, + "Usage: inode_dump [-b]|[-e] "); + return; + } + mode = c; + } + if (optind != argc-1) + return; + + if (check_fs_open(argv[0])) + return; + + ino = string_to_inode(argv[optind]); + if (!ino) + return; + + isize = EXT2_INODE_SIZE(current_fs->super); + err = ext2fs_get_mem(isize, &buf); + if (err) { + com_err(argv[0], err, "while allocating memory"); + return; + } + + err = ext2fs_read_inode_full(current_fs, ino, + (struct ext2_inode *)buf, isize); + if (err) { + com_err(argv[0], err, "while reading inode %u", ino); + goto err; + } + + inode = (struct ext2_inode_large *) buf; + size = isize; + switch (mode) { + case 'b': + offset = ((char *) (&inode->i_block)) - ((char *) buf); + size = sizeof(inode->i_block); + break; + case 'x': + case 'e': + if (size <= EXT2_GOOD_OLD_INODE_SIZE) { + com_err(argv[0], 0, "No extra space in inode"); + goto err; + } + offset = EXT2_GOOD_OLD_INODE_SIZE + inode->i_extra_isize; + if (offset > size) + goto err; + size -= offset; + break; + } + if (mode == 'x') + raw_inode_xattr_dump(stdout, buf + offset, size); + else + do_byte_hexdump(stdout, buf + offset, size); +err: + ext2fs_free_mem(&buf); +} + +#ifndef READ_ONLY +void do_set_current_time(int argc, char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) +{ + __s64 now; + + if (common_args_process(argc, argv, 2, 2, argv[0], + "