From eeb9f0705d3df0a66f4fcc18ad2af8f3208f3dad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lesimple?= Date: Sun, 17 Sep 2023 19:13:47 +0200 Subject: [PATCH] feat: re-introduced MacOS support (#71) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * preparatory changes to make dvdisaster compilable under MacOS * Implemented workaround to macOS Test Unit Ready bug * fixed manual.pdf not opening on macOS * Added case for binary being in app bundle * updated locale files due to change in closure.c * added back mac app bundle specific files * reverted make-dist.sh to windows/linux only version and created separate mac script which uses dylibbundler * altered release.yml accordingly * chore: fix build under MacOS --------- Co-authored-by: Stéphane Lesimple Co-authored-by: jlnbxn Co-authored-by: wojas --- .github/workflows/make-dist.sh | 2 +- .github/workflows/make-mac-app.sh | 45 ++ .github/workflows/release.yml | 276 +++++---- .github/workflows/tests.yml | 47 ++ configure | 12 +- documentation/user-manual/manual.pdf | Bin 3469546 -> 3470112 bytes locale/cs.po | 256 ++++----- locale/de.po | 253 +++++---- locale/it.po | 236 ++++---- locale/pt_BR.po | 236 ++++---- locale/ru.po | 236 ++++---- locale/sv.po | 236 ++++---- macinst/Info.plist | 26 + macinst/dvdisaster.icns | Bin 0 -> 109764 bytes regtest/common.bash | 29 +- .../database/RS01_adaptive_no_device.darwin | 12 + regtest/database/RS01_adaptive_no_device.win | 12 + .../RS01_adaptive_no_device_access.darwin | 12 + regtest/database/RS01_read_no_device.darwin | 12 + regtest/database/RS01_read_no_device.win | 12 + .../RS01_read_no_device_access.darwin | 12 + regtest/database/RS01_scan_no_device.darwin | 12 + regtest/database/RS01_scan_no_device.win | 12 + .../RS01_scan_no_device_access.darwin | 12 + .../RS03i_read_bad_header_exhaustive.win | 522 ------------------ scripts/bash-based-configure | 45 ++ src/closure.c | 54 +- src/scsi-darwin.c | 378 +++++++++++++ src/scsi-layer.h | 20 + src/show-manual.c | 20 +- 30 files changed, 1689 insertions(+), 1348 deletions(-) create mode 100755 .github/workflows/make-mac-app.sh create mode 100644 macinst/Info.plist create mode 100644 macinst/dvdisaster.icns create mode 100644 regtest/database/RS01_adaptive_no_device.darwin create mode 100644 regtest/database/RS01_adaptive_no_device.win create mode 100644 regtest/database/RS01_adaptive_no_device_access.darwin create mode 100644 regtest/database/RS01_read_no_device.darwin create mode 100644 regtest/database/RS01_read_no_device.win create mode 100644 regtest/database/RS01_read_no_device_access.darwin create mode 100644 regtest/database/RS01_scan_no_device.darwin create mode 100644 regtest/database/RS01_scan_no_device.win create mode 100644 regtest/database/RS01_scan_no_device_access.darwin delete mode 100644 regtest/database/RS03i_read_bad_header_exhaustive.win create mode 100644 src/scsi-darwin.c diff --git a/.github/workflows/make-dist.sh b/.github/workflows/make-dist.sh index e0255dd..46c9f0a 100755 --- a/.github/workflows/make-dist.sh +++ b/.github/workflows/make-dist.sh @@ -48,4 +48,4 @@ if command -v zip >/dev/null; then zip -9r $archive ${archive/.zip/} mv ${archive/.zip/} dist fi -echo "dist done ($archive)" +echo "dist done ($archive)" \ No newline at end of file diff --git a/.github/workflows/make-mac-app.sh b/.github/workflows/make-mac-app.sh new file mode 100755 index 0000000..cb7e9b9 --- /dev/null +++ b/.github/workflows/make-mac-app.sh @@ -0,0 +1,45 @@ +#!/bin/bash +set -e +set -x + +github_ref="$1" +archive="dvdisaster-$(echo "$github_ref" | grep -Eo '[^/]+$').dmg" + +echo "Archive name is $archive" +echo "::set-output name=archive::$archive" + +mkdir dist + +# Create directory structure for the macOS application bundle +mkdir -p dvdisaster.app/Contents/{MacOS,Resources} + +# Copy the main executable to the appropriate location +cp dvdisaster dvdisaster.app/Contents/MacOS + +# Use dylibbundler to bundle dynamic libraries into the application bundle +dylibbundler -od -cd -b -x dvdisaster.app/Contents/MacOS/dvdisaster -d 'dvdisaster.app/Contents/libs/' + +# Copy the Info.plist file to define application metadata +cp macinst/Info.plist dvdisaster.app/Contents/ + +# Create a directory for documentation resources +mkdir dvdisaster.app/Contents/Resources/documentation + +# Copy documentation files to the documentation directory +cp CHANGELOG TODO COPYING CREDITS.* documentation/dvdisaster.*.1 documentation/user-manual/manual.pdf dvdisaster.app/Contents/Resources/documentation + +# Copy localization files to the locale directory +find locale/* -maxdepth 0 -type d -exec cp -r {} dvdisaster.app/Contents/Resources/locale/ \; + +# Copy the application icon to the resources directory +cp macinst/dvdisaster.icns dvdisaster.app/Contents/Resources/ + +# Make the main executable executable +chmod +x dvdisaster.app/Contents/MacOS/dvdisaster + +# Move the application bundle to the 'dist' directory +mv dvdisaster.app dist + +create-dmg "$archive" dist + +echo "dist done ($archive)" \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fea4c57..2eb6331 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,6 +5,57 @@ on: types: [published] jobs: + mac: + runs-on: macos-10.15 + strategy: + matrix: + ui: [cli, gui] + include: + - ui: cli + clionly: --with-gui=no + steps: + - uses: actions/checkout@v2 + - name: install prerequisites + env: + HOMEBREW_NO_INSTALL_CLEANUP: 1 + run: brew install ghostscript glib gdk-pixbuf + - name: install prerequisites (GUI) + if: matrix.ui == 'gui' + env: + HOMEBREW_NO_INSTALL_CLEANUP: 1 + run: brew install gtk+ dylibbundler create-dmg + - name: configure + run: | + set +x + ./configure ${{ matrix.clionly }} --with-werror + - name: make + run: make -j$(sysctl -n hw.ncpu || 2) + - name: check executability + run: ./dvdisaster --version + - name: check executable (GUI) + if: matrix.ui == 'gui' + run: | + ./dvdisaster --version + if ./dvdisaster --version | grep NOGUI; then exit 1; fi + - name: check executable (CLI) + if: matrix.ui == 'cli' + run: | + ./dvdisaster --version + ./dvdisaster --version | grep NOGUI + - name: build dist + run: ./.github/workflows/make-mac-app.sh ${{ github.ref }} + id: dist + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: ./${{ steps.dist.outputs.archive }} + asset_name: ${{ steps.dist.outputs.archive }} + asset_content_type: application/zip + win: runs-on: windows-latest strategy: @@ -24,130 +75,129 @@ jobs: run: shell: msys2 {0} steps: - - uses: msys2/setup-msys2@v2 - with: - msystem: ${{ matrix.msystem }} - update: false - install: git diffutils make pkg-config mingw-w64-${{ matrix.arch }}-glib2 mingw-w64-${{ matrix.arch }}-gcc mingw-w64-${{ matrix.arch }}-ghostscript mingw-w64-${{ matrix.arch }}-ntldd-git man zip - - name: install GUI prereqs - if: matrix.ui == 'gui' - run: pacman -S --noconfirm mingw-w64-${{ matrix.arch }}-gtk2 - - name: git config - run: git config --global core.autocrlf input - shell: bash - - uses: actions/checkout@v2 - - name: configure - run: ./configure ${{ matrix.clionly }} - - name: make - run: nproc && make -j$(nproc) - - name: check executable - run: | + - uses: msys2/setup-msys2@v2 + with: + msystem: ${{ matrix.msystem }} + update: false + install: git diffutils make pkg-config mingw-w64-${{ matrix.arch }}-glib2 mingw-w64-${{ matrix.arch }}-gcc mingw-w64-${{ matrix.arch }}-ghostscript mingw-w64-${{ matrix.arch }}-ntldd-git man zip + - name: install GUI prereqs + if: matrix.ui == 'gui' + run: pacman -S --noconfirm mingw-w64-${{ matrix.arch }}-gtk2 + - name: git config + run: git config --global core.autocrlf input + shell: bash + - uses: actions/checkout@v2 + - name: configure + run: ./configure ${{ matrix.clionly }} + - name: make + run: nproc && make -j$(nproc) + - name: check executable + run: | ./dvdisaster.exe --version file dvdisaster.exe if ./dvdisaster.exe --version | grep dirty; then exit 1; fi file dvdisaster.exe | grep -q '${{ matrix.grep }}, for MS Windows' - - name: check executable (GUI) - if: matrix.ui == 'gui' - run: if ./dvdisaster.exe --version | grep NOGUI; then exit 1; fi - - name: check executable (CLI) - if: matrix.ui == 'cli' - run: ./dvdisaster.exe --version | grep NOGUI - - name: prepare dist - run: ./.github/workflows/make-dist.sh ${{ github.ref }} - id: dist - - name: check executability of dist from cmd.exe - shell: cmd - run: | + - name: check executable (GUI) + if: matrix.ui == 'gui' + run: if ./dvdisaster.exe --version | grep NOGUI; then exit 1; fi + - name: check executable (CLI) + if: matrix.ui == 'cli' + run: ./dvdisaster.exe --version | grep NOGUI + - name: prepare dist + run: ./.github/workflows/make-dist.sh ${{ github.ref }} + id: dist + - name: check executability of dist from cmd.exe + shell: cmd + run: | cd dist dvdisaster.exe --version - - name: Upload Release Asset - id: upload-release-asset - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ github.event.release.upload_url }} - asset_path: ./${{ steps.dist.outputs.archive }} - asset_name: ${{ steps.dist.outputs.archive }} - asset_content_type: application/zip + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: ./${{ steps.dist.outputs.archive }} + asset_name: ${{ steps.dist.outputs.archive }} + asset_content_type: application/zip linux64-cli: - runs-on: ubuntu-latest + runs-on: ubuntu-18.04 steps: - - uses: actions/checkout@v2 - - name: install prerequisites - run: sudo apt update && sudo apt install -y libglib2.0-dev ghostscript man - - name: configure - run: ./configure --with-gui=no - - name: make - run: nproc && make -j$(nproc) && make static && mv -f dvdisaster-static dvdisaster - - name: check executable - run: | - ./dvdisaster --version && ./dvdisaster --version | grep -q dirty || true - file dvdisaster && file dvdisaster | grep -q 'ELF 64' && file dvdisaster | grep -q 'statically linked' + - uses: actions/checkout@v2 + - name: install prerequisites + run: sudo apt update && sudo apt install -y libglib2.0-dev ghostscript man + - name: configure + run: ./configure --with-gui=no + - name: make + run: nproc && make -j$(nproc) && make static && mv -f dvdisaster-static dvdisaster + - name: check executable + run: | + ./dvdisaster --version && ./dvdisaster --version | grep -q dirty || true + file dvdisaster && file dvdisaster | grep -q 'ELF 64' && file dvdisaster | grep -q 'statically linked' - - name: build dist - run: ./.github/workflows/make-dist.sh ${{ github.ref }} - id: dist - - name: Upload Release Asset - id: upload-release-asset - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ github.event.release.upload_url }} - asset_path: ./${{ steps.dist.outputs.archive }} - asset_name: ${{ steps.dist.outputs.archive }} - asset_content_type: application/zip + - name: build dist + run: ./.github/workflows/make-dist.sh ${{ github.ref }} + id: dist + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: ./${{ steps.dist.outputs.archive }} + asset_name: ${{ steps.dist.outputs.archive }} + asset_content_type: application/zip linux64-appimage: runs-on: ubuntu-18.04 steps: - - uses: actions/checkout@v2 - - name: install prerequisites - run: sudo apt update && sudo apt install -y libglib2.0-dev ghostscript man wget libgtk2.0-dev gtk2-engines-pixbuf gtk2-engines pkg-config gnome-themes-standard - - name: configure - run: ./configure --prefix=/usr - - name: make - run: nproc && make -j$(nproc) && make - - name: make install - run: touch documentation/user-manual/manual.pdf && mkdir /tmp/dist && make install DESTDIR=/tmp/dist - - name: copy things to dist - run: | - install -d /tmp/dist/usr/lib/gtk-2.0 - cp -va $(pkg-config --variable=libdir gtk+-2.0)/gtk-2.0/$(pkg-config --variable=gtk_binary_version gtk+-2.0)/* /tmp/dist/usr/lib/gtk-2.0 - - name: build appimage - run: | - wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage - chmod 755 linuxdeploy-x86_64.AppImage - export VERSION=$(echo "${{ github.ref }}" | grep -Eo '[^/]+$') - ./linuxdeploy-x86_64.AppImage -d contrib/dvdisaster.desktop -i contrib/dvdisaster64.png -i contrib/dvdisaster48.png -i contrib/dvdisaster32.png -i contrib/dvdisaster16.png --icon-filename dvdisaster --custom-apprun=contrib/AppRun.sh --appdir /tmp/dist/ --output appimage - - name: apply glib workaround - run: | - wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage - chmod 755 appimagetool-x86_64.AppImage - exe=$(ls -1 dvdisaster*.AppImage) - chmod 755 $exe - ./$exe --appimage-extract - rm -vf $exe - ./appimagetool-x86_64.AppImage -v squashfs-root - mv -v dvdisaster*AppImage $exe - chmod 755 $exe - - name: test appimage - id: dist - run: | - chmod 755 dvdisaster*.AppImage && ./dvdisaster*.AppImage --version - archive=$(ls -1 dvdisaster*.AppImage) - echo "::set-output name=archive::$archive" - echo "appimage is <$archive>" - - name: Upload Release Asset - id: upload-release-asset - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ github.event.release.upload_url }} - asset_path: ./${{ steps.dist.outputs.archive }} - asset_name: ${{ steps.dist.outputs.archive }} - asset_content_type: application/zip - + - uses: actions/checkout@v2 + - name: install prerequisites + run: sudo apt update && sudo apt install -y libglib2.0-dev ghostscript man wget libgtk2.0-dev gtk2-engines-pixbuf gtk2-engines pkg-config gnome-themes-standard + - name: configure + run: ./configure --prefix=/usr + - name: make + run: nproc && make -j$(nproc) && make + - name: make install + run: touch documentation/user-manual/manual.pdf && mkdir /tmp/dist && make install DESTDIR=/tmp/dist + - name: copy things to dist + run: | + install -d /tmp/dist/usr/lib/gtk-2.0 + cp -va $(pkg-config --variable=libdir gtk+-2.0)/gtk-2.0/$(pkg-config --variable=gtk_binary_version gtk+-2.0)/* /tmp/dist/usr/lib/gtk-2.0 + - name: build appimage + run: | + wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage + chmod 755 linuxdeploy-x86_64.AppImage + export VERSION=$(echo "${{ github.ref }}" | grep -Eo '[^/]+$') + ./linuxdeploy-x86_64.AppImage -d contrib/dvdisaster.desktop -i contrib/dvdisaster64.png -i contrib/dvdisaster48.png -i contrib/dvdisaster32.png -i contrib/dvdisaster16.png --icon-filename dvdisaster --custom-apprun=contrib/AppRun.sh --appdir /tmp/dist/ --output appimage + - name: apply glib workaround + run: | + wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage + chmod 755 appimagetool-x86_64.AppImage + exe=$(ls -1 dvdisaster*.AppImage) + chmod 755 $exe + ./$exe --appimage-extract + rm -vf $exe + ./appimagetool-x86_64.AppImage -v squashfs-root + mv -v dvdisaster*AppImage $exe + chmod 755 $exe + - name: test appimage + id: dist + run: | + chmod 755 dvdisaster*.AppImage && ./dvdisaster*.AppImage --version + archive=$(ls -1 dvdisaster*.AppImage) + echo "::set-output name=archive::$archive" + echo "appimage is <$archive>" + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: ./${{ steps.dist.outputs.archive }} + asset_name: ${{ steps.dist.outputs.archive }} + asset_content_type: application/zip diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e5f262b..31bc702 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -3,6 +3,53 @@ name: non-regression tests on: [pull_request] jobs: + mac: + runs-on: macos-latest + strategy: + matrix: + ui: [cli, gui] + printf: [fmtdbg, normal] + include: + - ui: cli + clionly: --with-gui=no + - printf: fmtdbg + debugprintf: --with-debug-printf-format + steps: + - uses: actions/checkout@v2 + - name: install prerequisites + env: + HOMEBREW_NO_INSTALL_CLEANUP: 1 + run: brew install ghostscript + - name: install prerequisites (GUI) + if: matrix.ui == 'gui' + env: + HOMEBREW_NO_INSTALL_CLEANUP: 1 + run: brew install gtk+ + - name: configure + run: | + set +x + ./configure ${{ matrix.clionly }} ${{ matrix.debugprintf }} --with-werror + - name: make + run: make -j$(sysctl -n hw.ncpu || 2) + - name: check executability + run: ./dvdisaster --version + - name: check executable (GUI) + if: matrix.ui == 'gui' + run: | + ./dvdisaster --version + if ./dvdisaster --version | grep NOGUI; then exit 1; fi + - name: check executable (CLI) + if: matrix.ui == 'cli' + run: | + ./dvdisaster --version + ./dvdisaster --version | grep NOGUI + - name: prepare dist + run: ./.github/workflows/make-dist.sh ${{ github.ref }} + - name: regression tests + if: matrix.printf == 'normal' + env: + REGTEST_NO_UTF8: 1 + run: mkdir /var/tmp/regtest && ./regtest/runtests.sh win: runs-on: windows-latest strategy: diff --git a/configure b/configure index f090d3c..25dfa5d 100755 --- a/configure +++ b/configure @@ -47,7 +47,12 @@ DEFINE_STRING HOMEPAGE "https://dvdisaster.jcea.es" # Check for some essential tools. REQUIRE_GMAKE -REQUIRE_GCC + +if [[ $(uname) =~ Darwin ]]; then + REQUIRE_CLANG +else + REQUIRE_GCC +fi # Find out and verify the basedir of the source installation, # and where to install the binary. @@ -122,6 +127,11 @@ CFG_CFLAGS="$CFG_CFLAGS -D_LARGEFILE64_SOURCE" CHECK_SYMBOL fcntl.h O_LARGEFILE CFG_CFLAGS=$SAVE_CFLAGS +if [[ $(uname) =~ Darwin ]]; then + CFG_CFLAGS="$CFG_CFLAGS -Wno-void-pointer-to-int-cast" + CFG_LDFLAGS="$CFG_LDFLAGS -framework CoreFoundation -framework IOKit" +fi + # Machine specific echo diff --git a/documentation/user-manual/manual.pdf b/documentation/user-manual/manual.pdf index 24743c8dae8c44940add284c7c2e6ac7e82a2340..015255d454c0c32e0336293b0c52de8fac787b21 100644 GIT binary patch delta 25871 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�Lp5*&ap+xq`bSOe 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 delta 25370 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\n" "Language-Team: none (individual translator)\n" @@ -22,7 +22,7 @@ msgstr "" "X-Poedit-Basepath: d:\\Preklady\\dvdisaster\\cvs\n" "X-Poedit-SearchPath-0: dvdisaster\n" -#: src/closure.c:296 +#: src/closure.c:343 #, c-format msgid "" "# dvdisaster-%s configuration file\n" @@ -35,15 +35,15 @@ msgstr "" "# každém spuštění programu.\n" "\n" -#: src/closure.c:564 +#: src/closure.c:648 msgid "medium.iso" msgstr "disc.iso" -#: src/closure.c:565 +#: src/closure.c:649 msgid "medium.ecc" msgstr "disc.ecc" -#: src/closure.c:566 +#: src/closure.c:650 msgid "sector-" msgstr "sektor-" @@ -890,7 +890,7 @@ msgstr "" "GNU General Public License\n" "Licenční podmínky aplikace dvdisaster." -#: src/help-dialogs.c:515 +#: src/help-dialogs.c:503 #, c-format msgid "" "File\n" @@ -901,7 +901,7 @@ msgstr "" "%s\n" "neexistuje" -#: src/help-dialogs.c:525 +#: src/help-dialogs.c:513 #, c-format msgid "" "File\n" @@ -912,7 +912,7 @@ msgstr "" "%s\n" "není dostupný" -#: src/help-dialogs.c:537 +#: src/help-dialogs.c:525 msgid "" "\n" "<- Error: Text file truncated here" @@ -920,17 +920,17 @@ msgstr "" "\n" "<- Chyba: Textový soubor byl zkrácen" -#: src/help-dialogs.c:736 +#: src/help-dialogs.c:724 msgid "windowtitle|About dvdisaster" msgstr "O aplikaci dvdisaster" -#: src/help-dialogs.c:755 src/misc.c:219 +#: src/help-dialogs.c:743 src/misc.c:219 msgid "" "Copyright 2004-2017 Carsten Gnoerlich.\n" "Copyright 2019-2021 The dvdisaster development team." msgstr "" -#: src/help-dialogs.c:763 +#: src/help-dialogs.c:751 msgid "" "dvdisaster provides a margin of safety against data loss\n" "on optical media caused by aging or scratches.\n" @@ -942,7 +942,7 @@ msgstr "" "Vytvoří data pro opravu chyb, která je možné použít k obnovení\n" "nečitelných sektorů, pokud později dojde k poškození disku.\n" -#: src/help-dialogs.c:768 +#: src/help-dialogs.c:756 msgid "" "This software comes with absolutely no warranty.\n" "This is free software and you are welcome to redistribute it\n" @@ -952,13 +952,13 @@ msgstr "" "Jde o svobodný software a můžete jej šířit za dodržení\n" "podmínek [GNU General Public License].\n" -#: src/help-dialogs.c:773 +#: src/help-dialogs.c:761 msgid "" "\n" "e-mail: support@dvdisaster.org" msgstr "" -#: src/help-dialogs.c:779 +#: src/help-dialogs.c:767 msgid "" "\n" "This version is not the original. It has been patched\n" @@ -969,7 +969,7 @@ msgid "" "but submit bugreports against [GitHub] instead.\n" msgstr "" -#: src/help-dialogs.c:787 +#: src/help-dialogs.c:775 msgid "" "\n" "NetBSD port: Sergey Svishchev <svs@ropnet.ru>" @@ -1519,6 +1519,40 @@ msgstr "" "Seznam dostupných metod:\n" "\n" +#: src/misc-gui.c:241 +#, c-format +msgid "" +"The error correction file is already present:\n" +"\n" +"%s\n" +"\n" +"Overwrite it?" +msgstr "" +"Soubor pro opravu chyb již existuje:\n" +"\n" +"%s\n" +"\n" +"Chcete ho přepsat?" + +#: src/misc-gui.c:639 +msgid "Do not ask again" +msgstr "Příště se již neptat" + +#: src/misc-gui.c:660 +#, c-format +msgid "" +"Image file already exists and does not match the medium:\n" +"\n" +"%s\n" +"\n" +"The existing image file will be deleted." +msgstr "" +"Soubor bitové kopie již existuje a nesouhlasí s diskem.\n" +"\n" +"%s\n" +"\n" +"Existující soubor bitové kopie bude smazán." + #: src/misc.c:225 msgid "" "This software comes with ABSOLUTELY NO WARRANTY. This\n" @@ -1580,40 +1614,6 @@ msgstr "" msgid "Image successfully truncated" msgstr "" -#: src/misc-gui.c:241 -#, c-format -msgid "" -"The error correction file is already present:\n" -"\n" -"%s\n" -"\n" -"Overwrite it?" -msgstr "" -"Soubor pro opravu chyb již existuje:\n" -"\n" -"%s\n" -"\n" -"Chcete ho přepsat?" - -#: src/misc-gui.c:639 -msgid "Do not ask again" -msgstr "Příště se již neptat" - -#: src/misc-gui.c:660 -#, c-format -msgid "" -"Image file already exists and does not match the medium:\n" -"\n" -"%s\n" -"\n" -"The existing image file will be deleted." -msgstr "" -"Soubor bitové kopie již existuje a nesouhlasí s diskem.\n" -"\n" -"%s\n" -"\n" -"Existující soubor bitové kopie bude smazán." - #: src/preferences.c:454 msgid "Switched to the linear reading strategy." msgstr "Přepnuto na lineární strategii čtení." @@ -2854,9 +2854,9 @@ msgid "button|Smart L-EC" msgstr "Chytré L-EC" #: src/raw-sector-cache.c:37 src/raw-sector-cache.c:204 -#: src/raw-sector-cache.c:338 src/scsi-freebsd.c:133 src/scsi-freebsd.c:143 -#: src/scsi-linux.c:117 src/scsi-linux.c:126 src/scsi-netbsd.c:128 -#: src/scsi-netbsd.c:138 src/scsi-win32.c:256 +#: src/raw-sector-cache.c:338 src/scsi-darwin.c:218 src/scsi-freebsd.c:133 +#: src/scsi-freebsd.c:143 src/scsi-linux.c:117 src/scsi-linux.c:126 +#: src/scsi-netbsd.c:128 src/scsi-netbsd.c:138 src/scsi-win32.c:256 #, c-format msgid "Could not open %s: %s" msgstr "Nepodařilo se otevřít %s: %s" @@ -2900,6 +2900,36 @@ msgstr " [Vytvoření nového souboru mezipaměti %s]\n" msgid " [Appended %d/%d sectors to cache file %s; LBA=%, ssize=%d, %d sectors]\n" msgstr " [Přidáno %d/%d sektorů do souboru mezipaměti %s; LBA=%, velikosts=%d, %d sektorů]\n" +#: src/read-adaptive-window.c:84 +msgid "Adaptive reading:" +msgstr "Adaptivní čtení:" + +#: src/read-adaptive-window.c:112 +msgid "Sectors processed" +msgstr "Zpracované sektory" + +#: src/read-adaptive-window.c:115 src/scsi-layer.c:1762 +msgid "readable" +msgstr "čitelné" + +#: src/read-adaptive-window.c:119 +msgid "correctable" +msgstr "opravitelné" + +#: src/read-adaptive-window.c:123 +msgid "missing" +msgstr "chybějící" + +#: src/read-adaptive-window.c:133 +#, c-format +msgid "Readable: %d.%d%% / %d.%d%% required" +msgstr "Čitelné: %d.%d%% / %d.%d%% požadovaných" + +#: src/read-adaptive-window.c:140 +#, c-format +msgid "Total recoverable: %d.%d%%" +msgstr "Celkem opravitelných: %d.%d%%" + #: src/read-adaptive.c:57 src/rs01-create.c:1018 #, c-format msgid "" @@ -3232,35 +3262,44 @@ msgid "" "%2d.%1d%% of the image have been read (% sectors).\n" msgstr "" -#: src/read-adaptive-window.c:84 -msgid "Adaptive reading:" -msgstr "Adaptivní čtení:" - -#: src/read-adaptive-window.c:112 -msgid "Sectors processed" -msgstr "Zpracované sektory" - -#: src/read-adaptive-window.c:115 src/scsi-layer.c:1762 -msgid "readable" -msgstr "čitelné" - -#: src/read-adaptive-window.c:119 -msgid "correctable" -msgstr "opravitelné" - -#: src/read-adaptive-window.c:123 -msgid "missing" -msgstr "chybějící" - -#: src/read-adaptive-window.c:133 +#: src/read-linear-window.c:102 #, c-format -msgid "Readable: %d.%d%% / %d.%d%% required" -msgstr "Čitelné: %d.%d%% / %d.%d%% požadovaných" +msgid "Current Speed: %d.%dx" +msgstr "Aktuální rychlost: %d.%dx" -#: src/read-adaptive-window.c:140 +#: src/read-linear-window.c:109 src/read-linear.c:515 #, c-format -msgid "Total recoverable: %d.%d%%" -msgstr "Celkem opravitelných: %d.%d%%" +msgid "Unreadable / skipped sectors: %" +msgstr "" + +#: src/read-linear-window.c:264 src/read-linear-window.c:333 +msgid "Already present" +msgstr "Již existuje" + +#: src/read-linear-window.c:298 src/read-linear-window.c:340 +#: src/rs01-verify.c:130 src/rs02-verify.c:123 src/rs03-verify.c:133 +msgid "Sectors with CRC errors" +msgstr "Sektory s chybami CRC" + +#: src/read-linear-window.c:321 +msgid "Medium state" +msgstr "Stav disku" + +#: src/read-linear-window.c:329 +msgid "Not touched this time" +msgstr "Vynechán" + +#: src/read-linear-window.c:336 +msgid "Successfully read" +msgstr "Úspěšně přečtený" + +#: src/read-linear-window.c:343 +msgid "Unreadable / skipped" +msgstr "Nečitelný/přeskočený" + +#: src/read-linear-window.c:454 +msgid "Speed" +msgstr "Rychlost" #: src/read-linear.c:122 #, c-format @@ -3315,11 +3354,6 @@ msgstr "dokončeno.\n" msgid "Waiting %d seconds for drive to spin up...\n" msgstr "Čekám %d sekund na roztočení disku...\n" -#: src/read-linear.c:515 src/read-linear-window.c:109 -#, c-format -msgid "Unreadable / skipped sectors: %" -msgstr "" - #: src/read-linear.c:605 #, c-format msgid "Sector %: Speed increased to %4.1fx\n" @@ -3499,40 +3533,6 @@ msgid "" "Use the --dao option to disable image truncating.\n" msgstr "" -#: src/read-linear-window.c:102 -#, c-format -msgid "Current Speed: %d.%dx" -msgstr "Aktuální rychlost: %d.%dx" - -#: src/read-linear-window.c:264 src/read-linear-window.c:333 -msgid "Already present" -msgstr "Již existuje" - -#: src/read-linear-window.c:298 src/read-linear-window.c:340 -#: src/rs01-verify.c:130 src/rs02-verify.c:123 src/rs03-verify.c:133 -msgid "Sectors with CRC errors" -msgstr "Sektory s chybami CRC" - -#: src/read-linear-window.c:321 -msgid "Medium state" -msgstr "Stav disku" - -#: src/read-linear-window.c:329 -msgid "Not touched this time" -msgstr "Vynechán" - -#: src/read-linear-window.c:336 -msgid "Successfully read" -msgstr "Úspěšně přečtený" - -#: src/read-linear-window.c:343 -msgid "Unreadable / skipped" -msgstr "Nečitelný/přeskočený" - -#: src/read-linear-window.c:454 -msgid "Speed" -msgstr "Rychlost" - #: src/recover-raw.c:66 #, c-format msgid "Sector % dumped to %s\n" @@ -5812,6 +5812,15 @@ msgstr "Výkon:" msgid "State:" msgstr "Stav:" +#: src/scsi-darwin.c:183 +msgid "No CD/DVD drives found." +msgstr "Nebyly nalezeny žádné CD/DVD mechaniky." + +#: src/scsi-darwin.c:229 +#, c-format +msgid "Could not open %s (%s)." +msgstr "" + #: src/scsi-freebsd.c:49 src/scsi-linux.c:53 msgid "" "Can not access /dev for devices\n" @@ -6236,15 +6245,19 @@ msgid "" "not found.\n" msgstr "" -#: src/show-manual.c:114 +#: src/show-manual.c:118 msgid "Could not create pipe before fork" msgstr "" -#: src/show-manual.c:122 +#: src/show-manual.c:123 src/show-manual.c:128 +msgid "Could not set pipe flags before fork" +msgstr "" + +#: src/show-manual.c:136 msgid "Could not fork to start xdg-open" msgstr "" -#: src/show-manual.c:145 +#: src/show-manual.c:159 #, c-format msgid "" "execvp could not execute \"xdg-open\":\n" @@ -7379,9 +7392,6 @@ msgstr "Novinky v této verzi:" #~ "\n" #~ "Port pro Darwin (Mac OS X): Julian Einwag <julian@einwag.de>" -#~ msgid "No CD/DVD drives found." -#~ msgstr "Nebyly nalezeny žádné CD/DVD mechaniky." - #~ msgid "dvdisaster-%s log\n" #~ msgstr "záznam programu dvdisaster-%s\n" diff --git a/locale/de.po b/locale/de.po index f51121b..248fd1f 100644 --- a/locale/de.po +++ b/locale/de.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: dvdisaster 0.52.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-09 17:07+0200\n" +"POT-Creation-Date: 2023-09-13 13:48+0200\n" "PO-Revision-Date: 2004-11-30 19:48+0100\n" "Last-Translator: Carsten Gnörlich \n" "Language-Team: German \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: src/closure.c:296 +#: src/closure.c:343 #, c-format msgid "" "# dvdisaster-%s configuration file\n" @@ -31,15 +31,15 @@ msgstr "" "# Sie wird bei jedem Aufruf von dvdisaster neu überschrieben.\n" "\n" -#: src/closure.c:564 +#: src/closure.c:648 msgid "medium.iso" msgstr "abbild.iso" -#: src/closure.c:565 +#: src/closure.c:649 msgid "medium.ecc" msgstr "abbild.ecc" -#: src/closure.c:566 +#: src/closure.c:650 msgid "sector-" msgstr "sektor_" @@ -933,7 +933,7 @@ msgstr "" "GNU General Public License\n" "Die Lizenzbedingungen von dvdisaster." -#: src/help-dialogs.c:515 +#: src/help-dialogs.c:503 #, c-format msgid "" "File\n" @@ -944,7 +944,7 @@ msgstr "" "%s\n" "nicht vorhanden" -#: src/help-dialogs.c:525 +#: src/help-dialogs.c:513 #, c-format msgid "" "File\n" @@ -955,7 +955,7 @@ msgstr "" "%s\n" "kann nicht zugegriffen werden" -#: src/help-dialogs.c:537 +#: src/help-dialogs.c:525 msgid "" "\n" "<- Error: Text file truncated here" @@ -963,17 +963,17 @@ msgstr "" "\n" "<- Fehler: Textdatei wurde hier abgeschnitten" -#: src/help-dialogs.c:736 +#: src/help-dialogs.c:724 msgid "windowtitle|About dvdisaster" msgstr "Kurzinformation" -#: src/help-dialogs.c:755 src/misc.c:219 +#: src/help-dialogs.c:743 src/misc.c:219 msgid "" "Copyright 2004-2017 Carsten Gnoerlich.\n" "Copyright 2019-2021 The dvdisaster development team." msgstr "" -#: src/help-dialogs.c:763 +#: src/help-dialogs.c:751 msgid "" "dvdisaster provides a margin of safety against data loss\n" "on optical media caused by aging or scratches.\n" @@ -985,7 +985,7 @@ msgstr "" "Es erzeugt Fehlerkorrektur-Daten, um bei nachfolgenden Datenträger-\n" "Problemen unlesbare Sektoren zu rekonstruieren.\n" -#: src/help-dialogs.c:768 +#: src/help-dialogs.c:756 msgid "" "This software comes with absolutely no warranty.\n" "This is free software and you are welcome to redistribute it\n" @@ -994,13 +994,13 @@ msgstr "" "dvdisaster ist freie Software; es gelten die Bedingungen\n" "der [GNU General Public License] .\n" -#: src/help-dialogs.c:773 +#: src/help-dialogs.c:761 msgid "" "\n" "e-mail: support@dvdisaster.org" msgstr "" -#: src/help-dialogs.c:779 +#: src/help-dialogs.c:767 msgid "" "\n" "This version is not the original. It has been patched\n" @@ -1011,7 +1011,7 @@ msgid "" "but submit bugreports against [GitHub] instead.\n" msgstr "" -#: src/help-dialogs.c:787 +#: src/help-dialogs.c:775 msgid "" "\n" "NetBSD port: Sergey Svishchev <svs@ropnet.ru>" @@ -1566,6 +1566,40 @@ msgstr "" "Liste der verfügbaren Methoden:\n" "\n" +#: src/misc-gui.c:241 +#, c-format +msgid "" +"The error correction file is already present:\n" +"\n" +"%s\n" +"\n" +"Overwrite it?" +msgstr "" +"Es gibt bereits eine Fehlerkorrektur-Datei:\n" +"\n" +"%s\n" +"\n" +"Soll sie überschrieben werden?" + +#: src/misc-gui.c:639 +msgid "Do not ask again" +msgstr "Nicht mehr nachfragen" + +#: src/misc-gui.c:660 +#, c-format +msgid "" +"Image file already exists and does not match the medium:\n" +"\n" +"%s\n" +"\n" +"The existing image file will be deleted." +msgstr "" +"Die bereits vorhandene Abbild-Datei paßt nicht zu dem Datenträger:\n" +"\n" +"%s\n" +"\n" +"Soll die Abbild-Datei gelöscht werden?" + #: src/misc.c:225 msgid "" "This software comes with ABSOLUTELY NO WARRANTY. This\n" @@ -1625,40 +1659,6 @@ msgstr "" msgid "Image successfully truncated" msgstr "" -#: src/misc-gui.c:241 -#, c-format -msgid "" -"The error correction file is already present:\n" -"\n" -"%s\n" -"\n" -"Overwrite it?" -msgstr "" -"Es gibt bereits eine Fehlerkorrektur-Datei:\n" -"\n" -"%s\n" -"\n" -"Soll sie überschrieben werden?" - -#: src/misc-gui.c:639 -msgid "Do not ask again" -msgstr "Nicht mehr nachfragen" - -#: src/misc-gui.c:660 -#, c-format -msgid "" -"Image file already exists and does not match the medium:\n" -"\n" -"%s\n" -"\n" -"The existing image file will be deleted." -msgstr "" -"Die bereits vorhandene Abbild-Datei paßt nicht zu dem Datenträger:\n" -"\n" -"%s\n" -"\n" -"Soll die Abbild-Datei gelöscht werden?" - #: src/preferences.c:454 msgid "Switched to the linear reading strategy." msgstr "Lineares Leseverfahren wurde ausgewählt." @@ -2915,9 +2915,9 @@ msgid "button|Smart L-EC" msgstr "Smart L-EC" #: src/raw-sector-cache.c:37 src/raw-sector-cache.c:204 -#: src/raw-sector-cache.c:338 src/scsi-freebsd.c:133 src/scsi-freebsd.c:143 -#: src/scsi-linux.c:117 src/scsi-linux.c:126 src/scsi-netbsd.c:128 -#: src/scsi-netbsd.c:138 src/scsi-win32.c:256 +#: src/raw-sector-cache.c:338 src/scsi-darwin.c:218 src/scsi-freebsd.c:133 +#: src/scsi-freebsd.c:143 src/scsi-linux.c:117 src/scsi-linux.c:126 +#: src/scsi-netbsd.c:128 src/scsi-netbsd.c:138 src/scsi-win32.c:256 #, c-format msgid "Could not open %s: %s" msgstr "Konnte %s nicht öffnen: %s" @@ -2963,6 +2963,36 @@ msgstr " [Erzeuge neue Datei %s]\n" msgid " [Appended %d/%d sectors to cache file %s; LBA=%, ssize=%d, %d sectors]\n" msgstr " [%d/%d Sektoren der Datei %s hinzugefügt; LBA=%, S.-Größe=%d, %d Sektoren]\n" +#: src/read-adaptive-window.c:84 +msgid "Adaptive reading:" +msgstr "Angepaßtes Leseverfahren:" + +#: src/read-adaptive-window.c:112 +msgid "Sectors processed" +msgstr "Bearbeitete Sektoren" + +#: src/read-adaptive-window.c:115 src/scsi-layer.c:1762 +msgid "readable" +msgstr "lesbar" + +#: src/read-adaptive-window.c:119 +msgid "correctable" +msgstr "korrigierbar" + +#: src/read-adaptive-window.c:123 +msgid "missing" +msgstr "fehlend" + +#: src/read-adaptive-window.c:133 +#, c-format +msgid "Readable: %d.%d%% / %d.%d%% required" +msgstr "Lesbar: %d.%d%% / %d.%d%% benötigt" + +#: src/read-adaptive-window.c:140 +#, c-format +msgid "Total recoverable: %d.%d%%" +msgstr "Insgesamt wiederherstellbar: %d.%d%%" + #: src/read-adaptive.c:57 src/rs01-create.c:1018 #, c-format msgid "" @@ -3307,35 +3337,44 @@ msgstr "" "%s\n" "%2d.%1d%% des Abbilds wurden eingelesen (% Sektoren).\n" -#: src/read-adaptive-window.c:84 -msgid "Adaptive reading:" -msgstr "Angepaßtes Leseverfahren:" - -#: src/read-adaptive-window.c:112 -msgid "Sectors processed" -msgstr "Bearbeitete Sektoren" - -#: src/read-adaptive-window.c:115 src/scsi-layer.c:1762 -msgid "readable" -msgstr "lesbar" - -#: src/read-adaptive-window.c:119 -msgid "correctable" -msgstr "korrigierbar" - -#: src/read-adaptive-window.c:123 -msgid "missing" -msgstr "fehlend" - -#: src/read-adaptive-window.c:133 +#: src/read-linear-window.c:102 #, c-format -msgid "Readable: %d.%d%% / %d.%d%% required" -msgstr "Lesbar: %d.%d%% / %d.%d%% benötigt" +msgid "Current Speed: %d.%dx" +msgstr "Momentane Geschwindigkeit: %d.%dx" -#: src/read-adaptive-window.c:140 +#: src/read-linear-window.c:109 src/read-linear.c:515 #, c-format -msgid "Total recoverable: %d.%d%%" -msgstr "Insgesamt wiederherstellbar: %d.%d%%" +msgid "Unreadable / skipped sectors: %" +msgstr "Unlesbare / Übersprungene Sektoren: %" + +#: src/read-linear-window.c:264 src/read-linear-window.c:333 +msgid "Already present" +msgstr "Bereits vorhanden" + +#: src/read-linear-window.c:298 src/read-linear-window.c:340 +#: src/rs01-verify.c:130 src/rs02-verify.c:123 src/rs03-verify.c:133 +msgid "Sectors with CRC errors" +msgstr "Prüfsummen-Fehler" + +#: src/read-linear-window.c:321 +msgid "Medium state" +msgstr "Datenträger-Zustand" + +#: src/read-linear-window.c:329 +msgid "Not touched this time" +msgstr "Diesmal unberücksichtigt" + +#: src/read-linear-window.c:336 +msgid "Successfully read" +msgstr "Erfolgreich gelesen" + +#: src/read-linear-window.c:343 +msgid "Unreadable / skipped" +msgstr "Unlesbar / Übersprungen" + +#: src/read-linear-window.c:454 +msgid "Speed" +msgstr "Geschwindigkeit" #: src/read-linear.c:122 #, c-format @@ -3390,11 +3429,6 @@ msgstr "fertig.\n" msgid "Waiting %d seconds for drive to spin up...\n" msgstr "Warte %d Sekunden auf das Hochdrehen des Laufwerks...\n" -#: src/read-linear.c:515 src/read-linear-window.c:109 -#, c-format -msgid "Unreadable / skipped sectors: %" -msgstr "Unlesbare / Übersprungene Sektoren: %" - #: src/read-linear.c:605 #, c-format msgid "Sector %: Speed increased to %4.1fx\n" @@ -3575,40 +3609,6 @@ msgid "" "Use the --dao option to disable image truncating.\n" msgstr "" -#: src/read-linear-window.c:102 -#, c-format -msgid "Current Speed: %d.%dx" -msgstr "Momentane Geschwindigkeit: %d.%dx" - -#: src/read-linear-window.c:264 src/read-linear-window.c:333 -msgid "Already present" -msgstr "Bereits vorhanden" - -#: src/read-linear-window.c:298 src/read-linear-window.c:340 -#: src/rs01-verify.c:130 src/rs02-verify.c:123 src/rs03-verify.c:133 -msgid "Sectors with CRC errors" -msgstr "Prüfsummen-Fehler" - -#: src/read-linear-window.c:321 -msgid "Medium state" -msgstr "Datenträger-Zustand" - -#: src/read-linear-window.c:329 -msgid "Not touched this time" -msgstr "Diesmal unberücksichtigt" - -#: src/read-linear-window.c:336 -msgid "Successfully read" -msgstr "Erfolgreich gelesen" - -#: src/read-linear-window.c:343 -msgid "Unreadable / skipped" -msgstr "Unlesbar / Übersprungen" - -#: src/read-linear-window.c:454 -msgid "Speed" -msgstr "Geschwindigkeit" - #: src/recover-raw.c:66 #, c-format msgid "Sector % dumped to %s\n" @@ -5927,6 +5927,15 @@ msgstr "Leistung:" msgid "State:" msgstr "Zustand:" +#: src/scsi-darwin.c:183 +msgid "No CD/DVD drives found." +msgstr "" + +#: src/scsi-darwin.c:229 +#, c-format +msgid "Could not open %s (%s)." +msgstr "" + #: src/scsi-freebsd.c:49 src/scsi-linux.c:53 msgid "" "Can not access /dev for devices\n" @@ -6361,15 +6370,19 @@ msgid "" "not found.\n" msgstr "" -#: src/show-manual.c:114 +#: src/show-manual.c:118 msgid "Could not create pipe before fork" msgstr "" -#: src/show-manual.c:122 +#: src/show-manual.c:123 src/show-manual.c:128 +msgid "Could not set pipe flags before fork" +msgstr "" + +#: src/show-manual.c:136 msgid "Could not fork to start xdg-open" msgstr "" -#: src/show-manual.c:145 +#: src/show-manual.c:159 #, c-format msgid "" "execvp could not execute \"xdg-open\":\n" diff --git a/locale/it.po b/locale/it.po index ec5ee77..7d1f5a9 100644 --- a/locale/it.po +++ b/locale/it.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: dvdisaster 0.52.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-09 17:07+0200\n" +"POT-Creation-Date: 2023-09-13 13:48+0200\n" "PO-Revision-Date: 2005-01-01 14:24+0100\n" "Last-Translator: Andrea Polverini \n" "Language-Team: Italian <>\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: src/closure.c:296 +#: src/closure.c:343 #, c-format msgid "" "# dvdisaster-%s configuration file\n" @@ -31,15 +31,15 @@ msgstr "" "# e sarà sovrascritto ogni volta che verrà eseguito dvdisaster\n" "\n" -#: src/closure.c:564 +#: src/closure.c:648 msgid "medium.iso" msgstr "" -#: src/closure.c:565 +#: src/closure.c:649 msgid "medium.ecc" msgstr "" -#: src/closure.c:566 +#: src/closure.c:650 msgid "sector-" msgstr "" @@ -855,7 +855,7 @@ msgstr "" "Licenza pubblica GNU\n" "Termini di Licenza di dvdisaster." -#: src/help-dialogs.c:515 +#: src/help-dialogs.c:503 #, c-format msgid "" "File\n" @@ -866,7 +866,7 @@ msgstr "" "%s\n" "non presente" -#: src/help-dialogs.c:525 +#: src/help-dialogs.c:513 #, c-format msgid "" "File\n" @@ -874,23 +874,23 @@ msgid "" "not accessible" msgstr "" -#: src/help-dialogs.c:537 +#: src/help-dialogs.c:525 msgid "" "\n" "<- Error: Text file truncated here" msgstr "" -#: src/help-dialogs.c:736 +#: src/help-dialogs.c:724 msgid "windowtitle|About dvdisaster" msgstr "Info su dvdisaster" -#: src/help-dialogs.c:755 src/misc.c:219 +#: src/help-dialogs.c:743 src/misc.c:219 msgid "" "Copyright 2004-2017 Carsten Gnoerlich.\n" "Copyright 2019-2021 The dvdisaster development team." msgstr "" -#: src/help-dialogs.c:763 +#: src/help-dialogs.c:751 msgid "" "dvdisaster provides a margin of safety against data loss\n" "on optical media caused by aging or scratches.\n" @@ -902,7 +902,7 @@ msgstr "" "Crea dei dati di correzione degli errori che saranno poi utilizzati per recuperare\n" "i settori illeggibili se il supporto dovesse danneggiarsi col tempo.\n" -#: src/help-dialogs.c:768 +#: src/help-dialogs.c:756 msgid "" "This software comes with absolutely no warranty.\n" "This is free software and you are welcome to redistribute it\n" @@ -914,13 +914,13 @@ msgstr "" "\n" "Traduzione italiana di Andrea Polverini (info@polve.com).\n" -#: src/help-dialogs.c:773 +#: src/help-dialogs.c:761 msgid "" "\n" "e-mail: support@dvdisaster.org" msgstr "" -#: src/help-dialogs.c:779 +#: src/help-dialogs.c:767 msgid "" "\n" "This version is not the original. It has been patched\n" @@ -931,7 +931,7 @@ msgid "" "but submit bugreports against [GitHub] instead.\n" msgstr "" -#: src/help-dialogs.c:787 +#: src/help-dialogs.c:775 msgid "" "\n" "NetBSD port: Sergey Svishchev <svs@ropnet.ru>" @@ -1456,6 +1456,30 @@ msgstr "" "Elenco dei metodi disponibili:\n" "\n" +#: src/misc-gui.c:241 +#, c-format +msgid "" +"The error correction file is already present:\n" +"\n" +"%s\n" +"\n" +"Overwrite it?" +msgstr "" + +#: src/misc-gui.c:639 +msgid "Do not ask again" +msgstr "" + +#: src/misc-gui.c:660 +#, c-format +msgid "" +"Image file already exists and does not match the medium:\n" +"\n" +"%s\n" +"\n" +"The existing image file will be deleted." +msgstr "" + #: src/misc.c:225 msgid "" "This software comes with ABSOLUTELY NO WARRANTY. This\n" @@ -1517,30 +1541,6 @@ msgstr "" msgid "Image successfully truncated" msgstr "" -#: src/misc-gui.c:241 -#, c-format -msgid "" -"The error correction file is already present:\n" -"\n" -"%s\n" -"\n" -"Overwrite it?" -msgstr "" - -#: src/misc-gui.c:639 -msgid "Do not ask again" -msgstr "" - -#: src/misc-gui.c:660 -#, c-format -msgid "" -"Image file already exists and does not match the medium:\n" -"\n" -"%s\n" -"\n" -"The existing image file will be deleted." -msgstr "" - #: src/preferences.c:454 msgid "Switched to the linear reading strategy." msgstr "Settata la strategia di lettura lineare" @@ -2600,9 +2600,9 @@ msgid "button|Smart L-EC" msgstr "" #: src/raw-sector-cache.c:37 src/raw-sector-cache.c:204 -#: src/raw-sector-cache.c:338 src/scsi-freebsd.c:133 src/scsi-freebsd.c:143 -#: src/scsi-linux.c:117 src/scsi-linux.c:126 src/scsi-netbsd.c:128 -#: src/scsi-netbsd.c:138 src/scsi-win32.c:256 +#: src/raw-sector-cache.c:338 src/scsi-darwin.c:218 src/scsi-freebsd.c:133 +#: src/scsi-freebsd.c:143 src/scsi-linux.c:117 src/scsi-linux.c:126 +#: src/scsi-netbsd.c:128 src/scsi-netbsd.c:138 src/scsi-win32.c:256 #, c-format msgid "Could not open %s: %s" msgstr "Non posso aprire %s: %s" @@ -2646,6 +2646,36 @@ msgstr "" msgid " [Appended %d/%d sectors to cache file %s; LBA=%, ssize=%d, %d sectors]\n" msgstr "" +#: src/read-adaptive-window.c:84 +msgid "Adaptive reading:" +msgstr "Modo di lettura adattivo:" + +#: src/read-adaptive-window.c:112 +msgid "Sectors processed" +msgstr "Settori processati" + +#: src/read-adaptive-window.c:115 src/scsi-layer.c:1762 +msgid "readable" +msgstr "Leggibile" + +#: src/read-adaptive-window.c:119 +msgid "correctable" +msgstr "Correggibili" + +#: src/read-adaptive-window.c:123 +msgid "missing" +msgstr "Mancanti" + +#: src/read-adaptive-window.c:133 +#, c-format +msgid "Readable: %d.%d%% / %d.%d%% required" +msgstr "" + +#: src/read-adaptive-window.c:140 +#, c-format +msgid "Total recoverable: %d.%d%%" +msgstr "Totale recuperabile: %d.%d%%" + #: src/read-adaptive.c:57 src/rs01-create.c:1018 #, c-format msgid "" @@ -2976,35 +3006,44 @@ msgstr "" "%s\n" "%2d.%1d%% dell'immagine è stata letta (% settori).\n" -#: src/read-adaptive-window.c:84 -msgid "Adaptive reading:" -msgstr "Modo di lettura adattivo:" - -#: src/read-adaptive-window.c:112 -msgid "Sectors processed" -msgstr "Settori processati" - -#: src/read-adaptive-window.c:115 src/scsi-layer.c:1762 -msgid "readable" -msgstr "Leggibile" - -#: src/read-adaptive-window.c:119 -msgid "correctable" -msgstr "Correggibili" - -#: src/read-adaptive-window.c:123 -msgid "missing" -msgstr "Mancanti" - -#: src/read-adaptive-window.c:133 +#: src/read-linear-window.c:102 #, c-format -msgid "Readable: %d.%d%% / %d.%d%% required" -msgstr "" +msgid "Current Speed: %d.%dx" +msgstr "Velocità corrente: %d.%dx" -#: src/read-adaptive-window.c:140 +#: src/read-linear-window.c:109 src/read-linear.c:515 #, c-format -msgid "Total recoverable: %d.%d%%" -msgstr "Totale recuperabile: %d.%d%%" +msgid "Unreadable / skipped sectors: %" +msgstr "Settori illeggibili / saltati: %" + +#: src/read-linear-window.c:264 src/read-linear-window.c:333 +msgid "Already present" +msgstr "Già presente" + +#: src/read-linear-window.c:298 src/read-linear-window.c:340 +#: src/rs01-verify.c:130 src/rs02-verify.c:123 src/rs03-verify.c:133 +msgid "Sectors with CRC errors" +msgstr "Settori con errori CRC" + +#: src/read-linear-window.c:321 +msgid "Medium state" +msgstr "Stato del supporto" + +#: src/read-linear-window.c:329 +msgid "Not touched this time" +msgstr "Non toccato questa volta" + +#: src/read-linear-window.c:336 +msgid "Successfully read" +msgstr "letto con successo" + +#: src/read-linear-window.c:343 +msgid "Unreadable / skipped" +msgstr "Illeggibili / Saltati" + +#: src/read-linear-window.c:454 +msgid "Speed" +msgstr "Velocità" #: src/read-linear.c:122 #, c-format @@ -3059,11 +3098,6 @@ msgstr "compiuto.\n" msgid "Waiting %d seconds for drive to spin up...\n" msgstr "Attendere %d secondi per far avviare il drive...\n" -#: src/read-linear.c:515 src/read-linear-window.c:109 -#, c-format -msgid "Unreadable / skipped sectors: %" -msgstr "Settori illeggibili / saltati: %" - #: src/read-linear.c:605 #, c-format msgid "Sector %: Speed increased to %4.1fx\n" @@ -3239,40 +3273,6 @@ msgid "" "Use the --dao option to disable image truncating.\n" msgstr "" -#: src/read-linear-window.c:102 -#, c-format -msgid "Current Speed: %d.%dx" -msgstr "Velocità corrente: %d.%dx" - -#: src/read-linear-window.c:264 src/read-linear-window.c:333 -msgid "Already present" -msgstr "Già presente" - -#: src/read-linear-window.c:298 src/read-linear-window.c:340 -#: src/rs01-verify.c:130 src/rs02-verify.c:123 src/rs03-verify.c:133 -msgid "Sectors with CRC errors" -msgstr "Settori con errori CRC" - -#: src/read-linear-window.c:321 -msgid "Medium state" -msgstr "Stato del supporto" - -#: src/read-linear-window.c:329 -msgid "Not touched this time" -msgstr "Non toccato questa volta" - -#: src/read-linear-window.c:336 -msgid "Successfully read" -msgstr "letto con successo" - -#: src/read-linear-window.c:343 -msgid "Unreadable / skipped" -msgstr "Illeggibili / Saltati" - -#: src/read-linear-window.c:454 -msgid "Speed" -msgstr "Velocità" - #: src/recover-raw.c:66 #, c-format msgid "Sector % dumped to %s\n" @@ -5397,6 +5397,15 @@ msgstr "" msgid "State:" msgstr "" +#: src/scsi-darwin.c:183 +msgid "No CD/DVD drives found." +msgstr "Nessun CD/DVD drive trovato." + +#: src/scsi-darwin.c:229 +#, c-format +msgid "Could not open %s (%s)." +msgstr "" + #: src/scsi-freebsd.c:49 src/scsi-linux.c:53 msgid "" "Can not access /dev for devices\n" @@ -5812,15 +5821,19 @@ msgid "" "not found.\n" msgstr "" -#: src/show-manual.c:114 +#: src/show-manual.c:118 msgid "Could not create pipe before fork" msgstr "" -#: src/show-manual.c:122 +#: src/show-manual.c:123 src/show-manual.c:128 +msgid "Could not set pipe flags before fork" +msgstr "" + +#: src/show-manual.c:136 msgid "Could not fork to start xdg-open" msgstr "" -#: src/show-manual.c:145 +#: src/show-manual.c:159 #, c-format msgid "" "execvp could not execute \"xdg-open\":\n" @@ -6330,9 +6343,6 @@ msgstr "" #~ "Nessun CD/DVD drive trovato in /dev.\n" #~ "Nessun drive sarà preselezionato.\n" -#~ msgid "No CD/DVD drives found." -#~ msgstr "Nessun CD/DVD drive trovato." - #~ msgid "dvdisaster-%s log\n" #~ msgstr "dvdisaster-%s protocollo\n" diff --git a/locale/pt_BR.po b/locale/pt_BR.po index 5295bba..3c3e9a4 100644 --- a/locale/pt_BR.po +++ b/locale/pt_BR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: dvdisaster 0.72.rc2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-09 17:07+0200\n" +"POT-Creation-Date: 2023-09-13 13:48+0200\n" "PO-Revision-Date: 2010-06-09 11:13+0200\n" "Last-Translator: cg \n" "Language-Team: Portuguese\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: src/closure.c:296 +#: src/closure.c:343 #, c-format msgid "" "# dvdisaster-%s configuration file\n" @@ -30,15 +30,15 @@ msgstr "" "# que será sobreescrevido toda vez que o dvdisaster rodar.\n" "\n" -#: src/closure.c:564 +#: src/closure.c:648 msgid "medium.iso" msgstr "midia.iso" -#: src/closure.c:565 +#: src/closure.c:649 msgid "medium.ecc" msgstr "midia.ecc" -#: src/closure.c:566 +#: src/closure.c:650 msgid "sector-" msgstr "setor-" @@ -871,7 +871,7 @@ msgstr "" "Licença Pública Geral GNU\n" "Os termos de licença do dvdisaster." -#: src/help-dialogs.c:515 +#: src/help-dialogs.c:503 #, c-format msgid "" "File\n" @@ -882,7 +882,7 @@ msgstr "" "%s\n" "não presente" -#: src/help-dialogs.c:525 +#: src/help-dialogs.c:513 #, c-format msgid "" "File\n" @@ -890,23 +890,23 @@ msgid "" "not accessible" msgstr "" -#: src/help-dialogs.c:537 +#: src/help-dialogs.c:525 msgid "" "\n" "<- Error: Text file truncated here" msgstr "" -#: src/help-dialogs.c:736 +#: src/help-dialogs.c:724 msgid "windowtitle|About dvdisaster" msgstr "windowtitle|Sobre o dvdisaster" -#: src/help-dialogs.c:755 src/misc.c:219 +#: src/help-dialogs.c:743 src/misc.c:219 msgid "" "Copyright 2004-2017 Carsten Gnoerlich.\n" "Copyright 2019-2021 The dvdisaster development team." msgstr "" -#: src/help-dialogs.c:763 +#: src/help-dialogs.c:751 msgid "" "dvdisaster provides a margin of safety against data loss\n" "on optical media caused by aging or scratches.\n" @@ -918,7 +918,7 @@ msgstr "" "Ele cria dados de correção de erros que são usados para recuperar\n" "setores ilegíveis se o disco ficar danificado posteriormente.\n" -#: src/help-dialogs.c:768 +#: src/help-dialogs.c:756 msgid "" "This software comes with absolutely no warranty.\n" "This is free software and you are welcome to redistribute it\n" @@ -930,13 +930,13 @@ msgstr "" "\n" "Tradução para português por Pablo Almeida (pabloalmeidaff9@gmail.com)\n" -#: src/help-dialogs.c:773 +#: src/help-dialogs.c:761 msgid "" "\n" "e-mail: support@dvdisaster.org" msgstr "" -#: src/help-dialogs.c:779 +#: src/help-dialogs.c:767 msgid "" "\n" "This version is not the original. It has been patched\n" @@ -947,7 +947,7 @@ msgid "" "but submit bugreports against [GitHub] instead.\n" msgstr "" -#: src/help-dialogs.c:787 +#: src/help-dialogs.c:775 msgid "" "\n" "NetBSD port: Sergey Svishchev <svs@ropnet.ru>" @@ -1481,6 +1481,30 @@ msgstr "" "Lista dos métodos disponíveis:\n" "\n" +#: src/misc-gui.c:241 +#, c-format +msgid "" +"The error correction file is already present:\n" +"\n" +"%s\n" +"\n" +"Overwrite it?" +msgstr "" + +#: src/misc-gui.c:639 +msgid "Do not ask again" +msgstr "" + +#: src/misc-gui.c:660 +#, c-format +msgid "" +"Image file already exists and does not match the medium:\n" +"\n" +"%s\n" +"\n" +"The existing image file will be deleted." +msgstr "" + #: src/misc.c:225 msgid "" "This software comes with ABSOLUTELY NO WARRANTY. This\n" @@ -1544,30 +1568,6 @@ msgstr "" msgid "Image successfully truncated" msgstr "" -#: src/misc-gui.c:241 -#, c-format -msgid "" -"The error correction file is already present:\n" -"\n" -"%s\n" -"\n" -"Overwrite it?" -msgstr "" - -#: src/misc-gui.c:639 -msgid "Do not ask again" -msgstr "" - -#: src/misc-gui.c:660 -#, c-format -msgid "" -"Image file already exists and does not match the medium:\n" -"\n" -"%s\n" -"\n" -"The existing image file will be deleted." -msgstr "" - #: src/preferences.c:454 msgid "Switched to the linear reading strategy." msgstr "Mudado para a estratégia de leitura linear" @@ -2780,9 +2780,9 @@ msgid "button|Smart L-EC" msgstr "Smart L-EC" #: src/raw-sector-cache.c:37 src/raw-sector-cache.c:204 -#: src/raw-sector-cache.c:338 src/scsi-freebsd.c:133 src/scsi-freebsd.c:143 -#: src/scsi-linux.c:117 src/scsi-linux.c:126 src/scsi-netbsd.c:128 -#: src/scsi-netbsd.c:138 src/scsi-win32.c:256 +#: src/raw-sector-cache.c:338 src/scsi-darwin.c:218 src/scsi-freebsd.c:133 +#: src/scsi-freebsd.c:143 src/scsi-linux.c:117 src/scsi-linux.c:126 +#: src/scsi-netbsd.c:128 src/scsi-netbsd.c:138 src/scsi-win32.c:256 #, c-format msgid "Could not open %s: %s" msgstr "Impossível abrir %s: %s" @@ -2826,6 +2826,36 @@ msgstr " [Criando novo arquivo de cache %s]\n" msgid " [Appended %d/%d sectors to cache file %s; LBA=%, ssize=%d, %d sectors]\n" msgstr " [Anexados %d/%d setores ao arquivo de cache %s; LBA=%, ssize=%d, %d setores]\n" +#: src/read-adaptive-window.c:84 +msgid "Adaptive reading:" +msgstr "Leitura adaptiva:" + +#: src/read-adaptive-window.c:112 +msgid "Sectors processed" +msgstr "Setores processados" + +#: src/read-adaptive-window.c:115 src/scsi-layer.c:1762 +msgid "readable" +msgstr "legível" + +#: src/read-adaptive-window.c:119 +msgid "correctable" +msgstr "corrigível" + +#: src/read-adaptive-window.c:123 +msgid "missing" +msgstr "desaparecidos" + +#: src/read-adaptive-window.c:133 +#, c-format +msgid "Readable: %d.%d%% / %d.%d%% required" +msgstr "Legível: %d.%d%% / %d.%d%% necessários" + +#: src/read-adaptive-window.c:140 +#, c-format +msgid "Total recoverable: %d.%d%%" +msgstr "Total recuperável: %d.%d%%" + #: src/read-adaptive.c:57 src/rs01-create.c:1018 #, c-format msgid "" @@ -3161,35 +3191,44 @@ msgstr "" "%s\n" "%2d.%1d%% da imagem foi lido (% setores).\n" -#: src/read-adaptive-window.c:84 -msgid "Adaptive reading:" -msgstr "Leitura adaptiva:" - -#: src/read-adaptive-window.c:112 -msgid "Sectors processed" -msgstr "Setores processados" - -#: src/read-adaptive-window.c:115 src/scsi-layer.c:1762 -msgid "readable" -msgstr "legível" - -#: src/read-adaptive-window.c:119 -msgid "correctable" -msgstr "corrigível" - -#: src/read-adaptive-window.c:123 -msgid "missing" -msgstr "desaparecidos" - -#: src/read-adaptive-window.c:133 +#: src/read-linear-window.c:102 #, c-format -msgid "Readable: %d.%d%% / %d.%d%% required" -msgstr "Legível: %d.%d%% / %d.%d%% necessários" +msgid "Current Speed: %d.%dx" +msgstr "Velocidade atual: %d.%dx" -#: src/read-adaptive-window.c:140 +#: src/read-linear-window.c:109 src/read-linear.c:515 #, c-format -msgid "Total recoverable: %d.%d%%" -msgstr "Total recuperável: %d.%d%%" +msgid "Unreadable / skipped sectors: %" +msgstr "Setores ilegíveis / pulados: %" + +#: src/read-linear-window.c:264 src/read-linear-window.c:333 +msgid "Already present" +msgstr "Já presente" + +#: src/read-linear-window.c:298 src/read-linear-window.c:340 +#: src/rs01-verify.c:130 src/rs02-verify.c:123 src/rs03-verify.c:133 +msgid "Sectors with CRC errors" +msgstr "Setores com erros de CRC" + +#: src/read-linear-window.c:321 +msgid "Medium state" +msgstr "Estado da mídia" + +#: src/read-linear-window.c:329 +msgid "Not touched this time" +msgstr "Não tocados dessa vez" + +#: src/read-linear-window.c:336 +msgid "Successfully read" +msgstr "Lidos com sucesso" + +#: src/read-linear-window.c:343 +msgid "Unreadable / skipped" +msgstr "Ilegíveis / pulados" + +#: src/read-linear-window.c:454 +msgid "Speed" +msgstr "Velocidade" #: src/read-linear.c:122 #, c-format @@ -3244,11 +3283,6 @@ msgstr "pronto.\n" msgid "Waiting %d seconds for drive to spin up...\n" msgstr "Aguardando %d segundos para que o drive gire...\n" -#: src/read-linear.c:515 src/read-linear-window.c:109 -#, c-format -msgid "Unreadable / skipped sectors: %" -msgstr "Setores ilegíveis / pulados: %" - #: src/read-linear.c:605 #, c-format msgid "Sector %: Speed increased to %4.1fx\n" @@ -3425,40 +3459,6 @@ msgid "" "Use the --dao option to disable image truncating.\n" msgstr "" -#: src/read-linear-window.c:102 -#, c-format -msgid "Current Speed: %d.%dx" -msgstr "Velocidade atual: %d.%dx" - -#: src/read-linear-window.c:264 src/read-linear-window.c:333 -msgid "Already present" -msgstr "Já presente" - -#: src/read-linear-window.c:298 src/read-linear-window.c:340 -#: src/rs01-verify.c:130 src/rs02-verify.c:123 src/rs03-verify.c:133 -msgid "Sectors with CRC errors" -msgstr "Setores com erros de CRC" - -#: src/read-linear-window.c:321 -msgid "Medium state" -msgstr "Estado da mídia" - -#: src/read-linear-window.c:329 -msgid "Not touched this time" -msgstr "Não tocados dessa vez" - -#: src/read-linear-window.c:336 -msgid "Successfully read" -msgstr "Lidos com sucesso" - -#: src/read-linear-window.c:343 -msgid "Unreadable / skipped" -msgstr "Ilegíveis / pulados" - -#: src/read-linear-window.c:454 -msgid "Speed" -msgstr "Velocidade" - #: src/recover-raw.c:66 #, c-format msgid "Sector % dumped to %s\n" @@ -5695,6 +5695,15 @@ msgstr "" msgid "State:" msgstr "" +#: src/scsi-darwin.c:183 +msgid "No CD/DVD drives found." +msgstr "Nenhum drive de CD/DVD encontrado." + +#: src/scsi-darwin.c:229 +#, c-format +msgid "Could not open %s (%s)." +msgstr "" + #: src/scsi-freebsd.c:49 src/scsi-linux.c:53 msgid "" "Can not access /dev for devices\n" @@ -6116,15 +6125,19 @@ msgid "" "not found.\n" msgstr "" -#: src/show-manual.c:114 +#: src/show-manual.c:118 msgid "Could not create pipe before fork" msgstr "" -#: src/show-manual.c:122 +#: src/show-manual.c:123 src/show-manual.c:128 +msgid "Could not set pipe flags before fork" +msgstr "" + +#: src/show-manual.c:136 msgid "Could not fork to start xdg-open" msgstr "" -#: src/show-manual.c:145 +#: src/show-manual.c:159 #, c-format msgid "" "execvp could not execute \"xdg-open\":\n" @@ -6987,9 +7000,6 @@ msgstr "Novidades dessa versão:" #~ "\n" #~ "Darwin port (Mac OS X) por: Julian Einwag <julian@einwag.de>" -#~ msgid "No CD/DVD drives found." -#~ msgstr "Nenhum drive de CD/DVD encontrado." - #~ msgid "dvdisaster-%s log\n" #~ msgstr "dvdisaster-%s log\n" diff --git a/locale/ru.po b/locale/ru.po index a2a78ba..63197ef 100644 --- a/locale/ru.po +++ b/locale/ru.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: dvdisaster 0.70.4\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-09 17:07+0200\n" +"POT-Creation-Date: 2023-09-13 13:48+0200\n" "PO-Revision-Date: 2009-07-23 08:11+0300\n" "Last-Translator: Igor Gorbounov \n" "Language-Team: Russian\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: src/closure.c:296 +#: src/closure.c:343 #, c-format msgid "" "# dvdisaster-%s configuration file\n" @@ -32,15 +32,15 @@ msgstr "" "# он автоматически перезаписывается при каждом запуске программы.\n" "\n" -#: src/closure.c:564 +#: src/closure.c:648 msgid "medium.iso" msgstr "medium.iso" -#: src/closure.c:565 +#: src/closure.c:649 msgid "medium.ecc" msgstr "medium.ecc" -#: src/closure.c:566 +#: src/closure.c:650 msgid "sector-" msgstr "сектор-" @@ -872,7 +872,7 @@ msgstr "" "GNU General Public License\n" "Лицензионные условия dvdisaster'а." -#: src/help-dialogs.c:515 +#: src/help-dialogs.c:503 #, c-format msgid "" "File\n" @@ -883,7 +883,7 @@ msgstr "" "%s\n" "отсутствует" -#: src/help-dialogs.c:525 +#: src/help-dialogs.c:513 #, c-format msgid "" "File\n" @@ -891,23 +891,23 @@ msgid "" "not accessible" msgstr "" -#: src/help-dialogs.c:537 +#: src/help-dialogs.c:525 msgid "" "\n" "<- Error: Text file truncated here" msgstr "" -#: src/help-dialogs.c:736 +#: src/help-dialogs.c:724 msgid "windowtitle|About dvdisaster" msgstr "О программе dvdisaster" -#: src/help-dialogs.c:755 src/misc.c:219 +#: src/help-dialogs.c:743 src/misc.c:219 msgid "" "Copyright 2004-2017 Carsten Gnoerlich.\n" "Copyright 2019-2021 The dvdisaster development team." msgstr "" -#: src/help-dialogs.c:763 +#: src/help-dialogs.c:751 msgid "" "dvdisaster provides a margin of safety against data loss\n" "on optical media caused by aging or scratches.\n" @@ -919,7 +919,7 @@ msgstr "" "Он создает данные для исправления ошибок, которые используются\n" "для восстановления нечитаемых секторов, если диск впоследствии повреждается.\n" -#: src/help-dialogs.c:768 +#: src/help-dialogs.c:756 msgid "" "This software comes with absolutely no warranty.\n" "This is free software and you are welcome to redistribute it\n" @@ -931,13 +931,13 @@ msgstr "" "\n" "Русский перевод Игоря Горбунова <igor.gorbounov@gmail.com>\n" -#: src/help-dialogs.c:773 +#: src/help-dialogs.c:761 msgid "" "\n" "e-mail: support@dvdisaster.org" msgstr "" -#: src/help-dialogs.c:779 +#: src/help-dialogs.c:767 msgid "" "\n" "This version is not the original. It has been patched\n" @@ -948,7 +948,7 @@ msgid "" "but submit bugreports against [GitHub] instead.\n" msgstr "" -#: src/help-dialogs.c:787 +#: src/help-dialogs.c:775 msgid "" "\n" "NetBSD port: Sergey Svishchev <svs@ropnet.ru>" @@ -1482,6 +1482,30 @@ msgstr "" "Список имеющихся методов:\n" "\n" +#: src/misc-gui.c:241 +#, c-format +msgid "" +"The error correction file is already present:\n" +"\n" +"%s\n" +"\n" +"Overwrite it?" +msgstr "" + +#: src/misc-gui.c:639 +msgid "Do not ask again" +msgstr "" + +#: src/misc-gui.c:660 +#, c-format +msgid "" +"Image file already exists and does not match the medium:\n" +"\n" +"%s\n" +"\n" +"The existing image file will be deleted." +msgstr "" + #: src/misc.c:225 msgid "" "This software comes with ABSOLUTELY NO WARRANTY. This\n" @@ -1545,30 +1569,6 @@ msgstr "" msgid "Image successfully truncated" msgstr "" -#: src/misc-gui.c:241 -#, c-format -msgid "" -"The error correction file is already present:\n" -"\n" -"%s\n" -"\n" -"Overwrite it?" -msgstr "" - -#: src/misc-gui.c:639 -msgid "Do not ask again" -msgstr "" - -#: src/misc-gui.c:660 -#, c-format -msgid "" -"Image file already exists and does not match the medium:\n" -"\n" -"%s\n" -"\n" -"The existing image file will be deleted." -msgstr "" - #: src/preferences.c:454 msgid "Switched to the linear reading strategy." msgstr "Переход на стратегию линейного чтения." @@ -2784,9 +2784,9 @@ msgid "button|Smart L-EC" msgstr "Интеллектуальный L-EC" #: src/raw-sector-cache.c:37 src/raw-sector-cache.c:204 -#: src/raw-sector-cache.c:338 src/scsi-freebsd.c:133 src/scsi-freebsd.c:143 -#: src/scsi-linux.c:117 src/scsi-linux.c:126 src/scsi-netbsd.c:128 -#: src/scsi-netbsd.c:138 src/scsi-win32.c:256 +#: src/raw-sector-cache.c:338 src/scsi-darwin.c:218 src/scsi-freebsd.c:133 +#: src/scsi-freebsd.c:143 src/scsi-linux.c:117 src/scsi-linux.c:126 +#: src/scsi-netbsd.c:128 src/scsi-netbsd.c:138 src/scsi-win32.c:256 #, c-format msgid "Could not open %s: %s" msgstr "Не удалось открыть %s: %s" @@ -2830,6 +2830,36 @@ msgstr " [Создание нового буферного файла %s]\n" msgid " [Appended %d/%d sectors to cache file %s; LBA=%, ssize=%d, %d sectors]\n" msgstr " [Добавлено %d/%d секторов к буферному файлу %s; LBA=%, размер с.=%d, %d секторов]\n" +#: src/read-adaptive-window.c:84 +msgid "Adaptive reading:" +msgstr "Адаптивное чтение:" + +#: src/read-adaptive-window.c:112 +msgid "Sectors processed" +msgstr "Обработанные сектора" + +#: src/read-adaptive-window.c:115 src/scsi-layer.c:1762 +msgid "readable" +msgstr "можно прочитать" + +#: src/read-adaptive-window.c:119 +msgid "correctable" +msgstr "можно исправить" + +#: src/read-adaptive-window.c:123 +msgid "missing" +msgstr "отсутствует" + +#: src/read-adaptive-window.c:133 +#, c-format +msgid "Readable: %d.%d%% / %d.%d%% required" +msgstr "Можно прочитать: %d.%d%% / %d.%d%% требуется" + +#: src/read-adaptive-window.c:140 +#, c-format +msgid "Total recoverable: %d.%d%%" +msgstr "Всего можно восстановить: %d.%d%%" + #: src/read-adaptive.c:57 src/rs01-create.c:1018 #, c-format msgid "" @@ -3165,35 +3195,44 @@ msgstr "" "%s\n" "%2d.%1d%% образа прочитано (% секторов).\n" -#: src/read-adaptive-window.c:84 -msgid "Adaptive reading:" -msgstr "Адаптивное чтение:" - -#: src/read-adaptive-window.c:112 -msgid "Sectors processed" -msgstr "Обработанные сектора" - -#: src/read-adaptive-window.c:115 src/scsi-layer.c:1762 -msgid "readable" -msgstr "можно прочитать" - -#: src/read-adaptive-window.c:119 -msgid "correctable" -msgstr "можно исправить" - -#: src/read-adaptive-window.c:123 -msgid "missing" -msgstr "отсутствует" - -#: src/read-adaptive-window.c:133 +#: src/read-linear-window.c:102 #, c-format -msgid "Readable: %d.%d%% / %d.%d%% required" -msgstr "Можно прочитать: %d.%d%% / %d.%d%% требуется" +msgid "Current Speed: %d.%dx" +msgstr "Текущая скорость: %d.%dx" -#: src/read-adaptive-window.c:140 +#: src/read-linear-window.c:109 src/read-linear.c:515 #, c-format -msgid "Total recoverable: %d.%d%%" -msgstr "Всего можно восстановить: %d.%d%%" +msgid "Unreadable / skipped sectors: %" +msgstr "Нечитаемые / пропущенные сектора: %" + +#: src/read-linear-window.c:264 src/read-linear-window.c:333 +msgid "Already present" +msgstr "Уже есть" + +#: src/read-linear-window.c:298 src/read-linear-window.c:340 +#: src/rs01-verify.c:130 src/rs02-verify.c:123 src/rs03-verify.c:133 +msgid "Sectors with CRC errors" +msgstr "Сектора с CRC-ошибками" + +#: src/read-linear-window.c:321 +msgid "Medium state" +msgstr "Состояние носителя" + +#: src/read-linear-window.c:329 +msgid "Not touched this time" +msgstr "В этот раз не затронут" + +#: src/read-linear-window.c:336 +msgid "Successfully read" +msgstr "Успешно прочитано" + +#: src/read-linear-window.c:343 +msgid "Unreadable / skipped" +msgstr "Нечитаемый / пропущенный" + +#: src/read-linear-window.c:454 +msgid "Speed" +msgstr "Скорость" #: src/read-linear.c:122 #, c-format @@ -3248,11 +3287,6 @@ msgstr "готово.\n" msgid "Waiting %d seconds for drive to spin up...\n" msgstr "Задержка на %d секунд для раскручивания привода...\n" -#: src/read-linear.c:515 src/read-linear-window.c:109 -#, c-format -msgid "Unreadable / skipped sectors: %" -msgstr "Нечитаемые / пропущенные сектора: %" - #: src/read-linear.c:605 #, c-format msgid "Sector %: Speed increased to %4.1fx\n" @@ -3432,40 +3466,6 @@ msgid "" "Use the --dao option to disable image truncating.\n" msgstr "" -#: src/read-linear-window.c:102 -#, c-format -msgid "Current Speed: %d.%dx" -msgstr "Текущая скорость: %d.%dx" - -#: src/read-linear-window.c:264 src/read-linear-window.c:333 -msgid "Already present" -msgstr "Уже есть" - -#: src/read-linear-window.c:298 src/read-linear-window.c:340 -#: src/rs01-verify.c:130 src/rs02-verify.c:123 src/rs03-verify.c:133 -msgid "Sectors with CRC errors" -msgstr "Сектора с CRC-ошибками" - -#: src/read-linear-window.c:321 -msgid "Medium state" -msgstr "Состояние носителя" - -#: src/read-linear-window.c:329 -msgid "Not touched this time" -msgstr "В этот раз не затронут" - -#: src/read-linear-window.c:336 -msgid "Successfully read" -msgstr "Успешно прочитано" - -#: src/read-linear-window.c:343 -msgid "Unreadable / skipped" -msgstr "Нечитаемый / пропущенный" - -#: src/read-linear-window.c:454 -msgid "Speed" -msgstr "Скорость" - #: src/recover-raw.c:66 #, c-format msgid "Sector % dumped to %s\n" @@ -5703,6 +5703,15 @@ msgstr "" msgid "State:" msgstr "" +#: src/scsi-darwin.c:183 +msgid "No CD/DVD drives found." +msgstr "CD/DVD приводов не найдено." + +#: src/scsi-darwin.c:229 +#, c-format +msgid "Could not open %s (%s)." +msgstr "" + #: src/scsi-freebsd.c:49 src/scsi-linux.c:53 msgid "" "Can not access /dev for devices\n" @@ -6127,15 +6136,19 @@ msgid "" "not found.\n" msgstr "" -#: src/show-manual.c:114 +#: src/show-manual.c:118 msgid "Could not create pipe before fork" msgstr "" -#: src/show-manual.c:122 +#: src/show-manual.c:123 src/show-manual.c:128 +msgid "Could not set pipe flags before fork" +msgstr "" + +#: src/show-manual.c:136 msgid "Could not fork to start xdg-open" msgstr "" -#: src/show-manual.c:145 +#: src/show-manual.c:159 #, c-format msgid "" "execvp could not execute \"xdg-open\":\n" @@ -7009,9 +7022,6 @@ msgstr "Новое в этой версии:" #~ "\n" #~ "Порт для Darwin (Mac OS X): Julian Einwag <julian@einwag.de>" -#~ msgid "No CD/DVD drives found." -#~ msgstr "CD/DVD приводов не найдено." - #~ msgid "dvdisaster-%s log\n" #~ msgstr "Журнал dvdisaster-%s\n" diff --git a/locale/sv.po b/locale/sv.po index 0915cb6..4bdf31f 100644 --- a/locale/sv.po +++ b/locale/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: dvdisaster\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-09 17:07+0200\n" +"POT-Creation-Date: 2023-09-13 13:48+0200\n" "PO-Revision-Date: 2006-06-14 23:48+0100\n" "Last-Translator: Daniel Nylander \n" "Language-Team: Swedish \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: src/closure.c:296 +#: src/closure.c:343 #, c-format msgid "" "# dvdisaster-%s configuration file\n" @@ -30,15 +30,15 @@ msgstr "" "# som kommer att skrivas över varje gång dvdisaster körs.\n" "\n" -#: src/closure.c:564 +#: src/closure.c:648 msgid "medium.iso" msgstr "" -#: src/closure.c:565 +#: src/closure.c:649 msgid "medium.ecc" msgstr "" -#: src/closure.c:566 +#: src/closure.c:650 msgid "sector-" msgstr "" @@ -856,7 +856,7 @@ msgstr "" "GNU General Public License\n" "Licensvillkoren för dvdisaster." -#: src/help-dialogs.c:515 +#: src/help-dialogs.c:503 #, c-format msgid "" "File\n" @@ -867,7 +867,7 @@ msgstr "" "%s\n" "inte tillgänglig" -#: src/help-dialogs.c:525 +#: src/help-dialogs.c:513 #, c-format msgid "" "File\n" @@ -875,23 +875,23 @@ msgid "" "not accessible" msgstr "" -#: src/help-dialogs.c:537 +#: src/help-dialogs.c:525 msgid "" "\n" "<- Error: Text file truncated here" msgstr "" -#: src/help-dialogs.c:736 +#: src/help-dialogs.c:724 msgid "windowtitle|About dvdisaster" msgstr "Om dvdisaster" -#: src/help-dialogs.c:755 src/misc.c:219 +#: src/help-dialogs.c:743 src/misc.c:219 msgid "" "Copyright 2004-2017 Carsten Gnoerlich.\n" "Copyright 2019-2021 The dvdisaster development team." msgstr "" -#: src/help-dialogs.c:763 +#: src/help-dialogs.c:751 msgid "" "dvdisaster provides a margin of safety against data loss\n" "on optical media caused by aging or scratches.\n" @@ -903,7 +903,7 @@ msgstr "" "Det skapar felkorrigeringsdata som kan användas för att\n" "återskapa oläsliga sektorer om skivan senare blir skadad.\n" -#: src/help-dialogs.c:768 +#: src/help-dialogs.c:756 msgid "" "This software comes with absolutely no warranty.\n" "This is free software and you are welcome to redistribute it\n" @@ -915,13 +915,13 @@ msgstr "" "\n" "Svensk översättning av Daniel Nylander (info@danielnylander.se)\n" -#: src/help-dialogs.c:773 +#: src/help-dialogs.c:761 msgid "" "\n" "e-mail: support@dvdisaster.org" msgstr "" -#: src/help-dialogs.c:779 +#: src/help-dialogs.c:767 msgid "" "\n" "This version is not the original. It has been patched\n" @@ -932,7 +932,7 @@ msgid "" "but submit bugreports against [GitHub] instead.\n" msgstr "" -#: src/help-dialogs.c:787 +#: src/help-dialogs.c:775 msgid "" "\n" "NetBSD port: Sergey Svishchev <svs@ropnet.ru>" @@ -1462,6 +1462,30 @@ msgstr "" "Lista på tillgängliga metoder:\n" "\n" +#: src/misc-gui.c:241 +#, c-format +msgid "" +"The error correction file is already present:\n" +"\n" +"%s\n" +"\n" +"Overwrite it?" +msgstr "" + +#: src/misc-gui.c:639 +msgid "Do not ask again" +msgstr "" + +#: src/misc-gui.c:660 +#, c-format +msgid "" +"Image file already exists and does not match the medium:\n" +"\n" +"%s\n" +"\n" +"The existing image file will be deleted." +msgstr "" + #: src/misc.c:225 msgid "" "This software comes with ABSOLUTELY NO WARRANTY. This\n" @@ -1523,30 +1547,6 @@ msgstr "" msgid "Image successfully truncated" msgstr "" -#: src/misc-gui.c:241 -#, c-format -msgid "" -"The error correction file is already present:\n" -"\n" -"%s\n" -"\n" -"Overwrite it?" -msgstr "" - -#: src/misc-gui.c:639 -msgid "Do not ask again" -msgstr "" - -#: src/misc-gui.c:660 -#, c-format -msgid "" -"Image file already exists and does not match the medium:\n" -"\n" -"%s\n" -"\n" -"The existing image file will be deleted." -msgstr "" - #: src/preferences.c:454 msgid "Switched to the linear reading strategy." msgstr "Växlade till linjär lässtategi." @@ -2607,9 +2607,9 @@ msgid "button|Smart L-EC" msgstr "" #: src/raw-sector-cache.c:37 src/raw-sector-cache.c:204 -#: src/raw-sector-cache.c:338 src/scsi-freebsd.c:133 src/scsi-freebsd.c:143 -#: src/scsi-linux.c:117 src/scsi-linux.c:126 src/scsi-netbsd.c:128 -#: src/scsi-netbsd.c:138 src/scsi-win32.c:256 +#: src/raw-sector-cache.c:338 src/scsi-darwin.c:218 src/scsi-freebsd.c:133 +#: src/scsi-freebsd.c:143 src/scsi-linux.c:117 src/scsi-linux.c:126 +#: src/scsi-netbsd.c:128 src/scsi-netbsd.c:138 src/scsi-win32.c:256 #, c-format msgid "Could not open %s: %s" msgstr "Kunde inte öppna %s: %s" @@ -2653,6 +2653,36 @@ msgstr "" msgid " [Appended %d/%d sectors to cache file %s; LBA=%, ssize=%d, %d sectors]\n" msgstr "" +#: src/read-adaptive-window.c:84 +msgid "Adaptive reading:" +msgstr "Adaptiv läsning:" + +#: src/read-adaptive-window.c:112 +msgid "Sectors processed" +msgstr "Sektorer behandlade" + +#: src/read-adaptive-window.c:115 src/scsi-layer.c:1762 +msgid "readable" +msgstr "läsbar" + +#: src/read-adaptive-window.c:119 +msgid "correctable" +msgstr "korrigerbar" + +#: src/read-adaptive-window.c:123 +msgid "missing" +msgstr "saknas" + +#: src/read-adaptive-window.c:133 +#, c-format +msgid "Readable: %d.%d%% / %d.%d%% required" +msgstr "" + +#: src/read-adaptive-window.c:140 +#, c-format +msgid "Total recoverable: %d.%d%%" +msgstr "Totalt återhämtningsbara: %d.%d%%" + #: src/read-adaptive.c:57 src/rs01-create.c:1018 #, c-format msgid "" @@ -2978,35 +3008,44 @@ msgid "" "%2d.%1d%% of the image have been read (% sectors).\n" msgstr "" -#: src/read-adaptive-window.c:84 -msgid "Adaptive reading:" -msgstr "Adaptiv läsning:" - -#: src/read-adaptive-window.c:112 -msgid "Sectors processed" -msgstr "Sektorer behandlade" - -#: src/read-adaptive-window.c:115 src/scsi-layer.c:1762 -msgid "readable" -msgstr "läsbar" - -#: src/read-adaptive-window.c:119 -msgid "correctable" -msgstr "korrigerbar" - -#: src/read-adaptive-window.c:123 -msgid "missing" -msgstr "saknas" - -#: src/read-adaptive-window.c:133 +#: src/read-linear-window.c:102 #, c-format -msgid "Readable: %d.%d%% / %d.%d%% required" -msgstr "" +msgid "Current Speed: %d.%dx" +msgstr "Aktuell hastighet: %d.%dx" -#: src/read-adaptive-window.c:140 +#: src/read-linear-window.c:109 src/read-linear.c:515 #, c-format -msgid "Total recoverable: %d.%d%%" -msgstr "Totalt återhämtningsbara: %d.%d%%" +msgid "Unreadable / skipped sectors: %" +msgstr "Oläsbara / överhoppade sektorer: %" + +#: src/read-linear-window.c:264 src/read-linear-window.c:333 +msgid "Already present" +msgstr "Finns redan" + +#: src/read-linear-window.c:298 src/read-linear-window.c:340 +#: src/rs01-verify.c:130 src/rs02-verify.c:123 src/rs03-verify.c:133 +msgid "Sectors with CRC errors" +msgstr "Sektorer med CRC-fel" + +#: src/read-linear-window.c:321 +msgid "Medium state" +msgstr "Mediastatus" + +#: src/read-linear-window.c:329 +msgid "Not touched this time" +msgstr "Rörs inte denna gång" + +#: src/read-linear-window.c:336 +msgid "Successfully read" +msgstr "Läsning lyckades" + +#: src/read-linear-window.c:343 +msgid "Unreadable / skipped" +msgstr "Oläsbar / överhoppad" + +#: src/read-linear-window.c:454 +msgid "Speed" +msgstr "Hastighet" #: src/read-linear.c:122 #, c-format @@ -3061,11 +3100,6 @@ msgstr "klar.\n" msgid "Waiting %d seconds for drive to spin up...\n" msgstr "Väntar %d sekunder på att enheten ska varva upp...\n" -#: src/read-linear.c:515 src/read-linear-window.c:109 -#, c-format -msgid "Unreadable / skipped sectors: %" -msgstr "Oläsbara / överhoppade sektorer: %" - #: src/read-linear.c:605 #, c-format msgid "Sector %: Speed increased to %4.1fx\n" @@ -3238,40 +3272,6 @@ msgid "" "Use the --dao option to disable image truncating.\n" msgstr "" -#: src/read-linear-window.c:102 -#, c-format -msgid "Current Speed: %d.%dx" -msgstr "Aktuell hastighet: %d.%dx" - -#: src/read-linear-window.c:264 src/read-linear-window.c:333 -msgid "Already present" -msgstr "Finns redan" - -#: src/read-linear-window.c:298 src/read-linear-window.c:340 -#: src/rs01-verify.c:130 src/rs02-verify.c:123 src/rs03-verify.c:133 -msgid "Sectors with CRC errors" -msgstr "Sektorer med CRC-fel" - -#: src/read-linear-window.c:321 -msgid "Medium state" -msgstr "Mediastatus" - -#: src/read-linear-window.c:329 -msgid "Not touched this time" -msgstr "Rörs inte denna gång" - -#: src/read-linear-window.c:336 -msgid "Successfully read" -msgstr "Läsning lyckades" - -#: src/read-linear-window.c:343 -msgid "Unreadable / skipped" -msgstr "Oläsbar / överhoppad" - -#: src/read-linear-window.c:454 -msgid "Speed" -msgstr "Hastighet" - #: src/recover-raw.c:66 #, c-format msgid "Sector % dumped to %s\n" @@ -5414,6 +5414,15 @@ msgstr "" msgid "State:" msgstr "" +#: src/scsi-darwin.c:183 +msgid "No CD/DVD drives found." +msgstr "Inga cd/dvd-enheter hittades." + +#: src/scsi-darwin.c:229 +#, c-format +msgid "Could not open %s (%s)." +msgstr "" + #: src/scsi-freebsd.c:49 src/scsi-linux.c:53 msgid "" "Can not access /dev for devices\n" @@ -5823,15 +5832,19 @@ msgid "" "not found.\n" msgstr "" -#: src/show-manual.c:114 +#: src/show-manual.c:118 msgid "Could not create pipe before fork" msgstr "" -#: src/show-manual.c:122 +#: src/show-manual.c:123 src/show-manual.c:128 +msgid "Could not set pipe flags before fork" +msgstr "" + +#: src/show-manual.c:136 msgid "Could not fork to start xdg-open" msgstr "" -#: src/show-manual.c:145 +#: src/show-manual.c:159 #, c-format msgid "" "execvp could not execute \"xdg-open\":\n" @@ -6425,9 +6438,6 @@ msgstr "" #~ "Inga cd/dvd-enheter hittades i /dev.\n" #~ "Inga enheter kommer att vara förvalda.\n" -#~ msgid "No CD/DVD drives found." -#~ msgstr "Inga cd/dvd-enheter hittades." - #~ msgid "dvdisaster-%s log\n" #~ msgstr "dvdisaster-%s logg\n" diff --git a/macinst/Info.plist b/macinst/Info.plist new file mode 100644 index 0000000..11d50b0 --- /dev/null +++ b/macinst/Info.plist @@ -0,0 +1,26 @@ + + + + + + + CFBundleExecutable + dvdisaster + CFBundleIconFile + dvdisaster + CFBundleIdentifier + com.dvdisaster.dvdisaster + CFBundleName + dvdisaster + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.79.10 + CFBundleSignature + CGCG + CFBundleVersion + 1 + NSHumanReadableCopyright + © 2004-2009 Carsten Gnörlich et al + + diff --git a/macinst/dvdisaster.icns b/macinst/dvdisaster.icns new file mode 100644 index 0000000000000000000000000000000000000000..b3ead84db1526092c38dc54c6e502a8d85124c7f GIT binary patch literal 109764 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 literal 0 HcmV?d00001 diff --git a/regtest/common.bash b/regtest/common.bash index 1238c24..ce629ff 100644 --- a/regtest/common.bash +++ b/regtest/common.bash @@ -19,9 +19,7 @@ fi # directory for temporary files; e.g. to keep them away from SSDs TMPDIR=/dev/shm if ! test -d $TMPDIR; then - echo "$TMPDIR does not exist." - echo "Please create it manually, or edit common.bash" - exit 0 + TMPDIR=/var/tmp fi LOGDIR="/dev/shm" @@ -33,7 +31,14 @@ DIFFLOG="$LOGDIR/difflog.txt" NEWLOG="$LOGDIR/newlog.txt" TMPLOG="$LOGDIR/tmplog.txt" -MD5SUM=md5sum +UNAME="$(uname -s)" + +if [ "$UNAME" = Darwin ]; then + MD5SUM="md5 -r" +else + MD5SUM=md5sum +fi + if ! $MD5SUM $RNDSEQ >/dev/null 2>&1; then MD5SUM=../simple-md5sum fi @@ -115,7 +120,7 @@ function file_exists() function try() { local doit=$(grep "${CODEC_PREFIX}_$2 " $CONFIGFILE) - if echo "$OS" | grep -q Windows && test -e "$CONFIGFILE_WIN" && grep -q "${CODEC_PREFIX}_$2 " "$CONFIGFILE_WIN"; then + if [[ $OS =~ Windows ]] && test -e "$CONFIGFILE_WIN" && grep -q "${CODEC_PREFIX}_$2 " "$CONFIGFILE_WIN"; then doit=$(grep "${CODEC_PREFIX}_$2 " "$CONFIGFILE_WIN") fi @@ -221,7 +226,12 @@ function run_regtest() testeccopt="-e ${testecc}" fi - REFLOG=${DATABASE}/${CODEC_PREFIX}_${testsymbol} + REFLOG="${DATABASE}/${CODEC_PREFIX}_${testsymbol}" + if [ "$UNAME" = "Darwin" ] && [ -f "$REFLOG.darwin" ]; then + REFLOG="$REFLOG.darwin" + elif [[ $OS =~ Windows ]] && [ -f "$REFLOG.win" ]; then + REFLOG="$REFLOG.win" + fi if test "$gui_mode" == "false"; then rm -f $NEWLOG @@ -253,16 +263,11 @@ function run_regtest() filter=cat echo "$options" | grep -qw SORTED && filter=sort - # for Windows - if [[ $testsymbol =~ _no_device$ ]]; then - sed -i -re "s=device $NON_EXISTENT_DEVICE\.=/dev/sdz: No such file or directory=" $NEWLOG - fi - # for Windows, just remove any path we find: sed -i -re "s=[A-Z]:/[A-Za-z0-9_/-]+/==g" $NEWLOG # remove all paths to get reproducible output: - sed -i -re "s=$TMPDIR/*==g;s=$ISODIR/*==g" $NEWLOG + sed -i -re "s=$TMPDIR/*==g;s=$ISODIR/*==g;s=regtest/==g" $NEWLOG # remote tmp path of github actions sed -i -re "s=[-A-Za-z0-9_~]+/AppData/Local/Temp/==g" $NEWLOG diff --git a/regtest/database/RS01_adaptive_no_device.darwin b/regtest/database/RS01_adaptive_no_device.darwin new file mode 100644 index 0000000..41aa2a3 --- /dev/null +++ b/regtest/database/RS01_adaptive_no_device.darwin @@ -0,0 +1,12 @@ +ignore +ignore +This software comes with ABSOLUTELY NO WARRANTY. This +is free software and you are welcome to redistribute it +under the conditions of the GNU GENERAL PUBLIC LICENSE. +See the file "COPYING" for further information. + +* +* dvdisaster - can not continue: +* +Could not open /dev/sdz (). + diff --git a/regtest/database/RS01_adaptive_no_device.win b/regtest/database/RS01_adaptive_no_device.win new file mode 100644 index 0000000..b2781d0 --- /dev/null +++ b/regtest/database/RS01_adaptive_no_device.win @@ -0,0 +1,12 @@ +ignore +ignore +This software comes with ABSOLUTELY NO WARRANTY. This +is free software and you are welcome to redistribute it +under the conditions of the GNU GENERAL PUBLIC LICENSE. +See the file "COPYING" for further information. + +* +* dvdisaster - can not continue: +* +Could not open device V:. + diff --git a/regtest/database/RS01_adaptive_no_device_access.darwin b/regtest/database/RS01_adaptive_no_device_access.darwin new file mode 100644 index 0000000..1312cd1 --- /dev/null +++ b/regtest/database/RS01_adaptive_no_device_access.darwin @@ -0,0 +1,12 @@ +ignore +ignore +This software comes with ABSOLUTELY NO WARRANTY. This +is free software and you are welcome to redistribute it +under the conditions of the GNU GENERAL PUBLIC LICENSE. +See the file "COPYING" for further information. + +* +* dvdisaster - can not continue: +* +Could not open sdz (). + diff --git a/regtest/database/RS01_read_no_device.darwin b/regtest/database/RS01_read_no_device.darwin new file mode 100644 index 0000000..41aa2a3 --- /dev/null +++ b/regtest/database/RS01_read_no_device.darwin @@ -0,0 +1,12 @@ +ignore +ignore +This software comes with ABSOLUTELY NO WARRANTY. This +is free software and you are welcome to redistribute it +under the conditions of the GNU GENERAL PUBLIC LICENSE. +See the file "COPYING" for further information. + +* +* dvdisaster - can not continue: +* +Could not open /dev/sdz (). + diff --git a/regtest/database/RS01_read_no_device.win b/regtest/database/RS01_read_no_device.win new file mode 100644 index 0000000..b2781d0 --- /dev/null +++ b/regtest/database/RS01_read_no_device.win @@ -0,0 +1,12 @@ +ignore +ignore +This software comes with ABSOLUTELY NO WARRANTY. This +is free software and you are welcome to redistribute it +under the conditions of the GNU GENERAL PUBLIC LICENSE. +See the file "COPYING" for further information. + +* +* dvdisaster - can not continue: +* +Could not open device V:. + diff --git a/regtest/database/RS01_read_no_device_access.darwin b/regtest/database/RS01_read_no_device_access.darwin new file mode 100644 index 0000000..1312cd1 --- /dev/null +++ b/regtest/database/RS01_read_no_device_access.darwin @@ -0,0 +1,12 @@ +ignore +ignore +This software comes with ABSOLUTELY NO WARRANTY. This +is free software and you are welcome to redistribute it +under the conditions of the GNU GENERAL PUBLIC LICENSE. +See the file "COPYING" for further information. + +* +* dvdisaster - can not continue: +* +Could not open sdz (). + diff --git a/regtest/database/RS01_scan_no_device.darwin b/regtest/database/RS01_scan_no_device.darwin new file mode 100644 index 0000000..41aa2a3 --- /dev/null +++ b/regtest/database/RS01_scan_no_device.darwin @@ -0,0 +1,12 @@ +ignore +ignore +This software comes with ABSOLUTELY NO WARRANTY. This +is free software and you are welcome to redistribute it +under the conditions of the GNU GENERAL PUBLIC LICENSE. +See the file "COPYING" for further information. + +* +* dvdisaster - can not continue: +* +Could not open /dev/sdz (). + diff --git a/regtest/database/RS01_scan_no_device.win b/regtest/database/RS01_scan_no_device.win new file mode 100644 index 0000000..b2781d0 --- /dev/null +++ b/regtest/database/RS01_scan_no_device.win @@ -0,0 +1,12 @@ +ignore +ignore +This software comes with ABSOLUTELY NO WARRANTY. This +is free software and you are welcome to redistribute it +under the conditions of the GNU GENERAL PUBLIC LICENSE. +See the file "COPYING" for further information. + +* +* dvdisaster - can not continue: +* +Could not open device V:. + diff --git a/regtest/database/RS01_scan_no_device_access.darwin b/regtest/database/RS01_scan_no_device_access.darwin new file mode 100644 index 0000000..1312cd1 --- /dev/null +++ b/regtest/database/RS01_scan_no_device_access.darwin @@ -0,0 +1,12 @@ +ignore +ignore +This software comes with ABSOLUTELY NO WARRANTY. This +is free software and you are welcome to redistribute it +under the conditions of the GNU GENERAL PUBLIC LICENSE. +See the file "COPYING" for further information. + +* +* dvdisaster - can not continue: +* +Could not open sdz (). + diff --git a/regtest/database/RS03i_read_bad_header_exhaustive.win b/regtest/database/RS03i_read_bad_header_exhaustive.win deleted file mode 100644 index b3c65b4..0000000 --- a/regtest/database/RS03i_read_bad_header_exhaustive.win +++ /dev/null @@ -1,522 +0,0 @@ -ca01afa400e2244fc4797cae542888d1 -ignore -This software comes with ABSOLUTELY NO WARRANTY. This -is free software and you are welcome to redistribute it -under the conditions of the GNU GENERAL PUBLIC LICENSE. -See the file "COPYING" for further information. -# *** OpenImageFromDevice(sim-cd) *** -# InquireDevice returned: Simulated CD drive 1.00 - -Device: sim-cd, Simulated CD drive 1.00 -# *** query_type(Simulated CD drive 1.00, 0) *** -# *** get_configuration(Simulated CD drive 1.00) *** -# 8 data len, 9 current --> profile 9: CD-R -# trying READ DISC INFORMATION for size -# size returned is 32 -# trying READ DISC INFORMATION for real info -0000: 00 20 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 . ...... ........ -0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........ -# status is 1e, disc type 0 -#CD: starting media probe -#CD: querying size of READ TOC/PMA/ATIP (for TOC) -#CD: size returned is 12 -#CD: querying real READ TOC/PMA/ATIP (for TOC) -0000: 00 0a 00 00 00 14 00 00 00 00 00 00 ........ .... -#CD: control is 0x14 -#CD: querying size of READ TOC/PMA/ATIP (for full TOC) -# Warning: Realigning length from 26 to 24 -#CD: size returned is 24 -#CD: querying real READ TOC/PMA/ATIP (for full TOC) -0000: 00 18 00 01 00 00 00 a0 00 00 00 00 00 00 00 00 ........ ........ -0010: 00 00 00 00 00 00 00 00 ........ -#CD: 1 sessions -#CD: CD medium detected, type: CD-R mode 1 -# query_type() returned. -# deciding reading strategy... -Using READ CD. -GetImageFingerprint(16): read & cached - -ExamineUDF(Device: Simulated CD drive 1.00) - Examining the ISO file system... - Sector 16: - Volume descriptor type = 1 - Volume descriptor version = 1 - Standard identifier = CD001 - -> primary volume descriptor: - System identifier : | | - Volume identifier : |RANDOM IMAGE | - Volume space size : 21000 sectors - Volume set size : 1 - Volume sequence size : 1 - Logical block size : 2048 - Path table size : 10 bytes - L-Path table location : 19 - Opt L-Path table location : 0 - M-Path table location : 20 - Opt M-Path table location : 0 - Volume creation date/time : 16-07-2006 10:35:46.23 - Volume modification d/t : 16-07-2006 10:35:46.23 - Volume expiration d/t : 16-07-2106 10:35:46.23 - Volume effective d/t : 16-07-2006 10:35:46.23 - File structure version : 1 - Sector 17: - Volume descriptor type = 2 - Volume descriptor version = 1 - Standard identifier = CD001 - -> supplementary volume descriptor: *skipped* - Sector 18: - Volume descriptor type = 255 - Volume descriptor version = 1 - Standard identifier = CD001 - -> volume descriptor set terminator; - end of ISO file system parsing. - Examining the UDF file system... - not yet implemented. - -# *** read_capacity(Simulated CD drive 1.00) *** - -> 24989 -ExamineECC() started -...trying RS01 -...trying RS02 -RS02Recognize: medium sim-cd -try_sector: trying sector 21000 -try_sector: no cookie, skipping current modulo -try_sector: trying sector 20850 -try_sector: no cookie, skipping current modulo -RS02Recognize: quick RS02 search, attempting up to 3 sector reads max -Medium rewriteable: FALSE -FindHeaderInMedium: Trying modulo 4611686018427387904 -FindHeaderInMedium: Trying modulo 2305843009213693952 -FindHeaderInMedium: Trying modulo 1152921504606846976 -FindHeaderInMedium: Trying modulo 576460752303423488 -FindHeaderInMedium: Trying modulo 288230376151711744 -FindHeaderInMedium: Trying modulo 144115188075855872 -FindHeaderInMedium: Trying modulo 72057594037927936 -FindHeaderInMedium: Trying modulo 36028797018963968 -FindHeaderInMedium: Trying modulo 18014398509481984 -FindHeaderInMedium: Trying modulo 9007199254740992 -FindHeaderInMedium: Trying modulo 4503599627370496 -FindHeaderInMedium: Trying modulo 2251799813685248 -FindHeaderInMedium: Trying modulo 1125899906842624 -FindHeaderInMedium: Trying modulo 562949953421312 -FindHeaderInMedium: Trying modulo 281474976710656 -FindHeaderInMedium: Trying modulo 140737488355328 -FindHeaderInMedium: Trying modulo 70368744177664 -FindHeaderInMedium: Trying modulo 35184372088832 -FindHeaderInMedium: Trying modulo 17592186044416 -FindHeaderInMedium: Trying modulo 8796093022208 -FindHeaderInMedium: Trying modulo 4398046511104 -FindHeaderInMedium: Trying modulo 2199023255552 -FindHeaderInMedium: Trying modulo 1099511627776 -FindHeaderInMedium: Trying modulo 549755813888 -FindHeaderInMedium: Trying modulo 274877906944 -FindHeaderInMedium: Trying modulo 137438953472 -FindHeaderInMedium: Trying modulo 68719476736 -FindHeaderInMedium: Trying modulo 34359738368 -FindHeaderInMedium: Trying modulo 17179869184 -FindHeaderInMedium: Trying modulo 8589934592 -FindHeaderInMedium: Trying modulo 4294967296 -FindHeaderInMedium: Trying modulo 2147483648 -FindHeaderInMedium: Trying modulo 1073741824 -FindHeaderInMedium: Trying modulo 536870912 -FindHeaderInMedium: Trying modulo 268435456 -FindHeaderInMedium: Trying modulo 134217728 -FindHeaderInMedium: Trying modulo 67108864 -FindHeaderInMedium: Trying modulo 33554432 -FindHeaderInMedium: Trying modulo 16777216 -FindHeaderInMedium: Trying modulo 8388608 -FindHeaderInMedium: Trying modulo 4194304 -FindHeaderInMedium: Trying modulo 2097152 -FindHeaderInMedium: Trying modulo 1048576 -FindHeaderInMedium: Trying modulo 524288 -FindHeaderInMedium: Trying modulo 262144 -FindHeaderInMedium: Trying modulo 131072 -FindHeaderInMedium: Trying modulo 65536 -FindHeaderInMedium: Trying modulo 32768 -FindHeaderInMedium: Trying modulo 16384 -try_sector: trying sector 16384 -try_sector: no cookie, skipping current modulo -FindHeaderInMedium: Trying modulo 8192 -try_sector: trying sector 24576 -try_sector: no cookie, skipping current modulo -FindHeaderInMedium: Trying modulo 4096 -Sector 24576 cached; skipping modulo -FindHeaderInMedium: Trying modulo 2048 -Sector 24576 cached; skipping modulo -FindHeaderInMedium: Trying modulo 1024 -Sector 24576 cached; skipping modulo -FindHeaderInMedium: Trying modulo 512 -Sector 24576 cached; skipping modulo -FindHeaderInMedium: Trying modulo 256 -try_sector: trying sector 24832 -try_sector: no cookie, skipping current modulo -...trying RS03 -RS03RecognizeImage: medium sim-cd -FindRS03HeaderInImage: medium sim-cd -RS03RecognizeImage: No EH, entering exhaustive search -Warning: image size set to 25000 for debugging! -.. trying layer size 98 -Scanning layers for signatures. -- layer slice 0 -RS03: try number = 1, reading sector 8232 -RS03: try number = 2, reading sector 8330 -RS03: try number = 3, reading sector 8428 -RS03: try number = 4, reading sector 8526 -RS03: try number = 5, reading sector 8624 -RS03: try number = 6, reading sector 8722 -RS03: try number = 7, reading sector 8820 -RS03: try number = 8, reading sector 8918 -RS03: try number = 9, reading sector 9016 -RS03: try number = 10, reading sector 9114 -RS03: try number = 11, reading sector 9212 -RS03: try number = 12, reading sector 9310 -RS03: try number = 13, reading sector 9408 -RS03: try number = 14, reading sector 9506 -RS03: try number = 15, reading sector 9604 -RS03: try number = 16, reading sector 9702 -RS03: try number = 17, reading sector 9800 -RS03: try number = 18, reading sector 9898 -RS03: try number = 19, reading sector 9996 -RS03: try number = 20, reading sector 10094 -RS03: try number = 21, reading sector 10192 -RS03: try number = 22, reading sector 10290 -RS03: try number = 23, reading sector 10388 -RS03: try number = 24, reading sector 10486 -RS03: try number = 25, reading sector 10584 -RS03: try number = 26, reading sector 10682 -RS03: try number = 27, reading sector 10780 -RS03: try number = 28, reading sector 10878 -RS03: try number = 29, reading sector 10976 -RS03: try number = 30, reading sector 11074 -RS03: try number = 31, reading sector 11172 -RS03: try number = 32, reading sector 11270 -RS03: try number = 33, reading sector 11368 -RS03: try number = 34, reading sector 11466 -RS03: try number = 35, reading sector 11564 -RS03: try number = 36, reading sector 11662 -RS03: try number = 37, reading sector 11760 -RS03: try number = 38, reading sector 11858 -RS03: try number = 39, reading sector 11956 -RS03: try number = 40, reading sector 12054 -RS03: try number = 41, reading sector 12152 -RS03: try number = 42, reading sector 12250 -RS03: try number = 43, reading sector 12348 -RS03: try number = 44, reading sector 12446 -RS03: try number = 45, reading sector 12544 -RS03: try number = 46, reading sector 12642 -RS03: try number = 47, reading sector 12740 -RS03: try number = 48, reading sector 12838 -RS03: try number = 49, reading sector 12936 -RS03: try number = 50, reading sector 13034 -RS03: try number = 51, reading sector 13132 -RS03: try number = 52, reading sector 13230 -RS03: try number = 53, reading sector 13328 -RS03: try number = 54, reading sector 13426 -RS03: try number = 55, reading sector 13524 -RS03: try number = 56, reading sector 13622 -RS03: try number = 57, reading sector 13720 -RS03: try number = 58, reading sector 13818 -RS03: try number = 59, reading sector 13916 -RS03: try number = 60, reading sector 14014 -RS03: try number = 61, reading sector 14112 -RS03: try number = 62, reading sector 14210 -RS03: try number = 63, reading sector 14308 -RS03: try number = 64, reading sector 14406 -RS03: try number = 65, reading sector 14504 -RS03: try number = 66, reading sector 14602 -RS03: try number = 67, reading sector 14700 -RS03: try number = 68, reading sector 14798 -RS03: try number = 69, reading sector 14896 -RS03: try number = 70, reading sector 14994 -RS03: try number = 71, reading sector 15092 -RS03: try number = 72, reading sector 15190 -RS03: try number = 73, reading sector 15288 -RS03: try number = 74, reading sector 15386 -RS03: try number = 75, reading sector 15484 -RS03: try number = 76, reading sector 15582 -RS03: try number = 77, reading sector 15680 -RS03: try number = 78, reading sector 15778 -RS03: try number = 79, reading sector 15876 -RS03: try number = 80, reading sector 15974 -RS03: try number = 81, reading sector 16072 -RS03: try number = 82, reading sector 16170 -RS03: try number = 83, reading sector 16268 -RS03: try number = 84, reading sector 16366 -RS03: try number = 85, reading sector 16464 -RS03: try number = 86, reading sector 16562 -RS03: try number = 87, reading sector 16660 -RS03: try number = 88, reading sector 16758 -RS03: try number = 89, reading sector 16856 -RS03: try number = 90, reading sector 16954 -RS03: try number = 91, reading sector 17052 -RS03: try number = 92, reading sector 17150 -RS03: try number = 93, reading sector 17248 -RS03: try number = 94, reading sector 17346 -RS03: try number = 95, reading sector 17444 -RS03: try number = 96, reading sector 17542 -RS03: try number = 97, reading sector 17640 -RS03: try number = 98, reading sector 17738 -RS03: try number = 99, reading sector 17836 -RS03: try number = 100, reading sector 17934 -RS03: try number = 101, reading sector 18032 -RS03: try number = 102, reading sector 18130 -RS03: try number = 103, reading sector 18228 -RS03: try number = 104, reading sector 18326 -RS03: try number = 105, reading sector 18424 -RS03: try number = 106, reading sector 18522 -RS03: try number = 107, reading sector 18620 -RS03: try number = 108, reading sector 18718 -RS03: try number = 109, reading sector 18816 -RS03: try number = 110, reading sector 18914 -RS03: try number = 111, reading sector 19012 -RS03: try number = 112, reading sector 19110 -RS03: try number = 113, reading sector 19208 -RS03: try number = 114, reading sector 19306 -RS03: try number = 115, reading sector 19404 -RS03: try number = 116, reading sector 19502 -RS03: try number = 117, reading sector 19600 -RS03: try number = 118, reading sector 19698 -RS03: try number = 119, reading sector 19796 -RS03: try number = 120, reading sector 19894 -RS03: try number = 121, reading sector 19992 -RS03: try number = 122, reading sector 20090 -RS03: try number = 123, reading sector 20188 -RS03: try number = 124, reading sector 20286 -RS03: try number = 125, reading sector 20384 -RS03: try number = 126, reading sector 20482 -RS03: try number = 127, reading sector 20580 -RS03: try number = 128, reading sector 20678 -RS03: try number = 129, reading sector 20776 -RS03: try number = 130, reading sector 20874 -RS03: try number = 131, reading sector 20972 -RS03: try number = 132, reading sector 21070 -** Success: sector 21070, rediscovered format with 39 roots -...augmented image found -# Calling query_size() -# *** query_size(Simulated CD drive 1.00) *** -Medium size obtained from ECC header: 24990 sectors -# returned: 24990 sectors -Medium "Random Image": CD-R mode 1, 24990 sectors, Ecc, created 16-07-2006. - -Creating new rs03i-tmp.iso image. -Reading CRC information from ecc data (RS03) ... Calculated layout for RS03 image: -data sectors = 21000 -data padding = 68 -layer size = 98 -total sectors = 24990 -medium capacity = 0 -header position = 21000 -first CRC sector = 21070 -first ECC sector = 21168 -ndata = 216 -nroots = 39 (18.1%) - -done. -* CRC error, sector: 21000 -Current sector: 22032. This session: NewSectorsReadOK=22032, ReadErrors=0, CRCErrors=1 -Current sector: 22048. This session: NewSectorsReadOK=22048, ReadErrors=0, CRCErrors=1 -Current sector: 22064. This session: NewSectorsReadOK=22064, ReadErrors=0, CRCErrors=1 -Current sector: 22080. This session: NewSectorsReadOK=22080, ReadErrors=0, CRCErrors=1 -Current sector: 22096. This session: NewSectorsReadOK=22096, ReadErrors=0, CRCErrors=1 -Current sector: 22112. This session: NewSectorsReadOK=22112, ReadErrors=0, CRCErrors=1 -Current sector: 22128. This session: NewSectorsReadOK=22128, ReadErrors=0, CRCErrors=1 -Current sector: 22144. This session: NewSectorsReadOK=22144, ReadErrors=0, CRCErrors=1 -Current sector: 22160. This session: NewSectorsReadOK=22160, ReadErrors=0, CRCErrors=1 -Current sector: 22176. This session: NewSectorsReadOK=22176, ReadErrors=0, CRCErrors=1 -Current sector: 22192. This session: NewSectorsReadOK=22192, ReadErrors=0, CRCErrors=1 -Current sector: 22208. This session: NewSectorsReadOK=22208, ReadErrors=0, CRCErrors=1 -Current sector: 22224. This session: NewSectorsReadOK=22224, ReadErrors=0, CRCErrors=1 -Current sector: 22240. This session: NewSectorsReadOK=22240, ReadErrors=0, CRCErrors=1 -Current sector: 22256. This session: NewSectorsReadOK=22256, ReadErrors=0, CRCErrors=1 -Current sector: 22272. This session: NewSectorsReadOK=22272, ReadErrors=0, CRCErrors=1 -Current sector: 22288. This session: NewSectorsReadOK=22288, ReadErrors=0, CRCErrors=1 -Current sector: 22304. This session: NewSectorsReadOK=22304, ReadErrors=0, CRCErrors=1 -Current sector: 22320. This session: NewSectorsReadOK=22320, ReadErrors=0, CRCErrors=1 -Current sector: 22336. This session: NewSectorsReadOK=22336, ReadErrors=0, CRCErrors=1 -Current sector: 22352. This session: NewSectorsReadOK=22352, ReadErrors=0, CRCErrors=1 -Current sector: 22368. This session: NewSectorsReadOK=22368, ReadErrors=0, CRCErrors=1 -Current sector: 22384. This session: NewSectorsReadOK=22384, ReadErrors=0, CRCErrors=1 -Current sector: 22400. This session: NewSectorsReadOK=22400, ReadErrors=0, CRCErrors=1 -Current sector: 22416. This session: NewSectorsReadOK=22416, ReadErrors=0, CRCErrors=1 -Current sector: 22432. This session: NewSectorsReadOK=22432, ReadErrors=0, CRCErrors=1 -Current sector: 22448. This session: NewSectorsReadOK=22448, ReadErrors=0, CRCErrors=1 -Current sector: 22464. This session: NewSectorsReadOK=22464, ReadErrors=0, CRCErrors=1 -Current sector: 22480. This session: NewSectorsReadOK=22480, ReadErrors=0, CRCErrors=1 -Current sector: 22496. This session: NewSectorsReadOK=22496, ReadErrors=0, CRCErrors=1 -Current sector: 22512. This session: NewSectorsReadOK=22512, ReadErrors=0, CRCErrors=1 -Current sector: 22528. This session: NewSectorsReadOK=22528, ReadErrors=0, CRCErrors=1 -Current sector: 22544. This session: NewSectorsReadOK=22544, ReadErrors=0, CRCErrors=1 -Current sector: 22560. This session: NewSectorsReadOK=22560, ReadErrors=0, CRCErrors=1 -Current sector: 22576. This session: NewSectorsReadOK=22576, ReadErrors=0, CRCErrors=1 -Current sector: 22592. This session: NewSectorsReadOK=22592, ReadErrors=0, CRCErrors=1 -Current sector: 22608. This session: NewSectorsReadOK=22608, ReadErrors=0, CRCErrors=1 -Current sector: 22624. This session: NewSectorsReadOK=22624, ReadErrors=0, CRCErrors=1 -Current sector: 22640. This session: NewSectorsReadOK=22640, ReadErrors=0, CRCErrors=1 -Current sector: 22656. This session: NewSectorsReadOK=22656, ReadErrors=0, CRCErrors=1 -Current sector: 22672. This session: NewSectorsReadOK=22672, ReadErrors=0, CRCErrors=1 -Current sector: 22688. This session: NewSectorsReadOK=22688, ReadErrors=0, CRCErrors=1 -Current sector: 22704. This session: NewSectorsReadOK=22704, ReadErrors=0, CRCErrors=1 -Current sector: 22720. This session: NewSectorsReadOK=22720, ReadErrors=0, CRCErrors=1 -Current sector: 22736. This session: NewSectorsReadOK=22736, ReadErrors=0, CRCErrors=1 -Current sector: 22752. This session: NewSectorsReadOK=22752, ReadErrors=0, CRCErrors=1 -Current sector: 22768. This session: NewSectorsReadOK=22768, ReadErrors=0, CRCErrors=1 -Current sector: 22784. This session: NewSectorsReadOK=22784, ReadErrors=0, CRCErrors=1 -Current sector: 22800. This session: NewSectorsReadOK=22800, ReadErrors=0, CRCErrors=1 -Current sector: 22816. This session: NewSectorsReadOK=22816, ReadErrors=0, CRCErrors=1 -Current sector: 22832. This session: NewSectorsReadOK=22832, ReadErrors=0, CRCErrors=1 -Current sector: 22848. This session: NewSectorsReadOK=22848, ReadErrors=0, CRCErrors=1 -Current sector: 22864. This session: NewSectorsReadOK=22864, ReadErrors=0, CRCErrors=1 -Current sector: 22880. This session: NewSectorsReadOK=22880, ReadErrors=0, CRCErrors=1 -Current sector: 22896. This session: NewSectorsReadOK=22896, ReadErrors=0, CRCErrors=1 -Current sector: 22912. This session: NewSectorsReadOK=22912, ReadErrors=0, CRCErrors=1 -Current sector: 22928. This session: NewSectorsReadOK=22928, ReadErrors=0, CRCErrors=1 -Current sector: 22944. This session: NewSectorsReadOK=22944, ReadErrors=0, CRCErrors=1 -Current sector: 22960. This session: NewSectorsReadOK=22960, ReadErrors=0, CRCErrors=1 -Current sector: 22976. This session: NewSectorsReadOK=22976, ReadErrors=0, CRCErrors=1 -Current sector: 22992. This session: NewSectorsReadOK=22992, ReadErrors=0, CRCErrors=1 -Current sector: 23008. This session: NewSectorsReadOK=23008, ReadErrors=0, CRCErrors=1 -Current sector: 23024. This session: NewSectorsReadOK=23024, ReadErrors=0, CRCErrors=1 -Current sector: 23040. This session: NewSectorsReadOK=23040, ReadErrors=0, CRCErrors=1 -Current sector: 23056. This session: NewSectorsReadOK=23056, ReadErrors=0, CRCErrors=1 -Current sector: 23072. This session: NewSectorsReadOK=23072, ReadErrors=0, CRCErrors=1 -Current sector: 23088. This session: NewSectorsReadOK=23088, ReadErrors=0, CRCErrors=1 -Current sector: 23104. This session: NewSectorsReadOK=23104, ReadErrors=0, CRCErrors=1 -Current sector: 23120. This session: NewSectorsReadOK=23120, ReadErrors=0, CRCErrors=1 -Current sector: 23136. This session: NewSectorsReadOK=23136, ReadErrors=0, CRCErrors=1 -Current sector: 23152. This session: NewSectorsReadOK=23152, ReadErrors=0, CRCErrors=1 -Current sector: 23168. This session: NewSectorsReadOK=23168, ReadErrors=0, CRCErrors=1 -Current sector: 23184. This session: NewSectorsReadOK=23184, ReadErrors=0, CRCErrors=1 -Current sector: 23200. This session: NewSectorsReadOK=23200, ReadErrors=0, CRCErrors=1 -Current sector: 23216. This session: NewSectorsReadOK=23216, ReadErrors=0, CRCErrors=1 -Current sector: 23232. This session: NewSectorsReadOK=23232, ReadErrors=0, CRCErrors=1 -Current sector: 23248. This session: NewSectorsReadOK=23248, ReadErrors=0, CRCErrors=1 -Current sector: 23264. This session: NewSectorsReadOK=23264, ReadErrors=0, CRCErrors=1 -Current sector: 23280. This session: NewSectorsReadOK=23280, ReadErrors=0, CRCErrors=1 -Current sector: 23296. This session: NewSectorsReadOK=23296, ReadErrors=0, CRCErrors=1 -Current sector: 23312. This session: NewSectorsReadOK=23312, ReadErrors=0, CRCErrors=1 -Current sector: 23328. This session: NewSectorsReadOK=23328, ReadErrors=0, CRCErrors=1 -Current sector: 23344. This session: NewSectorsReadOK=23344, ReadErrors=0, CRCErrors=1 -Current sector: 23360. This session: NewSectorsReadOK=23360, ReadErrors=0, CRCErrors=1 -Current sector: 23376. This session: NewSectorsReadOK=23376, ReadErrors=0, CRCErrors=1 -Current sector: 23392. This session: NewSectorsReadOK=23392, ReadErrors=0, CRCErrors=1 -Current sector: 23408. This session: NewSectorsReadOK=23408, ReadErrors=0, CRCErrors=1 -Current sector: 23424. This session: NewSectorsReadOK=23424, ReadErrors=0, CRCErrors=1 -Current sector: 23440. This session: NewSectorsReadOK=23440, ReadErrors=0, CRCErrors=1 -Current sector: 23456. This session: NewSectorsReadOK=23456, ReadErrors=0, CRCErrors=1 -Current sector: 23472. This session: NewSectorsReadOK=23472, ReadErrors=0, CRCErrors=1 -Current sector: 23488. This session: NewSectorsReadOK=23488, ReadErrors=0, CRCErrors=1 -Current sector: 23504. This session: NewSectorsReadOK=23504, ReadErrors=0, CRCErrors=1 -Current sector: 23520. This session: NewSectorsReadOK=23520, ReadErrors=0, CRCErrors=1 -Current sector: 23536. This session: NewSectorsReadOK=23536, ReadErrors=0, CRCErrors=1 -Current sector: 23552. This session: NewSectorsReadOK=23552, ReadErrors=0, CRCErrors=1 -Current sector: 23568. This session: NewSectorsReadOK=23568, ReadErrors=0, CRCErrors=1 -Current sector: 23584. This session: NewSectorsReadOK=23584, ReadErrors=0, CRCErrors=1 -Current sector: 23600. This session: NewSectorsReadOK=23600, ReadErrors=0, CRCErrors=1 -Current sector: 23616. This session: NewSectorsReadOK=23616, ReadErrors=0, CRCErrors=1 -Current sector: 23632. This session: NewSectorsReadOK=23632, ReadErrors=0, CRCErrors=1 -Current sector: 23648. This session: NewSectorsReadOK=23648, ReadErrors=0, CRCErrors=1 -Current sector: 23664. This session: NewSectorsReadOK=23664, ReadErrors=0, CRCErrors=1 -Current sector: 23680. This session: NewSectorsReadOK=23680, ReadErrors=0, CRCErrors=1 -Current sector: 23696. This session: NewSectorsReadOK=23696, ReadErrors=0, CRCErrors=1 -Current sector: 23712. This session: NewSectorsReadOK=23712, ReadErrors=0, CRCErrors=1 -Current sector: 23728. This session: NewSectorsReadOK=23728, ReadErrors=0, CRCErrors=1 -Current sector: 23744. This session: NewSectorsReadOK=23744, ReadErrors=0, CRCErrors=1 -Current sector: 23760. This session: NewSectorsReadOK=23760, ReadErrors=0, CRCErrors=1 -Current sector: 23776. This session: NewSectorsReadOK=23776, ReadErrors=0, CRCErrors=1 -Current sector: 23792. This session: NewSectorsReadOK=23792, ReadErrors=0, CRCErrors=1 -Current sector: 23808. This session: NewSectorsReadOK=23808, ReadErrors=0, CRCErrors=1 -Current sector: 23824. This session: NewSectorsReadOK=23824, ReadErrors=0, CRCErrors=1 -Current sector: 23840. This session: NewSectorsReadOK=23840, ReadErrors=0, CRCErrors=1 -Current sector: 23856. This session: NewSectorsReadOK=23856, ReadErrors=0, CRCErrors=1 -Current sector: 23872. This session: NewSectorsReadOK=23872, ReadErrors=0, CRCErrors=1 -Current sector: 23888. This session: NewSectorsReadOK=23888, ReadErrors=0, CRCErrors=1 -Current sector: 23904. This session: NewSectorsReadOK=23904, ReadErrors=0, CRCErrors=1 -Current sector: 23920. This session: NewSectorsReadOK=23920, ReadErrors=0, CRCErrors=1 -Current sector: 23936. This session: NewSectorsReadOK=23936, ReadErrors=0, CRCErrors=1 -Current sector: 23952. This session: NewSectorsReadOK=23952, ReadErrors=0, CRCErrors=1 -Current sector: 23968. This session: NewSectorsReadOK=23968, ReadErrors=0, CRCErrors=1 -Current sector: 23984. This session: NewSectorsReadOK=23984, ReadErrors=0, CRCErrors=1 -Current sector: 24000. This session: NewSectorsReadOK=24000, ReadErrors=0, CRCErrors=1 -Current sector: 24016. This session: NewSectorsReadOK=24016, ReadErrors=0, CRCErrors=1 -Current sector: 24032. This session: NewSectorsReadOK=24032, ReadErrors=0, CRCErrors=1 -Current sector: 24048. This session: NewSectorsReadOK=24048, ReadErrors=0, CRCErrors=1 -Current sector: 24064. This session: NewSectorsReadOK=24064, ReadErrors=0, CRCErrors=1 -Current sector: 24080. This session: NewSectorsReadOK=24080, ReadErrors=0, CRCErrors=1 -Current sector: 24096. This session: NewSectorsReadOK=24096, ReadErrors=0, CRCErrors=1 -Current sector: 24112. This session: NewSectorsReadOK=24112, ReadErrors=0, CRCErrors=1 -Current sector: 24128. This session: NewSectorsReadOK=24128, ReadErrors=0, CRCErrors=1 -Current sector: 24144. This session: NewSectorsReadOK=24144, ReadErrors=0, CRCErrors=1 -Current sector: 24160. This session: NewSectorsReadOK=24160, ReadErrors=0, CRCErrors=1 -Current sector: 24176. This session: NewSectorsReadOK=24176, ReadErrors=0, CRCErrors=1 -Current sector: 24192. This session: NewSectorsReadOK=24192, ReadErrors=0, CRCErrors=1 -Current sector: 24208. This session: NewSectorsReadOK=24208, ReadErrors=0, CRCErrors=1 -Current sector: 24224. This session: NewSectorsReadOK=24224, ReadErrors=0, CRCErrors=1 -Current sector: 24240. This session: NewSectorsReadOK=24240, ReadErrors=0, CRCErrors=1 -Current sector: 24256. This session: NewSectorsReadOK=24256, ReadErrors=0, CRCErrors=1 -Current sector: 24272. This session: NewSectorsReadOK=24272, ReadErrors=0, CRCErrors=1 -Current sector: 24288. This session: NewSectorsReadOK=24288, ReadErrors=0, CRCErrors=1 -Current sector: 24304. This session: NewSectorsReadOK=24304, ReadErrors=0, CRCErrors=1 -Current sector: 24320. This session: NewSectorsReadOK=24320, ReadErrors=0, CRCErrors=1 -Current sector: 24336. This session: NewSectorsReadOK=24336, ReadErrors=0, CRCErrors=1 -Current sector: 24352. This session: NewSectorsReadOK=24352, ReadErrors=0, CRCErrors=1 -Current sector: 24368. This session: NewSectorsReadOK=24368, ReadErrors=0, CRCErrors=1 -Current sector: 24384. This session: NewSectorsReadOK=24384, ReadErrors=0, CRCErrors=1 -Current sector: 24400. This session: NewSectorsReadOK=24400, ReadErrors=0, CRCErrors=1 -Current sector: 24416. This session: NewSectorsReadOK=24416, ReadErrors=0, CRCErrors=1 -Current sector: 24432. This session: NewSectorsReadOK=24432, ReadErrors=0, CRCErrors=1 -Current sector: 24448. This session: NewSectorsReadOK=24448, ReadErrors=0, CRCErrors=1 -Current sector: 24464. This session: NewSectorsReadOK=24464, ReadErrors=0, CRCErrors=1 -Current sector: 24480. This session: NewSectorsReadOK=24480, ReadErrors=0, CRCErrors=1 -Current sector: 24496. This session: NewSectorsReadOK=24496, ReadErrors=0, CRCErrors=1 -Current sector: 24512. This session: NewSectorsReadOK=24512, ReadErrors=0, CRCErrors=1 -Current sector: 24528. This session: NewSectorsReadOK=24528, ReadErrors=0, CRCErrors=1 -Current sector: 24544. This session: NewSectorsReadOK=24544, ReadErrors=0, CRCErrors=1 -Current sector: 24560. This session: NewSectorsReadOK=24560, ReadErrors=0, CRCErrors=1 -Current sector: 24576. This session: NewSectorsReadOK=24576, ReadErrors=0, CRCErrors=1 -Current sector: 24592. This session: NewSectorsReadOK=24592, ReadErrors=0, CRCErrors=1 -Current sector: 24608. This session: NewSectorsReadOK=24608, ReadErrors=0, CRCErrors=1 -Current sector: 24624. This session: NewSectorsReadOK=24624, ReadErrors=0, CRCErrors=1 -Current sector: 24640. This session: NewSectorsReadOK=24640, ReadErrors=0, CRCErrors=1 -Current sector: 24656. This session: NewSectorsReadOK=24656, ReadErrors=0, CRCErrors=1 -Current sector: 24672. This session: NewSectorsReadOK=24672, ReadErrors=0, CRCErrors=1 -Current sector: 24688. This session: NewSectorsReadOK=24688, ReadErrors=0, CRCErrors=1 -Current sector: 24704. This session: NewSectorsReadOK=24704, ReadErrors=0, CRCErrors=1 -Current sector: 24720. This session: NewSectorsReadOK=24720, ReadErrors=0, CRCErrors=1 -Current sector: 24736. This session: NewSectorsReadOK=24736, ReadErrors=0, CRCErrors=1 -Current sector: 24752. This session: NewSectorsReadOK=24752, ReadErrors=0, CRCErrors=1 -Current sector: 24768. This session: NewSectorsReadOK=24768, ReadErrors=0, CRCErrors=1 -Current sector: 24784. This session: NewSectorsReadOK=24784, ReadErrors=0, CRCErrors=1 -Current sector: 24800. This session: NewSectorsReadOK=24800, ReadErrors=0, CRCErrors=1 -Current sector: 24816. This session: NewSectorsReadOK=24816, ReadErrors=0, CRCErrors=1 -Current sector: 24832. This session: NewSectorsReadOK=24832, ReadErrors=0, CRCErrors=1 -Current sector: 24848. This session: NewSectorsReadOK=24848, ReadErrors=0, CRCErrors=1 -Current sector: 24864. This session: NewSectorsReadOK=24864, ReadErrors=0, CRCErrors=1 -Current sector: 24880. This session: NewSectorsReadOK=24880, ReadErrors=0, CRCErrors=1 -Current sector: 24896. This session: NewSectorsReadOK=24896, ReadErrors=0, CRCErrors=1 -Current sector: 24912. This session: NewSectorsReadOK=24912, ReadErrors=0, CRCErrors=1 -Current sector: 24928. This session: NewSectorsReadOK=24928, ReadErrors=0, CRCErrors=1 -Current sector: 24944. This session: NewSectorsReadOK=24944, ReadErrors=0, CRCErrors=1 -Current sector: 24960. This session: NewSectorsReadOK=24960, ReadErrors=0, CRCErrors=1 -Current sector: 24976. This session: NewSectorsReadOK=24976, ReadErrors=0, CRCErrors=1 -Current sector: 24977. This session: NewSectorsReadOK=24977, ReadErrors=0, CRCErrors=1 -Current sector: 24978. This session: NewSectorsReadOK=24978, ReadErrors=0, CRCErrors=1 -Current sector: 24979. This session: NewSectorsReadOK=24979, ReadErrors=0, CRCErrors=1 -Current sector: 24980. This session: NewSectorsReadOK=24980, ReadErrors=0, CRCErrors=1 -Current sector: 24981. This session: NewSectorsReadOK=24981, ReadErrors=0, CRCErrors=1 -Current sector: 24982. This session: NewSectorsReadOK=24982, ReadErrors=0, CRCErrors=1 -Current sector: 24983. This session: NewSectorsReadOK=24983, ReadErrors=0, CRCErrors=1 -Current sector: 24984. This session: NewSectorsReadOK=24984, ReadErrors=0, CRCErrors=1 -Current sector: 24985. This session: NewSectorsReadOK=24985, ReadErrors=0, CRCErrors=1 -Current sector: 24986. This session: NewSectorsReadOK=24986, ReadErrors=0, CRCErrors=1 -Current sector: 24987. This session: NewSectorsReadOK=24987, ReadErrors=0, CRCErrors=1 -Current sector: 24988. This session: NewSectorsReadOK=24988, ReadErrors=0, CRCErrors=1 -Current sector: 24989. This session: NewSectorsReadOK=24989, ReadErrors=0, CRCErrors=1 -Current sector: 24990. This session: NewSectorsReadOK=24990, ReadErrors=0, CRCErrors=1 - -1 CRC errors. -CrcBuf contents, image path none (medium): - crcSize: 24990, dataSectors: 21000, coveredSectors: 21070, allSectors: 24990 - md5State: invalid - fp sector: 16; 15c0fd35a0cfa0f83b9ccbd8604c2592 - missing crcs: 0 diff --git a/scripts/bash-based-configure b/scripts/bash-based-configure index 163c04f..528d17e 100644 --- a/scripts/bash-based-configure +++ b/scripts/bash-based-configure @@ -127,6 +127,15 @@ case "$cfg_uname" in } ;; + Darwin*) cfg_system=darwin + CFG_SYS_OPTIONS="-DSYS_DARWIN" + CFG_SYS_NAME="-DSYS_NAME=\\\"Darwin\\\"" + CFG_EXE_SUFFIX="" + function add_linker_flags() + { lflags_return="-L$1 -Wl,-rpath,$1 $2" + } + ;; + FreeBSD*) cfg_system=freebsd-std CFG_SYS_OPTIONS="-DSYS_FREEBSD" CFG_SYS_NAME="-DSYS_NAME=\\\"FreeBSD\\\"" @@ -348,6 +357,42 @@ function REQUIRE_GMAKE() exit 1; } +function REQUIRE_CLANG() +{ + if test -n "$cfg_help_mode"; then + return 0 + fi + + echo -n "Checking for clang: " + + # Try $CC first + + if test -n "$CC" && $CC -v >/dev/null 2>&1; then + if ($CC -v 2>&1 | grep "clang") > /dev/null 2>&1 ; then + CC=`type -P $CC` + echo "yes ($CC)" + echo "CC = $CC" >>Makefile.config + return 0 + fi + fi + + # Try clang binary + + CC=clang + if test -n "$CC" && $CC -v >/dev/null 2>&1; then + if ($CC -v 2>&1 | grep "clang") > /dev/null 2>&1 ; then + CC=`type -P $CC` + echo "yes ($CC)" + echo "CC = $CC" >>Makefile.config + return 0 + fi + fi + + echo "no" + echo "This package requires the Clang C compiler (clang)." + exit 1; +} + function REQUIRE_GCC() { if test -n "$cfg_help_mode"; then diff --git a/src/closure.c b/src/closure.c index 57d58ed..1e4600b 100644 --- a/src/closure.c +++ b/src/closure.c @@ -58,6 +58,35 @@ static char* get_exe_path() } #endif +#ifdef SYS_DARWIN +#include + +// Get the path of the current executable +static char* get_bin_path() { + char path[PATH_MAX]; + uint32_t size = sizeof(path); + + if (_NSGetExecutablePath(path, &size) == 0) { + char *lastSlash = strrchr(path, '/'); + if (lastSlash) { + *lastSlash = '\0'; + return strdup(path); + } + } + + return strdup("."); +} + +// Check if the given path is within an app bundle +int isWithinAppBundle(const char *filePath) { + // Check if "Contents/MacOS" exists in the path + if (strstr(filePath, ".app/Contents/MacOS") != NULL) { + return 1; // The binary is within an app bundle + } + return 0; // The binary is not within an app bundle +} +#endif + #ifdef WITH_GUI_YES /*** @@ -396,7 +425,7 @@ static void get_base_dirs() source directory is supposed to hold the most recent files, so try this first. */ -#if defined(WITH_EMBEDDED_SRC_PATH_YES) && !defined(SYS_MINGW) +#if defined(WITH_EMBEDDED_SRC_PATH_YES) && !defined(SYS_MINGW) && !defined(SYS_DARWIN) if(DirStat(SRCDIR)) { Closure->binDir = g_strdup(SRCDIR); Closure->docDir = g_strdup_printf("%s/documentation",SRCDIR); @@ -405,6 +434,29 @@ static void get_base_dirs() } #endif /* WITH_EMBEDDED_SRC_PATH_YES */ +#if defined(WITH_EMBEDDED_SRC_PATH_YES) && defined(SYS_DARWIN) + char *binPath = get_bin_path(); + Closure->binDir = g_strdup_printf("%s/../Resources",binPath); + Closure->docDir = g_strdup_printf("%s/../Resources/documentation",binPath); + free(binPath); + goto find_dotfile; +#endif + +// We may also be in an app bundle +#if defined(SYS_DARWIN) + // Obtain the path to the executable + const char *pathToExecutable = get_bin_path(); + + // Check if the executable is within an app bundle + if (isWithinAppBundle(pathToExecutable)) { + // Inside an app bundle, set directory paths accordingly + Closure->binDir = g_strdup_printf("%s/../Resources", pathToExecutable); + Closure->docDir = g_strdup_printf("%s/../Resources/documentation", pathToExecutable); + goto find_dotfile; + } + +#endif /* SYS_DARWIN */ + /*** Otherwise try the installation directory. On Unices this is a hardcoded directory. */ diff --git a/src/scsi-darwin.c b/src/scsi-darwin.c new file mode 100644 index 0000000..a4ca243 --- /dev/null +++ b/src/scsi-darwin.c @@ -0,0 +1,378 @@ +/* dvdisaster: Additional error correction for optical media. + * Copyright (C) 2004-2011 Carsten Gnoerlich. + * + * Email: carsten@dvdisaster.org -or- cgnoerlich@fsfe.org + * Project homepage: http://www.dvdisaster.org + * + * This file is part of dvdisaster. + * + * dvdisaster 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. + * + * dvdisaster 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 dvdisaster. If not, see . + */ + +/* + * Darwin support by Julian Einwag . + * This is still an early version. + */ + +#include "dvdisaster.h" + +#include "scsi-layer.h" +#include "udf.h" + +#ifdef SYS_DARWIN +#include +#include +#include +#include +#include +#include +#include + + +#include + +/* + * Unmount media before trying to access them. + * Added by Bernd Heller, + */ + +static void unmountDVD(io_object_t scsiDevice) +{ + CFStringRef bsdName = NULL; + + bsdName = (CFStringRef) IORegistryEntrySearchCFProperty(scsiDevice, + kIOServicePlane, + CFSTR(kIOBSDNameKey), + kCFAllocatorDefault, + kIORegistryIterateRecursively); + if (bsdName != NULL) { + // unmount all partitions + char cmd[4096]; + char bsdNameStr[100]; + CFStringGetCString(bsdName, bsdNameStr, sizeof(bsdNameStr), kCFStringEncodingUTF8); + + sprintf(cmd, "/usr/sbin/diskutil unmountDisk /dev/%s", bsdNameStr); + system(cmd); + + CFRelease(bsdName); + } else { + // no media to unmount + return; + } +} + +char *getProductName(io_object_t device) +{ + CFDictionaryRef devCharacteristics; + CFStringRef nameRef; + CFIndex length; + char *prodName; + + devCharacteristics = IORegistryEntryCreateCFProperty(device, CFSTR(kIOPropertyDeviceCharacteristicsKey), kCFAllocatorDefault, 0); + + if (CFDictionaryGetValueIfPresent(devCharacteristics, CFSTR("Product Name"), (const void **) &nameRef)) { + length = CFStringGetLength(nameRef)+1; + prodName = malloc(length); + CFStringGetCString(nameRef, prodName, length, 0); + CFRelease(nameRef); + return prodName; + } else + return NULL; +} + +io_iterator_t getDVDIterator(char* ioClass) +{ + io_iterator_t scsiObjectIterator = (io_iterator_t) NULL; + CFMutableDictionaryRef matchingDict = NULL; + IOReturn ioReturnValue = kIOReturnSuccess; + + matchingDict = IOServiceMatching(ioClass); + if (matchingDict == (CFMutableDictionaryRef) NULL) { + return (io_iterator_t) NULL; + } + ioReturnValue = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &scsiObjectIterator); + if (scsiObjectIterator == (io_iterator_t) NULL || (ioReturnValue != kIOReturnSuccess)) { + return (io_iterator_t) NULL; + } + return scsiObjectIterator; + +} + +IOCFPlugInInterface **getPlugInInterface(io_object_t scsiDevice) +{ + IOReturn ioReturnValue; + SInt32 score = 0; + IOCFPlugInInterface **plugInInterface = NULL; + + ioReturnValue = IOCreatePlugInInterfaceForService(scsiDevice, kIOMMCDeviceUserClientTypeID, kIOCFPlugInInterfaceID,&plugInInterface, &score); + if (ioReturnValue != kIOReturnSuccess) { + return NULL; + } + return plugInInterface; +} + +MMCDeviceInterface** getMMCInterface(IOCFPlugInInterface** plugInInterface) +{ + MMCDeviceInterface **mmcDeviceInterface = NULL; + HRESULT pluginResult; + pluginResult = (*plugInInterface)->QueryInterface(plugInInterface, + CFUUIDGetUUIDBytes(kIOMMCDeviceInterfaceID), + (LPVOID)&mmcDeviceInterface); + if (pluginResult != KERN_SUCCESS) { + return NULL; + } + return mmcDeviceInterface; +} + +char *DefaultDevice() +{ + int i; + io_iterator_t scsiObjectIterator = (io_iterator_t) NULL; + io_object_t scsiDevice; + char *deviceName, *prodName; + + /* As a convenience, add the simulated drive first. */ + + InitSimulatedCD(); + + /* Now probe the physical drives. */ + + scsiObjectIterator = getDVDIterator("IOBDServices"); + for (i = 1; (scsiDevice = (io_object_t) IOIteratorNext(scsiObjectIterator)) != (io_object_t) NULL; i++) { + deviceName = g_malloc0(80); + sprintf(deviceName,"IOBDServices/%d",i); + + prodName = getProductName(scsiDevice); + g_ptr_array_add(Closure->deviceNodes, g_strdup(deviceName)); + g_ptr_array_add(Closure->deviceNames, g_strdup(prodName)); + g_free(deviceName); + } + IOObjectRelease(scsiObjectIterator); + scsiObjectIterator = getDVDIterator("IODVDServices"); + for (i = 1; (scsiDevice = (io_object_t) IOIteratorNext(scsiObjectIterator)) != (io_object_t) NULL; i++) { + deviceName = g_malloc0(80); + sprintf(deviceName,"IODVDServices/%d",i); + + prodName = getProductName(scsiDevice); + g_ptr_array_add(Closure->deviceNodes, g_strdup(deviceName)); + g_ptr_array_add(Closure->deviceNames, g_strdup(prodName)); + g_free(deviceName); + } + IOObjectRelease(scsiObjectIterator); + scsiObjectIterator = getDVDIterator("IOCompactDiscServices"); + for (i = 1; (scsiDevice = IOIteratorNext(scsiObjectIterator)) != (io_object_t) NULL; i++) { + deviceName = g_malloc0(80); + sprintf(deviceName,"IOCompactDiscServices/%d",i); + g_ptr_array_add(Closure->deviceNodes, g_strdup(deviceName)); + g_ptr_array_add(Closure->deviceNames, g_strdup(deviceName)); + g_free(deviceName); + } + if(Closure->deviceNodes->len) + return g_strdup(g_ptr_array_index(Closure->deviceNodes, 0)); + else { PrintLog(_("No CD/DVD drives found.")); + return NULL; + } + +} + +DeviceHandle* OpenDevice(char *device) +{ + DeviceHandle *dh; + io_iterator_t scsiObjectIterator; + io_object_t scsiDevice; + IOReturn ioReturnValue = kIOReturnSuccess; + int numericalId = 1, i; + char *realdevice = NULL, *tmp; + + /* use a naming scheme identical to cdrtools */ + realdevice = tmp = strdup(device); + tmp = strchr(tmp, '/'); + if (tmp != NULL) { + *tmp++ = '\0'; + numericalId = atoi(tmp); + } + dh = g_malloc0(sizeof(DeviceHandle)); + dh->senseSize = sizeof(SCSI_Sense_Data); + + if(!strcmp(device, "sim-cd")) + { if(!Closure->simulateCD) /* can happen via resource file / last-device */ + { g_free(dh); + return NULL; + } + + dh->simImage = LargeOpen(Closure->simulateCD, O_RDONLY, IMG_PERMS); + if(!dh->simImage) + { g_free(dh); + + Stop(_("Could not open %s: %s"), Closure->simulateCD, strerror(errno)); + return NULL; + } + + dh->device = g_strdup(device); + return dh; + } + + scsiObjectIterator = getDVDIterator(realdevice); + if (scsiObjectIterator == (io_iterator_t) NULL) { + g_free(dh); + Stop(_("Could not open %s (%s)."), device, realdevice); + return NULL; + } + /* look up handle for the selected device */ + for (i = 1; (scsiDevice = IOIteratorNext(scsiObjectIterator)) != (io_object_t) NULL; i++) { + if (i == numericalId) { + break; + } + } + + unmountDVD(scsiDevice); + + dh->plugInInterface = getPlugInInterface(scsiDevice); + if (dh->plugInInterface == NULL) { + g_free(dh); + Stop("Could not get PlugInInterface."); + return NULL; + } + dh->mmcDeviceInterface = getMMCInterface(dh->plugInInterface); + if (dh->mmcDeviceInterface == NULL) { + g_free(dh); + Stop("Could not get MMCDeviceInterface."); + return NULL; + } + (dh->scsiTaskDeviceInterface) = (*dh->mmcDeviceInterface)->GetSCSITaskDeviceInterface(dh->mmcDeviceInterface); + if (dh->scsiTaskDeviceInterface == NULL) { + g_free(dh); + Stop("Could not get SCSITaskDeviceInterface."); + return NULL; + } + ioReturnValue = (*dh->scsiTaskDeviceInterface)->ObtainExclusiveAccess(dh->scsiTaskDeviceInterface); + if (ioReturnValue != kIOReturnSuccess) { + Stop("Couldn't obtain exclusive access to drive."); + return NULL; + } + dh->taskInterface = (*dh->scsiTaskDeviceInterface)->CreateSCSITask(dh->scsiTaskDeviceInterface); + if (dh->taskInterface == NULL) { + Stop("Could not create taskInterface."); + return NULL; + } + (*dh->taskInterface)->SetTimeoutDuration(dh->taskInterface, 120*1000); + dh->device = g_strdup(device); + return dh; +} + +void CloseDevice(DeviceHandle *dh) +{ + if(dh->simImage) + LargeClose(dh->simImage); + + if(dh->canReadDefective) + SetRawMode(dh, MODE_PAGE_UNSET); + + if(dh->rawBuffer) + FreeRawBuffer(dh->rawBuffer); + + if (dh->taskInterface) { + (*dh->taskInterface)->Release(dh->taskInterface); + } + if (dh->scsiTaskDeviceInterface) { + (*dh->scsiTaskDeviceInterface)->ReleaseExclusiveAccess(dh->scsiTaskDeviceInterface); + (*dh->scsiTaskDeviceInterface)->Release(dh->scsiTaskDeviceInterface); + } + if (dh->mmcDeviceInterface) { + (*dh->mmcDeviceInterface)->Release(dh->mmcDeviceInterface); + } + if(dh->plugInInterface) { + IODestroyPlugInInterface(dh->plugInInterface); + } + if(dh->range) { + g_free(dh->range); + } + + if(dh->typeDescr) + g_free(dh->typeDescr); + if(dh->mediumDescr) + g_free(dh->mediumDescr); + if(dh->defects) + FreeBitmap(dh->defects); + + g_free(dh); + +} + +int SendPacket(DeviceHandle *dh, unsigned char *cmd, int cdb_size, unsigned char *buf, int size, Sense *sense, int data_mode) +{ + u_int32_t flags = 0; + SCSITaskInterface **taskInterface; + SCSITaskStatus taskStatus = kSCSITaskStatus_No_Status; + IOReturn ioReturnValue; + + if(dh->simImage) + return SimulateSendPacket(dh, cmd, cdb_size, buf, size, sense, data_mode); + + switch(data_mode) { + case DATA_READ: + flags = kSCSIDataTransfer_FromTargetToInitiator; + break; + case DATA_WRITE: + flags = kSCSIDataTransfer_FromInitiatorToTarget; + break; + case DATA_NONE: + flags = kSCSIDataTransfer_NoDataTransfer; + break; + default: + Stop("illegal data_mode: %d",data_mode); + } + + taskInterface = dh->taskInterface; + if (flags == kSCSIDataTransfer_FromTargetToInitiator || flags == kSCSIDataTransfer_FromInitiatorToTarget) { + dh->range = (IOVirtualRange *) g_malloc(sizeof(IOVirtualRange)); + dh->range->address = (IOVirtualAddress) buf; + dh->range->length = size; + } + ioReturnValue = (*taskInterface)->SetCommandDescriptorBlock(taskInterface, cmd, cdb_size); + if (ioReturnValue != kIOReturnSuccess) { + Stop("Couldn't set command descriptor block."); + } + if (flags == kSCSIDataTransfer_FromTargetToInitiator || flags == kSCSIDataTransfer_FromInitiatorToTarget) { + ioReturnValue = (*taskInterface)->SetScatterGatherEntries(taskInterface, dh->range, 1, size, flags); + if (ioReturnValue != kIOReturnSuccess) { + Stop("Couldn't set scatter-gather."); + } + } + + // Set the timeout in the task + ioReturnValue = ( *taskInterface )->SetTimeoutDuration ( taskInterface, 5000 ); + if ( ioReturnValue != kIOReturnSuccess ) { + Stop("Operation timed out.");; + } + + + ioReturnValue = (*taskInterface)->ExecuteTaskSync(taskInterface, (SCSI_Sense_Data*) sense, &taskStatus, NULL); + if (ioReturnValue != kIOReturnSuccess) { + return -1; + } + + if (taskStatus == kSCSITaskStatus_DeliveryFailure && cmd[0] == 0x00) { + return 0; + } + + if (taskStatus != kSCSITaskStatus_GOOD) { + return -1; + } + + return 0; + +} + +#endif diff --git a/src/scsi-layer.h b/src/scsi-layer.h index 5703a37..2df78a7 100644 --- a/src/scsi-layer.h +++ b/src/scsi-layer.h @@ -37,6 +37,20 @@ #include #endif +#ifdef SYS_DARWIN +#define REAL_VERSION VERSION +#undef VERSION +#include +#include +#include +#include +#include +#include +#include +#include +#define VERSION REAL_VERSION +#endif + /*** *** Global settings ***/ @@ -113,6 +127,12 @@ typedef struct _DeviceHandle union ccb *ccb; #elif defined(SYS_MINGW) HANDLE fd; /* Windows SPTI file handle for the device */ +#elif defined(SYS_DARWIN) + IOCFPlugInInterface **plugInInterface; + MMCDeviceInterface **mmcDeviceInterface; + SCSITaskDeviceInterface **scsiTaskDeviceInterface; + SCSITaskInterface **taskInterface; + IOVirtualRange *range; #endif /* diff --git a/src/show-manual.c b/src/show-manual.c index 2e86186..97125e3 100644 --- a/src/show-manual.c +++ b/src/show-manual.c @@ -30,7 +30,7 @@ #include "shellapi.h" #endif -#ifndef SYS_MINGW +#if !defined(SYS_MINGW) && !defined(SYS_DARWIN) static void send_errormsg(int fd, char *format, ...) { va_list argp; char *msg; @@ -63,7 +63,7 @@ void GuiShowURL(char *target) int hyperlink = 0; char *path; -#ifndef SYS_MINGW +#if !defined(SYS_MINGW) && !defined(SYS_DARWIN) pid_t pid; char *msg; int err_pipe[2]; /* child may send down err msgs to us here */ @@ -105,15 +105,29 @@ void GuiShowURL(char *target) /* Okay, Billy wins big time here ;-) */ ShellExecute(NULL, "open", path, NULL, NULL, SW_SHOWNORMAL); +#elif defined(SYS_DARWIN) + char command[256]; + snprintf(command, sizeof(command), "open \"%s\"", path); + system(command); #else /* fork xdg-open */ - result = pipe2(err_pipe, O_CLOEXEC); + result = pipe(err_pipe); if(result == -1) { GuiCreateMessage(_("Could not create pipe before fork"), GTK_MESSAGE_ERROR); return; } + result = fcntl(err_pipe[0], F_SETFL, O_CLOEXEC); + if(result == -1) + { GuiCreateMessage(_("Could not set pipe flags before fork"), GTK_MESSAGE_ERROR); + return; + } + result = fcntl(err_pipe[1], F_SETFL, O_CLOEXEC); + if(result == -1) + { GuiCreateMessage(_("Could not set pipe flags before fork"), GTK_MESSAGE_ERROR); + return; + } pid = fork(); if(pid == -1)